From a61e6e59a53c62e70fa9233d00cc4806c0f77045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 31 Jan 2024 13:30:48 +0100 Subject: [PATCH 001/509] Tuist 4 (#5567) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove tuist-env * Fix the release pipeline * Remove deprecated methods (#5560) * [tuist-4] Remove `tuistenv` (#5556) * Remove tuist-env * Fix the release pipeline * chore: remove deprecated methods * chore: remove disableAnalytics * fix: fix fixture definition --------- Co-authored-by: Pedro Piñera Buendía <663605+pepicrft@users.noreply.github.com> * Fix the bundle script * Change the coloring behaviour (#5668) * Not auto-generate a scheme per platform (#5679) * Eliminate signing capabilities (#5716) * Eliminate signing capabilities * Update the root Package.resolved * Removed TargetDependency's .packagePlugin API in favor of using PackageType (#5719) * feat(TargetDependency): remove packagePlugin api * feat(TargetDependency+ManifestMapper): remove packagePlugin api handle * test(TargetDependency+ManifestMapperTests): add tests for package types: runtime, macro and plugin * style(TargetDependency+ManifestMapperTests): add lint changes * chore: remove carthage support (#5740) * Resolve Tuist-4 Compiler Errors (#5818) * Remove Dependencies.swift (#5812) * Squashed commit of the following: commit f74176d65430e0a529d2e5ba53967278b5cfa712 Author: fortmarek Date: Tue Jan 16 09:21:28 2024 +0100 Remove cache warm for Silicon commit b954bdbd19071d8869c9e307c8b2054fb14e123a Author: fortmarek Date: Tue Jan 16 09:20:46 2024 +0100 Minor updates commit 4693f717c3a897ebd40dd205d768b50cdfdcc2f2 Author: fortmarek Date: Mon Jan 15 23:52:01 2024 +0100 Run lint:fix commit 984a73f8c5523aed22ab37bfdca9df41854eced2 Author: fortmarek Date: Mon Jan 15 23:51:44 2024 +0100 Update external dependencies tutorial commit 909fc2499145f13f5e8139ded4195021f0f52f4f Author: fortmarek Date: Mon Jan 15 23:45:31 2024 +0100 Add PackageSettings in Package.swift commit c70affbe3f2345f4b65c8926dde6745122f3fff7 Merge: a932745320 7f34cba79b Author: fortmarek Date: Mon Jan 15 09:35:51 2024 +0100 Merge remote-tracking branch 'origin/main' into tests/dependencies-acceptance commit a9327453207d50b9e4420e31d2e2b43ece7ff1dc Merge: ef80095f14 675239c06b Author: Daniele Formichelli Date: Tue Jan 2 13:55:15 2024 +0100 Merge branch 'main' into tests/dependencies-acceptance commit ef80095f14d0f77ef842fdc6f45c0efe849b38f1 Merge: 54f98753fd e14da601b2 Author: Daniele Formichelli Date: Sun Dec 31 16:55:49 2023 +0100 Merge branch 'main' into tests/dependencies-acceptance commit 54f98753fda6e5faaf657613eb8a8ede2fc1dff4 Author: Daniele Formichelli Date: Sun Dec 31 16:55:43 2023 +0100 fix: feature one target sources commit 9671063a2190d1c95bbc7b82d87b23453a9f7ffa Author: Daniele Formichelli Date: Sat Dec 30 16:52:44 2023 +0100 chore: format commit 7df88d4e83649b8046810fe8e78a44cacdae6f4a Author: Daniele Formichelli Date: Sat Dec 30 16:46:10 2023 +0100 chore: simplify spm fixture commit 9a05c9eb07d9983b3db013e089948c1954d4bb95 Author: Daniele Formichelli Date: Sat Dec 30 15:47:38 2023 +0100 chore: lint commit 96c989fb6a1d6895b8eb21f9a4d5d38e173e1924 Author: Daniele Formichelli Date: Fri Dec 29 21:34:45 2023 +0100 test: re-enable dependencies acceptance tests * Remove Dependencies.swift support * Remove intermediary graph.json * Fix issues after merging tuist-4 * Remove Dependencies.swift from fixtures * Move Package loading to TuistLoader * Remove TuistDependenciesTesting from FetchServiceTests * Add dump command for package * Add back PackageSettings in app_with_spm_dependencies * Fix missing tests due to missing Package.swift error * Remove platforms from string assertion due to Set non-determinism * Add package settings to multiplatform_app_with_sdk fixture * Remove ProjectDescriptionHelpers import in Package.swift for multiplatform_app_with_sdk * Update platforms for multiplatform_app_with_sdk fixture * Remove deprecated APIs * Fix Test Compilation * Update test fixture tempalte to multiplatform API * Migrate fixtures to `destinations` api * Migrate fixtures to `deploymentTargets` apis * Update manifest helper methods * Update fixture generator to use `destinations` * Update to use a tuist 4 version of this template repo * Fixing a couple fixtures * Fix Tuist helper method to use correct signature * Update doc comments * More missed callsites * Remove Cache from ProjectDescription (#5833) * Fix missing macro case in switch * Remove binary cache-related models from TuistCore * chore: fix warnings * Change ProjectDescription model constructors to static functions (#5843) * Remove public inits in favor of static constructors * Fix tests * Lint * Fix remaining tests * Skip loading default helpers if equal to srcroot * Fix lint issue * Fix infinite loop in app_with_spm_dependencies fixture * Lint * Remove unnecessary force try * Fix generate acceptance tests * Fix test acceptance tests * Rename cache directory name (#5842) * Rename cache directory name * Rename cache categories * Fix compilation issues * Fix CleanServiceTests --------- Co-authored-by: Daniele Formichelli * Bump Minimum Swift to 5.9 * Autoformat code style - Update .swiftformat - Ignore unwanted rules * Fix failing tests * Simplify tuist init (#5853) * Simplify tuist init * Address PR feedback * Add Package.swift, update init message * Update tabs * Remove Package.swift --------- Co-authored-by: Daniele Formichelli Co-authored-by: Dimash <44325936+dxmvsh@users.noreply.github.com> Co-authored-by: fortmarek Co-authored-by: Charles Pisciotta Co-authored-by: Mike Simons Co-authored-by: Mike Simons --- .github/workflows/tuist.yml | 6 - .swiftformat | 4 +- .vscode/launch.json | 99 --- .vscode/settings.json | 5 +- .xcode-version | 2 +- .xcode-version-libraries | 2 +- Package.resolved | 8 +- Package.swift | 35 +- Project.swift | 46 +- Sources/ProjectAutomation/Project.swift | 2 +- Sources/ProjectDescription/Arguments.swift | 23 +- Sources/ProjectDescription/BuildAction.swift | 12 - Sources/ProjectDescription/BuildRule.swift | 24 +- Sources/ProjectDescription/Cache.swift | 53 -- Sources/ProjectDescription/Cloud.swift | 11 - Sources/ProjectDescription/Config.swift | 8 +- .../ProjectDescription/CoreDataModel.swift | 10 +- .../Dependencies/CarthageDependencies.swift | 44 -- .../Dependencies/Dependencies.swift | 47 -- .../SwiftPackageManagerDependencies.swift | 73 -- .../ProjectDescription/DeploymentDevice.swift | 22 - .../ProjectDescription/DeploymentTarget.swift | 40 -- .../DeploymentTargets.swift | 20 +- Sources/ProjectDescription/Entitlements.swift | 2 +- .../EnvironmentVariable.swift | 6 +- .../ProjectDescription/ExecuteAction.swift | 17 +- Sources/ProjectDescription/FileElement.swift | 4 +- Sources/ProjectDescription/FileListGlob.swift | 2 +- Sources/ProjectDescription/InfoPlist.swift | 9 +- .../ProjectDescription/LaunchArgument.swift | 5 +- .../{Dependencies => }/PackageSettings.swift | 2 +- Sources/ProjectDescription/Path.swift | 2 +- Sources/ProjectDescription/Project.swift | 2 +- .../ResourceFileElement.swift | 2 +- .../ResourceFileElements.swift | 6 +- Sources/ProjectDescription/Scheme.swift | 24 +- .../SettingsTransformers.swift | 7 - .../ProjectDescription/SourceFilesList.swift | 12 +- Sources/ProjectDescription/Target.swift | 281 +------- .../ProjectDescription/TargetDependency.swift | 12 +- .../ProjectDescription/TargetReference.swift | 6 +- .../Template/Template.swift | 5 +- .../ProjectDescription/TestableTarget.swift | 35 +- Sources/TuistCore/Cache/CacheCategory.swift | 16 +- .../Cache/CacheDirectoriesProvider.swift | 12 +- .../CacheDirectoriesProviderFactory.swift | 6 +- Sources/TuistCore/Cache/CacheOutputType.swift | 33 - .../Cache/CacheXCFrameworkDestination.swift | 13 - .../Graph/GraphDependencyReference.swift | 9 +- Sources/TuistCore/Graph/GraphLoader.swift | 1 - Sources/TuistCore/Graph/GraphTraverser.swift | 26 +- .../FrameworkMetadataProvider.swift | 2 - .../NodeLoaders/FrameworkLoader.swift | 1 - .../MockCacheDirectoriesProviderFactory.swift | 8 +- .../Graph}/DependenciesGraph+TestData.swift | 33 +- .../GraphDependencyReference+TestData.swift | 2 - .../Utils/MockRootDirectoryLocator.swift | 2 + .../Carthage/CarthageInteractor.swift | 230 ------ .../Carthage/Models/CarthageVersionFile.swift | 36 - .../Carthage/Utils/CarthageController.swift | 179 ----- .../Utils/CarthageGraphGenerator.swift | 61 -- .../DependenciesController.swift | 277 -------- .../DependenciesGraphController.swift | 145 ---- .../SwiftPackageManagerInteractor.swift | 251 ------- .../Carthage/MockCarthageInteractor.swift | 35 - .../Models/CarthageVersionFile+TestData.swift | 655 ------------------ .../Utils/MockCarthageController.swift | 57 -- .../Utils/MockCarthageGraphGenerator.swift | 18 - .../MockDependenciesGraphController.swift | 33 - .../MockDependenciesController.swift | 73 -- .../MockSwiftPackageManagerInteractor.swift | 41 -- ...ockSwiftPackageManagerGraphGenerator.swift | 45 -- .../TuistEnvKit/Commands/BundleCommand.swift | 16 - .../TuistEnvKit/Commands/CommandRunner.swift | 143 ---- .../TuistEnvKit/Commands/InstallCommand.swift | 21 - .../TuistEnvKit/Commands/LocalCommand.swift | 22 - .../TuistEnvKit/Commands/TuistCommand.swift | 93 --- .../Commands/UninstallCommand.swift | 21 - .../TuistEnvKit/Commands/UpdateCommand.swift | 17 - .../TuistEnvKit/Commands/VersionCommand.swift | 17 - Sources/TuistEnvKit/HTTP/HTTPClient.swift | 121 ---- .../TuistEnvKit/Installer/BuildCopier.swift | 35 - .../TuistEnvKit/Installer/EnvInstaller.swift | 108 --- Sources/TuistEnvKit/Installer/Installer.swift | 94 --- .../TuistEnvKit/Installer/SwiftVersion.swift | 33 - .../TuistEnvKit/Services/BundleService.swift | 62 -- .../TuistEnvKit/Services/InstallService.swift | 29 - .../TuistEnvKit/Services/LocalService.swift | 40 -- .../Services/UninstallService.swift | 28 - .../TuistEnvKit/Services/UpdateService.swift | 16 - .../TuistEnvKit/Services/VersionService.swift | 9 - Sources/TuistEnvKit/Settings/Settings.swift | 21 - .../Settings/SettingsController.swift | 45 -- .../Settings/VersionProvider.swift | 31 - Sources/TuistEnvKit/Updater/Updater.swift | 52 -- .../Versions/VersionResolver.swift | 75 -- .../Versions/VersionsController.swift | 76 -- .../Generator/LinkGenerator.swift | 4 +- .../Generator/ProjectFileElements.swift | 4 +- .../GraphViz/GraphToGraphVizMapper.swift | 1 - .../Linter/StaticProductsGraphLinter.swift | 2 +- ...eratedWorkspaceSchemeWorkspaceMapper.swift | 35 +- .../Templates/AssetsTemplate.swift | 15 - .../Utils/EmbedScriptGenerator.swift | 2 +- .../TuistGraph/Graph/GraphDependency.swift | 11 +- Sources/TuistGraph/Models/Cache.swift | 48 -- Sources/TuistGraph/Models/Cloud.swift | 1 - Sources/TuistGraph/Models/Config.swift | 8 - .../Dependencies/CarthageDependencies.swift | 76 -- .../Models/Dependencies/Dependencies.swift | 17 - .../Models/Dependencies/PackageSettings.swift | 6 + .../TuistGraph/Models/DeploymentDevice.swift | 21 - .../TuistGraph/Models/DeploymentTarget.swift | 36 - .../Models/Metadata/FrameworkMetadata.swift | 3 - Sources/TuistGraph/Models/Platform.swift | 10 - Sources/TuistGraph/Models/Project.swift | 4 +- .../DependenciesGraph+TestData.swift | 56 -- .../Graph/GraphDependency+TestData.swift | 2 - .../Models/Cache+TestData.swift | 21 - .../Models/Config+TestData.swift | 2 - .../Metadata/FrameworkMetadata+TestData.swift | 2 - .../Models/PackageSettings+TestData.swift | 3 + Sources/TuistKit/Commands/InitCommand.swift | 4 +- .../Commands/Signing/DecryptCommand.swift | 27 - .../Commands/Signing/EncryptCommand.swift | 24 - .../TuistKit/Commands/SigningCommand.swift | 16 - Sources/TuistKit/Commands/TuistCommand.swift | 7 - Sources/TuistKit/Generator/Generator.swift | 3 - .../Factories/GraphMapperFactory.swift | 1 - .../Factories/ProjectMapperFactory.swift | 4 - .../ProjectEditor/ProjectEditor.swift | 7 +- .../ProjectEditor/ProjectEditorMapper.swift | 25 +- Sources/TuistKit/Services/CleanService.swift | 25 +- .../TuistKit/Services/DecryptService.swift | 29 - Sources/TuistKit/Services/DumpService.swift | 6 +- .../TuistKit/Services/EncryptService.swift | 30 - Sources/TuistKit/Services/FetchService.swift | 124 +--- Sources/TuistKit/Services/InitService.swift | 9 +- .../TuistKit/Utils/ManifestGraphLoader.swift | 16 +- .../Loaders/CachedManifestLoader.swift | 17 +- .../Loaders/DependenciesModelLoader.swift | 35 - .../TuistLoader/Loaders/ManifestLoader.swift | 35 +- .../Loaders/PackageSettingsLoader.swift | 21 +- .../SwiftPackageManagerGraphLoader.swift} | 110 +-- .../Cache+ManifestMapper.swift | 31 - .../CarthageDependencies+ManifestMapper.swift | 49 -- .../Cloud+ManifestMapper.swift | 4 - .../Config+ManifestMapper.swift | 6 - .../Dependencies+ManifestMapper.swift | 40 -- .../PackageSettings+ManifestMapper.swift | 5 +- .../ProjectOption+ToManifestMapper.swift} | 0 ...geManagerDependencies+ManifestMapper.swift | 40 -- .../TargetDependency+ManifestMapper.swift | 3 - .../TestingOptions+ToManifestMapper.swift} | 0 Sources/TuistLoader/Models/Manifest.swift | 6 +- .../SwiftPackageManagerWorkspaceState.swift | 0 .../ProjectDescriptionHelpersBuilder.swift | 10 + .../PackageInfo+graphPlatform.swift | 0 .../PackageInfoMapper.swift | 50 +- .../SwiftPackageManager}/SettingsMapper.swift | 0 ...wiftPackageManagerModuleMapGenerator.swift | 0 Sources/TuistLoader/Up/Carthage.swift | 151 ---- .../Utils/ManifestFilesLocator.swift | 11 - .../Mocks/MockDependenciesModelLoader.swift | 28 - .../Loaders/Mocks/MockManifestLoader.swift | 10 +- .../ProjectDescription+TestData.swift | 18 +- .../Mocks/MockManifestFilesLocator.swift | 5 - Sources/TuistPlugin/PluginService.swift | 6 +- .../Certificate/Certificate.swift | 12 - .../GraphMappers/Dictionary+Fingerprint.swift | 7 - .../GraphMappers/SigningMapper.swift | 102 --- .../TuistSigning/Linter/SigningLinter.swift | 69 -- .../ProvisioningProfile.swift | 94 --- .../ProvisioningProfileParser.swift | 72 -- Sources/TuistSigning/SecurityController.swift | 75 -- .../TuistSigning/SigningFilesLocator.swift | 61 -- Sources/TuistSigning/SigningInstaller.swift | 81 --- Sources/TuistSigning/SigningMatcher.swift | 59 -- .../Extensions/Certificate+TestData.swift | 23 - .../ProvisioningProfile+TestData.swift | 36 - .../Mocks/MockSigningCipher.swift | 21 - .../Mocks/MockSigningInstaller.swift | 17 - Sources/TuistSupport/Constants.swift | 12 +- .../SwiftPackageManager/PackageInfo.swift | 119 +++- Sources/TuistSupport/System/System.swift | 2 +- Sources/TuistSupport/Utils/Environment.swift | 21 +- .../TestCase/TuistTestCase.swift | 21 + Sources/tuistenv/main.swift | 19 - .../Templates/ManifestTemplate.swift | 4 +- Templates/AppProject.stencil | 29 - Templates/Config.stencil | 7 - Templates/KitSource.stencil | 7 - Templates/KitTests.stencil | 8 - Templates/LocalHelper.stencil | 9 - Templates/Package.stencil | 15 - Templates/Package.swift | 1 - Templates/Plugin.stencil | 3 - Templates/Project+Templates.stencil | 74 -- Templates/UISource.stencil | 7 - Templates/UITests.stencil | 8 - Templates/default/AppDelegate.stencil | 43 -- Templates/default/AppProject.stencil | 31 + Templates/{ => default}/AppTests.stencil | 0 .../{swiftui => default}/ContentView.stencil | 0 Templates/{ => default}/Gitignore.stencil | 0 .../{ => default}/LaunchScreen+iOS.stencil | 0 .../{ => default}/LaunchScreen+macOS.stencil | 0 .../{ => default}/LaunchScreen+tvOS.stencil | 0 .../Preview Assets.xcassets/Contents.json | 0 Templates/{swiftui => default}/app.stencil | 1 - Templates/default/default.swift | 69 +- .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../ios/Assets.xcassets/Contents.json | 0 .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../macos/Assets.xcassets/Contents.json | 0 .../AccentColor.colorset/Contents.json | 0 .../Content.imageset/Contents.json | 0 .../Back.imagestacklayer/Contents.json | 0 .../Contents.json | 0 .../Content.imageset/Contents.json | 0 .../Front.imagestacklayer/Contents.json | 0 .../Content.imageset/Contents.json | 0 .../Middle.imagestacklayer/Contents.json | 0 .../Content.imageset/Contents.json | 0 .../Back.imagestacklayer/Contents.json | 0 .../App Icon.imagestack/Contents.json | 0 .../Content.imageset/Contents.json | 0 .../Front.imagestacklayer/Contents.json | 0 .../Content.imageset/Contents.json | 0 .../Middle.imagestacklayer/Contents.json | 0 .../Contents.json | 0 .../Contents.json | 0 .../Top Shelf Image.imageset/Contents.json | 0 .../tvos/Assets.xcassets/Contents.json | 0 .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 + .../watchos/Assets.xcassets/Contents.json | 6 + Templates/main.stencil | 1 - Templates/swiftui/swiftui.swift | 87 --- ...01-4D40-3956-BB71-857D3B2D9E73.bcsymbolmap | 0 ...A9-0D05-35AF-9865-94A9A670080B.bcsymbolmap | 0 .../Contents/Info.plist | 0 .../Contents/Resources/DWARF/RxBlocking | Bin .../Headers/RxBlocking-Swift.h | 0 .../RxBlocking.framework/Info.plist | Bin .../RxBlocking.swiftmodule/arm.swiftdoc | Bin .../RxBlocking.swiftmodule/arm.swiftmodule | Bin .../arm64-apple-ios.swiftdoc | Bin .../arm64-apple-ios.swiftmodule | Bin .../RxBlocking.swiftmodule/arm64.swiftdoc | Bin .../RxBlocking.swiftmodule/arm64.swiftmodule | Bin .../armv7-apple-ios.swiftdoc | Bin .../armv7-apple-ios.swiftmodule | Bin .../RxBlocking.swiftmodule/armv7.swiftdoc | Bin .../RxBlocking.swiftmodule/armv7.swiftmodule | Bin .../i386-apple-ios-simulator.swiftdoc | Bin .../i386-apple-ios-simulator.swiftmodule | Bin .../RxBlocking.swiftmodule/i386.swiftdoc | Bin .../RxBlocking.swiftmodule/i386.swiftmodule | Bin .../x86_64-apple-ios-simulator.swiftdoc | Bin .../x86_64-apple-ios-simulator.swiftmodule | Bin .../RxBlocking.swiftmodule/x86_64.swiftdoc | Bin .../RxBlocking.swiftmodule/x86_64.swiftmodule | Bin .../Modules/module.modulemap | 0 .../RxBlocking.framework/RxBlocking | Bin .../Project+Template.swift | 8 +- .../CoreDataModelTests.swift | 2 +- .../CarthageDependenciesTests.swift | 61 -- .../Dependencies/DependenciesTests.swift | 18 - ...SwiftPackageManagerDependenciesTests.swift | 11 - .../PluginLocationTests.swift | 2 +- .../ProjectDescriptionTests/SchemeTests.swift | 16 +- .../TargetDependencyTests.swift | 2 +- .../ProjectDescriptionTests/TargetTests.swift | 14 +- .../InitAcceptanceTests.swift | 24 +- .../Utilities/BuildGraphInspectorTests.swift | 6 +- ...workMetadataProviderIntegrationTests.swift | 14 +- .../Graph/GraphLoaderTests.swift | 4 - .../Graph/GraphTraverserTests.swift | 62 +- .../FrameworkMetadataProviderTests.swift | 1 - .../PrecompiledMetadataProviderTests.swift | 23 - .../NodeLoaders/FrameworkLoaderTests.swift | 2 - .../Carthage/CarthageInteractorTests.swift | 335 --------- .../Models/CarthageVersionFileTests.swift | 70 -- .../Utils/CarthageControllerTests.swift | 199 ------ .../Utils/CarthageGraphGeneratorTests.swift | 56 -- .../DependenciesControllerTests.swift | 525 -------------- .../DependenciesGraphControllerTests.swift | 138 ---- ...ectsPlatformNarrowerGraphMapperTests.swift | 1 - ...rphanExternalTargetsGraphMapperTests.swift | 1 - .../SwiftPackageManagerInteractorTests.swift | 366 ---------- ...iftPackageManagerGraphGeneratorTests.swift | 520 -------------- .../Commands/CommandRunnerTests.swift | 203 ------ .../Commands/Mocks/MockCommandRunner.swift | 12 - .../GitHub/Mocks/MockVersionProvider.swift | 29 - .../HTTP/HTTPClientTests.swift | 31 - .../HTTP/Mocks/MockHTTPClient.swift | 47 -- .../Installer/EnvInstallerTests.swift | 220 ------ .../Installer/InstallerTests.swift | 141 ---- .../Installer/Mocks/MockBuildCopier.swift | 13 - .../Installer/Mocks/MockEnvInstaller.swift | 12 - .../Installer/Mocks/MockInstaller.swift | 12 - .../Services/BundleServiceTests.swift | 120 ---- .../Services/InstallServiceTests.swift | 75 -- .../Services/LocalServiceTests.swift | 69 -- .../Services/UninstallServiceTests.swift | 59 -- .../Services/UpdateServiceTests.swift | 35 - .../Mocks/MockSettingsController.swift | 20 - .../Settings/SettingsControllerTests.swift | 25 - .../Settings/SettingsTests.swift | 44 -- .../Updater/Mocks/MockUpdater.swift | 12 - .../Updater/UpdaterTests.swift | 74 -- .../Versions/Mocks/MockVersionResolver.swift | 13 - .../Mocks/MockVersionsController.swift | 56 -- .../Versions/VersionResolverTests.swift | 177 ----- .../SwiftPackageManagerInteractorTests.swift | 2 - .../Generator/ProjectFileElementsTests.swift | 3 +- ...dWorkspaceSchemeWorkspaceMapperTests.swift | 22 +- .../Linter/GraphLinterTests.swift | 4 +- .../CarthageDependenciesTests.swift | 160 ----- .../Models/DeploymentDeviceTests.swift | 23 - .../Models/DeploymentTargetTests.swift | 47 -- .../Models/PlatformTests.swift | 7 - ...ltipleConfigurationsIntegrationTests.swift | 1 - .../DumpServiceIntegrationTests.swift | 134 +++- .../Factories/GraphMapperFactoryTests.swift | 1 - .../Factories/ProjectMapperFactoryTests.swift | 9 - .../WorkspaceMapperFactoryTests.swift | 1 - ...ateWorkspaceProjectsGraphMapperTests.swift | 1 - .../Mocks/MockProjectEditorMapper.swift | 3 - .../ProjectEditorMapperTests.swift | 41 +- .../ProjectEditor/ProjectEditorTests.swift | 2 - .../Services/CleanServiceTests.swift | 44 +- .../Services/DecryptServiceTests.swift | 38 - .../Services/EncryptServiceTests.swift | 38 - .../Services/FetchServiceTests.swift | 180 +---- .../Services/GenerateServiceTests.swift | 7 - .../Services/TestServiceTests.swift | 2 +- .../Loaders/ManifestLoaderTests.swift | 75 ++ .../Loaders/ConfigLoaderTests.swift | 4 +- .../DependenciesModelLoaderTests.swift | 74 -- .../Loaders/PackageSettingsLoaderTests.swift | 44 +- .../RecursiveManifestLoaderTests.swift | 2 +- ...CodeCoverageMode+ManifestMapperTests.swift | 2 +- .../Configuration+ManifestMapperTests.swift | 2 +- .../CoreDataModel+ManifestMapperTests.swift | 13 +- .../DependenciesManifestMapperTests.swift | 53 -- ...eploymentTargets+ManifestMapperTests.swift | 27 - .../Scheme+ManifestMapper.swift | 4 +- ...TargetDependency+ManifestMapperTests.swift | 66 ++ .../Models/ManifestTests.swift | 3 +- .../PackageInfoGraphPlatformTests.swift | 3 +- .../PackageInfoMapperTests.swift | 112 +-- .../SettingsMapperTests.swift | 3 +- ...ackageManagerModuleMapGeneratorTests.swift | 2 +- .../Utils/ManifestFilesLocatorTests.swift | 98 --- .../TuistPluginTests/PluginServiceTests.swift | 5 +- .../CertificateParserTests.swift | 138 ---- .../Mocks/MockCertificateParser.swift | 16 - .../Mocks/MockProvisioningProfileParser.swift | 9 - .../Mocks/MockSecurityController.swift | 34 - .../Mocks/MockSigningFilesLocator.swift | 34 - .../Mocks/MockSigningLinter.swift | 21 - .../Mocks/MockSigningMatcher.swift | 15 - .../SecurityControllerTests.swift | 156 ----- .../SigningCipherTests.swift | 351 ---------- .../SigningFilesLocatorTests.swift | 136 ---- .../SigningInstallerTests.swift | 111 --- .../SigningInteractorTests.swift | 281 -------- .../SigningLinterTests.swift | 222 ------ .../SigningMapperTests.swift | 115 --- .../SigningMatcherTests.swift | 148 ---- .../PackageInfoTests.swift | 55 ++ Tuist/Config.swift | 2 +- Tuist/Package.resolved | 8 +- Tuist/Package.swift | 4 +- .../Articles/Tuist/Manifests/project.md | 2 +- .../Add External Dependencies/Package.swift | 2 +- .../Add External Dependencies/Project.swift | 2 +- .../inital-project-templates.swift | 8 +- .../Articles/Tuist/Users/dependencies.md | 2 +- fixtures/app_with_build_rules/Project.swift | 6 +- .../Project.swift | 18 +- .../Project.swift | 4 +- fixtures/app_with_plugins/Project.swift | 2 +- .../app_with_plugins/Tuist/Dependencies.swift | 14 - fixtures/app_with_plugins/Tuist/Package.swift | 15 + .../Project+Templates.swift | 6 +- .../App/Project.swift | 16 +- .../Features/FeatureOne/Project.swift | 8 +- .../Tuist/Package.swift | 4 +- .../Scheme+Templates.swift | 24 - fixtures/app_with_tasks/Project.swift | 2 +- .../Project+Templates.swift | 8 +- fixtures/app_with_test_plan/Project.swift | 26 +- fixtures/app_with_tests/Project.swift | 30 +- .../command_line_tool_basic/Project.swift | 4 +- .../Project.swift | 8 +- .../Project.swift | 8 +- .../Project.swift | 8 +- .../Project.swift | 4 +- .../Project.swift | 2 +- .../Tuist/Dependencies.swift | 8 - .../framework_with_swift_macro/Project.swift | 4 +- fixtures/ios_app_large/Project.swift | 4 +- .../App With Space/Project.swift | 4 +- .../ios_app_with_actions/App/Project.swift | 4 +- fixtures/ios_app_with_appclip/Project.swift | 24 +- .../App/Project.swift | 4 +- fixtures/ios_app_with_coredata/Project.swift | 10 +- .../App/Project.swift | 4 +- .../Framework/Project.swift | 6 +- .../Tuist/Config.swift | 7 +- .../Project+Templates.swift | 33 +- .../Project.swift | 4 +- .../ios_app_with_custom_regions/Project.swift | 4 +- .../Project.swift | 4 +- .../App/Project.swift | 18 +- .../Frameworks/Framework1/Project.swift | 8 +- .../Frameworks/Framework2/Project.swift | 8 +- .../Workspace.swift | 20 +- .../App/Project.swift | 8 +- .../Frameworks/Framework1/Project.swift | 8 +- .../Frameworks/Framework2/Project.swift | 8 +- .../Lib/Sources/Lib.swift | 9 - .../MyTarget/Sources/MyClass.swift | 10 - .../Project.swift | 30 - .../Tuist/Config.swift | 10 - .../App With Space/Project.swift | 4 +- .../App/Project.swift | 4 +- .../ios_app_with_extensions/Project.swift | 32 +- .../App/Project.swift | 4 +- .../Framework1/Project.swift | 6 +- .../StaticFramework/Project.swift | 8 +- .../App/Project.swift | 8 +- .../Framework1/Project.swift | 6 +- .../StaticFramework/Project.swift | 8 +- .../StaticFramework2/Project.swift | 8 +- .../StaticFramework3/Project.swift | 4 +- .../StaticFramework4/Project.swift | 4 +- .../StaticFramework5/Project.swift | 4 +- .../App/Project.swift | 8 +- .../Framework1/Project.swift | 8 +- .../Framework2/Project.swift | 8 +- .../Framework3/Project.swift | 8 +- .../Framework4/Project.swift | 8 +- .../ios_app_with_frameworks/App/Project.swift | 8 +- .../Framework1/Project.swift | 8 +- .../Framework2/Project.swift | 12 +- .../Framework3/Project.swift | 4 +- .../Framework4/Project.swift | 4 +- .../Framework5/Project.swift | 4 +- .../ios_app_with_headers/App/Project.swift | 8 +- .../Framework1/Project.swift | 12 +- .../App/Project.swift | 8 +- .../Framework1/Project.swift | 12 +- .../Projects/App/Project.swift | 2 +- .../Projects/AppKit/Project.swift | 2 +- .../Projects/AppSupport/Project.swift | 2 +- .../Project+Templates.swift | 18 +- .../Project.swift | 8 +- .../Project.swift | 8 +- .../Project.swift | 4 +- fixtures/ios_app_with_intents/Project.swift | 4 +- .../LocalPackage/MyFramework/Project.swift | 4 +- .../Project.swift | 8 +- .../Frameworks/FrameworkA/Project.swift | 4 +- .../Project.swift | 8 +- .../App/Project.swift | 10 +- .../Framework1/Project.swift | 8 +- .../Framework2/Project.swift | 8 +- .../Project.swift | 8 +- .../Modules/StaticFramework/Project.swift | 8 +- fixtures/ios_app_with_sdk/Project.swift | 20 +- fixtures/ios_app_with_signing/Project.swift | 12 +- .../Modules/A/Project.swift | 8 +- .../Modules/AppTestsSupport/Project.swift | 4 +- .../Modules/B/Project.swift | 8 +- .../Modules/C/Project.swift | 8 +- .../Modules/D/Project.swift | 4 +- .../Prebuilt/Project.swift | 4 +- .../Project.swift | 8 +- .../Modules/A/Project.swift | 8 +- .../Modules/B/Project.swift | 8 +- .../Modules/C/Project.swift | 8 +- .../Modules/D/Project.swift | 4 +- .../Prebuilt/Project.swift | 4 +- .../Project.swift | 8 +- .../Modules/A/Project.swift | 8 +- .../Modules/B/Project.swift | 8 +- .../Modules/C/Project.swift | 8 +- .../Project.swift | 8 +- .../Prebuilt/Project.swift | 4 +- .../Project.swift | 8 +- fixtures/ios_app_with_templates/Project.swift | 8 +- fixtures/ios_app_with_tests/Project.swift | 44 +- .../App/Project.swift | 12 +- .../Framework1/Project.swift | 16 +- .../Framework2/Project.swift | 8 +- .../StaticFramework1/Project.swift | 8 +- .../App/Project.swift | 12 +- .../Framework1/Project.swift | 16 +- .../Framework2/Project.swift | 8 +- .../FrameworkA/Project.swift | 8 +- .../FrameworkB/Project.swift | 8 +- .../FrameworkC/Project.swift | 8 +- .../Project.swift | 24 +- fixtures/ios_app_with_watchapp2/Project.swift | 16 +- .../Project.swift | 12 +- .../Modules/StaticFrameworkA/Project.swift | 4 +- .../Modules/StaticFrameworkB/Project.swift | 4 +- .../ios_app_with_xcframeworks/Project.swift | 8 +- .../XCFrameworks/MyFramework/Project.swift | 8 +- .../MyStaticFramework/Project.swift | 4 +- .../MyStaticLibrary/Project.swift | 4 +- .../App/Project.swift | 8 +- .../Frameworks/FrameworkA/Project.swift | 8 +- .../Frameworks/FrameworkB/Project.swift | 8 +- .../Frameworks/CoreFramework/Project.swift | 8 +- .../Frameworks/DataFramework/Project.swift | 8 +- .../FeatureAFramework/Project.swift | 8 +- .../Frameworks/FeatureContracts/Project.swift | 8 +- .../UIComponentsFramework/Project.swift | 8 +- .../Project.swift | 8 +- .../Frameworks/CoreFramework/Project.swift | 8 +- .../Frameworks/DataFramework/Project.swift | 8 +- .../FeatureAFramework/Project.swift | 8 +- .../Frameworks/FeatureContracts/Project.swift | 8 +- .../UIComponentsFramework/Project.swift | 8 +- .../StaticApp/Project.swift | 8 +- .../macos_app_with_app_inside/Project.swift | 12 +- .../macos_app_with_copy_files/Project.swift | 4 +- .../macos_app_with_extensions/Project.swift | 8 +- .../Project.swift | 8 +- fixtures/macos_app_with_xpc/Project.swift | 16 +- fixtures/manifest_with_logs/Project.swift | 4 +- .../Project.swift | 6 +- .../Modules/StaticFramework/Project.swift | 8 +- .../multiplatform_app_with_sdk/Project.swift | 12 +- .../Tuist/Dependencies.swift | 6 - .../Tuist/Package.swift | 8 + .../Project.swift | 4 +- .../tvos_app_with_extensions/Project.swift | 12 +- fixtures/tvos_app_with_uitest/Project.swift | 10 +- fixtures/visionos_app/Project.swift | 8 +- .../ProjectA/Project.swift | 8 +- .../ProjectB/Project.swift | 10 +- .../workspace_with_test_locale/Project.swift | 2 +- make/tasks/workspace/benchmark.sh | 5 +- make/tasks/workspace/release/bundle.sh | 7 +- script/install | 59 -- script/uninstall | 37 - 554 files changed, 1919 insertions(+), 14238 deletions(-) delete mode 100644 .vscode/launch.json delete mode 100644 Sources/ProjectDescription/Cache.swift delete mode 100644 Sources/ProjectDescription/Dependencies/CarthageDependencies.swift delete mode 100644 Sources/ProjectDescription/Dependencies/Dependencies.swift delete mode 100644 Sources/ProjectDescription/Dependencies/SwiftPackageManagerDependencies.swift delete mode 100644 Sources/ProjectDescription/DeploymentDevice.swift delete mode 100644 Sources/ProjectDescription/DeploymentTarget.swift rename Sources/ProjectDescription/{Dependencies => }/PackageSettings.swift (98%) delete mode 100644 Sources/TuistCore/Cache/CacheOutputType.swift delete mode 100644 Sources/TuistCore/Cache/CacheXCFrameworkDestination.swift rename Sources/{TuistDependenciesTesting/DependenciesGraph => TuistCoreTesting/Graph}/DependenciesGraph+TestData.swift (98%) delete mode 100644 Sources/TuistDependencies/Carthage/CarthageInteractor.swift delete mode 100644 Sources/TuistDependencies/Carthage/Models/CarthageVersionFile.swift delete mode 100644 Sources/TuistDependencies/Carthage/Utils/CarthageController.swift delete mode 100644 Sources/TuistDependencies/Carthage/Utils/CarthageGraphGenerator.swift delete mode 100644 Sources/TuistDependencies/DependenciesController.swift delete mode 100644 Sources/TuistDependencies/DependenciesGraph/DependenciesGraphController.swift delete mode 100644 Sources/TuistDependencies/SwiftPackageManager/SwiftPackageManagerInteractor.swift delete mode 100644 Sources/TuistDependenciesTesting/Carthage/MockCarthageInteractor.swift delete mode 100644 Sources/TuistDependenciesTesting/Carthage/Models/CarthageVersionFile+TestData.swift delete mode 100644 Sources/TuistDependenciesTesting/Carthage/Utils/MockCarthageController.swift delete mode 100644 Sources/TuistDependenciesTesting/Carthage/Utils/MockCarthageGraphGenerator.swift delete mode 100644 Sources/TuistDependenciesTesting/DependenciesGraph/MockDependenciesGraphController.swift delete mode 100644 Sources/TuistDependenciesTesting/MockDependenciesController.swift delete mode 100644 Sources/TuistDependenciesTesting/SwiftPackageManager/MockSwiftPackageManagerInteractor.swift delete mode 100644 Sources/TuistDependenciesTesting/SwiftPackageManager/Utils/MockSwiftPackageManagerGraphGenerator.swift delete mode 100644 Sources/TuistEnvKit/Commands/BundleCommand.swift delete mode 100644 Sources/TuistEnvKit/Commands/CommandRunner.swift delete mode 100644 Sources/TuistEnvKit/Commands/InstallCommand.swift delete mode 100644 Sources/TuistEnvKit/Commands/LocalCommand.swift delete mode 100644 Sources/TuistEnvKit/Commands/TuistCommand.swift delete mode 100644 Sources/TuistEnvKit/Commands/UninstallCommand.swift delete mode 100644 Sources/TuistEnvKit/Commands/UpdateCommand.swift delete mode 100644 Sources/TuistEnvKit/Commands/VersionCommand.swift delete mode 100644 Sources/TuistEnvKit/HTTP/HTTPClient.swift delete mode 100644 Sources/TuistEnvKit/Installer/BuildCopier.swift delete mode 100644 Sources/TuistEnvKit/Installer/EnvInstaller.swift delete mode 100644 Sources/TuistEnvKit/Installer/Installer.swift delete mode 100644 Sources/TuistEnvKit/Installer/SwiftVersion.swift delete mode 100644 Sources/TuistEnvKit/Services/BundleService.swift delete mode 100644 Sources/TuistEnvKit/Services/InstallService.swift delete mode 100644 Sources/TuistEnvKit/Services/LocalService.swift delete mode 100644 Sources/TuistEnvKit/Services/UninstallService.swift delete mode 100644 Sources/TuistEnvKit/Services/UpdateService.swift delete mode 100644 Sources/TuistEnvKit/Services/VersionService.swift delete mode 100644 Sources/TuistEnvKit/Settings/Settings.swift delete mode 100644 Sources/TuistEnvKit/Settings/SettingsController.swift delete mode 100644 Sources/TuistEnvKit/Settings/VersionProvider.swift delete mode 100644 Sources/TuistEnvKit/Updater/Updater.swift delete mode 100644 Sources/TuistEnvKit/Versions/VersionResolver.swift delete mode 100644 Sources/TuistEnvKit/Versions/VersionsController.swift delete mode 100644 Sources/TuistGraph/Models/Cache.swift delete mode 100644 Sources/TuistGraph/Models/Dependencies/CarthageDependencies.swift delete mode 100644 Sources/TuistGraph/Models/Dependencies/Dependencies.swift delete mode 100644 Sources/TuistGraph/Models/DeploymentDevice.swift delete mode 100644 Sources/TuistGraph/Models/DeploymentTarget.swift delete mode 100644 Sources/TuistGraphTesting/Models/Cache+TestData.swift delete mode 100644 Sources/TuistKit/Commands/Signing/DecryptCommand.swift delete mode 100644 Sources/TuistKit/Commands/Signing/EncryptCommand.swift delete mode 100644 Sources/TuistKit/Commands/SigningCommand.swift delete mode 100644 Sources/TuistKit/Services/DecryptService.swift delete mode 100644 Sources/TuistKit/Services/EncryptService.swift delete mode 100644 Sources/TuistLoader/Loaders/DependenciesModelLoader.swift rename Sources/{TuistDependencies/SwiftPackageManager/Utils/SwiftPackageManagerGraphGenerator.swift => TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift} (72%) delete mode 100644 Sources/TuistLoader/Models+ManifestMappers/CarthageDependencies+ManifestMapper.swift delete mode 100644 Sources/TuistLoader/Models+ManifestMappers/Dependencies+ManifestMapper.swift rename Sources/{TuistDependencies/SwiftPackageManager/Utils/ManifestMapping/ProjectOption+ManifestMapper.swift => TuistLoader/Models+ManifestMappers/ProjectOption+ToManifestMapper.swift} (100%) delete mode 100644 Sources/TuistLoader/Models+ManifestMappers/SwiftPackageManagerDependencies+ManifestMapper.swift rename Sources/{TuistDependencies/SwiftPackageManager/Utils/ManifestMapping/TestingOptions+ManifestMapper.swift => TuistLoader/Models+ManifestMappers/TestingOptions+ToManifestMapper.swift} (100%) rename Sources/{TuistDependencies/SwiftPackageManager => TuistLoader}/Models/SwiftPackageManagerWorkspaceState.swift (100%) rename Sources/{TuistDependencies/SwiftPackageManager/Utils => TuistLoader/SwiftPackageManager}/PackageInfo+graphPlatform.swift (100%) rename Sources/{TuistDependencies/SwiftPackageManager/Utils => TuistLoader/SwiftPackageManager}/PackageInfoMapper.swift (97%) rename Sources/{TuistDependencies/SwiftPackageManager/Utils => TuistLoader/SwiftPackageManager}/SettingsMapper.swift (100%) rename Sources/{TuistDependencies/SwiftPackageManager/Utils => TuistLoader/SwiftPackageManager}/SwiftPackageManagerModuleMapGenerator.swift (100%) delete mode 100644 Sources/TuistLoader/Up/Carthage.swift delete mode 100644 Sources/TuistLoaderTesting/Loaders/Mocks/MockDependenciesModelLoader.swift delete mode 100644 Sources/TuistSigning/Certificate/Certificate.swift delete mode 100644 Sources/TuistSigning/GraphMappers/Dictionary+Fingerprint.swift delete mode 100644 Sources/TuistSigning/GraphMappers/SigningMapper.swift delete mode 100644 Sources/TuistSigning/Linter/SigningLinter.swift delete mode 100644 Sources/TuistSigning/ProvisioningProfile/ProvisioningProfile.swift delete mode 100644 Sources/TuistSigning/ProvisioningProfile/ProvisioningProfileParser.swift delete mode 100644 Sources/TuistSigning/SecurityController.swift delete mode 100644 Sources/TuistSigning/SigningFilesLocator.swift delete mode 100644 Sources/TuistSigning/SigningInstaller.swift delete mode 100644 Sources/TuistSigning/SigningMatcher.swift delete mode 100644 Sources/TuistSigningTesting/Extensions/Certificate+TestData.swift delete mode 100644 Sources/TuistSigningTesting/Extensions/ProvisioningProfile+TestData.swift delete mode 100644 Sources/TuistSigningTesting/Mocks/MockSigningCipher.swift delete mode 100644 Sources/TuistSigningTesting/Mocks/MockSigningInstaller.swift delete mode 100644 Sources/tuistenv/main.swift delete mode 100644 Templates/AppProject.stencil delete mode 100644 Templates/Config.stencil delete mode 100644 Templates/KitSource.stencil delete mode 100644 Templates/KitTests.stencil delete mode 100644 Templates/LocalHelper.stencil delete mode 100644 Templates/Package.stencil delete mode 100644 Templates/Package.swift delete mode 100644 Templates/Plugin.stencil delete mode 100644 Templates/Project+Templates.stencil delete mode 100644 Templates/UISource.stencil delete mode 100644 Templates/UITests.stencil delete mode 100644 Templates/default/AppDelegate.stencil create mode 100644 Templates/default/AppProject.stencil rename Templates/{ => default}/AppTests.stencil (100%) rename Templates/{swiftui => default}/ContentView.stencil (100%) rename Templates/{ => default}/Gitignore.stencil (100%) rename Templates/{ => default}/LaunchScreen+iOS.stencil (100%) rename Templates/{ => default}/LaunchScreen+macOS.stencil (100%) rename Templates/{ => default}/LaunchScreen+tvOS.stencil (100%) rename Templates/{swiftui => default}/Preview Content/Preview Assets.xcassets/Contents.json (100%) rename Templates/{swiftui => default}/app.stencil (87%) rename Templates/{swiftui => default}/ios/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename Templates/{swiftui => default}/ios/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename Templates/{swiftui => default}/ios/Assets.xcassets/Contents.json (100%) rename Templates/{swiftui => default}/macos/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename Templates/{swiftui => default}/macos/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename Templates/{swiftui => default}/macos/Assets.xcassets/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json (100%) rename Templates/{swiftui => default}/tvos/Assets.xcassets/Contents.json (100%) create mode 100644 Templates/default/watchos/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 Templates/default/watchos/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Templates/default/watchos/Assets.xcassets/Contents.json delete mode 100644 Templates/main.stencil delete mode 100644 Templates/swiftui/swiftui.swift rename Tests/Fixtures/{Carthage => PrebuiltFramework}/2510FE01-4D40-3956-BB71-857D3B2D9E73.bcsymbolmap (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/773847A9-0D05-35AF-9865-94A9A670080B.bcsymbolmap (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework.dSYM/Contents/Info.plist (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework.dSYM/Contents/Resources/DWARF/RxBlocking (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Headers/RxBlocking-Swift.h (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Info.plist (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm.swiftdoc (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm.swiftmodule (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64-apple-ios.swiftdoc (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64-apple-ios.swiftmodule (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64.swiftdoc (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64.swiftmodule (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7-apple-ios.swiftdoc (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7-apple-ios.swiftmodule (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7.swiftdoc (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7.swiftmodule (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386-apple-ios-simulator.swiftdoc (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386-apple-ios-simulator.swiftmodule (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386.swiftdoc (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386.swiftmodule (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64-apple-ios-simulator.swiftdoc (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64-apple-ios-simulator.swiftmodule (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64.swiftdoc (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64.swiftmodule (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/Modules/module.modulemap (100%) rename Tests/Fixtures/{Carthage => PrebuiltFramework}/RxBlocking.framework/RxBlocking (100%) delete mode 100644 Tests/ProjectDescriptionTests/Dependencies/CarthageDependenciesTests.swift delete mode 100644 Tests/ProjectDescriptionTests/Dependencies/DependenciesTests.swift delete mode 100644 Tests/ProjectDescriptionTests/Dependencies/SwiftPackageManagerDependenciesTests.swift delete mode 100644 Tests/TuistDependenciesTests/Carthage/CarthageInteractorTests.swift delete mode 100644 Tests/TuistDependenciesTests/Carthage/Models/CarthageVersionFileTests.swift delete mode 100644 Tests/TuistDependenciesTests/Carthage/Utils/CarthageControllerTests.swift delete mode 100644 Tests/TuistDependenciesTests/Carthage/Utils/CarthageGraphGeneratorTests.swift delete mode 100644 Tests/TuistDependenciesTests/DependenciesControllerTests.swift delete mode 100644 Tests/TuistDependenciesTests/DependenciesGraph/DependenciesGraphControllerTests.swift delete mode 100644 Tests/TuistDependenciesTests/SwiftPackageManager/SwiftPackageManagerInteractorTests.swift delete mode 100644 Tests/TuistDependenciesTests/SwiftPackageManager/Utils/SwiftPackageManagerGraphGeneratorTests.swift delete mode 100644 Tests/TuistEnvKitTests/Commands/CommandRunnerTests.swift delete mode 100644 Tests/TuistEnvKitTests/Commands/Mocks/MockCommandRunner.swift delete mode 100644 Tests/TuistEnvKitTests/GitHub/Mocks/MockVersionProvider.swift delete mode 100644 Tests/TuistEnvKitTests/HTTP/HTTPClientTests.swift delete mode 100644 Tests/TuistEnvKitTests/HTTP/Mocks/MockHTTPClient.swift delete mode 100644 Tests/TuistEnvKitTests/Installer/EnvInstallerTests.swift delete mode 100644 Tests/TuistEnvKitTests/Installer/InstallerTests.swift delete mode 100644 Tests/TuistEnvKitTests/Installer/Mocks/MockBuildCopier.swift delete mode 100644 Tests/TuistEnvKitTests/Installer/Mocks/MockEnvInstaller.swift delete mode 100644 Tests/TuistEnvKitTests/Installer/Mocks/MockInstaller.swift delete mode 100644 Tests/TuistEnvKitTests/Services/BundleServiceTests.swift delete mode 100644 Tests/TuistEnvKitTests/Services/InstallServiceTests.swift delete mode 100644 Tests/TuistEnvKitTests/Services/LocalServiceTests.swift delete mode 100644 Tests/TuistEnvKitTests/Services/UninstallServiceTests.swift delete mode 100644 Tests/TuistEnvKitTests/Services/UpdateServiceTests.swift delete mode 100644 Tests/TuistEnvKitTests/Settings/Mocks/MockSettingsController.swift delete mode 100644 Tests/TuistEnvKitTests/Settings/SettingsControllerTests.swift delete mode 100644 Tests/TuistEnvKitTests/Settings/SettingsTests.swift delete mode 100644 Tests/TuistEnvKitTests/Updater/Mocks/MockUpdater.swift delete mode 100644 Tests/TuistEnvKitTests/Updater/UpdaterTests.swift delete mode 100644 Tests/TuistEnvKitTests/Versions/Mocks/MockVersionResolver.swift delete mode 100644 Tests/TuistEnvKitTests/Versions/Mocks/MockVersionsController.swift delete mode 100644 Tests/TuistEnvKitTests/Versions/VersionResolverTests.swift delete mode 100644 Tests/TuistGraphTests/Models/Dependencies/CarthageDependenciesTests.swift delete mode 100644 Tests/TuistGraphTests/Models/DeploymentDeviceTests.swift delete mode 100644 Tests/TuistGraphTests/Models/DeploymentTargetTests.swift delete mode 100644 Tests/TuistKitTests/Services/DecryptServiceTests.swift delete mode 100644 Tests/TuistKitTests/Services/EncryptServiceTests.swift delete mode 100644 Tests/TuistLoaderTests/Loaders/DependenciesModelLoaderTests.swift delete mode 100644 Tests/TuistLoaderTests/Models+ManifestMappers/DependenciesManifestMapperTests.swift delete mode 100644 Tests/TuistLoaderTests/Models+ManifestMappers/DeploymentTargets+ManifestMapperTests.swift rename Tests/{TuistDependenciesTests/SwiftPackageManager/Utils => TuistLoaderTests/SwiftPackageManager}/PackageInfoGraphPlatformTests.swift (94%) rename Tests/{TuistDependenciesTests/SwiftPackageManager/Utils => TuistLoaderTests/SwiftPackageManager}/PackageInfoMapperTests.swift (97%) rename Tests/{TuistDependenciesTests/SwiftPackageManager/Utils => TuistLoaderTests/SwiftPackageManager}/SettingsMapperTests.swift (99%) rename Tests/{TuistDependenciesTests/SwiftPackageManager/Utils => TuistLoaderTests/SwiftPackageManager}/SwiftPackageManagerModuleMapGeneratorTests.swift (99%) delete mode 100644 Tests/TuistSigningTests/CertificateParserTests.swift delete mode 100644 Tests/TuistSigningTests/Mocks/MockCertificateParser.swift delete mode 100644 Tests/TuistSigningTests/Mocks/MockProvisioningProfileParser.swift delete mode 100644 Tests/TuistSigningTests/Mocks/MockSecurityController.swift delete mode 100644 Tests/TuistSigningTests/Mocks/MockSigningFilesLocator.swift delete mode 100644 Tests/TuistSigningTests/Mocks/MockSigningLinter.swift delete mode 100644 Tests/TuistSigningTests/Mocks/MockSigningMatcher.swift delete mode 100644 Tests/TuistSigningTests/SecurityControllerTests.swift delete mode 100644 Tests/TuistSigningTests/SigningCipherTests.swift delete mode 100644 Tests/TuistSigningTests/SigningFilesLocatorTests.swift delete mode 100644 Tests/TuistSigningTests/SigningInstallerTests.swift delete mode 100644 Tests/TuistSigningTests/SigningInteractorTests.swift delete mode 100644 Tests/TuistSigningTests/SigningLinterTests.swift delete mode 100644 Tests/TuistSigningTests/SigningMapperTests.swift delete mode 100644 Tests/TuistSigningTests/SigningMatcherTests.swift create mode 100644 Tests/TuistSupportTests/SwiftPackageManager/PackageInfoTests.swift delete mode 100644 fixtures/app_with_plugins/Tuist/Dependencies.swift delete mode 100644 fixtures/framework_with_native_swift_macro/Tuist/Dependencies.swift delete mode 100644 fixtures/ios_app_with_device_only_xcframework/Lib/Sources/Lib.swift delete mode 100644 fixtures/ios_app_with_device_only_xcframework/MyTarget/Sources/MyClass.swift delete mode 100644 fixtures/ios_app_with_device_only_xcframework/Project.swift delete mode 100644 fixtures/ios_app_with_device_only_xcframework/Tuist/Config.swift delete mode 100644 fixtures/multiplatform_app_with_sdk/Tuist/Dependencies.swift delete mode 100755 script/install delete mode 100755 script/uninstall diff --git a/.github/workflows/tuist.yml b/.github/workflows/tuist.yml index 8b2c374de35..2d4c8483ff9 100644 --- a/.github/workflows/tuist.yml +++ b/.github/workflows/tuist.yml @@ -79,12 +79,6 @@ jobs: run: tuist cache print-hashes --xcframeworks - name: Cache warm run: tuist cache warm --xcframeworks - - uses: actions/upload-artifact@v4 - if: ${{ always() }} - with: - name: cache-warm-x86_64.xcodebuild.log - path: | - /tmp/tuist/** acceptance_tests: name: Run ${{ matrix.feature }} diff --git a/.swiftformat b/.swiftformat index 6446fec651d..7958680ce69 100644 --- a/.swiftformat +++ b/.swiftformat @@ -3,9 +3,11 @@ --symlinks ignore --exclude Tests/XCTestManifests.swift,Sources/TuistSupport/Vendored,fixtures/Targets/SlothCreator,Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift --exclude fixtures/tuist_plugin +--disable conditionalAssignment --disable hoistAwait --disable hoistTry ---swiftversion 5.7 +--disable redundantReturn +--swiftversion 5.9 --minversion 0.53.0 # format options diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index f44f655deed..00000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "configurations": [ - { - "type": "lldb", - "request": "launch", - "name": "Debug tuist", - "program": "${workspaceFolder:tuist}/.build/debug/tuist", - "args": [], - "cwd": "${workspaceFolder:tuist}", - "preLaunchTask": "swift: Build Debug tuist" - }, - { - "type": "lldb", - "request": "launch", - "name": "Release tuist", - "program": "${workspaceFolder:tuist}/.build/release/tuist", - "args": [], - "cwd": "${workspaceFolder:tuist}", - "preLaunchTask": "swift: Build Release tuist" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug tuistenv", - "program": "${workspaceFolder:tuist}/.build/debug/tuistenv", - "args": [], - "cwd": "${workspaceFolder:tuist}", - "preLaunchTask": "swift: Build Debug tuistenv" - }, - { - "type": "lldb", - "request": "launch", - "name": "Release tuistenv", - "program": "${workspaceFolder:tuist}/.build/release/tuistenv", - "args": [], - "cwd": "${workspaceFolder:tuist}", - "preLaunchTask": "swift: Build Release tuistenv" - }, - { - "type": "lldb", - "request": "launch", - "name": "Test tuist", - "program": "/Applications/Xcode.app/Contents/Developer/usr/bin/xctest", - "args": [ - ".build/debug/tuistPackageTests.xctest" - ], - "cwd": "${workspaceFolder:tuist}", - "preLaunchTask": "swift: Build All" - }, - { - "type": "lldb", - "request": "launch", - "sourceLanguages": [ - "swift" - ], - "name": "Debug tuistbenchmark", - "program": "${workspaceFolder:tuist}/.build/debug/tuistbenchmark", - "args": [], - "cwd": "${workspaceFolder:tuist}", - "preLaunchTask": "swift: Build Debug tuistbenchmark" - }, - { - "type": "lldb", - "request": "launch", - "sourceLanguages": [ - "swift" - ], - "name": "Release tuistbenchmark", - "program": "${workspaceFolder:tuist}/.build/release/tuistbenchmark", - "args": [], - "cwd": "${workspaceFolder:tuist}", - "preLaunchTask": "swift: Build Release tuistbenchmark" - }, - { - "type": "lldb", - "request": "launch", - "sourceLanguages": [ - "swift" - ], - "name": "Debug tuistfixturegenerator", - "program": "${workspaceFolder:tuist}/.build/debug/tuistfixturegenerator", - "args": [], - "cwd": "${workspaceFolder:tuist}", - "preLaunchTask": "swift: Build Debug tuistfixturegenerator" - }, - { - "type": "lldb", - "request": "launch", - "sourceLanguages": [ - "swift" - ], - "name": "Release tuistfixturegenerator", - "program": "${workspaceFolder:tuist}/.build/release/tuistfixturegenerator", - "args": [], - "cwd": "${workspaceFolder:tuist}", - "preLaunchTask": "swift: Build Release tuistfixturegenerator" - } - ] -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 485f538ae78..bffd0d7db2c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -23,9 +23,10 @@ }, "editor.defaultFormatter": "esbenp.prettier-vscode", "files.exclude": { + "**/.build/": true, + "**/.DS_Store": true, "**/.git": true, - "**/node_modules": true, - "**/.DS_Store": true + "**/node_modules": true }, "spellright.language": [ "en" diff --git a/.xcode-version b/.xcode-version index ccc2f3b87fe..0d57595e391 100644 --- a/.xcode-version +++ b/.xcode-version @@ -1 +1 @@ -15.1 \ No newline at end of file +15.2 \ No newline at end of file diff --git a/.xcode-version-libraries b/.xcode-version-libraries index 3aa5f893f06..0d57595e391 100644 --- a/.xcode-version-libraries +++ b/.xcode-version-libraries @@ -1 +1 @@ -14.1 \ No newline at end of file +15.2 \ No newline at end of file diff --git a/Package.resolved b/Package.resolved index e8653e8167e..2e97e37c199 100644 --- a/Package.resolved +++ b/Package.resolved @@ -37,12 +37,12 @@ } }, { - "identity" : "cryptoswift", + "identity" : "difference", "kind" : "remoteSourceControl", - "location" : "https://github.com/krzyzanowskim/CryptoSwift.git", + "location" : "https://github.com/krzysztofzablocki/Difference.git", "state" : { - "revision" : "db51c407d3be4a051484a141bf0bff36c43d3b1e", - "version" : "1.8.0" + "revision" : "f627d00718033c3d7888acd5f4e3524a843db1cf", + "version" : "1.0.2" } }, { diff --git a/Package.swift b/Package.swift index 1ea02c28acd..b7e44ac6a02 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.7 +// swift-tools-version:5.9 import PackageDescription @@ -75,7 +75,6 @@ var targets: [Target] = [ "ProjectAutomation", "TuistLoader", "TuistScaffold", - "TuistSigning", "TuistDependencies", "GraphViz", "TuistMigration", @@ -93,20 +92,6 @@ var targets: [Target] = [ "ProjectAutomation", ] ), - .target( - name: "TuistEnvKit", - dependencies: [ - argumentParserDependency, - swiftToolsSupportDependency, - "TuistSupport", - ] - ), - .executableTarget( - name: "tuistenv", - dependencies: [ - "TuistEnvKit", - ] - ), .target( name: "ProjectDescription", dependencies: [] @@ -132,6 +117,7 @@ var targets: [Target] = [ "TuistSupport", "TuistGraph", swiftToolsSupportDependency, + "Difference", ], linkerSettings: [.linkedFramework("XCTest")] ), @@ -190,16 +176,6 @@ var targets: [Target] = [ "TuistSupport", ] ), - .target( - name: "TuistSigning", - dependencies: [ - "TuistCore", - "TuistGraph", - "TuistSupport", - "CryptoSwift", - swiftToolsSupportDependency, - ] - ), .target( name: "TuistDependencies", dependencies: [ @@ -285,7 +261,6 @@ let package = Package( .executable(name: "tuistbenchmark", targets: ["tuistbenchmark"]), .executable(name: "tuistfixturegenerator", targets: ["tuistfixturegenerator"]), .executable(name: "tuist", targets: ["tuist"]), - .executable(name: "tuistenv", targets: ["tuistenv"]), .library( name: "ProjectDescription", type: .dynamic, @@ -340,10 +315,6 @@ let package = Package( name: "TuistAutomation", targets: ["TuistAutomation"] ), - .library( - name: "TuistSigning", - targets: ["TuistSigning"] - ), .library( name: "TuistDependencies", targets: ["TuistDependencies"] @@ -378,13 +349,13 @@ let package = Package( .package(url: "https://github.com/weichsel/ZIPFoundation", from: "0.9.17"), .package(url: "https://github.com/httpswift/swifter.git", revision: "1e4f51c92d7ca486242d8bf0722b99de2c3531aa"), .package(url: "https://github.com/kishikawakatsumi/KeychainAccess", from: "4.2.2"), - .package(url: "https://github.com/krzyzanowskim/CryptoSwift", from: "1.8.0"), .package(url: "https://github.com/stencilproject/Stencil", exact: "0.15.1"), .package(url: "https://github.com/SwiftDocOrg/GraphViz", exact: "0.2.0"), .package(url: "https://github.com/SwiftGen/StencilSwiftKit", exact: "2.10.1"), .package(url: "https://github.com/SwiftGen/SwiftGen", exact: "6.6.2"), .package(url: "https://github.com/tuist/XcodeProj", exact: "8.15.0"), .package(url: "https://github.com/cpisciotta/xcbeautify", from: "1.4.0"), + .package(url: "https://github.com/krzysztofzablocki/Difference.git", from: "1.0.2"), ], targets: targets ) diff --git a/Project.swift b/Project.swift index d3aa4be0757..514fb9a7de7 100644 --- a/Project.swift +++ b/Project.swift @@ -15,13 +15,6 @@ func releaseSettings() -> SettingsDictionary { func targets() -> [Target] { let executableTargets = [ - Target.target( - name: "tuistenv", - product: .commandLineTool, - dependencies: [ - .target(name: "TuistEnvKit"), - ] - ), Target.target( name: "tuist", product: .commandLineTool, @@ -93,6 +86,7 @@ func targets() -> [Target] { .external(name: "Logging"), .external(name: "ZIPFoundation"), .external(name: "Swifter"), + .external(name: "Difference"), ], testingDependencies: [ .target(name: "TuistCore"), @@ -111,7 +105,6 @@ func targets() -> [Target] { .target(name: "ProjectAutomation"), .target(name: "TuistLoader"), .target(name: "TuistScaffold"), - .target(name: "TuistSigning"), .target(name: "TuistDependencies"), .target(name: "TuistMigration"), .target(name: "TuistAsyncQueue"), @@ -134,8 +127,6 @@ func targets() -> [Target] { .target(name: "TuistGeneratorTesting"), .target(name: "TuistScaffoldTesting"), .target(name: "TuistAutomationTesting"), - .target(name: "TuistSigningTesting"), - .target(name: "TuistDependenciesTesting"), .target(name: "TuistMigrationTesting"), .target(name: "TuistAsyncQueueTesting"), .target(name: "TuistGraphTesting"), @@ -155,19 +146,6 @@ func targets() -> [Target] { .external(name: "XcodeProj"), ] ), - Target.module( - name: "TuistEnvKit", - hasTesting: false, - dependencies: [ - .target(name: "TuistSupport"), - .external(name: "ArgumentParser"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - ], - testDependencies: [ - .target(name: "TuistSupportTesting"), - ] - ), Target.module( name: "TuistGraph", dependencies: [ @@ -248,7 +226,6 @@ func targets() -> [Target] { .target(name: "TuistCoreTesting"), .target(name: "TuistSupportTesting"), .target(name: "TuistGraphTesting"), - .target(name: "TuistSigningTesting"), .external(name: "XcodeProj"), ] ), @@ -370,26 +347,6 @@ func targets() -> [Target] { hasTesting: false, dependencies: [] ), - Target.module( - name: "TuistSigning", - hasIntegrationTests: false, - dependencies: [ - .target(name: "TuistCore"), - .target(name: "TuistGraph"), - .target(name: "TuistSupport"), - .external(name: "CryptoSwift"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - ], - testDependencies: [ - .target(name: "TuistSupportTesting"), - .target(name: "TuistCoreTesting"), - .target(name: "TuistGraphTesting"), - ], - testingDependencies: [ - .target(name: "TuistGraphTesting"), - ] - ), Target.module( name: "TuistAnalytics", hasTests: false, @@ -438,6 +395,7 @@ func targets() -> [Target] { ), Target.module( name: "TuistDependencies", + hasTesting: false, dependencies: [ .target(name: "ProjectDescription"), .target(name: "TuistCore"), diff --git a/Sources/ProjectAutomation/Project.swift b/Sources/ProjectAutomation/Project.swift index 7f74428b872..1f7a37adf6b 100644 --- a/Sources/ProjectAutomation/Project.swift +++ b/Sources/ProjectAutomation/Project.swift @@ -8,7 +8,7 @@ public struct Project: Codable, Equatable { /// The absolute path of the project. public let path: String - /// Indicates whether the project is imported through `Dependencies.swift`. + /// Indicates whether the project is imported through `Package.swift`. public let isExternal: Bool /// The Swift packages that this project depends on. diff --git a/Sources/ProjectDescription/Arguments.swift b/Sources/ProjectDescription/Arguments.swift index 7e5456fa048..ca81180301f 100644 --- a/Sources/ProjectDescription/Arguments.swift +++ b/Sources/ProjectDescription/Arguments.swift @@ -5,27 +5,10 @@ public struct Arguments: Equatable, Codable { public var environmentVariables: [String: EnvironmentVariable] public var launchArguments: [LaunchArgument] - @available(*, deprecated, message: "please use environmentVariables instead") - public init( - environment: [String: String] = [:], - launchArguments: [LaunchArgument] = [] - ) { - environmentVariables = environment.mapValues { value in - EnvironmentVariable(value: value, isEnabled: true) - } - self.launchArguments = launchArguments - } - - public init( + public static func arguments( environmentVariables: [String: EnvironmentVariable] = [:], launchArguments: [LaunchArgument] = [] - ) { - self.environmentVariables = environmentVariables - self.launchArguments = launchArguments - } - - public init(launchArguments: [LaunchArgument]) { - environmentVariables = [:] - self.launchArguments = launchArguments + ) -> Self { + self.init(environmentVariables: environmentVariables, launchArguments: launchArguments) } } diff --git a/Sources/ProjectDescription/BuildAction.swift b/Sources/ProjectDescription/BuildAction.swift index 98149fac969..73be5e0c1f7 100644 --- a/Sources/ProjectDescription/BuildAction.swift +++ b/Sources/ProjectDescription/BuildAction.swift @@ -13,18 +13,6 @@ public struct BuildAction: Equatable, Codable { /// Whether the post actions should be run in the case of a failure public var runPostActionsOnFailure: Bool - public init( - targets: [TargetReference], - preActions: [ExecutionAction] = [], - postActions: [ExecutionAction] = [], - runPostActionsOnFailure: Bool = false - ) { - self.targets = targets - self.preActions = preActions - self.postActions = postActions - self.runPostActionsOnFailure = runPostActionsOnFailure - } - /// Returns a build action. /// - Parameters: /// - targets: A list of targets to build, which are defined in the project. diff --git a/Sources/ProjectDescription/BuildRule.swift b/Sources/ProjectDescription/BuildRule.swift index 1e3c963c480..8bc05efabe9 100644 --- a/Sources/ProjectDescription/BuildRule.swift +++ b/Sources/ProjectDescription/BuildRule.swift @@ -29,7 +29,7 @@ public struct BuildRule: Codable, Equatable { /// Build rule run once per architecture. public var runOncePerArchitecture: Bool? - public init( + public static func buildRule( name: String? = nil, fileType: FileType, filePatterns: String? = nil, @@ -39,15 +39,17 @@ public struct BuildRule: Codable, Equatable { outputFilesCompilerFlags: [String] = [], script: String? = nil, runOncePerArchitecture: Bool = false - ) { - self.name = name - self.fileType = fileType - self.filePatterns = filePatterns - self.compilerSpec = compilerSpec - self.inputFiles = inputFiles - self.outputFiles = outputFiles - self.outputFilesCompilerFlags = outputFilesCompilerFlags - self.script = script - self.runOncePerArchitecture = runOncePerArchitecture + ) -> Self { + self.init( + compilerSpec: compilerSpec, + filePatterns: filePatterns, + fileType: fileType, + name: name, + outputFiles: outputFiles, + inputFiles: inputFiles, + outputFilesCompilerFlags: outputFilesCompilerFlags, + script: script, + runOncePerArchitecture: runOncePerArchitecture + ) } } diff --git a/Sources/ProjectDescription/Cache.swift b/Sources/ProjectDescription/Cache.swift deleted file mode 100644 index e6e6bead769..00000000000 --- a/Sources/ProjectDescription/Cache.swift +++ /dev/null @@ -1,53 +0,0 @@ -import Foundation - -/// A cache configuration. -public struct Cache: Codable, Equatable { - /// A cache profile. - public struct Profile: Codable, Equatable { - /// The unique name of a profile - public var name: String - - /// The configuration to be used when building the project during a caching warmup - public var configuration: String - - /// The device to be used when building the project during a caching warmup - public var device: String? - - /// The version of the OS to be used when building the project during a caching warmup - public var os: String? - - /// Returns a `Cache.Profile` instance. - /// - /// - Parameters: - /// - name: The unique name of the cache profile - /// - configuration: The configuration to be used when building the project during a caching warmup - /// - device: The device to be used when building the project during a caching warmup - /// - os: The version of the OS to be used when building the project during a caching warmup - /// - Returns: The `Cache.Profile` instance - public static func profile( - name: String, - configuration: String, - device: String? = nil, - os: String? = nil - ) -> Profile { - Profile(name: name, configuration: configuration, device: device, os: os) - } - } - - /// A list of the cache profiles. - public var profiles: [Profile] - /// The path where the cache will be stored, if `nil` it will be a default location in a shared directory. - public var path: Path? - - /// Returns a `Cache` instance containing the given profiles. - /// If no profile list is provided, tuist's default profile will be taken as the default. - /// If no profile is provided in `tuist cache --profile` command, the first profile from the profiles list will be taken as - /// the default. - /// - Parameters: - /// - profiles: Profiles to be chosen from - /// - path: The path where the cache will be stored, if `nil` it will be a default location in a shared directory. - /// - Returns: The `Cache` instance - public static func cache(profiles: [Profile] = [], path: Path? = nil) -> Cache { - Cache(profiles: profiles, path: path) - } -} diff --git a/Sources/ProjectDescription/Cloud.swift b/Sources/ProjectDescription/Cloud.swift index 2ea2f3267a8..3ab94785122 100644 --- a/Sources/ProjectDescription/Cloud.swift +++ b/Sources/ProjectDescription/Cloud.swift @@ -4,17 +4,6 @@ import Foundation public struct Cloud: Codable, Equatable { /// Options for cloud configuration. public enum Option: String, Codable, Equatable { - /// Enables sending analytics to cloud dashboard. - @available( - *, - deprecated, - message: "Analytics are sent to the cloud backend by default. Use `disableAnalytics` to disable this feature." - ) - case analytics - - /// Disables sending analytics to cloud dashboard. - case disableAnalytics - /// Marks whether cloud connection is optional. /// If not present, tuist commands will fail regardless of whether an authentication token is available locally from /// `tuist cloud auth` or not. diff --git a/Sources/ProjectDescription/Config.swift b/Sources/ProjectDescription/Config.swift index e80920f3a9a..2a2b582cec0 100644 --- a/Sources/ProjectDescription/Config.swift +++ b/Sources/ProjectDescription/Config.swift @@ -24,7 +24,7 @@ /// /// let config = Config( /// compatibleXcodeVersions: ["14.2"], -/// swiftVersion: "5.7.0" +/// swiftVersion: "5.9.0" /// ) /// ``` public struct Config: Codable, Equatable { @@ -40,9 +40,6 @@ public struct Config: Codable, Equatable { /// Cloud configuration. public let cloud: Cloud? - /// Cache configuration. - public let cache: Cache? - /// The Swift tools versions that will be used by Tuist to fetch external dependencies. /// If `nil` is passed then Tuist will use the environment’s version. /// - Note: This **does not** control the `SWIFT_VERSION` build setting in regular generated projects, for this please use @@ -55,14 +52,12 @@ public struct Config: Codable, Equatable { /// - Parameters: /// - compatibleXcodeVersions: List of Xcode versions the project is compatible with. /// - cloud: Cloud configuration. - /// - cache: Cache configuration. /// - swiftVersion: The version of Swift that will be used by Tuist. /// - plugins: A list of plugins to extend Tuist. /// - generationOptions: List of options to use when generating the project. public init( compatibleXcodeVersions: CompatibleXcodeVersions = .all, cloud: Cloud? = nil, - cache: Cache? = nil, swiftVersion: Version? = nil, plugins: [PluginLocation] = [], generationOptions: GenerationOptions = .options() @@ -71,7 +66,6 @@ public struct Config: Codable, Equatable { self.plugins = plugins self.generationOptions = generationOptions self.cloud = cloud - self.cache = cache self.swiftVersion = swiftVersion dumpIfNeeded(self) } diff --git a/Sources/ProjectDescription/CoreDataModel.swift b/Sources/ProjectDescription/CoreDataModel.swift index 8777e46b5c7..b68e2e390ab 100644 --- a/Sources/ProjectDescription/CoreDataModel.swift +++ b/Sources/ProjectDescription/CoreDataModel.swift @@ -14,11 +14,13 @@ public struct CoreDataModel: Codable, Equatable { /// - path: relative path to the Core Data model. /// - currentVersion: optional current version name (with or without the extension) /// By providing nil, it will try to read it from the .xccurrentversion file. - public init( + public static func coreDataModel( _ path: Path, currentVersion: String? = nil - ) { - self.path = path - self.currentVersion = currentVersion + ) -> Self { + self.init( + path: path, + currentVersion: currentVersion + ) } } diff --git a/Sources/ProjectDescription/Dependencies/CarthageDependencies.swift b/Sources/ProjectDescription/Dependencies/CarthageDependencies.swift deleted file mode 100644 index 833aa29e8d0..00000000000 --- a/Sources/ProjectDescription/Dependencies/CarthageDependencies.swift +++ /dev/null @@ -1,44 +0,0 @@ -import Foundation - -/// A collection of Carthage dependencies. -public struct CarthageDependencies: Codable, Equatable { - /// List of dependencies that will be installed using Carthage. - public var dependencies: [Dependency] - - /// Creates `CarthageDependencies` instance. - /// - Parameter dependencies: List of dependencies that can be installed using Carthage. - public init(_ dependencies: [Dependency]) { - self.dependencies = dependencies - } -} - -// MARK: - ExpressibleByArrayLiteral - -extension CarthageDependencies: ExpressibleByArrayLiteral { - public init(arrayLiteral elements: Dependency...) { - dependencies = elements - } -} - -// MARK: - CarthageDependencies.Dependency & CarthageDependencies.Requirement & CarthageDependencies.Options - -extension CarthageDependencies { - /// Specifies origin of Carthage dependency. - public enum Dependency: Codable, Equatable { - /// GitHub repositories (both GitHub.com and GitHub Enterprise). - case github(path: String, requirement: Requirement) - /// Other Git repositories. - case git(path: String, requirement: Requirement) - /// Dependencies that are only available as compiled binary `.framework`s. - case binary(path: String, requirement: Requirement) - } - - /// Specifies version requirement for Carthage dependency. - public enum Requirement: Codable, Equatable { - case exact(Version) - case upToNext(Version) - case atLeast(Version) - case branch(String) - case revision(String) - } -} diff --git a/Sources/ProjectDescription/Dependencies/Dependencies.swift b/Sources/ProjectDescription/Dependencies/Dependencies.swift deleted file mode 100644 index de03c5f6e2b..00000000000 --- a/Sources/ProjectDescription/Dependencies/Dependencies.swift +++ /dev/null @@ -1,47 +0,0 @@ -import Foundation - -/// A collection of external dependencies. -/// -/// Learn how to get started with `Dependencies.swift` manifest [here](https://docs.tuist.io/guides/dependencies). -/// -/// ```swift -/// import ProjectDescription -/// -/// let dependencies = Dependencies( -/// carthage: [ -/// .github(path: "Alamofire/Alamofire", requirement: .exact("5.0.4")), -/// ], -/// swiftPackageManager: [ -/// .remote(url: "https://github.com/Alamofire/Alamofire", requirement: / .upToNextMajor(from: "5.0.0")), -/// ], -/// platforms: [.iOS] -/// ) -/// ``` -public struct Dependencies: Codable, Equatable { - /// The description of dependencies that can be installed using Carthage. - public let carthage: CarthageDependencies? - - /// The description of dependencies that can be installed using Swift Package Manager. - public let swiftPackageManager: SwiftPackageManagerDependencies? - - /// List of platforms for which you want to install dependencies. - public let platforms: Set - - /// Creates a new `Dependencies` manifest instance. - /// - Parameters: - /// - carthage: The description of dependencies that can be installed using Carthage. Pass `nil` if you don't have - /// dependencies from Carthage. - /// - swiftPackageManager: The description of dependencies that can be installed using SPM. Pass `nil` if you don't have - /// dependencies from SPM. - /// - platforms: Set of platforms for which you want to install dependencies. - public init( - carthage: CarthageDependencies? = nil, - swiftPackageManager: SwiftPackageManagerDependencies? = nil, - platforms: Set = Set(PackagePlatform.allCases) - ) { - self.carthage = carthage - self.swiftPackageManager = swiftPackageManager - self.platforms = platforms - dumpIfNeeded(self) - } -} diff --git a/Sources/ProjectDescription/Dependencies/SwiftPackageManagerDependencies.swift b/Sources/ProjectDescription/Dependencies/SwiftPackageManagerDependencies.swift deleted file mode 100644 index 1513576fa3f..00000000000 --- a/Sources/ProjectDescription/Dependencies/SwiftPackageManagerDependencies.swift +++ /dev/null @@ -1,73 +0,0 @@ -import Foundation - -public enum PackagesOrManifest: Codable, Equatable { - case packages([Package]) - case manifest -} - -/// A collection of Swift Package Manager dependencies. -/// -/// For example, to enabled resource accessors on projects generated from Swift Package Manager: -/// -/// ```swift -/// let packageManager = SwiftPackageManagerDependencies( -/// "Package.swift", -/// projectOptions: ["MySwiftPackage": .options(disableSynthesizedResourceAccessors: false)] -/// ) -/// ``` -public struct SwiftPackageManagerDependencies: Codable, Equatable { - /// The path to the `Package.swift` manifest defining the dependencies, or the list of packages that will be installed using - /// Swift Package Manager. - public var packagesOrManifest: PackagesOrManifest - - /// The custom `Product` type to be used for SPM targets. - public var productTypes: [String: Product] - - // The base settings to be used for targets generated from SwiftPackageManager - public var baseSettings: Settings - - // Additional settings to be added to targets generated from SwiftPackageManager. - public var targetSettings: [String: SettingsDictionary] - - /// Custom project configurations to be used for projects generated from SwiftPackageManager. - public var projectOptions: [String: Project.Options] - - /// Creates `SwiftPackageManagerDependencies` instance. - /// - Parameter packages: List of packages that will be installed using Swift Package Manager. - /// - Parameter productTypes: The custom `Product` types to be used for SPM targets. - /// - Parameter baseSettings: Additional settings to be added to targets generated from SwiftPackageManager. - /// - Parameter targetSettings: Additional settings to be added to targets generated from SwiftPackageManager. - /// - Parameter projectOptions: Custom project configurations to be used for projects generated from SwiftPackageManager. - @available(*, deprecated, message: "Use init without packages parameter instead") - public init( - _ packages: [Package], - productTypes: [String: Product] = [:], - baseSettings: Settings = .settings(), - targetSettings: [String: SettingsDictionary] = [:], - projectOptions: [String: Project.Options] = [:] - ) { - packagesOrManifest = .packages(packages) - self.productTypes = productTypes - self.baseSettings = baseSettings - self.targetSettings = targetSettings - self.projectOptions = projectOptions - } - - /// Creates `SwiftPackageManagerDependencies` instance using the package manifest at `Tuist/Package.swift`. - /// - Parameter productTypes: The custom `Product` types to be used for SPM targets. - /// - Parameter baseSettings: Additional settings to be added to targets generated from SwiftPackageManager. - /// - Parameter targetSettings: Additional settings to be added to targets generated from SwiftPackageManager. - /// - Parameter projectOptions: Custom project configurations to be used for projects generated from SwiftPackageManager. - public init( - productTypes: [String: Product] = [:], - baseSettings: Settings = .settings(), - targetSettings: [String: SettingsDictionary] = [:], - projectOptions: [String: Project.Options] = [:] - ) { - packagesOrManifest = .manifest - self.productTypes = productTypes - self.baseSettings = baseSettings - self.targetSettings = targetSettings - self.projectOptions = projectOptions - } -} diff --git a/Sources/ProjectDescription/DeploymentDevice.swift b/Sources/ProjectDescription/DeploymentDevice.swift deleted file mode 100644 index d382d44f0f5..00000000000 --- a/Sources/ProjectDescription/DeploymentDevice.swift +++ /dev/null @@ -1,22 +0,0 @@ -import Foundation - -// MARK: - DeploymentDevice - -/// A supported deployment device. -@available(*, deprecated, message: "Use `Destinations` to define supported devices") -public struct DeploymentDevice: OptionSet, Codable, Hashable { - /// An iPhone device. - public static let iphone = DeploymentDevice(rawValue: 1 << 0) - /// An iPad device. - public static let ipad = DeploymentDevice(rawValue: 1 << 1) - /// A Mac device. - public static let mac = DeploymentDevice(rawValue: 1 << 2) - /// An Apple Vision device. - public static let vision = DeploymentDevice(rawValue: iphone.rawValue | ipad.rawValue | mac.rawValue) - - public let rawValue: UInt - - public init(rawValue: UInt) { - self.rawValue = rawValue - } -} diff --git a/Sources/ProjectDescription/DeploymentTarget.swift b/Sources/ProjectDescription/DeploymentTarget.swift deleted file mode 100644 index 989ccb3340c..00000000000 --- a/Sources/ProjectDescription/DeploymentTarget.swift +++ /dev/null @@ -1,40 +0,0 @@ -import Foundation - -// MARK: - DeploymentTarget - -/// A supported minimum deployment target. -@available( - *, - deprecated, - message: "Use `DeploymentTargets` to specify minimum OS Versions, and `Destinations` to define supported OSes" -) -public enum DeploymentTarget: Codable, Hashable { - /// The minimum iOS version, the list of devices your product will support, and whether or not the target should run on mac - /// devices. - case iOS(targetVersion: String, devices: DeploymentDevice, supportsMacDesignedForIOS: Bool = true) - /// The minimum macOS version your product will support. - case macOS(targetVersion: String) - /// The minimum watchOS version your product will support. - case watchOS(targetVersion: String) - /// The minimum tvOS version your product will support. - case tvOS(targetVersion: String) - /// The minimum visionOS version your product will support. - case visionOS(targetVersion: String) - - private enum Kind: String, Codable { - case iOS - case macOS - case watchOS - case tvOS - case visionOS - } - - /// The target platform version - public var targetVersion: String { - switch self { - case let .iOS(targetVersion, _, _), let .macOS(targetVersion), let .watchOS(targetVersion), - let .tvOS(targetVersion), let .visionOS(targetVersion): - return targetVersion - } - } -} diff --git a/Sources/ProjectDescription/DeploymentTargets.swift b/Sources/ProjectDescription/DeploymentTargets.swift index f9186e86940..a0bd252b84f 100644 --- a/Sources/ProjectDescription/DeploymentTargets.swift +++ b/Sources/ProjectDescription/DeploymentTargets.swift @@ -15,12 +15,20 @@ public struct DeploymentTargets: Hashable, Codable { /// Minimum deployment version for visionOS public var visionOS: String? - public init(iOS: String? = nil, macOS: String? = nil, watchOS: String? = nil, tvOS: String? = nil, visionOS: String? = nil) { - self.iOS = iOS - self.macOS = macOS - self.watchOS = watchOS - self.tvOS = tvOS - self.visionOS = visionOS + public static func deploymentTargets( + iOS: String? = nil, + macOS: String? = nil, + watchOS: String? = nil, + tvOS: String? = nil, + visionOS: String? = nil + ) -> Self { + self.init( + iOS: iOS, + macOS: macOS, + watchOS: watchOS, + tvOS: tvOS, + visionOS: visionOS + ) } /// Convenience accessor to retreive a minimum version given a `Platform` diff --git a/Sources/ProjectDescription/Entitlements.swift b/Sources/ProjectDescription/Entitlements.swift index 23a3474bbd5..135d4042f77 100644 --- a/Sources/ProjectDescription/Entitlements.swift +++ b/Sources/ProjectDescription/Entitlements.swift @@ -31,6 +31,6 @@ public enum Entitlements: Codable, Equatable { extension Entitlements: ExpressibleByStringInterpolation { public init(stringLiteral value: String) { - self = .file(path: Path(value)) + self = .file(path: .path(value)) } } diff --git a/Sources/ProjectDescription/EnvironmentVariable.swift b/Sources/ProjectDescription/EnvironmentVariable.swift index 57454bf81d2..8700fa52772 100644 --- a/Sources/ProjectDescription/EnvironmentVariable.swift +++ b/Sources/ProjectDescription/EnvironmentVariable.swift @@ -11,11 +11,15 @@ public struct EnvironmentVariable: Equatable, Codable, Hashable, ExpressibleBySt // MARK: - Init - public init(value: String, isEnabled: Bool) { + init(value: String, isEnabled: Bool) { self.value = value self.isEnabled = isEnabled } + public static func environmentVariable(value: String, isEnabled: Bool) -> Self { + self.init(value: value, isEnabled: isEnabled) + } + public init(stringLiteral value: String) { self.value = value isEnabled = true diff --git a/Sources/ProjectDescription/ExecuteAction.swift b/Sources/ProjectDescription/ExecuteAction.swift index 777fface352..4834095af64 100644 --- a/Sources/ProjectDescription/ExecuteAction.swift +++ b/Sources/ProjectDescription/ExecuteAction.swift @@ -9,10 +9,17 @@ public struct ExecutionAction: Equatable, Codable { /// The path to the shell which shall execute this script. if it is nil, Xcode will use default value. public var shellPath: String? - public init(title: String = "Run Script", scriptText: String, target: TargetReference? = nil, shellPath: String? = nil) { - self.title = title - self.scriptText = scriptText - self.target = target - self.shellPath = shellPath + public static func executionAction( + title: String = "Run Script", + scriptText: String, + target: TargetReference? = nil, + shellPath: String? = nil + ) -> Self { + self.init( + title: title, + scriptText: scriptText, + target: target, + shellPath: shellPath + ) } } diff --git a/Sources/ProjectDescription/FileElement.swift b/Sources/ProjectDescription/FileElement.swift index 043905e2726..3cb4f4e0651 100644 --- a/Sources/ProjectDescription/FileElement.swift +++ b/Sources/ProjectDescription/FileElement.swift @@ -32,7 +32,7 @@ public enum FileElement: Codable, Equatable { extension FileElement: ExpressibleByStringInterpolation { public init(stringLiteral value: String) { - self = .glob(pattern: Path(value)) + self = .glob(pattern: .path(value)) } } @@ -48,6 +48,6 @@ extension [FileElement]: ExpressibleByStringLiteral { public typealias StringLiteralType = String public init(stringLiteral value: String) { - self = [.glob(pattern: Path(value))] + self = [.glob(pattern: .path(value))] } } diff --git a/Sources/ProjectDescription/FileListGlob.swift b/Sources/ProjectDescription/FileListGlob.swift index 4bcc88f18fc..125049834ba 100644 --- a/Sources/ProjectDescription/FileListGlob.swift +++ b/Sources/ProjectDescription/FileListGlob.swift @@ -33,6 +33,6 @@ public struct FileListGlob: Codable, Equatable { extension FileListGlob: ExpressibleByStringInterpolation { public init(stringLiteral value: String) { - self.init(glob: Path(value), excluding: []) + self.init(glob: .path(value), excluding: []) } } diff --git a/Sources/ProjectDescription/InfoPlist.swift b/Sources/ProjectDescription/InfoPlist.swift index 0610e0cc6f5..50d6d3158a2 100644 --- a/Sources/ProjectDescription/InfoPlist.swift +++ b/Sources/ProjectDescription/InfoPlist.swift @@ -41,13 +41,6 @@ public enum InfoPlist: Codable, Equatable { extension InfoPlist: ExpressibleByStringInterpolation { public init(stringLiteral value: String) { - self = .file(path: Path(value)) + self = .file(path: .path(value)) } } - -// MARK: - InfoPlist API compatibility - -extension InfoPlist { - @available(*, deprecated, message: "InfoPlist.Value was renamed to Plist.Value") - public typealias Value = Plist.Value -} diff --git a/Sources/ProjectDescription/LaunchArgument.swift b/Sources/ProjectDescription/LaunchArgument.swift index efda1fff436..1fa8d29f4cf 100644 --- a/Sources/ProjectDescription/LaunchArgument.swift +++ b/Sources/ProjectDescription/LaunchArgument.swift @@ -15,9 +15,8 @@ public struct LaunchArgument: Equatable, Codable { /// - Parameters: /// - name: Name of argument /// - isEnabled: If enabled then argument is marked as active - public init(name: String, isEnabled: Bool) { - self.name = name - self.isEnabled = isEnabled + public static func launchArgument(name: String, isEnabled: Bool) -> Self { + self.init(name: name, isEnabled: isEnabled) } } diff --git a/Sources/ProjectDescription/Dependencies/PackageSettings.swift b/Sources/ProjectDescription/PackageSettings.swift similarity index 98% rename from Sources/ProjectDescription/Dependencies/PackageSettings.swift rename to Sources/ProjectDescription/PackageSettings.swift index aba504b2cbd..3715f22509d 100644 --- a/Sources/ProjectDescription/Dependencies/PackageSettings.swift +++ b/Sources/ProjectDescription/PackageSettings.swift @@ -4,7 +4,7 @@ import Foundation /// /// /// ```swift -/// // swift-tools-version: 5.8 +/// // swift-tools-version: 5.9 /// import PackageDescription /// /// #if TUIST diff --git a/Sources/ProjectDescription/Path.swift b/Sources/ProjectDescription/Path.swift index f9e76787774..5be71270848 100644 --- a/Sources/ProjectDescription/Path.swift +++ b/Sources/ProjectDescription/Path.swift @@ -16,7 +16,7 @@ public struct Path: ExpressibleByStringInterpolation, Codable, Hashable { public var callerPath: String? /// Default PathType is `.relativeToManifest` - public init(_ path: String) { + public static func path(_ path: String) -> Self { self.init(path, type: .relativeToManifest) } diff --git a/Sources/ProjectDescription/Project.swift b/Sources/ProjectDescription/Project.swift index e58fa4a35ec..e3cf58441cc 100644 --- a/Sources/ProjectDescription/Project.swift +++ b/Sources/ProjectDescription/Project.swift @@ -17,7 +17,7 @@ import Foundation /// targets: [ /// Target( /// name: "App", -/// platform: .iOS, +/// destinations: .iOS, /// product: .app, /// bundleId: "io.tuist.App", /// infoPlist: "Config/App-Info.plist", diff --git a/Sources/ProjectDescription/ResourceFileElement.swift b/Sources/ProjectDescription/ResourceFileElement.swift index 428120ebd63..d272e4a365e 100644 --- a/Sources/ProjectDescription/ResourceFileElement.swift +++ b/Sources/ProjectDescription/ResourceFileElement.swift @@ -31,6 +31,6 @@ public enum ResourceFileElement: Codable, Equatable { extension ResourceFileElement: ExpressibleByStringInterpolation { public init(stringLiteral value: String) { - self = .glob(pattern: Path(value)) + self = .glob(pattern: .path(value)) } } diff --git a/Sources/ProjectDescription/ResourceFileElements.swift b/Sources/ProjectDescription/ResourceFileElements.swift index 89ad885d4fd..d5bb90918b2 100644 --- a/Sources/ProjectDescription/ResourceFileElements.swift +++ b/Sources/ProjectDescription/ResourceFileElements.swift @@ -5,14 +5,14 @@ public struct ResourceFileElements: Codable, Equatable { /// List of resource file elements public var resources: [ResourceFileElement] - public init(resources: [ResourceFileElement]) { - self.resources = resources + public static func resources(_ resources: [ResourceFileElement]) -> Self { + self.init(resources: resources) } } extension ResourceFileElements: ExpressibleByStringInterpolation { public init(stringLiteral value: String) { - self.init(resources: [.glob(pattern: Path(value))]) + self.init(resources: [.glob(pattern: .path(value))]) } } diff --git a/Sources/ProjectDescription/Scheme.swift b/Sources/ProjectDescription/Scheme.swift index 7414779cb03..1700395af7c 100644 --- a/Sources/ProjectDescription/Scheme.swift +++ b/Sources/ProjectDescription/Scheme.swift @@ -35,7 +35,7 @@ public struct Scheme: Equatable, Codable { /// - archiveAction: Action that runs the project archive. /// - profileAction: Action that profiles the project. /// - analyzeAction: Action that analyze the project. - public init( + public static func scheme( name: String, shared: Bool = true, hidden: Bool = false, @@ -45,15 +45,17 @@ public struct Scheme: Equatable, Codable { archiveAction: ArchiveAction? = nil, profileAction: ProfileAction? = nil, analyzeAction: AnalyzeAction? = nil - ) { - self.name = name - self.shared = shared - self.hidden = hidden - self.buildAction = buildAction - self.testAction = testAction - self.runAction = runAction - self.archiveAction = archiveAction - self.profileAction = profileAction - self.analyzeAction = analyzeAction + ) -> Self { + self.init( + name: name, + shared: shared, + hidden: hidden, + buildAction: buildAction, + testAction: testAction, + runAction: runAction, + archiveAction: archiveAction, + profileAction: profileAction, + analyzeAction: analyzeAction + ) } } diff --git a/Sources/ProjectDescription/SettingsTransformers.swift b/Sources/ProjectDescription/SettingsTransformers.swift index 2def23ab9f9..e2de3515d49 100644 --- a/Sources/ProjectDescription/SettingsTransformers.swift +++ b/Sources/ProjectDescription/SettingsTransformers.swift @@ -172,10 +172,3 @@ extension SettingsDictionary { merging(["DEBUG_INFORMATION_FORMAT": SettingValue(format)]) } } - -extension SettingsDictionary { - @available(*, deprecated, renamed: "swiftObjcBridgingHeaderPath") - public func swiftObjcBridingHeaderPath(_ path: String) -> SettingsDictionary { - swiftObjcBridgingHeaderPath(path) - } -} diff --git a/Sources/ProjectDescription/SourceFilesList.swift b/Sources/ProjectDescription/SourceFilesList.swift index 2c9ab9f2300..8b3219c7728 100644 --- a/Sources/ProjectDescription/SourceFilesList.swift +++ b/Sources/ProjectDescription/SourceFilesList.swift @@ -61,7 +61,7 @@ public struct SourceFileGlob: Codable, Equatable { extension SourceFileGlob: ExpressibleByStringInterpolation { public init(stringLiteral value: String) { - self.init(glob: Path(value), excluding: [], compilerFlags: nil, codeGen: nil, compilationCondition: nil) + self.init(glob: .path(value), excluding: [], compilerFlags: nil, codeGen: nil, compilationCondition: nil) } } @@ -73,15 +73,15 @@ public struct SourceFilesList: Codable, Equatable { /// Creates the source files list with the glob patterns. /// /// - Parameter globs: Glob patterns. - public init(globs: [SourceFileGlob]) { - self.globs = globs + public static func sourceFilesList(globs: [SourceFileGlob]) -> Self { + self.init(globs: globs) } /// Creates the source files list with the glob patterns as strings. /// /// - Parameter globs: Glob patterns. - public init(globs: [String]) { - self.globs = globs.map(SourceFileGlob.init) + public static func sourceFilesList(globs: [String]) -> Self { + sourceFilesList(globs: globs.map(SourceFileGlob.init)) } /// Returns a sources list from a list of paths. @@ -94,7 +94,7 @@ public struct SourceFilesList: Codable, Equatable { /// Support file as single string extension SourceFilesList: ExpressibleByStringInterpolation { public init(stringLiteral value: String) { - self.init(globs: [value]) + self = .sourceFilesList(globs: [value]) } } diff --git a/Sources/ProjectDescription/Target.swift b/Sources/ProjectDescription/Target.swift index a476b508f08..41526004291 100644 --- a/Sources/ProjectDescription/Target.swift +++ b/Sources/ProjectDescription/Target.swift @@ -70,7 +70,7 @@ public struct Target: Codable, Equatable { /// Specifies whether if the target can be merged as part of another binary or not public var mergeable: Bool - public init( + public static func target( name: String, destinations: Destinations, product: Product, @@ -93,259 +93,30 @@ public struct Target: Codable, Equatable { buildRules: [BuildRule] = [], mergedBinaryType: MergedBinaryType = .disabled, mergeable: Bool = false - ) { - self.name = name - self.destinations = destinations - self.bundleId = bundleId - self.productName = productName - self.product = product - self.infoPlist = infoPlist - self.entitlements = entitlements - self.dependencies = dependencies - self.settings = settings - self.sources = sources - self.resources = resources - self.copyFiles = copyFiles - self.headers = headers - self.scripts = scripts - self.coreDataModels = coreDataModels - self.environmentVariables = environmentVariables - self.launchArguments = launchArguments - self.deploymentTargets = deploymentTargets - self.additionalFiles = additionalFiles - self.buildRules = buildRules - self.mergedBinaryType = mergedBinaryType - self.mergeable = mergeable - } - - @available( - *, - deprecated, - message: "Use `Destinations` and `DeploymentTargets` to configure deployment devices and minimum platform versions." - ) - public init( - name: String, - platform: Platform, - product: Product, - productName: String? = nil, - bundleId: String, - deploymentTarget: DeploymentTarget? = nil, - infoPlist: InfoPlist? = .default, - sources: SourceFilesList? = nil, - resources: ResourceFileElements? = nil, - copyFiles: [CopyFilesAction]? = nil, - headers: Headers? = nil, - entitlements: Entitlements? = nil, - scripts: [TargetScript] = [], - dependencies: [TargetDependency] = [], - settings: Settings? = nil, - coreDataModels: [CoreDataModel] = [], - environmentVariables: [String: EnvironmentVariable] = [:], - launchArguments: [LaunchArgument] = [], - additionalFiles: [FileElement] = [], - buildRules: [BuildRule] = [], - mergedBinaryType: MergedBinaryType = .disabled, - mergeable: Bool = false - ) { - self.name = name - destinations = Destinations.from(platform: platform, deploymentTarget: deploymentTarget) - self.bundleId = bundleId - self.productName = productName - self.product = product - self.infoPlist = infoPlist - self.entitlements = entitlements - self.dependencies = dependencies - self.settings = settings - self.sources = sources - self.resources = resources - self.copyFiles = copyFiles - self.headers = headers - self.scripts = scripts - self.coreDataModels = coreDataModels - self.environmentVariables = environmentVariables - self.launchArguments = launchArguments - deploymentTargets = DeploymentTargets.from(manifest: deploymentTarget) - self.additionalFiles = additionalFiles - self.buildRules = buildRules - self.mergedBinaryType = mergedBinaryType - self.mergeable = mergeable - } - - @available(*, deprecated, message: "please use environmentVariables instead") - public init( - name: String, - platform: Platform, - product: Product, - productName: String? = nil, - bundleId: String, - deploymentTarget: DeploymentTarget? = nil, - infoPlist: InfoPlist? = .default, - sources: SourceFilesList? = nil, - resources: ResourceFileElements? = nil, - copyFiles: [CopyFilesAction]? = nil, - headers: Headers? = nil, - entitlements: Entitlements? = nil, - scripts: [TargetScript] = [], - dependencies: [TargetDependency] = [], - settings: Settings? = nil, - coreDataModels: [CoreDataModel] = [], - environment: [String: String], - launchArguments: [LaunchArgument] = [], - additionalFiles: [FileElement] = [], - buildRules: [BuildRule] = [], - mergedBinaryType: MergedBinaryType = .disabled, - mergeable: Bool = false - ) { - self.name = name - destinations = Destinations.from(platform: platform, deploymentTarget: deploymentTarget) - self.bundleId = bundleId - self.productName = productName - self.product = product - self.infoPlist = infoPlist - self.entitlements = entitlements - self.dependencies = dependencies - self.settings = settings - self.sources = sources - self.resources = resources - self.copyFiles = copyFiles - self.headers = headers - self.scripts = scripts - self.coreDataModels = coreDataModels - environmentVariables = environment.mapValues { value in - EnvironmentVariable(value: value, isEnabled: true) - } - self.launchArguments = launchArguments - deploymentTargets = DeploymentTargets.from(manifest: deploymentTarget) - self.additionalFiles = additionalFiles - self.buildRules = buildRules - self.mergedBinaryType = mergedBinaryType - self.mergeable = mergeable - } -} - -extension Target { - @available(*, deprecated, renamed: "Destinations", message: "Targets are no longer constrained to a single platform") - var platform: Platform { - destinations.platforms.first ?? .iOS - } - - @available( - *, - deprecated, - renamed: "DeploymentTargets", - message: "Device support is now defined in `Destinations`. Minimum Deployment Version is defined in `DeploymentTargets`" - ) - var deploymentTarget: DeploymentTarget? { - switch platform { - case .iOS: - guard let version = deploymentTargets?.iOS else { return nil } - var devices = DeploymentDevice() - - if destinations.contains(.iPhone) { - devices.insert(.iphone) - } - - if destinations.contains(.iPad) { - devices.insert(.ipad) - } - - if destinations.contains(.macCatalyst) { - devices.insert(.mac) - } - - if destinations.contains(.appleVisionWithiPadDesign) { - devices.insert(.vision) - } - - return .iOS( - targetVersion: version, - devices: devices, - supportsMacDesignedForIOS: destinations.contains(.macWithiPadDesign) - ) - case .macOS: - guard let version = deploymentTargets?.macOS else { return nil } - return .macOS(targetVersion: version) - case .watchOS: - guard let version = deploymentTargets?.watchOS else { return nil } - return .watchOS(targetVersion: version) - case .tvOS: - guard let version = deploymentTargets?.tvOS else { return nil } - return .tvOS(targetVersion: version) - case .visionOS: - guard let version = deploymentTargets?.visionOS else { return nil } - return .visionOS(targetVersion: version) - } - } -} - -extension Destinations { - /// Maps a ProjectDescription.Package instance into a TuistGraph.Package model. - /// - Parameters: - /// - manifest: Manifest representation of Package. - /// - generatorPaths: Generator paths. - fileprivate static func from( - platform: Platform, - deploymentTarget: DeploymentTarget? - ) -> Destinations { - switch (platform, deploymentTarget) { - case (.macOS, _): - return [.mac] - case let (.iOS, .some(.iOS(_, devices, supportsMacDesignedForIOS: supportsMacDesignedForIOS))): - var destinations: [Destination] = [] - - if devices.contains(.iphone) { - destinations.append(.iPhone) - } - - if devices.contains(.ipad) { - destinations.append(.iPad) - } - - if devices.contains(.mac) { - destinations.append(.macCatalyst) - } - - if devices.contains(.vision) { - destinations.append(.appleVisionWithiPadDesign) - } - - if supportsMacDesignedForIOS { - destinations.append(.macWithiPadDesign) - } - - return Set(destinations) - case (.iOS, _): // an iOS platform, but `nil` deployment target. - return .iOS - case (.tvOS, _): - return .tvOS - case (.watchOS, _): - return .watchOS - case (.visionOS, _): - return .visionOS - } - } -} - -extension DeploymentTargets { - /// Maps a ProjectDescription.DeploymentTarget instance into a TuistGraph.DeploymentTarget instance. - /// - Parameters: - /// - manifest: Manifest representation of deployment target model. - static func from(manifest: DeploymentTarget?) -> DeploymentTargets { - if let manifest { - switch manifest { - case let .iOS(version, _, _): - return .iOS(version) - case let .macOS(version): - return .macOS(version) - case let .watchOS(version): - return .watchOS(version) - case let .tvOS(version): - return .tvOS(version) - case let .visionOS(version): - return .visionOS(version) - } - } else { - return DeploymentTargets() - } + ) -> Self { + self.init( + name: name, + destinations: destinations, + product: product, + productName: productName, + bundleId: bundleId, + deploymentTargets: deploymentTargets, + infoPlist: infoPlist, + sources: sources, + resources: resources, + copyFiles: copyFiles, + headers: headers, + entitlements: entitlements, + scripts: scripts, + dependencies: dependencies, + settings: settings, + coreDataModels: coreDataModels, + environmentVariables: environmentVariables, + launchArguments: launchArguments, + additionalFiles: additionalFiles, + buildRules: buildRules, + mergedBinaryType: mergedBinaryType, + mergeable: mergeable + ) } } diff --git a/Sources/ProjectDescription/TargetDependency.swift b/Sources/ProjectDescription/TargetDependency.swift index b2228b37685..26022e7848d 100644 --- a/Sources/ProjectDescription/TargetDependency.swift +++ b/Sources/ProjectDescription/TargetDependency.swift @@ -103,14 +103,6 @@ public enum TargetDependency: Codable, Hashable { /// - condition: condition under which to use this dependency, `nil` if this should always be used case package(product: String, type: PackageType = .runtime, condition: PlatformCondition? = nil) - /// Dependency on a swift package manager plugin product using Xcode native integration. - /// - /// - Parameters: - /// - product: The name of the output product. ${PRODUCT_NAME} inside Xcode. - /// e.g. RxSwift - /// - condition: condition under which to use this dependency, `nil` if this should always be used - case packagePlugin(product: String, condition: PlatformCondition? = nil) - /// Dependency on system library or framework /// /// - Parameters: @@ -132,7 +124,7 @@ public enum TargetDependency: Codable, Hashable { /// Dependency on XCTest. case xctest - /// Dependency on an external dependency imported through `Dependencies.swift`. + /// Dependency on an external dependency imported through `Package.swift`. /// /// - Parameters: /// - name: Name of the external dependency @@ -171,8 +163,6 @@ public enum TargetDependency: Codable, Hashable { return "library" case .package: return "package" - case .packagePlugin: - return "packagePlugin" case .sdk: return "sdk" case .xcframework: diff --git a/Sources/ProjectDescription/TargetReference.swift b/Sources/ProjectDescription/TargetReference.swift index 8f483c0b448..afc7384d9d4 100644 --- a/Sources/ProjectDescription/TargetReference.swift +++ b/Sources/ProjectDescription/TargetReference.swift @@ -9,7 +9,7 @@ public struct TargetReference: Hashable, Codable, ExpressibleByStringInterpolati /// Name of the target. public var targetName: String - public init(projectPath: Path?, target: String) { + init(projectPath: Path?, target: String) { self.projectPath = projectPath targetName = target } @@ -21,4 +21,8 @@ public struct TargetReference: Hashable, Codable, ExpressibleByStringInterpolati public static func project(path: Path, target: String) -> TargetReference { .init(projectPath: path, target: target) } + + public static func target(_ name: String) -> TargetReference { + .init(projectPath: nil, target: name) + } } diff --git a/Sources/ProjectDescription/Template/Template.swift b/Sources/ProjectDescription/Template/Template.swift index 3b5c0f0ad5d..63fb11aee9a 100644 --- a/Sources/ProjectDescription/Template/Template.swift +++ b/Sources/ProjectDescription/Template/Template.swift @@ -38,9 +38,8 @@ public struct Template: Codable, Equatable { public let path: String public let contents: Contents - public init(path: String, contents: Contents) { - self.path = path - self.contents = contents + public static func item(path: String, contents: Contents) -> Self { + self.init(path: path, contents: contents) } } diff --git a/Sources/ProjectDescription/TestableTarget.swift b/Sources/ProjectDescription/TestableTarget.swift index 7db0498aa71..9067aa6de8d 100644 --- a/Sources/ProjectDescription/TestableTarget.swift +++ b/Sources/ProjectDescription/TestableTarget.swift @@ -6,19 +6,38 @@ public struct TestableTarget: Equatable, Codable, ExpressibleByStringInterpolati public var isParallelizable: Bool public var isRandomExecutionOrdering: Bool - public init( + init( target: TargetReference, - skipped: Bool = false, - parallelizable: Bool = false, - randomExecutionOrdering: Bool = false + isSkipped: Bool, + isParallelizable: Bool, + isRandomExecutionOrdering: Bool ) { self.target = target - isSkipped = skipped - isParallelizable = parallelizable - isRandomExecutionOrdering = randomExecutionOrdering + self.isSkipped = isSkipped + self.isParallelizable = isParallelizable + self.isRandomExecutionOrdering = isRandomExecutionOrdering + } + + public static func testableTarget( + target: TargetReference, + isSkipped: Bool = false, + isParallelizable: Bool = false, + isRandomExecutionOrdering: Bool = false + ) -> Self { + self.init( + target: target, + isSkipped: isSkipped, + isParallelizable: isParallelizable, + isRandomExecutionOrdering: isRandomExecutionOrdering + ) } public init(stringLiteral value: String) { - self.init(target: .init(projectPath: nil, target: value)) + self.init( + target: TargetReference(projectPath: nil, target: value), + isSkipped: false, + isParallelizable: false, + isRandomExecutionOrdering: false + ) } } diff --git a/Sources/TuistCore/Cache/CacheCategory.swift b/Sources/TuistCore/Cache/CacheCategory.swift index 96017a4f602..5b220789674 100644 --- a/Sources/TuistCore/Cache/CacheCategory.swift +++ b/Sources/TuistCore/Cache/CacheCategory.swift @@ -3,11 +3,11 @@ public enum CacheCategory: String, CaseIterable, RawRepresentable { /// The plugins cache. case plugins - /// The build cache - case builds + /// The binary cache + case binaries - /// The tests cache - case tests + /// The selective tests cache + case selectiveTests /// The projects generated for automation tasks cache case generatedAutomationProjects @@ -22,10 +22,10 @@ public enum CacheCategory: String, CaseIterable, RawRepresentable { switch self { case .plugins: return "Plugins" - case .builds: - return "BuildCache" - case .tests: - return "incremental-tests" + case .binaries: + return "BinaryCache" + case .selectiveTests: + return "SelectiveTests" case .generatedAutomationProjects: return "Projects" case .projectDescriptionHelpers: diff --git a/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift b/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift index 4e4da345f38..9cac84f687c 100644 --- a/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift +++ b/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift @@ -9,7 +9,6 @@ public protocol CacheDirectoriesProviding { } public final class CacheDirectoriesProvider: CacheDirectoriesProviding { - public let cacheDirectory: AbsolutePath // swiftlint:disable:next force_try private static let defaultDirectory = try! AbsolutePath(validating: URL(fileURLWithPath: NSHomeDirectory()).path) .appending(component: ".tuist") @@ -18,15 +17,10 @@ public final class CacheDirectoriesProvider: CacheDirectoriesProviding { .map { try! AbsolutePath(validating: $0) } // swiftlint:disable:this force_try } - public init(config: Config?) { - if let cacheDirectory = config?.cache?.path { - self.cacheDirectory = cacheDirectory - } else { - cacheDirectory = CacheDirectoriesProvider.defaultDirectory.appending(component: "Cache") - } - } + public init() {} public func cacheDirectory(for category: CacheCategory) -> AbsolutePath { - (Self.forcedCacheDirectory ?? cacheDirectory).appending(component: category.directoryName) + let cacheDirectory = CacheDirectoriesProvider.defaultDirectory.appending(component: "Cache") + return (Self.forcedCacheDirectory ?? cacheDirectory).appending(component: category.directoryName) } } diff --git a/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift b/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift index 80116518e16..b169e591aca 100644 --- a/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift +++ b/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift @@ -3,13 +3,13 @@ import TuistGraph import TuistSupport public protocol CacheDirectoriesProviderFactoring { - func cacheDirectories(config: Config?) throws -> CacheDirectoriesProviding + func cacheDirectories() throws -> CacheDirectoriesProviding } public final class CacheDirectoriesProviderFactory: CacheDirectoriesProviderFactoring { public init() {} - public func cacheDirectories(config: Config?) throws -> CacheDirectoriesProviding { - let provider = CacheDirectoriesProvider(config: config) + public func cacheDirectories() throws -> CacheDirectoriesProviding { + let provider = CacheDirectoriesProvider() for category in CacheCategory.allCases { let directory = provider.cacheDirectory(for: category) if !FileHandler.shared.exists(directory) { diff --git a/Sources/TuistCore/Cache/CacheOutputType.swift b/Sources/TuistCore/Cache/CacheOutputType.swift deleted file mode 100644 index 2cd72c0c526..00000000000 --- a/Sources/TuistCore/Cache/CacheOutputType.swift +++ /dev/null @@ -1,33 +0,0 @@ -import Foundation - -/// An enum that represents the type of output that the caching feature can work with. -public enum CacheOutputType: CustomStringConvertible, Equatable { - /// Resource bundle built for the simulator - case bundle - - /// Frameworks built for the simulator. - case framework - - /// XCFrameworks built for the simulator and/or device. - case xcframework(CacheXCFrameworkDestination) - - public var description: String { - switch self { - case .bundle: - return "bundle" - case .framework: - return "framework" - case let .xcframework(destination): - switch destination { - case [.device, .simulator]: - return "xcframework" - case .device: - return "device-xcframework" - case .simulator: - return "simulator-xcframework" - default: - fatalError("xcframework should contain at least one destination") - } - } - } -} diff --git a/Sources/TuistCore/Cache/CacheXCFrameworkDestination.swift b/Sources/TuistCore/Cache/CacheXCFrameworkDestination.swift deleted file mode 100644 index 33ef789a3ca..00000000000 --- a/Sources/TuistCore/Cache/CacheXCFrameworkDestination.swift +++ /dev/null @@ -1,13 +0,0 @@ -import Foundation - -/// An enum that represents the type of xcframeworks output -public struct CacheXCFrameworkDestination: OptionSet { - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - public static let device = CacheXCFrameworkDestination(rawValue: 1 << 0) - public static let simulator = CacheXCFrameworkDestination(rawValue: 1 << 1) -} diff --git a/Sources/TuistCore/Graph/GraphDependencyReference.swift b/Sources/TuistCore/Graph/GraphDependencyReference.swift index 60eb1a71d37..091dc130589 100644 --- a/Sources/TuistCore/Graph/GraphDependencyReference.swift +++ b/Sources/TuistCore/Graph/GraphDependencyReference.swift @@ -5,7 +5,7 @@ import TuistGraph public enum GraphDependencyReference: Equatable, Comparable, Hashable { var condition: PlatformCondition? { switch self { - case let .framework(_, _, _, _, _, _, _, _, _, condition), + case let .framework(_, _, _, _, _, _, _, _, condition), let .library(_, _, _, _, condition), let .xcframework(_, _, _, _, _, condition), let .bundle(_, condition), @@ -36,7 +36,6 @@ public enum GraphDependencyReference: Equatable, Comparable, Hashable { case framework( path: AbsolutePath, binaryPath: AbsolutePath, - isCarthage: Bool, dsymPath: AbsolutePath?, bcsymbolmapPaths: [AbsolutePath], linking: BinaryLinking, @@ -51,11 +50,10 @@ public enum GraphDependencyReference: Equatable, Comparable, Hashable { init(_ dependency: GraphDependency, condition: PlatformCondition? = nil) { switch dependency { - case let .framework(path, binaryPath, dsymPath, bcsymbolmapPaths, linking, architectures, isCarthage, status): + case let .framework(path, binaryPath, dsymPath, bcsymbolmapPaths, linking, architectures, status): self = .framework( path: path, binaryPath: binaryPath, - isCarthage: isCarthage, dsymPath: dsymPath, bcsymbolmapPaths: bcsymbolmapPaths, linking: linking, @@ -94,7 +92,7 @@ public enum GraphDependencyReference: Equatable, Comparable, Hashable { /// this attribute returns the path to them. public var precompiledPath: AbsolutePath? { switch self { - case let .framework(path, _, _, _, _, _, _, _, _, _): + case let .framework(path, _, _, _, _, _, _, _, _): return path case let .library(path, _, _, _, _): return path @@ -138,7 +136,6 @@ public enum GraphDependencyReference: Equatable, Comparable, Hashable { case .framework( path: let path, binaryPath: _, - isCarthage: _, dsymPath: _, bcsymbolmapPaths: _, linking: _, diff --git a/Sources/TuistCore/Graph/GraphLoader.swift b/Sources/TuistCore/Graph/GraphLoader.swift index da0c2e97799..e29133ae9c2 100644 --- a/Sources/TuistCore/Graph/GraphLoader.swift +++ b/Sources/TuistCore/Graph/GraphLoader.swift @@ -214,7 +214,6 @@ public final class GraphLoader: GraphLoading { bcsymbolmapPaths: metadata.bcsymbolmapPaths, linking: metadata.linking, architectures: metadata.architectures, - isCarthage: metadata.isCarthage, status: metadata.status ) cache.add(framework: framework, at: path) diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index 91bb0717aab..3bd232a9aa8 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -73,7 +73,7 @@ public class GraphTraverser: GraphTraversing { acc.formUnion(next.value) } return Set(dependencies.compactMap { dependency -> AbsolutePath? in - guard case let GraphDependency.framework(path, _, _, _, _, _, _, _) = dependency else { return nil } + guard case let GraphDependency.framework(path, _, _, _, _, _, _) = dependency else { return nil } return path }) } @@ -527,7 +527,7 @@ public class GraphTraverser: GraphTraversing { .compactMap { (dependency: GraphDependency) -> AbsolutePath? in switch dependency { case let .xcframework(xcframework): return xcframework.path - case let .framework(path, _, _, _, _, _, _, _): return path + case let .framework(path, _, _, _, _, _, _): return path case .macro: return nil case .library: return nil case .bundle: return nil @@ -950,7 +950,7 @@ public class GraphTraverser: GraphTraversing { return false case let .xcframework(xcframework): return xcframework.linking == .static - case let .framework(_, _, _, _, linking, _, _, _), + case let .framework(_, _, _, _, linking, _, _), let .library(_, _, linking, _, _): return linking == .static case .bundle: return false @@ -989,6 +989,21 @@ public class GraphTraverser: GraphTraversing { } } + func isDependencyPrecompiledDynamicAndLinkable(dependency: GraphDependency) -> Bool { + switch dependency { + case let .xcframework(xcframework): + return xcframework.linking == .dynamic + case let .framework(_, _, _, _, linking, _, _), + let .library(path: _, publicHeaders: _, linking: linking, architectures: _, swiftModuleMap: _): + return linking == .dynamic + case .bundle: return false + case .packageProduct: return false + case .target: return false + case .sdk: return false + case .macro: return false + } + } + func canDependencyEmbedProducts(dependency: GraphDependency) -> Bool { guard case let GraphDependency.target(name, path) = dependency, let target = target(path: path, name: name) else { return false } @@ -1031,11 +1046,10 @@ public class GraphTraverser: GraphTraversing { switch toDependency { case let .macro(path): return .macro(path: path) - case let .framework(path, binaryPath, dsymPath, bcsymbolmapPaths, linking, architectures, isCarthage, status): + case let .framework(path, binaryPath, dsymPath, bcsymbolmapPaths, linking, architectures, status): return .framework( path: path, binaryPath: binaryPath, - isCarthage: isCarthage, dsymPath: dsymPath, bcsymbolmapPaths: bcsymbolmapPaths, linking: linking, @@ -1111,7 +1125,7 @@ public class GraphTraverser: GraphTraversing { let precompiledStatic = graph.dependencies[.target(name: name, path: path), default: []] .filter { dependency in switch dependency { - case let .framework(_, _, _, _, linking: linking, _, _, _): + case let .framework(_, _, _, _, linking: linking, _, _): return linking == .static case .xcframework, .library, .bundle, .packageProduct, .target, .sdk, .macro: return false diff --git a/Sources/TuistCore/MetadataProviders/FrameworkMetadataProvider.swift b/Sources/TuistCore/MetadataProviders/FrameworkMetadataProvider.swift index b71033c0a69..8408a113e13 100644 --- a/Sources/TuistCore/MetadataProviders/FrameworkMetadataProvider.swift +++ b/Sources/TuistCore/MetadataProviders/FrameworkMetadataProvider.swift @@ -64,7 +64,6 @@ public final class FrameworkMetadataProvider: PrecompiledMetadataProvider, Frame let bcsymbolmapPaths = try bcsymbolmapPaths(frameworkPath: path) let linking = try linking(binaryPath: binaryPath) let architectures = try architectures(binaryPath: binaryPath) - let isCarthage = path.pathString.contains("Carthage/Build") return FrameworkMetadata( path: path, binaryPath: binaryPath, @@ -72,7 +71,6 @@ public final class FrameworkMetadataProvider: PrecompiledMetadataProvider, Frame bcsymbolmapPaths: bcsymbolmapPaths, linking: linking, architectures: architectures, - isCarthage: isCarthage, status: status ) } diff --git a/Sources/TuistCore/NodeLoaders/FrameworkLoader.swift b/Sources/TuistCore/NodeLoaders/FrameworkLoader.swift index be5f9261958..9ec47970291 100644 --- a/Sources/TuistCore/NodeLoaders/FrameworkLoader.swift +++ b/Sources/TuistCore/NodeLoaders/FrameworkLoader.swift @@ -57,7 +57,6 @@ public final class FrameworkLoader: FrameworkLoading { bcsymbolmapPaths: metadata.bcsymbolmapPaths, linking: metadata.linking, architectures: metadata.architectures, - isCarthage: metadata.isCarthage, status: metadata.status ) } diff --git a/Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProviderFactory.swift b/Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProviderFactory.swift index b9efcedc246..de5d806bef8 100644 --- a/Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProviderFactory.swift +++ b/Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProviderFactory.swift @@ -5,16 +5,14 @@ import TuistSupport @testable import TuistCore public final class MockCacheDirectoriesProviderFactory: CacheDirectoriesProviderFactoring { - public var cacheDirectoriesStub: ((Config?) -> CacheDirectoriesProviding)? - public var cacheDirectoriesConfig: Config? + public var cacheDirectoriesStub: (() -> CacheDirectoriesProviding)? private let provider: CacheDirectoriesProviding public init(provider: CacheDirectoriesProviding) { self.provider = provider } - public func cacheDirectories(config: Config?) -> CacheDirectoriesProviding { - cacheDirectoriesConfig = config - return cacheDirectoriesStub?(config) ?? provider + public func cacheDirectories() -> CacheDirectoriesProviding { + cacheDirectoriesStub?() ?? provider } } diff --git a/Sources/TuistDependenciesTesting/DependenciesGraph/DependenciesGraph+TestData.swift b/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift similarity index 98% rename from Sources/TuistDependenciesTesting/DependenciesGraph/DependenciesGraph+TestData.swift rename to Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift index 12f57f38e36..f6a86dabe64 100644 --- a/Sources/TuistDependenciesTesting/DependenciesGraph/DependenciesGraph+TestData.swift +++ b/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift @@ -2,7 +2,6 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistDependencies import TuistSupport import TuistSupportTesting @@ -15,7 +14,7 @@ extension TuistCore.DependenciesGraph { "RxSwift" : [ { "kind" : "xcframework", - "path" : "/Tuist/Dependencies/Carthage/RxSwift.xcframework" + "path" : "/Tuist/Dependencies/SwiftPackageManager/RxSwift.xcframework" } ] }, @@ -34,7 +33,7 @@ extension TuistCore.DependenciesGraph { public static func testXCFramework( name: String = "Test", // swiftlint:disable:next force_try - path: Path = Path(AbsolutePath.root.appending(try! RelativePath(validating: "Test.xcframework")).pathString) + path: Path = .path(AbsolutePath.root.appending(try! RelativePath(validating: "Test.xcframework")).pathString) ) -> Self { let externalDependencies = [name: [TargetDependency.xcframework(path: path)]] @@ -63,7 +62,7 @@ extension TuistCore.DependenciesGraph { ] let targets: [Target] = [ - .init( + .target( name: "Tuist", destinations: destinations, product: .staticFramework, @@ -106,7 +105,7 @@ extension TuistCore.DependenciesGraph { "SWIFT_ACTIVE_COMPILATION_CONDITIONS": "SWIFT_DEFINE", ]) ), - .init( + .target( name: "TuistKit", destinations: destinations, product: .staticFramework, @@ -175,7 +174,7 @@ extension TuistCore.DependenciesGraph { ] let targets: [Target] = [ - .init( + .target( name: "ALibrary", destinations: destinations, product: .staticFramework, @@ -193,7 +192,7 @@ extension TuistCore.DependenciesGraph { ], settings: Self.spmSettings() ), - .init( + .target( name: "ALibraryUtils", destinations: destinations, product: .staticFramework, @@ -248,7 +247,7 @@ extension TuistCore.DependenciesGraph { ] let targets: [Target] = [ - .init( + .target( name: "AnotherLibrary", destinations: destinations, product: .staticFramework, @@ -303,7 +302,7 @@ extension TuistCore.DependenciesGraph { ] let targets: [Target] = [ - .init( + .target( name: "Alamofire", destinations: destinations, product: .staticFramework, @@ -369,7 +368,7 @@ extension TuistCore.DependenciesGraph { ] let targets: [Target] = [ - .init( + .target( name: "GoogleAppMeasurementTarget", destinations: destinations, product: .staticFramework, @@ -409,7 +408,7 @@ extension TuistCore.DependenciesGraph { ], settings: Self.spmSettings() ), - .init( + .target( name: "GoogleAppMeasurementWithoutAdIdSupportTarget", destinations: destinations, product: .staticFramework, @@ -517,7 +516,7 @@ extension TuistCore.DependenciesGraph { ] let targets: [Target] = [ - .init( + .target( name: "GULAppDelegateSwizzler", destinations: destinations, product: customProductTypes["GULAppDelegateSwizzler"] ?? .staticFramework, @@ -530,7 +529,7 @@ extension TuistCore.DependenciesGraph { ], settings: Self.spmSettings() ), - .init( + .target( name: "GULMethodSwizzler", destinations: destinations, product: customProductTypes["GULMethodSwizzler"] ?? .staticFramework, @@ -544,7 +543,7 @@ extension TuistCore.DependenciesGraph { settings: Self.spmSettings() ), - .init( + .target( name: "GULNSData", destinations: destinations, product: customProductTypes["GULNSData"] ?? .staticFramework, @@ -557,7 +556,7 @@ extension TuistCore.DependenciesGraph { ], settings: Self.spmSettings() ), - .init( + .target( name: "GULNetwork", destinations: destinations, product: customProductTypes["GULNetwork"] ?? .staticFramework, @@ -612,7 +611,7 @@ extension TuistCore.DependenciesGraph { ] let targets: [Target] = [ - .init( + .target( name: "nanopb", destinations: destinations, product: .staticFramework, @@ -734,7 +733,7 @@ extension DependenciesGraph { let platforms = destinations.platforms let applicableVersions = PLATFORM_TEST_VERSION.filter { platforms.contains($0.key) } - return DeploymentTargets( + return .deploymentTargets( iOS: applicableVersions[Platform.iOS], macOS: applicableVersions[Platform.macOS], watchOS: applicableVersions[Platform.watchOS], diff --git a/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift b/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift index 4a3d73d3005..b4a869a7690 100644 --- a/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift +++ b/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift @@ -9,7 +9,6 @@ extension GraphDependencyReference { public static func testFramework( path: AbsolutePath = "/frameworks/tuist.framework", binaryPath: AbsolutePath = "/frameworks/tuist.framework/tuist", - isCarthage: Bool = false, dsymPath: AbsolutePath? = nil, bcsymbolmapPaths: [AbsolutePath] = [], linking: BinaryLinking = .dynamic, @@ -21,7 +20,6 @@ extension GraphDependencyReference { GraphDependencyReference.framework( path: path, binaryPath: binaryPath, - isCarthage: isCarthage, dsymPath: dsymPath, bcsymbolmapPaths: bcsymbolmapPaths, linking: linking, diff --git a/Sources/TuistCoreTesting/Utils/MockRootDirectoryLocator.swift b/Sources/TuistCoreTesting/Utils/MockRootDirectoryLocator.swift index 36ab0d71c4c..db8141d2747 100644 --- a/Sources/TuistCoreTesting/Utils/MockRootDirectoryLocator.swift +++ b/Sources/TuistCoreTesting/Utils/MockRootDirectoryLocator.swift @@ -3,6 +3,8 @@ import TSCBasic @testable import TuistCore public final class MockRootDirectoryLocator: RootDirectoryLocating { + public init() {} + public var locateArgs: [AbsolutePath] = [] public var locateStub: AbsolutePath? diff --git a/Sources/TuistDependencies/Carthage/CarthageInteractor.swift b/Sources/TuistDependencies/Carthage/CarthageInteractor.swift deleted file mode 100644 index a102187ec22..00000000000 --- a/Sources/TuistDependencies/Carthage/CarthageInteractor.swift +++ /dev/null @@ -1,230 +0,0 @@ -import ProjectDescription -import TSCBasic -import TuistCore -import TuistGraph -import TuistSupport - -// MARK: - Carthage Interactor Errors - -enum CarthageInteractorError: FatalError, Equatable { - /// Thrown when Carthage cannot be found. - case carthageNotFound - /// Thrown when `Cartfile` cannot be found in the temporary directory after Carthage installation - case cartfileNotFound - /// Thrown when `Cartfile.resolved` cannot be found in temporary directory after Carthage installation. - case cartfileResolvedNotFound - /// Thrown when `Carthage/Build` directory cannot be found in temporary directory after Carthage installation. - case buildDirectoryNotFound - - /// Error type. - var type: ErrorType { - switch self { - case .cartfileNotFound, - .cartfileResolvedNotFound, - .buildDirectoryNotFound: - return .bug - case .carthageNotFound: - return .abort - } - } - - /// Error description. - var description: String { - switch self { - case .carthageNotFound: - return """ - Carthage was not found in the environment. - It's possible that the tool is not installed or hasn't been exposed to your environment." - """ - case .cartfileNotFound: - return "The Cartfile file was not found after resolving the dependencies using the Carthage." - case .cartfileResolvedNotFound: - return "The Cartfile.resolved lockfile was not found after resolving the dependencies using the Carthage." - case .buildDirectoryNotFound: - return "The Carthage/Build directory was not found after resolving the dependencies using the Carthage." - } - } -} - -// MARK: - Carthage Interacting - -public protocol CarthageInteracting { - /// Installs `Carthage` dependencies - /// - Parameters: - /// - dependenciesDirectory: The path to the directory that contains the `Tuist/Dependencies/` directory. - /// - dependencies: List of dependencies to install using `Carthage`. - /// - platforms: List of platforms for which you want to install dependencies. - /// - shouldUpdate: Indicates whether dependencies should be updated or fetched based on the lockfile. - /// - Returns: A graph that represents dependencies installed using `Carthage`. - func install( - dependenciesDirectory: AbsolutePath, - dependencies: TuistGraph.CarthageDependencies, - platforms: Set, - shouldUpdate: Bool - ) throws -> TuistCore.DependenciesGraph - - /// Removes all cached `Carthage` dependencies. - /// - Parameter dependenciesDirectory: The path to the directory that contains the `Tuist/Dependencies/` directory. - func clean(dependenciesDirectory: AbsolutePath) throws -} - -// MARK: - Carthage Interactor - -public final class CarthageInteractor: CarthageInteracting { - private let carthageController: CarthageControlling - private let carthageGraphGenerator: CarthageGraphGenerating - - public init( - carthageController: CarthageControlling = CarthageController.shared, - carthageGraphGenerator: CarthageGraphGenerating = CarthageGraphGenerator() - ) { - self.carthageController = carthageController - self.carthageGraphGenerator = carthageGraphGenerator - } - - public func install( - dependenciesDirectory: AbsolutePath, - dependencies: TuistGraph.CarthageDependencies, - platforms: Set, - shouldUpdate: Bool - ) throws -> TuistCore.DependenciesGraph { - logger.info("Installing Carthage dependencies.", metadata: .subsection) - - guard carthageController.canUseSystemCarthage() else { - throw CarthageInteractorError.carthageNotFound - } - - let pathsProvider = CarthagePathsProvider(dependenciesDirectory: dependenciesDirectory) - - try loadDependencies(pathsProvider: pathsProvider, dependencies: dependencies) - - if shouldUpdate { - try carthageController.update( - at: pathsProvider.dependenciesDirectory, - platforms: platforms, - printOutput: true - ) - } else { - try carthageController.bootstrap( - at: pathsProvider.dependenciesDirectory, - platforms: platforms, - printOutput: true - ) - } - - try saveDependencies(pathsProvider: pathsProvider) - - let dependenciesGraph = try carthageGraphGenerator - .generate(at: pathsProvider.destinationCarthageBuildDirectory) - - logger.info("Carthage dependencies installed successfully.", metadata: .subsection) - - return dependenciesGraph - } - - public func clean(dependenciesDirectory: AbsolutePath) throws { - let carthageDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.carthageDirectoryName) - let cartfileResolvedPath = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.lockfilesDirectoryName) - .appending(component: Constants.DependenciesDirectory.cartfileResolvedName) - - try FileHandler.shared.delete(carthageDirectory) - try FileHandler.shared.delete(cartfileResolvedPath) - } - - // MARK: - Installation - - /// Loads lockfile and dependencies into working directory if they had been saved before. - private func loadDependencies(pathsProvider: CarthagePathsProvider, dependencies: TuistGraph.CarthageDependencies) throws { - // copy `Cartfile.resolved` directory from previous run if exist - if FileHandler.shared.exists(pathsProvider.destinationCartfileResolvedPath) { - try copy( - from: pathsProvider.destinationCartfileResolvedPath, - to: pathsProvider.temporaryCartfileResolvedPath - ) - } - - // create `Cartfile` - let cartfileContent = dependencies.cartfileValue() - let cartfilePath = pathsProvider.temporaryCartfilePath - try FileHandler.shared.createFolder(cartfilePath.removingLastComponent()) - try FileHandler.shared.write(cartfileContent, path: cartfilePath, atomically: true) - - logger.debug("Cartfile:", metadata: .subsection) - logger.debug("\(cartfileContent)") - } - - /// Saves lockfile resolved dependencies in `Tuist/Dependencies` directory. - private func saveDependencies(pathsProvider: CarthagePathsProvider) throws { - guard FileHandler.shared.exists(pathsProvider.temporaryCartfilePath) else { - throw CarthageInteractorError.cartfileNotFound - } - - guard FileHandler.shared.exists(pathsProvider.temporaryCartfileResolvedPath) else { - throw CarthageInteractorError.cartfileResolvedNotFound - } - guard FileHandler.shared.exists(pathsProvider.destinationCarthageBuildDirectory) else { - throw CarthageInteractorError.buildDirectoryNotFound - } - - try copy( - from: pathsProvider.temporaryCartfilePath, - to: pathsProvider.destinationCartfilePath - ) - - try copy( - from: pathsProvider.temporaryCartfileResolvedPath, - to: pathsProvider.destinationCartfileResolvedPath - ) - - // remove temporary files - try? FileHandler.shared.delete(pathsProvider.temporaryCartfilePath) - try? FileHandler.shared.delete(pathsProvider.temporaryCartfileResolvedPath) - } - - // MARK: - Helpers - - private func copy(from fromPath: AbsolutePath, to toPath: AbsolutePath) throws { - if FileHandler.shared.exists(toPath) { - try FileHandler.shared.replace(toPath, with: fromPath) - } else { - try FileHandler.shared.createFolder(toPath.removingLastComponent()) - try FileHandler.shared.copy(from: fromPath, to: toPath) - } - } -} - -// MARK: - Models - -private struct CarthagePathsProvider { - let dependenciesDirectory: AbsolutePath - - let destinationCartfilePath: AbsolutePath - let destinationCartfileResolvedPath: AbsolutePath - let destinationCarthageDirectory: AbsolutePath - let destinationCarthageBuildDirectory: AbsolutePath - - let temporaryCartfilePath: AbsolutePath - let temporaryCartfileResolvedPath: AbsolutePath - - init(dependenciesDirectory: AbsolutePath) { - self.dependenciesDirectory = dependenciesDirectory - - destinationCartfilePath = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.carthageDirectoryName) - .appending(component: Constants.DependenciesDirectory.cartfileName) - destinationCartfileResolvedPath = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.lockfilesDirectoryName) - .appending(component: Constants.DependenciesDirectory.cartfileResolvedName) - destinationCarthageDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.carthageDirectoryName) - destinationCarthageBuildDirectory = destinationCarthageDirectory - .appending(component: "Build") - - temporaryCartfilePath = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.cartfileName) - temporaryCartfileResolvedPath = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.cartfileResolvedName) - } -} diff --git a/Sources/TuistDependencies/Carthage/Models/CarthageVersionFile.swift b/Sources/TuistDependencies/Carthage/Models/CarthageVersionFile.swift deleted file mode 100644 index f05796fa8ae..00000000000 --- a/Sources/TuistDependencies/Carthage/Models/CarthageVersionFile.swift +++ /dev/null @@ -1,36 +0,0 @@ -import Foundation -import TuistGraph - -/// A model that represents the `Carthage` version file. -/// Reference: https://github.com/Carthage/Carthage/blob/master/Documentation/VersionFile.md#version-files -struct CarthageVersionFile: Decodable, Equatable { - enum CodingKeys: String, CodingKey { - case iOS - case macOS = "Mac" - case watchOS - case tvOS - case visionOS - } - - let iOS: [Product]? - let macOS: [Product]? - let watchOS: [Product]? - let tvOS: [Product]? - let visionOS: [Product]? - - /// Returns all products. - var allProducts: [Product] { - [iOS, macOS, watchOS, tvOS, visionOS] - .compactMap { $0 } - .flatMap { $0 } - } -} - -// MARK: - Models - -extension CarthageVersionFile { - struct Product: Decodable, Equatable { - let name: String - let container: String? - } -} diff --git a/Sources/TuistDependencies/Carthage/Utils/CarthageController.swift b/Sources/TuistDependencies/Carthage/Utils/CarthageController.swift deleted file mode 100644 index a3bbcd4e556..00000000000 --- a/Sources/TuistDependencies/Carthage/Utils/CarthageController.swift +++ /dev/null @@ -1,179 +0,0 @@ -import TSCBasic -import TSCUtility -import TuistCore -import TuistGraph -import TuistSupport - -// MARK: - Carthage Controller Error - -enum CarthageControllerError: FatalError, Equatable { - /// Thrown when Carthage cannot be found in the environment. - case carthageNotFound - /// Thrown when version of Carthage cannot be determined. - case unrecognizedCarthageVersion - /// Thrown when version of Carthage installed in environment does not support XCFrameworks production. - case xcframeworksProductionNotSupported(installedVersion: Version) - - /// Error type. - var type: ErrorType { - switch self { - case .carthageNotFound, - .unrecognizedCarthageVersion, - .xcframeworksProductionNotSupported: - return .abort - } - } - - /// Error description. - var description: String { - switch self { - case .carthageNotFound: - return """ - Carthage was not found in the environment. - It's possible that the tool is not installed or hasn't been exposed to your environment. - """ - case .unrecognizedCarthageVersion: - return """ - The version of Carthage cannot be determined. - It's possible that the tool is not installed or hasn't been exposed to your environment. - """ - case let .xcframeworksProductionNotSupported(installedVersion): - return """ - The version of Carthage installed in your environment (\( - installedVersion - .description - )) doesn't suppport production of XCFrameworks. - You have to update the tool to at least 0.37.0 version. - """ - } - } -} - -// MARK: - Carthage Controlling - -/// Protocol that defines an interface to interact with the Carthage. -public protocol CarthageControlling { - /// Returns true if Carthage is available in the environment. - func canUseSystemCarthage() -> Bool - - /// Return version of Carthage that is available in the environment. - func carthageVersion() throws -> Version - - /// Checkouts and builds the project's dependencies - /// - Parameters: - /// - path: Directory where project's dependencies will be installed. - /// - platforms: The platforms to build for. - /// - printOutput: When true it prints the Carthage's output. - func bootstrap(at path: AbsolutePath, platforms: Set, printOutput: Bool) throws - - /// Updates and rebuilds the project's dependencies - /// - Parameters: - /// - path: Directory where project's dependencies will be installed. - /// - platforms: The platforms to build for. - /// - printOutput: When true it prints the Carthage's output. - func update(at path: AbsolutePath, platforms: Set, printOutput: Bool) throws -} - -// MARK: - Carthage Controller - -public final class CarthageController: CarthageControlling { - /// Shared instance. - public static var shared: CarthageControlling = CarthageController() - - /// Cached response of `carthage version` command. - @Atomic - private var cachedCarthageVersion: Version? - - public func canUseSystemCarthage() -> Bool { - do { - _ = try System.shared.which("carthage") - return true - } catch { - return false - } - } - - public func carthageVersion() throws -> Version { - // Return cached value if available - if let cached = cachedCarthageVersion { - return cached - } - - guard let output = try? System.shared.capture(["/usr/bin/env", "carthage", "version"]).spm_chomp() else { - throw CarthageControllerError.carthageNotFound - } - - guard let version = Version(output) else { - throw CarthageControllerError.unrecognizedCarthageVersion - } - - cachedCarthageVersion = version - return version - } - - public func bootstrap(at path: AbsolutePath, platforms: Set, printOutput: Bool) throws { - guard try isXCFrameworksProductionSupported() else { - throw CarthageControllerError.xcframeworksProductionNotSupported(installedVersion: try carthageVersion()) - } - - let command = buildCarthageCommand(path: path, platforms: platforms, subcommand: "bootstrap") - - printOutput ? - try System.shared.runAndPrint(command) : - try System.shared.run(command) - } - - public func update(at path: AbsolutePath, platforms: Set, printOutput: Bool) throws { - guard try isXCFrameworksProductionSupported() else { - throw CarthageControllerError.xcframeworksProductionNotSupported(installedVersion: try carthageVersion()) - } - - let command = buildCarthageCommand(path: path, platforms: platforms, subcommand: "update") - - printOutput ? - try System.shared.runAndPrint(command) : - try System.shared.run(command) - } - - // MARK: - Helpers - - private func buildCarthageCommand( - path: AbsolutePath, - platforms: Set, - subcommand: String - ) -> [String] { - var commandComponents: [String] = [ - "carthage", - subcommand, - "--project-directory", - path.pathString, - ] - - if !platforms.isEmpty { - commandComponents += [ - "--platform", - platforms - .filter { $0 != .macCatalyst } // Carthage does not support catalyst - .map(\.caseValue) - .sorted() - .joined(separator: ","), - ] - } - - commandComponents += [ - "--use-xcframeworks", - "--no-use-binaries", - "--use-netrc", - "--cache-builds", - "--new-resolver", - ] - - return commandComponents - } - - private func isXCFrameworksProductionSupported() throws -> Bool { - // Carthage has supported XCFrameworks production since 0.37.0 - // More info here: https://github.com/Carthage/Carthage/releases/tag/0.37.0 - try carthageVersion() >= Version(0, 37, 0) - } -} diff --git a/Sources/TuistDependencies/Carthage/Utils/CarthageGraphGenerator.swift b/Sources/TuistDependencies/Carthage/Utils/CarthageGraphGenerator.swift deleted file mode 100644 index 1779182e090..00000000000 --- a/Sources/TuistDependencies/Carthage/Utils/CarthageGraphGenerator.swift +++ /dev/null @@ -1,61 +0,0 @@ -import Foundation -import ProjectDescription -import TSCBasic -import TSCUtility -import TuistCore -import TuistSupport - -/// A protocol that defines an interface to generate the `DependenciesGraph` for the `Carthage` dependencies. -public protocol CarthageGraphGenerating { - /// Generates the `DependenciesGraph` for the `Carthage` dependencies. - /// - Parameter path: The path to the directory that contains the `Carthage/Build` directory where `Carthage` installed - /// dependencies. - func generate(at path: AbsolutePath) throws -> DependenciesGraph -} - -public final class CarthageGraphGenerator: CarthageGraphGenerating { - public init() {} - - public func generate(at path: AbsolutePath) throws -> DependenciesGraph { - let versionFilePaths = try FileHandler.shared - .contentsOfDirectory(path) - .filter { $0.extension == "version" } - - let jsonDecoder = JSONDecoder() - let products = try versionFilePaths - .map { try FileHandler.shared.readFile($0) } - .map { try jsonDecoder.decode(CarthageVersionFile.self, from: $0) } - - return DependenciesGraph( - externalDependencies: groupDependencies(products: products.flatMap(\.allProducts)), - externalProjects: [:] - ) - } -} - -// MARK: - Helpers - -extension CarthageGraphGenerator { - private func groupDependencies(products: [CarthageVersionFile.Product]) -> [String: [TargetDependency]] { - Dictionary(grouping: products, by: \.name) - .compactMapValues { products in - guard let product = products.first else { return nil } - - guard let xcFrameworkName = product.container else { - logger.warning("\(product.name) was not added to the DependenciesGraph", metadata: .subsection) - return nil - } - - var pathString = "" - pathString += Constants.tuistDirectoryName - pathString += "/" - pathString += Constants.DependenciesDirectory.name - pathString += "/" - pathString += Constants.DependenciesDirectory.carthageDirectoryName - pathString += "/Build/" - pathString += xcFrameworkName - - return [.xcframework(path: Path(pathString))] - } - } -} diff --git a/Sources/TuistDependencies/DependenciesController.swift b/Sources/TuistDependencies/DependenciesController.swift deleted file mode 100644 index db4b81777a2..00000000000 --- a/Sources/TuistDependencies/DependenciesController.swift +++ /dev/null @@ -1,277 +0,0 @@ -import ProjectDescription -import TSCBasic -import TSCUtility -import TuistCore -import TuistGraph -import TuistSupport - -// MARK: - Dependencies Controller Error - -enum DependenciesControllerError: FatalError, Equatable { - /// Thrown when the same dependency is defined more than once. - case duplicatedDependency(String, [ProjectDescription.TargetDependency], [ProjectDescription.TargetDependency]) - - /// Thrown when the same project is defined more than once. - case duplicatedProject(Path, ProjectDescription.Project, ProjectDescription.Project) - - /// Thrown when platforms for dependencies to install are not determined in `Dependencies.swift`. - case noPlatforms - - /// Error type. - var type: ErrorType { - switch self { - case .duplicatedDependency, .duplicatedProject, .noPlatforms: - return .abort - } - } - - // Error description. - var description: String { - switch self { - case let .duplicatedDependency(name, first, second): - return """ - The \(name) dependency is defined twice across different dependency managers: - First: \(first) - Second: \(second) - """ - case let .duplicatedProject(name, first, second): - return """ - The \(name) project is defined twice across different dependency managers: - First: \(first) - Second: \(second) - """ - case .noPlatforms: - return "Platforms were not determined. Select platforms in `Dependencies.swift` manifest file." - } - } -} - -// MARK: - Dependencies Controlling - -/// `DependenciesControlling` controls: -/// 1. Fetching/updating dependencies defined in `./Tuist/Dependencies.swift` by running appropriate dependencies managers -/// (for example, `Carthage` or `SPM`). -/// 2. Compiling fetched/updated dependencies into `.framework.`/`.xcframework.`. -/// 3. Saving compiled frameworks under `./Tuist/Dependencies/*`. -/// 4. Generating dependencies graph under `./Tuist/Dependencies/graph.json`. -public protocol DependenciesControlling { - /// Fetches dependencies. - /// - Parameter path: Directory where project's dependencies will be fetched. - /// - Parameter dependencies: List of dependencies to fetch. - /// - Parameter swiftVersion: The specified version of Swift. If `nil` is passed then the environment’s version will be used. - func fetch( - at path: AbsolutePath, - dependencies: TuistGraph.Dependencies, - swiftVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph - - /// Fetches dependencies. - /// - Parameter path: Directory where project's dependencies will be fetched. - /// - Parameter packageSettings: Custom Swift Package Manager settings - /// - Parameter swiftVersion: The specified version of Swift. If `nil` is passed then the environment’s version will be used. - func fetch( - at path: AbsolutePath, - packageSettings: TuistGraph.PackageSettings, - swiftVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph - - /// Updates dependencies. - /// - Parameters: - /// - path: Directory where project's dependencies will be updated. - /// - dependencies: List of dependencies to update. - /// - swiftVersion: The specified version of Swift. If `nil` is passed then will use the environment’s version will be used. - func update( - at path: AbsolutePath, - dependencies: TuistGraph.Dependencies, - swiftVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph - - /// Updates dependencies. - /// - Parameters: - /// - path: Directory where project's dependencies will be updated. - /// - packageSettings: Custom Swift Package Manager settings - /// - swiftVersion: The specified version of Swift. If `nil` is passed then will use the environment’s version will be used. - func update( - at path: AbsolutePath, - packageSettings: TuistGraph.PackageSettings, - swiftVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph - - /// Save dependencies graph. - /// - Parameters: - /// - dependenciesGraph: The dependencies graph to be saved. - /// - path: Directory where dependencies graph will be saved. - func save( - dependenciesGraph: TuistGraph.DependenciesGraph, - to path: AbsolutePath - ) throws -} - -// MARK: - Dependencies Controller - -public final class DependenciesController: DependenciesControlling { - private let carthageInteractor: CarthageInteracting - private let swiftPackageManagerInteractor: SwiftPackageManagerInteracting - private let dependenciesGraphController: DependenciesGraphControlling - - public init( - carthageInteractor: CarthageInteracting = CarthageInteractor(), - swiftPackageManagerInteractor: SwiftPackageManagerInteracting = SwiftPackageManagerInteractor(), - dependenciesGraphController: DependenciesGraphControlling = DependenciesGraphController() - ) { - self.carthageInteractor = carthageInteractor - self.swiftPackageManagerInteractor = swiftPackageManagerInteractor - self.dependenciesGraphController = dependenciesGraphController - } - - public func fetch( - at path: AbsolutePath, - dependencies: TuistGraph.Dependencies, - swiftVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph { - try install( - at: path, - dependencies: dependencies, - shouldUpdate: false, - swiftVersion: swiftVersion - ) - } - - public func fetch( - at path: AbsolutePath, - packageSettings: TuistGraph.PackageSettings, - swiftVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph { - try install( - at: path, - dependencies: TuistGraph.Dependencies( - carthage: nil, - swiftPackageManager: TuistGraph.SwiftPackageManagerDependencies( - .manifest, - productTypes: packageSettings.productTypes, - baseSettings: packageSettings.baseSettings, - targetSettings: packageSettings.targetSettings, - projectOptions: packageSettings.projectOptions - - ), - platforms: packageSettings.platforms - ), - shouldUpdate: false, - swiftVersion: swiftVersion - ) - } - - public func update( - at path: AbsolutePath, - packageSettings: TuistGraph.PackageSettings, - swiftVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph { - try install( - at: path, - dependencies: TuistGraph.Dependencies( - carthage: nil, - swiftPackageManager: TuistGraph.SwiftPackageManagerDependencies( - .manifest, - productTypes: packageSettings.productTypes, - baseSettings: packageSettings.baseSettings, - targetSettings: packageSettings.targetSettings, - projectOptions: packageSettings.projectOptions - - ), - platforms: packageSettings.platforms - ), - shouldUpdate: true, - swiftVersion: swiftVersion - ) - } - - public func update( - at path: AbsolutePath, - dependencies: TuistGraph.Dependencies, - swiftVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph { - try install( - at: path, - dependencies: dependencies, - shouldUpdate: true, - swiftVersion: swiftVersion - ) - } - - public func save( - dependenciesGraph: TuistGraph.DependenciesGraph, - to path: AbsolutePath - ) throws { - try dependenciesGraphController.save(dependenciesGraph, to: path) - } - - // MARK: - Helpers - - private func install( - at path: AbsolutePath, - dependencies: TuistGraph.Dependencies, - shouldUpdate: Bool, - swiftVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph { - let dependenciesDirectory = path - .appending(component: Constants.tuistDirectoryName) - .appending(component: Constants.DependenciesDirectory.name) - let platforms = dependencies.platforms - - guard !platforms.isEmpty else { - throw DependenciesControllerError.noPlatforms - } - - var dependenciesGraph = TuistCore.DependenciesGraph.none - - if let carthageDependencies = dependencies.carthage, !carthageDependencies.dependencies.isEmpty { - let carthageDependenciesGraph = try carthageInteractor.install( - dependenciesDirectory: dependenciesDirectory, - dependencies: carthageDependencies, - platforms: platforms, - shouldUpdate: shouldUpdate - ) - dependenciesGraph = try dependenciesGraph.merging(with: carthageDependenciesGraph) - } else { - try carthageInteractor.clean(dependenciesDirectory: dependenciesDirectory) - } - - if let swiftPackageManagerDependencies = dependencies.swiftPackageManager { - let swiftPackageManagerDependenciesGraph = try swiftPackageManagerInteractor.install( - dependenciesDirectory: dependenciesDirectory, - dependencies: swiftPackageManagerDependencies, - platforms: platforms, - shouldUpdate: shouldUpdate, - swiftToolsVersion: swiftVersion - ) - dependenciesGraph = try dependenciesGraph.merging(with: swiftPackageManagerDependenciesGraph) - } else { - try swiftPackageManagerInteractor.clean(dependenciesDirectory: dependenciesDirectory) - } - - return dependenciesGraph - } -} - -extension TuistCore.DependenciesGraph { - public func merging(with other: Self) throws -> Self { - var mergedExternalDependencies: [String: [ProjectDescription.TargetDependency]] = - externalDependencies - - for (name, dependency) in other.externalDependencies { - if let alreadyPresent = mergedExternalDependencies[name] { - throw DependenciesControllerError.duplicatedDependency(name, alreadyPresent, dependency) - } - mergedExternalDependencies[name] = dependency - } - - let mergedExternalProjects = try other.externalProjects.reduce(into: externalProjects) { result, entry in - if let alreadyPresent = result[entry.key] { - throw DependenciesControllerError.duplicatedProject(entry.key, alreadyPresent, entry.value) - } - result[entry.key] = entry.value - } - - return .init(externalDependencies: mergedExternalDependencies, externalProjects: mergedExternalProjects) - } -} diff --git a/Sources/TuistDependencies/DependenciesGraph/DependenciesGraphController.swift b/Sources/TuistDependencies/DependenciesGraph/DependenciesGraphController.swift deleted file mode 100644 index 499e06ac2bd..00000000000 --- a/Sources/TuistDependencies/DependenciesGraph/DependenciesGraphController.swift +++ /dev/null @@ -1,145 +0,0 @@ -import Foundation -import TSCBasic -import TuistCore -import TuistGraph -import TuistSupport - -// MARK: - Dependencies Graph Controller Errors - -enum DependenciesGraphControllerError: FatalError, Equatable { - case failedToDecodeDependenciesGraph - case failedToEncodeDependenciesGraph - /// Thrown when there is a `Dependencies.swift` but no `graph.json` - case dependenciesWerentFetched - - var type: ErrorType { - switch self { - case .dependenciesWerentFetched, .failedToDecodeDependenciesGraph: - return .abort - case .failedToEncodeDependenciesGraph: - return .bug - } - } - - var description: String { - switch self { - case .dependenciesWerentFetched: - return "`Tuist/Dependencies.swift` file is defined but `Tuist/Dependencies/graph.json` cannot be found. Run `tuist fetch` first" - case .failedToDecodeDependenciesGraph: - return "Couldn't decode the DependenciesGraph from the serialized JSON file. Running `tuist fetch` should solve the problem." - case .failedToEncodeDependenciesGraph: - return "Couldn't encode the DependenciesGraph as a JSON file." - } - } -} - -// MARK: - Dependencies Graph Controlling - -/// A protocol that defines an interface to save and load the `DependenciesGraph` using a `graph.json` file. -public protocol DependenciesGraphControlling { - /// Saves the `DependenciesGraph` as `graph.json`. - /// - Parameters: - /// - dependenciesGraph: A model that will be saved. - /// - path: Directory where project's dependencies graph will be saved. - func save(_ dependenciesGraph: TuistGraph.DependenciesGraph, to path: AbsolutePath) throws - - /// Loads the `DependenciesGraph` from `graph.json` file. - /// - Parameter path: Directory where project's dependencies graph will be loaded. - func load(at path: AbsolutePath) throws -> TuistGraph.DependenciesGraph - - /// Removes cached `graph.json`. - /// - Parameter path: Directory where project's dependencies graph was saved. - func clean(at path: AbsolutePath) throws -} - -// MARK: - Dependencies Graph Controller - -public final class DependenciesGraphController: DependenciesGraphControlling { - private let rootDirectoryLocator: RootDirectoryLocating - - /// Default constructor. - public init(rootDirectoryLocator: RootDirectoryLocating = RootDirectoryLocator()) { - self.rootDirectoryLocator = rootDirectoryLocator - } - - public func save(_ dependenciesGraph: TuistGraph.DependenciesGraph, to path: AbsolutePath) throws { - let jsonEncoder = JSONEncoder() - jsonEncoder.outputFormatting = .prettyPrinted - - let encodedGraph = try jsonEncoder.encode(dependenciesGraph) - - guard let encodedGraphContent = String(data: encodedGraph, encoding: .utf8) else { - throw DependenciesGraphControllerError.failedToEncodeDependenciesGraph - } - - let graphPath = graphPath(at: path) - - try FileHandler.shared.touch(graphPath) - try FileHandler.shared.write(encodedGraphContent, path: graphPath, atomically: true) - } - - public func load(at path: AbsolutePath) throws -> TuistGraph.DependenciesGraph { - // Search for the dependency graph at the root directory - // This can be the directory of this project or in case of nested projects - // the root of the overall project - guard let rootDirectory = rootDirectoryLocator.locate(from: path) else { - return .none - } - - let dependenciesPath = dependenciesPath(at: rootDirectory) - - guard FileHandler.shared.exists(dependenciesPath) - || FileHandler.shared.exists( - rootDirectory.appending(components: [ - Constants.tuistDirectoryName, - Constants.DependenciesDirectory.packageSwiftName, - ]) - ) - else { - return .none - } - - let rootGraphPath = graphPath(at: rootDirectory) - - guard FileHandler.shared.exists(rootGraphPath) else { - throw DependenciesGraphControllerError.dependenciesWerentFetched - } - - let graphData = try FileHandler.shared.readFile(rootGraphPath) - - do { - return try JSONDecoder().decode(TuistGraph.DependenciesGraph.self, from: graphData) - } catch { - logger - .debug( - "Failed to load dependencies graph, running `tuist fetch` should solve the problem.\nError: \(error)" - ) - throw DependenciesGraphControllerError.failedToDecodeDependenciesGraph - } - } - - public func clean(at path: AbsolutePath) throws { - let graphPath = graphPath(at: path) - - try FileHandler.shared.delete(graphPath) - } - - // MARK: - Helpers - - private func dependenciesPath(at path: AbsolutePath) -> AbsolutePath { - path - .appending(components: [ - Constants.tuistDirectoryName, - Constants.DependenciesDirectory.dependenciesFileName, - ]) - } - - private func graphPath(at path: AbsolutePath) -> AbsolutePath { - path - .appending(components: [ - Constants.tuistDirectoryName, - Constants.DependenciesDirectory.name, - Constants.DependenciesDirectory.graphName, - ]) - } -} diff --git a/Sources/TuistDependencies/SwiftPackageManager/SwiftPackageManagerInteractor.swift b/Sources/TuistDependencies/SwiftPackageManager/SwiftPackageManagerInteractor.swift deleted file mode 100644 index 204d2741f6c..00000000000 --- a/Sources/TuistDependencies/SwiftPackageManager/SwiftPackageManagerInteractor.swift +++ /dev/null @@ -1,251 +0,0 @@ -import ProjectDescription -import TSCBasic -import TSCUtility -import TuistCore -import TuistGraph -import TuistSupport - -// MARK: - Swift Package Manager Interactor Errors - -enum SwiftPackageManagerInteractorError: FatalError, Equatable { - /// Thrown when `Package.swift` cannot be found in temporary directory after `Swift Package Manager` installation. - case packageSwiftNotFound - /// Thrown when `Package.resolved` cannot be found in temporary directory after `Swift Package Manager` installation. - case packageResolvedNotFound - /// Thrown when `.build` directory cannot be found in temporary directory after `Swift Package Manager` installation. - case buildDirectoryNotFound - - /// Error type. - var type: ErrorType { - switch self { - case .packageSwiftNotFound, - .packageResolvedNotFound, - .buildDirectoryNotFound: - return .bug - } - } - - /// Error description. - var description: String { - switch self { - case .packageSwiftNotFound: - return "The Package.swift file was not found after resolving the dependencies using the Swift Package Manager." - case .packageResolvedNotFound: - return "The Package.resolved lockfile was not found after resolving the dependencies using the Swift Package Manager." - case .buildDirectoryNotFound: - return "The .build directory was not found after resolving the dependencies using the Swift Package Manager" - } - } -} - -// MARK: - Swift Package Manager Interacting - -public protocol SwiftPackageManagerInteracting { - /// Installs `Swift Package Manager` dependencies. - /// - Parameters: - /// - dependenciesDirectory: The path to the directory that contains the `Tuist/Dependencies/` directory. - /// - dependencies: List of dependencies to install using `Swift Package Manager`. - /// - platforms: Set of supported platforms. - /// - shouldUpdate: Indicates whether dependencies should be updated or fetched based on the lockfile. - /// - swiftToolsVersion: The version of Swift tools that will be used to resolve dependencies. If `nil` is passed then the - /// environment’s version will be used. - func install( - dependenciesDirectory: AbsolutePath, - dependencies: TuistGraph.SwiftPackageManagerDependencies, - platforms: Set, - shouldUpdate: Bool, - swiftToolsVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph - - /// Removes all cached `Swift Package Manager` dependencies. - /// - Parameter dependenciesDirectory: The path to the directory that contains the `Tuist/Dependencies/` directory. - func clean(dependenciesDirectory: AbsolutePath) throws -} - -// MARK: - Swift Package Manager Interactor - -public final class SwiftPackageManagerInteractor: SwiftPackageManagerInteracting { - private let fileHandler: FileHandling - private let swiftPackageManagerController: SwiftPackageManagerControlling - private let swiftPackageManagerGraphGenerator: SwiftPackageManagerGraphGenerating - - public init( - fileHandler: FileHandling = FileHandler.shared, - swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController(), - swiftPackageManagerGraphGenerator: SwiftPackageManagerGraphGenerating = SwiftPackageManagerGraphGenerator( - swiftPackageManagerController: SwiftPackageManagerController() - ) - ) { - self.fileHandler = fileHandler - self.swiftPackageManagerController = swiftPackageManagerController - self.swiftPackageManagerGraphGenerator = swiftPackageManagerGraphGenerator - } - - public func install( - dependenciesDirectory: AbsolutePath, - dependencies: TuistGraph.SwiftPackageManagerDependencies, - platforms: Set, - shouldUpdate: Bool, - swiftToolsVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph { - logger.info("Installing Swift Package Manager dependencies.", metadata: .subsection) - - let pathsProvider = SwiftPackageManagerPathsProvider( - dependenciesDirectory: dependenciesDirectory, - packagesOrManifest: dependencies.packagesOrManifest - ) - - try loadDependencies(pathsProvider: pathsProvider, dependencies: dependencies, swiftToolsVersion: swiftToolsVersion) - - if shouldUpdate { - try swiftPackageManagerController.update(at: pathsProvider.destinationSwiftPackageManagerDirectory, printOutput: true) - } else { - try swiftPackageManagerController.resolve( - at: pathsProvider.destinationSwiftPackageManagerDirectory, - printOutput: true - ) - } - - try saveDependencies(pathsProvider: pathsProvider) - - let dependenciesGraph = try swiftPackageManagerGraphGenerator.generate( - at: pathsProvider.destinationBuildDirectory, - productTypes: dependencies.productTypes, - platforms: platforms, - baseSettings: dependencies.baseSettings, - targetSettings: dependencies.targetSettings, - swiftToolsVersion: swiftToolsVersion, - projectOptions: dependencies.projectOptions - ) - - logger.info("Swift Package Manager dependencies installed successfully.", metadata: .subsection) - - return dependenciesGraph - } - - public func clean(dependenciesDirectory: AbsolutePath) throws { - for packagesOrManifest in [TuistGraph.PackagesOrManifest.packages([]), .manifest] { - let pathsProvider = SwiftPackageManagerPathsProvider( - dependenciesDirectory: dependenciesDirectory, - packagesOrManifest: packagesOrManifest - ) - try fileHandler.delete(pathsProvider.destinationSwiftPackageManagerDirectory) - try fileHandler.delete(pathsProvider.destinationPackageResolvedPath) - } - } - - // MARK: - Installation - - /// Loads lockfile and dependencies into working directory if they had been saved before. - private func loadDependencies( - pathsProvider: SwiftPackageManagerPathsProvider, - dependencies: TuistGraph.SwiftPackageManagerDependencies, - swiftToolsVersion: TSCUtility.Version? - ) throws { - let version = try swiftToolsVersion ?? - TSCUtility.Version(versionString: try System.shared.swiftVersion(), usesLenientParsing: true) - let isLegacy = version < TSCUtility.Version(5, 6, 0) - - // copy `Package.resolved` directory from lockfiles folder - if fileHandler.exists(pathsProvider.destinationPackageResolvedPath) { - try copy( - from: pathsProvider.destinationPackageResolvedPath, - to: pathsProvider.temporaryPackageResolvedPath - ) - } - - // create `Package.swift` - let packageManifestPath = pathsProvider.destinationPackageSwiftPath - try fileHandler.createFolder(packageManifestPath.removingLastComponent()) - let manifest = dependencies.manifest( - isLegacy: isLegacy, - packageManifestFolder: packageManifestPath.removingLastComponent() - ) - switch manifest { - case let .content(content): - try fileHandler.write(content, path: packageManifestPath, atomically: true) - case .manifest: - if fileHandler.exists(packageManifestPath) { - try fileHandler.replace(packageManifestPath, with: pathsProvider.sourcePackageSwiftPath) - } else { - try fileHandler.copy(from: pathsProvider.sourcePackageSwiftPath, to: packageManifestPath) - } - } - - // set `swift-tools-version` in `Package.swift` - try swiftPackageManagerController.setToolsVersion( - at: pathsProvider.destinationSwiftPackageManagerDirectory, - to: version - ) - - let generatedManifestContent = try fileHandler.readTextFile(packageManifestPath) - logger.debug("Package.swift:", metadata: .subsection) - logger.debug("\(generatedManifestContent)") - } - - /// Saves lockfile resolved dependencies in `Tuist/Dependencies` directory. - private func saveDependencies(pathsProvider: SwiftPackageManagerPathsProvider) throws { - guard fileHandler.exists(pathsProvider.destinationPackageSwiftPath) else { - throw SwiftPackageManagerInteractorError.packageSwiftNotFound - } - guard fileHandler.exists(pathsProvider.destinationBuildDirectory) else { - throw SwiftPackageManagerInteractorError.buildDirectoryNotFound - } - - if fileHandler.exists(pathsProvider.temporaryPackageResolvedPath) { - try copy( - from: pathsProvider.temporaryPackageResolvedPath, - to: pathsProvider.destinationPackageResolvedPath - ) - } - - // remove temporary files - try? FileHandler.shared.delete(pathsProvider.temporaryPackageResolvedPath) - } - - // MARK: - Helpers - - private func copy(from fromPath: AbsolutePath, to toPath: AbsolutePath) throws { - if fileHandler.exists(toPath) { - try fileHandler.replace(toPath, with: fromPath) - } else { - try fileHandler.createFolder(toPath.removingLastComponent()) - try fileHandler.copy(from: fromPath, to: toPath) - } - } -} - -// MARK: - Models - -private struct SwiftPackageManagerPathsProvider { - let destinationSwiftPackageManagerDirectory: AbsolutePath - let destinationPackageSwiftPath: AbsolutePath - let destinationPackageResolvedPath: AbsolutePath - let destinationBuildDirectory: AbsolutePath - let sourcePackageSwiftPath: AbsolutePath - - let temporaryPackageResolvedPath: AbsolutePath - - init(dependenciesDirectory: AbsolutePath, packagesOrManifest: TuistGraph.PackagesOrManifest) { - let tuistDirectory = dependenciesDirectory.removingLastComponent() - destinationPackageSwiftPath = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.swiftPackageManagerDirectoryName) - .appending(component: Constants.DependenciesDirectory.packageSwiftName) - switch packagesOrManifest { - case .packages: - destinationPackageResolvedPath = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.lockfilesDirectoryName) - .appending(component: Constants.DependenciesDirectory.packageResolvedName) - case .manifest: - destinationPackageResolvedPath = tuistDirectory - .appending(component: Constants.DependenciesDirectory.packageResolvedName) - } - destinationSwiftPackageManagerDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.swiftPackageManagerDirectoryName) - destinationBuildDirectory = destinationSwiftPackageManagerDirectory.appending(component: ".build") - sourcePackageSwiftPath = tuistDirectory.appending(component: Constants.DependenciesDirectory.packageSwiftName) - - temporaryPackageResolvedPath = destinationSwiftPackageManagerDirectory - .appending(component: Constants.DependenciesDirectory.packageResolvedName) - } -} diff --git a/Sources/TuistDependenciesTesting/Carthage/MockCarthageInteractor.swift b/Sources/TuistDependenciesTesting/Carthage/MockCarthageInteractor.swift deleted file mode 100644 index 1e5e93d2db0..00000000000 --- a/Sources/TuistDependenciesTesting/Carthage/MockCarthageInteractor.swift +++ /dev/null @@ -1,35 +0,0 @@ -import ProjectDescription -import TSCBasic -import TuistCore -import TuistGraph -import TuistGraphTesting - -@testable import TuistDependencies - -public final class MockCarthageInteractor: CarthageInteracting { - public init() {} - - var invokedInstall = false - var installStub: ( - (AbsolutePath, TuistGraph.CarthageDependencies, Set, Bool) throws -> TuistCore - .DependenciesGraph - )? - - public func install( - dependenciesDirectory: AbsolutePath, - dependencies: TuistGraph.CarthageDependencies, - platforms: Set, - shouldUpdate: Bool - ) throws -> TuistCore.DependenciesGraph { - invokedInstall = true - return try installStub?(dependenciesDirectory, dependencies, platforms, shouldUpdate) ?? .test() - } - - var invokedClean = false - var cleanStub: ((AbsolutePath) throws -> Void)? - - public func clean(dependenciesDirectory: AbsolutePath) throws { - invokedClean = true - try cleanStub?(dependenciesDirectory) - } -} diff --git a/Sources/TuistDependenciesTesting/Carthage/Models/CarthageVersionFile+TestData.swift b/Sources/TuistDependenciesTesting/Carthage/Models/CarthageVersionFile+TestData.swift deleted file mode 100644 index d92c938c6b2..00000000000 --- a/Sources/TuistDependenciesTesting/Carthage/Models/CarthageVersionFile+TestData.swift +++ /dev/null @@ -1,655 +0,0 @@ -import Foundation -import TSCBasic - -@testable import TuistDependencies - -extension CarthageVersionFile { - static func test( - iOS: [Product] = [], - macOS: [Product] = [], - watchOS: [Product] = [], - tvOS: [Product] = [], - visionOS: [Product] = [] - ) -> Self { - .init( - iOS: iOS, - macOS: macOS, - watchOS: watchOS, - tvOS: tvOS, - visionOS: visionOS - ) - } - - static var testAlamofire: Self { - .init( - iOS: [ - .init( - name: "Alamofire", - container: "Alamofire.xcframework" - ), - .init( - name: "Alamofire", - container: "Alamofire.xcframework" - ), - ], - macOS: [ - .init( - name: "Alamofire", - container: "Alamofire.xcframework" - ), - ], - watchOS: [ - .init( - name: "Alamofire", - container: "Alamofire.xcframework" - ), - .init( - name: "Alamofire", - container: "Alamofire.xcframework" - ), - ], - tvOS: [ - .init( - name: "Alamofire", - container: "Alamofire.xcframework" - ), - .init( - name: "Alamofire", - container: "Alamofire.xcframework" - ), - ], - visionOS: nil - ) - } - - static var testRxSwift: Self { - .init( - iOS: [ - .init( - name: "RxBlocking", - container: "RxBlocking.xcframework" - ), - .init( - name: "RxBlocking", - container: "RxBlocking.xcframework" - ), - .init( - name: "RxCocoa", - container: "RxCocoa.xcframework" - ), - .init( - name: "RxCocoa", - container: "RxCocoa.xcframework" - ), - .init( - name: "RxRelay", - container: "RxRelay.xcframework" - ), - .init( - name: "RxRelay", - container: "RxRelay.xcframework" - ), - .init( - name: "RxSwift", - container: "RxSwift.xcframework" - ), - .init( - name: "RxSwift", - container: "RxSwift.xcframework" - ), - .init( - name: "RxTest", - container: "RxTest.xcframework" - ), - .init( - name: "RxTest", - container: "RxTest.xcframework" - ), - ], - macOS: [ - .init( - name: "RxBlocking", - container: "RxBlocking.xcframework" - ), - .init( - name: "RxCocoa", - container: "RxCocoa.xcframework" - ), - .init( - name: "RxRelay", - container: "RxRelay.xcframework" - ), - .init( - name: "RxSwift", - container: "RxSwift.xcframework" - ), - .init( - name: "RxTest", - container: "RxTest.xcframework" - ), - ], - watchOS: [ - .init( - name: "RxBlocking", - container: "RxBlocking.xcframework" - ), - .init( - name: "RxBlocking", - container: "RxBlocking.xcframework" - ), - .init( - name: "RxCocoa", - container: "RxCocoa.xcframework" - ), - .init( - name: "RxCocoa", - container: "RxCocoa.xcframework" - ), - .init( - name: "RxRelay", - container: "RxRelay.xcframework" - ), - .init( - name: "RxRelay", - container: "RxRelay.xcframework" - ), - .init( - name: "RxSwift", - container: "RxSwift.xcframework" - ), - .init( - name: "RxSwift", - container: "RxSwift.xcframework" - ), - ], - tvOS: [ - .init( - name: "RxBlocking", - container: "RxBlocking.xcframework" - ), - .init( - name: "RxBlocking", - container: "RxBlocking.xcframework" - ), - .init( - name: "RxCocoa", - container: "RxCocoa.xcframework" - ), - .init( - name: "RxCocoa", - container: "RxCocoa.xcframework" - ), - .init( - name: "RxRelay", - container: "RxRelay.xcframework" - ), - .init( - name: "RxRelay", - container: "RxRelay.xcframework" - ), - .init( - name: "RxSwift", - container: "RxSwift.xcframework" - ), - .init( - name: "RxSwift", - container: "RxSwift.xcframework" - ), - .init( - name: "RxTest", - container: "RxTest.xcframework" - ), - ], - visionOS: nil - ) - } - - static var testRealmCocoa: Self { - .init( - iOS: [ - .init( - name: "Realm", - container: "Realm.xcframework" - ), - .init( - name: "Realm", - container: "Realm.xcframework" - ), - .init( - name: "RealmSwift", - container: "RealmSwift.xcframework" - ), - .init( - name: "RealmSwift", - container: "RealmSwift.xcframework" - ), - ], - macOS: nil, - watchOS: nil, - tvOS: nil, - visionOS: nil - ) - } - - static var testAhoyRTC: Self { - .init( - iOS: [ - .init( - name: "AhoyKit", - container: nil - ), - .init( - name: "WebRTC", - container: nil - ), - ], - macOS: [], - watchOS: [], - tvOS: [], - visionOS: [] - ) - } -} - -extension CarthageVersionFile { - /// A snapshot of `.Alamofire.version` file - /// that was generated by `Carthage` in` `0.37.0` version - /// using `carthage bootstrap --platform iOS,macOS,tvOS,watchOS --use-xcframeworks --no-use-binaries --use-netrc - /// --cache-builds --new-resolver` command - static var testAlamofireJson: String { - """ - { - "Mac" : [ - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "57f5c800334d5f7a1c46285e1e00fd9e26abaf836dbcec92578b69403dd69596", - "name" : "Alamofire", - "container" : "Alamofire.xcframework", - "identifier" : "macos-arm64_x86_64" - } - ], - "watchOS" : [ - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "ce13aaa785ffa2c3c16ba88b8ab54e97bac5ba0a41a5ac22d9552a84100b07dc", - "name" : "Alamofire", - "container" : "Alamofire.xcframework", - "identifier" : "watchos-arm64_i386_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "54293baccc33dc9f91018a4ec9253f3b17faa0c62fe3eef973835a76bc1357c9", - "name" : "Alamofire", - "container" : "Alamofire.xcframework", - "identifier" : "watchos-arm64_32_armv7k" - } - ], - "tvOS" : [ - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "bf2734287d14a558d4b739727ebe5f9f9a1f6ed2aeb0c5781b633b8bcac37d70", - "name" : "Alamofire", - "container" : "Alamofire.xcframework", - "identifier" : "tvos-arm64" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "0494fd475a6c62575d810bf50c8c3d09a5b3e5cc192d6f88005e45ff718bf503", - "name" : "Alamofire", - "container" : "Alamofire.xcframework", - "identifier" : "tvos-arm64_x86_64-simulator" - } - ], - "commitish" : "5.4.3", - "iOS" : [ - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "5fbbffeccfee11c3d48840b59111c9483f985e01a53109e920cf60a79df743cb", - "name" : "Alamofire", - "container" : "Alamofire.xcframework", - "identifier" : "ios-arm64_i386_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "615afccd6819b4d613bf80375d08a39b15beea9e00698b8f3a83d35fb4e7be1c", - "name" : "Alamofire", - "container" : "Alamofire.xcframework", - "identifier" : "ios-arm64_armv7" - } - ] - } - """ - } - - /// A snapshot of `.RxSwift.version` file - /// that was generated by `Carthage` in` `0.37.0` version - /// using `carthage bootstrap --platform iOS,macOS,tvOS,watchOS --use-xcframeworks --no-use-binaries --use-netrc - /// --cache-builds --new-resolver` command - static var testRxSwiftJson: String { - """ - { - "Mac" : [ - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "86b1f3a3476db7b35180336876c2731a49b546899d647ab99d52909a6635c883", - "name" : "RxBlocking", - "container" : "RxBlocking.xcframework", - "identifier" : "macos-arm64_x86_64" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "f7b73b8a44fd2992b330e6c9d044be3873aa9195cb98990dd041abc86622b359", - "name" : "RxCocoa", - "container" : "RxCocoa.xcframework", - "identifier" : "macos-arm64_x86_64" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "55ce7c5d0f4fe9df7a609d23174dd4ae62a66333f30051d880285f58967ef415", - "name" : "RxRelay", - "container" : "RxRelay.xcframework", - "identifier" : "macos-arm64_x86_64" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "a9ff6e3d6213ea912c3136173af678bd4bb1840057ce88c0b451b30962ccb0bd", - "name" : "RxSwift", - "container" : "RxSwift.xcframework", - "identifier" : "macos-arm64_x86_64" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "3a81b7ea565c01a2663cb3d970bc8411c13f43c092bdb515432d49fc12ea3c72", - "name" : "RxTest", - "container" : "RxTest.xcframework", - "identifier" : "macos-arm64_x86_64" - } - ], - "watchOS" : [ - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "fa387e94a430ae1a2185b00d2e71d7c837adf11646ba036fa0800b08ed3db154", - "name" : "RxBlocking", - "container" : "RxBlocking.xcframework", - "identifier" : "watchos-arm64_i386_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "c6c6e1483df5fa04a8192c1bd4a3eb9f8d2db46d4b77659aa05e0102548c072d", - "name" : "RxBlocking", - "container" : "RxBlocking.xcframework", - "identifier" : "watchos-arm64_32_armv7k" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "e614a6a4c2cfb6547753381d3638302e8955ad21893cb5d2f6e07b46946dbe36", - "name" : "RxCocoa", - "container" : "RxCocoa.xcframework", - "identifier" : "watchos-arm64_i386_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "69ffb2f2502a30e7b4bcd5258fd39b97fdc9c81a2e9e49d8770703dd4c07e0ee", - "name" : "RxCocoa", - "container" : "RxCocoa.xcframework", - "identifier" : "watchos-arm64_32_armv7k" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "79091465303a53417f13caa34c6f5c16713d1888f2c7620a2790574d772bc6c2", - "name" : "RxRelay", - "container" : "RxRelay.xcframework", - "identifier" : "watchos-arm64_32_armv7k" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "d9c5f13754933b994beaded1c5ff0edde45efb86ca13aebc08bae7e567727c18", - "name" : "RxRelay", - "container" : "RxRelay.xcframework", - "identifier" : "watchos-arm64_i386_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "2cb6d5c3c02b778610b0ce1d8af2ff5f69fca80cf2c6382da4f14fb936735689", - "name" : "RxSwift", - "container" : "RxSwift.xcframework", - "identifier" : "watchos-arm64_i386_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "f65a096e38c6940c1b1fdbc5c24f11e8d8af9cafb219723b1e4e2041da6c81c0", - "name" : "RxSwift", - "container" : "RxSwift.xcframework", - "identifier" : "watchos-arm64_32_armv7k" - } - ], - "tvOS" : [ - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "acc2a71bb7bc9c27a0ec95385f048a0040d88bab44deddcb9a1a3b61320c4e6f", - "name" : "RxBlocking", - "container" : "RxBlocking.xcframework", - "identifier" : "tvos-arm64" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "12c36aea3712976f34d25e0337ba8f6393b76ecfc3e1351a2ab3023c99018b33", - "name" : "RxBlocking", - "container" : "RxBlocking.xcframework", - "identifier" : "tvos-arm64_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "4420a6279e55e2c5c3f4b6aa7567eda56aa81a162315b028d6ac7b5689266ef3", - "name" : "RxCocoa", - "container" : "RxCocoa.xcframework", - "identifier" : "tvos-arm64_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "a4f7428701da909fb88bdcda602f1a9d1526de20914702dc1519565aa41135eb", - "name" : "RxCocoa", - "container" : "RxCocoa.xcframework", - "identifier" : "tvos-arm64" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "c312b7732b52838109e93404db33a8693a5f86384c6de054d7878bd98f64f780", - "name" : "RxRelay", - "container" : "RxRelay.xcframework", - "identifier" : "tvos-arm64" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "b73a59d4a73bfdffb3c382588ee48fc74a3d0c5f4fe87242a0588a597ac289d0", - "name" : "RxRelay", - "container" : "RxRelay.xcframework", - "identifier" : "tvos-arm64_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "e4d95e41cdc6a5e624f1dfc649935a93e6f9eb6a979ace621a8afbd4e9ea6389", - "name" : "RxSwift", - "container" : "RxSwift.xcframework", - "identifier" : "tvos-arm64_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "9665ba98bde33d0fb8e77d0f70a2950421104b555942375d15515d6c63585eac", - "name" : "RxSwift", - "container" : "RxSwift.xcframework", - "identifier" : "tvos-arm64" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "6e281b30953f1c8db38d9f1652926e3466188a633cd16bf74339715d931759ec", - "name" : "RxTest", - "container" : "RxTest.xcframework", - "identifier" : "tvos-arm64_x86_64-simulator" - } - ], - "commitish" : "6.2.0", - "iOS" : [ - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "5cb314834422a56915d9404d12e072600665eeba5815b89ca547032eaa7b372e", - "name" : "RxBlocking", - "container" : "RxBlocking.xcframework", - "identifier" : "ios-arm64_i386_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "4ed2e9c1871c5338a481fa0b73cf7a71e92ded5f7477292e116742c543431101", - "name" : "RxBlocking", - "container" : "RxBlocking.xcframework", - "identifier" : "ios-arm64_armv7" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "5c1719d1c61658eddba8809440b809fb23ab64e24f196db24797627683fd5485", - "name" : "RxCocoa", - "container" : "RxCocoa.xcframework", - "identifier" : "ios-arm64_i386_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "c3492a3348d7a20396c185dbee479fa19f601b77f0f627608ff67cc029e06e3c", - "name" : "RxCocoa", - "container" : "RxCocoa.xcframework", - "identifier" : "ios-arm64_armv7" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "3725a226c968c7331363377e4e4e2d8b218ae27391ea815263c840e5a66da76a", - "name" : "RxRelay", - "container" : "RxRelay.xcframework", - "identifier" : "ios-arm64_i386_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "4dbc43707ed1bde34abec38f4cf1e903604a20dcd4937130e27922ad6f98caac", - "name" : "RxRelay", - "container" : "RxRelay.xcframework", - "identifier" : "ios-arm64_armv7" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "d2e8ba83ea1e99dc8a22fcc94650e6d8f915293fd811ef1d9a34a3ccb84d4d93", - "name" : "RxSwift", - "container" : "RxSwift.xcframework", - "identifier" : "ios-arm64_i386_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "0c2f64086afd5835576d820cd9671b42659a7612afb42d44149757b93d39119c", - "name" : "RxSwift", - "container" : "RxSwift.xcframework", - "identifier" : "ios-arm64_armv7" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "8a2f2e875b174a68c1330791d12e65119f912ad660fd08c14c831a9e6ecd7cfb", - "name" : "RxTest", - "container" : "RxTest.xcframework", - "identifier" : "ios-arm64_armv7" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "6b863d8e43e0831195b03fc0bcb8f84d7d652b0565966f9a890839c45365bf61", - "name" : "RxTest", - "container" : "RxTest.xcframework", - "identifier" : "ios-arm64_i386_x86_64-simulator" - } - ] - } - """ - } - - /// A snapshot of `.realm-cocoa.version` file - /// that was generated by `Carthage` in` `0.37.0` version - /// using `carthage bootstrap --platform iOS --use-xcframeworks --no-use-binaries --use-netrc --cache-builds --new-resolver` - /// command - static var testRealmCocoaJson: String { - """ - { - "commitish" : "v10.7.6", - "iOS" : [ - { - "hash" : "acf910bcb59a82ea4d5c5ecd8358ed4c8438ec4052374e36421bf2c7863a7c51", - "name" : "Realm", - "container" : "Realm.xcframework", - "identifier" : "ios-i386_x86_64-simulator" - }, - { - "hash" : "eca5d0e7fd94e459b73c2d80d35dbbb198cdc460bb656d5912a34e04c4dad45d", - "name" : "Realm", - "container" : "Realm.xcframework", - "identifier" : "ios-arm64_armv7" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "31c09fb27b44ed77915be0cab1e9364570d806f0cf2b7f962c94488c51f20d29", - "name" : "RealmSwift", - "container" : "RealmSwift.xcframework", - "identifier" : "ios-i386_x86_64-simulator" - }, - { - "swiftToolchainVersion" : "5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)", - "hash" : "8b749ef640129c1c56aac21d71c1358ddfc2e27d465e500cce048c1d19131425", - "name" : "RealmSwift", - "container" : "RealmSwift.xcframework", - "identifier" : "ios-arm64_armv7" - } - ] - } - """ - } - - /// A snapshot of `.CarthageAhoyRTC-bitcode.version` file - /// that was generated by `Carthage` in` `0.37.0` version - /// using `carthage bootstrap --platform iOS --use-xcframeworks --no-use-binaries --use-netrc --cache-builds --new-resolver` - /// command - static var testAhoyRTCJson: String { - """ - { - "Mac" : [ - - ], - "watchOS" : [ - - ], - "tvOS" : [ - - ], - "commitish" : "2.1", - "iOS" : [ - { - "name" : "AhoyKit", - "hash" : "c963ec94999f3fe64f75880ba394338d5c694a5cec8f756bc35481f3b8c8b4d2", - "linking" : "dynamic" - }, - { - "name" : "WebRTC", - "hash" : "3a9ced64f6f8ccca46dc0038bdbf3efd8cf98f73cbc29ee1b00d98757b7fab33", - "linking" : "dynamic" - } - ], - "visionOS": [ - - ] - } - """ - } -} - -extension CarthageVersionFile.Product { - static func test( - name: String = "", - container: String? = "" - ) -> Self { - .init( - name: name, - container: container - ) - } -} diff --git a/Sources/TuistDependenciesTesting/Carthage/Utils/MockCarthageController.swift b/Sources/TuistDependenciesTesting/Carthage/Utils/MockCarthageController.swift deleted file mode 100644 index 9c8c03831d5..00000000000 --- a/Sources/TuistDependenciesTesting/Carthage/Utils/MockCarthageController.swift +++ /dev/null @@ -1,57 +0,0 @@ -import TSCBasic -import TSCUtility -import TuistGraph - -@testable import TuistDependencies - -public final class MockCarthageController: CarthageControlling { - public init() {} - - var invokedCanUseSystemCarthage = false - var canUseSystemCarthageStub: (() -> Bool)? - - public func canUseSystemCarthage() -> Bool { - invokedCanUseSystemCarthage = true - return canUseSystemCarthageStub?() ?? false - } - - var invokedCarthageVersion = false - var carthageVersionStub: (() throws -> Version)? - - public func carthageVersion() throws -> Version { - invokedCarthageVersion = true - return try carthageVersionStub?() ?? Version(0, 0, 0) - } - - var invokedIsXCFrameworksProductionSupported = false - var isXCFrameworksProductionSupportedStub: (() -> Bool)? - - public func isXCFrameworksProductionSupported() throws -> Bool { - invokedIsXCFrameworksProductionSupported = true - return isXCFrameworksProductionSupportedStub?() ?? false - } - - var invokedBootstrap = false - var bootstrapStub: ((AbsolutePath, Set, Bool) throws -> Void)? - - public func bootstrap( - at path: AbsolutePath, - platforms: Set, - printOutput: Bool - ) throws { - invokedBootstrap = true - try bootstrapStub?(path, platforms, printOutput) - } - - var invokedUpdate = false - var updateStub: ((AbsolutePath, Set, Bool) throws -> Void)? - - public func update( - at path: AbsolutePath, - platforms: Set, - printOutput: Bool - ) throws { - invokedUpdate = true - try updateStub?(path, platforms, printOutput) - } -} diff --git a/Sources/TuistDependenciesTesting/Carthage/Utils/MockCarthageGraphGenerator.swift b/Sources/TuistDependenciesTesting/Carthage/Utils/MockCarthageGraphGenerator.swift deleted file mode 100644 index ca3d4ca0454..00000000000 --- a/Sources/TuistDependenciesTesting/Carthage/Utils/MockCarthageGraphGenerator.swift +++ /dev/null @@ -1,18 +0,0 @@ -import ProjectDescription -import TSCBasic -import TSCUtility -import TuistCore - -@testable import TuistDependencies - -public final class MockCarthageGraphGenerator: CarthageGraphGenerating { - public init() {} - - var invokedGenerate = false - var generateStub: ((AbsolutePath) throws -> TuistCore.DependenciesGraph)? - - public func generate(at path: AbsolutePath) throws -> TuistCore.DependenciesGraph { - invokedGenerate = true - return try generateStub?(path) ?? .test() - } -} diff --git a/Sources/TuistDependenciesTesting/DependenciesGraph/MockDependenciesGraphController.swift b/Sources/TuistDependenciesTesting/DependenciesGraph/MockDependenciesGraphController.swift deleted file mode 100644 index 4159203a876..00000000000 --- a/Sources/TuistDependenciesTesting/DependenciesGraph/MockDependenciesGraphController.swift +++ /dev/null @@ -1,33 +0,0 @@ -import Foundation -import TSCBasic -import TuistGraph - -@testable import TuistDependencies - -public final class MockDependenciesGraphController: DependenciesGraphControlling { - public init() {} - - var invokedSave = false - var saveStub: ((TuistGraph.DependenciesGraph, AbsolutePath) throws -> Void)? - - public func save(_ dependenciesGraph: TuistGraph.DependenciesGraph, to path: AbsolutePath) throws { - invokedSave = true - try saveStub?(dependenciesGraph, path) - } - - var invokedLoad = false - var loadStub: ((AbsolutePath) throws -> TuistGraph.DependenciesGraph)? - - public func load(at path: AbsolutePath) throws -> TuistGraph.DependenciesGraph { - invokedLoad = true - return try loadStub?(path) ?? .test() - } - - var invokedClean = false - var cleanStub: ((AbsolutePath) throws -> Void)? - - public func clean(at path: AbsolutePath) throws { - invokedClean = true - try cleanStub?(path) - } -} diff --git a/Sources/TuistDependenciesTesting/MockDependenciesController.swift b/Sources/TuistDependenciesTesting/MockDependenciesController.swift deleted file mode 100644 index 78b2f7bfb77..00000000000 --- a/Sources/TuistDependenciesTesting/MockDependenciesController.swift +++ /dev/null @@ -1,73 +0,0 @@ -import ProjectDescription -import TSCBasic -import TSCUtility -import TuistCore -import TuistGraph - -@testable import TuistDependencies - -public final class MockDependenciesController: DependenciesControlling { - public init() {} - - public var invokedFetch = false - public var legacyFetchStub: ( - (AbsolutePath, TuistGraph.Dependencies, TSCUtility.Version?) throws -> TuistCore - .DependenciesGraph - )? - - public func fetch( - at path: AbsolutePath, - dependencies: TuistGraph.Dependencies, - swiftVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph { - invokedFetch = true - return try legacyFetchStub?(path, dependencies, swiftVersion) ?? .none - } - - public var fetchStub: ((AbsolutePath, TuistGraph.PackageSettings, TSCUtility.Version?) throws -> TuistCore.DependenciesGraph)? - public func fetch( - at path: AbsolutePath, - packageSettings: TuistGraph.PackageSettings, - swiftVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph { - invokedFetch = true - return try fetchStub?(path, packageSettings, swiftVersion) ?? .none - } - - public var invokedUpdate = false - public var legacyUpdateStub: ( - (AbsolutePath, TuistGraph.Dependencies, TSCUtility.Version?) throws -> TuistCore - .DependenciesGraph - )? - - public func update( - at path: AbsolutePath, - dependencies: TuistGraph.Dependencies, - swiftVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph { - invokedUpdate = true - return try legacyUpdateStub?(path, dependencies, swiftVersion) ?? .none - } - - public var updateStub: ( - (AbsolutePath, TuistGraph.PackageSettings, TSCUtility.Version?) throws -> TuistCore - .DependenciesGraph - )? - - public func update( - at path: AbsolutePath, - packageSettings: TuistGraph.PackageSettings, - swiftVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph { - invokedUpdate = true - return try updateStub?(path, packageSettings, swiftVersion) ?? .none - } - - public var invokedSave = false - public var saveStub: ((TuistGraph.DependenciesGraph, AbsolutePath) throws -> Void)? - - public func save(dependenciesGraph: TuistGraph.DependenciesGraph, to path: AbsolutePath) throws { - invokedSave = true - try saveStub?(dependenciesGraph, path) - } -} diff --git a/Sources/TuistDependenciesTesting/SwiftPackageManager/MockSwiftPackageManagerInteractor.swift b/Sources/TuistDependenciesTesting/SwiftPackageManager/MockSwiftPackageManagerInteractor.swift deleted file mode 100644 index 2a287e5e95b..00000000000 --- a/Sources/TuistDependenciesTesting/SwiftPackageManager/MockSwiftPackageManagerInteractor.swift +++ /dev/null @@ -1,41 +0,0 @@ -import ProjectDescription -import TSCBasic -import TSCUtility -import TuistCore -import TuistGraph - -@testable import TuistDependencies - -public final class MockSwiftPackageManagerInteractor: SwiftPackageManagerInteracting { - public init() {} - - var invokedInstall = false - var installStub: ( - ( - AbsolutePath, - TuistGraph.SwiftPackageManagerDependencies, - Set, - Bool, - TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph - )? - - public func install( - dependenciesDirectory: AbsolutePath, - dependencies: TuistGraph.SwiftPackageManagerDependencies, - platforms: Set, - shouldUpdate: Bool, - swiftToolsVersion: TSCUtility.Version? - ) throws -> TuistCore.DependenciesGraph { - invokedInstall = true - return try installStub?(dependenciesDirectory, dependencies, platforms, shouldUpdate, swiftToolsVersion) ?? .none - } - - var invokedClean = false - var cleanStub: ((AbsolutePath) throws -> Void)? - - public func clean(dependenciesDirectory: AbsolutePath) throws { - invokedClean = true - try cleanStub?(dependenciesDirectory) - } -} diff --git a/Sources/TuistDependenciesTesting/SwiftPackageManager/Utils/MockSwiftPackageManagerGraphGenerator.swift b/Sources/TuistDependenciesTesting/SwiftPackageManager/Utils/MockSwiftPackageManagerGraphGenerator.swift deleted file mode 100644 index 015d8972b35..00000000000 --- a/Sources/TuistDependenciesTesting/SwiftPackageManager/Utils/MockSwiftPackageManagerGraphGenerator.swift +++ /dev/null @@ -1,45 +0,0 @@ -import ProjectDescription -import TSCBasic -import TSCUtility -import TuistCore -import TuistGraph - -@testable import TuistDependencies - -public final class MockSwiftPackageManagerGraphGenerator: SwiftPackageManagerGraphGenerating { - public init() {} - - var invokedGenerate = false - var generateStub: ( - ( - AbsolutePath, - [String: TuistGraph.Product], - Set, - TuistGraph.Settings, - [String: TuistGraph.SettingsDictionary], - TSCUtility.Version?, - [String: TuistGraph.Project.Options] - ) throws -> TuistCore.DependenciesGraph - )? - - public func generate( - at path: AbsolutePath, - productTypes: [String: TuistGraph.Product], - platforms: Set, - baseSettings: TuistGraph.Settings, - targetSettings: [String: TuistGraph.SettingsDictionary], - swiftToolsVersion: TSCUtility.Version?, - projectOptions: [String: TuistGraph.Project.Options] - ) throws -> TuistCore.DependenciesGraph { - invokedGenerate = true - return try generateStub?( - path, - productTypes, - platforms, - baseSettings, - targetSettings, - swiftToolsVersion, - projectOptions - ) ?? .test() - } -} diff --git a/Sources/TuistEnvKit/Commands/BundleCommand.swift b/Sources/TuistEnvKit/Commands/BundleCommand.swift deleted file mode 100644 index 07a683912c9..00000000000 --- a/Sources/TuistEnvKit/Commands/BundleCommand.swift +++ /dev/null @@ -1,16 +0,0 @@ -import ArgumentParser -import Foundation -import TSCBasic - -struct BundleCommand: ParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "bundle", - abstract: "Bundles the version specified in the .tuist-version file into the .tuist-bin directory" - ) - } - - func run() throws { - try BundleService().run() - } -} diff --git a/Sources/TuistEnvKit/Commands/CommandRunner.swift b/Sources/TuistEnvKit/Commands/CommandRunner.swift deleted file mode 100644 index e02dd86dedc..00000000000 --- a/Sources/TuistEnvKit/Commands/CommandRunner.swift +++ /dev/null @@ -1,143 +0,0 @@ -import Foundation -import TSCBasic -import TSCUtility -import TuistSupport - -protocol CommandRunning: AnyObject { - func run() throws -} - -enum CommandRunnerError: FatalError { - case versionNotFound - - var type: ErrorType { - switch self { - case .versionNotFound: - return .abort - } - } - - var description: String { - switch self { - case .versionNotFound: - return "No valid version has been found locally" - } - } -} - -class CommandRunner: CommandRunning { - // MARK: - Attributes - - let versionResolver: VersionResolving - let environment: Environmenting - let updater: Updating - let versionsController: VersionsControlling - let installer: Installing - let arguments: () -> [String] - let exiter: (Int) -> Void - - // MARK: - Init - - init( - versionResolver: VersionResolving = VersionResolver(), - environment: Environmenting = Environment.shared, - updater: Updating = Updater(), - installer: Installing = Installer(), - versionsController: VersionsControlling = VersionsController(), - arguments: @escaping () -> [String] = CommandRunner.arguments, - exiter: @escaping (Int) -> Void = { exit(Int32($0)) } - ) { - self.versionResolver = versionResolver - self.environment = environment - self.versionsController = versionsController - self.arguments = arguments - self.updater = updater - self.installer = installer - self.exiter = exiter - } - - // MARK: - CommandRunning - - func run() throws { - let currentPath = FileHandler.shared.currentPath - - // Version resolving - let resolvedVersion = try versionResolver.resolve(path: currentPath) - - switch resolvedVersion { - case let .bin(path): - logger.debug("Using bundled version at path \(path.pathString)") - case let .versionFile(path, value): - logger.debug("Using version \(value) defined at \(path.pathString)") - default: - break - } - - if case let ResolvedVersion.bin(path) = resolvedVersion { - try runAtPath(path) - } else if case let ResolvedVersion.versionFile(_, version) = resolvedVersion { - try runVersion(version) - } else { - try runHighestLocalVersion() - } - } - - // MARK: - Fileprivate - - func runHighestLocalVersion() throws { - var version: String! - - if let highgestVersion = versionsController.semverVersions().last?.description { - version = highgestVersion - } else { - try updater.update() - guard let highgestVersion = versionsController.semverVersions().last?.description else { - throw CommandRunnerError.versionNotFound - } - version = highgestVersion - } - - let path = try versionsController.path(version: version) - try runAtPath(path) - } - - func runVersion(_ version: String) throws { - guard Version(version) != nil else { - logger.error("\(version) is not a valid version") - exiter(1) - return - } - - if !versionsController.versions().contains(where: { $0.description == version }) { - logger.notice("Version \(version) not found locally. Installing...") - try installer.install(version: version) - } - - let path = try versionsController.path(version: version) - try runAtPath(path) - } - - func runAtPath(_ path: AbsolutePath) throws { - var args: [String] = [] - - args.append(path.appending(component: Constants.binName).pathString) - args.append(contentsOf: Array(arguments().dropFirst())) - - var environment = ProcessInfo.processInfo.environment - if CommandLine.arguments.contains("--verbose") { - environment[Constants.EnvironmentVariables.verbose] = "true" - } - - do { - try System.shared.runAndPrint(args, verbose: false, environment: environment) - } catch { - exiter(1) - } - } - - // MARK: - Static - - static func arguments() -> [String] { - Array(ProcessInfo.processInfo.arguments).filter { $0 != "--verbose" } - } -} diff --git a/Sources/TuistEnvKit/Commands/InstallCommand.swift b/Sources/TuistEnvKit/Commands/InstallCommand.swift deleted file mode 100644 index 6c1db8f5b14..00000000000 --- a/Sources/TuistEnvKit/Commands/InstallCommand.swift +++ /dev/null @@ -1,21 +0,0 @@ -import ArgumentParser -import Foundation - -/// Command that installs new versions of Tuist in the system. -struct InstallCommand: ParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "install", - abstract: "Installs a version of tuist" - ) - } - - @Argument( - help: "The version of tuist to be installed" - ) - var version: String - - func run() throws { - try InstallService().run(version: version) - } -} diff --git a/Sources/TuistEnvKit/Commands/LocalCommand.swift b/Sources/TuistEnvKit/Commands/LocalCommand.swift deleted file mode 100644 index e3afcb47f4c..00000000000 --- a/Sources/TuistEnvKit/Commands/LocalCommand.swift +++ /dev/null @@ -1,22 +0,0 @@ -import ArgumentParser -import Foundation -import TSCBasic -import TuistSupport - -struct LocalCommand: ParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "local", - abstract: "Creates a .tuist-version file to pin the tuist version that should be used in the current directory. If the version is not specified, it prints the local versions" - ) - } - - @Argument( - help: "The version that you would like to pin your current directory to" - ) - var version: String? - - func run() throws { - try LocalService().run(version: version) - } -} diff --git a/Sources/TuistEnvKit/Commands/TuistCommand.swift b/Sources/TuistEnvKit/Commands/TuistCommand.swift deleted file mode 100644 index 8a05a6d0541..00000000000 --- a/Sources/TuistEnvKit/Commands/TuistCommand.swift +++ /dev/null @@ -1,93 +0,0 @@ -import ArgumentParser -import Foundation -import TuistSupport - -public struct TuistCommand: ParsableCommand { - public init() {} - - public static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "tuist", - abstract: "Manage the environment tuist versions", - subcommands: [ - LocalCommand.self, - BundleCommand.self, - UpdateCommand.self, - InstallCommand.self, - UninstallCommand.self, - VersionCommand.self, - ] - ) - } - - public static func main(_: [String]? = nil) { - let errorHandler = ErrorHandler() - let processedArguments = processArguments() - - // Help env - if processedArguments.dropFirst().first == "--help-env" { - let error = CleanExit.helpRequest(self) - exit(withError: error) - } - - // Parse the command - var command: ParsableCommand? - do { - if let parsedArguments = try parse() { - command = try parseAsRoot(parsedArguments) - } - } catch { - let exitCode = exitCode(for: error).rawValue - if exitCode == 0 { - logger.info("\(fullMessage(for: error))") - } else { - logger.error("\(fullMessage(for: error))") - } - _exit(exitCode) - } - - // Run the command - do { - if var command { - try command.run() - } else { - try CommandRunner().run() - } - WarningController.shared.flush() - _exit(0) - } catch let error as FatalError { - WarningController.shared.flush() - errorHandler.fatal(error: error) - _exit(exitCode(for: error).rawValue) - } catch { - WarningController.shared.flush() - // Exit cleanly - if exitCode(for: error).rawValue == 0 { - exit(withError: error) - } else { - errorHandler.fatal(error: UnhandledError(error: error)) - _exit(exitCode(for: error).rawValue) - } - } - } - - // MARK: - Helpers - - private static func parse() throws -> [String]? { - let arguments = Array(processArguments().dropFirst()) - guard let firstArgument = arguments.first else { return nil } - // swiftformat:disable preferKeyPath - let containsCommand = configuration.subcommands.map { $0.configuration.commandName }.contains(firstArgument) - // swiftformat:enable preferKeyPath - if containsCommand { - return arguments - } - return nil - } - - // MARK: - Static - - static func processArguments() -> [String] { - CommandRunner.arguments() - } -} diff --git a/Sources/TuistEnvKit/Commands/UninstallCommand.swift b/Sources/TuistEnvKit/Commands/UninstallCommand.swift deleted file mode 100644 index 5b295625095..00000000000 --- a/Sources/TuistEnvKit/Commands/UninstallCommand.swift +++ /dev/null @@ -1,21 +0,0 @@ -import ArgumentParser -import Foundation -import TuistSupport - -struct UninstallCommand: ParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "uninstall", - abstract: "Uninstalls a version of tuist" - ) - } - - @Argument( - help: "The version of tuist to be uninstalled" - ) - var version: String - - func run() throws { - try UninstallService().run(version: version) - } -} diff --git a/Sources/TuistEnvKit/Commands/UpdateCommand.swift b/Sources/TuistEnvKit/Commands/UpdateCommand.swift deleted file mode 100644 index 1ab855b8745..00000000000 --- a/Sources/TuistEnvKit/Commands/UpdateCommand.swift +++ /dev/null @@ -1,17 +0,0 @@ -import ArgumentParser -import Foundation -import TuistSupport - -/// Command that updates the version of Tuist in the environment. -struct UpdateCommand: ParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "update", - abstract: "Installs the latest version if it's not already installed" - ) - } - - func run() throws { - try UpdateService().run() - } -} diff --git a/Sources/TuistEnvKit/Commands/VersionCommand.swift b/Sources/TuistEnvKit/Commands/VersionCommand.swift deleted file mode 100644 index 4f16408ce53..00000000000 --- a/Sources/TuistEnvKit/Commands/VersionCommand.swift +++ /dev/null @@ -1,17 +0,0 @@ -import ArgumentParser -import Foundation -import TSCBasic -import TuistSupport - -struct VersionCommand: ParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "envversion", - abstract: "Outputs the current version of tuist env." - ) - } - - func run() throws { - try VersionService().run() - } -} diff --git a/Sources/TuistEnvKit/HTTP/HTTPClient.swift b/Sources/TuistEnvKit/HTTP/HTTPClient.swift deleted file mode 100644 index 794ded14712..00000000000 --- a/Sources/TuistEnvKit/HTTP/HTTPClient.swift +++ /dev/null @@ -1,121 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport - -enum HTTPClientError: FatalError { - case clientError(URL, Error) - case noData(URL) - case copyFileError(AbsolutePath, Error) - case missingResource(URL) - - /// Error type - var type: ErrorType { - switch self { - case .clientError: - return .abort - case .noData: - return .abort - case .copyFileError: - return .abort - case .missingResource: - return .abort - } - } - - /// Error description. - var description: String { - switch self { - case let .clientError(url, error): - return "The request to \(url.absoluteString) errored with: \(error.localizedDescription)" - case let .noData(url): - return "The request to \(url.absoluteString) returned no data" - case let .copyFileError(path, error): - return "The file could not be copied into \(path.pathString): \(error.localizedDescription)" - case let .missingResource(url): - return "Couldn't locate resource downloaded from \(url.absoluteString)" - } - } -} - -protocol HTTPClienting { - /// Fetches the content from the given URL and returns it as a data. - /// - /// - Parameter url: URL to download the resource from. - /// - Returns: Response body as a data. - /// - Throws: An error if the request fails. - func read(url: URL) throws -> Data - - /// Downloads the resource from the given URL into the file at the given path. - /// - /// - Parameters: - /// - url: URL to download the resource from. - /// - to: Path where the file should be downloaded. - /// - Throws: An error if the dowload fails. - func download(url: URL, to: AbsolutePath) throws -} - -final class HTTPClient: HTTPClienting { - // MARK: - Attributes - - /// URL session. - fileprivate let session: URLSession = .shared - - // MARK: - HTTPClienting - - /// Fetches the content from the given URL and returns it as a data. - /// - /// - Parameter url: URL to download the resource from. - /// - Returns: Response body as a data. - /// - Throws: An error if the request fails. - func read(url: URL) throws -> Data { - var data: Data? - var error: Error? - - let semaphore = DispatchSemaphore(value: 0) - session.dataTask(with: url) { responseData, _, responseError in - data = responseData - error = responseError - semaphore.signal() - }.resume() - semaphore.wait() - - if let error { - throw HTTPClientError.clientError(url, error) - } - guard let resultData = data else { - throw HTTPClientError.noData(url) - } - return resultData - } - - /// Downloads the resource from the given URL into the file at the given path. - /// - /// - Parameters: - /// - url: URL to download the resource from. - /// - to: Path where the file should be downloaded. - /// - Throws: An error if the dowload fails. - func download(url: URL, to: AbsolutePath) throws { - let semaphore = DispatchSemaphore(value: 0) - var clientError: HTTPClientError? - - session.downloadTask(with: url) { downloadURL, _, error in - defer { semaphore.signal() } - if let error { - clientError = HTTPClientError.clientError(url, error) - } else if let downloadURL { - let from = try! AbsolutePath(validating: downloadURL.path) // swiftlint:disable:this force_try - do { - try FileHandler.shared.copy(from: from, to: to) - } catch { - clientError = HTTPClientError.copyFileError(to, error) - } - } else { - clientError = .missingResource(url) - } - }.resume() - semaphore.wait() - if let clientError { - throw clientError - } - } -} diff --git a/Sources/TuistEnvKit/Installer/BuildCopier.swift b/Sources/TuistEnvKit/Installer/BuildCopier.swift deleted file mode 100644 index fb4cc7151ab..00000000000 --- a/Sources/TuistEnvKit/Installer/BuildCopier.swift +++ /dev/null @@ -1,35 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport - -protocol BuildCopying: AnyObject { - func copy(from: AbsolutePath, to: AbsolutePath) throws -} - -class BuildCopier: BuildCopying { - // MARK: - Static - - /// Files that should be copied (if they exist). - static let files: [String] = [ - "tuist", - Constants.templatesDirectoryName, - Constants.vendorDirectoryName, - // Project description - "ProjectDescription.swiftmodule", - "ProjectDescription.swiftdoc", - "ProjectDescription.swiftinterface", - "libProjectDescription.dylib", - ] - - func copy(from: AbsolutePath, to: AbsolutePath) throws { - try BuildCopier.files.forEach { file in - let filePath = from.appending(component: file) - let toPath = to.appending(component: file) - if !FileHandler.shared.exists(filePath) { return } - try System.shared.run(["/bin/cp", "-rf", filePath.pathString, toPath.pathString]) - if file == "tuist" { - try System.shared.run(["/bin/chmod", "+x", toPath.pathString]) - } - } - } -} diff --git a/Sources/TuistEnvKit/Installer/EnvInstaller.swift b/Sources/TuistEnvKit/Installer/EnvInstaller.swift deleted file mode 100644 index d8413b2135d..00000000000 --- a/Sources/TuistEnvKit/Installer/EnvInstaller.swift +++ /dev/null @@ -1,108 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport - -/// Protocol that defines the interface of an instance that can install versions of TuistEnv. -protocol EnvInstalling: AnyObject { - /// It installs a version of Tuist in the local environment. - /// - /// - Parameters: - /// - version: Version to be installed. - /// - Throws: An error if the installation fails. - func install(version: String) throws -} - -/// Error thrown by the installer. -/// -/// - versionNotFound: When the specified version cannot be found. -/// - incompatibleSwiftVersion: When the environment Swift version is incompatible with the Swift version Tuist has been compiled -/// with. -enum EnvInstallerError: FatalError, Equatable { - case versionNotFound(String) - case incompatibleSwiftVersion(local: String, expected: String) - - var type: ErrorType { - switch self { - case .versionNotFound: return .abort - case .incompatibleSwiftVersion: return .abort - } - } - - var description: String { - switch self { - case let .versionNotFound(version): - return "Version \(version) not found" - case let .incompatibleSwiftVersion(local, expected): - return "Found \(local) Swift version but expected \(expected)" - } - } -} - -/// Class that manages the installation of Tuist versions. -final class EnvInstaller: EnvInstalling { - // MARK: - Attributes - - let buildCopier: BuildCopying - let versionsController: VersionsControlling - - // MARK: - Init - - init( - buildCopier: BuildCopying = BuildCopier(), - versionsController: VersionsControlling = VersionsController() - ) { - self.buildCopier = buildCopier - self.versionsController = versionsController - } - - // MARK: - Installing - - func install(version: String) throws { - try withTemporaryDirectory { temporaryDirectory in - try install(version: version, temporaryDirectory: temporaryDirectory) - } - } - - func install(version: String, temporaryDirectory: AbsolutePath) throws { - try installFromBundle( - bundleURL: URL(string: "https://github.com/tuist/tuist/releases/download/\(version)/tuistenv.zip")!, - version: version, - temporaryDirectory: temporaryDirectory - ) - } - - func installFromBundle( - bundleURL: URL, - version: String, - temporaryDirectory: AbsolutePath - ) throws { - let installationPath = try System.shared.which("tuist") - - // Download bundle - logger.notice("Downloading TuistEnv version \(version)") - let downloadPath = temporaryDirectory.appending(component: Constants.envBundleName) - try System.shared.run(["/usr/bin/curl", "-LSs", "--output", downloadPath.pathString, bundleURL.absoluteString]) - - // Unzip - logger.notice("Installing…") - try System.shared.run(["/usr/bin/unzip", "-q", downloadPath.pathString, "tuistenv", "-d", temporaryDirectory.pathString]) - - // Remove old version - let rmArgs = ["rm", installationPath] - do { - try System.shared.run(rmArgs) - } catch { - try System.shared.run(["sudo"] + rmArgs) - } - - // Move - let mvArgs = ["mv", temporaryDirectory.appending(component: "tuistenv").pathString, installationPath] - do { - try System.shared.run(mvArgs) - } catch { - try System.shared.run(["sudo"] + mvArgs) - } - - logger.notice("TuistEnv Version \(version) installed") - } -} diff --git a/Sources/TuistEnvKit/Installer/Installer.swift b/Sources/TuistEnvKit/Installer/Installer.swift deleted file mode 100644 index 42cfc499df1..00000000000 --- a/Sources/TuistEnvKit/Installer/Installer.swift +++ /dev/null @@ -1,94 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport - -/// Protocol that defines the interface of an instance that can install versions of Tuist. -protocol Installing: AnyObject { - /// It installs a version of Tuist in the local environment. - /// - /// - Parameters: - /// - version: Version to be installed. - /// - Throws: An error if the installation fails. - func install(version: String) throws -} - -/// Error thrown by the installer. -/// -/// - versionNotFound: When the specified version cannot be found. -/// - incompatibleSwiftVersion: When the environment Swift version is incompatible with the Swift version Tuist has been compiled -/// with. -enum InstallerError: FatalError, Equatable { - case versionNotFound(String) - case incompatibleSwiftVersion(local: String, expected: String) - - var type: ErrorType { - switch self { - case .versionNotFound: return .abort - case .incompatibleSwiftVersion: return .abort - } - } - - var description: String { - switch self { - case let .versionNotFound(version): - return "Version \(version) not found" - case let .incompatibleSwiftVersion(local, expected): - return "Found \(local) Swift version but expected \(expected)" - } - } -} - -/// Class that manages the installation of Tuist versions. -final class Installer: Installing { - // MARK: - Attributes - - let buildCopier: BuildCopying - let versionsController: VersionsControlling - - // MARK: - Init - - init( - buildCopier: BuildCopying = BuildCopier(), - versionsController: VersionsControlling = VersionsController() - ) { - self.buildCopier = buildCopier - self.versionsController = versionsController - } - - // MARK: - Installing - - func install(version: String) throws { - try withTemporaryDirectory { temporaryDirectory in - try install(version: version, temporaryDirectory: temporaryDirectory) - } - } - - func install(version: String, temporaryDirectory: AbsolutePath) throws { - try installFromBundle( - bundleURL: URL(string: "https://github.com/tuist/tuist/releases/download/\(version)/tuist.zip")!, - version: version, - temporaryDirectory: temporaryDirectory - ) - } - - func installFromBundle( - bundleURL: URL, - version: String, - temporaryDirectory: AbsolutePath - ) throws { - try versionsController.install(version: version, installation: { installationDirectory in - - // Download bundle - logger.notice("Downloading version \(version)") - - let downloadPath = temporaryDirectory.appending(component: Constants.bundleName) - try System.shared.run(["/usr/bin/curl", "-LSs", "--output", downloadPath.pathString, bundleURL.absoluteString]) - - // Unzip - logger.notice("Installing…") - try System.shared.run(["/usr/bin/unzip", "-q", downloadPath.pathString, "-d", installationDirectory.pathString]) - - logger.notice("Version \(version) installed") - }) - } -} diff --git a/Sources/TuistEnvKit/Installer/SwiftVersion.swift b/Sources/TuistEnvKit/Installer/SwiftVersion.swift deleted file mode 100644 index 66bfd3acda0..00000000000 --- a/Sources/TuistEnvKit/Installer/SwiftVersion.swift +++ /dev/null @@ -1,33 +0,0 @@ -import Foundation - -struct SwiftVersion: Comparable, Equatable, CustomStringConvertible { - let major: Int - let minor: Int - let patch: Int - - init(_ value: String) { - let components = value.split(separator: ".") - major = Int(String(components[0]))! - - if components.count == 3 { - minor = Int(String(components[1]))! - patch = Int(String(components[2]))! - } else if components.count == 2 { - minor = Int(String(components[1]))! - patch = 0 - } else { - minor = 0 - patch = 0 - } - } - - var description: String { - "\(major).\(minor).\(patch)" - } - - // MARK: - Comparable - - static func < (lhs: SwiftVersion, rhs: SwiftVersion) -> Bool { - lhs.major < rhs.major || lhs.minor < rhs.minor || lhs.patch < lhs.patch - } -} diff --git a/Sources/TuistEnvKit/Services/BundleService.swift b/Sources/TuistEnvKit/Services/BundleService.swift deleted file mode 100644 index c759129f1ba..00000000000 --- a/Sources/TuistEnvKit/Services/BundleService.swift +++ /dev/null @@ -1,62 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport - -enum BundleServiceError: FatalError, Equatable { - case missingVersionFile(AbsolutePath) - - var type: ErrorType { - switch self { - case .missingVersionFile: - return .abort - } - } - - var description: String { - switch self { - case let .missingVersionFile(path): - return "Couldn't find a .tuist-version file in the directory \(path.pathString)" - } - } -} - -final class BundleService { - private let versionsController: VersionsControlling - private let installer: Installing - - init( - versionsController: VersionsControlling = VersionsController(), - installer: Installing = Installer() - ) { - self.versionsController = versionsController - self.installer = installer - } - - func run() throws { - let versionFilePath = FileHandler.shared.currentPath.appending(component: Constants.versionFileName) - let binFolderPath = FileHandler.shared.currentPath.appending(component: Constants.binFolderName) - - if !FileHandler.shared.exists(versionFilePath) { - throw BundleServiceError.missingVersionFile(FileHandler.shared.currentPath) - } - - let version = try String(contentsOf: versionFilePath.url).trimmingCharacters(in: .whitespacesAndNewlines) - logger.notice("Bundling the version \(version) in the directory \(binFolderPath.pathString)", metadata: .section) - - let versionPath = try versionsController.path(version: version) - - // Installing - if !FileHandler.shared.exists(versionPath) { - logger.notice("Version \(version) not available locally. Installing...") - try installer.install(version: version) - } - - // Copying - if FileHandler.shared.exists(binFolderPath) { - try FileHandler.shared.delete(binFolderPath) - } - try FileHandler.shared.copy(from: versionPath, to: binFolderPath) - - logger.notice("tuist bundled successfully at \(binFolderPath.pathString)", metadata: .success) - } -} diff --git a/Sources/TuistEnvKit/Services/InstallService.swift b/Sources/TuistEnvKit/Services/InstallService.swift deleted file mode 100644 index c4477f1044a..00000000000 --- a/Sources/TuistEnvKit/Services/InstallService.swift +++ /dev/null @@ -1,29 +0,0 @@ -import Foundation -import TSCUtility -import TuistSupport - -final class InstallService { - /// Controller to manage system versions. - private let versionsController: VersionsControlling - - /// Installer instance to run the installation. - private let installer: Installing - - init( - versionsController: VersionsControlling = VersionsController(), - installer: Installing = Installer() - ) { - self.versionsController = versionsController - self.installer = installer - } - - func run(version: String) throws { - let parsedVersion = try Version(versionString: version, usesLenientParsing: true) - let versions = versionsController.versions().map(\.description) - if versions.contains(parsedVersion.description) { - logger.warning("Version \(parsedVersion) already installed, skipping") - return - } - try installer.install(version: parsedVersion.description) - } -} diff --git a/Sources/TuistEnvKit/Services/LocalService.swift b/Sources/TuistEnvKit/Services/LocalService.swift deleted file mode 100644 index 8cbf9ad806f..00000000000 --- a/Sources/TuistEnvKit/Services/LocalService.swift +++ /dev/null @@ -1,40 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport - -final class LocalService { - private let versionController: VersionsControlling - - init(versionController: VersionsControlling = VersionsController()) { - self.versionController = versionController - } - - func run(version: String?) throws { - if let version { - try createVersionFile(version: version) - } else { - try printLocalVersions() - } - } - - // MARK: - Helpers - - private func printLocalVersions() throws { - logger.notice("The following versions are available in the local environment:", metadata: .section) - let versions = versionController.semverVersions() - let output = versions.sorted().reversed().map { "- \($0)" }.joined(separator: "\n") - logger.notice("\(output)") - } - - private func createVersionFile(version: String) throws { - let currentPath = FileHandler.shared.currentPath - logger.notice("Generating \(Constants.versionFileName) file with version \(version)", metadata: .section) - let tuistVersionPath = currentPath.appending(component: Constants.versionFileName) - try "\(version)".write( - to: URL(fileURLWithPath: tuistVersionPath.pathString), - atomically: true, - encoding: .utf8 - ) - logger.notice("File generated at path \(tuistVersionPath.pathString)", metadata: .success) - } -} diff --git a/Sources/TuistEnvKit/Services/UninstallService.swift b/Sources/TuistEnvKit/Services/UninstallService.swift deleted file mode 100644 index 30d946d391c..00000000000 --- a/Sources/TuistEnvKit/Services/UninstallService.swift +++ /dev/null @@ -1,28 +0,0 @@ -import Foundation -import TuistSupport - -final class UninstallService { - /// Controller to manage system versions. - private let versionsController: VersionsControlling - - /// Installer instance to run the installation. - private let installer: Installing - - init( - versionsController: VersionsControlling = VersionsController(), - installer: Installing = Installer() - ) { - self.versionsController = versionsController - self.installer = installer - } - - func run(version: String) throws { - let versions = versionsController.versions().map(\.description) - if versions.contains(version) { - try versionsController.uninstall(version: version) - logger.notice("Version \(version) uninstalled", metadata: .success) - } else { - logger.warning("Version \(version) cannot be uninstalled because it's not installed") - } - } -} diff --git a/Sources/TuistEnvKit/Services/UpdateService.swift b/Sources/TuistEnvKit/Services/UpdateService.swift deleted file mode 100644 index 72bc4d564b7..00000000000 --- a/Sources/TuistEnvKit/Services/UpdateService.swift +++ /dev/null @@ -1,16 +0,0 @@ -import Foundation -import TuistSupport - -final class UpdateService { - /// Updater instance that runs the update. - private let updater: Updating - - init(updater: Updating = Updater()) { - self.updater = updater - } - - func run() throws { - logger.notice("Checking for updates...", metadata: .section) - try updater.update() - } -} diff --git a/Sources/TuistEnvKit/Services/VersionService.swift b/Sources/TuistEnvKit/Services/VersionService.swift deleted file mode 100644 index 12179c35811..00000000000 --- a/Sources/TuistEnvKit/Services/VersionService.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport - -final class VersionService { - func run() throws { - logger.notice("\(Constants.version)") - } -} diff --git a/Sources/TuistEnvKit/Settings/Settings.swift b/Sources/TuistEnvKit/Settings/Settings.swift deleted file mode 100644 index d22a69e8b14..00000000000 --- a/Sources/TuistEnvKit/Settings/Settings.swift +++ /dev/null @@ -1,21 +0,0 @@ -import Foundation - -/// Settings -class Settings: Codable, Equatable { - // MARK: - Init - - /// Initializes the settings instance. - init() {} - - // MARK: - Equatable - - /// Compares two instances of Settings. - /// - /// - Parameters: - /// - lhs: first instance to be compared. - /// - rhs: second instance to be compared. - /// - Returns: true if the two instances are equal. - static func == (_: Settings, _: Settings) -> Bool { - true - } -} diff --git a/Sources/TuistEnvKit/Settings/SettingsController.swift b/Sources/TuistEnvKit/Settings/SettingsController.swift deleted file mode 100644 index fddcd32417f..00000000000 --- a/Sources/TuistEnvKit/Settings/SettingsController.swift +++ /dev/null @@ -1,45 +0,0 @@ -import Foundation -import TuistSupport - -/// The class that conforms this protocol exposes an interface for interacting with the user settings. -protocol SettingsControlling: AnyObject { - /// It fetches the current settings. - /// - /// - Returns: settings. - /// - Throws: an error if the settings cannot be fetched. - func settings() throws -> Settings - - /// Stores the settings. - /// - /// - Parameter settings: settings to be stored. - /// - Throws: an error if the saving fails. - func set(settings: Settings) throws -} - -/// Controller to manage user settings. -class SettingsController: SettingsControlling { - /// It fetches the current settings. - /// - /// - Returns: settings. - /// - Throws: an error if the settings cannot be fetched. - func settings() throws -> Settings { - let path = Environment.shared.settingsPath - if !FileHandler.shared.exists(path) { return Settings() } - let data = try Data(contentsOf: URL(fileURLWithPath: path.pathString)) - let decoder = JSONDecoder() - return try decoder.decode(Settings.self, from: data) - } - - /// Stores the settings. - /// - /// - Parameter settings: settings to be stored. - /// - Throws: an error if the saving fails. - func set(settings: Settings) throws { - let encoder = JSONEncoder() - let data = try encoder.encode(settings) - let path = Environment.shared.settingsPath - if FileHandler.shared.exists(path) { try FileHandler.shared.delete(path) } - let url = URL(fileURLWithPath: path.pathString) - try data.write(to: url, options: Data.WritingOptions.atomic) - } -} diff --git a/Sources/TuistEnvKit/Settings/VersionProvider.swift b/Sources/TuistEnvKit/Settings/VersionProvider.swift deleted file mode 100644 index d7a1fe6fd21..00000000000 --- a/Sources/TuistEnvKit/Settings/VersionProvider.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Combine -import Foundation -import TSCBasic -import TSCUtility -import TuistSupport - -protocol VersionProviding { - /// Returns the list of versions available on GitHub by parsing the release tags. - /// - Returns: An array of the versions. - func versions() throws -> [Version] - - /// Returns the latest available version - /// - Returns: The latest available version, or `nil` if no versions were found. - func latestVersion() throws -> Version? -} - -class VersionProvider: VersionProviding { - let gitHandler: GitHandling - - init(gitHandler: GitHandling = GitHandler()) { - self.gitHandler = gitHandler - } - - func versions() throws -> [Version] { - try gitHandler.remoteTaggedVersions(url: Constants.gitRepositoryURL) - } - - func latestVersion() throws -> Version? { - try versions().last - } -} diff --git a/Sources/TuistEnvKit/Updater/Updater.swift b/Sources/TuistEnvKit/Updater/Updater.swift deleted file mode 100644 index d0071349a2a..00000000000 --- a/Sources/TuistEnvKit/Updater/Updater.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Foundation -import TuistSupport - -protocol Updating: AnyObject { - func update() throws -} - -final class Updater: Updating { - // MARK: - Attributes - - let versionsController: VersionsControlling - let installer: Installing - let envInstaller: EnvInstalling - let versionProvider: VersionProviding - - // MARK: - Init - - init( - versionsController: VersionsControlling = VersionsController(), - installer: Installing = Installer(), - envInstaller: EnvInstalling = EnvInstaller(), - versionProvider: VersionProviding = VersionProvider() - ) { - self.versionsController = versionsController - self.installer = installer - self.envInstaller = envInstaller - self.versionProvider = versionProvider - } - - // MARK: - Internal - - func update() throws { - guard let highestRemoteVersion = try versionProvider.latestVersion() else { - logger.warning("No remote versions found") - return - } - - if let highestLocalVersion = versionsController.semverVersions().sorted().last { - guard highestRemoteVersion > highestLocalVersion else { - logger.notice("There are no updates available") - return - } - logger.notice("Installing new version available \(highestRemoteVersion)") - } else { - logger.notice("No local versions available. Installing the latest version \(highestRemoteVersion)") - } - - try installer.install(version: highestRemoteVersion.description) - logger.info("Updating tuistenv", metadata: .section) - try envInstaller.install(version: highestRemoteVersion.description) - } -} diff --git a/Sources/TuistEnvKit/Versions/VersionResolver.swift b/Sources/TuistEnvKit/Versions/VersionResolver.swift deleted file mode 100644 index a37d78316b8..00000000000 --- a/Sources/TuistEnvKit/Versions/VersionResolver.swift +++ /dev/null @@ -1,75 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport - -enum ResolvedVersion: Equatable { - case bin(AbsolutePath) - case versionFile(AbsolutePath, String) - case undefined -} - -protocol VersionResolving: AnyObject { - func resolve(path: AbsolutePath) throws -> ResolvedVersion -} - -enum VersionResolverError: FatalError, Equatable { - case readError(path: AbsolutePath) - - var type: ErrorType { - switch self { - case .readError: return .abort - } - } - - var description: String { - switch self { - case let .readError(path): - return "Cannot read the version file at path \(path.pathString)." - } - } -} - -class VersionResolver: VersionResolving { - // MARK: - Attributes - - private let settingsController: SettingsControlling - private let fileManager: FileManager = .default - - // MARK: - Init - - init(settingsController: SettingsControlling = SettingsController()) { - self.settingsController = settingsController - } - - // MARK: - VersionResolving - - func resolve(path: AbsolutePath) throws -> ResolvedVersion { - try resolveTraversing(from: path) - } - - // MARK: - Fileprivate - - private func resolveTraversing(from path: AbsolutePath) throws -> ResolvedVersion { - let versionPath = path.appending(component: Constants.versionFileName) - let binPath = path.appending(component: Constants.binFolderName) - if fileManager.fileExists(atPath: binPath.appending(component: Constants.binName).pathString) { - return .bin(binPath) - } else if fileManager.fileExists(atPath: versionPath.pathString) { - return try resolveVersionFile(path: versionPath) - } - if path.components.count > 1 { - return try resolveTraversing(from: path.parentDirectory) - } - return .undefined - } - - private func resolveVersionFile(path: AbsolutePath) throws -> ResolvedVersion { - var value: String! - do { - value = try String(contentsOf: URL(fileURLWithPath: path.pathString)).trimmingCharacters(in: .whitespacesAndNewlines) - } catch { - throw VersionResolverError.readError(path: path) - } - return ResolvedVersion.versionFile(path, value) - } -} diff --git a/Sources/TuistEnvKit/Versions/VersionsController.swift b/Sources/TuistEnvKit/Versions/VersionsController.swift deleted file mode 100644 index 22849a528f2..00000000000 --- a/Sources/TuistEnvKit/Versions/VersionsController.swift +++ /dev/null @@ -1,76 +0,0 @@ -import Foundation -import TSCBasic -import struct TSCUtility.Version -import TuistSupport - -protocol VersionsControlling: AnyObject { - typealias Installation = (AbsolutePath) throws -> Void - - func install(version: String, installation: Installation) throws - func uninstall(version: String) throws - func path(version: String) throws -> AbsolutePath - func versions() -> [InstalledVersion] - func semverVersions() -> [Version] -} - -enum InstalledVersion: CustomStringConvertible, Equatable { - case semver(Version) - case reference(String) - - var description: String { - switch self { - case let .reference(value): return value - case let .semver(value): return value.description - } - } -} - -class VersionsController: VersionsControlling { - // MARK: - VersionsControlling - - func install(version: String, installation: Installation) throws { - try withTemporaryDirectory { tmpDir in - try installation(tmpDir) - - // Copy only if there's file in the folder - if !tmpDir.glob("*").isEmpty { - let dstPath = path(version: version) - if FileHandler.shared.exists(dstPath) { - try FileHandler.shared.delete(dstPath) - } - try FileHandler.shared.copy(from: tmpDir, to: dstPath) - } - } - } - - func uninstall(version: String) throws { - let path = path(version: version) - if FileHandler.shared.exists(path) { - try FileHandler.shared.delete(path) - } - } - - func path(version: String) -> AbsolutePath { - Environment.shared.versionsDirectory.appending(component: version) - } - - func versions() -> [InstalledVersion] { - Environment.shared.versionsDirectory.glob("*").map { path in - let versionStringValue = path.components.last! - if let version = Version(versionStringValue) { - return InstalledVersion.semver(version) - } else { - return InstalledVersion.reference(versionStringValue) - } - } - } - - func semverVersions() -> [Version] { - versions().compactMap { version in - if case let InstalledVersion.semver(semver) = version { - return semver - } - return nil - }.sorted() - } -} diff --git a/Sources/TuistGenerator/Generator/LinkGenerator.swift b/Sources/TuistGenerator/Generator/LinkGenerator.swift index ec3749ed557..d27c733246d 100644 --- a/Sources/TuistGenerator/Generator/LinkGenerator.swift +++ b/Sources/TuistGenerator/Generator/LinkGenerator.swift @@ -430,7 +430,7 @@ final class LinkGenerator: LinkGenerating { // swiftlint:disable:this type_body_ for dependency in linkableDependencies { switch dependency { - case let .framework(path, _, _, _, _, _, _, _, status, condition): + case let .framework(path, _, _, _, _, _, _, status, condition): try addBuildFile(path, condition: condition, status: status) case let .library(path, _, _, _, condition): try addBuildFile(path, condition: condition) @@ -588,7 +588,7 @@ final class LinkGenerator: LinkGenerating { // swiftlint:disable:this type_body_ buildFile.applyCondition(condition, applicableTo: target) pbxproj.add(object: buildFile) files.append(buildFile) - case let .framework(path: path, _, _, _, _, _, _, _, _, condition), + case let .framework(path: path, _, _, _, _, _, _, _, condition), let .library(path: path, _, _, _, condition): guard let fileRef = fileElements.file(path: path) else { throw LinkGeneratorError.missingReference(path: path) diff --git a/Sources/TuistGenerator/Generator/ProjectFileElements.swift b/Sources/TuistGenerator/Generator/ProjectFileElements.swift index 4c3dcb345dc..522c4a1d848 100644 --- a/Sources/TuistGenerator/Generator/ProjectFileElements.swift +++ b/Sources/TuistGenerator/Generator/ProjectFileElements.swift @@ -225,7 +225,7 @@ class ProjectFileElements { group: filesGroup, sourceRootPath: sourceRootPath ) - case let .framework(path, _, _, _, _, _, _, _, _, _): + case let .framework(path, _, _, _, _, _, _, _, _): try generatePrecompiledDependency( path, groups: groups, @@ -274,7 +274,7 @@ class ProjectFileElements { sourceRootPath: AbsolutePath ) throws { // Pre-compiled artifact from the cache - if path.pathString.contains(CacheCategory.builds.directoryName) { + if path.pathString.contains(CacheCategory.binaries.directoryName) { guard compiled[path] == nil else { return } diff --git a/Sources/TuistGenerator/GraphViz/GraphToGraphVizMapper.swift b/Sources/TuistGenerator/GraphViz/GraphToGraphVizMapper.swift index 71568c2e023..3b2dd5a68e9 100644 --- a/Sources/TuistGenerator/GraphViz/GraphToGraphVizMapper.swift +++ b/Sources/TuistGenerator/GraphViz/GraphToGraphVizMapper.swift @@ -76,7 +76,6 @@ extension GraphDependency { bcsymbolmapPaths: _, linking: _, architectures: _, - isCarthage: _, status: _ ): return path.basenameWithoutExt diff --git a/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift b/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift index 421460d3e37..278e12c0257 100644 --- a/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift +++ b/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift @@ -160,7 +160,7 @@ class StaticProductsGraphLinter: StaticProductsGraphLinting { switch dependency { case let .xcframework(xcframework): return xcframework.linking == .static - case let .framework(_, _, _, _, linking, _, _, _): + case let .framework(_, _, _, _, linking, _, _): return linking == .static case let .library(_, _, linking, _, _): return linking == .static diff --git a/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift b/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift index 99f9bd3f067..c61a8a58dd5 100644 --- a/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift +++ b/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift @@ -22,31 +22,20 @@ public final class AutogeneratedWorkspaceSchemeWorkspaceMapper: WorkspaceMapping let platforms = Set( workspace.projects .flatMap { - $0.targets.flatMap(\.destinations.platforms) + $0.targets.flatMap(\.supportedPlatforms) } ) let schemes: [Scheme] - if platforms.count == 1, let platform = platforms.first { - schemes = [ - scheme( - name: "\(workspace.workspace.name)-Workspace", - platform: platform, - project: project, - workspace: workspace - ), - ] - } else { - schemes = platforms.map { platform in - scheme( - name: "\(workspace.workspace.name)-Workspace-\(platform.caseValue)", - platform: platform, - project: project, - workspace: workspace - ) - } - } + schemes = [ + scheme( + name: "\(workspace.workspace.name)-Workspace", + platforms: platforms, + project: project, + workspace: workspace + ), + ] var workspace = workspace workspace.workspace.schemes.append(contentsOf: schemes) @@ -57,7 +46,7 @@ public final class AutogeneratedWorkspaceSchemeWorkspaceMapper: WorkspaceMapping private func scheme( name: String, - platform: Platform, + platforms: Set, project: Project, workspace: WorkspaceWithProjects ) -> Scheme { @@ -65,10 +54,10 @@ public final class AutogeneratedWorkspaceSchemeWorkspaceMapper: WorkspaceMapping var (targets, testableTargets): ([TargetReference], [TestableTarget]) = workspace.projects .reduce(([], [])) { result, project in let targets = project.targets - .filter { $0.supports(platform) } + .filter { !$0.supportedPlatforms.intersection(platforms).isEmpty } .map { TargetReference(projectPath: project.path, name: $0.name) } let testableTargets = project.targets - .filter { $0.supports(platform) } + .filter { !$0.supportedPlatforms.intersection(platforms).isEmpty } .filter(\.product.testsBundle) .map { TargetReference(projectPath: project.path, name: $0.name) } .map { diff --git a/Sources/TuistGenerator/Templates/AssetsTemplate.swift b/Sources/TuistGenerator/Templates/AssetsTemplate.swift index 89f32a5acde..b572ae90958 100644 --- a/Sources/TuistGenerator/Templates/AssetsTemplate.swift +++ b/Sources/TuistGenerator/Templates/AssetsTemplate.swift @@ -274,21 +274,6 @@ extension SynthesizedResourceInterfaceTemplates { #endif } - {{accessModifier}} extension {{imageType}}.Image { - @available(macOS, deprecated, - message: "This initializer is unsafe on macOS, please use the {{imageType}}.image property") - convenience init?(asset: {{imageType}}) { - #if os(iOS) || os(tvOS) - let bundle = {{bundleToken}}.bundle - self.init(named: asset.name, in: bundle, compatibleWith: nil) - #elseif os(macOS) - self.init(named: NSImage.Name(asset.name)) - #elseif os(watchOS) - self.init(named: asset.name) - #endif - } - } - #if canImport(SwiftUI) @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) {{accessModifier}} extension SwiftUI.Image { diff --git a/Sources/TuistGenerator/Utils/EmbedScriptGenerator.swift b/Sources/TuistGenerator/Utils/EmbedScriptGenerator.swift index a71e6257797..9e375b85b82 100644 --- a/Sources/TuistGenerator/Utils/EmbedScriptGenerator.swift +++ b/Sources/TuistGenerator/Utils/EmbedScriptGenerator.swift @@ -79,7 +79,7 @@ final class EmbedScriptGenerator: EmbedScriptGenerating { for frameworkReference in frameworkReferences { guard case let GraphDependencyReference - .framework(path, _, _, dsymPath, bcsymbolmapPaths, _, _, _, _, _) = frameworkReference + .framework(path, _, dsymPath, bcsymbolmapPaths, _, _, _, _, _) = frameworkReference else { preconditionFailure("references need to be of type framework") break diff --git a/Sources/TuistGraph/Graph/GraphDependency.swift b/Sources/TuistGraph/Graph/GraphDependency.swift index cc5dd70e7db..98d13d6f216 100644 --- a/Sources/TuistGraph/Graph/GraphDependency.swift +++ b/Sources/TuistGraph/Graph/GraphDependency.swift @@ -60,7 +60,6 @@ public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Coda bcsymbolmapPaths: [AbsolutePath], linking: BinaryLinking, architectures: [BinaryArchitecture], - isCarthage: Bool, status: FrameworkStatus ) @@ -94,7 +93,7 @@ public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Coda hasher.combine(path) case let .xcframework(xcframework): hasher.combine(xcframework) - case let .framework(path, _, _, _, _, _, _, _): + case let .framework(path, _, _, _, _, _, _): hasher.combine("framework") hasher.combine(path) case let .library(path, _, _, _, _): @@ -142,7 +141,7 @@ public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Coda case .macro: return false case let .xcframework(xcframework): return xcframework.linking == .static - case let .framework(_, _, _, _, linking, _, _, _), + case let .framework(_, _, _, _, linking, _, _), let .library(_, _, linking, _, _): return linking == .static case .bundle: return false case .packageProduct: return false @@ -159,7 +158,7 @@ public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Coda case .macro: return false case let .xcframework(xcframework): return xcframework.linking == .dynamic - case let .framework(_, _, _, _, linking, _, _, _), + case let .framework(_, _, _, _, linking, _, _), let .library(_, _, linking, _, _): return linking == .dynamic case .bundle: return false case .packageProduct: return false @@ -212,7 +211,7 @@ public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Coda case .macro: return false case let .xcframework(xcframework): return xcframework.linking == .dynamic - case let .framework(_, _, _, _, linking, _, _, _), + case let .framework(_, _, _, _, linking, _, _), let .library(path: _, publicHeaders: _, linking: linking, architectures: _, swiftModuleMap: _): return linking == .dynamic case .bundle: return false @@ -262,7 +261,7 @@ public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Coda return path.basename case let .xcframework(xcframework): return xcframework.path.basename - case let .framework(path, _, _, _, _, _, _, _): + case let .framework(path, _, _, _, _, _, _): return path.basename case let .library(path, _, _, _, _): return path.basename diff --git a/Sources/TuistGraph/Models/Cache.swift b/Sources/TuistGraph/Models/Cache.swift deleted file mode 100644 index 2b7fe559862..00000000000 --- a/Sources/TuistGraph/Models/Cache.swift +++ /dev/null @@ -1,48 +0,0 @@ -import Foundation -import TSCBasic -import struct TSCUtility.Version - -public struct Cache: Equatable, Hashable { - // Warning ⚠️ - // - // If new property is added to a caching profile, - // it must be added to `CacheProfileContentHasher` too. - public struct Profile: Equatable, Hashable, CustomStringConvertible { - public let name: String - public let configuration: String - public let device: String? - public let os: Version? - - public init( - name: String, - configuration: String, - device: String? = nil, - os: Version? = nil - ) { - self.name = name - self.configuration = configuration - self.device = device - self.os = os - } - - public var description: String { - name - } - } - - public let profiles: [Profile] - public let path: AbsolutePath? - - public init(profiles: [Profile], path: AbsolutePath?) { - self.profiles = profiles - self.path = path - } - - public static let `default` = Cache( - profiles: [ - Profile(name: "Development", configuration: "Debug"), - Profile(name: "Release", configuration: "Release"), - ], - path: nil - ) -} diff --git a/Sources/TuistGraph/Models/Cloud.swift b/Sources/TuistGraph/Models/Cloud.swift index 005a1d7f3b5..3a99661b6ff 100644 --- a/Sources/TuistGraph/Models/Cloud.swift +++ b/Sources/TuistGraph/Models/Cloud.swift @@ -4,7 +4,6 @@ import Foundation public struct Cloud: Equatable, Hashable { /// Cloud option. public enum Option: String, Codable, Equatable { - case disableAnalytics case optional } diff --git a/Sources/TuistGraph/Models/Config.swift b/Sources/TuistGraph/Models/Config.swift index 4aeba818d1f..388536439da 100644 --- a/Sources/TuistGraph/Models/Config.swift +++ b/Sources/TuistGraph/Models/Config.swift @@ -16,9 +16,6 @@ public struct Config: Equatable, Hashable { /// Cloud configuration. public let cloud: Cloud? - /// Cache configuration. - public let cache: Cache? - /// The version of Swift that will be used by Tuist. /// If `nil` is passed then Tuist will use the environment’s version. public let swiftVersion: Version? @@ -31,7 +28,6 @@ public struct Config: Equatable, Hashable { Config( compatibleXcodeVersions: .all, cloud: nil, - cache: nil, swiftVersion: nil, plugins: [], generationOptions: .init( @@ -48,7 +44,6 @@ public struct Config: Equatable, Hashable { /// - Parameters: /// - compatibleXcodeVersions: List of Xcode versions the project or set of projects is compatible with. /// - cloud: Cloud configuration. - /// - cache: Cache configuration. /// - swiftVersion: The version of Swift that will be used by Tuist. /// - plugins: List of locations to a `Plugin` manifest. /// - generationOptions: Generation options. @@ -56,7 +51,6 @@ public struct Config: Equatable, Hashable { public init( compatibleXcodeVersions: CompatibleXcodeVersions, cloud: Cloud?, - cache: Cache?, swiftVersion: Version?, plugins: [PluginLocation], generationOptions: GenerationOptions, @@ -64,7 +58,6 @@ public struct Config: Equatable, Hashable { ) { self.compatibleXcodeVersions = compatibleXcodeVersions self.cloud = cloud - self.cache = cache self.swiftVersion = swiftVersion self.plugins = plugins self.generationOptions = generationOptions @@ -76,7 +69,6 @@ public struct Config: Equatable, Hashable { public func hash(into hasher: inout Hasher) { hasher.combine(generationOptions) hasher.combine(cloud) - hasher.combine(cache) hasher.combine(swiftVersion) hasher.combine(compatibleXcodeVersions) } diff --git a/Sources/TuistGraph/Models/Dependencies/CarthageDependencies.swift b/Sources/TuistGraph/Models/Dependencies/CarthageDependencies.swift deleted file mode 100644 index 00e04f038a1..00000000000 --- a/Sources/TuistGraph/Models/Dependencies/CarthageDependencies.swift +++ /dev/null @@ -1,76 +0,0 @@ -import Foundation - -/// Contains descriptions of dependencies to be fetched with Carthage. -public struct CarthageDependencies: Equatable { - /// List of dependencies that can be installed using Carthage. - public let dependencies: [Dependency] - - /// Initializes a new `CarthageDependencies` instance. - /// - Parameters: - /// - dependencies: List of dependencies that can be installed using Carthage. - public init( - _ dependencies: [Dependency] - ) { - self.dependencies = dependencies - } - - /// Returns `Cartfile` representation. - public func cartfileValue() -> String { - dependencies - .map(\.cartfileValue) - .joined(separator: "\n") - } -} - -// MARK: - CarthageDependencies.Dependency - -extension CarthageDependencies { - public enum Dependency: Equatable { - /// GitHub repositories (both GitHub.com and GitHub Enterprise). - case github(path: String, requirement: Requirement) - /// Other Git repositories. - case git(path: String, requirement: Requirement) - /// Dependencies that are only available as compiled binary `.framework`s. - case binary(path: String, requirement: Requirement) - - /// Returns `Cartfile` representation. - public var cartfileValue: String { - switch self { - case let .github(path, requirement): - return #"github "\#(path)" \#(requirement.cartfileValue)"# - case let .git(path, requirement): - return #"git "\#(path)" \#(requirement.cartfileValue)"# - case let .binary(path, requirement): - return #"binary "\#(path)" \#(requirement.cartfileValue)"# - } - } - } -} - -// MARK: - CarthageDependencies.Requirement - -extension CarthageDependencies { - public enum Requirement: Equatable { - case exact(String) - case upToNext(String) - case atLeast(String) - case branch(String) - case revision(String) - - /// Returns `Cartfile` representation. - public var cartfileValue: String { - switch self { - case let .exact(version): - return "== \(version)" - case let .upToNext(version): - return "~> \(version)" - case let .atLeast(version): - return ">= \(version)" - case let .branch(branch): - return #""\#(branch)""# - case let .revision(revision): - return #""\#(revision)""# - } - } - } -} diff --git a/Sources/TuistGraph/Models/Dependencies/Dependencies.swift b/Sources/TuistGraph/Models/Dependencies/Dependencies.swift deleted file mode 100644 index 961dbe07186..00000000000 --- a/Sources/TuistGraph/Models/Dependencies/Dependencies.swift +++ /dev/null @@ -1,17 +0,0 @@ -import Foundation - -public struct Dependencies: Equatable { - public let carthage: CarthageDependencies? - public let swiftPackageManager: SwiftPackageManagerDependencies? - public let platforms: Set - - public init( - carthage: CarthageDependencies?, - swiftPackageManager: SwiftPackageManagerDependencies?, - platforms: Set - ) { - self.carthage = carthage - self.swiftPackageManager = swiftPackageManager - self.platforms = platforms - } -} diff --git a/Sources/TuistGraph/Models/Dependencies/PackageSettings.swift b/Sources/TuistGraph/Models/Dependencies/PackageSettings.swift index 8c0b5479077..bf72e4fa6b9 100644 --- a/Sources/TuistGraph/Models/Dependencies/PackageSettings.swift +++ b/Sources/TuistGraph/Models/Dependencies/PackageSettings.swift @@ -1,4 +1,5 @@ import Foundation +import TSCUtility /// Contains the description of custom SPM settings public struct PackageSettings: Equatable { @@ -14,6 +15,9 @@ public struct PackageSettings: Equatable { /// The custom project options for each project generated from a swift package public let projectOptions: [String: TuistGraph.Project.Options] + /// Swift tools version of the parsed `Package.swift` + public let swiftToolsVersion: Version + /// The custom set of `platforms` that are used by your project public let platforms: Set @@ -28,12 +32,14 @@ public struct PackageSettings: Equatable { baseSettings: Settings, targetSettings: [String: SettingsDictionary], projectOptions: [String: TuistGraph.Project.Options] = [:], + swiftToolsVersion: Version, platforms: Set ) { self.productTypes = productTypes self.baseSettings = baseSettings self.targetSettings = targetSettings self.projectOptions = projectOptions + self.swiftToolsVersion = swiftToolsVersion self.platforms = platforms } } diff --git a/Sources/TuistGraph/Models/DeploymentDevice.swift b/Sources/TuistGraph/Models/DeploymentDevice.swift deleted file mode 100644 index dc43656b280..00000000000 --- a/Sources/TuistGraph/Models/DeploymentDevice.swift +++ /dev/null @@ -1,21 +0,0 @@ -import Foundation - -// MARK: - DeploymentDevice - -public struct DeploymentDevice: OptionSet, Codable, Hashable { - public static let iphone = DeploymentDevice(rawValue: 1 << 0) - public static let ipad = DeploymentDevice(rawValue: 1 << 1) - public static let mac = DeploymentDevice(rawValue: 1 << 2) - public static let vision = DeploymentDevice(rawValue: iphone.rawValue | ipad.rawValue | mac.rawValue) - - public let rawValue: UInt - - public init(rawValue: UInt) { - self.rawValue = rawValue - } - - // All deployment devices. - public static var all: DeploymentDevice { - [.iphone, .ipad, .mac, .vision] - } -} diff --git a/Sources/TuistGraph/Models/DeploymentTarget.swift b/Sources/TuistGraph/Models/DeploymentTarget.swift deleted file mode 100644 index fb4ae0df748..00000000000 --- a/Sources/TuistGraph/Models/DeploymentTarget.swift +++ /dev/null @@ -1,36 +0,0 @@ -import Foundation - -// MARK: - DeploymentTarget - -public enum DeploymentTarget: Hashable, Codable { - case iOS(String) - case macOS(String) - case watchOS(String) - case tvOS(String) - case visionOS(String) - - public var platform: Platform { - switch self { - case .iOS: - return .iOS - case .macOS: - return .macOS - case .tvOS: - return .tvOS - case .visionOS: - return .visionOS - case .watchOS: - return .watchOS - } - } - - public var version: String { - switch self { - case let .iOS(version): return version - case let .macOS(version): return version - case let .watchOS(version): return version - case let .tvOS(version): return version - case let .visionOS(version): return version - } - } -} diff --git a/Sources/TuistGraph/Models/Metadata/FrameworkMetadata.swift b/Sources/TuistGraph/Models/Metadata/FrameworkMetadata.swift index 7b223652fe9..f97de4854a0 100644 --- a/Sources/TuistGraph/Models/Metadata/FrameworkMetadata.swift +++ b/Sources/TuistGraph/Models/Metadata/FrameworkMetadata.swift @@ -9,7 +9,6 @@ public struct FrameworkMetadata: Equatable { public var bcsymbolmapPaths: [AbsolutePath] public var linking: BinaryLinking public var architectures: [BinaryArchitecture] - public var isCarthage: Bool public var status: FrameworkStatus public init( @@ -19,7 +18,6 @@ public struct FrameworkMetadata: Equatable { bcsymbolmapPaths: [AbsolutePath], linking: BinaryLinking, architectures: [BinaryArchitecture], - isCarthage: Bool, status: FrameworkStatus ) { self.path = path @@ -28,7 +26,6 @@ public struct FrameworkMetadata: Equatable { self.bcsymbolmapPaths = bcsymbolmapPaths self.linking = linking self.architectures = architectures - self.isCarthage = isCarthage self.status = status } } diff --git a/Sources/TuistGraph/Models/Platform.swift b/Sources/TuistGraph/Models/Platform.swift index 87c00c41b56..df0208185b1 100644 --- a/Sources/TuistGraph/Models/Platform.swift +++ b/Sources/TuistGraph/Models/Platform.swift @@ -137,14 +137,4 @@ extension Platform { return "Platforms/XROS.platform/Developer/Library" } } - - /// Returns the directory name whose Carthage uses to save frameworks. - public var carthageDirectory: String { - switch self { - case .iOS, .watchOS, .tvOS, .visionOS: - return caseValue - case .macOS: - return "Mac" - } - } } diff --git a/Sources/TuistGraph/Models/Project.swift b/Sources/TuistGraph/Models/Project.swift index 27e91eb8190..eff2f35f510 100644 --- a/Sources/TuistGraph/Models/Project.swift +++ b/Sources/TuistGraph/Models/Project.swift @@ -56,7 +56,7 @@ public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebug /// The version in which a check happened related to recommended settings after updating Xcode. public var lastUpgradeCheck: Version? - /// Indicates whether the project is imported through `Dependencies.swift`. + /// Indicates whether the project is imported through `Package.swift`. public let isExternal: Bool // MARK: - Init @@ -82,7 +82,7 @@ public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebug /// - additionalFiles: The additional files to include in the project /// - resourceSynthesizers: `ResourceSynthesizers` that will be applied on individual target's resources /// - lastUpgradeCheck: The version in which a check happened related to recommended settings after updating Xcode. - /// - isExternal: Indicates whether the project is imported through `Dependencies.swift`. + /// - isExternal: Indicates whether the project is imported through `Package.swift`. public init( path: AbsolutePath, sourceRootPath: AbsolutePath, diff --git a/Sources/TuistGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift b/Sources/TuistGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift index 48cbe8e7922..04fd1bffd02 100644 --- a/Sources/TuistGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift +++ b/Sources/TuistGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift @@ -3,62 +3,6 @@ import TSCBasic import TuistGraph extension DependenciesGraph { - /// A snapshot of `graph.json` file. - public static var testJson: String { - """ - { - "externalDependencies": { - "RxSwift": [ - { - "xcframework": { - "path": "/Tuist/Dependencies/Carthage/RxSwift.xcframework", - "platformFilters": [ - { - "catalyst" : { } - }, - { - "watchos" : { } - }, - { - "ios" : { } - }, - { - "driverkit" : { } - }, - { - "tvos" : { } - }, - { - "macos" : { } - }, - { - "visionos" : { } - } - ], - "status": "required" - } - } - ] - }, - "externalProjects": [] - } - """ - } - - /// A snapshot of `Dependencies.swift` file. - public static var testDependenciesFile: String { - """ - import ProjectDescription - - let dependencies = Dependencies( - carthage: [ - .github(path: "RxSwift/RxSwift", requirement: .exact("5.0.4")), - ], - platforms: [.iOS] - ) - """ - } - public static func test( externalDependencies: [String: [TargetDependency]] = [:], externalProjects: [AbsolutePath: Project] = [:] diff --git a/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift b/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift index 7d190bf3fea..25364742161 100644 --- a/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift +++ b/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift @@ -13,7 +13,6 @@ extension GraphDependency { bcsymbolmapPaths: [AbsolutePath] = [], linking: BinaryLinking = .dynamic, architectures: [BinaryArchitecture] = [.armv7], - isCarthage: Bool = false, status: FrameworkStatus = .required ) -> GraphDependency { GraphDependency.framework( @@ -23,7 +22,6 @@ extension GraphDependency { bcsymbolmapPaths: bcsymbolmapPaths, linking: linking, architectures: architectures, - isCarthage: isCarthage, status: status ) } diff --git a/Sources/TuistGraphTesting/Models/Cache+TestData.swift b/Sources/TuistGraphTesting/Models/Cache+TestData.swift deleted file mode 100644 index 35136bc9add..00000000000 --- a/Sources/TuistGraphTesting/Models/Cache+TestData.swift +++ /dev/null @@ -1,21 +0,0 @@ -import Foundation -import TSCBasic -import struct TSCUtility.Version -@testable import TuistGraph - -extension Cache { - public static func test(profiles: [Cache.Profile] = [Cache.Profile.test()]) -> Cache { - Cache(profiles: profiles, path: nil) - } -} - -extension Cache.Profile { - public static func test( - name: String = "Development", - configuration: String = "Debug", - device: String? = nil, - os: Version? = nil - ) -> Cache.Profile { - Cache.Profile(name: name, configuration: configuration, device: device, os: os) - } -} diff --git a/Sources/TuistGraphTesting/Models/Config+TestData.swift b/Sources/TuistGraphTesting/Models/Config+TestData.swift index ff2174de0ec..ba545fb9b09 100644 --- a/Sources/TuistGraphTesting/Models/Config+TestData.swift +++ b/Sources/TuistGraphTesting/Models/Config+TestData.swift @@ -7,7 +7,6 @@ extension Config { public static func test( compatibleXcodeVersions: CompatibleXcodeVersions = .all, cloud: Cloud? = Cloud.test(), - cache: Cache? = Cache.test(), swiftVersion: Version? = nil, plugins: [PluginLocation] = [], generationOptions: GenerationOptions = Config.default.generationOptions, @@ -16,7 +15,6 @@ extension Config { .init( compatibleXcodeVersions: compatibleXcodeVersions, cloud: cloud, - cache: cache, swiftVersion: swiftVersion, plugins: plugins, generationOptions: generationOptions, diff --git a/Sources/TuistGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift b/Sources/TuistGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift index 267fe16a909..0362e50de37 100644 --- a/Sources/TuistGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift +++ b/Sources/TuistGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift @@ -11,7 +11,6 @@ extension FrameworkMetadata { bcsymbolmapPaths: [AbsolutePath] = [], linking: BinaryLinking = .dynamic, architectures: [BinaryArchitecture] = [.arm64], - isCarthage: Bool = false, status: FrameworkStatus = .required ) -> FrameworkMetadata { FrameworkMetadata( @@ -21,7 +20,6 @@ extension FrameworkMetadata { bcsymbolmapPaths: bcsymbolmapPaths, linking: linking, architectures: architectures, - isCarthage: isCarthage, status: status ) } diff --git a/Sources/TuistGraphTesting/Models/PackageSettings+TestData.swift b/Sources/TuistGraphTesting/Models/PackageSettings+TestData.swift index d2bf60fb758..e7c5571ae52 100644 --- a/Sources/TuistGraphTesting/Models/PackageSettings+TestData.swift +++ b/Sources/TuistGraphTesting/Models/PackageSettings+TestData.swift @@ -1,5 +1,6 @@ import Foundation import TSCBasic +import TSCUtility @testable import TuistGraph extension PackageSettings { @@ -8,6 +9,7 @@ extension PackageSettings { baseSettings: Settings = .test(), targetSettings: [String: SettingsDictionary] = [:], projectOptions: [String: TuistGraph.Project.Options] = [:], + swiftToolsVersion: Version = Version("5.4.9"), platforms: Set = [.iOS] ) -> PackageSettings { PackageSettings( @@ -15,6 +17,7 @@ extension PackageSettings { baseSettings: baseSettings, targetSettings: targetSettings, projectOptions: projectOptions, + swiftToolsVersion: swiftToolsVersion, platforms: platforms ) } diff --git a/Sources/TuistKit/Commands/InitCommand.swift b/Sources/TuistKit/Commands/InitCommand.swift index c88310860a7..46a9d9ff11a 100644 --- a/Sources/TuistKit/Commands/InitCommand.swift +++ b/Sources/TuistKit/Commands/InitCommand.swift @@ -30,14 +30,14 @@ public struct InitCommand: ParsableCommand, HasTrackableParameters { @Option( name: .shortAndLong, - help: "The path to the folder where the project will be generated (Default: Current directory)", + help: "The path to the folder where the project will be generated. (Default: Current directory)", completion: .directory ) var path: String? @Option( name: .shortAndLong, - help: "The name of the project. If it's not passed (Default: Name of the directory)" + help: "The name of the project. (Default: Name of the current directory)" ) var name: String? diff --git a/Sources/TuistKit/Commands/Signing/DecryptCommand.swift b/Sources/TuistKit/Commands/Signing/DecryptCommand.swift deleted file mode 100644 index 1b48126f7c6..00000000000 --- a/Sources/TuistKit/Commands/Signing/DecryptCommand.swift +++ /dev/null @@ -1,27 +0,0 @@ -import ArgumentParser -import Foundation -import TSCBasic -import TuistCore -import TuistSigning -import TuistSupport - -struct DecryptCommand: ParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "decrypt", - _superCommandName: "signing", - abstract: "Decrypts all files in Tuist/Signing directory" - ) - } - - @Option( - name: .shortAndLong, - help: "The path to the folder containing the encrypted certificates", - completion: .directory - ) - var path: String? - - func run() throws { - try DecryptService().run(path: path) - } -} diff --git a/Sources/TuistKit/Commands/Signing/EncryptCommand.swift b/Sources/TuistKit/Commands/Signing/EncryptCommand.swift deleted file mode 100644 index 703445c6890..00000000000 --- a/Sources/TuistKit/Commands/Signing/EncryptCommand.swift +++ /dev/null @@ -1,24 +0,0 @@ -import ArgumentParser -import Foundation -import TSCBasic - -struct EncryptCommand: ParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "encrypt", - _superCommandName: "signing", - abstract: "Encrypts all files in Tuist/Signing directory" - ) - } - - @Option( - name: .shortAndLong, - help: "The path to the folder containing the certificates you would like to encrypt", - completion: .directory - ) - var path: String? - - func run() throws { - try EncryptService().run(path: path) - } -} diff --git a/Sources/TuistKit/Commands/SigningCommand.swift b/Sources/TuistKit/Commands/SigningCommand.swift deleted file mode 100644 index 305fbae89a4..00000000000 --- a/Sources/TuistKit/Commands/SigningCommand.swift +++ /dev/null @@ -1,16 +0,0 @@ -import ArgumentParser -import Foundation -import TSCBasic - -struct SigningCommand: ParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "signing", - abstract: "A set of commands for signing-related operations", - subcommands: [ - EncryptCommand.self, - DecryptCommand.self, - ] - ) - } -} diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index 79e13507190..e1f51474548 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -22,19 +22,12 @@ public struct TuistCommand: AsyncParsableCommand { PluginCommand.self, RunCommand.self, ScaffoldCommand.self, - SigningCommand.self, TestCommand.self, VersionCommand.self, ] ) } - @Flag( - name: [.customLong("help-env")], - help: "Display subcommands to manage the environment tuist versions." - ) - var isTuistEnvHelp: Bool = false - public static func main( _ arguments: [String]? = nil, parseAsRoot: ((_ arguments: [String]?) throws -> ParsableCommand) = Self.parseAsRoot, diff --git a/Sources/TuistKit/Generator/Generator.swift b/Sources/TuistKit/Generator/Generator.swift index d85d75579fd..ec7cdd41e57 100644 --- a/Sources/TuistKit/Generator/Generator.swift +++ b/Sources/TuistKit/Generator/Generator.swift @@ -7,7 +7,6 @@ import TuistGenerator import TuistGraph import TuistLoader import TuistPlugin -import TuistSigning import TuistSupport public protocol Generating { @@ -24,7 +23,6 @@ public class Generator: Generating { private let writer: XcodeProjWriting = XcodeProjWriter() private let swiftPackageManagerInteractor: TuistGenerator.SwiftPackageManagerInteracting = TuistGenerator .SwiftPackageManagerInteractor() - private let signingInteractor: SigningInteracting = SigningInteractor() private let sideEffectDescriptorExecutor: SideEffectDescriptorExecuting private let configLoader: ConfigLoading private let manifestGraphLoader: ManifestGraphLoading @@ -102,7 +100,6 @@ public class Generator: Generating { private func postGenerationActions(graphTraverser: GraphTraversing, workspaceName: String) async throws { let config = try configLoader.loadConfig(path: graphTraverser.path) - lintingIssues.append(contentsOf: try signingInteractor.install(graphTraverser: graphTraverser)) try await swiftPackageManagerInteractor.install( graphTraverser: graphTraverser, workspaceName: workspaceName, diff --git a/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift b/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift index ae61d37184c..8edd8f9a47a 100644 --- a/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift +++ b/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift @@ -4,7 +4,6 @@ import TuistCore import TuistDependencies import TuistGenerator import TuistGraph -import TuistSigning /// The GraphMapperFactorying describes the interface of a factory of graph mappers. /// Methods in the interface map with workflows exposed to the user. diff --git a/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift b/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift index 73ad8f7b4da..d8b07a2a682 100644 --- a/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift +++ b/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift @@ -4,7 +4,6 @@ import TuistCore import TuistGenerator import TuistGraph import TuistLoader -import TuistSigning import TuistSupport /// The protocol describes an interface for getting project mappers. @@ -77,9 +76,6 @@ public final class ProjectMapperFactory: ProjectMapperFactorying { // Template macros mappers.append(IDETemplateMacrosMapper()) - // Signing - mappers.append(SigningMapper()) - return mappers } } diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditor.swift b/Sources/TuistKit/ProjectEditor/ProjectEditor.swift index 8275697272d..ba6f760fb18 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditor.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditor.swift @@ -121,8 +121,7 @@ final class ProjectEditor: ProjectEditing { } let pathsToExclude = [ - "**/\(Constants.tuistDirectoryName)/\(Constants.DependenciesDirectory.name)/**", - "**/\(Constants.DependenciesDirectory.packageBuildDirectoryName)/**", + "**/\(Constants.SwiftPackageManager.packageBuildDirectoryName)/**", ] + tuistIgnoreEntries let projectDescriptionPath = try resourceLocator.projectDescription() @@ -132,11 +131,10 @@ final class ProjectEditor: ProjectEditing { onlyCurrentDirectory: onlyCurrentDirectory ) let configPath = manifestFilesLocator.locateConfig(at: editingPath) - let cacheDirectory = try cacheDirectoryProviderFactory.cacheDirectories(config: nil) + let cacheDirectory = try cacheDirectoryProviderFactory.cacheDirectories() let projectDescriptionHelpersBuilder = projectDescriptionHelpersBuilderFactory.projectDescriptionHelpersBuilder( cacheDirectory: cacheDirectory.cacheDirectory(for: .projectDescriptionHelpers) ) - let dependenciesPath = manifestFilesLocator.locateDependencies(at: editingPath) let packageManifestPath = manifestFilesLocator.locatePackageManifest(at: editingPath) let helpers = helpersDirectoryLocator.locate(at: editingPath).map { @@ -192,7 +190,6 @@ final class ProjectEditor: ProjectEditing { sourceRootPath: editingPath, destinationDirectory: destinationDirectory, configPath: configPath, - dependenciesPath: dependenciesPath, packageManifestPath: packageManifestPath, projectManifests: projectManifests.map(\.path), editablePluginManifests: editablePluginManifests, diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift index 341f597c266..5c8e672d22e 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift @@ -12,7 +12,6 @@ protocol ProjectEditorMapping: AnyObject { sourceRootPath: AbsolutePath, destinationDirectory: AbsolutePath, configPath: AbsolutePath?, - dependenciesPath: AbsolutePath?, packageManifestPath: AbsolutePath?, projectManifests: [AbsolutePath], editablePluginManifests: [EditablePluginManifest], @@ -43,7 +42,6 @@ final class ProjectEditorMapper: ProjectEditorMapping { sourceRootPath: AbsolutePath, destinationDirectory: AbsolutePath, configPath: AbsolutePath?, - dependenciesPath: AbsolutePath?, packageManifestPath: AbsolutePath?, projectManifests: [AbsolutePath], editablePluginManifests: [EditablePluginManifest], @@ -79,7 +77,6 @@ final class ProjectEditorMapper: ProjectEditorMapping { resourceSynthesizers: resourceSynthesizers, stencils: stencils, configPath: configPath, - dependenciesPath: dependenciesPath, packageManifestPath: packageManifestPath, editablePluginTargets: editablePluginManifests.map(\.name), pluginProjectDescriptionHelpersModule: pluginProjectDescriptionHelpersModule @@ -156,7 +153,6 @@ final class ProjectEditorMapper: ProjectEditorMapping { resourceSynthesizers: [AbsolutePath], stencils: [AbsolutePath], configPath: AbsolutePath?, - dependenciesPath: AbsolutePath?, packageManifestPath: AbsolutePath?, editablePluginTargets: [String], pluginProjectDescriptionHelpersModule: [ProjectDescriptionHelpersModule] @@ -247,17 +243,6 @@ final class ProjectEditorMapper: ProjectEditorMapping { let helperTargetDependencies = helpersTarget.map { [TargetDependency.target(name: $0.name)] } ?? [] let helperAndPluginDependencies = helperTargetDependencies + editablePluginTargetDependencies - let dependenciesTarget: Target? = { - guard let dependenciesPath else { return nil } - return editorHelperTarget( - name: "Dependencies", - filesGroup: manifestsFilesGroup, - targetSettings: targetWithLinkedPluginsSettings, - sourcePaths: [dependenciesPath], - dependencies: helperAndPluginDependencies - ) - }() - let packagesTarget: Target? = try { guard let packageManifestPath, let xcode = try XcodeController.shared.selected() @@ -280,7 +265,14 @@ final class ProjectEditorMapper: ProjectEditorMapping { "\(xcode.path.pathString)/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/pm/ManifestAPI", ]), ], - uniquingKeysWith: { $1 } + uniquingKeysWith: { + switch ($0, $1) { + case let (.array(leftArray), .array(rightArray)): + return SettingValue.array(leftArray + rightArray) + default: + return $1 + } + } ) let dependencies: [TargetDependency] = helpersTarget == nil ? [] : [ @@ -316,7 +308,6 @@ final class ProjectEditorMapper: ProjectEditorMapping { resourceSynthesizersTarget, stencilsTarget, configTarget, - dependenciesTarget, packagesTarget, ] .compactMap { $0 } diff --git a/Sources/TuistKit/Services/CleanService.swift b/Sources/TuistKit/Services/CleanService.swift index 860dcbe9b9b..ff9e14a9fc2 100644 --- a/Sources/TuistKit/Services/CleanService.swift +++ b/Sources/TuistKit/Services/CleanService.swift @@ -20,9 +20,7 @@ final class CleanService { let path: AbsolutePath = try self.path(path) let manifestLoaderFactory = ManifestLoaderFactory() let manifestLoader = manifestLoaderFactory.createManifestLoader() - let configLoader = ConfigLoader(manifestLoader: manifestLoader) - let config = try configLoader.loadConfig(path: path) - let cacheDirectoryProvider = try cacheDirectoryProviderFactory.cacheDirectories(config: config) + let cacheDirectoryProvider = try cacheDirectoryProviderFactory.cacheDirectories() for category in categories { switch category { @@ -59,18 +57,15 @@ final class CleanService { } private func cleanDependencies(at path: AbsolutePath) throws { - let dependenciesPath = path.appending(components: [Constants.tuistDirectoryName, Constants.DependenciesDirectory.name]) - if FileHandler.shared.exists(dependenciesPath) { - let carthagePath = dependenciesPath.appending(component: Constants.DependenciesDirectory.carthageDirectoryName) - if FileHandler.shared.exists(carthagePath) { - try FileHandler.shared.delete(carthagePath) - } - - let spmPath = dependenciesPath.appending(component: Constants.DependenciesDirectory.swiftPackageManagerDirectoryName) - if FileHandler.shared.exists(spmPath) { - try FileHandler.shared.delete(spmPath) - } + let swiftPackageManagerBuildPath = path.appending( + components: Constants.tuistDirectoryName, Constants.SwiftPackageManager.packageBuildDirectoryName + ) + if FileHandler.shared.exists(swiftPackageManagerBuildPath) { + try FileHandler.shared.delete(swiftPackageManagerBuildPath) } - logger.info("Successfully cleaned dependencies at path \(dependenciesPath.pathString)", metadata: .success) + logger.info( + "Successfully cleaned Swift Package Manager dependencies at path \(swiftPackageManagerBuildPath.pathString)", + metadata: .success + ) } } diff --git a/Sources/TuistKit/Services/DecryptService.swift b/Sources/TuistKit/Services/DecryptService.swift deleted file mode 100644 index 641e8005764..00000000000 --- a/Sources/TuistKit/Services/DecryptService.swift +++ /dev/null @@ -1,29 +0,0 @@ -import Foundation -import TSCBasic -import TuistCore -import TuistSigning -import TuistSupport - -final class DecryptService { - private let signingCipher: SigningCiphering - - init(signingCipher: SigningCiphering = SigningCipher()) { - self.signingCipher = signingCipher - } - - func run(path: String?) throws { - let path = try self.path(path) - try signingCipher.decryptSigning(at: path, keepFiles: false) - logger.notice("Successfully decrypted all signing files", metadata: .success) - } - - // MARK: - Helpers - - private func path(_ path: String?) throws -> AbsolutePath { - if let path { - return try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) - } else { - return FileHandler.shared.currentPath - } - } -} diff --git a/Sources/TuistKit/Services/DumpService.swift b/Sources/TuistKit/Services/DumpService.swift index e127e79f447..db49c264cc2 100644 --- a/Sources/TuistKit/Services/DumpService.swift +++ b/Sources/TuistKit/Services/DumpService.swift @@ -37,10 +37,10 @@ final class DumpService { encoded = try manifestLoader.loadConfig(at: projectPath.appending(component: Constants.tuistDirectoryName)) case .template: encoded = try manifestLoader.loadTemplate(at: projectPath) - case .dependencies: - encoded = try manifestLoader.loadDependencies(at: projectPath) case .plugin: encoded = try manifestLoader.loadPlugin(at: projectPath) + case .package: + encoded = try manifestLoader.loadPackageSettings(at: projectPath) } let json: JSON = try encoded.toJSON() @@ -53,6 +53,6 @@ enum DumpableManifest: String, CaseIterable { case workspace case config case template - case dependencies case plugin + case package } diff --git a/Sources/TuistKit/Services/EncryptService.swift b/Sources/TuistKit/Services/EncryptService.swift deleted file mode 100644 index a39e333f18c..00000000000 --- a/Sources/TuistKit/Services/EncryptService.swift +++ /dev/null @@ -1,30 +0,0 @@ -import Foundation -import TSCBasic -import TuistCore -import TuistSigning -import TuistSupport - -final class EncryptService { - private let signingCipher: SigningCiphering - - init(signingCipher: SigningCiphering = SigningCipher()) { - self.signingCipher = signingCipher - } - - func run(path: String?) throws { - let path = try self.path(path) - try signingCipher.encryptSigning(at: path, keepFiles: false) - - logger.notice("Successfully encrypted all signing files", metadata: .success) - } - - // MARK: - Helpers - - private func path(_ path: String?) throws -> AbsolutePath { - if let path { - return try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) - } else { - return FileHandler.shared.currentPath - } - } -} diff --git a/Sources/TuistKit/Services/FetchService.swift b/Sources/TuistKit/Services/FetchService.swift index ffc7ce08f43..c759b5b8e5f 100644 --- a/Sources/TuistKit/Services/FetchService.swift +++ b/Sources/TuistKit/Services/FetchService.swift @@ -10,33 +10,18 @@ import TuistSupport final class FetchService { private let pluginService: PluginServicing private let configLoader: ConfigLoading - private let manifestLoader: ManifestLoading - private let dependenciesController: DependenciesControlling - private let dependenciesModelLoader: DependenciesModelLoading - private let packageSettingsLoader: PackageSettingsLoading - private let converter: ManifestModelConverting - private let rootDirectoryLocator: RootDirectoryLocating + private let swiftPackageManagerController: SwiftPackageManagerControlling private let fileHandler: FileHandling init( pluginService: PluginServicing = PluginService(), configLoader: ConfigLoading = ConfigLoader(manifestLoader: CachedManifestLoader()), - manifestLoader: ManifestLoading = ManifestLoader(), - dependenciesController: DependenciesControlling = DependenciesController(), - dependenciesModelLoader: DependenciesModelLoading = DependenciesModelLoader(), - packageSettingsLoader: PackageSettingsLoading = PackageSettingsLoader(), - converter: ManifestModelConverting = ManifestModelConverter(), - rootDirectoryLocator: RootDirectoryLocating = RootDirectoryLocator(), + swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController(), fileHandler: FileHandling = FileHandler.shared ) { self.pluginService = pluginService self.configLoader = configLoader - self.manifestLoader = manifestLoader - self.dependenciesController = dependenciesController - self.dependenciesModelLoader = dependenciesModelLoader - self.packageSettingsLoader = packageSettingsLoader - self.converter = converter - self.rootDirectoryLocator = rootDirectoryLocator + self.swiftPackageManagerController = swiftPackageManagerController self.fileHandler = fileHandler } @@ -44,124 +29,49 @@ final class FetchService { path: String?, update: Bool ) async throws { - let path = try locateDependencies(at: path) - try await fetchDependencies(path: path, update: update, with: fetchPlugins(path: path)) - } - - // MARK: - Helpers - - public func locateDependencies(at path: String?) throws -> AbsolutePath { - // Convert to AbsolutePath let path = try self.path(path) - // If the Dependencies.swift file exists in the root Tuist directory, we load it from there - if let rootDirectoryPath = rootDirectoryLocator.locate(from: path) { - if fileHandler.exists( - rootDirectoryPath.appending(components: Constants.tuistDirectoryName, Manifest.dependencies.fileName(path)) - ) { - return rootDirectoryPath - } - } - - // Otherwise return the original path - return path + try await fetchPlugins(path: path) + try fetchDependencies(path: path, update: update) } + // MARK: - Helpers + private func path(_ path: String?) throws -> AbsolutePath { if let path { - return try AbsolutePath(validating: path, relativeTo: currentPath) + return try AbsolutePath(validating: path, relativeTo: fileHandler.currentPath) } else { - return currentPath + return fileHandler.currentPath } } - private var currentPath: AbsolutePath { - fileHandler.currentPath - } - - private func fetchPlugins(path: AbsolutePath) async throws -> TuistGraph.Plugins { + private func fetchPlugins(path: AbsolutePath) async throws { logger.info("Resolving and fetching plugins.", metadata: .section) let config = try configLoader.loadConfig(path: path) - let plugins = try await pluginService.loadPlugins(using: config) + _ = try await pluginService.loadPlugins(using: config) logger.info("Plugins resolved and fetched successfully.", metadata: .success) - - return plugins } - private func fetchDependencies(path: AbsolutePath, update: Bool, with plugins: TuistGraph.Plugins) throws { - try manifestLoader.validateHasProjectOrWorkspaceManifest(at: path) - - let dependenciesManifestPath = path.appending( - components: Constants.tuistDirectoryName, - Manifest.dependencies.fileName(path) - ) + private func fetchDependencies(path: AbsolutePath, update: Bool) throws { let packageManifestPath = path.appending( components: Constants.tuistDirectoryName, - Constants.DependenciesDirectory.packageSwiftName + Constants.SwiftPackageManager.packageSwiftName ) - guard fileHandler.exists(dependenciesManifestPath) || fileHandler.exists(packageManifestPath) else { + guard fileHandler.exists(packageManifestPath) else { return } if update { logger.info("Updating dependencies.", metadata: .section) - } else { - logger.info("Resolving and fetching dependencies.", metadata: .section) - } - - let config = try configLoader.loadConfig(path: path) - let swiftVersion = config.swiftVersion - - let dependenciesManifest: TuistCore.DependenciesGraph - if fileHandler.exists(dependenciesManifestPath) { - let dependencies = try dependenciesModelLoader.loadDependencies(at: path, with: plugins) - - if update { - dependenciesManifest = try dependenciesController.update( - at: path, - dependencies: dependencies, - swiftVersion: swiftVersion - ) - } else { - dependenciesManifest = try dependenciesController.fetch( - at: path, - dependencies: dependencies, - swiftVersion: swiftVersion - ) - } + try swiftPackageManagerController.update(at: packageManifestPath.parentDirectory, printOutput: true) } else { - let packageSettings = try packageSettingsLoader.loadPackageSettings(at: path, with: plugins) - - if update { - dependenciesManifest = try dependenciesController.update( - at: path, - packageSettings: packageSettings, - swiftVersion: swiftVersion - ) - } else { - dependenciesManifest = try dependenciesController.fetch( - at: path, - packageSettings: packageSettings, - swiftVersion: swiftVersion - ) - } - } - - let dependenciesGraph = try converter.convert(manifest: dependenciesManifest, path: path) - - try dependenciesController.save( - dependenciesGraph: dependenciesGraph, - to: path - ) + logger.info("Resolving and fetching dependencies.", metadata: .section) - if update { - logger.info("Dependencies updated successfully.", metadata: .success) - } else { - logger.info("Dependencies resolved and fetched successfully.", metadata: .success) + try swiftPackageManagerController.resolve(at: packageManifestPath.parentDirectory, printOutput: true) } } } diff --git a/Sources/TuistKit/Services/InitService.swift b/Sources/TuistKit/Services/InitService.swift index bd19b84ecaa..d864bce130d 100644 --- a/Sources/TuistKit/Services/InitService.swift +++ b/Sources/TuistKit/Services/InitService.swift @@ -149,7 +149,14 @@ class InitService { ) } - logger.notice("Project generated at path \(path.pathString).", metadata: .success) + logger.notice( + "Project generated at path \(path.pathString). Run `tuist generate` to generate the project and open it in Xcode. Use `tuist edit` to easily update the Tuist project definition.", + metadata: .success + ) + logger + .info( + "To learn more about tuist features, such as how to add external dependencies or how to use our ProjectDescription helpers, head to our tutorials page: https://docs.tuist.io/tutorials/tuist-tutorials" + ) } // MARK: - Helpers diff --git a/Sources/TuistKit/Utils/ManifestGraphLoader.swift b/Sources/TuistKit/Utils/ManifestGraphLoader.swift index ec17c152e10..09acc9c7cbd 100644 --- a/Sources/TuistKit/Utils/ManifestGraphLoader.swift +++ b/Sources/TuistKit/Utils/ManifestGraphLoader.swift @@ -30,7 +30,7 @@ public final class ManifestGraphLoader: ManifestGraphLoading { private let converter: ManifestModelConverting private let graphLoader: GraphLoading private let pluginsService: PluginServicing - private let dependenciesGraphController: DependenciesGraphControlling + private let swiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoading private let graphLoaderLinter: CircularDependencyLinting private let manifestLinter: ManifestLinting private let workspaceMapper: WorkspaceMapping @@ -50,7 +50,7 @@ public final class ManifestGraphLoader: ManifestGraphLoading { ), graphLoader: GraphLoader(), pluginsService: PluginService(manifestLoader: manifestLoader), - dependenciesGraphController: DependenciesGraphController(), + swiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoader(manifestLoader: manifestLoader), graphLoaderLinter: CircularDependencyLinter(), manifestLinter: ManifestLinter(), workspaceMapper: workspaceMapper, @@ -65,7 +65,7 @@ public final class ManifestGraphLoader: ManifestGraphLoading { converter: ManifestModelConverting, graphLoader: GraphLoading, pluginsService: PluginServicing, - dependenciesGraphController: DependenciesGraphControlling, + swiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoading, graphLoaderLinter: CircularDependencyLinting, manifestLinter: ManifestLinting, workspaceMapper: WorkspaceMapping, @@ -77,7 +77,7 @@ public final class ManifestGraphLoader: ManifestGraphLoading { self.converter = converter self.graphLoader = graphLoader self.pluginsService = pluginsService - self.dependenciesGraphController = dependenciesGraphController + self.swiftPackageManagerGraphLoader = swiftPackageManagerGraphLoader self.graphLoaderLinter = graphLoaderLinter self.manifestLinter = manifestLinter self.workspaceMapper = workspaceMapper @@ -92,7 +92,13 @@ public final class ManifestGraphLoader: ManifestGraphLoading { let plugins = try await loadPlugins(at: path) // Load DependenciesGraph - let dependenciesGraph = try dependenciesGraphController.load(at: path) + let dependenciesGraph = try converter.convert( + manifest: try swiftPackageManagerGraphLoader.load( + at: path, + plugins: plugins + ), + path: path + ) let allManifests = try recursiveManifestLoader.loadWorkspace(at: path) let (workspaceModels, manifestProjects) = ( diff --git a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift index 53f16547022..c2a11ee5e7a 100644 --- a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift @@ -60,8 +60,7 @@ public class CachedManifestLoader: ManifestLoading { public func loadConfig(at path: AbsolutePath) throws -> ProjectDescription.Config { try load(manifest: .config, at: path) { let projectDescriptionConfig = try manifestLoader.loadConfig(at: path) - let config = try TuistGraph.Config.from(manifest: projectDescriptionConfig, at: path) - cacheDirectory = try cacheDirectoryProviderFactory.cacheDirectories(config: config).cacheDirectory(for: .manifests) + cacheDirectory = try cacheDirectoryProviderFactory.cacheDirectories().cacheDirectory(for: .manifests) return projectDescriptionConfig } } @@ -90,12 +89,16 @@ public class CachedManifestLoader: ManifestLoading { } } - public func loadDependencies(at path: AbsolutePath) throws -> Dependencies { - try manifestLoader.loadDependencies(at: path) + public func loadPackageSettings(at path: AbsolutePath) throws -> PackageSettings { + try load(manifest: .packageSettings, at: path.appending(components: Constants.tuistDirectoryName)) { + try manifestLoader.loadPackageSettings(at: path) + } } - public func loadPackageSettings(at path: AbsolutePath) throws -> PackageSettings { - try manifestLoader.loadPackageSettings(at: path) + public func loadPackage(at path: AbsolutePath) throws -> PackageInfo { + try load(manifest: .package, at: path) { + try manifestLoader.loadPackage(at: path) + } } public func manifests(at path: AbsolutePath) -> Set { @@ -115,7 +118,7 @@ public class CachedManifestLoader: ManifestLoading { private func load(manifest: Manifest, at path: AbsolutePath, loader: () throws -> T) throws -> T { if cacheDirectory == nil { - cacheDirectory = try cacheDirectoryProviderFactory.cacheDirectories(config: nil).cacheDirectory(for: .manifests) + cacheDirectory = try cacheDirectoryProviderFactory.cacheDirectories().cacheDirectory(for: .manifests) } let manifestPath = path.appending(component: manifest.fileName(path)) diff --git a/Sources/TuistLoader/Loaders/DependenciesModelLoader.swift b/Sources/TuistLoader/Loaders/DependenciesModelLoader.swift deleted file mode 100644 index e22f9ecb636..00000000000 --- a/Sources/TuistLoader/Loaders/DependenciesModelLoader.swift +++ /dev/null @@ -1,35 +0,0 @@ -import Foundation -import ProjectDescription -import TSCBasic -import TuistCore -import TuistGraph -import TuistSupport - -/// Entity responsible for providing dependencies model. -public protocol DependenciesModelLoading { - /// Load the Dependencies model at the specified path. - /// - Parameter path: The absolute path for the dependency models to load. - /// - Parameter plugins: The plugins for the dependency models to load. - /// - Returns: The Dependencies loaded from the specified path. - /// - Throws: Error encountered during the loading process (e.g. Missing Dependencies file). - func loadDependencies(at path: AbsolutePath, with plugins: Plugins) throws -> TuistGraph.Dependencies -} - -public class DependenciesModelLoader: DependenciesModelLoading { - private let manifestLoader: ManifestLoading - - public init(manifestLoader: ManifestLoading = ManifestLoader()) { - self.manifestLoader = manifestLoader - } - - public func loadDependencies(at path: AbsolutePath, with plugins: Plugins) throws -> TuistGraph.Dependencies { - try manifestLoader.register(plugins: plugins) - let manifest = try manifestLoader.loadDependencies(at: path) - let generatorPaths = GeneratorPaths(manifestDirectory: path) - - return try TuistGraph.Dependencies.from( - manifest: manifest, - generatorPaths: generatorPaths - ) - } -} diff --git a/Sources/TuistLoader/Loaders/ManifestLoader.swift b/Sources/TuistLoader/Loaders/ManifestLoader.swift index 3e48d8c4c1c..aedacda8397 100644 --- a/Sources/TuistLoader/Loaders/ManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/ManifestLoader.swift @@ -70,15 +70,14 @@ public protocol ManifestLoading { /// - Parameter path: Path to the directory that contains the name_of_template.swift func loadTemplate(at path: AbsolutePath) throws -> ProjectDescription.Template - /// Loads the Dependencies.swift in the given directory - /// - Parameters: - /// - Parameter path: Path to the directory that contains the Package.swift - func loadDependencies(at path: AbsolutePath) throws -> ProjectDescription.Dependencies - /// Loads the `PackageSettings` from `Package.swift` in the given directory - /// - path: Path to the directory that contains Dependencies.swift + /// - path: Path to the directory that contains Package.swift func loadPackageSettings(at path: AbsolutePath) throws -> ProjectDescription.PackageSettings + /// Loads `Package.swift` + /// - path: Path to the directory that contains Package.swift + func loadPackage(at path: AbsolutePath) throws -> PackageInfo + /// Loads the Plugin.swift in the given directory. /// - Parameter path: Path to the directory that contains Plugin.swift func loadPlugin(at path: AbsolutePath) throws -> ProjectDescription.Plugin @@ -173,15 +172,16 @@ public class ManifestLoader: ManifestLoading { try loadManifest(.template, at: path) } - public func loadDependencies(at path: AbsolutePath) throws -> ProjectDescription.Dependencies { - let dependencyPath = path.appending(components: Constants.tuistDirectoryName) - return try loadManifest(.dependencies, at: dependencyPath) + public func loadPackage(at path: AbsolutePath) throws -> PackageInfo { + try swiftPackageManagerController.loadPackageInfo( + at: path + ) } public func loadPackageSettings(at path: AbsolutePath) throws -> ProjectDescription.PackageSettings { let packageManifestPath = path.appending(components: Constants.tuistDirectoryName) do { - return try loadManifest(.package, at: packageManifestPath) + return try loadManifest(.packageSettings, at: packageManifestPath) } catch let error as ManifestLoaderError { switch error { case let .manifestLoadingFailed(path: _, data: data, context: _): @@ -338,11 +338,11 @@ public class ManifestLoader: ManifestLoading { switch manifest { case .config, .plugin, - .dependencies, .project, .template, .workspace, - .package: + .package, + .packageSettings: frameworkName = "ProjectDescription" } var arguments = [ @@ -356,18 +356,17 @@ public class ManifestLoader: ManifestLoading { "-framework", frameworkName, ] let projectDescriptionHelpersCacheDirectory = try cacheDirectoryProviderFactory - .cacheDirectories(config: nil) + .cacheDirectories() .cacheDirectory(for: .projectDescriptionHelpers) let projectDescriptionHelperArguments: [String] = try { switch manifest { - case .config, .plugin: + case .config, .plugin, .package: return [] - case .dependencies, - .project, + case .project, .template, .workspace, - .package: + .packageSettings: return try projectDescriptionHelpersBuilderFactory.projectDescriptionHelpersBuilder( cacheDirectory: projectDescriptionHelpersCacheDirectory ) @@ -385,7 +384,7 @@ public class ManifestLoader: ManifestLoading { }() let packageDescriptionArguments: [String] = try { - if case .package = manifest { + if case .packageSettings = manifest { guard let xcode = try xcodeController.selected() else { return [] } let packageVersion = try swiftPackageManagerController.getToolsVersion( at: path.parentDirectory diff --git a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift index 2b733d0ea3c..5685407cd3b 100644 --- a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift +++ b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift @@ -1,6 +1,7 @@ import Foundation import ProjectDescription import TSCBasic +import TSCUtility import TuistCore import TuistGraph import TuistSupport @@ -16,19 +17,35 @@ public protocol PackageSettingsLoading { public final class PackageSettingsLoader: PackageSettingsLoading { private let manifestLoader: ManifestLoading + private let swiftPackageManagerController: SwiftPackageManagerControlling + private let rootDirectoryLocator: RootDirectoryLocating + private let fileHandler: FileHandling - public init(manifestLoader: ManifestLoading = ManifestLoader()) { + public init( + manifestLoader: ManifestLoading = ManifestLoader(), + swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController(), + rootDirectoryLocator: RootDirectoryLocating = RootDirectoryLocator(), + fileHandler: FileHandling = FileHandler.shared + ) { self.manifestLoader = manifestLoader + self.swiftPackageManagerController = swiftPackageManagerController + self.rootDirectoryLocator = rootDirectoryLocator + self.fileHandler = fileHandler } public func loadPackageSettings(at path: AbsolutePath, with plugins: Plugins) throws -> TuistGraph.PackageSettings { + let path = rootDirectoryLocator.locate(from: path) ?? path try manifestLoader.register(plugins: plugins) let manifest = try manifestLoader.loadPackageSettings(at: path) let generatorPaths = GeneratorPaths(manifestDirectory: path) + let swiftToolsVersion = try swiftPackageManagerController.getToolsVersion( + at: path.appending(component: Constants.tuistDirectoryName) + ) return try TuistGraph.PackageSettings.from( manifest: manifest, - generatorPaths: generatorPaths + generatorPaths: generatorPaths, + swiftToolsVersion: swiftToolsVersion ) } } diff --git a/Sources/TuistDependencies/SwiftPackageManager/Utils/SwiftPackageManagerGraphGenerator.swift b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift similarity index 72% rename from Sources/TuistDependencies/SwiftPackageManager/Utils/SwiftPackageManagerGraphGenerator.swift rename to Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift index 22f03e3577d..6a3a899956e 100644 --- a/Sources/TuistDependencies/SwiftPackageManager/Utils/SwiftPackageManagerGraphGenerator.swift +++ b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift @@ -35,50 +35,65 @@ enum SwiftPackageManagerGraphGeneratorError: FatalError, Equatable { // MARK: - Swift Package Manager Graph Generator -/// A protocol that defines an interface to generate the `DependenciesGraph` for the `SwiftPackageManager` dependencies. -public protocol SwiftPackageManagerGraphGenerating { +/// A protocol that defines an interface to load the `DependenciesGraph` for the `SwiftPackageManager` dependencies. +public protocol SwiftPackageManagerGraphLoading { /// Generates the `DependenciesGraph` for the `SwiftPackageManager` dependencies. /// - Parameter path: The path to the directory that contains the `checkouts` directory where `SwiftPackageManager` installed /// dependencies. - /// - Parameter productTypes: The custom `Product` types to be used for SPM targets. - /// - Parameter platforms: The supported platforms. - /// - Parameter baseSettings: base `Settings` for targets. - /// - Parameter targetSettings: `SettingsDictionary` overrides for targets. - /// - Parameter swiftToolsVersion: The version of Swift tools that will be used to generate dependencies. - /// - Parameter projectOptions: The custom configurations for generated projects. - func generate( + func load( at path: AbsolutePath, - productTypes: [String: TuistGraph.Product], - platforms: Set, - baseSettings: TuistGraph.Settings, - targetSettings: [String: TuistGraph.SettingsDictionary], - swiftToolsVersion: TSCUtility.Version?, - projectOptions: [String: TuistGraph.Project.Options] + plugins: Plugins ) throws -> TuistCore.DependenciesGraph } -public final class SwiftPackageManagerGraphGenerator: SwiftPackageManagerGraphGenerating { +public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoading { private let swiftPackageManagerController: SwiftPackageManagerControlling private let packageInfoMapper: PackageInfoMapping + private let manifestLoader: ManifestLoading + private let fileHandler: FileHandling + private let packageSettingsLoader: PackageSettingsLoading + + public convenience init( + manifestLoader: ManifestLoading + ) { + self.init( + packageSettingsLoader: PackageSettingsLoader(manifestLoader: manifestLoader) + ) + } public init( swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController(), - packageInfoMapper: PackageInfoMapping = PackageInfoMapper() + packageInfoMapper: PackageInfoMapping = PackageInfoMapper(), + manifestLoader: ManifestLoading = ManifestLoader(), + fileHandler: FileHandling = FileHandler.shared, + packageSettingsLoader: PackageSettingsLoading = PackageSettingsLoader() ) { self.swiftPackageManagerController = swiftPackageManagerController self.packageInfoMapper = packageInfoMapper + self.manifestLoader = manifestLoader + self.fileHandler = fileHandler + self.packageSettingsLoader = packageSettingsLoader } // swiftlint:disable:next function_body_length - public func generate( + public func load( at path: AbsolutePath, - productTypes: [String: TuistGraph.Product], - platforms: Set, - baseSettings: TuistGraph.Settings, - targetSettings: [String: TuistGraph.SettingsDictionary], - swiftToolsVersion: TSCUtility.Version?, - projectOptions: [String: TuistGraph.Project.Options] + plugins: Plugins ) throws -> TuistCore.DependenciesGraph { + guard fileHandler.exists( + path.appending(components: Constants.tuistDirectoryName, Constants.SwiftPackageManager.packageSwiftName) + ) else { + return .none + } + + let packageSettings = try packageSettingsLoader.loadPackageSettings(at: path, with: plugins) + + let path = path.appending( + components: [ + Constants.tuistDirectoryName, + Constants.SwiftPackageManager.packageBuildDirectoryName, + ] + ) let checkoutsFolder = path.appending(component: "checkouts") let workspacePath = path.appending(component: "workspace-state.json") @@ -107,7 +122,7 @@ public final class SwiftPackageManagerGraphGenerator: SwiftPackageManagerGraphGe throw SwiftPackageManagerGraphGeneratorError.unsupportedDependencyKind(dependency.packageRef.kind) } - let packageInfo = try swiftPackageManagerController.loadPackageInfo(at: packageFolder) + let packageInfo = try manifestLoader.loadPackage(at: packageFolder) let targetToArtifactPaths = try workspaceState.object.artifacts .filter { $0.packageRef.identity == dependency.packageRef.identity } .reduce(into: [:]) { result, artifact in @@ -138,22 +153,23 @@ public final class SwiftPackageManagerGraphGenerator: SwiftPackageManagerGraphGe packageToTargetsToArtifactPaths: packageToTargetsToArtifactPaths ) - let destinations: ProjectDescription.Destinations = Set(platforms.flatMap { platform -> ProjectDescription.Destinations in - switch platform { - case .iOS: - [.iPhone, .iPad, .appleVisionWithiPadDesign, .macWithiPadDesign] - case .macCatalyst: - [.macCatalyst] - case .macOS: - [.mac] - case .tvOS: - [.appleTv] - case .watchOS: - [.appleWatch] - case .visionOS: - [.appleVision] - } - }) + let destinations: ProjectDescription + .Destinations = Set(packageSettings.platforms.flatMap { platform -> ProjectDescription.Destinations in + switch platform { + case .iOS: + [.iPhone, .iPad, .appleVisionWithiPadDesign, .macWithiPadDesign] + case .macCatalyst: + [.macCatalyst] + case .macOS: + [.mac] + case .tvOS: + [.appleTv] + case .watchOS: + [.appleWatch] + case .visionOS: + [.appleVision] + } + }) let externalProjects: [Path: ProjectDescription.Project] = try packageInfos.reduce(into: [:]) { result, packageInfo in let manifest = try packageInfoMapper.map( @@ -161,10 +177,10 @@ public final class SwiftPackageManagerGraphGenerator: SwiftPackageManagerGraphGe packageInfos: packageInfoDictionary, name: packageInfo.name, path: packageInfo.folder, - productTypes: productTypes, - baseSettings: baseSettings, - targetSettings: targetSettings, - projectOptions: projectOptions[packageInfo.name], + productTypes: packageSettings.productTypes, + baseSettings: packageSettings.baseSettings, + targetSettings: packageSettings.targetSettings, + projectOptions: packageSettings.projectOptions[packageInfo.name], minDeploymentTargets: preprocessInfo.platformToMinDeploymentTarget, destinations: destinations, targetToProducts: preprocessInfo.targetToProducts, @@ -172,9 +188,9 @@ public final class SwiftPackageManagerGraphGenerator: SwiftPackageManagerGraphGe macroDependencies: preprocessInfo.macroDependencies, targetToModuleMap: preprocessInfo.targetToModuleMap, packageToProject: packageToProject, - swiftToolsVersion: swiftToolsVersion + swiftToolsVersion: packageSettings.swiftToolsVersion ) - result[Path(packageInfo.folder.pathString)] = manifest + result[.path(packageInfo.folder.pathString)] = manifest } return DependenciesGraph( diff --git a/Sources/TuistLoader/Models+ManifestMappers/Cache+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Cache+ManifestMapper.swift index cc9678170ee..e3b977eccad 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Cache+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Cache+ManifestMapper.swift @@ -22,34 +22,3 @@ enum CacheProfileError: FatalError, Equatable { } } } - -extension TuistGraph.Cache { - static func from( - manifest: ProjectDescription.Cache, - generatorPaths: GeneratorPaths - ) throws -> TuistGraph.Cache { - let path = try manifest.path.map { try generatorPaths.resolve(path: $0) } - let profiles = try manifest.profiles.map(TuistGraph.Cache.Profile.from(manifest:)) - return TuistGraph.Cache(profiles: profiles, path: path) - } -} - -extension TuistGraph.Cache.Profile { - static func from(manifest: ProjectDescription.Cache.Profile) throws -> TuistGraph.Cache.Profile { - var resolvedVersion: TSCUtility.Version? - - if let versionString = manifest.os { - guard let version = versionString.version() else { - throw CacheProfileError.invalidVersion(string: versionString) - } - resolvedVersion = version - } - - return TuistGraph.Cache.Profile( - name: manifest.name, - configuration: manifest.configuration, - device: manifest.device, - os: resolvedVersion - ) - } -} diff --git a/Sources/TuistLoader/Models+ManifestMappers/CarthageDependencies+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/CarthageDependencies+ManifestMapper.swift deleted file mode 100644 index 33cf766f435..00000000000 --- a/Sources/TuistLoader/Models+ManifestMappers/CarthageDependencies+ManifestMapper.swift +++ /dev/null @@ -1,49 +0,0 @@ -import Foundation -import ProjectDescription -import TSCBasic -import TuistCore -import TuistGraph -import TuistSupport - -extension TuistGraph.CarthageDependencies { - /// Creates `TuistGraph.CarthageDependencies` instance from `ProjectDescription.CarthageDependencies` instance. - static func from(manifest: ProjectDescription.CarthageDependencies) throws -> Self { - let dependencies = manifest.dependencies.map { TuistGraph.CarthageDependencies.Dependency.from(manifest: $0) } - - return .init(dependencies) - } -} - -extension TuistGraph.CarthageDependencies.Dependency { - /// Creates `TuistGraph.CarthageDependencies.Dependency` instance from `ProjectDescription.CarthageDependencies.Dependency` - /// instance. - static func from(manifest: ProjectDescription.CarthageDependencies.Dependency) -> Self { - switch manifest { - case let .github(path, requirement): - return .github(path: path, requirement: .from(manifest: requirement)) - case let .git(path, requirement): - return .git(path: path, requirement: .from(manifest: requirement)) - case let .binary(path, requirement): - return .binary(path: path, requirement: .from(manifest: requirement)) - } - } -} - -extension TuistGraph.CarthageDependencies.Requirement { - /// Creates `TuistGraph.CarthageDependencies.Requirement` instance from `ProjectDescription.CarthageDependencies.Requirement` - /// instance. - static func from(manifest: ProjectDescription.CarthageDependencies.Requirement) -> Self { - switch manifest { - case let .exact(version): - return .exact(version.description) - case let .upToNext(version): - return .upToNext(version.description) - case let .atLeast(version): - return .atLeast(version.description) - case let .branch(branch): - return .branch(branch) - case let .revision(revision): - return .revision(revision) - } - } -} diff --git a/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift index 0d184b1f3fc..9ca5bd4fcc6 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift @@ -41,10 +41,6 @@ extension TuistGraph.Cloud { extension TuistGraph.Cloud.Option { static func from(manifest: ProjectDescription.Cloud.Option) -> TuistGraph.Cloud.Option? { switch manifest { - case .analytics: - return nil - case .disableAnalytics: - return .disableAnalytics case .optional: return .optional } diff --git a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift index efb8f0a0ec8..78043737c21 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift @@ -31,15 +31,9 @@ extension TuistGraph.Config { cloud = try TuistGraph.Cloud.from(manifest: manifestCloud) } - var cache: TuistGraph.Cache? - if let manifestCache = manifest.cache { - cache = try TuistGraph.Cache.from(manifest: manifestCache, generatorPaths: generatorPaths) - } - return TuistGraph.Config( compatibleXcodeVersions: compatibleXcodeVersions, cloud: cloud, - cache: cache, swiftVersion: swiftVersion, plugins: plugins, generationOptions: generationOptions, diff --git a/Sources/TuistLoader/Models+ManifestMappers/Dependencies+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Dependencies+ManifestMapper.swift deleted file mode 100644 index bb70eda593a..00000000000 --- a/Sources/TuistLoader/Models+ManifestMappers/Dependencies+ManifestMapper.swift +++ /dev/null @@ -1,40 +0,0 @@ -import Foundation -import ProjectDescription -import TSCBasic -import TuistCore -import TuistGraph -import TuistSupport - -extension TuistGraph.Dependencies { - /// Maps a ProjectDescription.Dependencies instance into a TuistGraph.Dependencies instance. - /// - Parameters: - /// - manifest: Manifest representation of dependencies. - /// - generatorPaths: Generator paths. - static func from( - manifest: ProjectDescription.Dependencies, - generatorPaths: GeneratorPaths - ) throws -> Self { - let carthage: TuistGraph.CarthageDependencies? = try { - guard let carthage = manifest.carthage else { - return nil - } - return try TuistGraph.CarthageDependencies.from(manifest: carthage) - }() - let swiftPackageManager: TuistGraph.SwiftPackageManagerDependencies? = try { - guard let swiftPackageManager = manifest.swiftPackageManager else { - return nil - } - return try TuistGraph.SwiftPackageManagerDependencies.from( - manifest: swiftPackageManager, - generatorPaths: generatorPaths - ) - }() - let platforms = try manifest.platforms.map { try TuistGraph.PackagePlatform.from(manifest: $0) } - - return Self( - carthage: carthage, - swiftPackageManager: swiftPackageManager, - platforms: Set(platforms) - ) - } -} diff --git a/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift index 8f0fe37b475..af0f201606d 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift @@ -1,6 +1,7 @@ import Foundation import ProjectDescription import TSCBasic +import TSCUtility import TuistCore import TuistGraph import TuistSupport @@ -10,7 +11,8 @@ extension TuistGraph.PackageSettings { /// instance. static func from( manifest: ProjectDescription.PackageSettings, - generatorPaths: GeneratorPaths + generatorPaths: GeneratorPaths, + swiftToolsVersion: TSCUtility.Version ) throws -> Self { let productTypes = manifest.productTypes.mapValues { TuistGraph.Product.from(manifest: $0) } let baseSettings = try TuistGraph.Settings.from(manifest: manifest.baseSettings, generatorPaths: generatorPaths) @@ -25,6 +27,7 @@ extension TuistGraph.PackageSettings { baseSettings: baseSettings, targetSettings: targetSettings, projectOptions: projectOptions, + swiftToolsVersion: swiftToolsVersion, platforms: platforms ) } diff --git a/Sources/TuistDependencies/SwiftPackageManager/Utils/ManifestMapping/ProjectOption+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ProjectOption+ToManifestMapper.swift similarity index 100% rename from Sources/TuistDependencies/SwiftPackageManager/Utils/ManifestMapping/ProjectOption+ManifestMapper.swift rename to Sources/TuistLoader/Models+ManifestMappers/ProjectOption+ToManifestMapper.swift diff --git a/Sources/TuistLoader/Models+ManifestMappers/SwiftPackageManagerDependencies+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/SwiftPackageManagerDependencies+ManifestMapper.swift deleted file mode 100644 index f896e72a00d..00000000000 --- a/Sources/TuistLoader/Models+ManifestMappers/SwiftPackageManagerDependencies+ManifestMapper.swift +++ /dev/null @@ -1,40 +0,0 @@ -import Foundation -import ProjectDescription -import TSCBasic -import TuistCore -import TuistGraph -import TuistSupport - -extension TuistGraph.SwiftPackageManagerDependencies { - /// Creates `TuistGraph.SwiftPackageManagerDependencies` instance from `ProjectDescription.SwiftPackageManagerDependencies` - /// instance. - static func from( - manifest: ProjectDescription.SwiftPackageManagerDependencies, - generatorPaths: GeneratorPaths - ) throws -> Self { - let packagesOrManifest: TuistGraph.PackagesOrManifest - switch manifest.packagesOrManifest { - case let .packages(packages): - packagesOrManifest = .packages(try packages.map { try TuistGraph.Package.from( - manifest: $0, - generatorPaths: generatorPaths - ) }) - case .manifest: - packagesOrManifest = .manifest - } - let productTypes = manifest.productTypes.mapValues { TuistGraph.Product.from(manifest: $0) } - let baseSettings = try TuistGraph.Settings.from(manifest: manifest.baseSettings, generatorPaths: generatorPaths) - let targetSettings = manifest.targetSettings.mapValues { TuistGraph.SettingsDictionary.from(manifest: $0) } - let projectOptions: [String: TuistGraph.Project.Options] = manifest - .projectOptions - .mapValues { .from(manifest: $0) } - - return .init( - packagesOrManifest, - productTypes: productTypes, - baseSettings: baseSettings, - targetSettings: targetSettings, - projectOptions: projectOptions - ) - } -} diff --git a/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift index 721680c67f1..beeb63a6e72 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift @@ -66,9 +66,6 @@ extension TuistGraph.TargetDependency { case .plugin: return [.package(product: product, type: .plugin, condition: condition?.asGraphCondition)] } - case let .packagePlugin(product, condition): - logger.warning(".packagePlugin is deprecated. Use .package(product:, type: .plugin) instead.") - return [.package(product: product, type: .plugin, condition: condition?.asGraphCondition)] case let .sdk(name, type, status, condition): return [ .sdk( diff --git a/Sources/TuistDependencies/SwiftPackageManager/Utils/ManifestMapping/TestingOptions+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TestingOptions+ToManifestMapper.swift similarity index 100% rename from Sources/TuistDependencies/SwiftPackageManager/Utils/ManifestMapping/TestingOptions+ManifestMapper.swift rename to Sources/TuistLoader/Models+ManifestMappers/TestingOptions+ToManifestMapper.swift diff --git a/Sources/TuistLoader/Models/Manifest.swift b/Sources/TuistLoader/Models/Manifest.swift index 23a999a12b1..c2f2e057feb 100644 --- a/Sources/TuistLoader/Models/Manifest.swift +++ b/Sources/TuistLoader/Models/Manifest.swift @@ -6,9 +6,9 @@ public enum Manifest: CaseIterable { case workspace case config case template - case dependencies case plugin case package + case packageSettings /// - Parameters: /// - path: Path to the folder that contains the manifest @@ -23,11 +23,9 @@ public enum Manifest: CaseIterable { return "Config.swift" case .template: return "\(path.basenameWithoutExt).swift" - case .dependencies: - return "Dependencies.swift" case .plugin: return "Plugin.swift" - case .package: + case .package, .packageSettings: return "Package.swift" } } diff --git a/Sources/TuistDependencies/SwiftPackageManager/Models/SwiftPackageManagerWorkspaceState.swift b/Sources/TuistLoader/Models/SwiftPackageManagerWorkspaceState.swift similarity index 100% rename from Sources/TuistDependencies/SwiftPackageManager/Models/SwiftPackageManagerWorkspaceState.swift rename to Sources/TuistLoader/Models/SwiftPackageManagerWorkspaceState.swift diff --git a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift index 446748d57ab..776c95523b2 100644 --- a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift +++ b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift @@ -115,6 +115,16 @@ public final class ProjectDescriptionHelpersBuilder: ProjectDescriptionHelpersBu customProjectDescriptionHelperModules: [ProjectDescriptionHelpersModule] ) throws -> ProjectDescriptionHelpersModule? { guard let tuistHelpersDirectory = helpersDirectoryLocator.locate(at: path) else { return nil } + #if DEBUG + if let sourceRoot = ProcessEnv.vars["TUIST_CONFIG_SRCROOT"], + tuistHelpersDirectory.isDescendant( + // swiftlint:disable:next force_try + of: try! AbsolutePath(validating: sourceRoot).appending(component: Constants.tuistDirectoryName) + ) + { + return nil + } + #endif return try buildHelpers( name: Self.defaultHelpersName, in: tuistHelpersDirectory, diff --git a/Sources/TuistDependencies/SwiftPackageManager/Utils/PackageInfo+graphPlatform.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfo+graphPlatform.swift similarity index 100% rename from Sources/TuistDependencies/SwiftPackageManager/Utils/PackageInfo+graphPlatform.swift rename to Sources/TuistLoader/SwiftPackageManager/PackageInfo+graphPlatform.swift diff --git a/Sources/TuistDependencies/SwiftPackageManager/Utils/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift similarity index 97% rename from Sources/TuistDependencies/SwiftPackageManager/Utils/PackageInfoMapper.swift rename to Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 842dcb91209..3e24b8cdab0 100644 --- a/Sources/TuistDependencies/SwiftPackageManager/Utils/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -148,12 +148,12 @@ public protocol PackageInfoMapping { // swiftlint:disable:next type_body_length public final class PackageInfoMapper: PackageInfoMapping { public struct PreprocessInfo { - let platformToMinDeploymentTarget: ProjectDescription.DeploymentTargets - let productToExternalDependencies: [String: [ProjectDescription.TargetDependency]] - let targetToProducts: [String: Set] - let targetToResolvedDependencies: [String: [PackageInfoMapper.ResolvedDependency]] - let targetToModuleMap: [String: ModuleMap] - let macroDependencies: Set + public let platformToMinDeploymentTarget: ProjectDescription.DeploymentTargets + public let productToExternalDependencies: [String: [ProjectDescription.TargetDependency]] + public let targetToProducts: [String: Set] + public let targetToResolvedDependencies: [String: [PackageInfoMapper.ResolvedDependency]] + public let targetToModuleMap: [String: ModuleMap] + public let macroDependencies: Set } // Predefined source directories, in order of preference. @@ -184,7 +184,7 @@ public final class PackageInfoMapper: PackageInfoMapping { guard target.type == .binary else { return } if let path = target.path { // local binary - result[target.name] = Path( + result[target.name] = .path( packageToFolder[packageInfo.key]!.appending(try RelativePath(validating: path)) .pathString ) @@ -194,7 +194,7 @@ public final class PackageInfoMapper: PackageInfoMapping { guard let artifactPath = packageToTargetsToArtifactPaths[packageInfo.key]?[target.name] else { throw PackageInfoMapperError.missingBinaryArtifact(package: packageInfo.key, target: target.name) } - result[target.name] = Path(artifactPath.pathString) + result[target.name] = .path(artifactPath.pathString) } } } @@ -279,7 +279,7 @@ public final class PackageInfoMapper: PackageInfoMapping { case let .target(name, condition): return .project( target: name, - path: Path(packageToFolder[packageInfo.key]!.pathString), + path: .path(packageToFolder[packageInfo.key]!.pathString), condition: condition ) case .externalTarget: @@ -539,7 +539,7 @@ extension ProjectDescription.Target { if target.type == .macro { destinations = Set([.mac]) } else { - // All packages implicitly support all platforms, we constrain this with the platforms defined in `Dependencies.swift` + // All packages implicitly support all platforms, we constrain this with the platforms defined in `Package.swift` destinations = packageDestinations.intersection(Set(Destination.allCases)) } @@ -611,7 +611,7 @@ extension ProjectDescription.Target { targetSettings: targetSettings ) - return ProjectDescription.Target( + return .target( name: PackageInfoMapper.sanitize(targetName: target.name), destinations: destinations, product: product, @@ -635,7 +635,7 @@ extension ProjectDescription.DeploymentTargets { /// A dictionary that contains the oldest supported version of each platform public static func oldestVersions(for swiftVersion: TSCUtility.Version) -> ProjectDescription.DeploymentTargets { if swiftVersion < Version(5, 7, 0) { - return DeploymentTargets( + return .deploymentTargets( iOS: "9.0", macOS: "10.10", watchOS: "2.0", @@ -643,7 +643,7 @@ extension ProjectDescription.DeploymentTargets { visionOS: "1.0" ) } else if swiftVersion < Version(5, 9, 0) { - return DeploymentTargets( + return .deploymentTargets( iOS: "11.0", macOS: "10.13", watchOS: "4.0", @@ -651,7 +651,7 @@ extension ProjectDescription.DeploymentTargets { visionOS: "1.0" ) } else { - return DeploymentTargets( + return .deploymentTargets( iOS: "12.0", macOS: "10.13", watchOS: "4.0", @@ -680,7 +680,7 @@ extension ProjectDescription.DeploymentTargets { return try max(minDeploymentTargets[platform], platformInfos[platform]) } - return .init( + return .deploymentTargets( iOS: try versionFor(platform: .iOS), macOS: try versionFor(platform: .macOS), watchOS: try versionFor(platform: .watchOS), @@ -764,14 +764,14 @@ extension SourceFilesList { sourcesPaths = [path.appending(component: "**")] } guard !sourcesPaths.isEmpty else { return nil } - return .init( + return .sourceFilesList( globs: try sourcesPaths.map { absolutePath -> ProjectDescription.SourceFileGlob in .glob( - Path(absolutePath.pathString), + .path(absolutePath.pathString), excluding: try excluding.map { let excludePath = path.appending(try RelativePath(validating: $0)) let excludeGlob = excludePath.extension != nil ? excludePath : excludePath.appending(component: "**") - return Path(excludeGlob.pathString) + return .path(excludeGlob.pathString) } ) } @@ -792,7 +792,7 @@ extension ResourceFileElements { /// - resourceAbsolutePath: The absolute path of that resource /// - Returns: A ProjectDescription.ResourceFileElement mapped from a `.copy` resource rule of SPM func handleCopyResource(resourceAbsolutePath: AbsolutePath) -> ProjectDescription.ResourceFileElement { - .folderReference(path: Path(resourceAbsolutePath.pathString)) + .folderReference(path: .path(resourceAbsolutePath.pathString)) } /// Handles the conversion of a `.process` resource rule of SPM @@ -804,11 +804,11 @@ extension ResourceFileElements { let absolutePathGlob = resourceAbsolutePath.extension != nil ? resourceAbsolutePath : resourceAbsolutePath .appending(component: "**") return .glob( - pattern: Path(absolutePathGlob.pathString), + pattern: .path(absolutePathGlob.pathString), excluding: try excluding.map { let excludePath = path.appending(try RelativePath(validating: $0)) let excludeGlob = excludePath.extension != nil ? excludePath : excludePath.appending(component: "**") - return Path(excludeGlob.pathString) + return .path(excludeGlob.pathString) } ) } @@ -839,7 +839,7 @@ extension ResourceFileElements { // Check for empty resource files guard !resourceFileElements.isEmpty else { return nil } - return .init(resources: resourceFileElements) + return .resources(resourceFileElements) } // These files are automatically added as resource if they are inside targets directory. @@ -875,7 +875,7 @@ extension ProjectDescription.TargetDependency { case let .externalTarget(project, target, condition): return .project( target: target, - path: Path(packageToProject[project]!.pathString), + path: .path(packageToProject[project]!.pathString), condition: condition ) } @@ -915,7 +915,7 @@ extension ProjectDescription.Headers { case .header, .nestedHeader: let publicHeaders = try FileHandler.shared.filesAndDirectoriesContained(in: publicHeadersPath)! .filter { $0.extension == "h" } - let list: [FileListGlob] = publicHeaders.map { .glob(Path($0.pathString)) } + let list: [FileListGlob] = publicHeaders.map { .glob(.path($0.pathString)) } return .headers(public: .list(list)) case .none, .custom, .directory: return nil @@ -1161,7 +1161,7 @@ extension ProjectDescription.Configuration { ) -> Self { let name = ConfigurationName(stringLiteral: buildConfiguration.name) let settings = ProjectDescription.SettingsDictionary.from(settingsDictionary: configuration?.settings ?? [:]) - let xcconfig = configuration?.xcconfig.map { Path($0.relative(to: packageFolder).pathString) } + let xcconfig = configuration?.xcconfig.map { Path.path($0.relative(to: packageFolder).pathString) } switch buildConfiguration.variant { case .debug: return .debug(name: name, settings: settings, xcconfig: xcconfig) diff --git a/Sources/TuistDependencies/SwiftPackageManager/Utils/SettingsMapper.swift b/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift similarity index 100% rename from Sources/TuistDependencies/SwiftPackageManager/Utils/SettingsMapper.swift rename to Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift diff --git a/Sources/TuistDependencies/SwiftPackageManager/Utils/SwiftPackageManagerModuleMapGenerator.swift b/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift similarity index 100% rename from Sources/TuistDependencies/SwiftPackageManager/Utils/SwiftPackageManagerModuleMapGenerator.swift rename to Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift diff --git a/Sources/TuistLoader/Up/Carthage.swift b/Sources/TuistLoader/Up/Carthage.swift deleted file mode 100644 index 9767a9098c6..00000000000 --- a/Sources/TuistLoader/Up/Carthage.swift +++ /dev/null @@ -1,151 +0,0 @@ -import Foundation -import TSCBasic -import TuistCore -import TuistGraph -import TuistSupport - -/// Model that represents the content of the file that Carthage -/// generates for each resolved dependency. -struct CarthageVersionFile: Codable { - /// The git revision of the resolved dependency. - let commitish: String -} - -/// Protocol that defines an interface to interact with a local Carthage setup. -protocol Carthaging { - /// Bootstraps the dependencies in the given directory. - /// - /// - Parameters: - /// - path: Directory where the Carthage dependencies are defined. - /// - platforms: Platforms the dependencies will be bootstraped for. - /// - useXCFrameworks: Indicates whether Carthage produces XCFrameworks or regular frameworks. - /// - noUseBinaries: Indicates whether Carthage rebuilds the dependency from source instead of using downloaded binaries - /// when possible. - /// - dependencies: Dependencies to bootstrap - /// - Throws: An error if the dependencies bootstrap fails. - func bootstrap( - path: AbsolutePath, - platforms: [Platform], - useXCFrameworks: Bool, - noUseBinaries: Bool, - dependencies: [String] - ) throws - - /// Returns the list of outdated dependencies in the given directory. - /// - /// - Parameter path: Project directory. - /// - Returns: List of outdated dependencies. - func outdated(path: AbsolutePath) throws -> [String]? -} - -final class Carthage: Carthaging { - // swiftlint:disable force_try - /// Regex used to match and extract information from the lines in the Cartfile.resolved file. - static let resolvedLineRegex = try! NSRegularExpression(pattern: "(github|git|binary) \"([^\"]+)\" \"([^\"]+)\"", options: []) - // swiftlint:enable force_try - - /// Bootstraps the dependencies in the given directory. - /// - /// - Parameters: - /// - path: Directory where the Carthage dependencies are defined. - /// - platforms: Platforms the dependencies will be bootstraped for. - /// - useXCFrameworks: Indicates whether Carthage produces XCFrameworks or regular frameworks. - /// - noUseBinaries: Indicates whether Carthage rebuilds the dependency from source instead of using downloaded binaries - /// when possible. - /// - dependencies: Dependencies to bootstrap - /// - Throws: An error if the dependencies bootstrap fails. - func bootstrap( - path: AbsolutePath, - platforms: [Platform], - useXCFrameworks: Bool, - noUseBinaries: Bool, - dependencies: [String] - ) throws { - let carthagePath = try System.shared.which("carthage") - - var command: [String] = [carthagePath] - command.append("bootstrap") - command.append("--project-directory") - command.append(path.pathString) - - if useXCFrameworks { - command.append("--use-xcframeworks") - } - - if noUseBinaries { - command.append("--no-use-binaries") - } - - if !platforms.isEmpty { - command.append("--platform") - command.append(platforms.map(\.caseValue).joined(separator: ",")) - } - - command.append(contentsOf: dependencies) - - try System.shared.run(command) - } - - /// Returns the list of outdated dependencies in the given directory. - /// Reference: https://github.com/Carthage/workflows/blob/master/carthage-verify - /// - /// - Parameter path: Project directory. - /// - Returns: List of outdated dependencies. - func outdated(path: AbsolutePath) throws -> [String]? { - let cartfileResolvedPath = path.appending(component: "Cartfile.resolved") - - if !FileHandler.shared.exists(cartfileResolvedPath) { - return nil - } - - var outdated: [String] = [] - let cartfileResolved = try FileHandler.shared.readTextFile(cartfileResolvedPath) - let cartfileResolvedNSString = cartfileResolved as NSString - let jsonDecoder = JSONDecoder() - - try Carthage.resolvedLineRegex.matches( - in: cartfileResolved, - options: [], - range: NSRange( - location: 0, - length: cartfileResolved.count - ) - ).forEach { match in - let dependencyNameRange = match.range(at: 2) - var dependencyName = String(cartfileResolvedNSString.substring(with: dependencyNameRange).split(separator: "/").last!) - - let dependencyTypeRange = match.range(at: 1) - let dependencyType = DependencyType(rawValue: cartfileResolvedNSString.substring(with: dependencyTypeRange)) - if dependencyType == .binary { - dependencyName = (dependencyName as NSString).deletingPathExtension - } - - let dependencyRevisionRange = match.range(at: 3) - let dependencyRevision = cartfileResolvedNSString.substring(with: dependencyRevisionRange) - - let dependencyVersionFilePath = path - .appending(try RelativePath(validating: "Carthage/Build/.\(dependencyName).version")) - - // We consider missing dependencies outdated - if !FileHandler.shared.exists(dependencyVersionFilePath) { - outdated.append(dependencyName) - return - } - - let dependencyVersionData = try Data(contentsOf: dependencyVersionFilePath.url) - let dependencyVersionFile = try jsonDecoder.decode(CarthageVersionFile.self, from: dependencyVersionData) - - if dependencyVersionFile.commitish != dependencyRevision { - outdated.append(dependencyName) - } - } - - return outdated - } -} - -extension Carthage { - private enum DependencyType: String { - case github, git, binary - } -} diff --git a/Sources/TuistLoader/Utils/ManifestFilesLocator.swift b/Sources/TuistLoader/Utils/ManifestFilesLocator.swift index c64243eff73..5bad22f6e59 100644 --- a/Sources/TuistLoader/Utils/ManifestFilesLocator.swift +++ b/Sources/TuistLoader/Utils/ManifestFilesLocator.swift @@ -34,10 +34,6 @@ public protocol ManifestFilesLocating: AnyObject { /// - Parameter locatingPath: Path from where to do the lookup. func locateConfig(at locatingPath: AbsolutePath) -> AbsolutePath? - /// It traverses up the directory hierarchy until it finds a `Dependencies.swift` file. - /// - Parameter locatingPath: Path from where to do the lookup. - func locateDependencies(at locatingPath: AbsolutePath) -> AbsolutePath? - /// It traverses up the directory hierarchy until it finds a `Package.swift` file /// - Parameter locatingPath: Path from where to do the lookup func locatePackageManifest( @@ -184,13 +180,6 @@ public final class ManifestFilesLocator: ManifestFilesLocating { return traverseAndLocate(at: locatingPath, appending: subPath) } - public func locateDependencies(at locatingPath: AbsolutePath) -> AbsolutePath? { - let subPath = - // swiftlint:disable:next force_try - try! RelativePath(validating: "\(Constants.tuistDirectoryName)/\(Manifest.dependencies.fileName(locatingPath))") - return traverseAndLocate(at: locatingPath, appending: subPath) - } - public func locatePackageManifest(at locatingPath: AbsolutePath) -> AbsolutePath? { let subPath = // swiftlint:disable:next force_try diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockDependenciesModelLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockDependenciesModelLoader.swift deleted file mode 100644 index 39aa90a3fa1..00000000000 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockDependenciesModelLoader.swift +++ /dev/null @@ -1,28 +0,0 @@ -import TSCBasic -import TuistGraph -import TuistSupport - -@testable import TuistLoader - -public class MockDependenciesModelLoader: DependenciesModelLoading { - public init() {} - - public var invokedLoadDependencies = false - public var invokedLoadDependenciesCount = 0 - public var invokedLoadDependenciesParameters: (AbsolutePath, Plugins)? - public var invokedLoadDependenciesParemetersList = [(AbsolutePath, Plugins)]() - public var loadDependenciesStub: ((AbsolutePath, Plugins) throws -> Dependencies)? - - public func loadDependencies(at path: AbsolutePath, with plugins: Plugins) throws -> Dependencies { - invokedLoadDependencies = true - invokedLoadDependenciesCount += 1 - invokedLoadDependenciesParameters = (path, plugins) - invokedLoadDependenciesParemetersList.append((path, plugins)) - - if let stub = loadDependenciesStub { - return try stub(path, plugins) - } else { - return Dependencies(carthage: nil, swiftPackageManager: nil, platforms: []) - } - } -} diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift index 46d349feed1..4507029f86b 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift @@ -25,8 +25,8 @@ public final class MockManifestLoader: ManifestLoading { public var loadTemplateCount: UInt = 0 public var loadTemplateStub: ((AbsolutePath) throws -> Template)? - public var loadDependenciesCount: UInt = 0 - public var loadDependenciesStub: ((AbsolutePath) throws -> Dependencies)? + public var loadPackageCount: UInt = 0 + public var loadPackageStub: ((AbsolutePath) throws -> PackageInfo)? public var loadPackageSettingsCount: UInt = 0 public var loadPackageSettingsStub: ((AbsolutePath) throws -> PackageSettings)? @@ -71,9 +71,9 @@ public final class MockManifestLoader: ManifestLoading { return try loadTemplateStub?(path) ?? Template.test() } - public func loadDependencies(at path: AbsolutePath) throws -> Dependencies { - loadDependenciesCount += 1 - return try loadDependenciesStub?(path) ?? Dependencies.test() + public func loadPackage(at path: AbsolutePath) throws -> PackageInfo { + loadPackageCount += 1 + return try loadPackageStub?(path) ?? .test() } public func loadPackageSettings(at path: AbsolutePath) throws -> PackageSettings { diff --git a/Sources/TuistLoaderTesting/Loaders/TestData/ProjectDescription+TestData.swift b/Sources/TuistLoaderTesting/Loaders/TestData/ProjectDescription+TestData.swift index fe138385ff4..171b21182fc 100644 --- a/Sources/TuistLoaderTesting/Loaders/TestData/ProjectDescription+TestData.swift +++ b/Sources/TuistLoaderTesting/Loaders/TestData/ProjectDescription+TestData.swift @@ -61,7 +61,7 @@ extension Project { extension Target { public static func test( name: String = "Target", - platform: Platform = .iOS, + destinations: Destinations = .iOS, product: Product = .framework, productName: String? = nil, bundleId: String = "com.some.bundle.id", @@ -76,9 +76,9 @@ extension Target { coreDataModels: [CoreDataModel] = [], environment: [String: String] = [:] ) -> Target { - Target( + .target( name: name, - platform: platform, + destinations: destinations, product: product, productName: productName, bundleId: bundleId, @@ -129,7 +129,7 @@ extension Scheme { testAction: TestAction? = nil, runAction: RunAction? = nil ) -> Scheme { - Scheme( + .scheme( name: name, shared: shared, buildAction: buildAction, @@ -141,7 +141,7 @@ extension Scheme { extension BuildAction { public static func test(targets: [TargetReference] = []) -> BuildAction { - BuildAction( + .buildAction( targets: targets, preActions: [ExecutionAction.test()], postActions: [ExecutionAction.test()] @@ -185,7 +185,7 @@ extension ExecutionAction { public static func test( title: String = "Test Script", scriptText: String = "echo Test", - target: TargetReference? = TargetReference(projectPath: nil, target: "Target") + target: TargetReference? = .target("Target") ) -> ExecutionAction { ExecutionAction( title: title, @@ -207,12 +207,6 @@ extension Arguments { } } -extension Dependencies { - public static func test(carthageDependencies: CarthageDependencies? = nil) -> Dependencies { - Dependencies(carthage: carthageDependencies) - } -} - extension Plugin { public static func test(name: String = "Plugin") -> Plugin { Plugin(name: name) diff --git a/Sources/TuistLoaderTesting/Utils/Mocks/MockManifestFilesLocator.swift b/Sources/TuistLoaderTesting/Utils/Mocks/MockManifestFilesLocator.swift index e99ec97d4fd..199b263b4c6 100644 --- a/Sources/TuistLoaderTesting/Utils/Mocks/MockManifestFilesLocator.swift +++ b/Sources/TuistLoaderTesting/Utils/Mocks/MockManifestFilesLocator.swift @@ -49,11 +49,6 @@ public final class MockManifestFilesLocator: ManifestFilesLocating { return locateConfigStub ?? at.appending(components: "Tuist", "Config.swift") } - public func locateDependencies(at: AbsolutePath) -> AbsolutePath? { - locateDependenciesArgs.append(at) - return locateDependenciesStub ?? at.appending(components: "Tuist", "Dependencies.swift") - } - public func locatePackageManifest(at: AbsolutePath) -> AbsolutePath? { locatePackageManifestArgs.append(at) return locatePackageManifestStub ?? at.appending(components: "Tuist", "Package.swift") diff --git a/Sources/TuistPlugin/PluginService.swift b/Sources/TuistPlugin/PluginService.swift index 662e9d92079..15c4c209077 100644 --- a/Sources/TuistPlugin/PluginService.swift +++ b/Sources/TuistPlugin/PluginService.swift @@ -237,9 +237,9 @@ public final class PluginService: PluginServicing { private func pluginCacheDirectory( url: String, gitId: String, - config: Config + config _: Config ) throws -> AbsolutePath { - let cacheDirectories = try cacheDirectoryProviderFactory.cacheDirectories(config: config) + let cacheDirectories = try cacheDirectoryProviderFactory.cacheDirectories() let cacheDirectory = cacheDirectories.cacheDirectory(for: .plugins) let fingerprint = "\(url)-\(gitId)".md5 return cacheDirectory @@ -271,7 +271,7 @@ public final class PluginService: PluginServicing { let pluginRepositoryDirectory = pluginCacheDirectory.appending(component: PluginServiceConstants.repository) // If `Package.swift` exists for the plugin, a Github release should for the given `gitTag` should also exist guard FileHandler.shared - .exists(pluginRepositoryDirectory.appending(component: Constants.DependenciesDirectory.packageSwiftName)) + .exists(pluginRepositoryDirectory.appending(component: Constants.SwiftPackageManager.packageSwiftName)) else { return } let pluginReleaseDirectory = pluginCacheDirectory.appending(component: PluginServiceConstants.release) diff --git a/Sources/TuistSigning/Certificate/Certificate.swift b/Sources/TuistSigning/Certificate/Certificate.swift deleted file mode 100644 index 4ea195d4eff..00000000000 --- a/Sources/TuistSigning/Certificate/Certificate.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation -import TSCBasic - -struct Certificate: Equatable { - let publicKey: AbsolutePath - let privateKey: AbsolutePath - /// Content of the fingerprint property of the public key - let fingerprint: String - let developmentTeam: String - let name: String - let isRevoked: Bool -} diff --git a/Sources/TuistSigning/GraphMappers/Dictionary+Fingerprint.swift b/Sources/TuistSigning/GraphMappers/Dictionary+Fingerprint.swift deleted file mode 100644 index b74a659ec85..00000000000 --- a/Sources/TuistSigning/GraphMappers/Dictionary+Fingerprint.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation - -extension [Fingerprint: Certificate] { - func first(for provisioningProfile: ProvisioningProfile) -> Certificate? { - provisioningProfile.developerCertificateFingerprints.compactMap { self[$0] }.first - } -} diff --git a/Sources/TuistSigning/GraphMappers/SigningMapper.swift b/Sources/TuistSigning/GraphMappers/SigningMapper.swift deleted file mode 100644 index 58175afc3a3..00000000000 --- a/Sources/TuistSigning/GraphMappers/SigningMapper.swift +++ /dev/null @@ -1,102 +0,0 @@ -import Foundation -import TSCBasic -import TuistCore -import TuistGraph -import TuistSupport - -public class SigningMapper: ProjectMapping { - private let signingFilesLocator: SigningFilesLocating - private let signingMatcher: SigningMatching - private let signingCipher: SigningCiphering - - public convenience init() { - self.init( - signingFilesLocator: SigningFilesLocator(), - signingMatcher: SigningMatcher(), - signingCipher: SigningCipher() - ) - } - - init( - signingFilesLocator: SigningFilesLocating, - signingMatcher: SigningMatching, - signingCipher: SigningCiphering - ) { - self.signingFilesLocator = signingFilesLocator - self.signingMatcher = signingMatcher - self.signingCipher = signingCipher - } - - // MARK: - GraphMapping - - public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { - var project = project - let path = project.path - guard try signingFilesLocator.locateSigningDirectory(from: path) != nil - else { - logger.debug("No signing artifacts found") - return (project, []) - } - - try signingCipher.decryptSigning(at: path, keepFiles: true) - defer { try? signingCipher.encryptSigning(at: path, keepFiles: false) } - - let derivedDirectory = project.path.appending(component: Constants.DerivedDirectory.name) - let keychainPath = derivedDirectory.appending(component: Constants.DerivedDirectory.signingKeychain) - - let (certificates, provisioningProfiles) = try signingMatcher.match(from: project.path) - - project.targets = try project.targets.map { - try map( - target: $0, - project: project, - keychainPath: keychainPath, - certificates: certificates, - provisioningProfiles: provisioningProfiles - ) - } - - return (project, []) - } - - // MARK: - Helpers - - private func map( - target: Target, - project: Project, - keychainPath: AbsolutePath, - certificates: [Fingerprint: Certificate], - provisioningProfiles: [TargetName: [ConfigurationName: ProvisioningProfile]] - ) throws -> Target { - var target = target - let targetConfigurations = target.settings?.configurations ?? [:] - let configurations: [BuildConfiguration: Configuration?] = targetConfigurations - .merging( - project.settings.configurations, - uniquingKeysWith: { config, _ in config } - ) - .reduce(into: [:]) { dict, configurationPair in - guard let provisioningProfile = provisioningProfiles[target.name]?[configurationPair.key.name], - let certificate = certificates.first(for: provisioningProfile) - else { - dict[configurationPair.key] = configurationPair.value - return - } - let configuration = configurationPair.value ?? Configuration() - var settings = configuration.settings - settings["CODE_SIGN_STYLE"] = "Manual" - settings["CODE_SIGN_IDENTITY"] = SettingValue(stringLiteral: certificate.name) - settings["OTHER_CODE_SIGN_FLAGS"] = SettingValue(stringLiteral: "--keychain \(keychainPath.pathString)") - settings["DEVELOPMENT_TEAM"] = SettingValue(stringLiteral: provisioningProfile.teamId) - settings["PROVISIONING_PROFILE_SPECIFIER"] = SettingValue(stringLiteral: provisioningProfile.uuid) - dict[configurationPair.key] = configuration.with(settings: settings) - } - - target.settings = Settings( - base: target.settings?.base ?? [:], - configurations: configurations, - defaultSettings: target.settings?.defaultSettings ?? .recommended - ) - return target - } -} diff --git a/Sources/TuistSigning/Linter/SigningLinter.swift b/Sources/TuistSigning/Linter/SigningLinter.swift deleted file mode 100644 index 15b552da6dc..00000000000 --- a/Sources/TuistSigning/Linter/SigningLinter.swift +++ /dev/null @@ -1,69 +0,0 @@ -import Foundation -import TuistCore -import TuistGraph - -protocol SigningLinting { - func lint(certificate: Certificate, provisioningProfile: ProvisioningProfile) -> [LintingIssue] - func lint(certificate: Certificate) -> [LintingIssue] - func lint(provisioningProfile: ProvisioningProfile, target: Target) -> [LintingIssue] -} - -final class SigningLinter: SigningLinting { - func lint(certificate: Certificate, provisioningProfile: ProvisioningProfile) -> [LintingIssue] { - var issues: [LintingIssue] = [] - if certificate.developmentTeam != provisioningProfile.teamId { - let reason = """ - Certificate \(certificate.name)'s development team \( - certificate - .developmentTeam - ) does not correspond to \(provisioningProfile.teamId). - Make sure they are the same. - """ - issues.append(LintingIssue(reason: reason, severity: .error)) - } - - return issues - } - - func lint(certificate: Certificate) -> [LintingIssue] { - var issues: [LintingIssue] = [] - if certificate.isRevoked { - issues.append(LintingIssue( - reason: "Certificate \(certificate.name) is revoked. Create a new one and replace it to resolve the issue.", - severity: .warning - )) - } - return issues - } - - func lint(provisioningProfile: ProvisioningProfile, target: Target) -> [LintingIssue] { - let appIdPrefix = provisioningProfile.applicationIdPrefix.first ?? provisioningProfile.teamId - let appId = appIdPrefix + "." + target.bundleId - let invalidProvisioningProfileIssue = LintingIssue( - reason: """ - App id \(provisioningProfile.appId) does not correspond to \(appIdPrefix).\( - target - .bundleId - ). Make sure the provisioning profile has been added to the right target. - """, - severity: .error - ) - let buildSettingRegex = "\\$[\\({](.*)[\\)}]" - - var issues: [LintingIssue] = [] - - if target.bundleId.matches(pattern: buildSettingRegex) { - return issues - } else if provisioningProfile.appId.last == "*" { - if !appId.hasPrefix(provisioningProfile.appId.dropLast()) { - issues.append(invalidProvisioningProfileIssue) - } - } else { - if provisioningProfile.appId != appId { - issues.append(invalidProvisioningProfileIssue) - } - } - - return issues - } -} diff --git a/Sources/TuistSigning/ProvisioningProfile/ProvisioningProfile.swift b/Sources/TuistSigning/ProvisioningProfile/ProvisioningProfile.swift deleted file mode 100644 index c37a0c3b312..00000000000 --- a/Sources/TuistSigning/ProvisioningProfile/ProvisioningProfile.swift +++ /dev/null @@ -1,94 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport - -private protocol Entitlements: Decodable { - var appId: String { get } -} - -/// Model of a provisioning profile -struct ProvisioningProfile: Equatable { - /// Path to the provisioning profile - var path: AbsolutePath - let name: String - let targetName: String - let configurationName: String - let uuid: String - let teamId: String - let appId: String - let appIdName: String - let applicationIdPrefix: [String] - let platforms: [String] - let expirationDate: Date - let developerCertificateFingerprints: [String] - - struct Content { - let name: String - let uuid: String - let teamId: String - let appId: String - let appIdName: String - let applicationIdPrefix: [String] - let platforms: [String] - let expirationDate: Date - let developerCertificates: [Data] - } -} - -extension ProvisioningProfile.Content: Decodable { - private enum CodingKeys: String, CodingKey { - case name = "Name" - case uuid = "UUID" - case teamIds = "TeamIdentifier" - case appIdName = "AppIDName" - case applicationIdPrefix = "ApplicationIdentifierPrefix" - case platforms = "Platform" - case entitlements = "Entitlements" - case expirationDate = "ExpirationDate" - case developerCertificates = "DeveloperCertificates" - } - - init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - name = try container.decode(String.self, forKey: .name) - uuid = try container.decode(String.self, forKey: .uuid) - teamId = try container.decode(DecodingFirst.self, forKey: .teamIds).wrappedValue - appIdName = try container.decode(String.self, forKey: .appIdName) - applicationIdPrefix = try container.decode([String].self, forKey: .applicationIdPrefix) - platforms = try container.decode([String].self, forKey: .platforms) - let entitlements = try Self.platformEntitlements(container, for: platforms) - appId = entitlements.appId - expirationDate = try container.decode(Date.self, forKey: .expirationDate) - developerCertificates = try container.decode([Data].self, forKey: .developerCertificates) - } - - private static func platformEntitlements( - _ container: KeyedDecodingContainer, - for platforms: [String] - ) throws -> Entitlements { - // OSX profiles are special because they use a different key to define the application identifier - if platforms.contains("OSX") { - try container.decode(DesktopEntitlements.self, forKey: .entitlements) - } else { - try container.decode(MobileEntitlements.self, forKey: .entitlements) - } - } -} - -extension ProvisioningProfile.Content { - private struct MobileEntitlements: Entitlements { - private(set) var appId: String - - enum CodingKeys: String, CodingKey { - case appId = "application-identifier" - } - } - - private struct DesktopEntitlements: Entitlements { - private(set) var appId: String - - enum CodingKeys: String, CodingKey { - case appId = "com.apple.application-identifier" - } - } -} diff --git a/Sources/TuistSigning/ProvisioningProfile/ProvisioningProfileParser.swift b/Sources/TuistSigning/ProvisioningProfile/ProvisioningProfileParser.swift deleted file mode 100644 index 575cb3597b5..00000000000 --- a/Sources/TuistSigning/ProvisioningProfile/ProvisioningProfileParser.swift +++ /dev/null @@ -1,72 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport - -enum ProvisioningProfileParserError: FatalError { - var type: ErrorType { - switch self { - case .valueNotFound, .invalidFormat: - return .abort - } - } - - var description: String { - switch self { - case let .valueNotFound(value, path): - return "Could not find \(value). Check if the provided xml at \(path.pathString) is valid." - case let .invalidFormat(provisioningProfile): - return "Provisioning Profile \(provisioningProfile) is in invalid format. Please name your certificates in the following way: Target.Configuration.mobileprovision" - } - } - - case valueNotFound(String, AbsolutePath) - case invalidFormat(String) -} - -protocol ProvisioningProfileParsing { - func parse(at path: AbsolutePath) throws -> ProvisioningProfile -} - -final class ProvisioningProfileParser: ProvisioningProfileParsing { - private let securityController: SecurityControlling - private let certificateParser: CertificateParsing - - init( - securityController: SecurityControlling = SecurityController(), - certificateParser: CertificateParsing = CertificateParser() - ) { - self.securityController = securityController - self.certificateParser = certificateParser - } - - func parse(at path: AbsolutePath) throws -> ProvisioningProfile { - let provisioningProfileComponents = path.basenameWithoutExt.components(separatedBy: ".") - guard provisioningProfileComponents.count == 2 - else { throw ProvisioningProfileParserError.invalidFormat(path.pathString) } - let targetName = provisioningProfileComponents[0] - let configurationName = provisioningProfileComponents[1] - - let unencryptedProvisioningProfile = try securityController.decodeFile(at: path) - let plistData = Data(unencryptedProvisioningProfile.utf8) - let provisioningProfileContent = try PropertyListDecoder().decode(ProvisioningProfile.Content.self, from: plistData) - - let developerCertificateFingerprints = try provisioningProfileContent.developerCertificates.map { - try certificateParser.parseFingerPrint(developerCertificate: $0) - } - - return ProvisioningProfile( - path: path, - name: provisioningProfileContent.name, - targetName: targetName, - configurationName: configurationName, - uuid: provisioningProfileContent.uuid, - teamId: provisioningProfileContent.teamId, - appId: provisioningProfileContent.appId, - appIdName: provisioningProfileContent.appIdName, - applicationIdPrefix: provisioningProfileContent.applicationIdPrefix, - platforms: provisioningProfileContent.platforms, - expirationDate: provisioningProfileContent.expirationDate, - developerCertificateFingerprints: developerCertificateFingerprints - ) - } -} diff --git a/Sources/TuistSigning/SecurityController.swift b/Sources/TuistSigning/SecurityController.swift deleted file mode 100644 index d76efb3f117..00000000000 --- a/Sources/TuistSigning/SecurityController.swift +++ /dev/null @@ -1,75 +0,0 @@ -import TSCBasic -import TuistSupport - -/// Controller for command line utility `security` -protocol SecurityControlling { - func decodeFile(at path: AbsolutePath) throws -> String - func importCertificate(_ certificate: Certificate, keychainPath: AbsolutePath) throws - func createKeychain(at path: AbsolutePath, password: String) throws - func unlockKeychain(at path: AbsolutePath, password: String) throws - func lockKeychain(at path: AbsolutePath, password: String) throws -} - -final class SecurityController: SecurityControlling { - func decodeFile(at path: AbsolutePath) throws -> String { - try System.shared.capture(["/usr/bin/security", "cms", "-D", "-i", path.pathString]) - } - - func importCertificate(_ certificate: Certificate, keychainPath: AbsolutePath) throws { - if try !certificateExists(certificate, keychainPath: keychainPath) { - try importToKeychain(at: certificate.publicKey, keychainPath: keychainPath) - logger.debug("Imported certificate at \(certificate.publicKey.pathString)") - - // found no way to check for the presence of a private key in the keychain, but fortunately keychain takes care of - // duplicate private keys on its own - try importToKeychain(at: certificate.privateKey, keychainPath: keychainPath) - logger.debug("Imported certificate private key at \(certificate.privateKey.pathString)") - } else { - logger.debug("Skipping importing certificate at \(certificate.publicKey.pathString) because it is already present") - } - } - - func createKeychain(at path: AbsolutePath, password: String) throws { - try System.shared.run(["/usr/bin/security", "create-keychain", "-p", password, path.pathString]) - logger.debug("Created keychain at \(path.pathString)") - } - - func unlockKeychain(at path: AbsolutePath, password: String) throws { - try System.shared.run(["/usr/bin/security", "unlock-keychain", "-p", password, path.pathString]) - logger.debug("Unlocked keychain at \(path.pathString)") - } - - func lockKeychain(at path: AbsolutePath, password: String) throws { - try System.shared.run(["/usr/bin/security", "lock-keychain", "-p", password, path.pathString]) - logger.debug("Locked keychain at \(path.pathString)") - } - - // MARK: - Helpers - - private func certificateExists(_ certificate: Certificate, keychainPath: AbsolutePath) throws -> Bool { - do { - let existingCertificates = try System.shared.capture([ - "/usr/bin/security", - "find-certificate", - "-c", - certificate.name, - "-a", - keychainPath.pathString, - ]) - return !existingCertificates.isEmpty - } catch { - return false - } - } - - private func importToKeychain(at path: AbsolutePath, keychainPath: AbsolutePath) throws { - try System.shared.run([ - "/usr/bin/security", - "import", path.pathString, - "-P", "", - "-T", "/usr/bin/codesign", - "-T", "/usr/bin/security", - "-k", keychainPath.pathString, - ]) - } -} diff --git a/Sources/TuistSigning/SigningFilesLocator.swift b/Sources/TuistSigning/SigningFilesLocator.swift deleted file mode 100644 index 129a0e41f17..00000000000 --- a/Sources/TuistSigning/SigningFilesLocator.swift +++ /dev/null @@ -1,61 +0,0 @@ -import TSCBasic -import TuistCore -import TuistSupport - -protocol SigningFilesLocating { - func locateSigningDirectory(from path: AbsolutePath) throws -> AbsolutePath? - func locateProvisioningProfiles(from path: AbsolutePath) throws -> [AbsolutePath] - func locateUnencryptedCertificates(from path: AbsolutePath) throws -> [AbsolutePath] - func locateEncryptedCertificates(from path: AbsolutePath) throws -> [AbsolutePath] - func locateUnencryptedPrivateKeys(from path: AbsolutePath) throws -> [AbsolutePath] - func locateEncryptedPrivateKeys(from path: AbsolutePath) throws -> [AbsolutePath] -} - -final class SigningFilesLocator: SigningFilesLocating { - private let rootDirectoryLocator: RootDirectoryLocating - - init(rootDirectoryLocator: RootDirectoryLocating = RootDirectoryLocator()) { - self.rootDirectoryLocator = rootDirectoryLocator - } - - func locateSigningDirectory(from path: AbsolutePath) throws -> AbsolutePath? { - guard let rootDirectory = rootDirectoryLocator.locate(from: path) - else { return nil } - let signingDirectory = rootDirectory.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return FileHandler.shared.exists(signingDirectory) ? signingDirectory : nil - } - - func locateProvisioningProfiles(from path: AbsolutePath) throws -> [AbsolutePath] { - try locateSigningFiles(at: path) - .filter { $0.extension == "mobileprovision" || $0.extension == "provisionprofile" } - } - - func locateUnencryptedCertificates(from path: AbsolutePath) throws -> [AbsolutePath] { - try locateSigningFiles(at: path) - .filter { $0.extension == "cer" } - } - - func locateEncryptedCertificates(from path: AbsolutePath) throws -> [AbsolutePath] { - try locateSigningFiles(at: path) - .filter { $0.pathString.hasSuffix("cer.encrypted") } - } - - func locateUnencryptedPrivateKeys(from path: AbsolutePath) throws -> [AbsolutePath] { - try locateSigningFiles(at: path) - .filter { $0.extension == "p12" } - } - - func locateEncryptedPrivateKeys(from path: AbsolutePath) throws -> [AbsolutePath] { - try locateSigningFiles(at: path) - .filter { $0.pathString.hasSuffix("p12.encrypted") } - } - - // MARK: - Helpers - - private func locateSigningFiles(at path: AbsolutePath) throws -> [AbsolutePath] { - guard let rootDirectory = rootDirectoryLocator.locate(from: path) - else { return [] } - let signingDirectory = rootDirectory.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return FileHandler.shared.glob(signingDirectory, glob: "*") - } -} diff --git a/Sources/TuistSigning/SigningInstaller.swift b/Sources/TuistSigning/SigningInstaller.swift deleted file mode 100644 index 9794d939b64..00000000000 --- a/Sources/TuistSigning/SigningInstaller.swift +++ /dev/null @@ -1,81 +0,0 @@ -import Foundation -import TSCBasic -import TuistCore -import TuistSupport - -extension LintingIssue { - static func noFileExtension(_ path: AbsolutePath) -> Self { - Self(reason: "Unable to parse extension from file at \(path.pathString)", severity: .error) - } - - static func expiredProvisioningProfile(_ profile: ProvisioningProfile) -> Self { - Self( - reason: "The provisioning profile \(profile.name) has expired. Bear in mind that attempting to export or run the app on a device might lead to an error.", - severity: .warning - ) - } -} - -/// Handles installing for signing (provisioning profiles, certificates ...) -protocol SigningInstalling { - func installProvisioningProfile(_ provisioningProfile: ProvisioningProfile) throws -> [LintingIssue] - /// Installs certificate to a given keychain - /// - Parameters: - /// - certificate: Certificate to be installed - /// - keychainPath: Path to keychain where the certificate should be installed to - func installCertificate(_ certificate: Certificate, keychainPath: AbsolutePath) throws -} - -final class SigningInstaller: SigningInstalling { - private let securityController: SecurityControlling - - init(securityController: SecurityControlling = SecurityController()) { - self.securityController = securityController - } - - func installProvisioningProfile(_ provisioningProfile: ProvisioningProfile) throws -> [LintingIssue] { - var issues = [LintingIssue]() - - if provisioningProfile.expirationDate < Date() { - issues.append(.expiredProvisioningProfile(provisioningProfile)) - } - - let provisioningProfilesPath = FileHandler.shared.homeDirectory - // swiftlint:disable:next force_try - .appending(try! RelativePath(validating: "Library/MobileDevice/Provisioning Profiles")) - if !FileHandler.shared.exists(provisioningProfilesPath) { - try FileHandler.shared.createFolder(provisioningProfilesPath) - } - let provisioningProfileSourcePath = provisioningProfile.path - guard let profileExtension = provisioningProfileSourcePath.extension - else { - issues.append(.noFileExtension(provisioningProfileSourcePath)) - return issues - } - - let provisioningProfilePath = provisioningProfilesPath - .appending(component: provisioningProfile.uuid + "." + profileExtension) - if FileHandler.shared.exists(provisioningProfilePath) { - try FileHandler.shared.delete(provisioningProfilePath) - } - try FileHandler.shared.copy( - from: provisioningProfileSourcePath, - to: provisioningProfilePath - ) - - logger - .debug( - "Installed provisioning profile \(provisioningProfileSourcePath.pathString) to \(provisioningProfilePath.pathString)" - ) - - return issues - } - - func installCertificate(_ certificate: Certificate, keychainPath: AbsolutePath) throws { - try securityController.importCertificate(certificate, keychainPath: keychainPath) - logger - .debug( - "Installed certificate with public key at \(certificate.publicKey.pathString) and private key at \(certificate.privateKey.pathString) to keychain at \(keychainPath.pathString)" - ) - } -} diff --git a/Sources/TuistSigning/SigningMatcher.swift b/Sources/TuistSigning/SigningMatcher.swift deleted file mode 100644 index 2fc938e8b83..00000000000 --- a/Sources/TuistSigning/SigningMatcher.swift +++ /dev/null @@ -1,59 +0,0 @@ -import Foundation -import TSCBasic -import TuistCore - -typealias Fingerprint = String -typealias TargetName = String -typealias ConfigurationName = String - -/// Matching signing artifacts -protocol SigningMatching { - /// - Returns: Certificates and provisioning profiles matched with their configuration and target - /// - Warning: Expects certificates and provisioning profiles already decrypted - func match(from path: AbsolutePath) throws -> ( - certificates: [Fingerprint: Certificate], - provisioningProfiles: [TargetName: [ConfigurationName: ProvisioningProfile]] - ) -} - -final class SigningMatcher: SigningMatching { - private let signingFilesLocator: SigningFilesLocating - private let provisioningProfileParser: ProvisioningProfileParsing - private let certificateParser: CertificateParsing - - init( - signingFilesLocator: SigningFilesLocating = SigningFilesLocator(), - provisioningProfileParser: ProvisioningProfileParsing = ProvisioningProfileParser(), - certificateParser: CertificateParsing = CertificateParser() - ) { - self.signingFilesLocator = signingFilesLocator - self.provisioningProfileParser = provisioningProfileParser - self.certificateParser = certificateParser - } - - func match(from path: AbsolutePath) throws -> ( - certificates: [Fingerprint: Certificate], - provisioningProfiles: [TargetName: [ConfigurationName: ProvisioningProfile]] - ) { - let certificateFiles = try signingFilesLocator.locateUnencryptedCertificates(from: path) - .sorted() - let privateKeyFiles = try signingFilesLocator.locateUnencryptedPrivateKeys(from: path) - .sorted() - let certificates: [Fingerprint: Certificate] = try zip(certificateFiles, privateKeyFiles) - .map(certificateParser.parse) - .reduce(into: [:]) { dict, certificate in - dict[certificate.fingerprint] = certificate - } - - let provisioningProfiles: [TargetName: [ConfigurationName: ProvisioningProfile]] = try signingFilesLocator - .locateProvisioningProfiles(from: path) - .map(provisioningProfileParser.parse) - .reduce(into: [:]) { dict, profile in - var currentTargetDict = dict[profile.targetName] ?? [:] - currentTargetDict[profile.configurationName] = profile - dict[profile.targetName] = currentTargetDict - } - - return (certificates: certificates, provisioningProfiles: provisioningProfiles) - } -} diff --git a/Sources/TuistSigningTesting/Extensions/Certificate+TestData.swift b/Sources/TuistSigningTesting/Extensions/Certificate+TestData.swift deleted file mode 100644 index 8be3643efec..00000000000 --- a/Sources/TuistSigningTesting/Extensions/Certificate+TestData.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation -import TSCBasic -@testable import TuistSigning - -extension Certificate { - static func test( - publicKey: AbsolutePath = try! AbsolutePath(validating: "/"), // swiftlint:disable:this force_try - privateKey: AbsolutePath = try! AbsolutePath(validating: "/"), // swiftlint:disable:this force_try - fingerprint: String = "", - developmentTeam: String = "", - name: String = "", - isRevoked: Bool = false - ) -> Certificate { - Certificate( - publicKey: publicKey, - privateKey: privateKey, - fingerprint: fingerprint, - developmentTeam: developmentTeam, - name: name, - isRevoked: isRevoked - ) - } -} diff --git a/Sources/TuistSigningTesting/Extensions/ProvisioningProfile+TestData.swift b/Sources/TuistSigningTesting/Extensions/ProvisioningProfile+TestData.swift deleted file mode 100644 index 091e916c114..00000000000 --- a/Sources/TuistSigningTesting/Extensions/ProvisioningProfile+TestData.swift +++ /dev/null @@ -1,36 +0,0 @@ -import TSCBasic -import XCTest -@testable import TuistSigning - -extension ProvisioningProfile { - public static func test( - // swiftlint:disable:next force_try - path: AbsolutePath = try! AbsolutePath(validating: "/targetName.configurationName.mobileprovision"), - name: String = "name", - targetName: String = "targetName", - configurationName: String = "configurationName", - uuid: String = "uuid", - teamId: String = "teamId", - appId: String = "appId", - appIdName: String = "appIdName", - applicationIdPrefix: [String] = [], - platforms: [String] = ["iOS"], - expirationDate: Date = Date().addingTimeInterval(100), - developerCertificateFingerprints: [String] = ["developerCertificateFingerprint"] - ) -> ProvisioningProfile { - ProvisioningProfile( - path: path, - name: name, - targetName: targetName, - configurationName: configurationName, - uuid: uuid, - teamId: teamId, - appId: appId, - appIdName: appIdName, - applicationIdPrefix: applicationIdPrefix, - platforms: platforms, - expirationDate: expirationDate, - developerCertificateFingerprints: developerCertificateFingerprints - ) - } -} diff --git a/Sources/TuistSigningTesting/Mocks/MockSigningCipher.swift b/Sources/TuistSigningTesting/Mocks/MockSigningCipher.swift deleted file mode 100644 index 17e193925d8..00000000000 --- a/Sources/TuistSigningTesting/Mocks/MockSigningCipher.swift +++ /dev/null @@ -1,21 +0,0 @@ -import TSCBasic -@testable import TuistSigning - -public final class MockSigningCipher: SigningCiphering { - public init() {} - - public var readMasterKeyStub: ((AbsolutePath) throws -> String)? - public func readMasterKey(at path: AbsolutePath) throws -> String { - try readMasterKeyStub?(path) ?? "" - } - - public var decryptSigningStub: ((AbsolutePath, Bool) throws -> Void)? - public func decryptSigning(at path: AbsolutePath, keepFiles: Bool) throws { - try decryptSigningStub?(path, keepFiles) - } - - public var encryptSigningStub: ((AbsolutePath, Bool) throws -> Void)? - public func encryptSigning(at path: AbsolutePath, keepFiles: Bool) throws { - try encryptSigningStub?(path, keepFiles) - } -} diff --git a/Sources/TuistSigningTesting/Mocks/MockSigningInstaller.swift b/Sources/TuistSigningTesting/Mocks/MockSigningInstaller.swift deleted file mode 100644 index 6d4f68ab2a1..00000000000 --- a/Sources/TuistSigningTesting/Mocks/MockSigningInstaller.swift +++ /dev/null @@ -1,17 +0,0 @@ -import TSCBasic -import TuistCore -@testable import TuistSigning - -public final class MockSigningInstaller: SigningInstalling { - public init() {} - - var installProvisioningProfileStub: ((ProvisioningProfile) throws -> [LintingIssue])? - public func installProvisioningProfile(_ provisioningProfile: ProvisioningProfile) throws -> [LintingIssue] { - try installProvisioningProfileStub?(provisioningProfile) ?? [] - } - - var installCertificateStub: ((Certificate, AbsolutePath) throws -> Void)? - public func installCertificate(_ certificate: Certificate, keychainPath: AbsolutePath) throws { - try installCertificateStub?(certificate, keychainPath) - } -} diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 67fc52ddd1f..c635369702f 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -10,7 +10,6 @@ public enum Constants { public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" public static let version = "3.42.2" public static let bundleName: String = "tuist.zip" - public static let envBundleName: String = "tuistenv.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" @@ -32,18 +31,10 @@ public enum Constants { /// Changing this results in changing the target hash and hence forcing a rebuild of its artifact. public static let cacheVersion = "1.0.0" - public enum DependenciesDirectory { - public static let dependenciesFileName = "Dependencies.swift" - public static let name = "Dependencies" - public static let graphName = "graph.json" - public static let lockfilesDirectoryName = "Lockfiles" - public static let cartfileName = "Cartfile" - public static let cartfileResolvedName = "Cartfile.resolved" + public enum SwiftPackageManager { public static let packageSwiftName = "Package.swift" public static let packageResolvedName = "Package.resolved" public static let packageBuildDirectoryName = ".build" - public static let carthageDirectoryName = "Carthage" - public static let swiftPackageManagerDirectoryName = "SwiftPackageManager" } public enum DerivedDirectory { @@ -64,7 +55,6 @@ public enum Constants { /// But only eg. for acceptance tests and other cases needed internally public enum EnvironmentVariables { public static let verbose = "TUIST_CONFIG_VERBOSE" - public static let colouredOutput = "TUIST_CONFIG_COLOURED_OUTPUT" public static let versionsDirectory = "TUIST_CONFIG_VERSIONS_DIRECTORY" public static let forceConfigCacheDirectory = "TUIST_CONFIG_FORCE_CONFIG_CACHE_DIRECTORY" public static let automationPath = "TUIST_CONFIG_AUTOMATION_PATH" diff --git a/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift b/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift index 2f1314910d6..13d9f5ce9f8 100644 --- a/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift +++ b/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift @@ -65,7 +65,7 @@ public struct PackageInfo: Hashable { // MARK: Platform extension PackageInfo { - public struct Platform: Decodable, Hashable { + public struct Platform: Codable, Hashable { public let platformName: String public let version: String public let options: [String] @@ -89,7 +89,7 @@ extension PackageInfo { // MARK: PackageConditionDescription extension PackageInfo { - public struct PackageConditionDescription: Decodable, Hashable { + public struct PackageConditionDescription: Codable, Hashable { public let platformNames: [String] public let config: String? @@ -106,7 +106,7 @@ extension PackageInfo { // MARK: - Product extension PackageInfo { - public struct Product: Decodable, Hashable { + public struct Product: Codable, Hashable { /// The name of the product. public let name: String @@ -162,7 +162,7 @@ extension PackageInfo.Product { // MARK: - Target extension PackageInfo { - public struct Target: Decodable, Hashable { + public struct Target: Codable, Hashable { private enum CodingKeys: String, CodingKey { case name, path, url, sources, packageAccess, resources, exclude, dependencies, publicHeadersPath, type, settings, checksum @@ -274,8 +274,8 @@ extension PackageInfo.Target { // MARK: Target.Resource extension PackageInfo.Target { - public struct Resource: Decodable, Hashable { - public enum Rule: String, Decodable, Hashable { + public struct Resource: Codable, Hashable { + public enum Rule: String, Codable, Hashable { case process case copy @@ -316,7 +316,7 @@ extension PackageInfo.Target { } } - public enum Localization: String, Decodable, Hashable { + public enum Localization: String, Codable, Hashable { case `default` case base } @@ -341,7 +341,7 @@ extension PackageInfo.Target { // MARK: Target.TargetType extension PackageInfo.Target { - public enum TargetType: String, Hashable, Decodable { + public enum TargetType: String, Hashable, Codable { case regular case executable case test @@ -358,7 +358,7 @@ extension PackageInfo.Target { /// A namespace for target-specific build settings. public enum TargetBuildSettingDescription { /// The tool for which a build setting is declared. - public enum Tool: String, Decodable, Hashable, CaseIterable { + public enum Tool: String, Codable, Hashable, CaseIterable { case c case cxx case swift @@ -366,7 +366,7 @@ extension PackageInfo.Target { } /// The name of the build setting. - public enum SettingName: String, Decodable, Hashable { + public enum SettingName: String, Codable, Hashable { case headerSearchPath case define case linkedLibrary @@ -377,7 +377,7 @@ extension PackageInfo.Target { } /// An individual build setting. - public struct Setting: Decodable, Hashable { + public struct Setting: Codable, Hashable { /// The tool associated with this setting. public let tool: Tool @@ -413,18 +413,18 @@ extension PackageInfo.Target { case tool, name, condition, value, kind } - public init(from decoder: Decoder) throws { - // Xcode 14 format - enum Kind: Codable, Equatable { - case headerSearchPath(String) - case define(String) - case linkedLibrary(String) - case linkedFramework(String) - case unsafeFlags([String]) - case enableUpcomingFeature(String) - case enableExperimentalFeature(String) - } + // Xcode 14 format + private enum Kind: Codable, Equatable { + case headerSearchPath(String) + case define(String) + case linkedLibrary(String) + case linkedFramework(String) + case unsafeFlags([String]) + case enableUpcomingFeature(String) + case enableExperimentalFeature(String) + } + public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) tool = try container.decode(Tool.self, forKey: .tool) @@ -458,13 +458,36 @@ extension PackageInfo.Target { value = try container.decode([String].self, forKey: .value) } } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + + try container.encode(tool, forKey: .tool) + try container.encodeIfPresent(condition, forKey: .condition) + switch name { + case .headerSearchPath: + try container.encode(Kind.headerSearchPath(value.first!), forKey: .kind) + case .define: + try container.encode(Kind.define(value.first!), forKey: .kind) + case .linkedLibrary: + try container.encode(Kind.linkedLibrary(value.first!), forKey: .kind) + case .linkedFramework: + try container.encode(Kind.linkedFramework(value.first!), forKey: .kind) + case .unsafeFlags: + try container.encode(Kind.unsafeFlags(value), forKey: .kind) + case .enableUpcomingFeature: + try container.encode(Kind.enableUpcomingFeature(value.first!), forKey: .kind) + case .enableExperimentalFeature: + try container.encode(Kind.enableExperimentalFeature(value.first!), forKey: .kind) + } + } } } } -// MARK: Decodable conformances +// MARK: Codable conformances -extension PackageInfo: Decodable { +extension PackageInfo: Codable { private enum CodingKeys: String, CodingKey { case products, targets, platforms, cLanguageStandard, cxxLanguageStandard, swiftLanguageVersions } @@ -482,7 +505,7 @@ extension PackageInfo: Decodable { } } -extension PackageInfo.Target.Dependency: Decodable { +extension PackageInfo.Target.Dependency: Codable { private enum CodingKeys: String, CodingKey { case target, product, byName } @@ -516,9 +539,37 @@ extension PackageInfo.Target.Dependency: Decodable { ) } } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + switch self { + case let .byName(name: name, condition: condition): + var unkeyedContainer = container.nestedUnkeyedContainer(forKey: .byName) + try unkeyedContainer.encode(name) + if let condition { + try unkeyedContainer.encode(condition) + } + case let .product(name: name, package: package, moduleAliases: moduleAliases, condition: condition): + var unkeyedContainer = container.nestedUnkeyedContainer(forKey: .product) + try unkeyedContainer.encode(name) + try unkeyedContainer.encode(package) + if let moduleAliases { + try unkeyedContainer.encode(moduleAliases) + } + if let condition { + try unkeyedContainer.encode(condition) + } + case let .target(name: name, condition: condition): + var unkeyedContainer = container.nestedUnkeyedContainer(forKey: .target) + try unkeyedContainer.encode(name) + if let condition { + try unkeyedContainer.encode(condition) + } + } + } } -extension PackageInfo.Product.ProductType: Decodable { +extension PackageInfo.Product.ProductType: Codable { private enum CodingKeys: String, CodingKey { case library, executable, plugin, test } @@ -542,6 +593,22 @@ extension PackageInfo.Product.ProductType: Decodable { self = .plugin } } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + + switch self { + case .executable: + try container.encode(CodingKeys.executable.rawValue, forKey: .executable) + case .plugin: + try container.encode(CodingKeys.plugin.rawValue, forKey: .plugin) + case .test: + try container.encode(CodingKeys.test.rawValue, forKey: .test) + case let .library(libraryType): + var nestedContainer = container.nestedUnkeyedContainer(forKey: .library) + try nestedContainer.encode(libraryType) + } + } } extension PackageInfo.Target.TargetType { diff --git a/Sources/TuistSupport/System/System.swift b/Sources/TuistSupport/System/System.swift index 05bfcdd2952..0e9d3c0fa71 100644 --- a/Sources/TuistSupport/System/System.swift +++ b/Sources/TuistSupport/System/System.swift @@ -72,7 +72,7 @@ public final class System: Systeming { // swiftlint:disable force_try - /// Regex expression used to get the Swift version (for example, 5.7) from the output of the 'swift --version' command. + /// Regex expression used to get the Swift version (for example, 5.9) from the output of the 'swift --version' command. private static var swiftVersionRegex = try! NSRegularExpression(pattern: "Apple Swift version\\s(.+)\\s\\(.+\\)", options: []) /// Regex expression used to get the Swiftlang version (for example, 5.7.0.127.4) from the output of the 'swift --version' diff --git a/Sources/TuistSupport/Utils/Environment.swift b/Sources/TuistSupport/Utils/Environment.swift index e33e554194a..100876310a0 100644 --- a/Sources/TuistSupport/Utils/Environment.swift +++ b/Sources/TuistSupport/Utils/Environment.swift @@ -1,4 +1,4 @@ -import Darwin.C +import Darwin import Foundation import TSCBasic @@ -91,10 +91,23 @@ public class Environment: Environmenting { /// Returns true if the output of Tuist should be coloured. public var shouldOutputBeColoured: Bool { - if let coloredOutput = ProcessInfo.processInfo.environment[Constants.EnvironmentVariables.colouredOutput] { - return Constants.trueValues.contains(coloredOutput) + let noColor = if let noColorEnvVariable = ProcessInfo.processInfo.environment["NO_COLOR"] { + Constants.trueValues.contains(noColorEnvVariable) } else { - return isStandardOutputInteractive + false + } + let ciColorForce = if let ciColorForceEnvVariable = ProcessInfo.processInfo.environment["CLICOLOR_FORCE"] { + Constants.trueValues.contains(ciColorForceEnvVariable) + } else { + false + } + if noColor { + return false + } else if ciColorForce { + return true + } else { + let isPiped = isatty(fileno(stdout)) == 0 + return !isPiped } } diff --git a/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift b/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift index 80616164846..5925c6b2188 100644 --- a/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift +++ b/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift @@ -1,3 +1,4 @@ +import Difference import Foundation import TSCBasic import XCTest @@ -167,6 +168,26 @@ open class TuistTestCase: XCTestCase { return paths } + public func XCTAssertBetterEqual( + _ expected: @autoclosure () throws -> T, + _ received: @autoclosure () throws -> T, + file: StaticString = #filePath, + line: UInt = #line + ) { + do { + let expected = try expected() + let received = try received() + XCTAssertTrue( + expected == received, + "Found difference for \n" + diff(expected, received).joined(separator: ", "), + file: file, + line: line + ) + } catch { + XCTFail("Caught error while testing: \(error)", file: file, line: line) + } + } + public func XCTAssertPrinterOutputContains(_ expected: String, file: StaticString = #file, line: UInt = #line) { XCTAssertPrinterContains(expected, at: .warning, >=, file: file, line: line) } diff --git a/Sources/tuistenv/main.swift b/Sources/tuistenv/main.swift deleted file mode 100644 index 9e7d74a134f..00000000000 --- a/Sources/tuistenv/main.swift +++ /dev/null @@ -1,19 +0,0 @@ -import Foundation -import TuistEnvKit -import TuistSupport - -try TuistSupport.Environment.shared.bootstrap() -LogOutput.bootstrap() - -WarningController.shared.append(warning: """ -The method used to install this version of Tuist is deprecated and will be deleted soon. -Please, uninstall it by running: - - curl -Ls https://uninstall.tuist.io | bash - -And follow the new installation instructions at https://docs.tuist.io/documentation/tuist/installation - -Read more about the rationale at https://tuist.io/blog/2023/12/15/rtx-default/ -""") - -TuistCommand.main() diff --git a/Sources/tuistfixturegenerator/Templates/ManifestTemplate.swift b/Sources/tuistfixturegenerator/Templates/ManifestTemplate.swift index 6f8fc873318..bda876983df 100644 --- a/Sources/tuistfixturegenerator/Templates/ManifestTemplate.swift +++ b/Sources/tuistfixturegenerator/Templates/ManifestTemplate.swift @@ -27,9 +27,9 @@ class ManifestTemplate { """ private let targetTemplate = """ - Target( + .target( name: "{TargetName}", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.{TargetName}", infoPlist: .default, diff --git a/Templates/AppProject.stencil b/Templates/AppProject.stencil deleted file mode 100644 index ea3d0b6ff7d..00000000000 --- a/Templates/AppProject.stencil +++ /dev/null @@ -1,29 +0,0 @@ -import ProjectDescription -import ProjectDescriptionHelpers -import MyPlugin - -/* - +-------------+ - | | - | App | Contains {{ name }} App target and {{ name }} unit-test target - | | - +------+-------------+-------+ - | depends on | - | | - +----v-----+ +-----v-----+ - | | | | - | Kit | | UI | Two independent frameworks to share code and start modularising your app - | | | | - +----------+ +-----------+ - - */ - -// MARK: - Project - -// Local plugin loaded -let localHelper = LocalHelper(name: "MyPlugin") - -// Creates our project using a helper function defined in ProjectDescriptionHelpers -let project = Project.app(name: "{{ name }}", - destinations: .{{ platform }}, - additionalTargets: ["{{name}}Kit", "{{name}}UI"]) diff --git a/Templates/Config.stencil b/Templates/Config.stencil deleted file mode 100644 index 66e92c6e0c4..00000000000 --- a/Templates/Config.stencil +++ /dev/null @@ -1,7 +0,0 @@ -import ProjectDescription - -let config = Config( - plugins: [ - .local(path: .relativeToManifest("../../Plugins/{{ name }}")), - ] -) diff --git a/Templates/KitSource.stencil b/Templates/KitSource.stencil deleted file mode 100644 index 89d02ef60f6..00000000000 --- a/Templates/KitSource.stencil +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation - -public final class {{ name }}Kit { - public static func hello() { - print("Hello, from your Kit framework") - } -} diff --git a/Templates/KitTests.stencil b/Templates/KitTests.stencil deleted file mode 100644 index c7cfa778905..00000000000 --- a/Templates/KitTests.stencil +++ /dev/null @@ -1,8 +0,0 @@ -import Foundation -import XCTest - -final class {{ name }}KitTests: XCTestCase { - func test_example() { - XCTAssertEqual("{{ name }}Kit", "{{ name }}Kit") - } -} \ No newline at end of file diff --git a/Templates/LocalHelper.stencil b/Templates/LocalHelper.stencil deleted file mode 100644 index 6f49a442dac..00000000000 --- a/Templates/LocalHelper.stencil +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation - -public struct LocalHelper { - let name: String - - public init(name: String) { - self.name = name - } -} diff --git a/Templates/Package.stencil b/Templates/Package.stencil deleted file mode 100644 index c532f25aeac..00000000000 --- a/Templates/Package.stencil +++ /dev/null @@ -1,15 +0,0 @@ -// swift-tools-version: 5.8 - -import PackageDescription - -let package = Package( - name: "MyPlugin", - products: [ - .executable(name: "tuist-my-cli", targets: ["tuist-my-cli"]), - ], - targets: [ - .executableTarget( - name: "tuist-my-cli" - ), - ] -) diff --git a/Templates/Package.swift b/Templates/Package.swift deleted file mode 100644 index 9f926b36a46..00000000000 --- a/Templates/Package.swift +++ /dev/null @@ -1 +0,0 @@ -import PackageDescription diff --git a/Templates/Plugin.stencil b/Templates/Plugin.stencil deleted file mode 100644 index 86a1e55b856..00000000000 --- a/Templates/Plugin.stencil +++ /dev/null @@ -1,3 +0,0 @@ -import ProjectDescription - -let plugin = Plugin(name: "MyPlugin") \ No newline at end of file diff --git a/Templates/Project+Templates.stencil b/Templates/Project+Templates.stencil deleted file mode 100644 index 2d157bda45c..00000000000 --- a/Templates/Project+Templates.stencil +++ /dev/null @@ -1,74 +0,0 @@ -import ProjectDescription - -/// Project helpers are functions that simplify the way you define your project. -/// Share code to create targets, settings, dependencies, -/// Create your own conventions, e.g: a func that makes sure all shared targets are "static frameworks" -/// See https://docs.tuist.io/guides/helpers/ - -extension Project { - /// Helper function to create the Project for this ExampleApp - public static func app(name: String, destinations: Destinations, additionalTargets: [String]) -> Project { - var targets = makeAppTargets(name: name, - destinations: destinations, - dependencies: additionalTargets.map { TargetDependency.target(name: $0) }) - targets += additionalTargets.flatMap({ makeFrameworkTargets(name: $0, destinations: destinations) }) - return Project(name: name, - organizationName: "tuist.io", - targets: targets) - } - - // MARK: - Private - - /// Helper function to create a framework target and an associated unit test target - private static func makeFrameworkTargets(name: String, destinations: Destinations) -> [Target] { - let sources = Target(name: name, - destinations: destinations, - product: .framework, - bundleId: "io.tuist.\(name)", - infoPlist: .default, - sources: ["Targets/\(name)/Sources/**"], - resources: [], - dependencies: []) - let tests = Target(name: "\(name)Tests", - destinations: destinations, - product: .unitTests, - bundleId: "io.tuist.\(name)Tests", - infoPlist: .default, - sources: ["Targets/\(name)/Tests/**"], - resources: [], - dependencies: [.target(name: name)]) - return [sources, tests] - } - - /// Helper function to create the application target and the unit test target. - private static func makeAppTargets(name: String, destinations: Destinations, dependencies: [TargetDependency]) -> [Target] { - let infoPlist: [String: Plist.Value] = [ - "CFBundleShortVersionString": "1.0", - "CFBundleVersion": "1", - "UILaunchStoryboardName": "LaunchScreen" - ] - - let mainTarget = Target( - name: name, - destinations: destinations, - product: .app, - bundleId: "io.tuist.\(name)", - infoPlist: .extendingDefault(with: infoPlist), - sources: ["Targets/\(name)/Sources/**"], - resources: ["Targets/\(name)/Resources/**"], - dependencies: dependencies - ) - - let testTarget = Target( - name: "\(name)Tests", - destinations: destinations, - product: .unitTests, - bundleId: "io.tuist.\(name)Tests", - infoPlist: .default, - sources: ["Targets/\(name)/Tests/**"], - dependencies: [ - .target(name: "\(name)") - ]) - return [mainTarget, testTarget] - } -} diff --git a/Templates/UISource.stencil b/Templates/UISource.stencil deleted file mode 100644 index 3fc2ac74a17..00000000000 --- a/Templates/UISource.stencil +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation - -public final class {{ name }}UI { - public static func hello() { - print("Hello, from your UI framework") - } -} diff --git a/Templates/UITests.stencil b/Templates/UITests.stencil deleted file mode 100644 index 67c7bf615a8..00000000000 --- a/Templates/UITests.stencil +++ /dev/null @@ -1,8 +0,0 @@ -import Foundation -import XCTest - -final class {{ name }}UITests: XCTestCase { - func test_example() { - XCTAssertEqual("{{ name }}UI", "{{ name }}UI") - } -} \ No newline at end of file diff --git a/Templates/default/AppDelegate.stencil b/Templates/default/AppDelegate.stencil deleted file mode 100644 index 99814119a8c..00000000000 --- a/Templates/default/AppDelegate.stencil +++ /dev/null @@ -1,43 +0,0 @@ -{% if platform == "macOS" %}import Cocoa -import {{ name }}Kit -import {{ name }}UI - -@main -class AppDelegate: NSObject, NSApplicationDelegate { - - @IBOutlet weak var window: NSWindow! - - func applicationDidFinishLaunching(_ aNotification: Notification) { - // Insert code here to initialize your application - } - - func applicationWillTerminate(_ aNotification: Notification) { - // Insert code here to tear down your application - } - -}{% else %}import UIKit -import {{ name }}Kit -import {{ name }}UI - -@main -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil - ) -> Bool { - window = UIWindow(frame: UIScreen.main.bounds) - let viewController = UIViewController() - viewController.view.backgroundColor = .white - window?.rootViewController = viewController - window?.makeKeyAndVisible() - - {{ name }}Kit.hello() - {{ name }}UI.hello() - - return true - } - -}{% endif %} diff --git a/Templates/default/AppProject.stencil b/Templates/default/AppProject.stencil new file mode 100644 index 00000000000..1cbf77f56a4 --- /dev/null +++ b/Templates/default/AppProject.stencil @@ -0,0 +1,31 @@ +import ProjectDescription + +let project = Project( + name: "{{ name }}", + targets: [ + .target( + name: "{{ name }}", + destinations: .{{ platform }}, + product: .app, + bundleId: "io.tuist.{{ name }}", + infoPlist: .extendingDefault( + with: [ + "UILaunchStoryboardName": "LaunchScreen.storyboard", + ] + ), + sources: ["{{ name }}/Sources/**"], + resources: ["{{ name }}/Resources/**"], + dependencies: [] + ), + .target( + name: "{{ name }}Tests", + destinations: .{{ platform }}, + product: .unitTests, + bundleId: "io.tuist.{{ name }}Tests", + infoPlist: .default, + sources: ["{{ name }}/Tests/**"], + resources: [], + dependencies: [.target(name: "{{ name }}")] + ), + ] +) diff --git a/Templates/AppTests.stencil b/Templates/default/AppTests.stencil similarity index 100% rename from Templates/AppTests.stencil rename to Templates/default/AppTests.stencil diff --git a/Templates/swiftui/ContentView.stencil b/Templates/default/ContentView.stencil similarity index 100% rename from Templates/swiftui/ContentView.stencil rename to Templates/default/ContentView.stencil diff --git a/Templates/Gitignore.stencil b/Templates/default/Gitignore.stencil similarity index 100% rename from Templates/Gitignore.stencil rename to Templates/default/Gitignore.stencil diff --git a/Templates/LaunchScreen+iOS.stencil b/Templates/default/LaunchScreen+iOS.stencil similarity index 100% rename from Templates/LaunchScreen+iOS.stencil rename to Templates/default/LaunchScreen+iOS.stencil diff --git a/Templates/LaunchScreen+macOS.stencil b/Templates/default/LaunchScreen+macOS.stencil similarity index 100% rename from Templates/LaunchScreen+macOS.stencil rename to Templates/default/LaunchScreen+macOS.stencil diff --git a/Templates/LaunchScreen+tvOS.stencil b/Templates/default/LaunchScreen+tvOS.stencil similarity index 100% rename from Templates/LaunchScreen+tvOS.stencil rename to Templates/default/LaunchScreen+tvOS.stencil diff --git a/Templates/swiftui/Preview Content/Preview Assets.xcassets/Contents.json b/Templates/default/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from Templates/swiftui/Preview Content/Preview Assets.xcassets/Contents.json rename to Templates/default/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/Templates/swiftui/app.stencil b/Templates/default/app.stencil similarity index 87% rename from Templates/swiftui/app.stencil rename to Templates/default/app.stencil index be85e855a64..e9a32cea9a0 100644 --- a/Templates/swiftui/app.stencil +++ b/Templates/default/app.stencil @@ -1,5 +1,4 @@ import SwiftUI -import {{ name }}UI @main struct {{ name }}App: App { diff --git a/Templates/default/default.swift b/Templates/default/default.swift index e8da38ecc41..04ee4f42513 100644 --- a/Templates/default/default.swift +++ b/Templates/default/default.swift @@ -3,14 +3,7 @@ import ProjectDescription let nameAttribute: Template.Attribute = .required("name") let platformAttribute: Template.Attribute = .optional("platform", default: "iOS") let projectPath = "." -let appPath = "Targets/\(nameAttribute)" -let kitFrameworkPath = "Targets/\(nameAttribute)Kit" -let uiFrameworkPath = "Targets/\(nameAttribute)UI" -let taskPath = "Plugins/\(nameAttribute)" - -func templatePath(_ path: String) -> Path { - "../\(path)" -} +let appPath = "./\(nameAttribute)" let template = Template( description: "Default template", @@ -19,65 +12,37 @@ let template = Template( platformAttribute, ], items: [ - .file( - path: "Tuist/ProjectDescriptionHelpers/Project+Templates.swift", - templatePath: templatePath("Project+Templates.stencil") - ), .file( path: projectPath + "/Project.swift", - templatePath: templatePath("AppProject.stencil") - ), - .file( - path: appPath + "/Sources/AppDelegate.swift", - templatePath: "AppDelegate.stencil" + templatePath: "AppProject.stencil" ), .file( - path: appPath + "/Resources/LaunchScreen.storyboard", - templatePath: templatePath("LaunchScreen+\(platformAttribute).stencil") + path: appPath + "/Sources/\(nameAttribute)App.swift", + templatePath: "app.stencil" ), .file( - path: appPath + "/Tests/AppTests.swift", - templatePath: templatePath("AppTests.stencil") + path: appPath + "/Sources/ContentView.swift", + templatePath: "ContentView.stencil" ), - .file( - path: kitFrameworkPath + "/Sources/\(nameAttribute)Kit.swift", - templatePath: templatePath("/KitSource.stencil") + .directory( + path: appPath + "/Resources", + sourcePath: "\(platformAttribute)/Assets.xcassets" ), - .file( - path: kitFrameworkPath + "/Tests/\(nameAttribute)KitTests.swift", - templatePath: templatePath("/KitTests.stencil") - ), - .file( - path: uiFrameworkPath + "/Sources/\(nameAttribute)UI.swift", - templatePath: templatePath("/UISource.stencil") + .directory( + path: appPath + "/Resources", + sourcePath: "Preview Content" ), .file( - path: uiFrameworkPath + "/Tests/\(nameAttribute)UITests.swift", - templatePath: templatePath("/UITests.stencil") - ), - .file( - path: taskPath + "/Sources/tuist-my-cli/main.swift", - templatePath: templatePath("/main.stencil") - ), - .file( - path: taskPath + "/ProjectDescriptionHelpers/LocalHelper.swift", - templatePath: templatePath("/LocalHelper.stencil") - ), - .file( - path: taskPath + "/Package.swift", - templatePath: templatePath("/Package.stencil") - ), - .file( - path: taskPath + "/Plugin.swift", - templatePath: templatePath("/Plugin.stencil") + path: appPath + "/Tests/\(nameAttribute)Tests.swift", + templatePath: "AppTests.stencil" ), .file( path: ".gitignore", - templatePath: templatePath("Gitignore.stencil") + templatePath: "Gitignore.stencil" ), .file( - path: "Tuist/Config.swift", - templatePath: templatePath("Config.stencil") + path: appPath + "/Resources/LaunchScreen.storyboard", + templatePath: "LaunchScreen+\(platformAttribute).stencil" ), ] ) diff --git a/Templates/swiftui/ios/Assets.xcassets/AccentColor.colorset/Contents.json b/Templates/default/ios/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from Templates/swiftui/ios/Assets.xcassets/AccentColor.colorset/Contents.json rename to Templates/default/ios/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/Templates/swiftui/ios/Assets.xcassets/AppIcon.appiconset/Contents.json b/Templates/default/ios/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Templates/swiftui/ios/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Templates/default/ios/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Templates/swiftui/ios/Assets.xcassets/Contents.json b/Templates/default/ios/Assets.xcassets/Contents.json similarity index 100% rename from Templates/swiftui/ios/Assets.xcassets/Contents.json rename to Templates/default/ios/Assets.xcassets/Contents.json diff --git a/Templates/swiftui/macos/Assets.xcassets/AccentColor.colorset/Contents.json b/Templates/default/macos/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from Templates/swiftui/macos/Assets.xcassets/AccentColor.colorset/Contents.json rename to Templates/default/macos/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/Templates/swiftui/macos/Assets.xcassets/AppIcon.appiconset/Contents.json b/Templates/default/macos/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Templates/swiftui/macos/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Templates/default/macos/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Templates/swiftui/macos/Assets.xcassets/Contents.json b/Templates/default/macos/Assets.xcassets/Contents.json similarity index 100% rename from Templates/swiftui/macos/Assets.xcassets/Contents.json rename to Templates/default/macos/Assets.xcassets/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/AccentColor.colorset/Contents.json b/Templates/default/tvos/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/AccentColor.colorset/Contents.json rename to Templates/default/tvos/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json b/Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json rename to Templates/default/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json diff --git a/Templates/swiftui/tvos/Assets.xcassets/Contents.json b/Templates/default/tvos/Assets.xcassets/Contents.json similarity index 100% rename from Templates/swiftui/tvos/Assets.xcassets/Contents.json rename to Templates/default/tvos/Assets.xcassets/Contents.json diff --git a/Templates/default/watchos/Assets.xcassets/AccentColor.colorset/Contents.json b/Templates/default/watchos/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000000..eb878970081 --- /dev/null +++ b/Templates/default/watchos/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Templates/default/watchos/Assets.xcassets/AppIcon.appiconset/Contents.json b/Templates/default/watchos/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..49c81cd8c4c --- /dev/null +++ b/Templates/default/watchos/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "watchos", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Templates/default/watchos/Assets.xcassets/Contents.json b/Templates/default/watchos/Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/Templates/default/watchos/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Templates/main.stencil b/Templates/main.stencil deleted file mode 100644 index 6f059694c4b..00000000000 --- a/Templates/main.stencil +++ /dev/null @@ -1 +0,0 @@ -print("Hello, from your Tuist Task") \ No newline at end of file diff --git a/Templates/swiftui/swiftui.swift b/Templates/swiftui/swiftui.swift deleted file mode 100644 index a1f937a4dc2..00000000000 --- a/Templates/swiftui/swiftui.swift +++ /dev/null @@ -1,87 +0,0 @@ -import ProjectDescription - -let nameAttribute: Template.Attribute = .required("name") -let platformAttribute: Template.Attribute = .optional("platform", default: "iOS") -let projectPath = "." -let appPath = "Targets/\(nameAttribute)" -let kitFrameworkPath = "Targets/\(nameAttribute)Kit" -let uiFrameworkPath = "Targets/\(nameAttribute)UI" -let taskPath = "Plugins/\(nameAttribute)" - -func templatePath(_ path: String) -> Path { - "../\(path)" -} - -let template = Template( - description: "SwiftUI template", - attributes: [ - nameAttribute, - platformAttribute, - ], - items: [ - .file( - path: "Tuist/ProjectDescriptionHelpers/Project+Templates.swift", - templatePath: templatePath("Project+Templates.stencil") - ), - .file( - path: projectPath + "/Project.swift", - templatePath: templatePath("AppProject.stencil") - ), - .file( - path: appPath + "/Sources/\(nameAttribute)App.swift", - templatePath: "app.stencil" - ), - .file( - path: uiFrameworkPath + "/Sources/ContentView.swift", - templatePath: "ContentView.stencil" - ), - .directory( - path: appPath + "/Resources", - sourcePath: "\(platformAttribute)/Assets.xcassets" - ), - .directory( - path: appPath + "/Resources", - sourcePath: "Preview Content" - ), - .file( - path: appPath + "/Tests/\(nameAttribute)Tests.swift", - templatePath: templatePath("AppTests.stencil") - ), - .file( - path: kitFrameworkPath + "/Sources/\(nameAttribute)Kit.swift", - templatePath: templatePath("KitSource.stencil") - ), - .file( - path: kitFrameworkPath + "/Tests/\(nameAttribute)KitTests.swift", - templatePath: templatePath("/KitTests.stencil") - ), - .file( - path: uiFrameworkPath + "/Tests/\(nameAttribute)UITests.swift", - templatePath: templatePath("/UITests.stencil") - ), - .file( - path: taskPath + "/Sources/tuist-my-cli/main.swift", - templatePath: templatePath("/main.stencil") - ), - .file( - path: taskPath + "/ProjectDescriptionHelpers/LocalHelper.swift", - templatePath: templatePath("/LocalHelper.stencil") - ), - .file( - path: taskPath + "/Package.swift", - templatePath: templatePath("/Package.stencil") - ), - .file( - path: taskPath + "/Plugin.swift", - templatePath: templatePath("/Plugin.stencil") - ), - .file( - path: ".gitignore", - templatePath: templatePath("Gitignore.stencil") - ), - .file( - path: "Tuist/Config.swift", - templatePath: templatePath("Config.stencil") - ), - ] -) diff --git a/Tests/Fixtures/Carthage/2510FE01-4D40-3956-BB71-857D3B2D9E73.bcsymbolmap b/Tests/Fixtures/PrebuiltFramework/2510FE01-4D40-3956-BB71-857D3B2D9E73.bcsymbolmap similarity index 100% rename from Tests/Fixtures/Carthage/2510FE01-4D40-3956-BB71-857D3B2D9E73.bcsymbolmap rename to Tests/Fixtures/PrebuiltFramework/2510FE01-4D40-3956-BB71-857D3B2D9E73.bcsymbolmap diff --git a/Tests/Fixtures/Carthage/773847A9-0D05-35AF-9865-94A9A670080B.bcsymbolmap b/Tests/Fixtures/PrebuiltFramework/773847A9-0D05-35AF-9865-94A9A670080B.bcsymbolmap similarity index 100% rename from Tests/Fixtures/Carthage/773847A9-0D05-35AF-9865-94A9A670080B.bcsymbolmap rename to Tests/Fixtures/PrebuiltFramework/773847A9-0D05-35AF-9865-94A9A670080B.bcsymbolmap diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework.dSYM/Contents/Info.plist b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework.dSYM/Contents/Info.plist similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework.dSYM/Contents/Info.plist rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework.dSYM/Contents/Info.plist diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework.dSYM/Contents/Resources/DWARF/RxBlocking b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework.dSYM/Contents/Resources/DWARF/RxBlocking similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework.dSYM/Contents/Resources/DWARF/RxBlocking rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework.dSYM/Contents/Resources/DWARF/RxBlocking diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Headers/RxBlocking-Swift.h b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Headers/RxBlocking-Swift.h similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Headers/RxBlocking-Swift.h rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Headers/RxBlocking-Swift.h diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Info.plist b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Info.plist similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Info.plist rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Info.plist diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm.swiftdoc b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm.swiftdoc similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm.swiftdoc rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm.swiftdoc diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm.swiftmodule b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm.swiftmodule similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm.swiftmodule rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm.swiftmodule diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64-apple-ios.swiftdoc b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64-apple-ios.swiftdoc similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64-apple-ios.swiftdoc rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64-apple-ios.swiftdoc diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64-apple-ios.swiftmodule b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64-apple-ios.swiftmodule similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64-apple-ios.swiftmodule rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64-apple-ios.swiftmodule diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64.swiftdoc b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64.swiftdoc similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64.swiftdoc rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64.swiftdoc diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64.swiftmodule b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64.swiftmodule similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64.swiftmodule rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/arm64.swiftmodule diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7-apple-ios.swiftdoc b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7-apple-ios.swiftdoc similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7-apple-ios.swiftdoc rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7-apple-ios.swiftdoc diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7-apple-ios.swiftmodule b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7-apple-ios.swiftmodule similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7-apple-ios.swiftmodule rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7-apple-ios.swiftmodule diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7.swiftdoc b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7.swiftdoc similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7.swiftdoc rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7.swiftdoc diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7.swiftmodule b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7.swiftmodule similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7.swiftmodule rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/armv7.swiftmodule diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386-apple-ios-simulator.swiftdoc b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386-apple-ios-simulator.swiftdoc similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386-apple-ios-simulator.swiftdoc rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386-apple-ios-simulator.swiftdoc diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386-apple-ios-simulator.swiftmodule b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386-apple-ios-simulator.swiftmodule similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386-apple-ios-simulator.swiftmodule rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386-apple-ios-simulator.swiftmodule diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386.swiftdoc b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386.swiftdoc similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386.swiftdoc rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386.swiftdoc diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386.swiftmodule b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386.swiftmodule similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386.swiftmodule rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/i386.swiftmodule diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64-apple-ios-simulator.swiftdoc b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64-apple-ios-simulator.swiftdoc similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64-apple-ios-simulator.swiftdoc rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64-apple-ios-simulator.swiftdoc diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64-apple-ios-simulator.swiftmodule b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64-apple-ios-simulator.swiftmodule similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64-apple-ios-simulator.swiftmodule rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64-apple-ios-simulator.swiftmodule diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64.swiftdoc b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64.swiftdoc similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64.swiftdoc rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64.swiftdoc diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64.swiftmodule b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64.swiftmodule similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64.swiftmodule rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/RxBlocking.swiftmodule/x86_64.swiftmodule diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/Modules/module.modulemap b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/module.modulemap similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/Modules/module.modulemap rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/Modules/module.modulemap diff --git a/Tests/Fixtures/Carthage/RxBlocking.framework/RxBlocking b/Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/RxBlocking similarity index 100% rename from Tests/Fixtures/Carthage/RxBlocking.framework/RxBlocking rename to Tests/Fixtures/PrebuiltFramework/RxBlocking.framework/RxBlocking diff --git a/Tests/Fixtures/WorkspaceWithPlugins/LocalPlugin/ProjectDescriptionHelpers/Project+Template.swift b/Tests/Fixtures/WorkspaceWithPlugins/LocalPlugin/ProjectDescriptionHelpers/Project+Template.swift index e7c0b3d87e6..83cc0a70290 100644 --- a/Tests/Fixtures/WorkspaceWithPlugins/LocalPlugin/ProjectDescriptionHelpers/Project+Template.swift +++ b/Tests/Fixtures/WorkspaceWithPlugins/LocalPlugin/ProjectDescriptionHelpers/Project+Template.swift @@ -2,9 +2,9 @@ import ProjectDescription extension Target { public static func app(name: String, dependencies: [TargetDependency] = []) -> Target { - Target( + .target( name: name, - platform: .iOS, + destinations: [.iPhone, .iPad], product: .app, bundleId: .bundleId(for: name), infoPlist: .default, @@ -15,9 +15,9 @@ extension Target { } public static func framework(name: String, dependencies: [TargetDependency] = []) -> Target { - Target( + .target( name: name, - platform: .iOS, + destinations: [.iPhone, .iPad], product: .framework, bundleId: .bundleId(for: name), infoPlist: .default, diff --git a/Tests/ProjectDescriptionTests/CoreDataModelTests.swift b/Tests/ProjectDescriptionTests/CoreDataModelTests.swift index d07031a88b3..b7b56b85fa8 100644 --- a/Tests/ProjectDescriptionTests/CoreDataModelTests.swift +++ b/Tests/ProjectDescriptionTests/CoreDataModelTests.swift @@ -6,7 +6,7 @@ import XCTest final class CoreDataModelTests: XCTestCase { func test_toJSON() { - let subject = CoreDataModel("path", currentVersion: "current") + let subject: CoreDataModel = .coreDataModel("path", currentVersion: "current") XCTAssertCodable(subject) } } diff --git a/Tests/ProjectDescriptionTests/Dependencies/CarthageDependenciesTests.swift b/Tests/ProjectDescriptionTests/Dependencies/CarthageDependenciesTests.swift deleted file mode 100644 index 582ee170234..00000000000 --- a/Tests/ProjectDescriptionTests/Dependencies/CarthageDependenciesTests.swift +++ /dev/null @@ -1,61 +0,0 @@ -import Foundation -import XCTest - -@testable import ProjectDescription - -final class CarthageDependenciesTests: XCTestCase { - func test_carthageDependencies_codable() throws { - let subject: CarthageDependencies = [ - .github(path: "Dependency/Dependency", requirement: .revision("xyz")), - .git(path: "Git/Git", requirement: .atLeast("1.2.3")), - ] - XCTAssertCodable(subject) - } - - // MARK: - Carthage Origin tests - - func test_carthageDependency_github_codable() throws { - let subject: CarthageDependencies.Dependency = .github(path: "Path/Path", requirement: .branch("branch_name")) - XCTAssertCodable(subject) - } - - func test_carthageDependency_git_codable() throws { - let subject: CarthageDependencies.Dependency = .git(path: "Git/Git", requirement: .exact("1.5.123")) - XCTAssertCodable(subject) - } - - func test_carthageDependency_binary_codable() throws { - let subject: CarthageDependencies.Dependency = .binary( - path: "file:///some/Path/MyFramework.json", - requirement: .upToNext("5.6.9") - ) - XCTAssertCodable(subject) - } - - // MARK: - Carthage Requirement tests - - func test_carthageRequirement_exact_codable() throws { - let subject: CarthageDependencies.Requirement = .exact("1.0.0") - XCTAssertCodable(subject) - } - - func test_carthageRequirement_upToNext_codable() throws { - let subject: CarthageDependencies.Requirement = .upToNext("3.2.0") - XCTAssertCodable(subject) - } - - func test_carthageRequirement_atLeast_codable() throws { - let subject: CarthageDependencies.Requirement = .atLeast("3.2.0") - XCTAssertCodable(subject) - } - - func test_carthageRequirement_branch_codable() throws { - let subject: CarthageDependencies.Requirement = .branch("branch") - XCTAssertCodable(subject) - } - - func test_carthageRequirement_revision_codable() throws { - let subject: CarthageDependencies.Requirement = .revision("revision") - XCTAssertCodable(subject) - } -} diff --git a/Tests/ProjectDescriptionTests/Dependencies/DependenciesTests.swift b/Tests/ProjectDescriptionTests/Dependencies/DependenciesTests.swift deleted file mode 100644 index eef16175539..00000000000 --- a/Tests/ProjectDescriptionTests/Dependencies/DependenciesTests.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation -import XCTest - -@testable import ProjectDescription - -final class DependenciesTests: XCTestCase { - func test_dependencies_codable() throws { - let subject = Dependencies( - carthage: [ - .github(path: "Dependency1/Dependency1", requirement: .branch("BranchName")), - .git(path: "Dependency2/Dependency2", requirement: .upToNext("1.2.3")), - ], - swiftPackageManager: .init(), - platforms: [.iOS, .macOS, .tvOS, .watchOS] - ) - XCTAssertCodable(subject) - } -} diff --git a/Tests/ProjectDescriptionTests/Dependencies/SwiftPackageManagerDependenciesTests.swift b/Tests/ProjectDescriptionTests/Dependencies/SwiftPackageManagerDependenciesTests.swift deleted file mode 100644 index 92811b40f60..00000000000 --- a/Tests/ProjectDescriptionTests/Dependencies/SwiftPackageManagerDependenciesTests.swift +++ /dev/null @@ -1,11 +0,0 @@ -import Foundation -import XCTest - -@testable import ProjectDescription - -final class SwiftPackageManagerDependenciesTests: XCTestCase { - func test_swiftPackageManagerDependencies_codable() { - let subject: SwiftPackageManagerDependencies = .init() - XCTAssertCodable(subject) - } -} diff --git a/Tests/ProjectDescriptionTests/PluginLocationTests.swift b/Tests/ProjectDescriptionTests/PluginLocationTests.swift index 23b6a429d4e..3f3dd4b9a9b 100644 --- a/Tests/ProjectDescriptionTests/PluginLocationTests.swift +++ b/Tests/ProjectDescriptionTests/PluginLocationTests.swift @@ -3,7 +3,7 @@ import XCTest final class PluginLocationTests: XCTestCase { func test_codable_local() throws { - let subject = PluginLocation.local(path: .init("/some/path")) + let subject = PluginLocation.local(path: .path("/some/path")) XCTAssertCodable(subject) } diff --git a/Tests/ProjectDescriptionTests/SchemeTests.swift b/Tests/ProjectDescriptionTests/SchemeTests.swift index fd4b6af129e..53e2d5b964d 100644 --- a/Tests/ProjectDescriptionTests/SchemeTests.swift +++ b/Tests/ProjectDescriptionTests/SchemeTests.swift @@ -10,16 +10,16 @@ final class SchemeTests: XCTestCase { func test_codable() throws { // Given - let subject = Scheme( + let subject: Scheme = .scheme( name: "scheme", shared: true, - buildAction: BuildAction( + buildAction: .buildAction( targets: [.init(projectPath: nil, target: "target")], preActions: mockExecutionAction("build_action"), postActions: mockExecutionAction("build_action") ), testAction: TestAction.targets( - [TestableTarget(target: .init(projectPath: nil, target: "target"))], + [.testableTarget(target: .init(projectPath: nil, target: "target"))], arguments: Arguments( environmentVariables: ["test": "b"], launchArguments: [LaunchArgument(name: "test", isEnabled: true)] @@ -52,16 +52,16 @@ final class SchemeTests: XCTestCase { func test_defaultConfigurationNames() throws { // Given / When - let subject = Scheme( + let subject: Scheme = .scheme( name: "scheme", shared: true, - buildAction: BuildAction( - targets: [.init(projectPath: nil, target: "target")], + buildAction: .buildAction( + targets: [.target("target")], preActions: mockExecutionAction("build_action"), postActions: mockExecutionAction("build_action") ), testAction: TestAction.targets( - [.init(target: .init(projectPath: nil, target: "target"))], + [.testableTarget(target: .init(projectPath: nil, target: "target"))], arguments: Arguments( environmentVariables: ["test": "b"], launchArguments: [LaunchArgument(name: "test", isEnabled: true)] @@ -93,7 +93,7 @@ final class SchemeTests: XCTestCase { private func mockExecutionAction(_ actionName: String) -> [ExecutionAction] { [ - ExecutionAction( + .executionAction( title: "Run Script", scriptText: "echo \(actionName)", target: TargetReference( diff --git a/Tests/ProjectDescriptionTests/TargetDependencyTests.swift b/Tests/ProjectDescriptionTests/TargetDependencyTests.swift index 49ba9326077..6956962db5e 100644 --- a/Tests/ProjectDescriptionTests/TargetDependencyTests.swift +++ b/Tests/ProjectDescriptionTests/TargetDependencyTests.swift @@ -54,7 +54,7 @@ final class TargetDependencyTests: XCTestCase { } func test_instanceTarget() { - let target = Target(name: "Target", platform: .iOS, product: .framework, bundleId: "bundleId") + let target: Target = .target(name: "Target", destinations: .iOS, product: .framework, bundleId: "bundleId") let subject = TargetDependency.target(target) XCTAssertEqual(subject, TargetDependency.target(name: "Target")) } diff --git a/Tests/ProjectDescriptionTests/TargetTests.swift b/Tests/ProjectDescriptionTests/TargetTests.swift index ba141b55786..736fd735088 100644 --- a/Tests/ProjectDescriptionTests/TargetTests.swift +++ b/Tests/ProjectDescriptionTests/TargetTests.swift @@ -6,13 +6,13 @@ import XCTest final class TargetTests: XCTestCase { func test_toJSON() { - let subject = Target( + let subject: Target = .target( name: "name", - platform: .iOS, + destinations: [.iPhone, .iPad], product: .app, productName: "product_name", bundleId: "bundle_id", - deploymentTarget: .iOS(targetVersion: "13.1", devices: [.iphone, .ipad]), + deploymentTargets: .iOS("13.1"), infoPlist: "info.plist", sources: "sources/*", resources: "resources/*", @@ -36,16 +36,16 @@ final class TargetTests: XCTestCase { debug: ["a": .string("b")], release: ["a": .string("b")] ), - coreDataModels: [CoreDataModel("pat", currentVersion: "version")], + coreDataModels: [.coreDataModel("pat", currentVersion: "version")], environmentVariables: ["a": "b"] ) XCTAssertCodable(subject) } func test_toJSON_withFileList() { - let subject = Target( + let subject: Target = .target( name: "name", - platform: .iOS, + destinations: [.iPhone, .iPad, .macWithiPadDesign], product: .app, productName: "product_name", bundleId: "bundle_id", @@ -85,7 +85,7 @@ final class TargetTests: XCTestCase { .debug(name: .release, settings: ["a": .string("release")], xcconfig: "debug.xcconfig"), ] ), - coreDataModels: [CoreDataModel("pat", currentVersion: "version")], + coreDataModels: [.coreDataModel("pat", currentVersion: "version")], environmentVariables: ["a": "b"] ) XCTAssertCodable(subject) diff --git a/Tests/TuistAcceptanceTests/InitAcceptanceTests.swift b/Tests/TuistAcceptanceTests/InitAcceptanceTests.swift index 8379f30d69b..e597dbd72b0 100644 --- a/Tests/TuistAcceptanceTests/InitAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/InitAcceptanceTests.swift @@ -27,31 +27,9 @@ final class InitAcceptanceTestiOSApp: TuistAcceptanceTestCase { // } // } -final class InitAcceptanceTestSwiftUIiOSApp: TuistAcceptanceTestCase { - func test_init_swift_ui_ios_app() async throws { - try run(InitCommand.self, "--platform", "ios", "--name", "MyApp", "--template", "swiftui") - try await run(BuildCommand.self) - } -} - -final class InitAcceptanceTestSwiftUImacOSApp: TuistAcceptanceTestCase { - func test_init_swift_ui_macos_app() async throws { - try run(InitCommand.self, "--platform", "macos", "--name", "MyApp", "--template", "swiftui") - try await run(BuildCommand.self) - } -} - -// TODO: Fix -// final class InitAcceptanceTestSwiftUtvOSApp: TuistAcceptanceTestCase { -// func test_init_swift_ui_tvos_app() async throws { -// try run(InitCommand.self, "--platform", "tvos", "--name", "MyApp", "--template", "swiftui") -// try await run(BuildCommand.self) -// } -// } - final class InitAcceptanceTestCLIProjectWithTemplateInADifferentRepository: TuistAcceptanceTestCase { func test_cli_project_with_template_in_a_different_repository() async throws { - try run(InitCommand.self, "--template", "https://github.com/tuist/ExampleTuistTemplate.git", "--name", "MyApp") + try run(InitCommand.self, "--template", "https://github.com/tuist/ExampleTuistTemplate-Tuist4.git", "--name", "MyApp") try await run(BuildCommand.self) } } diff --git a/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift b/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift index df1586f99bf..30f959c5796 100644 --- a/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift +++ b/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift @@ -685,8 +685,7 @@ final class BuildGraphInspectorTests: TuistUnitTestCase { name: "WorkspaceName", schemes: [ .test(name: "WorkspaceName"), - .test(name: "WorkspaceName-Workspace-iOS"), - .test(name: "WorkspaceName-Workspace-macOS"), + .test(name: "WorkspaceName-Workspace"), ] ) ) @@ -699,8 +698,7 @@ final class BuildGraphInspectorTests: TuistUnitTestCase { XCTAssertEqual( got, [ - .test(name: "WorkspaceName-Workspace-iOS"), - .test(name: "WorkspaceName-Workspace-macOS"), + .test(name: "WorkspaceName-Workspace"), ] ) } diff --git a/Tests/TuistCoreIntegrationTests/MetadataProviders/FrameworkMetadataProviderIntegrationTests.swift b/Tests/TuistCoreIntegrationTests/MetadataProviders/FrameworkMetadataProviderIntegrationTests.swift index dff6f85343e..7f5c6ddcbaf 100644 --- a/Tests/TuistCoreIntegrationTests/MetadataProviders/FrameworkMetadataProviderIntegrationTests.swift +++ b/Tests/TuistCoreIntegrationTests/MetadataProviders/FrameworkMetadataProviderIntegrationTests.swift @@ -21,28 +21,28 @@ final class FrameworkMetadataProviderIntegrationTests: TuistTestCase { func test_bcsymbolmapPaths() throws { // Given - let carthagePath = try temporaryFixture("Carthage/") - let frameworkPath = FileHandler.shared.glob(carthagePath, glob: "*.framework").first! + let testPath = try temporaryFixture("PrebuiltFramework/") + let frameworkPath = FileHandler.shared.glob(testPath, glob: "*.framework").first! // When let got = try subject.bcsymbolmapPaths(frameworkPath: frameworkPath).sorted() // Then XCTAssertEqual(got, [ - carthagePath.appending(component: "2510FE01-4D40-3956-BB71-857D3B2D9E73.bcsymbolmap"), - carthagePath.appending(component: "773847A9-0D05-35AF-9865-94A9A670080B.bcsymbolmap"), + testPath.appending(component: "2510FE01-4D40-3956-BB71-857D3B2D9E73.bcsymbolmap"), + testPath.appending(component: "773847A9-0D05-35AF-9865-94A9A670080B.bcsymbolmap"), ]) } func test_dsymPath() throws { // Given - let carthagePath = try temporaryFixture("Carthage/") - let frameworkPath = FileHandler.shared.glob(carthagePath, glob: "*.framework").first! + let testPath = try temporaryFixture("PrebuiltFramework/") + let frameworkPath = FileHandler.shared.glob(testPath, glob: "*.framework").first! // When let got = try subject.dsymPath(frameworkPath: frameworkPath) // Then - XCTAssertTrue(got == carthagePath.appending(component: "\(frameworkPath.basename).dSYM")) + XCTAssertEqual(got, testPath.appending(component: "\(frameworkPath.basename).dSYM")) } } diff --git a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift index 437a16fc912..a3bbe0fc400 100644 --- a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift @@ -216,7 +216,6 @@ final class GraphLoaderTests: TuistUnitTestCase { bcsymbolmapPaths: [], linking: .dynamic, architectures: [.arm64], - isCarthage: false, status: .required ), ]), @@ -228,7 +227,6 @@ final class GraphLoaderTests: TuistUnitTestCase { bcsymbolmapPaths: [], linking: .static, architectures: [.x8664], - isCarthage: false, status: .required ), ]), @@ -270,7 +268,6 @@ final class GraphLoaderTests: TuistUnitTestCase { bcsymbolmapPaths: [], linking: .dynamic, architectures: [.arm64], - isCarthage: false, status: .required ) XCTAssertEqual(graph.dependencies, [ @@ -696,7 +693,6 @@ final class GraphLoaderTests: TuistUnitTestCase { bcsymbolmapPaths: [], linking: metadata.linkage, architectures: metadata.architectures, - isCarthage: false, status: .required ) } diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index 6fda03f8eca..05b3354988d 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -1321,8 +1321,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .dynamic, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let graph = Graph.test( projects: [project.path: project], @@ -1507,8 +1506,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .dynamic, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let dependencies: [GraphDependency: Set] = [ .target(name: target.name, path: project.path): Set(arrayLiteral: .target(name: dependency.name, path: project.path)), @@ -1544,8 +1542,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .static, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] )), ] let graph = Graph.test( @@ -1690,8 +1687,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .dynamic, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let dependencies: [GraphDependency: Set] = [ .target(name: target.name, path: project.path): Set(), @@ -1781,8 +1777,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .dynamic, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set(arrayLiteral: precompiledDependency), @@ -1914,8 +1909,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .dynamic, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let dependencies: [GraphDependency: Set] = [ .target(name: target.name, path: project.path): Set(arrayLiteral: precompiledDependency), @@ -1949,8 +1943,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .static, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let dependencyPrecompiledStaticBinaryA = GraphDependency.testFramework( path: "/test/StaticFrameworkA.framework", @@ -1958,8 +1951,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .static, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let dependencies: [GraphDependency: Set] = [ @@ -2005,8 +1997,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .dynamic, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let dependencyPrecompiledDynamicBinaryA = GraphDependency.testFramework( path: "/test/DynamicFrameworkA.framework", @@ -2014,8 +2005,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .dynamic, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let dependencies: [GraphDependency: Set] = [ @@ -2064,8 +2054,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .dynamic, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let dependencyPrecompiledStaticBinaryA = GraphDependency.testFramework( path: "/test/StaticFrameworkA.framework", @@ -2073,8 +2062,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .static, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let dependencies: [GraphDependency: Set] = [ @@ -2122,8 +2110,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .static, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let dependencyPrecompiledDynamicBinaryA = GraphDependency.testFramework( path: "/test/DynamicFrameworkA.framework", @@ -2131,8 +2118,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .dynamic, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let dependencies: [GraphDependency: Set] = [ @@ -2787,7 +2773,6 @@ final class GraphTraverserTests: TuistUnitTestCase { bcsymbolmapPaths: [], linking: .dynamic, architectures: [.arm64], - isCarthage: false, status: .required ) let project = Project.test(path: "/path/project", targets: [app, staticFramework]) @@ -2819,7 +2804,6 @@ final class GraphTraverserTests: TuistUnitTestCase { .framework( path: "/path/to/frameworks/precompiled.framework", binaryPath: "/path/to/frameworks/precompiled.framework/precompiled", - isCarthage: false, dsymPath: nil, bcsymbolmapPaths: [], linking: .dynamic, @@ -2842,7 +2826,6 @@ final class GraphTraverserTests: TuistUnitTestCase { bcsymbolmapPaths: [], linking: .dynamic, architectures: [.arm64], - isCarthage: false, status: .required ) let project = Project.test(path: "/path/project", targets: [app, framework]) @@ -2887,7 +2870,6 @@ final class GraphTraverserTests: TuistUnitTestCase { bcsymbolmapPaths: [], linking: .dynamic, architectures: [.arm64], - isCarthage: false, status: .required ) let project = Project.test(path: "/path/project", targets: [app, staticFramework, framework]) @@ -3259,8 +3241,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .dynamic, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let graph = Graph.test( projects: [project.path: project], @@ -3292,8 +3273,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .static, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let dependencies: [GraphDependency: Set] = [ .target(name: target.name, path: project.path): [ @@ -3811,8 +3791,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .dynamic, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let precompiledBDependency = GraphDependency.testFramework( path: "/test/testb.famework", @@ -3820,8 +3799,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .dynamic, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let graph = Graph.test( projects: [project.path: project], @@ -3857,8 +3835,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dsymPath: nil, bcsymbolmapPaths: [], linking: .dynamic, - architectures: [.arm64], - isCarthage: false + architectures: [.arm64] ) let graph = Graph.test( projects: [project.path: project], @@ -4091,7 +4068,6 @@ final class GraphTraverserTests: TuistUnitTestCase { bcsymbolmapPaths: [], linking: .static, architectures: [.arm64], - isCarthage: false, status: .required ) let directFrameworkTarget = GraphDependency.target(name: staticFramework.name, path: project.path) diff --git a/Tests/TuistCoreTests/MetadataProviders/FrameworkMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/FrameworkMetadataProviderTests.swift index e63da4db0bc..da29178faa6 100644 --- a/Tests/TuistCoreTests/MetadataProviders/FrameworkMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/FrameworkMetadataProviderTests.swift @@ -34,7 +34,6 @@ final class FrameworkMetadataProviderTests: XCTestCase { bcsymbolmapPaths: [], linking: .dynamic, architectures: [.x8664, .arm64], - isCarthage: false, status: .required )) } diff --git a/Tests/TuistCoreTests/MetadataProviders/PrecompiledMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/PrecompiledMetadataProviderTests.swift index 8f7ab7580ad..fc9df9f5ca7 100644 --- a/Tests/TuistCoreTests/MetadataProviders/PrecompiledMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/PrecompiledMetadataProviderTests.swift @@ -35,29 +35,6 @@ final class PrecompiledMetadataProviderTests: TuistUnitTestCase { XCTAssertEqual(uuids, Set()) } - func test_metadata_carthage() throws { - // Given - let binaryPath = fixturePath(path: try RelativePath(validating: "Carthage/RxBlocking.framework/RxBlocking")) - - // When - let architectures = try subject.architectures(binaryPath: binaryPath) - let linking = try subject.linking(binaryPath: binaryPath) - let uuids = try subject.uuids(binaryPath: binaryPath) - - // Then - XCTAssertEqual(architectures, [.i386, .x8664, .armv7, .arm64]) - XCTAssertEqual(linking, BinaryLinking.dynamic) - XCTAssertEqual( - uuids, - Set([ - UUID(uuidString: "2510FE01-4D40-3956-BB71-857D3B2D9E73"), - UUID(uuidString: "1C061BD7-371A-3039-8510-15CDF61531F6"), - UUID(uuidString: "1208EC2E-0B7C-3B13-B5E1-6341E6AE6859"), - UUID(uuidString: "773847A9-0D05-35AF-9865-94A9A670080B"), - ]) - ) - } - func test_metadata_framework() throws { // Given let binaryPath = fixturePath(path: try RelativePath(validating: "xpm.framework/xpm")) diff --git a/Tests/TuistCoreTests/NodeLoaders/FrameworkLoaderTests.swift b/Tests/TuistCoreTests/NodeLoaders/FrameworkLoaderTests.swift index b6c4438dab0..140d446c3b9 100644 --- a/Tests/TuistCoreTests/NodeLoaders/FrameworkLoaderTests.swift +++ b/Tests/TuistCoreTests/NodeLoaders/FrameworkLoaderTests.swift @@ -80,7 +80,6 @@ final class FrameworkLoaderTests: TuistUnitTestCase { bcsymbolmapPaths: bcsymbolmapPaths, linking: linking, architectures: architectures, - isCarthage: false, status: .required ) } @@ -98,7 +97,6 @@ final class FrameworkLoaderTests: TuistUnitTestCase { bcsymbolmapPaths: bcsymbolmapPaths, linking: linking, architectures: architectures, - isCarthage: false, status: .required ) ) diff --git a/Tests/TuistDependenciesTests/Carthage/CarthageInteractorTests.swift b/Tests/TuistDependenciesTests/Carthage/CarthageInteractorTests.swift deleted file mode 100644 index 4c43ca024a7..00000000000 --- a/Tests/TuistDependenciesTests/Carthage/CarthageInteractorTests.swift +++ /dev/null @@ -1,335 +0,0 @@ -import TSCBasic -import TuistCore -import TuistGraph -import TuistSupport -import XCTest - -@testable import TuistDependencies -@testable import TuistDependenciesTesting -@testable import TuistSupportTesting - -final class CarthageInteractorTests: TuistUnitTestCase { - private var subject: CarthageInteractor! - private var carthageController: MockCarthageController! - private var carthageGraphGenerator: MockCarthageGraphGenerator! - - override func setUp() { - super.setUp() - - carthageController = MockCarthageController() - carthageGraphGenerator = MockCarthageGraphGenerator() - subject = CarthageInteractor( - carthageController: carthageController, - carthageGraphGenerator: carthageGraphGenerator - ) - } - - override func tearDown() { - carthageController = nil - carthageGraphGenerator = nil - subject = nil - - super.tearDown() - } - - func test_install_when_shouldNotBeUpdated() throws { - // Given - carthageController.canUseSystemCarthageStub = { true } - - let rootPath = try TemporaryDirectory(removeTreeOnDeinit: true).path - let dependenciesDirectory = rootPath - .appending(component: Constants.DependenciesDirectory.name) - let lockfilesDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.lockfilesDirectoryName) - let carthageDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.carthageDirectoryName) - let carthageBuildDirectory = carthageDirectory - .appending(component: "Build") - - let platforms: Set = [.iOS, .watchOS, .macOS, .tvOS] - let stubbedDependencies = CarthageDependencies( - [ - .github(path: "Moya", requirement: .exact("1.1.1")), - ] - ) - - carthageController.bootstrapStub = { arg0, arg1, arg2 in - XCTAssertEqual(arg0, dependenciesDirectory) - XCTAssertEqual(arg1, platforms) - XCTAssertTrue(arg2) - - try self.simulateCarthageOutput(at: arg0) - } - carthageGraphGenerator.generateStub = { arg0 in - XCTAssertEqual(arg0, carthageDirectory.appending(component: "Build")) - return .test() - } - - // When - let got = try subject.install( - dependenciesDirectory: dependenciesDirectory, - dependencies: stubbedDependencies, - platforms: platforms, - shouldUpdate: false - ) - - // Then - XCTAssertEqual(got, .test()) - XCTAssertTrue(carthageGraphGenerator.invokedGenerate) - - try XCTAssertDirectoryContentEqual( - dependenciesDirectory, - [ - Constants.DependenciesDirectory.lockfilesDirectoryName, - Constants.DependenciesDirectory.carthageDirectoryName, - ] - ) - try XCTAssertDirectoryContentEqual( - lockfilesDirectory, - [ - Constants.DependenciesDirectory.cartfileResolvedName, - ] - ) - try XCTAssertDirectoryContentEqual( - carthageDirectory, - [ - "Build", - "Cartfile", - ] - ) - try XCTAssertDirectoryContentEqual( - carthageBuildDirectory, - [ - "iOS", - "Mac", - "watchOS", - "tvOS", - ] - ) - try XCTAssertDirectoryContentEqual( - carthageBuildDirectory.appending(component: "iOS"), - [ - "Moya.framework", - "ReactiveMoya.framework", - "RxMoya.framework", - ] - ) - try XCTAssertDirectoryContentEqual( - carthageBuildDirectory.appending(component: "Mac"), - [ - "Moya.framework", - "ReactiveMoya.framework", - "RxMoya.framework", - ] - ) - try XCTAssertDirectoryContentEqual( - carthageBuildDirectory.appending(component: "watchOS"), - [ - "Moya.framework", - "ReactiveMoya.framework", - "RxMoya.framework", - ] - ) - try XCTAssertDirectoryContentEqual( - carthageBuildDirectory.appending(component: "tvOS"), - [ - "Moya.framework", - "ReactiveMoya.framework", - "RxMoya.framework", - ] - ) - } - - func test_install_when_shouldBeUpdated() throws { - // Given - carthageController.canUseSystemCarthageStub = { true } - - let rootPath = try TemporaryDirectory(removeTreeOnDeinit: true).path - let dependenciesDirectory = rootPath - .appending(component: Constants.DependenciesDirectory.name) - let lockfilesDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.lockfilesDirectoryName) - let carthageDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.carthageDirectoryName) - let carthageBuildDirectory = carthageDirectory - .appending(component: "Build") - - let platforms: Set = [.iOS, .watchOS, .macOS, .tvOS] - let stubbedDependencies = CarthageDependencies( - [ - .github(path: "Moya", requirement: .exact("1.1.1")), - ] - ) - - carthageController.updateStub = { arg0, arg1, arg2 in - XCTAssertEqual(arg0, dependenciesDirectory) - XCTAssertEqual(arg1, platforms) - XCTAssertTrue(arg2) - - try self.simulateCarthageOutput(at: arg0) - } - carthageGraphGenerator.generateStub = { arg0 in - XCTAssertEqual(arg0, carthageDirectory.appending(component: "Build")) - return .test() - } - - // When - let got = try subject.install( - dependenciesDirectory: dependenciesDirectory, - dependencies: stubbedDependencies, - platforms: platforms, - shouldUpdate: true - ) - - // Then - XCTAssertEqual(got, .test()) - XCTAssertTrue(carthageGraphGenerator.invokedGenerate) - - try XCTAssertDirectoryContentEqual( - dependenciesDirectory, - [ - Constants.DependenciesDirectory.lockfilesDirectoryName, - Constants.DependenciesDirectory.carthageDirectoryName, - ] - ) - try XCTAssertDirectoryContentEqual( - lockfilesDirectory, - [ - Constants.DependenciesDirectory.cartfileResolvedName, - ] - ) - try XCTAssertDirectoryContentEqual( - carthageDirectory, - [ - "Build", - "Cartfile", - ] - ) - try XCTAssertDirectoryContentEqual( - carthageBuildDirectory, - [ - "iOS", - "Mac", - "watchOS", - "tvOS", - ] - ) - try XCTAssertDirectoryContentEqual( - carthageBuildDirectory.appending(component: "iOS"), - [ - "Moya.framework", - "ReactiveMoya.framework", - "RxMoya.framework", - ] - ) - try XCTAssertDirectoryContentEqual( - carthageBuildDirectory.appending(component: "Mac"), - [ - "Moya.framework", - "ReactiveMoya.framework", - "RxMoya.framework", - ] - ) - try XCTAssertDirectoryContentEqual( - carthageBuildDirectory.appending(component: "watchOS"), - [ - "Moya.framework", - "ReactiveMoya.framework", - "RxMoya.framework", - ] - ) - try XCTAssertDirectoryContentEqual( - carthageBuildDirectory.appending(component: "tvOS"), - [ - "Moya.framework", - "ReactiveMoya.framework", - "RxMoya.framework", - ] - ) - } - - func test_install_throws_when_carthageUnavailableInEnvironment() throws { - // Given - carthageController.canUseSystemCarthageStub = { false } - - let rootPath = try TemporaryDirectory(removeTreeOnDeinit: true).path - let dependenciesDirectory = rootPath - .appending(component: Constants.DependenciesDirectory.name) - let dependencies = CarthageDependencies( - [ - .github(path: "Moya", requirement: .exact("1.1.1")), - ] - ) - let platforms: Set = [.iOS] - - // When / Then - XCTAssertThrowsSpecific( - try subject.install( - dependenciesDirectory: dependenciesDirectory, - dependencies: dependencies, - platforms: platforms, - shouldUpdate: true - ), - CarthageInteractorError.carthageNotFound - ) - } - - func test_clean() throws { - // Given - let rootPath = try temporaryPath() - let dependenciesDirectory = rootPath - .appending(component: Constants.DependenciesDirectory.name) - let lockfilesDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.lockfilesDirectoryName) - - try createFiles([ - "Dependencies/Lockfiles/Cartfile.resolved", - "Dependencies/Lockfiles/OtherLockfile.lock", - "Dependencies/Carthage/Info.plist", - "Dependencies/OtherDependenciesManager/bar.bar", - ]) - - // When - try subject.clean(dependenciesDirectory: dependenciesDirectory) - - // Then - try XCTAssertDirectoryContentEqual( - dependenciesDirectory, - [ - Constants.DependenciesDirectory.lockfilesDirectoryName, - "OtherDependenciesManager", - ] - ) - try XCTAssertDirectoryContentEqual( - lockfilesDirectory, - [ - "OtherLockfile.lock", - ] - ) - } -} - -// MARK: - Helpers - -extension CarthageInteractorTests { - private func simulateCarthageOutput(at path: AbsolutePath) throws { - try [ - "Cartfile.resolved", - "Carthage/Cartfile", - "Carthage/Build/iOS/Moya.framework/Info.plist", - "Carthage/Build/iOS/ReactiveMoya.framework/Info.plist", - "Carthage/Build/iOS/RxMoya.framework/Info.plist", - "Carthage/Build/Mac/Moya.framework/Info.plist", - "Carthage/Build/Mac/ReactiveMoya.framework/Info.plist", - "Carthage/Build/Mac/RxMoya.framework/Info.plist", - "Carthage/Build/watchOS/Moya.framework/Info.plist", - "Carthage/Build/watchOS/ReactiveMoya.framework/Info.plist", - "Carthage/Build/watchOS/RxMoya.framework/Info.plist", - "Carthage/Build/tvOS/Moya.framework/Info.plist", - "Carthage/Build/tvOS/ReactiveMoya.framework/Info.plist", - "Carthage/Build/tvOS/RxMoya.framework/Info.plist", - ].forEach { - try fileHandler.touch(path.appending(try RelativePath(validating: $0))) - } - } -} diff --git a/Tests/TuistDependenciesTests/Carthage/Models/CarthageVersionFileTests.swift b/Tests/TuistDependenciesTests/Carthage/Models/CarthageVersionFileTests.swift deleted file mode 100644 index a398bf2109a..00000000000 --- a/Tests/TuistDependenciesTests/Carthage/Models/CarthageVersionFileTests.swift +++ /dev/null @@ -1,70 +0,0 @@ -import TSCBasic -import TSCUtility -import TuistCore -import TuistGraph -import TuistSupport -import XCTest - -@testable import TuistDependencies -@testable import TuistDependenciesTesting -@testable import TuistSupportTesting - -final class CarthageVersionFileTests: TuistUnitTestCase { - func test_codable_alamofire() { - // Given - let json = CarthageVersionFile.testAlamofireJson - let expected = CarthageVersionFile.testAlamofire - - // When / Then - XCTAssertDecodableEqualToJson(json, expected) - } - - func test_codable_rxSwift() { - // Given - let json = CarthageVersionFile.testRxSwiftJson - let expected = CarthageVersionFile.testRxSwift - - // When / Then - XCTAssertDecodableEqualToJson(json, expected) - } - - func test_codable_realmSwift() { - // Given - let json = CarthageVersionFile.testRealmCocoaJson - let expected = CarthageVersionFile.testRealmCocoa - - // When / Then - XCTAssertDecodableEqualToJson(json, expected) - } - - func test_codable_ahoyRTC() { - // Given - let json = CarthageVersionFile.testAhoyRTCJson - let expected = CarthageVersionFile.testAhoyRTC - - // When / Then - XCTAssertDecodableEqualToJson(json, expected) - } - - func test_allProducts() { - // Given - let iOSProduct = CarthageVersionFile.Product.test(name: "iOS") - let macOSProduct = CarthageVersionFile.Product.test(name: "macOS") - let watchOSProduct = CarthageVersionFile.Product.test(name: "watchOS") - let tvOSProduct = CarthageVersionFile.Product.test(name: "tvOS") - - let subject = CarthageVersionFile.test( - iOS: [iOSProduct], - macOS: [macOSProduct], - watchOS: [watchOSProduct], - tvOS: [tvOSProduct] - ) - - // When - let got = subject.allProducts - - // Then - let expected: [CarthageVersionFile.Product] = [iOSProduct, macOSProduct, watchOSProduct, tvOSProduct] - XCTAssertEqual(got, expected) - } -} diff --git a/Tests/TuistDependenciesTests/Carthage/Utils/CarthageControllerTests.swift b/Tests/TuistDependenciesTests/Carthage/Utils/CarthageControllerTests.swift deleted file mode 100644 index fddc82655c0..00000000000 --- a/Tests/TuistDependenciesTests/Carthage/Utils/CarthageControllerTests.swift +++ /dev/null @@ -1,199 +0,0 @@ -import TSCBasic -import TSCUtility -import TuistCore -import TuistGraph -import TuistSupport -import XCTest - -@testable import TuistDependencies -@testable import TuistSupportTesting - -final class CarthageControllerTests: TuistUnitTestCase { - private var subject: CarthageController! - - override func setUp() { - super.setUp() - - subject = CarthageController() - } - - override func tearDown() { - subject = nil - - super.tearDown() - } - - func test_canUseSystemCarthage_available() { - // Given - system.whichStub = { _ in "path" } - - // When / Then - XCTAssertTrue(subject.canUseSystemCarthage()) - } - - func test_canUseSystemCarthage_unavailable() { - // Given - system.whichStub = { _ in throw NSError.test() } - - // When / Then - XCTAssertFalse(subject.canUseSystemCarthage()) - } - - func test_carthageVersion_carthageNotFound() { - // Given - system.errorCommand(["/usr/bin/env", "carthage", "version"]) - - // When / Then - XCTAssertThrowsSpecific(try subject.carthageVersion(), CarthageControllerError.carthageNotFound) - } - - func test_carthageVersion_success() { - // Given - system.stubs["/usr/bin/env carthage version"] = (stderror: nil, stdout: "0.37.0", exitstatus: 0) - - // When / Then - XCTAssertEqual(try subject.carthageVersion(), Version(0, 37, 0)) - } - - func test_bootstrap() throws { - // Given - system.stubs["/usr/bin/env carthage version"] = (stderror: nil, stdout: "0.37.0", exitstatus: 0) - - let path = try temporaryPath() - system.succeedCommand([ - "carthage", - "bootstrap", - "--project-directory", - path.pathString, - "--use-xcframeworks", - "--no-use-binaries", - "--use-netrc", - "--cache-builds", - "--new-resolver", - ]) - - // When / Then - XCTAssertNoThrow(try subject.bootstrap(at: path, platforms: [], printOutput: false)) - } - - func test_bootstrap_with_platforms() throws { - // Given - system.stubs["/usr/bin/env carthage version"] = (stderror: nil, stdout: "0.37.0", exitstatus: 0) - - let path = try temporaryPath() - system.succeedCommand([ - "carthage", - "bootstrap", - "--project-directory", - path.pathString, - "--platform", - "iOS", - "--use-xcframeworks", - "--no-use-binaries", - "--use-netrc", - "--cache-builds", - "--new-resolver", - ]) - - // When / Then - XCTAssertNoThrow(try subject.bootstrap(at: path, platforms: [.iOS], printOutput: false)) - } - - func test_bootstrap_with_platforms_throws_when_xcframeworkdProductionUnsupported() throws { - // Given - let carthageVersion = Version("0.36.0") - system.stubs["/usr/bin/env carthage version"] = (stderror: nil, stdout: carthageVersion.description, exitstatus: 0) - - let path = try temporaryPath() - system.succeedCommand([ - "carthage", - "bootstrap", - "--project-directory", - path.pathString, - "--platform", - "iOS", - "--use-xcframeworks", - "--no-use-binaries", - "--use-netrc", - "--cache-builds", - "--new-resolver", - ]) - - // When / Then - XCTAssertThrowsSpecific( - try subject.bootstrap(at: path, platforms: [.iOS], printOutput: false), - CarthageControllerError.xcframeworksProductionNotSupported(installedVersion: carthageVersion) - ) - } - - func test_update() throws { - // Given - system.stubs["/usr/bin/env carthage version"] = (stderror: nil, stdout: "0.37.0", exitstatus: 0) - - let path = try temporaryPath() - system.succeedCommand([ - "carthage", - "update", - "--project-directory", - path.pathString, - "--use-xcframeworks", - "--no-use-binaries", - "--use-netrc", - "--cache-builds", - "--new-resolver", - ]) - - // When / Then - XCTAssertNoThrow(try subject.update(at: path, platforms: [], printOutput: false)) - } - - func test_update_with_platforms() throws { - // Given - system.stubs["/usr/bin/env carthage version"] = (stderror: nil, stdout: "0.37.0", exitstatus: 0) - - let path = try temporaryPath() - system.succeedCommand([ - "carthage", - "update", - "--project-directory", - path.pathString, - "--platform", - "iOS", - "--use-xcframeworks", - "--no-use-binaries", - "--use-netrc", - "--cache-builds", - "--new-resolver", - ]) - - // When / Then - XCTAssertNoThrow(try subject.update(at: path, platforms: [.iOS], printOutput: false)) - } - - func test_update_with_platforms_throws_when_xcframeworkdProductionUnsupported() throws { - // Given - let carthageVersion = Version("0.36.0") - system.stubs["/usr/bin/env carthage version"] = (stderror: nil, stdout: carthageVersion.description, exitstatus: 0) - - let path = try temporaryPath() - system.succeedCommand([ - "carthage", - "update", - "--project-directory", - path.pathString, - "--platform", - "iOS", - "--use-xcframeworks", - "--no-use-binaries", - "--use-netrc", - "--cache-builds", - "--new-resolver", - ]) - - // When / Then - XCTAssertThrowsSpecific( - try subject.bootstrap(at: path, platforms: [.iOS], printOutput: false), - CarthageControllerError.xcframeworksProductionNotSupported(installedVersion: carthageVersion) - ) - } -} diff --git a/Tests/TuistDependenciesTests/Carthage/Utils/CarthageGraphGeneratorTests.swift b/Tests/TuistDependenciesTests/Carthage/Utils/CarthageGraphGeneratorTests.swift deleted file mode 100644 index aa977a3958d..00000000000 --- a/Tests/TuistDependenciesTests/Carthage/Utils/CarthageGraphGeneratorTests.swift +++ /dev/null @@ -1,56 +0,0 @@ -import ProjectDescription -import TSCBasic -import TSCUtility -import TuistCore -import TuistSupport -import XCTest - -@testable import TuistDependencies -@testable import TuistDependenciesTesting -@testable import TuistSupportTesting - -final class CarthageGraphGeneratorTests: TuistUnitTestCase { - private var subject: CarthageGraphGenerator! - - override func setUp() { - super.setUp() - - subject = CarthageGraphGenerator() - } - - override func tearDown() { - subject = nil - super.tearDown() - } - - func test_generate() throws { - // Given - let path = try temporaryPath() - - let rxSwiftVersionFilePath = path.appending(component: ".RxSwift.version") - try fileHandler.touch(rxSwiftVersionFilePath) - try fileHandler.write(CarthageVersionFile.testRxSwiftJson, path: rxSwiftVersionFilePath, atomically: true) - - let alamofireVersionFilePath = path.appending(component: ".Alamofire.version") - try fileHandler.touch(alamofireVersionFilePath) - try fileHandler.write(CarthageVersionFile.testAlamofireJson, path: alamofireVersionFilePath, atomically: true) - - // When - let got = try subject.generate(at: path) - - // Then - let expected = DependenciesGraph( - externalDependencies: [ - "RxSwift": [.xcframework(path: .relativeToManifest("Tuist/Dependencies/Carthage/Build/RxSwift.xcframework"))], - "RxCocoa": [.xcframework(path: .relativeToManifest("Tuist/Dependencies/Carthage/Build/RxCocoa.xcframework"))], - "RxRelay": [.xcframework(path: .relativeToManifest("Tuist/Dependencies/Carthage/Build/RxRelay.xcframework"))], - "RxTest": [.xcframework(path: .relativeToManifest("Tuist/Dependencies/Carthage/Build/RxTest.xcframework"))], - "RxBlocking": [.xcframework(path: .relativeToManifest("Tuist/Dependencies/Carthage/Build/RxBlocking.xcframework"))], - "Alamofire": [.xcframework(path: .relativeToManifest("Tuist/Dependencies/Carthage/Build/Alamofire.xcframework"))], - ], - externalProjects: [:] - ) - - XCTAssertEqual(got, expected) - } -} diff --git a/Tests/TuistDependenciesTests/DependenciesControllerTests.swift b/Tests/TuistDependenciesTests/DependenciesControllerTests.swift deleted file mode 100644 index 42d36da91c3..00000000000 --- a/Tests/TuistDependenciesTests/DependenciesControllerTests.swift +++ /dev/null @@ -1,525 +0,0 @@ -import ProjectDescription -import TSCBasic -import TSCUtility -import TuistCore -import TuistGraph -import TuistSupport -import XCTest - -@testable import TuistDependencies -@testable import TuistDependenciesTesting -@testable import TuistSupportTesting - -final class DependenciesControllerTests: TuistUnitTestCase { - private var subject: DependenciesController! - - private var carthageInteractor: MockCarthageInteractor! - private var swiftPackageManagerInteractor: MockSwiftPackageManagerInteractor! - private var dependenciesGraphController: MockDependenciesGraphController! - - override func setUp() { - super.setUp() - - carthageInteractor = MockCarthageInteractor() - swiftPackageManagerInteractor = MockSwiftPackageManagerInteractor() - dependenciesGraphController = MockDependenciesGraphController() - - subject = DependenciesController( - carthageInteractor: carthageInteractor, - swiftPackageManagerInteractor: swiftPackageManagerInteractor, - dependenciesGraphController: dependenciesGraphController - ) - } - - override func tearDown() { - subject = nil - - carthageInteractor = nil - swiftPackageManagerInteractor = nil - - super.tearDown() - } - - // MARK: - Fetch - - func test_fetch_carthage() throws { - // Given - let rootPath = try temporaryPath() - let dependenciesDirectoryPath = rootPath - .appending(component: Constants.tuistDirectoryName) - .appending(component: Constants.DependenciesDirectory.name) - - let platforms: Set = [.iOS] - let carthageDependencies = CarthageDependencies( - [ - .github(path: "Moya", requirement: .exact("1.1.1")), - .github(path: "RxSwift", requirement: .exact("2.0.0")), - ] - ) - let dependencies = Dependencies( - carthage: carthageDependencies, - swiftPackageManager: nil, - platforms: platforms - ) - - let expectedGraphManifest = TuistCore.DependenciesGraph.testXCFramework(name: "Name") - - carthageInteractor.installStub = { arg0, arg1, arg2, arg3 in - XCTAssertEqual(arg0, dependenciesDirectoryPath) - XCTAssertEqual(arg1, carthageDependencies) - XCTAssertEqual(arg2, platforms) - XCTAssertFalse(arg3) - - return expectedGraphManifest - } - - // When - let graphManifest = try subject.fetch(at: rootPath, dependencies: dependencies, swiftVersion: nil) - - // Then - XCTAssertEqual(graphManifest, expectedGraphManifest) - - XCTAssertFalse(carthageInteractor.invokedClean) - XCTAssertTrue(carthageInteractor.invokedInstall) - - XCTAssertTrue(swiftPackageManagerInteractor.invokedClean) - XCTAssertFalse(swiftPackageManagerInteractor.invokedInstall) - } - - func test_fetch_swiftPackageManger() throws { - // Given - let rootPath = try temporaryPath() - let dependenciesDirectoryPath = rootPath - .appending(component: Constants.tuistDirectoryName) - .appending(component: Constants.DependenciesDirectory.name) - - let platforms: Set = [.iOS] - let swiftPackageManagerDependencies = SwiftPackageManagerDependencies( - .packages([ - .remote(url: "Moya", requirement: .exact("2.3.4")), - .remote(url: "Alamofire", requirement: .upToNextMajor("5.0.0")), - ]), - productTypes: [:], - baseSettings: .default, - targetSettings: [:] - ) - let dependencies = Dependencies( - carthage: nil, - swiftPackageManager: swiftPackageManagerDependencies, - platforms: platforms - ) - let swiftVersion = TSCUtility.Version(5, 4, 0) - - swiftPackageManagerInteractor.installStub = { arg0, arg1, arg2, arg3, arg4 in - XCTAssertEqual(arg0, dependenciesDirectoryPath) - XCTAssertEqual(arg1, swiftPackageManagerDependencies) - XCTAssertEqual(arg2, [.iOS]) - XCTAssertFalse(arg3) - XCTAssertEqual(arg4, TSCUtility.Version(5, 4, 0)) - return .test() - } - - // When - let graphManifest = try subject.fetch(at: rootPath, dependencies: dependencies, swiftVersion: swiftVersion) - - // Then - XCTAssertEqual(graphManifest, .test()) - - XCTAssertFalse(swiftPackageManagerInteractor.invokedClean) - XCTAssertTrue(swiftPackageManagerInteractor.invokedInstall) - - XCTAssertTrue(carthageInteractor.invokedClean) - XCTAssertFalse(carthageInteractor.invokedInstall) - } - - func test_fetch_carthage_swiftPackageManger() throws { - // Given - let rootPath = try temporaryPath() - let dependenciesDirectoryPath = rootPath - .appending(component: Constants.tuistDirectoryName) - .appending(component: Constants.DependenciesDirectory.name) - - let platforms: Set = [.iOS] - let carthageDependencies = CarthageDependencies( - [ - .github(path: "Moya", requirement: .exact("1.1.1")), - .github(path: "RxSwift", requirement: .exact("2.0.0")), - ] - ) - let swiftPackageManagerDependencies = SwiftPackageManagerDependencies( - .packages([ - .remote(url: "Moya", requirement: .exact("2.3.4")), - .remote(url: "Alamofire", requirement: .upToNextMajor("5.0.0")), - ]), - productTypes: [:], - baseSettings: .default, - targetSettings: [:] - ) - let dependencies = Dependencies( - carthage: carthageDependencies, - swiftPackageManager: swiftPackageManagerDependencies, - platforms: platforms - ) - let swiftVersion = TSCUtility.Version(5, 4, 0) - let carthageGraph = TuistCore.DependenciesGraph.testXCFramework(name: "Carthage") - let spmGraph = TuistCore.DependenciesGraph.testXCFramework(name: "SPM") - - carthageInteractor.installStub = { arg0, arg1, arg2, arg3 in - XCTAssertEqual(arg0, dependenciesDirectoryPath) - XCTAssertEqual(arg1, carthageDependencies) - XCTAssertEqual(arg2, platforms) - XCTAssertFalse(arg3) - - return carthageGraph - } - swiftPackageManagerInteractor.installStub = { arg0, arg1, arg2, arg3, arg4 in - XCTAssertEqual(arg0, dependenciesDirectoryPath) - XCTAssertEqual(arg1, swiftPackageManagerDependencies) - XCTAssertEqual(arg2, [.iOS]) - XCTAssertFalse(arg3) - XCTAssertEqual(arg4, swiftVersion) - return spmGraph - } - - // When - let graphManifest = try subject.fetch(at: rootPath, dependencies: dependencies, swiftVersion: swiftVersion) - - // Then - XCTAssertEqual( - graphManifest, - .init( - externalDependencies: [ - "Carthage": TuistCore.DependenciesGraph.testXCFramework(name: "Carthage") - .externalDependencies.values.first!, - "SPM": TuistCore.DependenciesGraph.testXCFramework(name: "SPM") - .externalDependencies.values.first!, - ], - externalProjects: [:] - ) - ) - - XCTAssertTrue(carthageInteractor.invokedInstall) - XCTAssertFalse(carthageInteractor.invokedClean) - - XCTAssertTrue(swiftPackageManagerInteractor.invokedInstall) - XCTAssertFalse(swiftPackageManagerInteractor.invokedClean) - } - - func test_fetch_carthage_swiftPackageManger_throws_when_duplicatedDependency() throws { - // Given - let rootPath = try temporaryPath() - let dependencies = TuistGraph.Dependencies( - carthage: .init( - [ - .github(path: "Moya", requirement: .exact("1.1.1")), - ] - ), - swiftPackageManager: .init( - .packages([ - .remote(url: "Moya", requirement: .exact("2.3.4")), - ]), - productTypes: [:], - baseSettings: .default, - targetSettings: [:] - ), - platforms: [.iOS] - ) - let carthageGraph = TuistCore.DependenciesGraph.testXCFramework( - name: "Duplicated", - path: Path(rootPath.appending(component: "Carthage").pathString) - ) - let spmGraph = TuistCore.DependenciesGraph.testXCFramework( - name: "Duplicated", - path: Path(rootPath.appending(component: "SPM").pathString) - ) - - carthageInteractor.installStub = { _, _, _, _ in - carthageGraph - } - swiftPackageManagerInteractor.installStub = { _, _, _, _, _ in - spmGraph - } - - // When / Then - XCTAssertThrowsSpecific( - try subject.fetch(at: rootPath, dependencies: dependencies, swiftVersion: nil), - DependenciesControllerError.duplicatedDependency( - "Duplicated", - carthageGraph.externalDependencies.values.first!, - spmGraph.externalDependencies.values.first! - ) - ) - - // Then - XCTAssertTrue(carthageInteractor.invokedInstall) - XCTAssertFalse(carthageInteractor.invokedClean) - - XCTAssertTrue(swiftPackageManagerInteractor.invokedInstall) - XCTAssertFalse(swiftPackageManagerInteractor.invokedClean) - } - - func test_fetch_throws_when_noPlatforms() throws { - // Given - let rootPath = try temporaryPath() - - let dependencies = TuistGraph.Dependencies( - carthage: .init([]), - swiftPackageManager: .init(.packages([]), productTypes: [:], baseSettings: .default, targetSettings: [:]), - platforms: [] - ) - - // When / Then - XCTAssertThrowsSpecific( - try subject.fetch(at: rootPath, dependencies: dependencies, swiftVersion: nil), - DependenciesControllerError.noPlatforms - ) - } - - func test_fetch_no_dependencies() throws { - // Given - let rootPath = try temporaryPath() - - let dependencies = TuistGraph.Dependencies( - carthage: .init([]), - swiftPackageManager: .init(.packages([]), productTypes: [:], baseSettings: .default, targetSettings: [:]), - platforms: [.iOS] - ) - - // When - let graphManifest = try subject.fetch(at: rootPath, dependencies: dependencies, swiftVersion: nil) - - // Then - XCTAssertEqual(graphManifest, .none) - XCTAssertFalse(carthageInteractor.invokedInstall) - XCTAssertTrue(carthageInteractor.invokedClean) - } - - // MARK: - Update - - func test_update_carthage() throws { - // Given - let rootPath = try temporaryPath() - let dependenciesDirectoryPath = rootPath - .appending(component: Constants.tuistDirectoryName) - .appending(component: Constants.DependenciesDirectory.name) - - let platforms: Set = [.iOS] - let carthageDependencies = CarthageDependencies( - [ - .github(path: "Moya", requirement: .exact("1.1.1")), - .github(path: "RxSwift", requirement: .exact("2.0.0")), - ] - ) - let dependencies = Dependencies( - carthage: carthageDependencies, - swiftPackageManager: nil, - platforms: platforms - ) - let expectedGraph = TuistCore.DependenciesGraph.testXCFramework(name: "Name") - - carthageInteractor.installStub = { arg0, arg1, arg2, arg3 in - XCTAssertEqual(arg0, dependenciesDirectoryPath) - XCTAssertEqual(arg1, carthageDependencies) - XCTAssertEqual(arg2, platforms) - XCTAssertTrue(arg3) - - return expectedGraph - } - - // When - let graphManifest = try subject.update(at: rootPath, dependencies: dependencies, swiftVersion: nil) - - // Then - XCTAssertEqual(graphManifest, expectedGraph) - XCTAssertFalse(carthageInteractor.invokedClean) - XCTAssertTrue(carthageInteractor.invokedInstall) - - XCTAssertTrue(swiftPackageManagerInteractor.invokedClean) - XCTAssertFalse(swiftPackageManagerInteractor.invokedInstall) - } - - func test_update_swiftPackageManger() throws { - // Given - let rootPath = try temporaryPath() - let dependenciesDirectoryPath = rootPath - .appending(component: Constants.tuistDirectoryName) - .appending(component: Constants.DependenciesDirectory.name) - - let platforms: Set = [.iOS] - let swiftPackageManagerDependencies = SwiftPackageManagerDependencies( - .packages([ - .remote(url: "Moya", requirement: .exact("2.3.4")), - .remote(url: "Alamofire", requirement: .upToNextMajor("5.0.0")), - ]), - productTypes: [:], - baseSettings: .default, - targetSettings: [:] - ) - let dependencies = Dependencies( - carthage: nil, - swiftPackageManager: swiftPackageManagerDependencies, - platforms: platforms - ) - let swiftVersion = TSCUtility.Version(5, 4, 0) - - swiftPackageManagerInteractor.installStub = { arg0, arg1, arg2, arg3, arg4 in - XCTAssertEqual(arg0, dependenciesDirectoryPath) - XCTAssertEqual(arg1, swiftPackageManagerDependencies) - XCTAssertEqual(arg2, [.iOS]) - XCTAssertTrue(arg3) - XCTAssertEqual(arg4, swiftVersion) - return .test() - } - - // When - let graphManifest = try subject.update(at: rootPath, dependencies: dependencies, swiftVersion: swiftVersion) - - // Then - XCTAssertEqual(graphManifest, .test()) - XCTAssertFalse(swiftPackageManagerInteractor.invokedClean) - XCTAssertTrue(swiftPackageManagerInteractor.invokedInstall) - - XCTAssertTrue(carthageInteractor.invokedClean) - XCTAssertFalse(carthageInteractor.invokedInstall) - } - - func test_update_carthage_swiftPackageManger() throws { - // Given - let rootPath = try temporaryPath() - let dependenciesDirectoryPath = rootPath - .appending(component: Constants.tuistDirectoryName) - .appending(component: Constants.DependenciesDirectory.name) - - let platforms: Set = [.iOS] - let carthageDependencies = CarthageDependencies( - [ - .github(path: "Moya", requirement: .exact("1.1.1")), - .github(path: "RxSwift", requirement: .exact("2.0.0")), - ] - ) - let swiftPackageManagerDependencies = SwiftPackageManagerDependencies( - .packages([ - .remote(url: "Moya", requirement: .exact("2.3.4")), - .remote(url: "Alamofire", requirement: .upToNextMajor("5.0.0")), - ]), - productTypes: [:], - baseSettings: .default, - targetSettings: [:] - ) - let dependencies = Dependencies( - carthage: carthageDependencies, - swiftPackageManager: swiftPackageManagerDependencies, - platforms: platforms - ) - let swiftVersion = TSCUtility.Version(5, 4, 0) - let expectedGraph = TuistCore.DependenciesGraph.testXCFramework(name: "Name") - - carthageInteractor.installStub = { arg0, arg1, arg2, arg3 in - XCTAssertEqual(arg0, dependenciesDirectoryPath) - XCTAssertEqual(arg1, carthageDependencies) - XCTAssertEqual(arg2, platforms) - XCTAssertTrue(arg3) - - return expectedGraph - } - swiftPackageManagerInteractor.installStub = { arg0, arg1, arg2, arg3, arg4 in - XCTAssertEqual(arg0, dependenciesDirectoryPath) - XCTAssertEqual(arg1, swiftPackageManagerDependencies) - XCTAssertEqual(arg2, [.iOS]) - XCTAssertTrue(arg3) - XCTAssertEqual(arg4, swiftVersion) - return .test() - } - - // When - let graphManifest = try subject.update(at: rootPath, dependencies: dependencies, swiftVersion: swiftVersion) - - // Then - XCTAssertEqual(graphManifest, expectedGraph) - XCTAssertFalse(carthageInteractor.invokedClean) - XCTAssertTrue(carthageInteractor.invokedInstall) - - XCTAssertFalse(swiftPackageManagerInteractor.invokedClean) - XCTAssertTrue(swiftPackageManagerInteractor.invokedInstall) - } - - func test_update_throws_when_noPlatforms() throws { - // Given - let rootPath = try temporaryPath() - - let dependencies = TuistGraph.Dependencies( - carthage: .init([]), - swiftPackageManager: .init(.packages([]), productTypes: [:], baseSettings: .default, targetSettings: [:]), - platforms: [] - ) - - // When / Then - XCTAssertThrowsSpecific( - try subject.update(at: rootPath, dependencies: dependencies, swiftVersion: nil), - DependenciesControllerError.noPlatforms - ) - } - - func test_update_no_dependencies() throws { - // Given - let rootPath = try temporaryPath() - - let dependencies = TuistGraph.Dependencies( - carthage: .init([]), - swiftPackageManager: .init(.packages([]), productTypes: [:], baseSettings: .default, targetSettings: [:]), - platforms: [.iOS] - ) - - // When - let graphManifest = try subject.update(at: rootPath, dependencies: dependencies, swiftVersion: nil) - - // Then - XCTAssertEqual(graphManifest, .none) - XCTAssertFalse(carthageInteractor.invokedInstall) - XCTAssertTrue(carthageInteractor.invokedClean) - } - - func test_save() throws { - // Given - let rootPath = try temporaryPath() - - let dependenciesGraph = TuistGraph.DependenciesGraph( - externalDependencies: [ - "library": [.xcframework(path: "/library.xcframework", status: .required)], - "anotherLibrary": [.project(target: "Target", path: "/anotherLibrary")], - ], - externalProjects: [ - "/anotherLibrary": .test(), - ] - ) - - dependenciesGraphController.saveStub = { arg0, arg1 in - XCTAssertEqual(arg0, dependenciesGraph) - XCTAssertEqual(arg1, rootPath) - } - - // When - try subject.save(dependenciesGraph: dependenciesGraph, to: rootPath) - - // Then - XCTAssertFalse(dependenciesGraphController.invokedClean) - XCTAssertTrue(dependenciesGraphController.invokedSave) - } - - func test_save_no_dependencies() throws { - // Given - let rootPath = try temporaryPath() - - dependenciesGraphController.saveStub = { arg0, arg1 in - XCTAssertEqual(arg0, .none) - XCTAssertEqual(arg1, rootPath) - } - - // When - try subject.save(dependenciesGraph: .none, to: rootPath) - - // Then - XCTAssertFalse(dependenciesGraphController.invokedClean) - XCTAssertTrue(dependenciesGraphController.invokedSave) - } -} diff --git a/Tests/TuistDependenciesTests/DependenciesGraph/DependenciesGraphControllerTests.swift b/Tests/TuistDependenciesTests/DependenciesGraph/DependenciesGraphControllerTests.swift deleted file mode 100644 index 93fc3397578..00000000000 --- a/Tests/TuistDependenciesTests/DependenciesGraph/DependenciesGraphControllerTests.swift +++ /dev/null @@ -1,138 +0,0 @@ -import Foundation -import TSCBasic -import TuistGraph -import TuistSupport -import XCTest - -@testable import TuistDependencies -@testable import TuistDependenciesTesting -@testable import TuistGraphTesting -@testable import TuistSupportTesting - -public final class DependenciesGraphControllerTests: TuistUnitTestCase { - private var subject: DependenciesGraphController! - - override public func setUp() { - super.setUp() - subject = DependenciesGraphController() - } - - override public func tearDown() { - subject = nil - super.tearDown() - } - - func test_save() throws { - // Given - let root = try temporaryPath() - let graph = TuistGraph.DependenciesGraph.test() - - // When - try subject.save(graph, to: root) - - // Then - let graphPath = root.appending(components: "Tuist", "Dependencies", "graph.json") - XCTAssertTrue(fileHandler.exists(graphPath)) - } - - func test_load() throws { - // Given - let root = try temporaryPath() - - let dependenciesPath = root.appending(components: "Tuist", "Dependencies.swift") - try fileHandler.touch(dependenciesPath) - - try fileHandler.write(TuistGraph.DependenciesGraph.testDependenciesFile, path: dependenciesPath, atomically: true) - - let graphPath = root.appending(components: "Tuist", "Dependencies", "graph.json") - try fileHandler.touch(graphPath) - - try fileHandler.write(TuistGraph.DependenciesGraph.testJson, path: graphPath, atomically: true) - - // When - let got = try subject.load(at: root) - - // Then - let expected = TuistGraph.DependenciesGraph( - externalDependencies: ["RxSwift": [.xcframework(path: "/Tuist/Dependencies/Carthage/RxSwift.xcframework", - status: .required)]], - externalProjects: [:] - ) - - XCTAssertEqual(got, expected) - } - - func test_load_failed() throws { - // Given - let root = try temporaryPath() - - let dependenciesPath = root.appending(components: "Tuist", "Dependencies.swift") - try fileHandler.touch(dependenciesPath) - - try fileHandler.write(TuistGraph.DependenciesGraph.testDependenciesFile, path: dependenciesPath, atomically: true) - - let graphPath = root.appending(components: "Tuist", "Dependencies", "graph.json") - try fileHandler.touch(graphPath) - - try fileHandler.write( - """ - { - "externalDependencies": {}, - "externalProjects": [ - "ProjectPath", - { - "invalid": "Project" - } - ] - } - """, - path: graphPath, - atomically: true - ) - - // When / Then - XCTAssertThrowsSpecific( - try subject.load(at: root), - DependenciesGraphControllerError.failedToDecodeDependenciesGraph - ) - } - - func test_load_without_fetching() throws { - // Given - let root = try temporaryPath() - - let dependenciesPath = root.appending(components: "Tuist", "Dependencies.swift") - try fileHandler.touch(dependenciesPath) - - try fileHandler.write(TuistGraph.DependenciesGraph.testDependenciesFile, path: dependenciesPath, atomically: true) - - // When / Then - XCTAssertThrowsSpecific( - try subject.load(at: root), - DependenciesGraphControllerError.dependenciesWerentFetched - ) - } - - func test_load_no_dependencies() throws { - // Given - let root = try temporaryPath() - let dependenciesPath = root.appending(components: "Tuist") - try fileHandler.touch(dependenciesPath) - - // When / Then - XCTAssertEqual(try subject.load(at: root), .none) - } - - func test_clean() throws { - // Given - let root = try temporaryPath() - let graphPath = root.appending(components: "Tuist", "Dependencies", "graph.json") - try fileHandler.touch(graphPath) - - // When - try subject.clean(at: root) - - // Then - XCTAssertFalse(fileHandler.exists(graphPath)) - } -} diff --git a/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift index aebb4b81d2f..b5f89bfb7d8 100644 --- a/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift @@ -4,7 +4,6 @@ import TuistGraphTesting import XCTest @testable import TuistDependencies -@testable import TuistDependenciesTesting @testable import TuistSupportTesting final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase { diff --git a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift index 4b61b5d4bce..3fea9dcf6ac 100644 --- a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift @@ -5,7 +5,6 @@ import TuistGraphTesting import XCTest @testable import TuistDependencies -@testable import TuistDependenciesTesting @testable import TuistSupportTesting final class PruneOrphanExternalTargetsGraphMapperTests: TuistUnitTestCase { diff --git a/Tests/TuistDependenciesTests/SwiftPackageManager/SwiftPackageManagerInteractorTests.swift b/Tests/TuistDependenciesTests/SwiftPackageManager/SwiftPackageManagerInteractorTests.swift deleted file mode 100644 index cc30cede041..00000000000 --- a/Tests/TuistDependenciesTests/SwiftPackageManager/SwiftPackageManagerInteractorTests.swift +++ /dev/null @@ -1,366 +0,0 @@ -import ProjectDescription -import TSCBasic -import TSCUtility -import TuistCore -import TuistGraph -import TuistSupport -import XCTest - -@testable import TuistDependencies -@testable import TuistDependenciesTesting -@testable import TuistSupportTesting - -final class SwiftPackageManagerInteractorTests: TuistUnitTestCase { - private var subject: SwiftPackageManagerInteractor! - private var swiftPackageManagerController: MockSwiftPackageManagerController! - private var swiftPackageManagerGraphGenerator: MockSwiftPackageManagerGraphGenerator! - - override func setUp() { - super.setUp() - - swiftPackageManagerController = MockSwiftPackageManagerController() - swiftPackageManagerGraphGenerator = MockSwiftPackageManagerGraphGenerator() - subject = SwiftPackageManagerInteractor( - swiftPackageManagerController: swiftPackageManagerController, - swiftPackageManagerGraphGenerator: swiftPackageManagerGraphGenerator - ) - } - - override func tearDown() { - subject = nil - swiftPackageManagerController = nil - - super.tearDown() - } - - func test_install_when_shouldNotBeUpdated() throws { - // Given - let rootPath = try TemporaryDirectory(removeTreeOnDeinit: true).path - let dependenciesDirectory = rootPath - .appending(component: Constants.DependenciesDirectory.name) - let lockfilesDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.lockfilesDirectoryName) - let swiftPackageManagerDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.swiftPackageManagerDirectoryName) - let swiftPackageManagerBuildDirectory = swiftPackageManagerDirectory.appending(component: ".build") - - let dependencies = SwiftPackageManagerDependencies( - .packages([ - .remote(url: "https://github.com/Alamofire/Alamofire.git", requirement: .upToNextMajor("5.2.0")), - ]), - productTypes: [:], - baseSettings: .default, - targetSettings: [:] - ) - - system.swiftVersionStub = { "5.6.0" } - swiftPackageManagerController.resolveStub = { path, printOutput in - XCTAssertEqual(path, swiftPackageManagerDirectory) - XCTAssertTrue(printOutput) - try self.simulateSPMOutput(at: path) - } - swiftPackageManagerController.setToolsVersionStub = { path, version in - XCTAssertEqual(path, swiftPackageManagerDirectory) - XCTAssertEqual(version, TSCUtility.Version(5, 6, 0)) - } - - swiftPackageManagerGraphGenerator - .generateStub = - { path, automaticProductType, platforms, baseSettings, targetSettings, swiftToolsVersion, projectOptions in - XCTAssertEqual(path, swiftPackageManagerBuildDirectory) - XCTAssertEqual(platforms, [.iOS]) - XCTAssertEqual(automaticProductType, [:]) - XCTAssertEqual(baseSettings, .default) - XCTAssertEqual(targetSettings, [:]) - XCTAssertNil(swiftToolsVersion) - XCTAssertEqual(projectOptions, [:]) - return .test() - } - - // When - let dependenciesGraph = try subject.install( - dependenciesDirectory: dependenciesDirectory, - dependencies: dependencies, - platforms: [.iOS], - shouldUpdate: false, - swiftToolsVersion: nil - ) - - // Then - XCTAssertEqual(dependenciesGraph, .test()) - try XCTAssertDirectoryContentEqual( - dependenciesDirectory, - [ - Constants.DependenciesDirectory.lockfilesDirectoryName, - Constants.DependenciesDirectory.swiftPackageManagerDirectoryName, - ] - ) - try XCTAssertDirectoryContentEqual( - lockfilesDirectory, - [ - Constants.DependenciesDirectory.packageResolvedName, - ] - ) - try XCTAssertDirectoryContentEqual( - swiftPackageManagerDirectory, - [ - ".build", - "Package.swift", - ] - ) - try XCTAssertDirectoryContentEqual( - swiftPackageManagerBuildDirectory, - [ - "manifest.db", - "workspace-state.json", - "artifacts", - "checkouts", - "repositories", - ] - ) - - XCTAssertTrue(swiftPackageManagerController.invokedResolve) - XCTAssertTrue(swiftPackageManagerController.invokedSetToolsVersion) - XCTAssertFalse(swiftPackageManagerController.invokedUpdate) - } - - func test_install_when_shouldNotBeUpdated_and_swiftToolsVersionPassed() throws { - // Given - let rootPath = try TemporaryDirectory(removeTreeOnDeinit: true).path - let dependenciesDirectory = rootPath - .appending(component: Constants.DependenciesDirectory.name) - let lockfilesDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.lockfilesDirectoryName) - let swiftPackageManagerDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.swiftPackageManagerDirectoryName) - let swiftPackageManagerBuildDirectory = swiftPackageManagerDirectory.appending(component: ".build") - - let swiftToolsVersion = TSCUtility.Version(5, 3, 0) - let dependencies = SwiftPackageManagerDependencies( - .packages([ - .remote(url: "https://github.com/Alamofire/Alamofire.git", requirement: .upToNextMajor("5.2.0")), - ]), - productTypes: [:], - baseSettings: .default, - targetSettings: [:] - ) - - system.swiftVersionStub = { "5.6.0" } - swiftPackageManagerController.resolveStub = { path, printOutput in - XCTAssertEqual(path, swiftPackageManagerDirectory) - XCTAssertTrue(printOutput) - try self.simulateSPMOutput(at: path) - } - swiftPackageManagerController.setToolsVersionStub = { path, version in - XCTAssertEqual(path, swiftPackageManagerDirectory) - XCTAssertEqual(version, swiftToolsVersion) - } - - swiftPackageManagerGraphGenerator - .generateStub = { path, automaticProductType, platforms, baseSettings, targetSettings, swiftVersion, projectOptions in - XCTAssertEqual(path, swiftPackageManagerBuildDirectory) - XCTAssertEqual(automaticProductType, [:]) - XCTAssertEqual(platforms, [.iOS]) - XCTAssertEqual(baseSettings, .default) - XCTAssertEqual(targetSettings, [:]) - XCTAssertEqual(swiftVersion, swiftToolsVersion) - XCTAssertEqual(projectOptions, [:]) - return .test() - } - - // When - let dependenciesGraph = try subject.install( - dependenciesDirectory: dependenciesDirectory, - dependencies: dependencies, - platforms: [.iOS], - shouldUpdate: false, - swiftToolsVersion: swiftToolsVersion - ) - - // Then - XCTAssertEqual(dependenciesGraph, .test()) - try XCTAssertDirectoryContentEqual( - dependenciesDirectory, - [ - Constants.DependenciesDirectory.lockfilesDirectoryName, - Constants.DependenciesDirectory.swiftPackageManagerDirectoryName, - ] - ) - try XCTAssertDirectoryContentEqual( - lockfilesDirectory, - [ - Constants.DependenciesDirectory.packageResolvedName, - ] - ) - try XCTAssertDirectoryContentEqual( - swiftPackageManagerDirectory, - [ - ".build", - "Package.swift", - ] - ) - try XCTAssertDirectoryContentEqual( - swiftPackageManagerBuildDirectory, - [ - "manifest.db", - "workspace-state.json", - "artifacts", - "checkouts", - "repositories", - ] - ) - - XCTAssertTrue(swiftPackageManagerController.invokedResolve) - XCTAssertTrue(swiftPackageManagerController.invokedSetToolsVersion) - XCTAssertFalse(swiftPackageManagerController.invokedUpdate) - } - - func test_install_when_shouldBeUpdated() throws { - // Given - let rootPath = try TemporaryDirectory(removeTreeOnDeinit: true).path - let dependenciesDirectory = rootPath - .appending(component: Constants.DependenciesDirectory.name) - let lockfilesDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.lockfilesDirectoryName) - let swiftPackageManagerDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.swiftPackageManagerDirectoryName) - let swiftPackageManagerBuildDirectory = swiftPackageManagerDirectory.appending(component: ".build") - - let dependencies = SwiftPackageManagerDependencies( - .packages([ - .remote(url: "https://github.com/Alamofire/Alamofire.git", requirement: .upToNextMajor("5.2.0")), - ]), - productTypes: [:], - baseSettings: .default, - targetSettings: [:] - ) - - system.swiftVersionStub = { "5.6.0" } - swiftPackageManagerController.updateStub = { path, printOutput in - XCTAssertEqual(path, swiftPackageManagerDirectory) - XCTAssertTrue(printOutput) - try self.simulateSPMOutput(at: path) - } - swiftPackageManagerController.setToolsVersionStub = { path, version in - XCTAssertEqual(path, swiftPackageManagerDirectory) - XCTAssertEqual(version, Version("5.6.0")) - } - - swiftPackageManagerGraphGenerator - .generateStub = - { path, automaticProductType, platforms, baseSettings, targetSettings, swiftToolsVersion, configuration in - XCTAssertEqual(path, swiftPackageManagerBuildDirectory) - XCTAssertEqual(automaticProductType, [:]) - XCTAssertEqual(platforms, [.iOS]) - XCTAssertEqual(baseSettings, .default) - XCTAssertEqual(targetSettings, [:]) - XCTAssertNil(swiftToolsVersion) - XCTAssertEqual(configuration, [:]) - return .test() - } - - // When - let dependenciesGraph = try subject.install( - dependenciesDirectory: dependenciesDirectory, - dependencies: dependencies, - platforms: [.iOS], - shouldUpdate: true, - swiftToolsVersion: nil - ) - - // Then - XCTAssertEqual(dependenciesGraph, .test()) - try XCTAssertDirectoryContentEqual( - dependenciesDirectory, - [ - Constants.DependenciesDirectory.lockfilesDirectoryName, - Constants.DependenciesDirectory.swiftPackageManagerDirectoryName, - ] - ) - try XCTAssertDirectoryContentEqual( - lockfilesDirectory, - [ - Constants.DependenciesDirectory.packageResolvedName, - ] - ) - try XCTAssertDirectoryContentEqual( - swiftPackageManagerDirectory, - [ - ".build", - "Package.swift", - ] - ) - try XCTAssertDirectoryContentEqual( - swiftPackageManagerBuildDirectory, - [ - "manifest.db", - "workspace-state.json", - "artifacts", - "checkouts", - "repositories", - ] - ) - - XCTAssertTrue(swiftPackageManagerController.invokedUpdate) - XCTAssertTrue(swiftPackageManagerController.invokedSetToolsVersion) - XCTAssertFalse(swiftPackageManagerController.invokedResolve) - } - - func test_clean() throws { - // Given - let rootPath = try temporaryPath() - let dependenciesDirectory = rootPath - .appending(component: Constants.DependenciesDirectory.name) - let lockfilesDirectory = dependenciesDirectory - .appending(component: Constants.DependenciesDirectory.lockfilesDirectoryName) - - try createFiles([ - "Dependencies/SwiftPackageManager/Package.swift", - "Dependencies/Lockfiles/Package.resolved", - "Dependencies/Lockfiles/OtherLockfile.lock", - "Dependencies/SwiftPackageManager/Info.plist", - "Dependencies/OtherDependenciesManager/bar.bar", - ]) - - // When - try subject.clean(dependenciesDirectory: dependenciesDirectory) - - // Then - try XCTAssertDirectoryContentEqual( - dependenciesDirectory, - [ - Constants.DependenciesDirectory.lockfilesDirectoryName, - "OtherDependenciesManager", - ] - ) - try XCTAssertDirectoryContentEqual( - lockfilesDirectory, - [ - "OtherLockfile.lock", - ] - ) - - XCTAssertFalse(swiftPackageManagerController.invokedUpdate) - XCTAssertFalse(swiftPackageManagerController.invokedSetToolsVersion) - XCTAssertFalse(swiftPackageManagerController.invokedResolve) - } -} - -// MARK: - Helpers - -extension SwiftPackageManagerInteractorTests { - private func simulateSPMOutput(at path: AbsolutePath) throws { - try [ - "Package.swift", - "Package.resolved", - ".build/manifest.db", - ".build/workspace-state.json", - ".build/artifacts/foo.txt", - ".build/checkouts/Alamofire/Info.plist", - ".build/repositories/checkouts-state.json", - ".build/repositories/Alamofire-e8f130fe/config", - ].forEach { - try fileHandler.touch(path.appending(try RelativePath(validating: $0))) - } - } -} diff --git a/Tests/TuistDependenciesTests/SwiftPackageManager/Utils/SwiftPackageManagerGraphGeneratorTests.swift b/Tests/TuistDependenciesTests/SwiftPackageManager/Utils/SwiftPackageManagerGraphGeneratorTests.swift deleted file mode 100644 index f05c3ac5bd7..00000000000 --- a/Tests/TuistDependenciesTests/SwiftPackageManager/Utils/SwiftPackageManagerGraphGeneratorTests.swift +++ /dev/null @@ -1,520 +0,0 @@ -import ProjectDescription -import TSCBasic -import TuistCore -import TuistDependencies -import TuistGraph -import TuistSupport -import XCTest -@testable import TuistDependenciesTesting -@testable import TuistLoaderTesting -@testable import TuistSupportTesting - -class SwiftPackageManagerGraphGeneratorTests: TuistUnitTestCase { - private var swiftPackageManagerController: MockSwiftPackageManagerController! - private var subject: SwiftPackageManagerGraphGenerator! - private var path: AbsolutePath { try! temporaryPath() } - private var spmFolder: Path { Path(path.pathString) } - private var checkoutsPath: AbsolutePath { path.appending(component: "checkouts") } - - override func setUp() { - super.setUp() - - swiftPackageManagerController = MockSwiftPackageManagerController() - system.swiftVersionStub = { "5.7.0" } - subject = SwiftPackageManagerGraphGenerator(swiftPackageManagerController: swiftPackageManagerController) - } - - override func tearDown() { - swiftPackageManagerController = nil - subject = nil - super.tearDown() - } - - func test_generate_alamofire_spm_pre_v5_6() throws { - try checkGenerated( - workspaceDependenciesJSON: """ - [ - { - "packageRef": { - "identity" : "alamofire", - "kind": "remote", - "name": "Alamofire", - "path": "https://github.com/Alamofire/Alamofire" - }, - "subpath": "Alamofire" - } - ] - """, - loadPackageInfoStub: { packagePath in - XCTAssertEqual(packagePath, self.path.appending(component: "checkouts").appending(component: "Alamofire")) - return PackageInfo.alamofire - }, - dependenciesGraph: DependenciesGraph.alamofire(spmFolder: spmFolder) - ) - } - - func test_generate_alamofire_spm_v5_6() throws { - try checkGenerated( - workspaceDependenciesJSON: """ - [ - { - "packageRef": { - "identity" : "alamofire", - "kind": "remoteSourceControl", - "name": "Alamofire", - "path": "https://github.com/Alamofire/Alamofire" - }, - "subpath": "Alamofire" - } - ] - """, - loadPackageInfoStub: { packagePath in - XCTAssertEqual(packagePath, self.path.appending(component: "checkouts").appending(component: "Alamofire")) - return PackageInfo.alamofire - }, - dependenciesGraph: DependenciesGraph.alamofire(spmFolder: spmFolder) - ) - } - - func test_generate_google_measurement() throws { - try fileHandler.createFolder(try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/nanopb/Sources/nanopb")) - try fileHandler - .createFolder( - try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/GoogleUtilities/Sources/GULAppDelegateSwizzler") - ) - try fileHandler - .createFolder(try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/GoogleUtilities/Sources/GULNSData")) - try fileHandler - .createFolder( - try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/GoogleUtilities/Sources/GULMethodSwizzler") - ) - try fileHandler - .createFolder(try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/GoogleUtilities/Sources/GULNetwork")) - - // swiftformat:disable wrap - try checkGenerated( - workspaceDependenciesJSON: """ - [ - { - "packageRef": { - "identity" : "googleappmeasurement", - "kind": "remote", - "name": "GoogleAppMeasurement", - "path": "https://github.com/google/GoogleAppMeasurement" - }, - "subpath": "GoogleAppMeasurement" - }, - { - "packageRef": { - "identity" : "googleutilities", - "kind": "remote", - "name": "GoogleUtilities", - "path": "https://github.com/google/GoogleUtilities" - }, - "subpath": "GoogleUtilities" - }, - { - "packageRef": { - "identity" : "nanopb", - "kind": "remote", - "name": "nanopb", - "path": "https://github.com/nanopb/nanopb" - }, - "subpath": "nanopb" - } - ] - """, - workspaceArtifactsJSON: """ - [ - { - "packageRef" : { - "identity" : "googleappmeasurement", - "kind" : "remote", - "path" : "https://github.com/google/GoogleAppMeasurement", - "name" : "GoogleAppMeasurement" - }, - "path" : "\(spmFolder.pathString)/artifacts/GoogleAppMeasurement/GoogleAppMeasurement.xcframework", - "targetName" : "GoogleAppMeasurement" - }, - { - "packageRef" : { - "identity" : "googleappmeasurement", - "kind" : "remote", - "path" : "https://github.com/google/GoogleAppMeasurement", - "name" : "GoogleAppMeasurement" - }, - "path" : "\(spmFolder.pathString)/artifacts/GoogleAppMeasurement/GoogleAppMeasurementWithoutAdIdSupport.xcframework", - "targetName" : "GoogleAppMeasurementWithoutAdIdSupport" - }, - ] - """, - loadPackageInfoStub: { packagePath in - switch packagePath { - case self.checkoutsPath.appending(component: "GoogleAppMeasurement"): - return PackageInfo.googleAppMeasurement - case self.checkoutsPath.appending(component: "GoogleUtilities"): - return PackageInfo.googleUtilities - case self.checkoutsPath.appending(component: "nanopb"): - return PackageInfo.nanopb - default: - XCTFail("Unexpected path: \(self.path)") - return .test - } - }, - dependenciesGraph: try DependenciesGraph.googleAppMeasurement(spmFolder: spmFolder) - .merging(with: DependenciesGraph.googleUtilities( - spmFolder: spmFolder, - customProductTypes: [ - "GULMethodSwizzler": .framework, - "GULNetwork": .dynamicLibrary, - ] - )) - .merging(with: DependenciesGraph.nanopb(spmFolder: spmFolder)) - ) - // swiftformat:enable wrap - } - - func test_generate_test_local_path() throws { - try fileHandler - .createFolder(try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/ADependency/Sources/ALibrary")) - try fileHandler - .createFolder(try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/ADependency/Sources/ALibraryUtils")) - try fileHandler - .createFolder( - try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/another-dependency/Sources/AnotherLibrary") - ) - try fileHandler.createFolder(try AbsolutePath(validating: "/tmp/localPackage/Sources/TestUtilities")) - - let testPath = try AbsolutePath(validating: "/tmp/localPackage") - try checkGenerated( - workspaceDependenciesJSON: """ - [ - { - "packageRef": { - "identity" : "test", - "kind": "local", - "name": "test", - "path": "\(testPath.pathString)" - }, - "subpath": "test" - }, - { - "packageRef": { - "identity" : "a-dependency", - "kind": "remote", - "name": "a-dependency" - }, - "subpath": "ADependency" - }, - { - "packageRef": { - "identity" : "another-dependency", - "kind": "remote", - "name": "another-dependency" - }, - "subpath": "another-dependency" - } - ] - """, - loadPackageInfoStub: { packagePath in - switch packagePath { - case testPath: - return PackageInfo.test - case self.checkoutsPath.appending(component: "ADependency"): - return PackageInfo.aDependency - case self.checkoutsPath.appending(component: "another-dependency"): - return PackageInfo.anotherDependency - default: - XCTFail("Unexpected path: \(self.path)") - return .test - } - }, - dependenciesGraph: DependenciesGraph.test( - spmFolder: spmFolder, - packageFolder: Path(testPath.pathString), - destinations: [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign], - fileHandler: fileHandler - ) - .merging(with: DependenciesGraph.aDependency( - spmFolder: spmFolder, - destinations: [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign] - )) - .merging(with: DependenciesGraph.anotherDependency( - spmFolder: spmFolder, - destinations: [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign] - )) - ) - } - - func test_generate_test_local_location_spm_pre_v5_6() throws { - try fileHandler - .createFolder(try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/ADependency/Sources/ALibrary")) - try fileHandler - .createFolder(try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/ADependency/Sources/ALibraryUtils")) - try fileHandler - .createFolder( - try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/another-dependency/Sources/AnotherLibrary") - ) - try fileHandler.createFolder(try AbsolutePath(validating: "/tmp/localPackage/Sources/TestUtilities")) - try fileHandler.createFolder(try AbsolutePath(validating: "/tmp/localPackage/Sources/TuistKit")) - - let testPath = try AbsolutePath(validating: "/tmp/localPackage") - try checkGenerated( - workspaceDependenciesJSON: """ - [ - { - "packageRef": { - "identity" : "test", - "kind": "local", - "name": "test", - "location": "\(testPath.pathString)" - }, - "subpath": "test" - }, - { - "packageRef": { - "identity" : "a-dependency", - "kind": "remote", - "name": "a-dependency" - }, - "subpath": "ADependency" - }, - { - "packageRef": { - "identity" : "another-dependency", - "kind": "remote", - "name": "another-dependency" - }, - "subpath": "another-dependency" - } - ] - """, - loadPackageInfoStub: { packagePath in - switch packagePath { - case testPath: - return PackageInfo.test - case self.checkoutsPath.appending(component: "ADependency"): - return PackageInfo.aDependency - case self.checkoutsPath.appending(component: "another-dependency"): - return PackageInfo.anotherDependency - default: - XCTFail("Unexpected path: \(self.path)") - return .test - } - }, - dependenciesGraph: DependenciesGraph.test( - spmFolder: spmFolder, - packageFolder: Path(testPath.pathString), - fileHandler: fileHandler - ) - .merging(with: DependenciesGraph.aDependency(spmFolder: spmFolder)) - .merging(with: DependenciesGraph.anotherDependency(spmFolder: spmFolder)) - ) - } - - func test_generate_test_fileSystem_location_spm_v5_6() throws { - try fileHandler - .createFolder(try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/ADependency/Sources/ALibrary")) - try fileHandler - .createFolder(try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/ADependency/Sources/ALibraryUtils")) - try fileHandler - .createFolder( - try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/another-dependency/Sources/AnotherLibrary") - ) - try fileHandler.createFolder(try AbsolutePath(validating: "/tmp/localPackage/Sources/TestUtilities")) - try fileHandler.createFolder(try AbsolutePath(validating: "/tmp/localPackage/Sources/TuistKit")) - - let testPath = try AbsolutePath(validating: "/tmp/localPackage") - try checkGenerated( - workspaceDependenciesJSON: """ - [ - { - "packageRef": { - "identity" : "test", - "kind": "fileSystem", - "name": "test", - "location": "\(testPath.pathString)" - }, - "subpath": "test" - }, - { - "packageRef": { - "identity" : "a-dependency", - "kind": "remoteSourceControl", - "name": "a-dependency" - }, - "subpath": "ADependency" - }, - { - "packageRef": { - "identity": "another-dependency", - "kind": "remoteSourceControl", - "name": "another-dependency" - }, - "subpath": "another-dependency" - } - ] - """, - loadPackageInfoStub: { packagePath in - switch packagePath { - case testPath: - return PackageInfo.test - case self.checkoutsPath.appending(component: "ADependency"): - return PackageInfo.aDependency - case self.checkoutsPath.appending(component: "another-dependency"): - return PackageInfo.anotherDependency - default: - XCTFail("Unexpected path: \(self.path)") - return .test - } - }, - dependenciesGraph: DependenciesGraph.test( - spmFolder: spmFolder, - packageFolder: Path(testPath.pathString), - fileHandler: fileHandler - ) - .merging(with: DependenciesGraph.aDependency(spmFolder: spmFolder)) - .merging(with: DependenciesGraph.anotherDependency(spmFolder: spmFolder)) - ) - } - - func test_generate_test_localSourceControl_location_spm_v5_6() throws { - try fileHandler - .createFolder(try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/ADependency/Sources/ALibrary")) - try fileHandler - .createFolder(try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/ADependency/Sources/ALibraryUtils")) - try fileHandler - .createFolder( - try AbsolutePath(validating: "\(spmFolder.pathString)/checkouts/another-dependency/Sources/AnotherLibrary") - ) - try fileHandler.createFolder(try AbsolutePath(validating: "/tmp/localPackage/Sources/TuistKit")) - - let testPath = try AbsolutePath(validating: "/tmp/localPackage") - try checkGenerated( - workspaceDependenciesJSON: """ - [ - { - "packageRef": { - "identity" : "test", - "kind": "localSourceControl", - "name": "test", - "location": "\(testPath.pathString)" - }, - "subpath": "test" - }, - { - "packageRef": { - "identity" : "a-dependency", - "kind": "remoteSourceControl", - "name": "a-dependency" - }, - "subpath": "ADependency" - }, - { - "packageRef": { - "identity": "another-dependency", - "kind": "remoteSourceControl", - "name": "another-dependency" - }, - "subpath": "another-dependency" - } - ] - """, - loadPackageInfoStub: { packagePath in - switch packagePath { - case testPath: - return PackageInfo.test - case self.checkoutsPath.appending(component: "ADependency"): - return PackageInfo.aDependency - case self.checkoutsPath.appending(component: "another-dependency"): - return PackageInfo.anotherDependency - default: - XCTFail("Unexpected path: \(self.path)") - return .test - } - }, - dependenciesGraph: DependenciesGraph.test( - spmFolder: spmFolder, - packageFolder: Path(testPath.pathString), - destinations: [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign], - fileHandler: fileHandler - ) - .merging(with: DependenciesGraph.aDependency( - spmFolder: spmFolder, - destinations: [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign] - )) - .merging(with: DependenciesGraph.anotherDependency( - spmFolder: spmFolder, - destinations: [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign] - )) - ) - } - - private func checkGenerated( - workspaceDependenciesJSON: String, - workspaceArtifactsJSON: String = "[]", - loadPackageInfoStub: @escaping (AbsolutePath) -> PackageInfo, - dependenciesGraph: TuistCore.DependenciesGraph - ) throws { - // Given - try fileHandler.createFolder(try AbsolutePath(validating: "/tmp/localPackage/Sources/TestUtilities")) - fileHandler.stubReadFile = { - XCTAssertEqual($0, self.path.appending(component: "workspace-state.json")) - return """ - { - "object": { - "dependencies": \(workspaceDependenciesJSON), - "artifacts": \(workspaceArtifactsJSON) - } - } - """.data(using: .utf8)! - } - - fileHandler.stubIsFolder = { _ in - // called to convert globs to AbsolutePath - true - } - - swiftPackageManagerController.loadPackageInfoStub = loadPackageInfoStub - - // When - let got = try subject.generate( - at: path, - productTypes: [ - "GULMethodSwizzler": .framework, - "GULNetwork": .dynamicLibrary, - ], - platforms: [.iOS], - baseSettings: .default, - targetSettings: [:], - swiftToolsVersion: nil, - projectOptions: [:] - ) - - // Then - XCTAssertEqual(got, dependenciesGraph) - } -} - -extension TuistCore.DependenciesGraph { - public func merging(with other: Self) throws -> Self { - var mergedExternalDependencies: [String: [ProjectDescription.TargetDependency]] = - externalDependencies - - for (name, dependency) in other.externalDependencies { - if let alreadyPresent = mergedExternalDependencies[name] { - fatalError("Dupliacted Entry(\(name), \(alreadyPresent), \(dependency)") - } - mergedExternalDependencies[name] = dependency - } - - let mergedExternalProjects = other.externalProjects.reduce(into: externalProjects) { result, entry in - if let alreadyPresent = result[entry.key] { - fatalError("Dupliacted Entry(\(entry.key), \(alreadyPresent), \(entry.value)") - } - result[entry.key] = entry.value - } - - return .init(externalDependencies: mergedExternalDependencies, externalProjects: mergedExternalProjects) - } -} diff --git a/Tests/TuistEnvKitTests/Commands/CommandRunnerTests.swift b/Tests/TuistEnvKitTests/Commands/CommandRunnerTests.swift deleted file mode 100644 index ef86f5af9a9..00000000000 --- a/Tests/TuistEnvKitTests/Commands/CommandRunnerTests.swift +++ /dev/null @@ -1,203 +0,0 @@ -import Foundation -import TSCBasic -import struct TSCUtility.Version -import TuistSupport -import XCTest -@testable import TuistEnvKit -@testable import TuistSupportTesting - -final class CommandRunnerErrorTests: XCTestCase { - func test_type() { - XCTAssertEqual(CommandRunnerError.versionNotFound.type, .abort) - } - - func test_description() { - XCTAssertEqual(CommandRunnerError.versionNotFound.description, "No valid version has been found locally") - } -} - -final class CommandRunnerTests: TuistUnitTestCase { - var versionResolver: MockVersionResolver! - var updater: MockUpdater! - var versionsController: MockVersionsController! - var installer: MockInstaller! - var arguments: [String] = [] - var exited: Int? - var subject: CommandRunner! - - override func setUp() { - super.setUp() - versionResolver = MockVersionResolver() - updater = MockUpdater() - versionsController = try! MockVersionsController() - installer = MockInstaller() - subject = CommandRunner( - versionResolver: versionResolver, - updater: updater, - installer: installer, - versionsController: versionsController, - arguments: { self.arguments }, - exiter: { self.exited = $0 } - ) - } - - override func tearDown() { - versionResolver = nil - updater = nil - versionsController = nil - installer = nil - subject = nil - super.tearDown() - } - - func test_when_binary() throws { - let temporaryPath = try temporaryPath() - let binaryPath = temporaryPath.appending(component: "tuist") - arguments = ["tuist", "--help"] - - versionResolver.resolveStub = { _ in ResolvedVersion.bin(temporaryPath) } - system.succeedCommand([binaryPath.pathString, "--help"], output: "output") - try subject.run() - } - - func test_when_binary_and_throws() throws { - let temporaryPath = try temporaryPath() - let binaryPath = temporaryPath.appending(component: "tuist") - arguments = ["tuist", "--help"] - - versionResolver.resolveStub = { _ in ResolvedVersion.bin(temporaryPath) } - system.errorCommand([binaryPath.pathString, "--help"], error: "error") - - try subject.run() - XCTAssertTrue(exited == 1) - } - - func test_when_version_file() throws { - let temporaryPath = try temporaryPath() - let binaryPath = temporaryPath.appending(component: "tuist") - arguments = ["tuist", "--help"] - - versionsController.versionsStub = [] - versionsController.pathStub = { - $0 == "3.2.1" ? temporaryPath : try AbsolutePath(validating: "/invalid") - } - - versionResolver.resolveStub = { _ in ResolvedVersion.versionFile(temporaryPath, "3.2.1") } - - var installArgs: [String] = [] - installer.installStub = { version in installArgs.append(version) } - system.succeedCommand([binaryPath.pathString, "--help"], output: "") - - try subject.run() - - XCTAssertEqual(installArgs.count, 1) - XCTAssertEqual(installArgs.first, "3.2.1") - } - - func test_when_version_file_and_install_fails() throws { - let temporaryPath = try temporaryPath() - versionsController.versionsStub = [] - - versionResolver.resolveStub = { _ in ResolvedVersion.versionFile(temporaryPath, "3.2.1") } - - let error = NSError.test() - installer.installStub = { _ in throw error } - - XCTAssertThrowsError(try subject.run()) { - XCTAssertEqual($0 as NSError, error) - } - } - - func test_when_version_file_and_command_fails() throws { - let temporaryPath = try temporaryPath() - let binaryPath = temporaryPath.appending(component: "tuist") - arguments = ["tuist", "--help"] - - versionsController.versionsStub = [] - versionsController.pathStub = { - $0 == "3.2.1" ? temporaryPath : try AbsolutePath(validating: "/invalid") - } - - versionResolver.resolveStub = { _ in ResolvedVersion.versionFile(temporaryPath, "3.2.1") - } - - system.errorCommand([binaryPath.pathString, "--help"], error: "error") - - try subject.run() - XCTAssertTrue(exited == 1) - } - - func test_when_highest_local_version_and_version_exists() throws { - let temporaryPath = try temporaryPath() - let binaryPath = temporaryPath.appending(component: "tuist") - arguments = ["tuist", "--help"] - - versionResolver.resolveStub = { _ in ResolvedVersion.undefined } - - versionsController.semverVersionsStub = [Version("3.2.1")] - versionsController.pathStub = { - $0 == "3.2.1" ? temporaryPath : try AbsolutePath(validating: "/invalid") - } - - system.succeedCommand([binaryPath.pathString, "--help"], output: "") - - try subject.run() - } - - func test_when_highest_local_version_and_no_local_version() throws { - let temporaryPath = try temporaryPath() - let binaryPath = temporaryPath.appending(component: "tuist") - arguments = ["tuist", "--help"] - - versionResolver.resolveStub = { _ in ResolvedVersion.undefined } - - versionsController.semverVersionsStub = [] - updater.updateStub = { - self.versionsController.semverVersionsStub = [Version("3.2.1")] - } - - versionsController.pathStub = { - $0 == "3.2.1" ? temporaryPath : try AbsolutePath(validating: "/invalid") - } - - system.succeedCommand([binaryPath.pathString, "--help"], output: "") - - try subject.run() - } - - func test_when_highest_local_version_and_no_local_version_and_update_fails() throws { - arguments = ["tuist", "--help"] - - versionResolver.resolveStub = { _ in ResolvedVersion.undefined } - - versionsController.semverVersionsStub = [] - let error = NSError.test() - updater.updateStub = { - throw error - } - - XCTAssertThrowsError(try subject.run()) { - XCTAssertEqual($0 as NSError, error) - } - } - - // TODO: And update fails - - func test_when_highest_local_version_and_command_fails() throws { - let temporaryPath = try temporaryPath() - let binaryPath = temporaryPath.appending(component: "tuist") - arguments = ["tuist", "--help"] - - versionResolver.resolveStub = { _ in ResolvedVersion.undefined } - - versionsController.semverVersionsStub = [Version("3.2.1")] - versionsController.pathStub = { - $0 == "3.2.1" ? temporaryPath : try AbsolutePath(validating: "/invalid") - } - - system.errorCommand([binaryPath.pathString, "--help"], error: "error") - - try subject.run() - XCTAssertTrue(exited == 1) - } -} diff --git a/Tests/TuistEnvKitTests/Commands/Mocks/MockCommandRunner.swift b/Tests/TuistEnvKitTests/Commands/Mocks/MockCommandRunner.swift deleted file mode 100644 index a531b5ec977..00000000000 --- a/Tests/TuistEnvKitTests/Commands/Mocks/MockCommandRunner.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation -@testable import TuistEnvKit - -final class MockCommandRunner: CommandRunning { - var runCallCount: UInt = 0 - var runStub: Error? - - func run() throws { - runCallCount += 1 - if let runStub { throw runStub } - } -} diff --git a/Tests/TuistEnvKitTests/GitHub/Mocks/MockVersionProvider.swift b/Tests/TuistEnvKitTests/GitHub/Mocks/MockVersionProvider.swift deleted file mode 100644 index 53efbf4e051..00000000000 --- a/Tests/TuistEnvKitTests/GitHub/Mocks/MockVersionProvider.swift +++ /dev/null @@ -1,29 +0,0 @@ -import Combine -import Foundation -import TSCBasic -import TSCUtility -import TuistSupport -import TuistSupportTesting -@testable import TuistEnvKit - -final class MockVersionProvider: VersionProviding { - var invokedVersions = false - var invokedVersionsCount = 0 - var stubbedVersionsResult: [Version]! - - func versions() -> [Version] { - invokedVersions = true - invokedVersionsCount += 1 - return stubbedVersionsResult - } - - var invokedLatestVersion = false - var invokedLatestVersionCount = 0 - var stubbedLatestVersionResult: Version? - - func latestVersion() -> Version? { - invokedLatestVersion = true - invokedLatestVersionCount += 1 - return stubbedLatestVersionResult - } -} diff --git a/Tests/TuistEnvKitTests/HTTP/HTTPClientTests.swift b/Tests/TuistEnvKitTests/HTTP/HTTPClientTests.swift deleted file mode 100644 index 44dbecf97fa..00000000000 --- a/Tests/TuistEnvKitTests/HTTP/HTTPClientTests.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation -import TuistSupport -import XCTest - -@testable import TuistEnvKit -@testable import TuistSupportTesting - -final class HTTPClientErrorTests: XCTestCase { - func test_type() { - // Given - let error = NSError.test() - let url = URL.test() - - // Then - XCTAssertEqual(HTTPClientError.clientError(url, error).type, .abort) - XCTAssertEqual(HTTPClientError.noData(url).type, .abort) - } - - func test_description() { - // Given - let error = NSError.test() - let url = URL.test() - - // Then - XCTAssertEqual( - HTTPClientError.clientError(url, error).description, - "The request to \(url.absoluteString) errored with: \(error.localizedDescription)" - ) - XCTAssertEqual(HTTPClientError.noData(url).description, "The request to \(url.absoluteString) returned no data") - } -} diff --git a/Tests/TuistEnvKitTests/HTTP/Mocks/MockHTTPClient.swift b/Tests/TuistEnvKitTests/HTTP/Mocks/MockHTTPClient.swift deleted file mode 100644 index 20fc4cf89e5..00000000000 --- a/Tests/TuistEnvKitTests/HTTP/Mocks/MockHTTPClient.swift +++ /dev/null @@ -1,47 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport -import XCTest - -@testable import TuistEnvKit - -final class MockHTTPClient: HTTPClienting { - fileprivate var readStubs: [URL: Result] = [:] - fileprivate var downloadStubs: [URL: Result] = [:] - - func succeedRead(url: URL, response: Data) { - readStubs[url] = .success(response) - } - - func failRead(url: URL, error: Error) { - readStubs[url] = .failure(error) - } - - func read(url: URL) throws -> Data { - if let result = readStubs[url] { - switch result { - case let .failure(error): throw error - case let .success(data): return data - } - } else { - XCTFail("Read request to non-stubbed URL \(url)") - return Data() - } - } - - func download(url: URL, to: AbsolutePath) throws { - if let result = downloadStubs[url] { - switch result { - case let .failure(error): throw error - case let .success(from): - do { - try FileHandler.shared.copy(from: from, to: to) - } catch { - XCTFail("Error copying stubbed download to \(to.pathString)") - } - } - } else { - XCTFail("Download request to non-stubbed URL \(url)") - } - } -} diff --git a/Tests/TuistEnvKitTests/Installer/EnvInstallerTests.swift b/Tests/TuistEnvKitTests/Installer/EnvInstallerTests.swift deleted file mode 100644 index a3b0583efa7..00000000000 --- a/Tests/TuistEnvKitTests/Installer/EnvInstallerTests.swift +++ /dev/null @@ -1,220 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport -import XCTest -@testable import TuistEnvKit -@testable import TuistSupportTesting - -final class EnvInstallerTests: TuistUnitTestCase { - var buildCopier: MockBuildCopier! - var versionsController: MockVersionsController! - var subject: EnvInstaller! - var tmpDir: TemporaryDirectory! - - override func setUp() { - super.setUp() - buildCopier = MockBuildCopier() - versionsController = try! MockVersionsController() - tmpDir = try! TemporaryDirectory(removeTreeOnDeinit: true) - subject = EnvInstaller( - buildCopier: buildCopier, - versionsController: versionsController - ) - } - - override func tearDown() { - buildCopier = nil - versionsController = nil - tmpDir = nil - subject = nil - super.tearDown() - } - - func test_install_when_bundled_release() throws { - let version = "3.2.1" - let temporaryPath = try temporaryPath() - stubLocalAndRemoveSwiftVersions() - let temporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) - let downloadURL = URL(string: "https://github.com/tuist/tuist/releases/download/3.2.1/tuistenv.zip")! - - versionsController.installStub = { _, closure in - try closure(temporaryPath) - } - - let downloadPath = temporaryDirectory - .path - .appending(component: Constants.envBundleName) - system.whichStub = { _ in "/path/to/tuist" } - system.succeedCommand([ - "/usr/bin/curl", - "-LSs", - "--output", - downloadPath.pathString, - downloadURL.absoluteString, - ]) - system.succeedCommand([ - "/usr/bin/unzip", - "-q", - downloadPath.pathString, - "tuistenv", - "-d", - temporaryDirectory.path.pathString, - ]) - system.succeedCommand([ - "rm", - "/path/to/tuist", - ]) - system.succeedCommand([ - "mv", - temporaryDirectory.path.appending(component: "tuistenv").pathString, - "/path/to/tuist", - ]) - - try subject.install( - version: version, - temporaryDirectory: temporaryDirectory.path - ) - - XCTAssertPrinterOutputContains(""" - Downloading TuistEnv version 3.2.1 - Installing… - TuistEnv Version \(version) installed - """) - } - - func test_install_when_cp_fails() throws { - let version = "3.2.1" - let temporaryPath = try temporaryPath() - stubLocalAndRemoveSwiftVersions() - let temporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) - let downloadURL = URL(string: "https://github.com/tuist/tuist/releases/download/3.2.1/tuistenv.zip")! - - versionsController.installStub = { _, closure in - try closure(temporaryPath) - } - - let downloadPath = temporaryDirectory - .path - .appending(component: Constants.envBundleName) - system.whichStub = { _ in "/path/to/tuist" } - system.succeedCommand([ - "/usr/bin/curl", - "-LSs", - "--output", - downloadPath.pathString, - downloadURL.absoluteString, - ]) - system.succeedCommand([ - "/usr/bin/unzip", - "-q", - downloadPath.pathString, - "tuistenv", - "-d", - temporaryDirectory.path.pathString, - ]) - system.succeedCommand([ - "sudo", - "rm", - "/path/to/tuist", - ]) - system.succeedCommand([ - "sudo", - "mv", - temporaryDirectory.path.appending(component: "tuistenv").pathString, - "/path/to/tuist", - ]) - - try subject.install( - version: version, - temporaryDirectory: temporaryDirectory.path - ) - - XCTAssertPrinterOutputContains(""" - Downloading TuistEnv version 3.2.1 - Installing… - TuistEnv Version \(version) installed - """) - } - - func test_install_when_bundled_release_and_download_fails() throws { - let temporaryPath = try temporaryPath() - let version = "3.2.1" - stubLocalAndRemoveSwiftVersions() - let temporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) - let downloadURL = URL(string: "https://github.com/tuist/tuist/releases/download/3.2.1/tuistenv.zip")! - - versionsController.installStub = { _, closure in - try closure(temporaryPath) - } - - let downloadPath = temporaryDirectory - .path - .appending(component: Constants.envBundleName) - system.whichStub = { _ in "/path/to/tuist" } - system.errorCommand( - [ - "/usr/bin/curl", - "-LSs", - "--output", - downloadPath.pathString, - downloadURL.absoluteString, - ], - error: "download_error" - ) - - let expectedError = TuistSupport.SystemError.terminated( - command: "/usr/bin/curl", - code: 1, - standardError: Data("download_error".utf8) - ) - XCTAssertThrowsSpecific(try subject.install(version: version, temporaryDirectory: temporaryDirectory.path), expectedError) - } - - func test_install_when_bundled_release_when_unzip_fails() throws { - let temporaryPath = try temporaryPath() - let version = "3.2.1" - stubLocalAndRemoveSwiftVersions() - let temporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) - let downloadURL = URL(string: "https://github.com/tuist/tuist/releases/download/3.2.1/tuistenv.zip")! - - versionsController.installStub = { _, closure in - try closure(temporaryPath) - } - - let downloadPath = temporaryDirectory - .path - .appending(component: Constants.envBundleName) - system.whichStub = { _ in "/path/to/tuist" } - system.succeedCommand([ - "/usr/bin/curl", - "-LSs", - "--output", - downloadPath.pathString, - downloadURL.absoluteString, - ]) - system.errorCommand( - [ - "/usr/bin/unzip", - "-q", - downloadPath.pathString, - "tuistenv", - "-d", - temporaryDirectory.path.pathString, - ], - error: "unzip_error" - ) - - let expectedError = TuistSupport.SystemError.terminated( - command: "/usr/bin/unzip", - code: 1, - standardError: Data("unzip_error".utf8) - ) - XCTAssertThrowsSpecific(try subject.install(version: version, temporaryDirectory: temporaryDirectory.path), expectedError) - } - - // MARK: - Fileprivate - - fileprivate func stubLocalAndRemoveSwiftVersions() { - system.swiftVersionStub = { "5.0.0" } - } -} diff --git a/Tests/TuistEnvKitTests/Installer/InstallerTests.swift b/Tests/TuistEnvKitTests/Installer/InstallerTests.swift deleted file mode 100644 index 86d115ca2bd..00000000000 --- a/Tests/TuistEnvKitTests/Installer/InstallerTests.swift +++ /dev/null @@ -1,141 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport -import XCTest -@testable import TuistEnvKit -@testable import TuistSupportTesting - -final class InstallerTests: TuistUnitTestCase { - var buildCopier: MockBuildCopier! - var versionsController: MockVersionsController! - var subject: Installer! - var tmpDir: TemporaryDirectory! - - override func setUp() { - super.setUp() - buildCopier = MockBuildCopier() - versionsController = try! MockVersionsController() - tmpDir = try! TemporaryDirectory(removeTreeOnDeinit: true) - subject = Installer( - buildCopier: buildCopier, - versionsController: versionsController - ) - } - - override func tearDown() { - buildCopier = nil - versionsController = nil - tmpDir = nil - subject = nil - super.tearDown() - } - - func test_install_when_bundled_release() throws { - let version = "3.2.1" - let temporaryPath = try temporaryPath() - stubLocalAndRemoveSwiftVersions() - let temporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) - let downloadURL = URL(string: "https://github.com/tuist/tuist/releases/download/3.2.1/tuist.zip")! - - versionsController.installStub = { _, closure in - try closure(temporaryPath) - } - - let downloadPath = temporaryDirectory - .path - .appending(component: Constants.bundleName) - system.succeedCommand([ - "/usr/bin/curl", - "-LSs", - "--output", - downloadPath.pathString, - downloadURL.absoluteString, - ]) - system.succeedCommand([ - "/usr/bin/unzip", - "-q", - downloadPath.pathString, - "-d", - temporaryPath.pathString, - ]) - - try subject.install( - version: version, - temporaryDirectory: temporaryDirectory.path - ) - - XCTAssertPrinterOutputContains(""" - Downloading version 3.2.1 - Installing… - Version \(version) installed - """) - } - - func test_install_when_bundled_release_and_download_fails() throws { - let temporaryPath = try temporaryPath() - let version = "3.2.1" - stubLocalAndRemoveSwiftVersions() - let temporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) - let downloadURL = URL(string: "https://github.com/tuist/tuist/releases/download/3.2.1/tuist.zip")! - - versionsController.installStub = { _, closure in - try closure(temporaryPath) - } - - let downloadPath = temporaryDirectory - .path - .appending(component: Constants.bundleName) - system.errorCommand( - [ - "/usr/bin/curl", - "-LSs", - "--output", - downloadPath.pathString, - downloadURL.absoluteString, - ], - error: "download_error" - ) - - XCTAssertThrowsError(try subject.install(version: version, temporaryDirectory: temporaryDirectory.path)) - } - - func test_install_when_bundled_release_when_unzip_fails() throws { - let temporaryPath = try temporaryPath() - let version = "3.2.1" - stubLocalAndRemoveSwiftVersions() - let temporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) - let downloadURL = URL(string: "https://github.com/tuist/tuist/releases/download/3.2.1/tuist.zip")! - - versionsController.installStub = { _, closure in - try closure(temporaryPath) - } - - let downloadPath = temporaryDirectory - .path - .appending(component: Constants.bundleName) - system.succeedCommand([ - "/usr/bin/curl", - "-LSs", - "--output", - downloadPath.pathString, - downloadURL.absoluteString, - ]) - system.errorCommand( - [ - "/usr/bin/unzip", - downloadPath.pathString, - "-d", - temporaryPath.pathString, - ], - error: "unzip_error" - ) - - XCTAssertThrowsError(try subject.install(version: version, temporaryDirectory: temporaryDirectory.path)) - } - - // MARK: - Fileprivate - - fileprivate func stubLocalAndRemoveSwiftVersions() { - system.swiftVersionStub = { "5.0.0" } - } -} diff --git a/Tests/TuistEnvKitTests/Installer/Mocks/MockBuildCopier.swift b/Tests/TuistEnvKitTests/Installer/Mocks/MockBuildCopier.swift deleted file mode 100644 index c41d93da60b..00000000000 --- a/Tests/TuistEnvKitTests/Installer/Mocks/MockBuildCopier.swift +++ /dev/null @@ -1,13 +0,0 @@ -import Foundation -import TSCBasic -@testable import TuistEnvKit - -final class MockBuildCopier: BuildCopying { - var copyCallCount: UInt = 0 - var copyStub: ((AbsolutePath, AbsolutePath) throws -> Void)? - - func copy(from: AbsolutePath, to: AbsolutePath) throws { - copyCallCount += 1 - try copyStub?(from, to) - } -} diff --git a/Tests/TuistEnvKitTests/Installer/Mocks/MockEnvInstaller.swift b/Tests/TuistEnvKitTests/Installer/Mocks/MockEnvInstaller.swift deleted file mode 100644 index 3d9c49ab802..00000000000 --- a/Tests/TuistEnvKitTests/Installer/Mocks/MockEnvInstaller.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation -@testable import TuistEnvKit - -final class MockEnvInstaller: EnvInstalling { - var installCallCount: UInt = 0 - var installStub: ((String) throws -> Void)? - - func install(version: String) throws { - installCallCount += 1 - try installStub?(version) - } -} diff --git a/Tests/TuistEnvKitTests/Installer/Mocks/MockInstaller.swift b/Tests/TuistEnvKitTests/Installer/Mocks/MockInstaller.swift deleted file mode 100644 index 9dfbe270d2b..00000000000 --- a/Tests/TuistEnvKitTests/Installer/Mocks/MockInstaller.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation -@testable import TuistEnvKit - -final class MockInstaller: Installing { - var installCallCount: UInt = 0 - var installStub: ((String) throws -> Void)? - - func install(version: String) throws { - installCallCount += 1 - try installStub?(version) - } -} diff --git a/Tests/TuistEnvKitTests/Services/BundleServiceTests.swift b/Tests/TuistEnvKitTests/Services/BundleServiceTests.swift deleted file mode 100644 index a5b69d639f7..00000000000 --- a/Tests/TuistEnvKitTests/Services/BundleServiceTests.swift +++ /dev/null @@ -1,120 +0,0 @@ -import Foundation -import TSCBasic -import XCTest -@testable import TuistEnvKit -@testable import TuistSupport -@testable import TuistSupportTesting - -final class BundleServiceErrorTests: XCTestCase { - func test_type() throws { - let path = try AbsolutePath(validating: "/test") - XCTAssertEqual(BundleServiceError.missingVersionFile(path).type, .abort) - } - - func test_description() throws { - let path = try AbsolutePath(validating: "/test") - XCTAssertEqual( - BundleServiceError.missingVersionFile(path).description, - "Couldn't find a .tuist-version file in the directory \(path.pathString)" - ) - } -} - -final class BundleServiceTests: TuistUnitTestCase { - var versionsController: MockVersionsController! - var installer: MockInstaller! - var subject: BundleService! - var tmpDir: TemporaryDirectory! - - override func setUp() { - super.setUp() - versionsController = try! MockVersionsController() - installer = MockInstaller() - tmpDir = try! TemporaryDirectory(removeTreeOnDeinit: true) - subject = BundleService( - versionsController: versionsController, - installer: installer - ) - } - - override func tearDown() { - versionsController = nil - installer = nil - subject = nil - tmpDir = nil - super.tearDown() - } - - func test_run_throws_when_there_is_no_xmp_version_in_the_directory() throws { - let temporaryPath = try temporaryPath() - XCTAssertThrowsSpecific(try subject.run(), BundleServiceError.missingVersionFile(temporaryPath)) - } - - func test_run_installs_the_app_if_it_doesnt_exist() throws { - let temporaryPath = try temporaryPath() - let tuistVersionPath = temporaryPath.appending(component: Constants.versionFileName) - try "3.2.1".write(to: tuistVersionPath.url, atomically: true, encoding: .utf8) - - installer.installStub = { version in - let versionPath = try self.versionsController.path(version: version) - try FileHandler.shared.createFolder(versionPath) - try Data().write(to: versionPath.appending(component: "test").url) - } - - try subject.run() - - let bundledTestFilePath = temporaryPath - .appending(component: Constants.binFolderName) - .appending(component: "test") - - XCTAssertTrue(FileHandler.shared.exists(bundledTestFilePath)) - } - - func test_run_doesnt_install_the_app_if_it_already_exists() throws { - let temporaryPath = try temporaryPath() - - let tuistVersionPath = temporaryPath.appending(component: Constants.versionFileName) - try "3.2.1".write(to: tuistVersionPath.url, atomically: true, encoding: .utf8) - let versionPath = try versionsController.path(version: "3.2.1") - try FileHandler.shared.createFolder(versionPath) - - try subject.run() - - XCTAssertEqual(installer.installCallCount, 0) - } - - func test_run_doesnt_install_the_app_if_it_already_exists_with_whitespace_in_version_file() throws { - let temporaryPath = try temporaryPath() - - let tuistVersionPath = temporaryPath.appending(component: Constants.versionFileName) - try "3.2.1\n\t".write(to: tuistVersionPath.url, atomically: true, encoding: .utf8) - let versionPath = try versionsController.path(version: "3.2.1") - try FileHandler.shared.createFolder(versionPath) - - try subject.run() - - XCTAssertEqual(installer.installCallCount, 0) - } - - func test_run_prints_the_right_messages() throws { - let temporaryPath = try temporaryPath() - let tuistVersionPath = temporaryPath.appending(component: Constants.versionFileName) - let binPath = temporaryPath.appending(component: Constants.binFolderName) - - try "3.2.1".write(to: tuistVersionPath.url, atomically: true, encoding: .utf8) - - installer.installStub = { version in - let versionPath = try self.versionsController.path(version: version) - try FileHandler.shared.createFolder(versionPath) - try Data().write(to: versionPath.appending(component: "test").url) - } - - try subject.run() - - XCTAssertPrinterOutputContains(""" - Bundling the version 3.2.1 in the directory \(binPath.pathString) - Version 3.2.1 not available locally. Installing... - tuist bundled successfully at \(binPath.pathString) - """) - } -} diff --git a/Tests/TuistEnvKitTests/Services/InstallServiceTests.swift b/Tests/TuistEnvKitTests/Services/InstallServiceTests.swift deleted file mode 100644 index 1f88cf20487..00000000000 --- a/Tests/TuistEnvKitTests/Services/InstallServiceTests.swift +++ /dev/null @@ -1,75 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport -import XCTest -@testable import TuistEnvKit -@testable import TuistSupportTesting - -final class InstallServiceTests: TuistUnitTestCase { - var versionsController: MockVersionsController! - var installer: MockInstaller! - var subject: InstallService! - - override func setUp() { - super.setUp() - - versionsController = try! MockVersionsController() - installer = MockInstaller() - subject = InstallService( - versionsController: versionsController, - installer: installer - ) - } - - override func tearDown() { - versionsController = nil - installer = nil - subject = nil - - super.tearDown() - } - - func test_run_when_version_is_already_installed() throws { - versionsController.versionsStub = [InstalledVersion.reference("3.2.1")] - - try subject.run(version: "3.2.1") - - XCTAssertPrinterOutputContains("Version 3.2.1 already installed, skipping") - } - - func test_run() throws { - versionsController.versionsStub = [] - - var installArgs: [String] = [] - installer.installStub = { version in installArgs.append(version) } - - try subject.run(version: "3.2.1") - - XCTAssertEqual(installArgs.count, 1) - XCTAssertEqual(installArgs.first, "3.2.1") - } - - func test_run_when_without_trailing_zero() throws { - versionsController.versionsStub = [] - - var installArgs: [String] = [] - installer.installStub = { version in installArgs.append(version) } - - try subject.run(version: "3.2") - - XCTAssertEqual(installArgs.count, 1) - XCTAssertEqual(installArgs.first, "3.2.0") - } - - func test_run_when_force() throws { - versionsController.versionsStub = [] - - var installArgs: [String] = [] - installer.installStub = { version in installArgs.append(version) } - - try subject.run(version: "3.2.1") - - XCTAssertEqual(installArgs.count, 1) - XCTAssertEqual(installArgs.first, "3.2.1") - } -} diff --git a/Tests/TuistEnvKitTests/Services/LocalServiceTests.swift b/Tests/TuistEnvKitTests/Services/LocalServiceTests.swift deleted file mode 100644 index 0d51967b902..00000000000 --- a/Tests/TuistEnvKitTests/Services/LocalServiceTests.swift +++ /dev/null @@ -1,69 +0,0 @@ -import Foundation -import TSCBasic -import struct TSCUtility.Version -import TuistSupport -import XCTest -@testable import TuistEnvKit -@testable import TuistSupportTesting - -final class LocalServiceTests: TuistUnitTestCase { - var subject: LocalService! - var versionController: MockVersionsController! - - override func setUp() { - super.setUp() - - versionController = try! MockVersionsController() - subject = LocalService(versionController: versionController) - } - - override func tearDown() { - subject = nil - versionController = nil - - super.tearDown() - } - - func test_run_when_version_argument_is_passed() throws { - // Given - let temporaryPath = try temporaryPath() - - // When - try subject.run(version: "3.2.1") - - // Then - let versionPath = temporaryPath.appending(component: Constants.versionFileName) - XCTAssertEqual(try String(contentsOf: versionPath.url), "3.2.1") - } - - func test_run_prints_when_version_argument_is_passed() throws { - // Given - let temporaryPath = try temporaryPath() - - // When - try subject.run(version: "3.2.1") - - // Then - let versionPath = temporaryPath.appending(component: Constants.versionFileName) - - XCTAssertPrinterOutputContains(""" - Generating \(Constants.versionFileName) file with version 3.2.1 - File generated at path \(versionPath.pathString) - """) - } - - func test_run_prints_when_no_argument_is_passed() throws { - // Given - versionController.semverVersionsStub = [Version("1.2.3"), Version("3.2.1")] - - // When - try subject.run(version: nil) - - // Then - XCTAssertPrinterOutputContains(""" - The following versions are available in the local environment: - - 3.2.1 - - 1.2.3 - """) - } -} diff --git a/Tests/TuistEnvKitTests/Services/UninstallServiceTests.swift b/Tests/TuistEnvKitTests/Services/UninstallServiceTests.swift deleted file mode 100644 index fd94f0f42e8..00000000000 --- a/Tests/TuistEnvKitTests/Services/UninstallServiceTests.swift +++ /dev/null @@ -1,59 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport -import XCTest -@testable import TuistEnvKit -@testable import TuistSupportTesting - -final class UninstallServiceTests: TuistUnitTestCase { - var versionsController: MockVersionsController! - var installer: MockInstaller! - var subject: UninstallService! - - override func setUp() { - super.setUp() - versionsController = try! MockVersionsController() - installer = MockInstaller() - subject = UninstallService( - versionsController: versionsController, - installer: installer - ) - } - - override func tearDown() { - versionsController = nil - installer = nil - subject = nil - super.tearDown() - } - - func test_run_when_version_is_installed() throws { - versionsController.versionsStub = [InstalledVersion.reference("3.2.1")] - var uninstalledVersion: String? - versionsController.uninstallStub = { uninstalledVersion = $0 } - - try subject.run(version: "3.2.1") - - XCTAssertPrinterOutputContains("Version 3.2.1 uninstalled") - XCTAssertEqual(uninstalledVersion, "3.2.1") - } - - func test_run_when_version_is_installed_and_throws() throws { - versionsController.versionsStub = [InstalledVersion.reference("3.2.1")] - - let error = NSError.test() - versionsController.uninstallStub = { _ in throw error } - - XCTAssertThrowsError(try subject.run(version: "3.2.1")) { - XCTAssertEqual($0 as NSError, error) - } - } - - func test_run_when_version_is_not_installed() throws { - versionsController.versionsStub = [] - - try subject.run(version: "3.2.1") - - XCTAssertPrinterOutputContains("Version 3.2.1 cannot be uninstalled because it's not installed") - } -} diff --git a/Tests/TuistEnvKitTests/Services/UpdateServiceTests.swift b/Tests/TuistEnvKitTests/Services/UpdateServiceTests.swift deleted file mode 100644 index 5b1b56c9c11..00000000000 --- a/Tests/TuistEnvKitTests/Services/UpdateServiceTests.swift +++ /dev/null @@ -1,35 +0,0 @@ -import Foundation -import TuistSupport -import XCTest - -@testable import TuistEnvKit -@testable import TuistSupportTesting - -final class UpdateServiceTests: TuistUnitTestCase { - var subject: UpdateService! - var updater: MockUpdater! - - override func setUp() { - super.setUp() - updater = MockUpdater() - subject = UpdateService(updater: updater) - } - - override func tearDown() { - updater = nil - subject = nil - super.tearDown() - } - - func test_run() throws { - var updateCallsCount: UInt = 0 - updater.updateStub = { - updateCallsCount += 1 - } - - try subject.run() - - XCTAssertPrinterOutputContains("Checking for updates...") - XCTAssertEqual(updateCallsCount, 1) - } -} diff --git a/Tests/TuistEnvKitTests/Settings/Mocks/MockSettingsController.swift b/Tests/TuistEnvKitTests/Settings/Mocks/MockSettingsController.swift deleted file mode 100644 index 00737bfe1e1..00000000000 --- a/Tests/TuistEnvKitTests/Settings/Mocks/MockSettingsController.swift +++ /dev/null @@ -1,20 +0,0 @@ -import Foundation -@testable import TuistEnvKit - -final class MockSettingsController: SettingsControlling { - var settingsCount: UInt = 0 - var settingsStub: Settings? - var setSettingsStub: ((Settings) throws -> Void)? - var setSettingsCount: UInt = 0 - - func settings() throws -> Settings { - settingsCount += 1 - if let settingsStub { return settingsStub } - return Settings() - } - - func set(settings: Settings) throws { - setSettingsCount += 1 - try setSettingsStub?(settings) - } -} diff --git a/Tests/TuistEnvKitTests/Settings/SettingsControllerTests.swift b/Tests/TuistEnvKitTests/Settings/SettingsControllerTests.swift deleted file mode 100644 index f7236a34f66..00000000000 --- a/Tests/TuistEnvKitTests/Settings/SettingsControllerTests.swift +++ /dev/null @@ -1,25 +0,0 @@ -import Foundation -import TSCBasic -import XCTest -@testable import TuistEnvKit -@testable import TuistSupportTesting - -final class SettingsControllerTests: TuistUnitTestCase { - var subject: SettingsController! - - override func setUp() { - super.setUp() - - subject = SettingsController() - } - - override func tearDown() { - subject = nil - - super.tearDown() - } - - func test_settings_returns_the_default_settings_if_they_havent_been_set() throws { - try XCTAssertEqual(subject.settings(), Settings()) - } -} diff --git a/Tests/TuistEnvKitTests/Settings/SettingsTests.swift b/Tests/TuistEnvKitTests/Settings/SettingsTests.swift deleted file mode 100644 index cafacef2be6..00000000000 --- a/Tests/TuistEnvKitTests/Settings/SettingsTests.swift +++ /dev/null @@ -1,44 +0,0 @@ -import Foundation -import XCTest -@testable import TuistEnvKit -@testable import TuistSupportTesting - -final class SettingsTests: TuistUnitTestCase { - var gitHandler: MockGitHandler! - var subject: VersionProvider! - - override func setUp() { - super.setUp() - - gitHandler = MockGitHandler() - subject = VersionProvider(gitHandler: gitHandler) - } - - override func tearDown() { - gitHandler = nil - subject = nil - - super.tearDown() - } - - func test_latest_remote_version() throws { - gitHandler.remoteTaggedVersionsStub = ["1.9.0", "2.0.0", "2.0.1"] - let highestRemoteVersion = try subject.latestVersion() - - XCTAssertEqual(highestRemoteVersion, "2.0.1") - } - - func test_versions() throws { - gitHandler.remoteTaggedVersionsStub = ["1.9.0", "2.0.0", "2.0.1"] - let versions = try subject.versions() - - XCTAssertEqual(versions, ["1.9.0", "2.0.0", "2.0.1"]) - } - - func test_error() throws { - gitHandler.remoteTaggedVersionsStub = [] - - XCTAssertEmpty(try subject.versions()) - XCTAssertNil(try subject.latestVersion()) - } -} diff --git a/Tests/TuistEnvKitTests/Updater/Mocks/MockUpdater.swift b/Tests/TuistEnvKitTests/Updater/Mocks/MockUpdater.swift deleted file mode 100644 index 5069fd16c6a..00000000000 --- a/Tests/TuistEnvKitTests/Updater/Mocks/MockUpdater.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation -@testable import TuistEnvKit - -final class MockUpdater: Updating { - var updateCallCount: UInt = 0 - var updateStub: (() throws -> Void)? - - func update() throws { - updateCallCount += 1 - try updateStub?() - } -} diff --git a/Tests/TuistEnvKitTests/Updater/UpdaterTests.swift b/Tests/TuistEnvKitTests/Updater/UpdaterTests.swift deleted file mode 100644 index 3d2637fd35b..00000000000 --- a/Tests/TuistEnvKitTests/Updater/UpdaterTests.swift +++ /dev/null @@ -1,74 +0,0 @@ -import Foundation -import struct TSCUtility.Version -import TuistSupport -import XCTest -@testable import TuistEnvKit -@testable import TuistSupportTesting - -final class UpdaterTests: TuistUnitTestCase { - var versionsController: MockVersionsController! - var installer: MockInstaller! - var envInstaller: MockEnvInstaller! - var versionProvider: MockVersionProvider! - var subject: Updater! - - override func setUp() { - super.setUp() - - versionsController = try! MockVersionsController() - installer = MockInstaller() - envInstaller = MockEnvInstaller() - versionProvider = MockVersionProvider() - subject = Updater( - versionsController: versionsController, - installer: installer, - envInstaller: envInstaller, - versionProvider: versionProvider - ) - } - - override func tearDown() { - versionsController = nil - installer = nil - envInstaller = nil - subject = nil - versionProvider = nil - super.tearDown() - } - - func test_update_when_there_are_no_updates() throws { - versionsController.semverVersionsStub = ["3.2.1"] - versionProvider.stubbedLatestVersionResult = Version("3.2.1") - - try subject.update() - - XCTAssertPrinterOutputContains("There are no updates available") - } - - func test_update_when_there_are_updates() throws { - versionsController.semverVersionsStub = ["3.1.1"] - versionProvider.stubbedLatestVersionResult = Version("3.2.1") - var installArgs: [String] = [] - installer.installStub = { version in installArgs.append(version) } - envInstaller.installStub = { version in installArgs.append(version) } - - try subject.update() - - XCTAssertPrinterOutputContains("Installing new version available 3.2.1") - XCTAssertEqual(installArgs, ["3.2.1", "3.2.1"]) - } - - func test_update_when_no_local_versions_available() throws { - versionsController.semverVersionsStub = [] - versionProvider.stubbedLatestVersionResult = Version("3.2.1") - - var installArgs: [String] = [] - installer.installStub = { version in installArgs.append(version) } - envInstaller.installStub = { version in installArgs.append(version) } - - try subject.update() - - XCTAssertPrinterOutputContains("No local versions available. Installing the latest version 3.2.1") - XCTAssertEqual(installArgs, ["3.2.1", "3.2.1"]) - } -} diff --git a/Tests/TuistEnvKitTests/Versions/Mocks/MockVersionResolver.swift b/Tests/TuistEnvKitTests/Versions/Mocks/MockVersionResolver.swift deleted file mode 100644 index 77177d9ae27..00000000000 --- a/Tests/TuistEnvKitTests/Versions/Mocks/MockVersionResolver.swift +++ /dev/null @@ -1,13 +0,0 @@ -import Foundation -import TSCBasic -@testable import TuistEnvKit - -class MockVersionResolver: VersionResolving { - var resolveCallCount: UInt = 0 - var resolveStub: ((AbsolutePath) throws -> ResolvedVersion)? - - func resolve(path: AbsolutePath) throws -> ResolvedVersion { - resolveCallCount += 1 - return try resolveStub?(path) ?? .undefined - } -} diff --git a/Tests/TuistEnvKitTests/Versions/Mocks/MockVersionsController.swift b/Tests/TuistEnvKitTests/Versions/Mocks/MockVersionsController.swift deleted file mode 100644 index 00f59994974..00000000000 --- a/Tests/TuistEnvKitTests/Versions/Mocks/MockVersionsController.swift +++ /dev/null @@ -1,56 +0,0 @@ -import Foundation -import TSCBasic -import struct TSCUtility.Version -import TuistSupport -import TuistSupportTesting -@testable import TuistEnvKit - -final class MockVersionsController: VersionsControlling { - private let tmpDir: TemporaryDirectory - var path: AbsolutePath { tmpDir.path } - var pathCallCount: UInt = 0 - var pathStub: ((String) throws -> AbsolutePath)? - var installCallCount: UInt = 0 - var installStub: ((String, Installation) throws -> Void)? - var versionsCallCount: UInt = 0 - var versionsStub: [InstalledVersion] = [] - var semverVersionsCount: UInt = 0 - var semverVersionsStub: [Version] = [] - var uninstallCallCount: UInt = 0 - var uninstallStub: ((String) throws -> Void)? - - init() throws { - tmpDir = try TemporaryDirectory(removeTreeOnDeinit: true) - installStub = { version, installation in - try installation(self.path.appending(component: version)) - } - pathStub = { version in - self.path.appending(component: version) - } - } - - func path(version: String) throws -> AbsolutePath { - pathCallCount += 1 - return try pathStub?(version) ?? AbsolutePath(validating: "/test") - } - - func install(version: String, installation: Installation) throws { - installCallCount += 1 - try installStub?(version, installation) - } - - func uninstall(version: String) throws { - uninstallCallCount += 1 - try uninstallStub?(version) - } - - func versions() -> [InstalledVersion] { - versionsCallCount += 1 - return versionsStub - } - - func semverVersions() -> [Version] { - semverVersionsCount += 1 - return semverVersionsStub - } -} diff --git a/Tests/TuistEnvKitTests/Versions/VersionResolverTests.swift b/Tests/TuistEnvKitTests/Versions/VersionResolverTests.swift deleted file mode 100644 index 3c382c32103..00000000000 --- a/Tests/TuistEnvKitTests/Versions/VersionResolverTests.swift +++ /dev/null @@ -1,177 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport -import TuistSupportTesting -import XCTest -@testable import TuistEnvKit - -final class VersionResolverErrorTests: XCTestCase { - func test_errorDescription() throws { - let path = try AbsolutePath(validating: "/test") - XCTAssertEqual(VersionResolverError.readError(path: path).description, "Cannot read the version file at path /test.") - } - - func test_equatable() throws { - let path = try AbsolutePath(validating: "/test") - XCTAssertEqual(VersionResolverError.readError(path: path), VersionResolverError.readError(path: path)) - } -} - -final class VersionResolverTests: XCTestCase { - var subject: VersionResolver! - var settingsController: MockSettingsController! - - override func setUp() { - super.setUp() - settingsController = MockSettingsController() - subject = VersionResolver(settingsController: settingsController) - } - - override func tearDown() { - settingsController = nil - subject = nil - super.tearDown() - } - - func test_resolve_when_version_and_bin() throws { - let tmp_dir = try TemporaryDirectory(removeTreeOnDeinit: true) - let versionPath = tmp_dir.path.appending(component: Constants.versionFileName) - let binPath = tmp_dir.path.appending(component: Constants.binFolderName) - let tuistPath = binPath.appending(component: Constants.binName) - - // /tmp/dir/.tuist-version - try "3.2.1".write( - to: URL(fileURLWithPath: versionPath.pathString), - atomically: true, - encoding: .utf8 - ) - // /tmp/dir/.tuist-bin - try FileManager.default.createDirectory( - at: URL(fileURLWithPath: binPath.pathString), - withIntermediateDirectories: true, - attributes: nil - ) - // /tmp/dir/.tuist-bin/tuist - FileManager.default.createFile( - atPath: tuistPath.pathString, - contents: nil - ) - - let got = try subject.resolve(path: tmp_dir.path) - XCTAssertEqual(got, .bin(binPath)) - } - - func test_resolve_when_version() throws { - let tmp_dir = try TemporaryDirectory(removeTreeOnDeinit: true) - let versionPath = tmp_dir.path.appending(component: Constants.versionFileName) - - // /tmp/dir/.tuist-version - try "3.2.1".write( - to: URL(fileURLWithPath: versionPath.pathString), - atomically: true, - encoding: .utf8 - ) - - let got = try subject.resolve(path: tmp_dir.path) - XCTAssertEqual(got, .versionFile(versionPath, "3.2.1")) - } - - func test_resolve_when_version_contains_trailing_whitespace() throws { - let tmp_dir = try TemporaryDirectory(removeTreeOnDeinit: true) - let versionPath = tmp_dir.path.appending(component: Constants.versionFileName) - - // /tmp/dir/.tuist-version - try "3.2.1 \n".write( - to: URL(fileURLWithPath: versionPath.pathString), - atomically: true, - encoding: .utf8 - ) - - let got = try subject.resolve(path: tmp_dir.path) - XCTAssertEqual(got, .versionFile(versionPath, "3.2.1")) - } - - func test_resolve_when_bin() throws { - let tmp_dir = try TemporaryDirectory(removeTreeOnDeinit: true) - let binPath = tmp_dir.path.appending(component: Constants.binFolderName) - let tuistPath = binPath.appending(component: Constants.binName) - - // /tmp/dir/.tuist-bin - try FileManager.default.createDirectory( - at: URL(fileURLWithPath: binPath.pathString), - withIntermediateDirectories: true, - attributes: nil - ) - // /tmp/dir/.tuist-bin/tuist - FileManager.default.createFile( - atPath: tuistPath.pathString, - contents: nil - ) - - let got = try subject.resolve(path: tmp_dir.path) - XCTAssertEqual(got, .bin(binPath)) - } - - func test_resolve_when_empty_bin() throws { - let tmp_dir = try TemporaryDirectory(removeTreeOnDeinit: true) - let binPath = tmp_dir.path.appending(component: Constants.binFolderName) - - // /tmp/dir/.tuist-bin - try FileManager.default.createDirectory( - at: URL(fileURLWithPath: binPath.pathString), - withIntermediateDirectories: true, - attributes: nil - ) - - let got = try subject.resolve(path: tmp_dir.path) - XCTAssertEqual(got, .undefined) - } - - func test_resolve_when_version_in_parent_directory() throws { - let tmp_dir = try TemporaryDirectory(removeTreeOnDeinit: true) - let versionPath = tmp_dir.path.appending(component: Constants.versionFileName) - let childPath = tmp_dir.path.appending(component: "child") - - // /tmp/dir/.tuist-version - try "3.2.1".write( - to: URL(fileURLWithPath: versionPath.pathString), - atomically: true, - encoding: .utf8 - ) - try FileManager.default.createDirectory( - at: URL(fileURLWithPath: childPath.pathString), - withIntermediateDirectories: true, - attributes: nil - ) - - let got = try subject.resolve(path: childPath) - XCTAssertEqual(got, .versionFile(versionPath, "3.2.1")) - } - - func test_resolve_when_bin_in_parent_directory() throws { - let tmp_dir = try TemporaryDirectory(removeTreeOnDeinit: true) - let binPath = tmp_dir.path.appending(component: Constants.binFolderName) - let tuistPath = binPath.appending(component: Constants.binName) - let childPath = tmp_dir.path.appending(component: "child") - - // /tmp/dir/.tuist-bin - try FileManager.default.createDirectory( - at: URL(fileURLWithPath: binPath.pathString), - withIntermediateDirectories: true, - attributes: nil - ) - // /tmp/dir/.tuist-bin/tuist - FileManager.default.createFile( - atPath: tuistPath.pathString, - contents: nil - ) - try FileManager.default.createDirectory( - at: URL(fileURLWithPath: childPath.pathString), - withIntermediateDirectories: true, - attributes: nil - ) - - let got = try subject.resolve(path: childPath) - XCTAssertEqual(got, .bin(binPath)) - } -} diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift index 65cc50153f3..cf56b1d7e0e 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift @@ -62,7 +62,6 @@ final class SwiftPackageManagerInteractorTests: TuistUnitTestCase { let config = Config( compatibleXcodeVersions: .all, cloud: nil, - cache: nil, swiftVersion: nil, plugins: [], generationOptions: .test(resolveDependenciesWithSystemScm: true), @@ -186,7 +185,6 @@ final class SwiftPackageManagerInteractorTests: TuistUnitTestCase { let config = Config( compatibleXcodeVersions: .all, cloud: nil, - cache: nil, swiftVersion: nil, plugins: [], generationOptions: .test(clonedSourcePackagesDirPath: temporaryPath.appending(component: "spm")), diff --git a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift index be29a7c573a..00aaba07699 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift @@ -814,14 +814,13 @@ final class ProjectFileElementsTests: TuistUnitTestCase { ) let groups = ProjectGroups.generate(project: project, pbxproj: pbxproj) - let frameworkPath = try temporaryPath().appending(component: CacheCategory.builds.directoryName) + let frameworkPath = try temporaryPath().appending(component: CacheCategory.binaries.directoryName) .appending(component: "Test.framework") let binaryPath = frameworkPath.appending(component: "Test") let frameworkDependency = GraphDependencyReference.framework( path: frameworkPath, binaryPath: binaryPath, - isCarthage: false, dsymPath: nil, bcsymbolmapPaths: [], linking: .static, diff --git a/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift b/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift index 620e7b1d014..88daeef783d 100644 --- a/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift +++ b/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift @@ -373,18 +373,16 @@ final class AutogeneratedWorkspaceSchemeWorkspaceMapperTests: TuistUnitTestCase XCTAssertEmpty(sideEffects) let schemes = got.workspace.schemes - XCTAssertEqual(schemes.count, 2) + XCTAssertEqual(schemes.count, 1) XCTAssertEqual( Set(schemes.map(\.name)), Set([ - "A-Workspace-iOS", - "A-Workspace-macOS", + "A-Workspace", ]) ) - let iosScheme = try XCTUnwrap(schemes.first(where: { $0.name == "A-Workspace-iOS" })) - let macOSScheme = try XCTUnwrap(schemes.first(where: { $0.name == "A-Workspace-macOS" })) + let scheme = try XCTUnwrap(schemes.first(where: { $0.name == "A-Workspace" })) XCTAssertEqual( - iosScheme.buildAction.map(\.targets) ?? [], + scheme.buildAction.map(\.targets) ?? [], [ TargetReference( projectPath: projectPath, @@ -394,11 +392,6 @@ final class AutogeneratedWorkspaceSchemeWorkspaceMapperTests: TuistUnitTestCase projectPath: projectPath, name: targetATests.name ), - ] - ) - XCTAssertEqual( - macOSScheme.buildAction.map(\.targets) ?? [], - [ TargetReference( projectPath: projectBPath, name: targetB.name @@ -411,7 +404,7 @@ final class AutogeneratedWorkspaceSchemeWorkspaceMapperTests: TuistUnitTestCase ) XCTAssertEqual( - iosScheme.testAction.map(\.targets) ?? [], + scheme.testAction.map(\.targets) ?? [], [ TestableTarget( target: TargetReference( @@ -420,11 +413,6 @@ final class AutogeneratedWorkspaceSchemeWorkspaceMapperTests: TuistUnitTestCase ), parallelizable: false ), - ] - ) - XCTAssertEqual( - macOSScheme.testAction.map(\.targets) ?? [], - [ TestableTarget( target: TargetReference( projectPath: projectBPath, diff --git a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift index 425dc585f18..4351a7da991 100644 --- a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift @@ -33,8 +33,8 @@ final class GraphLinterTests: TuistUnitTestCase { func test_lint_when_frameworks_are_missing() throws { // Given let temporaryPath = try temporaryPath() - let frameworkAPath = temporaryPath.appending(try RelativePath(validating: "Carthage/Build/iOS/A.framework")) - let frameworkBPath = temporaryPath.appending(try RelativePath(validating: "Carthage/Build/iOS/B.framework")) + let frameworkAPath = temporaryPath.appending(try RelativePath(validating: "Test/Build/iOS/A.framework")) + let frameworkBPath = temporaryPath.appending(try RelativePath(validating: "Test/Build/iOS/B.framework")) try FileHandler.shared.createFolder(frameworkAPath) let graph = Graph.test(dependencies: [ GraphDependency.testFramework(path: frameworkAPath): Set(), diff --git a/Tests/TuistGraphTests/Models/Dependencies/CarthageDependenciesTests.swift b/Tests/TuistGraphTests/Models/Dependencies/CarthageDependenciesTests.swift deleted file mode 100644 index 3cbbd2195fd..00000000000 --- a/Tests/TuistGraphTests/Models/Dependencies/CarthageDependenciesTests.swift +++ /dev/null @@ -1,160 +0,0 @@ -import Foundation -import XCTest -@testable import TuistGraph -@testable import TuistSupportTesting - -final class CarthageDependenciesTests: TuistUnitTestCase { - func test_cartfileValue_singleDependency() { - // Given - let carthageDependencies: CarthageDependencies = .init( - [ - .github(path: "Dependency/Dependency", requirement: .exact("1.1.1")), - ] - ) - let expected = """ - github "Dependency/Dependency" == 1.1.1 - """ - - // When - let got = carthageDependencies.cartfileValue() - - // Then - XCTAssertEqual(got, expected) - } - - func test_cartfileValue_multipleDependencies() { - // Given - let carthageDependencies: CarthageDependencies = .init( - [ - .github(path: "Dependency/Dependency", requirement: .exact("2.1.1")), - .github(path: "XYZ/Foo", requirement: .revision("revision")), - .git(path: "Foo/Bar", requirement: .atLeast("1.0.1")), - .github(path: "Qwerty/bar", requirement: .branch("develop")), - .github(path: "XYZ/Bar", requirement: .upToNext("1.1.1")), - .binary(path: "https://my.domain.com/release/MyFramework.json", requirement: .upToNext("1.0.1")), - .binary(path: "file:///some/local/path/MyFramework.json", requirement: .atLeast("1.1.0")), - ] - ) - let expected = """ - github "Dependency/Dependency" == 2.1.1 - github "XYZ/Foo" "revision" - git "Foo/Bar" >= 1.0.1 - github "Qwerty/bar" "develop" - github "XYZ/Bar" ~> 1.1.1 - binary "https://my.domain.com/release/MyFramework.json" ~> 1.0.1 - binary "file:///some/local/path/MyFramework.json" >= 1.1.0 - """ - - // When - let got = carthageDependencies.cartfileValue() - - // Then - XCTAssertEqual(got, expected) - } - - // MARK: - CarthageDependency.Dependency tests - - func test_dependency_cartfileValue_github() { - // Given - let origin: CarthageDependencies.Dependency = .github(path: "Alamofire/Alamofire", requirement: .exact("1.2.3")) - let expected = #"github "Alamofire/Alamofire" == 1.2.3"# - - // When - let got = origin.cartfileValue - - // Then - XCTAssertEqual(got, expected) - } - - func test_dependency_cartfileValue_git() { - // Given - let origin: CarthageDependencies.Dependency = .git( - path: "https://enterprise.local/desktop/git-error-translations2.git", - requirement: .atLeast("5.4.3") - ) - let expected = #"git "https://enterprise.local/desktop/git-error-translations2.git" >= 5.4.3"# - - // When - let got = origin.cartfileValue - - // Then - XCTAssertEqual(got, expected) - } - - func test_dependency_cartfileValue_binary() { - // Given - let origin: CarthageDependencies.Dependency = .binary( - path: "file:///some/local/path/MyFramework.json", - requirement: .upToNext("5.0.0") - ) - let expected = #"binary "file:///some/local/path/MyFramework.json" ~> 5.0.0"# - - // When - let got = origin.cartfileValue - - // Then - XCTAssertEqual(got, expected) - } - - // MARK: - CarthageDependencies.Requirement tests - - func test_requirement_cartfileValue_exact() { - // Given - let origin: CarthageDependencies.Requirement = .exact("1.2.3") - let expected = #"== 1.2.3"# - - // When - let got = origin.cartfileValue - - // Then - XCTAssertEqual(got, expected) - } - - func test_requirement_cartfileValue_upToNext() { - // Given - let origin: CarthageDependencies.Requirement = .upToNext("3.2.3") - let expected = #"~> 3.2.3"# - - // When - let got = origin.cartfileValue - - // Then - XCTAssertEqual(got, expected) - } - - func test_requirement_cartfileValue_atLeast() { - // Given - let origin: CarthageDependencies.Requirement = .atLeast("1.2.1") - let expected = #">= 1.2.1"# - - // When - let got = origin.cartfileValue - - // Then - XCTAssertEqual(got, expected) - } - - func test_requirement_cartfileValue_branch() { - // Given - let origin: CarthageDependencies.Requirement = .branch("develop") - let expected = #""develop""# - - // When - let got = origin.cartfileValue - - // Then - XCTAssertEqual(got, expected) - } - - func test_requirement_cartfileValue_revision() { - // Given - let origin: CarthageDependencies.Requirement = .revision("1234567898765432qwerty") - let expected = #""1234567898765432qwerty""# - - // When - let got = origin.cartfileValue - - // Then - XCTAssertEqual(got, expected) - } -} diff --git a/Tests/TuistGraphTests/Models/DeploymentDeviceTests.swift b/Tests/TuistGraphTests/Models/DeploymentDeviceTests.swift deleted file mode 100644 index 07ba3e48688..00000000000 --- a/Tests/TuistGraphTests/Models/DeploymentDeviceTests.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistGraph -@testable import TuistSupportTesting - -final class DeploymentDeviceTests: TuistUnitTestCase { - func test_codable_iphone() { - // Given - let subject = DeploymentDevice.iphone - - // Then - XCTAssertCodable(subject) - } - - func test_codable_mac() { - // Given - let subject = DeploymentDevice.mac - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/TuistGraphTests/Models/DeploymentTargetTests.swift b/Tests/TuistGraphTests/Models/DeploymentTargetTests.swift deleted file mode 100644 index 7b45aae2e9c..00000000000 --- a/Tests/TuistGraphTests/Models/DeploymentTargetTests.swift +++ /dev/null @@ -1,47 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistGraph -@testable import TuistSupportTesting - -final class DeploymentTargetTests: TuistUnitTestCase { - func test_codable_iOS() { - // Given - let subject = DeploymentTargets.iOS("12.1") - - // Then - XCTAssertCodable(subject) - } - - func test_codable_macOS() { - // Given - let subject = DeploymentTargets.macOS("10.6") - - // Then - XCTAssertCodable(subject) - } - - func test_codable_watchOS() { - // Given - let subject = DeploymentTargets.watchOS("9.3") - - // Then - XCTAssertCodable(subject) - } - - func test_codable_tvOS() { - // Given - let subject = DeploymentTargets.tvOS("13.2.1") - - // Then - XCTAssertCodable(subject) - } - - func test_codable_many_OS() { - // Given - let subject = DeploymentTargets(iOS: "12.1", macOS: "10.6", watchOS: "9.3", tvOS: "13.2.1") - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/TuistGraphTests/Models/PlatformTests.swift b/Tests/TuistGraphTests/Models/PlatformTests.swift index bd65afa6766..07d3e3d6743 100644 --- a/Tests/TuistGraphTests/Models/PlatformTests.swift +++ b/Tests/TuistGraphTests/Models/PlatformTests.swift @@ -51,13 +51,6 @@ final class PlatformTests: XCTestCase { XCTAssertTrue(Platform.visionOS.hasSimulators) } - func test_carthageDirectory() { - XCTAssertEqual(Platform.tvOS.carthageDirectory, "tvOS") - XCTAssertEqual(Platform.iOS.carthageDirectory, "iOS") - XCTAssertEqual(Platform.watchOS.carthageDirectory, "watchOS") - XCTAssertEqual(Platform.macOS.carthageDirectory, "Mac") - } - func test_xcodeSdkRootPath() { // Given let platforms: [Platform] = [ diff --git a/Tests/TuistIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift b/Tests/TuistIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift index 1f452014bdd..77fe4e2dd99 100644 --- a/Tests/TuistIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift +++ b/Tests/TuistIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift @@ -376,7 +376,6 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { Config( compatibleXcodeVersions: .all, cloud: nil, - cache: .default, swiftVersion: nil, plugins: [], generationOptions: .test(), diff --git a/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift b/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift index f40ea0fccfc..9ba00ee1cf8 100644 --- a/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift +++ b/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift @@ -149,7 +149,6 @@ final class DumpServiceTests: TuistTestCase { let config = Config( compatibleXcodeVersions: .all, cloud: nil, - cache: nil, swiftVersion: nil, plugins: [], generationOptions: .options() @@ -247,31 +246,132 @@ final class DumpServiceTests: TuistTestCase { XCTAssertPrinterOutputContains(expected) } - func test_prints_the_manifest_when_dependencies_manifest() async throws { + func test_prints_the_manifest_when_package_manifest() async throws { let tmpDir = try temporaryPath() let config = """ + // swift-tools-version: 5.9 + import PackageDescription + + #if TUIST import ProjectDescription - let dependencies = Dependencies( - carthage: nil, - swiftPackageManager: nil, - platforms: [] + let packageSettings = PackageSettings( + platforms: [.iOS, .watchOS] + ) + + #endif + + let package = Package( + name: "PackageName", + dependencies: [] ) + """ - try fileHandler.createFolder(tmpDir.appending(component: "Tuist")) + try fileHandler.createFolder(tmpDir.appending(component: Constants.tuistDirectoryName)) try config.write( - toFile: tmpDir.appending(components: "Tuist", "Dependencies.swift").pathString, + toFile: tmpDir.appending( + components: Constants.tuistDirectoryName, + Constants.SwiftPackageManager.packageSwiftName + ).pathString, atomically: true, encoding: .utf8 ) - try await subject.run(path: tmpDir.pathString, manifest: .dependencies) + try await subject.run(path: tmpDir.pathString, manifest: .package) let expected = """ { - "platforms": [ + "baseSettings": { + "base": { - ] - } + }, + "configurations": [ + { + "name": { + "rawValue": "Debug" + }, + "settings": { + + }, + "variant": "debug" + }, + { + "name": { + "rawValue": "Release" + }, + "settings": { + }, + "variant": "release" + } + ], + "defaultSettings": { + "recommended": { + "excluding": [ + + ] + } + } + }, + """ + + XCTAssertPrinterOutputContains(expected) + } + + func test_prints_the_manifest_when_package_manifest_without_package_settings() async throws { + let tmpDir = try temporaryPath() + let config = """ + // swift-tools-version: 5.9 + import PackageDescription + + let package = Package( + name: "PackageName", + dependencies: [] + ) + + """ + try fileHandler.createFolder(tmpDir.appending(component: Constants.tuistDirectoryName)) + try config.write( + toFile: tmpDir.appending( + components: Constants.tuistDirectoryName, + Constants.SwiftPackageManager.packageSwiftName + ).pathString, + atomically: true, + encoding: .utf8 + ) + try await subject.run(path: tmpDir.pathString, manifest: .package) + let expected = """ + { + "baseSettings": { + "base": { + + }, + "configurations": [ + { + "name": { + "rawValue": "Debug" + }, + "settings": { + + }, + "variant": "debug" + }, + { + "name": { + "rawValue": "Release" + }, + "settings": { + + }, + "variant": "release" + } + ], + "defaultSettings": { + "recommended": { + "excluding": [ + + ] + } + } + }, """ XCTAssertPrinterOutputContains(expected) @@ -293,10 +393,6 @@ final class DumpServiceTests: TuistTestCase { try await assertLoadingRaisesWhenManifestNotFound(manifest: .template) } - func test_run_throws_when_dependencies_and_file_doesnt_exist() async throws { - try await assertLoadingRaisesWhenManifestNotFound(manifest: .dependencies) - } - func test_run_throws_when_plugin_and_file_doesnt_exist() async throws { try await assertLoadingRaisesWhenManifestNotFound(manifest: .plugin) } @@ -323,7 +419,7 @@ final class DumpServiceTests: TuistTestCase { private func assertLoadingRaisesWhenManifestNotFound(manifest: DumpableManifest) async throws { try await fileHandler.inTemporaryDirectory { tmpDir in var expectedDirectory = tmpDir - if manifest == .config || manifest == .dependencies { + if manifest == .config { expectedDirectory = expectedDirectory.appending(component: Constants.tuistDirectoryName) if !self.fileHandler.exists(expectedDirectory) { try self.fileHandler.createFolder(expectedDirectory) @@ -348,10 +444,10 @@ extension DumpableManifest { return .config case .template: return .template - case .dependencies: - return .dependencies case .plugin: return .plugin + case .package: + return .packageSettings } } } diff --git a/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift b/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift index 6450c11c2d8..aa2fd837188 100644 --- a/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift +++ b/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift @@ -4,7 +4,6 @@ import TuistAutomation import TuistCoreTesting import TuistGraph import TuistLoader -import TuistSigning import XCTest @testable import TuistCore @testable import TuistGenerator diff --git a/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift b/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift index 8dc94644a27..6096cbc2141 100644 --- a/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift +++ b/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift @@ -4,7 +4,6 @@ import TuistAutomation import TuistCoreTesting import TuistGraph import TuistLoader -import TuistSigning import XCTest @testable import TuistCore @testable import TuistGenerator @@ -68,14 +67,6 @@ final class ProjectMapperFactoryTests: TuistUnitTestCase { XCTAssertContainsElementOfType(got, IDETemplateMacrosMapper.self) } - func test_default_contains_the_signing_mapper() { - // When - let got = subject.default() - - // Then - XCTAssertContainsElementOfType(got, SigningMapper.self) - } - func test_automation_contains_the_source_root_path_project_mapper() { // When let got = subject.automation(skipUITests: true) diff --git a/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift b/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift index d66c341e21d..96eef2d5ab7 100644 --- a/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift +++ b/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift @@ -4,7 +4,6 @@ import TSCUtility import TuistCoreTesting import TuistGraph import TuistLoader -import TuistSigning import XCTest @testable import TuistAutomation @testable import TuistCore diff --git a/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift b/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift index 3a1fa11b6b1..d662c2f85e1 100644 --- a/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift +++ b/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift @@ -9,7 +9,6 @@ import XCTest @testable import TuistCore @testable import TuistKit -@testable import TuistSigning @testable import TuistSupportTesting final class UpdateWorkspaceProjectsGraphMapperTests: TuistUnitTestCase { diff --git a/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift b/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift index 347fa9106d6..043ee1806a4 100644 --- a/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift +++ b/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift @@ -16,7 +16,6 @@ final class MockProjectEditorMapper: ProjectEditorMapping { sourceRootPath: AbsolutePath, destinationDirectory: AbsolutePath, configPath: AbsolutePath?, - dependenciesPath: AbsolutePath?, packageManifestPath: AbsolutePath?, projectManifests: [AbsolutePath], editablePluginManifests: [EditablePluginManifest], @@ -35,7 +34,6 @@ final class MockProjectEditorMapper: ProjectEditorMapping { sourceRootPath: AbsolutePath, destinationDirectory: AbsolutePath, configPath: AbsolutePath?, - dependenciesPath: AbsolutePath?, packageManifestPath: AbsolutePath?, projectManifests: [AbsolutePath], editablePluginManifests: [EditablePluginManifest], @@ -53,7 +51,6 @@ final class MockProjectEditorMapper: ProjectEditorMapping { sourceRootPath: sourceRootPath, destinationDirectory: destinationDirectory, configPath: configPath, - dependenciesPath: dependenciesPath, packageManifestPath: packageManifestPath, projectManifests: projectManifests, editablePluginManifests: editablePluginManifests, diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift index 9648af52d85..9b343c70544 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift @@ -36,7 +36,6 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { let sourceRootPath = try temporaryPath() let projectManifestPaths = [sourceRootPath].map { $0.appending(component: "Project.swift") } let configPath = sourceRootPath.appending(components: Constants.tuistDirectoryName, "Config.swift") - let dependenciesPath = sourceRootPath.appending(components: Constants.tuistDirectoryName, "Dependencies.swift") let packageManifestPath = sourceRootPath.appending(components: Constants.tuistDirectoryName, "Package.swift") let helperPaths = [sourceRootPath].map { $0.appending(component: "Project+Template.swift") } let templates = [sourceRootPath].map { $0.appending(component: "template") } @@ -63,7 +62,6 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { sourceRootPath: sourceRootPath, destinationDirectory: sourceRootPath, configPath: configPath, - dependenciesPath: dependenciesPath, packageManifestPath: packageManifestPath, projectManifests: projectManifestPaths, editablePluginManifests: pluginPaths, @@ -85,7 +83,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { // Then XCTAssertEqual(graph.name, "TestManifests") - XCTAssertEqual(targets.count, 10) + XCTAssertEqual(targets.count, 9) // Generated Manifests target let manifestsTarget = try XCTUnwrap(project.targets.first(where: { $0.name == sourceRootPath.basename + projectName })) @@ -191,25 +189,6 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEqual(configTarget.filesGroup, projectsGroup) XCTAssertEmpty(configTarget.dependencies) - // Generated Dependencies target - let dependenciesTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Dependencies" })) - XCTAssertTrue(targets.contains(dependenciesTarget)) - - XCTAssertEqual(dependenciesTarget.name, "Dependencies") - XCTAssertEqual(dependenciesTarget.destinations, .macOS) - XCTAssertEqual(dependenciesTarget.product, .staticFramework) - XCTAssertEqual( - dependenciesTarget.settings, - expectedSettings(includePaths: [projectDescriptionPath, projectDescriptionPath.parentDirectory]) - ) - XCTAssertEqual(dependenciesTarget.sources.map(\.path), [dependenciesPath]) - XCTAssertEqual(dependenciesTarget.filesGroup, projectsGroup) - XCTAssertEqual(Set(dependenciesTarget.dependencies), Set([ - .target(name: "ProjectDescriptionHelpers"), - .target(name: "PluginTwo"), - .target(name: "PluginThree"), - ])) - // Generated Packages target let packagesTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Packages" })) XCTAssertTrue(targets.contains(packagesTarget)) @@ -233,7 +212,14 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/pm/ManifestAPI", ]), ], - uniquingKeysWith: { $1 } + uniquingKeysWith: { + switch ($0, $1) { + case let (.array(leftArray), .array(rightArray)): + return SettingValue.array(leftArray + rightArray) + default: + return $1 + } + } ) ) XCTAssertEqual( @@ -288,7 +274,6 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { sourceRootPath: sourceRootPath, destinationDirectory: sourceRootPath, configPath: nil, - dependenciesPath: nil, packageManifestPath: nil, projectManifests: projectManifestPaths, editablePluginManifests: [], @@ -352,7 +337,6 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { // Given let sourceRootPath = try temporaryPath() let configPath = sourceRootPath.appending(components: Constants.tuistDirectoryName, "Config.swift") - let dependenciesPath = sourceRootPath.appending(components: Constants.tuistDirectoryName, "Dependencies.swift") let otherProjectPath = "Module" let projectManifestPaths = [ sourceRootPath.appending(component: "Project.swift"), @@ -373,7 +357,6 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { sourceRootPath: sourceRootPath, destinationDirectory: sourceRootPath, configPath: configPath, - dependenciesPath: dependenciesPath, packageManifestPath: nil, projectManifests: projectManifestPaths, editablePluginManifests: [], @@ -394,7 +377,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { // Then - XCTAssertEqual(targets.count, 4) + XCTAssertEqual(targets.count, 3) XCTAssertEmpty(targets.flatMap(\.dependencies)) // Generated Manifests target @@ -484,7 +467,6 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { sourceRootPath: sourceRootPath, destinationDirectory: sourceRootPath, configPath: nil, - dependenciesPath: nil, packageManifestPath: nil, projectManifests: [], editablePluginManifests: editablePluginManifests, @@ -567,7 +549,6 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { sourceRootPath: sourceRootPath, destinationDirectory: sourceRootPath, configPath: nil, - dependenciesPath: nil, packageManifestPath: nil, projectManifests: [], editablePluginManifests: editablePluginManifests, @@ -684,7 +665,6 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { sourceRootPath: sourceRootPath, destinationDirectory: sourceRootPath, configPath: nil, - dependenciesPath: nil, packageManifestPath: nil, projectManifests: [], editablePluginManifests: editablePluginManifests, @@ -731,7 +711,6 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { sourceRootPath: sourceRootPath, destinationDirectory: sourceRootPath, configPath: nil, - dependenciesPath: nil, packageManifestPath: nil, projectManifests: projectManifestPaths, editablePluginManifests: [localPlugin], diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift index 4f9a5e308f8..ae5b95f1e47 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift @@ -112,7 +112,6 @@ final class ProjectEditorTests: TuistUnitTestCase { XCTAssertEqual( excluding, [ - "**/Tuist/Dependencies/**", "**/.build/**", "\(directory.pathString)/a folder/**", "\(directory.pathString)/B.swift", @@ -140,7 +139,6 @@ final class ProjectEditorTests: TuistUnitTestCase { XCTAssertEqual(mapArgs?.sourceRootPath, directory) XCTAssertEqual(mapArgs?.projectDescriptionPath, projectDescriptionPath.parentDirectory) XCTAssertEqual(mapArgs?.configPath, configPath) - XCTAssertEqual(mapArgs?.dependenciesPath, dependenciesPath) XCTAssertEqual(mapArgs?.packageManifestPath, packageManifestPath) } diff --git a/Tests/TuistKitTests/Services/CleanServiceTests.swift b/Tests/TuistKitTests/Services/CleanServiceTests.swift index 4dcec31830c..c2f57b14ef2 100644 --- a/Tests/TuistKitTests/Services/CleanServiceTests.swift +++ b/Tests/TuistKitTests/Services/CleanServiceTests.swift @@ -28,7 +28,7 @@ final class CleanServiceTests: TuistUnitTestCase { func test_run_with_category_cleans_category() throws { // Given - let cachePaths = try createFolders(["Cache", "Cache/BuildCache", "Cache/Manifests", "Cache/incremental-tests"]) + let cachePaths = try createFolders(["Cache", "Cache/BinaryCache", "Cache/Manifests", "Cache/SelectiveTests"]) let cachePath = cachePaths[0] for path in cachePaths { let correctlyCreated = FileManager.default.fileExists(atPath: path.pathString) @@ -37,7 +37,7 @@ final class CleanServiceTests: TuistUnitTestCase { cacheDirectoriesProvider.cacheDirectoryStub = cachePath // When - try subject.run(categories: [.global(.builds), .global(.tests)], path: nil) + try subject.run(categories: [.global(.binaries), .global(.selectiveTests)], path: nil) // Then let buildsExists = FileManager.default.fileExists(atPath: cachePaths[1].pathString) @@ -53,7 +53,7 @@ final class CleanServiceTests: TuistUnitTestCase { func test_run_without_category_cleans_all() throws { // Given - let cachePaths = try createFolders(["Cache", "Cache/BuildCache", "Cache/Manifests", "Cache/incremental-tests"]) + let cachePaths = try createFolders(["Cache", "Cache/BinaryCache", "Cache/Manifests", "Cache/SelectiveTests"]) let cachePath = cachePaths[0] for path in cachePaths { let correctlyCreated = FileManager.default.fileExists(atPath: path.pathString) @@ -61,30 +61,10 @@ final class CleanServiceTests: TuistUnitTestCase { } cacheDirectoriesProvider.cacheDirectoryStub = cachePath let projectPath = try temporaryPath() - let dependenciesPath = projectPath.appending( - components: - Constants.tuistDirectoryName, - Constants.DependenciesDirectory.name + let swiftPackageManagerBuildPath = projectPath.appending( + components: Constants.tuistDirectoryName, Constants.SwiftPackageManager.packageBuildDirectoryName ) - let lockfilesPath = projectPath.appending( - components: - Constants.tuistDirectoryName, - Constants.DependenciesDirectory.lockfilesDirectoryName - ) - let carthageDependenciesPath = projectPath.appending( - components: Constants.tuistDirectoryName, - Constants.DependenciesDirectory.name, - Constants.DependenciesDirectory.carthageDirectoryName - ) - let spmDependenciesPath = projectPath.appending( - components: Constants.tuistDirectoryName, - Constants.DependenciesDirectory.name, - Constants.DependenciesDirectory.carthageDirectoryName - ) - try fileHandler.createFolder(dependenciesPath) - try fileHandler.createFolder(lockfilesPath) - try fileHandler.createFolder(carthageDependenciesPath) - try fileHandler.createFolder(spmDependenciesPath) + try fileHandler.createFolder(swiftPackageManagerBuildPath) // When try subject.run(categories: CleanCategory.allCases, path: nil) @@ -96,17 +76,9 @@ final class CleanServiceTests: TuistUnitTestCase { XCTAssertFalse(manifestsExists, "Cache folder at path \(cachePaths[2].pathString) should have been deleted by the test.") let testsExists = FileManager.default.fileExists(atPath: cachePaths[3].pathString) XCTAssertFalse(testsExists, "Cache folder at path \(cachePaths[3].pathString) should not have been deleted by the test.") - XCTAssertTrue( - FileManager.default.fileExists(atPath: lockfilesPath.pathString), - "Cache folder at path \(lockfilesPath) should not have been deleted by the test." - ) - XCTAssertFalse( - FileManager.default.fileExists(atPath: carthageDependenciesPath.pathString), - "Cache folder at path \(carthageDependenciesPath) should have been deleted by the test." - ) XCTAssertFalse( - FileManager.default.fileExists(atPath: spmDependenciesPath.pathString), - "Cache folder at path \(spmDependenciesPath) should have been deleted by the test." + FileManager.default.fileExists(atPath: swiftPackageManagerBuildPath.pathString), + "Cache folder at path \(swiftPackageManagerBuildPath) should have been deleted by the test." ) } } diff --git a/Tests/TuistKitTests/Services/DecryptServiceTests.swift b/Tests/TuistKitTests/Services/DecryptServiceTests.swift deleted file mode 100644 index fd0df5cd205..00000000000 --- a/Tests/TuistKitTests/Services/DecryptServiceTests.swift +++ /dev/null @@ -1,38 +0,0 @@ -import TSCBasic -import TuistSigningTesting -import XCTest -@testable import TuistKit -@testable import TuistSupportTesting - -final class DecryptServiceTests: TuistUnitTestCase { - var subject: DecryptService! - var signingCipher: MockSigningCipher! - - override func setUp() { - super.setUp() - - signingCipher = MockSigningCipher() - subject = DecryptService(signingCipher: signingCipher) - } - - override func tearDown() { - signingCipher = nil - subject = nil - super.tearDown() - } - - func test_calls_decrypt_with_provided_path() throws { - // Given - let expectedPath = try AbsolutePath(validating: "/path") - var path: AbsolutePath? - signingCipher.decryptSigningStub = { decryptPath, _ in - path = decryptPath - } - - // When - try subject.run(path: expectedPath.pathString) - - // Then - XCTAssertEqual(path, expectedPath) - } -} diff --git a/Tests/TuistKitTests/Services/EncryptServiceTests.swift b/Tests/TuistKitTests/Services/EncryptServiceTests.swift deleted file mode 100644 index a4e2e3331dc..00000000000 --- a/Tests/TuistKitTests/Services/EncryptServiceTests.swift +++ /dev/null @@ -1,38 +0,0 @@ -import TSCBasic -import TuistSigningTesting -import XCTest -@testable import TuistKit -@testable import TuistSupportTesting - -final class EncryptServiceTests: TuistUnitTestCase { - var subject: EncryptService! - var signingCipher: MockSigningCipher! - - override func setUp() { - super.setUp() - - signingCipher = MockSigningCipher() - subject = EncryptService(signingCipher: signingCipher) - } - - override func tearDown() { - signingCipher = nil - subject = nil - super.tearDown() - } - - func test_calls_encrypt_with_provided_path() throws { - // Given - let expectedPath = try AbsolutePath(validating: "/path") - var path: AbsolutePath? - signingCipher.encryptSigningStub = { encryptPath, _ in - path = encryptPath - } - - // When - try subject.run(path: expectedPath.pathString) - - // Then - XCTAssertEqual(path, expectedPath) - } -} diff --git a/Tests/TuistKitTests/Services/FetchServiceTests.swift b/Tests/TuistKitTests/Services/FetchServiceTests.swift index 1ba83568f4c..a4728b3c28c 100644 --- a/Tests/TuistKitTests/Services/FetchServiceTests.swift +++ b/Tests/TuistKitTests/Services/FetchServiceTests.swift @@ -3,7 +3,6 @@ import TSCBasic import TSCUtility import TuistCore import TuistCoreTesting -import TuistDependenciesTesting import TuistGraph import TuistGraphTesting import TuistLoader @@ -18,10 +17,7 @@ import XCTest final class FetchServiceTests: TuistUnitTestCase { private var pluginService: MockPluginService! private var configLoader: MockConfigLoader! - private var manifestLoader: MockManifestLoader! - private var dependenciesController: MockDependenciesController! - private var packageSettingsLoader: MockPackageSettingsLoader! - private var dependenciesModelLoader: MockDependenciesModelLoader! + private var swiftPackageManagerController: MockSwiftPackageManagerController! private var subject: FetchService! @@ -30,19 +26,12 @@ final class FetchServiceTests: TuistUnitTestCase { pluginService = MockPluginService() configLoader = MockConfigLoader() - manifestLoader = MockManifestLoader() - manifestLoader.manifestsAtStub = { _ in [.project] } - dependenciesController = MockDependenciesController() - dependenciesModelLoader = MockDependenciesModelLoader() - packageSettingsLoader = MockPackageSettingsLoader() + swiftPackageManagerController = MockSwiftPackageManagerController() subject = FetchService( pluginService: pluginService, configLoader: configLoader, - manifestLoader: manifestLoader, - dependenciesController: dependenciesController, - dependenciesModelLoader: dependenciesModelLoader, - packageSettingsLoader: packageSettingsLoader + swiftPackageManagerController: swiftPackageManagerController ) } @@ -51,8 +40,7 @@ final class FetchServiceTests: TuistUnitTestCase { pluginService = nil configLoader = nil - dependenciesController = nil - dependenciesModelLoader = nil + swiftPackageManagerController = nil super.tearDown() } @@ -60,43 +48,17 @@ final class FetchServiceTests: TuistUnitTestCase { func test_run_when_updating_dependencies() async throws { // Given let stubbedPath = try temporaryPath() - let stubbedDependencies = Dependencies( - carthage: .init( - [ - .git(path: "Dependency1", requirement: .exact("1.1.1")), - ] - ), - swiftPackageManager: .init( - .packages([ - .remote(url: "Dependency1/Dependency1", requirement: .upToNextMajor("1.2.3")), - ]), - productTypes: [:], baseSettings: .default, - targetSettings: [:] - ), - platforms: [.iOS, .macOS] - ) - dependenciesModelLoader.loadDependenciesStub = { _, _ in stubbedDependencies } let stubbedSwiftVersion = TSCUtility.Version(5, 3, 0) configLoader.loadConfigStub = { _ in Config.test(swiftVersion: stubbedSwiftVersion) } - dependenciesController.legacyUpdateStub = { path, dependencies, swiftVersion in - XCTAssertEqual(path, stubbedPath) - XCTAssertEqual(dependencies, stubbedDependencies) - XCTAssertEqual(swiftVersion, stubbedSwiftVersion) - return .none - } - dependenciesController.saveStub = { dependenciesGraph, path in - XCTAssertEqual(dependenciesGraph, .none) - XCTAssertEqual(path, stubbedPath) - } pluginService.fetchRemotePluginsStub = { _ in _ = Plugins.test() } try fileHandler.touch( stubbedPath.appending( - components: Constants.tuistDirectoryName, Manifest.dependencies.fileName(stubbedPath) + components: Constants.tuistDirectoryName, Manifest.package.fileName(stubbedPath) ) ) @@ -107,11 +69,8 @@ final class FetchServiceTests: TuistUnitTestCase { ) // Then - XCTAssertTrue(dependenciesController.invokedUpdate) - XCTAssertTrue(dependenciesModelLoader.invokedLoadDependencies) - XCTAssertTrue(dependenciesController.invokedSave) - - XCTAssertFalse(dependenciesController.invokedFetch) + XCTAssertTrue(swiftPackageManagerController.invokedUpdate) + XCTAssertFalse(swiftPackageManagerController.invokedResolve) } func test_run_when_fetching_plugins() async throws { @@ -143,42 +102,15 @@ final class FetchServiceTests: TuistUnitTestCase { func test_run_when_fetching_dependencies() async throws { // Given let stubbedPath = try temporaryPath() - let stubbedDependencies = Dependencies( - carthage: .init( - [ - .github(path: "Dependency1", requirement: .exact("1.1.1")), - ] - ), - swiftPackageManager: .init( - .packages([ - .remote(url: "Dependency1/Dependency1", requirement: .upToNextMajor("1.2.3")), - ]), - productTypes: [:], - baseSettings: .default, - targetSettings: [:] - ), - platforms: [.iOS, .macOS] - ) - dependenciesModelLoader.loadDependenciesStub = { _, _ in stubbedDependencies } let stubbedSwiftVersion = TSCUtility.Version(5, 3, 0) configLoader.loadConfigStub = { _ in Config.test(swiftVersion: stubbedSwiftVersion) } - dependenciesController.legacyFetchStub = { path, dependencies, swiftVersion in - XCTAssertEqual(path, stubbedPath) - XCTAssertEqual(dependencies, stubbedDependencies) - XCTAssertEqual(swiftVersion, stubbedSwiftVersion) - return .none - } - dependenciesController.saveStub = { dependenciesGraph, path in - XCTAssertEqual(dependenciesGraph, .none) - XCTAssertEqual(path, stubbedPath) - } pluginService.fetchRemotePluginsStub = { _ in } try fileHandler.touch( stubbedPath.appending( - components: Constants.tuistDirectoryName, Manifest.dependencies.fileName(stubbedPath) + components: Constants.tuistDirectoryName, Manifest.package.fileName(stubbedPath) ) ) @@ -189,110 +121,24 @@ final class FetchServiceTests: TuistUnitTestCase { ) // Then - XCTAssertTrue(dependenciesModelLoader.invokedLoadDependencies) - XCTAssertTrue(dependenciesController.invokedFetch) - XCTAssertTrue(dependenciesController.invokedSave) - - XCTAssertFalse(dependenciesController.invokedUpdate) + XCTAssertTrue(swiftPackageManagerController.invokedResolve) + XCTAssertFalse(swiftPackageManagerController.invokedUpdate) } func test_fetch_when_from_a_tuist_project_directory() async throws { // Given - let exp = expectation(description: "awaiting path validation") let temporaryDirectory = try temporaryPath() - let expectedFoundDependenciesLocation = temporaryDirectory.appending( - components: Constants.tuistDirectoryName, Manifest.dependencies.fileName(temporaryDirectory) - ) - let stubbedDependencies = Dependencies( - carthage: nil, - swiftPackageManager: nil, - platforms: [.iOS, .macOS] + let expectedFoundPackageLocation = temporaryDirectory.appending( + components: Constants.tuistDirectoryName, Manifest.package.fileName(temporaryDirectory) ) - // When looking for the Dependencies.swift file the model loader will search in the given path - // This is where we will assert - dependenciesModelLoader.loadDependenciesStub = { path, _ in - defer { exp.fulfill() } - XCTAssertEqual(temporaryDirectory, path) - return stubbedDependencies - } - // Dependencies.swift in root - try fileHandler.touch(expectedFoundDependenciesLocation) + try fileHandler.touch(expectedFoundPackageLocation) // When - This will cause the `loadDependenciesStub` closure to be called and assert if needed try await subject.run( path: temporaryDirectory.pathString, update: false ) - await fulfillment(of: [exp], timeout: 0.1) - } - - func test_fetch_path_is_found_in_tuist_project_directory_but_manifest_is_in_nested_directory() async throws { - // Given - let exp = expectation(description: "awaiting path validation") - let temporaryDirectory = try temporaryPath() - let manifestPath = temporaryDirectory - .appending(components: ["First", "Second"]) - let expectedFoundDependenciesLocation = temporaryDirectory.appending( - components: Constants.tuistDirectoryName, Manifest.dependencies.fileName(temporaryDirectory) - ) - let stubbedDependencies = Dependencies( - carthage: nil, - swiftPackageManager: nil, - platforms: [.iOS, .macOS] - ) - - // When looking for the Dependencies.swift file the model loader will search in the given path - // This is where we will assert - dependenciesModelLoader.loadDependenciesStub = { path, _ in - defer { exp.fulfill() } - XCTAssertEqual(temporaryDirectory, path) - return stubbedDependencies - } - - // Dependencies.swift in root - try fileHandler.touch(expectedFoundDependenciesLocation) - - // When - This will cause the `loadDependenciesStub` closure to be called and assert if needed - try await subject.run( - path: manifestPath.pathString, - update: false - ) - await fulfillment(of: [exp], timeout: 0.1) - } - - func test_fetch_path_is_found_in_nested_manifest_directory() async throws { - // Given - let exp = expectation(description: "awaiting path validation") - let temporaryDirectory = try temporaryPath() - let manifestPath = temporaryDirectory - .appending(components: ["First", "Second"]) - let expectedFoundDependenciesLocation = manifestPath.appending( - components: Constants.tuistDirectoryName, Manifest.dependencies.fileName(temporaryDirectory) - ) - let stubbedDependencies = Dependencies( - carthage: nil, - swiftPackageManager: nil, - platforms: [.iOS, .macOS] - ) - - // When looking for the Dependencies.swift file the model loader will search in the given path - // This is where we will assert - dependenciesModelLoader.loadDependenciesStub = { path, _ in - defer { exp.fulfill() } - XCTAssertEqual(manifestPath, path) - return stubbedDependencies - } - - // Dependencies.swift in root - try fileHandler.touch(expectedFoundDependenciesLocation) - - // When - This will cause the `loadDependenciesStub` closure to be called and assert if needed - try await subject.run( - path: manifestPath.pathString, - update: false - ) - await fulfillment(of: [exp], timeout: 0.1) } } diff --git a/Tests/TuistKitTests/Services/GenerateServiceTests.swift b/Tests/TuistKitTests/Services/GenerateServiceTests.swift index 62452493b93..054bec49ae4 100644 --- a/Tests/TuistKitTests/Services/GenerateServiceTests.swift +++ b/Tests/TuistKitTests/Services/GenerateServiceTests.swift @@ -10,13 +10,6 @@ import XCTest @testable import TuistLoaderTesting @testable import TuistSupportTesting -private typealias GeneratorParameters = ( - sources: Set, - cacheOutputType: CacheOutputType, - cacheProfile: TuistGraph.Cache.Profile, - ignoreCache: Bool -) - final class GenerateServiceTests: TuistUnitTestCase { var subject: GenerateService! var opener: MockOpener! diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index 85d1bf62120..f64dba740b0 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -396,7 +396,7 @@ final class TestServiceTests: TuistUnitTestCase { ] ) XCTAssertFalse( - fileHandler.exists(cacheDirectoriesProvider.cacheDirectory(for: .tests).appending(component: "A")) + fileHandler.exists(cacheDirectoriesProvider.cacheDirectory(for: .selectiveTests).appending(component: "A")) ) } diff --git a/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift b/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift index 4cf9d026691..9d37bc95236 100644 --- a/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift +++ b/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift @@ -75,6 +75,81 @@ final class ManifestLoaderTests: TuistTestCase { XCTAssertEqual(got.name, "tuist") } + func test_loadPackage() throws { + // Given + let temporaryPath = try temporaryPath() + let content = """ + // swift-tools-version: 5.9 + import PackageDescription + + #if TUIST + import ProjectDescription + + let packageSettings = PackageSettings( + platforms: [.iOS, .watchOS] + ) + + #endif + + let package = Package( + name: "PackageName", + products: [ + .executable(name: "tuist", targets: ["tuist"]), + ], + dependencies: [], + targets: [ + .target( + name: "tuist", + dependencies: [] + ), + ] + ) + + """ + + let manifestPath = temporaryPath.appending( + components: [ + Constants.tuistDirectoryName, + Manifest.package.fileName(temporaryPath), + ] + ) + try FileHandler.shared.createFolder(temporaryPath.appending(component: Constants.tuistDirectoryName)) + try content.write( + to: manifestPath.url, + atomically: true, + encoding: .utf8 + ) + + // When + let got = try subject.loadPackage(at: manifestPath.parentDirectory) + + // Then + XCTAssertEqual( + got, + .test( + products: [ + PackageInfo.Product(name: "tuist", type: .executable, targets: ["tuist"]), + ], + targets: [ + PackageInfo.Target( + name: "tuist", + path: nil, + url: nil, + sources: nil, + resources: [], + exclude: [], + dependencies: [], + publicHeadersPath: nil, + type: .regular, + settings: [], + checksum: nil, + packageAccess: true + ), + ] + ) + ) + } + func test_loadPackageSettings() throws { // Given let temporaryPath = try temporaryPath() diff --git a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift index 6383a3f5bd1..e7713f480e6 100644 --- a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift @@ -29,7 +29,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { } manifestLoader.loadConfigStub = { [weak self] path in guard let self, - let config = self.registeredConfigs[path] + let config = registeredConfigs[path] else { throw ManifestLoaderError.manifestNotFound(.config, path) } @@ -74,7 +74,6 @@ final class ConfigLoaderTests: TuistUnitTestCase { XCTAssertEqual(result, TuistGraph.Config( compatibleXcodeVersions: .all, cloud: nil, - cache: nil, swiftVersion: nil, plugins: [], generationOptions: .test(), @@ -115,7 +114,6 @@ final class ConfigLoaderTests: TuistUnitTestCase { XCTAssertEqual(result, TuistGraph.Config( compatibleXcodeVersions: .all, cloud: nil, - cache: nil, swiftVersion: nil, plugins: [], generationOptions: .test(), diff --git a/Tests/TuistLoaderTests/Loaders/DependenciesModelLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/DependenciesModelLoaderTests.swift deleted file mode 100644 index 42543fed8b7..00000000000 --- a/Tests/TuistLoaderTests/Loaders/DependenciesModelLoaderTests.swift +++ /dev/null @@ -1,74 +0,0 @@ -import Foundation -import TSCBasic -import TuistCore -import TuistGraph -import TuistGraphTesting -import TuistSupport -import XCTest - -@testable import ProjectDescription -@testable import TuistLoader -@testable import TuistLoaderTesting -@testable import TuistSupportTesting - -final class DependenciesModelLoaderTests: TuistUnitTestCase { - private var manifestLoader: MockManifestLoader! - - private var subject: DependenciesModelLoader! - - override func setUp() { - super.setUp() - - manifestLoader = MockManifestLoader() - subject = DependenciesModelLoader(manifestLoader: manifestLoader) - } - - override func tearDown() { - subject = nil - manifestLoader = nil - - super.tearDown() - } - - func test_loadDependencies() throws { - // Given - let temporaryPath = try temporaryPath() - let plugins = Plugins.test() - - manifestLoader.loadDependenciesStub = { _ in - Dependencies( - carthage: [ - .github(path: "Dependency1", requirement: .exact("1.1.1")), - .git(path: "Dependency1", requirement: .exact("2.3.4")), - ], - swiftPackageManager: .init(), - platforms: [.iOS, .macOS] - ) - } - - // When - let got = try subject.loadDependencies(at: temporaryPath, with: plugins) - - // Then - let expected: TuistGraph.Dependencies = .init( - carthage: .init( - [ - .github(path: "Dependency1", requirement: .exact("1.1.1")), - .git(path: "Dependency1", requirement: .exact("2.3.4")), - ] - ), - swiftPackageManager: .init( - .manifest, - productTypes: [:], - baseSettings: .init(configurations: [ - .debug: .init(settings: [:], xcconfig: nil), - .release: .init(settings: [:], xcconfig: nil), - ]), - targetSettings: [:] - ), - platforms: [.iOS, .macOS] - ) - XCTAssertEqual(manifestLoader.registerPluginsCount, 1) - XCTAssertEqual(got, expected) - } -} diff --git a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift index bb210855f1c..1af8e7227c6 100644 --- a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift @@ -1,6 +1,8 @@ import Foundation import TSCBasic +import TSCUtility import TuistCore +import TuistCoreTesting import TuistGraph import TuistGraphTesting import TuistSupport @@ -13,42 +15,46 @@ import XCTest final class PackageSettingsLoaderTests: TuistUnitTestCase { private var manifestLoader: MockManifestLoader! + private var swiftPackageManagerController: MockSwiftPackageManagerController! + private var rootDirectoryLocator: MockRootDirectoryLocator! private var subject: PackageSettingsLoader! override func setUp() { super.setUp() manifestLoader = MockManifestLoader() - subject = PackageSettingsLoader(manifestLoader: manifestLoader) + swiftPackageManagerController = MockSwiftPackageManagerController() + rootDirectoryLocator = MockRootDirectoryLocator() + subject = PackageSettingsLoader( + manifestLoader: manifestLoader, + swiftPackageManagerController: swiftPackageManagerController, + rootDirectoryLocator: rootDirectoryLocator, + fileHandler: fileHandler + ) } override func tearDown() { subject = nil manifestLoader = nil + swiftPackageManagerController = nil super.tearDown() } - func test_loadDependencies() throws { + func test_loadPackageSettings() throws { // Given let temporaryPath = try temporaryPath() let plugins = Plugins.test() + swiftPackageManagerController.getToolsVersionStub = { _ in + TSCUtility.Version("5.4.9") + } + manifestLoader.loadPackageSettingsStub = { _ in PackageSettings( platforms: [.iOS, .macOS] ) } - manifestLoader.loadDependenciesStub = { _ in - Dependencies( - carthage: [ - .github(path: "Dependency1", requirement: .exact("1.1.1")), - .git(path: "Dependency1", requirement: .exact("2.3.4")), - ], - swiftPackageManager: .init(), - platforms: [.iOS, .macOS] - ) - } // When let got = try subject.loadPackageSettings(at: temporaryPath, with: plugins) @@ -56,11 +62,17 @@ final class PackageSettingsLoaderTests: TuistUnitTestCase { // Then let expected: TuistGraph.PackageSettings = .init( productTypes: [:], - baseSettings: .init(configurations: [ - .debug: .init(settings: [:], xcconfig: nil), - .release: .init(settings: [:], xcconfig: nil), - ]), + baseSettings: TuistGraph.Settings( + base: [:], + baseDebug: [:], + configurations: [ + .release: TuistGraph.Configuration(settings: [:], xcconfig: nil), + .debug: TuistGraph.Configuration(settings: [:], xcconfig: nil), + ], + defaultSettings: .recommended + ), targetSettings: [:], + swiftToolsVersion: TSCUtility.Version("5.4.9"), platforms: [.iOS, .macOS] ) XCTAssertEqual(manifestLoader.registerPluginsCount, 1) diff --git a/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift index 66c05fd46ce..0ade4223d33 100644 --- a/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift @@ -266,7 +266,7 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { ".", ], schemes: [ - Scheme(name: "CustomWorkspaceScheme"), + .scheme(name: "CustomWorkspaceScheme"), ] ) diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/CodeCoverageMode+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/CodeCoverageMode+ManifestMapperTests.swift index eb41d5cc6da..d0b378105a5 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/CodeCoverageMode+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/CodeCoverageMode+ManifestMapperTests.swift @@ -44,7 +44,7 @@ final class CodeCoverageManifestMapperTests: TuistUnitTestCase { // Given let temporaryPath = try temporaryPath() let generatorPaths = GeneratorPaths(manifestDirectory: temporaryPath) - let targetRef = ProjectDescription.TargetReference(projectPath: nil, target: "Target") + let targetRef = ProjectDescription.TargetReference.target("Target") let manifest = Manifest.targets([targetRef]) // When diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Configuration+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Configuration+ManifestMapperTests.swift index dfcf032294e..58f964c0686 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Configuration+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Configuration+ManifestMapperTests.swift @@ -31,7 +31,7 @@ final class ConfigurationManifestMapperTests: TuistUnitTestCase { let manifest: ProjectDescription.Configuration = .debug( name: .debug, settings: settings, - xcconfig: Path(xcconfigPath.pathString) + xcconfig: .path(xcconfigPath.pathString) ) // When diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/CoreDataModel+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/CoreDataModel+ManifestMapperTests.swift index a5e136cc549..54b7cace648 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/CoreDataModel+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/CoreDataModel+ManifestMapperTests.swift @@ -15,7 +15,7 @@ final class CoreDataModelManifestMapperTests: TuistUnitTestCase { let temporaryPath = try temporaryPath() let generatorPaths = GeneratorPaths(manifestDirectory: temporaryPath) try FileHandler.shared.touch(temporaryPath.appending(component: "model.xcdatamodeld")) - let manifest = ProjectDescription.CoreDataModel( + let manifest = ProjectDescription.CoreDataModel.coreDataModel( "model.xcdatamodeld", currentVersion: "1" ) @@ -38,12 +38,15 @@ final class CoreDataModelManifestMapperTests: TuistUnitTestCase { ) try createVersionFile(xcVersion: xcVersionDataString(), temporaryPath: temporaryPath) - let manifestWithoutCurrentVersion = ProjectDescription.CoreDataModel("model.xcdatamodeld") + let manifestWithoutCurrentVersion = ProjectDescription.CoreDataModel.coreDataModel("model.xcdatamodeld") // When let model = try TuistGraph.CoreDataModel.from(manifest: manifestWithoutCurrentVersion, generatorPaths: generatorPaths) - let manifestWithCurrentVersionExplicitly = ProjectDescription.CoreDataModel("model.xcdatamodeld", currentVersion: "83") + let manifestWithCurrentVersionExplicitly = ProjectDescription.CoreDataModel.coreDataModel( + "model.xcdatamodeld", + currentVersion: "83" + ) // Then XCTAssertTrue(try coreDataModel( @@ -69,7 +72,7 @@ final class CoreDataModelManifestMapperTests: TuistUnitTestCase { ) // When - let manifestWithoutCurrentVersion = ProjectDescription.CoreDataModel("model.xcdatamodeld") + let manifestWithoutCurrentVersion = ProjectDescription.CoreDataModel.coreDataModel("model.xcdatamodeld") // Then XCTAssertThrowsError( @@ -83,7 +86,7 @@ final class CoreDataModelManifestMapperTests: TuistUnitTestCase { let generatorPaths = GeneratorPaths(manifestDirectory: temporaryPath) // When - let manifestWithoutCurrentVersion = ProjectDescription.CoreDataModel("model.xcdatamodeld") + let manifestWithoutCurrentVersion = ProjectDescription.CoreDataModel.coreDataModel("model.xcdatamodeld") XCTAssertEqual( try TuistGraph.CoreDataModel.from( diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/DependenciesManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/DependenciesManifestMapperTests.swift deleted file mode 100644 index 5e23406ad7e..00000000000 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/DependenciesManifestMapperTests.swift +++ /dev/null @@ -1,53 +0,0 @@ -import Foundation -import ProjectDescription -import TSCBasic -import TuistCore -import TuistGraph -import TuistSupport -import XCTest - -@testable import TuistLoader -@testable import TuistSupportTesting - -final class DependenciesManifestMapperTests: TuistUnitTestCase { - func test_from() throws { - // Given - let temporaryPath = try temporaryPath() - - let generatorPaths = GeneratorPaths(manifestDirectory: temporaryPath) - let manifest: ProjectDescription.Dependencies = Dependencies( - carthage: [ - .github(path: "Dependency1", requirement: .exact("1.1.1")), - .git(path: "Dependency.git", requirement: .branch("BranchName")), - .binary(path: "DependencyXYZ", requirement: .atLeast("2.3.1")), - ], - swiftPackageManager: .init(), - platforms: [.iOS, .macOS, .tvOS] - ) - - // When - let got = try TuistGraph.Dependencies.from(manifest: manifest, generatorPaths: generatorPaths) - - // Then - let expected: TuistGraph.Dependencies = .init( - carthage: .init( - [ - .github(path: "Dependency1", requirement: .exact("1.1.1")), - .git(path: "Dependency.git", requirement: .branch("BranchName")), - .binary(path: "DependencyXYZ", requirement: .atLeast("2.3.1")), - ] - ), - swiftPackageManager: .init( - .manifest, - productTypes: [:], - baseSettings: .init(configurations: [ - .debug: .init(settings: [:], xcconfig: nil), - .release: .init(settings: [:], xcconfig: nil), - ]), - targetSettings: [:] - ), - platforms: [.iOS, .macOS, .tvOS] - ) - XCTAssertEqual(got, expected) - } -} diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/DeploymentTargets+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/DeploymentTargets+ManifestMapperTests.swift deleted file mode 100644 index 45582d306ec..00000000000 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/DeploymentTargets+ManifestMapperTests.swift +++ /dev/null @@ -1,27 +0,0 @@ -import Foundation -import TSCBasic -import TuistCore -import TuistGraph -import TuistGraphTesting -import TuistSupport -import XCTest - -@testable import ProjectDescription -@testable import TuistLoader -@testable import TuistSupportTesting - -final class DeploymentTargetsManifestMapperTests: TuistUnitTestCase { - func test_deploymentTarget() throws { - // Given - let manifest: ProjectDescription.DeploymentTarget = .iOS(targetVersion: "13.1", devices: .iphone) - - // When - let got = ProjectDescription.DeploymentTargets.from(manifest: manifest) - - // Then - XCTAssertEqual(got[.iOS], "13.1") - XCTAssertNil(got[.macOS]) - XCTAssertNil(got[.watchOS]) - XCTAssertNil(got[.tvOS]) - } -} diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Scheme+ManifestMapper.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Scheme+ManifestMapper.swift index 92cdfbff7b1..c5e86e2bc72 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Scheme+ManifestMapper.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Scheme+ManifestMapper.swift @@ -31,8 +31,8 @@ final class SchemeManifestMapperTests: TuistUnitTestCase { let arguments = ProjectDescription.Arguments.test( environment: ["FOO": "BAR", "FIZ": "BUZZ"], launchArguments: [ - LaunchArgument(name: "--help", isEnabled: true), - LaunchArgument(name: "subcommand", isEnabled: false), + .launchArgument(name: "--help", isEnabled: true), + .launchArgument(name: "subcommand", isEnabled: false), ] ) diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift index 6a814aad8de..f5304d0c136 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift @@ -88,6 +88,72 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { XCTAssertEqual(path, "/Project") } + func test_from_when_package_runtime() throws { + // Given + let dependency = ProjectDescription.TargetDependency.package(product: "RuntimePackageProduct", type: .runtime) + let generatorPaths = GeneratorPaths(manifestDirectory: try AbsolutePath(validating: "/")) + + // When + let got = try TuistGraph.TargetDependency.from( + manifest: dependency, + generatorPaths: generatorPaths, + externalDependencies: [:] + ) + + // Then + XCTAssertEqual(got.count, 1) + guard case let .package(product, type, _) = got[0] else { + XCTFail("Dependency should be package") + return + } + XCTAssertEqual(product, "RuntimePackageProduct") + XCTAssertEqual(type, .runtime) + } + + func test_from_when_package_macro() throws { + // Given + let dependency = ProjectDescription.TargetDependency.package(product: "MacroPackageProduct", type: .macro) + let generatorPaths = GeneratorPaths(manifestDirectory: try AbsolutePath(validating: "/")) + + // When + let got = try TuistGraph.TargetDependency.from( + manifest: dependency, + generatorPaths: generatorPaths, + externalDependencies: [:] + ) + + // Then + XCTAssertEqual(got.count, 1) + guard case let .package(product, type, _) = got[0] else { + XCTFail("Dependency should be package") + return + } + XCTAssertEqual(product, "MacroPackageProduct") + XCTAssertEqual(type, .macro) + } + + func test_from_when_package_plugin() throws { + // Given + let dependency = ProjectDescription.TargetDependency.package(product: "PluginPackageProduct", type: .plugin) + let generatorPaths = GeneratorPaths(manifestDirectory: try AbsolutePath(validating: "/")) + + // When + let got = try TuistGraph.TargetDependency.from( + manifest: dependency, + generatorPaths: generatorPaths, + externalDependencies: [:] + ) + + // Then + XCTAssertEqual(got.count, 1) + guard case let .package(product, type, _) = got[0] else { + XCTFail("Dependency should be package") + return + } + XCTAssertEqual(product, "PluginPackageProduct") + XCTAssertEqual(type, .plugin) + } + func test_from_when_sdkLibrary() throws { // Given let dependency = ProjectDescription.TargetDependency.sdk(name: "c++", type: .library, status: .required) diff --git a/Tests/TuistLoaderTests/Models/ManifestTests.swift b/Tests/TuistLoaderTests/Models/ManifestTests.swift index e51c61189bc..60f45462378 100644 --- a/Tests/TuistLoaderTests/Models/ManifestTests.swift +++ b/Tests/TuistLoaderTests/Models/ManifestTests.swift @@ -11,7 +11,8 @@ final class ManifestTests: TuistUnitTestCase { XCTAssertEqual(Manifest.project.fileName(temporaryPath), "Project.swift") XCTAssertEqual(Manifest.workspace.fileName(temporaryPath), "Workspace.swift") XCTAssertEqual(Manifest.config.fileName(temporaryPath), "Config.swift") - XCTAssertEqual(Manifest.dependencies.fileName(temporaryPath), "Dependencies.swift") + XCTAssertEqual(Manifest.package.fileName(temporaryPath), "Package.swift") + XCTAssertEqual(Manifest.packageSettings.fileName(temporaryPath), "Package.swift") XCTAssertEqual(Manifest.plugin.fileName(temporaryPath), "Plugin.swift") XCTAssertEqual(Manifest.template.fileName(temporaryPath), "folder.swift") } diff --git a/Tests/TuistDependenciesTests/SwiftPackageManager/Utils/PackageInfoGraphPlatformTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoGraphPlatformTests.swift similarity index 94% rename from Tests/TuistDependenciesTests/SwiftPackageManager/Utils/PackageInfoGraphPlatformTests.swift rename to Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoGraphPlatformTests.swift index 9a885d7c85e..26643f23ffa 100644 --- a/Tests/TuistDependenciesTests/SwiftPackageManager/Utils/PackageInfoGraphPlatformTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoGraphPlatformTests.swift @@ -5,8 +5,7 @@ import TuistSupport import XCTest -@testable import TuistDependencies -@testable import TuistDependenciesTesting +@testable import TuistLoader @testable import TuistSupportTesting final class PackageInfoGraphPlatformTests: TuistUnitTestCase { diff --git a/Tests/TuistDependenciesTests/SwiftPackageManager/Utils/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift similarity index 97% rename from Tests/TuistDependenciesTests/SwiftPackageManager/Utils/PackageInfoMapperTests.swift rename to Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 1b0b44415c3..4b9845dc760 100644 --- a/Tests/TuistDependenciesTests/SwiftPackageManager/Utils/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -6,8 +6,8 @@ import TuistGraph import TuistSupport import XCTest -@testable import TuistDependencies -@testable import TuistDependenciesTesting +@testable import TuistCoreTesting +@testable import TuistLoader @testable import TuistSupportTesting final class PackageInfoMapperTests: TuistUnitTestCase { @@ -16,7 +16,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { override func setUp() { super.setUp() - system.swiftVersionStub = { "5.7.0" } + system.swiftVersionStub = { "5.9.0" } subject = PackageInfoMapper() } @@ -459,7 +459,25 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), ] ) - XCTAssertEqual( + + let test = Project.testWithDefaultConfigs( + name: "Package", + targets: [ + .test( + "Target1", + basePath: basePath, + customSources: .custom(.init( + globs: [ + basePath + .appending(try RelativePath(validating: "Package/\(alternativeDefaultSource)/Target1/**")) + .pathString, + ] + )) + ), + ] + ) + + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", @@ -467,7 +485,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - customSources: .custom(.init( + customSources: .custom(.sourceFilesList( globs: [ basePath .appending(try RelativePath(validating: "Package/\(alternativeDefaultSource)/Target1/**")) @@ -633,7 +651,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, customProductName: "com_example_target_1", customBundleID: "com.example.target-1", - customSources: .custom(.init(globs: [ + customSources: .custom(.sourceFilesList(globs: [ basePath .appending(try RelativePath(validating: "Package/Sources/com.example.target-1/**")).pathString, ])) @@ -863,11 +881,11 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - customSources: .custom(.init(globs: [ + customSources: .custom(.sourceFilesList(globs: [ .glob( - Path(basePath.appending(try RelativePath(validating: "Package/Sources/Target1/**")).pathString), + .path(basePath.appending(try RelativePath(validating: "Package/Sources/Target1/**")).pathString), excluding: [ - Path( + .path( basePath .appending( try RelativePath(validating: "Package/Sources/Target1/AnotherOne/Resource/**") @@ -879,14 +897,14 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ])), resources: [ .folderReference( - path: Path( + path: .path( basePath.appending(try RelativePath(validating: "Package/Sources/Target1/Resource/Folder")) .pathString ), tags: [] ), .glob( - pattern: Path( + pattern: .path( basePath .appending( try RelativePath(validating: "Package/Sources/Target1/Another/Resource/Folder/**") @@ -894,7 +912,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .pathString ), excluding: [ - Path( + .path( basePath .appending( try RelativePath(validating: "Package/Sources/Target1/AnotherOne/Resource/**") @@ -905,7 +923,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { tags: [] ), .glob( - pattern: Path( + pattern: .path( basePath .appending( try RelativePath(validating: "Package/Sources/Target1/AnotherOne/Resource/Folder/**") @@ -913,7 +931,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .pathString ), excluding: [ - Path( + .path( basePath .appending( try RelativePath(validating: "Package/Sources/Target1/AnotherOne/Resource/**") @@ -972,7 +990,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, resources: [ .glob( - pattern: Path(defaultResourcePath.pathString), + pattern: .path(defaultResourcePath.pathString), excluding: [], tags: [] ), @@ -1317,7 +1335,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - dependencies: [.project(target: "Dependency1", path: Path("\(basePath.pathString)/Package2"))], + dependencies: [.project(target: "Dependency1", path: .path("\(basePath.pathString)/Package2"))], customSettings: [ "HEADER_SEARCH_PATHS": [ "$(SRCROOT)/Sources/Target1/include", @@ -1380,13 +1398,13 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - customSources: .custom(.init(globs: [ + customSources: .custom(.sourceFilesList(globs: [ basePath .appending(try RelativePath(validating: "Package/Custom/Sources/Folder/**")).pathString, ])), resources: [ .folderReference( - path: Path( + path: .path( basePath.appending(try RelativePath(validating: "Package/Custom/Resource/Folder")) .pathString ), @@ -1494,8 +1512,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { destinations: [.iPad, .iPhone, .macWithiPadDesign, .appleVisionWithiPadDesign, .appleTv], customProductName: "Target1", customBundleID: "Target1", - deploymentTargets: .init(iOS: "11.0", tvOS: "11.0"), - customSources: .custom(.init(globs: [ + deploymentTargets: .deploymentTargets(iOS: "12.0", tvOS: "12.0"), + customSources: .custom(.sourceFilesList(globs: [ basePath.appending(try RelativePath(validating: "Package/Sources/Target1/**")) .pathString, ])) @@ -1509,7 +1527,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { // That could lead to mixed orders let projectTargets = project?.targets.sorted(by: \.name) let expectedTargets = expected.targets.sorted(by: \.name) - XCTAssertEqual(projectTargets, expectedTargets) + XCTAssertBetterEqual(projectTargets, expectedTargets) } func testMap_whenIOSNotAvailable_takesOthers() throws { @@ -1545,7 +1563,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, destinations: [.appleTv], - deploymentTargets: .tvOS("11.0") + deploymentTargets: .tvOS("12.0") ), ] ) @@ -2382,7 +2400,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "Target1", basePath: basePath, dependencies: [ - .xcframework(path: Path( + .xcframework(path: .path( basePath.appending(try RelativePath(validating: "artifacts/Package/Dependency1.xcframework")) .pathString )), @@ -2472,7 +2490,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "Target1", basePath: basePath, dependencies: [ - .xcframework(path: Path( + .xcframework(path: .path( basePath.appending(try RelativePath(validating: "artifacts/Package/Dependency1.xcframework")) .pathString )), @@ -2520,7 +2538,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - dependencies: [.xcframework(path: Path( + dependencies: [.xcframework(path: .path( basePath .appending(try RelativePath(validating: "Package/Dependency1/Dependency1.xcframework")).pathString ))] @@ -2585,11 +2603,11 @@ final class PackageInfoMapperTests: TuistUnitTestCase { dependencies: [ .project( target: "Target2", - path: Path(basePath.appending(try RelativePath(validating: "Package2")).pathString) + path: .path(basePath.appending(try RelativePath(validating: "Package2")).pathString) ), .project( target: "Target3", - path: Path(basePath.appending(try RelativePath(validating: "Package2")).pathString) + path: .path(basePath.appending(try RelativePath(validating: "Package2")).pathString) ), ] ), @@ -2653,11 +2671,11 @@ final class PackageInfoMapperTests: TuistUnitTestCase { dependencies: [ .project( target: "Target2", - path: Path(basePath.appending(try RelativePath(validating: "Package2")).pathString) + path: .path(basePath.appending(try RelativePath(validating: "Package2")).pathString) ), .project( target: "Target3", - path: Path(basePath.appending(try RelativePath(validating: "Package2")).pathString) + path: .path(basePath.appending(try RelativePath(validating: "Package2")).pathString) ), ] ), @@ -2989,8 +3007,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { destinations: [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign, .appleTv], customProductName: "Target1", customBundleID: "Target1", - deploymentTargets: .init(iOS: "11.0", tvOS: "11.0"), - customSources: .custom(.init(globs: [ + deploymentTargets: .deploymentTargets(iOS: "12.0", tvOS: "12.0"), + customSources: .custom(.sourceFilesList(globs: [ basePath.appending(try RelativePath(validating: "Package/Sources/Target1/**")).pathString, ])), dependencies: [ @@ -3004,8 +3022,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { destinations: [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign, .appleTv], customProductName: "Dependency1", customBundleID: "Dependency1", - deploymentTargets: .init(iOS: "11.0", tvOS: "11.0"), - customSources: .custom(.init(globs: [ + deploymentTargets: .deploymentTargets(iOS: "12.0", tvOS: "12.0"), + customSources: .custom(.sourceFilesList(globs: [ basePath.appending(try RelativePath(validating: "Package/Sources/Dependency1/**")).pathString, ])) ), @@ -3015,8 +3033,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { destinations: [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign, .appleTv], customProductName: "Dependency2", customBundleID: "Dependency2", - deploymentTargets: .init(iOS: "11.0", tvOS: "11.0"), - customSources: .custom(.init(globs: [ + deploymentTargets: .deploymentTargets(iOS: "12.0", tvOS: "12.0"), + customSources: .custom(.sourceFilesList(globs: [ basePath.appending(try RelativePath(validating: "Package/Sources/Dependency2/**")).pathString, ])) ), @@ -3087,19 +3105,19 @@ final class PackageInfoMapperTests: TuistUnitTestCase { destinations: [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign, .appleTv], customProductName: "Target1", customBundleID: "Target1", - deploymentTargets: .init(iOS: "11.0", tvOS: "11.0"), - customSources: .custom(.init(globs: [ + deploymentTargets: .deploymentTargets(iOS: "12.0", tvOS: "12.0"), + customSources: .custom(.sourceFilesList(globs: [ basePath.appending(try RelativePath(validating: "Package/Sources/Target1/**")).pathString, ])), dependencies: [ .project( target: "Target2", - path: Path(basePath.appending(try RelativePath(validating: "Package2")).pathString), + path: .path(basePath.appending(try RelativePath(validating: "Package2")).pathString), condition: .when([.ios]) ), .project( target: "Target3", - path: Path(basePath.appending(try RelativePath(validating: "Package2")).pathString), + path: .path(basePath.appending(try RelativePath(validating: "Package2")).pathString), condition: .when([.ios]) ), ] @@ -3284,11 +3302,11 @@ extension ProjectDescription.Target { fileprivate static func test( _ name: String, basePath: AbsolutePath = "/", - destinations: ProjectDescription.Destinations = [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign], + destinations: ProjectDescription.Destinations = [.iPhone, .iPad, .appleVisionWithiPadDesign, .macWithiPadDesign], product: ProjectDescription.Product = .staticFramework, customProductName: String? = nil, customBundleID: String? = nil, - deploymentTargets: ProjectDescription.DeploymentTargets = DeploymentTargets(iOS: "11.0"), + deploymentTargets: ProjectDescription.DeploymentTargets = .deploymentTargets(iOS: "12.0"), customSources: SourceFilesListType = .default, resources: [ProjectDescription.ResourceFileElement] = [], headers: ProjectDescription.Headers? = nil, @@ -3304,10 +3322,14 @@ extension ProjectDescription.Target { sources = list case .default: // swiftlint:disable:next force_try - sources = .init(globs: [basePath.appending(try! RelativePath(validating: "Package/Sources/\(name)/**")).pathString]) + sources = + .sourceFilesList(globs: [ + basePath.appending(try! RelativePath(validating: "Package/Sources/\(name)/**")) + .pathString, + ]) } - return ProjectDescription.Target( + return ProjectDescription.Target.target( name: name, destinations: destinations, product: product, @@ -3316,7 +3338,7 @@ extension ProjectDescription.Target { deploymentTargets: deploymentTargets, infoPlist: .default, sources: sources, - resources: resources.isEmpty ? nil : ResourceFileElements(resources: resources), + resources: resources.isEmpty ? nil : .resources(resources), headers: headers, dependencies: dependencies, settings: DependenciesGraph.spmSettings(baseSettings: baseSettings, with: customSettings, moduleMap: moduleMap) @@ -3332,7 +3354,7 @@ extension [ProjectDescription.ResourceFileElement] { ["xib", "storyboard", "xcdatamodeld", "xcmappingmodel", "xcassets", "lproj"] .map { file -> ProjectDescription.ResourceFileElement in ResourceFileElement.glob( - pattern: Path("\(path.appending(component: "**").pathString)/*.\(file)"), + pattern: .path("\(path.appending(component: "**").pathString)/*.\(file)"), excluding: excluding ) } diff --git a/Tests/TuistDependenciesTests/SwiftPackageManager/Utils/SettingsMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift similarity index 99% rename from Tests/TuistDependenciesTests/SwiftPackageManager/Utils/SettingsMapperTests.swift rename to Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift index 89699be34e4..6be92aa625f 100644 --- a/Tests/TuistDependenciesTests/SwiftPackageManager/Utils/SettingsMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift @@ -6,8 +6,7 @@ import TuistGraph import TuistSupport import XCTest -@testable import TuistDependencies -@testable import TuistDependenciesTesting +@testable import TuistLoader @testable import TuistSupportTesting final class SettingsMapperTests: XCTestCase { diff --git a/Tests/TuistDependenciesTests/SwiftPackageManager/Utils/SwiftPackageManagerModuleMapGeneratorTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift similarity index 99% rename from Tests/TuistDependenciesTests/SwiftPackageManager/Utils/SwiftPackageManagerModuleMapGeneratorTests.swift rename to Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift index 021d1b14c7e..6632b85fd0c 100644 --- a/Tests/TuistDependenciesTests/SwiftPackageManager/Utils/SwiftPackageManagerModuleMapGeneratorTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift @@ -2,7 +2,7 @@ import TSCBasic import TuistSupportTesting import XCTest -@testable import TuistDependencies +@testable import TuistLoader class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { private var subject: SwiftPackageManagerModuleMapGenerator! diff --git a/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift b/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift index 5fa30c902b8..3652fd0f2a2 100644 --- a/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift +++ b/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift @@ -510,104 +510,6 @@ final class ManifestFilesLocatorTests: TuistUnitTestCase { XCTAssertEqual(paths.last, packageManifestPath) } - func test_locateDependencies() throws { - // Given - let paths = try createFiles([ - "Module01/File01.swift", - "Module01/File02.swift", - "Module01/File03.swift", - - "Module02/File01.swift", - "Module02/File01.swift", - "Module02/Subdir01/File01.swift", - "Module02/Subdir01/File02.swift", - - "File01.swift", - "File02.swift", - "Tuist/Dependencies.swift", - ]) - - // When - let dependenciesPath = subject.locateDependencies(at: try temporaryPath()) - - // Then - XCTAssertNotNil(dependenciesPath) - XCTAssertEqual(paths.last, dependenciesPath) - } - - func test_locateDependencies_traversing() throws { - // Given - let paths = try createFiles([ - "Module01/File01.swift", - "Module01/File02.swift", - "Module01/File03.swift", - - "Module02/File01.swift", - "Module02/File01.swift", - "Module02/Subdir01/File01.swift", - "Module02/Subdir01/File02.swift", - - "File01.swift", - "File02.swift", - "Tuist/Dependencies.swift", - ]) - let locatingPath = paths[5] // "Module02/Subdir01/File01.swift" - - // When - let dependenciesPath = subject.locateDependencies(at: locatingPath) - - // Then - XCTAssertNotNil(dependenciesPath) - XCTAssertEqual(paths.last, dependenciesPath) - } - - func test_locateDependencies_where_config_not_exist() throws { - // Given - try createFiles([ - "Module01/File01.swift", - "Module01/File02.swift", - "Module01/File03.swift", - - "Module02/File01.swift", - "Module02/File01.swift", - "Module02/Subdir01/File01.swift", - "Module02/Subdir01/File02.swift", - - "File01.swift", - "File02.swift", - ]) - - // When - let dependenciesPath = subject.locateDependencies(at: try temporaryPath()) - - // Then - XCTAssertNil(dependenciesPath) - } - - func test_locateDependencies_traversing_where_config_not_exist() throws { - // Given - let paths = try createFiles([ - "Module01/File01.swift", - "Module01/File02.swift", - "Module01/File03.swift", - - "Module02/File01.swift", - "Module02/File01.swift", - "Module02/Subdir01/File01.swift", - "Module02/Subdir01/File02.swift", - - "File01.swift", - "File02.swift", - ]) - let locatingPath = paths[5] // "Module02/Subdir01/File01.swift" - - // When - let dependenciesPath = subject.locateDependencies(at: locatingPath) - - // Then - XCTAssertNil(dependenciesPath) - } - func test_locateProjectManifests_returns_all_manifest_containing_manifest_signature() throws { // Given let tuistManifestSignature = "import ProjectDescription" diff --git a/Tests/TuistPluginTests/PluginServiceTests.swift b/Tests/TuistPluginTests/PluginServiceTests.swift index 8fdcfe71b03..890d51e3cc2 100644 --- a/Tests/TuistPluginTests/PluginServiceTests.swift +++ b/Tests/TuistPluginTests/PluginServiceTests.swift @@ -33,7 +33,7 @@ final class PluginServiceTests: TuistUnitTestCase { cacheDirectoriesProvider = mockCacheDirectoriesProvider cacheDirectoriesProvider.cacheDirectoryStub = try! temporaryPath() cacheDirectoryProviderFactory = MockCacheDirectoriesProviderFactory(provider: cacheDirectoriesProvider) - cacheDirectoryProviderFactory.cacheDirectoriesStub = { _ in mockCacheDirectoriesProvider } + cacheDirectoryProviderFactory.cacheDirectoriesStub = { mockCacheDirectoriesProvider } fileUnarchiver = MockFileUnarchiver() let fileArchivingFactory = MockFileArchivingFactory() fileArchivingFactory.stubbedMakeFileUnarchiverResult = fileUnarchiver @@ -212,7 +212,7 @@ final class PluginServiceTests: TuistUnitTestCase { cacheDirectoriesProvider.cacheDirectoryStub = temporaryDirectory try fileHandler.touch( pluginDirectory - .appending(components: PluginServiceConstants.repository, Constants.DependenciesDirectory.packageSwiftName) + .appending(components: PluginServiceConstants.repository, Constants.SwiftPackageManager.packageSwiftName) ) let commandPath = pluginDirectory.appending(components: PluginServiceConstants.release, "tuist-command") try fileHandler.touch(commandPath) @@ -428,7 +428,6 @@ final class PluginServiceTests: TuistUnitTestCase { Config( compatibleXcodeVersions: .all, cloud: nil, - cache: nil, swiftVersion: nil, plugins: plugins, generationOptions: .test(), diff --git a/Tests/TuistSigningTests/CertificateParserTests.swift b/Tests/TuistSigningTests/CertificateParserTests.swift deleted file mode 100644 index 9882c26efff..00000000000 --- a/Tests/TuistSigningTests/CertificateParserTests.swift +++ /dev/null @@ -1,138 +0,0 @@ -import TSCBasic -import XCTest -@testable import TuistSigning -@testable import TuistSupportTesting - -final class CertificateParserTests: TuistUnitTestCase { - var subject: CertificateParser! - - override func setUp() { - super.setUp() - - subject = CertificateParser() - } - - override func tearDown() { - subject = nil - super.tearDown() - } - - func test_name_parsing_fails_when_not_present() throws { - // Given - let publicKey = try temporaryPath().appending(component: "Target.Debug.p12") - let privateKey = try temporaryPath() - let subjectOutput = "subject= /UID=VD55TKL3V6/OU=QH95ER52SG/O=Name/C=US\n" - system.succeedCommand( - ["/usr/bin/openssl", "x509", "-inform", "der", "-in", publicKey.pathString, "-noout", "-subject"], - output: subjectOutput - ) - let fingerprintOutput = "subject= /UID=VD55TKL3V6/CN=Apple Development: Name (54GSF6G47V)/OU=QH95ER52SG/O=Name/C=US\n" - system.succeedCommand( - ["/usr/bin/openssl", "x509", "-inform", "der", "-in", publicKey.pathString, "-noout", "-fingerprint"], - output: fingerprintOutput - ) - - // When - XCTAssertThrowsSpecific( - try subject.parse(publicKey: publicKey, privateKey: privateKey), - CertificateParserError.nameParsingFailed(publicKey, subjectOutput) - ) - } - - func test_development_team_fails_when_not_present() throws { - // Given - let publicKey = try temporaryPath().appending(component: "Target.Debug.p12") - let privateKey = try temporaryPath() - let subjectOutput = "subject= /UID=VD55TKL3V6/CN=Apple Development: Name (54GSF6G47V)/O=Name/C=US\n" - system.succeedCommand( - ["/usr/bin/openssl", "x509", "-inform", "der", "-in", publicKey.pathString, "-noout", "-subject"], - output: subjectOutput - ) - let fingerprintOutput = "subject= /UID=VD55TKL3V6/CN=Apple Development: Name (54GSF6G47V)/OU=QH95ER52SG/O=Name/C=US\n" - system.succeedCommand( - ["/usr/bin/openssl", "x509", "-inform", "der", "-in", publicKey.pathString, "-noout", "-fingerprint"], - output: fingerprintOutput - ) - - // When - XCTAssertThrowsSpecific( - try subject.parse(publicKey: publicKey, privateKey: privateKey), - CertificateParserError.developmentTeamParsingFailed(publicKey, subjectOutput) - ) - } - - func test_parsing_succeeds() throws { - // Given - let publicKey = try temporaryPath().appending(component: "Target.Debug.p12") - let privateKey = try temporaryPath() - let subjectOutput = "subject= /UID=VD55TKL3V6/CN=Apple Development: Name (54GSF6G47V)/OU=QH95ER52SG/O=Name/C=US\n" - system.succeedCommand( - ["/usr/bin/openssl", "x509", "-inform", "der", "-in", publicKey.pathString, "-noout", "-subject"], - output: subjectOutput - ) - let fingerprintOutput = "subject= /UID=VD55TKL3V6/CN=Apple Development: Name (54GSF6G47V)/OU=QH95ER52SG/O=Name/C=US\n" - system.succeedCommand( - ["/usr/bin/openssl", "x509", "-inform", "der", "-in", publicKey.pathString, "-noout", "-fingerprint"], - output: fingerprintOutput - ) - let expectedCertificate = Certificate( - publicKey: publicKey, - privateKey: privateKey, - fingerprint: "subject= /UID=VD55TKL3V6/CN=Apple Development: Name (54GSF6G47V)/OU=QH95ER52SG/O=Name/C=US", - developmentTeam: "QH95ER52SG", - name: "Apple Development: Name (54GSF6G47V)", - isRevoked: false - ) - - // When - let certificate = try subject.parse(publicKey: publicKey, privateKey: privateKey) - - // Then - XCTAssertEqual(certificate, expectedCertificate) - } - - func test_parsing_succeeds_with_different_format() throws { - // Given - let publicKey = try temporaryPath().appending(component: "Target.Debug.p12") - let privateKey = try temporaryPath() - let subjectOutput = - "subject=UID = VD55TKL3V6, CN = \"Apple Development: Name (54GSF6G47V)\", OU = QH95ER52SG, O = \"Name\", C = US" - system.succeedCommand( - ["/usr/bin/openssl", "x509", "-inform", "der", "-in", publicKey.pathString, "-noout", "-subject"], - output: subjectOutput - ) - let fingerprintOutput = "subject= /UID=VD55TKL3V6/CN=Apple Development: Name (54GSF6G47V)/OU=QH95ER52SG/O=Name/C=US\n" - system.succeedCommand( - ["/usr/bin/openssl", "x509", "-inform", "der", "-in", publicKey.pathString, "-noout", "-fingerprint"], - output: fingerprintOutput - ) - let expectedCertificate = Certificate( - publicKey: publicKey, - privateKey: privateKey, - fingerprint: "subject= /UID=VD55TKL3V6/CN=Apple Development: Name (54GSF6G47V)/OU=QH95ER52SG/O=Name/C=US", - developmentTeam: "QH95ER52SG", - name: "Apple Development: Name (54GSF6G47V)", - isRevoked: false - ) - - // When - let certificate = try subject.parse(publicKey: publicKey, privateKey: privateKey) - - // Then - XCTAssertEqual(certificate, expectedCertificate) - } - - func test_sanitizeEncoding() { - // Given - let oneWrongEncoding = "test \\xC3\\xA4 something" - let twoWrongEncodings = "test \\xC3\\xA4 something \\xC2\\xB6 something else" - let twoWrongEncodingsInARow = "test \\xC3\\xA4\\xC2\\xB2 something" - let oneWrongEncodingWithMixedCapitalization = "test \\xc3\\xA4 something" - - // Then - XCTAssertEqual(oneWrongEncoding.sanitizeEncoding(), "test ä something") - XCTAssertEqual(twoWrongEncodings.sanitizeEncoding(), "test ä something ¶ something else") - XCTAssertEqual(twoWrongEncodingsInARow.sanitizeEncoding(), "test ä² something") - XCTAssertEqual(oneWrongEncodingWithMixedCapitalization.sanitizeEncoding(), "test ä something") - } -} diff --git a/Tests/TuistSigningTests/Mocks/MockCertificateParser.swift b/Tests/TuistSigningTests/Mocks/MockCertificateParser.swift deleted file mode 100644 index cab393eb9ee..00000000000 --- a/Tests/TuistSigningTests/Mocks/MockCertificateParser.swift +++ /dev/null @@ -1,16 +0,0 @@ -import Foundation -import TSCBasic -@testable import TuistSigning -@testable import TuistSigningTesting - -final class MockCertificateParser: CertificateParsing { - var parseStub: ((AbsolutePath, AbsolutePath) throws -> Certificate)? - func parse(publicKey: AbsolutePath, privateKey: AbsolutePath) throws -> Certificate { - try parseStub?(publicKey, privateKey) ?? Certificate.test() - } - - var parseFingerPrintStub: ((Data) throws -> String)? - func parseFingerPrint(developerCertificate: Data) throws -> String { - try parseFingerPrintStub?(developerCertificate) ?? "" - } -} diff --git a/Tests/TuistSigningTests/Mocks/MockProvisioningProfileParser.swift b/Tests/TuistSigningTests/Mocks/MockProvisioningProfileParser.swift deleted file mode 100644 index a43460986e0..00000000000 --- a/Tests/TuistSigningTests/Mocks/MockProvisioningProfileParser.swift +++ /dev/null @@ -1,9 +0,0 @@ -import TSCBasic -@testable import TuistSigning - -final class MockProvisioningProfileParser: ProvisioningProfileParsing { - var parseStub: ((AbsolutePath) throws -> ProvisioningProfile)? - func parse(at path: AbsolutePath) throws -> ProvisioningProfile { - try parseStub?(path) ?? ProvisioningProfile.test() - } -} diff --git a/Tests/TuistSigningTests/Mocks/MockSecurityController.swift b/Tests/TuistSigningTests/Mocks/MockSecurityController.swift deleted file mode 100644 index bb66626d694..00000000000 --- a/Tests/TuistSigningTests/Mocks/MockSecurityController.swift +++ /dev/null @@ -1,34 +0,0 @@ -import TSCBasic -@testable import TuistSigning - -final class MockSecurityController: SecurityControlling { - var importCertificateStub: ((Certificate, AbsolutePath) throws -> Void)? - func importCertificate(_ certificate: Certificate, keychainPath: AbsolutePath) throws { - try importCertificateStub?(certificate, keychainPath) - } - - var createKeychainStub: ((AbsolutePath, String) throws -> Void)? - func createKeychain(at path: AbsolutePath, password: String) throws { - try createKeychainStub?(path, password) - } - - var unlockKeychainStub: ((AbsolutePath, String) throws -> Void)? - func unlockKeychain(at path: AbsolutePath, password: String) throws { - try unlockKeychainStub?(path, password) - } - - var lockKeychainStub: ((AbsolutePath, String) throws -> Void)? - func lockKeychain(at path: AbsolutePath, password: String) throws { - try lockKeychainStub?(path, password) - } - - var decodeFileStub: ((AbsolutePath) throws -> String)? - func decodeFile(at path: AbsolutePath) throws -> String { - try decodeFileStub?(path) ?? "" - } - - var certificateExistsStub: ((AbsolutePath) throws -> Bool)? - func certificateExists(path: AbsolutePath) throws -> Bool { - try certificateExistsStub?(path) ?? false - } -} diff --git a/Tests/TuistSigningTests/Mocks/MockSigningFilesLocator.swift b/Tests/TuistSigningTests/Mocks/MockSigningFilesLocator.swift deleted file mode 100644 index 89cc3d153ff..00000000000 --- a/Tests/TuistSigningTests/Mocks/MockSigningFilesLocator.swift +++ /dev/null @@ -1,34 +0,0 @@ -import TSCBasic -@testable import TuistSigning - -final class MockSigningFilesLocator: SigningFilesLocating { - var locateSigningDirectoryStub: ((AbsolutePath) throws -> AbsolutePath)? - func locateSigningDirectory(from path: AbsolutePath) throws -> AbsolutePath? { - try locateSigningDirectoryStub?(path) - } - - var locateProvisioningProfilesStub: ((AbsolutePath) throws -> [AbsolutePath])? - func locateProvisioningProfiles(from path: AbsolutePath) throws -> [AbsolutePath] { - try locateProvisioningProfilesStub?(path) ?? [] - } - - var locateUnencryptedCertificatesStub: ((AbsolutePath) throws -> [AbsolutePath])? - func locateUnencryptedCertificates(from path: AbsolutePath) throws -> [AbsolutePath] { - try locateUnencryptedCertificatesStub?(path) ?? [] - } - - var locateEncryptedCertificatesStub: ((AbsolutePath) throws -> [AbsolutePath])? - func locateEncryptedCertificates(from path: AbsolutePath) throws -> [AbsolutePath] { - try locateEncryptedCertificatesStub?(path) ?? [] - } - - var locateUnencryptedPrivateKeysStub: ((AbsolutePath) throws -> [AbsolutePath])? - func locateUnencryptedPrivateKeys(from path: AbsolutePath) throws -> [AbsolutePath] { - try locateUnencryptedPrivateKeysStub?(path) ?? [] - } - - var locateEncryptedPrivateKeysStub: ((AbsolutePath) throws -> [AbsolutePath])? - func locateEncryptedPrivateKeys(from path: AbsolutePath) throws -> [AbsolutePath] { - try locateEncryptedPrivateKeysStub?(path) ?? [] - } -} diff --git a/Tests/TuistSigningTests/Mocks/MockSigningLinter.swift b/Tests/TuistSigningTests/Mocks/MockSigningLinter.swift deleted file mode 100644 index 7be285f4acd..00000000000 --- a/Tests/TuistSigningTests/Mocks/MockSigningLinter.swift +++ /dev/null @@ -1,21 +0,0 @@ -import TSCBasic -import TuistCore -import TuistGraph -@testable import TuistSigning - -final class MockSigningLinter: SigningLinting { - var lintStub: ((Certificate, ProvisioningProfile) -> [LintingIssue])? - func lint(certificate: Certificate, provisioningProfile: ProvisioningProfile) -> [LintingIssue] { - lintStub?(certificate, provisioningProfile) ?? [] - } - - var lintCertificateStub: ((Certificate) -> [LintingIssue])? - func lint(certificate: Certificate) -> [LintingIssue] { - lintCertificateStub?(certificate) ?? [] - } - - var lintProvisioningProfileTargetStub: ((ProvisioningProfile, Target) -> [LintingIssue])? - func lint(provisioningProfile: ProvisioningProfile, target: Target) -> [LintingIssue] { - lintProvisioningProfileTargetStub?(provisioningProfile, target) ?? [] - } -} diff --git a/Tests/TuistSigningTests/Mocks/MockSigningMatcher.swift b/Tests/TuistSigningTests/Mocks/MockSigningMatcher.swift deleted file mode 100644 index f5be61659d5..00000000000 --- a/Tests/TuistSigningTests/Mocks/MockSigningMatcher.swift +++ /dev/null @@ -1,15 +0,0 @@ -import TSCBasic -import TuistCore -@testable import TuistSigning - -final class MockSigningMatcher: SigningMatching { - var matchStub: ( - (AbsolutePath) throws - -> (certificates: [String: Certificate], provisioningProfiles: [String: [String: ProvisioningProfile]]) - )? - func match(from path: AbsolutePath) throws - -> (certificates: [String: Certificate], provisioningProfiles: [String: [String: ProvisioningProfile]]) - { - try matchStub?(path) ?? (certificates: [:], provisioningProfiles: [:]) - } -} diff --git a/Tests/TuistSigningTests/SecurityControllerTests.swift b/Tests/TuistSigningTests/SecurityControllerTests.swift deleted file mode 100644 index 7ff8524e7e3..00000000000 --- a/Tests/TuistSigningTests/SecurityControllerTests.swift +++ /dev/null @@ -1,156 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport -import XCTest -@testable import TuistCoreTesting -@testable import TuistSigning -@testable import TuistSigningTesting -@testable import TuistSupportTesting - -final class SecurityControllerTests: TuistUnitTestCase { - var subject: SecurityController! - - override func setUp() { - super.setUp() - subject = SecurityController() - } - - override func tearDown() { - subject = nil - super.tearDown() - } - - func test_decode_file() throws { - // Given - let decodeFilePath = try temporaryPath() - - let expectedOutput = "output" - system.succeedCommand(["/usr/bin/security", "cms", "-D", "-i", decodeFilePath.pathString], output: expectedOutput) - - // When - let output = try subject.decodeFile(at: decodeFilePath) - - // Then - XCTAssertEqual(expectedOutput, output) - } - - func test_import_certificate_and_private_key_succeeds() throws { - // Given - let certificatePath = try temporaryPath() - let privateKeyPath = try temporaryPath() - let certificate = Certificate.test(publicKey: certificatePath, privateKey: privateKeyPath) - let keychainPath = try temporaryPath() - - system.errorCommand([ - "/usr/bin/security", - "find-certificate", - certificatePath.pathString, - "-P", - "", - "-k", - keychainPath.pathString, - ]) - system.errorCommand(["/usr/bin/security", "find-key", privateKeyPath.pathString, "-P", "", "-k", keychainPath.pathString]) - system.succeedCommand([ - "/usr/bin/security", - "import", - certificatePath.pathString, - "-P", - "", - "-T", - "/usr/bin/codesign", - "-T", - "/usr/bin/security", - "-k", - keychainPath.pathString, - ]) - system.succeedCommand([ - "/usr/bin/security", - "import", - privateKeyPath.pathString, - "-P", - "", - "-T", - "/usr/bin/codesign", - "-T", - "/usr/bin/security", - "-k", - keychainPath.pathString, - ]) - - // When - try subject.importCertificate(certificate, keychainPath: keychainPath) - - // Then - XCTAssertPrinterContains("Imported certificate at \(certificate.publicKey.pathString)", at: .debug, ==) - XCTAssertPrinterContains("Imported certificate private key at \(certificate.privateKey.pathString)", at: .debug, ==) - } - - func test_skips_certificate_when_already_imported() throws { - // Given - let certificatePath = try temporaryPath() - let privateKeyPath = try temporaryPath() - let certificate = Certificate.test(publicKey: certificatePath, privateKey: privateKeyPath) - let keychainPath = try temporaryPath() - - system.succeedCommand( - [ - "/usr/bin/security", - "find-certificate", - "-c", - certificate.name, - "-a", - keychainPath.pathString, - ], - output: "Some output" - ) - - // When - try subject.importCertificate(certificate, keychainPath: keychainPath) - - // Then - XCTAssertPrinterContains( - "Skipping importing certificate at \(certificate.publicKey.pathString) because it is already present", - at: .debug, == - ) - } - - func test_keychain_is_created() throws { - // Given - let keychainPath = try temporaryPath() - let password = "" - system.succeedCommand(["/usr/bin/security", "create-keychain", "-p", password, keychainPath.pathString]) - - // When - try subject.createKeychain(at: keychainPath, password: password) - - // Then - XCTAssertPrinterContains("Created keychain at \(keychainPath.pathString)", at: .debug, ==) - } - - func test_keychain_is_unlocked() throws { - // Given - let keychainPath = try temporaryPath() - let password = "" - system.succeedCommand(["/usr/bin/security", "unlock-keychain", "-p", password, keychainPath.pathString]) - - // When - try subject.unlockKeychain(at: keychainPath, password: password) - - // Then - XCTAssertPrinterContains("Unlocked keychain at \(keychainPath.pathString)", at: .debug, ==) - } - - func test_keychain_is_locked() throws { - // Given - let keychainPath = try temporaryPath() - let password = "" - system.succeedCommand(["/usr/bin/security", "lock-keychain", "-p", password, keychainPath.pathString]) - - // When - try subject.lockKeychain(at: keychainPath, password: password) - - // Then - XCTAssertPrinterContains("Locked keychain at \(keychainPath.pathString)", at: .debug, ==) - } -} diff --git a/Tests/TuistSigningTests/SigningCipherTests.swift b/Tests/TuistSigningTests/SigningCipherTests.swift deleted file mode 100644 index b25d50c6fcb..00000000000 --- a/Tests/TuistSigningTests/SigningCipherTests.swift +++ /dev/null @@ -1,351 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport -import XCTest -@testable import TuistCoreTesting -@testable import TuistSigning -@testable import TuistSupportTesting - -final class SigningCipherTests: TuistUnitTestCase { - var subject: SigningCiphering! - var rootDirectoryLocator: MockRootDirectoryLocator! - var signingFilesLocator: MockSigningFilesLocator! - - override func setUp() { - super.setUp() - rootDirectoryLocator = MockRootDirectoryLocator() - signingFilesLocator = MockSigningFilesLocator() - subject = SigningCipher( - rootDirectoryLocator: rootDirectoryLocator, - signingFilesLocator: signingFilesLocator - ) - } - - override func tearDown() { - rootDirectoryLocator = nil - signingFilesLocator = nil - subject = nil - super.tearDown() - } - - func test_fails_when_no_master_key() throws { - // Given - let temporaryPath = try temporaryPath() - rootDirectoryLocator.locateStub = temporaryPath - try FileHandler.shared.createFolder(temporaryPath.appending(component: Constants.tuistDirectoryName)) - let masterKeyPath = temporaryPath.appending(components: Constants.tuistDirectoryName, Constants.masterKey) - rootDirectoryLocator.locateStub = temporaryPath - // Then - XCTAssertThrowsSpecific( - try subject.encryptSigning(at: temporaryPath, keepFiles: false), - SigningCipherError.masterKeyNotFound(masterKeyPath) - ) - } - - func test_encrypt_and_decrypt_signing() throws { - // Given - let temporaryPath = try temporaryPath() - rootDirectoryLocator.locateStub = temporaryPath - let signingDirectory = temporaryPath.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - try FileHandler.shared.createFolder(signingDirectory) - try FileHandler.shared.write( - "my-password", - path: temporaryPath.appending(components: Constants.tuistDirectoryName, Constants.masterKey), - atomically: true - ) - let certContent = "my-certificate" - let profileContent = "my-profile" - signingFilesLocator.locateUnencryptedCertificatesStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - signingDirectory.appending(component: "CertFile.txt"), - ] - } - signingFilesLocator.locateUnencryptedPrivateKeysStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - signingDirectory.appending(component: "ProfileFile.txt"), - ] - } - signingFilesLocator.locateEncryptedCertificatesStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - try AbsolutePath(validating: signingDirectory.pathString + "/CertFile.txt" + "." + Constants.encryptedExtension), - ] - } - signingFilesLocator.locateEncryptedPrivateKeysStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - try AbsolutePath( - validating: signingDirectory.pathString + "/ProfileFile.txt" + "." + Constants - .encryptedExtension - ), - ] - } - let certFile = signingDirectory.appending(component: "CertFile.txt") - let profileFile = signingDirectory.appending(component: "ProfileFile.txt") - try FileHandler.shared.write(certContent, path: certFile, atomically: true) - try FileHandler.shared.write(profileContent, path: profileFile, atomically: true) - - // When - try subject.encryptSigning(at: temporaryPath, keepFiles: false) - try subject.decryptSigning(at: temporaryPath, keepFiles: false) - - // Then - XCTAssertEqual(try fileHandler.readTextFile(certFile), certContent) - XCTAssertEqual(try fileHandler.readTextFile(profileFile), profileContent) - XCTAssertFalse( - fileHandler - .exists(try AbsolutePath( - validating: signingDirectory.pathString + "/ProfileFile.txt" + "." + Constants - .encryptedExtension - )) - ) - XCTAssertFalse( - fileHandler - .exists(try AbsolutePath( - validating: signingDirectory.pathString + "/CertFile.txt" + "." + Constants - .encryptedExtension - )) - ) - } - - func test_decrypt_signing_when_master_key_has_newline() throws { - // Given - let temporaryPath = try temporaryPath() - rootDirectoryLocator.locateStub = temporaryPath - let signingDirectory = temporaryPath.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - try FileHandler.shared.createFolder(signingDirectory) - try FileHandler.shared.write( - "my-password", - path: temporaryPath.appending(components: Constants.tuistDirectoryName, Constants.masterKey), - atomically: true - ) - let certContent = "my-certificate" - let profileContent = "my-profile" - signingFilesLocator.locateUnencryptedCertificatesStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - signingDirectory.appending(component: "CertFile.txt"), - ] - } - signingFilesLocator.locateUnencryptedPrivateKeysStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - signingDirectory.appending(component: "ProfileFile.txt"), - ] - } - signingFilesLocator.locateEncryptedCertificatesStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - try AbsolutePath(validating: signingDirectory.pathString + "/CertFile.txt" + "." + Constants.encryptedExtension), - ] - } - signingFilesLocator.locateEncryptedPrivateKeysStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - try AbsolutePath( - validating: signingDirectory.pathString + "/ProfileFile.txt" + "." + Constants - .encryptedExtension - ), - ] - } - let certFile = signingDirectory.appending(component: "CertFile.txt") - let profileFile = signingDirectory.appending(component: "ProfileFile.txt") - try FileHandler.shared.write(certContent, path: certFile, atomically: true) - try FileHandler.shared.write(profileContent, path: profileFile, atomically: true) - - // When - try subject.encryptSigning(at: temporaryPath, keepFiles: false) - try FileHandler.shared.write( - "my-password\n", - path: temporaryPath.appending(components: Constants.tuistDirectoryName, Constants.masterKey), - atomically: true - ) - try subject.decryptSigning(at: temporaryPath, keepFiles: false) - - // Then - XCTAssertEqual(try fileHandler.readTextFile(certFile), certContent) - XCTAssertEqual(try fileHandler.readTextFile(profileFile), profileContent) - XCTAssertFalse( - fileHandler - .exists(try AbsolutePath( - validating: signingDirectory.pathString + "/ProfileFile.txt" + "." + Constants - .encryptedExtension - )) - ) - XCTAssertFalse( - fileHandler - .exists(try AbsolutePath( - validating: signingDirectory.pathString + "/CertFile.txt" + "." + Constants - .encryptedExtension - )) - ) - } - - func test_encrypt_signing() throws { - // Given - let temporaryPath = try temporaryPath() - rootDirectoryLocator.locateStub = temporaryPath - let signingDirectory = temporaryPath.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - try FileHandler.shared.createFolder(signingDirectory) - try FileHandler.shared.write( - "my-password", - path: temporaryPath.appending(components: Constants.tuistDirectoryName, Constants.masterKey), - atomically: true - ) - let certContent = "my-certificate" - let profileContent = "my-profile" - let certFile = signingDirectory.appending(component: "CertFile.txt") - let profileFile = signingDirectory.appending(component: "ProfileFile.txt") - try FileHandler.shared.write(certContent, path: certFile, atomically: true) - try FileHandler.shared.write(profileContent, path: profileFile, atomically: true) - signingFilesLocator.locateUnencryptedCertificatesStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - signingDirectory.appending(component: "CertFile.txt"), - ] - } - signingFilesLocator.locateUnencryptedPrivateKeysStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - signingDirectory.appending(component: "ProfileFile.txt"), - ] - } - - let encryptedCertFile = try AbsolutePath(validating: certFile.pathString + "." + Constants.encryptedExtension) - let encryptedProfileFile = try AbsolutePath(validating: profileFile.pathString + "." + Constants.encryptedExtension) - - // When - try subject.encryptSigning(at: temporaryPath, keepFiles: false) - - // Then - XCTAssertNotEqual(try FileHandler.shared.readTextFile(encryptedCertFile), certContent) - XCTAssertNotEqual(try FileHandler.shared.readTextFile(encryptedProfileFile), profileContent) - } - - func test_encrypt_deletes_unencrypted_files() throws { - // Given - let temporaryPath = try temporaryPath() - rootDirectoryLocator.locateStub = temporaryPath - let signingDirectory = temporaryPath.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - try FileHandler.shared.createFolder(signingDirectory) - try FileHandler.shared.write( - "my-password", - path: temporaryPath.appending(components: Constants.tuistDirectoryName, Constants.masterKey), - atomically: true - ) - let certContent = "my-certificate" - let profileContent = "my-profile" - let certFile = signingDirectory.appending(component: "CertFile.txt") - let profileFile = signingDirectory.appending(component: "ProfileFile.txt") - try FileHandler.shared.write(certContent, path: certFile, atomically: true) - try FileHandler.shared.write(profileContent, path: profileFile, atomically: true) - signingFilesLocator.locateUnencryptedCertificatesStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - signingDirectory.appending(component: "CertFile.txt"), - ] - } - signingFilesLocator.locateUnencryptedPrivateKeysStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - signingDirectory.appending(component: "ProfileFile.txt"), - ] - } - - // When - try subject.encryptSigning(at: temporaryPath, keepFiles: false) - - // Then - XCTAssertFalse(fileHandler.exists(certFile)) - XCTAssertFalse(fileHandler.exists(profileFile)) - } - - func test_encrypt_does_not_delete_unencrypted_files_when_keep_files_true() throws { - // Given - let temporaryPath = try temporaryPath() - rootDirectoryLocator.locateStub = temporaryPath - let signingDirectory = temporaryPath.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - try FileHandler.shared.createFolder(signingDirectory) - try FileHandler.shared.write( - "my-password", - path: temporaryPath.appending(components: Constants.tuistDirectoryName, Constants.masterKey), - atomically: true - ) - let certContent = "my-certificate" - let profileContent = "my-profile" - let certFile = signingDirectory.appending(component: "CertFile.txt") - let profileFile = signingDirectory.appending(component: "ProfileFile.txt") - try FileHandler.shared.write(certContent, path: certFile, atomically: true) - try FileHandler.shared.write(profileContent, path: profileFile, atomically: true) - signingFilesLocator.locateUnencryptedCertificatesStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - signingDirectory.appending(component: "CertFile.txt"), - ] - } - signingFilesLocator.locateUnencryptedPrivateKeysStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - signingDirectory.appending(component: "ProfileFile.txt"), - ] - } - - // When - try subject.encryptSigning(at: temporaryPath, keepFiles: true) - - // Then - XCTAssertTrue(fileHandler.exists(certFile)) - XCTAssertTrue(fileHandler.exists(profileFile)) - } - - func test_encrypted_file_stays_the_same_when_unecrypted_file_has_not_changed() throws { - // Given - let temporaryPath = try temporaryPath() - rootDirectoryLocator.locateStub = temporaryPath - let signingDirectory = temporaryPath.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - try FileHandler.shared.createFolder(signingDirectory) - try FileHandler.shared.write( - "my-password", - path: temporaryPath.appending(components: Constants.tuistDirectoryName, Constants.masterKey), - atomically: true - ) - let certContent = "my-certificate" - let profileContent = "my-profile" - let certFile = signingDirectory.appending(component: "CertFile.txt") - let profileFile = signingDirectory.appending(component: "ProfileFile.txt") - let encryptedCertFile = try AbsolutePath(validating: certFile.pathString + "." + Constants.encryptedExtension) - let encryptedProfileFile = try AbsolutePath(validating: profileFile.pathString + "." + Constants.encryptedExtension) - try FileHandler.shared.write(certContent, path: certFile, atomically: true) - try FileHandler.shared.write(profileContent, path: profileFile, atomically: true) - signingFilesLocator.locateUnencryptedCertificatesStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - signingDirectory.appending(component: "CertFile.txt"), - ] - } - signingFilesLocator.locateUnencryptedPrivateKeysStub = { path in - let signingDirectory = path.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - return [ - signingDirectory.appending(component: "ProfileFile.txt"), - ] - } - try subject.encryptSigning(at: temporaryPath, keepFiles: true) - let expectedCertFile = try fileHandler.readTextFile(encryptedCertFile) - let expectedProfileFile = try fileHandler.readTextFile(encryptedProfileFile) - signingFilesLocator.locateUnencryptedCertificatesStub = { _ in - [certFile] - } - signingFilesLocator.locateUnencryptedPrivateKeysStub = { _ in - [profileFile] - } - - // When - try subject.encryptSigning(at: temporaryPath, keepFiles: true) - - // Then - XCTAssertEqual(try fileHandler.readTextFile(encryptedCertFile), expectedCertFile) - XCTAssertEqual(try fileHandler.readTextFile(encryptedProfileFile), expectedProfileFile) - } -} diff --git a/Tests/TuistSigningTests/SigningFilesLocatorTests.swift b/Tests/TuistSigningTests/SigningFilesLocatorTests.swift deleted file mode 100644 index d50c2ee7907..00000000000 --- a/Tests/TuistSigningTests/SigningFilesLocatorTests.swift +++ /dev/null @@ -1,136 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport -import XCTest -@testable import TuistCoreTesting -@testable import TuistSigning -@testable import TuistSupportTesting - -final class SigningFilesLocatorTests: TuistUnitTestCase { - var subject: SigningFilesLocator! - var rootDirectoryLocator: MockRootDirectoryLocator! - - override func setUp() { - super.setUp() - rootDirectoryLocator = MockRootDirectoryLocator() - subject = SigningFilesLocator(rootDirectoryLocator: rootDirectoryLocator) - } - - override func tearDown() { - subject = nil - rootDirectoryLocator = nil - super.tearDown() - } - - func test_locate_encrypted_certificates() throws { - // Given - let rootDirectory = try temporaryPath() - rootDirectoryLocator.locateStub = rootDirectory - let signingDirectory = rootDirectory.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - try fileHandler.createFolder(signingDirectory) - let expectedFileNames = ["file.cer.encrypted", "file2.cer.encrypted"] - try (["file", "file.txt", "file.encrypted"] + expectedFileNames) - .map(signingDirectory.appending) - .forEach(fileHandler.touch) - let expectedFiles = expectedFileNames.map(signingDirectory.appending) - - // When - let files = try subject.locateEncryptedCertificates(from: signingDirectory) - - // Then - XCTAssertEqual(files, expectedFiles) - } - - func test_locate_encrypted_private_keys() throws { - // Given - let rootDirectory = try temporaryPath() - rootDirectoryLocator.locateStub = rootDirectory - let signingDirectory = rootDirectory.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - try fileHandler.createFolder(signingDirectory) - let expectedFileNames = ["file.p12.encrypted", "file2.p12.encrypted"] - try (["file", "file.txt", "file.encrypted"] + expectedFileNames) - .map(signingDirectory.appending) - .forEach(fileHandler.touch) - let expectedFiles = expectedFileNames.map(signingDirectory.appending) - - // When - let files = try subject.locateEncryptedPrivateKeys(from: signingDirectory) - - // Then - XCTAssertEqual(files, expectedFiles) - } - - func test_locate_signing_directory_when_exists() throws { - // Given - let rootDirectory = try temporaryPath() - rootDirectoryLocator.locateStub = rootDirectory - let expectedSigningDirectory = rootDirectory.appending( - components: Constants.tuistDirectoryName, - Constants.signingDirectoryName - ) - try fileHandler.createFolder(expectedSigningDirectory) - - // When - let signingDirectory = try subject.locateSigningDirectory(from: rootDirectory) - - // Then - XCTAssertEqual(signingDirectory, expectedSigningDirectory) - } - - func test_locate_provisioning_profiles() throws { - // Given - let rootDirectory = try temporaryPath() - rootDirectoryLocator.locateStub = rootDirectory - let signingDirectory = rootDirectory.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - try fileHandler.createFolder(signingDirectory) - let expectedFileNames = ["file.mobileprovision"] - try (["file.cer", "file.cer.encrypted"] + expectedFileNames) - .map(signingDirectory.appending) - .forEach(fileHandler.touch) - let expectedFiles = expectedFileNames.map(signingDirectory.appending) - - // When - let files = try subject.locateProvisioningProfiles(from: signingDirectory) - - // Then - XCTAssertEqual(files, expectedFiles) - } - - func test_locate_unencrypted_certificates() throws { - // Given - let rootDirectory = try temporaryPath() - rootDirectoryLocator.locateStub = rootDirectory - let signingDirectory = rootDirectory.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - try fileHandler.createFolder(signingDirectory) - let expectedFileNames = ["file.cer"] - try (["file.mobileprovision", "file.cer.encrypted"] + expectedFileNames) - .map(signingDirectory.appending) - .forEach(fileHandler.touch) - let expectedFiles = expectedFileNames.map(signingDirectory.appending) - - // When - let files = try subject.locateUnencryptedCertificates(from: signingDirectory) - - // Then - XCTAssertEqual(files, expectedFiles) - } - - func test_locate_unencrypted_private_keys() throws { - // Given - let rootDirectory = try temporaryPath() - rootDirectoryLocator.locateStub = rootDirectory - let signingDirectory = rootDirectory.appending(components: Constants.tuistDirectoryName, Constants.signingDirectoryName) - try fileHandler.createFolder(signingDirectory) - let expectedFileNames = ["file.p12"] - try (["file.mobileprovision", "file.p12.encrypted"] + expectedFileNames) - .map(signingDirectory.appending) - .forEach(fileHandler.touch) - let expectedFiles = expectedFileNames.map(signingDirectory.appending) - - // When - let files = try subject.locateUnencryptedPrivateKeys(from: signingDirectory) - - // Then - XCTAssertEqual(files, expectedFiles) - } -} diff --git a/Tests/TuistSigningTests/SigningInstallerTests.swift b/Tests/TuistSigningTests/SigningInstallerTests.swift deleted file mode 100644 index 69389df9b65..00000000000 --- a/Tests/TuistSigningTests/SigningInstallerTests.swift +++ /dev/null @@ -1,111 +0,0 @@ -import Foundation -import TSCBasic -import TuistCore -import TuistSupport -import XCTest -@testable import TuistCoreTesting -@testable import TuistSigning -@testable import TuistSigningTesting -@testable import TuistSupportTesting - -final class SigningInstallerTests: TuistUnitTestCase { - var subject: SigningInstalling! - var securityController: MockSecurityController! - - override func setUp() { - super.setUp() - securityController = MockSecurityController() - subject = SigningInstaller(securityController: securityController) - } - - override func tearDown() { - securityController = nil - subject = nil - super.tearDown() - } - - func test_installing_provisioning_profile_is_installed_warns_when_expired() throws { - // Given - let sourceProvisioningProfilePath = try generateTestProfileFile() - let provisioningProfile = ProvisioningProfile.test( - path: sourceProvisioningProfilePath, - expirationDate: Date().addingTimeInterval(-1) - ) - - // When - let issues = try subject.installProvisioningProfile(provisioningProfile) - XCTAssertEqual(issues.count, 1) - XCTAssertEqual( - issues.first, - LintingIssue.expiredProvisioningProfile(provisioningProfile) - ) - XCTAssertTrue(try isProfileInstalled(provisioningProfile)) - } - - func test_installing_provisioning_profile_fails_when_no_extension() throws { - // Given - let provisioningProfilePath = try temporaryPath().appending(component: "file") - let provisioningProfile = ProvisioningProfile.test(path: provisioningProfilePath) - - // When - let issues = try subject.installProvisioningProfile(provisioningProfile) - XCTAssertEqual(issues.count, 1) - XCTAssertEqual( - issues.first, - LintingIssue.noFileExtension(provisioningProfilePath) - ) - } - - func test_provisioning_profile_is_installed() throws { - // Given - let sourceProvisioningProfilePath = try generateTestProfileFile() - let provisioningProfile = ProvisioningProfile.test( - path: sourceProvisioningProfilePath, - uuid: UUID().uuidString - ) - - // When - let issues = try subject.installProvisioningProfile(provisioningProfile) - - // Then - XCTAssertEmpty(issues) - XCTAssertTrue(try isProfileInstalled(provisioningProfile)) - } - - func test_certificate_is_imported() throws { - // Given - let expectedCertificate = Certificate.test() - let expectedPath = try temporaryPath() - var certificate: Certificate? - var path: AbsolutePath? - securityController.importCertificateStub = { - certificate = $0 - path = $1 - } - - // When - try subject.installCertificate(expectedCertificate, keychainPath: expectedPath) - - // Then - XCTAssertEqual(expectedCertificate, certificate) - XCTAssertEqual(expectedPath, path) - } - - private func generateTestProfileFile() throws -> AbsolutePath { - let sourceProvisioningProfilePath = try temporaryPath().appending(component: "file.mobileprovision") - try "my provisioning".write(to: sourceProvisioningProfilePath.url, atomically: true, encoding: .utf8) - - return sourceProvisioningProfilePath - } - - private func isProfileInstalled(_ profile: ProvisioningProfile) throws -> Bool { - let homeDirectoryPath = try temporaryPath() - fileHandler.homeDirectoryStub = homeDirectoryPath - let provisioningProfilesDirectoryPath = homeDirectoryPath - .appending(try RelativePath(validating: "Library/MobileDevice/Provisioning Profiles")) - let destinationProvisioningProfilePath = provisioningProfilesDirectoryPath - .appending(component: "\(profile.uuid).mobileprovision") - - return fileHandler.exists(destinationProvisioningProfilePath) - } -} diff --git a/Tests/TuistSigningTests/SigningInteractorTests.swift b/Tests/TuistSigningTests/SigningInteractorTests.swift deleted file mode 100644 index fd56c5e73ea..00000000000 --- a/Tests/TuistSigningTests/SigningInteractorTests.swift +++ /dev/null @@ -1,281 +0,0 @@ -import TSCBasic -import TuistCore -import TuistGraph -import TuistSupport -import XCTest -@testable import TuistCoreTesting -@testable import TuistSigning -@testable import TuistSigningTesting -@testable import TuistSupportTesting - -final class SigningInteractorTests: TuistUnitTestCase { - var subject: SigningInteractor! - var signingFilesLocator: MockSigningFilesLocator! - var rootDirectoryLocator: MockRootDirectoryLocator! - var signingMatcher: MockSigningMatcher! - var signingInstaller: MockSigningInstaller! - var signingLinter: MockSigningLinter! - var securityController: MockSecurityController! - var signingCipher: MockSigningCipher! - - override func setUp() { - super.setUp() - signingFilesLocator = MockSigningFilesLocator() - rootDirectoryLocator = MockRootDirectoryLocator() - signingMatcher = MockSigningMatcher() - signingInstaller = MockSigningInstaller() - signingLinter = MockSigningLinter() - securityController = MockSecurityController() - signingCipher = MockSigningCipher() - - subject = SigningInteractor( - signingFilesLocator: signingFilesLocator, - rootDirectoryLocator: rootDirectoryLocator, - signingMatcher: signingMatcher, - signingInstaller: signingInstaller, - signingLinter: signingLinter, - securityController: securityController, - signingCipher: signingCipher - ) - } - - override func tearDown() { - signingFilesLocator = nil - rootDirectoryLocator = nil - signingMatcher = nil - signingInstaller = nil - signingLinter = nil - securityController = nil - signingCipher = nil - subject = nil - super.tearDown() - } - - func test_install_creates_keychain() throws { - // Given - let graph = Graph.test() - let graphTraverser = GraphTraverser(graph: graph) - let signingDirectory = try temporaryPath() - signingFilesLocator.locateSigningDirectoryStub = { _ in - signingDirectory - } - let masterKey = "master-key" - signingCipher.readMasterKeyStub = { _ in - masterKey - } - - let rootDirectory = try temporaryPath() - rootDirectoryLocator.locateStub = rootDirectory - let keychainDirectory = rootDirectory - .appending(components: Constants.DerivedDirectory.name, Constants.DerivedDirectory.signingKeychain) - - var receivedKeychainDirectory: AbsolutePath? - var receivedMasterKey: String? - securityController.createKeychainStub = { - receivedKeychainDirectory = $0 - receivedMasterKey = $1 - } - - // When - _ = try subject.install(graphTraverser: graphTraverser) - - // Then - XCTAssertEqual(masterKey, receivedMasterKey) - XCTAssertEqual(keychainDirectory, receivedKeychainDirectory) - } - - func test_install_unlocks_keychain() throws { - // Given - let graph = Graph.test() - let graphTraverser = GraphTraverser(graph: graph) - let signingDirectory = try temporaryPath() - signingFilesLocator.locateSigningDirectoryStub = { _ in - signingDirectory - } - let masterKey = "master-key" - signingCipher.readMasterKeyStub = { _ in - masterKey - } - - let rootDirectory = try temporaryPath() - rootDirectoryLocator.locateStub = rootDirectory - let keychainDirectory = rootDirectory - .appending(components: Constants.DerivedDirectory.name, Constants.DerivedDirectory.signingKeychain) - - var receivedKeychainDirectory: AbsolutePath? - var receivedMasterKey: String? - securityController.unlockKeychainStub = { - receivedKeychainDirectory = $0 - receivedMasterKey = $1 - } - - // When - _ = try subject.install(graphTraverser: graphTraverser) - - // Then - XCTAssertEqual(masterKey, receivedMasterKey) - XCTAssertEqual(keychainDirectory, receivedKeychainDirectory) - } - - func test_install_locks_keychain() throws { - // Given - let graph = Graph.test() - let graphTraverser = GraphTraverser(graph: graph) - signingFilesLocator.locateSigningDirectoryStub = { _ in - try self.temporaryPath() - } - let masterKey = "master-key" - signingCipher.readMasterKeyStub = { _ in - masterKey - } - - let rootDirectory = try temporaryPath() - rootDirectoryLocator.locateStub = rootDirectory - let keychainDirectory = rootDirectory - .appending(components: Constants.DerivedDirectory.name, Constants.DerivedDirectory.signingKeychain) - - var receivedKeychainDirectory: AbsolutePath? - var receivedMasterKey: String? - securityController.lockKeychainStub = { - receivedKeychainDirectory = $0 - receivedMasterKey = $1 - } - - // When - _ = try subject.install(graphTraverser: graphTraverser) - - // Then - XCTAssertEqual(masterKey, receivedMasterKey) - XCTAssertEqual(keychainDirectory, receivedKeychainDirectory) - } - - func test_install_decrypts_signing() throws { - // Given - let entryPath = try temporaryPath() - let graph = Graph.test(path: entryPath) - let graphTraverser = GraphTraverser(graph: graph) - signingFilesLocator.locateSigningDirectoryStub = { _ in - try self.temporaryPath() - } - signingCipher.readMasterKeyStub = { _ in - "master-key" - } - - rootDirectoryLocator.locateStub = try temporaryPath() - - var signingPath: AbsolutePath? - var keepFiles: Bool? - signingCipher.decryptSigningStub = { - signingPath = $0 - keepFiles = $1 - } - - // When - _ = try subject.install(graphTraverser: graphTraverser) - - // Then - XCTAssertEqual(signingPath, entryPath) - XCTAssertTrue(keepFiles ?? false) - } - - func test_install_encrypts_signing() throws { - // Given - let entryPath = try temporaryPath() - let graph = Graph.test(path: entryPath) - let graphTraverser = GraphTraverser(graph: graph) - signingFilesLocator.locateSigningDirectoryStub = { _ in - try self.temporaryPath() - } - signingCipher.readMasterKeyStub = { _ in - "master-key" - } - - rootDirectoryLocator.locateStub = try temporaryPath() - - var signingPath: AbsolutePath? - var keepFiles: Bool? - signingCipher.encryptSigningStub = { - signingPath = $0 - keepFiles = $1 - } - - // When - _ = try subject.install(graphTraverser: graphTraverser) - - // Then - XCTAssertEqual(signingPath, entryPath) - XCTAssertFalse(keepFiles ?? true) - } - - func test_installs_signing() throws { - // Given - try prepareSigning() - let targetName = "target" - let configuration = "configuration" - let expectedCertificate = Certificate.test(name: "certA") - let expectedProvisioningProfile = ProvisioningProfile.test( - name: "profileA", - developerCertificateFingerprints: ["fingerprint"] - ) - signingMatcher.matchStub = { _ in - ( - certificates: [ - "fingerprint": expectedCertificate, - "otherFingerprint": Certificate.test(name: "certB"), - ], - provisioningProfiles: [ - targetName: [ - configuration: expectedProvisioningProfile, - "some-other-config": ProvisioningProfile.test(), - ], - ] - ) - } - - let target = Target.test( - name: targetName, - settings: Settings( - configurations: [ - BuildConfiguration( - name: configuration, - variant: .debug - ): Configuration.test(), - ] - ) - ) - let project = Project.test(targets: [target]) - let graph = Graph.test(projects: [project.path: project], targets: [project.path: [target.name: target]]) - let graphTraverser = GraphTraverser(graph: graph) - - var installedCertificates: [Certificate] = [] - signingInstaller.installCertificateStub = { certificate, _ in - installedCertificates.append(certificate) - } - var installedProvisioningProfiles: [ProvisioningProfile] = [] - signingInstaller.installProvisioningProfileStub = { profile in - installedProvisioningProfiles.append(profile) - - return [] - } - - // When - _ = try subject.install(graphTraverser: graphTraverser) - - // Then - XCTAssertEqual([expectedCertificate], installedCertificates) - XCTAssertEqual([expectedProvisioningProfile], installedProvisioningProfiles) - } - - // MARK: - Helpers - - private func prepareSigning() throws { - signingFilesLocator.locateSigningDirectoryStub = { _ in - try self.temporaryPath() - } - signingCipher.readMasterKeyStub = { _ in - "master-key" - } - - rootDirectoryLocator.locateStub = try temporaryPath() - } -} diff --git a/Tests/TuistSigningTests/SigningLinterTests.swift b/Tests/TuistSigningTests/SigningLinterTests.swift deleted file mode 100644 index 8fed0f44e97..00000000000 --- a/Tests/TuistSigningTests/SigningLinterTests.swift +++ /dev/null @@ -1,222 +0,0 @@ -import TSCBasic -import TuistCore -import TuistGraph -import XCTest -@testable import TuistSigning -@testable import TuistSigningTesting -@testable import TuistSupportTesting - -final class SigningLinterTests: TuistUnitTestCase { - var subject: SigningLinter! - - override func setUp() { - super.setUp() - - subject = SigningLinter() - } - - override func tearDown() { - subject = nil - super.tearDown() - } - - func test_lint_when_development_team_and_team_id_mismatch() { - // Given - let certificate = Certificate.test(developmentTeam: "TeamA") - let provisioningProfile = ProvisioningProfile.test(teamId: "TeamB") - let expectedIssues = [ - LintingIssue( - reason: """ - Certificate \(certificate.name)'s development team \( - certificate - .developmentTeam - ) does not correspond to \(provisioningProfile.teamId). - Make sure they are the same. - """, - severity: .error - ), - ] - - // When - let got = subject.lint(certificate: certificate, provisioningProfile: provisioningProfile) - - // Then - XCTAssertEqual(got, expectedIssues) - } - - func test_lint_when_certificate_is_revoked() { - // Given - let certificate = Certificate.test(isRevoked: true) - let expectedIssues = [ - LintingIssue( - reason: "Certificate \(certificate.name) is revoked. Create a new one and replace it to resolve the issue.", - severity: .warning - ), - ] - - // When - let got = subject.lint(certificate: certificate) - - // Then - XCTAssertEqual(got, expectedIssues) - } - - func test_lint_when_provisioning_profile_and_app_id_match() { - // Given - let provisioningProfile = ProvisioningProfile.test( - teamId: "team", - appId: "team.io.tuist" - ) - let target = Target.test(bundleId: "io.tuist") - - // When - let got = subject.lint(provisioningProfile: provisioningProfile, target: target) - - // Then - XCTAssertEmpty(got) - } - - func test_lint_when_provisioning_profile_and_app_id_mismatch() { - // Given - let provisioningProfile = ProvisioningProfile.test( - teamId: "team", - appId: "team.io.not-tuist" - ) - let target = Target.test(bundleId: "io.tuist") - - // When - let got = subject.lint(provisioningProfile: provisioningProfile, target: target) - - // Then - XCTAssertEqual( - got, - [LintingIssue( - reason: """ - App id \(provisioningProfile.appId) does not correspond to \(provisioningProfile.teamId).\( - target - .bundleId - ). Make sure the provisioning profile has been added to the right target. - """, - severity: .error - )] - ) - } - - func test_lint_when_provisioning_profile_has_custom_id_prefix_and_app_id_match() { - let appIdPrefix = "appIdPrefix" - - // Given - let provisioningProfile = ProvisioningProfile.test( - teamId: "team", - appId: appIdPrefix + ".io.tuist", - applicationIdPrefix: [appIdPrefix] - ) - let target = Target.test(bundleId: "io.tuist") - - // When - let got = subject.lint(provisioningProfile: provisioningProfile, target: target) - - // Then - XCTAssertEmpty(got) - } - - func test_lint_when_provisioning_profile_has_custom_id_prefix_and_app_id_mismatch() { - let appIdPrefix = "appIdPrefix" - - // Given - let provisioningProfile = ProvisioningProfile.test( - teamId: "team", - appId: appIdPrefix + ".io.not-tuist", - applicationIdPrefix: [appIdPrefix] - ) - let target = Target.test(bundleId: "io.tuist") - - // When - let got = subject.lint(provisioningProfile: provisioningProfile, target: target) - - // Then - XCTAssertEqual( - got, - [LintingIssue( - reason: """ - App id \(provisioningProfile.appId) does not correspond to \(appIdPrefix).\( - target - .bundleId - ). Make sure the provisioning profile has been added to the right target. - """, - severity: .error - )] - ) - } - - func test_lint_when_provisioning_profile_has_wildcard() { - // Given - let provisioningProfile = ProvisioningProfile.test( - teamId: "team", - appId: "team.io.*" - ) - let target = Target.test(bundleId: "io.tuist") - - // When - let got = subject.lint(provisioningProfile: provisioningProfile, target: target) - - // Then - XCTAssertEmpty(got) - } - - func test_lint_when_provisioning_profile_has_wildcard_mismatch() { - // Given - let provisioningProfile = ProvisioningProfile.test( - teamId: "team", - appId: "team.not-io.*" - ) - let target = Target.test(bundleId: "io.tuist") - - // When - let got = subject.lint(provisioningProfile: provisioningProfile, target: target) - - // Then - XCTAssertEqual( - got, - [LintingIssue( - reason: """ - App id \(provisioningProfile.appId) does not correspond to \(provisioningProfile.teamId).\( - target - .bundleId - ). Make sure the provisioning profile has been added to the right target. - """, - severity: .error - )] - ) - } - - func test_lint_when_bundle_id_is_derived_from_build_settings_using_parentheses_pattern() { - // Given - let provisioningProfile = ProvisioningProfile.test( - teamId: "team", - appId: "team.io.tuist" - ) - let target = Target.test(bundleId: "$(PRODUCT_BUNDLE_IDENTIFIER)") - - // When - let got = subject.lint(provisioningProfile: provisioningProfile, target: target) - - // Then - XCTAssertEmpty(got) - } - - func test_lint_when_bundle_id_is_derived_from_build_settings_using_braces_pattern() { - // Given - let provisioningProfile = ProvisioningProfile.test( - teamId: "team", - appId: "team.io.tuist" - ) - let target = Target.test(bundleId: "${PRODUCT_BUNDLE_IDENTIFIER}") - - // When - let got = subject.lint(provisioningProfile: provisioningProfile, target: target) - - // Then - XCTAssertEmpty(got) - } -} diff --git a/Tests/TuistSigningTests/SigningMapperTests.swift b/Tests/TuistSigningTests/SigningMapperTests.swift deleted file mode 100644 index c5cf576a90c..00000000000 --- a/Tests/TuistSigningTests/SigningMapperTests.swift +++ /dev/null @@ -1,115 +0,0 @@ -import TSCBasic -import TuistCore -import TuistGraph -import TuistSupport -import XCTest -@testable import TuistCoreTesting -@testable import TuistSigning -@testable import TuistSigningTesting -@testable import TuistSupportTesting - -final class SigningMapperTests: TuistUnitTestCase { - var subject: SigningMapper! - var signingFilesLocator: MockSigningFilesLocator! - var signingMatcher: MockSigningMatcher! - var signingCipher: MockSigningCipher! - - override func setUp() { - super.setUp() - signingFilesLocator = MockSigningFilesLocator() - signingMatcher = MockSigningMatcher() - signingCipher = MockSigningCipher() - - subject = SigningMapper( - signingFilesLocator: signingFilesLocator, - signingMatcher: signingMatcher, - signingCipher: signingCipher - ) - } - - override func tearDown() { - signingFilesLocator = nil - signingMatcher = nil - signingCipher = nil - subject = nil - super.tearDown() - } - - func test_signing_mapping() throws { - // Given - let signingDirectory = try temporaryPath() - signingFilesLocator.locateSigningDirectoryStub = { _ in - signingDirectory - } - - let targetName = "target" - let configuration = "configuration" - let certificate = Certificate.test(name: "certA") - let fingerprint = "fingerprint" - let provisioningProfile = ProvisioningProfile.test( - name: "profileA", - teamId: "TeamID", - appId: "TeamID.BundleID", - developerCertificateFingerprints: ["otherFingerPrint", fingerprint] - ) - signingMatcher.matchStub = { _ in - ( - certificates: [ - fingerprint: certificate, - ], - provisioningProfiles: [ - targetName: [ - configuration: provisioningProfile, - ], - ] - ) - } - - let target = Target.test( - name: targetName, - bundleId: "BundleID", - settings: Settings( - configurations: [ - BuildConfiguration( - name: configuration, - variant: .debug - ): Configuration.test(settings: [ - "SOME_SETTING": "Value", - ]), - ] - ) - ) - - let project = Project.test( - path: try temporaryPath(), - targets: [target] - ) - let derivedDirectory = project.path.appending(component: Constants.DerivedDirectory.name) - let keychainPath = derivedDirectory.appending(component: Constants.DerivedDirectory.signingKeychain) - - let expectedConfigurations: [BuildConfiguration: Configuration] = [ - BuildConfiguration( - name: configuration, - variant: .debug - ): Configuration.test(settings: [ - "SOME_SETTING": "Value", - "CODE_SIGN_STYLE": "Manual", - "CODE_SIGN_IDENTITY": SettingValue(stringLiteral: certificate.name), - "OTHER_CODE_SIGN_FLAGS": SettingValue(stringLiteral: "--keychain \(keychainPath.pathString)"), - "DEVELOPMENT_TEAM": SettingValue(stringLiteral: provisioningProfile.teamId), - "PROVISIONING_PROFILE_SPECIFIER": SettingValue(stringLiteral: provisioningProfile.uuid), - ]), - ] - - // When - let (mappedProject, sideEffects) = try subject.map(project: project) - - // Then - XCTAssertEmpty(sideEffects) - let configurations = mappedProject.targets - .map(\.settings) - .map { $0?.configurations } - - XCTAssertEqual(configurations.first, expectedConfigurations) - } -} diff --git a/Tests/TuistSigningTests/SigningMatcherTests.swift b/Tests/TuistSigningTests/SigningMatcherTests.swift deleted file mode 100644 index 45f8733266a..00000000000 --- a/Tests/TuistSigningTests/SigningMatcherTests.swift +++ /dev/null @@ -1,148 +0,0 @@ -import TSCBasic -import TuistCore -import XCTest -@testable import TuistSigning -@testable import TuistSigningTesting -@testable import TuistSupportTesting - -final class SigningMatcherTests: TuistUnitTestCase { - var subject: SigningMatcher! - var signingFilesLocator: MockSigningFilesLocator! - var provisioningProfileParser: MockProvisioningProfileParser! - var certificateParser: MockCertificateParser! - - override func setUp() { - super.setUp() - - signingFilesLocator = MockSigningFilesLocator() - provisioningProfileParser = MockProvisioningProfileParser() - certificateParser = MockCertificateParser() - - subject = SigningMatcher( - signingFilesLocator: signingFilesLocator, - provisioningProfileParser: provisioningProfileParser, - certificateParser: certificateParser - ) - } - - override func tearDown() { - subject = nil - signingFilesLocator = nil - provisioningProfileParser = nil - certificateParser = nil - super.tearDown() - } - - func test_locates_certificates_from_entry_path() throws { - // Given - let entryPath = try temporaryPath() - var locatePath: AbsolutePath? - signingFilesLocator.locateUnencryptedCertificatesStub = { - locatePath = $0 - return [] - } - - // When - _ = try subject.match(from: entryPath) - - // Then - XCTAssertEqual(entryPath, locatePath) - } - - func test_match_returns_pairs() throws { - // Given - let debugConfiguration = "debug" - let releaseConfiguration = "release" - let date = Date() - let targetName = "TargetOne" - let publicKeyPath = try AbsolutePath(validating: "/\(targetName)/\(debugConfiguration).cer") - let privateKeyPath = try AbsolutePath(validating: "/\(targetName)/\(debugConfiguration).p12") - let releasePublicKeyPath = try AbsolutePath(validating: "/\(targetName)/\(releaseConfiguration).cer") - let releasePrivateKeyPath = try AbsolutePath(validating: "/\(targetName)/\(releaseConfiguration).p12") - signingFilesLocator.locateUnencryptedCertificatesStub = { _ in - [ - publicKeyPath, - releasePublicKeyPath, - ] - } - signingFilesLocator.locateUnencryptedPrivateKeysStub = { _ in - [ - privateKeyPath, - releasePrivateKeyPath, - ] - } - certificateParser.parseStub = { publicKey, privateKey in - let fingerprint: String - if publicKey == publicKeyPath { - fingerprint = "fingerprint" - } else { - fingerprint = "otherFingerprint" - } - return Certificate.test( - publicKey: publicKey, - privateKey: privateKey, - fingerprint: fingerprint - ) - } - - let expectedCertificates: [String: Certificate] = [ - "fingerprint": Certificate.test( - publicKey: publicKeyPath, - privateKey: privateKeyPath, - fingerprint: "fingerprint" - ), - "otherFingerprint": Certificate.test( - publicKey: releasePublicKeyPath, - privateKey: releasePrivateKeyPath, - fingerprint: "otherFingerprint" - ), - ] - - let debugProvisioningProfilePath = try AbsolutePath(validating: "/\(targetName).\(debugConfiguration).mobileprovision") - let releaseProvisioningProfilePath = - try AbsolutePath(validating: "/\(targetName).\(releaseConfiguration).mobileprovision") - signingFilesLocator.locateProvisioningProfilesStub = { _ in - [ - debugProvisioningProfilePath, - releaseProvisioningProfilePath, - ] - } - provisioningProfileParser.parseStub = { profilePath in - let configurationName: String - if profilePath == debugProvisioningProfilePath { - configurationName = debugConfiguration - } else { - configurationName = releaseConfiguration - } - return ProvisioningProfile.test( - path: profilePath, - targetName: targetName, - configurationName: configurationName, - expirationDate: date - ) - } - let expectedProvisioningProfiles: [String: [String: ProvisioningProfile]] = [ - targetName: [ - debugConfiguration: ProvisioningProfile.test( - path: debugProvisioningProfilePath, - targetName: targetName, - configurationName: debugConfiguration, - expirationDate: date - ), - releaseConfiguration: ProvisioningProfile.test( - path: releaseProvisioningProfilePath, - targetName: targetName, - configurationName: releaseConfiguration, - expirationDate: date - ), - ], - ] - - // When - let (certificates, provisioningProfiles) = try subject.match(from: try temporaryPath()) - - // Then - XCTAssertEqual(certificates, expectedCertificates) - XCTAssertEqual(provisioningProfiles, expectedProvisioningProfiles) - } -} diff --git a/Tests/TuistSupportTests/SwiftPackageManager/PackageInfoTests.swift b/Tests/TuistSupportTests/SwiftPackageManager/PackageInfoTests.swift new file mode 100644 index 00000000000..abf5d0923e5 --- /dev/null +++ b/Tests/TuistSupportTests/SwiftPackageManager/PackageInfoTests.swift @@ -0,0 +1,55 @@ +import Foundation +import TSCUtility +import XCTest + +@testable import TuistSupport + +final class PackageInfoTests: XCTestCase { + func test_packageInfo_codable() { + XCTAssertCodable( + PackageInfo( + products: [ + PackageInfo.Product(name: "tuist", type: .executable, targets: ["tuist"]), + PackageInfo.Product(name: "tuist", type: .library(.dynamic), targets: ["ProjectDescription"]), + ], + targets: [ + PackageInfo.Target( + name: "tuist", + path: nil, + url: nil, + sources: nil, + resources: [], + exclude: [], + dependencies: [ + .target(name: "TuistKit", condition: nil), + .byName(name: "TuistSupport", condition: nil), + .product( + name: "ArgumentParser", + package: "argument-parser", + moduleAliases: ["TuistSupport": "InternalTuistSupport"], + condition: nil + ), + ], + publicHeadersPath: nil, + type: .executable, + settings: [ + PackageInfo.Target.TargetBuildSettingDescription.Setting( + tool: .linker, + name: .linkedLibrary, + condition: PackageInfo.PackageConditionDescription(platformNames: ["iOS"], config: nil), + value: ["ProjectDescription"] + ), + ], + checksum: nil + ), + ], + platforms: [ + PackageInfo.Platform(platformName: "iOS", version: "17.2", options: []), + ], + cLanguageStandard: nil, + cxxLanguageStandard: nil, + swiftLanguageVersions: [Version(stringLiteral: "5.4.9")] + ) + ) + } +} diff --git a/Tuist/Config.swift b/Tuist/Config.swift index 7afbc98fdc7..b59e66aa51c 100644 --- a/Tuist/Config.swift +++ b/Tuist/Config.swift @@ -6,6 +6,6 @@ let config = Config( url: "https://cloud.tuist.io", options: [.optional] ), - swiftVersion: .init("5.8"), + swiftVersion: .init("5.9"), generationOptions: .options(enforceExplicitDependencies: true) ) diff --git a/Tuist/Package.resolved b/Tuist/Package.resolved index e8653e8167e..2e97e37c199 100644 --- a/Tuist/Package.resolved +++ b/Tuist/Package.resolved @@ -37,12 +37,12 @@ } }, { - "identity" : "cryptoswift", + "identity" : "difference", "kind" : "remoteSourceControl", - "location" : "https://github.com/krzyzanowskim/CryptoSwift.git", + "location" : "https://github.com/krzysztofzablocki/Difference.git", "state" : { - "revision" : "db51c407d3be4a051484a141bf0bff36c43d3b1e", - "version" : "1.8.0" + "revision" : "f627d00718033c3d7888acd5f4e3524a843db1cf", + "version" : "1.0.2" } }, { diff --git a/Tuist/Package.swift b/Tuist/Package.swift index 54e22a9c051..009a6c1df16 100644 --- a/Tuist/Package.swift +++ b/Tuist/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 5.7 +// swift-tools-version: 5.9 import PackageDescription let package = Package( @@ -13,12 +13,12 @@ let package = Package( .package(url: "https://github.com/weichsel/ZIPFoundation", from: "0.9.17"), .package(url: "https://github.com/httpswift/swifter", revision: "1e4f51c92d7ca486242d8bf0722b99de2c3531aa"), .package(url: "https://github.com/kishikawakatsumi/KeychainAccess", from: "4.2.2"), - .package(url: "https://github.com/krzyzanowskim/CryptoSwift", from: "1.8.0"), .package(url: "https://github.com/stencilproject/Stencil", from: "0.15.1"), .package(url: "https://github.com/SwiftDocOrg/GraphViz", exact: "0.2.0"), .package(url: "https://github.com/SwiftGen/StencilSwiftKit", from: "2.10.1"), .package(url: "https://github.com/SwiftGen/SwiftGen", from: "6.6.2"), .package(url: "https://github.com/tuist/XcodeProj", from: "8.15.0"), .package(url: "https://github.com/cpisciotta/xcbeautify", from: "1.4.0"), + .package(url: "https://github.com/krzysztofzablocki/Difference.git", from: "1.0.2"), ] ) diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Manifests/project.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Manifests/project.md index c3cdc0df680..015696b2ba6 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Manifests/project.md +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Manifests/project.md @@ -10,7 +10,7 @@ import ProjectDescription let project = Project( name: "MyProject", targets: [ - Target( + .target( name: "App", platform: .iOS, product: .app, diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/Package.swift b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/Package.swift index a249e44f571..50334783781 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/Package.swift +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 5.8 +// swift-tools-version: 5.9 import PackageDescription #if TUIST diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/Project.swift b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/Project.swift index 19cb9db09de..839f6f2dd99 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/Project.swift +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/Project.swift @@ -4,7 +4,7 @@ let project = Project( name: "App", organizationName: "tuist.io", targets: [ - Target( + .target( name: "App", destinations: [.iPhone], product: .app, diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Create Project/inital-project-templates.swift b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Create Project/inital-project-templates.swift index 1cd046a7089..b89bf192d87 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Create Project/inital-project-templates.swift +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Create Project/inital-project-templates.swift @@ -27,7 +27,7 @@ extension Project { /// Helper function to create a framework target and an associated unit test target private static func makeFrameworkTargets(name: String, destinations: Destinations) -> [Target] { - let sources = Target( + let sources = .target( name: name, destinations: destinations, product: .framework, @@ -37,7 +37,7 @@ extension Project { resources: [], dependencies: [] ) - let tests = Target( + let tests = .target( name: "\(name)Tests", destinations: destinations, product: .unitTests, @@ -60,7 +60,7 @@ extension Project { "UILaunchStoryboardName": "LaunchScreen", ] - let mainTarget = Target( + let mainTarget = .target( name: name, destinations: destinations, product: .app, @@ -71,7 +71,7 @@ extension Project { dependencies: dependencies ) - let testTarget = Target( + let testTarget = .target( name: "\(name)Tests", destinations: destinations, product: .unitTests, diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/dependencies.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/dependencies.md index dce1a9a2260..1b327523b03 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/dependencies.md +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/dependencies.md @@ -85,7 +85,7 @@ let project = Project(name: "MyProject", packages: [ And then reference them from your targets: ```swift -let target = Target(name: "MyTarget", dependencies: [ +let target = .target(name: "MyTarget", dependencies: [ .package(product: "CryptoSwift", type: .runtime) ]) ``` diff --git a/fixtures/app_with_build_rules/Project.swift b/fixtures/app_with_build_rules/Project.swift index a7a9e6919d9..a0c7bd78d60 100644 --- a/fixtures/app_with_build_rules/Project.swift +++ b/fixtures/app_with_build_rules/Project.swift @@ -4,14 +4,14 @@ let project = Project( name: "App", organizationName: "Tuist", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", sources: ["App/*"], buildRules: [ - .init( + .buildRule( name: "Process_InfoPlist.strings", fileType: .sourceFilesWithNamesMatching, filePatterns: "*/InfoPlist.strings", diff --git a/fixtures/app_with_framework_and_tests/Project.swift b/fixtures/app_with_framework_and_tests/Project.swift index 789701b0103..aa3492ed550 100644 --- a/fixtures/app_with_framework_and_tests/Project.swift +++ b/fixtures/app_with_framework_and_tests/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app", infoPlist: "Info.plist", @@ -14,9 +14,9 @@ let project = Project( .target(name: "Framework"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.appTests", infoPlist: "Info.plist", @@ -25,9 +25,9 @@ let project = Project( .target(name: "App"), ] ), - Target( + .target( name: "Framework", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.framework", infoPlist: "Info.plist", @@ -35,9 +35,9 @@ let project = Project( dependencies: [ ] ), - Target( + .target( name: "FrameworkTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.frameworkTests", infoPlist: "Info.plist", @@ -48,7 +48,7 @@ let project = Project( ), ], schemes: [ - Scheme( + .scheme( name: "AppCustomScheme", buildAction: .buildAction(targets: [TargetReference("App")]) ), diff --git a/fixtures/app_with_organization_name_project/Project.swift b/fixtures/app_with_organization_name_project/Project.swift index 0ee8146ee68..8f56f6ce597 100644 --- a/fixtures/app_with_organization_name_project/Project.swift +++ b/fixtures/app_with_organization_name_project/Project.swift @@ -4,9 +4,9 @@ let project = Project( name: "App", organizationName: "Tuist", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app", infoPlist: "Info.plist", diff --git a/fixtures/app_with_plugins/Project.swift b/fixtures/app_with_plugins/Project.swift index a6e250ad453..ec19286bbf7 100644 --- a/fixtures/app_with_plugins/Project.swift +++ b/fixtures/app_with_plugins/Project.swift @@ -10,6 +10,6 @@ let remoteHelper = RemoteHelper(name: "RemotePlugin") let project = Project.app( name: "TuistPluginTest", - platform: .iOS, + destinations: .iOS, additionalTargets: ["TuistPluginTestKit", "TuistPluginTestUI"] ) diff --git a/fixtures/app_with_plugins/Tuist/Dependencies.swift b/fixtures/app_with_plugins/Tuist/Dependencies.swift deleted file mode 100644 index c8c92490384..00000000000 --- a/fixtures/app_with_plugins/Tuist/Dependencies.swift +++ /dev/null @@ -1,14 +0,0 @@ -import ExampleTuistPlugin -import LocalPlugin -import ProjectDescription - -// Note: Testing importing of plugins in local helpers -let localPlugin = LocalHelper(name: "local") -let remotePlugin = RemoteHelper(name: "remote") - -let dependencies = Dependencies( - swiftPackageManager: .init( - targetSettings: [:] - ), - platforms: [.iOS, .macOS] -) diff --git a/fixtures/app_with_plugins/Tuist/Package.swift b/fixtures/app_with_plugins/Tuist/Package.swift index 2eee767569e..a93a11c95d2 100644 --- a/fixtures/app_with_plugins/Tuist/Package.swift +++ b/fixtures/app_with_plugins/Tuist/Package.swift @@ -1,6 +1,21 @@ // swift-tools-version: 5.8 import PackageDescription +#if TUIST + import ExampleTuistPlugin + import LocalPlugin + import ProjectDescription + + // Note: Testing importing of plugins in local helpers + let localPlugin = LocalHelper(name: "local") + let remotePlugin = RemoteHelper(name: "remote") + + let packageSettings = PackageSettings( + platforms: [.iOS, .macOS] + ) + +#endif + let package = Package( name: "PackageName", dependencies: [] diff --git a/fixtures/app_with_plugins/Tuist/ProjectDescriptionHelpers/Project+Templates.swift b/fixtures/app_with_plugins/Tuist/ProjectDescriptionHelpers/Project+Templates.swift index 39ceb9800e5..a4fe5a96e8e 100644 --- a/fixtures/app_with_plugins/Tuist/ProjectDescriptionHelpers/Project+Templates.swift +++ b/fixtures/app_with_plugins/Tuist/ProjectDescriptionHelpers/Project+Templates.swift @@ -4,14 +4,14 @@ import ProjectDescription extension Project { /// Helper function to create the Project for this ExampleApp - public static func app(name: String, platform: Platform, additionalTargets _: [String]) -> Project { + public static func app(name: String, destinations: Destinations, additionalTargets _: [String]) -> Project { // Note: Testing importing of plugins in local helpers _ = LocalHelper(name: "local") _ = RemoteHelper(name: "remote") - let mainTarget = Target( + let mainTarget: Target = .target( name: name, - platform: platform, + destinations: destinations, product: .app, bundleId: "io.tuist.\(name)", infoPlist: .default, diff --git a/fixtures/app_with_spm_dependencies/App/Project.swift b/fixtures/app_with_spm_dependencies/App/Project.swift index 99f21142c04..b84d8089fdd 100644 --- a/fixtures/app_with_spm_dependencies/App/Project.swift +++ b/fixtures/app_with_spm_dependencies/App/Project.swift @@ -5,9 +5,9 @@ let project = Project( name: "App", settings: .projectSettings, targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app", infoPlist: .default, @@ -19,9 +19,9 @@ let project = Project( ], settings: .targetSettings ), - Target( + .target( name: "AppKit", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.app.kit", infoPlist: .default, @@ -33,9 +33,9 @@ let project = Project( ], settings: .targetSettings ), - Target( + .target( name: "WatchApp", - platform: .watchOS, + destinations: [.appleWatch], product: .watch2App, bundleId: "io.tuist.app.watchapp", infoPlist: .extendingDefault( @@ -48,9 +48,9 @@ let project = Project( .target(name: "WatchExtension"), ] ), - Target( + .target( name: "WatchExtension", - platform: .watchOS, + destinations: [.appleWatch], product: .watch2Extension, bundleId: "io.tuist.app.watchapp.extension", sources: ["Sources/Watch/Extension/**"], diff --git a/fixtures/app_with_spm_dependencies/Features/FeatureOne/Project.swift b/fixtures/app_with_spm_dependencies/Features/FeatureOne/Project.swift index 78fc4e97174..381609133bb 100644 --- a/fixtures/app_with_spm_dependencies/Features/FeatureOne/Project.swift +++ b/fixtures/app_with_spm_dependencies/Features/FeatureOne/Project.swift @@ -5,9 +5,9 @@ let project = Project( name: "FeatureOne", settings: .projectSettings, targets: [ - Target( + .target( name: "FeatureOneFramework_iOS", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.featureOne", sources: ["Sources/**"], @@ -16,9 +16,9 @@ let project = Project( ], settings: .targetSettings ), - Target( + .target( name: "FeatureOneFramework_watchOS", - platform: .watchOS, + destinations: [.appleWatch], product: .framework, bundleId: "io.tuist.featureOne", sources: ["Sources/**"], diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.swift b/fixtures/app_with_spm_dependencies/Tuist/Package.swift index 2eea13cbc7a..8a10608372f 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/Package.swift +++ b/fixtures/app_with_spm_dependencies/Tuist/Package.swift @@ -20,7 +20,7 @@ let package = Package( dependencies: [ .package(url: "https://github.com/Alamofire/Alamofire", exact: "5.8.0"), .package(url: "https://github.com/pointfreeco/swift-composable-architecture", .upToNextMinor(from: "1.5.0")), - .package(path: "../../../LocalSwiftPackage"), - .package(path: "../../../StringifyMacro"), + .package(path: "../LocalSwiftPackage"), + .package(path: "../StringifyMacro"), ] ) diff --git a/fixtures/app_with_spm_dependencies/Tuist/ProjectDescriptionHelpers/Scheme+Templates.swift b/fixtures/app_with_spm_dependencies/Tuist/ProjectDescriptionHelpers/Scheme+Templates.swift index 30c868338ac..1514659f5b1 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/ProjectDescriptionHelpers/Scheme+Templates.swift +++ b/fixtures/app_with_spm_dependencies/Tuist/ProjectDescriptionHelpers/Scheme+Templates.swift @@ -52,28 +52,4 @@ extension Scheme { .map { scheme(for: $0, target: target, executable: executable) } } } - - public static func scheme( - name: String, - shared: Bool = true, - hidden: Bool = false, - buildAction: ProjectDescription.BuildAction? = nil, - testAction: ProjectDescription.TestAction? = nil, - runAction: ProjectDescription.RunAction? = nil, - archiveAction: ProjectDescription.ArchiveAction? = nil, - profileAction: ProjectDescription.ProfileAction? = nil, - analyzeAction: ProjectDescription.AnalyzeAction? = nil - ) -> Scheme { - Scheme( - name: name, - shared: shared, - hidden: hidden, - buildAction: buildAction, - testAction: testAction, - runAction: runAction, - archiveAction: archiveAction, - profileAction: profileAction, - analyzeAction: analyzeAction - ) - } } diff --git a/fixtures/app_with_tasks/Project.swift b/fixtures/app_with_tasks/Project.swift index 71c6a391fdb..cd890817d70 100644 --- a/fixtures/app_with_tasks/Project.swift +++ b/fixtures/app_with_tasks/Project.swift @@ -22,6 +22,6 @@ import ProjectDescriptionHelpers // Creates our project using a helper function defined in ProjectDescriptionHelpers let project = Project.app( name: "App", - platform: .iOS, + destinations: .iOS, additionalTargets: ["AppKit", "AppUI"] ) diff --git a/fixtures/app_with_tasks/Tuist/ProjectDescriptionHelpers/Project+Templates.swift b/fixtures/app_with_tasks/Tuist/ProjectDescriptionHelpers/Project+Templates.swift index 783f3223cb5..3b67c6db491 100644 --- a/fixtures/app_with_tasks/Tuist/ProjectDescriptionHelpers/Project+Templates.swift +++ b/fixtures/app_with_tasks/Tuist/ProjectDescriptionHelpers/Project+Templates.swift @@ -25,7 +25,7 @@ extension Project { /// Helper function to create a framework target and an associated unit test target private static func makeFrameworkTargets(name: String, platform: Platform) -> [Target] { - let sources = Target( + let sources = .target( name: name, platform: platform, product: .framework, @@ -35,7 +35,7 @@ extension Project { resources: [], dependencies: [] ) - let tests = Target( + let tests = .target( name: "\(name)Tests", platform: platform, product: .unitTests, @@ -62,7 +62,7 @@ extension Project { "aps-environment": "development", ] - let mainTarget = Target( + let mainTarget: Target = .target( name: name, platform: platform, product: .app, @@ -74,7 +74,7 @@ extension Project { dependencies: dependencies ) - let testTarget = Target( + let testTarget: Target = .target( name: "\(name)Tests", platform: platform, product: .unitTests, diff --git a/fixtures/app_with_test_plan/Project.swift b/fixtures/app_with_test_plan/Project.swift index 31986e95f89..c210c12c83b 100644 --- a/fixtures/app_with_test_plan/Project.swift +++ b/fixtures/app_with_test_plan/Project.swift @@ -4,18 +4,18 @@ let project = Project( name: "App", organizationName: "tuist.io", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: [.iPhone], product: .app, bundleId: "io.tuist.app", - deploymentTarget: .iOS(targetVersion: "13.0", devices: .iphone), + deploymentTargets: .iOS("13.0"), infoPlist: .default, sources: ["Targets/App/Sources/**"] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: .default, @@ -24,12 +24,12 @@ let project = Project( .target(name: "App"), ] ), - Target( + .target( name: "MacFramework", - platform: .macOS, + destinations: [.mac], product: .framework, bundleId: "io.tuist.MacFramework", - deploymentTarget: .macOS(targetVersion: "10.15"), + deploymentTargets: .macOS("10.15"), infoPlist: .default, sources: "Targets/MacFramework/Sources/**", settings: .settings( @@ -39,12 +39,12 @@ let project = Project( ] ) ), - Target( + .target( name: "MacFrameworkTests", - platform: .macOS, + destinations: [.mac], product: .unitTests, bundleId: "io.tuist.MacFrameworkTests", - deploymentTarget: .macOS(targetVersion: "10.15"), + deploymentTargets: .macOS("10.15"), infoPlist: .default, sources: "Targets/MacFramework/Tests/**", dependencies: [ @@ -59,9 +59,9 @@ let project = Project( ), ], schemes: [ - Scheme( + .scheme( name: "App", - buildAction: BuildAction(targets: ["App"]), + buildAction: .buildAction(targets: ["App"]), testAction: .testPlans([.relativeToManifest("All.xctestplan")]), runAction: .runAction( configuration: .debug, diff --git a/fixtures/app_with_tests/Project.swift b/fixtures/app_with_tests/Project.swift index cd6972937a6..f4818b685b2 100644 --- a/fixtures/app_with_tests/Project.swift +++ b/fixtures/app_with_tests/Project.swift @@ -4,18 +4,18 @@ let project = Project( name: "App", organizationName: "tuist.io", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: [.iPhone], product: .app, bundleId: "io.tuist.app", - deploymentTarget: .iOS(targetVersion: "13.0", devices: .iphone), + deploymentTargets: .iOS("13.0"), infoPlist: .default, sources: ["Targets/App/Sources/**"] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: .default, @@ -24,17 +24,17 @@ let project = Project( .target(name: "App"), ] ), - Target( + .target( name: "tvOSFramework", - platform: .tvOS, + destinations: [.appleTv], product: .framework, bundleId: "io.tuist.tvOSFramework", infoPlist: .default, sources: "Targets/tvOSFramework/Sources/**" ), - Target( + .target( name: "tvOSFrameworkTests", - platform: .tvOS, + destinations: [.appleTv], product: .unitTests, bundleId: "io.tuist.tvOSFrameworkTests", infoPlist: .default, @@ -43,12 +43,12 @@ let project = Project( .target(name: "tvOSFramework"), ] ), - Target( + .target( name: "MacFramework", - platform: .macOS, + destinations: [.mac], product: .framework, bundleId: "io.tuist.MacFramework", - deploymentTarget: .macOS(targetVersion: "10.15"), + deploymentTargets: .macOS("10.15"), infoPlist: .default, sources: "Targets/MacFramework/Sources/**", settings: .settings( @@ -58,12 +58,12 @@ let project = Project( ] ) ), - Target( + .target( name: "MacFrameworkTests", - platform: .macOS, + destinations: [.mac], product: .unitTests, bundleId: "io.tuist.MacFrameworkTests", - deploymentTarget: .macOS(targetVersion: "10.15"), + deploymentTargets: .macOS("10.15"), infoPlist: .default, sources: "Targets/MacFramework/Tests/**", dependencies: [ diff --git a/fixtures/command_line_tool_basic/Project.swift b/fixtures/command_line_tool_basic/Project.swift index 22b5c1d33b6..c58aac1267e 100644 --- a/fixtures/command_line_tool_basic/Project.swift +++ b/fixtures/command_line_tool_basic/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "CommandLineTool", targets: [ - Target( + .target( name: "CommandLineTool", - platform: .macOS, + destinations: [.mac], product: .commandLineTool, bundleId: "com.example.commandlinetool", infoPlist: .default, diff --git a/fixtures/command_line_tool_with_dynamic_framework/Project.swift b/fixtures/command_line_tool_with_dynamic_framework/Project.swift index 7671bef9ccb..137199a92e1 100644 --- a/fixtures/command_line_tool_with_dynamic_framework/Project.swift +++ b/fixtures/command_line_tool_with_dynamic_framework/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "CommandLineTool", targets: [ - Target( + .target( name: "CommandLineTool", - platform: .macOS, + destinations: [.mac], product: .commandLineTool, bundleId: "com.example.commandlinetool", infoPlist: .default, @@ -14,9 +14,9 @@ let project = Project( .target(name: "DynamicFramework"), ] ), - Target( + .target( name: "DynamicFramework", - platform: .macOS, + destinations: [.mac], product: .framework, bundleId: "com.example.dynamicframework", infoPlist: .default, diff --git a/fixtures/command_line_tool_with_dynamic_library/Project.swift b/fixtures/command_line_tool_with_dynamic_library/Project.swift index 016925ebfd6..6a831bc49a4 100644 --- a/fixtures/command_line_tool_with_dynamic_library/Project.swift +++ b/fixtures/command_line_tool_with_dynamic_library/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "CommandLineTool", targets: [ - Target( + .target( name: "CommandLineTool", - platform: .macOS, + destinations: [.mac], product: .commandLineTool, bundleId: "com.example.commandlinetool", infoPlist: .default, @@ -14,9 +14,9 @@ let project = Project( .target(name: "DynamicLib"), ] ), - Target( + .target( name: "DynamicLib", - platform: .macOS, + destinations: [.mac], product: .dynamicLibrary, bundleId: "com.example.dynamiclib", infoPlist: .default, diff --git a/fixtures/command_line_tool_with_static_library/Project.swift b/fixtures/command_line_tool_with_static_library/Project.swift index f4d6b1cf8ef..046ed26911c 100644 --- a/fixtures/command_line_tool_with_static_library/Project.swift +++ b/fixtures/command_line_tool_with_static_library/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "CommandLineTool", targets: [ - Target( + .target( name: "CommandLineTool", - platform: .macOS, + destinations: [.mac], product: .commandLineTool, bundleId: "com.example.commandlinetool", infoPlist: .default, @@ -14,9 +14,9 @@ let project = Project( .target(name: "StaticLib"), ] ), - Target( + .target( name: "StaticLib", - platform: .macOS, + destinations: [.mac], product: .staticLibrary, bundleId: "com.example.staticlib", infoPlist: .default, diff --git a/fixtures/framework_with_environment_variables/Project.swift b/fixtures/framework_with_environment_variables/Project.swift index b0de99fb456..20e7775c999 100644 --- a/fixtures/framework_with_environment_variables/Project.swift +++ b/fixtures/framework_with_environment_variables/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework", targets: [ - Target( + .target( name: Environment.frameworkName.getString(default: "Framework"), - platform: .macOS, + destinations: [.mac], product: .framework, bundleId: "io.tuist.App", infoPlist: .default, diff --git a/fixtures/framework_with_native_swift_macro/Project.swift b/fixtures/framework_with_native_swift_macro/Project.swift index 8605240763d..fde74208d84 100644 --- a/fixtures/framework_with_native_swift_macro/Project.swift +++ b/fixtures/framework_with_native_swift_macro/Project.swift @@ -3,7 +3,7 @@ import ProjectDescription let project = Project( name: "FrameworkWithSwiftMacro", targets: [ - Target( + .target( name: "Framework", destinations: [.iPhone, .mac], product: .staticLibrary, diff --git a/fixtures/framework_with_native_swift_macro/Tuist/Dependencies.swift b/fixtures/framework_with_native_swift_macro/Tuist/Dependencies.swift deleted file mode 100644 index d4564a8262b..00000000000 --- a/fixtures/framework_with_native_swift_macro/Tuist/Dependencies.swift +++ /dev/null @@ -1,8 +0,0 @@ -import ProjectDescription - -let dependencies = Dependencies( - swiftPackageManager: .init( - targetSettings: [:] - ), - platforms: [.macOS, .iOS] -) diff --git a/fixtures/framework_with_swift_macro/Project.swift b/fixtures/framework_with_swift_macro/Project.swift index a34684acdc4..48cdedcd94c 100644 --- a/fixtures/framework_with_swift_macro/Project.swift +++ b/fixtures/framework_with_swift_macro/Project.swift @@ -7,9 +7,9 @@ let project = Project( .remote(url: "https://github.com/pointfreeco/swift-composable-architecture", requirement: .exact("1.4.0")), ], targets: [ - Target( + .target( name: "Framework", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.FrameworkWithSwiftMacro", sources: ["Sources/**/*"], diff --git a/fixtures/ios_app_large/Project.swift b/fixtures/ios_app_large/Project.swift index 5d58e3bbc56..225feb0e96b 100644 --- a/fixtures/ios_app_large/Project.swift +++ b/fixtures/ios_app_large/Project.swift @@ -1,9 +1,9 @@ import ProjectDescription func target(name: String) -> Target { - Target( + .target( name: name, - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.\(name)", infoPlist: .file(path: .relativeToManifest("Info.plist")), diff --git a/fixtures/ios_app_with_actions/App With Space/Project.swift b/fixtures/ios_app_with_actions/App With Space/Project.swift index 3a82817f263..9eadfe0f08c 100644 --- a/fixtures/ios_app_with_actions/App With Space/Project.swift +++ b/fixtures/ios_app_with_actions/App With Space/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "AppWithSpace", targets: [ - Target( + .target( name: "AppWithSpace", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app-with-space", infoPlist: "Info.plist", diff --git a/fixtures/ios_app_with_actions/App/Project.swift b/fixtures/ios_app_with_actions/App/Project.swift index 665a45c7b82..e220a783b03 100644 --- a/fixtures/ios_app_with_actions/App/Project.swift +++ b/fixtures/ios_app_with_actions/App/Project.swift @@ -6,9 +6,9 @@ let project = Project( .remote(url: "https://github.com/realm/SwiftLint", requirement: .exact("0.52.4")), ], targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app", infoPlist: "Info.plist", diff --git a/fixtures/ios_app_with_appclip/Project.swift b/fixtures/ios_app_with_appclip/Project.swift index dbca417e772..8e55428408a 100644 --- a/fixtures/ios_app_with_appclip/Project.swift +++ b/fixtures/ios_app_with_appclip/Project.swift @@ -4,9 +4,9 @@ let project = Project( name: "App", organizationName: "Tuist", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: .default, @@ -15,27 +15,27 @@ let project = Project( .target(name: "AppClip1"), ] ), - Target( + .target( name: "Framework", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.Framework", infoPlist: .default, sources: ["Framework/Sources/**"], dependencies: [] ), - Target( + .target( name: "StaticFramework", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.StaticFramework", infoPlist: .default, sources: ["StaticFramework/Sources/**"], dependencies: [] ), - Target( + .target( name: "AppClip1", - platform: .iOS, + destinations: .iOS, product: .appClip, bundleId: "io.tuist.App.Clip", infoPlist: .default, @@ -46,9 +46,9 @@ let project = Project( .target(name: "StaticFramework"), ] ), - Target( + .target( name: "AppClip1Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppClip1Tests", infoPlist: .default, @@ -58,9 +58,9 @@ let project = Project( .target(name: "StaticFramework"), ] ), - Target( + .target( name: "AppClip1UITests", - platform: .iOS, + destinations: .iOS, product: .uiTests, bundleId: "io.tuist.AppClip1UITests", infoPlist: .default, diff --git a/fixtures/ios_app_with_build_variables/App/Project.swift b/fixtures/ios_app_with_build_variables/App/Project.swift index 3acb146de1c..0c8be7f5bd4 100644 --- a/fixtures/ios_app_with_build_variables/App/Project.swift +++ b/fixtures/ios_app_with_build_variables/App/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app", infoPlist: "Info.plist", diff --git a/fixtures/ios_app_with_coredata/Project.swift b/fixtures/ios_app_with_coredata/Project.swift index 3adf3019601..b2f01994781 100644 --- a/fixtures/ios_app_with_coredata/Project.swift +++ b/fixtures/ios_app_with_coredata/Project.swift @@ -3,17 +3,17 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app", infoPlist: "Info.plist", sources: ["Sources/**"], coreDataModels: [ - CoreDataModel("CoreData/Users.xcdatamodeld", currentVersion: "1"), - CoreDataModel("CoreData/UsersAutoDetect.xcdatamodeld"), - CoreDataModel("CoreData/Unversioned.xcdatamodeld"), + .coreDataModel("CoreData/Users.xcdatamodeld", currentVersion: "1"), + .coreDataModel("CoreData/UsersAutoDetect.xcdatamodeld"), + .coreDataModel("CoreData/Unversioned.xcdatamodeld"), ] ), ] diff --git a/fixtures/ios_app_with_coredata_in_static_framework/App/Project.swift b/fixtures/ios_app_with_coredata_in_static_framework/App/Project.swift index c24063b9418..ee6bbd6d124 100644 --- a/fixtures/ios_app_with_coredata_in_static_framework/App/Project.swift +++ b/fixtures/ios_app_with_coredata_in_static_framework/App/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Config/App-Info.plist", diff --git a/fixtures/ios_app_with_coredata_in_static_framework/Framework/Project.swift b/fixtures/ios_app_with_coredata_in_static_framework/Framework/Project.swift index 5cf480665fd..45a839d8eab 100644 --- a/fixtures/ios_app_with_coredata_in_static_framework/Framework/Project.swift +++ b/fixtures/ios_app_with_coredata_in_static_framework/Framework/Project.swift @@ -3,15 +3,15 @@ import ProjectDescription let project = Project( name: "Framework", targets: [ - Target( + .target( name: "Framework", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.framework", infoPlist: .default, sources: ["Sources/**"], coreDataModels: [ - CoreDataModel("CoreData/Users.xcdatamodeld"), + .coreDataModel("CoreData/Users.xcdatamodeld"), ] ), ] diff --git a/fixtures/ios_app_with_custom_configuration/Tuist/Config.swift b/fixtures/ios_app_with_custom_configuration/Tuist/Config.swift index 352d33d3d19..ff8e64fa9ee 100644 --- a/fixtures/ios_app_with_custom_configuration/Tuist/Config.swift +++ b/fixtures/ios_app_with_custom_configuration/Tuist/Config.swift @@ -1,8 +1,3 @@ import ProjectDescription -let config = Config( - cache: .cache( - profiles: [.profile(name: "Simulator", configuration: "debug", device: "iPhone 14 Pro")], - path: .relativeToRoot("TuistCloud") - ) -) +let config = Config() diff --git a/fixtures/ios_app_with_custom_configuration/Tuist/ProjectDescriptionHelpers/Project+Templates.swift b/fixtures/ios_app_with_custom_configuration/Tuist/ProjectDescriptionHelpers/Project+Templates.swift index 73ed202ebca..3966a95ab17 100644 --- a/fixtures/ios_app_with_custom_configuration/Tuist/ProjectDescriptionHelpers/Project+Templates.swift +++ b/fixtures/ios_app_with_custom_configuration/Tuist/ProjectDescriptionHelpers/Project+Templates.swift @@ -62,12 +62,12 @@ extension Target { dependencies: [TargetDependency], resources: ResourceFileElements? = nil ) -> Target { - Target( + .target( name: name, - platform: .iOS, + destinations: [.iPhone], product: product, bundleId: "tuist.io.\(name)", - deploymentTarget: .deploymentTarget, + deploymentTargets: .iOS("11.0"), infoPlist: .default, sources: ["Sources/**"], resources: resources, @@ -78,9 +78,9 @@ extension Target { public static func test( name: String ) -> Target { - Target( + .target( name: "\(name)Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "tuist.io..\(name)Tests", infoPlist: .default, @@ -90,31 +90,20 @@ extension Target { } } -extension DeploymentTarget { - static var deploymentTarget: DeploymentTarget { - .iOS( - targetVersion: "11.0", - devices: [.iphone] - ) - } -} - extension Scheme { static func scheme( name: String, mainTargetName: String, testTargetName: String ) -> Scheme { - let main = TargetReference( - projectPath: nil, - target: mainTargetName + let main: TargetReference = .target( + mainTargetName ) - let test = TargetReference( - projectPath: nil, - target: testTargetName + let test: TargetReference = .target( + testTargetName ) - return Scheme( + return .scheme( name: name, shared: true, buildAction: .buildAction(targets: [ @@ -122,7 +111,7 @@ extension Scheme { ]), testAction: .targets( [ - TestableTarget(target: test), + .testableTarget(target: test), ], configuration: "debug" ), diff --git a/fixtures/ios_app_with_custom_development_region/Project.swift b/fixtures/ios_app_with_custom_development_region/Project.swift index 713eb7b167b..81907ed0e13 100644 --- a/fixtures/ios_app_with_custom_development_region/Project.swift +++ b/fixtures/ios_app_with_custom_development_region/Project.swift @@ -6,9 +6,9 @@ let project = Project( developmentRegion: "fr" ), targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app", infoPlist: .default, diff --git a/fixtures/ios_app_with_custom_regions/Project.swift b/fixtures/ios_app_with_custom_regions/Project.swift index 323d7c71c8e..8147ab4025d 100644 --- a/fixtures/ios_app_with_custom_regions/Project.swift +++ b/fixtures/ios_app_with_custom_regions/Project.swift @@ -7,9 +7,9 @@ let project = Project( developmentRegion: "en-GB" ), targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app", infoPlist: .default, diff --git a/fixtures/ios_app_with_custom_resource_parser_options/Project.swift b/fixtures/ios_app_with_custom_resource_parser_options/Project.swift index f42b38739be..1894ad82d5a 100644 --- a/fixtures/ios_app_with_custom_resource_parser_options/Project.swift +++ b/fixtures/ios_app_with_custom_resource_parser_options/Project.swift @@ -6,9 +6,9 @@ let project = Project( developmentRegion: "fr" ), targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app", infoPlist: .default, diff --git a/fixtures/ios_app_with_custom_scheme/App/Project.swift b/fixtures/ios_app_with_custom_scheme/App/Project.swift index 637c650752e..580b86170cd 100644 --- a/fixtures/ios_app_with_custom_scheme/App/Project.swift +++ b/fixtures/ios_app_with_custom_scheme/App/Project.swift @@ -1,7 +1,7 @@ import ProjectDescription -let debugAction = ExecutionAction(scriptText: "echo Debug", target: "App") -let debugScheme = Scheme( +let debugAction: ExecutionAction = .executionAction(scriptText: "echo Debug", target: "App") +let debugScheme: Scheme = .scheme( name: "App-Debug", shared: true, buildAction: .buildAction( @@ -22,8 +22,8 @@ let debugScheme = Scheme( ) ) -let releaseAction = ExecutionAction(scriptText: "echo Release", target: "App") -let releaseScheme = Scheme( +let releaseAction: ExecutionAction = .executionAction(scriptText: "echo Release", target: "App") +let releaseScheme: Scheme = .scheme( name: "App-Release", shared: true, buildAction: .buildAction(targets: ["App"], preActions: [releaseAction]), @@ -38,7 +38,7 @@ let releaseScheme = Scheme( ) ) -let userScheme = Scheme( +let userScheme: Scheme = .scheme( name: "App-Local", shared: false, buildAction: .buildAction(targets: ["App"], preActions: [debugAction]), @@ -49,9 +49,9 @@ let userScheme = Scheme( let project = Project( name: "MainApp", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Config/App-Info.plist", @@ -61,9 +61,9 @@ let project = Project( .project(target: "Framework2", path: "../Frameworks/Framework2"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Config/AppTests-Info.plist", diff --git a/fixtures/ios_app_with_custom_scheme/Frameworks/Framework1/Project.swift b/fixtures/ios_app_with_custom_scheme/Frameworks/Framework1/Project.swift index d8f394a4711..19801e38d68 100644 --- a/fixtures/ios_app_with_custom_scheme/Frameworks/Framework1/Project.swift +++ b/fixtures/ios_app_with_custom_scheme/Frameworks/Framework1/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework1", targets: [ - Target( + .target( name: "Framework1", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.Framework1", infoPlist: "Config/Framework1-Info.plist", @@ -15,9 +15,9 @@ let project = Project( ] ), - Target( + .target( name: "Framework1Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.Framework1Tests", infoPlist: "Config/Framework1Tests-Info.plist", diff --git a/fixtures/ios_app_with_custom_scheme/Frameworks/Framework2/Project.swift b/fixtures/ios_app_with_custom_scheme/Frameworks/Framework2/Project.swift index 538f8d88e09..96a8727a82d 100644 --- a/fixtures/ios_app_with_custom_scheme/Frameworks/Framework2/Project.swift +++ b/fixtures/ios_app_with_custom_scheme/Frameworks/Framework2/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework2", targets: [ - Target( + .target( name: "Framework2", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.Framework2", infoPlist: "Config/Framework2-Info.plist", @@ -13,9 +13,9 @@ let project = Project( dependencies: [] ), - Target( + .target( name: "Framework2Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.Framework2Tests", infoPlist: "Config/Framework2Tests-Info.plist", diff --git a/fixtures/ios_app_with_custom_scheme/Workspace.swift b/fixtures/ios_app_with_custom_scheme/Workspace.swift index 5a18ee26a88..fb81b4fc9bd 100644 --- a/fixtures/ios_app_with_custom_scheme/Workspace.swift +++ b/fixtures/ios_app_with_custom_scheme/Workspace.swift @@ -1,6 +1,6 @@ import ProjectDescription -let customAppScheme = Scheme( +let customAppScheme: Scheme = .scheme( name: "Workspace-App", shared: true, buildAction: .buildAction( @@ -9,14 +9,14 @@ let customAppScheme = Scheme( .project(path: "Frameworks/Framework1", target: "Framework1"), ], preActions: [ - ExecutionAction( + .executionAction( scriptText: "echo \"pre-action in $SHELL\"", target: .project(path: "App", target: "App"), shellPath: "/bin/zsh" ), ], postActions: [ - ExecutionAction( + .executionAction( scriptText: "echo \"post-action in $SHELL\"", target: .project(path: "Frameworks/Framework1", target: "Framework1"), shellPath: "/bin/zsh" @@ -25,12 +25,12 @@ let customAppScheme = Scheme( ), testAction: TestAction.targets( [ - TestableTarget(target: .project(path: "App", target: "AppTests")), - TestableTarget(target: .project( + .testableTarget(target: .project(path: "App", target: "AppTests")), + .testableTarget(target: .project( path: "Frameworks/Framework1", target: "Framework1Tests" )), - TestableTarget(target: .project( + .testableTarget(target: .project( path: "Frameworks/Framework2", target: "Framework2Tests" )), @@ -39,7 +39,7 @@ let customAppScheme = Scheme( ), runAction: .runAction( executable: .project(path: "App", target: "App"), - arguments: Arguments(environment: ["path": "$(SRCROOT)"], launchArguments: []), + arguments: .arguments(environmentVariables: ["path": "$(SRCROOT)"], launchArguments: []), options: .options( storeKitConfigurationPath: "App/Config/ProjectStoreKitConfig.storekit" ), @@ -48,7 +48,7 @@ let customAppScheme = Scheme( archiveAction: .archiveAction(configuration: "Debug", customArchiveName: "Something2") ) -let customAppSchemeWithTestPlans = Scheme( +let customAppSchemeWithTestPlans: Scheme = .scheme( name: "Workspace-App-With-TestPlans", shared: true, buildAction: .buildAction( @@ -66,7 +66,7 @@ let customAppSchemeWithTestPlans = Scheme( archiveAction: .archiveAction(configuration: "Debug", customArchiveName: "Something2") ) -let customFrameworkScheme = Scheme( +let customFrameworkScheme: Scheme = .scheme( name: "Workspace-Framework", shared: true, buildAction: .buildAction( @@ -74,7 +74,7 @@ let customFrameworkScheme = Scheme( preActions: [] ), testAction: TestAction - .targets([TestableTarget(target: .project( + .targets([.testableTarget(target: .project( path: "Frameworks/Framework1", target: "Framework1Tests" ))]), diff --git a/fixtures/ios_app_with_custom_workspace/App/Project.swift b/fixtures/ios_app_with_custom_workspace/App/Project.swift index 7d29b135873..091a7a764f3 100644 --- a/fixtures/ios_app_with_custom_workspace/App/Project.swift +++ b/fixtures/ios_app_with_custom_workspace/App/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "MainApp", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Config/App-Info.plist", @@ -15,9 +15,9 @@ let project = Project( .project(target: "Framework2", path: "../Frameworks/Framework2"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Config/AppTests-Info.plist", diff --git a/fixtures/ios_app_with_custom_workspace/Frameworks/Framework1/Project.swift b/fixtures/ios_app_with_custom_workspace/Frameworks/Framework1/Project.swift index d8f394a4711..19801e38d68 100644 --- a/fixtures/ios_app_with_custom_workspace/Frameworks/Framework1/Project.swift +++ b/fixtures/ios_app_with_custom_workspace/Frameworks/Framework1/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework1", targets: [ - Target( + .target( name: "Framework1", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.Framework1", infoPlist: "Config/Framework1-Info.plist", @@ -15,9 +15,9 @@ let project = Project( ] ), - Target( + .target( name: "Framework1Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.Framework1Tests", infoPlist: "Config/Framework1Tests-Info.plist", diff --git a/fixtures/ios_app_with_custom_workspace/Frameworks/Framework2/Project.swift b/fixtures/ios_app_with_custom_workspace/Frameworks/Framework2/Project.swift index 538f8d88e09..96a8727a82d 100644 --- a/fixtures/ios_app_with_custom_workspace/Frameworks/Framework2/Project.swift +++ b/fixtures/ios_app_with_custom_workspace/Frameworks/Framework2/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework2", targets: [ - Target( + .target( name: "Framework2", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.Framework2", infoPlist: "Config/Framework2-Info.plist", @@ -13,9 +13,9 @@ let project = Project( dependencies: [] ), - Target( + .target( name: "Framework2Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.Framework2Tests", infoPlist: "Config/Framework2Tests-Info.plist", diff --git a/fixtures/ios_app_with_device_only_xcframework/Lib/Sources/Lib.swift b/fixtures/ios_app_with_device_only_xcframework/Lib/Sources/Lib.swift deleted file mode 100644 index 3da90b9e597..00000000000 --- a/fixtures/ios_app_with_device_only_xcframework/Lib/Sources/Lib.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation - -public class Lib { - public init() {} - - public func run() { - print("Hello world!") - } -} diff --git a/fixtures/ios_app_with_device_only_xcframework/MyTarget/Sources/MyClass.swift b/fixtures/ios_app_with_device_only_xcframework/MyTarget/Sources/MyClass.swift deleted file mode 100644 index 5ca094c0d45..00000000000 --- a/fixtures/ios_app_with_device_only_xcframework/MyTarget/Sources/MyClass.swift +++ /dev/null @@ -1,10 +0,0 @@ -import Foundation -import Lib - -public class MyClass { - public init() {} - - public func hello() { - Lib().run() - } -} diff --git a/fixtures/ios_app_with_device_only_xcframework/Project.swift b/fixtures/ios_app_with_device_only_xcframework/Project.swift deleted file mode 100644 index ac5394991ee..00000000000 --- a/fixtures/ios_app_with_device_only_xcframework/Project.swift +++ /dev/null @@ -1,30 +0,0 @@ -import ProjectDescription - -let project = Project( - name: "App", - targets: [ - Target( - name: "MyTarget", - platform: .iOS, - product: .framework, - bundleId: "io.tuist.MyTarget", - infoPlist: .default, - sources: [ - "MyTarget/Sources/**", - ], - dependencies: [ - .target(name: "Lib"), - ] - ), - Target( - name: "Lib", - platform: .iOS, - product: .framework, - bundleId: "io.tuist.Lib", - infoPlist: .default, - sources: [ - "Lib/Sources/**", - ] - ), - ] -) diff --git a/fixtures/ios_app_with_device_only_xcframework/Tuist/Config.swift b/fixtures/ios_app_with_device_only_xcframework/Tuist/Config.swift deleted file mode 100644 index 7d1fed08e4d..00000000000 --- a/fixtures/ios_app_with_device_only_xcframework/Tuist/Config.swift +++ /dev/null @@ -1,10 +0,0 @@ -import ProjectDescription - -let config = Config( - cache: .cache(profiles: [ - .profile( - name: "DeviceOnly", - configuration: "Debug" - ), - ]) -) diff --git a/fixtures/ios_app_with_env_suppressed/App With Space/Project.swift b/fixtures/ios_app_with_env_suppressed/App With Space/Project.swift index d1321dea216..d957d001f7e 100644 --- a/fixtures/ios_app_with_env_suppressed/App With Space/Project.swift +++ b/fixtures/ios_app_with_env_suppressed/App With Space/Project.swift @@ -4,9 +4,9 @@ let project = Project( name: "AppWithSpace", options: .options(disableShowEnvironmentVarsInScriptPhases: true), targets: [ - Target( + .target( name: "AppWithSpace", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app-with-space", infoPlist: "Info.plist", diff --git a/fixtures/ios_app_with_env_suppressed/App/Project.swift b/fixtures/ios_app_with_env_suppressed/App/Project.swift index 03ffceaa072..ee4149e2f86 100644 --- a/fixtures/ios_app_with_env_suppressed/App/Project.swift +++ b/fixtures/ios_app_with_env_suppressed/App/Project.swift @@ -4,9 +4,9 @@ let project = Project( name: "App", options: .options(disableShowEnvironmentVarsInScriptPhases: true), targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app", infoPlist: "Info.plist", diff --git a/fixtures/ios_app_with_extensions/Project.swift b/fixtures/ios_app_with_extensions/Project.swift index e28b6617fd5..eae73cc020e 100644 --- a/fixtures/ios_app_with_extensions/Project.swift +++ b/fixtures/ios_app_with_extensions/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Info.plist", @@ -20,9 +20,9 @@ let project = Project( // We need a separate app to test out Message Extensions // as having both stickers pack and message extensions in one app // doesn't seem to be supported. - Target( + .target( name: "AppWithMessagesExtension", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App2", infoPlist: "Info.plist", @@ -32,9 +32,9 @@ let project = Project( .target(name: "NotificationServiceExtension"), ] ), - Target( + .target( name: "StickersPackExtension", - platform: .iOS, + destinations: .iOS, product: .stickerPackExtension, bundleId: "io.tuist.App.StickersPackExtension", infoPlist: .extendingDefault(with: [ @@ -49,9 +49,9 @@ let project = Project( dependencies: [ ] ), - Target( + .target( name: "NotificationServiceExtension", - platform: .iOS, + destinations: .iOS, product: .appExtension, bundleId: "io.tuist.App.NotificationServiceExtension", infoPlist: .extendingDefault(with: [ @@ -65,9 +65,9 @@ let project = Project( dependencies: [ ] ), - Target( + .target( name: "MessageExtension", - platform: .iOS, + destinations: .iOS, product: .messagesExtension, bundleId: "io.tuist.App2.MessageExtension", infoPlist: .extendingDefault(with: [ @@ -82,9 +82,9 @@ let project = Project( dependencies: [ ] ), - Target( + .target( name: "WidgetExtension", - platform: .iOS, + destinations: .iOS, product: .appExtension, bundleId: "io.tuist.App.WidgetExtension", infoPlist: .extendingDefault(with: [ @@ -99,17 +99,17 @@ let project = Project( .target(name: "StaticFramework"), ] ), - Target( + .target( name: "StaticFramework", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.App.StaticFramework", infoPlist: .default, sources: "StaticFramework/Sources/**" ), - Target( + .target( name: "AppIntentExtension", - platform: .iOS, + destinations: .iOS, product: .extensionKitExtension, bundleId: "io.tuist.App.AppIntentExtension", infoPlist: .extendingDefault(with: [ diff --git a/fixtures/ios_app_with_framework_and_disabled_resources/App/Project.swift b/fixtures/ios_app_with_framework_and_disabled_resources/App/Project.swift index 0d38967c7f0..454adb7611e 100644 --- a/fixtures/ios_app_with_framework_and_disabled_resources/App/Project.swift +++ b/fixtures/ios_app_with_framework_and_disabled_resources/App/Project.swift @@ -7,9 +7,9 @@ let project = Project( disableSynthesizedResourceAccessors: true ), targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Config/App-Info.plist", diff --git a/fixtures/ios_app_with_framework_and_disabled_resources/Framework1/Project.swift b/fixtures/ios_app_with_framework_and_disabled_resources/Framework1/Project.swift index 5f378dc0d28..87c7905d085 100644 --- a/fixtures/ios_app_with_framework_and_disabled_resources/Framework1/Project.swift +++ b/fixtures/ios_app_with_framework_and_disabled_resources/Framework1/Project.swift @@ -15,14 +15,14 @@ let project = Project( disableSynthesizedResourceAccessors: true ), targets: [ - Target( + .target( name: "Framework1", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.Framework1", infoPlist: "Config/Framework1-Info.plist", sources: "Sources/**", - resources: ResourceFileElements(resources: resources) + resources: .resources(resources) ), ] ) diff --git a/fixtures/ios_app_with_framework_and_disabled_resources/StaticFramework/Project.swift b/fixtures/ios_app_with_framework_and_disabled_resources/StaticFramework/Project.swift index 15a0bf5a145..4c59502703d 100644 --- a/fixtures/ios_app_with_framework_and_disabled_resources/StaticFramework/Project.swift +++ b/fixtures/ios_app_with_framework_and_disabled_resources/StaticFramework/Project.swift @@ -7,18 +7,18 @@ let project = Project( disableSynthesizedResourceAccessors: true ), targets: [ - Target( + .target( name: "StaticFramework", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.StaticFramework", infoPlist: "Config/StaticFramework-Info.plist", sources: "Sources/**", dependencies: [] ), - Target( + .target( name: "StaticFrameworkResources", - platform: .iOS, + destinations: .iOS, product: .bundle, bundleId: "io.tuist.StaticFrameworkResources", infoPlist: .default, diff --git a/fixtures/ios_app_with_framework_and_resources/App/Project.swift b/fixtures/ios_app_with_framework_and_resources/App/Project.swift index c96aa0d673c..bf42c204395 100644 --- a/fixtures/ios_app_with_framework_and_resources/App/Project.swift +++ b/fixtures/ios_app_with_framework_and_resources/App/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "MainApp", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Config/App-Info.plist", @@ -34,9 +34,9 @@ let project = Project( .project(target: "StaticFramework5", path: "../StaticFramework5"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Config/AppTests-Info.plist", diff --git a/fixtures/ios_app_with_framework_and_resources/Framework1/Project.swift b/fixtures/ios_app_with_framework_and_resources/Framework1/Project.swift index 3b6d8d43aa3..ac3036f1ac1 100644 --- a/fixtures/ios_app_with_framework_and_resources/Framework1/Project.swift +++ b/fixtures/ios_app_with_framework_and_resources/Framework1/Project.swift @@ -12,14 +12,14 @@ let resources: [ResourceFileElement] = [ let project = Project( name: "Framework1", targets: [ - Target( + .target( name: "Framework1", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.Framework1", infoPlist: "Config/Framework1-Info.plist", sources: "Sources/**", - resources: ResourceFileElements(resources: resources) + resources: .resources(resources) ), ] ) diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework/Project.swift b/fixtures/ios_app_with_framework_and_resources/StaticFramework/Project.swift index b9ac0707766..9e993e9bf2e 100644 --- a/fixtures/ios_app_with_framework_and_resources/StaticFramework/Project.swift +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework/Project.swift @@ -3,18 +3,18 @@ import ProjectDescription let project = Project( name: "StaticFramework", targets: [ - Target( + .target( name: "StaticFramework", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.StaticFramework", infoPlist: "Config/StaticFramework-Info.plist", sources: "Sources/**", dependencies: [] ), - Target( + .target( name: "StaticFrameworkResources", - platform: .iOS, + destinations: .iOS, product: .bundle, bundleId: "io.tuist.StaticFrameworkResources", infoPlist: .default, diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework2/Project.swift b/fixtures/ios_app_with_framework_and_resources/StaticFramework2/Project.swift index c81a7f5b60f..8211bce5c33 100644 --- a/fixtures/ios_app_with_framework_and_resources/StaticFramework2/Project.swift +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework2/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "StaticFramework2", targets: [ - Target( + .target( name: "StaticFramework2", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.StaticFramework2", infoPlist: .default, @@ -14,9 +14,9 @@ let project = Project( .target(name: "StaticFramework2Resources"), ] ), - Target( + .target( name: "StaticFramework2Resources", - platform: .iOS, + destinations: .iOS, product: .bundle, bundleId: "io.tuist.StaticFramework2Resources", infoPlist: .default, diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework3/Project.swift b/fixtures/ios_app_with_framework_and_resources/StaticFramework3/Project.swift index f1dd5309b1e..5984830f017 100644 --- a/fixtures/ios_app_with_framework_and_resources/StaticFramework3/Project.swift +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework3/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "StaticFramework3", targets: [ - Target( + .target( name: "StaticFramework3", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.StaticFramework3", infoPlist: .default, diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework4/Project.swift b/fixtures/ios_app_with_framework_and_resources/StaticFramework4/Project.swift index 4df1f43a79d..473a2bc879f 100644 --- a/fixtures/ios_app_with_framework_and_resources/StaticFramework4/Project.swift +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework4/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "StaticFramework4", targets: [ - Target( + .target( name: "StaticFramework4", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.StaticFramework4", infoPlist: .default, diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Project.swift b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Project.swift index 0bd3dc778fc..24a7d8120fa 100644 --- a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Project.swift +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "StaticFramework5", targets: [ - Target( + .target( name: "StaticFramework5", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.StaticFramework5", infoPlist: .default, diff --git a/fixtures/ios_app_with_framework_linking_static_framework/App/Project.swift b/fixtures/ios_app_with_framework_linking_static_framework/App/Project.swift index 29c7275f25b..37ace4784ed 100644 --- a/fixtures/ios_app_with_framework_linking_static_framework/App/Project.swift +++ b/fixtures/ios_app_with_framework_linking_static_framework/App/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "MainApp", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Config/App-Info.plist", @@ -14,9 +14,9 @@ let project = Project( .project(target: "Framework1", path: "../Framework1"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Config/AppTests-Info.plist", diff --git a/fixtures/ios_app_with_framework_linking_static_framework/Framework1/Project.swift b/fixtures/ios_app_with_framework_linking_static_framework/Framework1/Project.swift index d07a3345e86..becb75134d4 100644 --- a/fixtures/ios_app_with_framework_linking_static_framework/Framework1/Project.swift +++ b/fixtures/ios_app_with_framework_linking_static_framework/Framework1/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework1", targets: [ - Target( + .target( name: "Framework1", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.Framework1", infoPlist: "Config/Framework1-Info.plist", @@ -17,9 +17,9 @@ let project = Project( ] ), - Target( + .target( name: "Framework1Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.Framework1Tests", infoPlist: "Config/Framework1Tests-Info.plist", diff --git a/fixtures/ios_app_with_framework_linking_static_framework/Framework2/Project.swift b/fixtures/ios_app_with_framework_linking_static_framework/Framework2/Project.swift index ed7dac97b2f..bec8853b09d 100644 --- a/fixtures/ios_app_with_framework_linking_static_framework/Framework2/Project.swift +++ b/fixtures/ios_app_with_framework_linking_static_framework/Framework2/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework2", targets: [ - Target( + .target( name: "Framework2", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.Framework2", infoPlist: "Config/Framework2-Info.plist", @@ -13,9 +13,9 @@ let project = Project( dependencies: [] ), - Target( + .target( name: "Framework2Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.Framework2Tests", infoPlist: "Config/Framework2Tests-Info.plist", diff --git a/fixtures/ios_app_with_framework_linking_static_framework/Framework3/Project.swift b/fixtures/ios_app_with_framework_linking_static_framework/Framework3/Project.swift index b7165340250..8a403fded82 100644 --- a/fixtures/ios_app_with_framework_linking_static_framework/Framework3/Project.swift +++ b/fixtures/ios_app_with_framework_linking_static_framework/Framework3/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework3", targets: [ - Target( + .target( name: "Framework3", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.Framework3", infoPlist: "Config/Framework3-Info.plist", @@ -15,9 +15,9 @@ let project = Project( ] ), - Target( + .target( name: "Framework3Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.Framework3Tests", infoPlist: "Config/Framework3Tests-Info.plist", diff --git a/fixtures/ios_app_with_framework_linking_static_framework/Framework4/Project.swift b/fixtures/ios_app_with_framework_linking_static_framework/Framework4/Project.swift index 23507c3ab73..3d62ba539a3 100644 --- a/fixtures/ios_app_with_framework_linking_static_framework/Framework4/Project.swift +++ b/fixtures/ios_app_with_framework_linking_static_framework/Framework4/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework4", targets: [ - Target( + .target( name: "Framework4", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.Framework4", infoPlist: "Config/Framework4-Info.plist", @@ -13,9 +13,9 @@ let project = Project( dependencies: [] ), - Target( + .target( name: "Framework4Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.Framework4Tests", infoPlist: "Config/Framework4Tests-Info.plist", diff --git a/fixtures/ios_app_with_frameworks/App/Project.swift b/fixtures/ios_app_with_frameworks/App/Project.swift index 5242c0115a3..ccfbd8d5caf 100644 --- a/fixtures/ios_app_with_frameworks/App/Project.swift +++ b/fixtures/ios_app_with_frameworks/App/Project.swift @@ -8,9 +8,9 @@ let project = Project( name: "MainApp", settings: settings, targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: .extendingDefault(with: [:]), @@ -21,9 +21,9 @@ let project = Project( .project(target: "Framework2-iOS", path: "../Framework2"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: .extendingDefault(with: [:]), diff --git a/fixtures/ios_app_with_frameworks/Framework1/Project.swift b/fixtures/ios_app_with_frameworks/Framework1/Project.swift index 3508b330183..92f452c33ea 100644 --- a/fixtures/ios_app_with_frameworks/Framework1/Project.swift +++ b/fixtures/ios_app_with_frameworks/Framework1/Project.swift @@ -17,9 +17,9 @@ let infoPlist: [String: Plist.Value] = [ let project = Project( name: "Framework1", targets: [ - Target( + .target( name: "Framework1", - platform: .iOS, + destinations: .iOS, product: .framework, productName: "Framework1", bundleId: "io.tuist.Framework1", @@ -29,9 +29,9 @@ let project = Project( .project(target: "Framework2-iOS", path: "../Framework2"), ] ), - Target( + .target( name: "Framework1Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, productName: "Framework1Tests", bundleId: "io.tuist.Framework1Tests", diff --git a/fixtures/ios_app_with_frameworks/Framework2/Project.swift b/fixtures/ios_app_with_frameworks/Framework2/Project.swift index 1cd09e99c21..2d11b748939 100644 --- a/fixtures/ios_app_with_frameworks/Framework2/Project.swift +++ b/fixtures/ios_app_with_frameworks/Framework2/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework2", targets: [ - Target( + .target( name: "Framework2-iOS", - platform: .iOS, + destinations: .iOS, product: .framework, productName: "Framework2", bundleId: "io.tuist.Framework2", @@ -20,9 +20,9 @@ let project = Project( .project(target: "Framework3", path: "../Framework3"), ] ), - Target( + .target( name: "Framework2-macOS", - platform: .macOS, + destinations: [.mac], product: .framework, productName: "Framework2", bundleId: "io.tuist.Framework2", @@ -35,9 +35,9 @@ let project = Project( ), dependencies: [] ), - Target( + .target( name: "Framework2Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.Framework2Tests", infoPlist: "Config/Framework2Tests-Info.plist", diff --git a/fixtures/ios_app_with_frameworks/Framework3/Project.swift b/fixtures/ios_app_with_frameworks/Framework3/Project.swift index b4dde76373c..6d415edb0ea 100644 --- a/fixtures/ios_app_with_frameworks/Framework3/Project.swift +++ b/fixtures/ios_app_with_frameworks/Framework3/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework3", targets: [ - Target( + .target( name: "Framework3", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.Framework3", infoPlist: "Config/Framework3-Info.plist", diff --git a/fixtures/ios_app_with_frameworks/Framework4/Project.swift b/fixtures/ios_app_with_frameworks/Framework4/Project.swift index 407b19daf28..8dabf9cd5f5 100644 --- a/fixtures/ios_app_with_frameworks/Framework4/Project.swift +++ b/fixtures/ios_app_with_frameworks/Framework4/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework4", targets: [ - Target( + .target( name: "Framework4", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.Framework4", infoPlist: "Config/Framework4-Info.plist", diff --git a/fixtures/ios_app_with_frameworks/Framework5/Project.swift b/fixtures/ios_app_with_frameworks/Framework5/Project.swift index 196fbca88cc..c0add1a782e 100644 --- a/fixtures/ios_app_with_frameworks/Framework5/Project.swift +++ b/fixtures/ios_app_with_frameworks/Framework5/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework5", targets: [ - Target( + .target( name: "Framework5", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.Framework5", infoPlist: "Config/Framework5-Info.plist", diff --git a/fixtures/ios_app_with_headers/App/Project.swift b/fixtures/ios_app_with_headers/App/Project.swift index 91d1c7e9036..fd425cd0fca 100644 --- a/fixtures/ios_app_with_headers/App/Project.swift +++ b/fixtures/ios_app_with_headers/App/Project.swift @@ -7,9 +7,9 @@ let project = Project( name: "MainApp", settings: settings, targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Config/App-Info.plist", @@ -18,9 +18,9 @@ let project = Project( .project(target: "Framework1-iOS", path: "../Framework1"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Config/AppTests-Info.plist", diff --git a/fixtures/ios_app_with_headers/Framework1/Project.swift b/fixtures/ios_app_with_headers/Framework1/Project.swift index 088855416a0..4239029d07c 100644 --- a/fixtures/ios_app_with_headers/Framework1/Project.swift +++ b/fixtures/ios_app_with_headers/Framework1/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework1", targets: [ - Target( + .target( name: "Framework1-iOS", - platform: .iOS, + destinations: .iOS, product: .framework, productName: "Framework1", bundleId: "io.tuist.Framework1", @@ -18,9 +18,9 @@ let project = Project( ), dependencies: [] ), - Target( + .target( name: "Framework1-macOS", - platform: .macOS, + destinations: [.mac], product: .framework, productName: "Framework1", bundleId: "io.tuist.Framework1", @@ -33,9 +33,9 @@ let project = Project( ), dependencies: [] ), - Target( + .target( name: "Framework1Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.Framework1Tests", infoPlist: "Config/Framework1Tests-Info.plist", diff --git a/fixtures/ios_app_with_headers_in_one_dir/App/Project.swift b/fixtures/ios_app_with_headers_in_one_dir/App/Project.swift index 91d1c7e9036..fd425cd0fca 100644 --- a/fixtures/ios_app_with_headers_in_one_dir/App/Project.swift +++ b/fixtures/ios_app_with_headers_in_one_dir/App/Project.swift @@ -7,9 +7,9 @@ let project = Project( name: "MainApp", settings: settings, targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Config/App-Info.plist", @@ -18,9 +18,9 @@ let project = Project( .project(target: "Framework1-iOS", path: "../Framework1"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Config/AppTests-Info.plist", diff --git a/fixtures/ios_app_with_headers_in_one_dir/Framework1/Project.swift b/fixtures/ios_app_with_headers_in_one_dir/Framework1/Project.swift index 6d3ced8aa00..394d8b2a4ac 100644 --- a/fixtures/ios_app_with_headers_in_one_dir/Framework1/Project.swift +++ b/fixtures/ios_app_with_headers_in_one_dir/Framework1/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework1", targets: [ - Target( + .target( name: "Framework1-iOS", - platform: .iOS, + destinations: .iOS, product: .framework, productName: "Framework1", bundleId: "io.tuist.Framework1", @@ -18,9 +18,9 @@ let project = Project( ), dependencies: [] ), - Target( + .target( name: "Framework1-macOS", - platform: .macOS, + destinations: [.mac], product: .framework, productName: "Framework1", bundleId: "io.tuist.Framework1", @@ -33,9 +33,9 @@ let project = Project( ), dependencies: [] ), - Target( + .target( name: "Framework1Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.Framework1Tests", infoPlist: "Config/Framework1Tests-Info.plist", diff --git a/fixtures/ios_app_with_helpers/Projects/App/Project.swift b/fixtures/ios_app_with_helpers/Projects/App/Project.swift index f89b263f690..4121f2f2a2d 100644 --- a/fixtures/ios_app_with_helpers/Projects/App/Project.swift +++ b/fixtures/ios_app_with_helpers/Projects/App/Project.swift @@ -1,6 +1,6 @@ import ProjectDescription import ProjectDescriptionHelpers -let project = Project.app(name: "App", platform: .iOS, dependencies: [ +let project = Project.app(name: "App", destinations: .iOS, dependencies: [ .project(target: "AppKit", path: "//Projects/AppKit"), ]) diff --git a/fixtures/ios_app_with_helpers/Projects/AppKit/Project.swift b/fixtures/ios_app_with_helpers/Projects/AppKit/Project.swift index 58117aadcf5..29990fbff19 100644 --- a/fixtures/ios_app_with_helpers/Projects/AppKit/Project.swift +++ b/fixtures/ios_app_with_helpers/Projects/AppKit/Project.swift @@ -1,6 +1,6 @@ import ProjectDescription import ProjectDescriptionHelpers -let project = Project.framework(name: "AppKit", platform: .iOS, dependencies: [ +let project = Project.framework(name: "AppKit", destinations: .iOS, dependencies: [ .project(target: "AppSupport", path: "//Projects/AppSupport"), ]) diff --git a/fixtures/ios_app_with_helpers/Projects/AppSupport/Project.swift b/fixtures/ios_app_with_helpers/Projects/AppSupport/Project.swift index 9dad7ece8cb..0770da5a5b2 100644 --- a/fixtures/ios_app_with_helpers/Projects/AppSupport/Project.swift +++ b/fixtures/ios_app_with_helpers/Projects/AppSupport/Project.swift @@ -1,4 +1,4 @@ import ProjectDescription import ProjectDescriptionHelpers -let project = Project.framework(name: "AppSupport", platform: .iOS, dependencies: []) +let project = Project.framework(name: "AppSupport", destinations: .iOS, dependencies: []) diff --git a/fixtures/ios_app_with_helpers/Tuist/ProjectDescriptionHelpers/Project+Templates.swift b/fixtures/ios_app_with_helpers/Tuist/ProjectDescriptionHelpers/Project+Templates.swift index c01c59a4e94..cd547b2b5d8 100644 --- a/fixtures/ios_app_with_helpers/Tuist/ProjectDescriptionHelpers/Project+Templates.swift +++ b/fixtures/ios_app_with_helpers/Tuist/ProjectDescriptionHelpers/Project+Templates.swift @@ -1,30 +1,30 @@ import ProjectDescription extension Project { - public static func app(name: String, platform: Platform, dependencies: [TargetDependency] = []) -> Project { - project(name: name, product: .app, platform: platform, dependencies: dependencies, infoPlist: [ + public static func app(name: String, destinations: Destinations, dependencies: [TargetDependency] = []) -> Project { + project(name: name, product: .app, destinations: destinations, dependencies: dependencies, infoPlist: [ "CFBundleShortVersionString": "1.0", "CFBundleVersion": "1", ]) } - public static func framework(name: String, platform: Platform, dependencies: [TargetDependency] = []) -> Project { - project(name: name, product: .framework, platform: platform, dependencies: dependencies) + public static func framework(name: String, destinations: Destinations, dependencies: [TargetDependency] = []) -> Project { + project(name: name, product: .framework, destinations: destinations, dependencies: dependencies) } public static func project( name: String, product: Product, - platform: Platform, + destinations: Destinations, dependencies: [TargetDependency] = [], infoPlist: [String: Plist.Value] = [:] ) -> Project { Project( name: name, targets: [ - Target( + .target( name: name, - platform: platform, + destinations: destinations, product: product, bundleId: "io.tuist.\(name)", infoPlist: .extendingDefault(with: infoPlist), @@ -32,9 +32,9 @@ extension Project { resources: [], dependencies: dependencies ), - Target( + .target( name: "\(name)Tests", - platform: platform, + destinations: destinations, product: .unitTests, bundleId: "io.tuist.\(name)Tests", infoPlist: .default, diff --git a/fixtures/ios_app_with_implicit_dependencies/Project.swift b/fixtures/ios_app_with_implicit_dependencies/Project.swift index ace61ab3a76..2f4b216d686 100644 --- a/fixtures/ios_app_with_implicit_dependencies/Project.swift +++ b/fixtures/ios_app_with_implicit_dependencies/Project.swift @@ -4,7 +4,7 @@ let project = Project( name: "App", organizationName: "tuist.io", targets: [ - Target( + .target( name: "App", destinations: .iOS, product: .app, @@ -15,21 +15,21 @@ let project = Project( .target(name: "FrameworkB"), ] ), - Target( + .target( name: "FrameworkA", destinations: .iOS, product: .framework, bundleId: "io.tuist.FrameworkA", sources: ["Targets/FrameworkA/Sources/**"] ), - Target( + .target( name: "FrameworkB", destinations: .iOS, product: .framework, bundleId: "io.tuist.FrameworkB", sources: ["Targets/FrameworkB/Sources/**"] ), - Target( + .target( name: "FrameworkC", destinations: .iOS, product: .framework, diff --git a/fixtures/ios_app_with_incompatible_dependencies/Project.swift b/fixtures/ios_app_with_incompatible_dependencies/Project.swift index f61c399244f..290888bc40e 100644 --- a/fixtures/ios_app_with_incompatible_dependencies/Project.swift +++ b/fixtures/ios_app_with_incompatible_dependencies/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .macOS, + destinations: [.mac], product: .app, bundleId: "io.tuist.App", infoPlist: "Info.plist", @@ -18,9 +18,9 @@ let project = Project( "CODE_SIGNING_REQUIRED": "NO", ]) ), - Target( + .target( name: "Framework", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.Framework", infoPlist: "Framework.plist", diff --git a/fixtures/ios_app_with_incompatible_xcode/Project.swift b/fixtures/ios_app_with_incompatible_xcode/Project.swift index beda0c2d795..4ea128ddc88 100644 --- a/fixtures/ios_app_with_incompatible_xcode/Project.swift +++ b/fixtures/ios_app_with_incompatible_xcode/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Info.plist", diff --git a/fixtures/ios_app_with_intents/Project.swift b/fixtures/ios_app_with_intents/Project.swift index fc8a69b125d..0ec543638aa 100644 --- a/fixtures/ios_app_with_intents/Project.swift +++ b/fixtures/ios_app_with_intents/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app", infoPlist: "Info.plist", diff --git a/fixtures/ios_app_with_local_binary_swift_package/Packages/LocalPackage/MyFramework/Project.swift b/fixtures/ios_app_with_local_binary_swift_package/Packages/LocalPackage/MyFramework/Project.swift index 1804b2e354e..8bdec89d744 100644 --- a/fixtures/ios_app_with_local_binary_swift_package/Packages/LocalPackage/MyFramework/Project.swift +++ b/fixtures/ios_app_with_local_binary_swift_package/Packages/LocalPackage/MyFramework/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "MyFramework", targets: [ - Target( + .target( name: "MyFramework", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.MyFramework", infoPlist: .default, diff --git a/fixtures/ios_app_with_local_binary_swift_package/Project.swift b/fixtures/ios_app_with_local_binary_swift_package/Project.swift index b7348e5f31b..bbe634d7838 100644 --- a/fixtures/ios_app_with_local_binary_swift_package/Project.swift +++ b/fixtures/ios_app_with_local_binary_swift_package/Project.swift @@ -6,9 +6,9 @@ let project = Project( .package(path: "Packages/LocalPackage"), ], targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: .default, @@ -19,9 +19,9 @@ let project = Project( .package(product: "MyFramework"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: .default, diff --git a/fixtures/ios_app_with_local_swift_package/Frameworks/FrameworkA/Project.swift b/fixtures/ios_app_with_local_swift_package/Frameworks/FrameworkA/Project.swift index 7d7e7e396a1..c8cd5ea0a55 100644 --- a/fixtures/ios_app_with_local_swift_package/Frameworks/FrameworkA/Project.swift +++ b/fixtures/ios_app_with_local_swift_package/Frameworks/FrameworkA/Project.swift @@ -6,9 +6,9 @@ let project = Project( .package(path: "../../Packages/PackageA"), ], targets: [ - Target( + .target( name: "FrameworkA", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.FrameworkA", infoPlist: "Config/FrameworkA-Info.plist", diff --git a/fixtures/ios_app_with_local_swift_package/Project.swift b/fixtures/ios_app_with_local_swift_package/Project.swift index 6d6150e9dfc..b68084f9333 100644 --- a/fixtures/ios_app_with_local_swift_package/Project.swift +++ b/fixtures/ios_app_with_local_swift_package/Project.swift @@ -6,9 +6,9 @@ let project = Project( .package(path: "Packages/PackageA"), ], targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Support/Info.plist", @@ -23,9 +23,9 @@ let project = Project( .package(product: "LibraryB"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Support/Tests.plist", diff --git a/fixtures/ios_app_with_multi_configs/App/Project.swift b/fixtures/ios_app_with_multi_configs/App/Project.swift index 2d8b422cfd9..d2006478fa0 100644 --- a/fixtures/ios_app_with_multi_configs/App/Project.swift +++ b/fixtures/ios_app_with_multi_configs/App/Project.swift @@ -11,7 +11,7 @@ let settings: Settings = .settings( ] ) -let betaScheme = Scheme( +let betaScheme: Scheme = .scheme( name: "App-Beta", shared: true, buildAction: .buildAction(targets: ["App"]), @@ -25,9 +25,9 @@ let project = Project( name: "MainApp", settings: settings, targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Support/App-Info.plist", @@ -37,9 +37,9 @@ let project = Project( .project(target: "Framework2", path: "../Framework2"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Support/AppTests-Info.plist", diff --git a/fixtures/ios_app_with_multi_configs/Framework1/Project.swift b/fixtures/ios_app_with_multi_configs/Framework1/Project.swift index c78c8b6bc6b..f275b144dd4 100644 --- a/fixtures/ios_app_with_multi_configs/Framework1/Project.swift +++ b/fixtures/ios_app_with_multi_configs/Framework1/Project.swift @@ -15,9 +15,9 @@ let project = Project( name: "Framework1", settings: settings, targets: [ - Target( + .target( name: "Framework1", - platform: .iOS, + destinations: .iOS, product: .framework, productName: "Framework1", bundleId: "io.tuist.Framework1", @@ -27,9 +27,9 @@ let project = Project( .project(target: "Framework2", path: "../Framework2"), ] ), - Target( + .target( name: "Framework1Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, productName: "Framework1Tests", bundleId: "io.tuist.Framework1Tests", diff --git a/fixtures/ios_app_with_multi_configs/Framework2/Project.swift b/fixtures/ios_app_with_multi_configs/Framework2/Project.swift index bb110cbdb8c..bbec1c7f3e2 100644 --- a/fixtures/ios_app_with_multi_configs/Framework2/Project.swift +++ b/fixtures/ios_app_with_multi_configs/Framework2/Project.swift @@ -22,9 +22,9 @@ let project = Project( name: "Framework2", settings: settings, targets: [ - Target( + .target( name: "Framework2", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.Framework2", infoPlist: "Support/Framework2-Info.plist", @@ -32,9 +32,9 @@ let project = Project( dependencies: [], settings: targetSettings ), - Target( + .target( name: "Framework2Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.Framework2Tests", infoPlist: "Support/Framework2Tests-Info.plist", diff --git a/fixtures/ios_app_with_remote_swift_package/Project.swift b/fixtures/ios_app_with_remote_swift_package/Project.swift index c618ef76424..68086b05b80 100644 --- a/fixtures/ios_app_with_remote_swift_package/Project.swift +++ b/fixtures/ios_app_with_remote_swift_package/Project.swift @@ -6,9 +6,9 @@ let project = Project( .package(url: "https://github.com/ReactiveX/RxSwift", .upToNextMajor(from: "5.0.0")), ], targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Support/Info.plist", @@ -22,9 +22,9 @@ let project = Project( .package(product: "RxBlocking"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Support/Tests.plist", diff --git a/fixtures/ios_app_with_sdk/Modules/StaticFramework/Project.swift b/fixtures/ios_app_with_sdk/Modules/StaticFramework/Project.swift index 45708c1a6a3..6aece5d8b22 100644 --- a/fixtures/ios_app_with_sdk/Modules/StaticFramework/Project.swift +++ b/fixtures/ios_app_with_sdk/Modules/StaticFramework/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "StaticFramework", targets: [ - Target( + .target( name: "StaticFramework", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.StaticFramework", infoPlist: "Support/Info.plist", @@ -15,9 +15,9 @@ let project = Project( .sdk(name: "c++", type: .library), ] ), - Target( + .target( name: "StaticFrameworkTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.StaticFrameworkTests", infoPlist: "Support/Tests.plist", diff --git a/fixtures/ios_app_with_sdk/Project.swift b/fixtures/ios_app_with_sdk/Project.swift index 552a9cda806..419fd0b5f02 100644 --- a/fixtures/ios_app_with_sdk/Project.swift +++ b/fixtures/ios_app_with_sdk/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Project", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Support/App-Info.plist", @@ -18,9 +18,9 @@ let project = Project( .project(target: "StaticFramework", path: "Modules/StaticFramework"), ] ), - Target( + .target( name: "MyTestFramework", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.MyTestFramework", infoPlist: .default, @@ -29,9 +29,9 @@ let project = Project( .xctest, ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Support/Tests.plist", @@ -41,9 +41,9 @@ let project = Project( .target(name: "MyTestFramework"), ] ), - Target( + .target( name: "MacFramework", - platform: .macOS, + destinations: [.mac], product: .framework, bundleId: "io.tuist.MacFramework", infoPlist: "Support/Framework-Info.plist", @@ -53,9 +53,9 @@ let project = Project( .sdk(name: "sqlite3", type: .library), ] ), - Target( + .target( name: "TVFramework", - platform: .tvOS, + destinations: [.appleTv], product: .framework, bundleId: "io.tuist.MacFramework", infoPlist: "Support/Framework-Info.plist", diff --git a/fixtures/ios_app_with_signing/Project.swift b/fixtures/ios_app_with_signing/Project.swift index dd6ee60e2b6..338c5bd97a6 100644 --- a/fixtures/ios_app_with_signing/Project.swift +++ b/fixtures/ios_app_with_signing/Project.swift @@ -8,9 +8,9 @@ let project = Project( name: "SignApp", settings: settings, targets: [ - Target( + .target( name: "SignApp", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "$(PRODUCT_BUNDLE_IDENTIFIER)", infoPlist: "Info.plist", @@ -21,9 +21,9 @@ let project = Project( .release(name: "Release", xcconfig: "ConfigurationFiles/Release.xcconfig"), ]) ), - Target( + .target( name: "AppA", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.test.appA", infoPlist: "Info.plist", @@ -33,9 +33,9 @@ let project = Project( .debug(name: "Debug", settings: ["PRODUCT_BUNDLE_IDENTIFIER": .string("io.tuist.test.appA")]), ]) ), - Target( + .target( name: "AppB", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.test.appB", infoPlist: "Info.plist", diff --git a/fixtures/ios_app_with_static_frameworks/Modules/A/Project.swift b/fixtures/ios_app_with_static_frameworks/Modules/A/Project.swift index 1019595e028..787abbb9b8c 100755 --- a/fixtures/ios_app_with_static_frameworks/Modules/A/Project.swift +++ b/fixtures/ios_app_with_static_frameworks/Modules/A/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "A", targets: [ - Target( + .target( name: "A", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.A", infoPlist: "Info.plist", @@ -16,9 +16,9 @@ let project = Project( .framework(path: "../../Prebuilt/prebuilt/PrebuiltStaticFramework.framework"), ] ), - Target( + .target( name: "ATests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.ATests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_app_with_static_frameworks/Modules/AppTestsSupport/Project.swift b/fixtures/ios_app_with_static_frameworks/Modules/AppTestsSupport/Project.swift index 9a02c51e060..140c50e4086 100755 --- a/fixtures/ios_app_with_static_frameworks/Modules/AppTestsSupport/Project.swift +++ b/fixtures/ios_app_with_static_frameworks/Modules/AppTestsSupport/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "AppTestsSupport", targets: [ - Target( + .target( name: "AppTestsSupport", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.AppTestsSupport", infoPlist: "Info.plist", diff --git a/fixtures/ios_app_with_static_frameworks/Modules/B/Project.swift b/fixtures/ios_app_with_static_frameworks/Modules/B/Project.swift index ecc657415af..5bc88261bf5 100755 --- a/fixtures/ios_app_with_static_frameworks/Modules/B/Project.swift +++ b/fixtures/ios_app_with_static_frameworks/Modules/B/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "B", targets: [ - Target( + .target( name: "B", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.B", infoPlist: "Info.plist", @@ -15,9 +15,9 @@ let project = Project( /* .framework(path: "framework") */ ] ), - Target( + .target( name: "BTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.BTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_app_with_static_frameworks/Modules/C/Project.swift b/fixtures/ios_app_with_static_frameworks/Modules/C/Project.swift index 0463a098178..67ac48e5930 100755 --- a/fixtures/ios_app_with_static_frameworks/Modules/C/Project.swift +++ b/fixtures/ios_app_with_static_frameworks/Modules/C/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "C", targets: [ - Target( + .target( name: "C", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.C", infoPlist: "Info.plist", @@ -16,9 +16,9 @@ let project = Project( .project(target: "D", path: "../D"), ] ), - Target( + .target( name: "CTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.CTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_app_with_static_frameworks/Modules/D/Project.swift b/fixtures/ios_app_with_static_frameworks/Modules/D/Project.swift index 428ffddbb94..8506bc75ed9 100755 --- a/fixtures/ios_app_with_static_frameworks/Modules/D/Project.swift +++ b/fixtures/ios_app_with_static_frameworks/Modules/D/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "D", targets: [ - Target( + .target( name: "D", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.D", infoPlist: "Info.plist", diff --git a/fixtures/ios_app_with_static_frameworks/Prebuilt/Project.swift b/fixtures/ios_app_with_static_frameworks/Prebuilt/Project.swift index 06ed66799ac..c5f93a2166d 100644 --- a/fixtures/ios_app_with_static_frameworks/Prebuilt/Project.swift +++ b/fixtures/ios_app_with_static_frameworks/Prebuilt/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Prebuilt", targets: [ - Target( + .target( name: "PrebuiltStaticFramework", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.PrebuiltStaticFramework", infoPlist: "Config/Info.plist", diff --git a/fixtures/ios_app_with_static_frameworks/Project.swift b/fixtures/ios_app_with_static_frameworks/Project.swift index 3cfb95c3476..2ea27419a9b 100755 --- a/fixtures/ios_app_with_static_frameworks/Project.swift +++ b/fixtures/ios_app_with_static_frameworks/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Info.plist", @@ -16,9 +16,9 @@ let project = Project( .framework(path: "Prebuilt/prebuilt/PrebuiltStaticFramework.framework"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_app_with_static_frameworks_with_resources/Modules/A/Project.swift b/fixtures/ios_app_with_static_frameworks_with_resources/Modules/A/Project.swift index 9464b27c5de..14e97a9d01d 100755 --- a/fixtures/ios_app_with_static_frameworks_with_resources/Modules/A/Project.swift +++ b/fixtures/ios_app_with_static_frameworks_with_resources/Modules/A/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "A", targets: [ - Target( + .target( name: "A", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.A", infoPlist: "Info.plist", @@ -16,9 +16,9 @@ let project = Project( .project(target: "C", path: "../C"), ] ), - Target( + .target( name: "ATests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.ATests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_app_with_static_frameworks_with_resources/Modules/B/Project.swift b/fixtures/ios_app_with_static_frameworks_with_resources/Modules/B/Project.swift index a1b620f6f6c..a3b7a66767b 100755 --- a/fixtures/ios_app_with_static_frameworks_with_resources/Modules/B/Project.swift +++ b/fixtures/ios_app_with_static_frameworks_with_resources/Modules/B/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "B", targets: [ - Target( + .target( name: "B", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.B", infoPlist: "Info.plist", @@ -16,9 +16,9 @@ let project = Project( /* .framework(path: "framework") */ ] ), - Target( + .target( name: "BTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.BTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_app_with_static_frameworks_with_resources/Modules/C/Project.swift b/fixtures/ios_app_with_static_frameworks_with_resources/Modules/C/Project.swift index 2008d15b01c..55af3f0722c 100755 --- a/fixtures/ios_app_with_static_frameworks_with_resources/Modules/C/Project.swift +++ b/fixtures/ios_app_with_static_frameworks_with_resources/Modules/C/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "C", targets: [ - Target( + .target( name: "C", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.C", infoPlist: "Info.plist", @@ -17,9 +17,9 @@ let project = Project( .project(target: "D", path: "../D"), ] ), - Target( + .target( name: "CTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.CTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_app_with_static_frameworks_with_resources/Modules/D/Project.swift b/fixtures/ios_app_with_static_frameworks_with_resources/Modules/D/Project.swift index 428ffddbb94..8506bc75ed9 100755 --- a/fixtures/ios_app_with_static_frameworks_with_resources/Modules/D/Project.swift +++ b/fixtures/ios_app_with_static_frameworks_with_resources/Modules/D/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "D", targets: [ - Target( + .target( name: "D", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.D", infoPlist: "Info.plist", diff --git a/fixtures/ios_app_with_static_frameworks_with_resources/Prebuilt/Project.swift b/fixtures/ios_app_with_static_frameworks_with_resources/Prebuilt/Project.swift index 06ed66799ac..c5f93a2166d 100644 --- a/fixtures/ios_app_with_static_frameworks_with_resources/Prebuilt/Project.swift +++ b/fixtures/ios_app_with_static_frameworks_with_resources/Prebuilt/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Prebuilt", targets: [ - Target( + .target( name: "PrebuiltStaticFramework", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.PrebuiltStaticFramework", infoPlist: "Config/Info.plist", diff --git a/fixtures/ios_app_with_static_frameworks_with_resources/Project.swift b/fixtures/ios_app_with_static_frameworks_with_resources/Project.swift index 69325a782c9..33d4934060f 100755 --- a/fixtures/ios_app_with_static_frameworks_with_resources/Project.swift +++ b/fixtures/ios_app_with_static_frameworks_with_resources/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Info.plist", @@ -21,9 +21,9 @@ let project = Project( ] ) ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_app_with_static_libraries/Modules/A/Project.swift b/fixtures/ios_app_with_static_libraries/Modules/A/Project.swift index 02f4102c5c9..9dfa3e4abe8 100755 --- a/fixtures/ios_app_with_static_libraries/Modules/A/Project.swift +++ b/fixtures/ios_app_with_static_libraries/Modules/A/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "A", targets: [ - Target( + .target( name: "A", - platform: .iOS, + destinations: .iOS, product: .staticLibrary, bundleId: "io.tuist.A", infoPlist: nil, @@ -21,9 +21,9 @@ let project = Project( settings: .settings(base: ["HEADER_SEARCH_PATHS": "$(SRCROOT)/CustomHeaders"]) ), - Target( + .target( name: "ATests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.ATests", infoPlist: nil, diff --git a/fixtures/ios_app_with_static_libraries/Modules/B/Project.swift b/fixtures/ios_app_with_static_libraries/Modules/B/Project.swift index cc6ce0c9b32..50e3d978760 100755 --- a/fixtures/ios_app_with_static_libraries/Modules/B/Project.swift +++ b/fixtures/ios_app_with_static_libraries/Modules/B/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "B", targets: [ - Target( + .target( name: "B", - platform: .iOS, + destinations: .iOS, product: .staticLibrary, bundleId: "io.tuist.B", infoPlist: "Info.plist", @@ -15,9 +15,9 @@ let project = Project( /* .framework(path: "framework") */ ] ), - Target( + .target( name: "BTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.BTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_app_with_static_libraries/Modules/C/Project.swift b/fixtures/ios_app_with_static_libraries/Modules/C/Project.swift index 10d389623c2..c78a12499bb 100755 --- a/fixtures/ios_app_with_static_libraries/Modules/C/Project.swift +++ b/fixtures/ios_app_with_static_libraries/Modules/C/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "C", targets: [ - Target( + .target( name: "C", - platform: .iOS, + destinations: .iOS, product: .staticLibrary, bundleId: "io.tuist.C", infoPlist: "Info.plist", @@ -16,9 +16,9 @@ let project = Project( ], settings: .settings(base: ["BUILD_LIBRARY_FOR_DISTRIBUTION": "YES"]) ), - Target( + .target( name: "CTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.BTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_app_with_static_libraries/Project.swift b/fixtures/ios_app_with_static_libraries/Project.swift index 3affffdb243..fb70657a3c9 100755 --- a/fixtures/ios_app_with_static_libraries/Project.swift +++ b/fixtures/ios_app_with_static_libraries/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "iOSAppWithTransistiveStaticLibraries", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Info.plist", @@ -14,9 +14,9 @@ let project = Project( .project(target: "A", path: "Modules/A"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_app_with_static_library_and_package/Prebuilt/Project.swift b/fixtures/ios_app_with_static_library_and_package/Prebuilt/Project.swift index c7fd31b7165..018deee1803 100644 --- a/fixtures/ios_app_with_static_library_and_package/Prebuilt/Project.swift +++ b/fixtures/ios_app_with_static_library_and_package/Prebuilt/Project.swift @@ -6,9 +6,9 @@ let project = Project( .package(path: "../Packages/PackageA"), ], targets: [ - Target( + .target( name: "PrebuiltStaticFramework", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.PrebuiltStaticFramework", infoPlist: "Config/Info.plist", diff --git a/fixtures/ios_app_with_static_library_and_package/Project.swift b/fixtures/ios_app_with_static_library_and_package/Project.swift index 26298dcb71c..c6cb700d6cb 100644 --- a/fixtures/ios_app_with_static_library_and_package/Project.swift +++ b/fixtures/ios_app_with_static_library_and_package/Project.swift @@ -6,9 +6,9 @@ let project = Project( .package(path: "Packages/PackageA"), ], targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Support/Info.plist", @@ -22,9 +22,9 @@ let project = Project( .package(product: "LibraryA"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Support/Tests.plist", diff --git a/fixtures/ios_app_with_templates/Project.swift b/fixtures/ios_app_with_templates/Project.swift index b554efdec4e..8b2101e4bed 100644 --- a/fixtures/ios_app_with_templates/Project.swift +++ b/fixtures/ios_app_with_templates/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Support/Info.plist", @@ -15,9 +15,9 @@ let project = Project( // "Resources/**" ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Support/Tests.plist", diff --git a/fixtures/ios_app_with_tests/Project.swift b/fixtures/ios_app_with_tests/Project.swift index 3315acfa0fa..2e367f2cf64 100644 --- a/fixtures/ios_app_with_tests/Project.swift +++ b/fixtures/ios_app_with_tests/Project.swift @@ -11,30 +11,30 @@ let project = Project( ) ), targets: [ - Target( + .target( name: "AppCore", - platform: .iOS, + destinations: [.iPhone], product: .framework, bundleId: "io.tuist.AppCore", - deploymentTarget: .iOS(targetVersion: "12.0", devices: .iphone), + deploymentTargets: .iOS("12.0"), infoPlist: .default, sources: .paths([.relativeToManifest("AppCore/Sources/**")]) ), - Target( + .target( name: "AppCoreTests", - platform: .iOS, + destinations: [.iPhone], product: .unitTests, bundleId: "io.tuist.AppCoreTests", - deploymentTarget: .iOS(targetVersion: "12.0", devices: .iphone), + deploymentTargets: .iOS("12.0"), infoPlist: "Tests.plist", sources: "AppCore/Tests/**", dependencies: [ .target(name: "AppCore"), ] ), - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: .file(path: .relativeToManifest("Info.plist")), @@ -47,9 +47,9 @@ let project = Project( "CODE_SIGNING_REQUIRED": "NO", ]) ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Tests.plist", @@ -62,12 +62,12 @@ let project = Project( "CODE_SIGNING_REQUIRED": "NO", ]) ), - Target( + .target( name: "MacFramework", - platform: .macOS, + destinations: [.mac], product: .framework, bundleId: "io.tuist.MacFramework", - deploymentTarget: .macOS(targetVersion: "10.15"), + deploymentTargets: .macOS("10.15"), infoPlist: .file(path: .relativeToManifest("Info.plist")), sources: .paths([.relativeToManifest("MacFramework/Sources/**")]), settings: .settings(base: [ @@ -75,12 +75,12 @@ let project = Project( "CODE_SIGNING_REQUIRED": "NO", ]) ), - Target( + .target( name: "MacFrameworkTests", - platform: .macOS, + destinations: [.mac], product: .unitTests, bundleId: "io.tuist.MacFrameworkTests", - deploymentTarget: .macOS(targetVersion: "10.15"), + deploymentTargets: .macOS("10.15"), infoPlist: "Tests.plist", sources: "MacFramework/Tests/**", dependencies: [ @@ -91,9 +91,9 @@ let project = Project( "CODE_SIGNING_REQUIRED": "NO", ]) ), - Target( + .target( name: "AppUITests", - platform: .iOS, + destinations: .iOS, product: .uiTests, bundleId: "io.tuist.AppUITests", infoPlist: "Tests.plist", @@ -102,9 +102,9 @@ let project = Project( .target(name: "App"), ] ), - Target( + .target( name: "App-dash", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.AppDash", infoPlist: "Info.plist", @@ -118,9 +118,9 @@ let project = Project( "CODE_SIGNING_REQUIRED": "NO", ]) ), - Target( + .target( name: "App-dashUITests", - platform: .iOS, + destinations: .iOS, product: .uiTests, bundleId: "io.tuist.AppDashUITests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_app_with_transitive_framework/App/Project.swift b/fixtures/ios_app_with_transitive_framework/App/Project.swift index d15f742e05c..7cdc60c854b 100644 --- a/fixtures/ios_app_with_transitive_framework/App/Project.swift +++ b/fixtures/ios_app_with_transitive_framework/App/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "MainApp", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Config/App-Info.plist", @@ -14,9 +14,9 @@ let project = Project( .project(target: "Framework1-iOS", path: "../Framework1"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Config/AppTests-Info.plist", @@ -25,9 +25,9 @@ let project = Project( .target(name: "App"), ] ), - Target( + .target( name: "AppUITests", - platform: .iOS, + destinations: .iOS, product: .uiTests, bundleId: "io.tuist.AppUITests", infoPlist: "Config/AppTests-Info.plist", diff --git a/fixtures/ios_app_with_transitive_framework/Framework1/Project.swift b/fixtures/ios_app_with_transitive_framework/Framework1/Project.swift index 686ad0e9525..9628d4d53cc 100644 --- a/fixtures/ios_app_with_transitive_framework/Framework1/Project.swift +++ b/fixtures/ios_app_with_transitive_framework/Framework1/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework1", targets: [ - Target( + .target( name: "Framework1-iOS", - platform: .iOS, + destinations: .iOS, product: .framework, productName: "Framework1", bundleId: "io.tuist.Framework1", @@ -15,9 +15,9 @@ let project = Project( .framework(path: "../Framework2/prebuilt/iOS/Framework2.framework"), ] ), - Target( + .target( name: "Framework1-macOS", - platform: .macOS, + destinations: [.mac], product: .framework, productName: "Framework1", bundleId: "io.tuist.Framework1", @@ -27,9 +27,9 @@ let project = Project( .framework(path: "../Framework2/prebuilt/Mac/Framework2.framework"), ] ), - Target( + .target( name: "Framework1Tests-iOS", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.Framework1Tests", infoPlist: "Tests/Info.plist", @@ -38,9 +38,9 @@ let project = Project( .target(name: "Framework1-iOS"), ] ), - Target( + .target( name: "Framework1Tests-macOS", - platform: .macOS, + destinations: [.mac], product: .unitTests, bundleId: "io.tuist.Framework1Tests", infoPlist: "Tests/Info.plist", diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/Project.swift b/fixtures/ios_app_with_transitive_framework/Framework2/Project.swift index 5865a221e64..f477c081a0b 100644 --- a/fixtures/ios_app_with_transitive_framework/Framework2/Project.swift +++ b/fixtures/ios_app_with_transitive_framework/Framework2/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework2", targets: [ - Target( + .target( name: "Framework2-iOS", - platform: .iOS, + destinations: .iOS, product: .framework, productName: "Framework2", bundleId: "io.tuist.Framework2", @@ -15,9 +15,9 @@ let project = Project( ], settings: .settings(base: ["BUILD_LIBRARY_FOR_DISTRIBUTION": "YES"]) ), - Target( + .target( name: "Framework2-macOS", - platform: .macOS, + destinations: [.mac], product: .framework, productName: "Framework2", bundleId: "io.tuist.Framework2", diff --git a/fixtures/ios_app_with_transitive_framework/StaticFramework1/Project.swift b/fixtures/ios_app_with_transitive_framework/StaticFramework1/Project.swift index 0c323a444cd..ab1af823f77 100644 --- a/fixtures/ios_app_with_transitive_framework/StaticFramework1/Project.swift +++ b/fixtures/ios_app_with_transitive_framework/StaticFramework1/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "StaticFramework1", targets: [ - Target( + .target( name: "StaticFramework1", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.StaticFramework1", infoPlist: .default, @@ -14,9 +14,9 @@ let project = Project( .framework(path: "../Framework2/prebuilt/iOS/Framework2.framework"), ] ), - Target( + .target( name: "StaticFramework1Tests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.StaticFramework1Tests", infoPlist: .default, diff --git a/fixtures/ios_app_with_transitive_project/App/Project.swift b/fixtures/ios_app_with_transitive_project/App/Project.swift index 246e1389041..a19ad103073 100644 --- a/fixtures/ios_app_with_transitive_project/App/Project.swift +++ b/fixtures/ios_app_with_transitive_project/App/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "MainApp", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Config/App-Info.plist", @@ -15,9 +15,9 @@ let project = Project( .project(target: "FrameworkA-iOS", path: "../FrameworkA"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Config/AppTests-Info.plist", @@ -26,9 +26,9 @@ let project = Project( .target(name: "App"), ] ), - Target( + .target( name: "AppUITests", - platform: .iOS, + destinations: .iOS, product: .uiTests, bundleId: "io.tuist.AppUITests", infoPlist: "Config/AppTests-Info.plist", diff --git a/fixtures/ios_app_with_transitive_project/Framework1/Project.swift b/fixtures/ios_app_with_transitive_project/Framework1/Project.swift index b68b9c168c0..2d086ea46ea 100644 --- a/fixtures/ios_app_with_transitive_project/Framework1/Project.swift +++ b/fixtures/ios_app_with_transitive_project/Framework1/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework1", targets: [ - Target( + .target( name: "Framework1-iOS", - platform: .iOS, + destinations: .iOS, product: .staticFramework, productName: "Framework1", bundleId: "io.tuist.Framework1", @@ -15,9 +15,9 @@ let project = Project( .project(target: "Framework2-iOS", path: "../Framework2"), ] ), - Target( + .target( name: "Framework1-macOS", - platform: .macOS, + destinations: [.mac], product: .framework, productName: "Framework1", bundleId: "io.tuist.Framework1", @@ -27,9 +27,9 @@ let project = Project( .project(target: "Framework2-macOS", path: "../Framework2"), ] ), - Target( + .target( name: "Framework1Tests-iOS", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.Framework1Tests", infoPlist: "Tests/Info.plist", @@ -38,9 +38,9 @@ let project = Project( .target(name: "Framework1-iOS"), ] ), - Target( + .target( name: "Framework1Tests-macOS", - platform: .macOS, + destinations: [.mac], product: .unitTests, bundleId: "io.tuist.Framework1Tests", infoPlist: "Tests/Info.plist", diff --git a/fixtures/ios_app_with_transitive_project/Framework2/Project.swift b/fixtures/ios_app_with_transitive_project/Framework2/Project.swift index 4770e771e77..a4d47a373ce 100644 --- a/fixtures/ios_app_with_transitive_project/Framework2/Project.swift +++ b/fixtures/ios_app_with_transitive_project/Framework2/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Framework2", targets: [ - Target( + .target( name: "Framework2-iOS", - platform: .iOS, + destinations: .iOS, product: .staticFramework, productName: "Framework2", bundleId: "io.tuist.Framework2", @@ -14,9 +14,9 @@ let project = Project( dependencies: [ ] ), - Target( + .target( name: "Framework2-macOS", - platform: .macOS, + destinations: [.mac], product: .framework, productName: "Framework2", bundleId: "io.tuist.Framework2", diff --git a/fixtures/ios_app_with_transitive_project/FrameworkA/Project.swift b/fixtures/ios_app_with_transitive_project/FrameworkA/Project.swift index 4f7ba09e998..6ee8379d90c 100644 --- a/fixtures/ios_app_with_transitive_project/FrameworkA/Project.swift +++ b/fixtures/ios_app_with_transitive_project/FrameworkA/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "FrameworkA", targets: [ - Target( + .target( name: "FrameworkA-iOS", - platform: .iOS, + destinations: .iOS, product: .staticFramework, productName: "FrameworkA", bundleId: "io.tuist.FrameworkA", @@ -15,9 +15,9 @@ let project = Project( .project(target: "FrameworkB-iOS", path: "../FrameworkB"), ] ), - Target( + .target( name: "FrameworkA-macOS", - platform: .macOS, + destinations: [.mac], product: .framework, productName: "FrameworkA", bundleId: "io.tuist.FrameworkA", diff --git a/fixtures/ios_app_with_transitive_project/FrameworkB/Project.swift b/fixtures/ios_app_with_transitive_project/FrameworkB/Project.swift index b45c9cd4371..418eea65e60 100644 --- a/fixtures/ios_app_with_transitive_project/FrameworkB/Project.swift +++ b/fixtures/ios_app_with_transitive_project/FrameworkB/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "FrameworkB", targets: [ - Target( + .target( name: "FrameworkB-iOS", - platform: .iOS, + destinations: .iOS, product: .staticFramework, productName: "FrameworkB", bundleId: "io.tuist.FrameworkB", @@ -15,9 +15,9 @@ let project = Project( .project(target: "FrameworkC-iOS", path: "../FrameworkC"), ] ), - Target( + .target( name: "FrameworkB-macOS", - platform: .macOS, + destinations: [.mac], product: .framework, productName: "FrameworkB", bundleId: "io.tuist.FrameworkB", diff --git a/fixtures/ios_app_with_transitive_project/FrameworkC/Project.swift b/fixtures/ios_app_with_transitive_project/FrameworkC/Project.swift index 8acfcf6c70f..6aee65a1aef 100644 --- a/fixtures/ios_app_with_transitive_project/FrameworkC/Project.swift +++ b/fixtures/ios_app_with_transitive_project/FrameworkC/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "FrameworkC", targets: [ - Target( + .target( name: "FrameworkC-iOS", - platform: .iOS, + destinations: .iOS, product: .staticFramework, productName: "FrameworkC", bundleId: "io.tuist.FrameworkC", @@ -13,9 +13,9 @@ let project = Project( sources: "Sources/**", dependencies: [] ), - Target( + .target( name: "FrameworkC-macOS", - platform: .macOS, + destinations: [.mac], product: .framework, productName: "FrameworkC", bundleId: "io.tuist.FrameworkC", diff --git a/fixtures/ios_app_with_watch_application/Project.swift b/fixtures/ios_app_with_watch_application/Project.swift index 8ac74b435ab..8d9cc9fbce7 100644 --- a/fixtures/ios_app_with_watch_application/Project.swift +++ b/fixtures/ios_app_with_watch_application/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "AppWithWatchApp", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: .default, @@ -20,25 +20,25 @@ let project = Project( .target(name: "Framework_a_ios"), ] ), - Target( + .target( name: "Framework_a_ios", - platform: .iOS, + destinations: .iOS, product: .framework, productName: "FrameworkA", bundleId: "io.tuist.framework.a" ), - Target( + .target( name: "Framework_a_watchos", - platform: .watchOS, + destinations: [.appleWatch], product: .framework, productName: "FrameworkA", bundleId: "io.tuist.framework.a" ), // In Xcode 14, watch application can now leverage the `.app` product type // rather than the previous `.watch2App` type - Target( + .target( name: "WatchApp", - platform: .watchOS, + destinations: [.appleWatch], product: .app, bundleId: "io.tuist.App.watchkitapp", infoPlist: nil, @@ -62,9 +62,9 @@ let project = Project( ] ) ), - Target( + .target( name: "WatchWidgetExtension", - platform: .watchOS, + destinations: [.appleWatch], product: .appExtension, bundleId: "io.tuist.App.watchkitapp.widgetExtension", infoPlist: .extendingDefault(with: [ @@ -79,9 +79,9 @@ let project = Project( .target(name: "Framework_a_watchos"), ] ), - Target( + .target( name: "WatchAppTests", - platform: .watchOS, + destinations: [.appleWatch], product: .unitTests, bundleId: "io.tuist.App.watchkitapptests", infoPlist: .default, diff --git a/fixtures/ios_app_with_watchapp2/Project.swift b/fixtures/ios_app_with_watchapp2/Project.swift index 9170015a257..52d8a5069de 100644 --- a/fixtures/ios_app_with_watchapp2/Project.swift +++ b/fixtures/ios_app_with_watchapp2/Project.swift @@ -6,9 +6,9 @@ let project = Project( .package(path: "Packages/LibraryA"), ], targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Support/App-Info.plist", @@ -24,9 +24,9 @@ let project = Project( .package(product: "LibraryA"), ] ), - Target( + .target( name: "WatchApp", - platform: .watchOS, + destinations: [.appleWatch], product: .watch2App, bundleId: "io.tuist.App.watchkitapp", infoPlist: .default, @@ -35,9 +35,9 @@ let project = Project( .target(name: "WatchAppExtension"), ] ), - Target( + .target( name: "WatchAppExtension", - platform: .watchOS, + destinations: [.appleWatch], product: .watch2Extension, bundleId: "io.tuist.App.watchkitapp.watchkitextension", infoPlist: .extendingDefault(with: [ @@ -49,9 +49,9 @@ let project = Project( .package(product: "LibraryA"), ] ), - Target( + .target( name: "WatchAppUITests", - platform: .watchOS, + destinations: [.appleWatch], product: .uiTests, bundleId: "io.tuist.App.watchkitapp.uitests", dependencies: [.target(name: "WatchApp")] diff --git a/fixtures/ios_app_with_watchapp2_xcode14/Project.swift b/fixtures/ios_app_with_watchapp2_xcode14/Project.swift index b46821424df..25081b3f246 100644 --- a/fixtures/ios_app_with_watchapp2_xcode14/Project.swift +++ b/fixtures/ios_app_with_watchapp2_xcode14/Project.swift @@ -6,9 +6,9 @@ let project = Project( .package(path: "Packages/LibraryA"), ], targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Support/App-Info.plist", @@ -24,7 +24,7 @@ let project = Project( .package(product: "LibraryA"), ] ), - Target( + .target( name: "WatchApp", platform: .watchOS, product: .watch2App, @@ -35,7 +35,7 @@ let project = Project( .target(name: "WatchAppExtension"), ] ), - Target( + .target( name: "WatchAppExtension", platform: .watchOS, product: .watch2Extension, @@ -50,7 +50,7 @@ let project = Project( .target(name: "WatchAppWidgetExtension"), ] ), - Target( + .target( name: "WatchAppWidgetExtension", platform: .watchOS, product: .appExtension, @@ -67,7 +67,7 @@ let project = Project( .sdk(name: "SwiftUI", type: .framework, status: .required), ] ), - Target( + .target( name: "WatchAppUITests", platform: .watchOS, product: .uiTests, diff --git a/fixtures/ios_app_with_xcframeworks/Modules/StaticFrameworkA/Project.swift b/fixtures/ios_app_with_xcframeworks/Modules/StaticFrameworkA/Project.swift index b20325891bb..f01b00af53e 100644 --- a/fixtures/ios_app_with_xcframeworks/Modules/StaticFrameworkA/Project.swift +++ b/fixtures/ios_app_with_xcframeworks/Modules/StaticFrameworkA/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "StaticFrameworkA", targets: [ - Target( + .target( name: "StaticFrameworkA", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.StaticFrameworkA", infoPlist: .default, diff --git a/fixtures/ios_app_with_xcframeworks/Modules/StaticFrameworkB/Project.swift b/fixtures/ios_app_with_xcframeworks/Modules/StaticFrameworkB/Project.swift index db110421ca7..7d2c3d44559 100644 --- a/fixtures/ios_app_with_xcframeworks/Modules/StaticFrameworkB/Project.swift +++ b/fixtures/ios_app_with_xcframeworks/Modules/StaticFrameworkB/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "StaticFrameworkB", targets: [ - Target( + .target( name: "StaticFrameworkB", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.StaticFrameworkB", infoPlist: .default, diff --git a/fixtures/ios_app_with_xcframeworks/Project.swift b/fixtures/ios_app_with_xcframeworks/Project.swift index 97a9c7fbb59..91a16eac8d8 100644 --- a/fixtures/ios_app_with_xcframeworks/Project.swift +++ b/fixtures/ios_app_with_xcframeworks/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Info.plist", @@ -22,9 +22,9 @@ let project = Project( "BITCODE_ENABLED": "NO", ]) ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_app_with_xcframeworks/XCFrameworks/MyFramework/Project.swift b/fixtures/ios_app_with_xcframeworks/XCFrameworks/MyFramework/Project.swift index 56d0a9dd40c..b1051d72382 100644 --- a/fixtures/ios_app_with_xcframeworks/XCFrameworks/MyFramework/Project.swift +++ b/fixtures/ios_app_with_xcframeworks/XCFrameworks/MyFramework/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "MyFramework", targets: [ - Target( + .target( name: "MyFramework", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.MyFramework", infoPlist: "Info.plist", @@ -22,9 +22,9 @@ let project = Project( "BUILD_LIBRARY_FOR_DISTRIBUTION": "YES", ]) ), - Target( + .target( name: "MyFrameworkTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.MyFrameworkTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_app_with_xcframeworks/XCFrameworks/MyStaticFramework/Project.swift b/fixtures/ios_app_with_xcframeworks/XCFrameworks/MyStaticFramework/Project.swift index dc70ef4a912..67cda05d3e4 100644 --- a/fixtures/ios_app_with_xcframeworks/XCFrameworks/MyStaticFramework/Project.swift +++ b/fixtures/ios_app_with_xcframeworks/XCFrameworks/MyStaticFramework/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "MyStaticFramework", targets: [ - Target( + .target( name: "MyStaticFramework", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.MyStaticFramework", infoPlist: "Info.plist", diff --git a/fixtures/ios_app_with_xcframeworks/XCFrameworks/MyStaticLibrary/Project.swift b/fixtures/ios_app_with_xcframeworks/XCFrameworks/MyStaticLibrary/Project.swift index 0dc044768c3..de88f9f0355 100644 --- a/fixtures/ios_app_with_xcframeworks/XCFrameworks/MyStaticLibrary/Project.swift +++ b/fixtures/ios_app_with_xcframeworks/XCFrameworks/MyStaticLibrary/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "MyStaticLibrary", targets: [ - Target( + .target( name: "MyStaticLibrary", - platform: .iOS, + destinations: .iOS, product: .staticLibrary, bundleId: "io.tuist.MyStaticLibrary", infoPlist: "Info.plist", diff --git a/fixtures/ios_workspace_with_dependency_cycle/App/Project.swift b/fixtures/ios_workspace_with_dependency_cycle/App/Project.swift index 2705db712be..996e2cd40d0 100644 --- a/fixtures/ios_workspace_with_dependency_cycle/App/Project.swift +++ b/fixtures/ios_workspace_with_dependency_cycle/App/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Info.plist", @@ -20,9 +20,9 @@ let project = Project( .project(target: "FrameworkA", path: "../Frameworks/FrameworkA"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_workspace_with_dependency_cycle/Frameworks/FrameworkA/Project.swift b/fixtures/ios_workspace_with_dependency_cycle/Frameworks/FrameworkA/Project.swift index c6b653c5e85..58ce793b477 100644 --- a/fixtures/ios_workspace_with_dependency_cycle/Frameworks/FrameworkA/Project.swift +++ b/fixtures/ios_workspace_with_dependency_cycle/Frameworks/FrameworkA/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "FrameworkA", targets: [ - Target( + .target( name: "FrameworkA", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.FrameworkA", infoPlist: "Info.plist", @@ -20,9 +20,9 @@ let project = Project( .project(target: "FrameworkB", path: "../FrameworkB"), ] ), - Target( + .target( name: "FrameworkATests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.FrameworkATests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_workspace_with_dependency_cycle/Frameworks/FrameworkB/Project.swift b/fixtures/ios_workspace_with_dependency_cycle/Frameworks/FrameworkB/Project.swift index 9f12f879e5b..fb9390f23fb 100644 --- a/fixtures/ios_workspace_with_dependency_cycle/Frameworks/FrameworkB/Project.swift +++ b/fixtures/ios_workspace_with_dependency_cycle/Frameworks/FrameworkB/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "FrameworkB", targets: [ - Target( + .target( name: "FrameworkB", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.FrameworkB", infoPlist: "Info.plist", @@ -20,9 +20,9 @@ let project = Project( .project(target: "FrameworkA", path: "../FrameworkA"), ] ), - Target( + .target( name: "FrameworkBTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.FrameworkBTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/CoreFramework/Project.swift b/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/CoreFramework/Project.swift index 3a5da32895a..91a5213c5e3 100644 --- a/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/CoreFramework/Project.swift +++ b/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/CoreFramework/Project.swift @@ -4,9 +4,9 @@ import ProjectDescription let project = Project( name: "Core", targets: [ - Target( + .target( name: "Core", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: .bundleId(for: "Core"), infoPlist: "Info.plist", @@ -16,9 +16,9 @@ let project = Project( // "Resources/**" ] ), - Target( + .target( name: "CoreTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: .bundleId(for: "CoreTests"), infoPlist: "Tests.plist", diff --git a/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/DataFramework/Project.swift b/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/DataFramework/Project.swift index 1e4d34c3c34..94b97b9d33d 100644 --- a/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/DataFramework/Project.swift +++ b/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/DataFramework/Project.swift @@ -4,9 +4,9 @@ import ProjectDescription let project = Project( name: "Data", targets: [ - Target( + .target( name: "Data", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: .bundleId(for: "Data"), infoPlist: "Info.plist", @@ -21,9 +21,9 @@ let project = Project( .project(target: "Core", path: "../CoreFramework"), ] ), - Target( + .target( name: "DataTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: .bundleId(for: "DataFrameworkTests"), infoPlist: "Tests.plist", diff --git a/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/FeatureAFramework/Project.swift b/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/FeatureAFramework/Project.swift index 22a2d5a13bc..75eeeb9987d 100644 --- a/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/FeatureAFramework/Project.swift +++ b/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/FeatureAFramework/Project.swift @@ -4,9 +4,9 @@ import ProjectDescription let project = Project( name: "FrameworkA", targets: [ - Target( + .target( name: "FrameworkA", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: .bundleId(for: "FrameworkA"), infoPlist: "Info.plist", @@ -24,9 +24,9 @@ let project = Project( .project(target: "UIComponents", path: "../UIComponentsFramework"), ] ), - Target( + .target( name: "FrameworkATests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: .bundleId(for: "FrameworkATests"), infoPlist: "Tests.plist", diff --git a/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/FeatureContracts/Project.swift b/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/FeatureContracts/Project.swift index 7a79176a9ce..6d721810d87 100644 --- a/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/FeatureContracts/Project.swift +++ b/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/FeatureContracts/Project.swift @@ -4,9 +4,9 @@ import ProjectDescription let project = Project( name: "FeatureContracts", targets: [ - Target( + .target( name: "FeatureContracts", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: .bundleId(for: "FeatureContracts"), infoPlist: "Info.plist", @@ -22,9 +22,9 @@ let project = Project( .project(target: "Core", path: "../CoreFramework"), ] ), - Target( + .target( name: "FeatureContractsTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: .bundleId(for: "FeatureContractsTests"), infoPlist: "Tests.plist", diff --git a/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/UIComponentsFramework/Project.swift b/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/UIComponentsFramework/Project.swift index 3be8d9c041a..b3306eb6a09 100644 --- a/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/UIComponentsFramework/Project.swift +++ b/fixtures/ios_workspace_with_microfeature_architecture/Frameworks/UIComponentsFramework/Project.swift @@ -4,9 +4,9 @@ import ProjectDescription let project = Project( name: "UIComponents", targets: [ - Target( + .target( name: "UIComponents", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: .bundleId(for: "UIComponents"), infoPlist: "Info.plist", @@ -21,9 +21,9 @@ let project = Project( .project(target: "FeatureContracts", path: "../FeatureContracts"), ] ), - Target( + .target( name: "UIComponentsTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: .bundleId(for: "UIComponentsTests"), infoPlist: "Tests.plist", diff --git a/fixtures/ios_workspace_with_microfeature_architecture/Project.swift b/fixtures/ios_workspace_with_microfeature_architecture/Project.swift index 1c184494546..b9e625ce7b5 100644 --- a/fixtures/ios_workspace_with_microfeature_architecture/Project.swift +++ b/fixtures/ios_workspace_with_microfeature_architecture/Project.swift @@ -4,9 +4,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: .bundleId(for: "App"), infoPlist: "App/Info.plist", @@ -21,9 +21,9 @@ let project = Project( .project(target: "FrameworkA", path: "Frameworks/FeatureAFramework"), ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: .bundleId(for: "AppTests"), infoPlist: "App/Tests.plist", diff --git a/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/CoreFramework/Project.swift b/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/CoreFramework/Project.swift index a8e867cfc30..f5d10ede9ce 100644 --- a/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/CoreFramework/Project.swift +++ b/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/CoreFramework/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Core", targets: [ - Target( + .target( name: "Core", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.Core", infoPlist: "Info.plist", @@ -15,9 +15,9 @@ let project = Project( // "Resources/**" ] ), - Target( + .target( name: "CoreTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.CoreTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/DataFramework/Project.swift b/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/DataFramework/Project.swift index 8357b410f4f..f1c3b5cb3bd 100644 --- a/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/DataFramework/Project.swift +++ b/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/DataFramework/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Data", targets: [ - Target( + .target( name: "Data", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.Data", infoPlist: "Info.plist", @@ -20,9 +20,9 @@ let project = Project( .project(target: "Core", path: "../CoreFramework"), ] ), - Target( + .target( name: "DataTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.DataFrameworkTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/FeatureAFramework/Project.swift b/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/FeatureAFramework/Project.swift index 66455d054cf..4d1c420cd13 100644 --- a/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/FeatureAFramework/Project.swift +++ b/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/FeatureAFramework/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "FrameworkA", targets: [ - Target( + .target( name: "FrameworkA", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.FrameworkA", infoPlist: "Info.plist", @@ -23,9 +23,9 @@ let project = Project( .project(target: "UIComponents", path: "../UIComponentsFramework"), ] ), - Target( + .target( name: "FrameworkATests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.FrameworkATests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/FeatureContracts/Project.swift b/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/FeatureContracts/Project.swift index 4c3edfc4e55..77e4fc633e4 100644 --- a/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/FeatureContracts/Project.swift +++ b/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/FeatureContracts/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "FeatureContracts", targets: [ - Target( + .target( name: "FeatureContracts", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.FeatureContracts", infoPlist: "Info.plist", @@ -21,9 +21,9 @@ let project = Project( .project(target: "Core", path: "../CoreFramework"), ] ), - Target( + .target( name: "FeatureContractsTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.FeatureContractsTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/UIComponentsFramework/Project.swift b/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/UIComponentsFramework/Project.swift index 846cb25d8c4..f4b82d8713d 100644 --- a/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/UIComponentsFramework/Project.swift +++ b/fixtures/ios_workspace_with_microfeature_architecture_static_linking/Frameworks/UIComponentsFramework/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "UIComponents", targets: [ - Target( + .target( name: "UIComponents", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.UIComponents", infoPlist: "Info.plist", @@ -20,9 +20,9 @@ let project = Project( .project(target: "FeatureContracts", path: "../FeatureContracts"), ] ), - Target( + .target( name: "UIComponentsTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.UIComponentsTests", infoPlist: "Tests.plist", diff --git a/fixtures/ios_workspace_with_microfeature_architecture_static_linking/StaticApp/Project.swift b/fixtures/ios_workspace_with_microfeature_architecture_static_linking/StaticApp/Project.swift index 4374cacf21a..b2e3abe6dbe 100644 --- a/fixtures/ios_workspace_with_microfeature_architecture_static_linking/StaticApp/Project.swift +++ b/fixtures/ios_workspace_with_microfeature_architecture_static_linking/StaticApp/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "StaticApp", targets: [ - Target( + .target( name: "StaticApp", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.StaticApp", infoPlist: "Info.plist", @@ -20,9 +20,9 @@ let project = Project( .project(target: "FrameworkA", path: "../Frameworks/FeatureAFramework"), ] ), - Target( + .target( name: "StaticAppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.StaticAppTests", infoPlist: "Tests.plist", diff --git a/fixtures/macos_app_with_app_inside/Project.swift b/fixtures/macos_app_with_app_inside/Project.swift index ae835426a56..bf3692f9bcf 100644 --- a/fixtures/macos_app_with_app_inside/Project.swift +++ b/fixtures/macos_app_with_app_inside/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Embedded App", targets: [ - Target( + .target( name: "MainApp", - platform: .macOS, + destinations: [.mac], product: .app, bundleId: "io.tuist.MainApp", infoPlist: "MainApp/Info.plist", @@ -18,17 +18,17 @@ let project = Project( .target(name: "InnerCLI"), ] ), - Target( + .target( name: "InnerApp", - platform: .macOS, + destinations: [.mac], product: .app, bundleId: "io.tuist.InnerApp", infoPlist: "InnerApp/Info.plist", sources: ["InnerApp/Sources/**"] ), - Target( + .target( name: "InnerCLI", - platform: .macOS, + destinations: [.mac], product: .commandLineTool, bundleId: "io.tuist.InnerCLI", sources: ["InnerCLI/**"] diff --git a/fixtures/macos_app_with_copy_files/Project.swift b/fixtures/macos_app_with_copy_files/Project.swift index 002a6c300de..dda9483a50e 100644 --- a/fixtures/macos_app_with_copy_files/Project.swift +++ b/fixtures/macos_app_with_copy_files/Project.swift @@ -1,9 +1,9 @@ import ProjectDescription func target(name: String) -> Target { - Target( + .target( name: name, - platform: .macOS, + destinations: [.mac], product: .app, bundleId: "io.tuist.\(name)", infoPlist: .file(path: .relativeToManifest("Info.plist")), diff --git a/fixtures/macos_app_with_extensions/Project.swift b/fixtures/macos_app_with_extensions/Project.swift index a9b159dc496..3b0857ac0e6 100644 --- a/fixtures/macos_app_with_extensions/Project.swift +++ b/fixtures/macos_app_with_extensions/Project.swift @@ -15,18 +15,18 @@ let workflowExtensionSettings: SettingsDictionary = [ let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .macOS, + destinations: [.mac], product: .app, bundleId: "io.tuist.app", infoPlist: .default, sources: "App/**", dependencies: [.target(name: "Workflow")] ), - Target( + .target( name: "Workflow", - platform: .macOS, + destinations: [.mac], product: .appExtension, bundleId: "io.tuist.app.workflow", infoPlist: .extendingDefault(with: [ diff --git a/fixtures/macos_app_with_system_extension/Project.swift b/fixtures/macos_app_with_system_extension/Project.swift index a94a1411f74..20d324ddff5 100644 --- a/fixtures/macos_app_with_system_extension/Project.swift +++ b/fixtures/macos_app_with_system_extension/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App with SystemExtension", targets: [ - Target( + .target( name: "MainApp", - platform: .macOS, + destinations: [.mac], product: .app, bundleId: "io.tuist.MainApp", infoPlist: "MainApp/Info.plist", @@ -14,9 +14,9 @@ let project = Project( .target(name: "SystemExtension"), ] ), - Target( + .target( name: "SystemExtension", - platform: .macOS, + destinations: [.mac], product: .systemExtension, bundleId: "io.tuist.SystemExtension", sources: ["SystemExtension/Sources/**"] diff --git a/fixtures/macos_app_with_xpc/Project.swift b/fixtures/macos_app_with_xpc/Project.swift index 1a6dbebebdc..da9d3f79c90 100644 --- a/fixtures/macos_app_with_xpc/Project.swift +++ b/fixtures/macos_app_with_xpc/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App with XPC", targets: [ - Target( + .target( name: "MainApp", - platform: .macOS, + destinations: [.mac], product: .app, bundleId: "io.tuist.MainApp", infoPlist: "MainApp/Info.plist", @@ -14,9 +14,9 @@ let project = Project( .target(name: "XPCApp"), ] ), - Target( + .target( name: "XPCApp", - platform: .macOS, + destinations: [.mac], product: .xpc, bundleId: "io.tuist.XPCApp", sources: ["XPCApp/Sources/**"], @@ -25,16 +25,16 @@ let project = Project( .target(name: "StaticFramework"), ] ), - Target( + .target( name: "DynamicFramework", - platform: .macOS, + destinations: [.mac], product: .framework, bundleId: "io.tuist.DynamicFramework", sources: ["DynamicFramework/Sources/**"] ), - Target( + .target( name: "StaticFramework", - platform: .macOS, + destinations: [.mac], product: .staticFramework, bundleId: "io.tuist.StaticFramework", sources: ["StaticFramework/Sources/**"] diff --git a/fixtures/manifest_with_logs/Project.swift b/fixtures/manifest_with_logs/Project.swift index 2ec384f63ee..a491d470a26 100644 --- a/fixtures/manifest_with_logs/Project.swift +++ b/fixtures/manifest_with_logs/Project.swift @@ -2,9 +2,9 @@ import ProjectDescription func target(name: String) -> Target { print("Target name - \(name)") - return Target( + return .target( name: name, - platform: .macOS, + destinations: [.mac], product: .app, bundleId: "io.tuist.\(name)", infoPlist: .default, diff --git a/fixtures/multiplatform_app_with_extension/Project.swift b/fixtures/multiplatform_app_with_extension/Project.swift index ca9a7dbaba5..316b154b0db 100644 --- a/fixtures/multiplatform_app_with_extension/Project.swift +++ b/fixtures/multiplatform_app_with_extension/Project.swift @@ -1,6 +1,6 @@ import ProjectDescription -let appTarget = Target( +let appTarget: Target = .target( name: "App", destinations: [.iPhone, .iPad, .appleVision], product: .app, @@ -13,7 +13,7 @@ let appTarget = Target( ] ) -let widgetExtensionTarget = Target( +let widgetExtensionTarget: Target = .target( name: "WidgetExtension", destinations: [.iPhone, .iPad], product: .appExtension, @@ -28,7 +28,7 @@ let widgetExtensionTarget = Target( resources: "Extensions/WidgetExtension/Resources/**" ) -let watchApp = Target( +let watchApp: Target = .target( name: "WatchApp", destinations: [.appleWatch], product: .app, diff --git a/fixtures/multiplatform_app_with_sdk/Modules/StaticFramework/Project.swift b/fixtures/multiplatform_app_with_sdk/Modules/StaticFramework/Project.swift index 45708c1a6a3..6aece5d8b22 100644 --- a/fixtures/multiplatform_app_with_sdk/Modules/StaticFramework/Project.swift +++ b/fixtures/multiplatform_app_with_sdk/Modules/StaticFramework/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "StaticFramework", targets: [ - Target( + .target( name: "StaticFramework", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.StaticFramework", infoPlist: "Support/Info.plist", @@ -15,9 +15,9 @@ let project = Project( .sdk(name: "c++", type: .library), ] ), - Target( + .target( name: "StaticFrameworkTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.StaticFrameworkTests", infoPlist: "Support/Tests.plist", diff --git a/fixtures/multiplatform_app_with_sdk/Project.swift b/fixtures/multiplatform_app_with_sdk/Project.swift index 1864cb8bb4d..3fbf69a4d21 100644 --- a/fixtures/multiplatform_app_with_sdk/Project.swift +++ b/fixtures/multiplatform_app_with_sdk/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "Project", targets: [ - Target( + .target( name: "MyTestFramework", - platform: .iOS, + destinations: .iOS, product: .framework, bundleId: "io.tuist.MyTestFramework", infoPlist: .default, @@ -14,9 +14,9 @@ let project = Project( .xctest, ] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Support/Tests.plist", @@ -26,7 +26,7 @@ let project = Project( .target(name: "MyTestFramework"), ] ), - Target( + .target( name: "App", destinations: [.iPhone, .iPad, .mac], product: .app, @@ -41,7 +41,7 @@ let project = Project( .sdk(name: "MobileCoreServices", type: .framework, status: .required, condition: .when([.ios])), ] ), - Target( + .target( name: "MultiPlatformFramework", destinations: [.iPad, .iPhone, .mac, .appleTv], product: .framework, diff --git a/fixtures/multiplatform_app_with_sdk/Tuist/Dependencies.swift b/fixtures/multiplatform_app_with_sdk/Tuist/Dependencies.swift deleted file mode 100644 index 45f7093e0a4..00000000000 --- a/fixtures/multiplatform_app_with_sdk/Tuist/Dependencies.swift +++ /dev/null @@ -1,6 +0,0 @@ -import ProjectDescription - -let dependencies = Dependencies( - swiftPackageManager: .init(), - platforms: [.macOS, .iOS] -) diff --git a/fixtures/multiplatform_app_with_sdk/Tuist/Package.swift b/fixtures/multiplatform_app_with_sdk/Tuist/Package.swift index 49994d9822a..36f84b74369 100644 --- a/fixtures/multiplatform_app_with_sdk/Tuist/Package.swift +++ b/fixtures/multiplatform_app_with_sdk/Tuist/Package.swift @@ -1,6 +1,14 @@ // swift-tools-version: 5.9 import PackageDescription +#if TUIST + import ProjectDescription + + let packageSettings = PackageSettings( + platforms: [.macOS, .iOS] + ) +#endif + let package = Package( name: "PackageName", dependencies: [ diff --git a/fixtures/project_with_test_and_run_locales/Project.swift b/fixtures/project_with_test_and_run_locales/Project.swift index 5add4318223..8533c52b557 100644 --- a/fixtures/project_with_test_and_run_locales/Project.swift +++ b/fixtures/project_with_test_and_run_locales/Project.swift @@ -13,13 +13,13 @@ let project = Project( targets: [ .init( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app" ), .init( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.appTests" ), diff --git a/fixtures/tvos_app_with_extensions/Project.swift b/fixtures/tvos_app_with_extensions/Project.swift index e6b89102586..3580cb65645 100644 --- a/fixtures/tvos_app_with_extensions/Project.swift +++ b/fixtures/tvos_app_with_extensions/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .tvOS, + destinations: [.appleTv], product: .app, bundleId: "io.tuist.App", infoPlist: "Info.plist", @@ -14,9 +14,9 @@ let project = Project( .target(name: "TopShelfExtension"), ] ), - Target( + .target( name: "TopShelfExtension", - platform: .tvOS, + destinations: [.appleTv], product: .tvTopShelfExtension, bundleId: "io.tuist.App.TopShelfExtension", infoPlist: .extendingDefault(with: [ @@ -30,9 +30,9 @@ let project = Project( dependencies: [ ] ), - Target( + .target( name: "StaticFramework", - platform: .iOS, + destinations: .iOS, product: .staticFramework, bundleId: "io.tuist.App.StaticFramework", infoPlist: .default, diff --git a/fixtures/tvos_app_with_uitest/Project.swift b/fixtures/tvos_app_with_uitest/Project.swift index 3fa11ee96ea..b931d715737 100644 --- a/fixtures/tvos_app_with_uitest/Project.swift +++ b/fixtures/tvos_app_with_uitest/Project.swift @@ -3,18 +3,18 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .tvOS, + destinations: [.appleTv], product: .app, bundleId: "io.tuist.App", - deploymentTarget: .tvOS(targetVersion: "14.0"), + deploymentTargets: .tvOS("14.0"), infoPlist: .default, sources: .paths([.relativeToManifest("App/Sources/**")]) ), - Target( + .target( name: "AppUITests", - platform: .tvOS, + destinations: [.appleTv], product: .uiTests, bundleId: "io.tuist.AppUITests", infoPlist: "UITests.plist", diff --git a/fixtures/visionos_app/Project.swift b/fixtures/visionos_app/Project.swift index e29a907f3c8..875347a76e9 100644 --- a/fixtures/visionos_app/Project.swift +++ b/fixtures/visionos_app/Project.swift @@ -3,9 +3,9 @@ import ProjectDescription let project = Project( name: "App", targets: [ - Target( + .target( name: "App", - platform: .visionOS, + destinations: [.appleVision], product: .app, bundleId: "io.tuist.App", infoPlist: "Support/Info.plist", @@ -15,9 +15,9 @@ let project = Project( // "Resources/**" ] ), - Target( + .target( name: "AppTests", - platform: .visionOS, + destinations: [.appleVision], product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Support/Tests.plist", diff --git a/fixtures/workspace_with_multiple_projects/ProjectA/Project.swift b/fixtures/workspace_with_multiple_projects/ProjectA/Project.swift index 6525b8b52b5..a5d5daa3254 100644 --- a/fixtures/workspace_with_multiple_projects/ProjectA/Project.swift +++ b/fixtures/workspace_with_multiple_projects/ProjectA/Project.swift @@ -4,18 +4,18 @@ let project = Project( name: "ProjectA", organizationName: "tuist.io", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app", deploymentTarget: .iOS(targetVersion: "13.0", devices: .iphone), infoPlist: .default, sources: ["Targets/App/Sources/**"] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: .default, diff --git a/fixtures/workspace_with_multiple_projects/ProjectB/Project.swift b/fixtures/workspace_with_multiple_projects/ProjectB/Project.swift index 75746c35bae..2eea208dacc 100644 --- a/fixtures/workspace_with_multiple_projects/ProjectB/Project.swift +++ b/fixtures/workspace_with_multiple_projects/ProjectB/Project.swift @@ -4,18 +4,18 @@ let project = Project( name: "ProjectB", organizationName: "tuist.io", targets: [ - Target( + .target( name: "App", - platform: .iOS, + destinations: [.iPhone], product: .app, bundleId: "io.tuist.app", - deploymentTarget: .iOS(targetVersion: "13.0", devices: .iphone), + deploymentTargets: .iOS("13.0"), infoPlist: .default, sources: ["Targets/App/Sources/**"] ), - Target( + .target( name: "AppTests", - platform: .iOS, + destinations: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: .default, diff --git a/fixtures/workspace_with_test_locale/Project.swift b/fixtures/workspace_with_test_locale/Project.swift index 2beee910048..212d66689da 100644 --- a/fixtures/workspace_with_test_locale/Project.swift +++ b/fixtures/workspace_with_test_locale/Project.swift @@ -13,7 +13,7 @@ let project = Project( targets: [ .init( name: "App", - platform: .iOS, + destinations: .iOS, product: .app, bundleId: "io.tuist.app" ), diff --git a/make/tasks/workspace/benchmark.sh b/make/tasks/workspace/benchmark.sh index 2fee117df1b..730e1c73446 100755 --- a/make/tasks/workspace/benchmark.sh +++ b/make/tasks/workspace/benchmark.sh @@ -35,10 +35,9 @@ FIXTURES_JSON=$(jq -n --argjson arr "$(printf '%s\n' "${FIXTURES_LIST[@]}" | jq echo $FIXTURES_JSON > $FIXTURES_JSON_PATH -echo "$(format_section "Building tuist and tuistenv")" +echo "$(format_section "Building tuist")" swift build --package-path $ROOT_DIR --product tuist -c release -swift build --package-path $ROOT_DIR --product tuistenv -c release swift build --package-path $ROOT_DIR --product ProjectDescription -c release echo "$(format_section "Benchmarking")" -$ROOT_DIR/.build/release/tuistbenchmark benchmark -b $ROOT_DIR/.build/release/tuist -r $ROOT_DIR/.build/release/tuistenv --fixture-list $FIXTURES_JSON_PATH --format markdown \ No newline at end of file +$ROOT_DIR/.build/release/tuistbenchmark benchmark -b $ROOT_DIR/.build/release/tuist --fixture-list $FIXTURES_JSON_PATH --format markdown \ No newline at end of file diff --git a/make/tasks/workspace/release/bundle.sh b/make/tasks/workspace/release/bundle.sh index dd4b9ffff0d..fa4480d6ea5 100755 --- a/make/tasks/workspace/release/bundle.sh +++ b/make/tasks/workspace/release/bundle.sh @@ -105,9 +105,6 @@ build_xcframework_library "ProjectAutomation" echo "$(format_subsection "Building tuist executable")" build_fat_release_binary "tuist" $ROOT_DIR $BUILD_DIRECTORY -echo "$(format_subsection "Building tuistenv executable")" -build_fat_release_binary "tuistenv" $ROOT_DIR $BUILD_DIRECTORY - echo "$(format_section "Copying assets")" echo "$(format_subsection "Copying Tuist's templates")" @@ -120,8 +117,6 @@ echo "$(format_section "Bundling")" ( cd $BUILD_DIRECTORY || exit 1 - echo "$(format_subsection "Bundling tuistenv.zip")" - zip -q -r --symlinks tuistenv.zip tuistenv echo "$(format_subsection "Bundling tuist.zip")" zip -q -r --symlinks tuist.zip tuist libswift_Concurrency.dylib ProjectAutomation.xcframework ProjectAutomation.xcframework.dSYM ProjectDescription.framework ProjectDescription.framework.dSYM Templates vendor echo "$(format_subsection "Bundling ProjectDescription.framework.zip")" @@ -129,7 +124,7 @@ echo "$(format_section "Bundling")" echo "$(format_subsection "Bundling ProjectAutomation.xcframework.zip")" zip -q -r --symlinks ProjectAutomation.xcframework.zip ProjectAutomation.xcframework ProjectAutomation.xcframework.dSYM - rm -rf tuist tuistenv ProjectAutomation.xcframework ProjectAutomation.xcframework.dSYM ProjectDescription.framework ProjectDescription.framework.dSYM Templates vendor + rm -rf tuist ProjectAutomation.xcframework ProjectAutomation.xcframework.dSYM ProjectDescription.framework ProjectDescription.framework.dSYM Templates vendor : > SHASUMS256.txt : > SHASUMS512.txt diff --git a/script/install b/script/install deleted file mode 100755 index 84145f1482e..00000000000 --- a/script/install +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash - -set -e - -shell_join() { - local arg - printf "%s" "$1" - shift - for arg in "$@"; do - printf " " - printf "%s" "${arg// /\ }" - done -} - -ohai() { - printf "${tty_blue}==>${tty_bold} %s${tty_reset}\n" "$(shell_join "$@")" -} - -warn() { - printf "${tty_red}Warning${tty_reset}: %s\n" "$(chomp "$1")" -} - -# The line below extracts the version from the list of tags in the Tuist repository. -LATEST_VERSION=$(git ls-remote -t --sort=v:refname https://github.com/tuist/tuist.git | sed -ne '$s/.*tags\/\(.*\)/\1/p') -ohai "Downloading tuistenv..." -[ -f /tmp/tuistenv.zip ] && rm /tmp/tuistenv.zip -[ -f /tmp/tuistenv ] && rm /tmp/tuistenv -curl -LSsf --output /tmp/tuistenv.zip https://github.com/tuist/tuist/releases/download/${LATEST_VERSION}/tuistenv.zip -ohai "Unzipping tuistenv..." -unzip -o /tmp/tuistenv.zip -d /tmp/tuistenv > /dev/null -ohai "Installing tuistenv..." - -INSTALL_DIR="/usr/local/bin" - -sudo_if_install_dir_not_writeable() { - local command="$1" - if [ -w $INSTALL_DIR ]; then - bash -c "${command}" - else - bash -c "sudo ${command}" - fi -} - -if [[ ! -d $INSTALL_DIR ]]; then - sudo_if_install_dir_not_writeable "mkdir -p ${INSTALL_DIR}" -fi - -if [[ -f "${INSTALL_DIR}/tuist" ]]; then - sudo_if_install_dir_not_writeable "rm ${INSTALL_DIR}/tuist" -fi - -sudo_if_install_dir_not_writeable "mv /tmp/tuistenv/tuistenv \"${INSTALL_DIR}/tuist\"" -sudo_if_install_dir_not_writeable "chmod +x \"${INSTALL_DIR}/tuist\"" - -rm -rf /tmp/tuistenv -rm /tmp/tuistenv.zip - -ohai "tuistenv installed. Try running 'tuist'" -ohai "Check out the documentation at https://docs.tuist.io/" diff --git a/script/uninstall b/script/uninstall deleted file mode 100755 index 1a138402d23..00000000000 --- a/script/uninstall +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -set -e - -shell_join() { - local arg - printf "%s" "$1" - shift - for arg in "$@"; do - printf " " - printf "%s" "${arg// /\ }" - done -} - -ohai() { - printf "${tty_blue}==>${tty_bold} %s${tty_reset}\n" "$(shell_join "$@")" -} - -warn() { - printf "${tty_red}Warning${tty_reset}: %s\n" "$(chomp "$1")" -} - -INSTALL_DIR="/usr/local/bin" - -sudo_if_install_dir_not_writeable() { - local command="$1" - if [ -w $INSTALL_DIR ]; then - bash -c "$command" - else - bash -c "sudo $command" - fi -} - -sudo_if_install_dir_not_writeable "rm -rf /usr/local/bin/tuist" -rm -rf ~/.tuist - -ohai "Tuist uninstalled" From daf3232315fd3b3853e5edeb87b32439bfdfc18b Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 31 Jan 2024 14:43:08 +0100 Subject: [PATCH 002/509] Add installation scripts back --- script/install.sh | 59 +++++++++++++++++++++++++++++++++++++++++++++ script/uninstall.sh | 37 ++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100755 script/install.sh create mode 100755 script/uninstall.sh diff --git a/script/install.sh b/script/install.sh new file mode 100755 index 00000000000..2c037ac2008 --- /dev/null +++ b/script/install.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +set -e + +shell_join() { + local arg + printf "%s" "$1" + shift + for arg in "$@"; do + printf " " + printf "%s" "${arg// /\ }" + done +} + +ohai() { + printf "${tty_blue}==>${tty_bold} %s${tty_reset}\n" "$(shell_join "$@")" +} + +warn() { + printf "${tty_red}Warning${tty_reset}: %s\n" "$(chomp "$1")" +} + +# The line below extracts the version from the list of tags in the Tuist repository. +LATEST_VERSION=$(git ls-remote -t --sort=v:refname https://github.com/tuist/tuist.git | sed -ne '$s/.*tags\/\(.*\)/\1/p') +ohai "Downloading tuistenv..." +[ -f /tmp/tuistenv.zip ] && rm /tmp/tuistenv.zip +[ -f /tmp/tuistenv ] && rm /tmp/tuistenv +curl -LSsf --output /tmp/tuistenv.zip https://github.com/tuist/tuist/releases/download/${LATEST_VERSION}/tuistenv.zip +ohai "Unzipping tuistenv..." +unzip -o /tmp/tuistenv.zip -d /tmp/tuistenv > /dev/null +ohai "Installing tuistenv..." + +INSTALL_DIR="/usr/local/bin" + +sudo_if_install_dir_not_writeable() { + local command="$1" + if [ -w $INSTALL_DIR ]; then + bash -c "${command}" + else + bash -c "sudo ${command}" + fi +} + +if [[ ! -d $INSTALL_DIR ]]; then + sudo_if_install_dir_not_writeable "mkdir -p ${INSTALL_DIR}" +fi + +if [[ -f "${INSTALL_DIR}/tuist" ]]; then + sudo_if_install_dir_not_writeable "rm ${INSTALL_DIR}/tuist" +fi + +sudo_if_install_dir_not_writeable "mv /tmp/tuistenv/tuistenv \"${INSTALL_DIR}/tuist\"" +sudo_if_install_dir_not_writeable "chmod +x \"${INSTALL_DIR}/tuist\"" + +rm -rf /tmp/tuistenv +rm /tmp/tuistenv.zip + +ohai "tuistenv installed. Try running 'tuist'" +ohai "Check out the documentation at https://docs.tuist.io/" \ No newline at end of file diff --git a/script/uninstall.sh b/script/uninstall.sh new file mode 100755 index 00000000000..8c7ea845e02 --- /dev/null +++ b/script/uninstall.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +set -e + +shell_join() { + local arg + printf "%s" "$1" + shift + for arg in "$@"; do + printf " " + printf "%s" "${arg// /\ }" + done +} + +ohai() { + printf "${tty_blue}==>${tty_bold} %s${tty_reset}\n" "$(shell_join "$@")" +} + +warn() { + printf "${tty_red}Warning${tty_reset}: %s\n" "$(chomp "$1")" +} + +INSTALL_DIR="/usr/local/bin" + +sudo_if_install_dir_not_writeable() { + local command="$1" + if [ -w $INSTALL_DIR ]; then + bash -c "$command" + else + bash -c "sudo $command" + fi +} + +sudo_if_install_dir_not_writeable "rm -rf /usr/local/bin/tuist" +rm -rf ~/.tuist + +ohai "Tuist uninstalled" \ No newline at end of file From 465f9259c9e49d7b3c094324af6cabae91fcde32 Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 31 Jan 2024 14:49:02 +0100 Subject: [PATCH 003/509] Fix script name --- script/{install.sh => install} | 0 script/{uninstall.sh => uninstall} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename script/{install.sh => install} (100%) rename script/{uninstall.sh => uninstall} (100%) diff --git a/script/install.sh b/script/install similarity index 100% rename from script/install.sh rename to script/install diff --git a/script/uninstall.sh b/script/uninstall similarity index 100% rename from script/uninstall.sh rename to script/uninstall From 2fb07b5e09f0b92ea5fcbb2f188956e92a7a2bcb Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 31 Jan 2024 15:06:23 +0000 Subject: [PATCH 004/509] [Release] Tuist 4.0.0-beta-1 --- .mise.toml | 2 +- CHANGELOG.md | 12 ++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index dabcf39a9d5..a3d2b9dc30a 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "3.42.2" +tuist = "4.0.0-beta-1" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index 71d92bca984..695d97163d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 4.0.0-beta-1 - 2024-01-31 + +### Tuist + +- no changes + +### Tuist Cloud + +#### Changed + +- Add --no-selective-testing flag, rename --no-cache to --no-binary-cache by [@fortmarek](https://github.com/fortmarek) + ## 3.42.2 - 2024-01-30 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index c635369702f..ac9529e2f0d 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "3.42.2" + public static let version = "4.0.0-beta-1" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From c078c04cd7ac5fc332a845e0ed85de67f0b8767e Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 31 Jan 2024 15:20:02 +0000 Subject: [PATCH 005/509] [Release] Tuist 4.0.0-beta-1 From e1653d83979c6d8f74323fd89c1d58a28eb16cc6 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 31 Jan 2024 15:23:37 +0000 Subject: [PATCH 006/509] [Release] Tuist 4.0.0-beta-1 From eafb5715571d5cb9e97a2b3487d694c7bc0de886 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 31 Jan 2024 15:30:36 +0000 Subject: [PATCH 007/509] [Release] Tuist 4.0.0-beta-1 From 6bd56483138267eb74a50a77dc4e563d2166a476 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 31 Jan 2024 15:37:08 +0000 Subject: [PATCH 008/509] [Release] Tuist 4.0.0-beta-1 From e01e0be43fc5d6ea31db922fdb4c79e7dfccc999 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 31 Jan 2024 15:43:53 +0000 Subject: [PATCH 009/509] [Release] Tuist 4.0.0-beta-1 From e74351a4cf2ee4f004502bc401cad7cfc1d7f775 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 31 Jan 2024 15:47:54 +0000 Subject: [PATCH 010/509] [Release] Tuist 4.0.0-beta-1 From 78785389d203b6c1601eb45b8369c36553f0293c Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 31 Jan 2024 15:51:59 +0000 Subject: [PATCH 011/509] [Release] Tuist 4.0.0-beta-1 From 9f560326631114ffba0213106308e8150328c1c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 31 Jan 2024 16:58:10 +0100 Subject: [PATCH 012/509] Remove the comment about the tuist-cloud CLI (#5856) --- .../tuist/tuist.docc/Articles/Tuist/Users/installation.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/installation.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/installation.md index 4620b363403..56527485748 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/installation.md +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/installation.md @@ -100,8 +100,6 @@ jobs: > Tip: We recommend using `mise use --pin` in your Tuist projects to pin the version of Tuist across environments. The command will create a `.tool-versions` file containing the version of Tuist. -> Important: **Tuist Cloud** (), a closed-source extension of Tuist with optimizations such as binary caching and selective testing, is distributed as a different asdf plugin, tuist-cloud. Note that by using it, you agree to the [Tuist Cloud Terms of Service](https://tuist.io/terms/). - ### Alternative: Homebrew If version pinning across environments is not a concern for you, From 146280ef794d07488677d80fb8e2d7e774762b09 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 31 Jan 2024 16:03:48 +0000 Subject: [PATCH 013/509] [Release] Tuist 4.0.0-beta-1 From 34471f69f210d76e45b3d270866e2d690975beb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sven=20M=C3=BCnnich?= Date: Wed, 31 Jan 2024 18:57:29 +0100 Subject: [PATCH 014/509] Fix install script (#5858) --- script/install | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/script/install b/script/install index 2c037ac2008..a84b76a2b8b 100755 --- a/script/install +++ b/script/install @@ -20,8 +20,9 @@ warn() { printf "${tty_red}Warning${tty_reset}: %s\n" "$(chomp "$1")" } -# The line below extracts the version from the list of tags in the Tuist repository. -LATEST_VERSION=$(git ls-remote -t --sort=v:refname https://github.com/tuist/tuist.git | sed -ne '$s/.*tags\/\(.*\)/\1/p') +# The line below extracts the latest 3.x version from the list of tags in the Tuist repository. +# Tuist v3 is the last major to provide tuistenv. +LATEST_VERSION=$(git ls-remote -t --sort=v:refname https://github.com/tuist/tuist.git | grep 'tags/3\.' | sed -ne '$s/.*tags\/\(.*\)/\1/p') ohai "Downloading tuistenv..." [ -f /tmp/tuistenv.zip ] && rm /tmp/tuistenv.zip [ -f /tmp/tuistenv ] && rm /tmp/tuistenv From 59087d030642b1de882dc3204d1882ac18e5b2e5 Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 31 Jan 2024 17:49:44 +0100 Subject: [PATCH 015/509] Adapt the manifests to Tuist 4 --- Project.swift | 14 +++++++------- .../ProjectDescriptionHelpers/Target+Helpers.swift | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Project.swift b/Project.swift index 514fb9a7de7..4592e8fe7d4 100644 --- a/Project.swift +++ b/Project.swift @@ -476,20 +476,20 @@ let acceptanceTests: [(target: Target, scheme: Scheme)] = ["", "Build", "Depende .external(name: "SystemPackage"), ] ), - scheme: Scheme( + scheme: .scheme( name: "Tuist\($0)AcceptanceTests", - buildAction: BuildAction(targets: ["Tuist\($0)AcceptanceTests"]), + buildAction: .buildAction(targets: ["Tuist\($0)AcceptanceTests"]), testAction: .targets( [ - TestableTarget( - target: "Tuist\($0)AcceptanceTests", - parallelizable: true, - randomExecutionOrdering: true + .testableTarget( + target: .target("Tuist\($0)AcceptanceTests"), + isParallelizable: true, + isRandomExecutionOrdering: true ), ] ), runAction: .runAction( - arguments: Arguments( + arguments: .arguments( environmentVariables: [ "TUIST_CONFIG_SRCROOT": "$(SRCROOT)", "TUIST_FRAMEWORK_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", diff --git a/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift b/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift index 50cf6ad1244..964466f7f60 100644 --- a/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift +++ b/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift @@ -24,7 +24,7 @@ extension Target { default: rootFolder = "Sources" } - return Target( + return .target( name: name, destinations: [.mac], product: product, From 689319e46f66378c9aa0d50f4bb5d5500f92b21f Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 31 Jan 2024 18:59:53 +0100 Subject: [PATCH 016/509] Fixes --- .../SwiftPackageManager/PackageInfoMapperTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 4b9845dc760..2da8cd435c7 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -466,7 +466,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - customSources: .custom(.init( + customSources: .custom(.sourceFilesList( globs: [ basePath .appending(try RelativePath(validating: "Package/\(alternativeDefaultSource)/Target1/**")) From 6d577abbc2c15d2bb8dfc48203b4295e1fb3ad37 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 1 Feb 2024 11:21:33 +0100 Subject: [PATCH 017/509] Fix pipelines --- .github/workflows/tuist.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tuist.yml b/.github/workflows/tuist.yml index 2d4c8483ff9..34a74a880b9 100644 --- a/.github/workflows/tuist.yml +++ b/.github/workflows/tuist.yml @@ -49,7 +49,7 @@ jobs: - name: Fetch dependencies run: tuist fetch - name: Test - run: tuist test --xcframeworks --skip-test-targets TuistBuildAcceptanceTests TuistDependenciesAcceptanceTests TuistGenerateAcceptanceTests TuistTestAcceptanceTests TuistAcceptanceTests --result-bundle-path /tmp/tuist/test-${{ matrix.feature }} + run: tuist test --skip-test-targets TuistBuildAcceptanceTests TuistDependenciesAcceptanceTests TuistGenerateAcceptanceTests TuistTestAcceptanceTests TuistAcceptanceTests --result-bundle-path /tmp/tuist/test-${{ matrix.feature }} - uses: actions/upload-artifact@v4 if: ${{ always() }} with: @@ -76,9 +76,9 @@ jobs: - name: Fetch dependencies run: tuist fetch - name: Print hashes - run: tuist cache print-hashes --xcframeworks + run: tuist cache --print-hashes - name: Cache warm - run: tuist cache warm --xcframeworks + run: tuist cache acceptance_tests: name: Run ${{ matrix.feature }} From cfc8b577ed973acfef7f7c50301c3995ddd44e1e Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 1 Feb 2024 11:25:38 +0100 Subject: [PATCH 018/509] Add missing changes --- .github/workflows/tuist.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tuist.yml b/.github/workflows/tuist.yml index 34a74a880b9..985b9fe5a22 100644 --- a/.github/workflows/tuist.yml +++ b/.github/workflows/tuist.yml @@ -116,7 +116,7 @@ jobs: - name: Fetch dependencies run: tuist fetch - name: Run acceptance tests - run: tuist test --xcframeworks --result-bundle-path /tmp/tuist/test-${{ matrix.feature }} ${{ matrix.feature }} + run: tuist test --result-bundle-path /tmp/tuist/test-${{ matrix.feature }} ${{ matrix.feature }} - uses: actions/upload-artifact@v4 if: ${{ always() }} with: From 86203043ceda349d8c024ea0005db132f7151316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Thu, 1 Feb 2024 16:00:12 +0100 Subject: [PATCH 019/509] Rename `fetch` to `install` (#5857) * Rename fetch to install * Some further renames --- ...{FetchCommand.swift => InstallCommand.swift} | 17 ++++++----------- Sources/TuistKit/Commands/TuistCommand.swift | 2 +- ...{FetchService.swift => InstallService.swift} | 2 +- Sources/TuistPlugin/PluginService.swift | 2 +- .../EditAcceptanceTests.swift | 2 +- .../PluginAcceptanceTests.swift | 2 +- .../ScaffoldAcceptanceTests.swift | 10 +++++----- .../BuildAcceptanceTests.swift | 6 +++--- .../DependenciesAcceptanceTests.swift | 2 +- ...iceTests.swift => InstallServiceTests.swift} | 12 ++++++------ Tuist/Config.swift | 3 +-- .../Contributors/get-started-as-contributor.md | 2 +- .../external-dependencies.tutorial | 6 +++--- .../{tuist-fetch.sh => tuist-install.sh} | 2 +- .../Tuist/Users/command-line-interface.md | 4 ++-- make/tasks/tuist/build.sh | 2 +- make/tasks/tuist/generate.sh | 2 +- make/tasks/tuist/test.sh | 2 +- 18 files changed, 37 insertions(+), 43 deletions(-) rename Sources/TuistKit/Commands/{FetchCommand.swift => InstallCommand.swift} (52%) rename Sources/TuistKit/Services/{FetchService.swift => InstallService.swift} (98%) rename Tests/TuistKitTests/Services/{FetchServiceTests.swift => InstallServiceTests.swift} (92%) rename docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/{tuist-fetch.sh => tuist-install.sh} (84%) diff --git a/Sources/TuistKit/Commands/FetchCommand.swift b/Sources/TuistKit/Commands/InstallCommand.swift similarity index 52% rename from Sources/TuistKit/Commands/FetchCommand.swift rename to Sources/TuistKit/Commands/InstallCommand.swift index c2cfc65bab0..84aaa87d3cb 100644 --- a/Sources/TuistKit/Commands/FetchCommand.swift +++ b/Sources/TuistKit/Commands/InstallCommand.swift @@ -2,18 +2,13 @@ import ArgumentParser import Foundation import TSCBasic -enum FetchCategory: String, CaseIterable, RawRepresentable, ExpressibleByArgument { - case dependencies - case plugins -} - -/// A command to fetch any remote content necessary to interact with the project. -public struct FetchCommand: AsyncParsableCommand { +/// A command to install the remote content the project depends on. +public struct InstallCommand: AsyncParsableCommand { public init() {} public static var configuration: CommandConfiguration { CommandConfiguration( - commandName: "fetch", - abstract: "Fetches any remote content necessary to interact with the project." + commandName: "install", + abstract: "Installs any remote content (e.g. dependencies) necessary to interact with the project." ) } @@ -26,12 +21,12 @@ public struct FetchCommand: AsyncParsableCommand { @Flag( name: .shortAndLong, - help: "Instead of simple fetch, update external content when available." + help: "Instead of simple install, update external content when available." ) var update: Bool = false public func run() async throws { - try await FetchService().run( + try await InstallService().run( path: path, update: update ) diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index e1f51474548..ccb9d767362 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -14,7 +14,7 @@ public struct TuistCommand: AsyncParsableCommand { CleanCommand.self, DumpCommand.self, EditCommand.self, - FetchCommand.self, + InstallCommand.self, GenerateCommand.self, GraphCommand.self, InitCommand.self, diff --git a/Sources/TuistKit/Services/FetchService.swift b/Sources/TuistKit/Services/InstallService.swift similarity index 98% rename from Sources/TuistKit/Services/FetchService.swift rename to Sources/TuistKit/Services/InstallService.swift index c759b5b8e5f..a1d1d365f06 100644 --- a/Sources/TuistKit/Services/FetchService.swift +++ b/Sources/TuistKit/Services/InstallService.swift @@ -7,7 +7,7 @@ import TuistLoader import TuistPlugin import TuistSupport -final class FetchService { +final class InstallService { private let pluginService: PluginServicing private let configLoader: ConfigLoading private let swiftPackageManagerController: SwiftPackageManagerControlling diff --git a/Sources/TuistPlugin/PluginService.swift b/Sources/TuistPlugin/PluginService.swift index 15c4c209077..e31cf595b1e 100644 --- a/Sources/TuistPlugin/PluginService.swift +++ b/Sources/TuistPlugin/PluginService.swift @@ -29,7 +29,7 @@ enum PluginServiceError: FatalError, Equatable { var description: String { switch self { case let .missingRemotePlugins(plugins): - return "Remote plugins \(plugins.joined(separator: ", ")) have not been fetched. Try running tuist fetch." + return "Remote plugins \(plugins.joined(separator: ", ")) have not been fetched. Try running 'tuist install'." case let .invalidURL(url): return "Invalid URL for the plugin's Github repository: \(url)." } diff --git a/Tests/TuistAcceptanceTests/EditAcceptanceTests.swift b/Tests/TuistAcceptanceTests/EditAcceptanceTests.swift index 72feb61a1d4..22ef2a5e124 100644 --- a/Tests/TuistAcceptanceTests/EditAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/EditAcceptanceTests.swift @@ -24,7 +24,7 @@ final class EditAcceptanceTestPlugin: TuistAcceptanceTestCase { final class EditAcceptanceTestAppWithPlugins: TuistAcceptanceTestCase { func test_app_with_plugins() async throws { try setUpFixture(.appWithPlugins) - try await run(FetchCommand.self) + try await run(InstallCommand.self) try await run(EditCommand.self) try build(scheme: "Manifests") try build(scheme: "Plugins") diff --git a/Tests/TuistAcceptanceTests/PluginAcceptanceTests.swift b/Tests/TuistAcceptanceTests/PluginAcceptanceTests.swift index bf712ce142c..58b96a3f342 100644 --- a/Tests/TuistAcceptanceTests/PluginAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/PluginAcceptanceTests.swift @@ -16,7 +16,7 @@ final class PluginAcceptanceTestTuistPlugin: TuistAcceptanceTestCase { final class PluginAcceptanceTestAppWithPlugins: TuistAcceptanceTestCase { func test_app_with_plugins() async throws { try setUpFixture(.appWithPlugins) - try await run(FetchCommand.self) + try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self) } diff --git a/Tests/TuistAcceptanceTests/ScaffoldAcceptanceTests.swift b/Tests/TuistAcceptanceTests/ScaffoldAcceptanceTests.swift index d39e7eaa154..84588f231a2 100644 --- a/Tests/TuistAcceptanceTests/ScaffoldAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/ScaffoldAcceptanceTests.swift @@ -14,7 +14,7 @@ final class ScaffoldAcceptanceTests: TuistAcceptanceTestCase { func test_ios_app_with_templates_custom() async throws { try setUpFixture(.iosAppWithTemplates) - try await run(FetchCommand.self) + try await run(InstallCommand.self) try await ScaffoldCommand.preprocess([ "scaffold", "custom", @@ -40,7 +40,7 @@ final class ScaffoldAcceptanceTests: TuistAcceptanceTestCase { func test_ios_app_with_templates_custom_using_filters() async throws { try setUpFixture(.iosAppWithTemplates) - try await run(FetchCommand.self) + try await run(InstallCommand.self) try await ScaffoldCommand.preprocess([ "scaffold", "custom_using_filters", @@ -59,7 +59,7 @@ final class ScaffoldAcceptanceTests: TuistAcceptanceTestCase { func test_ios_app_with_templates_custom_using_copy_folder() async throws { try setUpFixture(.iosAppWithTemplates) - try await run(FetchCommand.self) + try await run(InstallCommand.self) try await ScaffoldCommand.preprocess([ "scaffold", "custom_using_copy_folder", @@ -99,7 +99,7 @@ final class ScaffoldAcceptanceTests: TuistAcceptanceTestCase { func test_app_with_plugins_local_plugin() async throws { try setUpFixture(.appWithPlugins) - try await run(FetchCommand.self) + try await run(InstallCommand.self) try await ScaffoldCommand.preprocess(["scaffold", "custom", "--name", "PluginTemplate", "--path", fixturePath.pathString]) try await run(ScaffoldCommand.self, "custom", "--name", "PluginTemplate") let pluginTemplateDirectory = fixturePath.appending(component: "PluginTemplate") @@ -118,7 +118,7 @@ final class ScaffoldAcceptanceTests: TuistAcceptanceTestCase { func test_app_with_plugins_remote_plugin() async throws { try setUpFixture(.appWithPlugins) - try await run(FetchCommand.self) + try await run(InstallCommand.self) try await ScaffoldCommand.preprocess([ "scaffold", "custom_two", diff --git a/Tests/TuistBuildAcceptanceTests/BuildAcceptanceTests.swift b/Tests/TuistBuildAcceptanceTests/BuildAcceptanceTests.swift index 2bd23483c37..36030fff7d7 100644 --- a/Tests/TuistBuildAcceptanceTests/BuildAcceptanceTests.swift +++ b/Tests/TuistBuildAcceptanceTests/BuildAcceptanceTests.swift @@ -90,7 +90,7 @@ final class BuildAcceptanceTestFrameworkWithSwiftMacroIntegratedWithStandardMeth final class BuildAcceptanceTestFrameworkWithSwiftMacroIntegratedWithXcodeProjPrimitives: TuistAcceptanceTestCase { func test_framework_with_swift_macro_integrated_with_xcode_proj_primitives() async throws { try setUpFixture(.frameworkWithNativeSwiftMacro) - try await run(FetchCommand.self) + try await run(InstallCommand.self) try await run(BuildCommand.self, "Framework", "--platform", "macos") try await run(BuildCommand.self, "Framework", "--platform", "ios") } @@ -107,7 +107,7 @@ final class BuildAcceptanceTestMultiplatformAppWithExtensions: TuistAcceptanceTe final class BuildAcceptanceTestMultiplatformAppWithSDK: TuistAcceptanceTestCase { func test() async throws { try setUpFixture(.multiplatformAppWithSdk) - try await run(FetchCommand.self) + try await run(InstallCommand.self) try await run(BuildCommand.self, "App", "--platform", "macos") try await run(BuildCommand.self, "App", "--platform", "ios") } @@ -116,7 +116,7 @@ final class BuildAcceptanceTestMultiplatformAppWithSDK: TuistAcceptanceTestCase final class BuildAcceptanceTestAppWithSPMDependencies: TuistAcceptanceTestCase { func test() async throws { try setUpFixture(.appWithSpmDependencies) - try await run(FetchCommand.self) + try await run(InstallCommand.self) try await run(BuildCommand.self, "App", "--platform", "ios") } } diff --git a/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift b/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift index a06f854e4f6..411fee2785f 100644 --- a/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift +++ b/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift @@ -8,7 +8,7 @@ import XCTest final class DependenciesAcceptanceTestAppWithSPMDependencies: TuistAcceptanceTestCase { func test_app_spm_dependencies() async throws { try setUpFixture(.appWithSpmDependencies) - try await run(FetchCommand.self) + try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "App") } diff --git a/Tests/TuistKitTests/Services/FetchServiceTests.swift b/Tests/TuistKitTests/Services/InstallServiceTests.swift similarity index 92% rename from Tests/TuistKitTests/Services/FetchServiceTests.swift rename to Tests/TuistKitTests/Services/InstallServiceTests.swift index a4728b3c28c..fa98f726ba8 100644 --- a/Tests/TuistKitTests/Services/FetchServiceTests.swift +++ b/Tests/TuistKitTests/Services/InstallServiceTests.swift @@ -14,12 +14,12 @@ import XCTest @testable import TuistKit -final class FetchServiceTests: TuistUnitTestCase { +final class InstallServiceTests: TuistUnitTestCase { private var pluginService: MockPluginService! private var configLoader: MockConfigLoader! private var swiftPackageManagerController: MockSwiftPackageManagerController! - private var subject: FetchService! + private var subject: InstallService! override func setUp() { super.setUp() @@ -28,7 +28,7 @@ final class FetchServiceTests: TuistUnitTestCase { configLoader = MockConfigLoader() swiftPackageManagerController = MockSwiftPackageManagerController() - subject = FetchService( + subject = InstallService( pluginService: pluginService, configLoader: configLoader, swiftPackageManagerController: swiftPackageManagerController @@ -73,7 +73,7 @@ final class FetchServiceTests: TuistUnitTestCase { XCTAssertFalse(swiftPackageManagerController.invokedResolve) } - func test_run_when_fetching_plugins() async throws { + func test_run_when_installing_plugins() async throws { // Given let config = Config.test( plugins: [ @@ -99,7 +99,7 @@ final class FetchServiceTests: TuistUnitTestCase { XCTAssertEqual(invokedConfig, config) } - func test_run_when_fetching_dependencies() async throws { + func test_run_when_installing_dependencies() async throws { // Given let stubbedPath = try temporaryPath() @@ -125,7 +125,7 @@ final class FetchServiceTests: TuistUnitTestCase { XCTAssertFalse(swiftPackageManagerController.invokedUpdate) } - func test_fetch_when_from_a_tuist_project_directory() async throws { + func test_install_when_from_a_tuist_project_directory() async throws { // Given let temporaryDirectory = try temporaryPath() let expectedFoundPackageLocation = temporaryDirectory.appending( diff --git a/Tuist/Config.swift b/Tuist/Config.swift index b59e66aa51c..012bbfd665c 100644 --- a/Tuist/Config.swift +++ b/Tuist/Config.swift @@ -6,6 +6,5 @@ let config = Config( url: "https://cloud.tuist.io", options: [.optional] ), - swiftVersion: .init("5.9"), - generationOptions: .options(enforceExplicitDependencies: true) + swiftVersion: .init("5.9") ) diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Contributors/get-started-as-contributor.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Contributors/get-started-as-contributor.md index fc24a578bab..1989ed9a742 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Contributors/get-started-as-contributor.md +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Contributors/get-started-as-contributor.md @@ -29,7 +29,7 @@ To start working on the project, we can follow the steps below: - Clone the repository by running: `git clone git@github.com:tuist/tuist.git` - Set up [asdf](https://asdf-vm.com/) to ensure a stable local environment. -- Run `tuist fetch` to get all the external dependencies needed by tuist +- Run `tuist install` to get all the external dependencies needed by tuist - Run `tuist generate` to generate the Tuist Xcode project using tuist itself The generated project opens automatically. If you need to open again without generating it, run `open Tuist.xcworkspace` (or ue Finder). Note that `xed .` will open the package, and not the project generated by tuist. diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/external-dependencies.tutorial b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/external-dependencies.tutorial index 3535fc039a2..0bb85853801 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/external-dependencies.tutorial +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/external-dependencies.tutorial @@ -24,14 +24,14 @@ @Section(title: "Fetching package dependencies") { @ContentAndMedia { - Unlike Xcode's default integration, which resolves the dependencies at launch time or whenever Xcode thinks resolution is necessary, we resolve them through the `tuist fetch` command. + Unlike Xcode's default integration, which resolves the dependencies at launch time or whenever Xcode thinks resolution is necessary, we resolve them through the `tuist install` command. } @Steps { @Step { - Run `tuist fetch` to resolve the dependencies using the Swift Package Manager under `Tuist/Dependencies`. The generated workspace will contain projects and targets for them. + Run `tuist install` to resolve the dependencies using the Swift Package Manager under `Tuist/Dependencies`. The generated workspace will contain projects and targets for them. - @Code(name: "Console", file: "tuist-fetch.sh", reset: true) + @Code(name: "Console", file: "tuist-install.sh", reset: true) } @Step { diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/tuist-fetch.sh b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/tuist-install.sh similarity index 84% rename from docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/tuist-fetch.sh rename to docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/tuist-install.sh index 7e52e2a0148..f9f13efab73 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/tuist-fetch.sh +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/tuist-install.sh @@ -1,4 +1,4 @@ -$ tuist fetch +$ tuist install Resolving and fetching dependencies. Installing Swift Package Manager dependencies. diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/command-line-interface.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/command-line-interface.md index 2a05209b1d8..b844cd83c3a 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/command-line-interface.md +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/command-line-interface.md @@ -22,9 +22,9 @@ If you want to learn more about the commands, you can run `tuist help` to get a **We recommend editing the manifest files using Xcode** because it provides a better experience than editing them using a text editor. For instance, Xcode provides syntax highlighting, code completion, and more. -### Fetch +### Install -`tuist fetch` is the command that you use to fetch the Package dependencies () in the `Package.swift` file. It resolves the dependencies using the Swift Package Manager and generates the `Package.resolved` file. When your Xcode projects are generated, Tuist generates Xcode projects for the dependencies and links them to the Xcode projects of your project. +`tuist install` is the command that you use to fetch the Package dependencies () in the `Package.swift` file. It resolves the dependencies using the Swift Package Manager and generates the `Package.resolved` file. When your Xcode projects are generated, Tuist generates Xcode projects for the dependencies and links them to the Xcode projects of your project. ### Build diff --git a/make/tasks/tuist/build.sh b/make/tasks/tuist/build.sh index da82c384577..c7768f0778e 100755 --- a/make/tasks/tuist/build.sh +++ b/make/tasks/tuist/build.sh @@ -6,5 +6,5 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) swift build --package-path $ROOT_DIR -$ROOT_DIR/.build/debug/tuist fetch --path $ROOT_DIR +$ROOT_DIR/.build/debug/tuist install --path $ROOT_DIR $ROOT_DIR/.build/debug/tuist build --path $ROOT_DIR --generate $@ \ No newline at end of file diff --git a/make/tasks/tuist/generate.sh b/make/tasks/tuist/generate.sh index cac87970c5c..11e7713daaf 100755 --- a/make/tasks/tuist/generate.sh +++ b/make/tasks/tuist/generate.sh @@ -6,5 +6,5 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) swift build --package-path $ROOT_DIR -$ROOT_DIR/.build/debug/tuist fetch --path $ROOT_DIR +$ROOT_DIR/.build/debug/tuist install --path $ROOT_DIR $ROOT_DIR/.build/debug/tuist generate --path $ROOT_DIR $@ diff --git a/make/tasks/tuist/test.sh b/make/tasks/tuist/test.sh index 802e38cd1fc..8b83e304714 100755 --- a/make/tasks/tuist/test.sh +++ b/make/tasks/tuist/test.sh @@ -6,5 +6,5 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) swift build --package-path $ROOT_DIR -$ROOT_DIR/.build/debug/tuist fetch --path $ROOT_DIR +$ROOT_DIR/.build/debug/tuist install --path $ROOT_DIR $ROOT_DIR/.build/debug/tuist test --path $ROOT_DIR $@ \ No newline at end of file From 3afa200b7f6062f27b4dbda91b181ee364e2f7aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 1 Feb 2024 18:05:09 +0100 Subject: [PATCH 020/509] Change Package.swift directory from Tuist to root (#5862) * Change Package.swift directory from Tuist to root * Update docs * Update docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/external-dependencies.tutorial Co-authored-by: Daniele Formichelli * Get it relative to the Tusit directory --------- Co-authored-by: Daniele Formichelli Co-authored-by: Pedro --- .../TuistKit/Services/InstallService.swift | 7 ++-- .../Loaders/CachedManifestLoader.swift | 2 +- .../TuistLoader/Loaders/ManifestLoader.swift | 3 +- .../SwiftPackageManagerGraphLoader.swift | 7 +--- .../Utils/ManifestFilesLocator.swift | 39 ++++++++++++------- .../DumpServiceIntegrationTests.swift | 6 +-- .../Services/InstallServiceTests.swift | 4 +- .../Loaders/ManifestLoaderTests.swift | 15 ++----- .../Utils/ManifestFilesLocatorTests.swift | 3 +- .../external-dependencies.tutorial | 6 +-- .../{Tuist => }/Package.swift | 0 .../{Tuist => }/Package.resolved | 0 .../{Tuist => }/Package.swift | 4 +- .../{Tuist => }/Package.resolved | 0 .../{Tuist => }/Package.swift | 0 .../{Tuist => }/Package.resolved | 0 .../{Tuist => }/Package.swift | 0 17 files changed, 46 insertions(+), 50 deletions(-) rename fixtures/app_with_plugins/{Tuist => }/Package.swift (100%) rename fixtures/app_with_spm_dependencies/{Tuist => }/Package.resolved (100%) rename fixtures/app_with_spm_dependencies/{Tuist => }/Package.swift (87%) rename fixtures/framework_with_native_swift_macro/{Tuist => }/Package.resolved (100%) rename fixtures/framework_with_native_swift_macro/{Tuist => }/Package.swift (100%) rename fixtures/multiplatform_app_with_sdk/{Tuist => }/Package.resolved (100%) rename fixtures/multiplatform_app_with_sdk/{Tuist => }/Package.swift (100%) diff --git a/Sources/TuistKit/Services/InstallService.swift b/Sources/TuistKit/Services/InstallService.swift index a1d1d365f06..5433105190a 100644 --- a/Sources/TuistKit/Services/InstallService.swift +++ b/Sources/TuistKit/Services/InstallService.swift @@ -56,8 +56,7 @@ final class InstallService { private func fetchDependencies(path: AbsolutePath, update: Bool) throws { let packageManifestPath = path.appending( - components: Constants.tuistDirectoryName, - Constants.SwiftPackageManager.packageSwiftName + component: Constants.SwiftPackageManager.packageSwiftName ) guard fileHandler.exists(packageManifestPath) else { @@ -67,11 +66,11 @@ final class InstallService { if update { logger.info("Updating dependencies.", metadata: .section) - try swiftPackageManagerController.update(at: packageManifestPath.parentDirectory, printOutput: true) + try swiftPackageManagerController.update(at: path, printOutput: true) } else { logger.info("Resolving and fetching dependencies.", metadata: .section) - try swiftPackageManagerController.resolve(at: packageManifestPath.parentDirectory, printOutput: true) + try swiftPackageManagerController.resolve(at: path, printOutput: true) } } } diff --git a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift index c2a11ee5e7a..540159ecf88 100644 --- a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift @@ -90,7 +90,7 @@ public class CachedManifestLoader: ManifestLoading { } public func loadPackageSettings(at path: AbsolutePath) throws -> PackageSettings { - try load(manifest: .packageSettings, at: path.appending(components: Constants.tuistDirectoryName)) { + try load(manifest: .packageSettings, at: path) { try manifestLoader.loadPackageSettings(at: path) } } diff --git a/Sources/TuistLoader/Loaders/ManifestLoader.swift b/Sources/TuistLoader/Loaders/ManifestLoader.swift index aedacda8397..eec2d96cbc3 100644 --- a/Sources/TuistLoader/Loaders/ManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/ManifestLoader.swift @@ -179,9 +179,8 @@ public class ManifestLoader: ManifestLoading { } public func loadPackageSettings(at path: AbsolutePath) throws -> ProjectDescription.PackageSettings { - let packageManifestPath = path.appending(components: Constants.tuistDirectoryName) do { - return try loadManifest(.packageSettings, at: packageManifestPath) + return try loadManifest(.packageSettings, at: path) } catch let error as ManifestLoaderError { switch error { case let .manifestLoadingFailed(path: _, data: data, context: _): diff --git a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift index 6a3a899956e..47d4aeb770b 100644 --- a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift +++ b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift @@ -81,7 +81,7 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi plugins: Plugins ) throws -> TuistCore.DependenciesGraph { guard fileHandler.exists( - path.appending(components: Constants.tuistDirectoryName, Constants.SwiftPackageManager.packageSwiftName) + path.appending(component: Constants.SwiftPackageManager.packageSwiftName) ) else { return .none } @@ -89,10 +89,7 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi let packageSettings = try packageSettingsLoader.loadPackageSettings(at: path, with: plugins) let path = path.appending( - components: [ - Constants.tuistDirectoryName, - Constants.SwiftPackageManager.packageBuildDirectoryName, - ] + component: Constants.SwiftPackageManager.packageBuildDirectoryName ) let checkoutsFolder = path.appending(component: "checkouts") let workspacePath = path.appending(component: "workspace-state.json") diff --git a/Sources/TuistLoader/Utils/ManifestFilesLocator.swift b/Sources/TuistLoader/Utils/ManifestFilesLocator.swift index 5bad22f6e59..b9ab6e7d527 100644 --- a/Sources/TuistLoader/Utils/ManifestFilesLocator.swift +++ b/Sources/TuistLoader/Utils/ManifestFilesLocator.swift @@ -44,15 +44,20 @@ public protocol ManifestFilesLocating: AnyObject { public final class ManifestFilesLocator: ManifestFilesLocating { /// Utility to locate the root directory of the project let rootDirectoryLocator: RootDirectoryLocating + let fileHandler: FileHandling - public init(rootDirectoryLocator: RootDirectoryLocating = RootDirectoryLocator()) { + public init( + rootDirectoryLocator: RootDirectoryLocating = RootDirectoryLocator(), + fileHandler: FileHandling = FileHandler.shared + ) { self.rootDirectoryLocator = rootDirectoryLocator + self.fileHandler = fileHandler } public func locateManifests(at locatingPath: AbsolutePath) -> [(Manifest, AbsolutePath)] { Manifest.allCases.compactMap { manifest in let path = locatingPath.appending(component: manifest.fileName(locatingPath)) - if FileHandler.shared.exists(path) { return (manifest, path) } + if fileHandler.exists(path) { return (manifest, path) } return nil } } @@ -66,7 +71,7 @@ public final class ManifestFilesLocator: ManifestFilesLocating { let pluginPath = locatingPath.appending( component: Manifest.plugin.fileName(locatingPath) ) - guard FileHandler.shared.exists(pluginPath) else { return [] } + guard fileHandler.exists(pluginPath) else { return [] } return [pluginPath] } else { let path = rootDirectoryLocator.locate(from: locatingPath) ?? locatingPath @@ -96,7 +101,7 @@ public final class ManifestFilesLocator: ManifestFilesLocating { Manifest.workspace.fileName(path), Manifest.plugin.fileName(path), ] - let tuistManifestsFilePaths = FileHandler.shared.glob(path, glob: "**/*.swift") + let tuistManifestsFilePaths = fileHandler.glob(path, glob: "**/*.swift") .filter { fileNamesCandidates.contains($0.basename) } .filter { hasValidManifestContent($0) } let cachedTuistManifestsFilePaths = Set(tuistManifestsFilePaths) @@ -105,7 +110,7 @@ public final class ManifestFilesLocator: ManifestFilesLocating { } private func hasValidManifestContent(_ path: AbsolutePath) -> Bool { - guard let content = try? FileHandler.shared.readTextFile(path) else { return false } + guard let content = try? fileHandler.readTextFile(path) else { return false } let tuistManifestSignature = "import ProjectDescription" return content.contains(tuistManifestSignature) || content.isEmpty @@ -145,7 +150,7 @@ public final class ManifestFilesLocator: ManifestFilesLocating { ) ), ] - .filter { FileHandler.shared.exists($0.path) } + .filter { fileHandler.exists($0.path) } } else { let path = rootDirectoryLocator.locate(from: locatingPath) ?? locatingPath @@ -175,24 +180,30 @@ public final class ManifestFilesLocator: ManifestFilesLocating { } public func locateConfig(at locatingPath: AbsolutePath) -> AbsolutePath? { - // swiftlint:disable:next force_try - let subPath = try! RelativePath(validating: "\(Constants.tuistDirectoryName)/\(Manifest.config.fileName(locatingPath))") - return traverseAndLocate(at: locatingPath, appending: subPath) + guard let tuistDirectory = traverseAndLocateTuistDirectory(at: locatingPath) else { return nil } + let configSwiftPath = tuistDirectory.appending(component: Manifest.config.fileName(locatingPath)) + if fileHandler.exists(configSwiftPath) { return configSwiftPath } + return nil } public func locatePackageManifest(at locatingPath: AbsolutePath) -> AbsolutePath? { - let subPath = - // swiftlint:disable:next force_try - try! RelativePath(validating: "\(Constants.tuistDirectoryName)/Package.swift") - return traverseAndLocate(at: locatingPath, appending: subPath) + guard let tuistDirectory = traverseAndLocateTuistDirectory(at: locatingPath) else { return nil } + let packageSwiftPath = tuistDirectory.parentDirectory.appending(component: Constants.SwiftPackageManager.packageSwiftName) + if fileHandler.exists(packageSwiftPath) { return packageSwiftPath } + return nil } // MARK: - Helpers + private func traverseAndLocateTuistDirectory(at locatingPath: AbsolutePath) -> AbsolutePath? { + // swiftlint:disable:next force_try + return traverseAndLocate(at: locatingPath, appending: try! RelativePath(validating: Constants.tuistDirectoryName)) + } + private func traverseAndLocate(at locatingPath: AbsolutePath, appending subpath: RelativePath) -> AbsolutePath? { let manifestPath = locatingPath.appending(subpath) - if FileHandler.shared.exists(manifestPath) { + if fileHandler.exists(manifestPath) { return manifestPath } else if locatingPath != .root { return traverseAndLocate(at: locatingPath.parentDirectory, appending: subpath) diff --git a/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift b/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift index 9ba00ee1cf8..e3b1983b8bf 100644 --- a/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift +++ b/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift @@ -270,8 +270,7 @@ final class DumpServiceTests: TuistTestCase { try fileHandler.createFolder(tmpDir.appending(component: Constants.tuistDirectoryName)) try config.write( toFile: tmpDir.appending( - components: Constants.tuistDirectoryName, - Constants.SwiftPackageManager.packageSwiftName + component: Constants.SwiftPackageManager.packageSwiftName ).pathString, atomically: true, encoding: .utf8 @@ -331,8 +330,7 @@ final class DumpServiceTests: TuistTestCase { try fileHandler.createFolder(tmpDir.appending(component: Constants.tuistDirectoryName)) try config.write( toFile: tmpDir.appending( - components: Constants.tuistDirectoryName, - Constants.SwiftPackageManager.packageSwiftName + component: Constants.SwiftPackageManager.packageSwiftName ).pathString, atomically: true, encoding: .utf8 diff --git a/Tests/TuistKitTests/Services/InstallServiceTests.swift b/Tests/TuistKitTests/Services/InstallServiceTests.swift index fa98f726ba8..82861439116 100644 --- a/Tests/TuistKitTests/Services/InstallServiceTests.swift +++ b/Tests/TuistKitTests/Services/InstallServiceTests.swift @@ -58,7 +58,7 @@ final class InstallServiceTests: TuistUnitTestCase { try fileHandler.touch( stubbedPath.appending( - components: Constants.tuistDirectoryName, Manifest.package.fileName(stubbedPath) + component: Manifest.package.fileName(stubbedPath) ) ) @@ -110,7 +110,7 @@ final class InstallServiceTests: TuistUnitTestCase { try fileHandler.touch( stubbedPath.appending( - components: Constants.tuistDirectoryName, Manifest.package.fileName(stubbedPath) + component: Manifest.package.fileName(stubbedPath) ) ) diff --git a/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift b/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift index 9d37bc95236..e79da78dd14 100644 --- a/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift +++ b/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift @@ -108,10 +108,7 @@ final class ManifestLoaderTests: TuistTestCase { """ let manifestPath = temporaryPath.appending( - components: [ - Constants.tuistDirectoryName, - Manifest.package.fileName(temporaryPath), - ] + component: Manifest.package.fileName(temporaryPath) ) try FileHandler.shared.createFolder(temporaryPath.appending(component: Constants.tuistDirectoryName)) try content.write( @@ -176,10 +173,7 @@ final class ManifestLoaderTests: TuistTestCase { """ let manifestPath = temporaryPath.appending( - components: [ - Constants.tuistDirectoryName, - Manifest.package.fileName(temporaryPath), - ] + component: Manifest.package.fileName(temporaryPath) ) try FileHandler.shared.createFolder(temporaryPath.appending(component: Constants.tuistDirectoryName)) try content.write( @@ -213,10 +207,7 @@ final class ManifestLoaderTests: TuistTestCase { """ let manifestPath = temporaryPath.appending( - components: [ - Constants.tuistDirectoryName, - Manifest.package.fileName(temporaryPath), - ] + component: Manifest.package.fileName(temporaryPath) ) try FileHandler.shared.createFolder(temporaryPath.appending(component: Constants.tuistDirectoryName)) try content.write( diff --git a/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift b/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift index 3652fd0f2a2..7838b673d3e 100644 --- a/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift +++ b/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift @@ -499,7 +499,8 @@ final class ManifestFilesLocatorTests: TuistUnitTestCase { "File01.swift", "File02.swift", - "Tuist/Package.swift", + "Tuist/Config.swift", + "Package.swift", ]) // When diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/external-dependencies.tutorial b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/external-dependencies.tutorial index 0bb85853801..ace3a9664c7 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/external-dependencies.tutorial +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/external-dependencies.tutorial @@ -7,15 +7,15 @@ @Section(title: "Defining package dependencies") { @ContentAndMedia { - External dependencies are defined in the `Tuist/Package.swift` manifest file. + External dependencies are defined in a `Package.swift` manifest file in the root directory (i.e., the directory containing the `/Tuist` directory). } @Steps { @Step { - Create a `Tuist/Package.swift` file defining your external dependencies and their versions with the same `Swift Package Manager` syntax you might be familiar with. + Create a `Package.swift` file defining your external dependencies and their versions with the same `Swift Package Manager` syntax you might be familiar with. You can also add additional Swift Package Manager configuration such as the desired target platform, or some custom mapping for your dependencies using the `PackageSettings`. The `packageSettings` object must be inside the `#if TUIST ... #endif` directive. - @Code(name: "Tuist/Package.swift", file: "Package.swift", reset: true) + @Code(name: "Package.swift", file: "Package.swift", reset: true) > Note: For example, here we are declaring that the `Alamofire` target should be mapped to a dynamic framework, instead of the default static framework. } diff --git a/fixtures/app_with_plugins/Tuist/Package.swift b/fixtures/app_with_plugins/Package.swift similarity index 100% rename from fixtures/app_with_plugins/Tuist/Package.swift rename to fixtures/app_with_plugins/Package.swift diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.resolved b/fixtures/app_with_spm_dependencies/Package.resolved similarity index 100% rename from fixtures/app_with_spm_dependencies/Tuist/Package.resolved rename to fixtures/app_with_spm_dependencies/Package.resolved diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.swift b/fixtures/app_with_spm_dependencies/Package.swift similarity index 87% rename from fixtures/app_with_spm_dependencies/Tuist/Package.swift rename to fixtures/app_with_spm_dependencies/Package.swift index 8a10608372f..046172c5aee 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/Package.swift +++ b/fixtures/app_with_spm_dependencies/Package.swift @@ -20,7 +20,7 @@ let package = Package( dependencies: [ .package(url: "https://github.com/Alamofire/Alamofire", exact: "5.8.0"), .package(url: "https://github.com/pointfreeco/swift-composable-architecture", .upToNextMinor(from: "1.5.0")), - .package(path: "../LocalSwiftPackage"), - .package(path: "../StringifyMacro"), + .package(path: "LocalSwiftPackage"), + .package(path: "StringifyMacro"), ] ) diff --git a/fixtures/framework_with_native_swift_macro/Tuist/Package.resolved b/fixtures/framework_with_native_swift_macro/Package.resolved similarity index 100% rename from fixtures/framework_with_native_swift_macro/Tuist/Package.resolved rename to fixtures/framework_with_native_swift_macro/Package.resolved diff --git a/fixtures/framework_with_native_swift_macro/Tuist/Package.swift b/fixtures/framework_with_native_swift_macro/Package.swift similarity index 100% rename from fixtures/framework_with_native_swift_macro/Tuist/Package.swift rename to fixtures/framework_with_native_swift_macro/Package.swift diff --git a/fixtures/multiplatform_app_with_sdk/Tuist/Package.resolved b/fixtures/multiplatform_app_with_sdk/Package.resolved similarity index 100% rename from fixtures/multiplatform_app_with_sdk/Tuist/Package.resolved rename to fixtures/multiplatform_app_with_sdk/Package.resolved diff --git a/fixtures/multiplatform_app_with_sdk/Tuist/Package.swift b/fixtures/multiplatform_app_with_sdk/Package.swift similarity index 100% rename from fixtures/multiplatform_app_with_sdk/Tuist/Package.swift rename to fixtures/multiplatform_app_with_sdk/Package.swift From 7cb3e71cd0fe4ed46a06adbc40555916625d0632 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 1 Feb 2024 18:42:09 +0100 Subject: [PATCH 021/509] Generate before building to make sure there are no leftovers copied over from previous runs in the fixtures directory --- .../TuistAcceptanceTesting/TuistAcceptanceTestCase.swift | 7 ++++--- Tests/TuistAcceptanceTests/InitAcceptanceTests.swift | 3 +++ Tests/TuistBuildAcceptanceTests/BuildAcceptanceTests.swift | 3 +++ .../GenerateAcceptanceTests.swift | 4 ++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift index 6c8295598e3..dc84fd0607e 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift @@ -16,10 +16,11 @@ open class TuistAcceptanceTestCase: XCTestCase { public var xcodeprojPath: AbsolutePath! public var workspacePath: AbsolutePath! public var fixturePath: AbsolutePath! - public var derivedDataPath: AbsolutePath! + public var derivedDataPath: AbsolutePath { derivedDataDirectory.path } public var environment: MockEnvironment! public var sourceRootPath: AbsolutePath! + private var derivedDataDirectory: TemporaryDirectory! private var fixtureTemporaryDirectory: TemporaryDirectory! override open func setUp() { @@ -29,7 +30,7 @@ open class TuistAcceptanceTestCase: XCTestCase { LoggingSystem.bootstrap(AcceptanceTestCaseLogHandler.init) } - derivedDataPath = try! TemporaryDirectory(removeTreeOnDeinit: true).path + derivedDataDirectory = try! TemporaryDirectory(removeTreeOnDeinit: true) fixtureTemporaryDirectory = try! TemporaryDirectory(removeTreeOnDeinit: true) sourceRootPath = try! AbsolutePath( @@ -52,7 +53,7 @@ open class TuistAcceptanceTestCase: XCTestCase { workspacePath = nil fixturePath = nil fixtureTemporaryDirectory = nil - derivedDataPath = nil + derivedDataDirectory = nil try await super.tearDown() } diff --git a/Tests/TuistAcceptanceTests/InitAcceptanceTests.swift b/Tests/TuistAcceptanceTests/InitAcceptanceTests.swift index e597dbd72b0..c772bd31244 100644 --- a/Tests/TuistAcceptanceTests/InitAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/InitAcceptanceTests.swift @@ -8,6 +8,7 @@ import XCTest final class InitAcceptanceTestmacOSApp: TuistAcceptanceTestCase { func test_init_macos_app() async throws { try run(InitCommand.self, "--platform", "macos", "--name", "Test") + try await run(GenerateCommand.self) try await run(BuildCommand.self) } } @@ -15,6 +16,7 @@ final class InitAcceptanceTestmacOSApp: TuistAcceptanceTestCase { final class InitAcceptanceTestiOSApp: TuistAcceptanceTestCase { func test_init_ios_app() async throws { try run(InitCommand.self, "--platform", "ios", "--name", "My-App") + try await run(GenerateCommand.self) try await run(BuildCommand.self) } } @@ -30,6 +32,7 @@ final class InitAcceptanceTestiOSApp: TuistAcceptanceTestCase { final class InitAcceptanceTestCLIProjectWithTemplateInADifferentRepository: TuistAcceptanceTestCase { func test_cli_project_with_template_in_a_different_repository() async throws { try run(InitCommand.self, "--template", "https://github.com/tuist/ExampleTuistTemplate-Tuist4.git", "--name", "MyApp") + try await run(GenerateCommand.self) try await run(BuildCommand.self) } } diff --git a/Tests/TuistBuildAcceptanceTests/BuildAcceptanceTests.swift b/Tests/TuistBuildAcceptanceTests/BuildAcceptanceTests.swift index 36030fff7d7..55d99a1bf1a 100644 --- a/Tests/TuistBuildAcceptanceTests/BuildAcceptanceTests.swift +++ b/Tests/TuistBuildAcceptanceTests/BuildAcceptanceTests.swift @@ -91,6 +91,7 @@ final class BuildAcceptanceTestFrameworkWithSwiftMacroIntegratedWithXcodeProjPri func test_framework_with_swift_macro_integrated_with_xcode_proj_primitives() async throws { try setUpFixture(.frameworkWithNativeSwiftMacro) try await run(InstallCommand.self) + try await run(GenerateCommand.self) try await run(BuildCommand.self, "Framework", "--platform", "macos") try await run(BuildCommand.self, "Framework", "--platform", "ios") } @@ -108,6 +109,7 @@ final class BuildAcceptanceTestMultiplatformAppWithSDK: TuistAcceptanceTestCase func test() async throws { try setUpFixture(.multiplatformAppWithSdk) try await run(InstallCommand.self) + try await run(GenerateCommand.self) try await run(BuildCommand.self, "App", "--platform", "macos") try await run(BuildCommand.self, "App", "--platform", "ios") } @@ -117,6 +119,7 @@ final class BuildAcceptanceTestAppWithSPMDependencies: TuistAcceptanceTestCase { func test() async throws { try setUpFixture(.appWithSpmDependencies) try await run(InstallCommand.self) + try await run(GenerateCommand.self) try await run(BuildCommand.self, "App", "--platform", "ios") } } diff --git a/Tests/TuistGenerateAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGenerateAcceptanceTests/GenerateAcceptanceTests.swift index 5bcd694ee9f..a05a127043b 100644 --- a/Tests/TuistGenerateAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGenerateAcceptanceTests/GenerateAcceptanceTests.swift @@ -204,6 +204,7 @@ final class GenerateAcceptanceTestiOSAppWithCustomResourceParserOptions: TuistAc final class GenerateAcceptanceTestiOSAppWithFrameworkLinkingStaticFramework: TuistAcceptanceTestCase { func test_ios_app_with_framework_linking_static_framework() async throws { try setUpFixture(.iosAppWithFrameworkLinkingStaticFramework) + try await run(GenerateCommand.self) try await run(BuildCommand.self) try await XCTAssertProductWithDestinationContainsResource( @@ -229,6 +230,7 @@ final class GenerateAcceptanceTestiOSAppWithFrameworkLinkingStaticFramework: Tui final class GenerateAcceptanceTestsiOSAppWithCustomScheme: TuistAcceptanceTestCase { func test_ios_app_with_custom_scheme() async throws { try setUpFixture(.iosAppWithCustomScheme) + try await run(GenerateCommand.self) try await run(BuildCommand.self) try await run(BuildCommand.self, "App-Debug") try await run(BuildCommand.self, "App-Release") @@ -239,6 +241,7 @@ final class GenerateAcceptanceTestsiOSAppWithCustomScheme: TuistAcceptanceTestCa final class GenerateAcceptanceTestiOSAppWithLocalSwiftPackage: TuistAcceptanceTestCase { func test_ios_app_with_local_swift_package() async throws { try setUpFixture(.iosAppWithLocalSwiftPackage) + try await run(GenerateCommand.self) try await run(BuildCommand.self) } } @@ -734,6 +737,7 @@ final class GenerateAcceptanceTestmacOSAppWithExtensions: TuistAcceptanceTestCas final class GenerateAcceptanceTestiOSAppWithImplicitDependencies: TuistAcceptanceTestCase { func test_ios_app_with_implicit_dependencies() async throws { try setUpFixture(.iosAppWithImplicitDependencies) + try await run(GenerateCommand.self) try await run(BuildCommand.self, "FrameworkC") do { try await run(BuildCommand.self, "App") From 154d39c158292e3979f06e582c9036179c2266c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Thu, 1 Feb 2024 18:42:49 +0100 Subject: [PATCH 022/509] Align the cache directory with the UNIX XDG Base Directory Specification (#5855) * Change the cache directory * Not use try * Revert unrelated change * Make clean command and service configurable to include additional categories * Fix missing reference * Fix tests --- Sources/TuistCore/Cache/CacheCategory.swift | 10 -- .../Cache/CacheDirectoriesProvider.swift | 37 ++++-- .../CacheDirectoriesProviderFactory.swift | 2 +- .../Cache/MockCacheDirectoriesProvider.swift | 23 +++- .../Generator/ProjectFileElements.swift | 10 +- Sources/TuistKit/Commands/CleanCommand.swift | 34 +---- Sources/TuistKit/Commands/TuistCommand.swift | 2 +- .../ProjectEditor/ProjectEditor.swift | 2 +- Sources/TuistKit/Services/CleanService.swift | 124 +++++++++++------- Sources/TuistKit/Services/TuistService.swift | 3 - .../Loaders/CachedManifestLoader.swift | 4 +- .../TuistLoader/Loaders/ManifestLoader.swift | 2 +- Sources/TuistPlugin/PluginService.swift | 2 +- Sources/TuistSupport/Constants.swift | 1 - .../Generator/ProjectFileElementsTests.swift | 10 +- .../Services/CleanServiceTests.swift | 62 ++++----- .../Services/TestServiceTests.swift | 6 +- .../Loaders/CachedManifestLoaderTests.swift | 2 +- .../TuistPluginTests/PluginServiceTests.swift | 22 ++-- 19 files changed, 180 insertions(+), 178 deletions(-) diff --git a/Sources/TuistCore/Cache/CacheCategory.swift b/Sources/TuistCore/Cache/CacheCategory.swift index 5b220789674..a0ae5334404 100644 --- a/Sources/TuistCore/Cache/CacheCategory.swift +++ b/Sources/TuistCore/Cache/CacheCategory.swift @@ -3,12 +3,6 @@ public enum CacheCategory: String, CaseIterable, RawRepresentable { /// The plugins cache. case plugins - /// The binary cache - case binaries - - /// The selective tests cache - case selectiveTests - /// The projects generated for automation tasks cache case generatedAutomationProjects @@ -22,10 +16,6 @@ public enum CacheCategory: String, CaseIterable, RawRepresentable { switch self { case .plugins: return "Plugins" - case .binaries: - return "BinaryCache" - case .selectiveTests: - return "SelectiveTests" case .generatedAutomationProjects: return "Projects" case .projectDescriptionHelpers: diff --git a/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift b/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift index 9cac84f687c..81a9e8dc2e8 100644 --- a/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift +++ b/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift @@ -4,23 +4,36 @@ import TuistGraph import TuistSupport public protocol CacheDirectoriesProviding { - /// Returns the cache directory for a cache category - func cacheDirectory(for category: CacheCategory) -> AbsolutePath + /// Returns the cache directory for a Tuist cache category + func tuistCacheDirectory(for category: CacheCategory) throws -> AbsolutePath + + func cacheDirectory() throws -> AbsolutePath } public final class CacheDirectoriesProvider: CacheDirectoriesProviding { - // swiftlint:disable:next force_try - private static let defaultDirectory = try! AbsolutePath(validating: URL(fileURLWithPath: NSHomeDirectory()).path) - .appending(component: ".tuist") - private static var forcedCacheDirectory: AbsolutePath? { - ProcessInfo.processInfo.environment[Constants.EnvironmentVariables.forceConfigCacheDirectory] - .map { try! AbsolutePath(validating: $0) } // swiftlint:disable:this force_try + private let fileHandler: FileHandling + + init(fileHandler: FileHandling) { + self.fileHandler = fileHandler + } + + public convenience init() { + self.init(fileHandler: FileHandler.shared) } - public init() {} + public func tuistCacheDirectory(for category: CacheCategory) throws -> AbsolutePath { + return CacheDirectoriesProvider.tuistCacheDirectory(for: category, cacheDirectory: try cacheDirectory()) + } + + public static func tuistCacheDirectory(for category: CacheCategory, cacheDirectory: AbsolutePath) -> AbsolutePath { + return cacheDirectory.appending(components: ["tuist", category.directoryName]) + } - public func cacheDirectory(for category: CacheCategory) -> AbsolutePath { - let cacheDirectory = CacheDirectoriesProvider.defaultDirectory.appending(component: "Cache") - return (Self.forcedCacheDirectory ?? cacheDirectory).appending(component: category.directoryName) + public func cacheDirectory() throws -> TSCBasic.AbsolutePath { + if let xdgCacheHome = ProcessInfo.processInfo.environment["XDG_CACHE_HOME"] { + return try AbsolutePath(validating: xdgCacheHome) + } else { + return FileHandler.shared.homeDirectory.appending(components: ".cache") + } } } diff --git a/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift b/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift index b169e591aca..daf8a93bfce 100644 --- a/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift +++ b/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift @@ -11,7 +11,7 @@ public final class CacheDirectoriesProviderFactory: CacheDirectoriesProviderFact public func cacheDirectories() throws -> CacheDirectoriesProviding { let provider = CacheDirectoriesProvider() for category in CacheCategory.allCases { - let directory = provider.cacheDirectory(for: category) + let directory = try provider.tuistCacheDirectory(for: category) if !FileHandler.shared.exists(directory) { try FileHandler.shared.createFolder(directory) } diff --git a/Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProvider.swift b/Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProvider.swift index f16038b6698..8a5d7a9a4f8 100644 --- a/Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProvider.swift +++ b/Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProvider.swift @@ -5,17 +5,26 @@ import TuistSupport public final class MockCacheDirectoriesProvider: CacheDirectoriesProviding { private let directory: TemporaryDirectory - public var cacheDirectoryStub: AbsolutePath? - private var cacheDirectory: AbsolutePath { - cacheDirectoryStub ?? directory.path.appending(component: "Cache") + public init() throws { + directory = try TemporaryDirectory(removeTreeOnDeinit: true) } - public func cacheDirectory(for category: CacheCategory) -> AbsolutePath { - cacheDirectory.appending(component: category.directoryName) + private var _tuistCacheDirectory: AbsolutePath { + tuistCacheDirectoryStub ?? directory.path.appending(component: "TuistCache") } - public init() throws { - directory = try TemporaryDirectory(removeTreeOnDeinit: true) + private var _cacheDirectory: AbsolutePath { + cacheDirectoryStub ?? directory.path + } + + public var tuistCacheDirectoryStub: AbsolutePath? + public func tuistCacheDirectory(for category: TuistCore.CacheCategory) throws -> TSCBasic.AbsolutePath { + _tuistCacheDirectory.appending(component: category.directoryName) + } + + public var cacheDirectoryStub: AbsolutePath? + public func cacheDirectory() throws -> AbsolutePath { + return _cacheDirectory } } diff --git a/Sources/TuistGenerator/Generator/ProjectFileElements.swift b/Sources/TuistGenerator/Generator/ProjectFileElements.swift index 522c4a1d848..58576d9a916 100644 --- a/Sources/TuistGenerator/Generator/ProjectFileElements.swift +++ b/Sources/TuistGenerator/Generator/ProjectFileElements.swift @@ -40,11 +40,16 @@ class ProjectFileElements { var products: [String: PBXFileReference] = [:] var compiled: [AbsolutePath: PBXFileReference] = [:] var knownRegions: Set = Set([]) + private let cacheDirectoriesProvider: CacheDirectoriesProviding // MARK: - Init - init(_ elements: [AbsolutePath: PBXFileElement] = [:]) { + init( + _ elements: [AbsolutePath: PBXFileElement] = [:], + cacheDirectoriesProvider: CacheDirectoriesProviding = CacheDirectoriesProvider() + ) { self.elements = elements + self.cacheDirectoriesProvider = cacheDirectoriesProvider } func generateProjectFiles( @@ -274,7 +279,8 @@ class ProjectFileElements { sourceRootPath: AbsolutePath ) throws { // Pre-compiled artifact from the cache - if path.pathString.contains(CacheCategory.binaries.directoryName) { + let cacheDirectory = try cacheDirectoriesProvider.cacheDirectory() + if path.pathString.contains(cacheDirectory.pathString) { guard compiled[path] == nil else { return } diff --git a/Sources/TuistKit/Commands/CleanCommand.swift b/Sources/TuistKit/Commands/CleanCommand.swift index 5f9771ca2e1..d32b8fefc26 100644 --- a/Sources/TuistKit/Commands/CleanCommand.swift +++ b/Sources/TuistKit/Commands/CleanCommand.swift @@ -2,37 +2,7 @@ import ArgumentParser import Foundation import TuistCore -/// Category that can be cleaned -enum CleanCategory: ExpressibleByArgument { - static let allCases = CacheCategory.allCases.map { .global($0) } + [Self.dependencies] - - /// The global cache - case global(CacheCategory) - - /// The local dependencies cache - case dependencies - - var defaultValueDescription: String { - switch self { - case let .global(cacheCategory): - return cacheCategory.rawValue - case .dependencies: - return "dependencies" - } - } - - init?(argument: String) { - if let cacheCategory = CacheCategory(rawValue: argument) { - self = .global(cacheCategory) - } else if argument == "dependencies" { - self = .dependencies - } else { - return nil - } - } -} - -public struct CleanCommand: ParsableCommand { +public struct CleanCommand: ParsableCommand { public init() {} public static var configuration: CommandConfiguration { @@ -43,7 +13,7 @@ public struct CleanCommand: ParsableCommand { } @Argument(help: "The cache and artifact categories to be cleaned. If no category is specified, everything is cleaned.") - var cleanCategories: [CleanCategory] = CleanCategory.allCases + var cleanCategories: [T] @Option( name: .shortAndLong, diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index ccb9d767362..49bf1cdfe17 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -11,7 +11,7 @@ public struct TuistCommand: AsyncParsableCommand { abstract: "Generate, build and test your Xcode projects.", subcommands: [ BuildCommand.self, - CleanCommand.self, + CleanCommand.self, DumpCommand.self, EditCommand.self, InstallCommand.self, diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditor.swift b/Sources/TuistKit/ProjectEditor/ProjectEditor.swift index ba6f760fb18..45e6038fe8c 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditor.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditor.swift @@ -133,7 +133,7 @@ final class ProjectEditor: ProjectEditing { let configPath = manifestFilesLocator.locateConfig(at: editingPath) let cacheDirectory = try cacheDirectoryProviderFactory.cacheDirectories() let projectDescriptionHelpersBuilder = projectDescriptionHelpersBuilderFactory.projectDescriptionHelpersBuilder( - cacheDirectory: cacheDirectory.cacheDirectory(for: .projectDescriptionHelpers) + cacheDirectory: try cacheDirectory.tuistCacheDirectory(for: .projectDescriptionHelpers) ) let packageManifestPath = manifestFilesLocator.locatePackageManifest(at: editingPath) diff --git a/Sources/TuistKit/Services/CleanService.swift b/Sources/TuistKit/Services/CleanService.swift index ff9e14a9fc2..5b8d287b4ca 100644 --- a/Sources/TuistKit/Services/CleanService.swift +++ b/Sources/TuistKit/Services/CleanService.swift @@ -5,67 +5,95 @@ import TuistGraph import TuistLoader import TuistSupport -final class CleanService { - private let cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring - init( - cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring = CacheDirectoriesProviderFactory() - ) { - self.cacheDirectoryProviderFactory = cacheDirectoryProviderFactory - } +public protocol CleanCategory: ExpressibleByArgument & CaseIterable { + func directory(rootDirectory: AbsolutePath?, cacheDirectory: AbsolutePath) throws -> AbsolutePath? +} - func run( - categories: [CleanCategory], - path: String? - ) throws { - let path: AbsolutePath = try self.path(path) - let manifestLoaderFactory = ManifestLoaderFactory() - let manifestLoader = manifestLoaderFactory.createManifestLoader() - let cacheDirectoryProvider = try cacheDirectoryProviderFactory.cacheDirectories() +public enum TuistCleanCategory: CleanCategory { + public static let allCases = CacheCategory.allCases.map { .global($0) } + [Self.dependencies] - for category in categories { - switch category { - case let .global(cacheCategory): - try cleanCacheCategory( - cacheCategory, - cacheDirectoryProvider: cacheDirectoryProvider - ) - case .dependencies: - try cleanDependencies(at: path) - } + /// The global cache + case global(CacheCategory) + + /// The local dependencies cache + case dependencies + + public var defaultValueDescription: String { + switch self { + case let .global(cacheCategory): + return cacheCategory.rawValue + case .dependencies: + return "dependencies" } } - // MARK: - Helpers - - private func path(_ path: String?) throws -> AbsolutePath { - if let path { - return try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) + public init?(argument: String) { + if let cacheCategory = CacheCategory(rawValue: argument) { + self = .global(cacheCategory) + } else if argument == "dependencies" { + self = .dependencies } else { - return FileHandler.shared.currentPath + return nil } } - private func cleanCacheCategory( - _ cacheCategory: CacheCategory, - cacheDirectoryProvider: CacheDirectoriesProviding - ) throws { - let directory = cacheDirectoryProvider.cacheDirectory(for: cacheCategory) - if FileHandler.shared.exists(directory) { - try FileHandler.shared.delete(directory) - logger.info("Successfully cleaned artifacts at path \(directory.pathString)", metadata: .success) + public func directory(rootDirectory: AbsolutePath?, cacheDirectory: AbsolutePath) throws -> TSCBasic.AbsolutePath? { + switch self { + case let .global(category): + return CacheDirectoriesProvider.tuistCacheDirectory(for: category, cacheDirectory: cacheDirectory) + case .dependencies: + return rootDirectory?.appending(components: [ + Constants.tuistDirectoryName, + Constants.SwiftPackageManager.packageBuildDirectoryName, + ]) } } +} + +final class CleanService { + private let fileHandler: FileHandling + private let rootDirectoryLocator: RootDirectoryLocating + private let cacheDirectoriesProvider: CacheDirectoriesProviding + init( + fileHandler: FileHandling, + rootDirectoryLocator: RootDirectoryLocating, + cacheDirectoriesProvider: CacheDirectoriesProviding + ) { + self.fileHandler = fileHandler + self.rootDirectoryLocator = rootDirectoryLocator + self.cacheDirectoriesProvider = cacheDirectoriesProvider + } - private func cleanDependencies(at path: AbsolutePath) throws { - let swiftPackageManagerBuildPath = path.appending( - components: Constants.tuistDirectoryName, Constants.SwiftPackageManager.packageBuildDirectoryName + public convenience init() { + self.init( + fileHandler: FileHandler.shared, + rootDirectoryLocator: RootDirectoryLocator(), + cacheDirectoriesProvider: CacheDirectoriesProvider() ) - if FileHandler.shared.exists(swiftPackageManagerBuildPath) { - try FileHandler.shared.delete(swiftPackageManagerBuildPath) + } + + func run( + categories: [some CleanCategory], + path: String? + ) throws { + let resolvedPath = if let path { + try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) + } else { + FileHandler.shared.currentPath + } + + let rootDirectory = rootDirectoryLocator.locate(from: resolvedPath) + let cacheDirectory = try cacheDirectoriesProvider.cacheDirectory() + + for category in categories { + if let directory = try category.directory(rootDirectory: rootDirectory, cacheDirectory: cacheDirectory), + fileHandler.exists(directory) + { + try FileHandler.shared.delete(directory) + logger.info("Successfully cleaned artifacts at path \(directory.pathString)", metadata: .success) + } else { + logger.info("There's nothing to clean for \(category.defaultValueDescription)") + } } - logger.info( - "Successfully cleaned Swift Package Manager dependencies at path \(swiftPackageManagerBuildPath.pathString)", - metadata: .success - ) } } diff --git a/Sources/TuistKit/Services/TuistService.swift b/Sources/TuistKit/Services/TuistService.swift index 089e0911edc..aa80318cb73 100644 --- a/Sources/TuistKit/Services/TuistService.swift +++ b/Sources/TuistKit/Services/TuistService.swift @@ -57,9 +57,6 @@ final class TuistService: NSObject { verbose: Environment.shared.isVerbose, environment: [ Constants.EnvironmentVariables.tuistBinaryPath: tuistBinaryPath, - Constants.EnvironmentVariables.forceConfigCacheDirectory: Environment.shared.tuistConfigVariables[ - Constants.EnvironmentVariables.forceConfigCacheDirectory - ] ?? "", ].merging(System.shared.env) { tuistEnv, _ in tuistEnv } ) } diff --git a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift index 540159ecf88..2bfe5f7b75b 100644 --- a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift @@ -60,7 +60,7 @@ public class CachedManifestLoader: ManifestLoading { public func loadConfig(at path: AbsolutePath) throws -> ProjectDescription.Config { try load(manifest: .config, at: path) { let projectDescriptionConfig = try manifestLoader.loadConfig(at: path) - cacheDirectory = try cacheDirectoryProviderFactory.cacheDirectories().cacheDirectory(for: .manifests) + cacheDirectory = try cacheDirectoryProviderFactory.cacheDirectories().tuistCacheDirectory(for: .manifests) return projectDescriptionConfig } } @@ -118,7 +118,7 @@ public class CachedManifestLoader: ManifestLoading { private func load(manifest: Manifest, at path: AbsolutePath, loader: () throws -> T) throws -> T { if cacheDirectory == nil { - cacheDirectory = try cacheDirectoryProviderFactory.cacheDirectories().cacheDirectory(for: .manifests) + cacheDirectory = try cacheDirectoryProviderFactory.cacheDirectories().tuistCacheDirectory(for: .manifests) } let manifestPath = path.appending(component: manifest.fileName(path)) diff --git a/Sources/TuistLoader/Loaders/ManifestLoader.swift b/Sources/TuistLoader/Loaders/ManifestLoader.swift index eec2d96cbc3..8b65639a7b5 100644 --- a/Sources/TuistLoader/Loaders/ManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/ManifestLoader.swift @@ -356,7 +356,7 @@ public class ManifestLoader: ManifestLoading { ] let projectDescriptionHelpersCacheDirectory = try cacheDirectoryProviderFactory .cacheDirectories() - .cacheDirectory(for: .projectDescriptionHelpers) + .tuistCacheDirectory(for: .projectDescriptionHelpers) let projectDescriptionHelperArguments: [String] = try { switch manifest { diff --git a/Sources/TuistPlugin/PluginService.swift b/Sources/TuistPlugin/PluginService.swift index e31cf595b1e..a63dcb2d5c3 100644 --- a/Sources/TuistPlugin/PluginService.swift +++ b/Sources/TuistPlugin/PluginService.swift @@ -240,7 +240,7 @@ public final class PluginService: PluginServicing { config _: Config ) throws -> AbsolutePath { let cacheDirectories = try cacheDirectoryProviderFactory.cacheDirectories() - let cacheDirectory = cacheDirectories.cacheDirectory(for: .plugins) + let cacheDirectory = try cacheDirectories.tuistCacheDirectory(for: .plugins) let fingerprint = "\(url)-\(gitId)".md5 return cacheDirectory .appending(component: fingerprint) diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index ac9529e2f0d..05b31fe8c70 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -56,7 +56,6 @@ public enum Constants { public enum EnvironmentVariables { public static let verbose = "TUIST_CONFIG_VERBOSE" public static let versionsDirectory = "TUIST_CONFIG_VERSIONS_DIRECTORY" - public static let forceConfigCacheDirectory = "TUIST_CONFIG_FORCE_CONFIG_CACHE_DIRECTORY" public static let automationPath = "TUIST_CONFIG_AUTOMATION_PATH" public static let queueDirectory = "TUIST_CONFIG_QUEUE_DIRECTORY" public static let cacheManifests = "TUIST_CONFIG_CACHE_MANIFESTS" diff --git a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift index 00aaba07699..7a5ac47a958 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift @@ -13,19 +13,22 @@ final class ProjectFileElementsTests: TuistUnitTestCase { var subject: ProjectFileElements! var groups: ProjectGroups! var pbxproj: PBXProj! + var cacheDirectoriesProvider: MockCacheDirectoriesProvider! - override func setUp() { + override func setUpWithError() throws { super.setUp() + cacheDirectoriesProvider = try MockCacheDirectoriesProvider() pbxproj = PBXProj() groups = ProjectGroups.generate( project: .test(path: "/path", sourceRootPath: "/path", xcodeProjPath: "/path/Project.xcodeproj"), pbxproj: pbxproj ) - subject = ProjectFileElements() + subject = ProjectFileElements(cacheDirectoriesProvider: cacheDirectoriesProvider) } override func tearDown() { + cacheDirectoriesProvider = nil pbxproj = nil groups = nil subject = nil @@ -814,8 +817,7 @@ final class ProjectFileElementsTests: TuistUnitTestCase { ) let groups = ProjectGroups.generate(project: project, pbxproj: pbxproj) - let frameworkPath = try temporaryPath().appending(component: CacheCategory.binaries.directoryName) - .appending(component: "Test.framework") + let frameworkPath = try cacheDirectoriesProvider.cacheDirectory().appending(component: "Test.framework") let binaryPath = frameworkPath.appending(component: "Test") let frameworkDependency = GraphDependencyReference.framework( diff --git a/Tests/TuistKitTests/Services/CleanServiceTests.swift b/Tests/TuistKitTests/Services/CleanServiceTests.swift index c2f57b14ef2..9ab54ec2649 100644 --- a/Tests/TuistKitTests/Services/CleanServiceTests.swift +++ b/Tests/TuistKitTests/Services/CleanServiceTests.swift @@ -1,4 +1,5 @@ import Foundation +import TSCBasic import TuistCore import TuistCoreTesting import TuistSupport @@ -9,76 +10,63 @@ import XCTest final class CleanServiceTests: TuistUnitTestCase { private var subject: CleanService! + private var rootDirectoryLocator: MockRootDirectoryLocator! private var cacheDirectoriesProvider: MockCacheDirectoriesProvider! - override func setUp() { + override func setUpWithError() throws { super.setUp() - let mockCacheDirectoriesProvider = try! MockCacheDirectoriesProvider() - cacheDirectoriesProvider = mockCacheDirectoriesProvider + rootDirectoryLocator = MockRootDirectoryLocator() + cacheDirectoriesProvider = try MockCacheDirectoriesProvider() subject = CleanService( - cacheDirectoryProviderFactory: MockCacheDirectoriesProviderFactory(provider: mockCacheDirectoriesProvider) + fileHandler: FileHandler.shared, + rootDirectoryLocator: rootDirectoryLocator, + cacheDirectoriesProvider: cacheDirectoriesProvider ) } override func tearDown() { + rootDirectoryLocator = nil + cacheDirectoriesProvider = nil subject = nil super.tearDown() } func test_run_with_category_cleans_category() throws { // Given - let cachePaths = try createFolders(["Cache", "Cache/BinaryCache", "Cache/Manifests", "Cache/SelectiveTests"]) - let cachePath = cachePaths[0] - for path in cachePaths { - let correctlyCreated = FileManager.default.fileExists(atPath: path.pathString) - XCTAssertTrue(correctlyCreated, "Test setup is not properly done. Folder \(path.pathString) should exist") - } + let cachePaths = try createFolders(["tuist/Manifests", "tuist/ProjectDescriptionHelpers"]) + + let cachePath = cachePaths[0].parentDirectory.parentDirectory cacheDirectoriesProvider.cacheDirectoryStub = cachePath + rootDirectoryLocator.locateStub = cachePath // When - try subject.run(categories: [.global(.binaries), .global(.selectiveTests)], path: nil) + try subject.run(categories: [TuistCleanCategory.global(.manifests)], path: nil) // Then - let buildsExists = FileManager.default.fileExists(atPath: cachePaths[1].pathString) - XCTAssertFalse(buildsExists, "Cache folder at path \(cachePaths[1]) should have been deleted by the test.") - let manifestsExists = FileManager.default.fileExists(atPath: cachePaths[2].pathString) - XCTAssertTrue( - manifestsExists, - "Cache folder at path \(cachePaths[2].pathString) should not have been deleted by the test." - ) - let testsExists = FileManager.default.fileExists(atPath: cachePaths[3].pathString) - XCTAssertFalse(testsExists, "Cache folder at path \(cachePaths[3].pathString) should not have been deleted by the test.") + XCTAssertFalse(FileHandler.shared.exists(cachePaths[0])) + XCTAssertTrue(FileHandler.shared.exists(cachePaths[1])) } func test_run_without_category_cleans_all() throws { // Given - let cachePaths = try createFolders(["Cache", "Cache/BinaryCache", "Cache/Manifests", "Cache/SelectiveTests"]) - let cachePath = cachePaths[0] - for path in cachePaths { - let correctlyCreated = FileManager.default.fileExists(atPath: path.pathString) - XCTAssertTrue(correctlyCreated, "Test setup is not properly done. Folder \(path.pathString) should exist") - } + let cachePaths = try createFolders(["tuist/Manifests"]) + let cachePath = cachePaths[0].parentDirectory.parentDirectory + cacheDirectoriesProvider.cacheDirectoryStub = cachePath + let projectPath = try temporaryPath() + rootDirectoryLocator.locateStub = projectPath let swiftPackageManagerBuildPath = projectPath.appending( components: Constants.tuistDirectoryName, Constants.SwiftPackageManager.packageBuildDirectoryName ) try fileHandler.createFolder(swiftPackageManagerBuildPath) // When - try subject.run(categories: CleanCategory.allCases, path: nil) + try subject.run(categories: TuistCleanCategory.allCases, path: nil) // Then - let buildsExists = FileManager.default.fileExists(atPath: cachePaths[1].pathString) - XCTAssertFalse(buildsExists, "Cache folder at path \(cachePaths[1]) should have been deleted by the test.") - let manifestsExists = FileManager.default.fileExists(atPath: cachePaths[2].pathString) - XCTAssertFalse(manifestsExists, "Cache folder at path \(cachePaths[2].pathString) should have been deleted by the test.") - let testsExists = FileManager.default.fileExists(atPath: cachePaths[3].pathString) - XCTAssertFalse(testsExists, "Cache folder at path \(cachePaths[3].pathString) should not have been deleted by the test.") - XCTAssertFalse( - FileManager.default.fileExists(atPath: swiftPackageManagerBuildPath.pathString), - "Cache folder at path \(swiftPackageManagerBuildPath) should have been deleted by the test." - ) + XCTAssertFalse(FileHandler.shared.exists(cachePaths[0])) + XCTAssertFalse(FileHandler.shared.exists(swiftPackageManagerBuildPath)) } } diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index f64dba740b0..6bb8bcb5d56 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -395,9 +395,9 @@ final class TestServiceTests: TuistUnitTestCase { "ProjectScheme", ] ) - XCTAssertFalse( - fileHandler.exists(cacheDirectoriesProvider.cacheDirectory(for: .selectiveTests).appending(component: "A")) - ) +// XCTAssertFalse( +// fileHandler.exists(cacheDirectoriesProvider.cacheDirectory(for: .selectiveTests).appending(component: "A")) +// ) } func test_run_tests_when_no_project_schemes_present() async throws { diff --git a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift index 8221408407a..d0f1867ee77 100644 --- a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift @@ -35,7 +35,7 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { cacheDirectoriesProvider = try MockCacheDirectoriesProvider() cacheDirectory = try temporaryPath().appending(components: "tuist", "Cache", "Manifests") cacheDirectoriesProviderFactory = MockCacheDirectoriesProviderFactory(provider: cacheDirectoriesProvider) - cacheDirectoriesProvider.cacheDirectoryStub = cacheDirectory.parentDirectory + cacheDirectoriesProvider.tuistCacheDirectoryStub = cacheDirectory.parentDirectory } catch { XCTFail("Failed to create temporary directory") } diff --git a/Tests/TuistPluginTests/PluginServiceTests.swift b/Tests/TuistPluginTests/PluginServiceTests.swift index 890d51e3cc2..6a6f3334423 100644 --- a/Tests/TuistPluginTests/PluginServiceTests.swift +++ b/Tests/TuistPluginTests/PluginServiceTests.swift @@ -79,11 +79,11 @@ final class PluginServiceTests: TuistUnitTestCase { .git(url: pluginCGitURL, gitReference: .tag(pluginCGitTag), directory: "Sub/Subfolder", releaseUrl: nil), ] ) - let pluginADirectory = cacheDirectoriesProvider.cacheDirectory(for: .plugins) + let pluginADirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(component: pluginAFingerprint) - let pluginBDirectory = cacheDirectoriesProvider.cacheDirectory(for: .plugins) + let pluginBDirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(component: pluginBFingerprint) - let pluginCDirectory = cacheDirectoriesProvider.cacheDirectory(for: .plugins) + let pluginCDirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(component: pluginCFingerprint) try fileHandler.touch( pluginBDirectory.appending(components: PluginServiceConstants.release) @@ -143,13 +143,13 @@ final class PluginServiceTests: TuistUnitTestCase { XCTAssertEqual(invokedCloneURL, pluginGitURL) XCTAssertEqual( invokedClonePath, - cacheDirectoriesProvider.cacheDirectory(for: .plugins) + try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) ) XCTAssertEqual(invokedCheckoutID, pluginGitSha) XCTAssertEqual( invokedCheckoutPath, - cacheDirectoriesProvider.cacheDirectory(for: .plugins) + try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) ) } @@ -184,13 +184,13 @@ final class PluginServiceTests: TuistUnitTestCase { XCTAssertEqual(invokedCloneURL, pluginGitURL) XCTAssertEqual( invokedClonePath, - cacheDirectoriesProvider.cacheDirectory(for: .plugins) + try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) ) XCTAssertEqual(invokedCheckoutID, pluginGitTag) XCTAssertEqual( invokedCheckoutPath, - cacheDirectoriesProvider.cacheDirectory(for: .plugins) + try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) ) } @@ -206,7 +206,7 @@ final class PluginServiceTests: TuistUnitTestCase { ] ) - let pluginDirectory = cacheDirectoriesProvider.cacheDirectory(for: .plugins) + let pluginDirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(component: pluginFingerprint) let temporaryDirectory = try temporaryPath() cacheDirectoriesProvider.cacheDirectoryStub = temporaryDirectory @@ -255,7 +255,7 @@ final class PluginServiceTests: TuistUnitTestCase { let pluginGitUrl = "https://url/to/repo.git" let pluginGitReference = "1.0.0" let pluginFingerprint = "\(pluginGitUrl)-\(pluginGitReference)".md5 - let cachedPluginPath = cacheDirectoriesProvider.cacheDirectory(for: .plugins) + let cachedPluginPath = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) let pluginName = "TestPlugin" @@ -321,7 +321,7 @@ final class PluginServiceTests: TuistUnitTestCase { let pluginGitUrl = "https://url/to/repo.git" let pluginGitReference = "1.0.0" let pluginFingerprint = "\(pluginGitUrl)-\(pluginGitReference)".md5 - let cachedPluginPath = cacheDirectoriesProvider.cacheDirectory(for: .plugins) + let cachedPluginPath = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) let pluginName = "TestPlugin" let resourceTemplatesPath = cachedPluginPath.appending(components: "ResourceSynthesizers") @@ -391,7 +391,7 @@ final class PluginServiceTests: TuistUnitTestCase { let pluginGitUrl = "https://url/to/repo.git" let pluginGitReference = "1.0.0" let pluginFingerprint = "\(pluginGitUrl)-\(pluginGitReference)".md5 - let cachedPluginPath = cacheDirectoriesProvider.cacheDirectory(for: .plugins) + let cachedPluginPath = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) let pluginName = "TestPlugin" let templatePath = cachedPluginPath.appending(components: "Templates", "custom") From 2d596fe9c5fa8d8049fde61f4a659a89d760e000 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 1 Feb 2024 19:33:54 +0100 Subject: [PATCH 023/509] Update version --- Sources/TuistSupport/Constants.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 05b31fe8c70..8b82214103a 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.0.0-beta-1" + public static let version = "4.0.0-beta.2" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From a2a0f56257df36f08519ceb41fc82db15db18bd7 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 1 Feb 2024 19:46:31 +0100 Subject: [PATCH 024/509] Update the CHANGELOG --- CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 695d97163d0..f0c0d27a622 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## 4.0.0-beta.2 - 2024-02-01 + +### Tuist + +#### Fixed +- Fix install script [#5858](https://github.com/tuist/tuist/pull/5858) by [@svenmuennich](https://github.com/svenmuennich) + +#### Changed +- Change Package.swift directory from Tuist to root [#5862](https://github.com/tuist/tuist/pull/5862) by [@fortmarek](https://github.com/fortmarek) +- Rename `fetch` to `install` [#5857](https://github.com/tuist/tuist/pull/5857) by [@pepicrft](https://github.com/pepicrft) +- Align the cache directory with the UNIX XDG Base Directory Specification [#5855](https://github.com/tuist/tuist/pull/5855) by [@pepicrft](https://github.com/pepicrft) + +### Tuist Cloud + +#### Changed + +- no changes + ## 4.0.0-beta-1 - 2024-01-31 ### Tuist From cde86faeb846ab93d109efa953d193b8ad496628 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 1 Feb 2024 19:48:24 +0100 Subject: [PATCH 025/509] Use tuist install instead of tuist fetch --- .github/workflows/tuist.yml | 12 ++++++------ .mise.toml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/tuist.yml b/.github/workflows/tuist.yml index 985b9fe5a22..6e425446b10 100644 --- a/.github/workflows/tuist.yml +++ b/.github/workflows/tuist.yml @@ -46,8 +46,8 @@ jobs: path: Tuist/Dependencies/SwiftPackageManager/.build key: spm-v1-${{ hashFiles('Package.resolved') }} restore-keys: spm-v1-${{ hashFiles('Package.resolved') }} - - name: Fetch dependencies - run: tuist fetch + - name: Install dependencies + run: tuist install - name: Test run: tuist test --skip-test-targets TuistBuildAcceptanceTests TuistDependenciesAcceptanceTests TuistGenerateAcceptanceTests TuistTestAcceptanceTests TuistAcceptanceTests --result-bundle-path /tmp/tuist/test-${{ matrix.feature }} - uses: actions/upload-artifact@v4 @@ -73,8 +73,8 @@ jobs: path: Tuist/Dependencies/SwiftPackageManager/.build key: spm-v1-${{ hashFiles('Package.resolved') }} restore-keys: spm-v1-${{ hashFiles('Package.resolved') }} - - name: Fetch dependencies - run: tuist fetch + - name: Install dependencies + run: tuist install - name: Print hashes run: tuist cache --print-hashes - name: Cache warm @@ -113,8 +113,8 @@ jobs: path: Tuist/Dependencies/SwiftPackageManager/.build key: spm-v1-${{ hashFiles('Tuist/Package.resolved') }} restore-keys: spm-v1-${{ hashFiles('Tuist/Package.resolved') }} - - name: Fetch dependencies - run: tuist fetch + - name: Install dependencies + run: tuist install - name: Run acceptance tests run: tuist test --result-bundle-path /tmp/tuist/test-${{ matrix.feature }} ${{ matrix.feature }} - uses: actions/upload-artifact@v4 diff --git a/.mise.toml b/.mise.toml index a3d2b9dc30a..a40027e1a95 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.0.0-beta-1" +tuist = "4.0.0-beta.2" swiftlint = "0.54.0" swiftformat = "0.53.0" From e27d4a3ef8c8a1dec121b2f610c055b9f5becff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 1 Feb 2024 21:38:44 +0100 Subject: [PATCH 026/509] Fix running tuist clean without a specific category (#5868) --- Sources/TuistKit/Commands/CleanCommand.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistKit/Commands/CleanCommand.swift b/Sources/TuistKit/Commands/CleanCommand.swift index d32b8fefc26..d6fd1c16701 100644 --- a/Sources/TuistKit/Commands/CleanCommand.swift +++ b/Sources/TuistKit/Commands/CleanCommand.swift @@ -13,7 +13,7 @@ public struct CleanCommand: ParsableCommand { } @Argument(help: "The cache and artifact categories to be cleaned. If no category is specified, everything is cleaned.") - var cleanCategories: [T] + var cleanCategories: [T] = T.allCases.map { $0 } @Option( name: .shortAndLong, From a25687569e407c630ea9f213c3cef7641e3313d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 2 Feb 2024 09:09:27 +0100 Subject: [PATCH 027/509] Remove duplicate Package.swift definitions (#5869) * Remove duplicate Package.swift definitions * Fix loading package tools version --- .github/workflows/tuist.yml | 8 - Package.swift | 17 ++ .../Loaders/PackageSettingsLoader.swift | 2 +- Tuist/Dependencies.swift | 15 -- Tuist/Package.resolved | 247 ------------------ Tuist/Package.swift | 24 -- make/tasks/workspace/lint/lockfiles.sh | 52 ---- 7 files changed, 18 insertions(+), 347 deletions(-) delete mode 100644 Tuist/Dependencies.swift delete mode 100644 Tuist/Package.resolved delete mode 100644 Tuist/Package.swift delete mode 100755 make/tasks/workspace/lint/lockfiles.sh diff --git a/.github/workflows/tuist.yml b/.github/workflows/tuist.yml index 6e425446b10..921afd41e5c 100644 --- a/.github/workflows/tuist.yml +++ b/.github/workflows/tuist.yml @@ -135,11 +135,3 @@ jobs: run: sudo xcode-select -switch /Applications/Xcode_$(cat .xcode-version).app - name: Run run: mise run lint - - lint-lockfiles: - name: Lint lockfiles - runs-on: macos-13 - steps: - - uses: actions/checkout@v3 - - name: Run - run: ./make/tasks/workspace/lint/lockfiles.sh diff --git a/Package.swift b/Package.swift index b7e44ac6a02..6d0c4bcaada 100644 --- a/Package.swift +++ b/Package.swift @@ -254,6 +254,23 @@ var targets: [Target] = [ ), ] +#if TUIST + import struct ProjectDescription.PackageSettings + + let packageSettings = PackageSettings( + productTypes: [ + "SystemPackage": .staticFramework, + "TSCBasic": .staticFramework, + "TSCUtility": .staticFramework, + "TSCclibc": .staticFramework, + "TSCLibc": .staticFramework, + "ArgumentParser": .staticFramework, + ], + platforms: [.macOS] + ) + +#endif + let package = Package( name: "tuist", platforms: [.macOS(.v12)], diff --git a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift index 5685407cd3b..8a1b8b99e8c 100644 --- a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift +++ b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift @@ -39,7 +39,7 @@ public final class PackageSettingsLoader: PackageSettingsLoading { let manifest = try manifestLoader.loadPackageSettings(at: path) let generatorPaths = GeneratorPaths(manifestDirectory: path) let swiftToolsVersion = try swiftPackageManagerController.getToolsVersion( - at: path.appending(component: Constants.tuistDirectoryName) + at: path ) return try TuistGraph.PackageSettings.from( diff --git a/Tuist/Dependencies.swift b/Tuist/Dependencies.swift deleted file mode 100644 index 6b6ae4c7fa8..00000000000 --- a/Tuist/Dependencies.swift +++ /dev/null @@ -1,15 +0,0 @@ -import ProjectDescription - -let dependencies = Dependencies( - swiftPackageManager: .init( - productTypes: [ - "SystemPackage": .staticFramework, - "TSCBasic": .staticFramework, - "TSCUtility": .staticFramework, - "TSCclibc": .staticFramework, - "TSCLibc": .staticFramework, - "ArgumentParser": .staticFramework, - ] - ), - platforms: [.macOS] -) diff --git a/Tuist/Package.resolved b/Tuist/Package.resolved deleted file mode 100644 index 2e97e37c199..00000000000 --- a/Tuist/Package.resolved +++ /dev/null @@ -1,247 +0,0 @@ -{ - "pins" : [ - { - "identity" : "aexml", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tadija/AEXML.git", - "state" : { - "revision" : "38f7d00b23ecd891e1ee656fa6aeebd6ba04ecc3", - "version" : "4.6.1" - } - }, - { - "identity" : "anycodable", - "kind" : "remoteSourceControl", - "location" : "https://github.com/Flight-School/AnyCodable", - "state" : { - "revision" : "862808b2070cd908cb04f9aafe7de83d35f81b05", - "version" : "0.6.7" - } - }, - { - "identity" : "colorizer", - "kind" : "remoteSourceControl", - "location" : "https://github.com/getGuaka/Colorizer.git", - "state" : { - "revision" : "2ccc99bf1715e73c4139e8d40b6e6b30be975586", - "version" : "0.2.1" - } - }, - { - "identity" : "combineext", - "kind" : "remoteSourceControl", - "location" : "https://github.com/CombineCommunity/CombineExt.git", - "state" : { - "revision" : "d7b896fa9ca8b47fa7bcde6b43ef9b70bf8c1f56", - "version" : "1.8.1" - } - }, - { - "identity" : "difference", - "kind" : "remoteSourceControl", - "location" : "https://github.com/krzysztofzablocki/Difference.git", - "state" : { - "revision" : "f627d00718033c3d7888acd5f4e3524a843db1cf", - "version" : "1.0.2" - } - }, - { - "identity" : "graphviz", - "kind" : "remoteSourceControl", - "location" : "https://github.com/SwiftDocOrg/GraphViz.git", - "state" : { - "revision" : "70bebcf4597b9ce33e19816d6bbd4ba9b7bdf038", - "version" : "0.2.0" - } - }, - { - "identity" : "kanna", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tid-kijyun/Kanna.git", - "state" : { - "revision" : "f9e4922223dd0d3dfbf02ca70812cf5531fc0593", - "version" : "5.2.7" - } - }, - { - "identity" : "keychainaccess", - "kind" : "remoteSourceControl", - "location" : "https://github.com/kishikawakatsumi/KeychainAccess.git", - "state" : { - "revision" : "84e546727d66f1adc5439debad16270d0fdd04e7", - "version" : "4.2.2" - } - }, - { - "identity" : "komondor", - "kind" : "remoteSourceControl", - "location" : "https://github.com/shibapm/Komondor.git", - "state" : { - "revision" : "90b087b1e39069684b1ff4bf915c2aae594f2d60", - "version" : "1.1.3" - } - }, - { - "identity" : "packageconfig", - "kind" : "remoteSourceControl", - "location" : "https://github.com/shibapm/PackageConfig.git", - "state" : { - "revision" : "58523193c26fb821ed1720dcd8a21009055c7cdb", - "version" : "1.1.3" - } - }, - { - "identity" : "pathkit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/kylef/PathKit.git", - "state" : { - "revision" : "3bfd2737b700b9a36565a8c94f4ad2b050a5e574", - "version" : "1.0.1" - } - }, - { - "identity" : "queuer", - "kind" : "remoteSourceControl", - "location" : "https://github.com/FabrizioBrancati/Queuer.git", - "state" : { - "revision" : "52515108d0ac4616d9e15ffcc7ad986e300d31ff", - "version" : "2.1.1" - } - }, - { - "identity" : "shellout", - "kind" : "remoteSourceControl", - "location" : "https://github.com/JohnSundell/ShellOut.git", - "state" : { - "revision" : "e1577acf2b6e90086d01a6d5e2b8efdaae033568", - "version" : "2.3.0" - } - }, - { - "identity" : "spectre", - "kind" : "remoteSourceControl", - "location" : "https://github.com/kylef/Spectre.git", - "state" : { - "revision" : "26cc5e9ae0947092c7139ef7ba612e34646086c7", - "version" : "0.10.1" - } - }, - { - "identity" : "stencil", - "kind" : "remoteSourceControl", - "location" : "https://github.com/stencilproject/Stencil.git", - "state" : { - "revision" : "4f222ac85d673f35df29962fc4c36ccfdaf9da5b", - "version" : "0.15.1" - } - }, - { - "identity" : "stencilswiftkit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/SwiftGen/StencilSwiftKit.git", - "state" : { - "revision" : "20e2de5322c83df005939d9d9300fab130b49f97", - "version" : "2.10.1" - } - }, - { - "identity" : "swift-argument-parser", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-argument-parser.git", - "state" : { - "revision" : "c8ed701b513cf5177118a175d85fbbbcd707ab41", - "version" : "1.3.0" - } - }, - { - "identity" : "swift-log", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-log.git", - "state" : { - "revision" : "532d8b529501fb73a2455b179e0bbb6d49b652ed", - "version" : "1.5.3" - } - }, - { - "identity" : "swift-system", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-system.git", - "state" : { - "revision" : "025bcb1165deab2e20d4eaba79967ce73013f496", - "version" : "1.2.1" - } - }, - { - "identity" : "swift-tools-support-core", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-tools-support-core.git", - "state" : { - "revision" : "3b13e439a341bbbfe0f710c7d1be37221745ef1a", - "version" : "0.6.1" - } - }, - { - "identity" : "swifter", - "kind" : "remoteSourceControl", - "location" : "https://github.com/httpswift/swifter.git", - "state" : { - "revision" : "1e4f51c92d7ca486242d8bf0722b99de2c3531aa" - } - }, - { - "identity" : "swiftgen", - "kind" : "remoteSourceControl", - "location" : "https://github.com/SwiftGen/SwiftGen", - "state" : { - "revision" : "1cf6d7eebd70c2157f69d5a991bc57c1ef182ed1", - "version" : "6.6.2" - } - }, - { - "identity" : "xcbeautify", - "kind" : "remoteSourceControl", - "location" : "https://github.com/cpisciotta/xcbeautify", - "state" : { - "revision" : "84d24a9854e6fdcd2c91122d50a3189b072e8136", - "version" : "1.4.0" - } - }, - { - "identity" : "xcodeproj", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tuist/XcodeProj", - "state" : { - "revision" : "3797181813ee963fe305d939232bc576d23ddbb0", - "version" : "8.15.0" - } - }, - { - "identity" : "xmlcoder", - "kind" : "remoteSourceControl", - "location" : "https://github.com/MaxDesiatov/XMLCoder.git", - "state" : { - "revision" : "b1e944cbd0ef33787b13f639a5418d55b3bed501", - "version" : "0.17.1" - } - }, - { - "identity" : "yams", - "kind" : "remoteSourceControl", - "location" : "https://github.com/jpsim/Yams.git", - "state" : { - "revision" : "0d9ee7ea8c4ebd4a489ad7a73d5c6cad55d6fed3", - "version" : "5.0.6" - } - }, - { - "identity" : "zipfoundation", - "kind" : "remoteSourceControl", - "location" : "https://github.com/weichsel/ZIPFoundation.git", - "state" : { - "revision" : "a3f5c2bae0f04b0bce9ef3c4ba6bd1031a0564c4", - "version" : "0.9.17" - } - } - ], - "version" : 2 -} diff --git a/Tuist/Package.swift b/Tuist/Package.swift deleted file mode 100644 index 009a6c1df16..00000000000 --- a/Tuist/Package.swift +++ /dev/null @@ -1,24 +0,0 @@ -// swift-tools-version: 5.9 -import PackageDescription - -let package = Package( - name: "PackageName", - dependencies: [ - .package(url: "https://github.com/apple/swift-argument-parser", from: "1.2.3"), - .package(url: "https://github.com/apple/swift-log", from: "1.5.3"), - .package(url: "https://github.com/apple/swift-tools-support-core", from: "0.6.1"), - .package(url: "https://github.com/CombineCommunity/CombineExt", from: "1.8.1"), - .package(url: "https://github.com/FabrizioBrancati/Queuer", from: "2.1.1"), - .package(url: "https://github.com/Flight-School/AnyCodable", from: "0.6.7"), - .package(url: "https://github.com/weichsel/ZIPFoundation", from: "0.9.17"), - .package(url: "https://github.com/httpswift/swifter", revision: "1e4f51c92d7ca486242d8bf0722b99de2c3531aa"), - .package(url: "https://github.com/kishikawakatsumi/KeychainAccess", from: "4.2.2"), - .package(url: "https://github.com/stencilproject/Stencil", from: "0.15.1"), - .package(url: "https://github.com/SwiftDocOrg/GraphViz", exact: "0.2.0"), - .package(url: "https://github.com/SwiftGen/StencilSwiftKit", from: "2.10.1"), - .package(url: "https://github.com/SwiftGen/SwiftGen", from: "6.6.2"), - .package(url: "https://github.com/tuist/XcodeProj", from: "8.15.0"), - .package(url: "https://github.com/cpisciotta/xcbeautify", from: "1.4.0"), - .package(url: "https://github.com/krzysztofzablocki/Difference.git", from: "1.0.2"), - ] -) diff --git a/make/tasks/workspace/lint/lockfiles.sh b/make/tasks/workspace/lint/lockfiles.sh deleted file mode 100755 index f0f0d601c54..00000000000 --- a/make/tasks/workspace/lint/lockfiles.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../../utilities/root_dir.sh) - -assert_same_packages_count() { - spm_count=$(jq '.pins | length' "$spm_lockfile") - tuist_count=$(jq '.pins | length' "$tuist_lockfile") - - if [ "$spm_count" -ne "$tuist_count" ]; then - echo "The number of packages in the Package.resolved files don't match." - return 1 - fi - return 0 -} - -assert_same_versions() { - mismatched_packages=() - - for package_name in $(jq -r '.pins[] .identity' "$spm_lockfile"); do - if jq -e ".pins[] | select(.identity == \"$package_name\")" "$tuist_lockfile" > /dev/null; then - tuist_revision=$(jq -r ".pins[] | select(.identity == \"$package_name\") .state.revision" "$tuist_lockfile") - spm_revision=$(jq -r ".pins[] | select(.identity == \"$package_name\") .state.revision" "$spm_lockfile") - - if [ "$tuist_revision" != "$spm_revision" ]; then - mismatched_packages+=("$package_name") - fi - fi - done - - if [ "${#mismatched_packages[@]}" -ne 0 ]; then - echo "There's a mismatch between the revision of the following packages in the Package.resolved files: ${mismatched_packages[*]}" - return 1 - fi - - return 0 -} - -spm_lockfile="$ROOT_DIR/Package.resolved" -tuist_lockfile="$ROOT_DIR/Tuist/Package.resolved" - -assert_same_packages_count -status1=$? - -assert_same_versions -status2=$? - -if [ $status1 -ne 0 ] || [ $status2 -ne 0 ]; then - exit 1 -fi From 8ec63a35f68e8b8e66070a236c9078c7a6582f3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 2 Feb 2024 11:38:21 +0100 Subject: [PATCH 028/509] Fix tuist clean dependencies (#5872) * Fix tuist clean dependencies * Fix test_run_without_category_cleans_all test --- Sources/TuistKit/Services/CleanService.swift | 7 +++---- .../Services/CleanServiceTests.swift | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Sources/TuistKit/Services/CleanService.swift b/Sources/TuistKit/Services/CleanService.swift index 5b8d287b4ca..bdb45975257 100644 --- a/Sources/TuistKit/Services/CleanService.swift +++ b/Sources/TuistKit/Services/CleanService.swift @@ -42,10 +42,9 @@ public enum TuistCleanCategory: CleanCategory { case let .global(category): return CacheDirectoriesProvider.tuistCacheDirectory(for: category, cacheDirectory: cacheDirectory) case .dependencies: - return rootDirectory?.appending(components: [ - Constants.tuistDirectoryName, - Constants.SwiftPackageManager.packageBuildDirectoryName, - ]) + return rootDirectory?.appending( + component: Constants.SwiftPackageManager.packageBuildDirectoryName + ) } } } diff --git a/Tests/TuistKitTests/Services/CleanServiceTests.swift b/Tests/TuistKitTests/Services/CleanServiceTests.swift index 9ab54ec2649..46b7d5fdbcc 100644 --- a/Tests/TuistKitTests/Services/CleanServiceTests.swift +++ b/Tests/TuistKitTests/Services/CleanServiceTests.swift @@ -48,6 +48,20 @@ final class CleanServiceTests: TuistUnitTestCase { XCTAssertTrue(FileHandler.shared.exists(cachePaths[1])) } + func test_run_with_dependencies_cleans_dependencies() throws { + // Given + let localPaths = try createFolders([".build", "Tuist/ProjectDescriptionHelpers"]) + + rootDirectoryLocator.locateStub = localPaths[0].parentDirectory + + // When + try subject.run(categories: [TuistCleanCategory.dependencies], path: nil) + + // Then + XCTAssertFalse(FileHandler.shared.exists(localPaths[0])) + XCTAssertTrue(FileHandler.shared.exists(localPaths[1])) + } + func test_run_without_category_cleans_all() throws { // Given let cachePaths = try createFolders(["tuist/Manifests"]) @@ -58,7 +72,7 @@ final class CleanServiceTests: TuistUnitTestCase { let projectPath = try temporaryPath() rootDirectoryLocator.locateStub = projectPath let swiftPackageManagerBuildPath = projectPath.appending( - components: Constants.tuistDirectoryName, Constants.SwiftPackageManager.packageBuildDirectoryName + components: Constants.SwiftPackageManager.packageBuildDirectoryName ) try fileHandler.createFolder(swiftPackageManagerBuildPath) From 8f607d593a70ab0cfcfbb2f629ef9bddcf5b4c65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 2 Feb 2024 15:43:50 +0100 Subject: [PATCH 029/509] Throw an error when focusing on a non-existent target (#5874) --- .../Mappers/FocusTargetsGraphMappers.swift | 24 +++++++++++++ .../FocusTargetsGraphMappersTests.swift | 35 +++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift b/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift index 5cc20700aac..2552dd726c9 100644 --- a/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift +++ b/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift @@ -2,6 +2,25 @@ import Foundation import TSCBasic import TuistCore import TuistGraph +import TuistSupport + +public enum FocusTargetsGraphMappersError: FatalError, Equatable { + case targetsNotFound([String]) + + public var type: ErrorType { + switch self { + case .targetsNotFound: + return .abort + } + } + + public var description: String { + switch self { + case let .targetsNotFound(targets): + return "The following targets were not found: \(targets.joined(separator: ", ")). Please, make sure they exist." + } + } +} /// `FocusTargetsGraphMappers` is used to filter out some targets and their dependencies and tests targets. public final class FocusTargetsGraphMappers: GraphMapping { @@ -32,6 +51,11 @@ public final class FocusTargetsGraphMappers: GraphMapping { excludingExternalTargets: true ) + let unavailableIncludedTargets = Set(includedTargets).subtracting(userSpecifiedSourceTargets.map(\.target.name)) + if !unavailableIncludedTargets.isEmpty { + throw FocusTargetsGraphMappersError.targetsNotFound(Array(unavailableIncludedTargets)) + } + let filteredTargets = Set(try topologicalSort( Array(userSpecifiedSourceTargets), successors: { Array(graphTraverser.directTargetDependencies(path: $0.path, name: $0.target.name)).map(\.graphTarget) } diff --git a/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift b/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift index ac42112fa2b..226eb881650 100644 --- a/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift +++ b/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift @@ -225,4 +225,39 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { expectingTargets.map(\.name).sorted() ) } + + func test_map_when_included_targets_do_not_exist() throws { + // Given + let targetNames = ["foo", "bar", "baz"] + let aTarget = Target.test(name: targetNames[0]) + let aTestTarget = Target.test(name: targetNames[0] + "Tests", product: .unitTests) + let cTarget = Target.test(name: targetNames[2]) + let subject = FocusTargetsGraphMappers(includedTargets: [aTarget.name, "bar"]) + let path = try temporaryPath() + let project = Project.test(path: path) + let graph = Graph.test( + projects: [project.path: project], + targets: [ + path: [ + aTestTarget.name: aTestTarget, + aTarget.name: aTarget, + cTarget.name: cTarget, + ], + ], + dependencies: [ + .target(name: aTestTarget.name, path: path): [ + .target(name: aTarget.name, path: path), + ], + .target(name: cTarget.name, path: path): [ + .target(name: aTarget.name, path: path), + ], + ] + ) + + // When + XCTAssertThrowsSpecific( + try subject.map(graph: graph), + FocusTargetsGraphMappersError.targetsNotFound(["bar"]) + ) + } } From 86c38a8aa57a8b23eeb0847df8696ab1d3550aba Mon Sep 17 00:00:00 2001 From: Antti Laitala <133648611+anlaital-oura@users.noreply.github.com> Date: Sat, 3 Feb 2024 11:22:37 +0200 Subject: [PATCH 030/509] Improve performance of resolving manifest file paths (#5871) * Improve performance of resolving manifest file paths * Run lint:fix * Review fixes * Fix acceptance tests * Run lint:fix * Make it another 10x faster --- .../Utils/ManifestFilesLocator.swift | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/Sources/TuistLoader/Utils/ManifestFilesLocator.swift b/Sources/TuistLoader/Utils/ManifestFilesLocator.swift index b9ab6e7d527..eb1645f3d79 100644 --- a/Sources/TuistLoader/Utils/ManifestFilesLocator.swift +++ b/Sources/TuistLoader/Utils/ManifestFilesLocator.swift @@ -101,9 +101,29 @@ public final class ManifestFilesLocator: ManifestFilesLocating { Manifest.workspace.fileName(path), Manifest.plugin.fileName(path), ] - let tuistManifestsFilePaths = fileHandler.glob(path, glob: "**/*.swift") - .filter { fileNamesCandidates.contains($0.basename) } - .filter { hasValidManifestContent($0) } + + var tuistManifestsFilePaths = [AbsolutePath]() + + let enumerator = FileManager.default.enumerator( + at: path.url, + includingPropertiesForKeys: nil, + options: [.skipsHiddenFiles, .skipsPackageDescendants] + ) + + while let candidateURL = enumerator?.nextObject() as? URL { + guard candidateURL.pathExtension == "swift", + fileNamesCandidates.contains(candidateURL.lastPathComponent) + else { + continue + } + // Symlinks need to be resolved for resulting absolute URLs to point to the right place. + let url = candidateURL.resolvingSymlinksInPath() + let absolutePath = AbsolutePath(stringLiteral: url.path) + if hasValidManifestContent(absolutePath) { + tuistManifestsFilePaths.append(absolutePath) + } + } + let cachedTuistManifestsFilePaths = Set(tuistManifestsFilePaths) cacheTuistManifestsFilePaths[path] = cachedTuistManifestsFilePaths return cachedTuistManifestsFilePaths From 1fd3094731ed3abf1b7c5bc4ebc269865abe69b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Sat, 3 Feb 2024 11:58:50 +0100 Subject: [PATCH 031/509] Fix error message on missing dependencies (#5875) --- .../Loaders/SwiftPackageManagerGraphLoader.swift | 12 +++++++++++- .../DependenciesAcceptanceTests.swift | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift index 47d4aeb770b..8a5b49946ae 100644 --- a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift +++ b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift @@ -13,12 +13,16 @@ enum SwiftPackageManagerGraphGeneratorError: FatalError, Equatable { case unsupportedDependencyKind(String) /// Thrown when `SwiftPackageManagerWorkspaceState.packageRef.path` is not present in a local swift package. case missingPathInLocalSwiftPackage(String) + /// Thrown when dependencies were not installed before loading the graph SwiftPackageManagerGraph + case installRequired /// Error type. var type: ErrorType { switch self { case .unsupportedDependencyKind, .missingPathInLocalSwiftPackage: return .bug + case .installRequired: + return .abort } } @@ -29,6 +33,8 @@ enum SwiftPackageManagerGraphGeneratorError: FatalError, Equatable { return "The dependency kind \(name) is not supported." case let .missingPathInLocalSwiftPackage(name): return "The local package \(name) does not contain the path in the generated `workspace-state.json` file." + case .installRequired: + return "We could not find external dependencies. Run `tuist install` before you continue." } } } @@ -94,8 +100,12 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi let checkoutsFolder = path.appending(component: "checkouts") let workspacePath = path.appending(component: "workspace-state.json") + if !fileHandler.exists(workspacePath) { + throw SwiftPackageManagerGraphGeneratorError.installRequired + } + let workspaceState = try JSONDecoder() - .decode(SwiftPackageManagerWorkspaceState.self, from: try FileHandler.shared.readFile(workspacePath)) + .decode(SwiftPackageManagerWorkspaceState.self, from: try fileHandler.readFile(workspacePath)) let packageInfos: [ // swiftlint:disable:next large_tuple (id: String, name: String, folder: AbsolutePath, targetToArtifactPaths: [String: AbsolutePath], info: PackageInfo) diff --git a/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift b/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift index 411fee2785f..ce76298bc95 100644 --- a/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift +++ b/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift @@ -13,3 +13,19 @@ final class DependenciesAcceptanceTestAppWithSPMDependencies: TuistAcceptanceTes try await run(BuildCommand.self, "App") } } + +final class DependenciesAcceptanceTestAppWithSPMDependenciesWithoutInstall: TuistAcceptanceTestCase { + func test() async throws { + try setUpFixture(.appWithSpmDependencies) + do { + try await run(GenerateCommand.self) + } catch { + XCTAssertEqual( + (error as? FatalError)?.description, + "We could not find external dependencies. Run `tuist install` before you continue." + ) + return + } + XCTFail("Generate should have failed.") + } +} From 2f33c05c2528ea875614d63b80bf29667d76ffe3 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Mon, 5 Feb 2024 08:54:59 +0000 Subject: [PATCH 032/509] [Release] Tuist 4.0.0-beta.3 --- .mise.toml | 2 +- CHANGELOG.md | 30 ++++++++++++++++++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index a40027e1a95..b2cab5523ed 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.0.0-beta.2" +tuist = "4.0.0-beta.3" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index f0c0d27a622..99068442372 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,43 @@ # Changelog +## 4.0.0-beta.3 - 2024-02-05 + +### Tuist + +#### Changed + +- Rename `fetch` to `install` [#5857](https://github.com/tuist/tuist/pull/5857) by [@pepicrft](https://github.com/pepicrft) +- Change Package.swift directory from Tuist to root [#5862](https://github.com/tuist/tuist/pull/5862) by [@fortmarek](https://github.com/fortmarek) +- Align the cache directory with the UNIX XDG Base Directory Specification [#5855](https://github.com/tuist/tuist/pull/5855) by [@pepicrft](https://github.com/pepicrft) +- Improve performance of resolving manifest file paths [#5871](https://github.com/tuist/tuist/pull/5871) by [@anlaital-oura](https://github.com/anlaital-oura) + +#### Fixed + +- Fix running tuist clean without a specific category [#5868](https://github.com/tuist/tuist/pull/5868) by [@fortmarek](https://github.com/fortmarek) +- Fix tuist clean dependencies [#5872](https://github.com/tuist/tuist/pull/5872) by [@fortmarek](https://github.com/fortmarek) +- Throw an error when focusing on a non-existent target [#5874](https://github.com/tuist/tuist/pull/5874) by [@fortmarek](https://github.com/fortmarek) +- Fix error message on missing dependencies [#5875](https://github.com/tuist/tuist/pull/5875) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +#### Changed + +- Fix tuist clean, remove --skip-cache by [@fortmarek](https://github.com/fortmarek) + +#### Fixed + +- Fixed binary-caching of macOS targets might fail due to missing destinations by [@fortmarek](https://github.com/fortmarek) + ## 4.0.0-beta.2 - 2024-02-01 ### Tuist #### Fixed + - Fix install script [#5858](https://github.com/tuist/tuist/pull/5858) by [@svenmuennich](https://github.com/svenmuennich) #### Changed + - Change Package.swift directory from Tuist to root [#5862](https://github.com/tuist/tuist/pull/5862) by [@fortmarek](https://github.com/fortmarek) - Rename `fetch` to `install` [#5857](https://github.com/tuist/tuist/pull/5857) by [@pepicrft](https://github.com/pepicrft) - Align the cache directory with the UNIX XDG Base Directory Specification [#5855](https://github.com/tuist/tuist/pull/5855) by [@pepicrft](https://github.com/pepicrft) diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 8b82214103a..bcfb626b4c2 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.0.0-beta.2" + public static let version = "4.0.0-beta.3" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From 6bd8e692cdbfd8701dfa314bb0ac10b9f8c9f0e8 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Mon, 5 Feb 2024 09:32:34 +0000 Subject: [PATCH 033/509] [Release] Tuist 4.0.0-beta.3 From 66fe6acce7f0a841f3ee46e854a980dd1f0e84bd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:50:40 +0100 Subject: [PATCH 034/509] add anlaital-oura as a contributor for code (#5880) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 +++ 2 files changed, 12 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2138fa98f0b..b3fe7152602 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1273,6 +1273,15 @@ "contributions": [ "code" ] + }, + { + "login": "anlaital-oura", + "name": "Antti Laitala", + "avatar_url": "https://avatars.githubusercontent.com/u/133648611?v=4", + "profile": "https://github.com/anlaital-oura", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 80b562fa098..042db2deb6d 100644 --- a/README.md +++ b/README.md @@ -459,6 +459,9 @@ Thanks goes to these wonderful people:
한석호(MilKyo)

Hai Feng Kao
+ +
Antti Laitala
+ From dfca500967b9c33d34f6430f2ef6dfc7016e1502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Mon, 5 Feb 2024 16:51:46 +0100 Subject: [PATCH 035/509] Add `Mockable` macro (#5859) * Add Mockable macro * Use Mockable * Add it to all the targets * Fix * Fix tests --- Package.resolved | 22 +++- Package.swift | 10 +- .../ProjectDescriptorGenerator.swift | 2 +- .../PackageInfoMapper.swift | 2 + Sources/TuistSupport/Utils/FileArchiver.swift | 2 + .../Utils/FileArchivingFactory.swift | 2 + .../TuistSupport/Utils/FileUnarchiver.swift | 3 +- .../Utils/MockFileArchivingFactory.swift | 107 ------------------ ...ltipleConfigurationsIntegrationTests.swift | 5 +- .../Plugin/PluginArchiveServiceTests.swift | 18 +-- .../TuistPluginTests/PluginServiceTests.swift | 9 +- .../Target+Helpers.swift | 24 +++- 12 files changed, 75 insertions(+), 131 deletions(-) delete mode 100644 Sources/TuistSupportTesting/Utils/MockFileArchivingFactory.swift diff --git a/Package.resolved b/Package.resolved index 2e97e37c199..201907eb60b 100644 --- a/Package.resolved +++ b/Package.resolved @@ -81,6 +81,15 @@ "version" : "1.1.3" } }, + { + "identity" : "mockable", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Kolos65/Mockable.git", + "state" : { + "revision" : "7af00c08880d375f2742ca55705abd69837fe6c3", + "version" : "0.0.2" + } + }, { "identity" : "packageconfig", "kind" : "remoteSourceControl", @@ -162,6 +171,15 @@ "version" : "1.5.3" } }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-syntax.git", + "state" : { + "revision" : "64889f0c732f210a935a0ad7cda38f77f876262d", + "version" : "509.1.1" + } + }, { "identity" : "swift-system", "kind" : "remoteSourceControl", @@ -211,8 +229,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/tuist/XcodeProj", "state" : { - "revision" : "3797181813ee963fe305d939232bc576d23ddbb0", - "version" : "8.15.0" + "revision" : "e29e0db843062f5157f77d5b68f237eb5aa43f12", + "version" : "8.18.0" } }, { diff --git a/Package.swift b/Package.swift index 6d0c4bcaada..6677fdf78d7 100644 --- a/Package.swift +++ b/Package.swift @@ -265,6 +265,13 @@ var targets: [Target] = [ "TSCclibc": .staticFramework, "TSCLibc": .staticFramework, "ArgumentParser": .staticFramework, + "Mockable": .staticFramework, + "MockableTest": .staticFramework, + ], + // To revert once we release Tuist 4 + targetSettings: [ + "Mockable": ["ENABLE_TESTING_SEARCH_PATHS": "YES"], + "MockableTest": ["ENABLE_TESTING_SEARCH_PATHS": "YES"], ], platforms: [.macOS] ) @@ -370,9 +377,10 @@ let package = Package( .package(url: "https://github.com/SwiftDocOrg/GraphViz", exact: "0.2.0"), .package(url: "https://github.com/SwiftGen/StencilSwiftKit", exact: "2.10.1"), .package(url: "https://github.com/SwiftGen/SwiftGen", exact: "6.6.2"), - .package(url: "https://github.com/tuist/XcodeProj", exact: "8.15.0"), + .package(url: "https://github.com/tuist/XcodeProj", exact: "8.18.0"), .package(url: "https://github.com/cpisciotta/xcbeautify", from: "1.4.0"), .package(url: "https://github.com/krzysztofzablocki/Difference.git", from: "1.0.2"), + .package(url: "https://github.com/Kolos65/Mockable.git", from: "0.0.2"), ], targets: targets ) diff --git a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift index 69068b2b662..7a1e02aecbe 100644 --- a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift @@ -281,7 +281,7 @@ final class ProjectDescriptorGenerator: ProjectDescriptorGenerating { } } - pbxProject.packages = packageReferences.sorted { $0.key < $1.key }.map { $1 } + pbxProject.remotePackages = packageReferences.sorted { $0.key < $1.key }.map { $1 } } private func generateAttributes(project: Project) -> [String: Any] { diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 3e24b8cdab0..d9c478d3e66 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -433,6 +433,8 @@ public final class PackageInfoMapper: PackageInfoMapping { "TSCTestSupport", // https://github.com/apple/swift-tools-support-core "ViewInspector", // https://github.com/nalexn/ViewInspector "XCTVapor", // https://github.com/vapor/vapor + "Mockable", // https://github.com/Kolos65/Mockable.git + "MockableTest", // https://github.com/Kolos65/Mockable.git ].map { ($0, ["ENABLE_TESTING_SEARCH_PATHS": "YES"]) } diff --git a/Sources/TuistSupport/Utils/FileArchiver.swift b/Sources/TuistSupport/Utils/FileArchiver.swift index 894a4b1537a..8bf949dc15c 100644 --- a/Sources/TuistSupport/Utils/FileArchiver.swift +++ b/Sources/TuistSupport/Utils/FileArchiver.swift @@ -1,7 +1,9 @@ import Foundation +import Mockable import TSCBasic /// An interface to archive files in a zip file. +@Mockable public protocol FileArchiving { /// Zips files and outputs them in a zip file with the given name. /// - Parameter name: Name of the output zip file. diff --git a/Sources/TuistSupport/Utils/FileArchivingFactory.swift b/Sources/TuistSupport/Utils/FileArchivingFactory.swift index 0d759bd8d73..5686078592b 100644 --- a/Sources/TuistSupport/Utils/FileArchivingFactory.swift +++ b/Sources/TuistSupport/Utils/FileArchivingFactory.swift @@ -1,6 +1,8 @@ +import Mockable import TSCBasic /// An interface that defines a factory of archiver and unarchivers. +@Mockable public protocol FileArchivingFactorying { /// Returns an archiver to archive the given paths. /// - Parameter paths: Files to archive. diff --git a/Sources/TuistSupport/Utils/FileUnarchiver.swift b/Sources/TuistSupport/Utils/FileUnarchiver.swift index 8f3f5818a5a..40adc0f1f39 100644 --- a/Sources/TuistSupport/Utils/FileUnarchiver.swift +++ b/Sources/TuistSupport/Utils/FileUnarchiver.swift @@ -1,7 +1,8 @@ import Foundation +import Mockable import TSCBasic -/// An interface to unarchive files from a zip file. +@Mockable public protocol FileUnarchiving { /// Unarchives the files into a temporary directory and returns the path to that directory. func unzip() throws -> AbsolutePath diff --git a/Sources/TuistSupportTesting/Utils/MockFileArchivingFactory.swift b/Sources/TuistSupportTesting/Utils/MockFileArchivingFactory.swift deleted file mode 100644 index 0cc49ef5dfb..00000000000 --- a/Sources/TuistSupportTesting/Utils/MockFileArchivingFactory.swift +++ /dev/null @@ -1,107 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport - -public class MockFileArchivingFactory: FileArchivingFactorying { - public init() {} - - public var invokedMakeFileArchiver = false - public var invokedMakeFileArchiverCount = 0 - public var invokedMakeFileArchiverParameters: (paths: [AbsolutePath], Void)? - public var invokedMakeFileArchiverParametersList = [(paths: [AbsolutePath], Void)]() - public var stubbedMakeFileArchiverError: Error? - public var stubbedMakeFileArchiverResult: FileArchiving! - - public func makeFileArchiver(for paths: [AbsolutePath]) throws -> FileArchiving { - invokedMakeFileArchiver = true - invokedMakeFileArchiverCount += 1 - invokedMakeFileArchiverParameters = (paths, ()) - invokedMakeFileArchiverParametersList.append((paths, ())) - if let error = stubbedMakeFileArchiverError { - throw error - } - return stubbedMakeFileArchiverResult - } - - public var invokedMakeFileUnarchiver = false - public var invokedMakeFileUnarchiverCount = 0 - public var invokedMakeFileUnarchiverParameters: (path: AbsolutePath, Void)? - public var invokedMakeFileUnarchiverParametersList = [(path: AbsolutePath, Void)]() - public var stubbedMakeFileUnarchiverError: Error? - public var stubbedMakeFileUnarchiverResult: FileUnarchiving! - - public func makeFileUnarchiver(for path: AbsolutePath) throws -> FileUnarchiving { - invokedMakeFileUnarchiver = true - invokedMakeFileUnarchiverCount += 1 - invokedMakeFileUnarchiverParameters = (path, ()) - invokedMakeFileUnarchiverParametersList.append((path, ())) - if let error = stubbedMakeFileUnarchiverError { - throw error - } - return stubbedMakeFileUnarchiverResult - } -} - -public class MockFileArchiver: FileArchiving { - public init() {} - - public var invokedZip = false - public var invokedZipCount = 0 - public var invokedZipParameters: (name: String, Void)? - public var invokedZipParametersList = [(name: String, Void)]() - public var stubbedZipError: Error? - public var stubbedZipResult: AbsolutePath! - - public func zip(name: String) throws -> AbsolutePath { - invokedZip = true - invokedZipCount += 1 - invokedZipParameters = (name, ()) - invokedZipParametersList.append((name, ())) - if let error = stubbedZipError { - throw error - } - return stubbedZipResult - } - - public var invokedDelete = false - public var invokedDeleteCount = 0 - public var stubbedDeleteError: Error? - - public func delete() throws { - invokedDelete = true - invokedDeleteCount += 1 - if let error = stubbedDeleteError { - throw error - } - } -} - -public class MockFileUnarchiver: FileUnarchiving { - public init() {} - - public var invokedUnzip = false - public var invokedUnzipCount = 0 - public var stubbedUnzipError: Error? - public var stubbedUnzipResult: AbsolutePath! - - public func unzip() throws -> AbsolutePath { - invokedUnzip = true - invokedUnzipCount += 1 - if let error = stubbedUnzipError { - throw error - } - return stubbedUnzipResult - } - - public var invokedDelete = false - public var invokedDeleteCount = 0 - public var stubbedDeleteError: Error? - - public func delete() throws { - invokedDelete = true - invokedDeleteCount += 1 - if let error = stubbedDeleteError { - throw error - } - } -} diff --git a/Tests/TuistIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift b/Tests/TuistIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift index 77fe4e2dd99..94dc4ec726a 100644 --- a/Tests/TuistIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift +++ b/Tests/TuistIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift @@ -318,8 +318,9 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { XCTAssertTrue(debug.contains("GCC_PREPROCESSOR_DEFINITIONS", "DEBUG=1")) XCTAssertTrue(customDebug.contains("GCC_PREPROCESSOR_DEFINITIONS", "DEBUG=1")) - XCTAssertTrue(debug.contains("SWIFT_ACTIVE_COMPILATION_CONDITIONS", "DEBUG")) - XCTAssertTrue(customDebug.contains("SWIFT_ACTIVE_COMPILATION_CONDITIONS", "DEBUG")) + // These include a prefix space because $(inherited) + XCTAssertTrue(debug.contains("SWIFT_ACTIVE_COMPILATION_CONDITIONS", " DEBUG")) + XCTAssertTrue(customDebug.contains("SWIFT_ACTIVE_COMPILATION_CONDITIONS", " DEBUG")) XCTAssertFalse(release.contains("SWIFT_ACTIVE_COMPILATION_CONDITIONS", "DEBUG")) XCTAssertFalse(customRelease.contains("SWIFT_ACTIVE_COMPILATION_CONDITIONS", "DEBUG")) diff --git a/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift b/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift index 1afa34748af..995c01d0758 100644 --- a/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift +++ b/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift @@ -1,22 +1,22 @@ +import MockableTest import TSCBasic +import TuistLoaderTesting import TuistSupport import TuistSupportTesting import XCTest - -import TuistLoaderTesting @testable import TuistKit final class PluginArchiveServiceTests: TuistUnitTestCase { private var subject: PluginArchiveService! private var swiftPackageManagerController: MockSwiftPackageManagerController! private var manifestLoader: MockManifestLoader! - private var fileArchiverFactory: MockFileArchivingFactory! + private var fileArchiverFactory: MockFileArchivingFactorying! override func setUp() { super.setUp() swiftPackageManagerController = MockSwiftPackageManagerController() manifestLoader = MockManifestLoader() - fileArchiverFactory = MockFileArchivingFactory() + fileArchiverFactory = MockFileArchivingFactorying() subject = PluginArchiveService( swiftPackageManagerController: swiftPackageManagerController, manifestLoader: manifestLoader, @@ -96,10 +96,10 @@ final class PluginArchiveServiceTests: TuistUnitTestCase { swiftPackageManagerController.loadBuildFatReleaseBinaryStub = { _, product, _, _ in builtProducts.append(product) } - let fileArchiver = MockFileArchiver() - fileArchiverFactory.stubbedMakeFileArchiverResult = fileArchiver + let fileArchiver = MockFileArchiving() + given(fileArchiverFactory).makeFileArchiver(for: .any).willReturn(fileArchiver) let zipPath = path.appending(components: "test-zip") - fileArchiver.stubbedZipResult = zipPath + given(fileArchiver).zip(name: .any).willReturn(zipPath) try fileHandler.createFolder(zipPath) // When @@ -108,7 +108,9 @@ final class PluginArchiveServiceTests: TuistUnitTestCase { // Then XCTAssertEqual(invokedPackagePath, path) XCTAssertEqual(builtProducts, ["tuist-one", "tuist-two"]) - XCTAssertEqual(fileArchiver.invokedZipParameters?.name, "TestPlugin.tuist-plugin.zip") + + _ = verify(fileArchiver).zip(name: .value("TestPlugin.tuist-plugin.zip")) + XCTAssertTrue( fileHandler.isFolder( path.appending(component: "TestPlugin.tuist-plugin.zip") diff --git a/Tests/TuistPluginTests/PluginServiceTests.swift b/Tests/TuistPluginTests/PluginServiceTests.swift index 6a6f3334423..f006a8afcdf 100644 --- a/Tests/TuistPluginTests/PluginServiceTests.swift +++ b/Tests/TuistPluginTests/PluginServiceTests.swift @@ -1,3 +1,4 @@ +import MockableTest import ProjectDescription import TSCBasic import TuistCore @@ -21,7 +22,7 @@ final class PluginServiceTests: TuistUnitTestCase { private var subject: PluginService! private var cacheDirectoriesProvider: MockCacheDirectoriesProvider! private var cacheDirectoryProviderFactory: MockCacheDirectoriesProviderFactory! - private var fileUnarchiver: MockFileUnarchiver! + private var fileUnarchiver: MockFileUnarchiving! private var fileClient: MockFileClient! override func setUp() { @@ -34,9 +35,9 @@ final class PluginServiceTests: TuistUnitTestCase { cacheDirectoriesProvider.cacheDirectoryStub = try! temporaryPath() cacheDirectoryProviderFactory = MockCacheDirectoriesProviderFactory(provider: cacheDirectoriesProvider) cacheDirectoryProviderFactory.cacheDirectoriesStub = { mockCacheDirectoriesProvider } - fileUnarchiver = MockFileUnarchiver() - let fileArchivingFactory = MockFileArchivingFactory() - fileArchivingFactory.stubbedMakeFileUnarchiverResult = fileUnarchiver + fileUnarchiver = MockFileUnarchiving() + let fileArchivingFactory = MockFileArchivingFactorying() + given(fileArchivingFactory).makeFileUnarchiver(for: .any).willReturn(fileUnarchiver) fileClient = MockFileClient() subject = PluginService( manifestLoader: manifestLoader, diff --git a/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift b/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift index 964466f7f60..599d20c0839 100644 --- a/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift +++ b/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift @@ -10,10 +10,20 @@ extension Target { name: String, product: Product, dependencies: [TargetDependency], - settings _: Settings = .settings( + settings: Settings = .settings( configurations: [ - .debug(name: "Debug", settings: [:], xcconfig: nil), - .release(name: "Release", settings: [:], xcconfig: nil), + .debug( + name: "Debug", + + settings: ["SWIFT_ACTIVE_COMPILATION_CONDITIONS": "$(inherited) MOCKING"], + xcconfig: nil + ), + .release( + name: "Release", + + settings: [:], + xcconfig: nil + ), ] ) ) -> Target { @@ -32,7 +42,8 @@ extension Target { deploymentTargets: .macOS("12.0"), infoPlist: .default, sources: ["\(rootFolder)/\(name)/**/*.swift"], - dependencies: dependencies + dependencies: dependencies, + settings: settings ) } @@ -51,7 +62,9 @@ extension Target { .target( name: name, product: product, - dependencies: dependencies + dependencies: dependencies + [ + .external(name: "Mockable"), + ] ), ] var testTargets: [Target] = [] @@ -64,6 +77,7 @@ extension Target { .target(name: name), .external(name: "SwiftToolsSupport"), .external(name: "SystemPackage"), + .external(name: "MockableTest"), ] + (hasTesting ? [.target(name: "\(name)Testing")] : []) ) From f6d84e709bc81721f277d3559bfe0fe83260cff0 Mon Sep 17 00:00:00 2001 From: Pedro Date: Mon, 5 Feb 2024 18:06:23 +0100 Subject: [PATCH 036/509] Mitigate warnings --- Tuist/ProjectDescriptionHelpers/Target+Helpers.swift | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift b/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift index 599d20c0839..9e0dd8f21ed 100644 --- a/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift +++ b/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift @@ -14,7 +14,6 @@ extension Target { configurations: [ .debug( name: "Debug", - settings: ["SWIFT_ACTIVE_COMPILATION_CONDITIONS": "$(inherited) MOCKING"], xcconfig: nil ), @@ -58,13 +57,15 @@ extension Target { testingDependencies: [TargetDependency] = [], integrationTestsDependencies: [TargetDependency] = [] ) -> [Target] { + let isStaticProduct = product == .staticLibrary || product == .staticFramework + var targets: [Target] = [ .target( name: name, product: product, - dependencies: dependencies + [ + dependencies: dependencies + (isStaticProduct ? [ .external(name: "Mockable"), - ] + ] : []) ), ] var testTargets: [Target] = [] @@ -77,9 +78,9 @@ extension Target { .target(name: name), .external(name: "SwiftToolsSupport"), .external(name: "SystemPackage"), - .external(name: "MockableTest"), ] + (hasTesting ? [.target(name: "\(name)Testing")] : []) + + (isStaticProduct ? [.external(name: "MockableTest")] : []) ) ) } From c340c8155c5a78b94b3799574ce26d7b72c0ab8e Mon Sep 17 00:00:00 2001 From: pepicrft Date: Mon, 5 Feb 2024 17:12:56 +0000 Subject: [PATCH 037/509] [Release] Tuist 4.0.0-beta.4 --- .mise.toml | 2 +- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index b2cab5523ed..d23449464f4 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.0.0-beta.3" +tuist = "4.0.0-beta.4" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index 99068442372..ca5166a15b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,33 @@ # Changelog +## 4.0.0-beta.4 - 2024-02-05 + +### Tuist + +#### Changed + +- Rename `fetch` to `install` [#5857](https://github.com/tuist/tuist/pull/5857) by [@pepicrft](https://github.com/pepicrft) +- Change Package.swift directory from Tuist to root [#5862](https://github.com/tuist/tuist/pull/5862) by [@fortmarek](https://github.com/fortmarek) +- Align the cache directory with the UNIX XDG Base Directory Specification [#5855](https://github.com/tuist/tuist/pull/5855) by [@pepicrft](https://github.com/pepicrft) +- Improve performance of resolving manifest file paths [#5871](https://github.com/tuist/tuist/pull/5871) by [@anlaital-oura](https://github.com/anlaital-oura) + +#### Fixed + +- Fix running tuist clean without a specific category [#5868](https://github.com/tuist/tuist/pull/5868) by [@fortmarek](https://github.com/fortmarek) +- Fix tuist clean dependencies [#5872](https://github.com/tuist/tuist/pull/5872) by [@fortmarek](https://github.com/fortmarek) +- Throw an error when focusing on a non-existent target [#5874](https://github.com/tuist/tuist/pull/5874) by [@fortmarek](https://github.com/fortmarek) +- Fix error message on missing dependencies [#5875](https://github.com/tuist/tuist/pull/5875) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +#### Changed + +- Fix tuist clean, remove --skip-cache by [@fortmarek](https://github.com/fortmarek) + +#### Fixed + +- Fixed binary-caching of macOS targets might fail due to missing destinations by [@fortmarek](https://github.com/fortmarek) + ## 4.0.0-beta.3 - 2024-02-05 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index bcfb626b4c2..33ed77f18d7 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.0.0-beta.3" + public static let version = "4.0.0-beta.4" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From be8faa787999dde8dd3ba34086a0ad0c892369cc Mon Sep 17 00:00:00 2001 From: Pedro Date: Mon, 5 Feb 2024 18:28:02 +0100 Subject: [PATCH 038/509] Add missing Mockable to the Package.swift --- Package.swift | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Package.swift b/Package.swift index 6677fdf78d7..57a7737a0b0 100644 --- a/Package.swift +++ b/Package.swift @@ -30,6 +30,7 @@ var targets: [Target] = [ swiftToolsSupportDependency, "AnyCodable", "TuistSupport", + "Mockable" ] ), .target( @@ -50,6 +51,7 @@ var targets: [Target] = [ "TuistSupport", "TuistGraph", "XcodeProj", + "Mockable" ] ), .target( @@ -82,6 +84,7 @@ var targets: [Target] = [ "TuistAnalytics", "TuistPlugin", "TuistGraph", + "Mockable" ] ), .executableTarget( @@ -109,6 +112,7 @@ var targets: [Target] = [ swifterDependency, "ZIPFoundation", "ProjectDescription", + "Mockable" ] ), .target( @@ -144,6 +148,7 @@ var targets: [Target] = [ "GraphViz", swiftGenKitDependency, "StencilSwiftKit", + "Mockable" ] ), .target( @@ -163,6 +168,7 @@ var targets: [Target] = [ "TuistSupport", "StencilSwiftKit", "Stencil", + "Mockable" ] ), .target( @@ -174,6 +180,7 @@ var targets: [Target] = [ "TuistCore", "TuistGraph", "TuistSupport", + "Mockable" ] ), .target( @@ -184,6 +191,7 @@ var targets: [Target] = [ "TuistGraph", "TuistSupport", "TuistPlugin", + "Mockable", swiftToolsSupportDependency, ] ), @@ -194,6 +202,7 @@ var targets: [Target] = [ "TuistGraph", "TuistSupport", "XcodeProj", + "Mockable", swiftToolsSupportDependency, ] ), @@ -204,6 +213,7 @@ var targets: [Target] = [ "TuistGraph", "TuistSupport", "XcodeProj", + "Mockable", swiftToolsSupportDependency, "Queuer", ] @@ -216,6 +226,7 @@ var targets: [Target] = [ "TuistCore", "TuistGraph", "TuistSupport", + "Mockable", "ProjectDescription", ] ), @@ -239,6 +250,7 @@ var targets: [Target] = [ "TuistCore", "TuistGraph", "TuistLoader", + "Mockable", swiftToolsSupportDependency, ] ), @@ -249,6 +261,7 @@ var targets: [Target] = [ "TuistLoader", "TuistSupport", "TuistScaffold", + "Mockable", swiftToolsSupportDependency, ] ), From 0df0197f328e005b0789c3313a725157987a33cf Mon Sep 17 00:00:00 2001 From: pepicrft Date: Mon, 5 Feb 2024 17:30:35 +0000 Subject: [PATCH 039/509] [Release] Tuist 4.0.0-beta.4 From 7a5d0c9d7ecc98954823966562f6526edce123a9 Mon Sep 17 00:00:00 2001 From: Pedro Date: Mon, 5 Feb 2024 19:41:03 +0100 Subject: [PATCH 040/509] Add missing flag --- Package.swift | 53 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/Package.swift b/Package.swift index 57a7737a0b0..e8f41813861 100644 --- a/Package.swift +++ b/Package.swift @@ -30,7 +30,10 @@ var targets: [Target] = [ swiftToolsSupportDependency, "AnyCodable", "TuistSupport", - "Mockable" + "Mockable", + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), ] ), .target( @@ -51,7 +54,10 @@ var targets: [Target] = [ "TuistSupport", "TuistGraph", "XcodeProj", - "Mockable" + "Mockable", + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), ] ), .target( @@ -84,7 +90,10 @@ var targets: [Target] = [ "TuistAnalytics", "TuistPlugin", "TuistGraph", - "Mockable" + "Mockable", + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), ] ), .executableTarget( @@ -112,7 +121,10 @@ var targets: [Target] = [ swifterDependency, "ZIPFoundation", "ProjectDescription", - "Mockable" + "Mockable", + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), ] ), .target( @@ -148,7 +160,10 @@ var targets: [Target] = [ "GraphViz", swiftGenKitDependency, "StencilSwiftKit", - "Mockable" + "Mockable", + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), ] ), .target( @@ -168,7 +183,10 @@ var targets: [Target] = [ "TuistSupport", "StencilSwiftKit", "Stencil", - "Mockable" + "Mockable", + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), ] ), .target( @@ -180,7 +198,10 @@ var targets: [Target] = [ "TuistCore", "TuistGraph", "TuistSupport", - "Mockable" + "Mockable", + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), ] ), .target( @@ -193,6 +214,9 @@ var targets: [Target] = [ "TuistPlugin", "Mockable", swiftToolsSupportDependency, + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), ] ), .target( @@ -204,6 +228,9 @@ var targets: [Target] = [ "XcodeProj", "Mockable", swiftToolsSupportDependency, + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), ] ), .target( @@ -216,6 +243,9 @@ var targets: [Target] = [ "Mockable", swiftToolsSupportDependency, "Queuer", + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), ] ), .target( @@ -228,6 +258,9 @@ var targets: [Target] = [ "TuistSupport", "Mockable", "ProjectDescription", + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), ] ), .target( @@ -252,6 +285,9 @@ var targets: [Target] = [ "TuistLoader", "Mockable", swiftToolsSupportDependency, + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), ] ), .target( @@ -263,6 +299,9 @@ var targets: [Target] = [ "TuistScaffold", "Mockable", swiftToolsSupportDependency, + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), ] ), ] From 7dab662cfbd1904a9a0ef4a2c2c68a398de1639f Mon Sep 17 00:00:00 2001 From: pepicrft Date: Tue, 6 Feb 2024 11:58:28 +0000 Subject: [PATCH 041/509] [Release] Tuist 4.0.0-beta.4 From 7cb5f7b49d54d1b126283251bf9c63d087bf0bbc Mon Sep 17 00:00:00 2001 From: pepicrft Date: Tue, 6 Feb 2024 13:15:20 +0000 Subject: [PATCH 042/509] [Release] Tuist 4.0.0-beta.4 From bbba1cdeea586961937199989f364c1bb335287d Mon Sep 17 00:00:00 2001 From: pepicrft Date: Tue, 6 Feb 2024 13:26:25 +0000 Subject: [PATCH 043/509] [Release] Tuist 4.0.0-beta.4 From 76cb21f7c294a6345b62a1b27d664e1f17af0abe Mon Sep 17 00:00:00 2001 From: pepicrft Date: Tue, 6 Feb 2024 13:30:27 +0000 Subject: [PATCH 044/509] [Release] Tuist 4.0.0-beta.4 From 1e14600ccb545aeded122b35d512f2fa8f84db80 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Tue, 6 Feb 2024 13:35:29 +0000 Subject: [PATCH 045/509] [Release] Tuist 4.0.0-beta.4 From 993382be13c9614e44497adbd03b06bf4e5192ba Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 6 Feb 2024 16:55:33 +0100 Subject: [PATCH 046/509] Force CI run From 737864eb21313ff541f5c049d1d2d3b4f92ff7d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 6 Feb 2024 17:22:55 +0100 Subject: [PATCH 047/509] Add ProjectDescriptionHelpers docs (#5879) * Add ProjectDescriptionHelpers docs * Address feedback --------- Co-authored-by: Daniele Formichelli --- .../Articles/Tuist/Users/project-structure.md | 13 +-- .../Users/sharing-code-across-manifests.md | 83 +++++++++++++++++++ docs/Sources/tuist/tuist.docc/Tuist.md | 1 + 3 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/sharing-code-across-manifests.md diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/project-structure.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/project-structure.md index cee74942091..239e6f87417 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/project-structure.md +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/project-structure.md @@ -15,23 +15,24 @@ Xcode projects are **the most common type of project generated by Tuist.** They ```bash Tuist/ Config.swift - Package.swift ProjectDescriptionHelpers/ Projects/ App/ Project.swift Feature/ Project.swift +Package.swift Workspace.swift ``` - **Tuist directory:** This directory has two purposes. First, it signals **where the root of the project is**. This allows constructing paths relative to the root of the project, and also also running Tuist commands from any directory within the project. Second, it's the container for the following files: - - **Config.swift:** This file contains configuration for Tuist that's shared across all the projects, workspaces, and environments. For example, it can be used to disable automatic generation of schemes, or to define the deployment target of the projects. - - **Package.swift:** This file contains Swift Package dependencies for Tuist to integrate them using Xcode projects and targets (like [CocoaPods](https://cococapods)) that are configurable and optimizable. - - **ProjectDescriptionHelpers:** This directory contains Swift code that's shared across all the manifest files. Manifest files can `import ProjectDescriptionHelpers` to use the code defined in this directory. Sharing code is useful to avoid duplications and ensure consistency across the projects. + - [**Config.swift:**](doc:config) This file contains configuration for Tuist that's shared across all the projects, workspaces, and environments. For example, it can be used to disable automatic generation of schemes, or to define the deployment target of the projects. + - [**ProjectDescriptionHelpers:**](sharing-code-across-manifests) This directory contains Swift code that's shared across all the manifest files. Manifest files can `import ProjectDescriptionHelpers` to use the code defined in this directory. Sharing code is useful to avoid duplications and ensure consistency across the projects. -- **Workspace.swift:** This manifest represents an Xcode workspace. It's used to group other projects and can also add additional files and schemes. -- **Project.swift:** This manifest represents an Xcode project. It's used to define the targets that are part of the project, and their dependencies. +- **Root directory**: The root directory of your project that also contains the `Tuist` directory. + - [**Package.swift:**](doc:dependencies) This file contains Swift Package dependencies for Tuist to integrate them using Xcode projects and targets (like [CocoaPods](https://cococapods)) that are configurable and optimizable. Learn more [here](doc:dependencies). + - [**Workspace.swift:**](doc:workspace) This manifest represents an Xcode workspace. It's used to group other projects and can also add additional files and schemes. + - [**Project.swift:**](doc:project) This manifest represents an Xcode project. It's used to define the targets that are part of the project, and their dependencies. When interacting with the above project, commads expect to find either a `Workspace.swift` or a `Project.swift` file in the working directory or the directory indicated via the `--path` flag. The manifest should be in a directory or subdirectory of a directory containing a `Tuist` directory, which represents the root of the project. diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/sharing-code-across-manifests.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/sharing-code-across-manifests.md new file mode 100644 index 00000000000..cd6e53d03f4 --- /dev/null +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/sharing-code-across-manifests.md @@ -0,0 +1,83 @@ + +# Sharing code across manifests + +Project description helpers are a group of Swift files that can be accessed from any project manifest. They are useful to extract common patterns, define project conventions, or simplify the definition of projects. + +## Overview + +One of the inconveniences of Xcode when we use it with large projects is that it doesn't allow reusing elements of the projects other than the build settings through `.xcconfig` files. Being able to reuse project definitions is useful for the following reasons: + +- It eases the **maintenance** because changes can be applied in one place and all the projects get the changes automatically. +- It makes it possible to define **conventions** that new projects can conform to. +- Projects are more **consistent** and therefore the likelihood of broken builds due inconsistencies is significantly less. +- Adding a new projects becomes an easy task because we can reuse the existing logic. + +Reusing code across manifest files is possible in Tuist thanks to the concept of **project description helpers**. + +### Definition + +Project description helpers are Swift files that get compiled into a module, `ProjectDescriptionHelpers`, that manifest files can import. The module is compiled by gathering all the files in the `Tuist/ProjectDescriptionHelpers` directory. + +You can import them into your manifest file by adding an import statement at the top of the file: + +```swift +// Project.swift +import ProjectDescription +import ProjectDescriptionHelpers +``` + +`ProjectDescriptionHelpers` are available in: +- [Project.swift](project) +- [Package.swift](dependencies) (only behind the `#TUIST` compiler flag) +- [Workspace.swift](workspace) + +### Example + +The snippets below contain an example of how we extend the `Project` model to add static constructors and how we use them from a `Project.swift` file: + +**Project+Templates.swift** + +```swift +import ProjectDescription + +extension Project { + public static func featureFramework(name: String, dependencies: [TargetDependency] = []) -> Project { + return Project( + name: name, + targets: [ + .target( + name: name, + destinations: .iOS, + product: .framework, + bundleId: "io.tuist.\(name)", + infoPlist: "\(name).plist", + sources: ["Sources/\(name)/**"], + resources: ["Resources/\(name)/**",], + dependencies: dependencies + ), + .target( + name: "\(name)Tests", + destinations: .iOS, + product: .unitTests, + bundleId: "io.tuist.\(name)Tests", + infoPlist: "\(name)Tests.plist", + sources: ["Sources/\(name)Tests/**"], + resources: ["Resources/\(name)Tests/**",], + dependencies: [.target(name: name)] + ) + ] + ) + } +} +``` + +**Project.swift** + +```swift {2} +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.featureFramework(name: "MyFeature") +``` + +> Tip: Note how through the function we are defining conventions about the name of the targets, the bundle identifier, and the folders structure. diff --git a/docs/Sources/tuist/tuist.docc/Tuist.md b/docs/Sources/tuist/tuist.docc/Tuist.md index 742cfd46c7c..4f9073ef161 100644 --- a/docs/Sources/tuist/tuist.docc/Tuist.md +++ b/docs/Sources/tuist/tuist.docc/Tuist.md @@ -75,6 +75,7 @@ The choice is yours. By adding .xcodeproj and .xcworkspace files to your .gitign - - - +- - - - From 4cb3239c16c32573ff9766df79b2f18130a5067b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 6 Feb 2024 17:27:20 +0100 Subject: [PATCH 048/509] Migrate docs for extensions (#5884) * Migrate docs for extensions * Update docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/using-plugins.md Co-authored-by: Daniele Formichelli * Address feedback * Fix download url * Address feedback --------- Co-authored-by: Daniele Formichelli --- .../Tuist/Extensions/creating-plugins.md | 185 ++++++++++++++++++ .../Extensions/generation-environment.md | 48 +++++ .../Articles/Tuist/Extensions/task.md | 109 +++++++++++ .../Tuist/Extensions/using-plugins.md | 98 ++++++++++ .../Articles/Tuist/Users/extensions.md | 11 -- .../Articles/Tuist/Users/synthesized-files.md | 2 - docs/Sources/tuist/tuist.docc/Tuist.md | 7 + 7 files changed, 447 insertions(+), 13 deletions(-) create mode 100644 docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/creating-plugins.md create mode 100644 docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/generation-environment.md create mode 100644 docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/task.md create mode 100644 docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/using-plugins.md delete mode 100644 docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/extensions.md diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/creating-plugins.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/creating-plugins.md new file mode 100644 index 00000000000..0a88d1616ed --- /dev/null +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/creating-plugins.md @@ -0,0 +1,185 @@ +# Creating plugins + +Learn how to create plugins for Tuist. + +A plugin to Tuist is a directory with a `Plugin.swift` manifest. This manifest is used to define specific attributes of a plugin. + +### Plugin.swift manifest + +```swift +import ProjectDescription + +let plugin = Plugin(name: "MyPlugin") +``` + +### Project description helpers + +Project description helpers can be used to extend Tuist's functionality: Tuist automatically compiles the sources and allows it to be imported during project generation. + +In order for Tuist to find the source files for these helpers they must be placed in the same directory as the `Plugin.swift` manifest and in a +directory called `ProjectDescriptionHelpers` + +``` +. +├── ... +├── Plugin.swift +├── ProjectDescriptionHelpers +└── ... +``` + +The `.swift` files in the `ProjectDescriptionHelpers` directory are collected and compiled and can then be imported using the name +of the plugin: + +```swift +import ProjectDescription +import MyPlugin + +... +``` + +### Templates + +Template plugins can be used to share & reuse custom templates. Tuist will collect all templates from defined plugins and allow them to be used with commands like `tuist scaffold`. + +In order for Tuist to locate the templates for a plugin, they must be placed in the same directory as the `Plugin.swift` manifest and in a directory named `Templates`. + +``` +. +├── ... +├── Plugin.swift +├── Templates +└── ... +``` + +### Tasks + +Tasks represent arbitrary tasks which can be run via tuist. For more context, continue [here](guides/task.md) where you will also find documentation for the `ProjectAutomation` framework. + +To create a task plugin, start by adding a `Package.swift` and adding your CLI executable with `tuist` prefix, such as: +```swift +let package = Package( + name: "MyPlugin", + products: [ + .executable(name: "tuist-my-cli", targets: ["tuist-my-cli"]), + ], + targets: [ + .target( + name: "tuist-my-cli", + ), + ] +) +``` + +For easier development and help with publishing your plugin, use `tuist plugin` - you can read more about it [here](commands/plugin.md). + +To publish a plugin with tasks, you will need to run `tuist plugin archive` and then create a Github release with the created `.zip` as an artifact. + +### ResourceSynthesizers + +ResourceSynthesizer plugins are for sharing & reusing templates for [synthesizing resources](synthesized-files). If you want to use one of the predefined resource synthesizers, the template must also adhere to a specific naming. + +For example if you initialize `ResourceSynthesizer` with `.strings(plugin: "MyPlugin")` then the template must be called `Strings.stencil`. + +There are more types, so the naming is: + +- `strings` => `Strings.stencil` +- `assets` => `Assets.stencil` +- `plists` => `Plists.stencil` +- `fonts` => `Fonts.stencil` +- `coreData` => `CoreData.stencil` +- `interfaceBuilder` => `InterfaceBuilder.stencil` +- `json` => `JSON.stencil` +- `yaml` => `YAML.stencil` + +You can also create a `ResourceSynthesizer` with `.custom`. In this case the template should be of the same name as `resourceName`. + +In order for Tuist to locate the templates for a plugin, they must be placed in the same directory as the `Plugin.swift` manifest and in a directory named `ResourceSynthesizers`. + +``` +. +├── ... +├── Plugin.swift +├── ResourceSynthesizers +├───── Strings.stencil +├───── Plists.stencil +├───── CustomTemplate.stencil +└── ... +``` + +If you'd like to provide a type-safe way for users of your plugin to use your custom resource synthesizers you can use an extension like: + +```swift +extension ResourceSynthesizer { + public static func myPluginStrings() -> Self { + .strings(plugin: "MyPlugin") + } +} + +extension Array where Element == ResourceSynthesizer { + public static var `default`: Self { + [ + .myPluginStrings(), + .myPluginPlists(), + ... + ] + } +} +``` + +### Example + +Let's walk through creating a custom plugin for Tuist! Our plugin will be named `MyTuistPlugin` and we want to add a new method to `Project` that will +allow other developers to easily create a project for an iOS app. + +#### Create the directory + +We must first create a directory for our plugin, it may look something like: + +``` +MyTuistPlugin/ +├── Plugin.swift +├── ProjectDescriptionHelpers +``` + +#### Create the Plugin manifest + +Next we create the `Plugin.swift` manifest and give our plugin a name: + +```swift +// Plugin.swift +import ProjectDescription + +let plugin = Plugin(name: "MyTuistPlugin") +``` + +#### Add project description helpers + +In order for our plugin to be useful we decide we want to add custom project description helpers so that other developers can easily make an iOS app project. +For example we can create a file named `Project+App.swift` and place it in a `ProjectDescriptionHelpers` directory next to the `Plugin.swift` + +```swift +// Project+App.swift (in ProjectDescriptionHelpers/) +import ProjectDescription + +public extension Project { + static func app(name: String) -> Project { + return Project(...) + } +} +``` + +Notice how you label extensions, methods, classes and structs as `public` if you'd like them to be usable by others when they import your plugin. + +#### Use the plugin + +We can follow the [using plugins](plugins/using-plugins.md) to learn more about how to use plugins. For this example we may want to include the plugin and use it like so: + +```swift +// Project.swift +import ProjectDescription +import MyTuistPlugin + +let project = Project.app(name: "MyApp") +``` + +Notice how we import our plugin using the name defined in the `Plugin.swift` manifest and this now allows us to use the `app` method defined in the `ProjectDescriptionHelpers` of the plugin! diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/generation-environment.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/generation-environment.md new file mode 100644 index 00000000000..b068e96a4d7 --- /dev/null +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/generation-environment.md @@ -0,0 +1,48 @@ +# Generation-time configuration + +Learn how to leverage environment variables that can be read from the manifest files. + +There are certain scenarios where you might need to dynamically change the generated project's definition when invoking Tuist at generation time. For example, if you are building a white-label app, you might want to use the same project structure, but adjust some attributes in a per-app basis. For example, the name of the app. + +### Using Tuist environment variables + +To facilitate that, Tuist allows passing configuration through environment variables that can be accessed from the manifest files. For example: + +```bash +TUIST_APP_NAME=MyApp tuist generate +``` + +If you want to pass multiple environment variables just separate them with a space. For example: + +```bash +TUIST_APP_NAME=MyApp TUIST_APP_LOCALE=pl tuist generate +``` + +Variables can be accessed using the `Environment` type. Any variables following the convention `TUIST_XXX` defined in the environment or passed to Tuist when running commands will be accessible using the `Environment` type. +The following example shows how we access the `TUIST_APP_NAME` variable: + +```swift +func appName() -> String { + if case let .string(environmentAppName) = Environment.appName { + return environmentAppName + } else { + return "MyApp" + } +} +``` + +Accessing variables returns an instance of type `Environment.Value?` which can take any of the following values: + +| Case | Description | +| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `.string` | Used when the variable represents a string. | + +You can also retrieve the string or boolean Environment variable using either of the helper methods defined below, these methods require a default value to be passed to ensure the user gets consistent results each time. This avoids the need to define the function appName() defined above. + +```swift +Environment.appName.getString(default: "TuistApp") +``` + +```swift +Environment.isCI.getBoolean(default: false) +``` diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/task.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/task.md new file mode 100644 index 00000000000..8820a2dc019 --- /dev/null +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/task.md @@ -0,0 +1,109 @@ +# Custom Tuist commands + +Learn how to to automate arbitrary tasks with tuist in Swift. + +When we write apps, it is often necessary to write some supporting code for e.g. releasing, downloading localizations, etc. +These are often written in Shell or Ruby which only a handful of developers on your team might be familiar with. +This means that these files are edited by an exclusive group and they are sort of "magical" for others. +We try to fix that by introducing a concept of "Tasks" where you can define custom commands - in Swift! + +Not only that, we will provide you with an easy integration with tuist, so you can for example inspect your project's graph. + +### Defining a task + +You can prepend any executable with `tuist-` and add it to your `PATH`. If you for example add `tuist-my-command` to your `PATH`, you will be able to run `tuist my-command` and `tuist-my-command` will automatically be executed. + +You can also create a task as a tuist plugin - learn how to do that [here](creating-plugins#Tasks). + +## ProjectAutomation + +`ProjectAutomation` is a framework for interacting with tuist which can be integrated as Swift package. + +Your `Package.swift` for your CLI then may look as the following: +```swift +let package = Package( + name: "my-cli", + products: [ + .executable(name: "my-cli", targets: ["my-cli"]), + ], + targets: [ + .binaryTarget( + name: "ProjectAutomation", + url: "https://github.com/tuist/tuist/releases/download/x.y.z/ProjectAutomation.xcframework.zip", // replace x.y.z with your desired version + checksum: "5e5360217d0c362d89d8532a9a52b87ee1fbe3546d422d13b82c0ccf71cfbd5e" // You can get the checksum from https://github.com/tuist/tuist/releases/download/x.y.z/SHASUMS256.txt + ), + .target( + name: "my-cli", + dependencies: [ + .target(name: "ProjectAutomation") // Integrate ProjectAutomation framework + ] + ), + ] +) +``` + +### Graph + +To get your project's graph, you can leverage `Tuist`'s `graph` method. Here is an example how you might use this method: + +```swift +import ProjectAutomation + +let graph = try Tuist.graph() + +let targets = graph.projects.values.flatMap(\.targets) +print("These are the current project's targets: \(targets))" +``` + +You might wonder what the return value of `Tuist.graph()` is - the method returns a Swift model `Graph`. Below you will find the exact specification. + +#### Graph + +| Property | Description | Type | +| ---------- | ------------------------------------------------------------- | ------- | +| `name`| Name of the graph | `String` | +| `path` | Absolute path of the graph | `String` | +| `projects` | Projects which are a part of the graph | `[String: Project]` | + +#### Project + +| Property | Description | Type | +| ---------- | ------------------------------------------------------------- | ------- | +| `name`| Name of the project | `String` | +| `path` | Absolute path of the project | `String` | +| `isExternal` | Indicates whether the project is imported through `Package.swift` | `Bool` | +| `packages` | Swift packages that this project depends on | `[Package]` | +| `targets` | Targets of this projects | `[Target]` | +| `schemes` | Defined schemes for this project | `[Scheme]` | + +#### Target + +| Property | Description | Type | +| ---------- | ------------------------------------------------------------- | ------- | +| `name`| Name of the target | `String` | +| `product` | Product type the target produces | `String` | +| `sources` | List of file paths that are the target's sources. | `[String]` | +| `resources` | List of file paths that are the target's resources. | `[String]` | +| `dependencies` | The target’s dependencies. | `[TargetDependency]` | + +#### Package + +| Property | Description | Type | +| ---------- | ------------------------------------------------------------- | ------- | +| `kind`| The type of the package | `PackageKind` | +| `path` | The path of the package. For a local package, the path is an absolute path to the package directory. For a remote package, it it value of the URL of the package. | `String` | + +#### PackageKind + +| Case | Description | +| ---------- | ------------------------------------------------------------- | +| `remote` | Represents a remote package +| `local` | Represents a local package | + + +#### Scheme + +| Property | Description | Type | +| ---------- | ------------------------------------------------------------- | ------- | +| `name` | Name of the scheme | `String` | +| `testActionTargets` | Targets which can be tested via this scheme | `[String]?` diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/using-plugins.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/using-plugins.md new file mode 100644 index 00000000000..23dc3acb436 --- /dev/null +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Extensions/using-plugins.md @@ -0,0 +1,98 @@ +# Using plugins + +Learn how to extend Tuist with plugins. + +Plugins are meant to be separate and isolated directories, each containing code used to extend existing Tuist functionality. +You may use plugins that exist at a path local to your machine or at a git source URL to enable sharing and version control across multiple projects. They are fetched by running `tuist install`. If you add plugin to your project you can not generate it without fetching. + +### Adding plugins + +In order to tell Tuist you'd like to use plugins in your project, you can start by defining the plugins in the [`Config.swift`](config) manifest. + +```swift +import ProjectDescription + +let config = Config( + plugins: [ + .local(path: "/Plugins/MyPlugin"), + .git(url: "https://url/to/plugin.git", tag: "1.0.0"), + .git(url: "https://url/to/plugin.git", sha: "e34c5ba") + ] +) +``` + +By defining plugins in the [`Config.swift`](config) manifest Tuist is able to collect, cache and use your plugins to add or extend functionality. + +#### Local plugin + +Local plugins are stored relative to the machine generating the project. You can tell Tuist to find them at a given `Path`. + +```swift +PluginLocation.local(path: "/Plugins/MyPlugin") +PluginLocation.local(path: .relativeToCurrentFile("MyOtherPlugin/")) +PluginLocation.local(path: .relativeToManifest("../DevelopmentPlugin")) +``` + +> Local plugins will not work for [tasks](task). If you want to run them locally, either add the built executable to your `$PATH` or run via the `tuist plugin`. + +#### Remote plugin + +Remote plugins are stored on a remote server and can be downloaded by Tuist and shared across multiple projects. + +##### Git + +A common place to store plugins is in a git repository which is uploaded to a remote server. You can specify where to download the plugin as well as what version of the plugin to take. +This allows you to version your plugins and share them with others. + +> The git repository for sharing plugins currently needs to be a public repository. + +Optionally, you can also specify a directory where the plugin is located, in case it's not at the root of the repository. + +You can choose to collect a plugin at a specific git tag: + +```swift +PluginLocation.git(url: "https://url/to/plugin.git", tag: "1.0.0"), +``` + +You may also collect a plugin at a specific git sha: + +```swift +PluginLocation.git(url: "https://url/to/plugin.git", sha: "e34c5ba") +``` + +The [`Plugin.swift`](creating-plugins) manifest in a git repository should be located at the root of the repository. + +### Example + +Let's say we have a plugin called `MyTuistPlugin`. This plugin is designed to add functionality to `ProjectDescription`, in this example the plugin will add a new method to `Project` which allow us to define an application. +This plugin is stored in git on some remote server, and we'd like to use version `1.0.0` of the plugin. + +We must first configure Tuist to use our plugin, we can do that by adding the plugin to the [`Config.swift`](config) manifest. + +```swift +import ProjectDescription + +let config = Config( + plugins: [ + .git(url: "https://url/to/MyTuistPlugin", tag: "1.0.0") + ] +) +``` + +After plugins have been declared in `Config.swift`, you need to install them by running `tuist install`. + +#### Tasks + +To use a task plugin, import the plugin in `Config.swift` and it will be automatically available by running `tuist my-plugin-task`. +You can read more about tasks [here](task). + +#### Project description helpers + +You can import a project description helper plugin with the name defined in the [`Plugin.swift`](creating-plugins) manifest, which can then be used in a project manifest: + +```swift +import ProjectDescription +import MyTuistPlugin + +let project = Project.app(name: "MyCoolApp", platform: .iOS) +``` diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/extensions.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/extensions.md deleted file mode 100644 index 3bced922a7e..00000000000 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/extensions.md +++ /dev/null @@ -1,11 +0,0 @@ -# Extensions - -Learn about how you can extend Tuist's functionality. - -## Overview - - - -### Section header - - diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/synthesized-files.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/synthesized-files.md index f0e73219ace..ea6623506f1 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/synthesized-files.md +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/synthesized-files.md @@ -93,5 +93,3 @@ let project = Project(resourceSynthesizers: [.string(), .fonts()]) ``` > Note: You can check out [this fixture](https://github.com/tuist/tuist/tree/main/fixtures/ios_app_with_templates) to see an example of how to use custom templates to synthesize accessors to resources. - -V&wjo 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

E{1I6IJ09Vp&bSaD!$D`Q;b`4X+D?o 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

lAGfxztF90y=>yV$txFAc4ME^a7-yC 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

J8N8H%y4 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

5f;R&m1fQzMzp~?x<09)Ufk>wBwa@nZ8SCA9g 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%0Ankx9_` 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

UyP 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 z zGpMQSy{=@hL&FE99KU}LtDxA-H}CxO&_~aE-V7o96VFK9bv)W`*}E5-gtJtz{wD`}1G_3Z|42S!8@9(hvcYhce|E zZ(P88oAbt35$04-O$989hYZ-d)sc>MApD>RJxIb1nlOYVMBxcXxWW{&@HkCDV1y(n zJ^DltdqJ^K4Hu|GrVL7k#6#Z>|A$D#A{y~`oLZdXZg<2cI`N4>e4-SmNX04&B~cBu zq87Kv#rp8-hFuJ!7@;Uc#JzK@{73G8km_rffE`<%DWE%kao@WxJG$E@>&uUdFO!#>C}E zhUrUW0+X1(6b>|p)#-i4)v}Z5{*`I8Gx<)~MMs7Udq7U#xXfri zvzjfsWJ=tev;72o*BDGqUq zgS_M-|2H|wHIDI-a~v{eLeKHG_qg5J2iksaFN%*nZWRA{+6FkZk{7XL6HA*Q;vUE% zoQ&_UeGqjMEeLJk;~h;0ubovefCa2T5G!24>tHtk*9TGs3uHa(RHy(I20{f2tla=p z5Xb}!FaaveUG8?z`vj&y0lM3LAa&n+-vbYLyYt=ecSro;36FQdBfjvCXT0JE|M$i( zzVefQyyYpM_`qMj^M>a<hVWBg5ZZvZ%eV-x^+ zk~_1~I7)$httAZUwpuK7SRZZ;@e{WpZ^1%JY@eC{R;OxJ|q!bV8LBdzmWB4~zg zI7dlf6#TS=1c7YWM}0w8gEWX_uqA`+)`8S_Xg1hh7RX*dcxc7ufN!`T6eK)m|D+)Z z7i^0-iB^;V{$Mb%!B#<0Zs;a&KuBc8W&rP}2xBN)CT0&TW@3nlWE_}YHK&+?)QFG^sh2h>irqk#2_%Qg zV`UZT5MA&PSUC_W33noC09-i{YXF#%IT7o4EB>U5bvTU8CyzNPgY8#h3%Qi-28sTmqi2&uPK+CyYSD0R_^?vZCWJ!sLIY?xR$X?JWZr&-13t5Fl z$B*zvbbX1LOc_BVBW7gc5#k6D>8St^(U=esnF0Z#^eLH@DIk*OC=iAeMi*`9mXm;% zVkuU1vLpaEIXqmr2f zZWCHhK?w`dpf;Lb4!EV$Scgl=lOzUh@~DFbzzGzHlbm^-2+4_1%21IwDQD4?Z91pl zQeRBujymy)41r?phiD5iqYSEUib$I7cXac}pla!vHdu(O|EZP+U<-8Gg4$9(>=QUT zahQ>ssYh{%kmh4VVG6=yW2#`~Fsy}J0IA;)^iK>1&5dHa?p}M6e#-pzqkU)s6 zP})us8m!<-9|)L@`dTan$ z3Ie-4ZegS&JF=F@h!Eik)yjd3x|xNx44go3*hz2f|GE(ViLIMSZpkQZsG6+=F^FAy zj0`)m0qd>mV^f%VvP_!Av@gAee}WDJV2 zHprta%Cwfoj!^3m0IRkEn*eQFA8UcHxC*P$7N%6oT3tb}`+95%Y5+6J4ef`W5NLk! zXMxXZgPzHdk*YnHaz035vTzHoPb(>~xf9TObgF6qr4S6$XPxfQZpPYP2;sG-`EKdP znGcJ%@;3}77OmmgJKuN|7g9V+Te-U1Mq`F&5%II}I)Q_Tny*T+TI+tFsTCE=nRXk0 zGrFn_JCF3r5bZ#pIHNFE5i}fAG|*HLzZyMq|4S(0ySqfhspx`L%C$BVVPZtMnWXET z|HrQETWHe|f1(*}UR%Gekg(7Bq6CVlOZk&nd$pNLn+5Yiu9LgrLXu5UoB~07O6nF4 zOuk?0>ECdq~#5*AYNuUJ-Aq4}W!~!wF1Q7+UU;t6T5CE_R z6U@Xb0mTDR3kG1p41oYj;KUT1A4pKJ|I#U~VGe-+jip+xqZw_b0K>+5xl`+~_;{_w z`@d(KxS;5KA6&*yp`UN76HFiwj9|ov|11zhU;sfN5QVS=KCBaQR|;DY0PU~^h|9nO z0kCE&5cNO?N&v>BFbb_8x2?blV~~*oQ3^^5sR9uNq`=7pu?Yjg$`8>Bn}E22d>?jf ze8pF<0gS7nDw-FIt=RaN4xwI(5De@Ey75=Ns|vW(+=r~Gv%PE|%EZGK!3YdN#0Ibg z0QV;-IKnet5&jT?9qaYN*HxRAB#o5ebNM*pC z1QFi(nV-na1knnC{HXHx!SpH!^{cwr84ScL5W(=A$$*{o+NFt5(Ym`wQ!0~Dfe;Fe z6a%mjOE3f;Nd&k|5L&ztO_CAvltx|2kmoD|;76bUfF zPAw1t5C!F!014oc)7{j#|2)B?+|->d-sx-ramdR9p#(}Qw@P5$NsyA&UD`=O+G{qE zGg-sb+S)AK#;=_bp&AUGAP`(#+tbIBzktvKu?e4vs<;iuV|{F)`mN&^r!q-T;zg`Y zVZ`?V1nn%}?-bulG^x`IiX$%I)DXg-U8wQL+XG>~Wm<>4{mH*A43l7;)tb?Ti`$vH zEtgdn!0h3bTd)^ClMV~K>PpS+#|d!F)$(hr{2jk0hTj7L*B9MxKg;CJJE!G^v}&}N z`Qhb2UM?=4YZkr~-LTv3`rE}B=*|BO%Pmd3#>U1!aWexOW;V(+t8ZP347-S zJhxHEyO1K`MIi-8|7{VptP}K&6fd0<#p%>a{ODmmWwiShmm?=( z*IwY7&fC}t=slXb{T1&o6NyH{5txbqU``NA(8v%W1Q|&LOArJesRRPR2u&~%UcAc& zu-OAq3W?4TRsO{07u8_==u92Hv}}H_{KduTk&n#~oy`j4tHq*h00Q6} zzz@H>PTOMy|JJX>BJNXLt$|?Caz3&At$)0&2r5Ad(0tbpJVubr@Id$L2L zfHqUmbmI}fs@)TD&IF<10s+_yK?H@(5V}kT3}4+0KM)8o1<&3JQ|-?%4fZd6*-~A- ziEZ5jF$$k7)9qk>Z2jT_F$(XQ1h#+xo4^H9y!Ic@1+37|WjwC3q*1;m!GN{YDb@DOWH5J_;#a-00N%)ng0#0l_!O#Gfwzy-xQ_nT1m z^-21n#s5Oi*!@ z0t1@_Mr@Z*xR)@k)@6Z&B@`xTVlcUZuD&%8SJ|(7bYpT06pWIAe+}Ka zwJRttU4g2x34;00E2)AXGizbZG+u z{}Kv_$TbO99%C%6Hi3(#3ZV+us!%DdOD(s=5Ul+gtjfMc zSk#Iehuj)-$Oi92(12;Sgfq?u&&n`EIpmOvN)%8}KP7ZN&eA#yGqp}di_Ww}H9*QwUxhVRSyLnw zEmQ{;C{L?6xzT_E^FnMHTe$KkQF06@xmEmfTXtX#(P#lXSGj9ZaT_pnTFEN zyKt}Cqp#dN*}keY1*$YWa>=puXXdVKE>G=*6wFV*1C0iDT^(tZE8T=Ro;>o5u`<hvC&RwSQbl->nT_S2|SDnJ$8#0t}C_OVbW9z+QR$3wyY70`VoN#G6RXPf|%CJCgO-v&uD9wC+{0YxNY|BTo` zAj;2#B~0QFkEp~XmN1A3uwn?EC`BYr(TYQcd&gc#seg;GHxULXT;Jn}(IaSh>1p_um>3>BtS*m9L|q>zM38XyWR ziGmWOph-$faz&ZUBqcK$0VRZTlby8WL{`*ER&GR-1}Nnwqae#tzGRXciGoNbSxf6Q zq?Erjz$Ulz%HRakIKFgc6g)}GW!CbR)1%}kBT`9FR`Qmz{}jk9W64Wxb~Br@1ZOP4 zc}q!Nvz6AQBstSr&P-ZTlggArJ2M%Sc!txP8rh~Y@p;c+=94-8+$S~z`pZhX6Q3FZ zT08qW%XkJS0hOZ`o`z;3L5A;iZ?O>{`zE?V8d59ETi$23l7x>)fTRPtr2?8Gg#=9U zBT7($Nm+W!Uy^dB2`HrkGHFubSW>4-XlW9DDw0bIQy`=)>LuryfKiZQL_(b@KHT(_j8FnzaNh|0uuO*y=P^o_d`gK_83Qz1sD! zc`dA7gOk_1&J&jEiB=pXlP#@EbP^KN$-2~?f`uh4S<6h&26K}%wJA^gOHy(!RSGV3 zsVIM1R0%6HywfF5Lwy+!T z2$d#;3C($BFjq7RQP4ynW_C(;wV>VvXo4p39D_qfAqH4h2dqXpYeHt35O%a;3{kL2 zMoz+xF+{gItY`&I0Jn*t?$iLI`14U*5&`v&A_}5h?t|0mW1W6P3e}?k=Y-(1hyBLXRHLRJmbTk4voO4VdgX9_eL z_u3(vB`_|lQrcZZ+uC;?4@8GsEpcJ%PX{_u=bk)nxrtOFqyXHCkcw(|GNBPgaLo{! zkj-R2I3a2lg+TH>l1J-X3;C9UnS&w<|7gk?x)I-l( z5YML-Y8){*MHFI)!YX?DXf6DdlrZje5+XoNUcThJ&y<2pT`toQW4f9I9dMCJS)EVU zwa(SvIf~E9TA8}_mdbV}(vO+bOOEH5WZmk4qdxQnZ^XZ#GeoFS zb^}yLrYz-mM6Wg5g(|lBlNIP0V7Myn7n5QiQ zLj*GK$!b?1SrCP+f8Csqhyv}RI7t*N%@bs=9B8c|#TMooky-#-nWR8~6tuvKB*ZzD z9U+CtnKRyzl=3JENN-gHp6g$>|MR*n1%8BY9pLtQn7P0&`&Y|e_M0}JxzVIGSDD`U z-X9<4&qr|Y8Qb*bKf58ccY2;TEav7jHl>n1_O7pr${^QT$kiUO_I0h#wyzy=#l_Lx zL&UM%3gl&V=Nd!NBNwT^tq={|qljY~y6~C^*l2`>a;q#Dhkm2KB+vv=xIjtju8j}_ zP0%mw!ocNovG_WPbRv(U8iiWW1X&{mb{G%Ib3K8GL6u88z`=?!ScRYyJF&aIuCqR6 zn>v`Yu4j_J-g7J7TQ}arx}AEyuM4}nIyxWh!RZS+2YbHcTdGzgzq4{F&1yEIYb&Cg zESVBIUgIPhJGr^KwXG5`|Db9J*oqpw5Vv3u5CC)=L~11CvYe|Bm?WUT={h{(TLStU zM3|BZ0o#Zy(1Pg7B?CAK1vrU6leJ7BzLyBZRWc4z5-OI8rBu?VEhs?)h_e-O2{E9- zO>hcSbh)GWs*nhZETFU)^d-r1Iz2nXc`4dOUNN1gtfGvQuQ3hPJ$@d$~u+$rDp? z9_&%FhH#bjQ85KvAFkpbhu|N(X^8702{#N6pt>~i2uuOHF5|eg$P}I8TrX(;;fiO*d`Xtn>E4}6Dsig8$&Ox~zbE}iLQA_jahDBHg#h}l(;Dm0NOXPV^{ll5B&>08; zfb@JcZ5Rbj7zas+glJGr1x*Okq{N1Z1V}J|;EV>-G))E-h)kf+2F=g}RZR(fP=`>^ zOu$eJtxyBV1_Kz;6U~MT4N(IcX88yuo ztx*|u&>OW-70po=Ez;n$P#?X~3BAx6)ldcXP}PJ{6@5?zEm0p;%@*}i(}V;K%~38@ z&=ze{|0!+K1rJPR9}q*QLR-- zja6mEh8%?kV)a#NMbS#l1V{i?LrvCD4OIo5)<@;mQN`71<N`wYdH2_`}h;xC=tP*z!mmu-FVKfgCyURs$G^Ob`W>)dma<2T>pgUmaF~;8j{R)@p55 zE**ymtq9R#45?Xn4@4#noC}TVAEa3LRE&E!!aVR#_E@epS(awNwKu1=R@kSG?s_RjpLJz1wP~RJ6TUT#Z$Ms8(ey)LQM;$HmuQxQ+kD+y|H4h! zOQqFDO;K%V)NO4D1I@Ql*oNgb08J=b0}uyRP+CjP+^TIRDmd4$&Cbh(1dy|;Dm?e6h8!f3;=@kWS$cRx82U^&SRUlXcun7a$VS!-OXfQKq zNYqA6O>ywi?%KE9t<*vl2pi-PRu~87l|5~s(0vmK1HDv4Mbw1IHw?Yk|H_45fskJV zPzMrqT^}~$Y&8IFSO@hA;}jJLwuM?s9ffiDRPqW1OLg4}Hh|pCH{)f6QIOO!)?*)5 zUUAR_2|ZapW>7LS-+j%5GB$v9C_VZu&`2oSNtWbs$&o?N?qR+-IZvhCl&omFVSRkK}7hnN@k#J@T*m|-?u87{!} z%oULW>x>~3FL)Jvm0nG-xLR<*dRT>Q7zO{OXotvzc7Ot)hSE&12QxEgNKmg;7zadX zP*LbJfnbG}ZUuJuWRYuQ7tDll{^NQW1)3lS!d~8b7~e@Q+Z5&9kFM*6c&XrZ5eqMTz)X|<$Gdr^hjM;r{h1BfV|KMDOO<;w+ty~%9k%~@D z+ja<65NwGMg+wS~pO(FsjaX|H*iiM5Pa8qwTi|)`Zm5T`j(1!rlaxF5U(WCftu!Ur5+uNSIv;Hs0XWR#VLc zi#zayVB&h{E=_<2o2c0HOV#l#eGF@X zFzZjLRwg#$bGA73vR{c9ZD^p0HYRKqpKvO+X6#Ogr4fjFc<@gaUv^!G5M_sIj^m-F z#8q%Xe4S)0Ag`2i* zOOnUWVz=rHnXl^CvU+Vz!p_hI5DL&p+|niWcBM7KLz#>j!pF5Jg`W$KMn+ z*a+2xpjB8=PHaU_h<0d)d**AxRosRMQOGq@|6cCZ^7ZRWo!Vvv(-Sq{aTR4!SoIRe zRTSvqTixJ3236P}>dA%a|FhhRwSez^r{RfClkPJYIge{VRXqX^nf<`c#frt_%MskQL;l+aj zGet9y$v`AbA)z6RND@=Df(Icf92gN&HkcGqdQ@mIWXg&H4L}nJsi#bY9X}cn*%Mkp zXhu;MyqM7AK$VeLN_4vNqr-{+CUTAV@19qQTf34qu=U>9vIeM03>L_Mu(uK28lbE8 z?nHM60=ZR&_b=eUf(H{WZ1^zZ|HO*#rd9h(>tnE7y)3R=m=!xx?ON4qMXz41dh86a zB5h!F*U_j=vm#eIBIehx*_B@XceQNOuuqew&0FH@-x5)e&RzU;ZoIQ2s-B2hu0q$`{A!6{6 z7}#T4DYl}6|G@ZRgD4)>B8?K^XqbrxBq14wg4xKRf?W-nV^`Gh#g{8cI{74&PL4&N z0YF+tS(FU+Xuu|-7@)~}|GtO?)-RHMwbego`XgUjVs7w&Q!RRy%Db;)vp{0poZ%(Jl7a;@&^@$Y>Ucjj8L8rJdSot6A#a)95Xo zM&ygEw%kL;z4Pw-6^ZW2sqVUi$_FS~wz$&HSB3U!fIqTs(dj>}%9-jvpQ;)#tzGp9 zuUV~9%&A1}c5GH!|Af|y=$gOS<4P@(wbCT7BzAfWjQ_O4DU~t`{Vtr25-jMtuGrh| znkb{ZF^Tt1d{)e97HX<{q`Zc6M8{TW0FKxqi64aiDbiIb3;Gw4v|aHR2!C~LJ2%~x zQCM_?*dAH8VnDv8O+?~kQjbKxwn9p&yly!0rE4-uFUAsODrd&zW(;VM7e-32ob!jNbpkhm;Xjh1fdateNn*P;>0#CHX7(SCap+B}vk#esY23lp* zXf{rz0Y7JJDw;t0Lkbxp<6f|>4o5_|wvO@bVA~UM(^WA286b$2OOhS__wBo1Yv@nv zJ?i^}i2`^;|6cwwj;3VUQW`1TQyP5*2W@7lh3s->7BXysRox@ZCdiP$QbeQ{Q_z>f zv@j7aM1c$SxW^baVE|Itf_lgD-GyiuI#oqPgeNq>77{o-15|H>6Y*D9s#id-;BFLL zah?rJ7XT5)ErD3ZL?|ecw+KQabu<7R+oB-8z=eJF`y<_4m!p;eGDTqwMTu&` zKlc!&MHH-|=SpDKDXgIow*rPNv+`?!5`)9nk&1a1+eT8hA`9@S7g`4 zS5^i{xFb?9@F|gLsIM@0^ovB|;+8tLBO;5~3)>>1mq{p8F4HhjAu~EGK}Lv>*@B-& zyYiTE430CTsmCg^@hdBxuzHqcRXx>`CbZaNbW>o1J%82;NILL!*og=kepU*ezG^H# z6P7*Vxdrze?k=qYi;47=)UJ>*B1Ig7UL@kR>LG5J6H(Pxn)oYXN(6DZlt@Fz@W~Py z|DY6J%~U5v$2ESAp`juyqE&+!$C$2&sE#U&u)d}_udFJtf+0)I>wBVj!xI+t%hE}Fri*&4wPA{lNIeo!urx|*2RU(U)|FDho(oL#j~9|-EhknJve93NK}F=>gELwyg$|L{cU@co;37^%>61h(`q;u;o$-J4S_b5DI=H>F>~n`vk7rMhG6z^AGA6dthTpr3C9OzHnlI$mqujW%pf^s09ChK#+oBbWNhrFt z@xFRtYCRa&9mz_}!}^*&x1}^8Y*Waq(?1&(7TrZeR*4gAsc?6^6{)Iq>Y~%A z!6xHBAulp+x>uRnRWG3#%5hpTlY5%h@?DvCEB5kyPj`++ts}-2Qb#vo+NRnGOQaiI zskZs7v0%M@Oo60x-TlZ{}oOkuTq)%w|TN_ zu3a(Lk@8%RmPIuU*inQX^`YlkJyk4CR(oa9(8pt#T>Lmns#Km%6K4L!C&b8-2zgKtT5i7sNRi51cL!a!x7kES;*WJ zlth#Qq^ZUD5M5owjR8>I@k!M41tDHkpRe78uml#~c*WOU|DC?H0&1Lx0kX_r&5QRn zo)p%c0qUD%07~BR38idbodllL$jHfQO3}ax!a2^LD4eahnWm`VikQq_2~=bN3gsn^ zFI`CbUCp|*+L+Kw&&=QFQB1xGjRKONrraDEp3EWA4&%|s{CSK44vN0n-d|m!6)GW` z^b33>fD0NS&gmRsxC0;YQDG2WFmR1(HQz*l7~9Z=4ldf#2_Y@c+8GfcW~GHDXo5C? z38~D__<;_HoSoyW6Xl^vpvXteVV}Q5hTb3`@(*hl>wUc3UNDM&%y#iL!;M3@8AsRc$U9n|&6LqVE`)uKm!;zuIMI3UtG zd`sY@mZ-2<^Sp`btV#(Qim9}SiNHz4bzBm1#cvUoIp&U6>4=^1jP#t7RxP4HrG;cz ziUhHmoj^~@po*C6NV`Fs^Q=lc?hBb9jLy(dDQqCj$VUmG3w#s`&TwMBm5!VU)xP}I zjQv#+g>ENyMThT1WL}Na-)&Ra=z^8Mwm^jRmruPFd8@ob?o*X@y=msa4?>gYFqn9cnj; znYJL#3~9!Txsn`hDK}QB>~YG3w$cc(g7b`lE4Y~YHJGjZO!ai6q27ZA&_^wRk%4uJ zJGjzTh@aPNfNGURl$nl|W@mimo+l2{hj4@X(4bm$n?kjxwZ%nTEW?aon}TE-o;qKd zip`I8&rO1sPnGHW1Qv+CN#-( zxg2~oPgUg=8K{*OxB}wfRYQSArwF8Mc_v<%NS9TQE42b^UWx{k$ObqkkZeIa)X*b2 z(excFnZ;u(b!0?v!D}>Br?jXONkO`}M^4J-$tg@v`U)0NP%QwgS~$~yxgdPd-YXg9 zvKwo>JG8?p*uy6H!ze&Rt#VCA z9?ow)*L=K2i0%rKYJ&5W(u(@fk87j1MOmpM!7%wsqF{_1#xH-wGKLM4nDa9kxA^t3U6w1 zAR%g%jtm(GONOx^8@;#!G&K*G$?7X5EC>6FJp@+eI1udomWV`z?RKVGykB6_hqGlb z57UpoDdb1elL2Uh`D#KYWdFlrHr}}gODinXw9N>g?r`BC=wR5$oa77R93l5=9ApN@ zEj%oWipq?DV-c#Flqn8Z7@iLgmaL7ji|C3ijM@*w;9ZC*VW?{l=W&V2r5>wAj&9F7 z&_*Dy!fFJY>RFy-7^69^4B4g2G>S0%#FbE@-0V=C%3!5V+6X1<9s2c%t1wT~yb8}4 zWZs=gq~J))p-azLF}Xmno*-F$nDWUy;6&JA+ih}vkj!w&ap5`21cpi(8wMZmCm#2) zF(U~P4s!vr2-d9{I(k=Q(BGhlUo966-JRj)wA)$8O#Z=3%Xv1(2C0_;ja9X+!c-F0iNEyV8%fr=4|2kZLrboW5>uHC*}<0 zZHyytT*!>`e4GiJ++W8j;T0mS0X*vv5(eHV^D%$)hYZP%cr*~xBG?v+aIwy&j76{P zoyd7(7+zwG{hL@|4Al%YSZ-ce*rxwc30$pnLzl=Rwu~~q(%rFhe!4Wu&2!R*;{?7l z>d_ACrOfpN4UV{90HU0%u+YR^qW7Njae_s!%%n1|Oed|AZSo54|U+35(0xV0jJ zTIvys^6)b#rz6Wyb573`pRu4}@u|Nt57)}IayuV?daX;(+=Uc#-HgR5nA*6MnmB01 zxjYpmJ0r2FUiYCM&e=|>&>k5d3*Gf0%RHXMMUlz8@XNf(Xw!=h;}GVYc4IsjLT1nF zlnJeU;Y`|{zNoW0tM%fkHg~t3%Efd1tkYFtg6G{giaIgGJ}srEf_b2pf^9+vK0Ci7KX8>WXvzfA(>d- zK(k4R8vj5Um?&d?4OZUtPv_A-wh4|xS!g--uno)rDK z@8DI7m=Y=EB;M=|9h%tY|d(wc~od5z2Zf-CIMT=iFV z<=5*htZ-Tt7yODX;F`H?f{I!Z&L9px{fm{6NCZVqPZrAMnxhoBQuUA#8I$HMi}WlEHc+CLg{T|q zgY~C`*dm_FIh=EaAi)QOeHyf3;bvJtW_1@@jATU6!Z;94N)@3?6>5kMI&lG!iQGd0 zN&oCE_3ZyBSrh&1rn18D^wy--m}Kx&fGN!gjc)(+}oA2LI2n)&Q3v0#oh{k(}uh%SIle;i}5xAQE@fa`B6^mqLm6?QY!$;dQ}lzf^Gx- zgB}0jb0_z+S-bbx%ArVmA%%^DxeCvRMb8tx(H}TW>alcByR85yXl%ShxC2o^)p|`t z8z5>!0lWlz(Xf$0LkSpF74Hw>6`eEO7CqNN&<<%E~6n4Q5x&dSWa=fjlZUreAgdUxJAqFrGW?5h~+%Y}oZ~rf~ z+|5K>L1sn4Ef2@fI9*Bw>aqRT83L&T4Ysx1ns_z3;5y_77pt)D^l=gRp zPC3n3v}hUf4sP9p6f~5jSG+ehQKzud;ozBHN%61k+~o^~&u6~=Z*6}+8$cNNXMms= zf(H>MRJf2~Lx&Ef5d7zFR5*p>GSxG1&wwpk3hfajb?~1pQUec$Y>3i;6f&IrncRYK zQ!9p>2--BzPUIMct`g2XsIjBHEh7acyoYksOn(O42{pjwASo_FN2>H`0RJe$d%ym1 zBuK`Cok@s`E3aa#fci1P?Pf0uy3*bxb!J$hoty2)M*=aZC@R|Umu+w z`DKLZsgCyd@87SPA6b@PsDGmH_si4M4>#|^I**{p3^)(9ruSbG zhZ}LB?EFh=I1*>fEr3oz?UYm3J`B}Vga}JcrGDHCtGlH9!E_=Y3mdbe)c(0;J}+l$ zv%rmntW%8E(<>*UeLt;~)f9!GdNIEBKO`-Wjq_DnhQ`7Re zHBnRWM@@I!D8O0Wm1w?fiH(xi|HNdJpj*JKklbrgqVmlifB%^>r{7LRXbR?lD|OPt z5VDM+QCUma;){Eu7~_pYiy~e@5%LGD`mimlLT25wRM~5h18c(WqD;s%dwz+q%tSXD z^QmgFBndPyZ9Q_tGWpH0KoRxT)#!K+5}C}Jd(OGIn~kNFC0_<2x5Cs49+;yv%VnA& z)e_nk-J0uLdBVL0>dx5J#0uCu3=dL}oZo?7_Qnj?C(y>jP(&xKRkTm=G-y9sS&w@&W(CD+(BOPf{7mE9}X zYh^36w&Z@jY&&2%8MN8xVvBB>QTo6&7WX=B4PLn`6aP9d?O00>8*8?k_KNm$dnRqE zF|%G5Ml82;`XIsZtoXk~`3r3V=F)b^VTD?odo12eLzJOjTLkWp_1`l;#|_Rm91@nk z$~M5=5N0BRGeC6=FbX*}=`_CxiCA<+EP-UFY9u?7?|S#6ub`w_1eqO4KsKANa0FBO zLP^2A1FkOFDm&Gx*}8DGx@Jj8WY1bzv6@ye;n*WPVj+`-uGE@r#i>p~Dk84ZW4=0t zWkj-)kibm#6hL8bNMUi+>KFtlT@`O2cgvolUgN#x2n$08Sr~JaKtY7WF$f57O#(dg zoZ%!PA$+`JOW5L?_*g7&3Ov!=B9+Eu#gBsN0sm8J+Gt4Ej3X4|5QhOSxr&B-L?!eI z7)nafw0;H2OB~dX0}J*GBhgP@AtMqikj9WLZcb0zOUlzWLJBhA#}=>pTJ1>mFWcoR zRweNV8P)=v79xZ)GINNa>{6M|5Jfchu*)q%sSy<}>WurU+j7Q}D-D9?DP7^_Y2Nh^ z0SV9{=nIV-X!DAOgz`0oJe3W2bAkmZ03rWNoTFUhPf_&-IHQu3Y#Jv?gg_19SxQB9)ychJs%Ap_f0C($?6#qT~vWUqPr9jo9l4$9{v5cfVEdXvhr? za)*WhU?Bm3>x@#wF?Ko=e{xhPZ9Jwg2$EzJ*)S(UToIB|u!1qIAjMr7Gm?L7wiI1W zi9qsdfHzh}e>SPfK|E`KF$m=`Qn3Y22=W%G9Ap!S+QL7`u!%uJu1y9wN(rT~72{$? zFST&V!2n3EdlhsXXvVs#gt+c zs;zD)1y!=Ne3v8c#Er2;WDBG>8?Z)obVFlr)XF$r8|Ro3EKvha)`@fkxq(qjuw za8|o76pK(oITI<^MFaMTNPBGwqB{}vt*)_48TP}_gIu;DHAYATOe7YOGQ`MCt;%iw z;oyd-#E!jD^pY0R1%!Nx!i}x;ZuD#bZPcP3JmKtg{!-M>Rtqh*Kn!U3l9`Smg+V$g zCUPoskS(xcVOt@ED>gwE@c#s|CRJXrNFK6G7J$N8da4gpzyYvrD2?KTp!+uFy>vpln-KLLWCI9c@If9equoyV;T`W( zMC#Pzc4#;x{a8gdHYu?ucZL*ixd-6({8=n9NGd)FxB<&%LBCOkckxOy2>Fov>(F9I5my9qJ{2e#Lf4RI&9X@Zam z^!PEl{D|1;HkejOA^**~WDr>f!U-}wc{htasD*OV6-6ibRtY)yLNb03el8^9cD{`k zrl1Ag@C5){7&K;ZgZ2|07J()rjetEa$$w0T9pf0qbPRxz5(+a(u866F?jcuuWHuoT z63a;$RLGcEGfDem$c^{XcGTF#9puUup9x~l35LXh?i38z3jYt}`z#^X#e7$Asz1=^ z4^gh#(xGnEj=Pe^oOzq>bS2Njfe7X?oCLN3l*Xth6CUsqRtofN<1y4^+93$Q5dA~L zG6pU*F3vYN5Az(a_ip3xOauTXEWnUxKxo5d)B`juF!cWHH2i@TP%a@dK^yK0`iMkP zNTYa4$56mei2wLXAzDbOLc@G+=sm8CH&o-1YytG%Ba)ONCHSWy_@)9KqC7HVLil7< z$f|Y}BJo0_UEJzA#A+cJ&^7ieGze=YY$LDW%wiI3E$oRP0-(`y4CgTGA=0l!5}*q$ zjo@6wHaI0<>aXJxE+I4t^&SfcF)(9bNRdKA2XzBADCPl2!w$8_3EA+R)+6k0LkW3< z{y4(&Tq6v@uOT2&;SdjR9-_o{!Y0BjkV4}OzePp-?_vZ|4*}>7Ln8v_%>ek0v&74@ zTA>u!AQegB6-S~BSfSW*V&2N&6zdhr&aiyEV`8a=BGW-+wdfEC(+wAer!hjA9S z5gnDz8@+L}48Rvjs~f426s~a=$za~PF&)Lx$yBi!<53{tk+fWqELhVDHV-yARFcC8`S%gG3r3crLu{MM^))FD6@Y1F-AwG;bkYcwc)9_x9 zH$qWGCQM^01vlo#Efq60RdY2PBIADWL>>t>AL3KOgAXl6a3(G@3F0nu<1#DE;zDE4 z$}jB~QhXK;;4rku{z3IiVAc2qZ^Nvp4*(Z=y3l^^-M|K&jLSoqlpZ1=Nj9(J=dG zKoK-S6?A_V6w;iN|G?5f6{kTdv_ciszCOe@{l*O~G&<);5Fe0YzMw-%v_vh&6aOF6 z{)ih-!SF^QVqq9rR zHA!pZX9U$XI8=eY6kc~QmL|qwh$>oZ30^O?UonPW`{wi9)m|lbOCx1VsAvgavlLZO zSCw;r?nFO^<0_!dVguAd__ZO*ptQ6yl9mxP4AxCaJ4M}7G!8KnU;#2B&J#RLBTm#v>^<+5~U#t{Uh4m2?t0AE6 zZ~`<#3paHI)CC#ma>W$z)>cCuQ)UO(ZDDI@i(_kI6?Jh2C~h(-CpGPELuX^PQJv{o zTV%r6sqxa5mC{vpp|?WS)IraQLy5QVXyYq2BvlfXELf{31VsuV11i*AwtPW@E0Ktxbwuq z6-<&U#e?=7!hxqxXe)AkfWm<#q8$TL`)qece&G*(!C=cmp#Km;d#Mf4n%8|<7-t_4 zXrB<5Tz)0RRAxK#Q=la0zX4y9|J^ z;Ep+_@PRYNa1P=P(rqCQz<9|Qb6Yr!%Tg`bM>iVgI>t9QRx1H27cTl}1$Wr-ic=&H z0)<1vo)Ewu^h~2Hu_p=bAVf+D`S&d)$&Lwv032&mkX4Ks*(}?X+77mO^F(qZwKE@r zfE%L6?jb7K!zqumt`Z;%2N^XKk-H@Iy_G>r* z?KZeq5(xtA0w5&v3bfX8m2G3qFas|AXpOtcGj3T${44+ptN=m-o#A<-^%GX7cSVr{ zL-vmh8$zK0*&zmyD*QnS?LnEJsS@WaGz5ov4egLF7z(wg41t$6dYF9?@ij_!jvKdR zIl8F*Ch;zCG!GX*g83khnKoDwA^1*{d6F)F6QDKZnrr&kaszT3;%`o}+XZ zLaXf)VU2pNIi`@T7i}TToxvD~4?=(H){_+?BL7k)DhH4(R{9|5S~mvI1^G^(9ilUJ znDH9IG6wmiV|qpK)eBuPu@%B6ymujMAxxSv5~8~uBC`#x0PW$ay}D#YiX(J-(NGd0DElE; zK{F!vDIr+a_JSwbpI8ltc#4~m0s zEPFWd()))G0tg<$s<$i=b3;2rV=GKLRR8xl^d}0e8E#it& zsIB@o2GEMR`oY!MH>QwN&KrJ3;A>; zS=@&jV!acB%X>p5ba1J$Ifoepyu(|T6i6zuSqpNOef9>3GZ= z96WbA0ru*#iJM#-LYNmqH-R(H6+#0}BnkM`laX^F%z8Hh0Kyq!%@bliSNXkP!@%LZ z(;K3ofs{0Xbha5H3N8-CjSDWPpdR7~0VX{q=uao`Nb?XNly%!RfIx{QE~djHmQN(! z@=phmSYmYiuI*XRcj7x9&A44xuKzv#*#jJYM59^(*flT*D#Y^<9mp2kp%zZbE9$`= z7)%^x88aluA#B0WJ0je@JxK)a66M^x4%-##;ckZ_&=;cK1%vl;qlpFL6}7{X{Q-T< z4-?xn+RYi-75*WP9Zl7mIa`!8P<`PoR7pFJ(<$E5QFMjcSfL3{1FzERy0 zXoQ1s7}Ing^W#nBQyo9yJ>Szo-SAB}^ke@qfmu!mKX~01={ZGZKu<&CN353L_IF=J z*r^STes~GF_d6Z*ceM|hG?IU#V>PDs3ln`2-eQuPQVCOD2TE}`L^j*dHicgMJv;8f zc=ZP#RLy@{BTV-J!hpbE{{$L5h|oYmg9{TnOxWP&BsA2a~Txu2RUzL_e zU(W3MV#S4B+19;{JGbuLynDk|+!-b1-vv3R#i%i1A-cp>=wD0-!>)XGN|6wbWuRB6NXq-$Howe6_HbEDf zTS65^nP-Kul>bp;I+Zo_*H2S+2V7`kh38ZZ;c!Eb2+qdBX)&?q|SvLJT5OT>ri*CB=uFE5}<{lPpfMLBzZn?{Ts~5cKpZ zuj~#?aKQ$j3og9>M)&J`eFgVph?kS_66%zZCzsU|O^1&vbjIwS3 zXXll}S{2nDYABW`FvQqa994Cx?F^L81-@q6odiXeAj=wiTXE6Xxkej9zvQeFSPm<+ z9Mz+F26cL3#f&vj$HBI8%3_aA_DWDM&0S|TBO;5$^(^m%v5_@G|j(O&ePrNI+$NtKq*K{AQVz(D} z{Qp)^EdDBzaWS6$ZtMZmI`_sDbESFiy6>KAaW#*=HnSy4Xt zef0S8l>F>FhAS1x$oe|E^biW`efZ+1+xOxX*Hy2g9vb*O_x6@Ftom%PXnjraJEipa z`tQG6`Eyn;yV%W!dC=09$Fg<1-ysBcDQO?w0wl7P#pgMJkq>(=xS*?x-f=xLWzNlceq^v5LX#bb*n%_;ryjR;GbWjN(k%$H3^!M~q^0qanR#M>JxjbztkB*?=QC z9^R~n2;*Z8{b)SU&<0=_DjdxOGPS~0(srPWOCW&-xg5e~L9A5WRbHvEShf}4*0iOXQ}5}3mjrZ0_2%wraFnaXTtGM|aeMxHT^9h27C1Sc)a*by{a zS&m?O;Y(2;+F&PeOC(gVS8hBTe2P4g+ko8}a!HRY*Jd%Dx00(GcA1)%{o>JtA+RBvzR@_vZRXj|WkQMkG_ zu5_KNUFC|`y5{w+dhIJ;|GL+}`c<%i9jsvsi`c;Wr-lfkAb9?QFOND#o^6AxMJtQZ zp3NvWCAD2=S#}bJinc(5sZD7wi#XI`hoX-Sk86W?zTcp>abCOVY#$cav>uhEA?6Qe2Jug(f3*Yg^7rpa+uYB)IU$kZnwpkR;bJqyQ8yQBx1a_=rLp#mS z`d5;RMWAbbGEI);rA4CkScMBL;kp@^xEprJg*&|55bIaO?H#d+ON?TAo>;{xW^Rkk zx?&fzc*ZXFA9B7L5C9?h1O*8I1pq7v0002U0`LF;2>$>J2plNz9>D_t4k}#8upz;F z2^~5#`0yabffox}+=x(P#{v{1hV&>>V9AdPBX+!)Fr&nmFg=3A7;~aUl^}6KtfzjurS;DO#L+=Xy&I`IMB6<1VxWV=zyHiy@ZUe`_ugU;4q7Ss^K}uHU2B){ zVC;#fuTFSAHp2Dxfd!a=0}A-lPzHim;DPlms33z0BIuxm5Kh=&g&01lA%z=W*kObo zawuYm-UW7*X5uMGpj`2pcpO#|RTvXvZaqa~0XHi4QI0Ro*Vsfo9ro9AY&kUKj7;&E zB1?n`rsI=PMk(c#R92}YeMX6e9g$Eyb|ja8VR?~p&NW0|iwt$gQCn(47v7jTvRGn| z<;C^liD`0)W`G2$=%<83G8SEtY$;bLp<@}ED554Q+9;#{LE2x6ky1M8kC%RxX>^WO zifN~t(go_Ml9Fnvsh^grDy0SL#+QUJUH{6MONX^OBUfM6=p2t)$+%HZX$6ZTNyO50 z=|zPZsTf5{>UG~h+PygFUOqWVqD<62*cVDUVmT~9H-@|1xZskj>$!ZU`z^Zbsw-}} z@Ur`^yym)FZ@c);Yj3>!(#vnY_v#DqzXI!Sm;xa5(4 z=(y#SUk3jLV zPqqB=-Z!Kq`P0WQ|NQjVZ~y&I+5Y3f=u^o)_~BDm|DyCi*_m&E2jpD=YXZNH055h_ zvy{sqNWlqOP*N9^AO<(6!44YDgAx3o2t!E13UY9S3)C8`UerJrL9c}>3?R&+L_Qc& zWqmGm-&Eqn6yyd=o@sEHE z9G5_^I_ha4;;-Vv1>Y%l65>^`eI1GLR#^n zP<-MPF}l%=Uh$(Gt)fRms!@?{RFVQz5Ck8}Qa~<{KL!-#R_5fnhT;+_)oiIwcRCfW z%<^kI4Ql-=)2p)})FbHmRaW+-CU2z;CFTKBf9w`5G{wiNuTsuPwA!9$t=RngBGkgRaaJph zDKn9xG=u?-tUQ`zez3GBwYup{o~x`^UxwMvn#i-4{j6w1OIps3*0iNP3TRQwT8U~T zWm8RRw;-0oDF4k&AdP570W2|)R~YuU6hq%%*8;uybJ#x$O>jcbhK9qYKqK)$h%V+xmT zCN4_MC;)_&0bz%1SIGnEZUL%cVN+(ytFQz~VzNxsS9%#ydix7k$j36ER{6~L+fo62 zO3|s@;{O_iXvmWpa@_(vxw{ZsJ>0g?~?i(r1|bQ z!1w)csQh|&;>#&_3&3h969nB%R!GAo++bx$7|+7!M7`gwMR`v&hCU1z93exk4M!%b zDE|)$a{?!jlFdy!|A-cPS!1}?<)r4rqIpL8`VXA*+~=GDy3Wfr^cof2<`5D3&37Jj zrXM}$ODB5NjXrgx_uT1KhkDYnzICa0o$6n2-O39?c9thbksLms!V4gb2rFY5ZC7&J zYrP0t$9*7k-tOI_ERek~W8)l$H(rX&r@$(fAQdP;6%=oUDp)}v7I-}56=Hz`RK5aM zNPOZcPz4GU!1ENKfP^pj3QU3Zt5KrU7!hBF#Rmfahex^L2WdF0C0zdr3q%lsH%Rt|C+byAYZrhB zs9XTx3gY7)bJ2EB27eT%46w#<@K<*WA#499W!uGW*VSF!B@Bzu4GE}I2UvnAn1VN? zCxFKg?`K`g5Pxw8cXl=q6BcnbsAO-~b^s_0H&}lK0Ba%$gYKq+c63ykViwcnDMnQ% zz2b337=?!QQ^95x^@nE>#&EROT>xljxTXyFM-Uw-e^BOw1krzcCx!Q;KSQ!mYWRk5 zs6M8#5hpkhZ5Maj1%!C0gF%>w*@b}-uH09@dW=x9wzkUKPE74zqR%OHr*$Xx(9k0D5dG-!kQ zND#G#f3v1t0GM5DmyXRdH+=>autbc6Wlpig5R2Ck0%JZ!n7sAqJOdlSnxi36M~vq)A9IliLMrt_Fbk=U}7=fp&NhJ~)GRXO-Akhy#g@ zc9)b?vT^?tWnu z{zq$O$d83sp4ljnf@odZ35n-Y982*f-ia@hs1Qp~0BmUqZMhJj=>~7$2KTw3Pk{t1 z<1nxy5w5A53vr5qC~IBV4mHSX9axj~S(^gU3UP;lu&IqO2!J)opwERAMCp_U7Glxa z5RxYZ3$X>EX$J*hohrJcHDQ+^Mm$gx6|0tpHBy1ws1Uj-mhHI^Mv8Y-d4~c~4m^r* zC4zGebsPIBJDAB3qNe~2;iUqhqYR-188D?h>X}uME7Z`19VlVyX=}$Ar|Xt$gD9Lt zI*@qBfNMIZ0#SE@2w}nikY5^6c9jQ`p^wu4?{mK4!4gdggEZ0Zol zs9kV6XU7O@aVn5@29UbBikh0F$2gm#>JE+CfcS|J55%f3v8Agzt5IPO!X_2wAPA|r zje0n$ib>Ja~#t^CSZHo|^# zhNlb{uHZVPfyjeH_z${jr*PL~4yLJs_?UgSin=PN^a+xM*{^D(64$D+9vcf zle!6zardEHnQH|Q3=(^!eb;dRFn8OicL_111^=6aLHM2_Nw07x2vUlz+xo9=xUU~u zv{uNyT+&P0_Jv zySUP-H8ML8!}_6+Te5=Kg*CgdSebv}S^(?1u!1lQ04SxUK(!P&kayRGK^uqFYKjo8y3eYy=IEE z2Zk8}lPl3!pPyR3tx&i1dJyRPxZ4=0bLI{sd%91?Zd+Nd914K@3%j9)R6Ddrn}DWH zLBTevl<ZI`vsXuyEWgI0{c+10=Onp3RVEbqIvOuz&*x)60t2uv^p0l)-B zzz|8002(R~WdIYLz!0@S3JS1}OaCFi0+w0L?QL*5=4LvxJZtcIEjhIyJjqh_LWsyn8lekb( z$58Uu&!f+dJwNpftGFmrF(C}x%-LkU%9H@P+n|-&Jh_5N5XD`$fxr#_*VT|~hghwf znBBT6nk$5tc8oL-i~pM2K>Km%qj2Cm&CndaHTVm6$i~+_$*@S>$6e7@ecHdPl8g!$ z@rG04Z9R$$-n81E92^s!(ADKl5TG0g%aFAzdy01oi@xx|9o-O5Erx8o%JADst_?ol zEx}Iw*i5n81#rZS?cY5lKKBZ_d&k*xcHJS0*%t1<`DcpPt=_r{VbIMG=S|{KBCAX> z&jjd~jHgDxqC2>^;@{kE&+c3cdK|lmcFbG~c1dO1^FHHnF z{Sr|u$pui*|G~k3LuWilJ1$Z>X~3l$&h_hn}|jW z?hs_H5M-X!atF#ZvcJ^u%{NYKLyYEI{JRwGvBJnCGUv(#aIH!ph;l&NH(x1-gOU)4Ip3kHp1p&Ygfb8gGK-l~1 zrBYA}NB^x5j!wx)&}LIXz{35(Jy^hMP7r4z0EO?CV=mu6pRETNHE`09lD^F7#3)kkYF%D%Nho|I8d0whaEkB1Q}A~NRlN@o{C}I?7Z_&U(A4^3A$>}M_ zhfBF`6lPTHSh8gc#2k2w;lhqB-3p}nawgoDMF&++V#jS z(8Hz!7r85GPoOP<5(x*dsND_Bhtl)xeYGB33Fvd!Imx#?$vp1>ebPrO2^9CI2pY}RB@FTX`OE9O_2!t>~ z2`4N`Jdb`eYpJfFq70>W7(=R~=bT!MLKA(m3qzMmYH%d*PJ}T=87FKJD5P$TuPdd3 zv1lddqU&fYid3AjNE074GD#(u%&W$|o(piqf$9rss*!{Ykx4D{%B(0N&w2;|DG~@^ zOEb?z^P&4_6S4p(q0C4i4L@pg#2nMabEhxkTCae*`t3G_@&6&*jCwP; zkd#6xN<$|#X`$=9%x$zx3t+3$P1*XAQc*{(%|h;O+Z0gI^n#OAS3zb8fEBOIVueLO*aVPpwpa0j;1ybE6TlXM1jO@p zR|J;zHh^dg5bw1BkU&>gb8~$yh-lX>fL`$i#kSphzm@mcan%L(BV30?S0Gb$vQ;30 z3qatch6#FDVUi*iDB*g?GPeK#5*T#cFgYG*V~cn4XURriB{VxHySy}1RoeYsCOmAz z2RGbswf|&6#%oNS@X%ev>+wr1$;f!r1v?YRGb+jFodXK2lrVZJcKD0js1MwAJ4 znZ4~~VkoW}i#iamB%o$U0wu6sI|&JF27U>FhL@m#;eEzhc;|#r49-)q!2 zJfJm>AW0A!0*RGC1}@NnHoKqWj>b5fA#iaOEMVke49W(NH&mUkRb)k z;NnuKy`X_jd=FV$^#oEm7ap!?GUN{Gi1Iof#s*We!_Ql2m8$K02}v_t8$lScv!N*g zhXf(rKsuK>L}lT3lRKIewV<_RrE6<VQ^=R)8%?0c=|s$P~7i#3YoFYg1^)7QZ-> z*VxQ{NV{19C%ClgJrQ{Z0~^$ousriQj*#Ai+|`73y+JBcc|F6L@?HZy=nVvH640O9 zBI&y*P;!z+>z)*nHV{T8uaRToTK9B@NaZ~(m2OjIAq67KRg#XDs?^%`I$}Og>MWHc z97xF&QaiX1ku1XqgpeAw%;-FYna}J|4@tGCN_B@Yy#EP_D+++M_gyi01t`MSnqWMS z=#p$(6b0J^qKODVQ48tRf)uncigXr06syq0HZ4~GQjp>y?R-cp*dY*qvLl`hVFf{2 zkx&JQks!+x$r#L-vszB=f4Rh?^H#Yt;6bo!PP3fVS~$VGjc$(=J)R!-sW+bSv4#A5 zA4ToP(#;hxlHv<#{wjz`2m()~d+gay>87;;=COqy9f?u3$B>?)av-KdPDo-UO{$hh zH40M6i&(J#01hpsE04fkN>~0k3BgZPl5J#{O>q171v7E8_~*%zG~W z;unQVQaze)raT7nXwB!-pjFRpIqqK#3ICE^9s_TdKf_!dy_&3?MY#Z>KwiIYLc?ML z!REr8O)blYQ)!M5Cd^@8=N>8}$yDLH=Gvetyed&L-0&ulMg+J3Ody1vn*c?wNkJ9% zG~+`=vBkBDqGqC~r$9C#21x`Ow#;=f*tYu`Rzx9tQ5f+k#8Zzkd}vo4iGV*78iBWN z!c+(Q2!rpq-)?fVd{PWDlg+8o{mPoSG#)Phs!Ph_QP#SswWJ8)mOaxJ43OeM^|5bF zS?@tOkHFhml1D3K?-libO!g*oZ+7izUw3J`CKgYJNg$>qlQ`&QZ@QDYZe_4pRI$4W zV!#vU$9nN0OBh>#n>`RMNFoYl?emhsHj4iURPnW0D41C%I71?D4Wtp+gci{FwNYfj zRMG=DU%Ps_&7o0-T1Y^m1u}-X-gwm{9c5pmZCpv(wy#uk&6T;RR6cSuq(0tpP+M5k z^~HA8aGRlR!@XQi#_h;3)hD{PEIg`l@`^r#vMzo0)xC)B_sho^e;Kx~q}cFMeu8_c7T9p}P!W+Jvz zZsBaTPC=?Y@oPRMAl3kQX(b?AXt=_f7W@fIx4j&I!#l1h5jFYE62z=3Wvz0Z{xu0k zo3G3LS>Kym$ZM-swWr-~c7t0$pO^pkio4(a@@o7%Zw{oLyXUh0DnF(x>Jz5?+wO90 znca&zF24fAsO|ge;czFxuA*Ee)B7&jsWEblC=uciJ;Mz_>_{X@;RIyjej*|rXl0|x z&Tl}aDVk6-JeBt_ToFKGQGfw7m``(!bSXG=nH&J>h$MKm2*8yNGeD4t0;7q9&I6jD zi3CeZgn#qC*SJ7AD}W5Fu?xJL5!{-$nj8`IK46j@vUx!fI+_qfL1KBWhoG_>WhCu*}_H&5iXodM>5;Ti9kJvww@INb9iIL%p zaVUUs&;&vpg=i>2frthsjD}1o!ANLCNDv4}=s-ne2uh5EOi;u|#6*FBL`<~A5~Rce z;6x^j1WC*UM~sAQFhxvsMN=#QXjsKfEWt;-#Z`PnOjN{EJjDWt#ca65Q0zcgRK)_o z#a0vuVMNAX#KlH*#YapCu>WW*Ar#sew|+<>>fC`de9v!Xx^26>2s zgpEkR1||%jQ4ojl5r_X((1uEc$O4E+NT9_6zyydCNo=6ROn?SV;K-4*M3O|wh{Og{ z%m!-A$e0X=WyHsQgang}gpkApXs|?Dq{W{UNt_gjpv=j6M9FAC$#KL4MQqAaEC5J| z$fq>POhC#=2uh`l2BPdppbSZ`#LA~6Nm(2SS2RhG+{&J`%AV{%k8Dbxj75=5Ns=^4 zOxQ<8>`AqRhKE4PlZ;A|WXY5CNs=Qtr&erbNk%Y)gSyg&_4won+6gT+=KiPt1e{v?_plh)S&_%9#`h zc31~(pihvT#ew+AsLX_Q5Cxw^PoMl#{A^6L1W65D$qtlH#Oz7QRLZLi%EH7D-!&VjAHdDXlh#Ap*kc}CSuM~wCEdW*!hmyg_b4|xcfZEtx zg=}Djbzp^YfCN$SSbFKc83;lpRFarii&f47Xa#y;1xREC zdJslU=m!F|(nL+CNLYtj7>7`Z1Va2qaRAtmAj$O{N``1xiyeqnScg`~gn(oSttG@& zD8vHzE3PHfgo@F^+{&&c2tvfnRY+KNl~;181%yi7@bOsP)CO9ZMF$Pa^xVp9*vtR* z>|M76RrK^u+ce>i+Vm(6zlrlHik}gBNL8Fr;SRoP07hEfY=oWTG-20 zK*>)g#1GC|#S}@0l23vd1=Q6BDYZ>;AhA(c2S}&|SDaDQC5W)C%aL^E`ov2IW!c~@ zRaYconoZ)We9zw^Ch#&QyDO$GhTbn(RX{1{hCI#l;7!+z(glkOavfM;oyT-qhxH@} zNVVid?c}iKSa!|VNDzm1V1+elhk76dcA$)Q2-ENhQE25_8V#S3wb=j3%_m4K#!-A) zh6shdjN5D&2YR4~fE=iCV23`|XZR$`|7D2SY}}5}O&l&ouT4%v^i`1)(suPoNW|M3 zWrsk<%*hQ%VXkCRfZrrt#PFGBqTJ6TPU5G;$p+p@>s-m*6w4(3({wBVveOBNGzU*8 zfO9Yfb0~nY7KlzTg>EQ?Zs-tkemBxQ2^Db}yKvF-P}6}BBbt`jJ4IfL2F8)tN@&&O zZX{B-9b1HD1#&24fhbZ5euyreMzRb^PJBw@TtwsrU_}|*?URhqrMyHBWy=Bm<}mIOa3+a$1BMbAh;^F|*f?jl-U;e8TAXN+7by?Pgv26E zCv6A?v{g>Z4ACDY2=A=ukCbXN)!ZtbSd&FgP0$8J+k}BY$=v)%0pCqS-O%VnZRe&$ zL-ka`1V*TQ%v)s$ZP>`ll-T*iN}-JJ4A3lvMk~Pg1;9YLwGL4axtzJWGvCZK&MHwIyDwv`WZr zN(MgjoosU{Zc8q`#z$Omp0snD{pSGB()ZliBgIe4#Oi-c^lhH=jKOV)b{7O<^(~tOcJ|_sRRulsXim{rAEE$OM znv&Q^rYDaO(JYPBSPyxVkbz={TKJGws0V?jT#rqt8O>- z1o@75c$Ekdj&QT0*9-aU_?z%zoKKXY&k6D#khLxVG1vr=dk9$n2RBRlU+@RrI5S$A z31JHR)9?k|u!VnE`&;mbTlfcGUu6MV*UT7hmFiw)fTyqk|&UCs3+HiP4V>;&9?=6 zNc*g&dw=)`yqD4FPkiXl>aN%Ph2Z>qko(CX3}288dw_d;CHYivl60tcX(~Nrw(8&Lrti zXu@9^Ro=5HFkwcLA#p`b&RXDT(@w&&Tna_7#S zME5S^N@P#Bb-aW!&X4=ErG8u`3{|0ILG( z&bE@9_G`!ju1exms&g_*qYVp!tZmC*TT*1qre;|&vPG0$Sq_}Jy8x%SIKh&%Y5KR? zsQ-YQC3*4eap7)dMH#lOecu(yj759& zD19xJR)9M#C1DtKnc>w=0l^3sh=Owsb5?S3Jt&uh4hA+@ZxMRy){`} zC_*=vidKmDVqD^AQc-6ajgn1Sc-dkPDFYVZV=ZNv)y7Hg94B8&LYlP&8Md^-MSF;G zu}LZU{U}9hA*nP4gB6XT#2EkW{6j{0WY|N-CM}h>WJ?VpY1J*GKp7WGrL?3)Mg7HB zk(`^1Vb*}@jWl1H75P{Z8_4-%ixg5ESy7i;jCJT1QxX?chn$QtMLqY7G3S7GhBRjZ zYhJfzo*|W45vqC~rXq}Sl~X_rjY>45s z;txBc#C4G?p+RP5wKLf=);(kON6K|SuIQ1q6=`A17CvgR8eUZTI0m~Cv~;9WsYx+L zNUq>HQ)ykAWoH3XpzCj17m=u*prndafD|@SX_I{$6}a1>YChLeEmNS>AHa6DvPExe z@>gmBnT|mU$XQjSl34#{7ElYoB_qdhOXc!NMms6HYSt7T>PK=*KAVWFhXq#TpwSiz zt6;FY9yU$WgE2cb)m0M>YlPumr?p%zR-KtYqiE7jJ*BZz%Q~6V!%{8DIoFaucG_o8 zX*N~NTSac#LIxL-762uY)@y@&$xNZtiJ6lZgmGmU2(K+I(x71Me*Hc8;jc{exQj17Zd$-a=7so;{WDG| z40g6k0pn=0wo?Cxo|ziX)wY!AOj5J04k2z_1(<+Y@YEj!%0+0U7*NVelNt$x7E)-%J=idoEx1BYZF!WoDgwKfe9nOL(v!~$Wfp;?#Ybn7VQK7Si*;G4 zBJA>opv=MrRjq|RxRYUd7}TwxsR=zo6XM#AV--uCB>~IZTKnQMjRyt8ba`oETy7N% z?^R?H)F^;m%%TinMK6nPe4`89hnVY-4>47MBVOd?k+5ll7164ZIOaG*m_;dXtYBAU z*mDmesizgHi%xaoVw2URMmMCO4i?enDlX)x099IIMcm<|R_LaIJ$d5G1cXW-ZUS6C z8d>7#1iJrI4QMQHE1-MyWF%XMB25FW$XKCBTdn=K)yIP)@{Rb)aOpD92n+<82_Ol2+M>S0JW zq8?k+f(vX()Lp{07>#JNF{ROys~)$ld5Q=k_PIz8=OR$VT!kZhyi3e3c9(0KC2^R9 zlGB`8WI9lpX;j{l7673{ zAi^maLViJ!+8pE_g}L3JkaW(88Z0si`KVM^(o^tsRAm+63G!C-7I5Jn_+5!7@@5h{BCG0|C%QLZTHTLgza9S&3EYGM@yk#6F)}CDDMYAXiAud5Uo? zV`|042TcPnWTYu(GfNj_(Q%@aiK|)Ir`hT_WGeP)%j}@~8>6PAuqio;L<;Mb#}Q>D zUUiQ`3U(BttfV72aR?oKq1CnwM?U{K$#jh36$?^Cq*_smc7mqWqd+ASBe10h!`K5#U7BB)~07P(`8@?Ly~2GZAiep5l|`u1Krm4Ny_R6Pu#A zhGkA>iv`mslCP-5tuuiLaOs1P@bp)#SJmorfV>lrK)0tGS=>|Q%2pbJ#Uv}!33aR} zm*lCopecgUBs7G*xI`_%;(AOVD%;^f8>>VWRwqbZI3Kz!OTs*6#eg7PBLm*`uJh5a zo7oB$y3U70MVak?YFp;uB+@EPX03cK%$BBJIJ_Crr&WNv<&T({)-qO~KoEi(RV$>( zv#Sl)wtQTvJ}<8miEmUOs@R^=?$gL6bNaUYo8tl&E5tdUsiBSBTL5T=X;uG?fvmLb zyd3&2jOFHBmd0nZ82B(?Y#yIaO6YkPdNDKotcB@q%mQ>q8=25)(1=^t+qIVfrjYYXeC6cKHuS8pG9pGRQqD8p{hz$-En~=BWLJpvmuPh+Y1(aFu02W>ze3o{2 zb66RItiH33Ajw3i+*&t_vWox znQ-UBZCiw^Khaie0sd5HuWN?xk%rjo7aEOh%(NNlM2 zvIw+5Gg%F8imjfOXl_3Ti3yT$Wr2LvnCK zpCOH01j2$H*j;RqyeR^_&EN0+VDX&=zPX+d#++LKVPk|%{G9*AI?RYRb;*&G0;HKA z6G@>*gv2356j(?>dALJ)$dCr~o}v7bSj3VFflOI!z@w;6*i}Rjbz3W>$8`izJ4nDI zc@p8U3Mm9pNwiu4XaHRtM`>(;46#a%Y=Y>B8%CJL7=%kZpo_>0-8K~5|(L^!~r` zB1t+%9hJzU%@AP)Scj!WC@_&d&<~&xQ&>31ZtzH2gvNCcUEYY4RFub)>`nnpEW7QsBT#sJ} zgFW0}T$BRt6+kyMNJ}VYNnU1%u%1>W5^+G)xM}~^MT~+r)B-!OLOqOvJ;+G?xq^=@ z)LC2>NdU|(^an|lkW7GuO^ksINdbeP2b$Q23rZz&@FW2h0Fn6RkKj^&T*Pq{-8PcO zVPK8~Fi2S>9IV6)dCUtR3W^kHilKZZtHgyXv|)G>2&&l0CRpPNjRi@#OdOU(uMtK_ z$f3DN&{F!un(UBb$eBj1WURzsgUtmcEQ2CAW&v~wM7BhNLdPTs17JKTW=3dceddJW z)HtldIE=!Dj)U5;#8nK0Jy2wbMxck0pM5=5eaVc`*h5m@P6?TtSv=qaGQ=(T2uR!m zDy7DGK?Y6QgZNPd-ME8Om<1_>hTSlcPZj?F8yre9`b=6>lu8OI6O{yEhSCG#j&ppD zlmght6lPpJqEAo~o%9Bo#zb?x7l9NWHbrQ4NvNBK&p(Ql*3Cp`h(ad#+l;i6SY4PR z#%Mc8gkK4iKz#*0f>bNCLN5a2W~rpN!59(hh@HfY(S(P=e3hCmMtpLGZOQ2{)>%qM zNkq)!Efi!Zt`=iZXn;{DM!qSlrW3NPs$#$@OZ5gjtO7f*!#adU{0SL~9E|@N#lx-K z%5)pz6>Fk-XsbQW!(E3;^y+4DS<#hDiO`s|QY&;YUUY5W9;M_}eMEi`YkwsdSbRlw zsTy2SYj-@`TL=ehb(*0C#gT!{^4$Mf$qh}b-m7L!YdO&ctPmp}MFBwW+ed+fk)6eu z!9_!$X;>_W&$$PQc+^xLM69VcMKJEaOSa5X_Ji)a~v6X0R>l` z6L_!;YoRQ`BJGKQDvu3bZt?$E;*8tXMy=?=k+bsah~TRp%|tDb!Z;Lwv^b&Woko_a zM9R9??I^2`E=5TAY*6^sMOhBgWm$XOm_6lILqG&i^xEgqoIwMISbZ{F4R&U~+)pr@iMI08r zj;{XhFN>5M`Fw1$LY2RUlYPXKCdi08jb_lq-D_zDx3S0DbXm(%WrKE+;0#?<@ha`Y1*>x+(&d4 ziM@mo{)5qUoaHPUU5Wn~LD)iS(WH1K=}t1L0Jn*;Dr)}nuN9M|zCK3ig3m=5WBrK2 zIuw9AF^GRgE>xVK^U{@+#wXp%RCVmkIoXHJY!}E9gvGrrj`92l*T{2C+6h| za?Zu-M#hlVRf}pT6W@(g1g8{Vlw2u==#(SwaHCkHOAVcc(dee31Qb^#QfIYZorzdO z-%jQh^r~8pUN1CXGj3h}^^YPuJ z_0!4)sf_=D(QE=MtjW;&Whsab+Wkool|p}n#?HhaOV~uha1;TtiLZ3XiRHski^0>s^rL{K=LP^#m+pSK2tGfWY`gsT){m_Xo^ znsWajE5uB1IEN_vpHJM-NN~X@EOU9%-`!0PSzX|tz4|M3WXitWKQ8Y$0r`g;e~2k_#>J~_w%Lck=&$+1FgC2#zmkED@-;u zsnGXzvSKXxoH5j7Ff^wU7LS9}01vQ=1VBaDfsPLgIqmV!nDUOs6nN`fIE+FdRYdEO z6=LYqYILw*2_H}k7WwexhMBH{h)#BxtzVuvV}Lr6G1Ot8a(x(?4jl~4)rW#OX}wlz zcOSN4V9p)XtDP002Xktqr(mgb>bA$&UBGeGd_ezp`l&`VOCc$DNG#;m)Mjdz%=MtTv( z{Dciv{iSF@x!A=D;f~!HUQMigJ-S7yj862LN!Vl0tE_4@oQ?(SS;-ge;Ow(WZf-qM zr)kq(HC*~oT!O@(+Z8HnA6!w5Fq`q5TU?cT%@85ST=?o*a4cfg^Jz)^-KQ?9gaLbq zJc^X(1sQ=mw0npGko(k_{P%>I3w5r{GTB#E#^)mHbe7IkfvZTnzT32q)3e=3oiY4%VI5y37%Tis`dZjRdh7~(S ztV6Lnsh(AE=2nkNVcPUpdS}XwMG;NQ1wc+^crWziqAl|x%qiI)$b|`~PWEM;DQlfOiGm+VT_I#w z7L(|;C?9csuL_bB2q0x+SOo#7aPlGP+7&D+&1eFD{G7(CQbGNZ>%MJGT1c z2Mz!Ds>6}QGLNAT?JE(n!NRg@EyB(c?yZBEGf_sr#<6IWuujhNQv+*%b;3rItW|Qh>S7bgN`Apn4;{+lM+&KBjg4e%^yQ8Iw&+9Nh@G6$MW*( zC=tI((y%SGGJ~!+zzSecwFm?YQ-LfLYtVm60Lu=G76?m#|GfHO0s*x8A*@m@8o(_R zZs^Nbu_`Fwjt>y4EKC_SjTEy=XN>kN{$?g2L`du&M*DS=jU z$etXrn{TsLI1TF-jnFK&B6qr5%^z@oac3oR{Xx^&tz7?M3aNSZ z4=hj5f_Q_q*7l0Ttvm?p1&ijE_OM~?HVxXflm)EWyz^!dqEOo5%N8iKicn6i-i!B0GVFnvA+jtA-6FCr;&Kaezm~cHYKdY9Y^{{oYA$;= zhgWolt2>XO2jkUf3ppj2f|aePnqmtsxzGYEdldgD{G`ko;<5mdEn10muUz483$7zw z?VpZ?uT%>z#<=JB=f6^s(M;8P-z^C+_KI4ybhZcqOzRI!LAks#Dgc@dM4Xt@Rxsr} zt^BV5TFYAiUS*L6Y$XDK3k;+F<`?-{kb{?-S~jdwkM%_gbw~0?DSYM_uN8n458_oR zR8dD+(6=@k^IpqW6rA|4#(gXp?swj0#w>o(g?+`*kcoM+1;VKLJBuB zL<+XJBSYeImJGUOkXK{K<_e%Qd)zO3YeD~{R}v5fB_v>veR+xk4=EPZdF7F6xkm-J z0z|C<;3|lrRak0QpbpYygHLoN23HwNK7wdl?UR??PD-sLaygC$)UsTBmQ(<@`Vr&>07D#VPjK9&5MS43HmHn2r2pzO;? zw}OEFh2^BO^yyEf)x`p6q5$+DMLqvovW`q3)l#_I%Fi(NAbXHvaSClkJCLK9(s3#- z54s@>TVcl|vha~7_2WG-nLn7Nj-s`IX6RT!ip3}ZNN}hLTSPa7^j#B2Y$aRy7NSR&3Z|8Id(bIU zNvW;;(JKTTCkH#pN7l0RD^6pGf#T)b{;gz;WRs^~P8l&Nu=ap`0j1@|q)eNnMM*pUfsXhIyB$W{SFQ9t>9r6O1@u1+?i5Rzc(7QU$QiCE%ecS(dZ z4D$>4h6a?Q*n8k@%>Q)1W6-SIK600Ymty7mE}MwTjG3bp64y&G%!bcW$r$q`(E(hGC`~l!s+eed znJ&@(#w{ZesfhnIUx<5P0^sPo@15@*)O+9Qf&jgU`=@TlC9Z#Wk5+V%*_rEp_`{5sd`BVAIWx4zI`$F5WaGoImAiT}AV$qn& zE5>fM0;2%M;-1tlEdGxni0}2H<@{FU*OG?$=I;VAFa!I}wTi5pP^QJ;WC}D7EL>p} zL~sf$&oKYSKmvF?Erv_~G*FPfLPXpz2#xRv zk&uH759@yI&OB=LN~8gka0-*pZzND}e#|W_kP5l53%#)XgmC_(@C#87_6W(u1g!|k za1Gh84J`$qtWQGRa1NtSQ_PSr#*hy6a1Z0}P0+A?I_M4u2E6!iZ?s|oo$u8I5rLX* z5exAVAyJk%Fj9K#+oBN9>?|?-a7MBY5G$o8d}L~vL;WZa0pITm1B3dWB@$V&6#;Mh z{=yN3OzV6nCTvmpK5@YgXz*0AQN*m6kZ&f`gZ(gZU|54SZmC2_ao1cAxg60Ip)ndw zBmw^#ur%_J!5}a)uJQjuaXOxn5yQ+pK(YQ*uS%}53Sn&m!4dtWu^rtpZ+1#PY~mYV zuaGto7foa${9+zi2@}7>Pm=3WGJ_rsQ4p^%)HLxO6>=eG#MVxa36ZZDp-?OcvIWD9 zCDIS5jsnhB(NHon76IpdJaR3zkReU-B*7vH=*;{&XwF&T<`{pCCn#eg zDNrrc5Ak49CRdTVDl+bd5+#jN4{cBiS%lU&av$Yz9kC`vOhqCIu_>pkQ zG8Gw6mL!nt!0af=vMhmZCqnNbnB*xz(kX#W&M0z4XyPn=5f^tXLLi49u`v!UC4>L` z%pQl(4}sAWiw|%RB{}rj)cJeA?5`ij_dcdL-E|V!c=m0KJF=ewX1C1uZkS$NM&g5|~ThJo_4DFHzA?-uh zEFuQ6&L)D(dJ@GRT)_t2XBlS^yhP+DO{Fu%;*oX=71MDxxwAW`5-RIskaE&A4~;kF z$ED~478zy=7zo!ir82B-D;{Yuy75_dOg+ePK6>pdxaJ%IV?Q$qD|yloy|X|IF$tv1 zHhD7)-9j=MbVc4L(K>1H%*;WN?;g6SG!X37%!aiPa3-yiK)E6>)#83IFW3K!Z#WDw z20;=${L?^T)C+ghcV6_T9#bq*us&ELwfyFJT44Y~tSH0N*VN)f?SnP=FGiJAM$a&o zOu;qz(<{n=6uicX!h&o%iEE(LciIASW@sT+0(+jK6$ngzdT%R$^h$>bAFC%q%0Nv< z?-h{86)f&eBQi-CWK<^6r+{!o`ti>2Z%GA}4E1t4v=c0D!Rub?inKzWT%p7Qbb;pU zELikSw9O(yDgYox?b^b6wvUvaEl?#4(Lz&yR?7wf!#r9c)0hn`PN4kW<_z9||BRGx z;&M=NwF}*jHTvfNJk4(QG%S9L_AFx2JTu3F3sNH`J~0nCqjd6sZ!7;43^C5MgHk0h z8~{W3qEF)|)<85@!Bs}PvOm=Ff}({*X^Jk6gn`r!5w${r9xnh8pzJInO%?R6AW1a0 z0ue8DE0jP;4`V2u)holbV7U-g$#X#unhf=7?- zN+qSxzM@twV(g4{D|Qe(>Eagj4haU%BF>;6z2c7o3T?JRo=!p63^r$tkj`rKK?6go zL^j?S0tmqdGExg;f@^+uFD!tlUr7a(G-zYXL@f9(LD17Lm0MsI0+_eCR zGir6VY%_3>dbTgZwg9vZV`A)QM&(9W@G1^Ghw0QY%T0+Tq_Y%v!JC$U^#1i8kRSk(fP03a){^d=Z6 zwYJnPN-WUm^($D*`$m;i!2))D_B;Q~2CIntwjyb>Ni328Z>7>jGk195&n9*8UM)ye zU5hm;sO=_}2E_tnE>|s5D*=*Zqoz$O7`BntBH7MjU{QvoPS!-YH7xE2H0gqDgpXj6 zmw4SbAe*#7|AKe-^(rvNwH^X8_(OEHLg@k&S;4}4KNCLu_H@7kbd^mlfcM(OLRm|* zSqwKQEh2Yo6I%5Z_X+?~p_Fsqw}Vfwf}1hdepM$eLV*7bu>VRWKI<1<SqSk6_=tFKyKn357mQ>*r%Q_ZxHx?E)`v4uvH^9e8mlv zZg_&1_5}lDG`w$ZM>sHcYJshIYv9cVy@Elu*DI0{=CmS5Z}W)Vc>Vy^!l;(gz#_*u z@5}y>-MHEk2np zc-OVqSS#eUgn_uT%omZp!iTj2I7dZm4duqr}o1h7$gAz0GZq&q!h3~lE9U%r<}b)dH^5^&^KOy zSDpDHm$yd=q^6t$$t&cv{{kRK!AD{ffSV_Hme~gYz&TmGIinjgZ*naGhFgr>w#i>OnsKMPcSBV_sTXO)f;gf|VU3%}P1EGR0r)0jZiL83*Ec zO2J+mg{i_yQ-)^3YyqhiVvy-VL?~LLty+UP7+}x&sufZdC7P?j8fR(omfhl_yHlEH zQ$^V{tl9c3L|G?0I%nOeh831s<}j|?TBHBP4X;mGHUYE%&<>WdP&V~qgQ_~O5!)** z^fUdLqsG-8|4}P+`f3LnA^187U+t?Cd$TJOW{+I0&81!Tx40W05tw*bP^k zvt2up@8Yj5=p%*qSw{Q$LJbrTa+TaOD(#OGiIf33xc^?exIGh5%Cfa*M1F2NFbUJQ zZ3K7uznx+g4wRvUx17zi};3`$1zZ`Hl-fH^_Z5 zg}VQ+JT2m|vD=Mlue6#QqoJ@Wz1x*Ch!~4YxdV2pxuQOoWf`;4mY(sJPIalfzyv~6VEjNQ#J6qUC zaVIwMOA6h}U%fs?Jruh_AY-J>=RT|f-`Hio5uFi4I2e{fq&r}T+7k@%9mdEn;!L8UOZET9)JJ% zP2TyjKS+h1_$ArlaZ}+hJLJC+_wRi_k-S7otNL9(`!QDnQ#8Ple&^r4@B01w<$k{5 z9oiRPz^}i90OD7HfdmWuBY4kX!h;J7G<;~#VMK@wCt9qCQDR1l8as0Qc+q1>kQ+yu zEQwNNN|GvDvV8w}(q&ATD`(oQiBn?1oji9Y)Cu(GPJsju77%E(VA7sUdlGF*km$ju zPzNq`S~Y7_tz3CNz1p=P)v#pC7Ts!ftWvUIxl)zd6Kq?abIsbli#M;{y?p!n{R=p7 zU$u3u9&IXD@ZqwBwazvA^jG7(btey0TNX3su#f+?wH!CJ;?bl_n?8*?wd&Q4Tk{27 zb#qnMJCkmP9lI-Brnnl=yIzO#<-;&eshx{2_-yId;f0q>)(SZHY zB_MwYPUZige+fp&pn(KR2qAzN9;RW16LwfzgCHs;;(;3~_#lTSdN?6}zFp{*d#3&K z&{Z@V^ovmUB<7oq9XSM+WIr*~A59VoWMq;N-SXmkK4COulvYXEBv3aFq$5HI8MPyp zM0E)ymRyc0W|?803FbXtl8GjpUDC*Al>@$*A9>B)iD#aA?%9`hB0VP^oyv`eWuXcw z2Onv6{`HekP6BtFaC|jtD5d2s$Y-XSZpta2S1u}DL*>9tFXBGdMvQX8e1%}WitD$vtdFzt+cuJs%*2m zM!WxQwcTDj?6=5ji!HU_j%rqpTA~|ipju_g<$;dc8820$idtyAgzAf{Z}_6iqr2Jh zr0QL;o+TrU(Ve-gnGG}Su%L7%)@`R2UyO0as8!_etE6_7kh(fqN~x{|ON?^LMOmt) zsr~Z!uTLtA>Swd-)+X$YI!kvI%aw9_^1IO%z~smrW7`y%Oet;XZh-a_w8m0TO?9WA zu}fc%g4N8mz)Mfra@BUJ>Z(~ZLppWYP>1DcTy49I@WK+qEqB0k%k8e+dS~r5-ErUj zciwyh-Z$P8559N8gfE_W-H1P~_*qeZ9joCUC%qPVlLuZ9lXb=XGUf-nI9#e{sSP_7 zZriC`*p8Sn)ZV(b0``1Ml_l!4t1?@yO$Dyz<9CuYAQa zhidyy0RaFZ`2+`jHNztN9mI^BhlnHX8O@S#p%FKzAra_uOOX4JW zl4wDaNQa_SnslktrcjwmeL6KN)vH#sR^5t~tJbbyzl!xrHf-6kX49fwI~8HWoEc%t zz3H>yuY_-F4!ryGWL>!?kA9p>*zU-m7K<8esAa$%SK-vvdD%DABpm>x0Fz=+ zoBnM6{sB1OfdBPZpl<>m7@&a(Hpt+E2tv4EgcMF_A%PB7h@pX#q4eE%j{ODVZzI+e zUVfiV^xa8(k>nF}2BHXZ1fpk}*{4v4{{1GTa&z6)okQluwHSdKVdo@~ z-a)CIlpj)QB|%kUd1YlbCYf2Hx#gH_p4n!aZ?5U)oN&^)C4T1x znId7H2}hVjKJwP0jE^bS=VAC&((|nTl5!fOYv4DM-*UI-rl)0$S*WK>dnnQpaHg@4Q3B zs}a4@;wx{x`rga$zxe{ZZ@>f(Y_PutBYd#E4ENixzzRqFaKaNW?C`}9S1hrZyV2BUteov2Z87pin~x0-zyn!6J6_7|_c zovO5~F)v*!uDe3rG}BHa&1$YyOP#etKQBkJc0B8)7;)}NHL1!rXD1(-%wb*aiZYsO zw5cg$yYqZU3R|{XXLbLK)Qw<)cG!q@Zz$@ITuaJQXyO*Fpy54d7`fw;LvH!wm{*=T z<(zA{x#tO*T+(>!iu~KrF8#vzbGn`w_MDk|_T<-_)!4S3ZT`hheF? zdC7uc!l0Wfn86En@JkxpAPB{z!T+5pgdAj33Pm_V6?)KxEo9-CQ20U_p74V+WE=bL z_do(B?Q60zA=dvKxH#*TsDZJY+MnLntq{`Zbsp>7u$OI@_gB0C_-$zoa4;sXsYNkdcs#&W={|om^XvpE_fy2g*cokE^p1_qygNf}90C)LDoDXK4-YI4-Yx-eliJ6f%3SIhL( znuIm0R`qIH&FY=4HYPdRbgNUSiq^5lRjhOc>ss$x*SxaTuH*vTRBwlvsoJxrh)ra+ zmUmcYhLo_zI-6yzHKmuKjA?}v>EY^<*|%=?vnu1Po;u4M(aMUns2#0pPrKUuq?Wa? zb?vE&qBHXUKoMt{^r2>&(Fg-rLm=lkY+}pVSm;S-t(Y0mPKV3fa)u6Qh><1j2tklx z5JVV?5XLeFA&^tNqq*cPA(0l9QF47mo;qU)b|ibXrtPw1vW=~2<4fQ9+84C&y>Dpo znAg zCuwLKBMo;Ej9k>>iBtSV7JKo z9S=kQ$jeZ~GAJwv9lwIe$+Qo(L^C!8cQZ561!ADRbgLRsFl&b9FdadXXayH~H^z%h zqlxtB_C|U&lO}XaY&Wu@rqY0Q^sxb~J8FRpL(~Qkh5;zdYE}PO8K;IUo;A6;$0D!8 zr~KVdqxdRaM=+;f4)&PAY-M4GS<6fm^RbD&Wn(9g%0Y`?d4B_Bg7{dwLf$ciMIB)| z!`j=6sBpM-Y>ruXlELQ8r?j;;BoMQz#WRLCjpa>m7`r&e^S1ZpJZWanP5Eo2RyC|g zoo#|Fqt2p^^{UsrYEc9E+5)Kry3H-fL4!KE1CdWdZn1HRtc@fZ_oYDAMl26`NKyv> zYY$g{MN+U;*1Sgk$J#iq9rt{!<*B?8l8rO-;Mtt1I1k>EKyUxW4p!Ssm*?-+EiiZXA%%{3>gsBql8h zy@yM<#|25aw)1Z4AP=PA0{Je*HEF{12|b5US}t)4QUwE4zzPC^ya6mA`3qRV@>j6J z6$k=(D^#KJ0;vEMDqsLAl%4_tp@8YBpn3yPU<#&pJryP}d()%7_5y)D>?dG=DZJkH zyN|u@XW#qZyFU22r^4=w5BuZezW2%}zVDm=d)g;|`O^pf^M}v->^tB3(8s?2@vATV z=y!ko$Pd5t(Z7B3Ghh4Q=l=V@Uw-jZKmGFeKKZY|{`pcIv^NE*=X(S3dj@!C z)AM1`vka=HYIWvn22gMh7-y-5cMq6q59WXlxCj+Ec&;>YW8x^(lyOY}f+(1RLJ|P2 z5JucUCJ5!Gf<@*$V?%mK*o01~ z5VnAE_;U_5*k-EsW~atoH#i8e=5PkUU2aBjvG#3QSYcVXaNY2Pw02oTWg=`CO)Nt$ zyLJX@Sci598aQ?`w4;RrF>rXNV?JhKJcw#KmTlMegAgVRK1PGzCSj!iHVox(hm7DC-z+H9rcMa!i4i|xnU|n74iZnO~?vRO~ zG+&A~Bwb*Oyhvn8U`7%}I|BEBY(17fxIDXk++_=F-{pb!eM1PZ_sN}v!CkOdk4001VrlLYjOi@_h+ zNEi>-ZF?7Cr)Gn%IAJ?xVWMV^q=;RCn2*+&kEteS*%fZqD1ki5MmTgs=SW7j0eT7H z1(25j2cZQ9a0hQ-059nfYOs}XIY%PcK=k;9eJ76|=!LPEYGep_$^dvt*^d;)lml^U zqljv88IZCjh0oKL2EhbgAP`>Q2?*f^YnhgAAOQv;1_Ch$iTRmr|`qbxzmWCKy01;GRZ zA$iJa5SHl%%_#*4F$Zcepeg#J_S2#Uk)7COjd^)$SeRXPS&!rSj)>W$pC|~zzzu(g zq%&xY50+i>h?qdSZjdr0L0K1$*)48B20B>~3GkKzp{8BhrmAES>}5SUc!Lut6r`42 z0#TY5IG!|kU8nh{xp|Zh=%%DGnvABBArVH{L5ZIKA(r=JmV_Fqu;f_DCKr_8Y8G0N zxA}nCm2Fu{jXf4&QM#AHP>a*hcc#{bu_k07N|BN}QzXb}ck?Lpvl@m{5M%nPx(Yx~ z=7v7;X&9G^``CwkND!zg45eV2b((6fYGD*gqG;Bs<~gT$YMw);mAkrto+KAAnyuby zM@}>srXUQ^sHB7FYUFxwSBRPgF$|;1V^Ru=bQ-8k`G8DWp5F>UGy$x>VLSSnuK?RE z{%{}pgRTd+kpjn;PP(M#N}@oxkJe~|oL~TvXrjZ)g*I4cq?lcUP^8lqutelW2hpt{ zTe5PI1VocYLn36T*_}W(svQfla%P$Z7p+JC>9Or#5U%N}_Gqpn%B7K-js%peCR?;2 z`#iybfhMYmQi`W{_ledO2$49k!r-c|1`*?FVM1n(ton(l=xQ44s!=)&9viR?`fSLC z8WrKFM%%XS^E??_Z4(HK=}HRe`HJSLmHT+70$~q2C^X3&_h1~3U=o2pftscoxL zizc)QL9}igxdM>@11mkk!3^VxnmVYsh$&=~0EEkGtxW5Qu9mZEmTkiDxjh!I)R?tW zDz~p1MEyEGl3Tk3WR6MHM{@#!64;~y;ekz?fzOz?bt$EzD+rOu4Z%yc1W^uBI*2{U zgRuCCBDj#%dsJToB5Z5Bkt?L-QxMPpd%9H#zO@Olt9h#Dxp%{>tmr$f#wfnmMy{ep zu8R1c+*_R=3%U1evIr1uZ;KG+8Lv{>q&ldx<%z8dA)-EZ7ftGFkyr}knrcY7zO`up zwYa~S(Jpd0az+J*2C=<@gaG^_!Wb+`{wY4FvOW>K!t-03JbPWfYXE^jzpR>fJ*^LCW1t;u0V_*PhT0LY?!gy4<3jrwA>k3JW zcPz`aeMr9takv%vyr?^@sYVV4&NXW!4VvZ&fA9rVUC9D!?R4r1kt`#i@-qGwc|^!>ps827uU!EfC6y)Cb`X z5-e)RRjPzj)6rD9#3u$x2;4R*WO5{IGn9))h&vbQ}{D zNP+B1rRQ0y;Hzp4{k(wyv2C2z_K9?BbXejj$}BOH3m^nVAP^%h%`$41)V$1d?GUZN z3CKOkQ#{(>e98&`K?c&jg{<2!RA!&<;Xv+KcVosqH){J1et0 z7r>mr;yV!TFvG#Tr>gc3_8_InP_+Uv4J(Y+6~VL)4zU6e*1RmK50oQ9v~p;(m;`~$ z2oVG|s+<9!lhzEybDhZcBL!!Q07`(|2w~U)Aq6B10180DNss_OY2#)|3PnA+W~l%; z4#g-=5K&y;(F4%(xv0HLB5sV4?b*x2D+n?{)(0VE6@i*O>}s5_#c18o5kA0XEDWtZ zj&e6_DAL*>Oc;i2KR__kKD6URZbu2g)Q$ln*o!p{!NU}t)#y6m4qeXU>&k)P)n8o@ z^eYI{;IvEsF26G@+dx~p@}y`x#o=!rsd4@jj#PpUu?S&Z(F1JN1M#^`4UOCY;BQ9%mvf%i=#pGuOaOQzDOjZ7~Rm&!l2cj z7}j)*yE7aN@G9H&OwMr(gaPixlpqkwd+cru#=@ZN)$XR^b&hjcL-2pP-i?;L4(tly>-{sshA711!2Xgw#5(j4+9Ll4=ANGtkrlPxsHp+ zA3P*M007Eq;wLQ-5^n%XfYJrQ*a(2qr|jnIE*G3U$!0mpgPj0GohhVj$?-lA^e*q@ z?mW-`+v=eEj6kNmVXU|^tnG`v>3lxu6y3WL?&=sUcRz(>Oh!^4Ef8aB<1DcV)1A^p zkkrsj@d8l@7M=X3ctt-JC4n~ZrZ=-^#;)jCO;6FoB-I| z&*5zV>#W`eFxW6ZABZ~aDzWhE8wluo*1Me$%Rcz;rCz-!9Cs0Zr0$b=<-t z3Zd%>q45UL1Ol)GQJ)ZXeGoB?mf;-JLOl>Q}tq^Z4rKR5GKku#clp?DHKjxkggs=bw5z-}{(tAD42_XgTzSsa^ zK;R~U0>=a}K+pgJfk_0iDi~3sfh`IPCWy#oq5+2+BT9%U#ejqat&+4NDAK?fm81+v zA!DH4lrav;C@Hw9lt-RDef|U*ROnEmMU5Wy$Z+C4q)iP75+=xiu&2RzatgLc;X&L?j{; zAwS#ojHz-Csk@`>EIQLh528dy6vSRiT!m=<)mb}n10&E-B{9$x%-kN?7( z7x>ToJ@o7gqAwq@3(^2V3^Wn4Kwy4>2?Qt+KqAqAqRl5RR1ydzih{Bzq9`V^=)s6M z(_#yp5^zWY`y|?gvjRV3Z9#!5l1M4?PDC-qqU@PSJ&E8$555zFnM9y+0&%CHV8)6l zD(B`Bs79t-X=^I4)Izez?SNFVNhhC-NJfF&GvJnjuImZQr6TH!t^ted2*n188xu-1 z&qPzopRUtVxTx5IYOb{+(yAb?ax?%r>NeuafOY~220XH$668DRqGA#MO+^5w%W2ub>Dn^pY{VC(a%7#1crMIT*?7FaBi<76z0m_w)w3F!Of8}QQVPYdP zd?>p;Lb^Y~ABQ~MczfQj%NH44z1b&Ph-$kWCAxVqdPJ$2P(rMszOOUKJ9 zsbuSUXdMCl8sW59UcL9>)C|C(4SgrRc;mamIU?<*liezhsO25-E_S7ms{%g)SlQ}i^XTZe*5u4Ku!2#wEj`_Jpx+*^Hrn! z@oI7LF&h2)w-M`^2tx@_N)Ql`0Q+Dh2pCC%1s|A%;B659Lj}oT2p=fH;5p6!7&##d zIf4L$Krna=2>=p$1Aq+D&@xD9$OJQpfD0Z*g%}AyZzPz2AR-}%Eacz>D+mM&YR`rM z_#g`xazP{#F@r7a-~~B&LWCeuiV0v10-z|yg^V$bW-KEF!`Q_Du+WWd1S3NLFu^$< zhK_Osq8#Z6Mm~>^5DY~(cgk&QE4ynjQF48iLG?5_@2}wypQXpcC<0U5v z$bvj=N>GYbP?8rB0r~_ep_aF-r393ql3H>^3J#Ib zFQs5hTP8sYw=`xFl#qa5_VOiKKxQ$2nM?`w(wM^kG(Z%NdCUiiM4QMofD#d4O`6D!DZ;8QJPO@cGsO&!zxdM!=f| zp+Yz#kV|7GU<&?Bf&!$#OsXmXtRNA|Sk;P=$6y47zf=$kBQO$&Fw+2AJ)tnE$_Y}~ zhME3+2}UH)uB!HOtAM5GR&A+E2?h3-R9)u(V@1*mC6GdxU2W!8m2lX>Dgh*74QCY0 zI@Vn#z?u|oW;3Ip%+#KfwXdZpF>lFEV_FlVN;vH~eJPL!$#$B@tZhT3$#NgR+s-AvWamTWM(pUu==#BkEz;_7aLQo za~1MjH_KsdQWYdoxbc{oZ02n0(yDhQGnuUnXEiStu%gW?k_Ss>6Q6Z7ot$O(g0>uY z^ocym@Y{Jwcep48MM}R=Tf{ulrONnnw#gJpAr!QcB~&v4n{Wjy>>-6I)T0%f*+M%? zBLSVXW3UZw#~75ric@bv3iYsuOOQNQEp_}!u!6#VQb{d%vk9}5A_}&N zb!F|*iY+8zt9WHaIamP`Q@ffJs&;i0sGS5dT=t%76)Raq8`5wl*Q{GLv5AY>?#J5l zmL`TShLL<}c*-`Im7R@uWt)m%q^uwIY7yAo1c5A}2oW!6 zsue&ARwSSlCXoWQZ>`pPNI?SaSh0icA%QJan+v4aGp1`36MVlU*Pq$MwiJ-+7AL46 zwBE$1KU3|eN4%ECBn20SO^Q-zW(%XJ`(~6dZp#|;$_+Uv;B(5(H)r@kG&Qq9naNGY z3iH~>wCX&W$xP3J6+w=rGMV*^*}uNH#6n*8eeYaWk$4`@o%g4m_iR_kcD^;cb|z!D z99RQD_VFV@a_AqF__ad+9?1m(El$If08i2-y(_ZIoKQ{{=ootCzdF9l8R!#OdgRo$ zKsv)iDi|pgfeDHcNF!{IZVhu~0xEno#@;*4GkE50%Sb|{507z5JqKmXgi+5@cGBaN_=f)y)?E#L%*Knc4e zH_Z#Ft=co&gE$ydEYb70&>D$?P>@T@x;?ukce*QnOC}f#C``jQbMrfhi-;L4F?ZT0 z&_fVmV!eZ_tI)zQ6H-Es&_8zLEhD=;hkz^xajb~IF0leaGz*g?P!r^Uk$?Dwrz#rT zxfnD_808a)VR%0O=pzm(sXpm5fWAnA%HSJ}P^%-8f+k=BMi7X^hzLfILY&xwTyuxX zFty2OuvTD&$odRM)Ie~nwp6pM8MHqGGp7f6Ke4Jcfq*({6Nph@vGQ9noG6XFYK3u& z2v8%1scS`2$PqHgwR+H{21@`=h^;N_t=Z}(AKbHSYN!?*D~|ZZ2f4D%dp#%=2-0J? zxx%Z0(53|VvDA}1r{gLkRI7prGQ3i~&#SG+8z*8aD`QNi+FQ5EQ;D0~tb-fJb?m0e zE4^^+G9`;f&}%%fGDl~+japfhI0-N2$(QkB9`Qn%xmX4sX+v6xKBrj7jhGM9dMkW{ zC!i3Cxk>>4W~(|4vnQ&mh=9rsSJN;~*t3ijr>g6{*1#aslR#Ulx=p~X3V|kpFbkaM zkOa|$$-pyv3cRqY$;xU2&RDT6_$sTitWmJQ0HZt-JTj|-$7>R-3S=pm%Cc{2tg8C3 z7n6`2TgN?HCkF|>a{Ro5iwG%0LT-YrbM&_)o49r2F0F(s;+nC@yDhCUw{BWDa|*3I z?6)AaK_$DazdNBg?3N;l76T}`gtU}a5(*i?61(Ant=AC(4s887nTt^06dPJdt3%z9X%MhydnVEz{B^)A}X6Qh=TuK+ZTO z2^g#YN(3@sBu%R9H{VN3y_!aWdrLRlr7cXd+>@st3q6(St=3>hv-~k;>LxDBrrBGk zc`~yxyQawuM|6Zof@+N)L`e>-L3*;eUfiZCJF@WnrX~IRqIr z;RLo2uYwRSs~|{0;0AL*%!bh)sHqt9D3=y-7cp!!E(wVc;w}-gHkoP&3<;r#c%Utt zO%L)=6(Wf)d>~tTpbtyYWeO`1iY$nn(F|H93d9hz!mS91x6_0?Gwqgm}$Tn*M=)zxC<)m24SSiRL=ZKGse)nRqj zUwu|ty@=wwk|?oMDA`s|eH>Ed3I55@Y>fynpcP|9*K}3ab!FFfWmRXTRcUS3Xnogu zrPpc2*J)*;du7&pomYHaR(qA!WgS*&og;hoSA@-1S{+w8ycKVSSiOKBpAgso^*U9F z_@GL0*Nx3pgXP$d1=)}l*^wnyl3mzI;VF@6*ob9W@(9(9kSd92od0ALleO8K#o3(I z*`3wd>seW+P|TK1NW-B}@&F@^<=LcF+NEXMrnT9K2vFO3S)gc0p;fep!BBE78aQM$ z^^yp41tFSM6sINIvNhYYJzEfJueB}1iLeqgwA%Y=Dt??Lt(C7Yq*x6-p%JANwDsG+ z1>C^h*rbUsuMOI`RkV@unZ?`^q!<P* z-O(l8rB&ObsM^bU2Ltc~Z!iS|Fo#pvh*I!|Qs{}Ak0|0xY2!wAWRAU7I9`-V z_}`{D;IK&0snC&)@QMV*5kmIdpfF(zZrIY9V<>s#R90nU1)(oIWf4x8o(Kj&{t2mA z-#zXM=#b+7y=4IYia-YCU_OjhCgx(cR_e3cR~`yL$zA3dia!Ao=PSspz!PN{FP@kS zYM=xr7UrXvTc==?_t{}{*)4m zE$EMKWC~v4Nc_wqm5vBZ{$Hb#-ltIpXO`=^E{doE;$&W%O`&R<_Uq3EUz~P1c$wpb-iT>1 z?4P(1V4jF>APeX{CBuve#x6|D2I%yNVpBz9aNUUiy*6Ud25#hiW4m_PaHWgvnCFSW z3bYnviKu6_=;etJW1rxPDs$)=bv~5e-Vg&o(OCqAc;uO z&q(Ww_6R&)nc4o4+`aDf`sOC~+8{m(-)3a*2Jp%iZ8RCk%JyZRkY1E76vk%nzd0G8 zzV6E<O5XPzFUvkC`Qo@f_$~9*>Cb)Q<5K3EB&*=BRCt;8e13@-*M?3Kkaq)owMB@1W*A5Dm ziHI!Th)ef~ePJ1kj))pr1o<}fGlA-fXmiho^j3e`q2TSZ$?H=$ox6xo;x>RrA6r-F zb&}QUpKWSd_nmo399hcSiLjMb$M9ZfcICaK#hF?}7xv>(+!+T7T}P8<*Y?5vGo#q@ zY2TPNNA^&L+2d38Dc|;VPuDX>if;#ZOyQYRmYQPU2y8zSb;oyBX2M2u_jhj^!#O^I zo<5;@>fyeQb9eN7S9tLSH0W7!`GrV|IKKY)%a>l$8ac+0p8D*VO z4uRh2q{r)}mwBdFVWY^}s6YCt$L*@8d8?Ottf%^`=lZNyk*bXsgx~d^H+dd!l8|Sw zMX7nAz2TjHOuhJmk|%qGFNonebZLkBPeqC!zh1s43bD`jx!3rD$RD=Fd$+&Xqh~KL zT>BGI6S39YqCb&$X_M=4lzVWLoqrO+AN;go`eVn7x4mo3X*r~CSV^1MyT)~Gp_Bor z+tk_ek%@Ma?_SPd_@8fFiluk|iG6+jhFfEghz;<4v}ydikTRMrent_wi2t~i&F`Vm zd~>#ay65=eNdA|{`SGw`M_K#ppB3+CcZr~VzMg)3Cwxlbso?N-yl`&=@U=Hw-sbm- zKM0W3w;$_;xq6rT@^5xo0f+GCDam@;R=BuO*jLy%W)^6Uu_0MMX9hY~Gn^eED#N|!Qi z>hvkps8Xj=t;&>O0(%MX`RvM*i-aHs5-2gylHtH40SqL0*%qRNgbHRVA;Ze03o;yB z{-K!?ray>(y%H|$^K4=Nt_JRX{HJ)aS%_W?Q+8?fGUm*hH*@an`SZ|&j}h8D$+)tC z2?saAbR+W>W?;2gFIRL zawg=@od~_@WluRx)RIXkTA5KolVMsInWdU~DymZP z*It@1)#eb2s6C31MSc=gC`?f_`6)~RCe+cWz!F5G0d4Mvl}xj$IqI2cmb6`$%=(ln zwbfdS>Op$)NLh;@v8JT1jv~Y-NCNpYyj2- zDfyD5(h4jShXeO?Ey4*aEFMA13QR>zx}JsZKasi=W1|oa+Lf^f-KL#{F;#ldfwxlj zuS{8u+A60151n>avW#rmt0MP#`4N=t? zZ4xjx6CXX#`QokpB)q1oqJw0f16q- zk!dn<-5g+h9^|-?E|C!v>x8{d(Ci7-j*&gF7e?piF{#}9cD0>_Iq(q{e?0QZEAMZ| z>WSuRVVev@1}XolOOQLhz;25x5l~0GwggFkQ}`44UG&{B9+W;t`)>C;g_eUFtC7&l zzdZi``Rl(w|1y=oV*d~_K1RJnAfvb*VH6ND+BIw@ax=i)B!>`R740Sul-2(zBfnRD z&2;n&AP7S!!Vw-X02;dAvko$y71CsYH}M{ol!n5A2rFy%;tApoBAdcM&TBqFfYWHg zHR5%!h>;;75|gOJB~AzdlyeCYU9tqqtc890N!dZ*M<0y1qlW?L;aCphLWDT%AYdE_ z7qW)5e%-`|5D7pAXEH+}Zi$I@ydxg-c#{M~aXYu8-t6oV#3LC%cSYNRyO6XjkRbAm z2|3?D{6>nv9i$a5G$cX%cDsbs;w7Yb9VBIPK{i=L3sV?e^5$5Ri9BYIdVD1;V<|KL zAbP}AuGCOV`Y1~~3hjx}@d>OlRhav!a+k(DCNkM%L>21MdCAlc8wFO(o9ObH*1RS* znKeYhR1;IK%qCCxB*8pRlaAm#CpxW3ONemAnI;P1c?k2(Sn@5M)66A7PLs}k@{@^L zG*UVB=gxN$w3{%w#Xkl*w0v%=o%LhoZ0=}KpR{ry6YVEPGkUh>F>@;dbDm=|q?nL4 ztv260%RILQnUI`@BnXvB*bpK%izb9|iDBq3ix^Oi^0cScv{HNYc|;X`P)jKUi9S{YIh$Bpxnp3U@_9dMHVG!;5pI@Xj zO#$8OO@zu=nzo80Hp%M!t`kqA7PhpeozOowyUYpUv#oNCNgp-ap`DfPI{M7zSN~=r z#n#oTq%CUv!iuHS61TW+6>d*>`=6Nhb}=m5tMFi}Gu8T5w={8@mDr;*hX|IsW;u!c zl=@bJc2zsz#mN0+Yuxp+7a>s-E%a_0-|F(Ux$YUBeHqIY?Fus{h4N)BWr|bGDmO?D zl`LS-7R6#F6|U`lFob<~I!Gvem{^8T45ITB&_Luo5chTW zw}-x*ON17qNc)w%e`T{_0zK$e^As^hUNoZzhEIebZE83+v5q~ux=!-s9_=t3|6FNB zp3D$2mizPfSgmY~BGyYb8I2j*!)F1Lp%j~RB_v7xX^fQN9um3#$F%2E$m*=Q6};x6 z;nL@dR=9$95NR?==vvoSl;M1HywmNHjMq96I(Tn8;!EqwV9pu1m}<-6@dlIEg-;54I!l%RXF_

d00Qko-SvISu8 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

umIMg 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

%hM}rGlXx^L4KUV{r-(%qf z6e{O}LN3?+^p~kE7Z5}I8j40d%w1RZTj`x{UN|l$?OG$KTaRh6lYcVZnvw8 zVW-q$x>+fd#^2<3G6^4%1b1WqZ*5`7rT8hx96Q)7-F16FG7yrU*Z%fKkXJ^eLVed{ zHuXcQ#t5D9nB}ljo@w+|@{zcqy-5~C5ON5xLGQ-|W?n2Ahj^l_5tA#)pudsr2-W6ZBnYxpzLd^_lBZ~E6=zuTR^`Wi5{Tb(j>QP-69c>8SrS>tNTby-;$Zf0ZCyi*%?Wcb;^n#-U;wn{f}6MAJq#@tre0 zn2@myK>{6vaOx>}cP<}ma$7n}>lG;DB@nbG)&4I~7JHJo*BwLt%YHdZORc`a5)&j$ z1}ao*k&ei__?&>N)8TdT9{PM`Y68=~d5&GxEdpV0sV>zXr4~1FfMa=_

K_%!3wb6o>hpwu@_v1EMC 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
  • vob!1O@`0>*dK>RZ>P~bp=1q~idxX=K?h71Yb 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

    7$938#B5_K2hLV4^mV?v@tvSko3ce2ZZXcAg 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 z zBw7g)-R~2x1t*{o`0&2-hq@HE{=9G5XJ3LQomfO(9Ab`$#_uK5! z2dqRgs?dEqPW@CKpF#6ORylUR96uZ2uf^g2o7%&vEzxukWYFC&QvnJ=5XE~%`D_C{ zjw5|KuercLxr-)U4!2J2YFuyo&%b}!ihuZny6HSlGH(D?3?Ym&6G&#|v%o-WZT|!$ zZ3MOdKtNhn>ct1x4=T~$-hUFI+V)GZ9~fO-#+e9}W7i}U@tZ$MdC$YNg@3%2Nt3k> z^!d3}q!!z&L3n=fC)^Y1{vN-%9}(Dr2=z>|zL1o^grbjNL2zX<(W2XU4&sJuO2`S> z6!gajnDY-1j`#s-Y?Wl3cEV9TNX{6il@r$?D2JdNp`a3w5STlCLtB4`@7-}%5EE~2 zr*jzx#z*@n$>N*X-2O#%IvVv5;RBti?$R41WwQ`5#5jO8_8|rX3C

    Y<*9ku?^t@eEUJAH&`I*JE*YMiUZxpJhHR|QvP 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
    h0^kBUMx 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
    I^UEOO5m)39kc?X=hm;9G3dSTe@~n0%mjc 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%0AI%v}yu`vrgL^)mEF-y`y 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%0A|lKb(w}TKgq*oLTD{l=Gxx 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%0DuZP7N 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%0D6Nz)EAB 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%0DKg`=LAl0$)W40iF}QQG=YX#opu_ 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

    GMo!=}t^FX|=B010uuZDU@n@Chg(HDP2_=E?aaY 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

    `}sih%rLQAqCvc23*If7!2i_&WfglTKoJd%kp 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

    Dhoe*79j{=jFwX?p*`hfHKF^~ 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�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

    5QeZyKKE%sm%f((p)hbW<-67;h}RD@rqU0 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%0ALg24e$A@ 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

    Pl z^4TD7iboYIX>3FP_==d2e8UW%ABem+ADiE8YEKFOJt?hnedmxkp^I9r0Mb|&YU`T^6cqzV3Lvq zZC;f5^C;4!N_i4(+R$l1q6fV!t!niu)~r44xiqTvE7-6Yr6Tm|b>i8BX$cAx>-H_& zxJZSHH29C~z_knU%I)hnEZ>tt2mdW>_%P!ChaMr044hDJ;>eO&I<6QJazV_KH*@ZM zGzr&}P(70_9kc91&8HQrHtqT~Y=(4W)2D6ThM9ENKA|kYfkL4+J;)_GpWspt(Ms2|4UshVABAIFK2O?!0?br~SYT;*QMrY-y zrcO|LX}}eD`iWo?2qh_zk@pR%P@n~s;vZ*pVmOhbhKU&Go+MRj09Ai#8lRH~*+dsn zhkhwzL=iAnnRirNM9DV!hSiZgJXl3m|maDMs>Xv|X`LQ<= zy@VnuVYLI9F<(x$FqB;a()4H1vT(ZxrP3s2On}p~sB! zC?u~)mzd>LDLYLYXmZw+8bJ*kBt=13FBC=A3T@&mLO>JbD%Ar8%n%s}Aux#+1)bd_ z$q2D|wL=I@p-Djj_^go52km{(qF2$nG@MTx9-DF|MJlsGAf^pAMPoEBK@xpqqy({A z55x&VEE-@B00ez)P~Z^FJ<#I=iA~Vk1%(cg1Pc-C5E&2O6zj-cI@asqy~7oNg&d7m zP{s?zPLSpZpj}Wq3wb_}0__+z`$eo|bbLXK8<2WJqcFr(8wHX5P?E2k&=9{^=Bc#Q zbeu^K~gcoAqFks#Rf zADFV2kOvOLdk_f;n;ICA0Ibje3*25oglG^M8bpf^;aA~I!n=hW$%%fP47~E#Mf7~h zTt@+s9U($Ph&&G>)@vR`i0HuPv7#MhGzeD~nUIfY&SeRC*d<+<6!@J{J%2o9ToeSk zmrxOi6=@?z!1zD^MG~ZRz>y@9Lg|neuBae9#Nb34hD(XK!;bXZ(n?5)MBwZZmCi(p zYCNbBGLV9f2MnS@Y{A8f*pin)a~nZSMInT6Pm>Ahq#SAa5PLKdA&IOXr1mnkvW4+i z&%CGLQlm`b06+q;RAWQx5s`a{vmh5F+Z!d)NwZmGks^$zr+}oQ;6)Tr$Qv>kOZ{TAozI92+OhsF0Fw zu9p`f>qE9Mx`e1PPG&vpMclL2%_0Sga*EQFUPh|8NHsS3!cjgidXWn;h)SG&El+AH z+PqvgDYZ?E1_*LN+rqZD2dZjmqeIuUl-9Q{O37`dQbM{Kx49XK7hFMN#OSu{wm1>4 zYGDJ}Hm$E@MypG3tn1vhR+XvuTBek?6W!vb#C9Z#7kecmGx73-zNYNrc=HPp89vEn zhODnAsawh-7LG8SNs?Gu5?Wa?Eh6L5FN8NEDim3%xa@iEZ~FVF;Nq8jbS;#ClN4W9 zT2ZtA)8$W!mTA-ovv@VF6fkf?rI*14n3=_?Q;l70UOwLUUwIkvO0X;B9&bdM``qz* zY?9FyGnpVSyl`tx!o*Rb$i7p$ESl{56Qb}=y{?s)kKy^9gRHp8Ek3Z%dYWjmpb6uY8~v?JfxKNpTOSRgd0C7YSWJ#7$%2K?ZU$;ZV=5XC-Zo1DJrl-*m~ zdw6ppR}E=PK2g!P0y*JpwI)WS!{%SG%Q-_?E}RF)owSY-#b3Ft-Rv~5tS zNA2*VJFF+Ya(ansZgcXwx5uqbi^bo4azz)C)4ek1m+hsxKq)W07=pG!UjF7y)6*n4 zpZQSb$q;~6WJ84Bx^cZ->kflzpgDoAqAEDsiR{(@t&lq_v8o{*Yh=o_ZYe_l_N`2jPxHYqJ6Sw z!g_;P4~;p5p(|REe3^F6d9ApI@(0q$dzd2nEP~8jkzEE`nB^79Z-u{Z;R-Uy{$Z2V zeL-~U+CTi_Voo&x`?r-HM%?RhmSAUbIkzS7=UYNdQ;092}t?MZAzbn4EyYQUzxJ6G7yQ5~_|w zlvj}b!1DCnD#>7kwUwNqhqj3wSmlID6$JKpMG7?pEF}N{yxznaz)KlK0&>JFNTC6g zA>ruSKp>mmDaD0o9TxhL;2BC60i7vz^RjG#d<;sp)h1HRxu zxFVPVq8IkzTH(;3$Qq-pid{SyP~^=)OycM0Ao^9|Xtg0j4TN6}gfarq1Dzj2K%SF9 zA?3l2pbefvAR!E8Ttj%10bSA=Bx6Eg<3YR>7S#t?{GBhVl_M_yRRMn171Bin7=<|& zgbvM{+;q)Da1Qm*p#g}aLU>L=8Nlqw(j{4sGX6{tnGQv;<3qeuJt~A6HiR022%BJu z3zkkJsT6P(ghA3>L8#z79+ei_W1>BZxwsvX4a7+Xp+@hqqeI}NL6o3u zk&Z@K&Y>}cEgFDll_ErFo-`JOvy|WyirY#$*B=s>>T!fuG#)|x<6BY0A}J#@8h}L> z#6mWt(HTSvO=Cm|p+z`lLM$Xl=%g4DL`PACSg|DxRwZn;`pM98cf8A31kNSOFRcz>jZac0#1CP~ZM6=F5Me_o zq8v@45Zyz04U;0yAwf(gLg;1x5ClS!Q$c)e>Sobk!<9&s z^&f`Nh0ZWm=hy>(O2h+Q60thaCE0^5w8I9Wl$$;4v&NlQ9$-5p*pv9 z3s+#Cl+=Se*h4)O=LSKNf#TltErcf7LavJcnU5I7mg;H~Rq0>8Tg3J1Gj-vCqy>)R zYZLA0t`RJU)E~kM%ZZ{S=TTfiL;)Y#$hRm{f3 z(yY@!$GmJ|gN=$X&K+i@iFNSkN1;T~R^GIY%D^hE;k*+QwFZspp-zNHH!falk_=vG z2A1hg(CpDZRYrl_tJkJXg04j2<)J*mES22{xn;(fdWVC2Y^7A~Obkd2*4<;AUWQ0W zs#M9-R+o=jnwE?$(pc_y)$Io{=zs4FH`5eWs{jV=i_oC`-prdF}AAZ^m|&Ydx^**UDrQk3HC z>(mCaOJ*)|x-mqhR{ijqktRd}Ai&!+@*_Jk>qxTMP_j~5G9*uOByX}NcXB0j@+W)p zC4=%Pi*hE1GAfsHDxb0{w=yfgGA73|DZ}zC%d#ok@+#x9E9){X-*PSgvJ|+d;T|t< zschdd9GDQIAS2W7&e((xNpm$ij+6^-*0m-COA zvq*>-ltC~K(wCWlaF3Y(O#P0Qo#rfgc<|XCD2f5@IE75(+GyluS!#MSXSuT;PcAf1 zUhHObPhd0oirqw!?vGH4ip(=Xn;E$c)%>Mwce%x?Axjq;?&T{6`*I^uH{3avv;ZABC*#@KV^W2_JA!UAIaM zb4(Z9G{an&^fyCu_Is-YTl4R36Sz?aSqSfOci)a{^zUAZG`Zj{tM#p<{cx~iIESZI zhJSd61EPnA_=bUi?jHO`|yj)IE>G@hM%{D|2J75uYkLRde?=O^tqm)NEl}~w@p#4tX%Cr<8(_{ ziNTf2YL&%4;d5u?xSem-{no376z^V8$~7M}l8+maOZ1>q^P|hp9$8nUW4dKl#6|;n z-5D|>Z&~`Ld5?d3qsQ~M(I0~y(UFsGN>f|>68d=K7fZJ_?UKxZ%r|*FaMMu$?S>xsN;K5Ibq3 zu#S!Y@NRQS5R3QVCHRkhig;M{eH}Zn7;@!|Gvd^0=X&ilrBHK3UVSo1WUquN`e z+}k!h$3e7QqcfvT{5`I-#YgwU%Lv2ghr^dO#49|=W4vC3{P&9aG_!DOuQux@*_S|t zYB)8F8~n?N3}XEIX*Wh0Uxv>U_N4thzzdRx>pW^dm}&d_X(RpXUhqVOEmIkN)Ma>V zEB5LF+LvcJmS;WJYq{5N{nv+i*MmLTi~W?(+AjJ8eXrq92S*pK+`z}W)N*>}j`|^= zZD=RaOAd*i^}T~bHQ)dJ+X}wl2fpD0KH?Al;VXXP7k=XtKI9)h%0K?%J3ixIzGjgB z+Luf$_L}x(Z+N`f`-Fc|4#U{zM>|(PebuL(FzS1V5!qGGuoM9u?c17a$2AQ%m2|DX zb@zTEM@5~**pt?ems(0w1V2eQ1?mq(@w@xa0m*k~$nq0>nJdj@>-6v|P4nLy@I$}y z6Tgpe|MMSB^cVZ@`@Z#;oBE?a_EUBDFO}%Fy6E49OtNvQt324$z9;Gb)k_gT{4+3+ z;J|wY3;r^Q(7-{20vSe>I1nPkdjcJ1oVbx=$BqsQRx}{8BT0`0O%?=caU{iqDG{#x zr*R=gi7Ok%jEJ+QPL@A?235I}DA1us3G&Q|wC7QwNsB&h3YFID`yt;8*-h^tigannq)(mZggRBK z!G8IR2F=U1@5-k(bN-T8 z*QD3NU*lJ;N8Tj5B~NXoMy_wR~3Vej1%{3wXLC7hE3LY@zqp2Cs)p$C1bh~ z=bHb$PQE&K;ONV5Pj8<6diCewyN};qzWw_6-{+^Vzkht1yrH%gY?{e+o>?*l1{_vz zwFTZmk1a>uRMovD(SjEi*WfP=YM2;@iJ>)IdfAC(&|MHMMxaKtVTW3PaJ{EhSy$4ToN z=vs&R3e0OtfgX5LLpl;PTwn)}v@Ayri+gK;dunOoew(>D?4aHy8r8hA0<7}NEVq2y zwRN==naeu;qik^_#uQ(@0WNw^nZrt|Tvo&NY$?UPDNLK26Dy=9vqbGGG0r2u_q4){ zGWp-65q}w1V;NtED}=(P3f3*aMf?xiIG0uD!eAj+=v=JsnBv z<@er-;Y~N;arb>V&VeU1IOByYJ~iZt3%+=vfj49`f`6;sx!Y-j9^B8MbJ=xTXyZ64 zdUwVuGOWL;&DqtgJM8LpWkG!GiKK>(QJkdZ`?b5zK58P{nCUz_My=j{I*s*;eW&zyccZfCx;W0yD)m|2>L;Te%tp7ibbN1(1O+QPTt|=rrTqu7ir=9S289 z!V;SBgeSBaS8VmazAPq2nA+e6Sti3Ub?SL+0bmZzhQc2D@P|ND*#-ZDSUn>0k7Yyr z6#d{=9}i{_ej}t^|3Wy!DOS;mR(u~7wRlAlZZV5s#G)9z*u^i7(Trr|q8h`PMmD1H zjWe_u6pcv7I@-}BNpvDt>Q}=p-tmus3}ghIwlqBo@{ouupazL&y&n+}f_+S+BqwP^ zh%vG+d8DK!H(5OVF|U& z5_F&jO=v+Eicp3g^q~rEs6-!X&u2cyeS18m`pBs~tj+VIAjM85S0cfXn)IY7O{q!) z=`Z$qa(e0H=XeByysErTPMn&Vy)sj_84eU>;a3$&#xk;F(HZS*p|pA zlc}(o(Y%qCu0+}_A?mb;O6{OfyIR$<_O-5!ZEI%>TiXB1wz7RHSE$_Q+J3sFY6WaY zBMkD6cSu&U(nMNb_K8vKY?hr6I+J5MRT#ur7it)}Zg#QTmhQf)L|#o<%FY?u@|Fs+ zPnBwJ1DnP$jTBSLFo-Y|VE|z;LLjF&u4Hv+Najg~vM@BNoUx^qW!uTW?!Uv*i3l zr^XMp6vMJ~CHb^P%UHfL$3E^ckca%^`|NH%n$xlNsK#W#>7>B>y2v5~qKsh}U>PSi zu|P^J2o`&JLIFid!$3umfcnz6B_+`O`U2%IFOdJtPu?z@9Vi>|NCmUb)D$r^GUY3i zn7$_=y8a*LmM5b_@b+KUFg!1j_Am4EK?h<`O}^bwd+LP z=~0`y)E+6MPw@Ozbb-fa9nBDkajYHeT!R@GiSLz#v5XQgg4b0xK(IwDkQ5VIlJet9 zZoJ#x3S!DD{QV$d0SiZJ7k1j%E~~Y-oo%vuyV_GM2;TVmrm$)ojOKe*&?}G!S8Kid7C)Ueiq0u^lfi{ z*L&Xv81%tI>h3{)q)cyl+wz>eT)Vwhi!T4h?Y9fdwuIEw$$~MHO`>Y@m_sVFGROJN zZSI?y=bYy?7x&MFzH_4YT<1pzI?ToWD94?<=`=MS(@!49t5j)a3n$8mhdq!f+j}4m zR|c`KEC>-VqwK}5@5U!7a+b9H!VdHwZ7LuT3kbvtcelGk@NSSQSfL670lYz|KmjTk zfbfQ=!UU*5g((z%@sL-%e0Q=dG-uShzJm@(udeZN{_o*NL z>sfz!*At)fvFE(zY2SI}U!M87Fa7`JpnkZUBBroj73;H(7YxP^oC_$Cu|a@Zw8h^jD_O@K!cb*-NM$Le2mxpSXvd3OrV#$efG^00 zVpoe*$ZPZEiZqi&jB!D%qF809jMAuIN#GC7h#}JhOz(9UA4p$7zhwuF)xfLnKQf4GmUL4%E!D>UL^>h(<^!HOB702x6A8;}GRd6E=l58Ki+ ze)Mc7n2rSLf8r>U0uhO|sEd;S_>x;ziw>uMM5qjRIEf(FikaQEL5*IgFV)BNJ7FTcjR*NSnZ)InUzo3$t zSa#nSf+^N#Gg*hkHVl-=l{8aN|D=I7<`7zW5nh0IUl5fG@dgIq1`?1FbHJC7=@$sl zW)t=j#`SAusernunV&e9J}FftS8$j0S0zyhd-_5Rjbsl4q%QRi=x| zP!Q8lb_fV@JgJEZ`I{^MxKsXSFHxjU@5N^<$CV>RvIiDHPo;;*sIx;-A zsSqp1nRSSXM%jO6nQPxTkCe!oeMp1@@r@_=jkZXiu$e|JRVYRDlqQ0kTJZ*Ma0db* z1rYk7Ix(5|C^dc|mUVcYWl5SN){x#P5Uo&bC)Q=gmXO9K2*SV(=_rf=X^Y?ajRgpz zzQtWN^FCeW6oZKoUSI$MaFurepFsMgB9Q>X`CYBnD*fpY2g-2dNRBKT5%VRW$}pFu zU;yR7iznKaVH&1GnVDhQ4NwYPxb-w86BvS3AS$F6VS$(qu>>ON5Pd2IR(TN_u$ylR zq4t?kI4BaQc@TL2n086HnF?8x$>@imIjQy44g!dlRu+&{){s95g40l_IF%myX*@4S z6^n7CqPnV>f&_?>f$DS->*#0x7GGyqrUo%_$#`PA_-p?;ag?fMHR%v|Xrr#cs?MTr zo)R$_imcAc7E{_!vv?4uAPnC)mqA&JyZVUmXpRd?sU>C)+S-oZ8j8lIrVV+A+8U;; zx}G8Sdj+!h}@bQEBc2GaiCb3i~o8M z;fafP2(@pTbxoP5hO|fmp{J)Cwm^$PDnXr@IH}kv5M8^FYL{ZCnWnk+hmV_tfd;bd z%C0j1T8YVagMIso#3E>8%jVU2_Ue!c-NiYCv1?zz(qm8gZy(unBD8!wYe! zGt5CHA#zjowGLqpnYy))___S65T0sme#^qc>af$RYjudJ1`r5l%8SVex;FZ^M~tYk zslW~~00toh0T2K|AOH+J5K9UGa=fGi5vT*v3Lg5R8ezDH+Me|=5be;IKfEajpafd~ zV8mz4De^gIe!;FY+qzn194vfpb=#t#HBC_32Ojakjw+Y%v+Gm zwm=GoY!Jt60QNZsRw={+Q40eBi`r}eWWWjnu?d=Nl0HnRL@W?n;KhyXDeFr;XJ`~F zBES#pw+VUA4dJI>5 z%Lc#%LqG(*%*z5n1OR~1CV{Eq>=4sD1*2dP?vMcKoDuaf0R}+^mZt@mYY#+SR5D8tz197a7ScwU3tt#Ax0}R8$kPP%345zHW zq8me-H7Ke$N5^XrJiHJ>Fa*2I1Ovbba;(v|Y}N)a0K2Ra(`*1<905+t%v!kxr4R+< z+|3K&p$SmPlF*nQ+72G7(+1(84v_?YtPmzi3M)MjitW=m^$|D{C~ZQeP1R*doeU#p z)mGTlDRy>88@s}g)Rr2lZW_A-vDyacu*&eyl03jr%ETnnv*l%UE*BN(>k#*a$3vh5 zY-|v_Oaul10E|EcN-z)>{SrM5+19KPd=1XYya|Yn09`xX15pa?P}A)H$ znJKZgM!ld|Er9TC0D4Q?3K6Z!a2Me_5S$>}@Qu|+ZNej_;;R}VLcSQUOhNz<-ZZn^ zCVodkjuEF#j$rI>ld#VUVXc8y$_8MKv^`=8?T7cx;<63K^qsTg%Yhd35;@%Dg^CjY z-9l+%5)NDDg7D%luF2eBqhMUnFY9mrtiPdX0MvlgmuzhJP2Gg5NM=e=leTf zKECTLbL0zw#|{w$22tWwIS?D|5Xl?>x-Jk(AnAF05TwAzhini%odD-95cWCN8PN(% zZUFO+?bTC1ERm4|aSK@ex2IjBMJW)R(1-Tj)VvtuUz`yLoe@(mfLi^eu|q$=^f2F& zD>kx-5o^oC+}r{I%mx5&2hj?{+zLI&3SFD9NpRDVZ4e3n>)k0);K}^hD_shcZ2%Dv z1ShS>F`p49eGssC(rcao;+*e|3;+VwO^2eaDnalvy6FZn!tx!t3gHh2+t_zI>MGd^ z4)4NOp1$t7@df z5uM=h$sXVPOYH`6>QQcq50TJpcn}M3$$Gw`|NQ4)91Js^u@?{40X|i3pcEoDtug0Pb!O zn~=^TxtoOD3R|$l20#ke4ESf909_61*n!0bzn1_p&A>o{1(yvJ6im>-V1cL+OjwYh zD}@p*8VDpzkg$s#J$?ikQshXIB~6}0nNnrJdj$VodX<(p(1}H{MxKLQejFp2KP^4J)Y}&Q|ZGVjUvZZbV|62A2-uUswE+mx*5ioXO zf}%neSUnm*h=QX71zat;Wom#3r0N~H@EFhBu2+KZsy2Kvo6f+90%IFGuSY@^8v;>-ZfCg~`cQV3GUqSZ=UCbohU z;wZz^UK=n)6$f;1q!wKY4#9yKw5YKIJ8G&qOm#HP>Xb%^+|5r%4|xk|-hr zxZ!4@g}5{zs*l=|$WM#PNzDKf-9)tiOgRnX&7&n}G?2lTnk+6+OE1MV)BmcH=uwq! z1c^?ON;6;(k)A|}HH}u&v{ghEL}}52UewW5TW`fR*RlMu2vmuD#Zg9;G&&T_0!um; zLtU436;=n~94NO=r=9h{N|$3cTWz;hF@VPs6xIM>g9R?eluooW+>!(pX+lF&W0hNZ zLlSP*1{t(bSYOBeh^r(xoi|{C2VM-?PVt4YBw0&Rh{QlFe3+bz01b&7%z@S>@$!7q8CUq=uyMQn9s zh2-H+L6Vpk>~(~I());#g4YoL?ay&dD;^tS=}iEkt^828i#5>LTTB!vLmNP_r4 zO=O`XnixnF3?K>vAOVquVTB|l62yUo$0GY#g#<3*pD{3UAb7EeT0ZH-i(FAX5?MlW z2ojVf7=StkSONns@*If_fr}QAnE^yuko{b-l<$$56wcBPQPyK5544CUOEL;y8h{jK zIUxeJkV}iitvn+Cfy*vg0u!=5q>cmg+Hb_kyFDf_BqX#5A^u{KM-pT|VdKge3!=>X z%;uCULBM_tAO=bn1OXH?z!bn3N`h!|Bt(!1R|Y^rS`LIq2H0Uo%EE=gXzU`TKqg48 zNQSleiHIbDizmfE&ycvnBF!8~4hbSNwQRtd1>tB9mw3;CN(2e?YTpGFvkaQ`lz4NT zTKVKyzMm3rYNYz6rnGiH2Zaz=xv3YwbUKhCa0QSBX+lTBkVuJSA}Q^}Vhr_}lA4-@ zib~W(1Xf`HLl(3n04NK5STUD?#&9Gny>>O>eyASzSgL@h=_PceK_A~F5Q6(c~`_gpamqoC`1Hv!*D zrnDfoILi__F$R>bZ%Qz--~DFu)1kW2!3}{h%?vP%)G8H!wOK7mK3biNL|`V0wFtnJ znFP=F5HV3OC`lwxVi@Kp0wu2JMed6&qDeslKuADU!j=Fnzz4)6N#YJwi4s<%I3z|c z2#hWNBE!X+m>?du2n0wX!vug)3PjsN5FOhQNoaC{*3BXcef6T{H3?R=p#+2Hn86IX zF(aa>@TJTwLOzBrgatHHM!$I+A#V61f+g6Nfh1Z5ujD0X22h^z<`Fgu0yJ@E({M6u zMn{2cQoT9jfvn)qkRSm7RRID)KFyUBirOOq09XLHl7M(trG*JKKoDSv0000$)hhu^ zegFeciJ;on@f^slQLV$UjZD|TE;gy<`D=*&MTPMM0<8%WZB!c@0k`H#Y}XkQfbEdf z1@W|~1&tV5pD@>f%*&^Pa9n}}Al$N%>K>KWC?9bmM624!AOzA0NQ=#29=XTDUSv-H z!b;&P21mFO5Uv0#Uq#^xH@IDt5QT_KL53C|ixen6lO%vqkq0mF#P#agr#xKa2sZ#> zWdavPDl&)~zlvv*Fmdd3JmWJgxkRFH6=ZJWZ+F%_yyWD{Gsx_>5K@qt`rCMYL5&3A5<-eP>`FuzaCAHMUmcU<8^2fEn1j`Fm# zJ>>+Eg2nY-WtAV6=q1m)$`?ymkxQhE;%Y59)2OBd_j^bJ=VM9eosvgIVB!hzx+d9P z33$Hg8&~@26|i&5Cnc^5=e))h(DBtTR^{A$RN!9Jn-~MaQ>Awo|Guq+#KNAG3V=)o| za=g?st?Z#ZN^_7+C=2ztGOpS_1JJy;vkK#LJIfop&MQH-Q-Y4mJ5pFcn$y4t;DowR zf@xYYgCZ;#>${{o!W^^+AH0YupaS^tKg*j7ic`1;BEBf-u7F~=DNs27Qka4zn1YV$ zJS^@ zybA7fzLOv`$$PuM`5yuTA;>|BZa*f1F|Tvj-ZcG@D<++iL6or30MM*tAZtnfbLoX zG^7GoB0MQr0xGx)QeXlmpaQ@uI-nzk4aqWVG(T4;kY@r%t!M}T0o1$num>_o$EnB) zE_kMYD2r0qi&o$SEsz3}D!rBTJ&lV+Q+!FKvpl^ULH#4eQN%j6E=OCX;f9sj!Du*pEddgLX)YEvSd5aECEy2REz-_{+O-tSNht3n}1) zy5uj3fJ?q`MIKDRdgQK-P`QCL0Ca*ShBE*v=tnnPf_@acQiMuy9EEm}0PpC_BzUH= z9D}!Phb;R>m@C08u!m;?FkPC>Z`{aHAcMWw$f;OFPP{q)>XSp8jKuFl4^GTPX$Bn7-^1-)yB`nbrBYXv3H0($_-G1vsm%DZhO1(5vV>^c11Y3wpzi5S4umvGKQtepMZ!C)_5K<0g zxKgwa4OArlQ%Jk0vif*V9#p-q8$0QoiB{CU)ic5WQp`a%t+MSz%OcggPb@=-qrLBA zy)~W5Iovxf3`Xb?iGTwRtW3|V@tPKqlgDV!Len1S@yh7gwErW$vU58FBrN4Y8O_GALDAiGT!YQZ)X^cZwC1;dymQ1;_YQaKvycjevoQgb=s1)+J!ZZcJ zx&uvmWukMXMjKR%ZzKgR__|uCM{692XC;HsM5$;jh*A)Xfv89W*brOb1o+@61I-Fv zZO)+MJ2ZW=WSz%?m;x510x6gRgq#9SfY|P6g*&CWB^6TCf?7Hj z1&ewl1+z>!R>(5yw6Ov8Jx$`(XtlgawO!DBiY+)q_?wDE^oz4tKSvw`fil@L#Y6j$ zT>q0#Q#4qiYfiLu%J7_6*44nho7jvrQ&m(``zY$$x%_>}GHpiI(^q7I%Gm1&>T|gJDC9d98rhlcL8HN8VHD2TOHK(1<{E;CR8G0J zZF7rnQ#D$w^R%CJ0j=HD?nwTfVkkCbev1HLA#uRIav9 zi!~ckHCDT}n;N#EIL34{03fKgYlG%g#v)+Dv4U8)bpilr{e??q*%3z#${)twS?}W52|GHY~hY|6VgbGMZ@I7K+i_aSfClF zjy3>u`Ut@*>6jk0P9b6Ufsvkh2no|^Rym#1Aq;ousbCNh#1Jo;9uh>mk;XH|k=PH6 zHR`7Z5RjQFaf*!4p#&0f4GE(SWf%ly@Fv6nD5zc$sdhnv@FTHC>ociJfK!;Fd7QL% zt-|OB<}Hw54{d_$y(Ww%`{-yn)b>#ctyYY%E)0_1>$!$ckvPxMB?)cg>&OnR zkI-bqn2^dc49td&PyqxsI$^tc>qV7px@M9OT9`?T)P|ny(PnMLsO-duu*8s=*FY*L ziLlprk=veCvCbO*tK=rq_K46W40eOsngz7hM(#;E5^%YQ*H(;ac$kKGw32vhk_dzj z`3RpzZs#T~=gG9KB&*~W@4pdj%=wnG{vN0)h^y|Yl4u3>rVyW+8=itNR4E9WS%mSf z4Fy4IN73*94ib)jp5>`&y9pKh4vFlNi1&`}{4R*tIGyQch~wF90B>vN`JMh|X$$9Y zl}LgXDewWIhUy*(puUK5STkxefN7uvKI!luS)Spr>ldeSC7RWEo59-%h7(owCMR?n-!gttBeu2( zO-Ag|FqF@paEfUQN>_;m;af-xiQpU?Y&|DHpfyAU_ERM{o;YlwR-kKksz9=5A`2 zY|ecNo)L4)E_NrOj3Y5BA0H71UkOV$6n1B9;5HzC7kGkL>uEQPcX(@NzX)N7iaZha z*T@_HjluV?zKDlVn}XPL)NvGgExE>{+x4PeC6>)fR~d*Ewsl+?gTiz zJ7Zx@xBO*+9Z9Aa&=>5^2XMtFeN939jye5ZxAs6scRE}B9#J1XB8-)x`q&q5o?mSL zGom-s$Nkwz{eLGep_+VP5P8YU}I~FRbvwtw(4NaD!U%j7M)2?m%w#Nki z#E#xP+TiSjHDmrF{+hH-#}|KYfe4li?&z+MLr_yfeI?*d<>BY)kF^_RZw^hH8)Tj z2nAr!8wdeV%0m_+w53`cER^0~B|x;_KsR8iKolV8ieIQU?wE+Mq6n#5Sb$VLNG$r z4ivzOuMG&mNM{gaOGr{gJdk1$nR^hacAZvaz9pNC9TGY+OXNWR>oT;PLNIeAB|!>A zArQ?FB~cd5^$6rnq0P1Pk<12gage41aaz!%4*?8Oss@pgbXajINiT9IYrVBy#r7(a zy#*~XrllnPhj1&AZHB2sXB#xiLkSb4?LZE1gt6Nw!fVicW-v7E(Ip*qEKOLm$g)ga zE57(yUN1*k(*-?^QUn6kq7W;G7liRafg2>n7XDWG5a$8~phf5iaVyYPo*OW9rV34t zI++X`AUCfG&dWIOy@LcSME49=no)r%>rmx>-OOR3xI5(YL6L(*b=@Gfqk%!xD}+17 zV-R%t_CNtpw4qc@_tQ%g9qf|IzPtbaKnSem)<5e5s+L#(`DfIWK%y^1HNleRErm?W zApS#G^%D3Sx+TPWAK8NKN_P+dObP++FaX`Q!U=*zD8bW!8U}PC~pRF9SsMvL4^G0Kd^&H;&O_}xAsD$Y>xUVVfj6nHf7!#>A%@kxazyrw(2|@}oEDcITG)U7vC_^7I z1dF$ONaX%#fFX*+jRR?iEk1~noDpO`wzyzI0Kgaj#QcOrx?-V6aD+%j@-k2|Wg^-dVoFoV~XGqL~L{W4>WC%53vJttZkR}+}Q%I(>%W*Qa zcS++@L;l1eru0ad3xOWfkcJW&{*ocpI*~n`2S@{8v|$LD!afzkOopViBY!MsW#n}s zhg_kdHZ9p8Mc9xKaj`Fn`iovb1)WJcq@G7S2pKj3x=q|OB6O1(&k9nC)NF!!t>A;wXuOT^&z5rXK4HS0{8>mMDWp|XBt70QNsPnfli=stydh$qD6snWT zvaqm{JuQ63IMZ(S1+No@O?EDe+P)@hZ>_Z~YI6%A-AJa9=~Rnp(#Kk1gEsrI#K3{#rPK4X@g}W?hpd^+$ z6rS*sIqcfk)aSK(HC&Chzy(Q@5z>x+TvNoWH~VpjzY_(^p~)<2_qtY3-z8a4wmj%n zQzg2gCZq63>{I;GS|V||a*b|+kv;PdLu?`l9Xsui$+$O8^=9>l~(#jO7Sc2w3oD}J%LaEEqIrltF0TqC;N3Nd9wUa}QieCW=| zYWAs{RcXwQ+asqSW4q$gTyPWIGtQ~^zAG}nipa*6xx>)?7<3RV66n6Xy2lm*kc0$C zVY&g@N&>dzx+oi&S=d5#ZAPBU!JN0?F6R-W``sPkT6iRZX7WO`$s)=c79IM}R$fvIXHBFP zu5f%oH1c>?IE!fP^AnPu=nEwJD;)?l zO_y*fY@I3V0szHaLHrCagyR1=gBk(!3j`G;_xv8nD+rQIgftz`yuUw3LWtzGSgl3= zzq`&11ZN3^T2Y1mi9{p?Ugsf%E!YmPFcbA91VN2N1Udu&FaSafKuG+ZyXB7V;h)P@ zS(4G+rIAiU%pXYT96=!0Fa?0p(O5KfptBu>w2hxYxI*_i1q*iFk>wl@5=0<5l|wi{ z)%C@h5k&ogpb}#L5@7X5qSRaw8bnz^L@SI!PiRV89$iKmkW9h?EL(Qa%~L zSZ$6eUEd2D1P)=4KoH+i834o3NI~4w8TN=9^jyTqP*=#13ML<)yxkHG;y_RhpZHpF ziCGj@pVA1#7Yf7_B2~P}*FaQGL6qT61Rd)*#Fs4u?gU{UEy~{*1Pz%|0UglBtl>#~ z7I`HhAueG{&6K89myzL`6m;SMGU7l;Pyw3MNC|}86b+edq1};H3=Wqk86!R+goS9L zhs0t+(9IVXR6|ste{6)5*pNZQ-$8IybNqufN)AW};wvg)0>p&zsEnKygo4Dg;-Zp+0U7NVsBIPUa#e-!dLV!r;zD+6_Ot zjy6gETf$TlGg;-d*;Dh`+(Lw71^y-Wi6mciRM{!x=p`jQs-i%65>1u_Ia21+&4#MI zA3+Sz`0d~aIb}g?K}xkDaxKpv3IsNhLJ%P(MEuh}+2(PE1P)Bs4mk zc6wsPErew9rpr+ySHv6?LZr7bjfJdaZbC%F1Z2(ZSlpPzMfOE_ik(Pg-)r203^}F( z5zs@-=Rgo>O6(?j792(X#+wP9k3k$nU=jB~1Or)OnGg^VV5I@X=7C}bX_ka~wo*s< z&lgQWwm5_oxTVY?VT1CXR$AAn{h!78qH`uh8$OHjF(1c$P(1)>H1=m%0YCy6CqgLy zs6im9N%%_?Oa>4rfD>_}lK_Cj_kc#=P8UOl*|Mm;9!wZaFvLp``d5Zwd#?B_wmp@c$W%xE5= zRujgQltd6}J!oD+2&w|grBu}dq7H;Bh-nj+XPJUvS%lp?$zpGbWS5cU$=uwig43ep`MF$CUwCy`0$9)Yg&V?8xfWtc*;1k(R#_iPoO$ zc~ngi&I>En2)icj66QyDI4vfr9bejANNKDsJK~A% z$;f1kEpX-!Y5AwCnyq4`SP7mRv{vTEK3Zq>Sk+<~@PSQbIF_F&F5J!k=){^6e7Qz; zMOeHP?1soKhsl=cQ7(1iEocef<)-YnimKxx8Q?mGxL$5e5Kr39+EC0b=c3ob>DW>b zo1q1)ON7Yb_Jm%^#!Dc{zv5hvY^_Lqi1ixD-XiZoc`fkLSdFF+_&S(uVJrK1#e+$2 z_Xe-i5v~_G#qui1^Fo`+D`Mp;)-(ct*- z730a~GO-qCEaajZ&3y^VK=S0GsU3IGs9?D9|U&TSO)@hDd=7^gB_scS6v-q%@dZ2p2v^Fs#oKlk%K7xX~?6hf1QKbLPpv)4QynnF7?LmxCn2k<_-E_Pr@FCVft z%kM;2T&%Sn0Fv|FMJVAA?Px%6K(|C(jaq1M^mTFbtW88gi=s)>vkazNZ}8V(nsO_r z@V-&#GwUxsBb-JPGYvzCoNZS?=ka>lFH|#fk;E}Y_%W(Rop01FhoNIA!vsFpT8O!) zCigKe^KhnGe0$riWvHSHffKxX)Ew) zi#BSnwraO_1+(^RyLM>DHf_(gZIAVBgEnsOwr=iN22=GgD>8Env(T#dh^K7(fb4}I))uqJiFdEB(lx>+ zho-g17fU!#WH=|+H;;SxiVq@tTlgFgIXq+kSQGmg;cB+enz&{6HP)cC0k7%pvNDw? zIN&OUO&{Hc|2SO~cHJQ}O>epFvTK7S??uzGusyUrJM;(d&qTL5oHw?TsdSZ_S^H3^ z_{zDS8*U?C#G46*8H06u#xI#W8mE1>Sicra-&gKJHlk1Ye~VtTJvIziu-@`{Y^<*1 z%JZU4x~6wqd#bQje|lDjaDFc~JB#+Er}3ye+NP7OTF5Phb?tT4dW{?|uKyN*)mMX@ z+%k81ldW}86FG3Jt+5ZgQ?L3}jPCc2@Fvqm{c5o73iYlexfEj-?OA(an3_3#)(t=L zwi{Hpn;W=uk(%1bxQ|x3U+u>p)Pj@$`^RQ&yQh23uDdO9yS;mbwiCKz=!N}^8TR6Y zzjMf#(TFkEx0R)tn1dPA&6bd#(Ie%Dj@0kNBeSw|Ib}!384vry4_k6@I&isqs$aB@ z`}u|RS4S`JF8Rsm0${4US)YeHtW&%Py05J}T&~~xalAUU*ER6^bbv>?$d~$mpE{+Z zv#JX?t7rPqCwH6 zflL{@S(>z;L^@XP{rdc(3VhB#;k73%d&i_JR-|5k%9N( zk2m92_v2r8{cT(#*^R9Qxx8BSMKlrtO$@@85lV5AHjnN z4IUJ@5Fx{X4+|btIME?Rgcvhw+=%g_0f8PvChW+uWX69WBSLh@vY|qiCNrvp$&sSR zm@#3ZY`Jn|OoR6nUW7^0z|Ep2ZyG(xl%!LiP%A!_8kL~Zt4*s)oN6^I)vsN-Zq>S! zXIPwQ)2cQ3@Tf+mH5;ad`!VJ(vs>@3-RLoBT$~~~>LoZBY|pZ94ew1`81Po168}Li zyA!fs!V?>hU96ENUAli2V-<^7wAZtyNslJGIyLLln^DV-O`9^rp&KJ2<@^zc;m*3Tjgvhr6Q^H>(199FIlX#i>K~+Fh4n6wzShy@nV~ zJ?=GAh$iMXn|L?jw^)k)9cCkQ3rS|!g}jy2+LBw=)+LT#h6x*(V~VL-nPny^QIh6a zN8NR9&KDn!X&h9!QIU79@(q`S_MzoK8ehkyPGxWtN{7>gubo#{VkotZS)BD_R$QIVPW~Zr2&F zXc6fYQmrnB*ngmkhaP}Sjx=eJ_aM6>o$7^E>YB(3R_#A~ipr}uMDnR7EgnQR0^26D$OnS#D`LzJ1@@`m--xZr9u}?^wB^Yoix%1E$wvEP!IjI)KM#4HPcjQZMD`!M|*XkgqaJdxn=c? z_10)(Es&-QPGmO9$~Jsj$3GLAB9JAHMQ)?+#s3NCaSWM_YkRXPbZ%`36=tPuCen4D z$0kM#xT;-%Pl8`{+FVsbILQYYx`%6{QEIWO$Q0TcEbmyj*&UOEoEfH#&tMv$}TW zgUBI;A9kpJ|NQ%(0R2b602Xk62n1jP zonyb_IM6r{l+Z(Tf-8-H&3dG{O!XEMztGsPMMuL4ezF&1-`V@D)n4@3B~Q)ppv&6XRup}mYl@hym!!gc~T%6I77k_iLW?}J-aEzlI=eR36+L4Z1yq}ih zSS&QcDvwKJOwNkeH8lrIDhZBls0R=V<)GBl(iuLu_++VY3E3}PrOt^7N-R4eCzikqSR0M1MuW3KX2$AvQq8JXx2i3! zdUdNVwW59;=2UiGj8YApik}QaK8i+Vt%YN&T;odD^32t)b%o-q+Pb0ho$hvgW#Gfm z`qjePaawzIt1%-*I^r~yg6ykWQ=uZt*mw$Dm^7YcBl#W8l4-Np>q^d+;xf#7Nj9GK zbFXJ4aMg%9qthDdA zCEmz%XLy%$WJDMQ5r!g!u?#^lV<1MZu#}SuSFXLbwZ$bVwkq}&r0}@MzeL_Co!CY( zdy>qPoNW)y{7E#oR{zZABVLTVdZNZCuR>2;F9J&;^?Jlq%&1VKoyYnPjSjif$_)lUt= zv%8(EGCwgHMM&$IPWJFOqj{ z{JCC+d_i|H(mS13sL(90L&D40Rmxa|Fv#6#1C$&gcyIY260LmaYaP)c2l+ut9&5pO zGr%}APXFmfdrY~Pqykm2LKO^Pfq__|{THx8{Nq26_PgH#>o-9D2||T~P{08FHxN`X z0R}(;Q$PU&n1EA21q;}K0a$#EBJsjh=M8@gZxK>2yufSn1dQe9 zbN^_DY1nlG!HCKLc7=v=f!BN`0Es|$zn6U70Eo~;6U7!Q48cPRatr(CiKv*01|Wzn zA$4dJaRd>HIPqxO=ZKCNZb(*%k~k1zM~7v|WWDHjWS5JL$aiI@idY016C+dlmQ%lR z8MKIu(kP7p(ihdn8@cvt%AjP0hGf&nce18IE~~HRzfB#ihy^@5O~ffc7&FTA-9Rm=XaGT49SO(jkbKjc90}Ta?`hHb*K!2 zU~cuuN3PXRb5<^_c99+_jfcZZh0+YSMi5@-i0kN&il_)B$C8LPj=QFOU}tFQ$Y@Je ziQE6kYY3@#AE`}5r)qliPug}V57?7NX;=wh51rvh>|_%Nw-&vaj*Q4;%eRh=#*PZ< zdBXT?&w-I=Em^(Rr z6lsQcr-;@$5lV)TV4ZX;ZgO-l!=#PTXiTs&PY7s?&)NVD06P8e)8u14A z8548RoE_Stg<_&lK{%dMM;f7!0a<;CXp6zd3Afmog|>BKH*)E?ciGvEXgG)JXnY-N zjcdXp$2Bd_gLW~I1Q~&%cVGa=xe;@)1_OZrF8Zas0bFDhS|h3vEXj~9X`>gKWVMNq z=~#xj#)cjDYbTj^Z@P&=IuO+Wro<$YU_&=;1E@s=p9Ddi8sP?Skf?Sb0et`3s1VaK zHg`Zcv5jqNo0Pg}4T_y8nT~@Nn2MN)aXO&}&jx_OMeSPs0{hJ=QTn|g~#Mh?CD zDyVW6Kr|Xxajh8fmK(tY3!nrWA+BT)6B>X7)tavQRT8o&E5SyVKI&~8!IEJ|r-Lb^ zO-7o)SgG8otm;}q1<{8p#3@cP7_$1W2n$09Fep@YD?zG_9O0t~xv#=7q_;qk;U<-a zDX$2zWT9$kT$!+Nlx!kfvc!dI8!@q$_@;7rpulE}1|Xs7c&9l^n7RMCcNE!=4eERd zIS5EL4BTjrCOdTd$w+SMAbC2GdZzh+n`IZtbt8%k<^Z#%iNLMWy-l(|^3e&?3~DRy}Gv=z&&zE+bT z(Th48jNz%Ef9tf|8J3$X2%>wofmNoITf43FY%y`5+c=~S`n3AWjlWh373;Fb$c-wC z5#*L@oG=Z4o0Gchw-jl%B8$7WTfI}1lvMN!%+S1rE4@(5lL-Iera3E#4H}H)@VA>Q zrwaOwx(1MmYrS-IitszXFj_@k2cFPtwlnK@X9=-!8lJm55Y&pgN4CEQO1R*guB}pO zdv+%Hfwc1rzW|^VEEFq#D{{`Oxd$P8shhynszmL{ zP35IrKIN8aApkBH0W%CoO37i7OAzO384tlg-|h+IYTTM|Q%5dk0sSnMiN5CQtB5hhx{^;-*@ zkN`>03gS9~T1*g8a1bzB%Lbsxr|e1#J1dY=5~kqET1#kxxr-vlv*8)CkQ}`$QMU$Q z3kJZv4l0a@k!bEq!q6NHdK|%Z2}WNNsh5csL_iRX@XqkO$_B6mM1aNdj1Wt}q8g!} zq>!8$u?Ykr&;v~n_CN+wkN~WJ5SzdXy=(wnfB*^54ghTc^*|6*3ec@U3Zzi3qcDgB z(GK-H5Xrd-t#Hg~=}0&M#C1%JQK@&)`-Xu)trGvL!{Q9YU;DC=?8)K#qnazitGmU2 zl~)<#qy%w_zq}EQFc9y|1PAfT1hE8aanb_;(i$-a2jL0`K+qVG1W9}l3r!GG5CB`i z)h2-ef@=U_jS!^3&?rqsjVvqNyP5-$40PR#X)VG7;SQ#o(+Uxg1JMrXs|b+1#?6|J zfdHY2Fv+VMuMwv=3bpOE3fjU;snF1VXUN_B;@vP0uAU%LuW{7}2!{ zQPButqFcZUn<)iSV9fO(u5En~j9SnHQNR355L{r^Z(T*56GIit)1Isho=nP)7z{ia zY{IZ78f*Za{I_##0OTOb+>6J-fMkL2Yia-eud^FxFv2%~QG2DLVL0K`QT?q0!33V2 z7FxiS0H6`&iV&BL5Q0kz`bh>IJrJsm5T-p4q|geiT@n$n(e)kNbHuGh%@LX#y*%l4 zg!Z>xo7lnl-5D{*+`M%;eHUL#*euPnTWgDujNwYFKDbq4gK{IO%n?DroB$920Py0p z!p|^z+ZnN$yRFCxFwz4t-v{x_0FVR;00bDp3JHx6^R2}S;HAB-;4*~0{jq7hX#kLH z#KO9>ym;k_JrLf!jX7PT-7R+CDaPE)4gBleUH-KpKD3e+OesXYFfqt$0o5M_1O*P| zQsxipOtdufw_gj%%q<94Uc$f@=5qfSY_?#G|KJP!%hRO*$zfOA+t=7uPTdDey{mdI zElh}w(c*gUww|Zb9I*(=4Ui=)42g~C25kVGz;}*K5EkCky*LelP6-1c=@xF+D0$^Y zE7T3Vz|#ceHRR*09O_l1>F6}+7B1;8n-Lxt$${(Y&fe2eS%hSI*Le{_K?N zLZj7ZdlpEXA=R^@1cz)t#_lS;%?id$pBh2z$nI>{SQ6dN?7!CKA=~8#;qM)b?*u^( zZ2s+C-ixeW@5LU>8{x_X5#t0A1W$etG;R{@3;^w(1i8Ht^lkuT&<`jvg00^-{Qjh z)qNVV2t+_`pKSm{Ag=T*@r=;fCBX{K*$!U1(Ff7i2_Vn`?$&vZ5gm^aXK z0A0+Y^;y4K@YMuC)flny27u!kq00lI<8O`f_tGyGCD+mY?adkphOH6R4(@^d@7sP4 ziLDF*k?q3Z$%0N0x{k=80~LL2PZoC&r`YZoq22~C0F593nN8aF-JGP2?Pa~tEK2N~ zkl=Vv5TxLxB|-NiX#2>y^#>9A2O$L~{q`hJ&>{`o68hb*E#M_z3$A_;X^#*9&G2uH z0Jc)}Xlpt*tz9qacj4Of*oB_ust%!S9tdb&yVg&^%HFL9G4dKA z0D(6IneEgNn);t+h=uo0XjUGjsROwQtLN_k` z)l{e;VFsuQG9WCFfnZbv2@@1-lF+ePzZT?1P^&wF$_Bdo8aC`et!A^zm6})YUcP;i zM*TZ9>OH0ZmR2eFGU$?mONKBmw1mhK0h0{~X=+OfL6s^8jvB~HB}gp>ff5AiS!gRV z0B|yNNYb-wf}8&jBG^>gK$KDw4J0AM$$)MH3~QDqK9DwNzs;RLhaUZ80)Hm~?Ph~A$dWw#8#tt+f*SFrT)nwOqm|Ngz#jT$!K9{&o;&Hw-n z9O%G<3M_CaAQmGi2muVRh>0N-7)Xc#44Uwxq&5Q}3Y`doh#*cJ5-I_a4w7I+gH#I& z0F^d*NeWIPaH%E*6pQGjR&e4kNFj$L(x3*5Qn0yBx*~`>@2vXHtZ7aPq#Oe{VUjDX z4q8MR!c2-wt+49TO1`a%L^Dk_g>sK50Fzv*z%KM+Y(Gv&0cp+rT-38qKmRNUfg^Yw$dB*+#6$SJFxF`L9{E4<7C>nT7-CACzg5HmGZRaa%T z)q_M$Fx9#YpoW|#3!-EwR}RY6pff?8bs+kFb+y?24n_1N1_?Uyz<=IE&{%1wrMBAV z5`Z;2WQi(Mt}+Yyir9hd2_!92sWzw(1R45cObwB`{lswvO5q} zj#p;6$8fxdIw5tl57nK*;a$xQAE-1$~>#Co3vi}x~hw6 zFzl|~9LhBw@g}@*rVsYZZ@yr)vZxJz=hrvu)RbFk zMe*8-=%mV_#OHUD-cDiAIZo0)1#eFiRnceXy?0i*_DJ#l#x8qHwS*1CY~h3|hm&R0 z`t|hK?TXm+$QCpj z%PoNBBzzi*7TS5#%^=|=qIj-QBv2NjsRX3Hb%{qF7gz(}G&C030&~&(n~F{?Y~&kc zk+@^o%U0`ynH9`Z_C+Deo`eaDG{9E}f?=V!CaKY+&_F&skalWe#6n5J8J`FmhxoKK zQdq?n@JfnN!04L!_2g8asT=bary%+qh;n5j0fv-fz)8W30rdYVfF&?N31SuN0+x_d zTj`sa2vdb}H=J0?B~=v(Da3q|`nKXUDgh-a z(wdYSRuP!{`OcQ`(_m_CE5TCvvqyvw0N0Q;C{dV5h!S8)$DXq&Nw~2r4I+hW)+7PQ zJxK(ni2x~_hBi@Hr50{1I+4_5cTxa=e+$BC<;)q$3s8V}3z7sZHv~vV$#eoFk?GUC z1OeNHE{S>Mn``!(Ac{diR)6Bj(t1Ri1FZBwqyQp=yhOKO1RD)aWwu8V+E}5@V1Eip zNMW9AAOjo7DT@>ZEqt3l1y0H;F|DU&5<~!}>Gx9)VsHOeRr@H&R#gez?W%|+&*AMG z$iu0^2`-ykRRc=&7~dT{0|v;1oy{LXCajzoAt2TPF!?|%5^DoI5hO1+xr$RBNea1! z(Gfby6a5PW0G#nbRHeB>4+4M$0O02>2g1!!?iyLQJd!hS`O9eo0G|fnL1#p{a$t6I zOA3za{S9%9K4No&yjh0( z@H}aifcnr!0VAZ}?Lk+6ky1-R0;u23Ze71??kfMGo$>X(Z8qcjC@5g}#rM4Eeee5= zXnP>c$2~?mf_ctsyYrU^5@~G{{N~p_0jyvCwxzI%DQvYFb*qrXQS$Wfn!6^8? z(D)7GQ-T>xJ&edfZQF#>8a)8~jo$!3BgBdCO9Iy;LItG32qeNJa6r?zycw*$6ZF1q z`@SB;2z{czpTLmP(gIE}z$7p}Dr~|i#1Q`~T)rdZzT|5N)gwaR`@TCNgBs(6j^M+N zKr2$ zeX2d^JH&RnK^m+>ENsFUq{L@)##Q7&(C{_`P_F(Ph#5@6)l)+rEIvh4vckeb;(J4i zzz`;gg6e`lB_t_sY(FBTf{S>gSDJ#=BZVcHf+SGJ4w@v$yVHqSSpa2GLl?WO8#gf zI`Wu;n3I}dv)*&6YV)@Kd%!F7JxWr7G-8EPK)n(Xr_Jawl^}`I5-e822%bo;px}Zi z*o3F}KGjji1Yis%s1pOA0Q7c+Z@$2iUYKdnko1Xa(~OF!QWY zocIy>98N6cLECe~SHeQh+rkIT&f>cWovg!?_(tq(PX?6C6TGG_6txX~K1gy$f833% zEXCs_7|da}GWAX_8l?Y2xuttyQ=~wZ6~VMoL`i4FkxUdlj?6@Z3jkIiEXBZ)A5n~L zD-KpLKc1+G5gDA*K#`45k(1a=1HdF6sWzCr)9=HOH)4Va)k}lGkh~;_D(EUI@Ist0 zz9pc71egMvaEM84!6dXs(o!x=vV|>BEbjr$1OTj#oW!}jhjwrUQm{ye6b%<0Rw?+= zyncTu}tkdITzVLHWcAUc_BrS5R&eQuuj|@fnyS>vWRSY@9Nle%L zI?^NjiRuW?Xn~sY@wha#*Qn_@2-`Su8y$ln!DU6l-RMmN>mqcG!XzwKE|#fLa|$ zQmD~}6t9QWQNXf?A=FX%l*7Kn&21yso+K@1L_Gui$Og>Dunj`@M9F=uwrbe#NJ$_=h=JJ4 zjHnGMXtMu&JW#Eyh2W(^Cu~UN!c2zvzWw@*FjD}F{60*T0xn=$^Rq^G_!04H1y|Sv zhS1S4li280GHQ*)gpJ(xJVI}rLsz9kxJ^LLQ`xXZ$*lB3QS(RLgkN_wKK%^7wuMAC z+$}Z4zSKS3reGq(eIdix8;o1rzz7Nwbi+$c+5IKkDm29z)=i6MAnO5OWd}m4ciYEPO+V)8vNVSOGL@s#DwSw znIOOPvOYlJgA!NCKwoxk!sNmE*gfqm7ryx|AzAkT|*i3WC4OXav|hkp_U6E;_JV z>6;t7j%GBNMh%EYIh4ygsw=vpbB&euFQxM@qT@N2@MxlD>Y96r2az?Qrn-y%d=$89Ck#4z~ zK5Ir>BOpj>oC55q)9QvU>Y*lJe&wN$YYt|3xW|ScMKL1u(2GGspo9KnAu$vZ;_QQ{ z+V--897}e@AMX+=xAV%5a^TOtOeQUqi}~(;08|UhEf0;kC>S5Q18BQN-qM>qi9@D z8VVR`1@!*!1wRT=VWK~4?}w3#{dVuA*b0Is2y-wV|F#O`&I&Cdw*z8uqu9krPB)Pe zp6i&f1YkRYkkb)|@uf%t6K{?~BZ-Ieh}IF8qc9uG<^(_pimk{FcL4G;nH-;?@axVO z0O3W@TB3Ljijb+~WAmQ6>WL$Z@hlg*{E_4!DFxTrais}!qS%UFB8dNTXl-9{APg5G zElKkjH)w)6?P0=K4P@x0kTxyX^OK-$@J>pbiJ5yTMVX4Uuecg3M+}7wb_K#Mv8{oi82oaHXn+IYi>!; zi#HXDg`;$+-1J=63*b>~HGzwQNOIN=2Ex*g3dl|#NFj)2a5!Oz^@v~SS|=u>kaiq1`Ig_Gy$K^B35Jpfm%NZ|k4Ty`aTEhk z1ScVQ_10H3!Js6WZd!DCO{e#h#~(r&l#JVOf@mGH0C%Ba63a%L4{x9O81J@7_M=~l zVaoP+ts$@X`XmT+KNAqW`1znYlQAFoSQqz!aP@+)lAfW9x#1aZ5B8QPyf$ffL!v1I z7%j4o_wOlOk3b=32N#k*3HYHB$M35q>2F+F5K8fsf^ZAUiSepI7RB}B1lw*+BYbsF z`fZ_eKlTfsp>4dUAw=)?RzC`?z=~jSGoCk_gLm%EnIr%4jFl#5a*yy2cpv>~KS~1w zl)XO*PKcnB;CKU=`>ug)|1S5C@1wQP^`-X^s7kpv2JAxK*?D;k(+Kww6QIj2&ss#54ptR@L+H2{=n%Ay6WSS@SzEZVec*Pb=X z)#WdkoXTyawn*6`klZ>3GSIiCywq-tO)DH}H#CFLN9o{5W!$ zvpLTed9u0gerXNjGiE8q3C0rgu_fUlBx9Tt@LGAcPUR)(}_w!6zYxwJEmYO9o!};YD9$ zI3kIXSx8@rDXRFBa2q|iB8)N0I3tbbMYj=ZHR`ydN7q?IQcDDIdoOwc+fRD0u_!ENuWtmf)dddW+k|1Wb)oY8kXegvBCb8K^|KORHap@Hr*FVf9 zl--z-X7y=DZiOl;s`%+=5orpZN@!4>SwCK8p@}5p2|c@ zrK|lQVWBsnC!(;?ikAR~k0x{}W*{ZdSs5Dnde|S*rsvgVpY0|ty3_%X+k%14dF`Co z4irU4TW$#^u$UoB(7rD9n{J|1eG4$b!6nhBO#L)VVihrfyo~lVcn~TQJYIb@sQLQY#*jUJ&ptHLX!S7ps&bZMI*PJNA0FX7WW*f0TSi?O4<&kQagPFHWY1 zbX^+-xjs|#1hKA@wb-4iRpb98^`1TdR3X8xTJpA$pA|%N1(6;|ikA@XiS8orqt*B@ zGQWAWGpxLC#l`2@b>+2Iyd;Skt?^^{<6F2|&zb!mwYxW`+l zDGKgB4ga)sfsla|1mvMb+E|c0 zF0de;{K&uL`4ROoGmtHTrUC3BI)Dzuk_FKx2Yu)fFJ2Fe_4CO7#wk&?tcqlg!(0ys zB0!aNGbRZj1sUjhkt7(@0G~UVMv5oWjNF4>2{EF_UUJf#RMdBs!`!Q&6VaPaw5J|L z7&ujew6!Fm7S72gMohSoeg?6m8F9r*>DZc@O);H8^(j^{b)({pt7Zx!$VNZnj*CR~ zEWJbMwzNr5la~J#CMaxcNf^2|$awXPS-q=DfDkGJnbEEgbe91@I1rE;U|;oEDn3Ux ziBZ@DK(1>A2uCs2gtVh-gXQEvI5CQLYNQ>c6Kp}0+LDtZtQ55b2?&{5)kC%Ck-WSr zUVSN7_~gtZor-O1C$m$W5NIPi!!2+LGTWLAbDSGs9$lvcx8O3DmwqK0yntp?8n#AC zuuaWO(E^=azLvTdb?Cc70-)bEH@0>}X9|G=z@1d;=2{Pc>7`$(vMAjQ-^g905oT4~ z+m>URrCR?~!BT?oBO->eN~DCI+IlN75B?3l&|>5&Ba$F1R&q~IYg>zk zcf&HojU;J8q%lK?s%*ZqchRihTMijTCeCG?+w7U5<+&v29dw62#c}C<65(i1MS=m_jT0$0kVk!%Tn-^+RQFkaZotQO9PHKxB!!{#Df*ut?(QXl@tg%oA@@E8eFhF0LrwLx;|(4;Kt_QdDY z)4BgOuCuo;Ky4%}>+LGKQ4$`-96HWLiOW4#25OVUM!vbVh!gtBtLpfO7&`CSHz)!*0nL zXx5PwH=KXkgwm<7b)qm+dRCk%wSg>K?jR44cvW^~-AI#Ne{$HOO+I6S<1Lwyzr-!D zZh8MWr0I~CdDQKhtGgcvXM#F+?Jgm3GD1et6|zDi`POI#*nr{YUE4)wYJ zs?5L)SfIL{QNt7_-eafbjvCy3yGjuEnz(1RNx z+Z2~E$;9hlKeq4&60cNmW`1lPkxJ%_UpU%O)DTvS1V*#<5OK)5H1)| z0R$boM|dAk0)oFI9g}CD0=LFJI+Y+3qi55UZjmYQIU$rpKk{5eF%85C{D{h2j)#zt zHHDgAomutu5AgiWwh38|;g79xgw7QN0{jfhC}2r2odF;eNGO0dSp?rykpI0>1og-S zUPRZ_kzoYD0+0=75P(J8fR`L#OAG+Qg#`6IU<*Z@cm)#;Nl6JBKnB9Z-zEP901m`0 zz|%&o5dgg1ML=Ofs9!=nQ2iCeD|8e_h~Sl2UQ9HH7kK;a1VweESNjRVy;?B55M_2Hew`ogEp-)20Vf-k@+qDq^5!B!Wz;!?$(K!|T zfrKpe2^Dr6NKnpN6;BgBVn@uONp0211=nEe|6WMDg^WMcDrWOxeU~QQ}Kv z5}uKUCn{s)0F|lbSk>{|R^6j5U55tL1OSv&)x;1OY7R9H1YCJuL7*UV;lvBJL>qk* z29i}(Xkr!)P<;_ZG6H1eu;Ft(9o&VS6(+>uy~NK7a3;4ag|+OL}GRX zXaN)`u}%{DWI?!;`Y7cC8_9Z zVuTkFP+`=EWJX2=B&bF>sD?(1i*;DG&>1Zb#E24v0_^|MN=bqDTuc%Kz%9807$T&P z8Yk+sDCh(LOc^GYwq)OI0m2N9-+%;9B*7Fioh?9V03d;n+NQ<);Y-{SC*Vor{ivR3 z6ARtRF{*?+fTLm>0N?C~Dt>OX7tFadbt7PHUM| z>&}(ZWNtyWipQ3$6?Y{}>tUj|w(CL>Ns>IA(2)O)rd2D=fkvI;1ecZTeEqcGst|kkV%D))j5N-7L~M>`+)OO2kQTJu7`# zUBf^v&sdSTu*z5tj}93fVHC z+f*#uW=N4C?aEb==ZA@$)*u4c`32&KMuOvm3yA1B&mLi+%>ZnZ}$VINT6|YaV3Rjg6`|6lqshyl% z3w!md7`Yd(L6@LN*`b+A7-}qdS#9=)+?VNU*d6doq>1D@uKKda<{d8b@~T5sTIRta zI`ONf`O5dQo!C}xy+B)9wwVG`u*lMEpM^)oIp?YI90ND-b`0gJP2KELF8R8N#Oi0y z{_h29okKmN(4wr$eyoG_r~Pc&{-FQZYE9P^M8L1Q@QNI0iFvRNvNVxk~piEPVMz_Fd(zB3n_3PBOJ?ZS5C}KBOmg?IkFTdakR;< zm+>(qOVqsp@yY&dum&=t4cm1UtyYz+-=6X)-&Mt3(GG|5V}O&i+OkWa6W!u&$Z9SX z>)k9%PJ(Sn)&Z__$(Zkgk&r+TdhOJ~a@tlfNWrqMFfANRj4u^|a2!uv^crpCt?=5u z*194clQkXdBG~?>GpCi&8^8av8?%Zw!!teGuRYT*KF_m0%kwq&^9uhnx%spC-Y!AA zb3hlg9B&^#4|GB!G(%IZZ%nU;W*Y}9^pCmm;O6f=hsF4UMcw8q>vqZ7?HWUeFYq$l zuCAM)(QQHI+0lu#6JiH{iCAXrYp<={0oyc23$u-Ro5x~VF+)gf5aA7BAq3wq+Ai`Y z)2>AKpz}J;y*!)=hfy;=neS3jq2yE+)1aTx>T=wuqEPfu&+k)5Mo|xN4QnzcHeM{_ za!JmIf%MMMikTo|RN8v3ESGf~m-E{~Ghk~oHUG6>|MeBW85bwEDi2?`<*R&^>kltB zFn2Osv@n^Dw0+rg25bK|XV3Fydv<4E^Jj~8XpgpOmo{pHwrZ31YM*v%r#5THwrk5a zY-cbvPgO1paTd?)BiAaw?(r7$@?PWZ6uWY2I46zqb&25WRhaGO{v0@2HrOH@D34}c zZz3W;x8i=Ta<_ypvq)hFw*3yac$2qEe{htUk#sXM+vV(JFYUy>_vI$>Zr#nSv3GYX z*~W6WVk7p|W-=#F?p5uvadYr|#4CU2H(ssxZaebXPPa9^HMg0vQv>Z}^K7;Nw}K0c zCG&Bc?AC*4wK0O7E2A(M56po#cw^IWs3bCWudL28^@jWRad)s?)lL9cvGnd*9lICV zl(e7J3|8OqPF(+5K~wPB2DDQDm}dMkV`Max-|ws3Lc@gfdFv|v)-g-zRM$#k1%ADqXEzR@k6w2#Pdx&-M)~&T0 z61(ora72euRC6t~JJ+*I`*uhBEnoYzV|%qzyR~P#w{N?)cRRReilx-EM!)k6k+Vgs zd6NIfx)=YA0Sj2~+VscmNQm>T31715J~B(vNiU1`j2Fx01vtT!%9vyz){QS%Z(Cd8AqdZLa_EexRFS51WhV8A#@k=*-vJZQ< zs2}*ot+@osf1R=ZZoRkhnuvjz1(wFsLwC{>#rIOl24B6@|GH%J%9UxnmNTG&UmMaF z{9$l!i|};KX&T(-^<}HotBm$9Z`CFMk(RQ=JF%-rz6wlIOcHUv%0sc=Ztp z2{&hbrO`d-JALPGzULF}*3tT}5&q9zx2-`*nQ6@9L%zIVJ+Z4jugiX*pzh@VoO>yI zg*$4TJ-mIbWDNIuliPjHWc<$yJ@WVb(DOX=AHVV^fAcTD^G84QPrvm`|4)~PaS*eX z1Oxyf`2+gQ;BP}-xuS@oQI^qcaIJO^bFm4eTx#)u)W*B*i#$0f5oqIL`j?q#I@est zE|(hChL>`S-A-fnTV1@oK1!6iucC-%*Gf0)w8EZ2*>qevmX@%jini_c+i=%PAXWEb zt)jp0*$OpOiP`_QcD3DpI}xdDKZUK9a=ldbLp$$VcFjp&s+6`Fx5f0LeA>v^;bUi- zHL}7s8#=V3J8OFBsDrM$=&R3{_^qKXsN3u_)gImB+(KCQzKG$@dsSaW2@&UJ7q9T} zf^(TQRl)6!dB=tJ88!0LQy=&B*k`Z(_JjuSQ;L6PWm%+^JLWv&ug6V%R>B7kSoI|v z{yX>d*Khy*_>(pN`k9WeJhtc4U;fgky#RKOe@}Z}_#n5y<2CR&ZHeIiB=|rIGVp>9 z#2^GG$iWJBP=glCpa?hU!4iV-gCh(f2{9&fwy#;(BT%L+3w8P~| zNK!xiRuKQ4HpJ}|F^D__q7Uz8L?$9}iG_RO^p1ENkrgg^otvQ+x5z~Wf~bp#1DpV3 zNX7(~aVh6ZW4qQkMl-q*jT;lA48cgpI&RN{>#&!`L#5s>~(#3br@2b!RBHv=^Q5GDz8o5<{Rg<*b$&%3C&*naX^oG^0sP zXI2xM*32e0w>eF1c9Wae{3cQ06}C@m=0FEhTtdvk&ULyoI?17pMyzGGPAyWG_&k)8 zuqXe?eERdBFuW%~2a3JNt*Tdrc_p|$H>4)<(tUZY6Ex^C*OFB$4FrD_`J90+`!*=zCu21L^M4yt(j z>Qw$gxMnnBAf6DbX1DW7P-%!X+94$t;YXfv!tbf>bE;~U_eQ2Jb+vtUEmw~TwzU5$ zR*tPrplu+GK8UwVJL$bn+534pyZ~mMn!E?91@vC@;AEXO`%17Eo+ae z-Ppnwx7^L`c4PN1-T>^pS+x~8_k|RhLFOL8Er>D-vJ8YQ!T`$Y&gOkoH2P?mzV%eoHyyO`AIHZ;A-J1!w#11Mr3 ziv42&44tGWNpYmPIV z=lte6yZO#?wsW5GOlLmpnJ;De3srL$D+QNwLg@wEhq-gFxnkuXmq0E-q>Nt!P#Gc1 zP(+jsa9>Jiy1s*;be8+*-U#B6#+h7bb$eN3>5UqoU@Ehi)mqP&5YBiF&05DQo#>~J>#1>{Z;Do}t51DX32 z?mh*(Pk|tRr+Y!>j(5CM;O~f^`{3(dki-W*?+C%W0rrk~$S=O|akC49*$2M!kjK33W6ycU!@l&Wk38siFZkf= zUh}vw{^w;6dIL=0^n`yt7Y6u_Vho!gSkCXSgGPg}*gHB4JFFkmKN61QyC1eM|f9`f-!mwh>;BO~( zZ%=r1RwfAkR%r(qZ$<}n!v%Cv_+$o%gxW(KJz{8PxQ0`gXgMMl&((eNwSdG0Y{q4U zoyLU*p=rwSh08Epl%|8m^@qwZgMEl)Y^W%b#DrG@5?=q8h>$pHDEBe!Qw)mGhe`*A zi$Gje27Z}Vhl((U*ynFpMsGLRhsf54e;A5FS6=`aiPEMT$5=Ls)In zIgjI9f%AykSdNF30Jo(XY2y^&2W*)LW%>qeg*b;*D26SF5Z5<@pZJL>c79rTW$0&) zjiE^8l4?CsFC_yVR>T<3cM(}2kPrzZNbo6jgl$CTMR{_-^QjWh=Icf4B%K z5sFpjWX2V5(+G9?WnzPx?dD4Bu+Xb@WHj?_33p~#Bz z^?=k!Zw%Of#g&OprkHlA7(|9hLvvgG^p-(@6`MJkp6Py2b4s{|7MD1KHzT*bwTOZkaFr-cO(g*PaT@n(yk=|h!5M57cNBB*~$;g)y_6-ODI z&dC%@8F37fE{w)P5D{EUhlzS9e%LnzUsYC{d+3Fz*nR#tgPrJZH5s5;GBUSumhi`kv8gUNbqns<7G=2%svAG!f%v=sd$5ZFkkf?99a zmy)8$o?$ts2H+1zw|&5B0G!}`hdGA4nv&Q^n^6dy5m`i15h4iW8`Y|>B8w0+8e!m- zs1Ko?fN6lJX__ZCsNXq?hKi(E27aOcC=lAGX%#!CR2FQ5fUte4uj(?IDC-nCIkHHL z5VHz5PzjL2fMvXjWz+Dq=l84SfU8bMWmoC20w{ih>YhQXbe9T~LhCjmnzXRWuZr>y zjKHfOny|b%5LX+hDvJd$>Nrs)|yqgIcFC zSaf=Ol00~@x(TS;x|PHw2*V%@R*Hfvcwee$xVlJDvnE^q`l^UqqX~e9=p$ro0fqXe ztWevB4|ugNn1Vq&TtYXho(pe>c&O%QtoTN?Ri?2tnqjNvue+AI`MR{HOGE33y9&#< zeA}?z_kHsfv)x&_Hd}Ao3YC%n3%Q3_e%RZ%h{R^wRvtf}_v~vUzAzMeI zKn7bNzpA9T9k)<6LAnqT2-&EcCaINBIk~v&qjjo+m3zAc(G7vHu5%ip1`rG%YQlOe zelyI$ZF96YF#re=1Oo8B5b?fDU;v#75fLB-@jDSEixBm&1xbL8Wl9iETo6}05K%0n zJ?RuvfB-&RC~AsIQ^F>hVGc7qsG*3$Dwesy@PK)%f@Aon3R;$f3Vw{xFs26oFv&43$udn5oqP}x5YPsY%LM_{V(i5RAO)(7e?u9~2GGwKfzLxd z5a`I%1+mix9gFSDVE#OeIVO28Cb5TPCj5i?2#u`H|i`tK5tY+EkGQYO5Nk+YntX$X@NxARP>3`>Q3kpcj1*4o$Xi?cVE(-xe*N zhgjans~H{}HN35@CtDRp{1^a0-Qo>v7KW{=io+yK!p}UueH)&^5U~ewUrR~08~)Y6 zO2SYX3~0^OElj-0AiX4v!-Y$xzin0DkUG zxS0B@D(KLb3Vvwq;XMv-A|2xFC*b89hYWvq{UcE@l#0Qki(%c;EaezM z{t%LV5J1q}6d~x@-4v4g)YOfR(mfHaFwl8D=uQPNm;{7#HaKW*5Gsz*!Elv4&SbRx z-h!#(obb%c;NR-K<5m5p4$?|JQ#ELIYfcf#OTYv{kj{)i+&OIkOz_PV(F*&l?zjxq zjXe>gV0x+i)1{v7T#OLksoa^J06;yXr2y0ifzJlO=d13W2ch8DJ;r{{E4zi&81ctV zzTXdi=xiR*dpr=q@Sr1otOno;kS+}F?cRC|^0ZydscR`|HP>HcKs0Rt#y!bG0P_U@ z!RME?#0b&KTY!H)>4EsS1qDA4sO%01FbQOE*#FGV1JMptt;Kk$1?VX7K93L*Pzp0X zqdt!SJ%95CY}N!3zqWt?n?MQ)@TW>|0P8#uVGr6@PHT+e=m&w{4PC$nK<2{0jEWwy zZ^Cp=_8ENZ4fLPq3y82SIh}J{eTi6 z*&473=qUE?F5aJx6|Zd&ZvV`F3lZvP%qbWQ0+0Mud(kKi;hhfGlXBh{(drNX!32e% z0Pi~hlkf7AjLDZ=5JYg;Eq@R*uGQgiQ)VDx1_T9rd6ZI1K|2KrQ&g~2!KL>CEwg99Rj{K*g9$qt zmaDL$NO7J;n^x^wwmgFZO(@i+T)76|7EF)?KuaMDgcM97pox$rdkriRFi?pQ1q2xz zt{K2%!7&mDZdpjsGQuQVGz(PN5;S0foAPQwI3`I)0}&`99F3Y_JC>{eJsVivR`+h+ zy?xKjy7C@fw0B*0Bl=X3*QW-O8{oRq9l>Bzxe?-P&`BIQ^7_GD<0@q;e*IYMN2E@0NRM5eai#iJax^;nIL03F1V; zGKD0n#x<*i^F#*OD~QP_4R8`6JLBZDPe1=u?=_i>%Q7ySt{Zay#1B_mX3?3nyQwTd zCsl7xndU?YQ#|#nODIhV%8gP{MQSX z8qZz{7iHIgsca(0%MjbVu~q}9NjT(|24;1)PX!e@WtAsIqEM25qZJ{K2l8l8 z2!i0cY_nAiSITpr9@a)7uU=c?K=M61W{~$PbYUF(G1S zMM$ij{a$(CJO$4buCO7;JoDWGxY8~Ce7bL@w0&c|pt#M=S{QRb*8E^=?Zb~*_zEI) zzMfjgJ@>T|C{*?pCwAIi17a>Hbq`k>R%fRl*B!~AU9wXyCSUfqQ-trMBdRE>Ce2Z4WFs{g~=s*&~!`N+38r6`sjI+NY%GV5dgK z+nW85gejpsPhcx?Apdxyz1kE60tF$Pfw)JI4el=gAstLes1kx0K#8zy9lX{*CYQp| zrHFjYk&psK6+zmm#d-z7o&n~U5F$uW6E4XDL4HUOEkuDJCqaNHZn8uC8DI;nFd|G= zv6+HsVH2`Rh!}?03KJHD6fF7T4q4I|B_!l831Pw#46uO1Af${fiNZl>!xD>FgcUQP zVrgm-lamYtiyfh0OZq64mu%u71Yrk4N@2t~hL8+jOh_CJAe)OJ1PQ`%73fG+madTJ zO)`X21Z7tjpu8?Vs*=lHj03;Ch;bkpTnQ6a(#4g$MihGyg%PztK?>3`CafTkO9V28 zLDpmx+|$4h#ZW)UK++{tOh5!)@)rgyfdH`oB**{;vII5y#Q@qwh$|7o1(>j+F)hhe zL8d?kkkllKQB z3FsV4@UtR~32S1)q7_Dml{}3CkE6o^6DXON_wG4{YKev8qFoLEC?G7AWLlG zMu}p`jTTI37*RMiH=0oGK!%7A3T6u?(sU|9BESkQjKPVcAjKc~3KQRA3n6!GViP0# z5+#UsC5aix5U6lYH7bD#JG94KaWfEmEaV|?ed}vj!G);+pcRJwA~^-J1^>ka3B@&l z6pEP=m;{v|S!pDJ^615tJft05Fed^y!BCbMmY@VV6-_uBFeNQ&8Ja!Tf_DSIm@sA_ z0yv`qf&g8-h#~@)L_iXvP+Noy5dcw0LT(3wgyFu#gi&bX{_v`h;VNjWV&Lmf0dSi# z0zg4ZKtKRgoEZc-G%aP!@B%phjF$r=L_wB$&3^YwV*~WkxS>kGTw4mD3(6!n38)_x zS0lofvSzz3>Ec#7*xt6#utiIO@RS(17ER6$Rj(pk=yt-S93n^xS&*iQ=9?A;C7{JD z!e(i^rDB(u6-K0F5K3(lD+4{vbZtwBIpU18hXDm(rF02LguD_2>_wb6MKD1C@EYw= zWYqxB-l~J#Sb{JXWuq3dwgRB7y_C8jkl8AuTMZci>?Kr!V++OVd`taZ3+H7BIm;UrqDz5VN7bL7+nc?}SN4eed0h1mc~c0mGwgst8h+vkQV zn}s8vaMc+>oiM;M6ag0hf)8REoIu~E`6lU?M9_#)aHtfF9N)7j;o(wPjm0s(klYy2 z;sz*V6w8S5_^yVf1%dd+lOP3&8zAK^$KOI^?sD8D_ni{oI6vd6KJL)f%v|C|B)P`RnDHd^9OB#kc@+yXn!|#`>mi{y(J5ZWiMx^IL;pF> zpB`VRLw(F3hx^+%{&ANSEL0i?I>hzf@|33?%qfTa!-uYrm4{s+biXf6qBk;yH{N}U z|DX6;2$T1KSqTvsxq_mg02JfKG6geYpmh!)Dk{P9m~ZIj3&K()iwwxE|k=gbKyIKe@%R5BsY_HTK4D zJ>$YXx08U41G5OwJIlDbqhUQmGd+j{Gvb@Q*fRjmTL`^#xd8mVC|Wr(LO><>yy!c* z2n@c)&^-;r7L%H@mY5LpAA5Il~h@Do}z6z!r-* zr`LNUj8lUD%j-hl3o9vD0x57b1K@%w7^|8?x(ejO#^62UQ-G5=IhE)+<3hp0G5}8S zElwa10#QVf;0P{sJ8W4yX+py813HqMJDqE~AjFL%EIbS(Jh;n1!kfFRn>)-SLN$Cn zCj`Or8$XiELeI-Nq#M68<%>LZIV5Wjw_s zG&BMUl{sn!QV@wd!oG1LsDn5;G`SKkFrrd0tWwaYI%Elpn<`Ai4bV~oDi{bRpn@f+ zy^^DXCa67&Aj7g-iJ)r&CYS;#AO(0_0_=0c1hBe+AceF1Q8Z0uG)24=mE$0bbI1BDh`}Spb8<%mpn?IooZ#E1@MB zOw79+jX)4x!@T>rv{T03M8=&n(ZowB=}FQgMN$Fr0>`2al?%X5G({jx#hg0`kEn;K za5RoM2uvL;5FCv<)Pjnfj@C0IPVk7xTnSbv2U|EM4w3?qSVBWvyWnfNH(G)u0Iej@ zQ-a7t!`nxe*t~k+f>23-Z$S+cYF(`%A;L*c62+!D&Rv-!g1L&hssH9ve zORRgkRE$L{CDEt^N}(jZ*7&#)q{Q3Y(f->n)ic7EmCvTLIMA#>KrB%}>^>hHK+{A_ z+_<5HILgZs+G5QdSGmE+YYSI_A2>Y0Oe~}SL)9qa2p)yKs#`hG_$jk=R)qLNj2qY< zT)E9a4d`=2SL{Lj4A823LIhP!-xIkgV5u+U&w=E_-y_4s{5>Vm(k8Nuhuywh?bx^s zxpO*I#rRB+Q;@>j0!|nO`SUHbVnoMvqQfGmc6CBN&>JTh&4&JJ!3= zk>$CwH9*)SJ7y)(3Ix`wJ-pLRJ|q-BoFvh-b6D6bi1r#F0r`dhclZPY@CH*z2vg8B zztD>>;)5|LBso=73@_wf0Zh!VCDFf&)sSn+Jv7@< z6~4*cxg+%6Hf&auG+B~_DxrH-BidV7?c6bAsX&8Gn>0eX1i9LL#Upe;%!ETCl2nV> zf?%2g_X7;nBuOZwMBLqs;mZv48%m&Tj8c_J>=VJX%h8pCNzA;}Sj9??ec2JL+Gb_p z&?L;yq$MK7Gdp`A-Cza^0R)R;31EOT6=@*mO$+Bmk-d?&i3qa2*fk$Bj9JSTV#~H& zvo-`E8(1ToSqp+f#Ueh5iMwwNc z5+BL~S^;_qYH*a~>5yl}4oLYO<_YH|p$WLKp3#|>gy=Juu!ujJ z=YKvB;*_WbiPD##gt1VLW{wzwo0*zm7i&ffO9N>C6rsWVu;`)not5zBjwrK)z|e^X zY2KjWfxd}sUJ0l935H7%3xVj6{tc663w&EHm!|36(6@_*AecDT;+YVH;Etfp#kI&0 zq-e65z6lw0m^pcvy)hck5)CIa>ZneOB$ym@K58u)5B4kwNRelk=;?%@8(WeTY37ws=dT_L=Lm+VkQtge zX|-;Lj@p@h}poU2R>UrL2p2(6GjO~5a?d>ko?w-MvnhDyNl>~xkuilwf;Nh9jnP4bwf*9@L zNg%tXtmpAAvs?AMRm=329ji zOsk2IDv084iHR|515k!(W{IwT@v}%Jl6DdX(Qg19@+AkCJev_yB5B>ISei)fl_&*_ z0_#Qb7`B-PO!1KTUh?pvoN$?w8R;|sMhkQ9W-}FHaXfKxwE%OM7=*tb@tF9i<*{Mv z2!t3Q0L|rwODuAj7tCNzWT5El!-KZB4iEma1s*Zc+g$?}4E6fk5w#s`5mfhDnI- zmEaPhU^AzQ^tE;shS?N1tBar+AQgA@sD6*VcJ_i0_2Kbqt#0sO0F!9`;SRBN5g!N~ z=j?H@6tDT&LVsRNe|G+kD67utC=mo8Cv4{VY>DRSfsps&8HR#LZ4WsU{s#5Po{3gp z_f5AfEU{_hc4xsRhy!1Vzh-Cuu4rfj@Dgt~fND4D>fY-&FZi_{XPvGb_ecn}{*Ck| z>`#&zhA$EiHyuT&i)}ESpze4>kL}uN^ZcH9cBk|V2YJaB5I(o}hd&;(ScKXM@ti;S z8anb+feV61dd?17px)_(TMy?(YnhmY(dP4xx98Y?dPzT;YcUSV$@4zp#jjrrubHTB zM*G%Ig5mCZq@DG)j}w@Fo;_L8I#~&)r+cXmoV(ZizL%1L!F#?I7r}pa2AOumpAwQ{ ze8lgchI{<7A^W+1iGZK{U&L%}&U`94_q2GASXq^ws0+UD{F<)()32Kt+`s0Q0on}bMa++!!mli=cK+#se*1`i zJehvw9~I|ie#2K5*fxFQXI}sQoE9G$hOvILr}=AccCTlNwg&uyzFigFyGW&<1qd$&1`;f2@F2p33KueL=V4_$#T( zUriZ`JUP?mQ-x%pa_#DJszIwpZC!Qd8T<9H{cC{PPdcn|m zFKU-bld$H5x0*wi-ViAH^y=52MPk!D#JM@M$_*-o3;2Rc9!?;bM8a4G*kV8u1qBen z6x12iMnRk$$tuZR4hU47L?{gtR%$aL)<>JW|B^3wsfpPT2z`PMfk>P02%HW#HqX(IjE4n1D$I?$oEd6MS>QS z98t;t6A4Su$x}=`(10_yX0SpHFT69)T|HV5VLE>{&^=Gp)+CUb!o;scBcp3-b|ca2 zP+JGpV{b(eE2gqW2IHJFm;nmiGudSq;K9;E(6i&NB2Qwcnc5qOg;G`ao% z2_5Y`|NUcxTY$nAz&$x+bPFlpK>{!!_7TKpr&~z)en$|E5oApfCf2oo7M6wN?}`MeRSd%@MzbUhDO8k5Zg!X> zhHwud0jP&WpqRS56$FF{kswCwb;hJvF+S%RBOv=1yetwDixH^}i(p0(I~qk>G;GMn z8UjZ!IdX&zf!jnvh5$?^#E}S@+2*j6NaO^vl+4@XMhqpGpnXmuqzKLHHbRE~XKf*e z48h|-Y-x}tapG|W83Q9@$;4M)q!q6u=0`{YmJBj6l4|KA(3B@Yf{4qM*6i6-L;@Z7 zVCR}J?B-AoML8RKvz*KW0yJf4PP70qjAL6TJQamX?`(5`GVuvqLf1J%#xp1_Gs;Y4 zB@sZS(*RB4Qa=-_utAQ~p40T=J_A@#g+@l8tr5&gx=7KDHiwZ!BPTf_bnk84NxtB`HSt`A&zxNSYMokV|Q*)bud4 zl`)x%M?U0|E@`u&tu$#x^f}bexfCbb%qCA?1g_&W45vQPsA;6L)upok^)aaQiCb(V zS1^IqMWZa~0Q>0Gmu}HTFQE;G)|#`Jsx7Q-ljd9m8=m`>B<EY$MHMG>U-bNk(PO zNnnIlt8#I!X>n{_R)W!kHvbbxzZh|pfkT0vR$EuUL0<;Hd!hk|xC zY)SV$-|JxUwcrS4OThu6F!2;U221RF8 zk?lap@G(-H@E&C-MYK$jN{Jlc0gVMIhJy^1rpmOnc8h3czf+Ll0!_gmCG0`8lTWZ1 z_(cY|g*{$z3qA$a!VQ5BcWHRp$x`lcQ8vg4EyKc!oC3s{*{P7@+!c3;^pIgO&rjFZ z;haE6s!f3o;GFr;?A~;`ec|Mn<&xAe%apzy21a)4pa+igG&I_i(na zk)DW6IMv1^Ub#~TX$1xGix6Qht00Jeb4$Ei){X7DB$kH%2(f?i>v59=fzP#aZnd~2 zg_vQj_n5SyaYBkR@CM!}X~nE>F`zP#p%t%Ka*o1h0N>~e-}pAjcwBMtCoW`?3^&Na zZ_AK2xPvhNc!j|aLg0#UYKaE9!!3|>Pz^mbGk@UaLhjH_2SW#p$vnYUyvYQDvuVr$Vm%L@Brrfdg?Q0s>$}njy;o&DzSdmM+4903ZNznz~=9&JX}0 zM(7K%qremL0f->!AyZSx8Bnb5YQntj8TqMPn-b6yOGMCGKZw_{nx&!Idmy8u_CstI zZG*_MA*_R#)D19rhj@~XX= z@dNbKvcXgfGus0v+$){O2V(c%zs~a%x!pkM1@sCIEsjP%17$qpz9$*eAoMz6-@%>0 z;L{)0TZJ)Sc_I<#VZ6~q-V z;Rptw+;oXV^;KNe*=!9&;_wR&Rz%1Iz=eRHgZ#tdTwRJp!RbN7_({Y+8N?NG#XKQI z9(GWu8N?l8(BBlqrDzHVk_Lz5M+kPIBRWd-WL;Ld838gK;bjd$I8yjz4;|7_rR?Dj zii|?sjxBW}Lgd{-n4*MfpF*4+MA*niV9f*0Oyo?24(3uFGQ-6a;Yi1Kkiriol8b{2@VHUDY52ym4Vds1MvoVUzLMgeZjFF&=|0VG8LC zFgi;@pwCtePbZp*I}+nXG@>ugBS~cclt%E20aZjep4mM(9~=^dDk8+}q={^(A}CHo zinPo@O4>+hSVHKSe{kHu#UF<_+#TJ7Kiq;p+`|=4PA}3UNKV*8*w1Eh%Q40n0478R z5(G2t<0lQo%Tyu{63A4nBt>}NAXdvqJm4){P!B2|n(^8}+@e90SPnUm{27#+g`^k0 zl*O&rMEqX~6~yB4TnXh4sEk4GaL?~R-!LKsjnoY(42X6l;Xx4LRA%C{Q3NV7MCk+o zSnQ)OQD7Z$jnwHHzUT|!sEjmflsqz}+ri~VfFVgNj@Gb`EB*#aoTTqupi%51N!UvX z8o=nOM9B1-K^Pt1u$NK}#76@ErrQVbL_64m9T^61JRo!$0PDa}-?f5A*u#KyCuc2%NVtMU8bp9*?CA zgPtuVo4`eW#6$#$CXX`z2mU4L%c<2>ofWecAd^lhl`cyCcxOX=iD1xWNLnCd;0)VU zshA$wQuUgbuA4}jNNFJlHjXK3@u!_V8S)JdWo`nJIt;mRqcCQKqxH<0x+z;3Xnv{_ zh-KC<*aPwmSAU*`Z~WO*@zbAXsbU~l7?K{KUKkhJnzVr!VQxehDQaSP%}7xenGPyc zK89_L*QNSe3F4Hg5>O#6){m`)+M$<_cH^evs)Suvtimdx&QOs;M4PTETM?&vi6>CXkF7lzZcW7sEt(%al8TY0r4lP~A%M3E&}32S zbls_<+9Rau>T1pZN~!7U43*rpVyTXT2)q{3wNA>jlGBsm*1%Sgxw_p#s*`smC0{I8 zOOV-|!j@5xl@{Ss85-G$1tN8TA;o5)u{jm;309;k2*u{=!4lUw657Qg8@6^9sJ1Lg z1Pag09an%B!6wA8o-9YfDYCvQo`xZ6G|VE7s>F6$K4Dr>+-cXOsm&El3StJ%xT?>Z zY|)mh&OR1u2%DX8mu?LT^(;?S)tYZ{M3wpK&nhJfN(yp4t)}i6fE88P0BMI2=GtNx z@9pW;{#tmY8&IL3SeO;wG6h_5THEwgu`O&-A@0IrTNd7xY-I%isV%x$?A`vVp52wI zeumbLtx&Q5mh$9>(&lYE^-)Z@*l0pjubwT;o?FO{Q|QKR=XzG3J#FCv)yi5G;o_X0 zNflvsYSq&2;YzMby{za0l2p!I&IM!UN-B_ztiR@!UUY=a!Yt~JnrLY*A;}#@G;4?v zP^~Jfy^hwca+XbOfdW)!CMJNkAb|R&@A|gy(ZR2y$S?c8ul>3&{>Jb9>Tmwe@BaF4 z|JH8+(=P%4uK@Ee0t0XYAFu*9Fatku0S~YNNALnuumf8#1W&LA_b=2yDEO8{!SYkT zUQxBGZhms6+r&q|_KJLXD8f*0_*w)w;VQkJ;J$uv;HIuU{e!OXaPfvJ(q^nT4)J*v z@!*dCsu3gc5f3r&nlKLks*~_hdQF7p$)3+TZ>5%Bwgw})<|-Cz6c+z*7X~Zpf~!{$ zuW^;C-cV$tjFQ%1K#9+fvxDX|Hz}vX!w2jG>h( z>#G*q#cN4&vJ$ahg-+r^m*V2GF6Z1W^Kvfx@-FwXF#qx}2Qx7rvoR+#FfVg4Gcz(f zvogaii7e?L^YUyhv9U=j;WF)fgcPAcss2UOhr9*kR)w@q@hOX1r*87W$a1IIZh9sE z5@5C0c>WiZwJSY^4tAh&+@94o3o$7VhsS#E++GzPJF+O*73_j@@fp=QUx)7oG!U;D zy~6P1#fpA~E72|((MlevQnGmbCpsH6zvl3o8B|SFwCB_uLIZKcu0<9et&WbeP|WZf zPpU*uA`H9mAA|H3f3(}~^co|wBEN1+>-1i6no>U+cQtkAIQ3GG1vdAz4p+pyMsXYi z^$us-QdTjg&GA7m$z*6M8P4>knsU#gwOQk>T9@%zzcpLKby~~yTFzW<aZ%upn}JIhe;8QLseS$DVy|ptr{H6^t|U6Phf(%qLw03j_GL@|cI9ez zXP3x7-}K^*A4Rl2HEl;VR5NvLiv_=OvHb!^k$%jU;nL-CsSRdg?ERU3EeMhO;w4J(tX9e0>%Rd;jG zY|qwoaa*-&m-jfGbYE{TQDkk*R2n)(-=ky||4w2WtlPI#47 zz}1V9co9!=lIO&d%S4l7*OS9|l*=s=SGhTFGmB*TluP+NIk}f3xi@M#5py|}m$`R< zxe#mlTafumFR?bmxSeP5LqqRp+bv&FE0Iezpr>tbH}Q*|xmO*!p~ExfF8Yy2Z$4FMKF3x!cPM}Wh2igR@ntG8s3S5-`}(;CwBw(PPuySzTTvP1jxMmx1n zyR|dBv}1dtaIR++DIh-DoNkhHoNo98FV@4 z@C)m?sg5BXce1+a*~(1^H7`bJe?*SDxQcwTOnbOfH@}>IFuvoO31&>V| zTB}*oqED9&3p#ac)2~_I%set-?8$GX{@lGXFI9_;S8E);SEJ>R91Y)V?Avj0q>k_X zllh!4S*4p{qLhAAvG?Q%s~i6i@7eL{!xk?u{n&i`(D!_U?~aRkyGii|gXb;Zls@G5 zCSRjB3BDmmz3_jRkgbr3n;f3uzmR(i+;UJ%649sTz-k=m|c3sB2m0$*W{WWGS!k%8=6*HUIMCwACgN_bd*oO zbZ4YXM*1mVnd|vwU4hemHKUtf`nX}0d1^H!e1F;|qF8nXDVd>s%_x&@7eU(QsHB!^ z>ZxumN|C6O`P3vvz2%^=f3hc= zZ~7ezU!>DgR;ZjU(kG&ClV$}Hgc{MdEVBS!Hg0YI0hTO_-@XJVbRGq0u7K|zyY9U1 zrmI%D1)h7Ueb?>;Voq(b3ahO9I#nHv#j-`$Y-Ix1*+u{p_Un!i{)gmpD@ny?!|n;z ztzeF_hhMn*%GoDGw@^FKiY%R}WPjAQJC&-9o%q+bG4I%!NQw3g zqT8D?wVtV(WRIv~6zx@)b3Boh9liaP^eNFfVdWzs|N25J>PYx+2rqwCtmG&E_I}Zu z2kwOPOK87^_2W@MjYwH3nNI>+L@?Ls>_eO?OGZL6u1n3tDB=VUpupLbY|itY^u#AQ z_o@HSex~!E`2;9G1?ta$8g!rsEhyS%6QgQ5P@5;@RCgvCFQ^odn;6AtA*Xv!yV7sZ3cqQVWF$wBAhw7li z{nU<=%&1bA>ar#Jl&Mf%s=?xyP7h5rs#ry3T|T8Rn^_QKO&yPnDCHn;ItxMd@}Gq2 zH7dR=mWEqdWs?Z2g49r%qO~aTAJ=QiZqXV#=f-yIQ(9`qG~M%DTeME_SyY zHtlwoyWR~ic*pzQ@`@L_l?88ZW@*=B!B1{=%wR&kVF`tJoWb9p! zt?mNZ^tJZDu%#{F7K~cg+Lplve%FBIqSyl4*1`xgu4K+35JF5u5giuDDe_C=xk>AF ziAq=@1x!}(ePl)A8cKE6rr0zRYN}}}lE`*^7#{1m$3XtEkPG8uA_sYU_N>`O2#Z&C ziHdzR6wicR$YBpd1jGkfhCq}t3K6c+nJenh9))f%x694S(<;|v!8dj%sD?3z<)a%2eB2uYczr)$`HshKpbf-55&@7 zR_X;Itf=rvCMoAyOO72EDh;zX(~N|o!EnsQ&=~4c9C1}rb!)0?Sb58fP)M#9qGe&^ zTFcAeGOCX|9fEF$mXIN6jkt%D69KrQ>d9_R@7hk4R@;EqX6d!RrtNNL``a+xHUh)# zZE`DE+Bp3VNxg?Y(Ih&)5XEprY<&<+ciAAm#&wsqjPGDCLlDE>X5z+LL-djss3Yu{ zsmoI(c?Ud&8B;A&$TsWtp4!wZd~}u#FpOXenF5&r*HhR7ctOJpaJ zaz~6K9p{)vnb(}=Ys9(Db1ui8&)nxXj}umvF$j_mr04??2EU2EWdjIfAj;tP)A3yi zmSfc}e9U7G8N;2Gt&BS&@%qcq%sOYkM6h-J?O=-rwjiC)o^jh-J!y8&cfoz`b-jDt z$#u`T(_Qa?$GhJXmSoU&Po`(BXucw4oQ87tlrD_4LZ)tjNI#v@!@%?+Dm@I9D;?z_ zCpqRFZuKLIFp^JMG)VhQn#v*3Ulnx3B%~bN~C^4?q9-$1nc!lmGnYPe1zC zum0#$A^Tmhq9Io<5POII-ju<}op~S`7hvR~Uw3I9rzT9SfCO7N&tsmvoCD49f6%kydg;_;g7)5G6-x zAU0_v=Z3-NYf(peW0**Zl~CF=YC;!?h=_>S;UO3&g&Y6(Z(8<$ASMiWxMg?Pc_b(h zMTm)7riN08a_*3bTZC~9W^tQQe4?0&s)$>sLW!NHi6Pi!Q%8wg_J)1PZ@Ff9{3d!) z7lOC=hPil&tN2Gu5+5hV6Y^0V@i&ajh-yjT4|B5^Y4#K{qZj=Lb@yh1Pb->~mW}{be;!Yt!N;1KK5Fr2< zF$Ei-1QwZ+jg$c42r)cEai)@uc1U?3_Kmx!4DA1C0OS~uc9@e=C~TmYYn{hsHpz#A zAPlacl7f_gTE};OR7DV>j}+kr1`q%c@dj^j2X3$hO4*f$)Et@96RbjsAb4_Jwt_@w zi#pkFZa9z5Zve=MQsDbRbi(c7D%Yq-t0#5_6j1b`kxOWK)5dg1X2Ltg2 z60nz!sYFO1Z-&SeCD(avc@T7nlVv#&ZTO8O_z!N#j!SrXfas7K*p@hHj*q!Qn-*4g z^)?iTic@I-3E&}Cxth4CLd6J^a$#~1QFKKq5S&1H9_VofU=NVUnQo{IEi(;{NQqk3 ziyXI^xhY>fvWVApF@m`eRzR2nkpv6j25VNklJ`Sw9#(T=s_F_?`v< zf*?i;22c)1iI(h`iLmHv0!W{DeYU7$qrY6fozPav_z2*_{*d26ix> zZy*H+nxUuCl1s9Y*+qJk=!Q$ki6PpCn)!6xpb!98ga(m`{waCwP`s1gQaLhVJg}E(HXn1*Am;Nogq&5qX`};TbvoxcX8d5$s@1|F0%@yoX5q!3I|+6j)~HWdnvBxiyR&ikLxZ< z46Wlp03H^^Oev{!dTK#wkvE&?8OjstZC6SP+N*gr=Z_C7TKIxkx#sN5#B;mTPxo4aXMLYDU?4nNIn zggs=azUeXUZSEQyf^IaUafziNz@g4(I`J3dBG`ND5E+!gkq7)e(hFMP zzpmbqL>oQh26!YDg-?<$p^cL?{lDZ$&oDsY9a^Ei2AJH*z>~j;_-&%EeRU|l>*K=_ z?(eDq>QxyzeUZH#>pZZfM}>s!yT5877p@^<@9H;b`<*5&$`s)%P>lj_?rqdycqU-i z;1MZ?A6UaoDDtt7lcTvi_R=Cu8&G*)2by0Gr8TrhtG_dzPClXOzngTg@E!Dp1LXND zGvK&n@L{~+4|oeio+lJCXCFX%_;4m%74Bi4$~tJUXK32MuXp93g???y#xiF>6hACa zwE_n#Cq=RZAQg~y+iKQ0s_!p9bV{LU4bb8TCh`M8OhC{OkbxcWm|{-k2T{A@z4ANHdaR})hJK)IKItVgl+3ZgfN?D=7_QZO013iH%SZnyC(p?+;T zj*uJ6WdwSCt7fHY5Oy&_gXw-#b*}FT|vDBxuDjf_-xXV6^EOimj9t9 zILRHuqnqve`rb?<;mE>e__7%VXfaJ3Qc$uwB)0;|eIQ)`g0LoVwrzsk0q>u}Z~zmO zQDr=7FEW7< zQ}mqHA@TQzkxdK?tV0Q&_Wo1^`xwCuJE3XZ;2|&wYfAUG7JQ%}l!7ai0-pCj=H&sg z-Z0I}kBLJ--x;!|`5Bl^NtYVbq7G0b1<&e-L97>~c7Y=aXmDhbtl6CTVx&zbY?-GBYllL9&E< zQXys-sh0d)g6LMlXGxpsH3Z#+YeS)*K659j5Qd;`OP4&FJi?!F`)@+!zH!qvgKUUXgTWtLfZ#HL%7`{?50iYg$a$cA$0N&^U&|qAp zj7o=XeDK0rC`j6oNj9)N;t5njM-BB9)-_{s6PPACbkX?LHRx4+4$bS8|VIE zek?iC2}^Y7CV9p=a=LY0sXNHP5JNz1tr??7YngjiBL4&qd<70)WeA5gdc$(Ure4rZ zdZw)|{+Iz-ufn4aDk2x4!<`ZjMG)^3XPGVWm>`Fr7FQLAaGy++XRBcN5NNpbR(4}# zC`Lei11h9>3_vt>=RYyge^~^)=0} zsL-@`djgttFQnQacHuC%YytFYNagLU4SfYn9dy^caLWgy^B4flUwAQmp3&kSmWAL% z%_-A@W6dJad;}C}+v$O4tN%uZczMEt?zUa{d6iX+tF>T|!GQcC5 zpEwKO@!N1;70*JMCMy8|JKYP9fpdEgnDWJY{I&~~mdpC&i=;lR>i;e;X3@3GKUlp0 zg)oAfoIMjMSenKeXlH-aa_xKg?zZ$ISu(G51WZF0s3Ds!@gAtCdl29Sn{o%J>jDQD z;7x!@yJndFP?kPywnq&LO$DY}OfnI|6WtexE>;|Qad$Y^sb=T(Qb)LEPH={AKuoyF zGp&^cH%D$e99fFCudX);;eRwnY-Tq(cZih#ZHCHRZ{Y8eJaurxq(FVvZHVC7TIp)m zSrA5G*b87!-A^diCS}^Giu;sYKQ6(*Y{}ML?o3vf_#HHD)Etuv1kc~iGy-0F0kY`f z1%P#Y%>44jD(|yHW!^fev|sE5@F@P}^qiy70k^(5l7E(80ZdO*vE+a;)UwWz7V>d~ z^fCx4yEwjk=` z8<6i|>bhc-Of2MQNUM{6d-#8WU0l}})+4cmPm~McSaS){&jeSUpC5ffe2gYa%%v#P zMfg$szMILbiJC`gl_cLa>`V+%7z+6(n%%mucVTomE_?DTJkhDo)wOzs_(qiQxYp%O zT+PNy$2GpjG5q)FyBMTS&MLP28+eSR_^(6l5d*&54WdQTQwLjWGbiBfu6m0pO@qw1 z@WXX$%@#NQd-pIQg_gl4mM(+}d-p$jLN141OQ=69V};$d$m2hIfI?0Qz=>^mgfLy6 znlpLM!MHnhus9N!S6zfKvq@m;0znCd2)yWYtHGA~j9|J5prC4ov#;|+Q&_nwl{Qk* znG0>u@#4N<@SHVZBDz77l_n%kWmuPe?rY0&=c!(VRRFbnrf+LGeP5xO`t&R+jIx|4? z1unS=yWKjhQavhxQ#<~8#JxSHSy9-))Tyd#RhP6?`{nz)uV;dbC+ey#)~EeHm(@MS zmKF3rD0Z7V^~p025K7+9my7yIbiGG&R{764#Ul92+!XG+E&S@BjL+lhtFpV|)WgA6 zNqly{v}r#@bGF#BwMC zFgwBJO<5&9^Pe)HuJVy)Hb6@i;~Zc4ZPFE$E+(W4X=_HJ7|EPR0l3M5wIt1jVUupi zjc!hK+<5A1w%&_w@HryW8GM1rc2u?WWvQnSd6hTaC;F2hP|G6KUxabzJ%_72^OGlw ztjv8?-kg3oVwAW{pU4x|0f98kY)ty?s?KC-PiSI(&h_xio(m{{X1<9tYeSMF0P)Tc zEEo*~Gw9CK8I?{&gMAif;jVNMC+4)r%%R>u;v2O4bQbSYcyTCs8Zn z*^UR?sqH&!f`_h21QEE5mBKS+urf#Y6Aswm;iCzI|sfFER0u+J`vWF+2`^n|6j zeG58C`t#9eGd<%8Ps@<13P>2C>=YJb3bTGKtGvF7B%-u6gHUfsVJ&C;7^TT(mVu-= zry4;NE&?nt4U=>)YLrxzM%{j0GAM|_nrNX}3jOzU;&F4L!T8L#v(3v|ckx7Xt z|CCD$v;c4@wN8kfB{5+$-Q+91M8Z6jJrW^niiWhlFBn-B?VBRYNm{4p5Z<-~c9jnD zYx`A8CNrr*F{iWkqMwx}Ney-(@O>H*xdgB*82rag9sx6nXJpg`AS1ulx&Qv+t%#*S$d-E_Kx_0#3j|v42=$14pFibw!nx+1kdsW`L)xuiV_O#5A zMEz?PF07krrwSZRT4BBPriZ^``Wg0LXWpOPm2`zvdNT~zs`-#;+MiL+%KkB>|Jm(P zXmue}XdFuQ1yP0rf(7vDu|;S)S_?%71!x0il&LOECd6f4CD88fBKLd8g>D5BA~19_ zEO^hEw6g_LT*CG!@cSl2Js}wtiS`L};?uh4$Ej`v_6!<-rWK5?^IpfK;m9H&KvzFD zppvas=}q+o2EbNA*Z7z(K<2T_s{oo*KW{%3I6trKNj+BJkppW0BCi3ZKujc_1Voe3 zzd44=n{CJh+(#k%0Sh*2 za2^*jBT4Uy+x^FKhaqTg*teA03u|lRfR3vh0N?@_ZK|nmE``lOs3^ma0Bb-lE53I% zemma*Ytho*RQ&b5M_QGigf0su2k2`?9o@yW&EqvirUR|9v@Xd=fvGN!@C#I)s`r|V z-y7#C6F`nEatm(|zy`AJey#F_1oq1LH<#rPJ#Q7>IKG)0mCfz4S`~I>xfD%g48!T9 z;>2I9(7^c^`qFp=_8gbrYLC^zH_ya52QQLqTinww>)+i`^#~(Q3>MZ8PTT-ffmq&D z+g(S+$eK=FXjq94fes5U_1!=KfVGs|EI6Oc`T32w?N%bhS;ha;S~3_Yd-UV>Pbm&# z!?ZSbC zK}{U)Z_}Mzj5sm)c*$mXfs=>;lh{yLERj2|&(V+>EIt$*t7$I%I8dMfc1Gt7P&J}q zD1PtL3T&(txTFA!-t!+qGLKFBGFsdYmKg9++ewC?5je7~w8-RMj%p8>#DWXC6Vl&) zUg8#8mJt0U6T4zDnrl*?2M9QM*~vx~%}s^=}%)C150~^xCdX@ zvB(rY$3;f#s{*vWrGP`d9Apw~G+cE!kzCs&My-QKZ>xEOX$0^31o~waNEtHadwX8f znA0%)eHrP~$(z^y;xGOXqr6nKhU}}bx3Yf=cZFC6%SOJx&S#`kuwIYOz!FaW*sn>| z7fKZyY7%RQGwiM^?pzz|-P_IaFp5O<)khJ8^xaTX34Qr)S8`O3GbWf;L0^oe{k241*xMT+;Y^aD zHRhps902ZJkHpQm#KXHdbFpai=o%kMwqO;%#oibAkw$luVXQHF&d+hEVyl4FmKo9Q z4--WGqOno~u$j1}kH7%N;Q;SRy)|{z@<;a=X>_k@5>OMdJsIQ*9=PtvT^dyU3N%7a zD1Gcv6ndW%rm2G;$pw~`W9ffE+KP6Y}BBPX>qq8;2s7u`QPNoqN;bPw2T4enRq z2`1?ufiiUw4!S@|e9fh8)wP+-M3c7FP7zF=27qf)efsGf@Ts<$#+*t5LeqIJ%Wdw+ zUt2R(TNMek2hN?{bPkeH6|f}sVIzL8gYyIc4koD0nc1u<$VeslmA}q2$q|kZZEOYY zf-ySxqwOrhg8z-S$$j|5-O>I}xPuXY{;u*9Hhl-y$|oL;dCCm|5Metb3pD_YZ4bn@ zXQd_-jI0is2h(@3e{E+qpBL=VVfovRC$jKcbAkQm7*ST+orNyX%Z{>CGER;e^tBsIC| zVy>=Iyz^M#$RrJ75z$-o3i_VU@Fk{2Hqwo$?IgEVzaK2V1ZLL*shdC)u-im7(FXf0 zg`8Q0J3RC0;M3hDg)X#z$YQol>2T^&eK5J=m|pgzUMjyn{hltem09ikvO|cHK)6UN zWBU935Jf!R!zu&U7^wW^e0u| zpw_gf4oH0%+87H&n1KB7MekMB3N5)(YHv3A%i1_~WTiF#t6!@<@IrOmgxs>1Xy;f} z2vF&SU@@1c+B)%ex7BL}eDjd*gOwr2`<_{ny*=~u8>OBRMAx9V(E)#?_0huqn%)4T z5jBK0B3$bmLaFo**mw#0h`@8lkFCY&Qq$Tupkbd;rHI%rWPfS;HlVVcAFrx4(YXku zWCK>e>rN~}jzNqBiq`1MjPq7ZYohoQpRQb&qdoX5eaRUOeX7DxMzvI>zqfOWy0U8s zSBn3b)Ksm{uTw4O;>(WAcJ$`_8Pex!gWDE?TyufkO5g`%rdN@f-|3U&riJ+4<@zjh zwC-|`WoeSh*Z5qXau1|+@Jff6Njw8ch^t4|8kW_=vMaYx9 zS}Zbk3(wV|&lUP%bn~Clt%t=_(qjBJA~1I4wNF|f_GY}QsSxuXR3N?R64Hc?dv%dp$!&9bD7i9e}I*e(L! zTjFCyLs?ynZOJYD3HS5IzN#_2vYrLMBs7#AL=yen8l(sR_|LL0l;>|!%7>6GwPZr! zTbN7R{#DiH=cird6dS1R){`U~bgDhVnxov>*kjm4`v5G=zHeM?9_VWRun0E$W|ni* z6z7c&=tA;{9_Y^QyE<-OCt0%05wVXSWTjF%{5zP8%>mS*gc%N7ofiS$96fJeE^8eo z;&LIGwu5g|M5j8Q5!rcyOkU5ez5PWUVMJ>97ivS{JVfU7O!O#*A(N2FFmBvLlVS(s zP@N5rbC%lcr9y+XdScRa-AIIse2wrSEEx_ z_VcXtQ4~4%>&KDFsMvoAh8-)P!7h$myDN;Y0$eBMgJfyrPQRp1B9glB?y(DvUWQz0 z<4r@8|2bY$(FtOaKKB4;cb{z7+qQfIXP(cti$Xe^kCBWn-9!g^XD&oLu7EyhsUzwI zC#9^YA=rhqJ^M5i(YsupQ`EGrY{Yo%1g=8k7Wtg<+63f)&%CowThOF>rK ziDIwnONWtbPg5f+;sKJn*eB1gyJ~0X8xe1Mpkh?0RH9L|M zOR^RDWvCtMbhIX1YLWKeDP*W%C0lgNgiaIUxn7o z6(PMZ_e+tV(;%dgVBFxSGyniPgd|$i!VY$uP&>h5_qcC1U1RXY*r#2L%r~{HU8D`s zEWBaX5~)i)QN#b5xce0d7t~mN|jf z`{EmOAoe<7*U!lM=^LbXeEH|J&>x5O5y7>whqXOCsnhPyx-U@3p|ny|ZdSh2cv-@B za7zh8JpZ%io>;FBzqdlc8Q6bWMF2@P$9qK=S*;%L-jlc6hBim~;by1_ss`ochICJW zBgBH_V|`JfsGT?9$DnKj<4tl`*lf@-^z=c(0fk{L4O0gJf_GMopEZ7q0KaB@jU&sH z`w8rfcl@E3qPFM1#9_i`AkS1h!{V=hKk$3RZ*$Q{Bc*@EvsTydZ5bmN|4kV4#J^A8 z40SxIUM^fYofIWbOZitQu-B84gC6{PtyVON2gbq1BY7&8x|ALDgFw(-jDJTq0tX|& z$`)%asSoO17FwIOmDg^fbEW&PTPlfDpiQ(qd0jOcRb?w^F}3*pW1&P4&BNHz_6s!V z0z!ZHonx_5Jx9>vV#WzV(OxmeI0KdA2Yt65Z>5J+jkwX99tbK;kP;f(3x$83>vfvOQ zhsr{Q4qi=(n$-pMXP8}0y*AmmHBOIN`+}COjGj03hNsj&f5cgY<2}>p5PMaQ9nM2} zL?wQ6v{*yDQkNC1u#(qCvBFo#7+ARz5?V9o3thiD_(hR5@K5^TF1ls#v8yJn&@BHu z!-+Y-ecfwJNfUkx@yS_k*O4~T*=->3wp;<>{N>2rE3uEP=;;cH^1LS*29KUX#pohf& zWQN{F9c`gCwICajI{CG)BGl9IN)s@2u3`t4N?ghn0fytstOXu##dQG@4ik%6wQ`1s z#+yyw&Fq5@x+)Yx)5R-_yl6r>)09c_GtoJ}at-ri&}@$3Dz01%`E_d5H2F>9s^R4(Ccr=cTPFqFO%u!DS}fpj+lpCjw~%SO??X&w;_j*Geu>tMd3f- zSzNa0{`DLpf>gveTY#XL>WIqL!+Qy&F2 zUv_03+|3PpRRn9Yj5i1~+p#b-Y4XbIY0}=Z2pqWt{yFijtRWw*?2TpT5RI|c68tad|Cq9B?ON#i2E7@);=hEM z;o<`z;JoNjnL=zC%2yJY|DABk%q3}%Vg)2;*U6S89Z$ddvx|fouu!=UFCaw_>wuW3 zU&0S*0p&dJA9TE)S+wQqy^;EFGV<4^@0VwrOGGhhU3+MSelHq#ZFaWqrR0JZCGMX; z-o4VTe?ptotNo@Md(aaD%538sWO{eg^A0=qh5nG6Lkp)W;H^`nnG~T=b8iW@0FGRA zr!5l^sub%|1$NoB8(Dm%O}+cONS};YQ8Wtb^zSm^1=!t-$F58+{Q!pk4H|Sqk>ejj@;)#_o$HNE5^=R-Gh&sY|5;h$IEDrZClU7az9b!8wZ&*Y4HeFdZW+UHcsyF)x;+bPQW+7IH~#DGK_&3E-qRXMCas5l$sUA`^JR&HEs zh}7K{?1Aagk*cc~Y`3L5T5qn=>NJXwJbdC7gZQQv13*-HX!UfV z-?U5nY=~9`L(#NSt2J|M4#*jg64^(ZwCu^4r0M8rhBe+#ZjZzjcp}Gqtkmv241g2t zt7XoUj&m+D4m~)^5gkzg-RFveGaNL4w&>^?A+EhXY7rKRrecRqt<5PhAnNodWR{*>nkuXk&q#Nrdoz@yFdgDI%D;PUXnSvFH(^sb$BcT$5 z&1NnoSR`AnOIEDz>rQBMj0;H@j!;~zS$d}`j%z#0}a{{1>CD`!8J*j9i07YdsVaWbXCX94zQdnPJx^cMiOJ%*y%f~%j z)rK&7%98@vT=-C+*6s>;M}w$Uy=r(&=a|M9{$dkP+SK;tN(I<^R#gUoEh84;%-Y#L z`~$V3@P@AnRg15V2(0xdgv_He1I-imisS_Di2265*>#Q?WU&5_^fG{(h}4+X=|{d8 zC@YC15dfTZt|t)$zgfQ(8rTIkSc!54@=LiRCu$oq?$TzFxev7BMboJVx9LoTTIj-E zO3PKBqfTNb)eypRv+=I%cQ{<_&CX%SEi+O|o={rcs^cWXv8v)YwhGMxUAF5vrXgO`2)uCMydF%|XUh7wnEu zIgI7xNa=ESV)WBKBNBZUWQQibBs*wAv#mbdw2^cWsu5V`-K;{mbLgV z*uyjYumR0fdWaP5>Biq0gVA*FR%@bK)oI(U`JN+koY;}2Ild!ml=}#}IZU8cLbQWr z2Cc+Ub3qgB*VJ>LyER-J?!?%p1(6RItXazFyK}eH_b%4ldPf4mU;1Z@W~jM;yz!PP ziazxfDimaX^UZ9T(hE0dbple<;hNP?>yLEX=QNv5VnuAw64E|5=O) zvmOOgG~HPYpuM22{RH$v$H& zHXe;X8qgBfPVjF-b!5rWb0_7sF8#oe-%HfSPJ-Jl>*E2?e|9Vt`E45^e-2d8h>}qr z`#Gz-vM;$Ww@Zq)h?H+K`#zg_z5e$fPps3YeyxzmE$htq2TQUFvQjgj$%g*vwoBY3 zMn;Sh`4 zN}#=M?p@lfs~EJO1}L|NI_fw92q5KP#1Lru@}nC+6gMz$dIN)lBcFV=zoqv_1u^sI4=Xa)H{4*l7oSybqDnjM>3 z_Khv}YHFst&9On*ZDK-xYuQlbZZKWSha)XxsYJ(piorx%A!gKt@F-V*x#)TMEm-}4 zT)lXI`ctVnhofe5;hwDzq*#^3Th)&Dp6S=<&hgXO5;}~HIFViCKA4_?P)dDQ^dAdl z_mhm3UCKCgd@f{xitw8=UNf29NxxFm)8g)2qH|uWyDp;PGnT5_$=_<@l7M{zE7~em z)u;L3(zPdK|CsUHN#%(un93_tnh27-cOkCZ^s%w#jJ8@}>jcRr;cAFJ-D;Dzh1AR~Z+Ln8_q0g}HABgi?qVpTS*1N+a?`K}Z>UQu z+vi#^*hy3;3Ln@BR$GBIm{*xj0<0WEwGIkDf<-Z zl8Y-lCn%ojoUMJC(e>NG>wb39E9*MIN4Gh4ZR|MDU3MSnp1N&yuh^{rLlu@)f;@An zZ=o87RRb+tR=@4wbH3#*Vds=+7t~yJ|Ai%cd3HdSptsUSeH@+Vz5D*sF@6L5v9e~$ z0J2nR%hgU$vaBw2j|dsu^L@*g=u*4n-x3iTQix1~v;u$C+lbN?%m2S86RCDzC zHE8(GwrP3Ks1gLZ=HLx=S_p%62Tyz|#W)eaO}@fSNR&x=zfqN5%w#;nF6qe8w?Lef zJY!A6B~Wje5oZPMKE!3-5&FJg3QP)+srh}yhJDZaiXkbW8Jf+ktfs$Xj|3+nJ_g1) z2HqTlMjRZ*U0#WDnEM}lt{_Htt$vMmlociTyHL6(@GWBeq+#8)Y0SGT_&r{y81?NO)lfjoWF zNxj8xeH3nQwUJQ(Cr$<@cTt{v5XMQr()A&Y$(o9%3{;PIvfZG}ZNA}hT{Kf2T3`K! zdxW8Jq??5Nz`0I2c3_03I33wx^-7F^13rCNy4zsaWZh--bSTb!DXg(%_jo+oae%od z@6BoVU3KRzdf?kWnk0A9sQ64TK4`DYE}OzyiZVBZw^twS)^-a;z4PA^JG6ODplWAgu(rrpwIjZ&i zq}$WD|NMAd^+Yt`r2gEj&-2GW&eOT(a|*Bb-#jl##x8I9E=U->dvV7e6#7&78d%S7 z%znU0E^_C1$b4IV-j-@}H!g^d{)#K$H7YNw&w7JKNsTjcNz{EReM)t|8@&4Lzh=Ab zgBIjL5@q*AcKZcpH+OWcq!>J_Fhck?|MYEpBlh#ww-Wq4@{fQ$Kdy>*1)pcUZ7t}T zvn}(}h7B!GE__A??-+j9U|qh}^|&GR#w&dljgzB!e>|-@{tsehgj+|16W)Y-{KTi; zL`#>%7p=s<`C+7OFiOl7j6;Cr*%jQ+9l+p9^r>PXwbiWLJ-}4Gn_Yld@=UX;^>DiW z=bw{o1D`Ku8hbV$TeP%q=B?lLI)5^A9jmp&`K~eXLLE5nSAPh zl`|p}-Rkab82)o>^$~dCdHvtP7TYIICwl>wuSjY?0j(>q4}9Le_k!HUmq2rV0pbn; z%ypDRyI?^BcYGZC^rtY1xie^!{#br#zcLrofwLCGP@fT$qyidBi+j%H>o#j1;TVS{%SqK z8t-q^Cxq2McB;3us;cn#dMnEU{!iW-^8e?pFQ}=+E}sm?fC-r`oMm_9;t3#73r?7= zVjSr+q8ZgI=84xJAv3zX)=IS`Fo*BPq;A=CECsPqW^Ox^RvwKUO>Un6yLzICkHmi8 z68pz8`X?j=)MN(}B^-A5h3oCynhhLTR-5?&Tt-cn_-}qqlQ){S@YFaKs&+j!DAC=U zF4D+uw&=AnrC50_a4=mM_#3;4_9vzGKtx1$k%oc0Nq-W3iV`ZQbO#j&aZJt?+dUWp ziGF%GymlO(!$`!$ntVAjoocb1u#$S+e)hI&b7Xw>b0`wfWTnuPlMYG*y2IDiYl}4Y-OUhK$M~lXzG9dO9rSKOdVf1|BK(XanGOR)!d@qp663uo%UX%>~CQ=${L4IVEfScDl zpE$k3k@gBik(1>Q7k9DnHD4e9o?{hPXP#rn$DW=W{pXjZ-~MLjW}x1q>`+tujnU)n zTbn;L`iXzmSVJYdIFCx~jl_#11e>T?g0@#stcfq!zkhv|#$d#Vmc*{FQ(D}tEiW6V zzhNoNSg3I*tgWs;sc$4&WvQ!;!*JR+T#y?ar!A>vzbbDu>Y=l$xvp{!Z+#ocrSwo% zJ)fe<$H5ShUzW@AQoWpNiMM?dhZiL!!BZEXOCe(5rYkd6Q<9J3<~Cm=Sw5HjL34Bd z;(`X&GJv-FdD)ZwBP&dd#`SM5(e*SBZ#C` zr1m}x=cbqy9{!ck67Xfp)J^EW&*rIqc}Kqagqueh0UnFow`=w}maI*3FIjKQ#PVmu)e}k-73ny(2_P4jTp#d6kA`36`Yl9Yjrf7Gf zTm{k3x1V?P&kr~i^w8KyN@~A7wiQW!+g8&tc)!=$!|?aC{j>JpAI*p7`e%x>#qU)8 z&WjleM~*$;U4{7#>Q!0CjBk{etW$kb}Q+vDn`soyFe;C>)Zwc}tR)aqc@UQF~^ zRK9zG-&_35#u{UPCv&;-KMbxa59#eVs@B&GxEDXHYp9J<1eR@~yW20PS`wyx$Vgkn z#s%}Q5}h^oh${RCt&-rc%PSbkEX7nr9<@jTPs`oqkH)Ax1rU)B6^zd*Rpp6D;^Q<~ znJJI^=l3RoQ%ypDw_sn#ev6t}6`{d3pT*Ec% zO7Sy)X4Fx*OHIquEF)KLpZO`)e%-75pM~~{>zbX0Qbh&`-cwdo7gDffX`#jC7nIC& zc@Hy}%I^{wv%Y*4rZOKzLl%UqbR?HHp_})`zKA%9vnx=P!^>(Ze)q&Qb#5XbSpKu( z&^}v6l0%yKn~R%MZO&bZ=1OC10n@)WcnR zOBSpl=ZceYNY9L$RqK1jsakU~6&9UlxRSwb*fVXImA#PNCdK&Yt-6su#kipXn$fbe zz5{zzslhdAPqazxbHX}#VG!@u%FPLF|9zK~7EYtl+|6tUOf(5b=4MLiw(7YsS>h}J zu@{-()x;%plsMISnG-6@{loJO#6~Y}u8VSUPOXz(u*qJRhiT<)T-W4Py;^ZlXCUTQ zH8R5$rSBDE_QuMnE!~j8F1}#=bzJ>xkfPRX<#OYDxMzX|myz=yb~>bLjxqL+OuHz2 z7Gt01{@e5o!C9csC2c1mJWabEZOoP{L+(7^wXzIp7YJ}nY#A?taeaQf)%7EuHtW$} zXpwRBXzDKxWozbqGjQyAQ7>qhm3XmR+2*4Z(?5J_{#^oNlT83v8gSy|Jnc7ek&s9^t4gMS3C2?DX zEz(=g4dO8sOJ8LuswwY#dmUOR^p!WK`y*iY+Ik?-VJ0Bf*M{P$o)o$6*qa}iCbb{z z8e2HpTrV%5l<)(DVC`TW@CSedJ5unT;K%`NM>WeIn_9=cSX=n${&Q1}72hbgj7>t1 zuw_#=y_+qY)eYDRD^%)GJJBw9TTrF^s}8^6#HdAdrICTFHjhSABj}uO!`!Rk+y`a5 z9nAFJ2!WMdhGclAKrKcQnEcBkNh#>DApMiNhBsF1duiTtZRW;e`|tW?u&%GthNTS@ zs#e!g@2YpR$@*dv6^mzPq!0CHZT48n8<3$nMh0`d#d3);oY)f|7$@JSY}(;)e*HAT zE-DAK0jP@=EGT6=y9X3iiV3a6G3N)S{zxR}?K;?Nk7b*@;Ji+?6EB2g0@4aQ1$}=( zKh~T}`ihCasgx#GT$A|Mfpu@;ZBM*@2vt!X2`M~|f4-`6s82V0EdS(YFdd6& z7JtnB9z49J{7iK_hhlK=JPm_KDc{Y)M{Z^If~jMUl*9h}HjOVBo{=A7T`1z%x9rnt zO4x0V5+Z%R_*s2wR509GrtrR{W$;&v%6|^3#3XFSxwqx-|NHFM68iP;zniWW>C2E8 z4_g{jzeirYxeRz8x_c^f^B^F7L(BZ%){DO1V>N@fJR5vpQez!=9KT#6$DcHmT?LMVrnC`$jyRw%!62^Mw?u6X{6 zA4aZ=O96;7vc>|*Mp1a<8bwCYc~lauPv)0I}?#;3Rw1 zz$mIn>Mv>kdSku+1hYcY(Y;yrEXpM!`X9$gehP3;*jZ7Q0dxhh%o%e7Lvo!fEgFQx ze0+&7RAIRB5f{ce>V1I{&jaoLM4XAG<6s4iuG#(P6sZ0u@K3FsA}W`H%y=l>P*;yj zd=Zy2E!AinQZI;K8&dE{jG790a{01i@PbOfg|s2@IBl`FJ!xoX=jlM=vEc0R>R2)5 zoP{qDu#l8#<<#ChdAPBc+m)C_Dg3d-4Z_Sv;-@`wQ6SGt5NI2upIUT2B@fxoN<(@n z#lx`FicYA|zk3s>A$dhqMe5?PTR_Uqk<+v&1ji;%+}M4j+WXh)t{8S-#<@)WhFSwpUMOxS!mTHM^vQ-n4kczwDB5ihQN3l;3yd zs7db?sys$+(K|V}-YlcTK=@V&+zM9QnFpYZD%NcS`IQ#Dkf`$CAy$XGRN09J9OYr+ zk(HBa2{m^6x`mjUSafbM#1+}x>y4;M9#YGfuFjkuM;e4?K#oGUNi~HGbhbahDQMt3 z)WtMAAUan7Nh#bVGgC|{rmnc5%C}tiE;0?QR!w}Zm-FAD6H!op^mg?V z@f17(0+d*Gf~!8Cv0|kXOy!<5ZVDE(UB=l4stau(d+y{^VHi;BoiU!pr zM{|@^aHru2R4t(iN>wb8YwWn8?u{+P5Ik7aU2CD&Mp=&I&leycrc zNqBk|n7OH*3jXXZOoFELXKo47#2plcRQ^(RPu=7MZR;*=y%ARm5{I>@w{yR?dM7Sg z%}4+m>0Sc4TR5qnM0E*6d!9NryRs?arM07J`{2W^!YFwM zjczQO$KgFv;45@&%G>#`lRAZSCbcu3N`;6<_q1|%nuf++h0H5|m?uwPrv^;$59t~; zW!T?{vHCiPX+n>Q9X9>RQ;r?^7UYQDod zlgIFbSDoLFqld!25`kddd}cYt8iZJ8IsaCB945T;U&DTAbV+bK6D1UYLI#3PRAhGE zKcVY0I#F)$gTr_RBSpI?Bpab;PNkBK-y7UT3y0qrJ;L$BT8TYalpSxr4ty;ONygFn zkf!JKpk0FiXx7VnB$B{&M>WX+u4&`y?ZS9!u$of8J=)SR^Zsbq@ag&}zEcvt%d^|* zcgq-Sz&VUS^ywJ(=fMHDws4-w&9BPGaoPo!<1}p$KLJo-DX!1%6v6P6?~J1AHrY24 zs+y2kEa)V|JDBHsppHW4*z32>8nFHOq4fT-vAphm&l!8&KPdCXzD`i0-{-q!8fFDCsqCcRIAOxkBoJt{An!c$n zynX^aiT$JchuNen?HC@M01pm+r3JHStRo2@`&iIgk*WWFMci-G5sKBvd9{FLz4*u` z1BV~U%|#7<%3=*DP;MT_=aatm8gK^+lAV5GgRegi6)IZ(oe0ZmS_Vb|)@Rnh@M+Wl zZm|XQ%wh%Xufq4g_&U#jHs82m2T3Fm#NNc-Tm4Yf-qhZ;_oir7hb>~o-fBy%+Oqd5u1us6JwAQb4H@ zVWYIO$MEs1?Y_P*mN*UITL^?=#(`<2bx2U55P^F!Kv-ngPjR=ktk0)Pg`ghpfoEB3 z6o$}#a}P#;06SEAuw)t6J|5r9`rPO}%!Ngou+qXM*&HBjE8R(M%=n$QifZ_k<}muV~?9?u(F~q~hh1J5IMVaqEe-zu-zf zFmkd^vEkuw_3DN}5A-59;$(;cVmAhD(Et3D$>nLmL$Yf00O?xn#jg|UbHaniG^o(G+FVbO*LU++6aWRhcoeuNo)TG7k`o^zz z!4rOTb1x}YrUZ-wR$4iBYtz5-QGmWOQ~YfB$~Un8`*ZW-fsqHZC&eUd=lH}Aa{E~x z!ahGY`zPqvCUg*^21zM@3PwdnCaL_4t0|01E{WKI5xxLr0APz52-(^_-+ zdcNylB9K#J@ya0YAl# zh*JA)lTSVBAG^Icdz){$z-CURJcz_E`Dh_nNtZJ}&P6u@h-M)G_I?0>NDa=c=25c1 zBT_-hp*44m%!>iHGuP2MP%%V-2~B~XO5+3iCJ1_DmP3UK5wEZud}VxZ07!K|D%c~D zn?JXLgV`r5Vm>>oU87m0L)|GIqhF*L%V>6N`hOW*nq7r@1H2gx&^Y%lflZjDpmm0< zj#|tSg8SKgb8S;n; z#Ww&DtfFgU=Av0sy1!E&y0m*m)j2n^-usG}?O#bRCX>`*_u;S2?%xXzMlcSMOlCdnbj^hpTh8pZ6mPEAQ zu@lj42)9VpXkN6Qm{d*ylew^Y49y6mq&{G5>@nihb)>B~PQTPcQw(Du2a(t)YG- ztJ+mue_}O7P8b$6tI2zZFq%#qZn#!o_SCl6y|omM$%eYP$8ag0BC}^fxL$=3VTGqL z0>ooSlLzXGVNc)vQkRI%c!OZaQaPDEJ$Xads}sW~boCf(`*NH)S5POQ4zrvOei8#t z9j9^qCj$Rh+Vu8wP))z+!=@SX^lh(Scw*#2i8}js0>7_E*m~sjLQ%u5o-Y{l2vDoR z@Y@WiaOi0P+6&DBh^gbF*nsR~m%}2;Z6krwL@La=32e^L^fZnUiSdgQC3$gl=>Ro$^M`{@v}~Ep7t4kM zJK@X}RL1u=DGVaNaZY}n=hF~Y5f`{Aw`JOs(RB7iq(r^G@UogN*!|f<%ty8AO(n@Y6#8&!GzOw3Qd1;gxh@=VAW0c@7x^* zw-x_nHip!ZbdbeY*b{1O)r=&;G{F%O)Q#Hr@JGUr-h}f=e(Ic7l9|m1)bd;vS9hN+ zWE7jgwPTEB5p@;VXI9GnUDOf4rx#jKPY;vvJPd%Z6#8(bIvT}k z#QVs%>|sKGB|-vil)P2mrUKKFM&~*5GKAs?ZGb z=(|D0*_puDAn(;2kzAf!B?a>KKv|v-jdgL zXp><;`hka2{X`mBhaVLsx+K`bl(t`keBj`XO0l+35mvgS@>%4VH-C*9W z{W5NbSE%5C`D-ZEk|!T4Z{!PR0$dwtI;SiWhSEn^`JwX4C{^aNA~so2$aPN%#~YPT zVgtMxh#fAYWSWOVlalS$ky?P^1k6-K48@Bn3Udmlg({Sa3-K(Fuz{Y2fm;n;*P*2h zeXnnv>_{zj+hE#kID?j%2Y}Z32;uRWJIIPA+gP1S`aA6hStztjR^Lsz*(m1XNo&Qj zph}#LAd#M9i-{F9jDiDPi>aoe+j?VS>RfS0qHx-vm{s7_)co`BWwHc#>7Z@%R&o3Z zihuJS79|*jTuNaD8rC_2KZ|e3ai=|zpZ6!l=x|%k^7BhXpeT)Fj=9<42l^Mv68O8O zozQJ1v9gNk`_;_r;+$70M(TvQBM9OnaNy?L5?HrO?a=1Ta9TLHD>~!%RQl3yAbmaNY7Z}w=MwkL@q!a zlPV>K!*-+r%QDc_lI)DrA|d$X=UFKJ_r{Gqzs&s=#4sXEusKGBc~BB5H)>)gkW$OT zMWx>)0B9{qVB?Occ{uyknnWN|{OZOEh~3k29=FaUZR>QhC8 z!$H{l=kAZ%6Ey-s@JJX;j8sKsoqB9;m;bTrP&uM;mJ86I(C9e9lfsaWHzIw@Qx0h@ zVQDtXIz2>Egp%_1>7e7_T$QL5Iu#!RCOm0nD^1!i>V6e!umdL)d1F%3WYJG4_~ZVI zvy&dSbRdWcNw|}wLg}_`$n{iGU|$#;ia^G`=0d{W-fCx(ZwqL2auF&vKpwlUQ{U%| zL{ij`&Eq%#pMV3}x_1H@MTvtNtrBX=nP*z2A#F~d@1KdOPk%ZqDi>N_;9rtf@}9`M z&Ss2%%{h?ux+pznY4HSkPa|_84J2QVEA+ZrKS7@aP)-|3c%{2wu=c zP1gGK=I_+%RZ91e=D2CAbbb2v>G_QQURfU(_&=P%aP^24j)_@~k4RtkOK*{2&1 zXR5Ai_LIG>)BZ3I!iF@hIS`lL7(=#SNJq9c*q%g%oqeJP=$~uXgX2jD@Xrx1Uo#0& z);uDi*@pvaDq?A*L=K!(%VH5fdi`&*2F_mowy(7RRZ7xS7?lQ_D1j5T%GaUAlo{l3 zTHP8{se0caM}TH@2R7(FIq#nUu%n=tQT8;O;lIM;Kf{OEiMeA_>+h0kE)4 zSj~-ErSFY~fMP61?WH0@B7h-c0FQoPs3i#RfsHq8Y}po+A1WBwNgP&TeD@$zcw!Sh zoq!1)Yr-s}zG4V#%7hv@-iV{3a+q<^NSqL+!AJ=p?11L-LF+34#CO^Fp9&ewC~H1O zzZh&|$41d~-XpM#0wHyX90-p#<(fQUMcA~5EuDmdl6%WQ6)AvQOq?^3px#qe`*PyI zh=C>Ds8i0|kGJvrB-&=pg-S_icV;D{-;`FfguKsFxH<;&l~j67Vxt@D=EWj>Y@ooI zm@EjurnS@fY03dIIt>|JYDqF31v65E9AUBgP<>6usC$WM^3%*1tp~K8LiC=k85qi# zi;|>pw4*$PN)Mtn`i^foX0cElFTpNu*)_4f!_?cu{#;oFS3*IGAkX2G90CA%N;I`@ zd&q)efc~r+VCwCCh~CY;^-2BX@^^D4otVV(3o+t{VjwJEyaAuV9F)giPO0WwulOz5 zUrKiF4s8EF?jP5cUr9%U>(RQ$u=H-j=cNjxnArxIcU4+ZKf-63A0+PZ-Fz%WCWAGzmg)l`2+CByn~xlzO>a{?jovnD!*HQgzOG3+KwJ)iNA zC6k~pV((MYYOTU>hYDW8)ucuX!1Gt3zJz~OE_==E)BPb6Aws~Y>g=n|oT$=IH33HN z1A0la==$X8YY3+0UFU1DGsOJHDp4?t#v(2S)b)H`wL?ZTBvG?+Ks6RE165Pg7pTV0 zc6-m8{?H}4G#%!f$6Vk`9zi~W=(8fDsX6q; zLMvt->k(U|+=&6ebx`I+0H*&|7_K8uk zvKyoq<|y?p;eQY$=tqcKg}|);rabYrtP^8(|6>&JcR9TX*C}7@{+Ene*PMOGyw;42t%g>~3(BwSgh?1A>`g+64rkoV7D%QWtHkN;Bc zFQ9k1F*&Xreu1_z81V<&U$UvpKgFUqeK+M<#O8gIMv~XOd|@=tQadX#`q)KfRGt^N zB1_vQ!(RmxL33z5q_D_Ao~9`U3OvPPt}4-j6h6Fc&FT(+|p*;1$5FuxQ|s$92=T{W6w{=#SlRdkY2{}^sf+byrK7Y4@@ zE;97e%>91BoX4Fz*|sP>RpP5)^!460LnfS#%vs`0tE+XVVKXKOxm^vhMn<9)jn*-_ zV4~^u2+yMI6KCnlPgHhu+6M56Qu*c~7wO)Q`sXePDpXX&?@6gp=chZem#WYin`HOXt3zfWS6Qy19L zEyW5awAvMSu5Qvj2=@d~yA@B_uh^_9&$=;|F&h`xZt`3+v)I>%1aJ2h$6)Ws{Vc5SVFx`_txNo^iQsp=Y(L9Lcf zJos?h7tJPf#A58WD86r~0(o9_viaOr=CUlh9`=3r*efMR<~IK4v3DBnf9AsEc7(oA z(z7T<`H9G59`ni;5xc&;!(l&-%p&1ASMOmAAnrY>1pR|*BPdo2fCmBey8=M11*m|} zK19f9rd;%c8-hIpxP5LRBh%g|7R#^d-bMSzSkJIoN(Y8r_i}ES08x( z4t~YTM8_b!7Ykv+hF<`UL@ycM9Zv_4zv>kiDSi*md?4aKWC-moM$i5_iI({?%=Zn= z=W_Zd1xQSOcsHZp9Aggs*&Ee|cs3#yGrD{1M2ATSUN38y75C)Tb zPt&b#?EALhv7W(caW6Wm8R6GV%=HizS?c)mSrQ~VxVB`A@8|twq6D4C=$K%*#cQ;A zGOtCkrNVHM@W(6ickII~_a+U;YGru7JF!{EpM7btuF>koaRwg`3@J0Eu5}hELjhvd zGk-+P54R4i-ha1eGumYj7@A3FO$@cnK}$)|)b+#Nmg=fJ;>`n4Ve#Lq=zlPGQY7U5 zgd2t8`tRekB9gnFiKD|jt=YoWBT8}|&U#pOQ z|GmXUjiBHD{fP~rId6p_zj%vxa@xB;H8D@qQ|f|=wNcF^}FLbhu2CmPZC4W3$3x&pRqfQzpE^N z4M93dzXTvse|z*OOZ5fK*P)-)q6|NOM_&-Hcwkb$hu2wN+RuKx;ta=pPoX~-&i_I7 zRJ(teSKx0jlZd|X&mh#4RKznxz>}wk$cm9ccLr?cI&BX?DA+sv264A#$2@FhX`QMEZM3*56f z1G=mK@X~XA*|T%`FfZ48;o|I}Oud|#HP4Hsu}tx>|IJ(f4}+_s=J2>u1q-SqE8>%KHp^to3(CUA z)_!b&f6&SNr7pDE>b2DD`&%sX9SVP*_K1&$eY8%5xS_{;0jU?o{R2$)-0+PJzSGuZ z(Kn&PP5T|u8?FYQTZ#QiDgya^!5e>-F&+{y%~|JTj~*aS?rJpOeYenB^Aqczy!PQv zNC=zV3mebLVH(n%MV~)1m%F}H%S6nVZSO~w!*hQ0T2!8%R56*~TmKmrdfvuH8!D9c z(|x-}yY>g_*-rT0<-w;nU&IESd%tCzf9&{+4Y(Gj-c;wkr%@6C73e@lOWw2i^y>7C zy7Vzc-eR8p;EyNtv9Qpa&$>b^mJYg^_nvZ~`OAKks=al1Yvv)o(ry=Pl9!p|)YAEO z$su*iV=3Z6tUISVlO5ecaIuvsWt3&wy-Y2WSjdi&JMJlWw$*qHFthx}-fAXZ2YqCi zBN~-cl=K`Llb`lXxr@fbe%oI+Ea?rzw?oyRkc`@(;(Dios`euSGgiQTC+~4)s4|{H)>K$H8xu@vkYRU@DHD z&(cg>i+v&n!4%y#O<23%{zLy|#0b@TxN-~Y(kJ#veeyC3p-Gwy`emF?mu5>LNcT;y zfuO;19(^CQlDGEA@o{U$9LTrO1_ypbq4X(mLO-&7vO zE*+ zbN)Q%t`?GCwrdcU0 z4XtzNMv9$at}#wR88Eg@Em;4Yn8V&^6m*ZUh3s4p3S=);qXb0M zu~$TsejACWCZ@1JQm`9YCJ=R+|Cf}xOAhw@g4Sxe$CTcb1d1dH71-lGqjpdH?-R31 z>jB0bvmH&ru&iJ(%1@+)L7w&N3McVNzk`z{K!rwmXjPQ+fN4l{hQs~M4$LvTK{RQg z>QhS0XuMA;i!pT?Y>IE(=vkweqgMe|%1JXuYmOsX3ROYY+=7QN?_%J%GSyS5UQ)T3 zY?|95;nWVq$G>0MgXBlAHULOtiIzM>pi^k5ghsc5Xf_1OaZvUjLV+CmCae)S@(yP~b7&Ro)P?XMHl-0p*F2{Kz>ffQ!fIGz*7=4S7^1 zr741>2koYxdoToc^8R;x#L*$I#l{k36a|dPDNWbWxRpu!;W(Yf%uqnpJBIkmvYQ2C zKl<6Af$*MIdjiIR9%4bWMT-amt2CIY0mrBKK}q%*V7eH|d;OyjvV^a#Wdzh-fE?Og z+?O3*Wr%=EtWOZTDGk3Sos&uQ^X4q#rWyi|eCk(r_^Mp_7q!{BCJg*O#4iPkJe7Yf z5BT9|*u}WDEU27DGoClUrZhUbBJ7g5^HDa=#CRe^DESjr9>d8Z8B{oUBDuJfpw%^Y zm`#DzO_q>+#+5@eQp_~J#9-a-Zxky-{*o`{VC5D3=*o5iA*<-&UVCP%a=4-qD8!y@Do2I-WQlW_*VH)KOF!5fAg%ZI-9K()rQ`k^{TtRJHAr6k}AXW#6M!X)Qq5Pp5L=-|da5PaLeHFhi~Q7lF~)U7Dq_lwKbe z4x`P(Es{p3o8jN~j2PxL|LVjjN%(0&-V`8$D8)G6FN}gLd@w%*RsbH+;@Oe0!(HNT z|B=OtCZ~DM@GPOMYibfI6@GeDSma7-n>kDMJQ-3O6R4TiTzG)Wn z00-uJt7eT}snr4f%dU~UzzFJ70u#v`zjk{cNTp|)=6%Y}Vkm!&a#Y0X6R`?f0wpB? z#?a&Lk}n*9@r9byrKyv4EfNHKSXOX|hr4tYtmr}FTHF|0N?Tdmv6?Y=1>r)n>f&F% z2Exbg(#Bk!bGvD-s&~HQ?G+rYfe$`b!G~bVTF8dI@+KtU{;4k+>!88Uziw$No)Jo) zyEeX4kQ$E2aF;GmhF!n(&OoW2yrQy|3^lhJ2%~f?=I+@ddooejX-kb+eKtbex}|ma z_aeD^@1sV7w!LfvV(TVxtN(88T)iQvQi?%}ap32x>bDpFwQym1U$2grbzc_QRCKA- ze2)3Wd9Ux!dsh0y)amdn#GAGq6(0M!^a6CgDOh%F1(UN?3j)JjlAi4 z%Cehmj?F=XKnUQrk!HBZ>OWIDm@&nzVasJxnA<=P7bK-IBEL zFOBKZpRO398nY_RNlWYd2a3|n{hO;F9^3q8N2?Q%wP-mw}1G=FePeNeQc9AmcUrQ%jfqJ_?G@K_#X?r#2Vj*ONNn|k1FvBqh z4$q(R_Z$P}YH|>~)w=%z*r$ zAgYwT3j9pZ5#H%=s;ssoTf8Pd7O}kCA><%Fz<$|8KXR&3X>0Yfv-qG$f6Z}I(?@ww zNR3cNU7(nbu(3?ActwzGP~bg>@VJxU;`YzAGT~t-k;`qNa}JSzPNLv)5i(9O)^c&4 zaxoESafxzKX-+A{aw*CkDUNbUV@_#nXQ}Nn>fDtJ-x9_qwtozcxw1|zN=09$i20}O zHRa>_#JAb!h~EQg6kvD_g_mrK`f2o%-#g)O@##mFze`#;>C{`F)jz7QBd{?BW z;pcKYvqWlz9l!7*VeqQ&|`J|wHK3i%9W3-*s_ZGN0WK7 z$C7u&LL5}Fk+qfU;fnJiHQ}iI@CbCUUV6&Fo=ffMFO~?HL;hsoeyz2^xB=c~2M5Oh zJ@Urb-fvQ^YLU&Uw=L7#472EHn8;qba1!!V$vg1uk1$ejd1_6i`n;w(-c&3Dx{SxU z*i|{NIy-|aTto40u8KS!Zu=gJ$!^c8JoeRG^4&b=FfW-IVXT{R9jH2pMvX07{CqKO zm2s08vQn!sXE_ev#tl()wn!;oB}`q6fI)+3%^4*UM~B+BiC@40%umu!|i zYoGWMS`1x_BiS0lDxNa#nKqYyIdgR>+gKdXG^p7PXj=wV?LMqJVC`I%qCm~ixIH0b zeB>1$JhQ96%Jnkt(R!Oh_0_J0v|6-r1&P-NrS%GF%E7A|tp_#xjGlb)=S)dYvB6P% z9`GvFvT8o-Vn+c@(+1F+3jGMBWKVV1h0$sd;oS~bMe_ck()MA>1~&DWFBN>0dd-I+ z!(nLo(<$+|bXHuSP_nLwhq@2xnKEwU#X;mSugN5~HaOOVvC3>*EgrKOyZZT*f;Vx1 zCBfWo!-xZI;E|P9^n#WztJqz2oZk&Hl$vQvoq{t`V#~5qN4>m}I1(dgLFGZ?VQ`*T`tLP=Dd+V`h>uC%2ko@OW3w=R0cGQ{sJsYgXsZ z)~3=kX_}Lv)@Wx%c>5bQEob!c_8U{rvD~ zv(4JA_cSUmM<2Pt-}`WXk6j6G)G9c&dq?KbjKcY#1!o&^$1ltNu&^_3M4cHsg_CL9 zX6t1bSM?hszx}HFM*H;}*_%sg(Mu8kOT{nCL&7@Xk9#nMTn{39sSUr{4KzD z9_yDUYgM8ooI`8Yo;mcxp(6G<7p2{ZgNFl4a&ZUnS$6*$-|>nB_yOo$ugEb>eCoHj z2D#P9O|zbc1P_Tcb+Sm4qQ3vNo%oeo6ODJ%52tUmuL9{Fi(jLg=yE1iLBRi|Nbjz> z075_j05C~-0RTYo08)rlfd8G^3QQ%y)zMh`;T4!d#f4s+{e3hQ3v3b_ussyX%o{Y1 zMQmxN^O2%XI}EpnGm-o?dNR#b!&zX>_iCP!)sy*bva~Tz=c;F8*%Qxg$6IlqstwC^ zioC9zXOrY`UhCtg{1&y`Cg@-*qmrdM(%E$8Fe71IqIYh6nG+$^s~yB)62ZUQPW1{O ze-gOona!uyL-dMa`WLzX!-^12-D15?35xaS4EtYe7|hi z$$&2H9+y3M2M(6Uj5UT`Wsxa{(;n%L9>!OtuF2o_-Tn2BfR>mT zS}#6Vt5~gSH#5>s?sCgxlxz6AEeMZJ^z1H8fM}CULBgWG3~fTN&X{wBDdm5*kMAkU za66~{!?$c^H3gyOd_`W&^Jpm-dEzuG#-7bbYnXQ#MSmCG|I+;TUig=mKgz$^TIP(I z&e}f7O}zH_qVC~XZAt%ml@vpkJxA4=zVHg{a5)Ex`=%H@1@Dn80x zu6H@klQ`KtE?oWma#CdEkHpj+7}lax_a1)v?!TQb$tekP-(Zy~{a}tlBbpyrgT7v_ zK#kEKgCeNJ>)PErFqyu3XzR>+uCkf~avkK!5dP*hMcHaww|_Omg~>M<>b&&nLH*A{ zlCStdTy5x72y!(9?|IM!ieB66rtV(nill2tEp(Bx*!q?5&UybdAxp*8><5;&(q>2pK)^SC$Qh3yL-J+A{30#TZkfC(!Zi}frK z(T#dedyA8-WYnoE^t}G>_1crKe}4*ZFcy{0KQL2_+tpZTIC|UuI`=BWD&?Q?#TVhM z<;{aP_^rRd znnFJsdAdog{d!YRvT_Hx<(d) z>z+mGTjo~ihGZ`>NJ38np+d$UQ7tlDH2b-lDm=s4M`>;XpYq0%cqCtI>wBs^&R?wK zk$xLC<>%GH>mB4ORiL7+u6&uRdP^;mlW@PbW2i`MiyP^!{jhhy>v02tQ>mNPUCEUe zogPP7eBh=r-97c`HDroukX}k$79>(!)%3a`_gXxmck)h5kJXSIH+tht zlpZ%N$;-S6#!w%cRr@#^+g;_AX(YFhaL<-thQsv`-rH{t#sOZ^`MrzfX&#)8OAxcz}k;-X6NvNji zZ9VSa@#mx)LPNkJrp1OEiK%!DBeGOQPI<(5DzIaoO#W!I3UuKSUohds%lf+dzj#gf zI#XTb*EQM(cx(2eysro*6v8Q> zCuD&tNv?2b_V<=?V(=icr9SCWl}ryI{cGF4N7|m-=?=OXI~j_RDeXz&r|U@FO#-H; zO~kZfQFL{iU{S9e1kHG6+?8P!ZCeH|7z^>IoG)5)>KW7;m4KHdsq?uoa7#ys(Kf-| zGOv5nV(gzUIdwYRCOHB!S)a5CTGM||%jp^PxokBqJ-&Eq=l$J3yGJn3#BRA?8^2jeXN{-rV#CE@6s+Z%CG$SxDY%APrWl4e~fMU&?V)bWIH(> z^`Ql`!Q6BI#BBQI{&$aKA(zBJw4aX5$Ih>E2T;Zw{);xjPpfVI+ zxa@G_uFIj5afeJi*?ZS5!B~lV{SOn3lvBLc3aQP<0Euk|F)5|n;H&>AXat71Xh+4U zBliSJ3YL%Bq?(QDHdMN;lem3nltCT*#k(g@J{s%>5eV^hVIP(h$5p+3? zRjq2|wZ8nCOWO^8UBd4ry<)iF8FY=5{%J|BdVjWZpJJy@ z?M(kmc$1p(cLcv1-^*9pgzxwoN(7t{U+vx~wd$RY)>`fmS-r^yIl4~S+g);!DfF(B zJQizi4r0FA(bGX!W;L(|k>Da|1TY9e%PqpUAOF($_!C504gk#PwP*yCKt$B9Vbo$; zm!x7KA|d<#iMrBMJcvBH%e4||_gz&-yf~D^|C;*w4}abL_0QMG5B}`2J^0l|{_nKl z^`FxR?|v^lz+WeR`FAw(>dzMb-;bZ~{#`zKMUeZ7sN>Z?%~yn@uOM0xFzhRQP6Y8` z#Ai(qmBVuy%g71~H%1SJDP$Otqi6qcV6K}hIMR=AB+x{|6Z4->PFz@}#Y3o+GRt+8 zRIV>z6UJoeU41}}zaV1=`{&TQrh%Vjy8$puu3U?Oe20Om*uXOlf9q^J!F|$ukm%jk z=m(~;)*Z1VkRkqp2yd5?oaJBI|5IJW0h#c zPFn9R&Fg-cmu`)VkCH(-#p=f0co+oQjaI==_5w%o*OBid;+S&61pW)kii`4*3FG5| ztE0khHBfjBi&sYG|J?lSA!w{tw52oMZMsQPHf4r~6Q{JRF<&A-%87Nvk4rky7;9%F z6QrSa_bo(SCINS-@FbXD)YyJxIcXZ}{dks#xH9Z$D6G%}FgO}WRO(mg9^`K6RCpM; zf(_cl!ZR#m#)eU=H%VdiA~c~ULNxr{1E5pO)Hfl%I8OfhZx0q{l1<#4mgvJ&Wn6hj zP@Fum!&twiT)Qicqz){cU&9BDu^ZG#GIL7}`()MA?A_^V;Zb_8KR%7))-xXRsGXJu ziS;qh_AIPMWI&SgQ3->&K7wu-Bfh8u{1Ap!COuu;v53fIXx4&{icyO=4(Eor;-fKX zB+%*4Fc^D4m}Q=ymC7&fbHwAbFXMBi5k*?+2QI}RJ?yBoQ$ElpEIds(t_%{s%`E<= zS@u+}T9r~ig3`E=`f-2uQz#eIf!r<_ZFxvtxa@fd@fVCwj*|@omxc-7lH?PIrMhPj zZefh+W09z21cRq&P7d8$8;t35vMtcNB?Q3*IP{M2bO87x3GzGhrPa7XN`nfs;|d{R zX-_>_u|epP6sj?l)qbFjTXv-bU|z`y6c)6S8+LpTa(^tJ0OS{-PWcE!S<;DkaskGM z{od4J3`5f z@?po|kRyb*Qn^MAje6i?*->g9#u%!jM0d}!4^|}a9kP*FzbB9|fi73cRha82>I7W5 zL7y-n4VQdc@zm5%>M>2vE{IGVRDq*_mVgNZb3C3^$9?dZ=T5ECqU3*CIEbw*9SQU9 z%z_1`X?x`H+@)&qhGb^P#m5U}uF$BQs-Q#!{OPJQZ19<@d8yG|zh@JnnonsR0myq+ zL)4TL5{csK2prLlLxs6^Go(;?(vBQ?zTYGRi@oN37B6sAwv$l9ILA~a;T*N4?6D`Q z&0jakh*oaS7996vwagyAs|Gt{H)=bXxRLjw%T7Y$Sn07R*%@g%^9We}=#_rd|`ge@&6R!bPGjH`*X(-}Wxi$2Ay3L|ikMbcTic-ZiKn{%S3kxY<= z+S>6$KIM0T;zCFxfZsKHEG*-YJbNXK$(@|eJG*Ta8z~l(MvEQjDznZjBd^t%y=|88 zerRme%!s$CP0dFj`QRgYe&@I{o>20K`C;H0GNQ;k7ekfS#G9?-;wPhZ^b2aA^AN?d zE#}=+tS45~6>VgW*@L(yenI$}M`e^D8Mq&c)UCoJo8zsrxv{7ZO4#)FG7O^+!EN*N zNcziiMS6FDcz9cccP0Vx4NX+yGriRl$RI{cy>IvH`D_1ld}m(%PhsRxq-enJMp)&RamO6WvkR zMpxN{XWP%qw3*y$vf0M!f*yleRhzWrC6B^^TBo+IK(qGJxo$f=qE6s#Ayr-?)G^5n z|17Pcwug9^^ObI2RRPe7Nin-LOS86&|D^amqHqt;m~_~tQCnu*ZpZ0H4k+kYkZT_9 z=uSIo)$F!&M>l*(WO6E_txW8zVgiU(r;$c7o8^b$Ct6NiTOQs=4BU1x+8~&1qkh@6 z#|pw_Z>wj+tHq5KqekMF%!0A4rj|i{e=-2tN_?_OltzGo^=Lq}qh7oE2c2eyg+Q{m zC#^29hGjmuU5(RXZX=YSF?}RQz5sEiGz9(=3H#Q{xHbSQaCxQD0WoR|YXRNYqqJ$H zF7F2wAZfgN5T2(WHp*-AxK(v3?g-s(Q`_1XJ$Esog6Dsb54>wzYVUYM#5x``+FkG_ z9@?3yG4g^@DURdrdH`^TerEds?hs7n5=6aWj-3FALaYWXR%6}xLADS;C_eHdVi-C@ zR^y3y>@)6JHx3pXxogk*d(~76jm2EDkVaFRzON!ZDgAA@X`STF)&b{y6& z81~+Qqi699mDf1#v zTE*URj)eaUo(`;h7!?H76(Y(V0H9u|Z3IAj2Ien>=n+EHF^`9o34Cjn8!#^K2Dhk5|Fk-}}WMiI%A&>Au0#UIMbDq%D2&W*zsou$=aEjcn zn?(Gz0MFDXF+}dOc$XT)APSc+TsJ9b&)(POzK2l#OT8nExE7)TG$O3mR|O3wghdbv z@`!Tu2V6d|acaCCNzk^ot%CtjT#QM+9HV5}%pe%FAH^9`&`D0UoWw19kuJ|A(M2$O zx+M;@!wkLnV!$-4!s+yZy=xus<7s{IkHrK)Ys`OdlXt_)`?wnR z0R^LyFZ#Jh!$Mi|Y+t4=%D7qy!vDi34-5o!qNZEu6yGrYYcn+Hpj>@lA8MbIViWqW znV_+cKgiG_2xkZ%n$1U?Bew3!+2O?q#>vfL(ndDDyCX!A0a*UrI3Mz8t4|m)(D=Su zPI2h-Tb-7kAnKhpqR$2A4A4gIC-ZW(8%t5hsX>-Jx|F3nVZ@x!6fkgTK#XFheho|k z5AZ#^dl;MDXc))ho(YXY1I7yl^5r*$cZsl8lCCB>Kioaz@FOY0~iJ5)~)r; zMrYIQ62Dh>ZkOvDMZ~%T0Khi2XuGxjTsQBWnw*)ShLmbp5%GHM8)@1{2m;^<2U42hY^&3h`m~&FTM~CEaxg9WP3o~A3xf&6i!bkW!NhcVc?5v@j`8b@y_ zQ2|xv0KJi3a}v|R#oAED+(VQ&P)2F{Xm3eiGW&%KfE8&)b)J|NPB#yN>av9GOwio#&D4>bWQofe=Y_8~c$bg7YcIa(N5&cvn1M;`dk2nDF zu`806;rqHo_uZYqthO@7Rlr0x1y&R1`S?ka(6A0*EufAF4o9kCW-TK1V$_1$WRwMk ziMi=>C3FI7hk!I(*#8Wh9}yMIFnX9_s5b_{u~{zs|_AAan~3Lda3d4ZIPFfJ^$Qptu2IN`NCsnE{7T#-@`v5T=Ww zmLTbRgM?E1q#}D))jUYr$1_Yy#Fx{B2-+K&M-`)_XH813E3`67R9>k`;f>g+0#aIX zQ-q9>>}-|ur3Q+}IJI23KtfxT8%YH-kxbKA)snG^T8X(BsatD~8lk=v15IU{c^r>0 zU*|YaNU)Z+?+Y!3o@Z-LmJX@v(ktbFTxw3uKrsA2Pe2z$%7D7fzrcYv8;NN0xb8A`f4hm;cO7U`1ic4nv{r9`@0 zKtLKnK)R$vK)R$vloIrj!}s^{T-UkIpRnKTz4lt4d)-puMB99$n8^DQw8}qnbj7tu zV$?RsN*Lf)`OjBlB;Q@D`z(DSjx65QX5e?T=3DatZO+APQErjtP7lW#bJi`P6%k{^z>UcPR#0AbHnY8D4 zW`WHnKMi-hag<6Byl*dCvCh7(c*Cm=40?SdmvD2g({Hg~65aRAs0{^orqw z=kyK~duanaEjF{64MxVvW1mn`wg5aj_R3Km9K4Mcisb79XdS=_@I|4A?ylNk+JPMM zIZaF-g?z$I2LHks!l{j|k|6$&(`^>&qijTC=eDmTWuZ$z`j*K73Xz!Qfd*dG)D`Sb z80XQO;FY|pfpb74HXb!8Fi#iWFF*z6|so?O-XFS}Iei@eIs(l{Up=0yO}(h6ravwhYx+sL#{)bSDagu}gv6)RA6)EKa1_)gw6`X8+6_ zZ~^r}S}98r$$d`v%KE9l-AaV-BazM8{ z1(YfeU1{Mt08JIs^@+M=BDIlSN#6c< zIahFAjBtK)C2&jo{^?k2%a!%L;df;M-%_+lbQjL zg?bd5#b{r7+qWcJ@}kz;6s2kklVAm*OsTz$j6_z@9g)!IA$KJ-R zR;6-;ejy>ax%#j7%w_3oBdspMo?1~1AzzK+F$HItw6W5FnwKS~+G~#Y2-RqRn-z|} zk19Ex;rVN2o4$w0v9=}3Bu^+Pm{ET=^IdPQ0P8Q?1d9FQ(B^c3v|egqB)^!3()qM# z#)E&>qN_Nb=P|ia{&r`y$9{gp*&|vUW63}XG!63u;WpF&AWaH#Ao=8G@XqZ=!ml3( zf|Y%m%+cJ_u=k}F1$AbU=Fjh8PpSV&anJ77ua}`363Q_0b-&>6fjU^y=N(_Dj#5Oc zOy!TaBcELVO!vV_YV5X0@&R<@Skd$;{(#1cgevh}!YxDL7d+5YAdU9o4OI4^Bw^E@ zl_6U%4ka{uPjaykZC7@EWXM(2?l}&yWbGqBb?~0Vfnt zKPc8E!-0VZaK_zggO6uJf~S|rku5Gl^v1*zZ5Ue2nt==56wi>s>EIruzzIY3AjUIw zQ+eG4z=2qxO6kvzXn21&KK|W2mWrRC#R=G~j^V}W{_4e{1TlTW7fU?P z^5kRAYCs*toWB!{?9iht#0X1l_&glfC;=t{=rZD-h~c~&L7`@Z`h8%N%@3=h_oCt9 zfV21B8rU5b1-h=TMKojM4Tm~qsf-`f&KYx3DzlcWOv6`v7q$fU8D;(@F$^^3H=KYQ zhxJoU9eC3!%eFv3A&>&)v8gWtq4>#s2D3?-T<({vX+rYucS+{Q*faBV^HW; z+Xws?9S+Az(W8oYoReUSnOHW`a$vDw7oGC+mV%KQ^)d}cufMVY3UXV+q!`{BcJD_7 zGeb{Thn^VW8+5z`=kTP^t406rLQX&d#pFmAd_EYO6b6VD!|kzVh`JBN8bJV3#kUB8 zGlq&^AN!O}6gLM<8``|Ma zJ)b6`?>2zb8hz0k=x9S#zG;`t_7+lgE*uH~-l<{30HSO1ASf=DVQf(<n4&JAQky8C47;03}X}hUuh|(`coGHkpLD~QA4_CI79B*Rbe@ZEuM-^#pgYl zp&&~EgUS|o#Qwu# zPBP5H~aPD@PKel;+wedtO7|s~N9p#*WR7 zRTA%;);EZB%@6BZ#B9oVQZ1EeC=9+c`EzUP#YFr(WF9Al&@Uk~>B(JjS-c}t#--h4 z`7s%UtK~;xve?rHF;vU(jXE#tvw?EN`3PJrKk=c}mq#4&f`5&q#Q|#7pZHoO)uflA zAWLbN%bZ8usy;D!1*G>A8fG}KM9Q=#zN_d}_ulg!?;c3Xs7Y0;MHH$m2{QYr^L;6T zB{>Fy6K5WdS~Q2_Y^C_HjmvlU&B>mm1Xy}%z}HU4jsQbd=y%>@ZQ?8r;`AD`M~-tw z{J8F%uL~qAa=w{`6_#)QTcY=6@eRPWi4*I=Rv*=q&D<2kzxq6M`K1(^Tf4VfM20@q zpLMBu6$mN$Km}PyGUkWlsFx{w$z~3t3NZM2k91Omnfhk-*0502-3N++{U|1uFm-$rPqh1Pnq z#-X{qns?e2q`T$o(rVa-S*ngb7=6VIn$F_TXf0S2m+)$pVoDvS$C4gCGoiZqJ78sF zZ|)WjTdt=k&D5pAGu-9Cp)|gF5k=eTeFY?#fTk5DjmkPhtfADJFLz}f%-R2}zC{aL zVESnIh*!7C$mob-zh4@sR6L}Rumv|DYhs?X(GBny*f`f`O{%SpJ8pS(=3e9VQBj*| ztgwu>S~4>)rBj(oz_;HX>hm-tIeN#Pax7pEVu{IC7la^pVZrSWvP|awOxG8PZnoNC z$N7`D zGovnENEhpUq#D|~a?dp@C;u_A z+3-G)46CqT;Q24-->s>SuHNXYY-^&uoF+rc|K^B~Uhk$_`cZ#sjc1iCqf!sYUv%(EiI2QMSub3ibv_@o=VbDqxeWbj4Zl1BXF>WB z4ywTAZYJ8BL%WHvk>?WVHjiWA+QC!d=aiSO?Iw_jf3I5GUJ3o#iS65p7(5>TO+W;9 zdh2u4#cbeONt!M()*PFalpv=$n=}q~nTR}y(Q_M=VJ)k48}hWLACMDnKI&O#>J5Ae z)FUB6NHiX}jrhb6;i@oP1o4<>lE}AMs5=3U2geX*#u@Th3WyJrWQ*uJenb(~YebC?PaKC>SEKbdXY&AxMoGHKWsXa2!Wq%0g z#LnZHzEJ)(0;SRhiclR+ucPzN0G+gD_9y9J&nvX=((Izxqdaer;DO`Mam6W$205VIHI1ZgTw<9xIQj@=)YJ#y9!Xi)#=UAF(P zsr>ip8aQQ*{9WU3Ld-c~$P?Th@fW=?7GlP){uMcyv#q2aoHph!AeP^*`w8rJU2tAi zLZq+X0HnSsDkik{!xKmSU7{%Bb2A0=c*dkI#c9Yb(Z6p3eNLwtK?7H*Z#jxi0}S}x zmer{Zii6^-y@A1e4o?zVZ{kd}E3$ch#&G$EbwcZUN+^epBupo&0U@PtD>8Or)w@t4 zrF~xk3fI!$=tjcdR6(&qA*C)9;L`xwms3T~y(N-isM;OEAe(z{YekS*?DoYJ9Z1Ug zvK0L8pHx+%_N)DOGFv-~>r-u4qM6x5VJJxg`)4azIx`jaG4&)3ecRwg6d7W=X`?Mx%C2%gvV6nli2~#5zoQq-GJbC9?z5inOw;!mb$fm zd8rQ*Usu*0HG1~HbC%t>q|Gh)yzqdIKti_hWT9Dv7vV~t;+SS=GzGzwPb4X_kzjJkDuwfr!3~% zySx6JzW82STT<{NKKIBmq#}1tQ28HmTKQ0O_fCbA$Gsy}lh*&tCs4Cr4?o|CPTx-~ zg?BbDL9?#7igMtO@F;_CEnkNmoY!qkW?x%>_>LgC#J);+#h4ec%^Gc_$~kwlmU*QR zS`bMhpRcdmDxnH~gs!JVjXstoTh36Gp@eIqnSz`9gj;>m611Sv@01$sR`g`!e2gyr ze<^3WE7?7f(NF)#+#(zeiO@fv4>?|=_IsEW+gd``fMooVN^LrrYZRW4 zd*3w(+1G&w0ixT1paNOwA3|3*^w&E={S<{J@%H?gD~O%Kn?WzclGZbwNS}n7|B%nY z(ilC!N3mV~MyxPh&O+sWO(%*S4FG&?l@dvKqr;BJ!du2e3M+ zNWAwOCiso$Xy_(F^1y(=2g@SLln_oW#|n?|h<$r8N&3mOH`~`v z!Ko&V+v@eWQWBPH@gWymBo`x&l`viYP)!8co#@a-ibbEwJEX(L%EucsC=>^pGAn>v z2jQ3e2g#mDDOE?kR8Eb%wLSx6p#ucKqcW7BBjQ<{i!*7lYtaq$LWam`062d2I7m2V zi;HoHZ9&j~*>O?l7Bmd~9jOk1X^8SVjnD*hS+~z~Jh%yF$nmurf%}^zTiINtlb<>X zCu#SH?5V#UP+4nK8F=wZx7zOc2+Ed{?BWorZ)z0M53%VW8rEhQ!6unyTMXZ(M z2Jn{*3960q!6;WCsZcYO0DD+Q-7^j{=qzTzkTrv`7H?5HwN!+?rk-zHGu~Gpm-MRA z31nWvE;5;xbeCKP@hQ=uf`3pCZ3+kea|Ir@KhVtmt?R=d2Sb7YZk@`6QDy@7G&Daok}E}n z?ed1g@`6T^i20j}#fb^Q0+!Wa8nPx(x7N1bF%e3TRGJSFkjc_Qo|fYt^IzMk2OZNapG6OU>Uchp4Q z`F!Om+qf{2VRZ=??~3r-qiEHPqKsEAnNL<_Bs(7d)hoH6+VwX1tg7qxKgm9V^`acL zJpE@>!CgDaXE771ArgPaI_VUe7!FAt{?pQ^=V7#N>HIXq)i;S_ZqIOb&^>?<^zXY_5OgLq>6|%3UcZd@uRq(xg@uYj(?|L=g3lt-!HBYy5S~uTbJvfx8l6>(N z;;bkbo;;ZEK$5#tR%ahfK(>AnEkG>Zq_T2g^zEYbiTSR);q5zV%AKS~e@ivySEnC* z`0MHQ@)x&qNSDg+wr8{A(Y`Xv?ras2vjP$G95p?K%q7iTb|6?FjAJz1}_ zvMQMxg4a(S05pf1aIQL=3Dpyy$$&R|MPO#;QZpNHfR=l4@&)@wiT^XeG@UvWvY#{S zdSWS50VG%_EC9{}42lU(86=h=n^GI#D}<2a8b~JX18Ko|BheqSl%5&=+n76ZH$WmV z(%9p7R=3ZiRr3t8Ig1Y5=pUlB{ynwq8wBmj7nP8$t&q51FmQ7V(}U*XpRMWQkF|!3 zS1&aR+A+1Wu>#78<*5z&&?45zQWY*#JVz8V6|4_;KyuN zc4o9wWA*yW0i&Ds8zmjAuQ>{Z3fca{+xmrJ*{A{+w?mTFx9Y?SA+-O%wK zd)Yr^s~1IVME+7ZP+FUAW4Oe{E4X?VYXr&N%~>I4drD6f-@&rIagZZ*GmG$W2~Z6te!K)hz> z2!f=TPmY$JtXqq5{_=U`ZuThujE%?y0e3=*iQtrgPDaJH7QgO*Uv>7Km3MkGD{-kg z9KANRo4f5DxYY0xg|6KfuQV@}Kz8^~9jDnp%_OR8Z1MVTQxYf2YT2o++U_i{hcR;e z?kiskDOb7Lfr(V<{Kz-Hwu4Bx zno3G};_0D(;5Xe@uB`WIHHX!#xdPvDS7=*JURG6cn+xV&(XEe7zQy`A5m#|&PKDNy z_EUS^O6$_AweM=Rhy5;EScm^&>_R+`^d_0n)<<8KOQZ)5#fQl%8q^bJN-@6%g({wA z71pkXY?NSK&&v(C){kCvxxJSwZnma)=gYGpb>wqk`=OX!15rsX!E&nqxGi?O?KJ7# zFW2)<9HfCGqHxbNYu~1vmyW*jH}`lJ-*aK*Ph#-93Uy`9P*x)CQxY%hjoe-iiy3zN z(BluqTR7I@EI?fxcsO%Oy`Oc=T7xK>$NfaS&IaK=cr-C6Q2o)OuJ4Mp-_3o#?0vdlz4=%n+I%G@cI5Q`pnasf%W|e|NOkoSx7F_Hd}Iu!q;f zsQKp#tCN&BY$QB9j_OKvC%ORNjRrOKhONz`T`ki!Jw0Q&o+BC7>mqP28$hntt zJ(epys@}T;Z#cq->%+(SBgk#P3~Xl8gF?V+m2gmw1P=q2TlU{!d+hFC{apm>>FZym z+t_D2A_6`N4ZG?Bdz_wo0;jtc4f}Sddop*P-;_`HLp=|$4RzBTLgpE8@;BiQ#r(Co!{d;jv{p@|T5^`FNeL zixV?(mH#dgmB{!>E~ll)TMn7GS1J2H*I}P!Ue2ToKH0W!(E60$!LaZT(R5KFO98g6dG65 zg+QW0BEuZU7yQ;H^DY`{+R8jo&bpok&YNxaAF<`tx1_lSHD8AqyastvC2FL7Jt}_1 zT(oVX+8P6z(*U2|&KK?rIeEVe9QK~JX*iTA0r1pAC?@g${Fsrb1X}ac8#GaU7|yd> zzjhKb32i)$^x-WSdZ5Vv9?qL6hM*u3c2MA)Q7AQ?DbpJEVW0M?S#0tiZ(@2b%)BAY zbne6aqlx)iIJR&7=Y6vE|3h7R51pR-!QM$1!@Zt-B91u+BGK)cGUW_x)tv?1bhR$;=m(nT*GX2(ewk)Okl0qe`FQC!we{Qf) z1OH+C4mKYfF_CfbX@Kpin@(LTLMxVBTfI$-g3n~aqRQGS_vY>Xw7Fv9m5z+R>txwu z$-j^g$LCpZ?MbNW+5@-x_{HJ6@@Yb2H7Q<#gIvpjmcyekulnP(hL10#L86%g?>B$E zx}&sE%>Hk4xwJW+`R?WP`TEzi71IrMO-ASQ+Wy&7_M)HC8%Ni#kE@dJIPd+ER^+8L=@r(F`sOd+WGM6RY>%w^y-8 zL|^ihdY=ZEDf7kd78~6yEIq@89ZGJ8*_8y+JJ%4^RZe^JvDtn`s2;CwiFu)t#cNZH_-s;q#XF(>4(2 z<2p4}vrv~_Q^u?)ai=~(w$4tNKTBo&cAk)dT7FSTD8!*6^LC*ox;U2SsJcA#^XGWG zp;ympiXwj-*uAW{8!h*qe@ry%>Gs%6FG=6GoUImrtaCf}xS-1|`UTTbZEm8YtEHx^ z@F17vh^I4!J;9bHti(%`At$y2Yq=ySDnMV+BhZC_rkQZ{mpbux`mlUZ>+{Zk03Ya5|Qzl#!gcKM#%J5XWh$kR2t5MeVn&w$<8$b{lWH=|#@V-Ljw0jAn&MuMzTOZ=y+h zHx&N<8u{_>zl)uXe`6svp?OX9B1xO@MJD{kqZiIw);GT&Dwq&?MfCb1a+DW^i4-E`sb%lA{ipGLAd$g2JUcsHtnAp|J8|EvrhU#+o{H58_hl_R%4M$g@}$t5TXA zmm%RSH-0<+2cu?H!^E|dN#03ijNe94^Y`C};K?$EkNE1(wm2TTE|eh%HAmTc^%G+5 zq0^7FAN3;2aZDxKtPeHEv>NpIFfHYrdmTy*o$QJ3(G;wb|EDfhc9g5&;WuySp{ukE z_*Im=2&RLOrSLwXunHeIXR>a1j24;Gi9u^l+R__lkCIl3B5s+#+nc}-e56CjZ`64dEN|6oSa3vwka}pL>A%<*Cvr?XNjfr{94Z#T z1Uh`AB4Lo6a8b^#R-{!mWQwKMDOlK&nT5 zA0DXL^6Vdwl0zBP>b>9)-(7ht@xyGe<`z?H)E+t&V{-ncJ-oIw)k)$KS7WxSd5ovi9AL|oe$iBO*ydcjRX97z`e0=QbL&!TTS~K~onBUwqbXmO^D2{_jk30m< zK?uY?!og>;c)Bo!C9I)j71e30ZinLV0Fk9`x|N^hx0c)ez>omn#qjTm8%)MSO#;96 zJkBX4aaZN}SD6Pcij=~HCgt5=*f1)(gw&Q#g?7?rIC$#0_3WsL zcT(#*pd|(MhHsxhAXk!FnO*i^$8cO(lLv32WhWvzi0dCEwlil3R`yu*ljwXr?L(y) zDSXyM+EJ0>x+F&~d+0bVIIi8j>rwhx_yErerSN_!^ij)uYbDXw9R42_dQI+nh4C7J z1jb#G47*HVbR%A76T}hXFdiX+X06jX;Q13WrBI-sYZRb!z$la}B2n1S2%hH*0ry5v zacl12zhfs%oX?$xbfC!C4Bibb6vdiWJ6gCIw_7Z{x$@U>WRkM@Bv#H{Z=}v4v0(M~ zVxj9_>pP2O%JG;p<}V1K2D>}j(X8{+CjtM=YdHvk-VPP6!6EsAdi?KZ*0ZpIJuhvx zcNh2%B#Cw0MLw@?Xm*BuxSsma{djUCOh)Sx)(`LRtM$i zBEQfmeJOC)5shNE+KYYQuws7iD|KHFP=2s7V7?ggk>B06sGBKD>*M0I(U91{&tsP0 zl~*6D>0Tf1y0CwWqAa5iSlk+{K3y66qYixn%~vA4HyJX_lUv+})d+t)u$9|yFAEvj ziO|k|sG-DJ^n1`>;rzAfdz8k;??kC}dmzhFO-lgn%FFfHH!rn!O&Wq`k4X)Bs%ZV~ zD20py<+_lw)Ppy2sX3BiThbrS3d{I>;(wUWgfYviy8pY96A&KLQTTr6{#f9C`&$XV z3F-r=t}&8?b`#&EL-{Yr7jylNh4q^xii%VjkB2szn9>G7DFgzeK!!6f2(!@yE@&em zJTfT|m=;YA!BC{4|9wM~yW9^JF=W5dFc$#DZ!`%6%T$daphZ(2UUj^7bbfkR<6Z#TJ>I`rn@ivTgq>%7f zdmSe)%=)(RMduI;4B zE>H(a(tRi{9{70DUry#7k8N9MBqX7>BcXJFrS>z$Hw5(MfwSpV_?Py0Fapx4;b;9C zm+E5M)!}W`?g!_zP3Uv4gQyO}%}kr0Om#>CRjkIOk{7BiM17MlUeUZ2a%|DCP2h?% z4RjGQb^PKC-F0zEcX5PQreKDXDQS`xG?dXTFgFRl1*(_7Aqk(FWZd+9AJU|Za>XsZ zc1$))>+I=IwSyJOC^exLwW0p?-Ga$q|N7_Xj z2y~5rx2F&XxlHamA4xfW{^CyM;e~!wYGW{bD23)(cA>Po1I&JO&pKl#+_yTOIxy)OcU&?TsY6hb zwR5hNX4Xm-=>{%7UMkQfF3>nI$?7JDybXEGA;Q27`|}O7DGr0%K&^yeZZ=RNK>l33 z5=2Os9~2a(p7lcAmL@REuq_aV=NEkE0{DkW6g9WCedt0(?MU94T^;WjBV8cRo^U~= zC(;inv;kSqz?`_Co`@m zVQWtl*qwu;s)VdTi%E8UE`PJG&!@pkif-wEtxe!4u2LZjh9VW_T|b)1)M9LnH$^3B zGHueT5cI)#@tkv>D^03VXQ3}`{QGQ2W16x>TRnMST^46!e_Ie3S^yRX1#N=8Ho^B0 zEhCcfxe&B~uFQ#^nn)n;Qn~v`*@|TL z`ci?z&HZqzQXNEjv*=-a*Q9sCM)5})=4C^O6ea}Q)ZlV!B=jrg@l|s4rH*&1(v}Li z=~5h)v+-xi19P+cxS(WRfkZW=3pRjSi$sh4+|NNtps|A2)iuIR9$pvnvc{$~`gX!w zph6pfG6H641IQSML4+!MW$JyhMDZjmc<`z`xNJ$dvjP%)Ks9+I8Y$PQsdYJ3G(6Q3 zBgre=5o@_s3vK~nIN=2`E>#gddIM|iMgUV&K0Phm99{8KrjY;x$nJlcw%=hI3#*Z8=1Wv^b8DV> zMKc^*l6{cfa@P@Cfq<=kbG|OFiW+x!AbdGA8sYIMFq<}&pG3I}Q#zT`qI-=@LgzpQQ1phM}ku@~hMo?1F5E3zD-p<(4oEg?B zp9U0sLt|$IQ|HOv39ViF*4VXF5arfnzMtz6)=>I2muRf8g(&YySaY30{#1Nt$8!oi z01xLbobJeZq`J*mHVZ}!yU)pW2fN6>X=Uh&pdYWD49jZcuFCwXdFLOyl-s>>tPyO< z1Ly3TyjyH2?`yzHkfw~iZl!gkAxZg|80TzWeUw}EAlGs8PYb_lvsru3t+u@M#e*bh zXMmgEig~LvNx8>!l5R*IcKO|WURldZHcepdJn9`b#BuA`nKZFe^TuE{qtQjA^AE$o zvNjFC-7lFJX3X0s&>1k7H?Yf{Ix^ZA$rE>&TUDFaDq&j7npCRI`#!ul^E}9mcCTg`Z28b(4v)A4oaq#7LuER$}NHR4@Dl1fPdxzWiv(XZNRbN@a7!* zJFE85H0G2pQ(=;FvaiFnd5Lg|k&Wj=u>ApXygXysevkJ7c&-C+vhSCrd)^$k1nU>c zyFRP1@624ND`Ra;BvsAVs)%)Y#QYG3X&g=uA2%im{4g;@8=3{SePCi$-Cy1D^4OUn zuOZ4jMPf3yRn9rXw_89M=-&?kH+D0@@C=|JMx}{$oeA(PvB4%)i~BTz{sTrN=)`J@ zEt;q8R|3?Q9D|yIQIDIr`)U8}fF<;Sp`@Pgp#)Ybp>pF^Rjp&)wH`X;UwP}^lW>$M z1M&MIs(rwu;!#*roldHELfsU!pZLDD4zeQ7vjI$SgSb4P?EIkbhzSBDUi)1g+yMbS z<%1UF%zaHp@m46#8EXVRkd*N4QFT*A!>PUMS zVdGHJfwNCp`6ZnBCFuMX16eObY4vMY{nh(?HUi4(0r2@wRdF_tk6D2G%v0#kgG*{# zQD_1suthPZYz7v}1TS#?0#2PKKu&9}DIM*bQ-1FUy#Hj`^SR%Q{6=T7m^6h52^rIC z9S|aVaFYDoeVmFKLZzMsjBvSMFe^OIdM55r1_!7#0#(iySNXnl@*|1P2J?lWF;lR0 zKG;1L{7(jYikOb$hmMiKw7geqh+(s1Ah`lS9%6zR@O9~?+WF4UTL4LV!?%uKvhpfC zsg?}ZAP=?l7)fRz#mAchGLh0QlildNJJXuUoE*uv%(vmA_Im^O>Zv0@0JRZ-7#pZ| z>g@kGZo&0eA*nzjG!PD3gO>mbI=h1y08wVEg3LS`Hm^Mc zkUj1L_Dtnx{HgG?sxSfAX#TotSU-M0*)`eF@||l6+3^rFk-9(mV3?BY%iK}wg*~5M zM`O|e14?s4VpK;iMm@G86Aklhi9*dgU;3qU>vq0)IwzoDsUJRX|ndpbEY6+}3)PJ5R z>`tgVOdkIv))H2L6(EjbcpId=$7TN(XvT@o>l1SYAbWHlfn>9%jmyP+KN`qa znmj*Re{XYb$@($fkMHUZ60io+a<5RdLikO`V_;Cu>FTX^f zG)IhD5coMLpi68xb4H-QS^-^v&XVJIpOu}hf~=M#`Ok?`fr|gFer5#Z@kV;SfP3Gu zzF@Xx_;FMw5Qot_BAEJ2&5%?p^9GLbDH2F^eRf$|u;7}3EZFAqr-l)uZovJsVAvOJ z1T^Tu79Bqje{++XpQ5&lXzGq1nn1RM4+GRU=I1A@2J=HR9>Al#ph-*xKivV48RGVQ z;5Wg0sVYF@Mf*YB9B0Hdz!njY_y2}Yw^b7;DHz{B5-P(alif-GU23#M5MZLIC>>Du z?om!d*6^|9tsWaeG9EUmsdD}(Uduvvb8pA7g#Uw1jcR6}J-CbETUoFf4Ktt$jHlh* zOh;O5L!?EALd{rz1o)GA>YFu`U>}31q#P0( z*J2028vHSg=D!@qwP5~ykk4qRsBC1B!*b)ESkweeeTr-TErx4oseNuK4Cr+@mauii1>;3aJqNz+fi^4;&3;pKISzi!q>;kN|Wbaxg&c z_%HZrlUCd>Co+~*!Ecqg!#eLcXe*4?yFokf@Va7yIniSI?^0vD?>DI(?$xD4zp9#3 zYDs^iswUTdxqtL8`2N8yd?3|?YxY|~P# zY09;f;~JuMe5}=S*p_$X06->f-)O=vFI)>d{Ch$cE1@}A%-(@>K@jzwACCjk0QZbP z348}S(eJ;q#sjU{ypa!m%HQeACOQa{k3;tIg>)Co~^! z!TykWt?7&%>$dXU02bBx&hQD6N4JFOTGfS(m|_mbrtrXkyyg(g7DFMRiP46k|87L97MzeX&Id}h@fT*s5kiRUfaU19WW$e>G49v*V5|)NOHAY z;01rxUA~!M)-GFyvGbBTML0|o%7@D792st}8ad2F!QOwli zT5DS8zcs~bLQmO0jTwk&swlq|@7Q68_&yJK^AAK+Vj{0D?fB~5_duf>1-FC&BJFyO zK^#+LqnT~O(@y7&1QO%2*vK2MQ3YAnW#@|5PPdZ2BwCkyQH9vhJ5D&qidY4iUm|2Z z6=qPLSLpI}Wv22|p^HOq)G41+ZdLEflb9~G|EWtCpYx=JESxOFOge@k{mS=lOEmd7 zxz1wv*xTCbe_rKm^=SVK{ZvjR2ssBLzrFW+MWG?XJsCk!SGsIrbv+Xy|6{3kyEyc} zAJP9f=v)@PMxGv4`K@(XjC0m_1Vqz56Tg0^5|`IMmF(PmV?}{tv@Aq!4^zbp{YUgC zNpf!~%Uxxy(m|Rc#EYO?`M80neNJ5PZk+V0r9J z5{0h|#`|_;xu-YuuuPLPfV7jka@7=dzP4j(oP(Qnx_a;ZXaQh4`_o$5GXqoLfdf1;;cjj|FzBOkhnf4Ou z9MO@hU6A!!l}Fhj2y*k~fVy0nN<=ppX}48kkezFTu1;9DX8;6<6U+YhO;Yx~CH_)J zG4~NMUIngHO})Bycg$0CFlRYg>NEZCp3%sDUb{1?y;f1DW2p=k$X5en&9cAfzlnRKuqH%M99e;}k+L*!Uy6WnH?ks~ zyB+{sG*d0OZL@M!_xWBxUa|B}8L~EKwGfN+tHYB#Ebhun)>+{l=!iKkd_5c|kX1Kk zFdnhH>ZmlDlgjVDZBnc=YM+XN;)8IAH#i(EM1(kk9#P;YHu{`&fH;i&Lb$>R2hin2 zbI_sy!(sr6K38gN(h$HNHehD7%uwFQis#BbN^8wF!@sbDENiS#x~O>qL>M7|`0FT3 z%qC!|fkNetbAlN{vHu2Jih)NpN)5rO#jxa;%NHyKCXljWs@mKRhR>vrA+Qe|s4OrM z3Q4I9iFHAefX`}`0EmP{t5=B9jtUj48bn-OMm8Wo1AGRr5+y5_1Z=us+}!}W&`~OL zoNL3D=^itv#8PDk@_qLmS-V~{$h4;g$Czss!+tce4zAn`

    SHf4JBLHtql(DVHQp&=t>y5_Jam(&s-B&r}~k4L#B7D_hD zsqZMa5RYv%;E+t+$KDS!A+uWEo_kCHy(^@?&5mh5J&3#f5y?7HYOa)pHTJ@|7^V;K zBi&?7q;?>B4Cup0SZthTi@yWgJW}f0g)R&pdHN7ltH#?;psx4LUazod^5Y`j19DBuE5M z%%CjjTg1hVRDx7G^H5=*$5nF=x@wKeeJKUK3l$}T(c*$XvAgqQ46>yKAaB(|pve4~ z6;dcR5R6)i^Or{I|GiWefCGN4IwJoUI3gIKlk@J}p8DGe;N9)5NdpyhO|A6PTz zyP9SDGtuJ3)$e*Il0d(p%GWBi`pWIaP34RKy31$&vQr7J){HZ$Tvbu0o<`BSmcsjk z+RBA=Z0xlkXN&22vVA1W%FNvYI&dm^ZcWxuU++nNTElClt7Xp8+3P(7N>5}g5 zkWT4FkRQS@z|h^@AuZi4-5@O>Eg%>OB69h!d!O#>c{#DxS!b>9e0y)hj)9~X0KG`u z8F?(dHfTf^)qE=wX$rWza3f%$=eoej9S#&pH~?bDD3XqXMIkx{{i-lq_PgKzNRHVR z3!m@(rzVIWBQiO`^ezSQ)KJGftwgNl#ijxQK@Ff}#A289z`#q?oAek4mT+VAc{yNK zZ7^n>Q6dO80a1*mhkB$H0BMXrncd2DJSFd^Ai)eMZFqTZE{Xa*W2hP}?mnuFacEPA zs_8!GK&(bxyhp}P0;5WV5;tLavoeX{xoTQ0>kFWnkdI9tc#+Kf72`u#=rarf)Cn8v zlvgHP1ox5?mH445P8Wq9%P_FpDw53gjRTNm0$k_iT1>H&t6n~Fr~U)1K^-zxY6wYL ziDbSZS)`b(JoLaDiU7zhgStz0TUp}}EW>hI%ji1e>>7S9#t17pO`FjV z+M#{gp>R(HUMAF(93Y6(E_|27$IHl+j83c$2qPmAR#-OENI!rV1BRviMzX<$rQf6? zG<@uPasK1@Jnl9TAtY>IyiqVZG?7IB3ThOpWf+d;?Z?Z-b!`;G@RZD0?xvkaX8rAw zkSU-~Lup+>FnBRNp72iIs6q*p=2N<}N_j3>@ryLD`-58VFKK0Mm-09`Dp<0*Wilgp zoXtuoFSek-4CcUw%`b*p21QDPA`zg-h*A_zU|Q)<@;qOl!*_}b4a5{G*bPQc=R(!} z?AEzfi&vhENKz|pY_ZFpO55vddXG|;m>wf0-~7QS^9pcaYh7;4#PRAR^m`?_dYq{5m;DI4|U z>Z>H5yG}Yncop&Nfkez!km8`rSSeeHM<eqxc^TtP7uOET&%37h`TBOzkkZ&b^X|Vfc@Z40CDOQWTFKMAP4|8&cOVm4l+`pc{ptbFDqbI=0fgxr{_~v~C{=c|Sw=c( zt>^&wEAipRx>La`w=&ooO)F>ALtlx9`b9~!R|cF&X8ZM^S~LS#*aey&Xc55j>cFxb zg_FQ8mEU)(r3IU9nhUf%KPw~pEhw&r8_)ie^&e^O=2)I{qf z>mVi9_Ov@iF->qtiiNpR*`iA-TwpLN)yP%6r_$D?oq1?I_upA&uXKs zq-ZSYVW*eLeTrV=<}<(@TQ`d6fLV_lrerOisdtriQZr5K73VMf>NFe&TCD|vTYA(d zw$?WAX3y*AS}#Il&5_#o#^0!?OMms6t(f9GEQCFz=`co5wiJc~%Vd1&4eJy#Zlbz4 zk%9C;-Y&6}f{tw3W>>z!ny>L>Q`u)}-Ll@b+dVU9F#;Bi4*ZJ^={V7--IbzjWv1+mDy}I^i=L4$$q0BBZ@G(%!gZ zQFNhq7vkQi|A+>ak$x3n+;Nt_^0l_iHE8Q|#F&mbNvB;aq7&=wRg|~EssX0~eLS%A zYv(}11az_f+aPjuBd(b z8R7XEQ%XIed^a;yYfvBf+q>HttX~P!wQT*2k58t5LBt~%ip{e3&E68dewBna>)LP6 z4Sl5K7MMNelgH~tHh2~T8;(s3D?0#`X^e7OSE#UA)(Em$spsir!7tst`0oq-N z%x))lF=y3&sk-^knK*5NFH#k_1>1Y_@w>Gb7P3-|Bgr;-2L_7&(i9TrbbGB;E?-`0 z(7{c5%CYBB5o2HnfG~TF*hHRd}FZd*r!Z=ZBy8*iv()KkK)+N z?Q7zVqIYdy{}W?^TP!m3IQzj=6#?@&K-WXDO$VjfYEsPUYu{X;~>~VgIKfZv3VHIC}8~z6DJG~@MLY+@+acsW&Yw>}uWLWb;&;rGNQ2aK^dVngEZSiOmK=Xg7@yZ-c#S$y2-N`i4wz8MET}df zR6+%ig%0{?2so9WhqHx?QP}B(9foiwH0*rU#|Zsp@}z$u$5uwiR7QB#<2E!!NtDco zgIqDz7}IDcn6~rgWPxm<@JB5ICp&yMbH4*;3s_kjku3uH?$#dT_hc5P70pe^M9XUy^QG?z_Xr+EQcT7;56saR(Ihxx4@$^vvv=kQ|Vjf$MZ35q{z% z{f~4Ud~sP{(Z};Oa>h!iz-R{kHR=lg;mg@?|CoV^u9I|>>3H?J1>m!Rv!Dm9JXpX~ z@pN;x{(IyBRW)Z6$aLYMr@`*t!57 z@hX+qOpc#<@RetDybIh$v3Y7;V}0ZV>@5K8NWk!f-H`WNj8nv?4)1cfH<2mrH=FMe zcGJ%y`_DwmF-B%=J`V1Hc4Moxv*jXP&DPVS23g_SMkQ*La#zp>~Qa>VZ_f+OTW ztmG7-{QW{?F2<_6D8-j|J7Y%fu_>A1di8_)Y}Uq*F-uI%3$ zP9{ZrMU8v99dQ1Yhk}woCMn+{2Y!Z2f3xFH994|@FAp{2t6L$bR;RLsnGg*;yXx zTFJ{v6xI)on{_-R(IU$~)cg81-{m@!gWCVrD!zou+}u@3sHbRl?Ih_Y?V# zNU2W4=R9~E^7D;y_DA<^{qM;q$8s&@ds>6|o_imS;Jyd$#jmNFzy0ns5>z$->K@H?q=+rII4laFv8 zR)fZSk4M!>Q;_*zh=O%BzeF@nO5yN*$Mv0Z{Q}oeMr;P|Wc$N6w4Yn;rg#oXpN+CC z7Bt00gS1p8OJ~NrqynOx?oU|hwzQyv`>z$$p&2yxeyi!3*f-*$eCr=I`|GJsgx?)c z)WN|32KpmKhtkzkpY(SK39-}eCz&X8dR04=_U>pLKDN8-IA5`R6q#H~+Ukloi_DI1T*g8l3#`*M|TrEZ<`FOJn( z)AmdGq$T)xzNkyeU*HGhM*P!C6kc^poqjo!(qzwVB0O8SJ*0$7S=(I+34I;%-+HR& z`ePI0g(>E_ZoO^28mstUhX18YbA){^&+oj^-xBV1MFcIn8c!s@t=}=@cQh}1LG$@Q z`IB^ZA5UV2`+DXV=g+R3J2$=TD|z zC!M|@!I)u35h()|WlB~!BL-Q8uPbH0<6F74QRkvu`)oiXrC2I`2@r>({gX&X>OHnt zt5Bp#+Y_6FGcjwYrFZ|=X6mmvDaxAf7j(3eRjcsJNPWP5)K*7K6SGPUdZIs-F4kIN zuP@=uwios+;%AX&?s*kaaUOR@b$))(ANDGV=nAWBy&KU_TJ`C6V;b!(vh122qAG;m zOfy+koDD-YOWbe6*tH331rEwNF9gzDp1cvJDMieDrbOj!A_`Utgesic6lDjBtB&u| zM#&s_y(l?44|BvF(JeA!2yOf84vDmQB7HeOycQc7&7nHee=q-C^(=*x2rj+Y%!D@Z z90Yj2mL^^m8}TsU%h^bmcS+z#A~sWPdXI)qst{BB;YqrkB)+}JjU>+R=AU}xe#TyI zT{d>E9RrS6BV=Xf4qhiWWv4eCV_qRkY5W;EQmEes&Oc23v?xIWVx}Kx(!A3hJ*8oJ zC`zB~mO0~JvySaG50q#kr_#|}vSZiy>E1*%LM~obzol@|!;DUw%e~M*zplrtAs5y1 zQ%}{Ci7)rF1@rQZj^GvX+o}Xf(Zh60f0#@ttNX6Wbk~80ieWd?AI)Fuwu1Y-zi4#D zy{LB8#8Kj{U2>8>%pICCoA+&KNF2Lb`J36Y0G$DG-^qS-njZUBO&uD-?`nULrH3nK z@BUMMlaNtRsvR#++XG20Q*az_RcJ>e6vlPE#80M$tDq_4Tz}Av#`h_Cgy3=|oyYw6 zrS%1c5X%vm0x?qMY04_5{GtH8?oFn+VPKP)Dpv~Tl9tmLTH2%|KBNol; z$rW%v(OR1U?vkkuef9!$7m7ZVG=le^ymhX$w6Gi)D*sl?Yg-d_EF67>AMzm?MXZQP zv}f*#&$_L+P+8 z;$UCmpTdUL=at35Pyf-L(xn+{64v}PwO2%8<0FksVZ;FNqD|rPPw>36Rhlv>CPFT= zj2)Y7IA5(~EY&5fF&Tzq@4@ss)SU9U@1;v@8j?L-vQLX)rsT^H*;V)q0kdY=Ulx(} zrHM*~sJyKj#z%+6mr=NcSr%LCjK?4PoD~UEn01cy6w6h@*3h%R@PTM(7`n&d_}FD( zB$8o6F~@jJ#UOiD?Vf|gx2U7k=HxGAWfZgV-aqxe5XSg=o22Azry9!Z(8vo<^mQ&U z6+G>}h~rR@#Hx-J)~Ah&(0k)7&{t+dI#wwfY^p;kL4{9!5v9}`{ja`J!nX7g=WDB~ z7@?kp;_KydHfId{u*-CG`taWR!)`;^3cZv@uDq)=N#+xDJKJQF(zhilj(4XaPTB$nvN&hnVV*>Jnvw^a+c#g7qqdXUfVSOuQ*Y}8G z`RW68`6xNE3_%X#x-_{gazbHKm8OXQo)!Q_6{L&H%_~gRVKnGsl>*-R_%l1Rf5uF5 z-ZVBysC@A>sG-69=g-ooc4=?kjQLU(Sq}}pRIe{uSo3agtN^Qi;+NC4A`pb$w=jCC zl$Zw8ez4q69cLM{XFq0h?f%%xst>{;IY-CgbuK3cfp*98+0c3^a1xpblX#2BN!Tp4 zT>={5yMB;)^hI8cOqDw@-_IY1SSTn0BPfGvM4eC~Df9;%=m~$lfA+S2?!PWpB*brJWnc?yB&i^6N289U81yxu( z4&f-|n%^-o-@hmsRNPKAy<$>PmPHrho8|q=UGbyoynUC!DdQR?oG|E9BBxO=oSPl= zPC&cx_V*zS3D6`?t*c5WYE< zMZ}pcEBL{@yF-uVo9;|Pj2kPP|MY1`WuFZB((Hwuna+DGfIE|l;1;F6PFtqg0qy_Et4 ztZBaP2QN`CNM}>1i0T?1q#uwIO1HDn7NWkZbTW1k)xo^SzhIBfwKCOLqQXPJZ-^}4 z{#AJ%gXLh4GYe=#sk{zpGu z->>Jn76mc?-AMGBTk53z37&Sn;csQ-YE4X37J2NS#Y4tyaZE2dHdK-+{5y|sxHXXa z>Bd#Pvr^w5;ushER`ide)Y!NA*U;rcV)nMHuGjyx@cYVMXf!D*9CuBl%*{4`Q~!!m zi4B3LU$teit`NVx??|J$!7KXUHnyNZGka(;XujEPor65F{LY5?GkY_gIN#+p?Z$tQ zz~Fq*Iz{xI?PFLGpg5W%FB7%$*&YPNs(|#GP_3B2-lT&eCAvzrn;#-*esf#t>~2kU zTFtu6>fK_<0DC~BY7n*c7Bjsq*P}HAPf1>)SV^9~Nu!uZ)tW?iPiY`aC3yE)Gj{5N z6&WeK!gEHmcK0QkSs94>Yn?Sgn>D!As#<@C!h)EhW^ZK#-uj@^WkQ8NwEJ_0s)v62 zlD&wE)TXk^k{miQki8e+I|DtVqQx(nsg9&Kw8;l4j)u*(%tWz7?rf}}(gx_LWTV+K zim4G)OHF2Qp6H|W5}LCeYRKxYNy%C5Vn0>K5h(}&ssOl z#f@RL$x?i?u6#a9Q1Y23XwGx1zzndsw*PWdO)KPXE9_k=geVn`{34veC|dAEq@q-$ zzErfvR=k-}Y^YRx%vLz&QTI5o@P2(ep7^5>E#w{>^4b@*O^}y~hGnXqA1q)YH1vwj zZAb2^lxcF|z`)XMeEUn_h(gEM34u+Gy*ZB1?12H}>D{QH7}E?2P!_bjU9hQ|w&@(F zX~;I^fo$7xnX*no7$Ng%*(wlcbIXCa{$H3sqZMSetyby5ccWG|gA8c{>YjF!3b^H- z9ZYJ7kL>m8`*#NcugVQ6w`cMg7-u6pz3gdJBcR@8dPsYN`ttnja=8EDCpJ>q8hZ+a zwUrk%T_a)QzmjTcYr-K~s~x&XJO`_PrZ@C-XvO3SHm{r`k+oD6%;jij`F5r(He*Nj&K0(+M{ct$ z_WLYuXBDmv4({lV9)G9}5@vKwX&u3vWU6@v9Y=Z&G)fSdIil#lfnqvY$Jg#-e)>#i zrpjKFmEQ*s4wub(;#vGlY^szUU#ah>Ic?GPl?0wyF-$rJtUBUDsb4Q1>u{UkryTyL z8mUuX5}Hu#gkaGL-X2l0db`0I{-@GGy%Jp(ii9$+JrswRQ1Mn&_Ru)W^H(w3yfQYl zxWhJFmxk%ujOgsHR@_0JUsBN*zcOR60T-}*jHdo1V-;yA@1k27bpxn{eoibY%Hxth zIkYdinhoI8~{lvgiE6+_lYREH3jD^TaBaeQ{jiN9JYO;Oy_g5^|~+wi;7Ws@=y zWfWMEe#FtN{>OZ(+moN7uagNqcK^fTvC5wRufh%gxM2Tv;n{1?f2a9|EPvQ@U(%lC z`a|9CCY~GGUW%3qt=eV(N9T$QPC7FCZSQP6{z{eYpu*Ytiws?5MyfwUO)(2cO^71{ zPcACSPL989zdYhrhPLSY>!O{Sx}%!H{j>Tr=eiq?#+ZpygW0TlwRBMefzbj3hvT3> z+0F&50av-Eaac9!C%qAQxQ3j%uUslbY>buPa|F#S8M}b}-?yb4Lv+7(xVv=Ld{s?y z>5BQ<-Tdg%hYt~qKxx#=-I^gvxfTGiIBX?KCUVU7y@~B*l`#$EUMGeHkF{h@wZ>l=7ER4r&{tuTT$N6x`t4orLSs~8pih|b&`Y{e}zj%sT ziwalSvZ(XChBmIr6xT_Aw>8N7Pc`Qx^iL4xPO8;>3|pNt14o88w3r0dJLL+p8J~%E|DN z7>wsOTja^ba$%G*Qo&jCj348OH44(IysZ`D39QA^Iu}7RIgrO~E;hpQkFhV!O^IW4 z_q0nD!Wmjs(oS`YFpFsoRG$XW)hcyTy_0@V&xX;aZ z=$l=$I=|SV9)l|*iyZMEs<^MN3oYZ?FJsEjGTn@O6zBq4?vt&w@^P$dMy7q3)@t=y zL;S@kIbSbS$-Rfn{Q2qpsZL|+Qf#AHyGzmQD`|~Mqeq>Wa1LJ08>cUMZN;=l>zg+V z&B?zU&au5Z(Z0UH)gh2H4D!O!@#l{u7Z{)j zwsZXNwJ~9!;?u%FVfQaKhUEX;AuGA0XzT{4zU_|`0c!3C$w_p@Kykir%&l6n^L0CY zk_f{eU1U{7%~?&YkUqS|WBc*vseBAGc=ta|KZuj6-;Bv=B@D?YM;nfzYUpAW*>)4z$MxtBOqagI=!X@>HRf%XokgAE#69&B zUx|!w_!S!T@9;BC`_ISJa#W6vUe^vr?W;Z?1YS&6Hgh?|F28^C#Mgh2&^`BzEKu;P z)sl1OTr!ENXrX3ofSf?l>%BA1SQQ!p#|?yBIN!WI@-TN*|5ZMzho!QknOz-nSUK$`jst24>KGS z?vAJ}cRG&>ecU@v;-lPy_VdZG7rp3868`Llk?xJNY$Zy0qxGs8W% zOJV%Y77dtn6&2xMZxJV~ULd!FBXq=n4NHiByB+McRt;#5rO)LYTYc{K@9yM2qioym zhw?w;kmL5Bzc(x272SN|d>M?mZ6~*WBpgh8fG7{3Q(lDv#FTP>D%<|doOt+|5G)%q z$fO=>X?1?dg1pa^*5kWE1kxK|DJc&T=6D)3>1j`opqD`zo-6EbuBzl64q??mb>YjF zHO|C+xJOqJe$H92$M8?h^nGr&Sd0vWu~qVnEY~PaI|kxhuBRN8`8|%zH+~& zaF9eX`Pbj02N%x~*HlkE&+###KaFwjPiQ3>SPARsQ1`{te#r0fk5V~YaehCa(8_GZ z7Nkz#TT^;^vWam;ew@gJxH6{ApX0fw^ZGAq%>er<8M2_1)WT^iwszr3O~m)K5_x8J zgV&S#UEb*puFPDH>{F&0-!p1!_m~1Ern;(d?S{jMe`N^r`^w{H;Zf6kBmvxDgu>&I&D z+21m!2q)}ggdSPcZ@w3@j4b@&fsoM^#1-J7S4yBw&SUc{(R(7;UZ5#RddT?ZLUnWA zi?B5{3qIZ1=xiN8KEmP77xPNKT2-TFG@~M|{CTepK@|H^RsnGZr=Mn1iakTpAKxUA zlEg9mmMVnPWTBAD{3LJ8LWISSY7H6_<+7mmJoS|tga6p{3eWTd{eRV%MsOIRy=ZS; z)+@qabRtvxv((0OA=eR<5bQ3eQ@ZE&=BvxN4mN2?gpfvUdJgfMbH(NabfMb)>TDa6 z=CuR?A=kM0TH9&}S2N{}y_pZ?$eH|0*M$g{9E2vr^RKIm1<&dN((B!p8~AT#6hE>F zu;#LbP552?`#HJMsWA+$l&xvaBi%g9R4NSO@lq`#EX6aszM{9qkRA6$_X%1+9(-QVxyH;C-R zm?vY;Sao4G$5m8F;v{Yo&3up?*pPoBy#E|+`D{^i-Fe^EXvg5~vGY^s35FgB9njraqO1N0VLR}Ji}s)&r{L0EZ*#Y%AQ`rBk`+VLwyG!aV#KRA@P!X< z+KTbdumkc>O22#HQvE)Z#~TN~rS2BOX@e?QdG%LgUrd=+6>%63-as1BWokV!cfRg` zjK(EpxI*8C>koj4i-x4xq+uLPpFxv_q2F_#Jz&G^p#MvIwmg4e=d!$C!+Q59(^mL! z`V9Q{@Z-O`>iPe^zwQ6CX%upU2m5zRR`ze><>T*(hIc2Wj}I6G@Aj15O_RM_40u9R zLN?pq-3o{N3V3(<@!eA&^pPy|A}V+%>fMo2=&ta8-!em{mENHlhs_v;ojHcmW`%Bl z3_U##J;VyTH45FT3~>~Y9`*FC6b@>0aFHN$xpe^bw%Ha4yWIKv{223KJq|*&`1Y0{ zHBXS(+R%~jw1<0Czes~bB7KD`9ea-gg#&zVSbQZ>E|w@ud%#7jLour2`6RkTGpprm z@+fsOP}}b7Avxo|1w&rY69*=_Ll1*>O zg}HZxSc%ZR60)Lk?akJacDT(xW>vtDr|*XhM>AvFNo^!rCCWe2Rss?uu!{O!5iP?g zi^Xc5c1ZZ$*R^FWmcWQZVc3Sm%ThrZ71QWbWb6^-A7^wMJ~R-AQH(35Y%3xZ)1+)G zt{fR~gx}{Rg)T3{)#lZ{7Jne3qM{vfxC9?f@{x54Y9oz(GB-##pp=g-f7`oEqg)!u zy@fO4563wI1|}CJ`oc*kzEQ}fWG(TxAh4L_ z!YB;8kw&d_M06U)2am;tyoqx{MdGo0b)r-;$c5CxALq7KTGX@Z{1aYQ(fu zNw*7>qF-mo8Yg%w6f;)kq3|X`zAF4XsV`=eW#>_p>s_36qopk?} z+~bx?Bk8RLFF^w@%xo8CqYXoYXQc(gv5SP`l;BRuY1GjkKiE=yRZs$LKJQ)=Eh>A{ zm?SQrWZWF3t&{u0jk4>SBM%*%aP~1RuHNEbLolx)y71hAQ@FCWdX&K{*H!{K(U^bf z$rEdq_oML-%rP?^ma$jQZajk?-o#+=VF#(89$IZ%9ehh4*?>b>UanoBz#SZ4@p*0p z!4neLnVox_MdrhseH2(o<(1(tFDMvIG%}Ea@zIuz-2+1gZ&@@(uU%%mDUkfYx1CXFI3t^c zps*_t=0A}8L`C7#V?i1r>S7gGVW9E~A=PmCOM8#|+tLzcZ2C_@5&!{iknMM6*yVt& zJ4d91Q`szbnVqTfmo@jCavF6fOmjF0Z|^^|N6M;%oI)%Gsh>+l5HH_mpp2Z|8!qay zu|w@y`n0j>)gbk_xQ=6QJ!OuF~ArbJ(*B-6@ zaS*-&=@S^6OEGS7UdfuvAsko0#n<#P%cHTaF+j0_W(rx;97apkLfDl0?*qq&n`~w5 zrr9;vq)OSZqqO@`mr9lT`t>5bn3~lf&f8(+WqE__eJcS$Jy;;IT%<|oKBAC4Mpqey zyV2Ib;wxZQ3Dzktm_SK5w|}^;OOKNIHs)n@-;N+?W)x3wT5u5ukPhNaPZiK5I3R%2 zZeCR{Zi@QG(dv5NBA=O=FIu4FQg>;ufcN`G~nRi(FnHG$lq={msFnr8- z_NN0S4lCbHydQ1+?a=Dr(kw34^~@(vinHDVrzbQwqmRDbFUCh=ErLR{DJ_@&7AT`X zZA(+de_+GC8B0l+LUnEyNj&0oNceg(M>HsUrHImeFZ&CA*GR;iL^;tFRhjFwZ@2EfwGUnNRRxVwq7Z_m zP1GY*ub)W~WEVOJ>T{&3oxB^q_sc=R`mEk-#VO`ecB|R#4t2}7tjTwf8xct73}45# zx>B`ERCRdgHWw@52c2~gbq|Mb^h0#U4C55>4SK3&-xCl#0m*3OUfD#&U`W_UFA3$Z zn{tRVn0?&vf^&QABWFs_)5UqVNOR-|PPNs&w+vFPeyD2MSEI0EEKg&5B}v~!G6;^7 ze#&fuHF&}5ykLwbusn<)#1&Sz3p*Bpls!#!JYi+L1hrPM+$$Q4 z;d)NHV0q1GisJ34qryOCG2NE1-ta+qOrrXNCT`n*f_BT_JF#Tm%Qk{*T|shJPYu#J zp6yBQNAveYO;Z?qbDgRLpp(WQ(FAR(Fc9zjsa*LeJD(qTA&{!KdCijIp{pN`tNJiT zE(yz@U!a(dFN5_eW#Tg8_F@nK(_IZ{CfZ!3A`XCA;PuBzdh zyPhVfcdO1#TOh&PsbLRnX?HbJ;G**3BV8-2*jIx z=K2u=12cCKs_cG((68YogI-Fu1W07dxq+nTVe#fLiyTnq-BxNoM|o^ERwvxFnYwJ}$em#|=-g`NnxiWiQ@NTtB#YnOtf@=B+Y^PL^NODu#RAAM@}D z&TjG8)@>?)egYew*NLvW^1e5JlNulm*`cAqoqMx8W@h|1+yN4{>2AM85Vp-&zyUl( z6qi0j=JCF}?Gn@WBVO2&ZAWY+Eqv$hu#$jX4A_Rj_CBzE7I4|&{8~4<_vOB`Ni&9k z;nG`?XI`m*W3)%84l!JTS4JB)gMqdn5i!7c=5QMWE8b@KNS>O($kI7^5r z?+zP~TxJ&AT9aJv(jY+6fPkw{pq+BTg(c$a6LRYVzcA2R@2OXa6*}R|;}K^a6VztU zOxoKS2;WL9Xf{JE_IK!EMf?JN;0jgGG12BusA_juFsWVTXrLTyRDA2H%Lajcs{K1F zx4kOEJNJa8#wBGD@U3EAPw8fXa$)QEeA|Hw(4)R3oRon(SCFmfbT}7h7y9V+A$@pm`}6 z1}~UvW){71lHnzY*PKYVaq3j_omnV|<@q|1%o)+%1<*V`p#ifEog1bGk=ynm_=eui zx@?~BVhrwJ?KxImeA_a{Pn1|_!e2e?Jst`k!Y{F+eoLqz4ddzsL$rbV^Sc)s@7*K` zhPR=e63dAczdO$NF=c*(_s&_ve#maao|2s9S6Pi7Ai-}ikU0#SH~T z1(*Mi&)G_y<;NWYw9Ns0%(wa5qAU)GDI17tO_FfusHk9ubH|Gx>R;9`J{#SWxXCqt zzJA2wl}5Wz-4*`UbwA!8SDS-Ztbi+zl0amM&4SDTj>@LEj@MV!)iGb(qzUvep7bVt zYExXLYr2i}U_~UKBE^LosPWynEUG*1(pp6+s#eTHYPet@S!X57#3q7~BmftV08`Xg zKTQc{dnp=l;}tMGxlZUZW;xy$odO(FN*Gqd{2GFvrg1{Q^~sORBgXQkh=+NonuQVL zI!-y0(CpLUE2C>D2p_iSMZ?vd78gdk z&*rUc_7Ai$cBhnAkmNl-G_`~!)fyF5-lrAuKxL()$s93-j1>e)mb!j~Zn2Z&$&?)E zbK1wY3Rzb^C@;6yzyXj=^u6RUZZw*ueZKO9Av~3h2%GKN zntdkuTjM15qc+1xv~H1EUJ6BQURRxpPKWL`H8$HwiZd^z1;vD4)pc1P0#}>H<%6dF z>RbG=j$q&sbFP;A?(+EM@y!MyAuXmw%EWMk`y1uBoY7DM=K#37cGsSS2;il z>8opf&+vp?w|+G0@~C!vpfY=Z^2#~6Za`_%u9f?rg9K9^8TyoG!qF_J3v&6eyP{X{ zSw;GoLK?BR+Kk}|scNdl3E5-OtP{W@C0kOwMgg^$n)Q4e-p>X>&GH&q|9>~BdKex8uVTy+SX_?!?|IL=}dmW~VBv(R8 zgOlW~BQdctWkdWFQ>(r)I@($8cOXCy1S1i+I)&FQp#&5xWfrCsAg8M+7&mV;oM11V zN*IwW=3hqp#nQ~kq<{it%+Gak!9!@O+3?+1leet}7)?So&|9pQ5FjfYQ9)_E@ITbx`46JY z%B&4S0Ocj+H_c1J$THU7Bs#Ka-THAb-PN#!5pq-6VB845GGC zHx}M7n5*3os5`ul^}XUstC)IAR(y>PL#0to7}#zz+Pt1hQ%}&7e;yWwfgN(wxfI zE8j_(s9Kc)$yIBR7u;?PQwA9#OlV5;f=5?k*h6x(tmuO}+4EB6P!8xLL!=X_e7Yp_ zI9o}cT)_~GUbEOimUvfGzKen3i)%hwo(W7P#$*^5yI#I5+ZuUZkHV>LLi6Xe7yVE| zn==66Jkf#48&bTT{OVOCw^UNPof!tbMweNeCiz;R61<7fAZPGaN|bJ6IP_DXA*&(K zB`sS5TZbw|@>(E5GZ}k-c*`MclC;-sBlc}E#c>;`-OS2NC)ak<{5oMJn}ms& z++6Qx%jKorcLN;SoEj6*(R>ZPWkr->U{Fz}PUt`=_P#@OTnh=-V54l~-yD|zz#+eM zrHRf29U_B`>1_oEz#Y2Q3PdA|>udniQ1OM1RmoV+_!!6Pp4lVDH2#N4TZ%l0uxn(L zJQod`ZOnBECO{SXu2l`4kHjXW0s4V{vjl)$C^<&Xchfs?kHf08$#i1_&@PWq0xPvJ z{_%x0@~|2B+t-_j+Alp2tB(af@k#vmB=gwW9QIT@9S5X1y5kU)lHY_8ik$Me1_7w) zg&rGT7yEK3T4=S5?tc7RW~wVekPvRsW=rX(i{6!nB_7dC%bsCS!PVIIj5SE_y!Tu1 z=eO)#O+T%v?s!bK;tLgI{d?h3OxY;#0W)3Tq!uk(hIyy)5)|m$N!<0bitK1KUWL+v?Md;1>;@{;`qDSHJ>3nKN*}3J=iy3dm=woG9 zUE=lk71r6yY85#z9~R_aMQ?ez$Yo(P-cd)fR!+u^v!tfmyB*3d|Bi_d?N8xl2f94? zME@KnQu2nao(43rD356o7R`KSOf>DikCA+299UVCxOYiFqs~F!qJ4wbmV_ev$Ot@8 z2t!(=6F^*;Td_VeIIX4tz8wG)04anP;NZf`zM@nXN|JVKQaDkDRuV*MgCBLoe%({N zm*%UxmBL_qiCF6{xFz^TM0xUIplM-%haeq|DeZI0Aj>pxSey#liYdD4i70|}{sHFH zq!1uvyk`^-F1Sb~ZpTNKehLNB&jmXT>Q3@MV(cPFIfq4l3eHzaM~O&v56CWmeaRI! z+%6)Ekt7yx#ml|cD`h9GZC#)q(@{VWO~(aDyO1V1MLgv}^Q|JG#Ng1o=)x=ryDC%_ zKFktF=E5$Nd@CpCD*GP=jiP#6)Iv&P)o?^sWX%=Ie^)9&IYV3>U;lviGb7G@bD7+i zQR|;5*|>OWCKTI(LNthcc?mUf(xu6u_(^=2CKVXY9dkV(c|?g+*(!94ko2h>RZ|xF$E@}1yX#PZB1R(F$@(}@qV)Ss9-zgTZLt(C&$c~afo-wRvGH@=y ze!Tx(7__iMsktfVP=y;eNZBoT^f7-S`PJ!I{7ElsbH&&nvLfXK?ljIsilN9|Y`a=z z)Qc9?Yl7gR`t&rF70-{6Fzbm4nRt~BzS2kF7&rtfNs5cY}3oc<^ zMtR|YeZjeT6fXttaSlyuzS2-83*r&{u^Tm<>kK8QxwWL&r_>Pi|| zCX%_s7*OD2t$I7{EI;!Y^=hVFTcxggB5W_3GiQp?E81;s&{`VsZoyW4!z7nCY?q23 zEi%1(F88fDHa-nybuvC<+*g7A66uLKApddCR(XctW7!&2(e%t)+{{0OikGic_{&%? zdGl+tv?8e~?zDmRgTb(C^3G;#`}H0T<@qS&$1bnw!M}6^RZ4%=NAviSL@vF_#`W)#2UgN)x)8_8m;pBSa(1 ztya?a9JyNPnw$!4bBK8)Tu;|t#Nb?d`IJFLP+tK%KVPTF(0=6uibwQynwkbpE3cuw zyQe1By%Z}_2|0$KgW*$#QAi} zslTjR-z;IIl;6G5f$(SUnaTb1>Q_HqM`n;)z5ZdMuXzp`GfHRF=piK+LcF#BUtQUK z{=v12*JSY#>DCuuuaJ4GGZc)kh#kjww<7pp9JP!1@pT2yFaG75-1%kASQ;TcdtIxU zlFzY{Z#N9J>c%h8j56^A9s_aWyowS~6MlzKwWU~F+qJkWqqOaY_%)+~h}?iW9hMqm z^$me$>*)B48SdmEtQEtZzZxn8o0T~0aq}CM47lvQMpYMl(mxvfm_LO#>SK^MV2W=F z*#gY-X&__4s5KhQr#d!BH!_Jg%6LQcE}TyJRhkzu)z6rgZO*Ri#C-eBFO)`>`Z!m1 zoZc60t00CXw(tm8=zKbmKAJ$ahNGRcnf#^?VZ1p>!cFOh>c-4)yNiNB~5f+I&fkSh~!mAG-B!|?Ig3kipWAJE}CMi zqi$b>zBqw`lhDt8p?2frEtj6XvHN@|$&(eaRga|(d=`c7vf)|DS{ zc!-n8+?@4a?5Bv&8V&^l}NNm>FByKYgjvSZMzfIQTjsBxp)in zhI8G(NOQ3Mjvmv_w=jz^I^q=yEF%5Y07Z6cfpKD$dKg3Lj=JU4ocFYN;I&?#`k30Q zn^3hDxz-qWvWvx~m{v7Qr3w5SHBD@^G0;E-ja$TnT5x16V-W-;2RI)kaWHxIA1j9p z5=3g3p_wJA03E4ql(C>_9}3|~_xBL>?8dBLIhI>n^~*$0#BDs6Kk%>;BgkXh*Rk-g zc8yTeHZaBX$VLr+GR3P4*yk0h_$_9^5!0^raueW42OM^KRv90i`q9@M8gL6CBV!}n^{d zdIP-=4=@ZfFx&UP(l$z<#5j1XFY$zUVE>5 zt$lyKm(^*z4>pn_oMb!S@FWH*;}DrO_XZX5(I7s+56gPz82lG(R&Y9|W2@w3bY;}~ z0?e{z0Cf|%!!iB|ljO#V4jol6gDq##h0bH%1+PCaK>Xd$#t`f9b{$5JDcqB6Z$Gd# zDY>0B9&g=nAjwhOI5o@&Gzan$Mi}ec_>oUN+)Tr&){6G_My1_+^q#<8*>kB%1nX z`rQcSi>`v40zrjOK$m9{Yoosg1OF(!k`8Wd%z2>7AFJPMu1i z4`|JflrkI&mn9=0wQ3k*s)`JtHMIE*!UA2(3Z+8!?p`&JUb|dcM?q3u< zVzIpn{7HEyzWwp@AnnNLeZ3bJ>`hik=C?Zjt;mDf;+m!-&57}jZ0FmH(mBix zQno&@GpUtXG+@|0s*}dsS4HN_QgV`u&VTI+b>Dw(-OJN#9~u-)Sk1*JBQw8fA{>`#j1n2LBz=MpvRG|k~;kQ4tgbVg-;IBT>U_Y;q#3lb?Xa9kb5>FDe8DAtbynwslL|KSw z($|4%N9|&#=Wm|ZMDJ`e54atuCvW{;ZM+CBGK&+}n8FW;52y*usJtXh-?IE+p$G5x zvJE^@)#M<8Op(0Qd0B>ZkB?Y^Rgnh!PulW`g7>IYyT8i6KSiz^*_Pp_F{21Z9mxCMpaXz18SJch=1hOMAnVi-P`_}e2M zb-t`pjkv>KP~(%o&~vVU=VbOu*ffj$qV?aTL@>g2rNwD!g#Bcyi{_D`iR zw6;!v&Eb&S3kec8$Ie|lN6b6o2*pPVKW)IQ4S&TjVaF?>2`&Z4qKE1*3x1bW`iJt{ z_$mxgAu@vRzB+T zeUeB#Cfz(ow&DSp1Lhw#c<9mq5LL{89=sS@okFfg_BfjS>Ur`yEY>;QGtTCTzQ4OV zzpoqu(xdItIq8+CWmA6Fpit$R7>GtCN2XLB3za~qLll*nQ%Zm^Z998`56vg*VRlxu z)Kw#U(x!lIMoekX%bgn3CDn8zRtKZV;7V=v-@06fFC#I;eE;it+5$iP4VK1}z@!^TgWCCD*sE4|9sd>rqWgmt7AtE>O5Kp)nf*Dv`r^7wyLi{#_9T4f7uM zwxjITa8ywjAB4&A$u+qD6@9qc?1(nQxZgV}1+gVEaeQi@tpC;BuU)rtHFE%P*6nOxG5TqLVx5>we1vsuB76x3>^%RxnWh7F8d(NPxxbMtHRvaPI1pl#8~|iZmPgj1A8^FO(-UDRPd5puP6dNi=cNGc zBX9GIRgP3;WesfS>=k1~lDt7@UH{1_k`0h2G4xIvhhQ*7FsV^CJBB7b@CcYDqL4xc zDuCs!_-yqz?`btkm5*@V{L(hnX~}Z#=IGdw9JedC81uDJzt;az@Wy0}#R5U#G{IQ+ zEuG+^lV9WWem>7%r$gz;j32e~=wx~>HXDpSksT1Wo~HJC^UYIf`Bfhmm9n(+dHJ$G zBDid2hmR+p&~@@IrF)Ruyc8lYvhX`!(0eoUWR(YgoXF@a{6ZZTx$Jot^~c(UDmte3 zVy{>%Ot3|Ux1Bw;Q#}3nToZWcmm_NjYWnedkzf9keXNXlvXzxuWzvLrZm{5{w9Xn! zB}&(i#6cUIhj$teDjMJAnJ>o`6mpBr@O#b3m&;^ziGR2(@jA_{n2a3iJ2s1qax4*~ zYW-;YEXYwHc$yz*o>GB+An^G(iQ#}x%_J)$l%R@{JF^S@HoAPZ)J*YHfSV{Lemtno zRXV8qC8kxjifLr~7OywuNge{0d;{pu)Dt9K+vviMsfzx4AUCQ;teHP z1;tK)UC!_$&YPkom$B~~eu8m~lCz*v;jWDn>`Y_z4;ku;Am2o%ISEyq8TQW1Z z;~t^g)zXp-gL{7{;5xpWI<%gAl*8hTV%a!6JQc;GtYXlK^Xs8glRd+q!m<r6OUUGqVZ*~J|*}42FhkF)y%;g!luN}qPc8-XHeR8)6QV5J^ zN3zDnPbwviN!}u(%X?rj2>SD~I56I4&|a1K2>K5>O~z*yQIK;%hBTapjxZ828O2?g z<VvH^2fVEQK6U>!m2z{Z@v}rXyZf6GW$&2mD>HP4$FPV;rV>>Fyy zQo?<~dJZS8jJ%2r!;eOpXJ%hiHL|L7pJsTzixvtCje&EkC^KcEfvH$m>ugikLw)h1 zaQBzx->Glx#5sB0@QgxZIzCs`f49VnwRCQouNI#;{fHo6L%0@K{Oa`_VthAyIlz+x zq&g2R71;s=@(#Xy-6&i4Mkr4*E{z1mbMZ;A@1qo^^Sq2({N|qSTD!2VIZ2;QEXFvZ z!RQ*7Wb}4=BGb!fO&bxIa6ssbn}t+77AA3UYo`z%@-x~OivHux3dXZO($tKfz`DpX zR=1g`zNs|cVMZvCpNK4FTR9mprFP{_HOvCL_Lp}vF4@miQGb^h`Zenc=bSSA0!|80 zd1ByHFP$BcR$8-N7V*tc{!Z~+sLt2)8lI@0K;2m20C@%;_vo?z@)~h7xRKbpoTugL zY?`-a;5V$f>?Yy)+|zezqqJ!{WxG&5rpTqw6?kRKWx6r$C-|vw=gLW~d-L_$eCsC- zH&+kSt<{GY!H)jkErH9M8J1)Bka}|4Evge{w)A=#o9itslhrrN3ujFZ!FHUC8*QGc z0*pIR9{Bx2;@C1^rd9lbutMbxds_rM}kL~_)+ zBX?%xn$N{7dD@kbdFrUq1F3blKyhJN7xWGE^kE`JYboc*z6n;#elV7@wM4l`l=$w! zleYHh6wdO)84K%Yu9$Iknn0QLY~2x&)+3{$)bAl5j=p9tvn#tfF8{?{?Y7$X>-=D` zfUn>7Ydn54acJ@Hc4IGRnXPncaaFXlXKpRwQFTVX2p>+RKJKyixy46!e$EL|`(q!g+-$Qg`&nZ^p z^OvoVU!C72zI!A-ZKLh|8vY)vEhCkZXgE3N^98bu?Id3tk~p!EBTC32w5%9Q{LEX> z0-3?`%in3+i;5E4TIhfH*)8$ypnjY~yWv+2$BPWHszRERDjI1!(0U7G%RLxOyK1*;$p?dy|}kB$#7ir8jf% z--X7Dn(Xs{#7y&+3LaO4*BMB@mW%Yd3nAfL$+OfUXQV1Wqk^<-vNa1Ke~Sf zHw(LTc!hLi|IzD~&{J8^BU_k{8+#z4nW*xBf_Z)vG;fX5qo>U}D7R`RGRWHw-}lna zMw;lq9<&Y*D0gXG2TO=yCGgurCeB5g&sL&OC8Rs1^CJZ`W7ZG>T1Jx+MnO7018aWs z5`N7?ep(9xT4T-&^49sKjbIy>NIJ>{8&cWr$uKQKM$AwSBhfx62yYb=yO^VVTYU9} zE`oAQVu(cIv)w?}~M7n~flAzJ{3=0gGApb^0&839*Oll2LjH78SvTsm4%g^b-Xj zV?@BdL`(Fm)&spZcDXi@-5pOMYJrK~LF)Z2KA6*v1a>HVxWm;_l4Q(47f&<2LueS1 zS)*UBS5t;0PE@60ree;(!)a)ENXV{wWI|+SI#zDrZFR@;TBMirIZN zR1b>Nk1bf~gm#bS?ebhk%e_Hqdsz8V9H4BS{Aqtmo`y0h!Q!_er{)Kd2CQEl29tdj zlw^|&+^oO&5l;JyAjVd#l>UEB8Wx!1gGbR|I4TaS*@v6|hNEA(KZ-NYl7Sd79b@a` z4V7XzA$|ydXminUJOyEb`b5jIY}$)9Cnk$_g;Ff9%;z-aH^s^^yjp_%(6qDp66HkJ zmF(9hEk-e4HF7iUVkuUqUUSr>^<+Lx1mbtZx@@_g?(n3qd**og3A z*bRPcwl$A(nF(p_5~>{-B1QTnkay>?l?IT;uDw>wsD`_<;BcZT*(@2-wN56~F+1PM0SG#AqR<9DX`@%5naWhb7c z_<619muP1RjwLR;V$cx_A6iK%YO+e8F9;tue;HS5cO38d<^o7RBD26~kVjVWL zGQRFceOPhqW@diQ;QSW$RPJmuW>Deg;LW(_O&WDt5kOf(ny=zxV#wtCVV86-NMX_M zAPTMc*IICpc}Hn#D()-!enz=rl=Aw)H}pWF$||=d>UBDoPjJ7Wjn{Vv?iGLGG2T%t zs9|tOCu_gBsBKz(AzTknry^r3;V%PqL-u(~H)l?j_2pJ-=Aqt|$02&B zizx-8npK`CZftFO!9%x=7d53yd3o|r*6q4f+FaIJ?)EgxdMpw4W0@S5XCqBf*=!Om zf<2eJ3FdBwte(kW5|c@bHld_}>AwaZ@xu1>pWcz0wAZQbI*Z<#4fb`M`f>gHR1!Ui zP0U|HXX3v-J6s%b<3~x?d$P**-;Aa0T#TLdM-o*Nt{H>(^k2uH#?DK-Jxezlw!dH4 zyKnnditr44{rNI|9t+OJI#5kR08@wO-9c~nfzN@T6!=lPd`9`cxAK&3P0I64@k$ z7jnOl(nl7HfUk-*=KgB4Qc{0@t~)gTeb{dNXK`*Nr*(6(X)q@~HDD$Ax1hpOq(#lb%Cd`pv1Dn@%+b`whloByL%HILG5OZ3t5+1l5PMpq2I!l*$V@5jiCqVYR%T25X1CRl4+3Fs*#V{OwN_$N%7}s!X8!1IL2MFfD~&nqclTE zcD9eWd&~|KGH(f?@1|Il7bZ))bK9+NUy0C3&9_;58wE{z+5q^HSz~(21ZGsYYSXbqbf7 z9jpxTQWV(7SC|82mSW@64*IrK`1^{<8*}qNNVEK){l^{9ms--jBjtv^+E7t(!sg%%<+Ex|EA&AT1(LXN}gqKE(Ub zjHl01TX4?p%DW`Pe|e!fYZatFB4ZLw%N+LX;Oc3J8e?ojSo7r=H+Ml{l&g+(8gCVMYFCtokFAAT8S@y(;L zKk~B!|I|tfAiE3{vU-x?n28{Ve}4~-N`ujC?*pZ>KH!??l9Ey=V-ULyhD~xC2vQuP zcf21lJG!|APFrr8OtxTsj&hi(jSF8kqQ0_&bMIovYYHyuZv9Mgi*zkF*Z9a~K; zFl7VA{mCcWdmt4%E=?c3^tp`BEaICNgq&O+x7zMIZJN$58Jji93E_A^?)1=qq75&w zSg%jf>$;s}^~{`tPUZDUquuiL(cXwic558dl`-ti`A8z463QvZv!DL@J#;S4?aybw z|J0QRw5_C~keRN_R!yPs+)K~a*`Oo^ELSVsOK0dn1YNXYazjSmeh_{IDeN4)$Qsea z^9#I`Df1BQhdhQ_elneR0o)*L2UOkNA5l3pR`z~X`fj23869h!{8V}V@z?HwTMR_K z#8n=7HvFgS%OI=o@mSm@Kgf#4hK$CtHONgEKZ^N3yJ(4pFIJq_k+7{JS@eUjGqVFK zG>MIm{9@ws^6VU{0h9Qi|7m8z>9!B3!i4F$s7m4tgT7V{buLOu-X*>7ITCnb6PdIa zyP4Fh-yfsu)T~mdnIAV(C|qa+WcS!ONIg@>t~X1s=ASrn$(>F2HS?$nxKB zesf~GzZ!n^-T(a_f+N0<#`QRa|L-PBOZ`VQi z=R(j+A?M0A8v#GJayw_GU+$+5ADgT_bSg|a(MXyq!)P6qAMh!v2|dIZ!2<2>l@*wk zr>=P8ffwbNtd2qFZ6Pidm@*C~qT}I1^TBk?A9In&KudJO_mVPM5z%RY&@cx-D~};= zk8_5wi(l@;4$jKIT)B+`lqxY}LSbxhSa*ldEm4r_x@hV>$(ut9kWZAmk-EwNSKAtw ziGd}jSD4%yjPudmu^p4OGbE51`Ykll$v)_c(BvBRP*Xm7vF7~YNMGenJ9ZV6briI#i$h6i= zZV3oE&u${c^=GlNmKVdpi!5&o*;|j?P!6ALve~|QSK5|{*&IFu&AU)YGOx~Kg~OKC zGn%_hJ3$U#aEW^#p`^yB=uNL7Tu#sg6jB6Qc!A`ODccp;%d!_cb7#5tWyViBL>jP| zq_g;xg}PrN0xBZ|fKQS3!UZ0T&}3nSJwgUY8C12Vd|VnNykb=FexVji*0!CNA0tg# zb&7}xbcq}KQ90ZdDddXL86=Hm@WH0W-o8Atuzv%Nz3DV^AErCOvrGzO6D>3*BF?vju-Nq1hRh?rCTo3y(vLOwVZOv5NA_(E z^wPJ)pvpej87BkcVa$wqZ4h>32@rUxh9&%VKg|rkIL+m8^2l|p)+fd#^smedFxX$A zKOV*%hJ5@URn-Scuy~4;7p=GyG}#+3o>4N1f6Sf94&!^O*oT*DPMDyClkjd<55y21 z*k?f(%I&HP$!g5qRBNv-0a7*gs=r-_MFMh~-3v*4;HpViQMrjCkr^VTD;v@VQ4t`W z%0cuxm8428vdjUmm}0@y#4hk4qADpSa=hAJh$Li~v@uK--f9wd@iVKO#KWkne&M`U z(Wm@KHTiV2=~K2Q?j6SGU&T9Q^{q9<0;_pf_BPKfnAbD`NNmvhQ1hWs_)v7@%~+wV zLkm`}G)1xa$!3cm86ayDFY!esvcjmj7?fZpipeY2xUcMU;|#qwsY%$Zqv@{uucj_f zl^rLodfhjNSFG(TSq?t1nnJaOED*Y}SqYl2OB={bc+9nRfs(44;48NnoK>+XhkL2E zq2~%?jmCOTRbOmUKhq*Gib;`Opg<85`!m;lcs#jUBl*1ss7!H)^J>;%{Vnzs;k>%F!yM)wib-;4qrm@AyY=cJQ?WY}$B}|yj zn=QHo+`7g@gbUpi|EJK&b3@~(p>fC@6FUby{}vLucW5adb>e z`2()3X?LRk=hMtQikvn#XTSk@t{yQ(R<1P_pKZ1S6xXwl`_C6*767Pu2m^N*ji*I` z1={f92}Ku$>bU~w#Gs$DfyopT=rj<_gMQ@OaZvJj%JjIoD+GCR@`eJ9IEKcl1x=ub$>Hq?yzhT5QQ45rVT_!>gSyvg1G{={AZvvvo-(#=HSHH^kRn#)Rr46$qq$&p&r5H zX~_wKvj6SQVu#{9&kpL8;~iRu~~{f4yLmxn{>SdmGxgw$&z8t zkxl>DZ2NRoq`53_c-)Qrc$qETBJ$GSR5*o4Bq8_hinScDg;soUCn1CD$F?h04=tXHW&eT`mv;T9cGy8-S@*EG7IGP8JKD1g>@jp%k4G=P5M ziu*plUxYF`FnGN%2x_){0H^F&E2ntpdU!(IVz#wcxN_Y742=zd0^N$eG3&$Tm#xh^ zM1Js&269t%;;Tb}Z0bM{tl`&OPksFKRew}0rijU|j%>oT;pBILYccl00xx)B7GW}nE#t^hSvBZn3FZ|0YpVbu4c z(#2kJ1a@?L#nq?md-N^WW8fZ9pP(Wo^n2cPVE1+9&G+@597(jHu-1_>;3`!Qfgqk4WUED$+411FqsTny0B%s~O@I3UuKx?^6`BS(W|+M_|`9Q z-e1p+DnAV=-5$*l?}1nv3taAWzn||Gx&#ei*;1W|8Q>bY;dcBTXb}H0h}~ttY9zm- z&xi@c83ab|&&qMnEQmwp=dVz##wiZaAIJg9vHs{Zs6RNNw{FmX4NI>!q%3<%>CLzf z={lD*j_d>}yfJo4zE3s<~%ZD5`pl>~}iUX>Qjf<57$mKq-<$&67 zkDUL5is9g@ll=Ym?~%0^VhT;SfkwN%a7>1~L*+ltrv8I|d>O@+OJgO#jl$?t!@1AE&?_gFQ9<85CAgbyJR0|M?Y!TBm)<1`>Cln7j<9WE2EnP)%n zmf8wAQe%_3?o_LKFbW;x^PB%|(t1Pej8U(QTI^;D6mku&jq*X8F}9OFHQXq$vw!^3 z?#@jLka9^Mw3alTLJ&;9ZHw>RWGsGxcH5Yz%=Sw4h;w=&TbaL+C97N>l zhcV~DK{e=b@tDHYPj+171??ip6v}&?gUw@}M``xxdD!xobXuZG@cV9?)B0HBssQ<5tS4;Si=lV{+;Yqezrw3wDuqur%C#|HHVR!*$&SnHv9mHG0mN;a z6^QNRXr=$5^Lj~;$?=|cV`1Sr55+Z!!O3OX`34B>s3x7M&&+L8N})V8UW&LjDRTfo znIo?nM~4}kDxCEWkG3L-B9)rjko9={a}eGf-*VLfujbB)cr(K(Fvbk+C*G;|#F84Q-i z_t?glncv61a(_IfI3kxm$VRuXyJN1>v*AE=YHWW1a726$Wgx`&FgQ0yzY6S2oz+5*#Eu6ky4lDYUE>cO+2p?739}ewWdY zF=HUYO0qOw1nS+#y6i;5@4FoAT--hn?+CZ}S;7KsIKO5wnZV%DFiY!_w*M~t+~ZrB zYfW>o7Pms_RcXiF<6zoF$zde^RVn$uPjabi&&QNK#%M}5Jy1%F=n!Dc^&mPHqp+aY z9v~}-dW?Zf83z0PZR_hw;&V!o*y*SsYeB4UR%4T#fDuDJmM3M2EF-NfBAS0g{wAVn z8Vu2px1yrAl%us_(kL2(r(N{o4SYZ$fzlQ;fXMbj89>azb72F5U^PKO+V&sr495X0=6$K$c5Rnt-Q=_18Tl9x zZon720Ax*MywK2n26}hK3FKWoJU$|4S$`B6=?*<+JcA&4`YY+sQsI=yh_X5Agp?to z^|d}2voxK%DL_6dNgl>70|1ePs;DBROelCz3-S*<7?pg6#mNxRG>;Nu6%B_i%c9pO zArpg=@sa8Cm+Y35=x?> zk3djEZ2sakL2~LGOG$KW@PL&7rSb@jpXY#kEH3#~rMTH|Am<)R|Oy`h*IQqwJn$&>V<0g0XarX+7wY zeXR4T$-Utp@qv^(wBF|In#BCwx za6>_GE;>m`8Un}=kToK)j5e%_1V81BSM$W#xGPxwG=O zYFb@rif)LPBp6U6jm8_3RX+qM86baML32))Z=}!cWzLwLI7@2biP7Y*mVvIxqre$H zl)njuI%49A;m~KvxuNY>uqPmFVU&%tW2~Oep`P?sQiqZCp&TbBE&0)-1(LU_ty_ag z*}3L8kOQObAR)~hTMWO|TmoU4B$nkvx=?aX#gz5-m#{n^YJY5t!Z0C6l(e)UMZrQ< zWn4f$?_3lgfBi=%BwU>)6ufl+CH+M)gc(>wSQ+PrXB*LqJatBlk<9gZDOg~SBY=L_ zR;5Cp2{klFbQ;Lx3kY%#WgnSd{<*3w#yWK=;?P(}D=>hZWoa8tEZ+H=5Eg1NJ1~%# z(c@_chzVxSCPT|wAP_Xgv0G<#^#Dnoq~;KjXCl-Wxvt6drz-D?6|Z7d-r1*yPXZXJ zSqstAI{Ov_5ZM{iVG}x@e=K~p4kj?}eCp3XvYGUg0Ugw#jAhszB2ogZ(E;K?N9uWoy!Nwzy*$2Xe2aqB-a7%Ib=whwjVMURG z?TXVBkU*-I5KJFL<|oAMQj6GNB{S~e^QZJyWLQ3O=pZuk01}M&$A4N=_&;EYTzm-S zr&6k;Y}Bw!oVtVzIKeP87NKh#MOoInSOhRjh(2OyvJ;h!jx3rRSJ5()mj_dY2Ht=U zF?=kw^Mn}cWK_qv3e8Ei#P(uIjt2M0r;SW?ih=?;diW41WoLlanbYp~Pv=If^kQq&LKk8M;1Bbn?G8Vm2A5Hg6V8g)w z_ndn=ECF*wdm$flh(j3YQDG`QE#h?FpSd*0ZLX)je0@y@$;nW+vy+Z z6yjb#uMuPK`N3Xa>G1xbtA0>GQ6+{0qTKl#gW2PvX}$yvfqldg19AWcZAJJ#a4P&u z)DQA&Z2%@qB)?X9EX6oaJJW&PTa1tMT3u&N4C_K`oh3)Rz=77Q)N< zAUuJOl!-7S45a`|5Fq^avuT3B&P_RXRm!le2rOK5)htj>o;;ctlu{h>&t{@>Ii~r% zWtSTIuJlX9%_wXgSPPhlvuudiABxylsS=N6Lcm>A5_jmP+UWbQ7W-R`Vx(#mVa(ao z%V6#xxVKS8bQVbS&t#PRVEzY@jN$Gy+o@r7xGx2_oIhd{X;^v)tYRer11NSct1OeK z!RPr$Y=<(zN#w3LY82qgqv^$n(rW93dCZwIr%K}>1a|;<`2$$qJ07NuWj8U#NkI>T zCa!O*Em82ibP&|WcSeh;AVah{_Qlmd=c>NH$6AX+bh$PtAdS#jp?}y=?+2@G<;+Sa zX{w|tD*T9F>8U^BRzEgV6V)3|t->mco4O`I$UM?*ErYQL*cA3vyCWuReP&fmPImND|=(u zA8Gi06#Ah&tTWQ~T*IVUD@mDTd|w_68W`y(g*dw!1%(!igadt>f6#z=6ODTwKg9x zfeZEv-VR*0S{LW73QHseGeU!>c?$jSRJ<}e#CP5@D}wP_p8a?(etkhGauUeAtdpF%}iz8)EuhG{k2ltw7)F^}jbKWZfv>B`wn{E$)2YQ;SRB3|D&qI|GHG6ts| zM3D#Xw4bD^G15&p2wi}v+>PjSH|8qgx$ypIqo49xb1+FWdT#C&!JK zRVQoAfSrvZ=u{SdXD1!)gEYrA)0JcBd<_)sniTWkT9j+HSV=M(h8zbges9&DU}a7b zh9bC9$wjO7^@e(SbIb~FnyuG@eG$vH3iZ;4Vd*2P5#S~~4R5*iA}8+X8L8L7iI=GP zwdnL={i~Swqej!pGJE&gsDTL!y>^vtF+-1q|SbbyWv@e9Y8?OE; zNy;0!=^_aXh6Nf;c6KAl5=KQU5}A645}wV;`Ls|0?EnEl_FEGln>3sKk=B| zFe`%*Ei)|@l(G2RTf*Y0+%km7PdJEr#2)VUhIO)35|I@pK~HysH@)G2#J2pRk)7{s zHhZjiv)Cu7OlQ2o#$#9$&D&xIX!p;JSpl9EcCOiY%$ayoYzEU}ff#h|VwhOHN~w?I?u+`qeLZP^mAt{rC0?B$q#2mnGI{{AnTkR_QQD+&TS zUr&vK{d(5uM1ilHXWxoxldlt^KyT~!Zmo@0`ExP}alcc7g)t!x%Q2$CknX{PRA!`b z<^2e_MMEdj#(o;aeK{#q8FP03HSP^v5_k^iw{`EiGG~l|FRy*vMhrepj2?k6J$72cpp{LiReTlu$lcen zVZCpz2%1eB0YUh6vW*dcsGt#o+u!`l`o4($5p$i)UJODQ3&J^h$Zdf5xdKxXB;k{1 z&sh(JflDU{5WH=)acVmQZE^`8w&o(h?GkocwUoq{)OQk7(I0H#Rfo}8xlXHKo6$1$ zu?&?lcupG{X91kMg*Hd|ARcbNLl#SlJ$SMV=Tf$(_t_B4P+rIbByrnjSbm;_9jC54 zcx1B*F4BtF^9%6ePaVPoHNj#A7=v$zf_PTm|7)acAbxr0*7c8F|4s!XvJcy8+O{4Q zfs8k%Yl-^1t7g6{Ar)}iPQX?{3+81-r5MA!f}Qo?=WTd#jQura77Tr-iE({?X1@s$ z_>7kJjAj#wNGkxhgb!pDoChc@Tbdt5&VY5fFQOgMESh%X91mLOtJ&-ixiw)1(vD6B zjG5F&$2&2B!6vru7w3ok)=`%So?n3T1$3IQPbXm5>~eFTy@DxX8y|8T;Bv4omOlo5 z@9yIBX^UM2CaT*U4_Jl`?2ZgwhDl#!P=Q^rAq9OleN^`O96WfGQtg_qta3ZW8nGHx zuJJb)dx7xyfYR{-*1!R}DY}DhOD$#}eTKte5O{>s4GrITU(G^31W_Xh z_gGPlb994QRu~BPGVUBEt^;3XWg~3Ns6S3|>-6!0i0_Q{V`)}dK^Tji?i^xUa~aM{ z^xbpUNk^b-ZB6i@`FHu0fqcu?EgZWIOY@B?cABX5KUCVhk`}{M8&T=!x1mlMt_qhq z;Gcpwx1V`Gr+VT%eP_q@I0VlTpzL6den&6ld}}vnsgRr3hk0ifPTq;X@ayV(aunY~9PTTsYq8q4=j{(^`r^W#yrw>Q;)HEG@;AyE-^;FLg}n8- zmsVq(#Y*?`kWzB{uRIR$i|8)M=Wv|(8RoU^`+Bb+m2*v7U8`&`K^cu~8lGlI(;<6r zvId{onWk*^zRG9sIGg4+Y@40eYy1xP@m=6g9Br>xuJn~zFw66N^ErG2wesNK>Q33qM?uCI6X`Poxu}z9;=yKb?P>No;Cs_}`*g!9w<=TsuRn$9yIbHo0Bt#J#FSqa|woaW6CeAXrkWq?-6l^9iNK*ir%lijaTtF z{Vi5TB%kPeFl=)2@8N5FzMcn$A=J7F zr$ek2{~tj!qfs2S6CD1H?=%Klu9AiJE(q_rq4Rd=g*Z%Ro*eWX?}>UMnDm-`O1E=4 z%wpXU`A(21wb?nrphY!`@D~H+zhR*or;KAB##*ossJo|s??S%r6Tzh(Q77HNO>GD; zQJ-C($HEutx+jS<_MP7~r(xQ3;1+Q47>c1%WkZg1&zoTJV3(~4fX^bE1x(-gyCAX z@HQQnOGH~)eI_?*vn7q-tbF|uKEI;gCPliNP1;6}l+OKzh{4H=bAJGahR^Bx$bI;d z0vYpu&2g^!KhcJ(hM3%Q&gsB*@YDfCF6v(>2#0#ej8v^rDnvLn+y;=<7fRkPHMl(s ze%o%CYshoU*q9XoZ@N?Yvux`*e#}sKCsw1a%-9`QkQ8YZ9r#>_tCoP!l zswQL!1FDR&Yc>5GDxULQYV>%K{I{K#opFTm=|X#yhhRBGycumNjH}vVM;eoCK0z~= zT|P&Rz`M*`V_IcFFAUR4nE)RNr@0I{n2EUWvB821fBW)bdSZkKmr-}9?;6Gvd zH8skiWmT138Kz}f6F>(v39DIHI|W1G3)B=CKbocX!cClNPb=XBu+cJq+Esg5LMTH` z8@2U_Wbnvtjy-6f#{QGzm=J#D{x-A8kneRADSQ)gH|*gUBFf3hq6!<@Fi?aKPL%0M zYk309cpRF}MW_!_a%NrMNMZ0*O)iD;j-V>EvCG#eyJpavXn)*!Vy$bQR3*&2y*`Hq z{Y7#PO|mAHF3~^^KGseJ$rC!Mgk$qxMRM77Xg4xwsNy1+{S?b}QLI+yojGN4$eJ*d zAFbp(d0Kbs&TG0kyWt$^wK`mbu_VsL*lB0_dYdlNRXH%S3O$VEOEz_JUirmJK0I5` zLfR)IN|{x=jihRz#+5CyigJ=XvMPO(M>kEZIB&P$th{c!a5ZX+`U}GQs09hdWo5pY zVB*h`5fKrqoyMr2*pW0p_7B?v+U(jlY;_dZ^R80(t^A+TqU`3RtTfbkSB+hIed}*$ z%~INEi)-qYxp4^aWE^8JwAV3cF0~CfCDd>u2$Bt)@@HHGhb%MufO7-~XEux7_-+4r; zg5){|H0QSoBwR&hR#H9Qv}?S55xTqX)@qqZ%88DHYuJ|9WlGnsxW~wGS(jp^O0Vdd!SD zZ6vb7Uc1{-7+S270rf02f9_q9hP(jfW7 z03j{;q`dSJAUYJFMAayV?zguBUegjOctdELC{duQXfbXQxxMsjnPN3MBs6QB(c=i! zw#R%iR>7jCR%;VS*v8`7Bb^f#JsijqONM5R@xEw^#!>x<`lAp_AoB>JvFjK7uBr(Q z#cu`y8~Uzek1CpnrvYVkDdn2gllq@e0?n5YD8?J9FNNn?8SOm`oTshw1H#|`W1c=X z3n5m^{xg(jLcz$LTCE;t$D>_x1S#cqAh-2i%=&hpxR+6_;f7q4$*Z$>vp-xC=Qfyg zt7DIkW263VNR|KKNNcE_Maxb1lSV;Vq4_>xcFjRqfvGy)9>|BFkMCk5msTRsg61hn)Y;m;2=K@?vPHENbX=YMVGFr&BytiddUvuNn z(T%&XuXtOE^Q>C4l;6i|7f-6p6Bf{gh~dp(CZ}4$J|Qo|CRCTco>G>E8K>?(XjH?(SOLDHJVa z^Ulnteavr2jZw~DBiJ~JG|I{vYcJBKBTpYR>UD7xr*qBJK;dI;L`b=I zd88KHWAy2ag>@x&C6%so8k1%<$rUb)Kh`Ir#b=(ysw%Jc9zJw=#46Y)a^MfdCD-9Ig}J3X%-yyD8}Ad* zjNU8ht)z$U2hJn=z4Q2c!5#;Y*Mz*@YzOBeJRk;+wJeS4y>e(+b?q=RjqVYfC{ zBDK(USkT(XUcTaCwC~qH?K*bJtS>^o2uOvfSZn>`5oN#7v(($B+FZxW!hdCu`>7 zkd|x^Y*+B0tIMMQVS1u6G2zN1#RDDZo0}=LA@R2C*dcrF8~Tr(`p)!tx^=?&Dc2Lv z*NFzy=w;43>aSgmc!rkN=`=4{&faBcrqZ8NXQ4^6y|Hb+?mW|ldMx#J z{jG`jKG$F=O%4ycyRLdwA4j_K>rStGG-@bBM}BCGwbFS(|IkPxXYWNt|5y>QFn|_b z3vtT8nxPiBl*L5fE*M)g#(Vwh^?}_UDr=TeRh+p$p>CFpOmi@3&@p<5%K*`-NRSs= zOY;lni1d>$7zuu!yvB4Z*N89;rx_}?2Q|3MG2dl~CNE}fYxmVtUu8*tx}|D&ZbSBA zJ!V-Mn#K1?JkER<3b+p6U2@pidy3JyrqXY<`_ zAbp!PsCC)k#w24qSVj4=`zJ8HYGoL7sykw$iEoulEUt@%zJpmu2G1UJFSdgPw?~AY z{55gwj)@@nAP0!FL)N83u|-CSq(I`h4YRd1L`ROzzD`` zkkK=*edZ@aJ=_M?<&c8_cyDRHJ5xx>bMfC2$JxZ}0s04i`Cp^*6*CYHV!zw@k@o!~ zN`W2bQK$ILW;8vxIX(-`4`EX~PW-JJM6qb21qfBLzaxl36Wb5^{YE&Wc~ASb zO!OuuTcX8Wg}B<#oNY2Z)2O)};0o^6o>m%_W}d0mDcHKJ$f~L6Ls1bJPF#k$@Qdw& z=iR~7phN~6nr+mfK~hSMp;ggE|4{sjir<3F02L4^YBkZ$7|J%h!;~TZ@Jd zvrw@>f4RU!?c8J+m?t$xb}>qgQDyd{ugJQI#;dE?YsySx3dblIVsdRJF=~7$XNu=B zDeE2PtQ>N^W8!0R1ovkj;7-lqPu(#~B`Ib4aZRZCACHwY(*O~XA)vt5)w=c zi8>BRDuJZYhGvz76_tqP6&$$Js)~PxK>k<2|;H67l zw6}`*e`Pn||CZgZ2nlGfw*}vq6-1&bHAW(S=%nHqZWzX5p+F|~jucD^33wzVvi@jt?P3#B|s3Tl^@1|yXq>3sIY z(**j3Qq6L+&ay^^WjW=#nt6^t%Jp30@5uf_?{$v(1#o@nJ7R%X8q4F=p&(4Qa z#S|=A#F$4i=S9W-LJA8;Fqi6FGrM* z57PU?tD)ZVn>*hQW{Z!!1@NCe{+@GV{e0yzdyUqabnR4V?}kEQkZ28m{aYN~_Vw7r zB{B1VHBPo@_QPEeT5hCKSEy?hRq|eIOX0;1#jAF;@%tS zkK8Q9+E&6MZ3S+#A#DAmVq2kz{)%{_XD>ihN-p_LeL3Gm67H$MOO~3uFj`Iei6T)H ztAH{=3$L^=Q9f*yGD)K^cr{8={@5(tUY&5;)Aj~%XozAHY9Pa@&siK?2VBUD8CK#X zjlfw=QV;4o&{T`>&RH~)^A@0_bHrQ|CA9UgYlQ%93)P@j_Pdm>l3>O^BV@xo>17j2vZs2T zg|vy1xYXfk_Izt6do4j*&7W+~Z&2r^oL!Ms@&$L-=v8~kL-K@K(>ty*{?YFndj2Xq z+LDY{en<})dOwZsUl7yY5RN?*zhC{HUg_HMBYE?E-bFjp*A2U2xrYtcBfW<$w_B+9 z!?wo*6W5NV}<(g zI_JXrX_!YzTUy_cj8^#b63O-CsFg&GX2Rh5TR&RvCu{a)FCyhio!hqc7*`ctK2Neg{tA7r2pLbdT!*FzRl^ z^LK%m11j&w-{Sy8bsog1XrB`4=*P=uwz$p@0Ux|_0q+$Z$@BFu69%bMvmxd6VScKTx!|pvXy1kKPk$eV1d0B{Xctgamj#cAH{HmF+~^}< zKJrT1QhDj`Et#J0rX=JT1-D``oqm(?YfN4(2!K+;3qthPp(R#~JgznNM` z1xNJ;r=4p5)7n@Ds#}I$dB@Uso=&rwE&xx^XVjVXJjQ;QFvVb4gd2lYxaFwBfF0F| zdZ8Jzn)bs+@Dw_nDnL6$i{SFNG;_u7`#P=v)4e@JD8mRdIc0!Yyf##YZx1hfWsuRQ zHiC1b#k0q4kV~B{j0*pE`XutNl6(UeOy_7BSy#d_K}SD|x_t;>ucsg9;IL07Z3*)b zQgCx-34IsMiy9hQb(yLOROD^knO#%X>U2nAV<>5~pqNOCL$=Ae07{mYwhB%=L~YJV)P8vi{O?x3fp+inFd(sg$GfE9GW>#PzH@rP#^4Q)SG|Pw5-0lM!3W zQr7BC_*CAW$=49FUd%AiQo$MU1Mr!ad?ysOe=z+=ro-ZK+8BOJXzZz4WB=tGI4UwTGwA#41!4aLzU?7ZOY*o@rQVQ^m_v*+@) z>x2YfrB1^^^OF$oJ{(0%4$Xy{w0yd28^qQ1MuO^$F{7Oo&kI&2F(FfD3Os41R{uL- zEN-Rg-N2PuQg=1(D;GVM#&|z5@wE+o6#T=4xVtC=4XPWGL;sGS1jL&gA|^0zb41N4XymNY5(L?|$X~=Gxce{(Hhe_#?H=?O zNb#myajrskSWfm^3o&Uca&Z*5J8`xCi|nKOC?uM!%`3r6*AU`Qs{w=&;ViKc-v#u+ zm|q0jOF_jAtx~-0ldQFxt!XV#v>yVU2pmXSbZ(QaCnWq8itGabqAM;zcn7RXl%HKS z!m4OxrFQh!_Cz%yVQ90?FaTfaVpQ4VfctkOP6N~4&0jLf8p`RfGaR^;9A27iS1rlz zs!TD(W^+)i?z1nW3xh3Vh$DR+v1K8)S?gG=Y#vVF?LrN3Oo|wkj9_%LFMas%mJ`|? z^e&PI%r+mT|RWUnLnn)!WM;^aYgLAnUCiLZMTSGQCO;r1pwJRaCQ-$ zpfq?`FtL2ALR^9R9|$mMjv>dI3A4*O2uPuCH9Ag*kUslZ81-nXl3;(uccu%iYtdXm zJd}PUP{Ayb-;y4%VtAcLug`^{mxG0DiTEA^1`#CLj|$n*;RSx-vFt_t_-ODKIguFX z>pz38LFcVEnm`e2;t(8h9UO{W>la)a9p`4<-5B5?WmZbfP6BzugmnZ4$UX*kwm_PbtXqSl`oXB`TA=WeK(WUFB*PEz>b@w+E;daN znPk5|$mZ3nXhkP>_iB+(vzh~g!j)W@)}b-jM#y$BX|`ZQdN$`iawe=GUx`1n`K zvGu@68iG;ixtl+xL##cLxom30LWqHg6;5<6@yH?haX%s8xzK`$U5MW3oI<4FCvRkm zoq}stUurtM5W1YUH`Em6c{Ho<1Vc~T@Z)N1y`_sK&o{WXFwETi5a?Qo08jzP2-G)I z5W(%qc$(Pbj&X2p@~70ro;t2#6f#Q_^aM;7BTSq~E{;Dff!y0&9AQ|Fmemn~-)epY zLrmLBU1A{iZBpsZBWaEIALfoq`(Z-wbJ9PqI&T=lq^G3^T<6I(`-hzPC2*Cq)v_{= zl76wQ+-RfED=d+GAkSN~b@jlAU(3T>F6g$eI$e#W>n$7rrq~?*(w4HTmkN}jN##!^ zHZGRfe6A*Q&fN_I_s*2R0xHVeVx?MR)mtm%LK0k#(+50K@W=pFt@g^#UUS3Ya%;a} z7(@}DYRRo}fQsd0G9N2|q44VImJpLoR^Y$Ea93$`pi%ZL)Ps<|tZnim$Z>Zsi2J^yKE<-g2 zLoFH4MWRYFdP8RJx`y}$TbYkQK{o60Un7L(^PrMC^Jdu=4ARkB1k5s$bqtZG3Ls|L zd~!qrPaRLcpvfws(@PV1`1?k#82YTiM{Yy@_LM$Fkjz(aWg5UWuwG%QwllO<-Xr{u z$lU3F7HteRf7 zl`3mhUarr7i7j8Nq#cmRDNt96Qzd^Ny7CcW@UK%c)K93`u+b+i9moLawa4fcY0@P-^9Y|-u!S<$)SDfiYPg=vAS-Z?>bi?4GX1p{B6g_)rHU6<3iwHUXTQS)J(thf4uYv-+-yG~jQJw1u(^HZ&x zNx0jL&ziJLw2d5!#B#lmdJtp<5hB1aK{W`XHIc|sZxf-o!0<_ZG3(lnAF0tm{A0T(kyUyIm)+F#IznExNOHjLie+LD2nVF=Uo z14ajChO|Im7isQp%~>d;W_!a~>R&PvD^O0i&D9!4A+0W+2MtGWP(2ORiDyyW28R5# z+9tPJ_JthWKMyP&H}t~TvR?Mc9Y+@$xAub(!$fqfT(*UU`ND_MhB_fj43>G}gF^)y zX4WCGE|SpB;$|!g@vWlk^(wf201)>|W_XO3xe!*Cmxg3Sj0D=g*2c{#3^$Jz{h5BA zj|_bkf_Tr>rKfeg7rh?=nyVAJa%;6AU2>-%#Q87^W4f?9E1JNlXP$}lX#;(%i^|%A zb!+5T*hTBHY{;19^-Sgepk%EN`Sc@N-Dr$UZJ<8*USO1NO=ddA4R5K$`Rv#Z3KA>Y z$i^`7dx-dNwQtio8YOnQGmLrxJAXo?QH~yYYx5NzrWVfr*>Pr;csG~6R^fgUml)OS z6=Nh5Klu}?`U$#JM&mHb_9X3ES)}QXjc~1a8Q1YL=q(z`kI7%Yj>*)7$5v`>GYi%o z`P-s195z{{vFo$ca~>IWmOgowKD@EcR`{jWxOYxY?+;4#;H)IDGM zi?t>?K~3C%icTfyoD3of=Fd$G#)~miRG6DjFj6r?@0F{xAVTC0UPd}XI(QsgsH27$ zQ#0xSZ59M&TtE{#w7r?ft{pbJ9M;pf0N%=wX)xqxuKLB)^~N-AV7xy^76_P74Klk} zc0qqPF>X){!!yrnmnY6IhC9C-de7|x$!5@m4vanx)u7H_^C39!{a1XdGS7>VEmu`x z`4eM{d1F*yz+6;)<83{ye?QA)IAH0b80(`em0J^?`Zeo~p?R`}BnXnI%6Ry=iu(iO z*t+|Qdy&Ft5&d;NbHXVYA_DZiK!+U)=;>RxxU9;+U}u`fW<#tH!1U(pe{=W)k9o#M zc8*!Q01p)cIdOx=ybj;yH|CnV&>|+b`7n=B>bq8Lhlv2=ZAY5#ztT6%nan#Fn+pz( zk7t+1VmU)H7=MDme|CJ{Q@LXt%mS~?1NLtpi}Z1n1v?&XVdxZ2fox~Ce&goZF-SAh z=9iYQ*t;`KyGJ%K2{9O~)h>h^8_=1ahEGReOu%?e!=&Eqb!6+7S1XsD5I4o0f%VgSdpITy(~n}0Aq|ExsG7_Eb%{)NSa>A_03X(~-NUn;#{SZj+gjRC!9lY- zdiCB%BLz5+ppFP&_|4QH-~0~Ovc@&X=$+m;W?G9R9pL-WPQ+u9qt1^YFP6VESpQ9y z3MxaO^?g0^1+TRDp}*?)EdO<3jY;p$Z&;5HT?*F+F^!*?{-vIG5i@Rhb-fn%Z9W_1 z!eH)a!@gH^B%&$yJN)qQ*aD)oBZ92&YMUw!WkepVEe6o+Q%OV)zfl#2JTI+-Qfn9z z9FXBrd1YL1fp2RdRpm%Ni{JYVfk^eZ*FdNoRV+>QM7c;VQy_>)%}OztE1amp3S8b> z&ZC2u;Xb?9D~1yg>Lm#(VoE_!BH9K(t+%M>&tU`#G6jk3KAQeek zl?iFficm)KVX%ClRwPT{+p2xs9KgynRS>o2k}5*C-d+gbK$g*$(y*Xb{G(kUpnG^f zPl|CxmZ&r%drWD+{Y;=gs;JrCguN6t$V0g<2SYKhm%4g@U1o?mUUqoMZG#yD^_P`- z+yy(9lNcvmnvBd>gY$461UR>PdETo}pio+}wRyUW9e9Q!Y^8Cj36AF5Sg6>UKOv@q z#4nFJg>q-O9$y4hFAf#C8`K@Xf-=xGb3MnL1-S^O^elO3mvrr-oWbOW;vL#{I@L|% zAWjXv#sLmtgP;D_rPyi}<*NQY1)+nuIu{Na=AIt%-P>O6cDY-5OvfeW%?Dq44WItq zH+NEsm61oP%PtjiE}Jyzu_d2>kzsLyOH}w!=n|8|ym!#Nz2+fCs|$;n{y~f+5%Fv% z4Cl+)4)*Jy({xu`-{hC7ksz+`k@4Z^&Gt5?Wm?I7>=s(V%Qjq#VQs4`auJB*qidGt zQS$3ac0;W>%4vHS{qFsli_CFo(n-4}%d&VQ84h0VZOB3S54qkbaF5U&vJ^>L7;&(0 z9~jJfvF0nyNy2-?I0VU~VUpY(l@2T`S_9JshMnh@drX}kyu>&bkC;`;Jc21^UA~&8 zC28?!bjsawZq$*I4^SXt&5`Fepq2g00idR|gOvb|yrtkFw+QTk1i=c&Cj9Y@VkLla z6)`*3+8$UPw1!Yjh@F<1v&A2#I`$!?*p)7QfajUl^rL>)@#n-}TsP*;Aa%n^N~UXv zz%<3OKbwPih05=pldKhuHen?b0gu4&<%tCVjA;2~M^1}O2GaqU&iti2I4KlEAqjngKmx-}N*Hlv z%3W7jz@{7t1e=JR*}zqc;5Oo(54&ncG24MG(wHk@@Gk-kLB}XYR!R(^r4Wkc%Z89P zzCb{M97^g;-zA4bYsh|WLiy(y!k^^bIWsKu_cHHhnlDZv;f_n=Z>g&W8b6pf1mMN* zYfw#n5!G7}7Px&cWf`3ND9AT5BIyB9=7X^7nfecV>4I2!(qVMTFWJ2HbH5hFyY zEOWajeM3Zui-=$thkSwy6NeEbWz}orJf{yQ8H&TiI-G#~boA}#pDAU$BUeDG$&p8) zVxcZN@HLPa7aPu(N%tD8JVPd20bpg4y(BYXG##FK8g|~I@}NzFh{7P21b&*%Xq(e9 zm6VRLVHV3t8}E~G(H1-KB+~ZloMChnkV=3-s4Seh~x&avn)f$f$BZP|Tcq%uC0E&y`Ij49I!iw8{ zX2cP^CB-M{&~rANOM%x3$PaCrl93$r=&`3z1zxRmX}?*Tbc_n+4g%bN{DI*RqY&7I z-gtfXB>EyT8~r?ZvWQ)CR6DsbT4tJA3p|r-gxpFMZL)~~XFQs&10WtLyUfU^8k%wd zlM&in^n#;Y?PL(M!eQZZ#?BF|N<5g*kT(ILq)!=1@FR?VF)%cW96qDIP{M6JUOOj> zCMgKu;0gB?cEk)9i4ZJ`+OE=OX7*XT&{8`;e648fR3r7~!$gi1MiZ7IT>7J)Nj4Tp%FGsZKAjBKnuSkuPkLqJbufXqQ4O6SEx_2>w$7O(Lfa98yEFfu>B48(Qu> zlI|ic_tLkZTz$h5&c-ntzevf@y^RuRic|ok*PDPEfbfHE22id^GsFo)lQWS(rKt`> zRmCE-!LV1*f=!$tEHYwO`08begj|fQVL(5xoUlQFOlkhklglDtwO;Su+Sf(mD^{x8PvJcxjez6l zn$Xu1--JwTGaOO(H@x{;5F7xSd~f0l`{Ace)t>^V@B_^5SM`jG@7L((5SZ0mKpn4i%mB3i*aYL|wN zm3&3pM7+yKC!{QYKR5|}T|~-aIYkph;wayG^xHJ-r}|P5E3|(k@Pxh#bbP`p8#|*? zd0ioW>80(=pwWRjzft@3gLpZ{%|?P-o;usp-*=q~*)j+;D;&e>K+C~g%5U+H$*27Q z(d2;~0Qubw>lMb;kN4^QE+Q6)OsHTLrR7WnC3K}T5c2JxQ@7wQuPT|~MF0pUG|HKx z2V;TS)1jqNM6i&nAkYov{h`)o9b(cd81NXCz<_3z!WY;g0LRF>(;n)_%2V7PiiF)u z_Tytt91j^oV=-6O72rb#Et*JbcOU^;PdI=)BFy7SsDzsVwxN&t4kAw$);JD&lN9W- zk1BXXr^iXn9O;Hau6cwk`a%qaSoR4!%Cds(A^h{jgZU!A>+}Bb_K8`w=6R%yeSQ}i zxzT=v0y6+&f&h^;fFFEcv<2TbJV=VW$A3o{?zCUNppPPg$MUH+TT&?S7=p?HA*g6q z_9Z!q@5N3HRSOjr0wjGo7cE%H$;If>`N8MaKTyvjJfum0qm+h^ilV^*!155R^@W77 ziq^&F8k&HXut=QuMD$Jgd|}yn6T~&!!{=)N;THV=KKs&&0t&-`86sl8>jypmfprnvma^2y7=3&*>swjLi-VrLF@K?K1v0 z;pph15zwHBfjmc`(?F=bbgS}R-w8Ph$$|t$gyfHop-kVA1Y=QYFUTwaK^!$0<%jTf zPPyFU*QgFi8dq0XLe+NtNFtw9JA8j!U(#p^TccB$^DLild8a)O1pf!n>I6@s3;pQD3wr}AiTY!JsESX zd**8)stkiH>xaB3o4KxEw;+m>VM0a#l1Z;EYgw(Pq}R9r6khnuucG@-nBR!oP>8jZ ziyM*?Xlg&ONC5da*MxBz%vFH*=*tVyeE;JF3q>%8cMQ~HrBn}0^jWtqj!hEf%1M&Z zL08Y^-qulydnb3D6MlLnw{BzE3EMv8kUU(w4@`Y@K6+&N|L? zTdD+=phT!4tmXKVX!W4xUJfaEE=4psMe);6UDO$PLb1h{UPR(B;Gj}rdpTkNLFe5# zZ2UBmH{>JJoPGR6Ke+koj%zP>ZmXo0v9q4Bb70#U{=KWxxZ!`fWBYsuVS&s+Q?Vfc zy*Wb1`74>P1(Zs0=ik~(QD6RbPRXFGKEmS*E7v%4VsOH|>CV^bK*qfy&>*FM?tp}1 z5T=@$-SYaJ1{K`_ASeHV{3kjxM8Q0a8pTQ#=`*16q=elD-9>*2tse&Mrm8-ws=pzX z8xMs27^uJr8UGB!2p=ZYU;p(rlx-6iE-`GhCh-_Nry<6PkfQ1#)E<}u18HFr_m?Oq zfapLL6_^wQayaleRd({{4k#esIGMKYfO2X}3lyqDt+Kh#En0|SFp@9}u>9~T84}Vk z%#xCu_CXetYAmfdnKQWn1_0KI65M-p>8EJ8IN*%S14dE)yCD4UoC%s)!(Ka@mMICN zA_i&L7!05l$f{ZNZ-JHj42a)Mp?>8Ob6E-WoMxsQE%Mb^1Hjohv$@SN_#Xg2zXa%i zh8TQ?fo%!!cMEV+T6MBnO+``F4O$9er2vkIuE(YOD;Dkrq>owh=V2$sg%*Q z0(m(1N=gE0*ZfzOc}@t5EV$03wSVX~Vh2Fp?a`FK00S`yprq&>Jr0Om2!z4<*+Qqs z59#9kj1C6K&wt}H(#GRoOlO^Ko}3)LUe3fI_iJ0x`wP()CLS$7*YB(=9NAdBDbc=SS%@+$sHvNNTLKRpn>R0G7V7Hp#hST2q|#YoW3a(kcpsg zjP9w6#9>4XQ$bV!XPZrFwJ-#1f&@8$5&KqYXNz5`Bs{^ezuRUhIA1-cq`?_)R%M!m z6O}YjA3=8MM68hpGiBsY_-0S-$}3O@W-VnG_@zxNutc}eH(icauYuU0VUmF76^DXP z`>8Y4@Mg&`H|b;h+&e^;BD20YANsa72%y-=0c^X1gVZg8t}DN8!s-dg0PajH1Y-38 zw#=j%Wl{zIDknf4U&4WVDsgGll)4TYwxZwW9#009*6Fu$RC?uI##U8=0v+OvhMwO#sq2ttmq zTA1%!5P)AC;@wEj-nTQ@HkG4j{I!W5eO`qol4V%(`xJt1(e;YJQmBq64leO%CSbY1 z;=4$ekpO>XI>01%#owkKnQ7fH*W{Y$ zqep-Fg%D7aov=?SGHf$u7D<=Rg{tV-DIu^!hcB+6_Aa%$x#7bsJ6lVeSrX6-u@oRQ z{xt05l|XEh>iX&)@Z`?$h3B~7m|?4{%q#W^d6}S7r3Pf~U_~gBmxA7le#IA1c8SCi zo?FlFfP9#PeHWyf1JRBYKXn$zaJ;|1R&g-jRs1?>lM`3^^T+UWA`j!4@!gmDGRqK) zDa=8`&99i!EI}LoTnAJ?lc4EkyQxiA#YIi%SE0(Z0huQhaKFT*d^Rd))Bx@ZA+(W> zDq-TbkdgOSfbXrc1^iFVMrHfk^&yng#{dKHvK`0mK&c(2teuvTWm=!U|D)_?u384z z7=C6uz&?l$qlAt5du=TjFLaghv+tS|4AoZ%ynLU33fx7i|DUGVhb;5+EL5%RI}KQv zZ_Up4NMZ1#e?v5#0}Ve`pu1$Q0-2FPddomT7Qlwhm86~X&U!fehx?>bjS_vQjF zr~tgA8GMdwAP<1A?N1|osp)XInontE3!EX;m9uEtdUZnTS8C^j!SoUNNB z``!iIW7c&>*7ou&$HmKw-~opl=%OE%_R&Mw&R8ObO$G@~LWdq=&Fz~Q?l*(LkREqi zVHSjfY)@9I)1HL8+=dKvz6`LYXU$i=L7n-kXl*NxfSd;>6!&}@n^JgN``w(@a8y-| zkD0&R>1BTw!0cuacm_z`7u3|bRL9D*oE1vEP8p+wuwD7K|!OHFq?fAwY zz;%tV;u+nd3H_8^aP|p8B3=*j_k7vuuYLfyFNdWcyGQk* z)4(s}moDpuYtZe1W4GLy&66w5j_*FdWvE&;4pkNO*J@ugA6Nc{u`+&q=^{05(QiM- z2RWI8l8^!LaA-dWEv~_Rfgr@Uk8Y-91CV#wt-|7ld? zm$-X1ez?@QNgzyqsFHBQ{}Hz%*znPds^;}BY~}X$>I(YJ*GTEFf-$w)u%gD#r+P(( z!&I6WelubMEJxf%>~xpQ1!D!jB%rD^6LJvOOn~faz-}l~OMQ$2uCRJ;IP4e~MI`51 zilU413GEC^Zz^S)-B%DdWh`;524$QSeJUv&zFbOdG?M7eeq5r1gQAt%;c{-0p2t(6 zGqgKW4V(-&hxp=@$bRrMlNk^yRp)b`tv`{od$!wtTr{XL~5-zn( zFfT=E?fWiVeHeCBjD-12Ra8Shpj$aeB=bGKEDu+=INFFFt5OE^(V~RV1@9u)TF+s> zcGE*g3oe3$!$upml}E28l)pT^`kP0?Ws+{=qP51gkI8ZK(Eu75G+0xF&0WP~&9u!P#-aVZ2hU9yPqP!TH`e5+kSgglR|P zR|toli2=p_-9{(_vtlNmwHik!8nI@Rn61wK*KN_$u$U3zMBr_5Fb%@PULnn8-lUZR z1TR%(anjaYuUh->84fTi&Jl-S%W&l=ZPNVUb5cjlfmOOs$41o~Gxs%9zS^dl?dR9j zv;rpCe-r2aYo}9Qhwjr0jn)dB7DE9pynjy0NtHr>XHB-Q+`LHo++u^QyG5b8VcWB} zQ!m|3OASYDNtUP&M2%qMh{5bisp5AGveWT!C@!B2Z1 zB1;A++1Vg+qIuZ)fI&LEn^3icJ={{a0Y*oMaD82Jylx9IwqVQ%ZI18wvywxfqhcXE zvcd>|%zMuDrhF^c^@j~dFi(kPEsa_!`VIlzk%)5^0UPPy*A-e(@qJPhN0Wc#tK59@ z%5iWNl+-MxqgJMI@#zKoG)yO>O8#*Pd5orX#3juMw7$w-?Sn*=C5awvTIreuE8hFZ)ghXmk~tsg3Emt!80-IUev71p;$V5n9F!9taT3z+Iux`5PSBPGHm>QwYUSnR};O1zz< zh9=zw{r!wDyc`W znogvaqg+!cLzS!sMO6Mo22kwgU1zCEoUgs9^O$}~xJxLDsVan)S$9TI7NFPjJv~+F zqA!#dthp@vCE1meBBn|hid8l9G}MT-X=@VBEj4y66#d4wm?*--?3uzg-cB%_;Hek( zsAEW8ucz;iI;5SH$4gB-C_r^zWj+N){WN_oGio1H6eVtmO5(pr;X0GEfUAjpR%J5! zb*4PC)sPy6d1x*o)_w5qG>m#POXrU3p74BaTgtq2DG%Sguxf61nJiiAdD*;3dXpK^kDG>+XQqwQoWx?Dvx4ESyA%%L%;1TVFOJ@y@r$$oU#v$Wy)5i>pPDd z9X(ddO&^HZl_$`pBWsN)`_wmlGMn0zwh5MrI*0fz?LTc{ zXTMT9e$EdP7;8$MauP5Xw?#StR~T>_!fEv%gKrqT&&G~Lny`dYHiEODh$YQbfWh4ucA z{yc70-%lUEg`)j{Z$&10B|}v%unbrAH0K{RdRg{agx)uQFU7M{!C$Vw)iejgB@yIK!(cr?z4T5=G5H)`jnSnims*fbJpDc@lF z0>|&Q3n)(N$7a?HHP0Z!J8BtbsHzVi*HR|mcKe4;q8=&1cYtlsIxK7S`(xzCeQeg*?E(rGX78dDfHvxqQqs7Q}#=j z?$3(HvSgE@>-1X0SBuxT;T`;|men6uY|-1yKS}#HFPyVIHyC71*Vh`a_WpWyLYW^$ z!uV|z4r;PH7a6}(d|rvH8u8o8ayuS)PASPSqk*zyyHA8T-ez6#9m_qr&xYvV79R1P zsMvWd%KSObRL@c0*02YDkJ+s8oTm@Em)>lTd&rpo30;tJgE4Dsq3pWyZ70#ZZe~bBjJ4p)$_DH=q z1iCY@N$X+anPalMKb*a6l`Xzzf5%J?Qxi*g+Kz|Czm?Kl7Spe%Q}mb1esCd0Y}))U zpmK}lIZhX_Jp!zJK5UyzAQqS)Y@ z{WMB~5UNEyv~nXC15d6GU|v_JBqvlyO61Oj{eO-Z#{Vvmp#K#}Tki$Z2O>V&nI7RF zAn}(^kF2``5CSIg4vU;!;b;JH@IOh1g3+jtGI4` zV$-iTgJ{|i%P>oN!n+9$^`2a8wOiQnzwm=ns^yDJP?|SC)*C6*#Gug>mAmbI3y2=C zBj#KBVKN;r6zC$*QSBabLEv0#{vt~nu?aZKYVUWwpqQXdoTW^@y zEQw+gabvKR#AWasXDViYBQwHtUH62m1=5bMeebZk9Rzdblh%XtgLc4EB1e`=>J8O~E8FbyiWU*I+O9w7 z&jXnuMUv1%Cy&Q$kfxTQHNIb*gSdBi@lbF9LKKs2g z$1E_aEH0MG^B*yGs~b(xfmHnGcuAK+K{*w^Y)9k~L}M*6F^y;(xeBE2fn-sv(k4X8 z>#+s1A{^+6+m%D&rtvPnGE?%Z1!vpLMTq+f4CH@SQj(UD2d!(>uJkqIHNENX_r$(P|L0Dif-nyo4 z?DH`@#Z>eW%{*7R`x!@N1T`Ort)+1HgssLE6J)OehyUYtk_(Dr?@QhHJUu{`N&jbj zr0ssZh}3D_Qut9yJ7c1)&{?mMn7O&w4ymntSsKJbr{b!moL*TdpFI4%Xi?3@ArryR zidRY>aW{|x-EA*|f215~e=zkWO(qkLE9?+P^(p8w{XEAZd1TibO$Z2a1OecVeX6^K4Y z;k^^_!4Q2{n7$=xc`q#_v;&!vv+^r8y;r3ko&N0vpgNxw?E1Ls{KhlH5bL}TH zDjS3j$jVT}5WI;eMc_C6){s(Sem9zfbVSj&!WP0t+mQy;!|TA=x(b|B$wkp|Yb2aw zb!Uy(MX?^~`&3mE!m~k!4mBkh`1qy>k>JQf^KKC(F%JBN!)P?dOw0CxSkjF#9Nbi( zS^mI(V_oxN2ocs4TYZeN!QIFqS{@nt0xHol|3rX`?2L(88yj9jo`cUI($4Im==bE5 z4@Q<65ne-$4wfw-zXITkGXIHY~r54DM60C5OtI z(buQWbWoL}4|b_(-=@)mq=bn4`2vW~w9&^>0&wlFDpZu&@^vqYv`lQA(?b?bXvB^+FsuO=3`J3SW zWEOXpggR#f+|D%k%#I$@qsjcJNJC0eXO7gQC5@*4C?yq;xb&hyQH@2>Nu8P|l#;#D zX0$AJn}+)Ir)zxJ($*5k*A(@OEcBKNm73K5-H)kHb!zaSI#sDcaj91AV^fj3MKC7S zQCQ__Rc&*?jsf+oXkFFpPDI9HVM$P2lj&H!3bnan#a64)8fplG*U{)zI((hXU`hrW zo)%UrgmsEx>w3Ulof4Y4lV9y-62*mG$}v-YV8* zBbw}Cp-WDZA*@>4oY`7A%iRZJDs92lDB#|e#&F)0Fa4oktK0(Gr@6PgiR@K-v8YzA zOp7~efsfpzIvU(*Y>xl2#6TJ`5KkE39q#}zd>70S`Y;PDs3n(c5VTQkX?Cdgk}!KV zT;B| z%#rxUl9YlJrM8rhvI>{ch{E=@(c+1cP2$|(Oj%s$ZSj-KMce9X>ZGidSx?#*vzRXB zJ@xuyU2V1qWf)-p7>XE(DRO+);UbVCJMLc=LH1>GL5r8}1KN>~Yh*AF`p||>bfFiG zgceDP1e z(f(w&nmmx?ObmU#f;6rmGC`PewP<2_E4d@PpvC4lB_-R5yE&-t5+5XFvNexrpn|1| z7LJO!a-Jp2y-o@K=NiN~NSu}N>0=MW*f%ynr{P><11Mt{7#T*hot;Uu>iK`}TadcR z`yUdUQoJVrw)7`e&OzZy`{XXy-O6A7ZcB0-<{p-^K^qA*G=r?wc7@d`3~=L5E91r( zPj-w$JrEcx9V1VFI>$Fzz@xqhz$Thwrl-zz94k1iup~B|4dC#Dd|DA0CwfAXU37~N zg6N%Ih9Cw4=V4T$>kR$6f*MrqpB1T`TMPG++;tfj3S6&yN&Hh4zdFW0tMNS5nv1_h z`Ndl7@{kXkgu<EM|M|urEM%%bnB!%yZ^CD(J331I zaOuQ&(y#bqh_~9I%;gvmHqan6c5|}ZYyd$ZUHOZEF|(cicCuGIA)~&r(j$)d9E(v^ zMe)M_K&nuIfmmQ5Rja1i>_KOq#D0u`t*1q$&0|N7T|`Zobo zK!5=VfB=|(1-O6**ns?}fCOlO2-tuS$bb`=fCFfO4j6zHD1jUJfEnn47bt)WD1sZ< zfg^~4C76O77=kPaf-CreEf|9=h=MW*gAw?GBuIie*nQ4E*pjm~Fr*SBokH)C?=X^v=p(svMJw}#4KkTy0DZ#Q@Qm@}=! zC|HM7jd+nBxk~oHZXY*WQARS(u#C$%kaedBHJX^i5I|E(nDYUEq^QnO5=!Wp!g(vJq#;b`Zx%j7^7j$+(UkVPnN;eFpG$ zXs3qCFn66eV{Il3%b1j7)EMFxMmYB~)zLZ+H4*m*69Qlx8Gx2}nLr5;lG3)8S`{C` z2xq`JmdrY4$LO(f5vS#(irSj5djEpk@HBke7S{7f8ZUDh424U8IZV03J-nUI}$5MfE1W;tVt5w~o$Nu8}y6s>buHdKpg#2E266QL=7im?W$NuLDzD)@+U&t*Zx z@PrQ+oR8^-J$Vq^Fc9S_cQ=+CFbSLz$Co^L5br6D(+7#dfSd)2XJG~(^92?~iJM}6>)ec!kTO$3>GPsWErBx$aFwzmJjEKQfZY<7j>5@m1H-V zFgABTYNP&0TE1gNP^E4SGZ9A_6D~@nV2U%=iKU@pVoG75!8v0=iks6wpneUDjpPd92rN~CdEjs{Q)20#vddZ)#hr(tP~nJoXnIQg^U<^fGNlvM38H+Cr>Q=c5C$s=%3S>v)#fSDR7)sc@gFbQ24la<{IRiHu~Y zq$vx8^%zynIkZSy7~{HCMr)=yF?VPep|mNM@fvD_Ae{fOZ1akw_W-gOYXGfKl~1~r zWOt-SO15OTuSjc0LdX^X)}Kimw`dWmoU{~#NwJqHmY*sNNf)o8+OiQRwM2@n3Av|t zs<&ZDu?sh)a_dP6WUGxExiq1$uY?w!;G@8Jgl9Q@rNDjfiV>d+w6v+Qqh_j?$qB}) zw=O%f;EETOOJ6^BtCBmr^+lp~)eyCrs>nK@{AzJd=c8@9q+}boFYB_X+YV4$yao`w z`-*YN`(_<#yZQ)lkL9#W0lBoBy#ukdj*G2LTR(dLi>#-rwrkgXi95J1YpO6N5MwE| zV+&`(P!3IptZxXvFZ;dPE2(tVa{1f85fK3X&`E2N8N(o)@|w6a#*>234swdD2{8@( z%DVz7oRmAIjA3l|>$2WxsbG3B`6j?$=)bg^uptb)<_fxUnzl|VaS>s!VWZ zzz$5Iqvo>0@VAJG!MI zzzJFa7@GhSO5DT{M56{{QNp?u@*1VW>1N3P`e_NN##x-R29O*U8E5iq0AVb)VQb0p zO2abDyNs*7!(&0VfxR;^1ZN=tLV&~rp~^8K0WvY5s2KpK84;V10KN*Nf6T-NfSO7S z%e(v*01yRI@W+76DhUw4ZL4N7qP1ka!1g1P4I~Oh5!ePy_}*2m`?c3Bd^Fe9pRx5w@Jkp}GYFu?ei;%2GfIeZ0@C zuoR^*3an7i27tN=0L?HF&|ymoWMBZBU<(Ft%Mqc^2CxOLFbc(7FbeAz9~{LIVG6-O z!&z*=iJK8n83^)Q4uKHEf*=qy91JS|UD6C4!x|j4O!(3QtF7JyFjQn9T$&KXj1lf^ z07S3^5y8qyoe}Vi5e!TUyE+h4Fa{VA&@@pG6Cl+Gp#=dj1st6aq9m4G0?GS00W&6WxWOMP}Zt#0Ap>{!yO`Y zs~ODsmT2(`86l;3-JyaI45>YLVT`O{+om!c5t|&6h5a((s|b&6ndA$|k6~+tJP@Qj z6G4Cxj35)QeHKcb1OvJSx}5+>;M#6&&j%3&3Blw80RTd700D8G*SW4r=Tii6G6*7YvjD6UYjVHhhF331fjk4HzK|s2h@D z%+q97;yzryLraQXRBn2X=mm-ZH$sv`i!nD==@BZWH2v2HA?kM>=X@=k$Se~fISD0g z0NVh@qc-fqu-K%&>hj2PU{^JNd4`6Rhz0ZGugvNzD=6L55fj-=FyRMfKZ$E2X|8R75Lj_oCfzW|cHDy$KI zTkFZ5>l$neQ7V}+cE5B!5Rd)2$$s(K%kB9XAQ52E8Ij6svE!dD6I`7DP!1ENofHh* z4j7#jvaIhxPSn5uoD(;F5Uo(?08rckFYrWdyWjP+2T#LsTC5aLzengBx^2l3frapT z$^M&LUDg~K{vDRhQcGd&i(t-+AOM|42#RXTN*x67%mhmy1WZr}8PV@x3)|!{&;c+C zN#F7bZ2)_0^SgZ0J1-NyS_*Z45W_qWWMI*8MjQSzo`srKJq%XIXHI&;5 z8LHy%1~A_lQ3L`2+88keO`!Wt9TP>q&<4=o2eAdB%FxBV;24p~a-R@eVC@4zuM^!VM(M0KcZ514s=lCGL6?Z-K_C`Xopy0aYoa#0HScg}6Z9lf8cj zAHH~H@fZi^H8}Vpw}K^w1yW?-p2KzqwrNyYc&~nk<^BH$FfNfI8gRgoN|KBsASzk{ zv;czWYBZMy5&$NFKpP0di~vY#jOL7UORU$<-935F8`$T7$sWiaYbR8sTxw%_pH%=KDpZ8c!v zi{8AVp~8$MmZEzPGQbvrNcl@5ehuIT&4yQ&%iseE zF83ps4ak;dn{USXt^oY82uT8Q6>?m>m<@!RAp?n*AhYBhs2hyh@$$;^^vk*bYJse^ z_|eMlA4=MTA#R>R$9JlD`jX3xFpiVGdJB5Dk9qRt4f<4TU&F)BsE)dMe@k zIM=;{OfX7$3*HhVNW?b1FCzm?5Eg~Dk>r&QTvP<3MiRJ@l2FTMJ9461IuXVyrVcV? z^GM`MXCpRJBmtw4fMX^%5aR5yVb9y*qcnFz@J#U|#;Rk(`eZH~UJ))!kcmWszyyr| z0DXL%jBuv%#er}VGHGj0+NRS(IV<6R=bC$4{3OO+Nu z-2%|#36j7VDq0!)Iu=q+6_0259lkR>d@ z00up%0S4;J2-Jrl{3OUufVl<0RiqUTH9$QwB8olcCIX_6fGCjiPKwksELtgxa7Zc; zj7CH(`XpsMMa`Zl>#P@9x<<_O6pHq1$+KwIN!EGrU(B5=ewGa^Vk z34#DkNJSI#oJa(uN|8YsKoqQCj#Q+8Pm?0+j*dYuc0s+oNWU>SX1VJJ% z5r{#@X@JZa005)0>qTDK9IU{SBh{ILNj2h{8Hqw5VlV*zC@->FOu|{!iYbQLTT-=d8-CYxk`I92jeiy}uWb>znVx|Ha zxkC*SNnA6N<0T^^0G1e_5E)5A7~CS+k>pV)^|UT@1j3x`Iwk;M;iMFJgBzt<1SSSu z08CJO(3C7e0q(6x6sS9vlOh171A*vbgJP2aK()LB$pUjmItu?@q!m)wLK4^{lDs7Nk_aj3>$k+QV2V^#B4UWdE~i?N zl}hBCY5@Q+{n*uu@Hit|p<_F;D+MxqcO;RVhypbu=vwcn9;6V zX-X+@lG8P+^>%#S$<->FjKf9rZ$qp)l2GJLNs{ATluMB)uv$EKl!9q*7TA%Dn`P@I zRQnv+k=OR348>JAs?GAxjQUoAk>7z9PuXmGaG z362Ux>PEakac!BKAerDeMMRhp9}2b5AxAU-7mh=MOUvC2Q#NC$qKR;1A{&^v`9QE? zfNY?gAW6vZB7L6i0hUK@1S{^f!u>jAf5bu^VRu|Dq-26X`YmFP2tB-t4V#1F=Hgfd zHZZXc17O1Es}1_fcR2J8?z`J>KO+1D(sIUVLe1?=fMXYHP6IHXU z4NwblV1gZ5H-I*fkbujkJZK(~*y%g`z5xQUkwm4P!^`9MlFr3Ao7jRwl|UBR)W{t+ zF%IuFLX)Qpgp#hN2mmA}j@XV;004gyi2Az-ZLkIGGXSzPfN{VCamWei8;4Aw2T@1@ zgwrM@a369xm&(W!5fr}yayz+mnWST!|1mDODUSpYGMx~EB$z=ClNWd}<|RK_9)-s?@580FVy2iU=}bF%Mb3kr0598VKJT zh)G(4C9t~DFgzuk2p=4yEtoTjSg^qBxrq=3uDiTUP>0C#xu6?}ZF8BEBg5tSh2kkX z)ngMW$N-HP1r7KJQKJZ{xSqRU0wojx4oMAHoG$mHh@0a@o5MMrOQviKp=j}ha_EF^ zcrdq6hFA`x#Ii z9s3CcV9*`yaYsX%7RgXYj*G2MEIsj%#%2r0z9d`7okqCtUk8ul1fQU5WNB^*xB5|3!SvosQq%~I`>MerPu zn391IouT}XK?$yye&@FbfpVjh9+nLM2 z6t0cvHPhq-tUFErzdXn93$Y~Pnl$7eiO@)=%m}36ox+-km>dYKs4e|r&StE~&yrP#Ho9;Hc@&6Ah);>o9gQdj?Rn6Fn38Fj%7IXZ)f`c8%g2u}&WRw*9TifG z*qOJ;8fO|4iJYP9jFi2MO^jGe7oE`|1qmNImm=v=D%Da{(lg(gg zPl4cu>$DXAr^L51xi?FJQy~?f$Do++Bf+3Cn=RGT<^Y@otsA2%qqx|f24zv*sYrs* z3pKq6UQtmQ-OxR)6|#iXNfn5qWJuM!$G1q)jIbYOte-aZ2pEFNBzaNWq*S-SQi}-E zQ{B;21)EI0izHQ|!@mwZ10gxnpQHrRojcA1yRnCcsOKSfbBVa_L|&6(s^Q*ln#grLEw$PA@WF|kSyb)$>$8jTRxoK;Mq zTc9ze*^GDx9mR-*oyb7Is0lq;!zdMq?A0`VQgKbznb|2v=~$}`&Jt}TceRzx3{W2B zh!kbpiLi^ZjZsjg5{IpbzaWTRa}78i2vbT2IjahZC1;zU~W^i@FgCB`LGeb8WJuT z6V}ZXMqwgKL&p8n{>5N2TvlRzix8V&XAH%Q?O+~R;28F~VXRqUz2O>e-ykN#2*iI=STqWP`il9lqWJ)>{vaQdpduW(>_aY8}}L!{&%U!|Sb(tZ(^< zm&+qkcvPFt+=HgWqP~dS;62H{3$8YR_1faM4s5_yV{GPZNzT&$2j=F8=tH#{k&CcK z!!kaMc}^N zIO^x7hzx{5$y09X3^jRF*Z0^=3Q;pwS!D6=v?ueix#(oQbplP_E zYn!;QR_MIPXoV={2m?+xKLt=*lrIGBeMomQ>@1X=|5yzZQ_nukNb$(D{q*VrIYds%u?@< zNO6qtL60zRw3%-J0Wr@!!-?2$9S0*$vgaF0VbH8c>K2Iq`re2nIPs}UfG_%FSDaZH##Gi!k$5vEoP0h#dEFBI0p4h7)=oh_!w}3U`d zhgV71O8GE~T(Ks!YdIrs=U|2;-N_Jf)7AMweqV3?A)5zNXZmFq6u6-ek2=ocQ!e^C zV)=QNA8Mgq@b-G0FJOKrD(-w?j^Bu_&uzz0&wneF4R7dhAA2e)Zj|5hwWl|=XN(T- z&y5CH6An!(CiK4lEf6P^j?WeOMe776d9j}Lniaat9tkA&bH`5~aG!e|N_ci%dY|N} zKB0NTzi!MYU9e}Q8}IEXW_XNn;F4At%Egoai0E?APai=h7$ZVTB)PcFw_#f$`O;TV z9s&{s)lAHPeoZ!MzHfQK7w>Yh_eSaM%jb9P_Wc9GQY1NfF^7I|c2zsBe&G^{%gSS~ z3E%Qd|Ei{a6e`bBpzhljnkVKa+Lii<00>eB1`;f2@L<7zzYZ=;i16XTHxMUI{0H$0 z#f%y^a_s2wBgl{-H_&xN_&x z9hktL!;Mf4Z0(Bkuit}9hmtku)o@M!h^z{7dAO7>QHomvBuN1ItHZ()L=HX7RA*ky zb=fvPxzlS)jH6exZteOt?79d%3kKPA;A7mM6Sn+CGk0#TWM!5rI0|sm#GDDbN@Bn= z#D+uL4GhpRH}cC|v1fF8bE4ST29c^PEdD(D^y=5U#(Qw;KiU;tGIh#5az^u^9~vb{ z#;pPqwL;x|54BQ{R`dn-)_uyISK3BHHRvFF61V)qru1jh zcO4Q`1}SbBuoyw)F-K5}2#r|ND+VD@PENJBa+yZ%5Y$d99{uPg#=+i02E{= zMOAe~<%An?_>hbP6}gE<1d1dig$B6iX-0^awQ5}d{BY7zg$-9JvBerY>1=xS7Sw)_ zmPI8>$KAS71Ry0K>O*iM$LmPCCVA{?4&W*pxaFFA?rYO#3Z`yBr7CMid=ezD0fLV7 z-#^$Q7oJAHv_q&yYC;5SM+j;pr$(*tt0e$P*;}hYt0HWYQ0Q8GF~)H58XvnOjo1>F z6v2D&K?JvHE4Q{5RIO|O+Ip0-M)&9o5x^azS0q7aaAa~xgc;;$#z6}`G(^dA^q8|# z)#%VpG)YlV%@hHQ=|(skP+WusJ#Em|2i1a*Ob8=owV@rg>d(Uvk$v1l>KYWD(I2&1 z(zK*LMC*Rny@#IxsuBG+;2Gc5-Fp+tWRbH7!Ay__ZoxQEV^kkB?ZO}3DkIqgQ8$}HpT0cv%^T!)-u;42t^rYS*EL7eMy>7R4+S`oMahX&4s>f(!+?SK7yPNeD>-ZSHz;P&b6WxWcyr~&WA97ai@Ih znHWLvmJtDph$4Q=9|%L(8UUoqek0*Z>sLM`V2p+Tyq6Gtx0$^gnAVeUD z5>u6Ai*UiATRJxyAQB{fsX8JY;|P+}jpT6ByA4O!*p?R>fR7UqBT9HzmMMxP34{bB zNd$QkP?g7yU|OOaBPq#`IHfDU(aCK<78*xxM2)Qp01|GP!IaFcY##yQ=qS>{f;XrVg{_8wc2`feEG6w?5IKC96HoYn65WCap*-YF6`CkEI1>t1&BGZiHply*BSBe(|Vzu%sWjI!1(c?HH#hMwi3ZC9QmY zEM5!Co(U!PoE{-8=+Z}2#{SZrHo|ON%K}=+lJ;-WtWa;3)fS5^gtZhBYf$W}+RwE1 zs#diP-zb~T*7&SnNbO}|TgR-@61P(2TzbxDo^sZgA~j%LT&!Gw?nwzdUkyWr~B zS~YDygYji^MXN;6vW`C6EiQVAmBjNdh$E1ysdYyipV~4>t#!QaOyuKOzt$JK*EvmK zI5}FD3Xi#Nm7Y#-o8ARmOr@*atnjP?mjMF{J$fw*eOdFy>YCGjdZjRfLoAmBSaiDo zovlwusw<)VO!Xf6!4hgOtm%%o0wt!@@lW03I}E;d#$kVP!y3gMEIAN34(T;~_& z0$4jAt;vr)Bvs|M6}YV7um3*VMgupEHX&LNb{bU4F}pUw6Y&s@l|yFBLV3t;=2BIy zY~buZg=zLp$x1;ClkIY)&nONlSJ~{4v=9Y5TlMmpP2!Xo7n&)A-HM*yENPTfT9zsG>LS~*iqwrMxlv_0k^lrun^)DQcEqTS?Sfp}+S>O2cD1t| zZf<{D+}n;}xye0lbg$bk>1Ox2-QDizyj$M!ruV$NZEkSiTi@#LcfIiq@O%f{-|*%) z!uPFkcRwcqJT3J(xB6V_{g%TLMy_--u5phn3gaG4F%yHFS==zH;~e*IvQ3=p(p8c# zO?kPiEg5r{tGdg$v3Z+w&gGl)T<197Ic`dq~o5I23gm?GcEhABM%?pEdK3+PJH11GhgSof11jl zX);~Q?335UhbE^v@RK_PGQPiB?(DK3fFo~p%gg<}KlgK8L;m@>JG#mu$4{CG|9j07 z|Ab*udGrwF1Y0nFCjfTb*}3%O8g`+PI~8Eh_IE{tRT zI@TjitvLVA=}Cn7;-_~^o)*4fdc1k$>mI)SLwe)=-AtH}Y5_&z-B;f^TkAbZv5|`b z_8slrN8SbC9obP~j2Zn=%B`7B%i-Vhc}&)zM9F!UWo6j#;TQkRUjl|8+U?(ou|@L* zTLvx<(AD7W^&IKRoDS054z`>R!dwpmq1m-puLzOSp`a3l-MLKvoT0(S$ITx9&7c&T zMrUo{0R~#25f*2a9b4pC5|ZE$%3!f5#n)Yx3Qpl;LE8Rp7|LB7>D(Q}aA8gr;R}Kw zNz9+c(Zz&x7aB@R%Vh=b1>wy7;2;ViArhhgcp%Xgo(VnI86u$oBABGy$RjSI9v)pE zW+KwD+Oq}M6-J^;PDTh_w4w`M9wjCR<~`vp%Azt#Vpb_4=Z&H&+8x%t;;L;NZEeyM7S%8AB5tkV z8y=tmh98ZXnU1X!EK*lA0vTCgUotLZYy@I+!J~e43ER2CZd4=)~q(NTfei6kyavG^Q+70>~4*FgP zVp6+MB<;E5X#61$ejH1-OG_%p*}X*_>$7ttHI|E{IO@|y@LD_e;`OyzXKWHmiihb5ntU`#PhN%%;^0SaWt)}bPBz(a{b40$#Wv2N z(J`dZgc&uq7gHV|T27^wU>aOfU3S1)8!qB+71&7t8*+SC+wG;ujT%R0$y=Hu@X1(h zh~+SD+T`U|DViW8Hl#^7p{|EQf4j!i4{V|Mr$3$V^&oqaSUmK2!A=&XPOyf zI$3y)pC!(sTks*`5awxS7gQ7=VkTxZ)}%r9WBI)znV4g$sbOWdMp7c;U8N-`PFP1a zASLC*YVM|D)*5(O=ej6X-td|;E@VlVq-!2#VH!?f)F$JB6ngR?cSV?k9j9}aXLh9~ z&6OspG1*ayXLN2_Jo2V%3XejvU}svRqH#xM1t@wNL%K+x5sU}f^{<@ZZ3L z2nQN8An@QqhYb}b{1-9d!HO0cW<*%=p+tlp4TKyyaic?%Ax)}W$+D%(mm4w4v>4GN z#+4Llg6!B)DR>tgMyGB4o6h!ZPb+%oD~pDy7t zHhGgIQNtpk7R8*o^TN*teu4JfmTg6~A{(j>`)f7Pf+bI`6wEhcU8T2UvVCaKFKLOr zM;pdS)#5^dtrhOoJ61MdnY?L&ZWtZsYh#!_HqKTQ2c;bpFqG*tcEwcEciy_8nMGX0}{eFpW7@Uap-7{W|s#$FHSp_1ZZG!n0bMJw<)r`e;Iu~VhF)ABx_;vrcA7-?IWNk-;NhGC|l zd5B(@SB7SCO5A<2MyTdv1{Uiqm>N1XUaXi_Ywfj1*}9-zS6N$~L!+K4;BzqD1e>c- z&X-)Iwt_VvvJBOQ8k@sGI+37=X=)LiINIu;xo0AD=vCvkSrfk9dNc&)8otVS$G74VQ%Ke3NQe0H0>k#ow|-cFr-MdEuC!_a``0xhc*de}H;UH&UvDepu{{*KYgm zxci-$ptQFxJ9)VWuTt-U0&lbK|H;RCWcWHNQuCwZ6n$aSqg4G>*YlOVaogXkHuc|I zA3pZuYhOP1=Xzyibi`v7 zT^7X{b`E8wW1=8A2P(sP@m)RoO?Ac?GRdVUB2=OxA_pnRbG-+0j#=8rpg1R>J#1=; znpjvg>8b~jazN1GqY^2}N(AcAg5nuU^^T^aPa%(hty-VtW|_<9?J|7B0%k99xjbUt z(w4q6W-^hPJY_bMnW1xLG;OIxqXaT^t;{B-9<(581yWzyLYc?R)U4yt3UtuSNR!HW zu8i@Fi$Yn*I@LqZ1Q`jQqa4UQPwD^8du9xt`^+ak-}%pT1r(kbNoQB)rXPhS(`U^z zj6+@LKvJbkn;2!xR($!Yf1Ye<@1oNtALG%=l$0ZH*Kb9__|I;$v4;h>S1(speO>&Y2v&HS<_lkNZp1ie~cKn zutOzFSi=B~XodkS;SB?vBAjy7;MrEfO~b{eR79g_;Br+~0J%`8@nluKMl0IV>V~wZ zHLXoqCD=)#QYotO3IizC0K>3|FqAP2Wgw)tkyT-Yu6k8o zsjo&AGD;&8mJcVmnBX2{5h_`R0R*uOVI=p2^BfA1z9cv7{-_>dL>6Lkq{FbSH%dq@Ga z&WY6|gkzHjaoo(YVvhfzsfs2(Svt<0${Do!tn+q3gl8!&6|K%f<3)Py`1Grc=K#GMSU@vESAja)7r-5tigqT9sw=)}{7#Pd6 zycgQoR^clt^`*Fqgvz95@gj&l5JiMq83GnWrwt73fo%HS!yd>Wj9ZOtgISgE>c*Bn#BZV8C;TlTL(Vvd1*a6YG6jlnA6fulpZ<^f#9)yZD-Q}u{$Zn(1tXfmEOh7HCP{>uvxG@I50H7zh;xLIDF%fC`5vCSUo>XMQ7`w>;)Yzxjc5e)O8RNa#IJdexg=^q((1zx&)1|M$ZWe(e!5d4yDcAfKPY6euwL>URM**?EV%ftzem z8{6E(1vdYH{fq4Fv)J8U_V4)Hel2hF=cz2>umP&T{`#{L0ImpJ+`{x@n4E(V%oc72 zrf%q#cE)93Ek<^WaAhuLV(M0Y21stoFbL&fe~go373F>wxPcgzf4#(4CvhxGfo=vi zZ!9KYU55}T7F@x#e!_-+=ND`*xP8k&faJ%4lOZTOHb?E$XpOW`ngdd2fP+LhL{i{p zieew#QYc9Qek%5Wico+Dfq=pWZ!-8_opxo$WrF7?4CYpZ6;wBl^k-mLhA>81=%Rru zp$uH7WrEOsH<)QGSZ>6|ZWbY6#Aa+=mWK!NfMz%uB!NM_6cs)+GS~Nqh{!~DGdxI< zZsq@1g32&~r6zV<_J+ZQZk9+~2gqf`B@6(TiS2fY1Cxjf)Hd!HOb9`Lq_~PAL@CTd z9klZgj-U+c_J#)FiR9LWdstuxm=Lybi+H$zUU-XXSB1lMi!C->^M-b;I2pvTMwi1> zdgUbZvMQCsC|uBt+Gs!&0yJ;u9Fm3<%0Pt!fq-u~ZklLpHTZ;?Mt}%7YQShy0A8 zcJ4Ne?*Nl5skMIR^SOMVFzzu0NMYT z5n`Z{Jh>PfwvQP!g_<}F$2f0Z$Zj4PiATwcF6NHBc!}kB5S@5p9!Y9k*ptO`HF5Ee zD)9v-;RXiq26q6K79j#yd6t_ZUwh+WuaFQ?Sc^}{i<>ruCT3vGW)I^iiL}UK4@e0K zF^?cAlm^xfXt^t~lqxROYqe5erSuS7DU)7c1q8VfZg7(sAqRz-nJb}?;KM&LL2Z5Y zj^mh=aCs1%P>#ZQb_C&N!xdZ~IfZ=)Y;EX;>)3sonJsUlaD7%tA%jKE5t9}XnZlU> z39$uY`399~2e-MLodqi<Ww|(=XJ?&SHg4mFhjxgcQqdPMfq@8-lO`db1|S3(u?6&LpBXU*7OI(?No##| zV=Ez@$Of0{2B8h=Ukf^5$7m7iR-pqnkK-wcZ^&+YnPL@qqEazqfHYg>K~}105=>wK z0l5)M0DS+Z%Cd67N$p8pmwNfYj~Y0co5t$pd(3)|AmWr zsiRq1TV-J(Yy+DAgH3a~ry6r@htVWeIb75^rXb0qrDmQHX#loBi*Wzin&s$`=-8w4 z_M>@8U|*V&_t}rIrk=>N5|7EJpt=$XkfN7j4#Y^Fb$Md$=zYRaq4YR|H);_IDX3qn zV#he1o_K!aD5s(NpI7G+OWLc#x)J-?kjrzd8$q5PiELsg2!UCiyhwoBX`Tl`s!>S} z?MPfb>W8*yTyHq37W$H6IIQHV7zrSP@@JSVaey^go^dK{V@jUm$YNI}r~{^j<>;yg zPzte0rg=G?E{3aF0;*E>t1$7Y;Srys}?fiR5SYNN|4ptfj~16F~j38u=* zY2V713(=b6Ibcz_mlgV>2}?oR5v(aItN~!Hof?!w(O9jDhwA_Mk%};+`Rb8~in4EW=P=WKhtbXXOgRrf*XrcP@wo>-Aa;u-4T5YjZp5>@)$f#~j*{UgqsDkRQ46&Dc zc@Wr2vbM^tR0yQTQyK_cxkQQpT%AQ&8-LhnLkN(dAxN=O+}*Xs-QBIY zLvbl?K^ojC?(SaPwMfwxFH%~dz#k}(%Xgpqe2crB)huRaF~9dc=S2DuV*ibpbWAD} z2xX8gFk>x@>dCkGhxI$Bq}3qI@GJ?hGm~k$rYTo1K}Jtem(g=b-3FM)ic*}33@_`f zQPtceVlVkr-H!iDuE2cSVf+Pta*w})LkBhDMU)Ei&oZx^k{~FpzgD~cvV7ThGKQBz zt=C8}JbE^oAbT}1u*g82Ob3XK!h`!uiE^(n3wUXu5GfkfMn-JC(Q>tk`;QD;0JGue zc>h#+OJ{tMLs^6>H^5^N7ZwVY_angv48BeS)khDg9hFTGHv|en+1OI_SKFL1NBppS zNP~I>0@CQ5;>DEvij-`h9n^v>Z80RfSR}!a#ZqEP&`W5LbP&9gi%%y8wYeAo7onk3 z6|-7ml~SRk#zCE(iRv`QMe<%_iTX-FtVu0#@&A?NpAC*2k9^9(pGKbAM3R58#mBxZ zpI9=?DW0w%21d$?rckMeUpiM-6l0`|n5@(&F;0Mz3mA?wpp6Ty z)?(N#Xk2L!;@Uf&iVrx+2YjTu96NJhQQg(*|NTx6(L1%f;@?LzwJShG^!%Ig9 zBRR1%2#QlXjzNv)ZGxwM3cGQJy+|s9#=z^cSfT^j9*?>Kc9ZZs4+B~)g+xS`LQ=gLB=%$dgKhV#s;8Jt%Yii zzZ8@dL(9O>GSXy_wHOp9Z}^4c3af*upU;Ew0ehk^aotzlo8N?w2T|9$h*jfhpV$uX zXNtE;m*5>0=VenDGsU^9vNhP^y?KSC@BI4kxwhBs@27vA5c&n${Fv#-SS&*=+MwK; zDLsou^;k8-+MZN}#O8q+mAm_K!Z~~KL-Mx`kS7bQPkH(%7WqyyK(a672~}Sok_A&PfUw3cEHdzi z`_RFGhI97b!@F5x?$U^@nLMg*aOGy(#Ltq{bC=XJO0+`FxuOP%%%7fMnp`_dm+L<9 zB(&n+7`A7}%3m0y9dxc)RQ%bgnH@;jZk@`EO|VVFb`6fVSt2zvTT`i~`x@9|Ombiy z9SVXh?y>)#V~|9@SDa_HJY*{xk9L{Q7Kd`W!n{q&P@5Lm!T@@6M_jmDEvvAxzLAgM zZ;+yoXnTl*tOmCYhJ|AG{$a*5EN%THGQu(SUQX%)_ZsJfRf z#Xy=H;3~1QbB(exjcN2o$OHBQxyMRX&?)NRk=b_`hUv6%(mKZOVWue|__Vbj=X*X4 z0at`Khvuq&4eST@0qSKuKX{Uq8^VyV`(qt*zP?1DV1wWBo5`%vc`8qy70F;V$g>`H z{#c|MdZI!Fc**3+K+9whOC|--x<*LTM<@ycR6PS>$bmjM;{h7cN-x#`8s9J^hcSx$ zpH%X6W?}z1!?bfiFQg;;@1uH(mCWGbwwGeu`~r%*yI)zc7aW?;HG2U0HrDq8wdl*? zUHpN@7p(e*l4%%;%CA7Ak(4sln|`M=2I?^s3DBt+2y15)6EI)VyM(d(8{)AJgRYPd zqJbMBto7HZgO~}4(7zv{dF+SA1!D}>tI-p}y@{v?hNJXPZLbO&Fbh#vla4|7`GzDCKNdq#IB(<< zNWxZoMYXkNVi7cL-N~7WI!F9W^0VHeL#h-;*Y=sEs-NZZjcy!EZXc|~@9!{*jT(#KG842*<|MUoe4ARk^EzFrD^Xj33VWtb>v{q|YIJ_H zsi%+VHGM_hB}*k7{%fL9J@UAkuFp)?tYN(6ux z44{Wz@Tl^C3z`zE7?E*Mj_kCyFG|^RkS&X$dEcU5ZV}lsko?HY6h;?%&5P8OeI*Xo zOn2O3RqmGYoDQ{72xAeGdv%kf5eYoR3Ply9Z(HVgg*BwlQ8W0K!ss!wQtoKbtz;@p>3#{!h4A;)AAD|mFrT*&e^MdAcE>9oa?mGoW zhC5-Gz;5E%Oy9X_6OXs=d#_`NsPGAN(SORsv`~yj~n7r_d$t2okaxwXlW3!M=E^eog z`??*^eMIwAM0jN6JHb^G{g313fe37ovN2hjYy<+6n+hD=yi{5QDqfHxV8=Gfr>?Fd z9xYtMF$hX!M@T{3B0?>msCeAftGpwW-r4)0hB{+VYjN3tm&85^DnYd3A>8{)qFb77dMoDn5 znsiA(ej~hKR_K6Osx{R|D$5a&#HicI&$?T#F zbw^yN(E-`EfQf6O!`U(k#R~&WP%1G%EeDnccHH*~KQSjXSuof?mlm%Xgvu6{$>gD0 z0B!3`b{_;>@eY7+Xi!Rbew)x`lM}R6N+K+#{I!rKv{Gpf0LCl1IPk88w18#2VE_D^ zel6923|N9B-6sV5MiSLun&D`$1PXwv2&TXU2T>IzArnH0@rqlz9KHe+xGEKQeBUk6 zr>3GW?ypm$#HH@u3)TU z@-Bz2B;Td+jhMi7Vee~fZ4{hsg28dIWKE=Be^K!+=}Xs!Lc_yL1A2|OwxCeK!E64= z1?e<%c}D;hVHr~~`LEwnK)S)N-i2#Rq)2mzaqT{84nUx+_RX^q(|1U8lP(>#HL8Ze zQ#!FiHv5#>r4ejIcex?3Zr=uPNMF4kREtWaXzwPv9-`L_|Cm~5VIyjs?Ec9`=zjH0 z4}H_H`+NN9N(KE$ZU`!!OI`PdS`s*;cJ_5CBLoo+8xl36mkI0DQV1tp5H-6g@a;Qc zZwOc-kGd=W*006o7Vxd-`$M~L{~nrq;7SeXDaZHAFCsU;6DNzSBmI8NG0w<&EQ^PS zSA8e~ZqeUr0I0))Ux@16!}nRO9+TEWFpu0rr+fC86eJ*fQGXbeoOb}Mexs;*oUxY9 z`Ym=P;r|=#e3h={r%Q^Y04EnYHZoh{o)CA zs&VWNG(E$RlV7OZdTuHFMIY!c=k~E=)&>&!ZPg$5Pw-%mtGV(0ay&YJYgFBDJ-qc% z>9LM{Q`2ha-5TON$|38;_=V`j3%R4F7Qx_h*%k=@z=6$}v) za-p$=WEv7! zkEih4sV3FvJENwkrI-I-q7O%j$3)PFjFzDPlm>E-)qe&mM+87r3WuPT8ff%5_&t(2G!s+R09fp>?Z_P2Ptkc4d7Rpa7PuC1 zQ{s;HBr2c>6^JeYG6;$AbP6*FHEs8Bl23OKC^wP5f0304&Hd#T>uJ+l>WxqBa9rY+ z5p8|_o|{~{2R}^^1C>*TfNwCq!%UhpQi!oygJq&cvcf*6{EjH21x;%KD9S2G;?;Sh z)ryhJBSec9xB&Fs5f5AwXSR=0rHar4a7Jo#2D-moVk~Gkto?n1LCEQ;C5~#3p=Hq( z=+0NV^Gqx3YwGiZD0n)}#mF)TJC^*T9mm4VU;{Aye>zqElFywWK> z{BYKGX>x(|7ST84l7!YhcK`V1vH1IIdhA4dYRDx8YXoo;I&^YdTBdtrm-v-;$pNQW+w_;9920s1?d3!?%`6~Hntq1TJ*d@s^yXN=uq+*_t2NSg1%R!eRT z5Tp}|L@f>1tes#{2tVtYpsxg?8H_Lp4aggJQ}+n#5hx0<3YzEf8Y?t#Vk$(_q489< z=BR|Sm$n&gH3^fWCDXMrG4=hM5_@@)1fW)Hie9=+MOZ73+asq8mOMVZXaHx2M4<1|I;q z;Dp9LFx1Z{zC|vMF+$kK3oupYO#RTfZ7kYNE60i@ro$`tywbdj^WX{!~+&`J=N9#C=WU-E2Wi=IT19D{P`KE;TW}#c=Q1%Xjw@5ObD_A3d|MJP?2n1>h39N{i+|o}9xEOwPpXWvs~*Y4`$U*oI9VhUToVCE zkiLBL?n#1%RlWF;7sxKGw$Ki?Zda;#hnv`KDZKzwY5e%eC+0Mth23Y6JEO9~2`u3m z+-&U6?JQH~rzh#A2TYZmb>fpZzj9JEHSHQ%=3(L^ETL#{=3TLVt>Hc_PEX!wOfGr4 z+#netd#^Mfx5=r4)ns_Blv1;DcFir((oVS~Vpr1Qk*9>Q&#y-(Sga!K)xznz9{-#G z|EUFP(^~#GSTuUo{@=2g1-3c^xg2JiCdLO*ppzmrm-kO(lgFlj?h-HZJGrEG#He%B z!~>bwtNoR}&5l<+&9tcU9zosyhuom;f#>RJ(vnuU9-Wdr-tWULnZe!NC4xG`bAzcO zx=Y<^H*K}kB2+ppxwC7jf7M88wF?f`&1y%fN9JsTzU9tVb4|uKzxdGxjOyrXO5L+R zvf~D+VscBSfp+qL3Ds$eK-Z-Cu8Hg zuT6xrA2YM%r`(xXbLAEu)MKp(#`3OrPndx5;p~aTk%< z567)pOtyVhvwX$P<-NLxR(*d=-WCvKimK+9cg8PMMsJ`oXP6wP6K-a}%- zTOdj@G@>On&`(7yIJ+RF0m~=i93K_UQvn5O)jQB=%>97rB|kj;?<7s>tVi^5qEfrB zev^I<#qadgnd~H*)vS*wgeAL2dG3H*k0U)1={sPMZ@A@(dqUwLX@rJ3DidS9$R3jb zV-0`l$(m&{6WR|j$YKJKB7rYyU~yY!DMSDMWE4{Re{hUi$iVzlnODI8Ti6M?qFrEjdF=>u( zlV#$umCRgxnCP3Iv4}1!=H#q!*J>lRqXRmN1P2)o+A2s>IDV_}bShU&N>*fZfOQKd z`XBZ<)r^!P>iCz^dW8foG8Xr-Gmf6}$VLs*dNFP>^k7FQCmI~dnq-?kfxu`djO?_s z^~obCMsU3a3)~)g>czofc3(*LBC?{%aUuSOSWS~ZJQohrG(aW-KWnSZejDuu-P%P- z5l<=qtSF4MO}1UAw24@=`LFUv2t&ek^7n@sOXMHVW4IaH-}_HNVaJYXHf1Er6AMRT zwy{qAu?*RN2(ds??_+Ow>v(?? zAO6kT^d1K?1gu1lt@Nh0IBIRG)kpNp|WZ8f5nl^P!zE!pH7Eju(IRLF$AHlHtPD5ck;tKK$`#-80T!!Jh^f=ZJ-) zHaY7O*P0L;v53MG4-R)*wa~0NxokB|-z;nNilcMg^Oz#LWWQgZ=Me2ac##U{xFK?6 z*Un_V$JY#e$hKGoO0FzE;FhMk$qAF_7dvchyJo#8JwySgqH;~3HuCR?39 z&Zc%hzW?@soOqEY;|u+PX@0Bco%^IUKmX3L=&fL=F2?QSqkHl(S zh@*3yQG?HI;;np0nv@aL?n_=4Gqy(2t>>4)?G1G+b#ij8q{41$pN^X)IYtNd&nWjm zf8_U1Qy1i)ZM+&7BMrhK28luM;*cTvzlUyrnF)r9F#5G#TQ|$_I*d!o5T)9L{Qj%> z-d*3%_|08{z7A-|cWGkqWiaHpM-lhN<%-lkLEnFZ+^a#LI$h|HB^vXb8QU#pH)Jg? z>1}MzN`9sJLf+&>bNr1$@Ol%4xqrgpQM%g5Dk9>g6hAr zPjVsElG3O42@ph!9bB3jlgFMS;Ir!XN2c@(Dh@}~G=x9mE+U2MA^k4m4O3E$-C=Wu z|GRf@uvg(h-{5}wfyLcE(LyN_JOOQsUYP6dn1lMgoORKi)#(@2Av=IConex1V+jC7 zr7vNFLO@Dqn1FfQhF$D>2tIPt{7(Sqn`2vWSwj%HnD5P)>w7ym=^Lg)M#%ds_F7mR zPvbR$3njG^H609yLHeds0ha9j$KQOsC3>n)x=YET=XjZsZWc#Kg!JP<0xSEX?-(MX z=hyO7e0Y%acd_1}I9|X@Tnht6S6N0S6`lg);iID8&5wSGYpL8d(8!^_3c)|f`k%Pg z|DtUy`pwR9++pI8uaxH~43-WD*nw{KDi_d-kt}o*RkjF?aETH~axpg7A|)U}3M&A` zv8`~t=6~Z_Mo(dfaXi&BTD0`7E%bVO>Jc~uTwB+xp`>uHKUe2x|8edNgk$Jq5AiyU zBS#`3A~;>IcGWvTlL>h_9@A;z|6v~oO&LrR=6{kOLp#w!8U8ARm1DZq+;+CsY`0XN zXwf1wVrIxz2f()?q+U}q*L8>3r!vX$DgkW#cprP*wU_!Ft!yggVrN+Ot$-d>BDj;NE! zS*XlcUA0rzfHIoYv6EWbnx1c0mRf*sSAq@}N$!dT9U+(ekCe((VZxtDgOEfsdNB&T zK8i3pZv<<-N4vKNd_bRJ!e_-v=0`~);x}0EH#ro7IiFPksCY$L!eg;w7?VD^9mTsn! zBW^yMVjH*vAQhDS6_eCO?O;BY1R|)BV!WtZfg;Lqp#GWE;h{t#2NzWG88X{-tg_uF zsG;{o#=yR$@8O|FX`l)Hvm*af33&sFrT$_BqpUxnq$V2kLM=G4-9q;HKwi_KO6|H_ z;&b_Rtx9`N8fy_Go1CHXy!+p8CB@~g-wK;;H=BZ3_iD~xl< z{TX|;8T7&bAcfF8OU!BHx2gxOOm>Z!m5zE_xSGs5v1mpy@vFX*k+=e9hHVPT2h5Rb z1-Gkeeks`w9bWz9y&!=N3ITHFsP_!YP8(o)XTY?T>U}#(d$E(I0)H^R;7(XiG~m0x zax3K?BWAzQ+!(PJ+J3S!ZpPfZ7;7KdEQ0c`+1Ee33D$$!>I@}A)IW-x3b8xi*U|D= z3;b+zFuTiW9T)qRQ9=OnKkfVXJtgW?^MJR$lmP46`K@{D`n#ro8+E#KslKVdYmpzt zZ>i`vdvAhR=Q&156+?pl8zOh>muX)re?Ej~&TIMp5?l|sz1if{@?!>H1soxDd?cK*0to6oND4Cp*ie{)5>hC19oiLV4=HG2+sKyx$%DJ+XHB4Wi4-O;#X{LSMY(9^QF zG{P(m)zL9hE0IBrv>2tIcPAKmDJePOQjf(465uS-YSy^x8U&H4FVRNXczn16Ei@UN z1qg3S>Q|Q9#zx~yvfyB~zn&{y9v&~CM)-4Bzv=VSVrmhZclNT5JMyYfKzNNO?l41!~Y0ZkEJ@32LG6kjy zj=4*vV3YX7t_@B8*XPZRXuEh30iOY8Tl>8#e8`iyMcU;SQHEBek*%?HYOlvDFd zkYiJ|&+jF@bSh9iyZ6_>XdR?;@6I~1>|svUjuX}S+331yMR(VY5tVPVE9J;ezUy49 zgfi<{r}mVADjW4mP|qTxA_~pd8>1swSe?pO~;$C*|cmA@H9PI(mqR zI3KEMGQ)ucIo(JVOYwBz0O1-|ik6IpEYUqc!}2eBIF}xc-GqYNtewaq&su4V6SF+B zX|(Bkb=4^vLTNy5>MyYj3imy8o6^w6r{j(SB#tC*3|dMkjPan42nB#j!UKrhDx?j` z0{gg#3}ho-arZiLA?$cpY8VW{l3I72>wRkedFj&?(9;{>lvkH!T@Z6n#&$|P3P&Fk z(2=RdqVd7?BiV!|Y#C-0pQ@;m6Ao6BJ0`k>Ek`*JmQdE(sFsk0l1~>KccuiF$|6@TFBWPi2uG}#~B=E zd0={b-19n4lyP*KHq9GCrpYiFoR{rg9BQ13JybK?453U@eN&RauX zK#@oD?|1@JOIP}KnTP2VTJeM47OnVqlpj9lUi_ooBTFp!Pv!z{olk9w1D9zZHQ{G0 z?a7Hwv7vm%hd^~9Z>c%E;yHX98`(n1jq$2+EdF*u54O;Sgrua@3L_QBmx0Wx%to4U zL{}w43t3b9eHx-Gn}V*^k>DC>{}xI&5KUXIp}0Cp*Zv3BXoB2C$R^VPA zdDXPFhT&k8%vGPdug=!(>%#Zf_TM{`6rx685B7H*?0N7{5I9dwct0> zm9G^pIH1@cQG-^J^it#65GyH^7O+_RyGLfjjXk)G*BRNAq5UXqPt@4#R zHFdBe$Q>b-V-HuWM0?So5mg&VU0{F(^yC`#32S4>(Fa~LjIayI!aB3q52#_S-yVo$ zu5lu#lR+L?wR z#|ZXLY4$vt?aDmWHR<3qgX`B;ig)><%cz0d5gdAEQngl6t>H$kK(+^R>9vURwU;+k zit9PHBXW*VshF=|dGlIVcB_!@ISIp-wrAHol8xwgH2t5d_L(IfohL1k4`pO4u2Av5 zfRzGYaS3MsCK)wSPIOf>$#8W0QEB!rQOuV1*>Y4Ku%vdO3(Wt%K9g1;o+05%C=Dcr zkuL5(?(+?)spKzki$jYB@`q!IHZJ72G1Cf7bWtCsBD3eEwdfjg4EbaUgmXx`UB3R; zw@T4%*gq?7wTGse^}b6+doazi%v$1{`YBIUBv=ND(qUGX7GuCbf5S>X2w$RRNntn=K-j7#SALaho5Cdn39jx%mF( z;^$KezpVdDn8V4Z7wI~P^8>jqV@swGNYBxyl$99?kciuAi{Gf{PLiYUMMetinhYJr zj3nC%seO2j)V31PkQ~$%R%EcvNwKgxv~)3fUrmR9nJCL))OC!Ims(MDrG0NyMjWl< z$Wk76XzL`ks=Zns2eBc&EY}TA@gRfGjM%a_F<|?n5uCp_Up}m>)YQ{Z zF64^t4Re{F=f0Nid%L+!V7nHKXtQE6SKNx)No7%v3*ohb5V5hCEuX2;wzh~*)#Z;{j(r;Fv7iQ z)ggxaHlU(A+ys?wqIcCXa=KSwf`9miK4-N%aC!hBm0w9isK*u7QQw&na zV%TXhOEt>zNs)+SDbHz%R&}X><7cbtGCh`3+tV`F>PpqS)-=^SWnPu)U7xDOo+wQq z&m@v?JWerUnrr&e(ZBjT1^bkC&S4v5;GG9CSt!iZ{;nBv#8>Qe913UbPpWE6(xtB& ziEJz&XRhq2ue!Nr;J~-l6C#M*J{aL}#+>>jMS9{mwfP}AS?=RkY7|y)dPXy00=xbN z6dWDhY^PM9>V=NRjdj{~-46TqO64cG^1#KOnsRxn455^dU~$~PHwW6&$@r$**!mP(wrOrvU>k~4tx zYaz9Da31!?8~dzQLrb{rXupe9(0<^@pJU%yg~efO^$w0S>4L$mqva=x2eqWz$Y1Hj zRX2}xN0{~Ir8bG*(T;u{-zB7BIi@u@oct_yXd2S#%#iVSWjpRgFAL*1=^krBVZER^ z^Jb~JAa)yvAEZ3X+QSbu8MG!H;~ux__v`oDv|Rp-jS*@dO%&@`dH-SeZ-|TLy!&lE zB$YXm!upr;Wr$i<{nmA0gQMrd`R1)#|5uxSr3R(t7owaq{g&U%TYm#x48F3CSIv83vVq3k_cPvO5#)ERxj&t{4~^k&uEo*Z8$F{hwucP?XPAK}z%Lh%0>l|!ms)xaZnn!ruayts&Jd!P z<3yXib~>Ujte2DxEG`pin26sLuA)ATNHKO+#Un5Di!HM{xd(bnxw<%KCcW5N%G|}f z{yG8nn#dJhEM^!QTBXRO%f?aS0!uRu*3q9NdTZAh+HV9qDJ4v8b1dX#a&4af4K%aW z@UVaJWN*1*@8RLtnd} zo{_-axK1a)@j$?-MX-iV$hhe^r~!G~XjSDTWIV!r_KSjcl}n$=fDDOM9JCZprX|i= zAN-8%!*MumG)Ydt{)HzAs{Sb}nUmcVM&U#)$x ztkbouw3obctN%u%{0Bb8PuB`g>8KHrAHMGkCuZOKxstbesT5q%#zXbWbZ5IkNTbWs zIosZ1bz+~qKu73)($7pCJyCNsWb;b0OM^uz_d~(&fm6B73l;4zeD{chHxS!E9w)(f zuc(vRwrG?Hhw65-z}Vq!0BU}FA2<3`Ug9X2(J+5p?;%GKd!J&;9$~f_JwH~;aZp>u zZa2CEWu0<-ddP+{2Yp8!Xt)r(%8T*HLPzTB^_}QOZ|pt6r($Gme&t^I}|W(2Aj1f$J8nMbgX* zJQ8^@ZAQyNo~o3%#eZDsOm-Z})kVcUlww}}&?t%=R4P#EYCfDc zXJ*lx;ir{>M{!H1cQ$+ISA-|pdMj#ky-Wl3pTAaL*6Zhy`ik`5^9oLW^~UJ7eKHoh z_(8B=Y*Y8J_w#`Moj%)KAeTb}n=WR?@y6~&M&~XE(mR{tkM!T-r5f}3{%Wo3=?J@u zx#w>4ZO>q2Pn3A`aL5mv7=1rEMI}RALV-^nLVb@fuDzi4L%8fVt zMB05(89G5`H?{~Ppo_1C8D#hNbFk35+#Z~-*r3F7?{Mu$BJajAZIbBo8ZAQX)WACA zR`Xo^np$GHB{}5BOSP|#HY269puN~I;9ix@Bq4xod%`q6!kDirlHex9w%=l$TAI{Vac9g=5 z=8swXyn8S1y=vli-nL>I@zl0zm8p8WZdoGk zvs(FE)O%CEmA|&G=MCA3XRp%~!+vqy{g%#>DE-~f z9%*B_KRuz+QS?h*HoqBF1fj!Q%MxnGp3^&-2UOK!<@3#7LwddY_gdvrUT1lO`s zUq}5dvyzi_`@KJ@_i#DE*zjmmamG^Z6v&Xoe?I+z-RKAp)*x!*^Wm6MXXDk=ziZWO z!GC+8mhV4KS!+H&FVZ!C>Hqh$qv83N;RYV^@xO8Pkf7t5H^|%n-U9dVf-y=m)Wk44 zkNW03+W&svuOI3e3y$&|)>OJ<5_o;)(fYKBoGKLpFUh^%AHGi6(0Ak>-)OS#`c zOOAQ>YU3hW$cqH~!^ALU#+=0QdeITm-A?Qc*=4Lk8r8mxf#@0iWt_&A**%+rEb}UE zKx2F{amVq{uPFC8i-Tg4af8u(?D2SRwr`-|XjuV~`3N`X{p$m;yx@jMlE=*c>$BK# z@voPk0)CZH-76?aJa8kTf=YUi%Es;|J|!UdEdAw1xI_-owcbPE48qNm1WiZUb75+J z5~MH{5;}TQ=1FG&a@sDx-24%P;YGHW-&zyUB7aSN5&4iMJCw>opv=^t)3reDIa$sA`z^G%JmaQGh zgyEf|4Od#O$l1>%=(wN%hEFioYC^lob|~I&7Y`1QRP|BDNS!8In$b=! zehR~~{IA%qt<|6PsxF4zFDi}(#1lIR(<^_M8e3!0R&C+^$(Z&);}kkcW`REqouJ9HN?M}i4p3RPhvWJZQhBQC z3gW+HT=`WTj?NK2gd{!~4hp|%ntS55T>bi3%`S5O>p5n33z)3oZ(bNPOiaKV-ltsnO!*Oh*A5#~rI8Uho@t|NVM|oCd;V(l8V$qGtE}#~*k{GBoBaZ@`6$X0 ze7EVwVi64eHw`Fh+*|l~)?c22xo|Olecj1ol0e5f`>7&LusNiXDT-E|M1P}A`FFWi z^oT*-A%U<7>R-TIY8|1RJ*mO&kfOX^5ykoe#}-;T0@NJgN_(N5*`!I+O~<(ISQB8J zB_k0EP4LujeN}ueNT-{WSBB8o1^&(ZK)IAFIgbM-6B=Fd3Z@B~v?iM{@Ovt1x$9Wv zUUO70Qfjz`oX4NXVavr17Ot|^@;?8QgXb=m|IX_qFxe4L3^@z%yJnPLF@zGW_8Am^?O`&p!9GfJR!-Fh~7B3~Ex~~E?GD^ni@vUFAeIr5d(V zASdmLi4R{j^VzX6XG3j$)O4~91?&KJfQ?=mDp9L}!U`S%qIQK6)mxw?1_te+5BQD9 zb9jVl3;-CB@)MJcp;s>(XF#3Mt{I#G&#>OSBfd}mlCE=q^S%X9iT~`HgTTD<=JSr_ z)E^eZ>b*+v@=s*VyJvHsuPW5VPxUIgmqI>zSKEo7zWvd)TK4v~k@oeOF4BJmTO4Piogb0sMHpXVdm6|t`eb_tlNqIZ2Yla$oAw^i z#sRdi*S6KtrdVUCFQ#zcH{Vh=^+Qt3bufIVtJSbU|2KmSHI>~0BU5{-939tCK}3JKtuOM%$J_p%liLxS%=8G%%P@_EQEJ( z9`!3p8)Q%8IYPn?`S`teOO^gtnm%^v^uikuJl(_oMVUPEPj~FX7%zYzb7OU3-0iv? zJ0s@f$`I!OMvzc6EWkDtcS5>|+LH1n@NK#IbB9~8oMX&*&3)pZAzg2msdw$!y49B4bd(k_$=v(8Y z)vzIctMt)`p|X(ag-||wBh@q}wHA3BYdR0XD3e%eMTuAPW$pkzU*Imbbf;sPp8ZUP zO=_D>vz{9T6ZEz*GKm2^#TER1HS8+WarmdrzbG5i%J6s?<=BV_nt(C!B3f8yEMpqr z1G17rx{cOVi~FT2>SN#s2iV@)hF9o?{Fea>v~wHQHFUNQYVoltw*zbq#5$C|9vlgO zgKFd@kH$$2P~}ELF9dPoqZkgr`(ug7i#~ELy6SR=)({5_>iQv%BBlfb9t5HNjW#oO zF;N*IZg(FwvfPG3-M-ihkJ1Wt(Hn8u0^oNrGYJAWcMSBgi}QC1+9F9A|n_R(L=*14Fawh!S4m2|5g!bk~qsqg^-A` zAVvqo@J{5L6RNCe_s=^{_uh5+JteKbMNAa*uoCvd z@`g=9Ut*H#4j3=MGAB0%Y8c3uGz~nUwl8J(GUW=V3ieq`h1((?+7hQS`mI;So||St!vL8XlEZW6v)vS$3m4a(85p9G8WQEPtZ^AU``7;L)lVpi}r0f)O-=_$1M_B+|hs05E1YmY2@#7*U5bB$^>(x+?C`KfIc>(2XP%n;Xo+3>8{W zDHn2l`pM47u4 zvtmfU4c_Cr`JH?aS3o4VC`Hu1R9eZm@2?TdWuaw2Ilc{hMnw*Pw_9pd9J@#ki2?37 zNh;$6@pVW3od5)#E9Rjij^Wl(bRw_)D8+tC;V)1>#J@5D*$o3zeHJV;P$CJ=^>Z6` z&-PXfXEqFBV~Gi2!S-avt}(#P>JFOHcPz}YvG*%Z{x1|4LoHa2RC1%T6%M^&B3t4y zBzajuudGoz&5j(4pg+xvv#l7S0-qP!Ygea)Onolxa{Py06@RP;7Ra^dgW4L^wB-O& zXkV2@5e@Eyn2GqswMT^i%mWVMWId#UcJXpW0*2h7siTgM{GDIed;h+7ojUPT!GS!Y7R8)5-0vrK#fNF1KmD|uj1+7o*t&jcoNf^yP>N>Jk z8CEEYMDr_xVt{b{dS|H}Ng+FPi-vNDSSOqb4!vf~iSR9kqb2XAIw+Q#yelD4G;B>^ zsk@9){tK^W35*PvsNlO#z;^bhj5Um-s} zdN~AwQezRcE3hkSFt;faXbyC)rhpV`oX^JC(iNH>7&8|ztHThrWzhPgjjq({>Laqk z{GR-toN6c540J%p6Q&-GgYvKyyRmx@7qSVB52e54f@p6Vx>M8hLx-pyihWDg=J~H; z6B6qg7oNLOMpy&;CtFb(kdS#&%P`g@QPq!2tgfQjuF4I<#s>kZKx&pnsEe3d7la+T z{U=UQPUCMh<{v3ggi= zz(zAro0m^70ct#ei*1QVSUm)8DmZuVSG*WSFC1#~@1Jx8l!gv|s2n;E9m}PH28y9G z)lyFEl~`l4Xi*PnPM2b%1kWQ`p&0P!f*SCyBR)?JcGwOs=<-XYAv8;A_;s#7_69R0 zD+i3`J^4K>(gFa~7**kdN^6XwbAf7{bFsO{IW@;wJ^H~OgEs@7fweG+0cbnLpxO(J z=-yBHIG*M)WMLhs%iS#kjv$&ZIlyVHzH`|L`nGVC~RCDWWoxr#+#kLLb9jGA1te$AEuruJ`;)@s) z;$Qh0x)?xj=H-9!or4!x zmOo`vQysYDOvx;>Kvf@MDv(bgkEs;y6+m!LUoA|`6bdkfj^_bbuvfqXP#B^gb}?;; zBPLYb$67l1hkRtY7Mf}?{N{CAv`B}&{V-7v4qNbWvGPV`aCSV_=UIAQ75pBp)oU*)kU7g?c>=xKukkZEH>;Niq$;45^uYq9aoLmrdSa{^@`@phK}C@%&2}QPUGnmi;CL` zJP=DT0PgI-L(l}X3(G381)RVJ1TpFYfz=F=;sTM-0wKY*oB-@-0H+S{10eydpx6em z30x4_39t!I{l@K3$F(pJR;?1Fu+(1u&nSGAd2J?N(G5g?tiavbQ5y)X+1@Gr?Bor! z&;O1P(fjT83fx;7=iRMceQ7*fq7*DX5T`5v`#cZ=V9&9<%J5DQMUUoWparU45FgJF z3ytawv3m-S?**aE0Da^aECpL|z6sC@2aUb{OveEI@tdH*oKVVYuEgQ(6mO042w}s~ z{u0)V9af9xD^cWXZD`>B_HK@3WPargQ3L}q09(!k^emySYyg}7*Fw+)4h$1tTjDAm2QTm#+6o$c_Es_Ly36L?GVYf=crg#` zBcZDq(alk6=PKds;*8pNck;VGr10Uo#WYP<5%fc#1OkxhR$mATQ1k)-1OT7_LjRE1 z?5+|Lukb3t30}ShVSLyL5bP@P&<0Su2QB^xA^V%)_68sU7^=ZfZUCC!6hU9K0AbI- zKm+#(7Ce}6puv9$e-Sij;9o?A2|EQ76l`E1VH^zz5=JnipoGC(5e!z!0Jnp}NLD21 zjw45x7zxe{$uU?rm_2>|1R7N6P@+YR9!2`I;lQOsDL#dm)aQ}_Qiqb-lEA9eEnB^Q z1shiESh8fBo{hNlUemG!JLasJ(LhIP14}JaXwT)wX$IPH6qqm&#=1T| zU@Ff`KL8Tb;=%fA!3XmvLg!!)|(F}WQCXJ#* z6F3ozI*%YJGE6g0Ip;(VM62GCYc5XQIY_0T+JPyygl>F}PD2l}v;Q`>E*z*T1P+BX zQb`RM?kENkEej_C4G3nDEsyHxOu=TGv{WmBYjdCkDmArLSJPzh(t#2^aU|$4Vu{b5 z%6U;S6w4F_BVlh0^;KidLJ9yW41n`kXP@2h9}wd+GAhZ+MA6qmvCZ-$>%1jYSU;hC zHoORZ0`DLR4@#9>ci;VOO{?T3%2uM1+epWO5YrS`O+|&*SR?6MO4gtl4LD(iIg^)4 z5=T6hvtftz7ubnOqGaJnX?3u;;t*QMT95~7S7Vb;ZVN4mM0D7)#BS_&F>r-7li27` zY7yl*IUW+GbRo9#AA@x!x@e$SRd-&s92_g7nlIL9;+R8qn*ZuwQ#3lxpJn8ZsPYCv zIBTM+dNqkLmL)5SgOC_V?cmB83rVBs9l9-QR`+ASekqlOUVY%MV)opa7I;!T=>;swAw=2RdDG)hjP53c?K-BZ>$N zh+q_{kjA|y$WdpVAPG1Jo}kRPs+%mU!-ct6p=|1wpcwh)uy~Pw418qk4QRJnqlPC) z3r(6$A_7gcaJ#2vH6dvH*9Y2Sldh1mU4w((hhK~I#pu12gE%3Bm5Rm{iV%Ln009zY z2?jVI0u3O91q|UQQPAH(*a4JH*kULV+=NiXP(A}hLH`R<5X0_zVmpFlkRa_KLq#?b z!GTP0ASV1Bpjwv@78WHUUrSm-{)U~9FmE<>fnJBC*PW0Rv04U@Tg!k(5Jo*J03sX; z5qy$`fn>pc1A&05fHJ!d9!)A&Y++HTh=41K;vk~PkX8U7LsA&Pelq;Y?|hRt z+%v!s7BG+lGC&Cp+zJ4{LP9zo1%F4epaD!+5ef8aAo^1Ppd#4D2&Ql#3OHRY4pPX} zJ&0)|+RYJ{I5K+CMpVoTq7ab+0i zhsV`5#&%pJ%Ip$AMS^%RA!ysBSpK+#0VGg?J^vAa0qDqpib!F718JiHx&p<7j1DGS zu;fuX$vdOSFqW00U!^Kl4;3ase*k#rK!N}O`Y~&96ATap)mgE8`80s!&_@s|X2^^_`KD30NW!1cPYYXpUO2QUmM2d8#lZIO$#c3$68--Dd-vSfl!1#r*VLuGvq9B262S#y&4-5bV0D)}8Bua-9Kp7enPPzc#uU9l| zl;B$BzCT{@gZ1tlyi31xoeD?2zkG%u^nVit3nr4WTOlbOzUX0zJV4CeBM`5-eDZBOWIJ~0F3 z&6MKhaMTtBI+8ieGabmX+&qvn54zB5CdlaK+-A|a8Pdg60-PWH=0|riny(}?FUu@C zFrV4ely)XL<2~^-gPYuEjx)8;sD zyHx&KZ5^^wM0GokU_Bo1us=HJ7Z*Cq@y>IIr-roe=Ct5(usTR5ZNbU?2oa0xy?pxQQ{Th2=1=<*DEq><+L z$KSbpN+87)EKlbt(ErodJg2u-GUWPo$6hN^AimE#e{nyX+}{1&x#&eL=b-ypZ6zP| zqqF{ZvWt0k@*cFR@mzF;i#yZOCpxOvndOJ2-Th?|8YziluvE1%{dR{s&Vx>BIh(uu zi!=Z-@G8IHB`Mf~nu>x=P>G5IKm(`+QUEvq;Uxp`hb{WD7vY2ma3o$Lg;v11tfK-x z8Y%+_!6~Q|bIP|Rn1aib0u>Y;YZ5IoQ-Uf8K{~1ejcPv8**8|vpD0KnPH-Cwl7cbd zlTjErvx2w;P=bguz!3Dj3=utkYrKLRH85MVDm=DA1GC3dx}=M~e3P{_legpZKZgsw zeDgaplYr5&xBokHv|-ynSu40)E5Cf>ojA*_N>LkiGefQc9433eKn#kl(T@4+87AtJ zP20D|GdbURLe=_04$_K5QiyhdDoUAxgK&j00F>S{fKsp@39JZrs468Gg{vBm_c@88 zauX?N1yXRlsh9#f(x?luyh4%!C#;kO2*D~iAS#$aUlh23;G!m2g1~#HX7Q>DN(imc zA9v7#1mFZ#NJH9D!2=?N1Db-v13vX5w@Z?~HFTTVF~h`LGkL>1apWaA%(a2DG(;1( znIgHCW5S&?!w7)5lxwCbv@>C|xR=``m~#_KL#Fj>CF*GzY!k$jiIoZ&#EGZ~x%mk% zprNd@zW+uuH>F#%@zb}&8=W=^08u0eoH79YiKS8)gDp^r@Z*H-`@0B0Dmlt3)JXuZ zVk-+`p{}qs&Jwy2REP*Kv$NqSH~{*cKx2ij&;nbSgjo8`ig=|pR5xQQ zGYLQ{R@*g^6Ft4`L#_DEg)>WWOu3W0v&PH1zr;WPd$*lS!t}#4I$XRcTs(aPzA+QC zk0VBrJHupC0+1>ap`jJ#x}L_AP~NzZ;fNqQiYT9(zVQ=7$dflW8V*!Qagr(n zn1Z51%?0IzR;bOyYNnE;9SmtvtWW~|$-t5%1zXsJnhd}xl%C zI$+EwRg;1d1hX`IKvDa&-UKFsyQ(BWMO7&^(IbQMORC(;&vJ`2N^7-VV@FXtQ2%_? zw7v5?#eEucGB zO9GoZR8+IoqVugVW5h_?%VV3Z35>JG+tr1OD6OC)sRUJ7qeg^1kBx(>$cZz^pVn%Flg7J`A-x z$!pbtD?doozJ9zMK->yP?TJn>g>Dd}qj<7K-4VeNSjdEl3S~W_yQI2%%KxwHPqG`o zPJ2A_JimjOxiBNO=sQocOHhnV!YRlgIIB7^6vL$B%MA@p16TmB6uASvH`ysZynI7L z_04I0KEH%BI-S)x15|NDIC$d%b2QZ2iqC(8zRsLaUJKg1619_z z4+AiQ00K2yun$wP(V8(eLa+rJ2mzZh$3-y1$`BTNFcib5%ndThF)#shu*sDim&{xz z3Mm(3792x>eR|x+J>1N_uc`ASrwpA zt0R_T#?WB6HB5(;3hRJKMJ)@B$lEFA5sJjGvs)w>1LHG}4F5nRM7aeRu&@UszLWJr zW2Bg?_+ZST37aSG3HnLgIrd|~1&Y4y4b%b)0$B`U5abIcMEby?&NxI5K8j7qL}~lu zN(PI^WV@meWH{=HNiboekfFg)goNORFGdPDw&YAECyqvt^@@0n4yYX}#DZWe59NYXkb#hdhUk>BHvh+f<845SaxfG75R5i%hiRAw zN*LmSs1XE?Xyg)#B);O3R%zPOAsn8UwxEXcDhfU+FK@mHFV+)%u87n4mX%Hl08Ww! zZD^k+YJxME35Lib(+w^@ErsBOt0Cy00OHYfe?hc_Uqyz3VNyF$)@KjUg$^d48gt(T<+yurVcMwU;`LsPKjuN zUE`#-mLprtgT(BWPJ-u&KcFz?2=(lqxMsm9?f;EF2tYY(7g2_n2!@b&j>jg6-G1if z@)630=AY>6UyJQjE+xra8q28b;4YAXQ0|1_glU)rY6z2qh-qIzE2};ew4Uxq=Io;o zW5-=@XLehoz~p2ei?L2Gp8y!0{$`RciPex}k%sJHj&D_NZ*>tIurBZvE~Oyi?|F9elpYElXY)T!f(~{rJ3(n!3G_oZL>!-TNVnvCf;&p5lQnLx z55e@6e)OXl^iIEwzO8Ti_6b85^(hwezfJW+;TeIY@>aLu#o;Td&~#as6MHTq20?XP z$KV9`bRTbRhxK*Zuw#NsR49j-U}S!7Xs?r7r;RV5b{p2bo zo>2IWZ_G~WD>p~#bw?DW7WwPw?v-X`Th{bmNBOjSCvMO8u~>jfj$3WJ_$hAKP{;CV zgP1GGc?rc$d?)#$*Z@UukOYTqsZaKyhY7H{j2{S?nD+{tU-~MOcgOH{ulSi-XK%Dm zGDq&K0mO_yK&awjkl{M{uy;QM2(RIi^ILfOKqiYCsv-6U3a#IazK51IVX|kp`}QJt z$Xtu0K6<2&%(5tT9hxgvR`5$ zv6FRCbXs6FTv3OADCiLgewkie)0|xH>5@_(?!Fvb~{`$wzpu>d{4@Q*eW}-jFi(b7sMc1`6KXS&=73FFl76Eo$^A(xgh4GHvQ~ zVS=7O7wR;s0HH#RQVwpNxC!M(gtkaYK>6>g!LA5JE<~_Nt%0ad4c^j9N#LgxX9Bfz5Nb9Rh|m^VOreDm2ZfbTd`wY>P+}pPcp{1^8W(_0ggq$H zegmB}!AVibn3hWhZ8wr!wM<0YO*9&W+(HqO9J5nH51`OrcWO2i39tdw$HI|oYiszF!Igy*aXc~&PzBaQ~8LB1Yz=B8A&RARK% zT6-;VNzez8n{T#s&zA@-a8wx`9V!rmnK`APvj&)C4}c3@sMv=np*mDMwk6Q2wQg1g zDz*U&Jg`y1-ZG_ncXbFVtLR;|*;zH-n^f6ZwRXEhd zCjva_i~o@l{4&fj&lE34E`!u*M?yAbq(F~iG@8gQHL1XB2ARZB(Id5bPsNI2j(aU-b^<1FUc0D-Z0?$|T$}t{HlFljlxDWt5SJqKfrWM**hyO_dok9Nid^v@6FLiQL zUk7~Hh!I&@IP0xzn)gDHb~}y<&aBBl32oM<=-a%7A`%Ezt9 zijhcTTzpVHDb=;A#VZ%jwL+d^Wsu;mi$DIQwt)-wNxIoieu&#S2y=@p8x-mK?Aw1o zeE++9`zGLkOG>8x3a1vD5v+bjSsnfosKCc)3t{<5oItX2J{4(iYi83F)|z6Qs)TQW z9{k{9+T=ikd}>5&10kkJ_CYk+27xGiAq*E*`sYrqB3uOQD z7Y?78#U_3)f_0=KA~|A6Enoq*a^!F)=0n1Eh!=a~Pcv@+byO3Q#&o z%x$`kfZwvDKyKj>GiEY9nWUwsv{sc-eiD(hi_ta92`2v`#AaZ;(I6`+M@?3-nnt;% zIwg`5Q6a>I+&pOE5bz+%aEX_p1ZRH0xx;;y^Jatu6*Mb~GljUKT=f#6_c&QkIIaV5((O4$ZFQf)^wql ztl44bH<4fLE~7GH(_q|08qjIBqIek1{EQDII+iXY*!6{%t(Ef!^j zRo{}=aNF`ERxw(`b4t{fmjYHhTtPgX9;6l3Gf2JeHd2zrbAr zH_}&43EvH1k=xWKuzP#syL_i^{ z)h$LEHxWG3PGbQebyP7zG6KGh%fYfq0Is|c0xaYX6!}3%K#fvn>O``Q{&kA*Bbarn zQI_mI3V1D+lD|r1TdQqJy9B~wop=+7^?J4|yt(GcsCg!BPXCG78o&_;AkzSR1va`< zbVPkJRhd)qr9>Cf3KmCgA*3i8r6+=`dsIm+Bg!0PNmvWV8UWSX#z>+haq1E-8P_^ zZV`vjK|a>;g7b*BC{aR0Z1Jd@ADr5ad3I3`a)yQU$*buiIF3|45nq$M>W)F{GRgVQ zkwyI^YH_&%3@tpxdN(6oN66!v233K8+I=tK(0fjfr{AabiS9y0m^`4|6XT#^83)Aq{k!T-0@stz@LA%f)y#eoyFj5mBc zjl2npd!lxU9|Tth9}m`zi4m$dzV=Q@y-3$y+;R(K^#~~t>1+}e(xLiY<1vj+Y=n4Y zpCkceZ;7Q10GE7sgxU90lVu=^94hi4)cw_~l&lVMORTh5kH> zW3|}<3WVw5-j0X_R~f+dokR*sgbga2(RkrfY+n$*;eWK>-ay@)C<=ZdM6yZ5S3uxI z>g8+>F^+Y@5 z7@TcHEqu)Kb&EZuq!ro&skwtav}9A3H|YsTdQe*WDks?uDvHvE2DOa%_Xn29;4527vc-BqWPD9PaPEFoFe&@HSk(Wm2 zjDCFSKp^TNjZ=k|X_*EPK@ew_a_J{Nh|RzhaPd|hA*!3;CQr%Ic##x2?FoT` zr%(9N?!oB)*yb!9rlSJe6?zw>J?Njh6M?c5D}l-zZ5O*4$3N5scU_W}_!FQ?Q9>9a znATQ;CTmkf3g4g>TD~e=veBnXXn5MGdZL7X3TS$aY5a7AYg%hL(JDpJs))WQgSuyG zZfhH6r=_B+K_~#QIR6&{z+SzY;Jq?ZzQ)DACP2UbtGxy+z6z|q5-h(OtiK{Gzz!_K z7Hq>F?87E(#4fDERxHF?ti)n0#a=AOW^Bi9tjC5d$d0VSmh3?QW_LkGi&CnKVykzG ztB9_wQOIagpwch$XcVa_vr6mzv{8;asVM<%tqLvCikHz+hHO6RgP3r`Dz|nQ$k(Lg(0GYkz4^Zn_Ms z66ek45`?O)-rnt1g66j-;1tc63v#4wu&v!L>s11%Nj+pJf38;T^f?*C4NwyhRbZVB0hUFnB`>1^eKjg+!Xhb9ZBChm6{2Iea1Weq1*RZ&5l zk5_UnYu;1sNRUrKk_!eP{RgmX@8=@{jf=<80AT_tp^&FG)d>aiYetqz-q z`kY%eud(rJxqZofENHZXjPJ%9J~8kDH!uW0umn3W1xIiNPp}1NFa~e%1$VFpdoTxo zun31Rrfe59oe#)8)!K~;>}IPvMh5QY?BIf~o8~Q5{HV-+ZBI=t`T!9?0ZgX$@Xl&3 z1pzQ|DF2m9)$QRjD9bt!+P-bO@+}lkXcUX9uJ#fYt11zLQ2Va$Vs-K2bTN)*%Dd|6 z64Ng4p0RKkkS4O{6-z~YTvHVVYcW!-j@of*!fqb#+8)=j9^)|}|FIzRaUc_NVmT

    NHO8v`_amP~Wsr^Yl>vbWsO2Q75%gD>YCzF^UidL=&$GHR+9%Xs;SI zr?QcAVs9V$B1_TLvS!q*^6B&U?&x8j{m4) zqcdY0XJwo8WlMHrBNAd?^JohwuvA58Gw+V- zNmFS}|K|f?c?E;@BBOX`(vev=vU>-x9zheeQt~v*6OXrPvYu!#W%qPjcXuy(qHi~j zBRZsWccXvzbW>~XhBwpl5l_J%R6X8*QSJJiYjHv_VR)jU9#(SKHWs>Q1qp9C(NkJE z^PPrDhd(z?)sjOag{L2qZy&du%aEIkH>pUjJNwrzzquMSE1PSunLDsU0IREt=5aH5 z1*h}Y!6^XevPd&inxFbcSE^IzI&N!}oeXdsFd1$6V8H1SEFDc(zVp&f=+-3Wjl7Q!o=zEYWR@MHyH5Cvxp&;e z?OBhio6p&DL zhgWx)DcaL`azfRkbV&)9*DZhwgz0UsE!kRvO*xpIeLhlp<$RvKrI~qZs+Hx4u*Ux? z>#VdMMdv|wmgncLd-@6HL^Pr5sd5t8nP8s`;%L>0U%}LwgDQ?><_bY=7-8Z9~ zc~!L3WYNZoWJ8X5OYBQF1=_8auklFkRQ=^Qd|ky`9xI zXN~pNS9h(o*Ia)scGzbYrp6DJ>8~R zDw*S4kVPM5h1oh@@rO^t9dlZS`rN7aA$Ij%VKT=kIOes+FaP}X*S{g*r5;9UdpR4e zGtuUg9Qo|$Gqwe=WOy@~xH43t3>lDsbCF&HAE=hfNe_Y;%%BE0$iWWk=}Nz9k>zkg z!C0Y8TOA^q+x~{V3JxYc<(t(7As4WnZD@oZ%%Ki<$ip7WrG%FYVh#TlSVIa<##JCp zqFiR^H|x32Z14f%5~oDODoRm+w8EhkPsYU|R`H7}1Q{5+D8?|F&x~XAA{y67#xu4t zjb(fz8`UUB1o{v}N4ujQWz{blF3^j645T0jNytJ@=Zc0*q#_r|rXI3weSBl2BqvEp zSoKFnubN>cH_1sM0y2FxG#tl{7{N}O@|37#6AJYML`0_Ym8g7VBdroc6p@gM4SL>{gTb={Xh{$tVb$ZKEcq0ELX2CO`>HG;l^@*-x z5mcZC4d|NyTF-yd6G01os6W-oP>7PnpmRdYfaKY$j;@ZKuQHI8h-WI*XtJ9qy<_{7 z!#@s&CVwf7DJ)5vo0|G)am2zYOv4!&oIWmy;ghLQH|RErr&zMR(e zY{|=OyDWmJeERh;lsTSW`AXPz4HPGI73@F3d7{G>4OpsDEJa}jS3D}mD9N+ySvNaK zwD^-*qGV}J`GTo=wv3(Yge=H#=quD3W|p=LEo?tX+ZF%H)@--6VQw!fxSI4;E-lq5 zPk~7{szl9ToJ}qdv!tDxS&c)y676Z765W%2^t#H;ZX}`NPjg+jy8dY%D76wk>yp&~ z-xx?U3}A_YoI<m;v7w_l{rTvR91v zWDyiTiZ;>X@J%bMM9Exb#>V}zkb_KQEDhPnMQ+xSm7L@i{)xGh6R!Tmqaq-+HAyzq z&^_K8Vqpjb#9vm(GL#{ZMWEOK%;2(%V`&oneG&gceXMav8W%vC+G}YvwWf0z(pp`z zPS4S#rl6Ba=s*{Gnui87q75y~%rbhKj^@ZnjbdY|wB&*6lGQsdArNJZdCX-th^Lid z=4Fsr)CO2aHP+lsM;DF4N8(>g5j#11V#kOH)okGQqm#KpMr2PKS+8I7YX!>d(!-YX zqVlq9M`?=Ks@b069+PZ5MVr~eHi)mU9c*N48`{eb_7I(yA0SEF*ap!cYku?#PVIMoIigg{=w>X}YfWp5f!bwuUX*WOh+70KSXi}&z* zL9({=-EC~~t6Pp|+~XVXF@5!iEz`QTM^^uub)SIU&WitO!wb0tF$`krfsmQRWKQv? z4e()4>wC=m_IJTI`6?DYsFp6wR!kz4O7jkVk1!XSgp75)wV>raMRmwI0RClq^Ss11 zzjukpJPZ-nTp(Un#4twuWiUTokwy2Q)89__x_4;qbK$hTg(2d#4@3|)*Ey;8jbcy# z`_qMAh9DGg_fAsqgyXxR#f)TQI^zd@o67v1Zc&iv6?ogZIX8mPUD^bS%v(^BXX$S& zpa98hVkcU?$r|O()cC^hF>8OjhTPFf z81W7t>Q6)%HTOE$`QGV#ml^xm=Q;n*4FGtd%e&KVZ~Pu{XhgPY+_eh%f&r>9|AAOR zAy*KH1+H)fD_mj!7GMAtUSsvS2Spf{hHm(V3jqMG5P9m8Uk74dr@&%nm})mS5MD-VY{z%t zmxUm<2wvu8fCq3Oc7|K132#0g16-m=Eh|wZ2=ZJHL-=Gg%W*Dzu{p=|jp#^s zG_zA)5pfVR9flZi0s(j_rgNz#h+w7+gV$w+=W}P~ijUZgig$&E=ZNl*j`h<(B1dF7 zhL8^VkSReFbcP|tP-3H&c+hxnC$@GurwsT;h$m)ho>-5b7LxwPktr69i>Hhb=|feg zFwN&hFw~MXsa!acCp`Z%YdB#I0+C{XCkP(7cb*26ey0fkm~Y${X3DU5o24X-tkU(c<&d8BqM-Ul#k0nWO zCfSkV=WpOA2($Q=AcASEBQjS9D%{c0nZw;@Tumx`%Fq%>ccvxZ3NlxnGrCnj*t z2$X2Yiu+*?{pN`zMwiyec%H~}*yxdChK7r2LSJEY(?%x@=Mgv=5?mk?UN8|7U=Xt@ z6A6%-ya_7^0COM$jcqB78wrT62zD!(eoSc(o3DjQ zWi?waXAlfv5b^)k5Oy#SZg890nV#{Jn5P9gRB>Qwv53NHWIgo*42XK_rPIXAqvC5WlD)Yp|OPnxS%$0OnOR>y{M6 zP@tt*oR!&>DRzk^rkRB(cAUwSB_@gqL3U^MZ_$`)fX9m12b_vILlbp2#n@jEwiaG+ zf9$CcZ{P-RU;uZJ6bPW9PMQ`8z?^9TBTI!7r$D03sCEJgc!lSE4 z3Q>Nv0j*m4Z_Js9&T0@|7K+XJqG{@^ol34r5oaTpFp=~z8pAqLD6kA0D;Ror(_;|5 zdZS;qsC_760uiT_+G%8V4;DL*W9AsjDyCT~oSg}jthkg73vzV$W+1Y#D;u*AyFun4 z2*UqxVmDi(%^I+R5UK_tsT!H3A@&cK+LVK!rvHhTC`OcTnWpcGg)*C}4>MjFqJU9* zwH%b4B?fq|_?g1scm1ZOP3do!`iDGcwgB2`Haifd5DYd-na$X)f4HU@xd;&YkdpY4 z90Idg+qY^Vr5hxsWootx0j+C?nU3Lz&1$a!C!7nhrfq7njvH_$wvmE+wRgK+EHn^@ z>9?LM6G`9?97C`!yCImV5N_F=K6#33YjZhkkv-9jWOlT``j(Zsk;w>Rh#0h}Ij*gg zxh<;@;`+J7+YkW|Eh>R@w=@x+Ae=r+W@~zH%MhnF+o^@u5I3uMAjX_3D~6h~tXcoK zlxR4)Uz>$~t0Y=`Uv^{=d|SNkD-gdqvx9N7r$}OsdxZ;{tYT=hfHw^WU<9i+0Tz zuNgU}fhf2pCb+NLu-1i0I*bz*Y{Q@XupCmDKI#(uYhoVkhk_st3-N^uN(wwHblm%v zAodSyi-=!X3Tfwue;1chOtt5;eDEhZ<`}M6?7rqYT~d}{Ytg#mi>YBJ2>Ji}lh}KR z1?K>9%AOr$n z5EVKQLSO()U;sg|5bbcAoQx6}x|`u_5cOaX-Z~IcP^1O`t^%P20)e6K{La&X07{?* zuKddL176s*Q`*`P^t!c}+?+tWwl-^GwjdD8T&6w2vlH=|oko5v3D96leqV~u+T>(V zQOY>M1cYD!L~zXp(9s5Q%|yTm2A}}fOb81A04`w*rNGJtFbbq#5S#xn5Svg61`q`X zzzG9k3#1?cNx%vUF$%4)o2{@3TaW+=AgN!1WknB0t0s+%oaMTu^ z&)g+p@ew|VIMx~&uxQx5i5RES+MHxowk1}}q6T=uAPC>wsdf#~1>OS!MEx>5kmj41Vbp}pEsP0Xil5X4*xI!y}Vx(P>a z5c)mS0)f+|tq^381Pk5@q>upmZ2&Vp1zGLjv(numlsPY#6dSCKy+=~iCr-1*BaT+}l0kF*n9t1={+Zn>; z1^@&L!P%Fc1d^`W^)27;tj_F-p|ow(QlQ0Bz|s+r1PajU@GH+^ZeiOsAQHR~cFn*2 z%GU;f=LRqhdX4L0C#8HYvA=8p+`!wx(5c66>w682yj|T1Id{+OLk(U(=ltq{H0yF< z;q#~r$*!i;AilWn>sYA5UKR)%Yre$24Zs}4Wo-a%d))S$h`r3Pxum{Mk#)dp?N^xq z5FSNX1VnZn?+9(-lYEfKK8M_3v&8*{5PS>E-m84A43A^(#SF*Qo9j2L?_m*>Qrmc} z&gdG?Lysp$ucE@l-RwY_5Ut?03v9~Dw zJ1N#}?}S0YvJ6W+J|YKh0IYD&P#*GLEkAP&=x8_HxvmTw5e%j<@KbL9Z41#OKG$T1 zDZG7!&6v=f!17{@?7f=VP(NJs1JVK!002;-+w2el@QW<%;|?L^0e}GatOOC@5+5I_ z)9&hsFX`%B--ln#MG62I`rZoB3Wxvp4gt8ewyF<;s;^PY3cuk>yw~X$3|BY_EbnjH zPUix#pycr8!f?=gDZ&AJ?91-%Sa|GMJdswWUzoTjgE{xpu>?fmtwWH_jb7Mf z;||dZ0I&&KF6B~P=>h@fC}I5uvDBRn{9gag{R1J?ke%RcYXB^54^OVzUe3x|;PwW9 z<@vqi0x=5ciPNb)yamqmCoSfvjB+!c69Dngz(9cm4IV_8(10)lf*3XoCMcpXiIWTp zN*HnAGKmijwlhF&U@%Stg#}V(Z(yL43?(+CXduu+1IiTM#F)zaCKtZj?2{+x1B2@Ki)~#K?hK(}-(xwUjpCY`?dL~Pj2U$`KW{?|8cLul#Kd31A zK!*+oPU~&J9n0p-Wg3_$ab|4p-MxPYn)~NHq6YtF-93@jIlQKZn{w+=T;IXqF@-BD5vP|dC7o#f*YtDmV$xI zAX^an5lH8H`;A5`uf$TQ@>tt4$JM$(D8rkWC}aSx?ptDjLKNbP3AKQ7WgrAvnZf`m z401~XR!%(epwPAe0J0A`(W1$A1k=p_0LxG#v8@FSP|2g0l1KmuoPFrr4s~fuztY!#i_gD_MshhFBqg%=5LNWh*w)S%Zx7 z@*s+Oe90kUCkn;r#b%FMtVO9Km-mWMJ{$R zbk*w)6@$e=tFdfVVBAS5Y+?|N+(dz1BwcyLm=hho=6(oJLbu?!M?Nxbi{F`}PHe`* zK?Y(Oa{&tZv}3h|6wo7m6kQ+>0z%i+aUeufjOie`Nlv0lRbhmYMj|&#$@QjjHz@@- zVwVvz9>ivyWS%8UXr+tcF$(E|WiEADqn-#vXsY9wl}LG#;3P01g;d`#(Z|D-?Q)Zn zbY?WAStVt5c&rSN}PilXBJ zI!LQ=v!BG=Xg?#0wA{$jmlv(yPtvI~T#nSGY^!EISMv`!&hj;{WR56#BT$|Obf?;3 z*-IS;&6VopHkQ;Tj6Tzyg+c6(Tui`HWwgZzEbT?AA!175r?Jn;sEr6QAhCjD&fd7L zA>0!x(u(R7nZENEsQVxoHR+QeFd+yn9S9PFf&e|bhC^>T8ZNg80Mj90u0TP+Q@J3g z_qgY&LRkX;R`k^byuQ#ihjkB6Fq_$*RP`XEh(Kym!xJqavO}CTfMId+RMVMG2~Abh zY4ue)I!;9?J$Yw$G8)#L%IYAld*ngTnpWjiv?n24q2}<~lOp6~6OToR6tZxW(Z+@y zcpAll5D=ORv0|xz)rls?V1U$&K@)V*!cqy;Fat!$vWr4;2zY;_mOn1NlV@Q^?R14+L&m3<7j{LWut2L<BLaoEgPT|@QIT_rcfw_gjr5I5rTg7qmTgr z=syZbQ$jjC5Cf+cC!~n7LfoP$Pmw_iq%xRJMjPT$h~X#2IgkY2YXDbBVX*^&j}l6B z5LaBPQSb=>mFpp9_%v2BL}Vw_4wx}fCp9N#?Tz+Y{Njb|?VpUSG0&E@(zT*-twV!! z0z#}14mUSUIk{65Mym;{Xkv@T9>{0|@MHrhhQbJ`lT;5P1_f7lVY@cK7@B%Cok(C5 z2++cv#E=9DJbNI1*Frk^n3uu+ijzpiV5O>klib0Gz{qx)X} zzAP010!OU@vaqn}-U$g-5e2plQs;V1UO?APEt#v5yp5@EayEuYX{>t#F3t^N&R9nhXbQ>gPrTqBgdcQ?vuNaViRPjE@Xnx zicSGw@QLq~0s=*sfp9@Y1F^*>@Jb37j*h-Y&B^*y|xBE2#|tj+iQ@j{!!uvz-8D8q#)BZW-_A6jJ?8-5G|N4 z>^q5Jg#s*Kvjiwc1j06fiVo@G>&x5*fWS_+&{$nR%1-dXtN8=JgK>;zi>;%Pg5zs8 zdU_4bpqqn;-nxk0lcMVJADk!%G@_}Z$v;$)m)3}Yqe%kkJC$rvh#=@MA;`DI z03HQ&xt+nRlfovgGNK-Xk%lRy1meLRETx#Rz@?G7_qhexOAk^5I;|=Q%gPXIK?nrM zkc0sMC>)3ku?isIFazkTDC{r}%fi&+FusC90zrT;Y&L5d7la6a$2tuE#mK_Lm_mb) z8(fORDU2ZiXelSeki*!b$4Y=G#J(zQwhj}MYLUYN|zRVLIBW1Uc-r&TEmGdLogi03e$@}TtmDXtUpS`K=cWR5+PtZ9UG*PZs3MV z_?YGx28*bmAf%xU{5^_-8Wd`Z4aBDVu@eJO0=84e*CMaig2p?M0wsuo5fLo~s75J} zg49TYJ8?!0k%Dg25M`{!ZY05J{67hxMrs_0*Q&-S2)1>ENAjA+(HaqUi} zfP6-7Brk&OM~6hnf4oO;+(s$rKZ;C|V95f0#gs=jHILL6U#sq-J1fWK2BrmZ% zh^qQYY*YfYjDQhQfN+$6Zj1u7Y?NwT%eRyQv;<0<3=IVv5p}f3xAY7AQWUo&w{Bd^ zcNELD9L%6BOMMha&r*PH)U^^E%Yj%+Xf(@ZEKIk2t;1}~!pugm6wA1r$$j(-Z>*|} zR06BGlc2oIJn2l6i2`-xw!6F&zZA>7lmM1A2+>-{wZu#RUBgCfvuehf>*d`HvV%-@tr(Fi}eY^|R(PhA5$v1~MP6wtwB$IRHz zur$Z+oPxEqNwh@FDOdt3u)E2ig5ku^WOGgfHOl``M+3MxDOiGw^9w3)vwB=d5v@mE z<4M1OFwua{a9m5zVge}`g$;?eAOm*cjC)~)7a;|=2*)irkUM!Vd*Fg_G%Z`$w1H>` zJoB=FAOrZgizGlKO(8b}5E0T8xIja?*%GkSpn{Ck(uHwO1E7K`Sb{rYf+h&k5d_R6 zpi2)6KUN@xa|}ykxl4Q?8H#RYp#ZO2RclqI;k*A28NSOERtO4D?U$>_g4 zojI3nM<$+P7eZ5*L4d8R#-aElB`y^t9#nSP^Q4lR(Y`oHNomIsY z%;zNA>>Or01`mUsV_kwdEy)SE5l`?<;^XDsY&2$Web9Ptj9*TI)!a4nRK^78&R7QK zB)AYJ%?zv9QAZXtJ4wv{{Cr0IV$Oa9QU`jY`K-e&aPAG>?Fo5*@342%sMOcP+#-EO% zBpllbxXJ2$Jlo7-;v=Qex>m?-#NNDqN6ez>ptRR;#8B|X*8H@~BtBb7j^=(1HXQC& z=nTrqSb}&>Hr5n20c}mc+)XOZ>HmC2CVk?c%+d%=Uj_|fgBZ~*$Yt;>O|F*5ktEEu z%|<8-V!MRiqk%vFeof=+4dK+NDsb-TozBbMK2H2L#bcNDCu2%jmK37?(9D$}D z33~%9Lw1DnvyDu$F{bL+lFxBnZXS8kbRA z#4VDG; z^FoIhS1CrHX^o&`1eBqfph5_SD5#)t1s<%4?$BF9FO?jrsNTDYq3ek$Ksik(^(^^n zNn$7x67-Ouj*lrNHxh=B1&T!w23v8BIe(*4rzKicboPWEg-D*3b1q#cb}U(SfVJ+} zP^e=s_PH@wL~qX|?1?h}i)Od>7|C=i;)z+i^<0OP)o6-r_lYKgbZdueTGaNWm?YRh z#+?YkYlru+4w|D%3iTF};A)NG5^vTJsfMt3m%5m1>cE)-3c~G)Ex6HmSNOEvs-UoU zYVdCVplFf=8U}>mgmMQ8V_NvYWve^=+t`4?Pm%SFCwY!f4`#Ph8JPr)7YfPIy{(b+ zs@ZoQteS`?d3XK^BOLgYHvmxQi76NbuhYbmC;D&iF^7s4nWEpyiL_(Y&{?ZqB+vs)UH?`={YX9F50!gHQzO zkN1DCry5*!gP+~xPyX8gBYa{{8(MdvsPv1Fd&(~*-!CK2=Nc&4!JY_wi4gu~2Z&z= z1{(PFk03&U2p2MBDDYsxh4&f~ggDW_zl#ICAWTB>Bgl{>GCDa zm;~)nw20AwMwuYp1q#+PP{VBodP0yrw|7&B}!8#)~s5$x>R^l zV@{A$8FD13ge%&#YS*%D>-H_kBss@cT<8^{#)DzCQtJs7WKUNFkp>d>v0Fp`r@;(N zTj&=q$|H`V)wk$dmI{rN(hZB~*M1SQ}ff(a_PpiAa~bk~4&WyK#t zg%w6oaSSyT$T9?N2wQ+ZEoPn~L;=Mhidg}O(twyX6k&=n$~dEpNt`B^an&V8)o{X!nd&prDB=x@b!dR%s)K0F1?1*Ps8ZB7?B3JM--|CAZ8-896EaAeLUuR?MVtn7wkZ+;q((Gx0%WU`2!koW)PyAPBGb@IZlZ)n%I!dO zZA($F2unP1cL`A1aJOfcnW{e#Q~a@7wt_q|$(|7!)~h9}tX<0g0Vbr9!Yj)>bBZz3 zeDhWiJ(sf0;kAr2&_SalS6V#_eKcIN2KY15O*pgK27sqt>-hrD$oyP>dEjZ$d zM*T9nu!?mw-HBrjv#Sji4&Xgrg)2Gdf=1YOnX5Ja?Zy~8wD9ErOr0>6&guMm#<3R! z`|MU%Euo7Wk3Dwhy(3K7!yl!+uB?m#?tASKJ}m^3f;QH}kDNDv?&li*~#8 z+=p~!SP|weJ^2hSZavQsV;?p~Wd7%p9pyLVz4F4ZU%LGN`Ok;|@G2F~(gY@FJ(1AQ zIqjR@^%g>k&-{Q~YCGPqDu<9S=&ynba#%_vRltF4fpMtAU;RADzLZR5gJ}7K%Cwg) zk!;R_E@YVqS)#g_1aO6|TbKKir^A~pkRYY7UkG1l!jV+1H7`7(caZQu9J$PN)f0wGr zfRGz7vLPR+Aw^I~kXw9201Ti&NfuBNXfosm4522j;>gNvmV{FONE7I^xJHK9vX5+` z!gsRRkSGRmD~Jq<2PmR|7px=z$P`HcIG_>&K;~7fIUPxg7sD2Ev!F3yr%AG;HGq>VBlQ=J{-QOR|?uY?Z$a$z=lSIuLzfr4`DBnr|VcqT8y^ zB#>P%hC8yn3d53j|I`UWp%aqNl5imZu$8V!TG5Ius+hSHF{DTif?bNJvmvJ;E)ac4 zkQ(pxv=2s*33Z#{AzMtGAc?T)Bsy3FpTxNgNve|xlGITg`LJeEu&`{)679lRCGN;8 z0+8&V0R?i%W=0ShNO3;RN`b@%=<-N_~X6|=^>6!66up1*11J)m}S|UY0R1qLWBM^0J3B>0BxEfC>G6+)e_=E zFXXN>PRXlb^3YHxkR&b3olHMS)|3hP)4Wx#&6KvrGOy%f9c73;wvbh|ypbXv(X0X7 zp;?Ixs43Q|y+A?@IT7HnB>18}0?A8`dRjWS-Gw8Xcyoi4-CBGC=D z4ZR!dwYtrk(^t+#mgh3^O|felMLnn4DCaao(jD@$LR(AeGPlV}rd^_;D9|vGl$d9} zN+nWJ*GI0B=n@okMNRrMG2Q7nVU7}@GX&&9Hz>PbzP33|h1dzgdC*=}>a{3L=2ti9 z#D%N7(FM_COZN<~qRzRow}seXKYR4TT;Y;aoMBtTO48--xV66>SQfcEwh*tA;aP7i zbjN%2vQD}Q&re}zDm*OzDI62U`P}oNFd`wpKc*yT@`SyReF=dudle$ z>%#dRe&y$_EE?=LEcg)8?|5dPz8*DO*&NrJ?JwEYuF`_}@oT=K*-Op)8Hak%Ohx+W zA0q-x9D8*fMvR{Lg z4ENxgfMv<~{T~ulo0;UuLwKF=uuYQ1;Ok{h@XZ#`cVwZ=g((+}BS z!?>IBecsWz5%!4x&WHWZy7(UozL4IzpX~Kpj`a+6G$DIk5kUml?KM%{p$&DsO7NhJ z0hGdAahpy=(9sDL0Wx34kpUN+ngQHGDR5y1snuJ!Qdpc|6uyw7e2x|VRz+M6yx9;T zYLo#9lqvbqbd(lCT$~3w8bQ#ZfVm&;84(*I;Yg_A)ak@2{GljPlJ*E2+rh}gghfSt z6CB>wDz?pPG~$yz%3icwTc}|Y)LiLZR!#iRBZ6Q<$Qc}A(#aLwDBjc*CL-V6gy<2X z`vjp(iJAa$m?*UYLM+@MCgMWm5{#_KfdGIcZe8!)pItZ}MR1!68c!4RsCNnTQoIh9DbLMsG{9hCtuX#_qd z7(=vzJIEtKz+@|689}tdsks77GLv8kCGH@E5Xxj3*u!(sAra!^@)iUa^K z07VSIB$=g%4QEJPL2qg%`Oq5F#Y#JAU1x@bUm}E}(WObS<3ij*i1}s$V5c_rrCYA$ zN4!EO|EasuKmwxZ?v5$92cPYwiem1j#VkUi+)Kp`1xcQS>_vnLgmg5|Ncg7#U?|2dgoiFfCk3cT6q9D%nLm~UY1TqRq*@fE8gCN+ zL=;>ERvAc1Y-dVfW7GX*NIaB{E(CI^#9drLW~!*~xE{AG)Ub_TgiWPtibSmKo5XdZ z0r2QR#2UVt=RojWRoN9uNS9we)juTXM*voB!AO?!ro=L*OAp_!mfU*8Ck5Nqm-IBE(?@ zfHZntmpUrvBx8MUMNVX?sU6ZwplU-nW*QBnLZLoFj;M3=wgD+ zOH3P~Fy}yoYDq-ZdK#nYAg8Ssls0K0C6WY`GDK4m1lL~#C`;yLM-AWt3hT3q2yO|QK!=ODMi3mz9K|MO`8CoPrPE$OBicP+{3b+tFJZ$ zXGO>@G%Q0XEJbK6OHvg{Bq~>UrO*Zru8!s7!D!hcgxa<#NT??r0+p3{CxMoPC;sF~ zgrkF?Y|QG!Vg|u!ip1a2ZN2ysDWL4x5`0l&bjb=sC4uo^n+p0DMS`oy|T4ww4)Iun)hdx-jc5l!EZ{4sc z=v;4%aTZ`fX%b*yrjwGyk}?DU zC_!Gm0wtXmgUYW8R+~>oK>&Zm|3dCsnJ@VeEn`-MC^aMOvFq#pY(qd?$__*=*h4Gq z#ShiOMEHX%)C2ss9}C+9kxtfZ0Eo>N?d|quJ-CA<=41|ES(~!|@PI^B5w}Mcl>)cg z?nu}JVA+FoRbTIN@HS!VL$adD6=87>sQO}YWEh|rcTTE#-dK=u87Bzau5s6Ju0U<@ zhiciG?Vp!Gp&NS*n0ioSt>F&?YbDk@dPYG4jpq_P9S zA=s^sW!dsQo{1f|^0;uW{RjvzHz(IP-Y?5hGAA>|ve!gDXFy8ELjbeycyKXF@+Znp z)I~BP8{N)$Gw9|areT&geeT-Lu~iP<)NoN|m@_&np<1>7F*OT~7Gufk=-TlF-eaOM zL~@Zieh>1gRnL6b8{Vfn_RKwN(SX>ZSa36Q%wt2~@jM@mFy9a`3vP3c0 zL{RJ0-%Kp!jf6zcG|;S^OQ_2|loI!-4CI-vH zoE}-z#YN{QT64};<6pzzo_wA2SrheNKXa83;6J?oq8ArnXY*p=aB)=jVn*Ai@&r$$ z%92%o@pEk+61reVHa6VcZm&SJqV`@K2VVS9#6_dBw_?Q@-jLh590>l;Wp83#gPz7T za;{w=R=2in3r%~p=WchTSj47@Qm}=z_-%$)G+TUq^i07- z3BiaVN4LzFVjN$!G>v(p(}G*@NnRiFS3wLKh!KisrR!(oCiI7V|KgFASG zGt7fac!Vo>g-^JJL%4=h_=aaVhkv+-hxig9c2x^V29gakdoI=Bb

    }M>F)fg|lVS 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�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

    )9pxnDT~{0I3t>V>9>O5#`lFs`|`5 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�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�iQVAhG9*6Y>IY<96_ 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�R{8*+D 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
    pkEr#+c}?5z9d8Os1^{ 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‹{n!p?R$UE+a>{xW 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 z�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�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 |llGm8Alj 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 diff --git a/assets/header.jpg b/assets/header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7956b54cf2ba03c5be0219220b13e1793d84dc64 GIT binary patch literal 64784 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 J|C{6M_$ShtHqHP5 literal 0 HcmV?d00001 From 81d93c84bd38834348a4f18f2782ebd7abc8a980 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 7 Feb 2024 17:22:39 +0000 Subject: [PATCH 054/509] [Release] Tuist 4.0.0 --- .mise.toml | 2 +- Sources/TuistSupport/Constants.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index d23449464f4..13a2b7ad0f8 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.0.0-beta.4" +tuist = "4.0.0" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 33ed77f18d7..622a03eb0e9 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.0.0-beta.4" + public static let version = "4.0.0" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From 4ac6a8ca174bd838c93608bfdf45cad6b9b22a98 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 8 Feb 2024 09:02:16 +0100 Subject: [PATCH 055/509] Add Posthog --- make/tasks/docs/build.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/make/tasks/docs/build.sh b/make/tasks/docs/build.sh index 6b8c74ea09d..5ab69b4af96 100755 --- a/make/tasks/docs/build.sh +++ b/make/tasks/docs/build.sh @@ -10,5 +10,12 @@ if [ ! -d $ROOT_DIR/.build/documentation ]; then fi swift package --package-path $ROOT_DIR/docs --allow-writing-to-directory .build/documentation generate-documentation --target tuist --disable-indexing --output-path .build/documentation --transform-for-static-hosting + +# Copy favicon cp $ROOT_DIR/assets/favicon.ico .build/documentation/favicon.ico -cp $ROOT_DIR/assets/favicon.svg .build/documentation/favicon.svg \ No newline at end of file +cp $ROOT_DIR/assets/favicon.svg .build/documentation/favicon.svg + +# Add Posthog snippet +INDEX_HTML=$ROOT_DIR/.build/documentation/index.html +POSTHOG_SCRIPT='' +sed -i.bak "s##$POSTHOG_SCRIPT#" $INDEX_HTML From f3f7c897adb3176d21ff8dd2fffbb31c627ad009 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 8 Feb 2024 10:14:07 +0100 Subject: [PATCH 056/509] Add a get started page for Tuist Cloud --- .../Tuist Cloud/Users/binary-caching.md | 44 ++++--------- .../Users/tuist-cloud-get-started.md | 65 +++++++++++++++++++ docs/Sources/tuist/tuist.docc/Tuist.md | 1 + 3 files changed, 77 insertions(+), 33 deletions(-) create mode 100644 docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/tuist-cloud-get-started.md diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/binary-caching.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/binary-caching.md index d3e8ad84baa..49e91b6de18 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/binary-caching.md +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/binary-caching.md @@ -10,54 +10,32 @@ Tuist addresses these challenges effectively with its binary caching feature. Th ### Cache warming -Tuist efficiently utilizes **fingerprints** for each target in the dependency graph to detect changes. Utilizing this data, it builds and assigns unique identifiers to binaries derived from these targets. At the time of graph generation, Tuist then seamlessly substitutes the original targets with their corresponding binary versions. +Tuist efficiently utilizes **hashes** for each target in the dependency graph to detect changes. Utilizing this data, it builds and assigns unique identifiers to binaries derived from these targets. At the time of graph generation, Tuist then seamlessly substitutes the original targets with their corresponding binary versions. This operation, known as *"warming,"* produces binaries for local use or for sharing with teammates and CI environments via Tuist Cloud. The process of warming the cache is straightforward and can be initiated with a simple command: ```bash -tuist cache warm +tuist cache ``` +The command re-uses binaries to speed up the process. + +> Tip: We recommend setting up a CI pipeline exclusively to keep the cache warmed. That way developers in your team will have access to those binaries, thereby reducing their local build times. + ### Using the cache binaries By default, when Tuist commands necessitate project generation, they automatically substitute dependencies with their binary equivalents from the cache, if available. Additionally, if you specify a list of targets to focus on, Tuist will also replace any dependent targets with their cached binaries, provided they are available. For those who prefer a different approach, there is an option to opt out of this behavior entirely by using a specific flag: ```bash +# Generating projects tuist generate # Only dependencies tuist generate Search # Dependencies + Search dependencies tuist generate Search Settings # Dependencies, and Search and Settings dependencies -tuist generate --no-cache # No cache at all -``` - -> Warning: Binary caching is a feature designed for development workflows such as running the app on a simulator or device, or running tests. It is not intended for release builds. When archiving the app, generate a project with the sources by using the `--no-cache` flag. - -### Sharing binaries across environments +tuist generate --no-binary-cache # No cache at all -To facilitate the sharing of binaries across different environments, you'll require a [Tuist Cloud](https://tuist.io/cloud) account and a designated project. You have the option to create this project directly under your personal account, or alternatively, you can establish an organization. Creating an organization allows you to invite your team members to collaborate within a unified framework: - -```bash -tuist cloud auth # Authenticate -tuist cloud organization create my-organization # Create organization -tuist cloud project create my-project -o my-organization # Create a project +# Testing projects +tuist test ``` -After creating the project, modify your `Tuist/Config.swift` file to reference the new project: - -```swift -import ProjectDescription - -let config = Config(cloud: .cloud(projectId: "my-organization/my-project")) -``` - -Developers on your team can access the cache if they are authenticated and added as members of the organization, which you can do using the Tuist CLI. For CI environments, authentication is managed differently; it's done using **project-scoped tokens**. These tokens possess restricted permissions compared to those of the organization, including the ability to warm the cache with binaries. To obtain this token, you can execute the following command: - - -```swift -tuist cloud project token my-project -o my-organization -``` - -You will then need to set the token as an environment variable named `TUIST_CONFIG_CLOUD_TOKEN` to make it accessible. - -> Tip: While utilizing the cache for release builds is feasible, we advise restricting binary usage to debug builds only. This approach ensures absolute certainty that the compiled code corresponds exactly to the version intended for release. - +> Warning: Binary caching is a feature designed for development workflows such as running the app on a simulator or device, or running tests. It is not intended for release builds. When archiving the app, generate a project with the sources by using the `--no-binary-cache` flag. diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/tuist-cloud-get-started.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/tuist-cloud-get-started.md new file mode 100644 index 00000000000..6166cd7844d --- /dev/null +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/tuist-cloud-get-started.md @@ -0,0 +1,65 @@ +# Get started + +Learn how to get started with Tuist Cloud. + +## Pricing + +Tuist Cloud is **free within the same environment.** +You don't need to sign up at all for that. +For example, developers can cache their binaries to speed up their clean builds. + +**When using it across environments,** +for example to speed up CI builds with artifacts from previous builds, +or local builds with artifacts generated in CI, +that's part of the paid offering. +Tuist Cloud is free during the first 30 days with a limit of 10GB which can be extended by reaching out to us. +This period is meant to allow you to evaluate the service and understand how it fits your needs. +After the trial period, you'll have to contact [sales@tuist.io](mailto:sales@tuist.io) to get a quote. + +## Sign up + +Tuist Cloud is CLI-first, meaning that the actions you'd traditionally do on the web, you can do them from the command line. +The first to start using Tuist Cloud is to sign up. +For that, you can run the following command: + +```bash +tuist cloud auth +``` + +## Create an organization + +If you are part of an organization to which you want to invite other members, you can create an organization. +Note that this is not necessary if you are working by yourself because you can create projects under your personal account. + +```bash +tuist cloud organization create my-organization # Create organization +``` + +## Create a project + +The next step is to create a project. You can easily do that with the following command: + +```bash +tuist cloud project create my-project -o my-organization # Create a project +``` + +After creating the project, modify your `Tuist/Config.swift` file to reference the new project: + +```swift +import ProjectDescription + +let config = Config(cloud: .cloud(projectId: "my-organization/my-project")) +``` + +Developers on your team can access the cache if they are authenticated and added as members of the organization, which you can do using the `tuist cloud organization invite` command. For CI environments, authentication is managed differently; it's done using **project-scoped tokens**. These tokens possess restricted permissions compared to those of the organization, including the ability to warm the cache with binaries. To obtain this token, you can execute the following command: + + +```swift +tuist cloud project token my-project -o my-organization +``` + +You will then need to set the token as an environment variable named `TUIST_CONFIG_CLOUD_TOKEN` to make it accessible. + + +> Note: Tuist Cloud relies on Xcode projects being **explicitly defined.** Although we encourage that through the Tuist DSL, implicitness is still possible. If you notice that's causing issues, for example caching not working reliably, send us an email at [help@tuist.io](mailto:help@tuist.io) and we'll help you out. + diff --git a/docs/Sources/tuist/tuist.docc/Tuist.md b/docs/Sources/tuist/tuist.docc/Tuist.md index 8e11b341f1f..5a907a76172 100644 --- a/docs/Sources/tuist/tuist.docc/Tuist.md +++ b/docs/Sources/tuist/tuist.docc/Tuist.md @@ -97,6 +97,7 @@ The choice is yours. By adding .xcodeproj and .xcworkspace files to your .gitign ### For Tuist Cloud Users - +- - - - From 05add358a80a64def148129df8604fa6f19e947a Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 8 Feb 2024 10:47:22 +0100 Subject: [PATCH 057/509] Update email addresses --- CODE_OF_CONDUCT.md | 2 +- SECURITY.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 8357643b34d..bba94f2e3d1 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -55,7 +55,7 @@ further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at pedro@tuist.io. All +reported by contacting the project team at contact@tuist.io. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. diff --git a/SECURITY.md b/SECURITY.md index eca24451e55..a2e3cc6f43d 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -11,7 +11,7 @@ The Tuist repo is scanned frequently for code and dependency vulnerabilities. No If you discover a potential security issue, do let us know as soon as possible. We'll work toward a resolution as quickly as possible, so please provide us with a reasonable amount of time before disclosure to the public or a third-party. -Contact us at [pedro@tuist.io](mailto:pedro@tuist.io) +Contact us at [security@tuist.io](mailto:security@tuist.io) Thank you for helping improve Tuist security! From 0bdddd9b6d0e4a05579940e9ec84cfebf1bf4c5b Mon Sep 17 00:00:00 2001 From: PushedCrayon <37077444+PushedCrayon@users.noreply.github.com> Date: Fri, 9 Feb 2024 02:52:47 -0600 Subject: [PATCH 058/509] Adding check for visionOS in Font resource (#5892) * adding check for visionOS * fixing check --- Sources/TuistGenerator/Templates/FontsTemplate.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/TuistGenerator/Templates/FontsTemplate.swift b/Sources/TuistGenerator/Templates/FontsTemplate.swift index cbf08ed4bde..5e2c2c09dfc 100644 --- a/Sources/TuistGenerator/Templates/FontsTemplate.swift +++ b/Sources/TuistGenerator/Templates/FontsTemplate.swift @@ -10,7 +10,7 @@ extension SynthesizedResourceInterfaceTemplates { {% set fontType %}{{param.name}}FontConvertible{% endset %} #if os(macOS) import AppKit.NSFont - #elseif os(iOS) || os(tvOS) || os(watchOS) + #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) import UIKit.UIFont #endif #if canImport(SwiftUI) @@ -55,7 +55,7 @@ extension SynthesizedResourceInterfaceTemplates { #if os(macOS) {{accessModifier}} typealias Font = NSFont - #elseif os(iOS) || os(tvOS) || os(watchOS) + #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) {{accessModifier}} typealias Font = UIFont #endif @@ -74,7 +74,7 @@ extension SynthesizedResourceInterfaceTemplates { } #if os(macOS) return SwiftUI.Font.custom(font.fontName, size: font.pointSize) - #elseif os(iOS) || os(tvOS) || os(watchOS) + #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) return SwiftUI.Font(font) #endif } @@ -98,7 +98,7 @@ extension SynthesizedResourceInterfaceTemplates { {{accessModifier}} extension {{fontType}}.Font { convenience init?(font: {{fontType}}, size: CGFloat) { - #if os(iOS) || os(tvOS) || os(watchOS) + #if os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) if !UIFont.fontNames(forFamilyName: font.family).contains(font.name) { font.register() } From 02a8bf3d82218343fef96a56f20d3b7dceff5e5b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 9 Feb 2024 09:56:05 +0100 Subject: [PATCH 059/509] add PushedCrayon as a contributor for code (#5904) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index b3fe7152602..bd138b57faf 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1282,6 +1282,15 @@ "contributions": [ "code" ] + }, + { + "login": "PushedCrayon", + "name": "PushedCrayon", + "avatar_url": "https://avatars.githubusercontent.com/u/37077444?v=4", + "profile": "https://github.com/PushedCrayon", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 12056bcb592..3c2a194f178 100644 --- a/README.md +++ b/README.md @@ -461,6 +461,7 @@ Thanks goes to these wonderful people:
    Antti Laitala
    +
    PushedCrayon
    From 52acdb820593f2b29da67f3686669bd82e3e9f83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:21:24 +0100 Subject: [PATCH 060/509] Eliminate debug logs from file handler and add logs in mappers (#5905) --- .../ProjectMappers/SkipUITestsProjectMapper.swift | 2 ++ .../SourceRootPathProjectMapper.swift | 2 ++ ...ternalProjectsPlatformNarrowerGraphMapper.swift | 2 ++ .../PruneOrphanExternalTargetsGraphMapper.swift | 2 ++ .../AutogeneratedSchemesProjectMapper.swift | 2 ++ ...togeneratedWorkspaceSchemeWorkspaceMapper.swift | 1 + .../DeleteDerivedDirectoryProjectMapper.swift | 3 ++- .../Mappers/ExplicitDependencyGraphMapper.swift | 1 + .../GenerateEntitlementsProjectMapper.swift | 2 ++ .../Mappers/GenerateInfoPlistProjectMapper.swift | 2 ++ .../Mappers/IDETemplateMacrosMapper.swift | 6 ++++-- .../LastUpgradeVersionWorkspaceMapper.swift | 1 + .../TuistGenerator/Mappers/ModuleMapMapper.swift | 5 +++++ .../Mappers/ResourcesProjectMapper.swift | 2 ++ ...SynthesizedResourceInterfaceProjectMapper.swift | 1 + ...rgetActionDisableShowEnvVarsProjectMapper.swift | 5 +++++ .../Graph/UpdateWorkspaceProjectsGraphMapper.swift | 2 ++ .../TreeShakePrunedTargetsGraphMapper.swift | 1 + .../Workspace/TuistWorkspaceIdentifierMapper.swift | 2 ++ .../TuistWorkspaceRenderMarkdownMapper.swift | 3 +++ .../ProjectEditor/ProjectEditorMapper.swift | 1 + Sources/TuistSupport/Utils/FileHandler.swift | 14 -------------- 22 files changed, 45 insertions(+), 17 deletions(-) diff --git a/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift b/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift index 7250e6c56cb..9847efb46bf 100644 --- a/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift +++ b/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift @@ -7,6 +7,8 @@ public final class SkipUITestsProjectMapper: ProjectMapping { public init() {} public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { + logger.debug("Transforming project \(project.name): Pruning UI tests targets") + var project = project project.targets = project.targets.map { target in var copy = target diff --git a/Sources/TuistAutomation/ProjectMappers/SourceRootPathProjectMapper.swift b/Sources/TuistAutomation/ProjectMappers/SourceRootPathProjectMapper.swift index e4a0ebec173..0f586f5309e 100644 --- a/Sources/TuistAutomation/ProjectMappers/SourceRootPathProjectMapper.swift +++ b/Sources/TuistAutomation/ProjectMappers/SourceRootPathProjectMapper.swift @@ -12,6 +12,8 @@ public final class SourceRootPathProjectMapper: ProjectMapping { public init() {} public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { + logger.debug("Transforming project \(project.name): Setting $SRCROOT to \(project.name)") + var project = project var base = project.settings.base // Keep the value if defined by user diff --git a/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift b/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift index f4388b9057c..dace8c59836 100644 --- a/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift +++ b/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift @@ -13,6 +13,8 @@ public struct ExternalProjectsPlatformNarrowerGraphMapper: GraphMapping { // swi public init() {} public func map(graph: Graph) async throws -> (Graph, [TuistCore.SideEffectDescriptor]) { + logger.debug("Transforming graph \(graph.name): Aligning external target platforms with locals'") + // If the project has no external dependencies we skip this. if graph.projects.values.first(where: { $0.isExternal }) == nil { return (graph, []) diff --git a/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift b/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift index 923c50a166b..4b66339deae 100644 --- a/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift +++ b/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift @@ -11,6 +11,8 @@ public struct PruneOrphanExternalTargetsGraphMapper: GraphMapping { public init() {} public func map(graph: TuistGraph.Graph) async throws -> (TuistGraph.Graph, [TuistCore.SideEffectDescriptor]) { + logger.debug("Transforming graph \(graph.name): Tree-shaking orphan external targets (e.g. test targets)") + let graphTraverser = GraphTraverser(graph: graph) let orphanExternalTargets = graphTraverser.allOrphanExternalTargets() diff --git a/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift b/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift index 07a1231449b..e7f717e1787 100644 --- a/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift @@ -14,6 +14,8 @@ public final class AutogeneratedSchemesProjectMapper: ProjectMapping { // swiftl // swiftlint:disable:next function_body_length public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { + logger.debug("Transforming project \(project.name): Auto-generating project schemes") + let userDefinedSchemes = project.schemes let userDefinedSchemeNames = Set(project.schemes.map(\.name)) diff --git a/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift b/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift index eacfe41b415..6b07bb15546 100644 --- a/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift +++ b/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift @@ -18,6 +18,7 @@ public final class AutogeneratedWorkspaceSchemeWorkspaceMapper: WorkspaceMapping else { return (workspace, []) } + logger.debug("Transforming workspace \(workspace.workspace.name): Auto-generating workspace scheme") let platforms = Set( workspace.projects diff --git a/Sources/TuistGenerator/Mappers/DeleteDerivedDirectoryProjectMapper.swift b/Sources/TuistGenerator/Mappers/DeleteDerivedDirectoryProjectMapper.swift index ea8cbfd8d6e..ee953ee44be 100644 --- a/Sources/TuistGenerator/Mappers/DeleteDerivedDirectoryProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/DeleteDerivedDirectoryProjectMapper.swift @@ -14,7 +14,8 @@ public final class DeleteDerivedDirectoryProjectMapper: ProjectMapping { // MARK: - ProjectMapping public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { - logger.debug("Determining the /Derived directories that should be deleted within \(project.path)") + logger.debug("Transforming project \(project.name): Deleting /Derived directory") + let derivedDirectoryPath = project.path.appending(component: derivedDirectoryName) let directoryDescriptor = DirectoryDescriptor(path: derivedDirectoryPath, state: .absent) diff --git a/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift b/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift index 0b5d1d4eaf4..09059da6ec3 100644 --- a/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift +++ b/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift @@ -15,6 +15,7 @@ public struct ExplicitDependencyGraphMapper: GraphMapping { [] ) } + logger.debug("Transforming graph \(graph.name): Enforcing explicit dependencies") let graphTraverser = GraphTraverser(graph: graph) diff --git a/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift b/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift index c925a3436f6..f0397f84add 100644 --- a/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift @@ -21,6 +21,8 @@ public final class GenerateEntitlementsProjectMapper: ProjectMapping { // MARK: - ProjectMapping public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { + logger.debug("Transforming project \(project.name): Synthesizing entitlement files'") + let results = try project.targets .reduce(into: (targets: [Target](), sideEffects: [SideEffectDescriptor]())) { results, target in let (updatedTarget, sideEffects) = try map(target: target, project: project) diff --git a/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift b/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift index 1aaaa5b826a..27b16cecb50 100644 --- a/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift @@ -35,6 +35,8 @@ public final class GenerateInfoPlistProjectMapper: ProjectMapping { // MARK: - ProjectMapping public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { + logger.debug("Transforming project \(project.name): Synthesizing Info.plist") + let results = try project.targets .reduce(into: (targets: [Target](), sideEffects: [SideEffectDescriptor]())) { results, target in let (updatedTarget, sideEffects) = try map(target: target, project: project) diff --git a/Sources/TuistGenerator/Mappers/IDETemplateMacrosMapper.swift b/Sources/TuistGenerator/Mappers/IDETemplateMacrosMapper.swift index 322b39ae5db..255a58de64d 100644 --- a/Sources/TuistGenerator/Mappers/IDETemplateMacrosMapper.swift +++ b/Sources/TuistGenerator/Mappers/IDETemplateMacrosMapper.swift @@ -7,11 +7,13 @@ public final class IDETemplateMacrosMapper: ProjectMapping, WorkspaceMapping { public init() {} public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { - (project, try sideEffects(for: project.ideTemplateMacros, to: project.xcodeProjPath)) + logger.debug("Transforming project \(project.name): Generating xcshareddata/IDETemplateMacros.plist") + return (project, try sideEffects(for: project.ideTemplateMacros, to: project.xcodeProjPath)) } public func map(workspace: WorkspaceWithProjects) throws -> (WorkspaceWithProjects, [SideEffectDescriptor]) { - (workspace, try sideEffects(for: workspace.workspace.ideTemplateMacros, to: workspace.workspace.xcWorkspacePath)) + logger.debug("Transforming workspace \(workspace.workspace.name): Generating xcshareddata/IDETemplateMacros.plist") + return (workspace, try sideEffects(for: workspace.workspace.ideTemplateMacros, to: workspace.workspace.xcWorkspacePath)) } private func sideEffects( diff --git a/Sources/TuistGenerator/Mappers/LastUpgradeVersionWorkspaceMapper.swift b/Sources/TuistGenerator/Mappers/LastUpgradeVersionWorkspaceMapper.swift index 481bd1d9f06..429cbfb2c0f 100644 --- a/Sources/TuistGenerator/Mappers/LastUpgradeVersionWorkspaceMapper.swift +++ b/Sources/TuistGenerator/Mappers/LastUpgradeVersionWorkspaceMapper.swift @@ -11,6 +11,7 @@ public final class LastUpgradeVersionWorkspaceMapper: WorkspaceMapping { guard let lastXcodeUpgradeCheck = workspace.workspace.generationOptions.lastXcodeUpgradeCheck else { return (workspace, []) } + logger.debug("Transforming workspace \(workspace.workspace.name): Updating projects' last upgrade check") var projects = workspace.projects projects.indices.forEach { projects[$0].lastUpgradeCheck = projects[$0].lastUpgradeCheck ?? lastXcodeUpgradeCheck } diff --git a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift index bec658bbc95..fdeca16721c 100644 --- a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift +++ b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift @@ -60,6 +60,11 @@ public final class ModuleMapMapper: WorkspaceMapping { // swiftlint:disable function_body_length public func map(workspace: WorkspaceWithProjects) throws -> (WorkspaceWithProjects, [SideEffectDescriptor]) { + logger + .debug( + "Transforming workspace \(workspace.workspace.name): Mapping MODULE_MAP build setting to -fmodule-map-file compiler flag" + ) + let (projectsByPath, targetsByName) = Self.makeProjectsByPathWithTargetsByName(workspace: workspace) var targetToModuleMaps: [TargetID: Set] = [:] for project in workspace.projects { diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 8c4d5370bb9..7e22e65ea4c 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -15,6 +15,8 @@ public class ResourcesProjectMapper: ProjectMapping { guard !project.options.disableBundleAccessors else { return (project, []) } + logger.debug("Transforming project \(project.name): Generating bundles for libraries'") + var sideEffects: [SideEffectDescriptor] = [] var targets: [Target] = [] diff --git a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift index aad58ab2f99..33328231464 100644 --- a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift @@ -50,6 +50,7 @@ public final class SynthesizedResourceInterfaceProjectMapper: ProjectMapping { / guard !project.options.disableSynthesizedResourceAccessors else { return (project, []) } + logger.debug("Transforming project \(project.name): Synthesizing resource accessors") let mappings = try project.targets .map { try mapTarget($0, project: project) } diff --git a/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift b/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift index 9dcc812a0fa..bef806223c3 100644 --- a/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift @@ -7,6 +7,11 @@ public final class TargetActionDisableShowEnvVarsProjectMapper: ProjectMapping { public init() {} public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { + logger + .debug( + "Transforming project \(project.name): Configuring 'disable show environment vars in script' in project targets' script phases" + ) + var project = project project.targets = project.targets.map { target in var mappedTarget = target diff --git a/Sources/TuistKit/Mappers/Graph/UpdateWorkspaceProjectsGraphMapper.swift b/Sources/TuistKit/Mappers/Graph/UpdateWorkspaceProjectsGraphMapper.swift index 11d8f6bd09f..35bea05bb67 100644 --- a/Sources/TuistKit/Mappers/Graph/UpdateWorkspaceProjectsGraphMapper.swift +++ b/Sources/TuistKit/Mappers/Graph/UpdateWorkspaceProjectsGraphMapper.swift @@ -8,6 +8,8 @@ public final class UpdateWorkspaceProjectsGraphMapper: GraphMapping { public init() {} public func map(graph: Graph) throws -> (Graph, [SideEffectDescriptor]) { + logger.debug("Transforming graph \(graph.name): Aligning workspace projects with the graph's") + var graph = graph let graphProjects = Set(graph.projects.map(\.key)) let workspaceProjects = Set(graph.workspace.projects).intersection(graphProjects) diff --git a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift index 8c1f8b118e8..969f030bd76 100644 --- a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift +++ b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift @@ -7,6 +7,7 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { public init() {} public func map(graph: Graph) throws -> (Graph, [SideEffectDescriptor]) { + logger.debug("Transforming graph \(graph.name): Tree-shaking nodes") let sourceTargets: Set = Set(graph.targets.flatMap { projectPath, targets -> [TargetReference] in guard graph.projects[projectPath] != nil else { return [] } return targets.compactMap { _, target -> TargetReference? in diff --git a/Sources/TuistKit/Mappers/Workspace/TuistWorkspaceIdentifierMapper.swift b/Sources/TuistKit/Mappers/Workspace/TuistWorkspaceIdentifierMapper.swift index d3373ad2e4a..49be12e0e40 100644 --- a/Sources/TuistKit/Mappers/Workspace/TuistWorkspaceIdentifierMapper.swift +++ b/Sources/TuistKit/Mappers/Workspace/TuistWorkspaceIdentifierMapper.swift @@ -8,6 +8,8 @@ import TuistSupport /// This is used to help identify the workspace as one that has been generated by tuist. final class TuistWorkspaceIdentifierMapper: WorkspaceMapping { func map(workspace: WorkspaceWithProjects) throws -> (WorkspaceWithProjects, [SideEffectDescriptor]) { + logger.debug("Transforming workspace \(workspace.workspace.name): Signing the workspace") + let tuistGeneratedFileDescriptor = FileDescriptor( path: workspace .workspace diff --git a/Sources/TuistKit/Mappers/Workspace/TuistWorkspaceRenderMarkdownMapper.swift b/Sources/TuistKit/Mappers/Workspace/TuistWorkspaceRenderMarkdownMapper.swift index cf674b93cc2..2fa3328e963 100644 --- a/Sources/TuistKit/Mappers/Workspace/TuistWorkspaceRenderMarkdownMapper.swift +++ b/Sources/TuistKit/Mappers/Workspace/TuistWorkspaceRenderMarkdownMapper.swift @@ -8,6 +8,9 @@ import TuistSupport /// This is used to render markdown inside the workspace. final class TuistWorkspaceRenderMarkdownReadmeMapper: WorkspaceMapping { func map(workspace: WorkspaceWithProjects) throws -> (WorkspaceWithProjects, [SideEffectDescriptor]) { + logger.debug("Transforming workspace \(workspace.workspace.name): Including .xcodesample.plist") + + logger.info("") let tuistGeneratedFileDescriptor = FileDescriptor( path: workspace .workspace diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift index 5d9de739633..0e94fbf9035 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift @@ -53,6 +53,7 @@ final class ProjectEditorMapper: ProjectEditorMapping { stencils: [AbsolutePath], projectDescriptionSearchPath: AbsolutePath ) throws -> Graph { + logger.info("Building the editable project graph") let swiftVersion = try System.shared.swiftVersion() let pluginsProject = mapPluginsProject( diff --git a/Sources/TuistSupport/Utils/FileHandler.swift b/Sources/TuistSupport/Utils/FileHandler.swift index 7a996d89328..e55364e2ab1 100644 --- a/Sources/TuistSupport/Utils/FileHandler.swift +++ b/Sources/TuistSupport/Utils/FileHandler.swift @@ -158,27 +158,22 @@ public class FileHandler: FileHandling { public func exists(_ path: AbsolutePath) -> Bool { let exists = fileManager.fileExists(atPath: path.pathString) - logger.debug("Checking if \(path) exists... \(exists)") return exists } public func copy(from: AbsolutePath, to: AbsolutePath) throws { - logger.debug("Copying file from \(from) to \(to)") try fileManager.copyItem(atPath: from.pathString, toPath: to.pathString) } public func move(from: AbsolutePath, to: AbsolutePath) throws { - logger.debug("Moving file from \(from) to \(to)") try fileManager.moveItem(atPath: from.pathString, toPath: to.pathString) } public func readFile(_ at: AbsolutePath) throws -> Data { - logger.debug("Reading contents of file at path \(at)") return try Data(contentsOf: at.url) } public func readTextFile(_ at: AbsolutePath) throws -> String { - logger.debug("Reading contents of text file at path \(at)") let data = try Data(contentsOf: at.url) if let content = String(data: data, encoding: .utf8) { return content @@ -188,7 +183,6 @@ public class FileHandler: FileHandling { } public func readPlistFile(_ at: AbsolutePath) throws -> T { - logger.debug("Reading contents of plist file at path \(at)") guard let data = fileManager.contents(atPath: at.pathString) else { throw FileHandlerError.fileNotFound(at) } @@ -196,19 +190,16 @@ public class FileHandler: FileHandling { } public func linkFile(atPath: AbsolutePath, toPath: AbsolutePath) throws { - logger.debug("Creating a link from \(atPath) to \(toPath)") try fileManager.linkItem(atPath: atPath.pathString, toPath: toPath.pathString) } public func write(_ content: String, path: AbsolutePath, atomically: Bool) throws { - logger.debug("Writing contents to file \(path) atomically \(atomically)") do { try content.write(to: path.url, atomically: atomically, encoding: .utf8) } catch {} } public func locateDirectory(_ path: String, traversingFrom from: AbsolutePath) throws -> AbsolutePath? { - logger.debug("Traversing \(from) to locate \(path)") let extendedPath = from.appending(try RelativePath(validating: path)) if exists(extendedPath) { return extendedPath @@ -228,7 +219,6 @@ public class FileHandler: FileHandling { } public func createFolder(_ path: AbsolutePath) throws { - logger.debug("Creating folder at path \(path)") try fileManager.createDirectory( at: path.url, withIntermediateDirectories: true, @@ -237,14 +227,12 @@ public class FileHandler: FileHandling { } public func delete(_ path: AbsolutePath) throws { - logger.debug("Deleting item at path \(path)") if exists(path) { try fileManager.removeItem(atPath: path.pathString) } } public func touch(_ path: AbsolutePath) throws { - logger.debug("Touching \(path)") try fileManager.createDirectory( at: path.removingLastComponent().url, withIntermediateDirectories: true, @@ -260,8 +248,6 @@ public class FileHandler: FileHandling { } public func locateDirectoryTraversingParents(from: AbsolutePath, path: String) -> AbsolutePath? { - logger.debug("Traversing \(from) to locate \(path)") - let configPath = from.appending(component: path) let root = try! AbsolutePath(validating: "/") // swiftlint:disable:this force_try From 285ac5d5588ee4aeede3f04c1e3b722edf26663d Mon Sep 17 00:00:00 2001 From: Daniele Formichelli Date: Mon, 12 Feb 2024 17:22:09 +0100 Subject: [PATCH 061/509] docs: refresh README (#5902) * docs: refresh README * docs: add back some badges * docs: intro * docs: fix table style * docs: companies logo first batch * docs: column widths * docs: improve tables * docs: better tables * chore: rename assets * chore: fixs * chore: minor fixes * chore: image sizes * fix: olx logo crop to content * chore: add missing logo * chore: fix getyourguide logo * chore: fix getyourguide logo * docs: move documentation to the top --- README.md | 473 ++++++++++-------- .../Bending Spoons - Logo, black.svg | 22 - assets/companies/GetYourGuide.svg | 53 -- .../{Trendyol_online.png => Trendyol.png} | Bin ...ry_nerds_logo_black.svg => angrynerds.svg} | 0 assets/companies/{Asana.png => asana.png} | Bin ...s-white.png => bendingspoons-darkmode.png} | Bin ...dingSpoons-black.png => bendingspoons.png} | Bin .../{codemagic-logo.svg => codemagic.svg} | 0 .../{Compass Black Logo.png => compass.png} | Bin ...roll_logo_vertical.svg => crunchyroll.svg} | 0 .../companies/{Depop Logo.svg => depop.svg} | 0 .../{DodoPizzaLogo.svg => dodopizza.svg} | 0 ...cal-white.svg => emergetools-darkmode.svg} | 0 ...ols-vertical-black.svg => emergetools.svg} | 0 ...mplate_logo_full_black.svg => emplate.svg} | 0 assets/companies/getyourguide.png | Bin 0 -> 34632 bytes assets/companies/{Hedvig.svg => hedvig.svg} | 0 assets/companies/{hh mono.svg => hh.svg} | 0 .../{kinopoisk_logo.svg => kinopoisk.svg} | 0 .../{OlimpBet Logo.svg => olimpbet.svg} | 0 assets/companies/olx.png | Bin 0 -> 124732 bytes assets/companies/olx.svg | 78 --- .../{stream-white.png => stream-darkmode.png} | Bin ...takeout_central.svg => takeoutcentral.svg} | 0 assets/companies/{TV2_Logo.svg => tv2.svg} | 0 assets/companies/{VK_logo.svg => vk.svg} | 0 .../companies/{Wefox_2021.png => wefox.png} | Bin 28 files changed, 265 insertions(+), 361 deletions(-) delete mode 100644 assets/companies/Bending Spoons - Logo, black.svg delete mode 100644 assets/companies/GetYourGuide.svg rename assets/companies/{Trendyol_online.png => Trendyol.png} (100%) rename assets/companies/{angry_nerds_logo_black.svg => angrynerds.svg} (100%) rename assets/companies/{Asana.png => asana.png} (100%) rename assets/companies/{BendingSpoons-white.png => bendingspoons-darkmode.png} (100%) rename assets/companies/{BendingSpoons-black.png => bendingspoons.png} (100%) rename assets/companies/{codemagic-logo.svg => codemagic.svg} (100%) rename assets/companies/{Compass Black Logo.png => compass.png} (100%) rename assets/companies/{crunchyroll_logo_vertical.svg => crunchyroll.svg} (100%) rename assets/companies/{Depop Logo.svg => depop.svg} (100%) rename assets/companies/{DodoPizzaLogo.svg => dodopizza.svg} (100%) rename assets/companies/{emerge-tools-vertical-white.svg => emergetools-darkmode.svg} (100%) rename assets/companies/{emerge-tools-vertical-black.svg => emergetools.svg} (100%) rename assets/companies/{emplate_logo_full_black.svg => emplate.svg} (100%) create mode 100644 assets/companies/getyourguide.png rename assets/companies/{Hedvig.svg => hedvig.svg} (100%) rename assets/companies/{hh mono.svg => hh.svg} (100%) rename assets/companies/{kinopoisk_logo.svg => kinopoisk.svg} (100%) rename assets/companies/{OlimpBet Logo.svg => olimpbet.svg} (100%) create mode 100644 assets/companies/olx.png delete mode 100644 assets/companies/olx.svg rename assets/companies/{stream-white.png => stream-darkmode.png} (100%) rename assets/companies/{takeout_central.svg => takeoutcentral.svg} (100%) rename assets/companies/{TV2_Logo.svg => tv2.svg} (100%) rename assets/companies/{VK_logo.svg => vk.svg} (100%) rename assets/companies/{Wefox_2021.png => wefox.png} (100%) diff --git a/README.md b/README.md index 3c2a194f178..eb00d4305bc 100644 --- a/README.md +++ b/README.md @@ -1,248 +1,305 @@
    -
    - Tuist - Latest Version - Commit Activity - Latest Commits - Twitter Followers - Slack Workspace - Sponsors - Backers - License - Powered by Tuist - +
    + header +
    + CI status + Commit Activity + Twitter Followers + Slack Workspace + Slack Workspace +
    + Book us with Cal.com +
    -
    - Book us with Cal.com -
    - -## What's Tuist 🕺 +## 🕺 What's Tuist -Tuist is a command line tool that helps you **generate**, **maintain** and **interact** with Xcode projects. +Tuist is a command line tool that leverages **_project generation_** to abstract intricacies of Xcode projects, and uses it as a foundation to help teams **_maintain_** and **_optimize_** their large modular projects. It's open source and written in Swift. -## Install ⬇️ +## ⬇️ Install -### Recommended: [mise](https://github.com/jdx/mise) - -Install [mise](https://mise.jdx.dev/getting-started.html#quickstart) and then run the following command to install Tuist: - -```bash -mise install tuist -``` +The recommended installation method is to [install mise](https://mise.jdx.dev/getting-started.html#quickstart) and then run `mise install tuist` to install Tuist. You can check out [the documentation](https://docs.tuist.io/documentation/tuist/installation) to learn more about the rationale behind our installation approach and alternative approaches. -## Bootstrap your first project 🌀 +## 🌀 Bootstrap your first project ```bash tuist init --platform ios +tuist edit # Customize your project manifest tuist generate # Generates Xcode project & workspace tuist build # Builds your project ``` -[Check out](https://docs.tuist.io/documentation/tuist) the project "Get Started" guide to learn more about Tuist and all its features. - -## Sample projects 🔬 - -You can find some sample projects in the [fixtures folder](fixtures) or the [awesome Tuist repo](https://github.com/tuist/awesome-tuist)! 🎉 - -## Want to contribute? - -You can use our [contribution docs](https://docs.tuist.io/documentation/tuist/get-started-as-contributor) to get started. If you don't have a specific issue in mind, we are more than happy to help you, just ask for help in a given issue or on our [Slack](https://join.slack.com/t/tuistapp/shared_invite/zt-1lqw355mp-zElRwLeoZ2EQsgGEkyaFgg). You can find good issues for first-time contributors [here](https://github.com/tuist/tuist/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). We also offer [issue bounties](https://github.com/tuist/tuist/discussions/4982) for some highly-valued issues. - -## Sponsors - -The financial sustainability of the project is possible thanks to the ongoing contributions from our [GitHub Sponsors](https://github.com/sponsors/tuist) and [Open Collective Backers](https://opencollective.com/tuistapp). From them, we'd like to give a special mention to the following sponsors: - -### Gold Sponsors - -[Monday.com](https://monday.com?utm_source=Github&utm_medium=Github_Repo_Content_Ad&utm_content=Developer&&utm_term=tuist) is a cloud-based work operating system (Work OS) that empowers teams to run projects and workflows with confidence. It's a versatile platform that combines features of project management, workflow automation, and team collaboration to streamline the way teams work together. - - - -[Lapse](https://lapse.com?utm_source=Github&utm_medium=Github_Repo_Content_Ad&utm_content=Developer&&utm_term=tuist) is an app designed to reclaim how we take and share memories. A camera for living in the moment and a private photo journal for friends, not followers. +Check out [the project "Get Started" guide](https://docs.tuist.io/documentation/tuist) to learn more about Tuist and all its features. - - - -### Silver sponsors +## 📝 Documentation -[Stream](https://getstream.io/chat/sdk/ios/?utm_source=Github&utm_medium=Github_Repo_Content_Ad&utm_content=Developer&utm_campaign=Github_Jan2022_SwiftSDK&utm_term=tuist) helps build scalable in-app chat or activity feeds in days. Product teams trust Stream to launch faster, iterate more often, and ship a better user experience. +Do you want to know more about what Tuist can offer you? Or perhaps want to contribute to the project and you need a starting point? - - -
    +You can check out [the project documentation](https://docs.tuist.io/documentation/tuist/). -[Runway](https://www.runway.team) streamlines collaboration and automation for mobile app releases, from kickoff to rollout. +### 🔬 Sample projects - +You can find some sample projects in the [fixtures folder](fixtures) or the [awesome Tuist repo](https://github.com/tuist/awesome-tuist)! 🎉 -[Emerge Tools](https://www.emergetools.com) is a suite of revolutionary products designed to supercharge mobile apps and the teams that build them - - +## 💰 Sponsors -[Codemagic](https://www.emergetools.com) is a CI/CD tool for building world-class mobile apps. +The financial sustainability of the project is possible thanks to the ongoing contributions from our [GitHub Sponsors](https://github.com/sponsors/tuist) and [Open Collective Backers](https://opencollective.com/tuistapp). From them, we'd like to give a special mention to the following sponsors: - +### 🥇 Gold Sponsors -### Bronze sponsor: [MacPaw](https://macpaw.com/) + + + + + + + + + + + +
    + + mondaycom_logo + + Monday.com is a cloud-based work operating system (Work OS) that empowers teams to run projects and workflows with confidence. It's a versatile platform that combines features of project management, workflow automation, and team collaboration to streamline the way teams work together.
    + + lapse_logo + + Lapse is an app designed to reclaim how we take and share memories. A camera for living in the moment and a private photo journal for friends, not followers.
    - +### 🥈 Silver sponsors -### Bronze sponsor: [Asana](https://asana.com/) + + + + + + + + + + + + + + + + + + + +
    + + + + stream_logo + + + Stream helps build scalable in-app chat or activity feeds in days. Product teams trust Stream to launch faster, iterate more often, and ship a better user experience.
    + + runway_logo + + Runway streamlines collaboration and automation for mobile app releases, from kickoff to rollout.
    + + + + emerge_logo + + + Emerge Tools is a suite of revolutionary products designed to supercharge mobile apps and the teams that build them.
    + + codemagic_logo + + Codemagic is a CI/CD tool for building world-class mobile apps.
    - +### 🥉 Bronze sponsors -## Companies using Tuist - - + + + + + + + +
    + + macpaw_logo + + + + asana_logo + +
    -## Documentation 📝 +## 💪 Companies using Tuist -Do you want to know more about what Tuist can offer you? Or perhaps want to contribute to the project and you need a starting point? You can check out the [project documentation](https://docs.tuist.io/documentation/tuist/). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + tv2_logo + + + + depop_logo + + + + + + bendingspoons_logo + + + + + globekeeper_logo + + + + getyourguide_logo + +
    + + emplate_logo + + + + hh_logo + + + + trendyol_logo + + + + angrynerds_logo + + + + compass_logo + +
    + + wefox_logo + + + + hedvig_logo + + + + takeoutcentral_logo + + + + olx_logo + + + + justeattakeaway_logo + +
    + + dodopizza_logo + + + + olimpbet_logo + + + + vk_logo + + + + kinopoisk_logo + + + + qnips_logo + +
    + + telepass_logo + + + + crunchyroll_logo + +
    -## Supported by great companies +## 🙇‍ ️Supported by great companies -1Password, Bugsgnag Cal.com support the project by giving us access to their service through an open-source program. +Great companies support the project by giving us access to their service through an open-source program. -
    - - - -
    + + + + + + + + + +
    + 1password_logo + + bugsnag_logo + + calcom_logo + + codemagic_logo +
    -## Contribute 👩‍💻 +## 🧑‍💻 Want to contribute? -If you are interested in contributing to the project, our documentation has a section with resources for contributors. We recommend starting from [this page](https://docs.tuist.io/documentation/tuist/get-started-as-contributor). +You can use our [contribution docs](https://docs.tuist.io/documentation/tuist/get-started-as-contributor) to get started. If you don't have a specific issue in mind, we are more than happy to help you, just ask for help in a given issue or on our [Slack](https://join.slack.com/t/tuistapp/shared_invite/zt-1lqw355mp-zElRwLeoZ2EQsgGEkyaFgg). You can find good issues for first-time contributors [here](https://github.com/tuist/tuist/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). We also offer [issue bounties](https://github.com/tuist/tuist/discussions/4982) for some highly-valued issues. -## Core Team ✨ +## ✨ Core Team @@ -254,7 +311,7 @@ If you are interested in contributing to the project, our documentation has a se
    -## Core Alumni 🚀 +## 🚀 Core Alumni The following people were once core contributors helping steer the project in the right direction and ensuring we have a reliable foundation we can build new features upon: @@ -270,7 +327,7 @@ The following people were once core contributors helping steer the project in th -## Contributors ✨ +## ✨ Contributors Thanks goes to these wonderful people: diff --git a/assets/companies/Bending Spoons - Logo, black.svg b/assets/companies/Bending Spoons - Logo, black.svg deleted file mode 100644 index f2b534ccc97..00000000000 --- a/assets/companies/Bending Spoons - Logo, black.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/assets/companies/GetYourGuide.svg b/assets/companies/GetYourGuide.svg deleted file mode 100644 index 199b9c47e81..00000000000 --- a/assets/companies/GetYourGuide.svg +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/companies/Trendyol_online.png b/assets/companies/Trendyol.png similarity index 100% rename from assets/companies/Trendyol_online.png rename to assets/companies/Trendyol.png diff --git a/assets/companies/angry_nerds_logo_black.svg b/assets/companies/angrynerds.svg similarity index 100% rename from assets/companies/angry_nerds_logo_black.svg rename to assets/companies/angrynerds.svg diff --git a/assets/companies/Asana.png b/assets/companies/asana.png similarity index 100% rename from assets/companies/Asana.png rename to assets/companies/asana.png diff --git a/assets/companies/BendingSpoons-white.png b/assets/companies/bendingspoons-darkmode.png similarity index 100% rename from assets/companies/BendingSpoons-white.png rename to assets/companies/bendingspoons-darkmode.png diff --git a/assets/companies/BendingSpoons-black.png b/assets/companies/bendingspoons.png similarity index 100% rename from assets/companies/BendingSpoons-black.png rename to assets/companies/bendingspoons.png diff --git a/assets/companies/codemagic-logo.svg b/assets/companies/codemagic.svg similarity index 100% rename from assets/companies/codemagic-logo.svg rename to assets/companies/codemagic.svg diff --git a/assets/companies/Compass Black Logo.png b/assets/companies/compass.png similarity index 100% rename from assets/companies/Compass Black Logo.png rename to assets/companies/compass.png diff --git a/assets/companies/crunchyroll_logo_vertical.svg b/assets/companies/crunchyroll.svg similarity index 100% rename from assets/companies/crunchyroll_logo_vertical.svg rename to assets/companies/crunchyroll.svg diff --git a/assets/companies/Depop Logo.svg b/assets/companies/depop.svg similarity index 100% rename from assets/companies/Depop Logo.svg rename to assets/companies/depop.svg diff --git a/assets/companies/DodoPizzaLogo.svg b/assets/companies/dodopizza.svg similarity index 100% rename from assets/companies/DodoPizzaLogo.svg rename to assets/companies/dodopizza.svg diff --git a/assets/companies/emerge-tools-vertical-white.svg b/assets/companies/emergetools-darkmode.svg similarity index 100% rename from assets/companies/emerge-tools-vertical-white.svg rename to assets/companies/emergetools-darkmode.svg diff --git a/assets/companies/emerge-tools-vertical-black.svg b/assets/companies/emergetools.svg similarity index 100% rename from assets/companies/emerge-tools-vertical-black.svg rename to assets/companies/emergetools.svg diff --git a/assets/companies/emplate_logo_full_black.svg b/assets/companies/emplate.svg similarity index 100% rename from assets/companies/emplate_logo_full_black.svg rename to assets/companies/emplate.svg diff --git a/assets/companies/getyourguide.png b/assets/companies/getyourguide.png new file mode 100644 index 0000000000000000000000000000000000000000..6c73734dd033b8ef1ba76e380b9bd5aa66fc92a6 GIT binary patch literal 34632 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⪼Xi0JGlv64nUY^v@Xm8Zx8rxi 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%0A-(iKxg$e5eo?0!8#`7qz+W-Pa5gE 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 z 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 - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/assets/companies/stream-white.png b/assets/companies/stream-darkmode.png similarity index 100% rename from assets/companies/stream-white.png rename to assets/companies/stream-darkmode.png diff --git a/assets/companies/takeout_central.svg b/assets/companies/takeoutcentral.svg similarity index 100% rename from assets/companies/takeout_central.svg rename to assets/companies/takeoutcentral.svg diff --git a/assets/companies/TV2_Logo.svg b/assets/companies/tv2.svg similarity index 100% rename from assets/companies/TV2_Logo.svg rename to assets/companies/tv2.svg diff --git a/assets/companies/VK_logo.svg b/assets/companies/vk.svg similarity index 100% rename from assets/companies/VK_logo.svg rename to assets/companies/vk.svg diff --git a/assets/companies/Wefox_2021.png b/assets/companies/wefox.png similarity index 100% rename from assets/companies/Wefox_2021.png rename to assets/companies/wefox.png From f51e653212f83294204d65f3d6e968faf57499c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 12 Feb 2024 17:58:01 +0100 Subject: [PATCH 062/509] Fix integration of Objective C dependencies (#5887) * Fix ZipArchive * Move the solution to the package mapper instead of a graph mapper * Fix most of objc cases * Hacky fix for CocoaLumberjack * Temporarily skip other acceptance tests * Try build without CocoaLumbrejack * Fixed GoogleSignIn issue * Try to add back CocoaLumberjack * Adjust unit tests * Lint fix * Reenable rest of acceptance tests * Glob only publicHeadersDir (not recursively) * Change publicHeadersPath for CocoaLumberjack * Set DEFINES_MODULE to NO if there is no umbrella header (#5909) --- .../Mappers/ModuleMapMapper.swift | 33 +++++ .../PackageInfoMapper.swift | 47 +++++- ...wiftPackageManagerModuleMapGenerator.swift | 69 +++++++-- .../ProjectMappers/ModuleMapMapperTests.swift | 7 +- .../PackageInfoMapperTests.swift | 41 +++--- ...ackageManagerModuleMapGeneratorTests.swift | 23 ++- .../App/Project.swift | 6 + .../App/Sources/AppKit/AppKit.swift | 25 ++++ .../Package.resolved | 135 +++++++++++++++--- .../app_with_spm_dependencies/Package.swift | 6 + 10 files changed, 325 insertions(+), 67 deletions(-) diff --git a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift index fdeca16721c..105a3ec4181 100644 --- a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift +++ b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift @@ -50,6 +50,7 @@ public final class ModuleMapMapper: WorkspaceMapping { private static let modulemapFileSetting = "MODULEMAP_FILE" private static let otherCFlagsSetting = "OTHER_CFLAGS" private static let otherSwiftFlagsSetting = "OTHER_SWIFT_FLAGS" + private static let headerSearchPaths = "HEADER_SEARCH_PATHS" private struct TargetID: Hashable { let projectPath: AbsolutePath @@ -110,6 +111,14 @@ public final class ModuleMapMapper: WorkspaceMapping { mappedSettingsDictionary[Self.otherCFlagsSetting] = updatedOtherCFlags } + if let updatedHeaderSearchPaths = Self.updatedHeaderSearchPaths( + targetID: targetID, + oldHeaderSearchPaths: mappedSettingsDictionary[Self.headerSearchPaths], + targetToModuleMaps: targetToModuleMaps + ) { + mappedSettingsDictionary[Self.headerSearchPaths] = updatedHeaderSearchPaths + } + let targetSettings = mappedTarget.settings ?? Settings( base: [:], configurations: [:], @@ -217,6 +226,30 @@ public final class ModuleMapMapper: WorkspaceMapping { targetToModuleMaps[targetID] = dependenciesModuleMaps } + private static func updatedHeaderSearchPaths( + targetID: TargetID, + oldHeaderSearchPaths: SettingsDictionary.Value?, + targetToModuleMaps: [TargetID: Set] + ) -> SettingsDictionary.Value? { + guard let dependenciesModuleMaps = targetToModuleMaps[targetID], !dependenciesModuleMaps.isEmpty else { return nil } + + var mappedHeaderSearchPaths: [String] + switch oldHeaderSearchPaths ?? .array(["$(inherited)"]) { + case let .array(values): + mappedHeaderSearchPaths = values + case let .string(value): + mappedHeaderSearchPaths = value.split(separator: " ").map(String.init) + } + + for moduleMap in dependenciesModuleMaps.sorted() { + mappedHeaderSearchPaths.append( + "$(SRCROOT)/\(moduleMap.relative(to: targetID.projectPath).appending(components: ".."))" + ) + } + + return .array(mappedHeaderSearchPaths) + } + private static func updatedOtherSwiftFlags( targetID: TargetID, oldOtherSwiftFlags: SettingsDictionary.Value?, diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index edce18afad7..590ee077089 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -315,7 +315,7 @@ public final class PackageInfoMapper: PackageInfoMapping { ) } - result[target.name] = ModuleMap.custom(moduleMapPath) + result[target.name] = ModuleMap.custom(moduleMapPath, umbrellaHeaderPath: nil) case .regular: result[target.name] = try moduleMapGenerator.generate( moduleName: target.name, @@ -914,12 +914,42 @@ extension ProjectDescription.Headers { // As per SPM logic, headers should be added only when using the umbrella header without modulemap: // https://github.com/apple/swift-package-manager/blob/9b9bed7eaf0f38eeccd0d8ca06ae08f6689d1c3f/Sources/Xcodeproj/pbxproj.swift#L588-L609 switch moduleMap { - case .header, .nestedHeader: + case let .header(path): + return .headers( + public: .list( + [ + .glob( + .path(path.parentDirectory.appending(component: "\(path.basenameWithoutExt).h").pathString) + ), + ] + ) + ) + case .nestedHeader: let publicHeaders = try FileHandler.shared.filesAndDirectoriesContained(in: publicHeadersPath)! .filter { $0.extension == "h" } let list: [FileListGlob] = publicHeaders.map { .glob(.path($0.pathString)) } return .headers(public: .list(list)) - case .none, .custom, .directory: + case let .custom(_, umbrellaHeaderPath: umbrellaHeaderPath): + guard let umbrellaHeaderPath else { return nil } + + return .headers( + public: .list( + [ + .glob( + .path(umbrellaHeaderPath.pathString) + ), + ] + ) + ) + case let .directory(moduleMapPath: _, umbrellaDirectory: umbrellaDirectory): + return .headers( + public: .list( + [ + .glob("\(umbrellaDirectory.pathString)/*.h"), + ] + ) + ) + case .none: return nil } } @@ -1002,10 +1032,19 @@ extension ProjectDescription.Settings { settingsDictionary.merge(resolvedSettings) { $1 } - if let moduleMapPath = moduleMap?.path { + if let moduleMapPath = moduleMap?.moduleMapPath { settingsDictionary["MODULEMAP_FILE"] = .string("$(SRCROOT)/\(moduleMapPath.relative(to: packageFolder))") } + if let moduleMap { + switch moduleMap { + case .directory, .custom(_, umbrellaHeaderPath: nil): + settingsDictionary["DEFINES_MODULE"] = "NO" + case .header, .nestedHeader, .none, .custom: + break + } + } + var mappedSettingsDictionary = ProjectDescription.SettingsDictionary.from(settingsDictionary: settingsDictionary) if let settingsToOverride = targetSettings[target.name] { diff --git a/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift b/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift index 21dcfa9deff..5d407bb7e2a 100644 --- a/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift +++ b/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift @@ -6,19 +6,23 @@ public enum ModuleMap: Equatable { /// No headers and hence no modulemap file case none /// Custom modulemap file provided in SPM package - case custom(AbsolutePath) + case custom(AbsolutePath, umbrellaHeaderPath: AbsolutePath?) /// Umbrella header provided in SPM package - case header + case header(moduleMapPath: AbsolutePath) /// Nested umbrella header provided in SPM package case nestedHeader /// No umbrella header provided in SPM package, define umbrella directory - case directory(AbsolutePath) + case directory(moduleMapPath: AbsolutePath, umbrellaDirectory: AbsolutePath) - var path: AbsolutePath? { + var moduleMapPath: AbsolutePath? { switch self { - case let .custom(path), let .directory(path): + case let .custom(path, umbrellaHeaderPath: _): return path - case .none, .header, .nestedHeader: + case let .header(moduleMapPath: path): + return path + case let .directory(moduleMapPath: path, umbrellaDirectory: _): + return path + case .none, .nestedHeader: return nil } } @@ -45,31 +49,66 @@ public final class SwiftPackageManagerModuleMapGenerator: SwiftPackageManagerMod ) throws -> ModuleMap { let umbrellaHeaderPath = publicHeadersPath.appending(component: moduleName + ".h") let nestedUmbrellaHeaderPath = publicHeadersPath.appending(component: moduleName).appending(component: moduleName + ".h") + let sanitizedModuleName = moduleName.replacingOccurrences(of: "-", with: "_") + let customModuleMapPath = try Self.customModuleMapPath(publicHeadersPath: publicHeadersPath) - if let customModuleMapPath = try Self.customModuleMapPath(publicHeadersPath: publicHeadersPath) { - // User defined modulemap exists, use it - return .custom(customModuleMapPath) - } else if FileHandler.shared.exists(umbrellaHeaderPath) { + if FileHandler.shared.exists(umbrellaHeaderPath) { + if let customModuleMapPath { + return .custom(customModuleMapPath, umbrellaHeaderPath: umbrellaHeaderPath) + } + let moduleMapContent = """ + framework module \(sanitizedModuleName) { + umbrella header "\(umbrellaHeaderPath.pathString)" + + export * + module * { export * } + } + """ + let moduleMapPath = umbrellaHeaderPath.parentDirectory.appending(component: "\(moduleName).modulemap") + try FileHandler.shared.write(moduleMapContent, path: moduleMapPath, atomically: true) // If 'PublicHeadersDir/ModuleName.h' exists, then use it as the umbrella header. - // When umbrella header is present, no need to define a modulemap as it is generated by Xcode - return .header + return .header(moduleMapPath: moduleMapPath) } else if FileHandler.shared.exists(nestedUmbrellaHeaderPath) { + if let customModuleMapPath { + return .custom(customModuleMapPath, umbrellaHeaderPath: nestedUmbrellaHeaderPath) + } // If 'PublicHeadersDir/ModuleName/ModuleName.h' exists, then use it as the umbrella header. return .nestedHeader + } else if let customModuleMapPath { + // User defined modulemap exists, use it + return .custom(customModuleMapPath, umbrellaHeaderPath: nil) } else if FileHandler.shared.exists(publicHeadersPath) { + // We move the umbrella headers directory to a different location for CocoaLumberjack. Somehow, the one used by + // default is not properly recognized even if the path in the `modulemap` is correct. + // If the directory is copied to a different location, it works. + if sanitizedModuleName == "CocoaLumberjack" { + let copiedPublicHeadersPath = publicHeadersPath.parentDirectory.appending(component: "tuist-public-headers") + if !FileHandler.shared.exists(copiedPublicHeadersPath) { + try FileHandler.shared.copy(from: publicHeadersPath, to: copiedPublicHeadersPath) + } + let generatedModuleMapContent = + """ + module \(sanitizedModuleName) { + umbrella "\(copiedPublicHeadersPath.pathString)" + export * + } + """ + let generatedModuleMapPath = publicHeadersPath.appending(component: "\(moduleName).modulemap") + try FileHandler.shared.write(generatedModuleMapContent, path: generatedModuleMapPath, atomically: true) + return .directory(moduleMapPath: generatedModuleMapPath, umbrellaDirectory: copiedPublicHeadersPath) + } + // Otherwise, consider the public headers folder as umbrella directory - let sanitizedModuleName = moduleName.replacingOccurrences(of: "-", with: "_") let generatedModuleMapContent = """ module \(sanitizedModuleName) { umbrella "\(publicHeadersPath.pathString)" export * } - """ let generatedModuleMapPath = publicHeadersPath.appending(component: "\(moduleName).modulemap") try FileHandler.shared.write(generatedModuleMapContent, path: generatedModuleMapPath, atomically: true) - return .directory(generatedModuleMapPath) + return .directory(moduleMapPath: generatedModuleMapPath, umbrellaDirectory: publicHeadersPath) } else { return .none } diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift index a2e62330f33..4cf36e222c6 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift @@ -94,6 +94,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { "-Xcc", "-fmodule-map-file=$(SRCROOT)/../B/B2/B2.module", ]), + "HEADER_SEARCH_PATHS": .array(["$(inherited)", "$(SRCROOT)/../B/B1", "$(SRCROOT)/../B/B2"]), ]), dependencies: [ .project(target: "B1", path: projectBPath), @@ -112,6 +113,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { settings: .test(base: [ "OTHER_CFLAGS": .array(["$(inherited)", "-fmodule-map-file=$(SRCROOT)/B2/B2.module"]), "OTHER_SWIFT_FLAGS": .array(["$(inherited)", "-Xcc", "-fmodule-map-file=$(SRCROOT)/B2/B2.module"]), + "HEADER_SEARCH_PATHS": .array(["$(inherited)", "$(SRCROOT)/B2"]), ]), dependencies: [ .target(name: "B2"), @@ -129,7 +131,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { ] ) - XCTAssertEqual( + XCTAssertBetterEqual( gotWorkspaceWithProjects, WorkspaceWithProjects( workspace: workspace, @@ -202,6 +204,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { "-Xcc", "-fmodule-map-file=$(SRCROOT)/../B/B/B.module", ]), + "HEADER_SEARCH_PATHS": .array(["$(inherited)", "$(SRCROOT)/../B/B"]), ], configurations: [:], defaultSettings: .recommended @@ -230,7 +233,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { ] ) - XCTAssertEqual( + XCTAssertBetterEqual( gotWorkspaceWithProjects, WorkspaceWithProjects( workspace: workspace, diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 20208b4812f..6533564592e 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -460,23 +460,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ) - let test = Project.testWithDefaultConfigs( - name: "Package", - targets: [ - .test( - "Target1", - basePath: basePath, - customSources: .custom(.sourceFilesList( - globs: [ - basePath - .appending(try RelativePath(validating: "Package/\(alternativeDefaultSource)/Target1/**")) - .pathString, - ] - )) - ), - ] - ) - XCTAssertBetterEqual( project, .testWithDefaultConfigs( @@ -1042,6 +1025,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, customSettings: [ "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Target1/include"], + "DEFINES_MODULE": "NO", ], moduleMap: "$(SRCROOT)/Sources/Target1/include/module.modulemap" ), @@ -1080,7 +1064,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { platforms: [.iOS] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", @@ -1089,6 +1073,9 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "Target1", basePath: basePath, customSources: .custom(nil), + customSettings: [ + "DEFINES_MODULE": "NO", + ], moduleMap: "$(SRCROOT)/Sources/Target1/module.modulemap" ), ] @@ -1160,7 +1147,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), ] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", @@ -1168,9 +1155,10 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - headers: .headers(public: [nestedHeaderPath.pathString, topHeaderPath.pathString]), + headers: .headers(public: [topHeaderPath.pathString]), customSettings: [ "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Target1/include"], + "MODULEMAP_FILE": .string("$(SRCROOT)/Sources/Target1/include/Target1.modulemap"), ] ), ] @@ -1234,6 +1222,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "$(SRCROOT)/Sources/Dependency1/include", "$(SRCROOT)/Sources/Dependency2/include", ], + "DEFINES_MODULE": "NO", ], moduleMap: "$(SRCROOT)/Sources/Target1/include/module.modulemap" ), @@ -1246,6 +1235,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "$(SRCROOT)/Sources/Dependency1/include", "$(SRCROOT)/Sources/Dependency2/include", ], + "DEFINES_MODULE": "NO", ], moduleMap: "$(SRCROOT)/Sources/Dependency1/include/module.modulemap" ), @@ -1254,6 +1244,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, customSettings: [ "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Dependency2/include"], + "DEFINES_MODULE": "NO", ], moduleMap: "$(SRCROOT)/Sources/Dependency2/include/module.modulemap" ), @@ -1342,6 +1333,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "$(SRCROOT)/../Package2/Sources/Dependency1/include", "$(SRCROOT)/../Package3/Sources/Dependency2/include", ], + "DEFINES_MODULE": "NO", ], moduleMap: "$(SRCROOT)/Sources/Target1/include/module.modulemap" ), @@ -1413,6 +1405,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ], customSettings: [ "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Custom/Headers"], + "DEFINES_MODULE": "NO", ], moduleMap: "$(SRCROOT)/Custom/Headers/module.modulemap" ), @@ -1449,7 +1442,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), ] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", @@ -1465,8 +1458,14 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Dependency1", basePath: basePath, + headers: .headers( + public: .list( + [.glob(.path("\(dependencyHeadersPath.pathString)/*.h"))] + ) + ), customSettings: [ "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Dependency1/include"], + "DEFINES_MODULE": "NO", ], moduleMap: "$(SRCROOT)/Sources/Dependency1/include/Dependency1.modulemap" ), diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift index 6632b85fd0c..ad445e9e08b 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift @@ -22,11 +22,11 @@ class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { } func test_generate_when_custom_module_map() throws { - try test_generate(for: .custom("/Absolute/Public/Headers/Path/module.modulemap")) + try test_generate(for: .custom("/Absolute/Public/Headers/Path/module.modulemap", umbrellaHeaderPath: nil)) } func test_generate_when_umbrella_header() throws { - try test_generate(for: .header) + try test_generate(for: .header(moduleMapPath: "/Absolute/Public/Headers/Path/Module.modulemap")) } func test_generate_when_nested_umbrella_header() throws { @@ -54,9 +54,9 @@ class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { case "/Absolute/Public/Headers/Path": return moduleMap != .none case "/Absolute/Public/Headers/Path/module.modulemap": - return moduleMap == .custom("/Absolute/Public/Headers/Path/module.modulemap") + return moduleMap == .custom("/Absolute/Public/Headers/Path/module.modulemap", umbrellaHeaderPath: nil) case "/Absolute/Public/Headers/Path/Module.h": - return moduleMap == .header + return moduleMap == .header(moduleMapPath: AbsolutePath("/Absolute/Public/Headers/Path/Module.modulemap")) case "/Absolute/Public/Headers/Path/Module/Module.h": return moduleMap == .nestedHeader default: @@ -68,9 +68,18 @@ class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { writeCalled = true let expectedContent: String switch moduleMap { - case .none, .custom, .header: + case .none, .custom: XCTFail("FileHandler.write should not be called") return + case .header: + expectedContent = """ + framework module Module { + umbrella header "/Absolute/Public/Headers/Path/Module.h" + + export * + module * { export * } + } + """ case .nestedHeader: expectedContent = """ module Module { @@ -95,9 +104,9 @@ class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { let got = try subject.generate(moduleName: "Module", publicHeadersPath: "/Absolute/Public/Headers/Path") XCTAssertEqual(got, moduleMap) switch moduleMap { - case .none, .custom, .header, .nestedHeader: + case .none, .custom, .nestedHeader: XCTAssertFalse(writeCalled) - case .directory: + case .directory, .header: XCTAssertTrue(writeCalled) } } diff --git a/fixtures/app_with_spm_dependencies/App/Project.swift b/fixtures/app_with_spm_dependencies/App/Project.swift index b84d8089fdd..734fe198e0e 100644 --- a/fixtures/app_with_spm_dependencies/App/Project.swift +++ b/fixtures/app_with_spm_dependencies/App/Project.swift @@ -30,6 +30,12 @@ let project = Project( .sdk(name: "c++", type: .library, status: .required), .external(name: "Alamofire"), .external(name: "ComposableArchitecture"), + .external(name: "ZipArchive"), + .external(name: "Yams"), + .external(name: "GoogleSignIn"), + .external(name: "Sentry"), + .external(name: "RealmSwift"), + .external(name: "CocoaLumberjackSwift"), ], settings: .targetSettings ), diff --git a/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift b/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift index 475b7236772..00d052cfdb8 100644 --- a/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift +++ b/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift @@ -1,5 +1,12 @@ import Alamofire +import CocoaLumberjackSwift import ComposableArchitecture +import GoogleSignIn +import Realm +import RealmSwift +import Sentry +import Yams +import ZipArchive public enum AppKit { public static func start() { @@ -8,6 +15,24 @@ public enum AppKit { // Use ComposableArchitecture to make sure it links fine _ = EmptyReducer() + + // Use ZipArchive + _ = SSZipArchive.createZipFile(atPath: #file + "/ss.zip", withFilesAtPaths: []) + + // Use Yams + _ = YAMLEncoder() + + // Use GoogleSignIn + _ = GIDSignIn.sharedInstance.configuration + + // Use Sentry + SentrySDK.startSession() + + // Use CocoaLumberjack + _ = CocoaLumberjackSwift.DDLogInfo("Log") + + // Use Realm + _ = Realm.Configuration() } } diff --git a/fixtures/app_with_spm_dependencies/Package.resolved b/fixtures/app_with_spm_dependencies/Package.resolved index e3f66daf7c1..54b14502db3 100644 --- a/fixtures/app_with_spm_dependencies/Package.resolved +++ b/fixtures/app_with_spm_dependencies/Package.resolved @@ -9,6 +9,24 @@ "version" : "5.8.0" } }, + { + "identity" : "appauth-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/openid/AppAuth-iOS.git", + "state" : { + "revision" : "71cde449f13d453227e687458144bde372d30fc7", + "version" : "1.6.2" + } + }, + { + "identity" : "cocoalumberjack", + "kind" : "remoteSourceControl", + "location" : "https://github.com/CocoaLumberjack/CocoaLumberjack", + "state" : { + "revision" : "af4973721172dd7850a42a58a9ffcec0ec82e5a9", + "version" : "3.8.4" + } + }, { "identity" : "combine-schedulers", "kind" : "remoteSourceControl", @@ -18,13 +36,67 @@ "version" : "1.0.0" } }, + { + "identity" : "googlesignin-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleSignIn-iOS", + "state" : { + "revision" : "7932d33686c1dc4d7df7a919aae47361d1cdfda4", + "version" : "7.0.0" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "76135c9f4e1ac85459d5fec61b6f76ac47ab3a4c", + "version" : "3.3.1" + } + }, + { + "identity" : "gtmappauth", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GTMAppAuth.git", + "state" : { + "revision" : "cee3c709307912d040bd1e06ca919875a92339c6", + "version" : "2.0.0" + } + }, + { + "identity" : "realm-core", + "kind" : "remoteSourceControl", + "location" : "https://github.com/realm/realm-core.git", + "state" : { + "revision" : "a5e87a39cffdcc591f3203c11cfca68100d0b9a6", + "version" : "13.26.0" + } + }, + { + "identity" : "realm-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/realm/realm-swift", + "state" : { + "revision" : "eafdd3720a8cc750bdd38bf776082d2c8cf743fc", + "version" : "10.46.0" + } + }, + { + "identity" : "sentry-cocoa", + "kind" : "remoteSourceControl", + "location" : "https://github.com/getsentry/sentry-cocoa", + "state" : { + "revision" : "b847a202a517a90763e8fd0656d8028aeee7b78d", + "version" : "8.20.0" + } + }, { "identity" : "swift-case-paths", "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-case-paths", "state" : { - "revision" : "a5521dde99570789d8cb7c43e51418d7cd1a87ca", - "version" : "1.1.2" + "revision" : "551150d5e60e3be78972607d89cd69069cca3e7c", + "version" : "1.2.4" } }, { @@ -32,8 +104,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-clocks", "state" : { - "revision" : "d1fd837326aa719bee979bdde1f53cd5797443eb", - "version" : "1.0.0" + "revision" : "a8421d68068d8f45fbceb418fbf22c5dad4afd33", + "version" : "1.0.2" } }, { @@ -41,8 +113,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-collections", "state" : { - "revision" : "a902f1823a7ff3c9ab2fba0f992396b948eda307", - "version" : "1.0.5" + "revision" : "94cf62b3ba8d4bed62680a282d4c25f9c63c2efb", + "version" : "1.1.0" } }, { @@ -50,8 +122,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-composable-architecture", "state" : { - "revision" : "dcde72151de8a60eecaa1673ed3c3d110549069a", - "version" : "1.5.1" + "revision" : "3568f01377c6c668aad40d066acf97ce670a1dad", + "version" : "1.5.6" } }, { @@ -68,8 +140,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-custom-dump", "state" : { - "revision" : "65fc9e2b62727cacfab9fc60d580c284a4b9308c", - "version" : "1.1.1" + "revision" : "6ea3b1b6a4957806d72030a32360d4bcb155a0d2", + "version" : "1.2.0" } }, { @@ -77,8 +149,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-dependencies", "state" : { - "revision" : "9783b58167f7618cb86011156e741cbc6f4cc864", - "version" : "1.1.2" + "revision" : "09e49dd46932adfe80ce672b4b3772d79ee6c21a", + "version" : "1.2.1" } }, { @@ -90,13 +162,22 @@ "version" : "1.0.0" } }, + { + "identity" : "swift-log", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-log", + "state" : { + "revision" : "e97a6fcb1ab07462881ac165fdbb37f067e205d5", + "version" : "1.5.4" + } + }, { "identity" : "swift-syntax", "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-syntax.git", "state" : { - "revision" : "6ad4ea24b01559dde0773e3d091f1b9e36175036", - "version" : "509.0.2" + "revision" : "64889f0c732f210a935a0ad7cda38f77f876262d", + "version" : "509.1.1" } }, { @@ -104,8 +185,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swiftui-navigation", "state" : { - "revision" : "78f9d72cf667adb47e2040aa373185c88c63f0dc", - "version" : "1.2.0" + "revision" : "d9e72f3083c08375794afa216fb2f89c0114f303", + "version" : "1.2.1" } }, { @@ -113,8 +194,26 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", "state" : { - "revision" : "23cbf2294e350076ea4dbd7d5d047c1e76b03631", - "version" : "1.0.2" + "revision" : "b58e6627149808b40634c4552fcf2f44d0b3ca87", + "version" : "1.1.0" + } + }, + { + "identity" : "yams", + "kind" : "remoteSourceControl", + "location" : "https://github.com/jpsim/Yams", + "state" : { + "revision" : "0d9ee7ea8c4ebd4a489ad7a73d5c6cad55d6fed3", + "version" : "5.0.6" + } + }, + { + "identity" : "ziparchive", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ZipArchive/ZipArchive", + "state" : { + "revision" : "79d4dc9729096c6ad83dd3cee2b9f354d1b4ab7b", + "version" : "2.5.5" } } ], diff --git a/fixtures/app_with_spm_dependencies/Package.swift b/fixtures/app_with_spm_dependencies/Package.swift index 046172c5aee..c5aace7252a 100644 --- a/fixtures/app_with_spm_dependencies/Package.swift +++ b/fixtures/app_with_spm_dependencies/Package.swift @@ -20,6 +20,12 @@ let package = Package( dependencies: [ .package(url: "https://github.com/Alamofire/Alamofire", exact: "5.8.0"), .package(url: "https://github.com/pointfreeco/swift-composable-architecture", .upToNextMinor(from: "1.5.0")), + .package(url: "https://github.com/ZipArchive/ZipArchive", .upToNextMajor(from: "2.5.5")), + .package(url: "https://github.com/jpsim/Yams", .upToNextMajor(from: "5.0.6")), + .package(url: "https://github.com/google/GoogleSignIn-iOS", .upToNextMajor(from: "7.0.0")), + .package(url: "https://github.com/getsentry/sentry-cocoa", .upToNextMajor(from: "8.20.0")), + .package(url: "https://github.com/realm/realm-swift", .upToNextMajor(from: "10.46.0")), + .package(url: "https://github.com/CocoaLumberjack/CocoaLumberjack", .upToNextMajor(from: "3.8.4")), .package(path: "LocalSwiftPackage"), .package(path: "StringifyMacro"), ] From 96d25f569e103c58157d35ef188c39ba472a052c Mon Sep 17 00:00:00 2001 From: pepicrft Date: Mon, 12 Feb 2024 17:07:36 +0000 Subject: [PATCH 063/509] [Release] Tuist 4.1.0 --- .mise.toml | 2 +- CHANGELOG.md | 20 ++++++++++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index 13a2b7ad0f8..ea31c8b0524 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.0.0" +tuist = "4.1.0" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index ca5166a15b0..b3879e9e728 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## 4.1.0 - 2024-02-12 + +### Tuist + +#### Changed + +- Improve verbose logging by logging the workspace, project, and workspace transformations [#5905](https://github.com/tuist/tuist/pull/5905) by [@pepicrft](https://github.com/pepicrft) + +#### Added + +- Support visionOS from the default templates to synthesize resources [#5892](https://github.com/tuist/tuist/pull/5892) by [@PushedCrayon](https://github.com/PushedCrayon) + +#### Fixed + +- Fix integration of Objective C dependencies [#5887](https://github.com/tuist/tuist/pull/5887) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +- no changes + ## 4.0.0-beta.4 - 2024-02-05 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 622a03eb0e9..1d53a7beadf 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.0.0" + public static let version = "4.1.0" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From 7a9aeef14511b6cedbdd5d85012376661492f7fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 12 Feb 2024 19:41:40 +0100 Subject: [PATCH 064/509] Fix caching package manifests (#5914) --- .../Loaders/SwiftPackageManagerGraphLoader.swift | 3 ++- .../TuistSupport/SwiftPackageManager/PackageInfo.swift | 8 ++------ .../SwiftPackageManager/PackageInfoTests.swift | 6 ++++++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift index 8a5b49946ae..ec37b611d35 100644 --- a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift +++ b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift @@ -63,11 +63,12 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi manifestLoader: ManifestLoading ) { self.init( + manifestLoader: manifestLoader, packageSettingsLoader: PackageSettingsLoader(manifestLoader: manifestLoader) ) } - public init( + init( swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController(), packageInfoMapper: PackageInfoMapping = PackageInfoMapper(), manifestLoader: ManifestLoading = ManifestLoader(), diff --git a/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift b/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift index 13d9f5ce9f8..99d5824e1f1 100644 --- a/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift +++ b/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift @@ -553,12 +553,8 @@ extension PackageInfo.Target.Dependency: Codable { var unkeyedContainer = container.nestedUnkeyedContainer(forKey: .product) try unkeyedContainer.encode(name) try unkeyedContainer.encode(package) - if let moduleAliases { - try unkeyedContainer.encode(moduleAliases) - } - if let condition { - try unkeyedContainer.encode(condition) - } + try unkeyedContainer.encode(moduleAliases) + try unkeyedContainer.encode(condition) case let .target(name: name, condition: condition): var unkeyedContainer = container.nestedUnkeyedContainer(forKey: .target) try unkeyedContainer.encode(name) diff --git a/Tests/TuistSupportTests/SwiftPackageManager/PackageInfoTests.swift b/Tests/TuistSupportTests/SwiftPackageManager/PackageInfoTests.swift index abf5d0923e5..09443aacc37 100644 --- a/Tests/TuistSupportTests/SwiftPackageManager/PackageInfoTests.swift +++ b/Tests/TuistSupportTests/SwiftPackageManager/PackageInfoTests.swift @@ -29,6 +29,12 @@ final class PackageInfoTests: XCTestCase { moduleAliases: ["TuistSupport": "InternalTuistSupport"], condition: nil ), + .product( + name: "ArgumentParser", + package: "argument-parser", + moduleAliases: nil, + condition: PackageInfo.PackageConditionDescription(platformNames: ["macOS"], config: nil) + ), ], publicHeadersPath: nil, type: .executable, From 4b8db15cf6837c04891d15a02b46e857e7b2746b Mon Sep 17 00:00:00 2001 From: pepicrft Date: Mon, 12 Feb 2024 18:44:38 +0000 Subject: [PATCH 065/509] [Release] Tuist 4.1.1 --- .mise.toml | 2 +- CHANGELOG.md | 12 ++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index ea31c8b0524..691b9626d12 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.1.0" +tuist = "4.1.1" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index b3879e9e728..049c9cab36e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 4.1.1 - 2024-02-12 + +### Tuist + +#### Fixed + +- Fix caching package manifests [#5914](https://github.com/tuist/tuist/pull/5914) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +- no changes + ## 4.1.0 - 2024-02-12 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 1d53a7beadf..228333a5f74 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.1.0" + public static let version = "4.1.1" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From 4d4d9a0e5dad22f63dfe23f1444823b8272ec79d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 13 Feb 2024 11:37:30 +0100 Subject: [PATCH 066/509] Fix building zstd library (#5916) --- .../SwiftPackageManager/PackageInfoMapper.swift | 2 +- .../SwiftPackageManager/PackageInfoMapperTests.swift | 9 --------- .../LocalSwiftPackageB/Sources/LibraryA/MyStruct.swift | 2 -- fixtures/app_with_spm_dependencies/Package.resolved | 9 +++++++++ fixtures/app_with_spm_dependencies/Package.swift | 1 + 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 590ee077089..a6c81d00bf5 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -1038,7 +1038,7 @@ extension ProjectDescription.Settings { if let moduleMap { switch moduleMap { - case .directory, .custom(_, umbrellaHeaderPath: nil): + case .directory: settingsDictionary["DEFINES_MODULE"] = "NO" case .header, .nestedHeader, .none, .custom: break diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 6533564592e..b09c765bfa8 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -1025,7 +1025,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, customSettings: [ "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Target1/include"], - "DEFINES_MODULE": "NO", ], moduleMap: "$(SRCROOT)/Sources/Target1/include/module.modulemap" ), @@ -1073,9 +1072,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "Target1", basePath: basePath, customSources: .custom(nil), - customSettings: [ - "DEFINES_MODULE": "NO", - ], moduleMap: "$(SRCROOT)/Sources/Target1/module.modulemap" ), ] @@ -1222,7 +1218,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "$(SRCROOT)/Sources/Dependency1/include", "$(SRCROOT)/Sources/Dependency2/include", ], - "DEFINES_MODULE": "NO", ], moduleMap: "$(SRCROOT)/Sources/Target1/include/module.modulemap" ), @@ -1235,7 +1230,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "$(SRCROOT)/Sources/Dependency1/include", "$(SRCROOT)/Sources/Dependency2/include", ], - "DEFINES_MODULE": "NO", ], moduleMap: "$(SRCROOT)/Sources/Dependency1/include/module.modulemap" ), @@ -1244,7 +1238,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, customSettings: [ "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Dependency2/include"], - "DEFINES_MODULE": "NO", ], moduleMap: "$(SRCROOT)/Sources/Dependency2/include/module.modulemap" ), @@ -1333,7 +1326,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "$(SRCROOT)/../Package2/Sources/Dependency1/include", "$(SRCROOT)/../Package3/Sources/Dependency2/include", ], - "DEFINES_MODULE": "NO", ], moduleMap: "$(SRCROOT)/Sources/Target1/include/module.modulemap" ), @@ -1405,7 +1397,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ], customSettings: [ "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Custom/Headers"], - "DEFINES_MODULE": "NO", ], moduleMap: "$(SRCROOT)/Custom/Headers/module.modulemap" ), diff --git a/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryA/MyStruct.swift b/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryA/MyStruct.swift index f214625efe7..d41478e1f40 100644 --- a/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryA/MyStruct.swift +++ b/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryA/MyStruct.swift @@ -1,3 +1 @@ -import AppKit - public struct MyStruct {} diff --git a/fixtures/app_with_spm_dependencies/Package.resolved b/fixtures/app_with_spm_dependencies/Package.resolved index 54b14502db3..a634c909a60 100644 --- a/fixtures/app_with_spm_dependencies/Package.resolved +++ b/fixtures/app_with_spm_dependencies/Package.resolved @@ -215,6 +215,15 @@ "revision" : "79d4dc9729096c6ad83dd3cee2b9f354d1b4ab7b", "version" : "2.5.5" } + }, + { + "identity" : "zstd", + "kind" : "remoteSourceControl", + "location" : "https://github.com/facebook/zstd", + "state" : { + "revision" : "63779c798237346c2b245c546c40b72a5a5913fe", + "version" : "1.5.5" + } } ], "version" : 2 diff --git a/fixtures/app_with_spm_dependencies/Package.swift b/fixtures/app_with_spm_dependencies/Package.swift index c5aace7252a..15f67767f1c 100644 --- a/fixtures/app_with_spm_dependencies/Package.swift +++ b/fixtures/app_with_spm_dependencies/Package.swift @@ -26,6 +26,7 @@ let package = Package( .package(url: "https://github.com/getsentry/sentry-cocoa", .upToNextMajor(from: "8.20.0")), .package(url: "https://github.com/realm/realm-swift", .upToNextMajor(from: "10.46.0")), .package(url: "https://github.com/CocoaLumberjack/CocoaLumberjack", .upToNextMajor(from: "3.8.4")), + .package(url: "https://github.com/facebook/zstd", exact: "1.5.5"), .package(path: "LocalSwiftPackage"), .package(path: "StringifyMacro"), ] From 1d09f6d5f9f4be59c688a5fb3f0d0d70ac6cf3f0 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Tue, 13 Feb 2024 10:45:29 +0000 Subject: [PATCH 067/509] [Release] Tuist 4.1.2 --- .mise.toml | 2 +- CHANGELOG.md | 10 ++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index 691b9626d12..949019eee71 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.1.1" +tuist = "4.1.2" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index 049c9cab36e..4c7fd43ae82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 4.1.2 - 2024-02-13 + +### Tuist + +- no changes + +### Tuist Cloud + +- no changes + ## 4.1.1 - 2024-02-12 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 228333a5f74..be6b0734ac4 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.1.1" + public static let version = "4.1.2" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From bc1e66f4b05f1ea75048eb31e6072c834133e01d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 13 Feb 2024 13:59:52 +0100 Subject: [PATCH 068/509] Throw an abort error (#5919) --- Sources/TuistKit/Utils/Target+PlatformResolution.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Sources/TuistKit/Utils/Target+PlatformResolution.swift b/Sources/TuistKit/Utils/Target+PlatformResolution.swift index 5a8daaa61c7..b515b304243 100644 --- a/Sources/TuistKit/Utils/Target+PlatformResolution.swift +++ b/Sources/TuistKit/Utils/Target+PlatformResolution.swift @@ -1,7 +1,10 @@ import Foundation import TuistGraph +import TuistSupport + +struct UnspecifiedPlatformError: FatalError, CustomStringConvertible { + var type: TuistSupport.ErrorType = .abort -struct UnspecifiedPlatformError: Error, CustomStringConvertible { let target: Target var description: String { "Only single platform targets supported. The target \(target.name) specifies multiple supported platforms (\(target.supportedPlatforms.map(\.rawValue).joined(separator: ", ")))." From cacc9f537671567d48dde3624339d37235adb52c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 13 Feb 2024 18:58:09 +0100 Subject: [PATCH 069/509] Remove Mockable from the list of targets that depend on XCTest (#5923) --- Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index a6c81d00bf5..5a05e4026b9 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -433,7 +433,6 @@ public final class PackageInfoMapper: PackageInfoMapping { "TSCTestSupport", // https://github.com/apple/swift-tools-support-core "ViewInspector", // https://github.com/nalexn/ViewInspector "XCTVapor", // https://github.com/vapor/vapor - "Mockable", // https://github.com/Kolos65/Mockable.git "MockableTest", // https://github.com/Kolos65/Mockable.git ].map { ($0, ["ENABLE_TESTING_SEARCH_PATHS": "YES"]) From 46187c4dbf53760ff7addf73741d92927ae37743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 14 Feb 2024 15:32:04 +0100 Subject: [PATCH 070/509] Update the self-host Tuist Cloud tutorial to with the new variable names (#5924) --- .../enterprise-environment.tutorial | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial b/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial index 6db888d1565..b804d92f840 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial @@ -70,15 +70,15 @@ Tuist Cloud needs storage to house artifacts uploaded through the API. It's **essential to configure one of the supported storage solutions** for Tuist Cloud to operate effectively. - #### AWS + #### S3-Compliant storages | Environment variable | Description | Required | Default | Example | | --- | --- | --- | --- | --- | - | TUIST_AWS_ACCESS_KEY_ID | The access key identifier | Yes | | `AKIAA2LQP3CCOZ6WT6CF` | - | TUIST_AWS_SECRET_ACCESS_KEY | The access key secret | Yes | | `A2dAWLnB4k3px9DVunCsnV1fap/zkTx8+lIVcqry` | - | TUIST_AWS_BUCKET_NAME | Name of the AWS bucket | Yes | | `my-bucket` | - | TUIST_AWS_REGION | The bucket's AWS region | No | `eu-west-1` | `us-east-1` | - | TUIST_AWS_ENDPOINT | Custom AWS endpoint | No | `https://amazonaws.com` | `https://custom-domain.com` | + | TUIST_S3_ACCESS_KEY_ID | The access key identifier | Yes | | `AKIAA2LQP3CCOZ6WT6CF` | + | TUIST_S3_SECRET_ACCESS_KEY | The access key secret | Yes | | `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` | + | TUIST_S3_BUCKET_NAME | Name of the bucket | Yes | | `my-bucket` | + | TUIST_S3_REGION | The bucket's region | No | `eu-west-1` | `us-east-1` | + | TUIST_S3_ENDPOINT | Custom endpoint | No | `https://amazonaws.com` | `https://custom-domain.com` | } From a7f59f22beb9641069bbaa9f1e255ea8339d9e29 Mon Sep 17 00:00:00 2001 From: Antti Laitala <133648611+anlaital-oura@users.noreply.github.com> Date: Wed, 14 Feb 2024 16:32:22 +0200 Subject: [PATCH 071/509] Improve performance by replacing globing with FileManager when finding resource files (#5922) * Replace globing with FileManager when finding resource files * Fix unit tests * Lint --- .../PackageInfoMapper.swift | 8 ++-- .../Utils/ManifestFilesLocator.swift | 32 ++++----------- Sources/TuistSupport/Utils/FileHandler.swift | 41 +++++++++++++++++++ .../TestCase/TuistTestCase.swift | 12 ++++++ .../WorkspaceStructureGeneratorTests.swift | 4 ++ .../PackageInfoMapperTests.swift | 9 +--- 6 files changed, 71 insertions(+), 35 deletions(-) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 5a05e4026b9..30af89c8728 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -845,19 +845,17 @@ extension ResourceFileElements { // These files are automatically added as resource if they are inside targets directory. // Check https://developer.apple.com/documentation/swift_packages/bundling_resources_with_a_swift_package - private static let defaultSpmResourceFileExtensions = [ + private static let defaultSpmResourceFileExtensions = Set([ "xib", "storyboard", "xcdatamodeld", "xcmappingmodel", "xcassets", "strings", - ] + ]) private static func defaultResourcePaths(from path: AbsolutePath) -> [AbsolutePath] { - ResourceFileElements.defaultSpmResourceFileExtensions.flatMap { - FileHandler.shared.glob(path, glob: "**/*.\($0)") - } + Array(FileHandler.shared.files(in: path, nameFilter: nil, extensionFilter: defaultSpmResourceFileExtensions)) } } diff --git a/Sources/TuistLoader/Utils/ManifestFilesLocator.swift b/Sources/TuistLoader/Utils/ManifestFilesLocator.swift index eb1645f3d79..a6c0488180a 100644 --- a/Sources/TuistLoader/Utils/ManifestFilesLocator.swift +++ b/Sources/TuistLoader/Utils/ManifestFilesLocator.swift @@ -102,31 +102,17 @@ public final class ManifestFilesLocator: ManifestFilesLocating { Manifest.plugin.fileName(path), ] - var tuistManifestsFilePaths = [AbsolutePath]() - - let enumerator = FileManager.default.enumerator( - at: path.url, - includingPropertiesForKeys: nil, - options: [.skipsHiddenFiles, .skipsPackageDescendants] - ) - - while let candidateURL = enumerator?.nextObject() as? URL { - guard candidateURL.pathExtension == "swift", - fileNamesCandidates.contains(candidateURL.lastPathComponent) - else { - continue - } - // Symlinks need to be resolved for resulting absolute URLs to point to the right place. - let url = candidateURL.resolvingSymlinksInPath() - let absolutePath = AbsolutePath(stringLiteral: url.path) - if hasValidManifestContent(absolutePath) { - tuistManifestsFilePaths.append(absolutePath) - } + let tuistManifestsFilePaths = FileHandler.shared.files( + in: path, + nameFilter: fileNamesCandidates, + extensionFilter: ["swift"] + ).filter { + hasValidManifestContent($0) } - let cachedTuistManifestsFilePaths = Set(tuistManifestsFilePaths) - cacheTuistManifestsFilePaths[path] = cachedTuistManifestsFilePaths - return cachedTuistManifestsFilePaths + cacheTuistManifestsFilePaths[path] = tuistManifestsFilePaths + + return tuistManifestsFilePaths } private func hasValidManifestContent(_ path: AbsolutePath) -> Bool { diff --git a/Sources/TuistSupport/Utils/FileHandler.swift b/Sources/TuistSupport/Utils/FileHandler.swift index e55364e2ab1..b5d690ac056 100644 --- a/Sources/TuistSupport/Utils/FileHandler.swift +++ b/Sources/TuistSupport/Utils/FileHandler.swift @@ -62,6 +62,7 @@ public protocol FileHandling: AnyObject { func write(_ content: String, path: AbsolutePath, atomically: Bool) throws func locateDirectoryTraversingParents(from: AbsolutePath, path: String) -> AbsolutePath? func locateDirectory(_ path: String, traversingFrom from: AbsolutePath) throws -> AbsolutePath? + func files(in path: AbsolutePath, nameFilter: Set?, extensionFilter: Set?) -> Set func glob(_ path: AbsolutePath, glob: String) -> [AbsolutePath] func throwingGlob(_ path: AbsolutePath, glob: String) throws -> [AbsolutePath] func linkFile(atPath: AbsolutePath, toPath: AbsolutePath) throws @@ -210,6 +211,46 @@ public class FileHandler: FileHandling { } } + public func files( + in path: AbsolutePath, + nameFilter: Set?, + extensionFilter: Set? + ) -> Set { + var results = Set() + + let enumerator = fileManager.enumerator( + at: path.url, + includingPropertiesForKeys: nil, + options: [.skipsHiddenFiles, .skipsPackageDescendants] + ) + + func filter(candidateURL: URL) -> Bool { + if let extensionFilter { + guard extensionFilter.contains(candidateURL.pathExtension) else { + return false + } + } + if let nameFilter { + guard nameFilter.contains(candidateURL.lastPathComponent) else { + return false + } + } + return true + } + + while let candidateURL = enumerator?.nextObject() as? Foundation.URL { + guard filter(candidateURL: candidateURL) else { + continue + } + // Symlinks need to be resolved for resulting absolute URLs to point to the right place. + let url = candidateURL.resolvingSymlinksInPath() + let absolutePath = AbsolutePath(stringLiteral: url.path) + results.insert(absolutePath) + } + + return results + } + public func glob(_ path: AbsolutePath, glob: String) -> [AbsolutePath] { path.glob(glob) } diff --git a/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift b/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift index 5925c6b2188..e4351d2d297 100644 --- a/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift +++ b/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift @@ -91,6 +91,18 @@ public final class MockFileHandler: FileHandler { try closure(temporaryDirectory()) } + public var stubFiles: ((AbsolutePath, Set?, Set?) -> Set)? + override public func files( + in path: AbsolutePath, + nameFilter: Set?, + extensionFilter: Set? + ) -> Set { + guard let stubFiles else { + return super.files(in: path, nameFilter: nameFilter, extensionFilter: extensionFilter) + } + return stubFiles(path, nameFilter, extensionFilter) + } + public var stubGlob: ((AbsolutePath, String) -> [AbsolutePath])? override public func glob(_ path: AbsolutePath, glob: String) -> [AbsolutePath] { guard let stubGlob else { diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift index 821f30a9221..aa9a666b7b2 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift @@ -389,6 +389,10 @@ final class WorkspaceStructureGeneratorTests: XCTestCase { func inTemporaryDirectory(_: @escaping (AbsolutePath) async throws -> Void) async throws {} + func files(in _: AbsolutePath, nameFilter _: Set?, extensionFilter _: Set?) -> Set { + [] + } + func glob(_: AbsolutePath, glob _: String) -> [AbsolutePath] { [] } diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index b09c765bfa8..7a91c0222d5 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -936,13 +936,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { let sourcesPath = basePath.appending(try RelativePath(validating: "Package/Sources/Target1")) let defaultResourcePath = sourcesPath.appending(try RelativePath(validating: "Resources/file.xib")) try fileHandler.createFolder(sourcesPath) - fileHandler.stubGlob = { path, glob in - XCTAssertEqual(path, sourcesPath) - if glob == "**/*.xib" { - return [defaultResourcePath] - } else { - return [] - } + fileHandler.stubFiles = { _, _, _ in + return [defaultResourcePath] } let project = try subject.map( From 0e50f944386c1898e0ce739eed69d9d264298cfe Mon Sep 17 00:00:00 2001 From: fess Date: Wed, 14 Feb 2024 14:33:34 +0000 Subject: [PATCH 072/509] fix: remove swifter (#5927) Co-authored-by: Stefan Fessler --- Package.resolved | 8 - Package.swift | 3 - Project.swift | 1 - .../Utils/HTTPRedirectListener.swift | 137 ------------------ .../Utils/MockHTTPRedirectListener.swift | 21 --- .../Utils/HTTPRedirectListenerTests.swift | 31 ---- Tuist/Dependencies/Lockfiles/Package.resolved | 8 - 7 files changed, 209 deletions(-) delete mode 100644 Sources/TuistSupport/Utils/HTTPRedirectListener.swift delete mode 100644 Sources/TuistSupportTesting/Utils/MockHTTPRedirectListener.swift delete mode 100644 Tests/TuistSupportTests/Utils/HTTPRedirectListenerTests.swift diff --git a/Package.resolved b/Package.resolved index 201907eb60b..0cd94db3c23 100644 --- a/Package.resolved +++ b/Package.resolved @@ -198,14 +198,6 @@ "version" : "0.6.1" } }, - { - "identity" : "swifter", - "kind" : "remoteSourceControl", - "location" : "https://github.com/httpswift/swifter.git", - "state" : { - "revision" : "1e4f51c92d7ca486242d8bf0722b99de2c3531aa" - } - }, { "identity" : "swiftgen", "kind" : "remoteSourceControl", diff --git a/Package.swift b/Package.swift index e8f41813861..3f471ae9727 100644 --- a/Package.swift +++ b/Package.swift @@ -6,7 +6,6 @@ let swiftToolsSupportDependency: Target.Dependency = .product(name: "SwiftToolsS let loggingDependency: Target.Dependency = .product(name: "Logging", package: "swift-log") let argumentParserDependency: Target.Dependency = .product(name: "ArgumentParser", package: "swift-argument-parser") let swiftGenKitDependency: Target.Dependency = .product(name: "SwiftGenKit", package: "SwiftGen") -let swifterDependency: Target.Dependency = .product(name: "Swifter", package: "swifter") let combineExtDependency: Target.Dependency = .byName(name: "CombineExt") var targets: [Target] = [ @@ -118,7 +117,6 @@ var targets: [Target] = [ swiftToolsSupportDependency, loggingDependency, "KeychainAccess", - swifterDependency, "ZIPFoundation", "ProjectDescription", "Mockable", @@ -423,7 +421,6 @@ let package = Package( .package(url: "https://github.com/FabrizioBrancati/Queuer", from: "2.1.1"), .package(url: "https://github.com/Flight-School/AnyCodable", from: "0.6.7"), .package(url: "https://github.com/weichsel/ZIPFoundation", from: "0.9.17"), - .package(url: "https://github.com/httpswift/swifter.git", revision: "1e4f51c92d7ca486242d8bf0722b99de2c3531aa"), .package(url: "https://github.com/kishikawakatsumi/KeychainAccess", from: "4.2.2"), .package(url: "https://github.com/stencilproject/Stencil", exact: "0.15.1"), .package(url: "https://github.com/SwiftDocOrg/GraphViz", exact: "0.2.0"), diff --git a/Project.swift b/Project.swift index 4592e8fe7d4..58d9eb45597 100644 --- a/Project.swift +++ b/Project.swift @@ -85,7 +85,6 @@ func targets() -> [Target] { .external(name: "CombineExt"), .external(name: "Logging"), .external(name: "ZIPFoundation"), - .external(name: "Swifter"), .external(name: "Difference"), ], testingDependencies: [ diff --git a/Sources/TuistSupport/Utils/HTTPRedirectListener.swift b/Sources/TuistSupport/Utils/HTTPRedirectListener.swift deleted file mode 100644 index 5d516fe853a..00000000000 --- a/Sources/TuistSupport/Utils/HTTPRedirectListener.swift +++ /dev/null @@ -1,137 +0,0 @@ -import Foundation -import Swifter -import TSCBasic - -public protocol HTTPRedirectListening: Any { - /// Starts an HTTP server at the given port and blocks the process until a request is sent to the given path. - /// - Parameters: - /// - port: Port for the HTTP server. - /// - path: Path we are expecting the browser to redirect the user to. - /// - redirectMessage: Text returned to the browser when it redirects the user to the given path. - /// - logoURL: The logo to show in the redirect page. - /// - Returns: Either the query parameterrs of the redirect URL, or an error if the HTTP server fails to start. - func listen(port: UInt16, path: String, redirectMessage: String, logoURL: URL) -> Swift - .Result<[String: String]?, HTTPRedirectListenerError> -} - -public enum HTTPRedirectListenerError: FatalError { - case httpServer(Error) - - /// Error type. - public var type: ErrorType { - switch self { - case .httpServer: return .abort - } - } - - /// Error description. - public var description: String { - switch self { - case let .httpServer(error): - return "The redirect HTTP server faild to start with the following error: \(error)." - } - } -} - -private var runningSemaphore: DispatchSemaphore! - -public final class HTTPRedirectListener: HTTPRedirectListening { - private let signalHandler: SignalHandling - - /// Default initializer. - public init(signalHandler: SignalHandling = SignalHandler()) { - self.signalHandler = signalHandler - } - - // MARK: - HTTPRedirectListening - - public func listen( - port: UInt16, - path: String, - redirectMessage: String, - logoURL: URL - ) -> Swift.Result<[String: String]?, HTTPRedirectListenerError> { - precondition( - runningSemaphore == nil, - "Trying to start a redirect server for localhost:\(port)\(path) when there's already one running." - ) - let httpServer = HttpServer() - var result: Swift.Result<[String: String]?, HTTPRedirectListenerError> = .success(nil) - - runningSemaphore = DispatchSemaphore(value: 0) - httpServer[path] = { request in - result = .success(request.queryParams.reduce(into: [String: String]()) { $0[$1.0] = $1.1 }) - DispatchQueue.global().async { runningSemaphore?.signal() } - return HttpResponse.ok(.html(self.html(logoURL: logoURL, redirectMessage: redirectMessage))) - } - - // Stop the server if the user sends an interruption signal by pressing CTRL+C - signalHandler.trap { _ in - runningSemaphore.signal() - } - - do { - logger.pretty("Press \(.keystroke("CTRL + C")) once to cancel the process.") - try httpServer.start(port) - runningSemaphore.wait() - } catch { - result = .failure(.httpServer(error)) - } - - runningSemaphore = nil - return result - } - - private func html(logoURL: URL, redirectMessage: String) -> String { - """ - - - - - - - Redirecting - - - - - -
    - - -
    -
    -
    -

    - Open your terminal 👩‍💻 -

    -
    -

    - \(redirectMessage) -

    -
    - -
    -
    - - - - """ - } -} diff --git a/Sources/TuistSupportTesting/Utils/MockHTTPRedirectListener.swift b/Sources/TuistSupportTesting/Utils/MockHTTPRedirectListener.swift deleted file mode 100644 index 57180f77b8c..00000000000 --- a/Sources/TuistSupportTesting/Utils/MockHTTPRedirectListener.swift +++ /dev/null @@ -1,21 +0,0 @@ -import Foundation -@testable import TuistSupport - -public final class MockHTTPRedirectListener: HTTPRedirectListening { - public init() {} - - public var listenStub: ((UInt16, String, String, URL) -> Swift.Result<[String: String]?, HTTPRedirectListenerError>)? - - public func listen( - port: UInt16, - path: String, - redirectMessage: String, - logoURL: URL - ) -> Swift.Result<[String: String]?, HTTPRedirectListenerError> { - if let listenStub { - return listenStub(port, path, redirectMessage, logoURL) - } else { - return Result.failure(.httpServer(TestError("non-stubbed called to listen"))) - } - } -} diff --git a/Tests/TuistSupportTests/Utils/HTTPRedirectListenerTests.swift b/Tests/TuistSupportTests/Utils/HTTPRedirectListenerTests.swift deleted file mode 100644 index 986e1c0b0f0..00000000000 --- a/Tests/TuistSupportTests/Utils/HTTPRedirectListenerTests.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupport -@testable import TuistSupportTesting - -final class HTTPRedirectListenerErrorTests: XCTestCase { - func test_type_when_httpServer() { - // Given - let error = TestError("error") - let subject = HTTPRedirectListenerError.httpServer(error) - - // When - let got = subject.type - - // Then - XCTAssertEqual(got, .abort) - } - - func test_description_when_httpServer() { - // Given - let error = TestError("error") - let subject = HTTPRedirectListenerError.httpServer(error) - - // When - let got = subject.description - - // Then - XCTAssertEqual(got, "The redirect HTTP server faild to start with the following error: \(error).") - } -} diff --git a/Tuist/Dependencies/Lockfiles/Package.resolved b/Tuist/Dependencies/Lockfiles/Package.resolved index 9114049c75c..f5464732a5b 100644 --- a/Tuist/Dependencies/Lockfiles/Package.resolved +++ b/Tuist/Dependencies/Lockfiles/Package.resolved @@ -198,14 +198,6 @@ "version" : "0.6.1" } }, - { - "identity" : "swifter", - "kind" : "remoteSourceControl", - "location" : "https://github.com/httpswift/swifter.git", - "state" : { - "revision" : "1e4f51c92d7ca486242d8bf0722b99de2c3531aa" - } - }, { "identity" : "swiftgen", "kind" : "remoteSourceControl", From 92970222bfa7a0e5fab9a56a86623907d375c4f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 14 Feb 2024 15:34:29 +0100 Subject: [PATCH 073/509] Fix runtime error when using objc dependencies (#5929) --- .../Mappers/ModuleMapMapper.swift | 31 +++++++++++++++++++ .../ProjectMappers/ModuleMapMapperTests.swift | 3 ++ .../App/Sources/AppKit/AppKit.swift | 2 +- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift index 105a3ec4181..1a4b55cd574 100644 --- a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift +++ b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift @@ -49,6 +49,7 @@ enum ModuleMapMapperError: FatalError { public final class ModuleMapMapper: WorkspaceMapping { private static let modulemapFileSetting = "MODULEMAP_FILE" private static let otherCFlagsSetting = "OTHER_CFLAGS" + private static let otherLinkerFlagsSetting = "OTHER_LDFLAGS" private static let otherSwiftFlagsSetting = "OTHER_SWIFT_FLAGS" private static let headerSearchPaths = "HEADER_SEARCH_PATHS" @@ -119,6 +120,14 @@ public final class ModuleMapMapper: WorkspaceMapping { mappedSettingsDictionary[Self.headerSearchPaths] = updatedHeaderSearchPaths } + if let updatedOtherLinkerFlags = Self.updatedOtherLinkerFlags( + targetID: targetID, + oldOtherLinkerFlags: mappedSettingsDictionary[Self.otherLinkerFlagsSetting], + targetToModuleMaps: targetToModuleMaps + ) { + mappedSettingsDictionary[Self.otherLinkerFlagsSetting] = updatedOtherLinkerFlags + } + let targetSettings = mappedTarget.settings ?? Settings( base: [:], configurations: [:], @@ -296,4 +305,26 @@ public final class ModuleMapMapper: WorkspaceMapping { return .array(mappedOtherCFlags) } + + private static func updatedOtherLinkerFlags( + targetID: TargetID, + oldOtherLinkerFlags: SettingsDictionary.Value?, + targetToModuleMaps: [TargetID: Set] + ) -> SettingsDictionary.Value? { + guard let dependenciesModuleMaps = targetToModuleMaps[targetID], !dependenciesModuleMaps.isEmpty else { return nil } + + var mappedOtherLinkerFlags: [String] + switch oldOtherLinkerFlags ?? .array(["$(inherited)"]) { + case let .array(values): + mappedOtherLinkerFlags = values + case let .string(value): + mappedOtherLinkerFlags = value.split(separator: " ").map(String.init) + } + + if !mappedOtherLinkerFlags.contains("-ObjC") { + mappedOtherLinkerFlags.append("-ObjC") + } + + return .array(mappedOtherLinkerFlags) + } } diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift index 4cf36e222c6..7c6761b4ad5 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift @@ -95,6 +95,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { "-fmodule-map-file=$(SRCROOT)/../B/B2/B2.module", ]), "HEADER_SEARCH_PATHS": .array(["$(inherited)", "$(SRCROOT)/../B/B1", "$(SRCROOT)/../B/B2"]), + "OTHER_LDFLAGS": .array(["$(inherited)", "-ObjC"]), ]), dependencies: [ .project(target: "B1", path: projectBPath), @@ -114,6 +115,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { "OTHER_CFLAGS": .array(["$(inherited)", "-fmodule-map-file=$(SRCROOT)/B2/B2.module"]), "OTHER_SWIFT_FLAGS": .array(["$(inherited)", "-Xcc", "-fmodule-map-file=$(SRCROOT)/B2/B2.module"]), "HEADER_SEARCH_PATHS": .array(["$(inherited)", "$(SRCROOT)/B2"]), + "OTHER_LDFLAGS": .array(["$(inherited)", "-ObjC"]), ]), dependencies: [ .target(name: "B2"), @@ -205,6 +207,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { "-fmodule-map-file=$(SRCROOT)/../B/B/B.module", ]), "HEADER_SEARCH_PATHS": .array(["$(inherited)", "$(SRCROOT)/../B/B"]), + "OTHER_LDFLAGS": .array(["$(inherited)", "-ObjC"]), ], configurations: [:], defaultSettings: .recommended diff --git a/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift b/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift index 00d052cfdb8..58d171118ae 100644 --- a/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift +++ b/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift @@ -23,7 +23,7 @@ public enum AppKit { _ = YAMLEncoder() // Use GoogleSignIn - _ = GIDSignIn.sharedInstance.configuration + _ = GIDSignIn.sharedInstance.hasPreviousSignIn() // Use Sentry SentrySDK.startSession() From db5a573482941605cd6ea47f3479335f282fb42d Mon Sep 17 00:00:00 2001 From: Even Gabrielsen Date: Wed, 14 Feb 2024 15:34:45 +0100 Subject: [PATCH 074/509] Automatically group local packages to `Packages` group (#5876) * Add option for specifying local packages group name * Group local packages into Packages group * Rename test path to make it distinct from group * Fix linter warning --------- Co-authored-by: Daniele Formichelli --- .../ProjectDescriptorGenerator.swift | 8 ++++- .../ProjectDescriptorGeneratorTests.swift | 30 +++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift index 7a1e02aecbe..128cae9fbb2 100644 --- a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift @@ -269,7 +269,13 @@ final class ProjectDescriptorGenerator: ProjectDescriptorGenerating { ) pbxproj.add(object: reference) - try pbxproj.rootGroup()?.children.append(reference) + + if let existingPackageGroup = try pbxproj.rootGroup()?.group(named: "Packages") { + existingPackageGroup.children.append(reference) + } else { + let packageGroup = try pbxproj.rootGroup()?.addGroup(named: "Packages", options: .withoutFolder) + packageGroup?.first?.children.append(reference) + } case let .remote(url: url, requirement: requirement): let packageReference = XCRemoteSwiftPackageReference( diff --git a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift index 82ae596bc0a..c901b1f6be6 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift @@ -335,10 +335,33 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { XCTAssertEqual(pbxProject.developmentRegion, "de") } + func test_generate_localSwiftPackageGroup() throws { + // Given + let project = Project.test( + packages: [ + .local(path: try AbsolutePath(validating: "/LocalPackages/LocalPackageA")), + .local(path: try AbsolutePath(validating: "/LocalPackages/LocalPackageB")), + ] + ) + + let graph = Graph.test(projects: [project.path: project]) + let graphTraverser = GraphTraverser(graph: graph) + + // When + let got = try subject.generate(project: project, graphTraverser: graphTraverser) + + // Then + let pbxproj = got.xcodeProj.pbxproj + let rootGroup = try XCTUnwrap(pbxproj.rootGroup()) + let packagesGroup = rootGroup.group(named: "Packages") + let packages = try XCTUnwrap(packagesGroup?.children) + XCTAssertEqual(packages.map(\.name), ["LocalPackageA", "LocalPackageB"]) + } + func test_generate_localSwiftPackagePaths() throws { // Given let projectPath = try AbsolutePath(validating: "/Project") - let localPackagePath = try AbsolutePath(validating: "/Packages/LocalPackageA") + let localPackagePath = try AbsolutePath(validating: "/LocalPackages/LocalPackageA") let project = Project.test( path: projectPath, sourceRootPath: projectPath, @@ -375,9 +398,10 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { // Then let pbxproj = got.xcodeProj.pbxproj let rootGroup = try XCTUnwrap(pbxproj.rootGroup()) - let paths = rootGroup.children.compactMap(\.path) + let packageGroup = try XCTUnwrap(rootGroup.group(named: "Packages")) + let paths = packageGroup.children.compactMap(\.path) XCTAssertEqual(paths, [ - "../Packages/LocalPackageA", + "../LocalPackages/LocalPackageA", ]) } From 61e43feb1507166feee6c037a96e347c6aa472ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 14 Feb 2024 17:04:59 +0100 Subject: [PATCH 075/509] Fix external platform narrowing when there is a dependency platform condition (#5931) --- Sources/TuistCore/Graph/GraphTraverser.swift | 13 +++++++----- .../Graph/GraphTraverserTests.swift | 21 ++++++++++++++++++- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index 3bd232a9aa8..5ea1165db68 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -827,8 +827,8 @@ public class GraphTraverser: GraphTraversing { for dependencyTargetReference in dependencies { var platformsToInsert: Set? - let dependencyTarget = dependencyTargetReference.graphTarget + let inheritedPlatforms = dependencyTarget.target.product == .macro ? Set([.macOS]) : parentPlatforms if let dependencyCondition = dependencyTargetReference.condition, let platformIntersection = PlatformCondition.when(target.target.dependencyPlatformFilters)? .intersection(dependencyCondition) @@ -838,13 +838,16 @@ public class GraphTraverser: GraphTraversing { break case let .condition(condition): if let condition { - let dependencyPlatforms: [Platform] = condition.platformFilters.map(\.platform).filter { $0 != nil } - .map { $0! } - platformsToInsert = Set(dependencyPlatforms) + let dependencyPlatforms = Set( + condition.platformFilters.map(\.platform) + .filter { $0 != nil } + .map { $0! } + ) + .intersection(inheritedPlatforms) + platformsToInsert = dependencyPlatforms } } } else { - let inheritedPlatforms = dependencyTarget.target.product == .macro ? Set([.macOS]) : parentPlatforms platformsToInsert = inheritedPlatforms.intersection(dependencyTarget.target.supportedPlatforms) } diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index 05b3354988d..7c6a2d3641c 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -4963,12 +4963,22 @@ final class GraphTraverserTests: TuistUnitTestCase { destinations: [.iPad, .iPhone, .appleWatch, .appleTv, .mac], product: .framework ) + let externalPackageTargetB = Target.test( + name: "PackageB", + destinations: [.iPad, .iPhone, .appleWatch, .appleTv, .mac], + product: .framework + ) let project = Project.test(path: directory, targets: [appTarget]) - let externalProject = Project.test(path: packagesDirectory, targets: [externalPackage], isExternal: true) + let externalProject = Project.test( + path: packagesDirectory, + targets: [externalPackage, externalPackageTargetB], + isExternal: true + ) let appTargetDependency = GraphDependency.target(name: appTarget.name, path: project.path) let externalPackageDependency = GraphDependency.target(name: externalPackage.name, path: externalProject.path) + let externalPackageBDependency = GraphDependency.target(name: externalPackageTargetB.name, path: externalProject.path) let graph = Graph.test( projects: [ @@ -4981,10 +4991,15 @@ final class GraphTraverserTests: TuistUnitTestCase { ], externalProject.path: [ externalPackage.name: externalPackage, + externalPackageTargetB.name: externalPackageTargetB, ], ], dependencies: [ appTargetDependency: Set([externalPackageDependency]), + externalPackageDependency: Set([externalPackageBDependency]), + ], + dependencyConditions: [ + GraphEdge(from: externalPackageDependency, to: externalPackageBDependency): .when([.ios, .macos])!, ] ) @@ -4997,6 +5012,10 @@ final class GraphTraverserTests: TuistUnitTestCase { got[GraphTarget(path: externalProject.path, target: externalPackage, project: externalProject)], Set([.iOS]) ) + XCTAssertEqual( + got[GraphTarget(path: externalProject.path, target: externalPackageTargetB, project: externalProject)], + Set([.iOS]) + ) } func test_test_externalTargetSupportedPlatforms_when_external_transitive_dependency_without_platform_filter() async throws { From f3b9ba73f0138b1d5941f51f085c814553556d4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 14 Feb 2024 18:15:19 +0100 Subject: [PATCH 076/509] Fix integration of objc dependencies with resources (#5932) --- .../Mappers/ResourcesProjectMapper.swift | 3 +- ...wiftPackageManagerModuleMapGenerator.swift | 22 +----- .../ResourcesProjectMapperTests.swift | 71 ++++++++++++++----- .../App/Sources/AppKit/AppKit.swift | 2 +- 4 files changed, 58 insertions(+), 40 deletions(-) diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 7e22e65ea4c..6f8f7495797 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -31,6 +31,7 @@ public class ResourcesProjectMapper: ProjectMapping { public func mapTarget(_ target: Target, project: Project) throws -> ([Target], [SideEffectDescriptor]) { if target.resources.isEmpty, target.coreDataModels.isEmpty { return ([target], []) } + var additionalTargets: [Target] = [] var sideEffects: [SideEffectDescriptor] = [] @@ -63,7 +64,7 @@ public class ResourcesProjectMapper: ProjectMapping { additionalTargets.append(resourcesTarget) } - if target.supportsSources { + if target.supportsSources, target.sources.contains(where: { $0.path.extension == "swift" }) { let (filePath, data) = synthesizedFile(bundleName: bundleName, target: target, project: project) let hash = try data.map(contentHasher.hash) diff --git a/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift b/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift index 5d407bb7e2a..b3b1fbab792 100644 --- a/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift +++ b/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift @@ -78,27 +78,7 @@ public final class SwiftPackageManagerModuleMapGenerator: SwiftPackageManagerMod // User defined modulemap exists, use it return .custom(customModuleMapPath, umbrellaHeaderPath: nil) } else if FileHandler.shared.exists(publicHeadersPath) { - // We move the umbrella headers directory to a different location for CocoaLumberjack. Somehow, the one used by - // default is not properly recognized even if the path in the `modulemap` is correct. - // If the directory is copied to a different location, it works. - if sanitizedModuleName == "CocoaLumberjack" { - let copiedPublicHeadersPath = publicHeadersPath.parentDirectory.appending(component: "tuist-public-headers") - if !FileHandler.shared.exists(copiedPublicHeadersPath) { - try FileHandler.shared.copy(from: publicHeadersPath, to: copiedPublicHeadersPath) - } - let generatedModuleMapContent = - """ - module \(sanitizedModuleName) { - umbrella "\(copiedPublicHeadersPath.pathString)" - export * - } - """ - let generatedModuleMapPath = publicHeadersPath.appending(component: "\(moduleName).modulemap") - try FileHandler.shared.write(generatedModuleMapContent, path: generatedModuleMapPath, atomically: true) - return .directory(moduleMapPath: generatedModuleMapPath, umbrellaDirectory: copiedPublicHeadersPath) - } - - // Otherwise, consider the public headers folder as umbrella directory + // Consider the public headers folder as umbrella directory let generatedModuleMapContent = """ module \(sanitizedModuleName) { diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index b2a0f7b79ca..0e190215a8d 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -33,7 +33,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { func test_map_when_a_target_that_has_resources_and_doesnt_supports_them() throws { // Given let resources: [ResourceFileElement] = [.file(path: "/image.png")] - let target = Target.test(product: .staticLibrary, resources: resources) + let target = Target.test(product: .staticLibrary, sources: ["/Absolute/File.swift"], resources: resources) project = Project.test(targets: [target]) // Got @@ -61,9 +61,9 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.count, 0) - XCTAssertEqual(gotTarget.sources.count, 1) - XCTAssertEqual(gotTarget.sources.first?.path, expectedPath) - XCTAssertNotNil(gotTarget.sources.first?.contentHash) + XCTAssertEqual(gotTarget.sources.count, 2) + XCTAssertEqual(gotTarget.sources.last?.path, expectedPath) + XCTAssertNotNil(gotTarget.sources.last?.contentHash) XCTAssertEqual(gotTarget.dependencies.count, 1) XCTAssertEqual( gotTarget.dependencies.first, @@ -101,13 +101,50 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual(project, gotProject) XCTAssertEqual(gotSideEffects, []) } + + func testMap_whenNoSwiftSources() throws { + // Given + let resources: [ResourceFileElement] = [.file(path: "/image.png")] + let target = Target.test(product: .staticLibrary, sources: ["/Absolute/File.m"], resources: resources) + project = Project.test( + targets: [target] + ) + + // Got + let (gotProject, gotSideEffects) = try subject.map(project: project) + + // Then: Side effects + XCTAssertEqual(gotSideEffects, []) + XCTAssertEqual(gotProject.targets.count, 2) + + let gotTarget = try XCTUnwrap(gotProject.targets.first) + XCTAssertEqual(gotTarget.name, target.name) + XCTAssertEqual(gotTarget.product, target.product) + XCTAssertEqual(gotTarget.resources.count, 0) + XCTAssertEqual(gotTarget.sources.count, 1) + XCTAssertEqual(gotTarget.dependencies.count, 1) + XCTAssertEqual( + gotTarget.dependencies.first, + TargetDependency.target(name: "\(project.name)_\(target.name)", condition: .when([.ios])) + ) + + + let resourcesTarget = try XCTUnwrap(gotProject.targets.last) + XCTAssertEqual(resourcesTarget.name, "\(project.name)_\(target.name)") + XCTAssertEqual(resourcesTarget.product, .bundle) + XCTAssertEqual(resourcesTarget.destinations, target.destinations) + XCTAssertEqual(resourcesTarget.bundleId, "\(target.bundleId).resources") + XCTAssertEqual(resourcesTarget.deploymentTargets, target.deploymentTargets) + XCTAssertEqual(resourcesTarget.filesGroup, target.filesGroup) + XCTAssertEqual(resourcesTarget.resources, resources) + } func test_map_when_a_target_that_has_core_data_models_and_doesnt_supports_them() throws { // Given let coreDataModels: [CoreDataModel] = [CoreDataModel(path: "/data.xcdatamodeld", versions: ["/data.xcdatamodeld"], currentVersion: "1")] - let target = Target.test(product: .staticLibrary, coreDataModels: coreDataModels) + let target = Target.test(product: .staticLibrary, sources: ["/Absolute/File.swift"], coreDataModels: coreDataModels) project = Project.test(targets: [target]) // Got @@ -135,9 +172,9 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.count, 0) - XCTAssertEqual(gotTarget.sources.count, 1) - XCTAssertEqual(gotTarget.sources.first?.path, expectedPath) - XCTAssertNotNil(gotTarget.sources.first?.contentHash) + XCTAssertEqual(gotTarget.sources.count, 2) + XCTAssertEqual(gotTarget.sources.last?.path, expectedPath) + XCTAssertNotNil(gotTarget.sources.last?.contentHash) XCTAssertEqual(gotTarget.dependencies.count, 1) XCTAssertEqual( gotTarget.dependencies.first, @@ -157,7 +194,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { func test_map_when_a_target_that_has_resources_and_supports_them() throws { // Given let resources: [ResourceFileElement] = [.file(path: "/image.png")] - let target = Target.test(product: .framework, resources: resources) + let target = Target.test(product: .framework, sources: ["/Absolute/File.swift"], resources: resources) project = Project.test(targets: [target]) // Got @@ -185,9 +222,9 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources, resources) - XCTAssertEqual(gotTarget.sources.count, 1) - XCTAssertEqual(gotTarget.sources.first?.path, expectedPath) - XCTAssertNotNil(gotTarget.sources.first?.contentHash) + XCTAssertEqual(gotTarget.sources.count, 2) + XCTAssertEqual(gotTarget.sources.last?.path, expectedPath) + XCTAssertNotNil(gotTarget.sources.last?.contentHash) XCTAssertEqual(gotTarget.dependencies.count, 0) } @@ -195,7 +232,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Given let coreDataModels: [CoreDataModel] = [CoreDataModel(path: "/data.xcdatamodeld", versions: ["/data.xcdatamodeld"], currentVersion: "1")] - let target = Target.test(product: .framework, coreDataModels: coreDataModels) + let target = Target.test(product: .framework, sources: ["/Absolute/File.swift"], coreDataModels: coreDataModels) project = Project.test(targets: [target]) // Got @@ -223,9 +260,9 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.coreDataModels, coreDataModels) - XCTAssertEqual(gotTarget.sources.count, 1) - XCTAssertEqual(gotTarget.sources.first?.path, expectedPath) - XCTAssertNotNil(gotTarget.sources.first?.contentHash) + XCTAssertEqual(gotTarget.sources.count, 2) + XCTAssertEqual(gotTarget.sources.last?.path, expectedPath) + XCTAssertNotNil(gotTarget.sources.last?.contentHash) XCTAssertEqual(gotTarget.dependencies.count, 0) } @@ -263,7 +300,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { func test_map_when_a_target_that_has_name_with_hyphen() throws { // Given let resources: [ResourceFileElement] = [.file(path: "/image.png")] - let target = Target.test(name: "test-tuist", product: .staticLibrary, resources: resources) + let target = Target.test(name: "test-tuist", product: .staticLibrary, sources: ["/Absolute/File.swift"], resources: resources) project = Project.test(targets: [target]) // Got diff --git a/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift b/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift index 58d171118ae..89461f44540 100644 --- a/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift +++ b/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift @@ -29,7 +29,7 @@ public enum AppKit { SentrySDK.startSession() // Use CocoaLumberjack - _ = CocoaLumberjackSwift.DDLogInfo("Log") + _ = DDOSLogger.sharedInstance // Use Realm _ = Realm.Configuration() From 96b6a6c7aa4740af6feae611e08462c064f5026d Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 14 Feb 2024 17:21:06 +0000 Subject: [PATCH 077/509] [Release] Tuist 4.2.0 --- .mise.toml | 2 +- CHANGELOG.md | 23 +++++++++++++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index 949019eee71..caa5555a9ac 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.1.2" +tuist = "4.2.0" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c7fd43ae82..441386af51c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Changelog +## 4.2.0 - 2024-02-14 + +### Tuist + +#### Changed + +- Improve the error when users try to build or test multi-platform targets [#5919](https://github.com/tuist/tuist/pull/5919) by [@pepicrft](https://github.com/pepicrft) +- Remove Mockable from the list of targets that depend on XCTest [#5923](https://github.com/tuist/tuist/pull/5923) by [@pepicrft](https://github.com/pepicrft) +- Improve performance by replacing globing with FileManager when finding resource files [#5922](https://github.com/tuist/tuist/pull/5922) by [@anlaital-oura](https://github.com/anlaital-oura) +- Automatically group local packages to `Packages` group [#5876](https://github.com/tuist/tuist/pull/5876) by [@Lommelun](https://github.com/Lommelun) + +#### Fixed + +- Fix runtime crash when using Obj-C dependencies [#5929](https://github.com/tuist/tuist/pull/5929) by [@fortmarek](https://github.com/fortmarek) +- Fix external platform narrowing when there is a dependency platform condition [#5931](https://github.com/tuist/tuist/pull/5931) by [@fortmarek](https://github.com/fortmarek) +- Fix integration of Objective C dependencies with resources [#5932](https://github.com/tuist/tuist/pull/5932) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +#### Fixed + +- Do not skip a whole target if only a suite is passed by [@fortmarek](https://github.com/fortmarek) + ## 4.1.2 - 2024-02-13 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index be6b0734ac4..6318e0cc70d 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.1.2" + public static let version = "4.2.0" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From 21fb83d59e7e05ecf12271d4671a2c182974ffc8 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Thu, 15 Feb 2024 11:21:01 +0000 Subject: [PATCH 078/509] [Release] Tuist 4.2.1 --- .mise.toml | 2 +- CHANGELOG.md | 12 ++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index caa5555a9ac..459b4b10bee 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.2.0" +tuist = "4.2.1" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index 441386af51c..ab13e92c711 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 4.2.1 - 2024-02-15 + +### Tuist + +- no changes + +### Tuist Cloud + +#### Fixed + +- Fix generation with targets absent in the cache by [@pepicrft](https://github.com/pepicrft) + ## 4.2.0 - 2024-02-14 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 6318e0cc70d..d0019f10963 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.2.0" + public static let version = "4.2.1" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From 10219f63fa49e553909e204f92996eb9c54e03c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 15 Feb 2024 12:31:45 +0100 Subject: [PATCH 079/509] Remove mentions of tuist-cloud (#5938) --- .../tuist.docc/Articles/Tuist/Users/installation.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/installation.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/installation.md index 56527485748..739308eefe4 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/installation.md +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/installation.md @@ -19,7 +19,6 @@ Once installed, you can install Tuist through any of the following commands: ```bash -# Tuist mise install tuist # Install the current version specified in .tool-versions/.mise.toml mise install tuist@x.y.z # Install a specific version number mise install tuist@3 # Install a fuzzy version number @@ -27,16 +26,6 @@ mise use tuist@x.y.z # Use tuist-x.y.z in the current project mise use -g tuist@x.y.z # Use tuist-x.y.z as the global default mise use tuist@latest # Use the latest tuist in the current directory mise use -g tuist@system # Use the system's tuist as the global default - -# Tuist Cloud (For users of Tuist Cloud) -# Note: You need to install one OR the other, not both -mise install tuist-cloud # Install the current version specified in .tool-versions/.mise.toml -mise install tuist-cloud@x.y.z -mise install tuist-cloud@3 -mise use tuist-cloud@x.y.z -mise use -g tuist-cloud@x.y.z # Use tuist-cloud-x.y.z as the global default -mise use tuist-cloud@latest # Use the latest tuist-cloud in the current directory -mise use -g tuist-cloud@system # Use the system's tuist-cloud as the global default ``` #### Continuous integration @@ -109,7 +98,6 @@ you can install Tuist using [Homebrew](https://brew.sh) and [our formulas](https brew tap tuist/tuist brew install tuist brew install tuist@x.y.z -brew install tuist-cloud # If you are a Tuist Cloud user ``` ### Shell completions From 4f94cea87e3d5e1c4f1798aa824d6300d1c59ce4 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 15 Feb 2024 12:57:25 +0100 Subject: [PATCH 080/509] Force run From 36a14d197461178e6d2ca011c08a0288c37dfa6b Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 15 Feb 2024 13:00:41 +0100 Subject: [PATCH 081/509] Fix linting issue --- .../Mappers/ResourcesProjectMapper.swift | 2 +- .../ProjectMappers/ResourcesProjectMapperTests.swift | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 6f8f7495797..0b0f97ec06e 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -31,7 +31,7 @@ public class ResourcesProjectMapper: ProjectMapping { public func mapTarget(_ target: Target, project: Project) throws -> ([Target], [SideEffectDescriptor]) { if target.resources.isEmpty, target.coreDataModels.isEmpty { return ([target], []) } - + var additionalTargets: [Target] = [] var sideEffects: [SideEffectDescriptor] = [] diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 0e190215a8d..2db00cf5251 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -101,7 +101,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual(project, gotProject) XCTAssertEqual(gotSideEffects, []) } - + func testMap_whenNoSwiftSources() throws { // Given let resources: [ResourceFileElement] = [.file(path: "/image.png")] @@ -116,7 +116,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then: Side effects XCTAssertEqual(gotSideEffects, []) XCTAssertEqual(gotProject.targets.count, 2) - + let gotTarget = try XCTUnwrap(gotProject.targets.first) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) @@ -128,7 +128,6 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { TargetDependency.target(name: "\(project.name)_\(target.name)", condition: .when([.ios])) ) - let resourcesTarget = try XCTUnwrap(gotProject.targets.last) XCTAssertEqual(resourcesTarget.name, "\(project.name)_\(target.name)") XCTAssertEqual(resourcesTarget.product, .bundle) @@ -300,7 +299,12 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { func test_map_when_a_target_that_has_name_with_hyphen() throws { // Given let resources: [ResourceFileElement] = [.file(path: "/image.png")] - let target = Target.test(name: "test-tuist", product: .staticLibrary, sources: ["/Absolute/File.swift"], resources: resources) + let target = Target.test( + name: "test-tuist", + product: .staticLibrary, + sources: ["/Absolute/File.swift"], + resources: resources + ) project = Project.test(targets: [target]) // Got From d34431c73113a4f1b4add6caeeb0f61a19b2c117 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Thu, 15 Feb 2024 15:10:41 +0000 Subject: [PATCH 082/509] [Release] Tuist 4.2.2 --- .mise.toml | 2 +- CHANGELOG.md | 12 ++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index 459b4b10bee..31c157d16fe 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.2.1" +tuist = "4.2.2" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index ab13e92c711..eabaf60c8bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 4.2.2 - 2024-02-15 + +### Tuist + +- no changes + +### Tuist Cloud + +#### Fixed + +- Fix runtime network error due to unlimited connections when persisting cache artifacts by [@pepicrft](https://github.com/pepicrft) + ## 4.2.1 - 2024-02-15 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index d0019f10963..40f0cd8717f 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.2.1" + public static let version = "4.2.2" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From 64b6eb7d907f35ec8af401cbfd4f50c22e922b32 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 15 Feb 2024 16:43:30 +0100 Subject: [PATCH 083/509] Force CI run From 213f32c61a5e06fe1f296f636dfad1e152d2d129 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 15 Feb 2024 17:47:54 +0100 Subject: [PATCH 084/509] Force run From 36ba00a9f02ae73e387cd8f87ef70a5ad8b37790 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Thu, 15 Feb 2024 17:03:12 +0000 Subject: [PATCH 085/509] [Release] Tuist 4.2.3 --- .mise.toml | 2 +- CHANGELOG.md | 16 ++++++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index 31c157d16fe..cefc771b234 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.2.2" +tuist = "4.2.3" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index eabaf60c8bb..99b6bcefdc9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## 4.2.3 - 2024-02-15 + +### Tuist + +- no changes + +### Tuist Cloud + +#### Changed + +- Only show the progress bar when we fetch and store remote artifacts by [@pepicrft](https://github.com/pepicrft) + +#### Fixed + +- Reduce the network concurrency and add automatic retries when interacting with the network by [@pepicrft](https://github.com/pepicrft) + ## 4.2.2 - 2024-02-15 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 40f0cd8717f..6319a09c6c4 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.2.2" + public static let version = "4.2.3" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From a5ab86c6b6cec1ea66d19c6ae4958e1e9ae17353 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 15 Feb 2024 19:43:31 +0100 Subject: [PATCH 086/509] Force CI run From 65777a687fac95c7d1363ff733036ffd06449c09 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Fri, 16 Feb 2024 09:04:26 +0000 Subject: [PATCH 087/509] [Release] Tuist 4.2.4 --- .mise.toml | 2 +- CHANGELOG.md | 12 ++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index cefc771b234..af82e2988a4 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.2.3" +tuist = "4.2.4" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index 99b6bcefdc9..816d81efed0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 4.2.4 - 2024-02-16 + +### Tuist + +- no changes + +### Tuist Cloud + +#### Fixed + +- Fix bug when compressing the artifacts to upload them to Tuist Cloud by [@pepicrft](https://github.com/pepicrft) + ## 4.2.3 - 2024-02-15 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 6319a09c6c4..e6555843698 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.2.3" + public static let version = "4.2.4" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From 444f40507b33a7e2c76ff15d4ecd7128d94cefa2 Mon Sep 17 00:00:00 2001 From: Pedro Date: Fri, 16 Feb 2024 11:00:16 +0100 Subject: [PATCH 088/509] Force CI run From 06dc64fc63fd45175991a02852339e91235cca85 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Fri, 16 Feb 2024 13:35:21 +0000 Subject: [PATCH 089/509] [Release] Tuist 4.2.5 --- .mise.toml | 2 +- CHANGELOG.md | 12 ++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index af82e2988a4..364933de064 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.2.4" +tuist = "4.2.5" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index 816d81efed0..813517be40b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 4.2.5 - 2024-02-16 + +### Tuist + +- no changes + +### Tuist Cloud + +#### Fixed + +- Fix storing of artifacts in Tuist Cloud by [@pepicrft](https://github.com/pepicrft) + ## 4.2.4 - 2024-02-16 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index e6555843698..a6f15df8176 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.2.4" + public static let version = "4.2.5" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From 49a2a227f6083f9c4b9bd3df6301d866c1ca8278 Mon Sep 17 00:00:00 2001 From: Pedro Date: Fri, 16 Feb 2024 15:11:07 +0100 Subject: [PATCH 090/509] Remove unnecessary setting --- Package.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Package.swift b/Package.swift index 3f471ae9727..4e2dec629b1 100644 --- a/Package.swift +++ b/Package.swift @@ -320,7 +320,6 @@ var targets: [Target] = [ ], // To revert once we release Tuist 4 targetSettings: [ - "Mockable": ["ENABLE_TESTING_SEARCH_PATHS": "YES"], "MockableTest": ["ENABLE_TESTING_SEARCH_PATHS": "YES"], ], platforms: [.macOS] From bf764bb52b3e2da7f4f7c4771c0abf61e0db7dbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Sat, 17 Feb 2024 11:16:51 +0100 Subject: [PATCH 091/509] Fix `main` unit tests failing due to missing fixtures (#5943) * Copy before using the fixture * Use logger.notice consistently throughout the codebase and remote the first empty line that we print * Fix tests * Fix unit tests --- .../Extensions/AsyncThrowingStream+XcodeBuildOutput.swift | 2 +- Sources/TuistKit/Commands/TuistCommand.swift | 2 +- Sources/TuistKit/Generator/Generator.swift | 4 ++++ .../Workspace/TuistWorkspaceRenderMarkdownMapper.swift | 1 - Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift | 2 +- Sources/TuistKit/Services/CleanService.swift | 4 ++-- Sources/TuistKit/Services/GenerateService.swift | 1 + Sources/TuistKit/Services/InstallService.swift | 8 ++++---- Sources/TuistKit/Services/ListService.swift | 2 +- .../Migration/MigrationTargetsByDependenciesService.swift | 2 +- Sources/TuistLoader/Loaders/ManifestLoader.swift | 6 +++--- .../Utilities/EmptyBuildSettingsChecker.swift | 2 +- .../Utilities/SettingsToXCConfigExtractor.swift | 4 ++-- Sources/TuistSupport/System/Publisher+System.swift | 2 +- Tests/TuistKitTests/Services/ListServiceTests.swift | 6 +++--- Tests/TuistSupportTests/Utils/FileHandlerTests.swift | 7 ++++++- 16 files changed, 32 insertions(+), 23 deletions(-) diff --git a/Sources/TuistCore/Automation/Extensions/AsyncThrowingStream+XcodeBuildOutput.swift b/Sources/TuistCore/Automation/Extensions/AsyncThrowingStream+XcodeBuildOutput.swift index 33d8c20062a..01a1b4d9638 100644 --- a/Sources/TuistCore/Automation/Extensions/AsyncThrowingStream+XcodeBuildOutput.swift +++ b/Sources/TuistCore/Automation/Extensions/AsyncThrowingStream+XcodeBuildOutput.swift @@ -13,7 +13,7 @@ extension AsyncThrowingStream where Element == SystemEvent { case let .standardOutput(output): let lines = output.raw.split(separator: "\n") for line in lines where !line.isEmpty { - logger.info("\(line)") + logger.notice("\(line)") } } } diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index 49bf1cdfe17..35e696dd2e3 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -91,7 +91,7 @@ public struct TuistCommand: AsyncParsableCommand { private static func handleParseError(_ error: Error) -> Never { let exitCode = exitCode(for: error).rawValue if exitCode == 0 { - logger.info("\(fullMessage(for: error))") + logger.notice("\(fullMessage(for: error))") } else { logger.error("\(fullMessage(for: error))") } diff --git a/Sources/TuistKit/Generator/Generator.swift b/Sources/TuistKit/Generator/Generator.swift index ec7cdd41e57..51b960c298c 100644 --- a/Sources/TuistKit/Generator/Generator.swift +++ b/Sources/TuistKit/Generator/Generator.swift @@ -80,7 +80,11 @@ public class Generator: Generating { } func load(path: AbsolutePath) async throws -> (Graph, [SideEffectDescriptor]) { + logger.notice("Loading and constructing the graph", metadata: .section) + logger.notice("It might take a while if the cache is empty") + let (graph, sideEffectDescriptors, issues) = try await manifestGraphLoader.load(path: path) + lintingIssues.append(contentsOf: issues) return (graph, sideEffectDescriptors) } diff --git a/Sources/TuistKit/Mappers/Workspace/TuistWorkspaceRenderMarkdownMapper.swift b/Sources/TuistKit/Mappers/Workspace/TuistWorkspaceRenderMarkdownMapper.swift index 2fa3328e963..d8c20bd8c35 100644 --- a/Sources/TuistKit/Mappers/Workspace/TuistWorkspaceRenderMarkdownMapper.swift +++ b/Sources/TuistKit/Mappers/Workspace/TuistWorkspaceRenderMarkdownMapper.swift @@ -10,7 +10,6 @@ final class TuistWorkspaceRenderMarkdownReadmeMapper: WorkspaceMapping { func map(workspace: WorkspaceWithProjects) throws -> (WorkspaceWithProjects, [SideEffectDescriptor]) { logger.debug("Transforming workspace \(workspace.workspace.name): Including .xcodesample.plist") - logger.info("") let tuistGeneratedFileDescriptor = FileDescriptor( path: workspace .workspace diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift index 0e94fbf9035..ef1a3913cc6 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift @@ -53,7 +53,7 @@ final class ProjectEditorMapper: ProjectEditorMapping { stencils: [AbsolutePath], projectDescriptionSearchPath: AbsolutePath ) throws -> Graph { - logger.info("Building the editable project graph") + logger.notice("Building the editable project graph") let swiftVersion = try System.shared.swiftVersion() let pluginsProject = mapPluginsProject( diff --git a/Sources/TuistKit/Services/CleanService.swift b/Sources/TuistKit/Services/CleanService.swift index bdb45975257..9be129deac6 100644 --- a/Sources/TuistKit/Services/CleanService.swift +++ b/Sources/TuistKit/Services/CleanService.swift @@ -89,9 +89,9 @@ final class CleanService { fileHandler.exists(directory) { try FileHandler.shared.delete(directory) - logger.info("Successfully cleaned artifacts at path \(directory.pathString)", metadata: .success) + logger.notice("Successfully cleaned artifacts at path \(directory.pathString)", metadata: .success) } else { - logger.info("There's nothing to clean for \(category.defaultValueDescription)") + logger.notice("There's nothing to clean for \(category.defaultValueDescription)") } } } diff --git a/Sources/TuistKit/Services/GenerateService.swift b/Sources/TuistKit/Services/GenerateService.swift index 0993e77ce6f..b6c2fd88176 100644 --- a/Sources/TuistKit/Services/GenerateService.swift +++ b/Sources/TuistKit/Services/GenerateService.swift @@ -42,6 +42,7 @@ final class GenerateService { let path = try self.path(path) let config = try configLoader.loadConfig(path: path) let generator = generatorFactory.default(config: config) + let workspacePath = try await generator.generate(path: path) if !noOpen { try opener.open(path: workspacePath) diff --git a/Sources/TuistKit/Services/InstallService.swift b/Sources/TuistKit/Services/InstallService.swift index 5433105190a..8d9c47aefdf 100644 --- a/Sources/TuistKit/Services/InstallService.swift +++ b/Sources/TuistKit/Services/InstallService.swift @@ -46,12 +46,12 @@ final class InstallService { } private func fetchPlugins(path: AbsolutePath) async throws { - logger.info("Resolving and fetching plugins.", metadata: .section) + logger.notice("Resolving and fetching plugins.", metadata: .section) let config = try configLoader.loadConfig(path: path) _ = try await pluginService.loadPlugins(using: config) - logger.info("Plugins resolved and fetched successfully.", metadata: .success) + logger.notice("Plugins resolved and fetched successfully.", metadata: .success) } private func fetchDependencies(path: AbsolutePath, update: Bool) throws { @@ -64,11 +64,11 @@ final class InstallService { } if update { - logger.info("Updating dependencies.", metadata: .section) + logger.notice("Updating dependencies.", metadata: .section) try swiftPackageManagerController.update(at: path, printOutput: true) } else { - logger.info("Resolving and fetching dependencies.", metadata: .section) + logger.notice("Resolving and fetching dependencies.", metadata: .section) try swiftPackageManagerController.resolve(at: path, printOutput: true) } diff --git a/Sources/TuistKit/Services/ListService.swift b/Sources/TuistKit/Services/ListService.swift index b4b31e7540b..72bb6243c00 100644 --- a/Sources/TuistKit/Services/ListService.swift +++ b/Sources/TuistKit/Services/ListService.swift @@ -42,7 +42,7 @@ class ListService { } let output = try string(for: templates, in: format) - logger.info("\(output)") + logger.notice("\(output)") } // MARK: - Helpers diff --git a/Sources/TuistKit/Services/Migration/MigrationTargetsByDependenciesService.swift b/Sources/TuistKit/Services/Migration/MigrationTargetsByDependenciesService.swift index 3a1b3447255..b7b10d5cb25 100644 --- a/Sources/TuistKit/Services/Migration/MigrationTargetsByDependenciesService.swift +++ b/Sources/TuistKit/Services/Migration/MigrationTargetsByDependenciesService.swift @@ -19,7 +19,7 @@ final class MigrationTargetsByDependenciesService { func run(xcodeprojPath: AbsolutePath) throws { let sortedTargets = try targetsExtractor.targetsSortedByDependencies(xcodeprojPath: xcodeprojPath) let sortedTargetsJson = try makeJson(from: sortedTargets) - logger.info("\(sortedTargetsJson)") + logger.notice("\(sortedTargetsJson)") } private func makeJson(from sortedTargets: [TargetDependencyCount]) throws -> String { diff --git a/Sources/TuistLoader/Loaders/ManifestLoader.swift b/Sources/TuistLoader/Loaders/ManifestLoader.swift index 8b65639a7b5..e334beb60ad 100644 --- a/Sources/TuistLoader/Loaders/ManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/ManifestLoader.swift @@ -314,8 +314,8 @@ public class ManifestLoader: ManifestLoading { let preManifestLogs = String(string[string.startIndex ..< startTokenRange.lowerBound]).chomp() let postManifestLogs = String(string[endTokenRange.upperBound ..< string.endIndex]).chomp() - if !preManifestLogs.isEmpty { logger.info("\(path.pathString): \(preManifestLogs)") } - if !postManifestLogs.isEmpty { logger.info("\(path.pathString):\(postManifestLogs)") } + if !preManifestLogs.isEmpty { logger.notice("\(path.pathString): \(preManifestLogs)") } + if !postManifestLogs.isEmpty { logger.notice("\(path.pathString):\(postManifestLogs)") } let manifest = string[startTokenRange.upperBound ..< endTokenRange.lowerBound] return manifest.data(using: .utf8)! @@ -420,7 +420,7 @@ public class ManifestLoader: ManifestLoading { if errorMessage.contains(defaultHelpersName) { logger.error("Cannot import \(defaultHelpersName) in \(manifest.fileName(path))") - logger.info("Project description helpers that depend on plugins are not allowed in \(manifest.fileName(path))") + logger.notice("Project description helpers that depend on plugins are not allowed in \(manifest.fileName(path))") } else if errorMessage.contains("import") { logger.error("Helper plugins are not allowed in \(manifest.fileName(path))") } diff --git a/Sources/TuistMigration/Utilities/EmptyBuildSettingsChecker.swift b/Sources/TuistMigration/Utilities/EmptyBuildSettingsChecker.swift index 9222639d991..24842450ccb 100644 --- a/Sources/TuistMigration/Utilities/EmptyBuildSettingsChecker.swift +++ b/Sources/TuistMigration/Utilities/EmptyBuildSettingsChecker.swift @@ -58,7 +58,7 @@ public class EmptyBuildSettingsChecker: EmptyBuildSettingsChecking { let nonEmptyBuildSettings = buildConfigurations.compactMap { config -> String? in if config.buildSettings.isEmpty { return nil } for (key, _) in config.buildSettings { - logger.info("The build setting '\(key)' of build configuration '\(config.name)' is not empty.") + logger.notice("The build setting '\(key)' of build configuration '\(config.name)' is not empty.") } return config.name } diff --git a/Sources/TuistMigration/Utilities/SettingsToXCConfigExtractor.swift b/Sources/TuistMigration/Utilities/SettingsToXCConfigExtractor.swift index d1ae3db8c7a..d22b6b5aeb1 100644 --- a/Sources/TuistMigration/Utilities/SettingsToXCConfigExtractor.swift +++ b/Sources/TuistMigration/Utilities/SettingsToXCConfigExtractor.swift @@ -50,7 +50,7 @@ public class SettingsToXCConfigExtractor: SettingsToXCConfigExtracting { let buildConfigurations = try buildConfigurations(pbxproj: pbxproj, targetName: targetName) if buildConfigurations.isEmpty { - logger.info("The list of configurations is empty. Exiting...") + logger.notice("The list of configurations is empty. Exiting...") return } @@ -92,7 +92,7 @@ public class SettingsToXCConfigExtractor: SettingsToXCConfigExtracting { buildSettingsLines.sorted().joined(separator: "\n"), ].joined(separator: "\n\n") try FileHandler.shared.write(buildSettingsContent, path: xcconfigPath, atomically: true) - logger.info("Build settings successfully extracted into \(xcconfigPath.pathString)", metadata: .success) + logger.notice("Build settings successfully extracted into \(xcconfigPath.pathString)", metadata: .success) } private func buildConfigurations(pbxproj: PBXProj, targetName: String?) throws -> [XCBuildConfiguration] { diff --git a/Sources/TuistSupport/System/Publisher+System.swift b/Sources/TuistSupport/System/Publisher+System.swift index ac866c73a46..ced0cb42db5 100644 --- a/Sources/TuistSupport/System/Publisher+System.swift +++ b/Sources/TuistSupport/System/Publisher+System.swift @@ -16,7 +16,7 @@ extension Publisher where Output == SystemEvent, Failure == Error { case let .standardError(error): logger.error("\(error)") case let .standardOutput(output): - logger.info("\(output)") + logger.notice("\(output)") } }) .eraseToAnyPublisher() diff --git a/Tests/TuistKitTests/Services/ListServiceTests.swift b/Tests/TuistKitTests/Services/ListServiceTests.swift index 822839d2a95..ca13137c411 100644 --- a/Tests/TuistKitTests/Services/ListServiceTests.swift +++ b/Tests/TuistKitTests/Services/ListServiceTests.swift @@ -58,7 +58,7 @@ final class ListServiceTests: TuistUnitTestCase { try await subject.run(path: nil, outputFormat: .table) // Then - XCTAssertPrinterContains(expectedOutput, at: .info, ==) + XCTAssertPrinterContains(expectedOutput, at: .notice, ==) } func test_lists_available_templates_json_format() async throws { @@ -89,7 +89,7 @@ final class ListServiceTests: TuistUnitTestCase { try await subject.run(path: nil, outputFormat: .json) // Then - XCTAssertPrinterContains(expectedOutput, at: .info, ==) + XCTAssertPrinterContains(expectedOutput, at: .notice, ==) } func test_lists_available_templates_with_plugins() async throws { @@ -120,6 +120,6 @@ final class ListServiceTests: TuistUnitTestCase { try await subject.run(path: nil, outputFormat: .table) // Then - XCTAssertPrinterContains(expectedOutput, at: .info, ==) + XCTAssertPrinterContains(expectedOutput, at: .notice, ==) } } diff --git a/Tests/TuistSupportTests/Utils/FileHandlerTests.swift b/Tests/TuistSupportTests/Utils/FileHandlerTests.swift index 9e6f9b93a7c..db88e49623c 100644 --- a/Tests/TuistSupportTests/Utils/FileHandlerTests.swift +++ b/Tests/TuistSupportTests/Utils/FileHandlerTests.swift @@ -87,7 +87,12 @@ final class FileHandlerTests: TuistUnitTestCase { func test_changeExtension() throws { // Given - let testZippedFrameworkPath = fixturePath(path: try RelativePath(validating: "uUI.xcframework.zip")) + let temporaryDirectory = try temporaryPath() + let testZippedFrameworkPath = temporaryDirectory.appending(component: "uUI.xcframework.zip") + try FileHandler.shared.copy( + from: fixturePath(path: try RelativePath(validating: "uUI.xcframework.zip")), + to: testZippedFrameworkPath + ) // When let result = try subject.changeExtension(path: testZippedFrameworkPath, to: "txt") From d5f3a18132f26dda01a3577c957f61a36cf021bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Sat, 17 Feb 2024 12:06:05 +0100 Subject: [PATCH 092/509] Fix integration of AppCenter (#5935) Co-authored-by: Pedro --- .../PackageInfoMapper.swift | 28 ++----------------- .../PackageInfoMapperTests.swift | 2 +- .../App/Project.swift | 3 ++ .../App/Sources/AppKit/AppKit.swift | 11 ++++++++ .../Package.resolved | 18 ++++++++++++ .../app_with_spm_dependencies/Package.swift | 1 + 6 files changed, 37 insertions(+), 26 deletions(-) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 30af89c8728..5b81f6aca53 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -911,33 +911,11 @@ extension ProjectDescription.Headers { // As per SPM logic, headers should be added only when using the umbrella header without modulemap: // https://github.com/apple/swift-package-manager/blob/9b9bed7eaf0f38eeccd0d8ca06ae08f6689d1c3f/Sources/Xcodeproj/pbxproj.swift#L588-L609 switch moduleMap { - case let .header(path): - return .headers( - public: .list( - [ - .glob( - .path(path.parentDirectory.appending(component: "\(path.basenameWithoutExt).h").pathString) - ), - ] - ) - ) case .nestedHeader: let publicHeaders = try FileHandler.shared.filesAndDirectoriesContained(in: publicHeadersPath)! .filter { $0.extension == "h" } let list: [FileListGlob] = publicHeaders.map { .glob(.path($0.pathString)) } return .headers(public: .list(list)) - case let .custom(_, umbrellaHeaderPath: umbrellaHeaderPath): - guard let umbrellaHeaderPath else { return nil } - - return .headers( - public: .list( - [ - .glob( - .path(umbrellaHeaderPath.pathString) - ), - ] - ) - ) case let .directory(moduleMapPath: _, umbrellaDirectory: umbrellaDirectory): return .headers( public: .list( @@ -946,7 +924,7 @@ extension ProjectDescription.Headers { ] ) ) - case .none: + case .none, .header, .custom: return nil } } @@ -1035,9 +1013,9 @@ extension ProjectDescription.Settings { if let moduleMap { switch moduleMap { - case .directory: + case .directory, .header: settingsDictionary["DEFINES_MODULE"] = "NO" - case .header, .nestedHeader, .none, .custom: + case .none, .nestedHeader, .custom: break } } diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 7a91c0222d5..fce6893e116 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -1146,10 +1146,10 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - headers: .headers(public: [topHeaderPath.pathString]), customSettings: [ "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Target1/include"], "MODULEMAP_FILE": .string("$(SRCROOT)/Sources/Target1/include/Target1.modulemap"), + "DEFINES_MODULE": "NO", ] ), ] diff --git a/fixtures/app_with_spm_dependencies/App/Project.swift b/fixtures/app_with_spm_dependencies/App/Project.swift index 734fe198e0e..07bb85c9acb 100644 --- a/fixtures/app_with_spm_dependencies/App/Project.swift +++ b/fixtures/app_with_spm_dependencies/App/Project.swift @@ -36,6 +36,9 @@ let project = Project( .external(name: "Sentry"), .external(name: "RealmSwift"), .external(name: "CocoaLumberjackSwift"), + .external(name: "AppCenterAnalytics"), + .external(name: "AppCenterCrashes"), + .external(name: "libzstd"), ], settings: .targetSettings ), diff --git a/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift b/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift index 89461f44540..1a3a702435c 100644 --- a/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift +++ b/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift @@ -1,7 +1,12 @@ import Alamofire +import AppCenter +import AppCenterAnalytics +import AppCenterCrashes import CocoaLumberjackSwift import ComposableArchitecture +import CrashReporter import GoogleSignIn +import libzstd import Realm import RealmSwift import Sentry @@ -33,6 +38,12 @@ public enum AppKit { // Use Realm _ = Realm.Configuration() + + // Use AppCenter + AppCenter.start(withAppSecret: "{Your App Secret}", services: [Analytics.self, Crashes.self]) + + // Use libzstd + _ = ZDICT_isError(0) } } diff --git a/fixtures/app_with_spm_dependencies/Package.resolved b/fixtures/app_with_spm_dependencies/Package.resolved index a634c909a60..e1c3c67c364 100644 --- a/fixtures/app_with_spm_dependencies/Package.resolved +++ b/fixtures/app_with_spm_dependencies/Package.resolved @@ -18,6 +18,15 @@ "version" : "1.6.2" } }, + { + "identity" : "appcenter-sdk-apple", + "kind" : "remoteSourceControl", + "location" : "https://github.com/microsoft/appcenter-sdk-apple", + "state" : { + "revision" : "1120c26835925f8314d035127c580bc71689c620", + "version" : "5.0.4" + } + }, { "identity" : "cocoalumberjack", "kind" : "remoteSourceControl", @@ -63,6 +72,15 @@ "version" : "2.0.0" } }, + { + "identity" : "plcrashreporter", + "kind" : "remoteSourceControl", + "location" : "https://github.com/microsoft/PLCrashReporter.git", + "state" : { + "revision" : "1aed8f7dc79ce8e674c61e430ef51ca3db18cea9", + "version" : "1.11.1" + } + }, { "identity" : "realm-core", "kind" : "remoteSourceControl", diff --git a/fixtures/app_with_spm_dependencies/Package.swift b/fixtures/app_with_spm_dependencies/Package.swift index 15f67767f1c..db95e495ac4 100644 --- a/fixtures/app_with_spm_dependencies/Package.swift +++ b/fixtures/app_with_spm_dependencies/Package.swift @@ -27,6 +27,7 @@ let package = Package( .package(url: "https://github.com/realm/realm-swift", .upToNextMajor(from: "10.46.0")), .package(url: "https://github.com/CocoaLumberjack/CocoaLumberjack", .upToNextMajor(from: "3.8.4")), .package(url: "https://github.com/facebook/zstd", exact: "1.5.5"), + .package(url: "https://github.com/microsoft/appcenter-sdk-apple", .upToNextMajor(from: "5.0.4")), .package(path: "LocalSwiftPackage"), .package(path: "StringifyMacro"), ] From 330b46952d49805fd77451178ff87bf097ff828f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Sat, 17 Feb 2024 13:11:25 +0100 Subject: [PATCH 093/509] Fix integration of SPM dependencies with resources (#5945) * Fix integration of AppCenter * Fix integration of SPM dependencies using the SPM module bundle * Add tests * Update tests --------- Co-authored-by: Pedro --- .../Graph/ModelExtensions/Project+Core.swift | 25 +++++ .../Mappers/ResourcesProjectMapper.swift | 103 +++++++++++++++++- .../Factories/ProjectMapperFactory.swift | 1 + .../ResourcesProjectMapperTests.swift | 56 ++++++++++ .../App/Project.swift | 1 + .../App/Sources/AppKit/AppKit.swift | 4 + .../Package.resolved | 9 ++ .../app_with_spm_dependencies/Package.swift | 2 + 8 files changed, 199 insertions(+), 2 deletions(-) diff --git a/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift index ac6226ff987..3b744ee8544 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift @@ -1,5 +1,7 @@ import Foundation +import TSCBasic import TuistGraph +import TuistSupport extension Project { /// It returns the project targets sorted based on the target type and the dependencies between them. @@ -38,4 +40,27 @@ extension Project { } } } + + public func derivedSourcesPath(for target: Target) -> AbsolutePath { + if isExternal { + return path + // Leads to SPM's .build directory + .parentDirectory.parentDirectory + .appending( + components: [ + Constants.DerivedDirectory.name, + target.name, + Constants.DerivedDirectory.sources, + ] + ) + } else { + return path + .appending( + components: [ + Constants.DerivedDirectory.name, + Constants.DerivedDirectory.sources, + ] + ) + } + } } diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 0b0f97ec06e..49cc8fc03a2 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -65,7 +65,7 @@ public class ResourcesProjectMapper: ProjectMapping { } if target.supportsSources, target.sources.contains(where: { $0.path.extension == "swift" }) { - let (filePath, data) = synthesizedFile(bundleName: bundleName, target: target, project: project) + let (filePath, data) = synthesizedSwiftFile(bundleName: bundleName, target: target, project: project) let hash = try data.map(contentHasher.hash) let sourceFile = SourceFile(path: filePath, contentHash: hash) @@ -74,10 +74,50 @@ public class ResourcesProjectMapper: ProjectMapping { sideEffects.append(sideEffect) } + if project.isExternal, + target.supportsSources, + target.sources.contains(where: { $0.path.extension == "m" || $0.path.extension == "mm" }), + !target.resources.filter({ $0.path.extension != "xcprivacy" }).isEmpty + { + let (headerFilePath, headerData) = synthesizedObjcHeaderFile(bundleName: bundleName, target: target, project: project) + + let headerHash = try headerData.map(contentHasher.hash) + let headerFile = SourceFile(path: headerFilePath, contentHash: headerHash) + let headerSideEffect = SideEffectDescriptor.file(.init(path: headerFilePath, contents: headerData, state: .present)) + + let gccPrefixHeader = "$(SRCROOT)/\(headerFile.path.relative(to: project.path).pathString)" + var settings = modifiedTarget.settings?.base ?? SettingsDictionary() + settings["GCC_PREFIX_HEADER"] = .string(gccPrefixHeader) + modifiedTarget.settings = modifiedTarget.settings?.with(base: settings) + + sideEffects.append(headerSideEffect) + + let (resourceAccessorPath, resourceAccessorData) = synthesizedObjcImplementationFile( + bundleName: bundleName, + target: target, + project: project + ) + modifiedTarget.sources.append( + SourceFile( + path: resourceAccessorPath, + contentHash: try resourceAccessorData.map(contentHasher.hash) + ) + ) + sideEffects.append( + SideEffectDescriptor.file( + FileDescriptor( + path: resourceAccessorPath, + contents: resourceAccessorData, + state: .present + ) + ) + ) + } + return ([modifiedTarget] + additionalTargets, sideEffects) } - func synthesizedFile(bundleName: String, target: Target, project: Project) -> (AbsolutePath, Data?) { + func synthesizedSwiftFile(bundleName: String, target: Target, project: Project) -> (AbsolutePath, Data?) { let filePath = project.path .appending(component: Constants.DerivedDirectory.name) .appending(component: Constants.DerivedDirectory.sources) @@ -91,6 +131,37 @@ public class ResourcesProjectMapper: ProjectMapping { return (filePath, content.data(using: .utf8)) } + private func synthesizedObjcHeaderFile(bundleName: String, target: Target, project: Project) -> (AbsolutePath, Data?) { + let filePath = synthesizedFilePath(target: target, project: project, fileExtension: "h") + + let content: String = ResourcesProjectMapper.objcHeaderFileContent( + targetName: target.name, + bundleName: bundleName.replacingOccurrences(of: "-", with: "_"), + target: target + ) + return (filePath, content.data(using: .utf8)) + } + + private func synthesizedObjcImplementationFile( + bundleName: String, + target: Target, + project: Project + ) -> (AbsolutePath, Data?) { + let filePath = synthesizedFilePath(target: target, project: project, fileExtension: "m") + + let content: String = ResourcesProjectMapper.objcImplementationFileContent( + targetName: target.name, + bundleName: bundleName.replacingOccurrences(of: "-", with: "_"), + target: target + ) + return (filePath, content.data(using: .utf8)) + } + + private func synthesizedFilePath(target: Target, project: Project, fileExtension: String) -> AbsolutePath { + let filename = "TuistBundle+\(target.name.camelized.uppercasingFirst).\(fileExtension)" + return project.derivedSourcesPath(for: target).appending(component: filename) + } + // swiftlint:disable:next function_body_length static func fileContent(targetName: String, bundleName: String, target: Target) -> String { if !target.supportsResources { @@ -173,4 +244,32 @@ public class ResourcesProjectMapper: ProjectMapping { """ } } + + static func objcHeaderFileContent(targetName: String, bundleName _: String, target _: Target) -> String { + return """ + #import + + #if __cplusplus + extern "C" { + #endif + + NSBundle* \(targetName)_SWIFTPM_MODULE_BUNDLE(void); + + #define SWIFTPM_MODULE_BUNDLE \(targetName)_SWIFTPM_MODULE_BUNDLE() + + #if __cplusplus + } + #endif + """ + } + + static func objcImplementationFileContent(targetName: String, bundleName _: String, target _: Target) -> String { + return """ + #import + #import "TuistBundle+\(targetName).h" + NSBundle* \(targetName)_SWIFTPM_MODULE_BUNDLE(void) { + return \(targetName)_SWIFTPM_MODULE_BUNDLE(); + } + """ + } } diff --git a/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift b/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift index d8b07a2a682..90432d1dbc6 100644 --- a/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift +++ b/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift @@ -1,6 +1,7 @@ import Foundation import TuistAutomation import TuistCore +import TuistDependencies import TuistGenerator import TuistGraph import TuistLoader diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 2db00cf5251..6549e7891e5 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -326,4 +326,60 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual(file.path, expectedPath) XCTAssertEqual(file.contents, expectedContents.data(using: .utf8)) } + + func test_map_when_a_target_has_objc_source_files() throws { + // Given + let sources: [SourceFile] = ["/ViewController.m"] + let resources: [ResourceFileElement] = [.file(path: "/AbsolutePath/Project/Resources/image.png")] + let target = Target.test(product: .staticLibrary, sources: sources, resources: resources) + project = Project.test(path: try AbsolutePath(validating: "/AbsolutePath/Project"), targets: [target], isExternal: true) + + // Got + let (gotProject, gotSideEffects) = try subject.map(project: project) + + // Then + let gotTarget = try XCTUnwrap(gotProject.targets.first) + XCTAssertEqual( + gotTarget.settings?.base["GCC_PREFIX_HEADER"], + .string( + "$(SRCROOT)/../../\(Constants.DerivedDirectory.name)/\(target.name)/\(Constants.DerivedDirectory.sources)/TuistBundle+\(target.name).h" + ) + ) + XCTAssertEqual(gotTarget.sources.count, 2) + XCTAssertEqual(gotSideEffects.count, 2) + let generatedFiles = gotSideEffects.compactMap { + if case let .file(file) = $0 { + return file + } else { + return nil + } + } + + let expectedBasePath = project.derivedSourcesPath(for: target) + XCTAssertEqual( + generatedFiles, + [ + FileDescriptor( + path: expectedBasePath.appending(component: "TuistBundle+\(target.name).h"), + contents: ResourcesProjectMapper + .objcHeaderFileContent( + targetName: target.name, + bundleName: "\(project.name)_\(target.name)", + target: target + ) + .data(using: .utf8) + ), + FileDescriptor( + path: expectedBasePath.appending(component: "TuistBundle+\(target.name).m"), + contents: ResourcesProjectMapper + .objcImplementationFileContent( + targetName: target.name, + bundleName: "\(project.name)_\(target.name)", + target: target + ) + .data(using: .utf8) + ), + ] + ) + } } diff --git a/fixtures/app_with_spm_dependencies/App/Project.swift b/fixtures/app_with_spm_dependencies/App/Project.swift index 07bb85c9acb..2cd9bf803d6 100644 --- a/fixtures/app_with_spm_dependencies/App/Project.swift +++ b/fixtures/app_with_spm_dependencies/App/Project.swift @@ -39,6 +39,7 @@ let project = Project( .external(name: "AppCenterAnalytics"), .external(name: "AppCenterCrashes"), .external(name: "libzstd"), + .external(name: "NYTPhotoViewer"), ], settings: .targetSettings ), diff --git a/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift b/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift index 1a3a702435c..ea714a77144 100644 --- a/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift +++ b/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift @@ -7,6 +7,7 @@ import ComposableArchitecture import CrashReporter import GoogleSignIn import libzstd +import NYTPhotoViewer import Realm import RealmSwift import Sentry @@ -44,6 +45,9 @@ public enum AppKit { // Use libzstd _ = ZDICT_isError(0) + + // Use NYTPhotoViewer + _ = NYTPhotosOverlayView() } } diff --git a/fixtures/app_with_spm_dependencies/Package.resolved b/fixtures/app_with_spm_dependencies/Package.resolved index e1c3c67c364..01fcb0d02c9 100644 --- a/fixtures/app_with_spm_dependencies/Package.resolved +++ b/fixtures/app_with_spm_dependencies/Package.resolved @@ -72,6 +72,15 @@ "version" : "2.0.0" } }, + { + "identity" : "nytphotoviewer", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tuist/NYTPhotoViewer", + "state" : { + "branch" : "develop", + "revision" : "e4acd0988c43e3df0908fc463104e567098f9dfc" + } + }, { "identity" : "plcrashreporter", "kind" : "remoteSourceControl", diff --git a/fixtures/app_with_spm_dependencies/Package.swift b/fixtures/app_with_spm_dependencies/Package.swift index db95e495ac4..4f202f33573 100644 --- a/fixtures/app_with_spm_dependencies/Package.swift +++ b/fixtures/app_with_spm_dependencies/Package.swift @@ -28,6 +28,8 @@ let package = Package( .package(url: "https://github.com/CocoaLumberjack/CocoaLumberjack", .upToNextMajor(from: "3.8.4")), .package(url: "https://github.com/facebook/zstd", exact: "1.5.5"), .package(url: "https://github.com/microsoft/appcenter-sdk-apple", .upToNextMajor(from: "5.0.4")), + // Has SWIFTPM_MODULE_BUNDLE + .package(url: "https://github.com/tuist/NYTPhotoViewer", branch: "develop"), .package(path: "LocalSwiftPackage"), .package(path: "StringifyMacro"), ] From aaedaca18fea9e9ea04f7d6db13426848a83026c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Sat, 17 Feb 2024 14:24:49 +0100 Subject: [PATCH 094/509] Fix DEFINES_MODULE warning (#5946) --- .../PackageInfoMapper.swift | 12 +++++++++-- .../Graph/GraphTraverserTests.swift | 1 - .../Generator/BuildPhaseGeneratorTests.swift | 2 +- .../PackageInfoMapperTests.swift | 20 ++++++++++++++++++- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 5b81f6aca53..8c911f699e1 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -1013,9 +1013,17 @@ extension ProjectDescription.Settings { if let moduleMap { switch moduleMap { - case .directory, .header: + case .directory, .header, .custom: settingsDictionary["DEFINES_MODULE"] = "NO" - case .none, .nestedHeader, .custom: + switch settingsDictionary["OTHER_CFLAGS"] ?? .array(["$(inherited)"]) { + case let .array(values): + settingsDictionary["OTHER_CFLAGS"] = .array(values + ["-fmodule-name=\(target.name)"]) + case let .string(value): + settingsDictionary["OTHER_CFLAGS"] = .array( + value.split(separator: " ").map(String.init) + ["-fmodule-name=\(target.name)"] + ) + } + case .none, .nestedHeader: break } } diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index 7c6a2d3641c..bc5def47628 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -1192,7 +1192,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let swiftSyntaxDynamicXCFramework = GraphDependency.testXCFramework(linking: .dynamic) let project = Project.test(targets: [target]) - let graphTarget = GraphDependency.target(name: target.name, path: project.path) // Given: Value Graph let graph = Graph.test( diff --git a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift index b49192d0109..ef2bad6cd07 100644 --- a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift @@ -752,7 +752,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { XCTAssertTrue(pbxBuildPhase is PBXResourcesBuildPhase) let resourceBuildPhase = try XCTUnwrap(nativeTarget.buildPhases.first as? PBXResourcesBuildPhase) - var buildFiles = try XCTUnwrap(resourceBuildPhase.files) + let buildFiles = try XCTUnwrap(resourceBuildPhase.files) for buildFile in buildFiles { // Explicitly exctracting the original path because it gets lost in translation for resource files diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index fce6893e116..549de4aa0be 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -1020,6 +1020,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, customSettings: [ "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Target1/include"], + "DEFINES_MODULE": "NO", + "OTHER_CFLAGS": .array(["-fmodule-name=Target1"]), ], moduleMap: "$(SRCROOT)/Sources/Target1/include/module.modulemap" ), @@ -1067,6 +1069,10 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "Target1", basePath: basePath, customSources: .custom(nil), + customSettings: [ + "DEFINES_MODULE": "NO", + "OTHER_CFLAGS": .array(["-fmodule-name=Target1"]), + ], moduleMap: "$(SRCROOT)/Sources/Target1/module.modulemap" ), ] @@ -1150,6 +1156,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Target1/include"], "MODULEMAP_FILE": .string("$(SRCROOT)/Sources/Target1/include/Target1.modulemap"), "DEFINES_MODULE": "NO", + "OTHER_CFLAGS": .array(["-fmodule-name=Target1"]), ] ), ] @@ -1198,7 +1205,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), ] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", @@ -1213,6 +1220,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "$(SRCROOT)/Sources/Dependency1/include", "$(SRCROOT)/Sources/Dependency2/include", ], + "DEFINES_MODULE": "NO", + "OTHER_CFLAGS": .array(["-fmodule-name=Target1"]), ], moduleMap: "$(SRCROOT)/Sources/Target1/include/module.modulemap" ), @@ -1225,6 +1234,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "$(SRCROOT)/Sources/Dependency1/include", "$(SRCROOT)/Sources/Dependency2/include", ], + "DEFINES_MODULE": "NO", + "OTHER_CFLAGS": .array(["-fmodule-name=Dependency1"]), ], moduleMap: "$(SRCROOT)/Sources/Dependency1/include/module.modulemap" ), @@ -1233,6 +1244,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, customSettings: [ "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Dependency2/include"], + "DEFINES_MODULE": "NO", + "OTHER_CFLAGS": .array(["-fmodule-name=Dependency2"]), ], moduleMap: "$(SRCROOT)/Sources/Dependency2/include/module.modulemap" ), @@ -1321,6 +1334,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "$(SRCROOT)/../Package2/Sources/Dependency1/include", "$(SRCROOT)/../Package3/Sources/Dependency2/include", ], + "DEFINES_MODULE": "NO", + "OTHER_CFLAGS": .array(["-fmodule-name=Target1"]), ], moduleMap: "$(SRCROOT)/Sources/Target1/include/module.modulemap" ), @@ -1392,6 +1407,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ], customSettings: [ "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Custom/Headers"], + "DEFINES_MODULE": "NO", + "OTHER_CFLAGS": .array(["-fmodule-name=Target1"]), ], moduleMap: "$(SRCROOT)/Custom/Headers/module.modulemap" ), @@ -1452,6 +1469,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { customSettings: [ "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Dependency1/include"], "DEFINES_MODULE": "NO", + "OTHER_CFLAGS": .array(["-fmodule-name=Dependency1"]), ], moduleMap: "$(SRCROOT)/Sources/Dependency1/include/Dependency1.modulemap" ), From 4927c89607b7d7a22a3da00ec3e0ecaca9a53709 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Sat, 17 Feb 2024 17:59:12 +0100 Subject: [PATCH 095/509] Make Tuist/Package.swift a valid location for the SPM manifest (#5947) * Make Tuist/Package.swift a valid location for the SPM manifest * Update docs * Lint fix * Fix failing acceptance tests due to a missing Tuist directory --- Sources/TuistKit/Services/CleanService.swift | 31 ++++++++++++++----- .../TuistKit/Services/InstallService.swift | 16 +++++----- .../Loaders/PackageSettingsLoader.swift | 10 +++--- .../SwiftPackageManagerGraphLoader.swift | 14 +++++---- .../Utils/ManifestFilesLocator.swift | 13 ++++++-- .../Services/CleanServiceTests.swift | 27 +++++++++++++++- .../Services/InstallServiceTests.swift | 6 +++- .../Loaders/PackageSettingsLoaderTests.swift | 8 ++--- .../Utils/ManifestFilesLocatorTests.swift | 27 ++++++++++++++++ .../external-dependencies.tutorial | 2 +- .../Articles/Tuist/Users/dependencies.md | 2 -- .../{ => Tuist}/Package.resolved | 0 .../{ => Tuist}/Package.swift | 4 +-- .../Tuist/.gitkeep | 0 .../multiplatform_app_with_sdk/Tuist/.gitkeep | 0 15 files changed, 120 insertions(+), 40 deletions(-) rename fixtures/app_with_spm_dependencies/{ => Tuist}/Package.resolved (100%) rename fixtures/app_with_spm_dependencies/{ => Tuist}/Package.swift (94%) create mode 100644 fixtures/framework_with_native_swift_macro/Tuist/.gitkeep create mode 100644 fixtures/multiplatform_app_with_sdk/Tuist/.gitkeep diff --git a/Sources/TuistKit/Services/CleanService.swift b/Sources/TuistKit/Services/CleanService.swift index 9be129deac6..b8bac5582f8 100644 --- a/Sources/TuistKit/Services/CleanService.swift +++ b/Sources/TuistKit/Services/CleanService.swift @@ -6,7 +6,11 @@ import TuistLoader import TuistSupport public protocol CleanCategory: ExpressibleByArgument & CaseIterable { - func directory(rootDirectory: AbsolutePath?, cacheDirectory: AbsolutePath) throws -> AbsolutePath? + func directory( + rootDirectory: AbsolutePath?, + packageDirectory: AbsolutePath?, + cacheDirectory: AbsolutePath + ) throws -> AbsolutePath? } public enum TuistCleanCategory: CleanCategory { @@ -37,12 +41,16 @@ public enum TuistCleanCategory: CleanCategory { } } - public func directory(rootDirectory: AbsolutePath?, cacheDirectory: AbsolutePath) throws -> TSCBasic.AbsolutePath? { + public func directory( + rootDirectory _: AbsolutePath?, + packageDirectory: AbsolutePath?, + cacheDirectory: AbsolutePath + ) throws -> TSCBasic.AbsolutePath? { switch self { case let .global(category): return CacheDirectoriesProvider.tuistCacheDirectory(for: category, cacheDirectory: cacheDirectory) case .dependencies: - return rootDirectory?.appending( + return packageDirectory?.appending( component: Constants.SwiftPackageManager.packageBuildDirectoryName ) } @@ -53,21 +61,25 @@ final class CleanService { private let fileHandler: FileHandling private let rootDirectoryLocator: RootDirectoryLocating private let cacheDirectoriesProvider: CacheDirectoriesProviding + private let manifestFilesLocator: ManifestFilesLocating init( fileHandler: FileHandling, rootDirectoryLocator: RootDirectoryLocating, - cacheDirectoriesProvider: CacheDirectoriesProviding + cacheDirectoriesProvider: CacheDirectoriesProviding, + manifestFilesLocator: ManifestFilesLocating ) { self.fileHandler = fileHandler self.rootDirectoryLocator = rootDirectoryLocator self.cacheDirectoriesProvider = cacheDirectoriesProvider + self.manifestFilesLocator = manifestFilesLocator } public convenience init() { self.init( fileHandler: FileHandler.shared, rootDirectoryLocator: RootDirectoryLocator(), - cacheDirectoriesProvider: CacheDirectoriesProvider() + cacheDirectoriesProvider: CacheDirectoriesProvider(), + manifestFilesLocator: ManifestFilesLocator() ) } @@ -83,10 +95,15 @@ final class CleanService { let rootDirectory = rootDirectoryLocator.locate(from: resolvedPath) let cacheDirectory = try cacheDirectoriesProvider.cacheDirectory() + let packageDirectory = manifestFilesLocator.locatePackageManifest(at: resolvedPath)?.parentDirectory for category in categories { - if let directory = try category.directory(rootDirectory: rootDirectory, cacheDirectory: cacheDirectory), - fileHandler.exists(directory) + if let directory = try category.directory( + rootDirectory: rootDirectory, + packageDirectory: packageDirectory, + cacheDirectory: cacheDirectory + ), + fileHandler.exists(directory) { try FileHandler.shared.delete(directory) logger.notice("Successfully cleaned artifacts at path \(directory.pathString)", metadata: .success) diff --git a/Sources/TuistKit/Services/InstallService.swift b/Sources/TuistKit/Services/InstallService.swift index 8d9c47aefdf..a6fa7c56b1e 100644 --- a/Sources/TuistKit/Services/InstallService.swift +++ b/Sources/TuistKit/Services/InstallService.swift @@ -12,17 +12,20 @@ final class InstallService { private let configLoader: ConfigLoading private let swiftPackageManagerController: SwiftPackageManagerControlling private let fileHandler: FileHandling + private let manifestFilesLocator: ManifestFilesLocating init( pluginService: PluginServicing = PluginService(), configLoader: ConfigLoading = ConfigLoader(manifestLoader: CachedManifestLoader()), swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController(), - fileHandler: FileHandling = FileHandler.shared + fileHandler: FileHandling = FileHandler.shared, + manifestFilesLocator: ManifestFilesLocating = ManifestFilesLocator() ) { self.pluginService = pluginService self.configLoader = configLoader self.swiftPackageManagerController = swiftPackageManagerController self.fileHandler = fileHandler + self.manifestFilesLocator = manifestFilesLocator } func run( @@ -55,22 +58,19 @@ final class InstallService { } private func fetchDependencies(path: AbsolutePath, update: Bool) throws { - let packageManifestPath = path.appending( - component: Constants.SwiftPackageManager.packageSwiftName - ) - - guard fileHandler.exists(packageManifestPath) else { + guard let packageManifestPath = manifestFilesLocator.locatePackageManifest(at: path) + else { return } if update { logger.notice("Updating dependencies.", metadata: .section) - try swiftPackageManagerController.update(at: path, printOutput: true) + try swiftPackageManagerController.update(at: packageManifestPath.parentDirectory, printOutput: true) } else { logger.notice("Resolving and fetching dependencies.", metadata: .section) - try swiftPackageManagerController.resolve(at: path, printOutput: true) + try swiftPackageManagerController.resolve(at: packageManifestPath.parentDirectory, printOutput: true) } } } diff --git a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift index 8a1b8b99e8c..a3566d5599b 100644 --- a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift +++ b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift @@ -18,23 +18,23 @@ public protocol PackageSettingsLoading { public final class PackageSettingsLoader: PackageSettingsLoading { private let manifestLoader: ManifestLoading private let swiftPackageManagerController: SwiftPackageManagerControlling - private let rootDirectoryLocator: RootDirectoryLocating private let fileHandler: FileHandling + private let manifestFilesLocator: ManifestFilesLocating public init( manifestLoader: ManifestLoading = ManifestLoader(), swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController(), - rootDirectoryLocator: RootDirectoryLocating = RootDirectoryLocator(), - fileHandler: FileHandling = FileHandler.shared + fileHandler: FileHandling = FileHandler.shared, + manifestFilesLocator: ManifestFilesLocating = ManifestFilesLocator() ) { self.manifestLoader = manifestLoader self.swiftPackageManagerController = swiftPackageManagerController - self.rootDirectoryLocator = rootDirectoryLocator self.fileHandler = fileHandler + self.manifestFilesLocator = manifestFilesLocator } public func loadPackageSettings(at path: AbsolutePath, with plugins: Plugins) throws -> TuistGraph.PackageSettings { - let path = rootDirectoryLocator.locate(from: path) ?? path + let path = manifestFilesLocator.locatePackageManifest(at: path)?.parentDirectory ?? path try manifestLoader.register(plugins: plugins) let manifest = try manifestLoader.loadPackageSettings(at: path) let generatorPaths = GeneratorPaths(manifestDirectory: path) diff --git a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift index ec37b611d35..fc621683659 100644 --- a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift +++ b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift @@ -58,6 +58,7 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi private let manifestLoader: ManifestLoading private let fileHandler: FileHandling private let packageSettingsLoader: PackageSettingsLoading + private let manifestFilesLocator: ManifestFilesLocating public convenience init( manifestLoader: ManifestLoading @@ -73,13 +74,15 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi packageInfoMapper: PackageInfoMapping = PackageInfoMapper(), manifestLoader: ManifestLoading = ManifestLoader(), fileHandler: FileHandling = FileHandler.shared, - packageSettingsLoader: PackageSettingsLoading = PackageSettingsLoader() + packageSettingsLoader: PackageSettingsLoading = PackageSettingsLoader(), + manifestFilesLocator: ManifestFilesLocating = ManifestFilesLocator() ) { self.swiftPackageManagerController = swiftPackageManagerController self.packageInfoMapper = packageInfoMapper self.manifestLoader = manifestLoader self.fileHandler = fileHandler self.packageSettingsLoader = packageSettingsLoader + self.manifestFilesLocator = manifestFilesLocator } // swiftlint:disable:next function_body_length @@ -87,15 +90,14 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi at path: AbsolutePath, plugins: Plugins ) throws -> TuistCore.DependenciesGraph { - guard fileHandler.exists( - path.appending(component: Constants.SwiftPackageManager.packageSwiftName) - ) else { + guard let packagePath = manifestFilesLocator.locatePackageManifest(at: path) + else { return .none } - let packageSettings = try packageSettingsLoader.loadPackageSettings(at: path, with: plugins) + let packageSettings = try packageSettingsLoader.loadPackageSettings(at: packagePath.parentDirectory, with: plugins) - let path = path.appending( + let path = packagePath.parentDirectory.appending( component: Constants.SwiftPackageManager.packageBuildDirectoryName ) let checkoutsFolder = path.appending(component: "checkouts") diff --git a/Sources/TuistLoader/Utils/ManifestFilesLocator.swift b/Sources/TuistLoader/Utils/ManifestFilesLocator.swift index a6c0488180a..c6dbef64315 100644 --- a/Sources/TuistLoader/Utils/ManifestFilesLocator.swift +++ b/Sources/TuistLoader/Utils/ManifestFilesLocator.swift @@ -194,9 +194,16 @@ public final class ManifestFilesLocator: ManifestFilesLocating { public func locatePackageManifest(at locatingPath: AbsolutePath) -> AbsolutePath? { guard let tuistDirectory = traverseAndLocateTuistDirectory(at: locatingPath) else { return nil } - let packageSwiftPath = tuistDirectory.parentDirectory.appending(component: Constants.SwiftPackageManager.packageSwiftName) - if fileHandler.exists(packageSwiftPath) { return packageSwiftPath } - return nil + let defaultPackageSwiftPath = tuistDirectory.appending(component: Constants.SwiftPackageManager.packageSwiftName) + let rootPackageSwiftPath = tuistDirectory.parentDirectory + .appending(component: Constants.SwiftPackageManager.packageSwiftName) + if fileHandler.exists(defaultPackageSwiftPath) { + return defaultPackageSwiftPath + } else if fileHandler.exists(rootPackageSwiftPath) { + return rootPackageSwiftPath + } else { + return nil + } } // MARK: - Helpers diff --git a/Tests/TuistKitTests/Services/CleanServiceTests.swift b/Tests/TuistKitTests/Services/CleanServiceTests.swift index 46b7d5fdbcc..1f3a3ec257a 100644 --- a/Tests/TuistKitTests/Services/CleanServiceTests.swift +++ b/Tests/TuistKitTests/Services/CleanServiceTests.swift @@ -2,6 +2,7 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting +import TuistLoaderTesting import TuistSupport import XCTest @@ -12,22 +13,26 @@ final class CleanServiceTests: TuistUnitTestCase { private var subject: CleanService! private var rootDirectoryLocator: MockRootDirectoryLocator! private var cacheDirectoriesProvider: MockCacheDirectoriesProvider! + private var manifestFilesLocator: MockManifestFilesLocator! override func setUpWithError() throws { super.setUp() rootDirectoryLocator = MockRootDirectoryLocator() cacheDirectoriesProvider = try MockCacheDirectoriesProvider() + manifestFilesLocator = MockManifestFilesLocator() subject = CleanService( fileHandler: FileHandler.shared, rootDirectoryLocator: rootDirectoryLocator, - cacheDirectoriesProvider: cacheDirectoriesProvider + cacheDirectoriesProvider: cacheDirectoriesProvider, + manifestFilesLocator: manifestFilesLocator ) } override func tearDown() { rootDirectoryLocator = nil cacheDirectoriesProvider = nil + manifestFilesLocator = nil subject = nil super.tearDown() } @@ -49,10 +54,28 @@ final class CleanServiceTests: TuistUnitTestCase { } func test_run_with_dependencies_cleans_dependencies() throws { + // Given + let localPaths = try createFolders(["Tuist/.build", "Tuist/ProjectDescriptionHelpers"]) + + rootDirectoryLocator.locateStub = localPaths[0].parentDirectory + manifestFilesLocator.locatePackageManifestStub = localPaths[1].parentDirectory + .appending(component: Constants.SwiftPackageManager.packageSwiftName) + + // When + try subject.run(categories: [TuistCleanCategory.dependencies], path: nil) + + // Then + XCTAssertFalse(FileHandler.shared.exists(localPaths[0])) + XCTAssertTrue(FileHandler.shared.exists(localPaths[1])) + } + + func test_run_with_dependencies_cleans_dependencies_when_package_is_in_root() throws { // Given let localPaths = try createFolders([".build", "Tuist/ProjectDescriptionHelpers"]) rootDirectoryLocator.locateStub = localPaths[0].parentDirectory + manifestFilesLocator.locatePackageManifestStub = localPaths[0].parentDirectory + .appending(component: Constants.SwiftPackageManager.packageSwiftName) // When try subject.run(categories: [TuistCleanCategory.dependencies], path: nil) @@ -71,6 +94,8 @@ final class CleanServiceTests: TuistUnitTestCase { let projectPath = try temporaryPath() rootDirectoryLocator.locateStub = projectPath + manifestFilesLocator.locatePackageManifestStub = projectPath + .appending(component: Constants.SwiftPackageManager.packageSwiftName) let swiftPackageManagerBuildPath = projectPath.appending( components: Constants.SwiftPackageManager.packageBuildDirectoryName ) diff --git a/Tests/TuistKitTests/Services/InstallServiceTests.swift b/Tests/TuistKitTests/Services/InstallServiceTests.swift index 82861439116..2079003bf3e 100644 --- a/Tests/TuistKitTests/Services/InstallServiceTests.swift +++ b/Tests/TuistKitTests/Services/InstallServiceTests.swift @@ -18,6 +18,7 @@ final class InstallServiceTests: TuistUnitTestCase { private var pluginService: MockPluginService! private var configLoader: MockConfigLoader! private var swiftPackageManagerController: MockSwiftPackageManagerController! + private var manifestFilesLocator: MockManifestFilesLocator! private var subject: InstallService! @@ -27,11 +28,13 @@ final class InstallServiceTests: TuistUnitTestCase { pluginService = MockPluginService() configLoader = MockConfigLoader() swiftPackageManagerController = MockSwiftPackageManagerController() + manifestFilesLocator = MockManifestFilesLocator() subject = InstallService( pluginService: pluginService, configLoader: configLoader, - swiftPackageManagerController: swiftPackageManagerController + swiftPackageManagerController: swiftPackageManagerController, + manifestFilesLocator: manifestFilesLocator ) } @@ -41,6 +44,7 @@ final class InstallServiceTests: TuistUnitTestCase { pluginService = nil configLoader = nil swiftPackageManagerController = nil + manifestFilesLocator = nil super.tearDown() } diff --git a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift index 1af8e7227c6..fd9095f7937 100644 --- a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift @@ -16,7 +16,7 @@ import XCTest final class PackageSettingsLoaderTests: TuistUnitTestCase { private var manifestLoader: MockManifestLoader! private var swiftPackageManagerController: MockSwiftPackageManagerController! - private var rootDirectoryLocator: MockRootDirectoryLocator! + private var manifestFilesLocator: MockManifestFilesLocator! private var subject: PackageSettingsLoader! override func setUp() { @@ -24,12 +24,12 @@ final class PackageSettingsLoaderTests: TuistUnitTestCase { manifestLoader = MockManifestLoader() swiftPackageManagerController = MockSwiftPackageManagerController() - rootDirectoryLocator = MockRootDirectoryLocator() + manifestFilesLocator = MockManifestFilesLocator() subject = PackageSettingsLoader( manifestLoader: manifestLoader, swiftPackageManagerController: swiftPackageManagerController, - rootDirectoryLocator: rootDirectoryLocator, - fileHandler: fileHandler + fileHandler: fileHandler, + manifestFilesLocator: MockManifestFilesLocator() ) } diff --git a/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift b/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift index 7838b673d3e..68ea7e96f4c 100644 --- a/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift +++ b/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift @@ -485,6 +485,32 @@ final class ManifestFilesLocatorTests: TuistUnitTestCase { XCTAssertNil(configPath) } + func test_locatePackageManifest_when_in_root() throws { + // Given + let paths = try createFiles([ + "Module01/File01.swift", + "Module01/File02.swift", + "Module01/File03.swift", + + "Module02/File01.swift", + "Module02/File01.swift", + "Module02/Subdir01/File01.swift", + "Module02/Subdir01/File02.swift", + + "File01.swift", + "File02.swift", + "Tuist/Config.swift", + "Package.swift", + ]) + + // When + let packageManifestPath = subject.locatePackageManifest(at: try temporaryPath()) + + // Then + XCTAssertNotNil(packageManifestPath) + XCTAssertEqual(paths.last, packageManifestPath) + } + func test_locatePackageManifest() throws { // Given let paths = try createFiles([ @@ -501,6 +527,7 @@ final class ManifestFilesLocatorTests: TuistUnitTestCase { "File02.swift", "Tuist/Config.swift", "Package.swift", + "Tuist/Package.swift", ]) // When diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/external-dependencies.tutorial b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/external-dependencies.tutorial index ace3a9664c7..3c208e15104 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/external-dependencies.tutorial +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/external-dependencies.tutorial @@ -7,7 +7,7 @@ @Section(title: "Defining package dependencies") { @ContentAndMedia { - External dependencies are defined in a `Package.swift` manifest file in the root directory (i.e., the directory containing the `/Tuist` directory). + External dependencies are defined in a `Package.swift` manifest file in the `/Tuist` directory in the root of your project. You can also define your `Package.swift` directly in the root if you are working on an SPM package. } @Steps { diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/dependencies.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/dependencies.md index 1b327523b03..b401148dbb2 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/dependencies.md +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/dependencies.md @@ -70,8 +70,6 @@ You can follow the tutorial to learn more about how > Note: The **product type** defaults to static framework when none is specified. -> Note: The **module maps** are not automatically generated for packages containing Objective-C code. You can override the `HEADER_SEARCH_PATHS` build setting to point to the headers directory ([details](https://github.com/tuist/tuist/issues/4180)). - #### Xcode's default integration If you want to use Xcode's default integration mechanism, you can pass the list `packages` when instantiating a project: diff --git a/fixtures/app_with_spm_dependencies/Package.resolved b/fixtures/app_with_spm_dependencies/Tuist/Package.resolved similarity index 100% rename from fixtures/app_with_spm_dependencies/Package.resolved rename to fixtures/app_with_spm_dependencies/Tuist/Package.resolved diff --git a/fixtures/app_with_spm_dependencies/Package.swift b/fixtures/app_with_spm_dependencies/Tuist/Package.swift similarity index 94% rename from fixtures/app_with_spm_dependencies/Package.swift rename to fixtures/app_with_spm_dependencies/Tuist/Package.swift index 4f202f33573..895c9e7582b 100644 --- a/fixtures/app_with_spm_dependencies/Package.swift +++ b/fixtures/app_with_spm_dependencies/Tuist/Package.swift @@ -30,7 +30,7 @@ let package = Package( .package(url: "https://github.com/microsoft/appcenter-sdk-apple", .upToNextMajor(from: "5.0.4")), // Has SWIFTPM_MODULE_BUNDLE .package(url: "https://github.com/tuist/NYTPhotoViewer", branch: "develop"), - .package(path: "LocalSwiftPackage"), - .package(path: "StringifyMacro"), + .package(path: "../LocalSwiftPackage"), + .package(path: "../StringifyMacro"), ] ) diff --git a/fixtures/framework_with_native_swift_macro/Tuist/.gitkeep b/fixtures/framework_with_native_swift_macro/Tuist/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/fixtures/multiplatform_app_with_sdk/Tuist/.gitkeep b/fixtures/multiplatform_app_with_sdk/Tuist/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d From ad18d753d3f46e4f4196c6956ccd1114d29c3488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 19 Feb 2024 09:40:06 +0100 Subject: [PATCH 096/509] Fix failing tuist install when a package is removed (#5948) * Make Tuist/Package.swift a valid location for the SPM manifest * Update docs * Lint fix * Generate package-related files into a different directory * Generate modulemap to tuist derived dir * Add tests for ExternalDependencyPathWorkspaceMapper * Fix ModuleMapMapperTests * Fix WorkspaceStructureGeneratorTests * Fix SwiftPackageManagerModuleMapGeneratorTests * Fix failing acceptance tests * Bring back the ExternalDependencyPathWorkspaceMapper * Remove unused publicHeadersPath param --- .../Utilities/BuildGraphInspector.swift | 9 +- .../Graph/ModelExtensions/Project+Core.swift | 15 ++- ...xternalDependencyPathWorkspaceMapper.swift | 47 ++++++++ .../WorkspaceStructureGenerator.swift | 9 +- .../GenerateInfoPlistProjectMapper.swift | 3 +- .../Mappers/ModuleMapMapper.swift | 100 +++++++++++++----- .../Mappers/ResourcesProjectMapper.swift | 5 +- .../Factories/WorkspaceMapperFactory.swift | 3 + .../PackageInfoMapper.swift | 16 +-- ...wiftPackageManagerModuleMapGenerator.swift | 71 +++++++++---- Sources/TuistSupport/Constants.swift | 1 + ...xternalDependencyPathWorkspaceMapper.swift | 96 +++++++++++++++++ .../WorkspaceStructureGeneratorTests.swift | 8 +- .../ProjectMappers/ModuleMapMapperTests.swift | 22 +++- .../ResourcesProjectMapperTests.swift | 5 +- .../PackageInfoMapperTests.swift | 4 +- ...ackageManagerModuleMapGeneratorTests.swift | 75 ++++++++----- 17 files changed, 376 insertions(+), 113 deletions(-) create mode 100644 Sources/TuistDependencies/Mappers/ExternalDependencyPathWorkspaceMapper.swift create mode 100644 Tests/TuistDependenciesTests/Mappers/ExternalDependencyPathWorkspaceMapper.swift diff --git a/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift b/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift index 78bc9d3e847..cd6fec15a02 100644 --- a/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift +++ b/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift @@ -72,9 +72,16 @@ public final class BuildGraphInspector: BuildGraphInspecting { ) -> [XcodeBuildArgument] { var arguments = [XcodeBuildArgument]() + let configurations: [BuildConfiguration: Configuration?] + if let targetConfigurations = target.settings?.configurations, !targetConfigurations.isEmpty { + configurations = targetConfigurations + } else { + configurations = project.settings.configurations + } + // Configuration if let configuration { - if (target.settings ?? project.settings)?.configurations.first(where: { $0.key.name == configuration }) != nil { + if configurations.contains(where: { $0.key.name == configuration }) { arguments.append(.configuration(configuration)) } else { logger diff --git a/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift index 3b744ee8544..0158dd16f3a 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift @@ -41,25 +41,24 @@ extension Project { } } - public func derivedSourcesPath(for target: Target) -> AbsolutePath { - if isExternal { + public func derivedDirectoryPath(for target: Target) -> AbsolutePath { + if isExternal, + path.pathString + .contains("\(Constants.SwiftPackageManager.packageBuildDirectoryName)/checkouts") + { return path // Leads to SPM's .build directory .parentDirectory.parentDirectory .appending( components: [ - Constants.DerivedDirectory.name, + Constants.DerivedDirectory.dependenciesDerivedDirectory, target.name, - Constants.DerivedDirectory.sources, ] ) } else { return path .appending( - components: [ - Constants.DerivedDirectory.name, - Constants.DerivedDirectory.sources, - ] + component: Constants.DerivedDirectory.name ) } } diff --git a/Sources/TuistDependencies/Mappers/ExternalDependencyPathWorkspaceMapper.swift b/Sources/TuistDependencies/Mappers/ExternalDependencyPathWorkspaceMapper.swift new file mode 100644 index 00000000000..b5fc4a34e53 --- /dev/null +++ b/Sources/TuistDependencies/Mappers/ExternalDependencyPathWorkspaceMapper.swift @@ -0,0 +1,47 @@ +import Foundation +import TSCBasic +import TuistCore +import TuistGraph +import TuistSupport + +public final class ExternalDependencyPathWorkspaceMapper: WorkspaceMapping { + public init() {} + + public func map(workspace: WorkspaceWithProjects) throws -> (WorkspaceWithProjects, [SideEffectDescriptor]) { + var workspace = workspace + let mappedProjects = try workspace.projects.map(map(project:)) + workspace.projects = mappedProjects.map(\.0) + return ( + workspace, + mappedProjects.flatMap(\.1) + ) + } + + // MARK: - Helpers + + private func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { + guard project.isExternal, + // We don't want to update local packages (which are defined outside the `checkouts` directory in `.build` + project.path.parentDirectory.parentDirectory.basename == Constants.SwiftPackageManager.packageBuildDirectoryName + else { return (project, []) } + var project = project + let xcodeProjBasename = project.xcodeProjPath.basename + let derivedDirectory = project.path.parentDirectory.parentDirectory.appending( + components: Constants.DerivedDirectory.dependenciesDerivedDirectory, project.name + ) + project.xcodeProjPath = derivedDirectory.appending(component: xcodeProjBasename) + + var base = project.settings.base + // Keep the value if already defined + if base["SRCROOT"] == nil { + base["SRCROOT"] = SettingValue(stringLiteral: project.sourceRootPath.pathString) + } + project.settings = project.settings.with( + base: base + ) + return ( + project, + [] + ) + } +} diff --git a/Sources/TuistGenerator/Generator/WorkspaceStructureGenerator.swift b/Sources/TuistGenerator/Generator/WorkspaceStructureGenerator.swift index e146d6661be..c13e6c4a940 100644 --- a/Sources/TuistGenerator/Generator/WorkspaceStructureGenerator.swift +++ b/Sources/TuistGenerator/Generator/WorkspaceStructureGenerator.swift @@ -130,8 +130,13 @@ private class DirectoryStructure { private func isDependencyProject(_ node: Node) -> Bool { switch node { - case let .project(path): return path.pathString.contains(".build/checkouts") - case .directory, .file, .folderReference, .virtualGroup: return false + case let .project(path): + return path.pathString + .contains( + "\(Constants.SwiftPackageManager.packageBuildDirectoryName)/\(Constants.DerivedDirectory.dependenciesDerivedDirectory)" + ) + case .directory, .file, .folderReference, .virtualGroup: + return false } } diff --git a/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift b/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift index 27b16cecb50..a23b61f25e9 100644 --- a/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift @@ -70,8 +70,7 @@ public final class GenerateInfoPlistProjectMapper: ProjectMapping { options: 0 ) - let infoPlistPath = project.path - .appending(component: derivedDirectoryName) + let infoPlistPath = project.derivedDirectoryPath(for: target) .appending(component: infoPlistsDirectoryName) .appending(component: "\(target.name)-Info.plist") let sideEffect = SideEffectDescriptor.file(FileDescriptor(path: infoPlistPath, contents: data)) diff --git a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift index 1a4b55cd574..3c050394238 100644 --- a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift +++ b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift @@ -58,6 +58,11 @@ public final class ModuleMapMapper: WorkspaceMapping { let targetName: String } + private struct DependencyMetadata: Hashable { + let moduleMapPath: AbsolutePath? + let headerSearchPaths: [String] + } + public init() {} // swiftlint:disable function_body_length @@ -68,14 +73,14 @@ public final class ModuleMapMapper: WorkspaceMapping { ) let (projectsByPath, targetsByName) = Self.makeProjectsByPathWithTargetsByName(workspace: workspace) - var targetToModuleMaps: [TargetID: Set] = [:] + var targetToDependenciesMetadata: [TargetID: Set] = [:] for project in workspace.projects { for target in project.targets { try Self.dependenciesModuleMaps( workspace: workspace, project: project, target: target, - targetToModuleMaps: &targetToModuleMaps, + targetToDependenciesMetadata: &targetToDependenciesMetadata, projectsByPath: projectsByPath, targetsByName: targetsByName ) @@ -90,7 +95,7 @@ public final class ModuleMapMapper: WorkspaceMapping { let targetID = TargetID(projectPath: mappedProject.path, targetName: mappedTarget.name) var mappedSettingsDictionary = mappedTarget.settings?.base ?? [:] let hasModuleMap = mappedSettingsDictionary[Self.modulemapFileSetting] != nil - guard hasModuleMap || !(targetToModuleMaps[targetID]?.isEmpty ?? true) else { continue } + guard hasModuleMap || !(targetToDependenciesMetadata[targetID]?.isEmpty ?? true) else { continue } if hasModuleMap { mappedSettingsDictionary[Self.modulemapFileSetting] = nil @@ -99,7 +104,7 @@ public final class ModuleMapMapper: WorkspaceMapping { if let updatedOtherSwiftFlags = Self.updatedOtherSwiftFlags( targetID: targetID, oldOtherSwiftFlags: mappedSettingsDictionary[Self.otherSwiftFlagsSetting], - targetToModuleMaps: targetToModuleMaps + targetToDependenciesMetadata: targetToDependenciesMetadata ) { mappedSettingsDictionary[Self.otherSwiftFlagsSetting] = updatedOtherSwiftFlags } @@ -107,7 +112,7 @@ public final class ModuleMapMapper: WorkspaceMapping { if let updatedOtherCFlags = Self.updatedOtherCFlags( targetID: targetID, oldOtherCFlags: mappedSettingsDictionary[Self.otherCFlagsSetting], - targetToModuleMaps: targetToModuleMaps + targetToDependenciesMetadata: targetToDependenciesMetadata ) { mappedSettingsDictionary[Self.otherCFlagsSetting] = updatedOtherCFlags } @@ -115,7 +120,7 @@ public final class ModuleMapMapper: WorkspaceMapping { if let updatedHeaderSearchPaths = Self.updatedHeaderSearchPaths( targetID: targetID, oldHeaderSearchPaths: mappedSettingsDictionary[Self.headerSearchPaths], - targetToModuleMaps: targetToModuleMaps + targetToDependenciesMetadata: targetToDependenciesMetadata ) { mappedSettingsDictionary[Self.headerSearchPaths] = updatedHeaderSearchPaths } @@ -123,7 +128,7 @@ public final class ModuleMapMapper: WorkspaceMapping { if let updatedOtherLinkerFlags = Self.updatedOtherLinkerFlags( targetID: targetID, oldOtherLinkerFlags: mappedSettingsDictionary[Self.otherLinkerFlagsSetting], - targetToModuleMaps: targetToModuleMaps + targetToDependenciesMetadata: targetToDependenciesMetadata ) { mappedSettingsDictionary[Self.otherLinkerFlagsSetting] = updatedOtherLinkerFlags } @@ -155,24 +160,25 @@ public final class ModuleMapMapper: WorkspaceMapping { return (projectsByPath, targetsByName) } - /// Calculates the set of module maps to be linked to a given target and populates the `targetToModuleMaps` dictionary. + /// Calculates the set of module maps to be linked to a given target and populates the `targetToDependenciesMetadata` + /// dictionary. /// Each target must link the module map of its direct and indirect dependencies. - /// The `targetToModuleMaps` is also used as cache to avoid recomputing the set for already computed targets. + /// The `targetToDependenciesMetadata` is also used as cache to avoid recomputing the set for already computed targets. private static func dependenciesModuleMaps( // swiftlint:disable:this function_body_length workspace: WorkspaceWithProjects, project: Project, target: Target, - targetToModuleMaps: inout [TargetID: Set], + targetToDependenciesMetadata: inout [TargetID: Set], projectsByPath: [AbsolutePath: Project], targetsByName: [String: Target] ) throws { let targetID = TargetID(projectPath: project.path, targetName: target.name) - if targetToModuleMaps[targetID] != nil { + if targetToDependenciesMetadata[targetID] != nil { // already computed return } - var dependenciesModuleMaps: Set = [] + var dependenciesMetadata: Set = [] for dependency in target.dependencies { let dependentProject: Project let dependentTarget: Target @@ -208,39 +214,71 @@ public final class ModuleMapMapper: WorkspaceMapping { workspace: workspace, project: dependentProject, target: dependentTarget, - targetToModuleMaps: &targetToModuleMaps, + targetToDependenciesMetadata: &targetToDependenciesMetadata, projectsByPath: projectsByPath, targetsByName: targetsByName ) // direct dependency module map + let dependencyModuleMapPath: AbsolutePath? + if case let .string(dependencyModuleMap) = dependentTarget.settings?.base[Self.modulemapFileSetting] { let pathString = dependentProject.path.pathString - let dependencyModuleMapPath = try AbsolutePath( + dependencyModuleMapPath = try AbsolutePath( validating: dependencyModuleMap .replacingOccurrences(of: "$(PROJECT_DIR)", with: pathString) .replacingOccurrences(of: "$(SRCROOT)", with: pathString) .replacingOccurrences(of: "$(SOURCE_ROOT)", with: pathString) ) - dependenciesModuleMaps.insert(dependencyModuleMapPath) + } else { + dependencyModuleMapPath = nil + } + + var headerSearchPaths: [String] + switch dependentTarget.settings?.base[Self.headerSearchPaths] ?? .array([]) { + case let .array(values): + headerSearchPaths = values + case let .string(value): + headerSearchPaths = [value] + } + + headerSearchPaths = headerSearchPaths.map { + let pathString = dependentProject.path.pathString + return ( + try? AbsolutePath( + validating: $0 + .replacingOccurrences(of: "$(PROJECT_DIR)", with: pathString) + .replacingOccurrences(of: "$(SRCROOT)", with: pathString) + .replacingOccurrences(of: "$(SOURCE_ROOT)", with: pathString) + ).pathString + ) ?? $0 } // indirect dependency module maps let dependentTargetID = TargetID(projectPath: dependentProject.path, targetName: dependentTarget.name) - if let indirectDependencyModuleMap = targetToModuleMaps[dependentTargetID] { - dependenciesModuleMaps.formUnion(indirectDependencyModuleMap) + if let indirectDependencyMetadata = targetToDependenciesMetadata[dependentTargetID] { + dependenciesMetadata.formUnion(indirectDependencyMetadata) } + + dependenciesMetadata.insert( + DependencyMetadata( + moduleMapPath: dependencyModuleMapPath, + headerSearchPaths: headerSearchPaths + ) + ) } - targetToModuleMaps[targetID] = dependenciesModuleMaps + targetToDependenciesMetadata[targetID] = dependenciesMetadata } private static func updatedHeaderSearchPaths( targetID: TargetID, oldHeaderSearchPaths: SettingsDictionary.Value?, - targetToModuleMaps: [TargetID: Set] + targetToDependenciesMetadata: [TargetID: Set] ) -> SettingsDictionary.Value? { - guard let dependenciesModuleMaps = targetToModuleMaps[targetID], !dependenciesModuleMaps.isEmpty else { return nil } + let dependenciesHeaderSearchPaths = Set(targetToDependenciesMetadata[targetID]?.flatMap(\.headerSearchPaths) ?? []) + guard !dependenciesHeaderSearchPaths.isEmpty + else { return nil } var mappedHeaderSearchPaths: [String] switch oldHeaderSearchPaths ?? .array(["$(inherited)"]) { @@ -250,9 +288,9 @@ public final class ModuleMapMapper: WorkspaceMapping { mappedHeaderSearchPaths = value.split(separator: " ").map(String.init) } - for moduleMap in dependenciesModuleMaps.sorted() { + for headerSearchPath in dependenciesHeaderSearchPaths.sorted() { mappedHeaderSearchPaths.append( - "$(SRCROOT)/\(moduleMap.relative(to: targetID.projectPath).appending(components: ".."))" + headerSearchPath ) } @@ -262,9 +300,11 @@ public final class ModuleMapMapper: WorkspaceMapping { private static func updatedOtherSwiftFlags( targetID: TargetID, oldOtherSwiftFlags: SettingsDictionary.Value?, - targetToModuleMaps: [TargetID: Set] + targetToDependenciesMetadata: [TargetID: Set] ) -> SettingsDictionary.Value? { - guard let dependenciesModuleMaps = targetToModuleMaps[targetID], !dependenciesModuleMaps.isEmpty else { return nil } + guard let dependenciesModuleMaps = targetToDependenciesMetadata[targetID]?.compactMap(\.moduleMapPath), + !dependenciesModuleMaps.isEmpty + else { return nil } var mappedOtherSwiftFlags: [String] switch oldOtherSwiftFlags ?? .array(["$(inherited)"]) { @@ -287,9 +327,11 @@ public final class ModuleMapMapper: WorkspaceMapping { private static func updatedOtherCFlags( targetID: TargetID, oldOtherCFlags: SettingsDictionary.Value?, - targetToModuleMaps: [TargetID: Set] + targetToDependenciesMetadata: [TargetID: Set] ) -> SettingsDictionary.Value? { - guard let dependenciesModuleMaps = targetToModuleMaps[targetID], !dependenciesModuleMaps.isEmpty else { return nil } + guard let dependenciesModuleMaps = targetToDependenciesMetadata[targetID]?.compactMap(\.moduleMapPath), + !dependenciesModuleMaps.isEmpty + else { return nil } var mappedOtherCFlags: [String] switch oldOtherCFlags ?? .array(["$(inherited)"]) { @@ -309,9 +351,11 @@ public final class ModuleMapMapper: WorkspaceMapping { private static func updatedOtherLinkerFlags( targetID: TargetID, oldOtherLinkerFlags: SettingsDictionary.Value?, - targetToModuleMaps: [TargetID: Set] + targetToDependenciesMetadata: [TargetID: Set] ) -> SettingsDictionary.Value? { - guard let dependenciesModuleMaps = targetToModuleMaps[targetID], !dependenciesModuleMaps.isEmpty else { return nil } + guard let dependenciesModuleMaps = targetToDependenciesMetadata[targetID]?.compactMap(\.moduleMapPath), + !dependenciesModuleMaps.isEmpty + else { return nil } var mappedOtherLinkerFlags: [String] switch oldOtherLinkerFlags ?? .array(["$(inherited)"]) { diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 49cc8fc03a2..d13958a3bdb 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -118,8 +118,7 @@ public class ResourcesProjectMapper: ProjectMapping { } func synthesizedSwiftFile(bundleName: String, target: Target, project: Project) -> (AbsolutePath, Data?) { - let filePath = project.path - .appending(component: Constants.DerivedDirectory.name) + let filePath = project.derivedDirectoryPath(for: target) .appending(component: Constants.DerivedDirectory.sources) .appending(component: "TuistBundle+\(target.name.toValidSwiftIdentifier()).swift") @@ -159,7 +158,7 @@ public class ResourcesProjectMapper: ProjectMapping { private func synthesizedFilePath(target: Target, project: Project, fileExtension: String) -> AbsolutePath { let filename = "TuistBundle+\(target.name.camelized.uppercasingFirst).\(fileExtension)" - return project.derivedSourcesPath(for: target).appending(component: filename) + return project.derivedDirectoryPath(for: target).appending(components: Constants.DerivedDirectory.sources, filename) } // swiftlint:disable:next function_body_length diff --git a/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift b/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift index 0cd9ceea44e..0e5bb6c8d03 100644 --- a/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift +++ b/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift @@ -3,6 +3,7 @@ import TSCBasic import TSCUtility import TuistAutomation import TuistCore +import TuistDependencies import TuistGenerator import TuistGraph @@ -66,6 +67,8 @@ public final class WorkspaceMapperFactory: WorkspaceMapperFactorying { LastUpgradeVersionWorkspaceMapper() ) + mappers.append(ExternalDependencyPathWorkspaceMapper()) + return mappers } } diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 8c911f699e1..93b9d4356eb 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -318,6 +318,7 @@ public final class PackageInfoMapper: PackageInfoMapping { result[target.name] = ModuleMap.custom(moduleMapPath, umbrellaHeaderPath: nil) case .regular: result[target.name] = try moduleMapGenerator.generate( + packageDirectory: packageToFolder[packageInfo.key]!, moduleName: target.name, publicHeadersPath: target.publicHeadersPath(packageFolder: packageToFolder[packageInfo.key]!) ) @@ -562,14 +563,12 @@ extension ProjectDescription.Target { packageName: packageName ) - var publicHeadersPath: AbsolutePath? var headers: ProjectDescription.Headers? var sources: SourceFilesList? var resources: ResourceFileElements? if target.type.supportsPublicHeaderPath { - publicHeadersPath = try target.publicHeadersPath(packageFolder: packageFolder) - headers = try Headers.from(moduleMap: moduleMap, publicHeadersPath: publicHeadersPath!) + headers = try Headers.from(moduleMap: moduleMap) } if target.type.supportsSources { @@ -906,16 +905,11 @@ extension ProjectDescription.TargetDependency { } extension ProjectDescription.Headers { - fileprivate static func from(moduleMap: ModuleMap?, publicHeadersPath: AbsolutePath) throws -> Self? { + fileprivate static func from(moduleMap: ModuleMap?) throws -> Self? { guard let moduleMap else { return nil } // As per SPM logic, headers should be added only when using the umbrella header without modulemap: // https://github.com/apple/swift-package-manager/blob/9b9bed7eaf0f38eeccd0d8ca06ae08f6689d1c3f/Sources/Xcodeproj/pbxproj.swift#L588-L609 switch moduleMap { - case .nestedHeader: - let publicHeaders = try FileHandler.shared.filesAndDirectoriesContained(in: publicHeadersPath)! - .filter { $0.extension == "h" } - let list: [FileListGlob] = publicHeaders.map { .glob(.path($0.pathString)) } - return .headers(public: .list(list)) case let .directory(moduleMapPath: _, umbrellaDirectory: umbrellaDirectory): return .headers( public: .list( @@ -975,7 +969,7 @@ extension ProjectDescription.Settings { guard let moduleMap = targetToModuleMap[dependency.target.name] else { return nil } switch moduleMap { - case .none, .header, .nestedHeader: + case .none, .header: return nil case .directory, .custom: return "$(SRCROOT)/\(headersPath.relative(to: packageFolder))" @@ -1023,7 +1017,7 @@ extension ProjectDescription.Settings { value.split(separator: " ").map(String.init) + ["-fmodule-name=\(target.name)"] ) } - case .none, .nestedHeader: + case .none: break } } diff --git a/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift b/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift index b3b1fbab792..9ba14f78dcc 100644 --- a/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift +++ b/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift @@ -8,9 +8,7 @@ public enum ModuleMap: Equatable { /// Custom modulemap file provided in SPM package case custom(AbsolutePath, umbrellaHeaderPath: AbsolutePath?) /// Umbrella header provided in SPM package - case header(moduleMapPath: AbsolutePath) - /// Nested umbrella header provided in SPM package - case nestedHeader + case header(AbsolutePath, moduleMapPath: AbsolutePath) /// No umbrella header provided in SPM package, define umbrella directory case directory(moduleMapPath: AbsolutePath, umbrellaDirectory: AbsolutePath) @@ -18,11 +16,11 @@ public enum ModuleMap: Equatable { switch self { case let .custom(path, umbrellaHeaderPath: _): return path - case let .header(moduleMapPath: path): + case let .header(_, moduleMapPath: path): return path case let .directory(moduleMapPath: path, umbrellaDirectory: _): return path - case .none, .nestedHeader: + case .none: return nil } } @@ -37,13 +35,18 @@ public enum ModuleMap: Equatable { /// and /// [implemented here](https://github.com/apple/swift-package-manager/blob/main/Sources/PackageLoading/ModuleMapGenerator.swift). public protocol SwiftPackageManagerModuleMapGenerating { - func generate(moduleName: String, publicHeadersPath: AbsolutePath) throws -> ModuleMap + func generate( + packageDirectory: AbsolutePath, + moduleName: String, + publicHeadersPath: AbsolutePath + ) throws -> ModuleMap } public final class SwiftPackageManagerModuleMapGenerator: SwiftPackageManagerModuleMapGenerating { public init() {} public func generate( + packageDirectory: AbsolutePath, moduleName: String, publicHeadersPath: AbsolutePath ) throws -> ModuleMap { @@ -51,29 +54,49 @@ public final class SwiftPackageManagerModuleMapGenerator: SwiftPackageManagerMod let nestedUmbrellaHeaderPath = publicHeadersPath.appending(component: moduleName).appending(component: moduleName + ".h") let sanitizedModuleName = moduleName.replacingOccurrences(of: "-", with: "_") let customModuleMapPath = try Self.customModuleMapPath(publicHeadersPath: publicHeadersPath) + let generatedModuleMapPath: AbsolutePath + + if publicHeadersPath.pathString.contains("\(Constants.SwiftPackageManager.packageBuildDirectoryName)/checkouts") { + generatedModuleMapPath = packageDirectory + .parentDirectory + .parentDirectory + .appending( + components: Constants.DerivedDirectory.dependenciesDerivedDirectory, + moduleName, + "\(moduleName).modulemap" + ) + } else { + generatedModuleMapPath = packageDirectory.appending( + components: Constants.DerivedDirectory.name, "\(moduleName).modulemap" + ) + } + + if !FileHandler.shared.exists(generatedModuleMapPath.parentDirectory) { + try FileHandler.shared.createFolder(generatedModuleMapPath.parentDirectory) + } if FileHandler.shared.exists(umbrellaHeaderPath) { if let customModuleMapPath { return .custom(customModuleMapPath, umbrellaHeaderPath: umbrellaHeaderPath) } - let moduleMapContent = """ - framework module \(sanitizedModuleName) { - umbrella header "\(umbrellaHeaderPath.pathString)" - - export * - module * { export * } - } - """ - let moduleMapPath = umbrellaHeaderPath.parentDirectory.appending(component: "\(moduleName).modulemap") - try FileHandler.shared.write(moduleMapContent, path: moduleMapPath, atomically: true) + try FileHandler.shared.write( + umbrellaHeaderModuleMap(umbrellaHeaderPath: umbrellaHeaderPath, sanitizedModuleName: sanitizedModuleName), + path: generatedModuleMapPath, + atomically: true + ) // If 'PublicHeadersDir/ModuleName.h' exists, then use it as the umbrella header. - return .header(moduleMapPath: moduleMapPath) + return .header(umbrellaHeaderPath, moduleMapPath: generatedModuleMapPath) } else if FileHandler.shared.exists(nestedUmbrellaHeaderPath) { if let customModuleMapPath { return .custom(customModuleMapPath, umbrellaHeaderPath: nestedUmbrellaHeaderPath) } + try FileHandler.shared.write( + umbrellaHeaderModuleMap(umbrellaHeaderPath: nestedUmbrellaHeaderPath, sanitizedModuleName: sanitizedModuleName), + path: generatedModuleMapPath, + atomically: true + ) // If 'PublicHeadersDir/ModuleName/ModuleName.h' exists, then use it as the umbrella header. - return .nestedHeader + return .header(nestedUmbrellaHeaderPath, moduleMapPath: generatedModuleMapPath) } else if let customModuleMapPath { // User defined modulemap exists, use it return .custom(customModuleMapPath, umbrellaHeaderPath: nil) @@ -86,7 +109,6 @@ public final class SwiftPackageManagerModuleMapGenerator: SwiftPackageManagerMod export * } """ - let generatedModuleMapPath = publicHeadersPath.appending(component: "\(moduleName).modulemap") try FileHandler.shared.write(generatedModuleMapContent, path: generatedModuleMapPath, atomically: true) return .directory(moduleMapPath: generatedModuleMapPath, umbrellaDirectory: publicHeadersPath) } else { @@ -112,4 +134,15 @@ public final class SwiftPackageManagerModuleMapGenerator: SwiftPackageManagerMod return nil } } + + private func umbrellaHeaderModuleMap(umbrellaHeaderPath: AbsolutePath, sanitizedModuleName: String) -> String { + """ + framework module \(sanitizedModuleName) { + umbrella header "\(umbrellaHeaderPath.pathString)" + + export * + module * { export * } + } + """ + } } diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index a6f15df8176..ffa1ac68778 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -44,6 +44,7 @@ public enum Constants { public static let moduleMaps = "ModuleMaps" public static let sources = "Sources" public static let signingKeychain = "signing.keychain" + public static let dependenciesDerivedDirectory = "tuist-derived" } public enum AsyncQueue { diff --git a/Tests/TuistDependenciesTests/Mappers/ExternalDependencyPathWorkspaceMapper.swift b/Tests/TuistDependenciesTests/Mappers/ExternalDependencyPathWorkspaceMapper.swift new file mode 100644 index 00000000000..98844980f1c --- /dev/null +++ b/Tests/TuistDependenciesTests/Mappers/ExternalDependencyPathWorkspaceMapper.swift @@ -0,0 +1,96 @@ +import Foundation +import TSCBasic +import TuistCore +import TuistGraph +import TuistSupport +import TuistSupportTesting +import XCTest + +@testable import TuistDependencies + +final class ExternalDependencyPathWorkspaceMapperTests: TuistUnitTestCase { + private var subject: ExternalDependencyPathWorkspaceMapper! + + override func setUp() { + super.setUp() + subject = ExternalDependencyPathWorkspaceMapper() + } + + override func tearDown() { + subject = nil + super.tearDown() + } + + func test_map() throws { + // Given + let projectPath = try temporaryPath() + let project = Project.test( + path: projectPath, + sourceRootPath: projectPath, + xcodeProjPath: projectPath.appending(component: "A.xcodeproj"), + name: "A" + ) + + let externalProjectBasePath = try temporaryPath() + .appending(component: Constants.SwiftPackageManager.packageBuildDirectoryName) + let externalProjectPath = externalProjectBasePath.appending( + components: [ + "checkouts", + "ExternalDependency", + ] + ) + let externalProject = Project.test( + path: externalProjectPath, + sourceRootPath: externalProjectPath, + xcodeProjPath: externalProjectPath.appending(component: "ExternalDependency.xcodeproj"), + name: "ExternalDependency", + isExternal: true + ) + + let workspace = Workspace.test( + name: "A" + ) + + // When + let (gotWorkspaceWithProjects, _) = try subject.map( + workspace: WorkspaceWithProjects( + workspace: workspace, + projects: [ + project, + externalProject, + ] + ) + ) + + // Then + XCTAssertBetterEqual( + gotWorkspaceWithProjects.projects, + [ + Project.test( + path: projectPath, + sourceRootPath: projectPath, + xcodeProjPath: projectPath.appending(component: "A.xcodeproj"), + name: "A" + ), + Project.test( + path: externalProjectPath, + sourceRootPath: externalProject.sourceRootPath, + xcodeProjPath: externalProjectBasePath.appending( + components: [ + Constants.DerivedDirectory.dependenciesDerivedDirectory, + "ExternalDependency", + "ExternalDependency.xcodeproj", + ] + ), + name: "ExternalDependency", + settings: Settings.test( + base: [ + "SRCROOT": .string(externalProjectPath.pathString), + ] + ), + isExternal: true + ), + ] + ) + } +} diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift index aa9a666b7b2..6708267d1d7 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift @@ -288,8 +288,8 @@ final class WorkspaceStructureGeneratorTests: XCTestCase { func test_generateStructure_addsDependenciesToADependenciesGroup() throws { // Given let xcodeProjPaths = try createFolders([ - "/path/to/workspace/Tuist/Dependencies/SwiftPackageManager/.build/checkouts/AEXML/AEXML.xcodeproj", - "/path/to/workspace/Tuist/Dependencies/SwiftPackageManager/.build/checkouts/SwiftSyntax/SwiftSyntax.xcodeproj", + "/path/to/workspace/Tuist/.build/tuist-derived/AEXML/AEXML.xcodeproj", + "/path/to/workspace/Tuist/.build/tuist-derived/SwiftSyntax/SwiftSyntax.xcodeproj", ]) let workspace = Workspace.test() @@ -305,9 +305,9 @@ final class WorkspaceStructureGeneratorTests: XCTestCase { // Then XCTAssertEqual(structure.contents, [ .virtualGroup(name: "Dependencies", contents: [ - .project("/path/to/workspace/Tuist/Dependencies/SwiftPackageManager/.build/checkouts/AEXML/AEXML.xcodeproj"), + .project("/path/to/workspace/Tuist/.build/tuist-derived/AEXML/AEXML.xcodeproj"), .project( - "/path/to/workspace/Tuist/Dependencies/SwiftPackageManager/.build/checkouts/SwiftSyntax/SwiftSyntax.xcodeproj" + "/path/to/workspace/Tuist/.build/tuist-derived/SwiftSyntax/SwiftSyntax.xcodeproj" ), ]), ]) diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift index 7c6761b4ad5..d30a043e2f0 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift @@ -47,6 +47,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { name: "B1", settings: .test(base: [ "MODULEMAP_FILE": .string(projectBPath.appending(components: "B1", "B1.module").pathString), + "HEADER_SEARCH_PATHS": .array(["$(SRCROOT)/B1/include"]), ]), dependencies: [ .target(name: "B2"), @@ -56,6 +57,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { name: "B2", settings: .test(base: [ "MODULEMAP_FILE": .string(projectBPath.appending(components: "B2", "B2.module").pathString), + "HEADER_SEARCH_PATHS": .array(["$(SRCROOT)/B2/include"]), ]) ) let projectB = Project.test( @@ -94,7 +96,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { "-Xcc", "-fmodule-map-file=$(SRCROOT)/../B/B2/B2.module", ]), - "HEADER_SEARCH_PATHS": .array(["$(inherited)", "$(SRCROOT)/../B/B1", "$(SRCROOT)/../B/B2"]), + "HEADER_SEARCH_PATHS": .array(["$(inherited)", "\(projectBPath)/B1/include", "\(projectBPath)/B2/include"]), "OTHER_LDFLAGS": .array(["$(inherited)", "-ObjC"]), ]), dependencies: [ @@ -114,7 +116,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { settings: .test(base: [ "OTHER_CFLAGS": .array(["$(inherited)", "-fmodule-map-file=$(SRCROOT)/B2/B2.module"]), "OTHER_SWIFT_FLAGS": .array(["$(inherited)", "-Xcc", "-fmodule-map-file=$(SRCROOT)/B2/B2.module"]), - "HEADER_SEARCH_PATHS": .array(["$(inherited)", "$(SRCROOT)/B2"]), + "HEADER_SEARCH_PATHS": .array(["$(SRCROOT)/B1/include", "\(projectBPath)/B2/include"]), "OTHER_LDFLAGS": .array(["$(inherited)", "-ObjC"]), ]), dependencies: [ @@ -122,7 +124,12 @@ final class ModuleMapMapperTests: TuistUnitTestCase { ] ) let mappedTargetB2 = Target.test( - name: "B2" + name: "B2", + settings: .test( + base: [ + "HEADER_SEARCH_PATHS": .array(["$(SRCROOT)/B2/include"]), + ] + ) ) let mappedProjectB = Project.test( path: projectBPath, @@ -171,6 +178,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { name: "B", settings: .test(base: [ "MODULEMAP_FILE": .string(projectBPath.appending(components: "B", "B.module").pathString), + "HEADER_SEARCH_PATHS": .array(["$(SRCROOT)/B/include"]), ]) ) let projectB = Project.test( @@ -206,7 +214,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { "-Xcc", "-fmodule-map-file=$(SRCROOT)/../B/B/B.module", ]), - "HEADER_SEARCH_PATHS": .array(["$(inherited)", "$(SRCROOT)/../B/B"]), + "HEADER_SEARCH_PATHS": .array(["$(inherited)", "\(projectBPath)/B/include"]), "OTHER_LDFLAGS": .array(["$(inherited)", "-ObjC"]), ], configurations: [:], @@ -226,7 +234,11 @@ final class ModuleMapMapperTests: TuistUnitTestCase { let mappedTargetB = Target.test( name: "B", - settings: .test(base: [:]) + settings: .test( + base: [ + "HEADER_SEARCH_PATHS": .array(["$(SRCROOT)/B/include"]), + ] + ) ) let mappedProjectB = Project.test( path: projectBPath, diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 6549e7891e5..7f32226de59 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -342,7 +342,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual( gotTarget.settings?.base["GCC_PREFIX_HEADER"], .string( - "$(SRCROOT)/../../\(Constants.DerivedDirectory.name)/\(target.name)/\(Constants.DerivedDirectory.sources)/TuistBundle+\(target.name).h" + "$(SRCROOT)/\(Constants.DerivedDirectory.name)/\(Constants.DerivedDirectory.sources)/TuistBundle+\(target.name).h" ) ) XCTAssertEqual(gotTarget.sources.count, 2) @@ -355,7 +355,8 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { } } - let expectedBasePath = project.derivedSourcesPath(for: target) + let expectedBasePath = project.derivedDirectoryPath(for: target) + .appending(component: Constants.DerivedDirectory.sources) XCTAssertEqual( generatedFiles, [ diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 549de4aa0be..e2964fbec0f 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -1154,7 +1154,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, customSettings: [ "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Target1/include"], - "MODULEMAP_FILE": .string("$(SRCROOT)/Sources/Target1/include/Target1.modulemap"), + "MODULEMAP_FILE": .string("$(SRCROOT)/Derived/Target1.modulemap"), "DEFINES_MODULE": "NO", "OTHER_CFLAGS": .array(["-fmodule-name=Target1"]), ] @@ -1471,7 +1471,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "DEFINES_MODULE": "NO", "OTHER_CFLAGS": .array(["-fmodule-name=Dependency1"]), ], - moduleMap: "$(SRCROOT)/Sources/Dependency1/include/Dependency1.modulemap" + moduleMap: "$(SRCROOT)/Derived/Dependency1.modulemap" ), ] ) diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift index ad445e9e08b..87f70cf29b9 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift @@ -26,11 +26,17 @@ class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { } func test_generate_when_umbrella_header() throws { - try test_generate(for: .header(moduleMapPath: "/Absolute/Public/Headers/Path/Module.modulemap")) + try test_generate(for: .header( + "/Absolute/Public/Headers/Path/Module.h", + moduleMapPath: "/Absolute/PackageDir/Derived/Module.modulemap" + )) } func test_generate_when_nested_umbrella_header() throws { - try test_generate(for: .nestedHeader) + try test_generate(for: .header( + "/Absolute/Public/Headers/Path/Module/Module.h", + moduleMapPath: "/Absolute/PackageDir/Derived/Module.modulemap" + )) } private func test_generate(for moduleMap: ModuleMap) throws { @@ -41,10 +47,12 @@ class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { return [] case .custom: return ["/Absolute/Public/Headers/Path/module.modulemap"] - case .header: - return ["/Absolute/Public/Headers/Path/Module.h"] - case .nestedHeader: - return ["/Absolute/Public/Headers/Path/Module/Module.h"] + case let .header(umbrellaHeaderPath, moduleMapPath: _): + if umbrellaHeaderPath.parentDirectory.basename == "Module" { + return ["/Absolute/Public/Headers/Path/Module/Module.h"] + } else { + return ["/Absolute/Public/Headers/Path/Module.h"] + } case .directory: return ["/Absolute/Public/Headers/Path/AnotherHeader.h"] } @@ -56,9 +64,17 @@ class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { case "/Absolute/Public/Headers/Path/module.modulemap": return moduleMap == .custom("/Absolute/Public/Headers/Path/module.modulemap", umbrellaHeaderPath: nil) case "/Absolute/Public/Headers/Path/Module.h": - return moduleMap == .header(moduleMapPath: AbsolutePath("/Absolute/Public/Headers/Path/Module.modulemap")) + return moduleMap == .header( + AbsolutePath("/Absolute/Public/Headers/Path/Module.h"), + moduleMapPath: AbsolutePath("/Absolute/PackageDir/Derived/Module.modulemap") + ) case "/Absolute/Public/Headers/Path/Module/Module.h": - return moduleMap == .nestedHeader + return moduleMap == .header( + AbsolutePath("/Absolute/Public/Headers/Path/Module/Module.h"), + moduleMapPath: AbsolutePath("/Absolute/PackageDir/Derived/Module.modulemap") + ) + case "/Absolute/PackageDir/Derived": + return true default: XCTFail("Unexpected exists call: \(path)") return false @@ -71,23 +87,26 @@ class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { case .none, .custom: XCTFail("FileHandler.write should not be called") return - case .header: - expectedContent = """ - framework module Module { - umbrella header "/Absolute/Public/Headers/Path/Module.h" + case let .header(umbrellaHeaderPath, moduleMapPath: _): + if umbrellaHeaderPath.parentDirectory.basename == "Module" { + expectedContent = """ + framework module Module { + umbrella header "/Absolute/Public/Headers/Path/Module/Module.h" - export * - module * { export * } - } - """ - case .nestedHeader: - expectedContent = """ - module Module { - umbrella header "/Absolute/Public/Headers/Path/Module/Module.h" - export * - } + export * + module * { export * } + } + """ + } else { + expectedContent = """ + framework module Module { + umbrella header "/Absolute/Public/Headers/Path/Module.h" - """ + export * + module * { export * } + } + """ + } case .directory: expectedContent = """ module Module { @@ -98,13 +117,17 @@ class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { """ } XCTAssertEqual(content, expectedContent) - XCTAssertEqual(path, "/Absolute/Public/Headers/Path/Module.modulemap") + XCTAssertEqual(path, "/Absolute/PackageDir/Derived/Module.modulemap") XCTAssertTrue(atomically) } - let got = try subject.generate(moduleName: "Module", publicHeadersPath: "/Absolute/Public/Headers/Path") + let got = try subject.generate( + packageDirectory: "/Absolute/PackageDir", + moduleName: "Module", + publicHeadersPath: "/Absolute/Public/Headers/Path" + ) XCTAssertEqual(got, moduleMap) switch moduleMap { - case .none, .custom, .nestedHeader: + case .none, .custom: XCTAssertFalse(writeCalled) case .directory, .header: XCTAssertTrue(writeCalled) From 0cc37394a0357514832ffa178288629dae17bb14 Mon Sep 17 00:00:00 2001 From: fortmarek Date: Mon, 19 Feb 2024 11:36:21 +0000 Subject: [PATCH 097/509] [Release] Tuist 4.3.0 --- .mise.toml | 2 +- CHANGELOG.md | 19 +++++++++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index 364933de064..4eea32c8391 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.2.5" +tuist = "4.3.0" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index 813517be40b..4048f500414 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog +## 4.3.0 - 2024-02-19 + +### Tuist + +#### Changed + +- Make Tuist/Package.swift a valid location for the SPM manifest [#5947](https://github.com/tuist/tuist/pull/5947) by [@fortmarek](https://github.com/fortmarek) + +#### Fixed + +- Fix integration of AppCenter [#5935](https://github.com/tuist/tuist/pull/5935) by [@fortmarek](https://github.com/fortmarek) +- Fix integration of SPM dependencies with resources [#5945](https://github.com/tuist/tuist/pull/5945) by [@fortmarek](https://github.com/fortmarek) +- Fix DEFINES_MODULE warning [#5946](https://github.com/tuist/tuist/pull/5946) by [@fortmarek](https://github.com/fortmarek) +- Fix failing tuist install when a package is removed [#5948](https://github.com/tuist/tuist/pull/5948) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +- no changes + ## 4.2.5 - 2024-02-16 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index ffa1ac68778..5ab177e4c93 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.2.5" + public static let version = "4.3.0" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From 0e2e39f41865f7c88ccb9a0b7784eed03b4c3c6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Mon, 19 Feb 2024 18:00:05 +0100 Subject: [PATCH 098/509] Update FUNDING.yml To include the Polar link --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 62fc6531c89..5b625d6c2cc 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,4 @@ open_collective: tuistapp github: tuist +polar: tuist custom: ["https://polar.sh/tuist"] From f492a86568e6f6b5a44067defa6d7cefb2a5b935 Mon Sep 17 00:00:00 2001 From: Mihai Cristescu Date: Tue, 20 Feb 2024 09:48:44 +0200 Subject: [PATCH 099/509] Add missing `region` parameter in static helper `RunActionOptions`.`options` (#5954) * Add missing parameter in static helper * Fix compilation error * Add docs * Refactoring --- .../ProjectDescription/RunActionOptions.swift | 6 +++++- .../TestData/ProjectDescription+TestData.swift | 6 ++++-- Tests/ProjectDescriptionTests/SchemeTests.swift | 16 ++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Sources/ProjectDescription/RunActionOptions.swift b/Sources/ProjectDescription/RunActionOptions.swift index 75f3e86882e..be17fef12a1 100644 --- a/Sources/ProjectDescription/RunActionOptions.swift +++ b/Sources/ProjectDescription/RunActionOptions.swift @@ -53,7 +53,9 @@ public struct RunActionOptions: Equatable, Codable { /// Creates an `RunActionOptions` instance /// /// - Parameters: - /// - language: language (e.g. "pl"). + /// - language: language (e.g. "en"). + /// + /// - region: region (e.g. "US"). /// /// - storeKitConfigurationPath: The path of the /// [StoreKit configuration @@ -70,12 +72,14 @@ public struct RunActionOptions: Equatable, Codable { public static func options( language: SchemeLanguage? = nil, + region: String? = nil, storeKitConfigurationPath: Path? = nil, simulatedLocation: SimulatedLocation? = nil, enableGPUFrameCaptureMode: GPUFrameCaptureMode = GPUFrameCaptureMode.default ) -> Self { self.init( language: language, + region: region, storeKitConfigurationPath: storeKitConfigurationPath, simulatedLocation: simulatedLocation, enableGPUFrameCaptureMode: enableGPUFrameCaptureMode diff --git a/Sources/TuistLoaderTesting/Loaders/TestData/ProjectDescription+TestData.swift b/Sources/TuistLoaderTesting/Loaders/TestData/ProjectDescription+TestData.swift index 171b21182fc..e5d25802301 100644 --- a/Sources/TuistLoaderTesting/Loaders/TestData/ProjectDescription+TestData.swift +++ b/Sources/TuistLoaderTesting/Loaders/TestData/ProjectDescription+TestData.swift @@ -171,12 +171,14 @@ extension RunAction { public static func test( configuration: ConfigurationName = .debug, executable: TargetReference? = nil, - arguments: Arguments? = nil + arguments: Arguments? = nil, + options: RunActionOptions = .options() ) -> RunAction { RunAction( configuration: configuration, executable: executable, - arguments: arguments + arguments: arguments, + options: options ) } } diff --git a/Tests/ProjectDescriptionTests/SchemeTests.swift b/Tests/ProjectDescriptionTests/SchemeTests.swift index 53e2d5b964d..d90a9b4693a 100644 --- a/Tests/ProjectDescriptionTests/SchemeTests.swift +++ b/Tests/ProjectDescriptionTests/SchemeTests.swift @@ -38,6 +38,13 @@ final class SchemeTests: XCTestCase { arguments: Arguments( environmentVariables: ["run": "b"], launchArguments: [LaunchArgument(name: "run", isEnabled: true)] + ), + options: RunActionOptions( + language: "en", + region: "US", + storeKitConfigurationPath: nil, + simulatedLocation: nil, + enableGPUFrameCaptureMode: .autoEnabled ) ) ) @@ -80,6 +87,13 @@ final class SchemeTests: XCTestCase { arguments: Arguments( environmentVariables: ["run": "b"], launchArguments: [LaunchArgument(name: "run", isEnabled: true)] + ), + options: RunActionOptions( + language: "en", + region: "US", + storeKitConfigurationPath: nil, + simulatedLocation: nil, + enableGPUFrameCaptureMode: .autoEnabled ) ) ) @@ -87,6 +101,8 @@ final class SchemeTests: XCTestCase { // Then XCTAssertEqual(subject.runAction?.configuration.rawValue, "Release") XCTAssertEqual(subject.testAction?.configuration.rawValue, "Debug") + XCTAssertEqual(subject.runAction?.options.language, "en") + XCTAssertEqual(subject.runAction?.options.region, "US") } // MARK: - Helpers From c54cf61b69c81cf3ab169c875a7effd1aef85589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 20 Feb 2024 10:40:11 +0100 Subject: [PATCH 100/509] Fix integration of local packages with Objective C targets (#5957) * Fix integration of a local package with Objective C code * Update app_with_spm_dependencies to include a local package with Objc --- .../DeleteDerivedDirectoryProjectMapper.swift | 26 +++++++++++++++---- ...teDerivedDirectoryProjectMapperTests.swift | 9 +++++-- .../LocalSwiftPackageB/Package.swift | 8 ++++-- .../Sources/LibraryA/MyStruct.swift | 2 ++ .../Sources/LibraryAProxy/Test.mm | 5 ++++ .../Sources/LibraryAProxy/include/Test.h | 5 ++++ 6 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryAProxy/Test.mm create mode 100644 fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryAProxy/include/Test.h diff --git a/Sources/TuistGenerator/Mappers/DeleteDerivedDirectoryProjectMapper.swift b/Sources/TuistGenerator/Mappers/DeleteDerivedDirectoryProjectMapper.swift index ee953ee44be..1526ccbd960 100644 --- a/Sources/TuistGenerator/Mappers/DeleteDerivedDirectoryProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/DeleteDerivedDirectoryProjectMapper.swift @@ -6,9 +6,14 @@ import TuistSupport /// A project mapper that returns side effects to delete the derived directory. public final class DeleteDerivedDirectoryProjectMapper: ProjectMapping { private let derivedDirectoryName: String + private let fileHandler: FileHandling - public init(derivedDirectoryName: String = Constants.DerivedDirectory.name) { + public init( + derivedDirectoryName: String = Constants.DerivedDirectory.name, + fileHandler: FileHandling = FileHandler.shared + ) { self.derivedDirectoryName = derivedDirectoryName + self.fileHandler = fileHandler } // MARK: - ProjectMapping @@ -17,10 +22,21 @@ public final class DeleteDerivedDirectoryProjectMapper: ProjectMapping { logger.debug("Transforming project \(project.name): Deleting /Derived directory") let derivedDirectoryPath = project.path.appending(component: derivedDirectoryName) - let directoryDescriptor = DirectoryDescriptor(path: derivedDirectoryPath, state: .absent) - return (project, [ - .directory(directoryDescriptor), - ]) + if !fileHandler.exists(derivedDirectoryPath) { + return (project, []) + } + + let sideEffects: [SideEffectDescriptor] = try fileHandler.contentsOfDirectory(derivedDirectoryPath) + .filter { $0.extension != "modulemap" } + .map { + if fileHandler.isFolder($0) { + return .directory(DirectoryDescriptor(path: $0, state: .absent)) + } else { + return .file(FileDescriptor(path: $0, state: .absent)) + } + } + + return (project, sideEffects) } } diff --git a/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift index 16f2ce23db0..c15f4604a6f 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift @@ -24,14 +24,19 @@ public final class DeleteDerivedDirectoryProjectMapperTests: TuistUnitTestCase { func test_map_returns_sideEffectsToDeleteDerivedDirectories() throws { // Given - let projectA = Project.test(path: "/projectA") + let projectPath = try temporaryPath() + let derivedDirectory = projectPath.appending(component: Constants.DerivedDirectory.name) + let projectA = Project.test(path: projectPath) + try fileHandler.createFolder(derivedDirectory) + try fileHandler.createFolder(derivedDirectory.appending(component: "InfoPlists")) + try fileHandler.touch(derivedDirectory.appending(component: "TargetA.modulemap")) // When let (_, sideEffects) = try subject.map(project: projectA) // Then XCTAssertEqual(sideEffects, [ - .directory(.init(path: projectA.path.appending(component: Constants.DerivedDirectory.name), state: .absent)), + .directory(.init(path: derivedDirectory.appending(component: "InfoPlists"), state: .absent)), ]) } } diff --git a/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Package.swift b/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Package.swift index 6e0a5f75736..449874f7c08 100644 --- a/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Package.swift +++ b/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Package.swift @@ -8,6 +8,10 @@ let package = Package( defaultLocalization: "en", products: [.library(name: "LibraryA", targets: ["LibraryA"])], targets: [ - .target(name: "LibraryA"), - ] + .target(name: "LibraryA", dependencies: ["LibraryAProxy"]), + .target( + name: "LibraryAProxy" + ), + ], + cxxLanguageStandard: .cxx17 ) diff --git a/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryA/MyStruct.swift b/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryA/MyStruct.swift index d41478e1f40..44a0d843c16 100644 --- a/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryA/MyStruct.swift +++ b/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryA/MyStruct.swift @@ -1 +1,3 @@ +import LibraryAProxy + public struct MyStruct {} diff --git a/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryAProxy/Test.mm b/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryAProxy/Test.mm new file mode 100644 index 00000000000..202415b8d08 --- /dev/null +++ b/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryAProxy/Test.mm @@ -0,0 +1,5 @@ +#import "Test.h" + +@implementation Test { } + +@end diff --git a/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryAProxy/include/Test.h b/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryAProxy/include/Test.h new file mode 100644 index 00000000000..1a061ba95d5 --- /dev/null +++ b/fixtures/app_with_spm_dependencies/LocalSwiftPackageB/Sources/LibraryAProxy/include/Test.h @@ -0,0 +1,5 @@ +#import + +@interface Test : NSObject + +@end From 9b54d154ceb105807881b05124777e8538e06e3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 20 Feb 2024 12:42:29 +0100 Subject: [PATCH 101/509] Improve Tuist project declaration (#5956) * GitButler Integration Commit This is an integration commit for the virtual branches that GitButler is tracking. Due to GitButler managing multiple virtual branches, you cannot switch back and forth between git branches and virtual branches easily. If you switch to another branch, GitButler will need to be reinitialized. If you commit on this branch, GitButler will throw it away. Here are the branches that are currently applied: - Update tuist workspace (refs/gitbutler/Update-tuist-workspace) - Project.swift - Better Tuist declaration (refs/gitbutler/Better-Tuist-declaration) - Project.swift - Update test workflow (refs/gitbutler/Update-test-workflow) - Tuist/ProjectDescriptionHelpers/Target+Helpers.swift - Workspace.swift - Tuist/ProjectDescriptionHelpers/Module.swift - Tests/TuistTestAcceptanceTests/TestAcceptanceTests.swift - Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift - Tests/TuistGenerateAcceptanceTests/GenerateAcceptanceTests.swift - Tests/TuistBuildAcceptanceTests/BuildAcceptanceTests.swift - Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift - Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift - Project.swift - .github/workflows/tuist.yml Your previous branch was: refs/heads/main The sha for that commit was: 0cc37394a0357514832ffa178288629dae17bb14 For more information about what we're doing here, check out our docs: https://docs.gitbutler.com/features/virtual-branches/integration-branch * Fix schemes * Increase the type safety * Fix compilation issue --------- Co-authored-by: GitButler --- .github/workflows/tuist.yml | 9 +- Project.swift | 547 ++------------ .../BuildAcceptanceTests.swift | 0 .../TestAcceptanceTests.swift | 0 .../GenerateAcceptanceTests.swift | 0 Tuist/ProjectDescriptionHelpers/Module.swift | 683 ++++++++++++++++++ .../Target+Helpers.swift | 120 --- Workspace.swift | 3 + 8 files changed, 766 insertions(+), 596 deletions(-) rename Tests/{TuistBuildAcceptanceTests => TuistAutomationAcceptanceTests}/BuildAcceptanceTests.swift (100%) rename Tests/{TuistTestAcceptanceTests => TuistAutomationAcceptanceTests}/TestAcceptanceTests.swift (100%) rename Tests/{TuistGenerateAcceptanceTests => TuistGeneratorAcceptanceTests}/GenerateAcceptanceTests.swift (100%) create mode 100644 Tuist/ProjectDescriptionHelpers/Module.swift delete mode 100644 Tuist/ProjectDescriptionHelpers/Target+Helpers.swift create mode 100644 Workspace.swift diff --git a/.github/workflows/tuist.yml b/.github/workflows/tuist.yml index 921afd41e5c..f26b0d71b43 100644 --- a/.github/workflows/tuist.yml +++ b/.github/workflows/tuist.yml @@ -49,7 +49,7 @@ jobs: - name: Install dependencies run: tuist install - name: Test - run: tuist test --skip-test-targets TuistBuildAcceptanceTests TuistDependenciesAcceptanceTests TuistGenerateAcceptanceTests TuistTestAcceptanceTests TuistAcceptanceTests --result-bundle-path /tmp/tuist/test-${{ matrix.feature }} + run: tuist test TuistUnitTests --result-bundle-path /tmp/tuist/test - uses: actions/upload-artifact@v4 if: ${{ always() }} with: @@ -89,11 +89,10 @@ jobs: matrix: feature: [ - 'TuistAcceptanceTests', - 'TuistBuildAcceptanceTests', + 'tuistAcceptanceTests', + 'TuistAutomationAcceptanceTests', 'TuistDependenciesAcceptanceTests', - 'TuistGenerateAcceptanceTests', - 'TuistTestAcceptanceTests', + 'TuistGeneratorAcceptanceTests' ] steps: - uses: actions/checkout@v4 diff --git a/Project.swift b/Project.swift index 58d9eb45597..c9ca6c24f06 100644 --- a/Project.swift +++ b/Project.swift @@ -13,480 +13,82 @@ func releaseSettings() -> SettingsDictionary { baseSettings } -func targets() -> [Target] { - let executableTargets = [ - Target.target( - name: "tuist", - product: .commandLineTool, - dependencies: [ - .target(name: "TuistKit"), - .target(name: "ProjectDescription"), - .target(name: "ProjectAutomation"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - .external(name: "GraphViz"), - .external(name: "ArgumentParser"), - ], - settings: .settings( - base: [ - "LD_RUNPATH_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", - ], - configurations: [ - .debug(name: "Debug", settings: [:], xcconfig: nil), - .release(name: "Release", settings: [:], xcconfig: nil), - ] +func schemes() -> [Scheme] { + var schemes: [Scheme] = [ + .scheme( + name: "Tuist-Workspace", + buildAction: .buildAction(targets: Module.allCases.flatMap(\.targets).map(\.name).sorted().map { .target($0) }), + testAction: .targets( + Module.allCases.flatMap(\.testTargets).map { .testableTarget(target: .target($0.name)) } + ), + runAction: .runAction( + arguments: .arguments( + environmentVariables: [ + "TUIST_CONFIG_SRCROOT": "$(SRCROOT)", + "TUIST_FRAMEWORK_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", + ] + ) ) ), - Target.target( - name: "tuistbenchmark", - product: .commandLineTool, - dependencies: [ - .external(name: "ArgumentParser"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - ] - ), - Target.target( - name: "tuistfixturegenerator", - product: .commandLineTool, - dependencies: [ - .external(name: "ArgumentParser"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - ] - ), - Target.target( - name: "TuistIntegrationTests", - product: .unitTests, - dependencies: [ - .target(name: "TuistGenerator"), - .target(name: "TuistSupportTesting"), - .target(name: "TuistSupport"), - .target(name: "TuistCoreTesting"), - .target(name: "TuistGraphTesting"), - .target(name: "TuistLoaderTesting"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - .external(name: "XcodeProj"), - ] - ), - ] - let moduleTargets = [ - Target.module( - name: "TuistSupport", - hasIntegrationTests: true, - dependencies: [ - .target(name: "ProjectDescription"), - .external(name: "AnyCodable"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - .external(name: "XcodeProj"), - .external(name: "KeychainAccess"), - .external(name: "CombineExt"), - .external(name: "Logging"), - .external(name: "ZIPFoundation"), - .external(name: "Difference"), - ], - testingDependencies: [ - .target(name: "TuistCore"), - .target(name: "TuistGraph"), - ] - ), - Target.module( - name: "TuistKit", - hasTesting: false, - hasIntegrationTests: true, - dependencies: [ - .target(name: "TuistSupport"), - .target(name: "TuistGenerator"), - .target(name: "TuistAutomation"), - .target(name: "ProjectDescription"), - .target(name: "ProjectAutomation"), - .target(name: "TuistLoader"), - .target(name: "TuistScaffold"), - .target(name: "TuistDependencies"), - .target(name: "TuistMigration"), - .target(name: "TuistAsyncQueue"), - .target(name: "TuistAnalytics"), - .target(name: "TuistPlugin"), - .target(name: "TuistGraph"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - .external(name: "ArgumentParser"), - .external(name: "GraphViz"), - .external(name: "AnyCodable"), - ], - testDependencies: [ - .target(name: "TuistAutomation"), - .target(name: "TuistSupportTesting"), - .target(name: "TuistCoreTesting"), - .target(name: "ProjectDescription"), - .target(name: "ProjectAutomation"), - .target(name: "TuistLoaderTesting"), - .target(name: "TuistGeneratorTesting"), - .target(name: "TuistScaffoldTesting"), - .target(name: "TuistAutomationTesting"), - .target(name: "TuistMigrationTesting"), - .target(name: "TuistAsyncQueueTesting"), - .target(name: "TuistGraphTesting"), - .target(name: "TuistPlugin"), - .target(name: "TuistPluginTesting"), - .external(name: "ArgumentParser"), - .external(name: "GraphViz"), - .external(name: "AnyCodable"), - ], - integrationTestsDependencies: [ - .target(name: "TuistCoreTesting"), - .target(name: "TuistSupportTesting"), - .target(name: "ProjectDescription"), - .target(name: "ProjectAutomation"), - .target(name: "TuistLoaderTesting"), - .target(name: "TuistGraphTesting"), - .external(name: "XcodeProj"), - ] - ), - Target.module( - name: "TuistGraph", - dependencies: [ - .target(name: "TuistSupport"), - .external(name: "AnyCodable"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - ], - testDependencies: [ - .target(name: "TuistCore"), - .target(name: "TuistCoreTesting"), - .target(name: "TuistSupport"), - .target(name: "TuistSupportTesting"), - .external(name: "XcodeProj"), - ], - testingDependencies: [ - .target(name: "TuistSupport"), - .target(name: "TuistSupportTesting"), - .external(name: "XcodeProj"), - ] - ), - Target.module( - name: "TuistCore", - hasIntegrationTests: true, - dependencies: [ - .target(name: "ProjectDescription"), - .target(name: "TuistSupport"), - .target(name: "TuistGraph"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - .external(name: "XcodeProj"), - ], - testDependencies: [ - .target(name: "TuistSupport"), - .target(name: "TuistGraph"), - .target(name: "TuistSupportTesting"), - .target(name: "TuistGraphTesting"), - ], - testingDependencies: [ - .target(name: "TuistSupport"), - .target(name: "TuistGraph"), - .target(name: "TuistSupportTesting"), - .target(name: "TuistGraphTesting"), - ], - integrationTestsDependencies: [ - .target(name: "TuistSupportTesting"), - ] - ), - Target.module( - name: "TuistGenerator", - hasIntegrationTests: true, - dependencies: [ - .target(name: "TuistCore"), - .target(name: "TuistGraph"), - .target(name: "TuistSupport"), - .external(name: "SwiftGenKit"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - .external(name: "PathKit"), - .external(name: "StencilSwiftKit"), - .external(name: "XcodeProj"), - .external(name: "GraphViz"), - ], - testDependencies: [ - .target(name: "TuistCoreTesting"), - .target(name: "TuistSupportTesting"), - .target(name: "TuistGraphTesting"), - .external(name: "XcodeProj"), - .external(name: "GraphViz"), - ], - testingDependencies: [ - .target(name: "TuistCoreTesting"), - .target(name: "TuistSupportTesting"), - .target(name: "TuistGraphTesting"), - .external(name: "XcodeProj"), - ], - integrationTestsDependencies: [ - .target(name: "TuistCoreTesting"), - .target(name: "TuistSupportTesting"), - .target(name: "TuistGraphTesting"), - .external(name: "XcodeProj"), - ] - ), - Target.module( - name: "TuistScaffold", - hasIntegrationTests: true, - dependencies: [ - .target(name: "TuistCore"), - .target(name: "TuistGraph"), - .target(name: "TuistSupport"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - .external(name: "PathKit"), - .external(name: "StencilSwiftKit"), - ], - testDependencies: [ - .target(name: "TuistSupportTesting"), - .target(name: "TuistCoreTesting"), - .target(name: "TuistGraphTesting"), - ], - testingDependencies: [ - .target(name: "TuistGraphTesting"), - .target(name: "TuistGraph"), - ], - integrationTestsDependencies: [ - .target(name: "TuistSupportTesting"), - .target(name: "TuistGraphTesting"), - ] - ), - Target.module( - name: "TuistLoader", - hasIntegrationTests: true, - dependencies: [ - .target(name: "TuistCore"), - .target(name: "TuistGraph"), - .target(name: "TuistSupport"), - .target(name: "ProjectDescription"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - .external(name: "XcodeProj"), - ], - testDependencies: [ - .target(name: "TuistGraphTesting"), - .target(name: "TuistSupportTesting"), - .target(name: "TuistCoreTesting"), - ], - testingDependencies: [ - .target(name: "TuistCore"), - .target(name: "ProjectDescription"), - .target(name: "TuistSupportTesting"), - .target(name: "TuistGraphTesting"), - .target(name: "TuistGraph"), - ], - integrationTestsDependencies: [ - .target(name: "TuistGraphTesting"), - .target(name: "TuistSupportTesting"), - .target(name: "ProjectDescription"), - ] - ), - Target.module( - name: "TuistAsyncQueue", - dependencies: [ - .target(name: "TuistCore"), - .target(name: "TuistGraph"), - .target(name: "TuistSupport"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - .external(name: "Queuer"), - .external(name: "XcodeProj"), - ], - testDependencies: [ - .target(name: "TuistSupportTesting"), - .target(name: "TuistCoreTesting"), - .target(name: "TuistGraphTesting"), - .external(name: "Queuer"), - ], - testingDependencies: [ - .target(name: "TuistGraphTesting"), - ] - ), - Target.module( - name: "TuistPlugin", - dependencies: [ - .target(name: "TuistCore"), - .target(name: "TuistGraph"), - .target(name: "TuistLoader"), - .target(name: "TuistSupport"), - .target(name: "TuistScaffold"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - ], - testDependencies: [ - .target(name: "ProjectDescription"), - .target(name: "TuistLoader"), - .target(name: "TuistLoaderTesting"), - .target(name: "TuistGraphTesting"), - .target(name: "TuistSupport"), - .target(name: "TuistSupportTesting"), - .target(name: "TuistScaffoldTesting"), - .target(name: "TuistCoreTesting"), - ], - testingDependencies: [ - .target(name: "TuistGraph"), - ] - ), - Target.module( - name: "ProjectDescription", - product: .framework, - hasTesting: false, - testDependencies: [ - .target(name: "TuistSupportTesting"), - .target(name: "TuistSupport"), - ] - ), - Target.module( - name: "ProjectAutomation", - product: .framework, - hasTests: false, - hasTesting: false, - dependencies: [] - ), - Target.module( - name: "TuistAnalytics", - hasTests: false, - hasTesting: false, - dependencies: [ - .target(name: "TuistAsyncQueue"), - .target(name: "TuistCore"), - .target(name: "TuistGraph"), - .target(name: "TuistLoader"), - .target(name: "TuistSupport"), - .external(name: "AnyCodable"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - ], - testDependencies: [ - .target(name: "TuistSupportTesting"), - .target(name: "TuistGraphTesting"), - .target(name: "TuistCoreTesting"), - ] - ), - Target.module( - name: "TuistMigration", - hasIntegrationTests: true, - dependencies: [ - .target(name: "TuistCore"), - .target(name: "TuistGraph"), - .target(name: "TuistSupport"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - .external(name: "PathKit"), - .external(name: "XcodeProj"), - ], - testDependencies: [ - .target(name: "TuistSupportTesting"), - .target(name: "TuistCoreTesting"), - .target(name: "TuistGraphTesting"), - ], - testingDependencies: [ - .target(name: "TuistGraphTesting"), - ], - integrationTestsDependencies: [ - .target(name: "TuistSupportTesting"), - .target(name: "TuistCoreTesting"), - .target(name: "TuistGraphTesting"), - ] - ), - Target.module( - name: "TuistDependencies", - hasTesting: false, - dependencies: [ - .target(name: "ProjectDescription"), - .target(name: "TuistCore"), - .target(name: "TuistGraph"), - .target(name: "TuistSupport"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - ], - testDependencies: [ - .target(name: "TuistCoreTesting"), - .target(name: "TuistGraphTesting"), - .target(name: "TuistLoaderTesting"), - .target(name: "TuistSupportTesting"), - ], - testingDependencies: [ - .target(name: "TuistGraphTesting"), - .target(name: "ProjectDescription"), - ] - ), - Target.module( - name: "TuistAutomation", - hasIntegrationTests: true, - dependencies: [ - .target(name: "TuistCore"), - .target(name: "TuistGraph"), - .target(name: "TuistSupport"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - .external(name: "XcodeProj"), - .external(name: "XcbeautifyLib"), - ], - testDependencies: [ - .target(name: "TuistSupportTesting"), - .target(name: "TuistCoreTesting"), - .target(name: "TuistGraphTesting"), - ], - testingDependencies: [ - .target(name: "TuistCore"), - .target(name: "TuistCoreTesting"), - .target(name: "ProjectDescription"), - .target(name: "TuistSupportTesting"), - .target(name: "TuistGraphTesting"), - ], - integrationTestsDependencies: [ - .target(name: "TuistSupportTesting"), - .target(name: "TuistGraphTesting"), - ] + .scheme( + name: "TuistAcceptanceTests", + buildAction: .buildAction( + targets: Module.allCases.flatMap(\.acceptanceTestTargets).map(\.name).sorted() + .map { .target($0) } + ), + testAction: .targets( + Module.allCases.flatMap(\.acceptanceTestTargets).map { .testableTarget(target: .target($0.name)) } + ), + runAction: .runAction( + arguments: .arguments( + environmentVariables: [ + "TUIST_CONFIG_SRCROOT": "$(SRCROOT)", + "TUIST_FRAMEWORK_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", + ] + ) + ) ), - ].flatMap { $0 } - - return executableTargets + moduleTargets + acceptanceTests.map(\.target) + [ - .target( - name: "TuistAcceptanceTesting", - product: .staticFramework, - dependencies: [ - .target(name: "TuistKit"), - .target(name: "TuistSupport"), - .target(name: "TuistSupportTesting"), - .target(name: "TuistCore"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - .external(name: "XcodeProj"), - .sdk(name: "XCTest", type: .framework, status: .optional), - ] + .scheme( + name: "TuistUnitTests", + buildAction: .buildAction( + targets: Module.allCases.flatMap(\.unitTestTargets).map(\.name).sorted() + .map { .target($0) } + ), + testAction: .targets( + Module.allCases.flatMap(\.unitTestTargets).map { .testableTarget(target: .target($0.name)) } + ), + runAction: .runAction( + arguments: .arguments( + environmentVariables: [ + "TUIST_CONFIG_SRCROOT": "$(SRCROOT)", + "TUIST_FRAMEWORK_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", + ] + ) + ) ), ] -} + schemes.append(contentsOf: Module.allCases.filter(\.isRunnable).map { + .scheme( + name: $0.targetName, + buildAction: .buildAction(targets: [.target($0.targetName)]), + runAction: .runAction( + executable: .target($0.targetName), + arguments: .arguments( + environmentVariables: [ + "TUIST_CONFIG_SRCROOT": "$(SRCROOT)", + "TUIST_FRAMEWORK_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", + ] + ) + ) + ) + }) -let acceptanceTests: [(target: Target, scheme: Scheme)] = ["", "Build", "Dependencies", "Generate", "Test"].map { - ( - target: .target( - name: "Tuist\($0)AcceptanceTests", - product: .unitTests, - dependencies: [ - .target(name: "TuistAcceptanceTesting"), - .target(name: "TuistSupportTesting"), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - ] - ), - scheme: .scheme( - name: "Tuist\($0)AcceptanceTests", - buildAction: .buildAction(targets: ["Tuist\($0)AcceptanceTests"]), - testAction: .targets( - [ - .testableTarget( - target: .target("Tuist\($0)AcceptanceTests"), - isParallelizable: true, - isRandomExecutionOrdering: true - ), - ] - ), + schemes.append(contentsOf: Module.allCases.compactMap(\.acceptanceTestsTargetName).map { + .scheme( + name: $0, + hidden: true, + buildAction: .buildAction(targets: [.target($0)]), + testAction: .targets([.testableTarget(target: .target($0))]), runAction: .runAction( arguments: .arguments( environmentVariables: [ @@ -496,12 +98,15 @@ let acceptanceTests: [(target: Target, scheme: Scheme)] = ["", "Build", "Depende ) ) ) - ) + }) + + return schemes } let project = Project( name: "Tuist", options: .options( + automaticSchemesOptions: .disabled, textSettings: .textSettings(usesTabs: false, indentWidth: 4, tabWidth: 4) ), settings: .settings( @@ -510,8 +115,8 @@ let project = Project( .release(name: "Release", settings: releaseSettings(), xcconfig: nil), ] ), - targets: targets(), - schemes: acceptanceTests.map(\.scheme), + targets: Module.allCases.flatMap(\.targets), + schemes: schemes(), additionalFiles: [ "CHANGELOG.md", "README.md", diff --git a/Tests/TuistBuildAcceptanceTests/BuildAcceptanceTests.swift b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift similarity index 100% rename from Tests/TuistBuildAcceptanceTests/BuildAcceptanceTests.swift rename to Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift diff --git a/Tests/TuistTestAcceptanceTests/TestAcceptanceTests.swift b/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift similarity index 100% rename from Tests/TuistTestAcceptanceTests/TestAcceptanceTests.swift rename to Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift diff --git a/Tests/TuistGenerateAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift similarity index 100% rename from Tests/TuistGenerateAcceptanceTests/GenerateAcceptanceTests.swift rename to Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift new file mode 100644 index 00000000000..96bd801f337 --- /dev/null +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -0,0 +1,683 @@ +import Foundation +import ProjectDescription + +public enum Module: String, CaseIterable { + case tuist + case tuistBenchmark = "tuistbenchmark" + case tuistFixtureGenerator = "tuistfixturegenerator" + case projectDescription = "ProjectDescription" + case projectAutomation = "ProjectAutomation" + case acceptanceTesting = "TuistAcceptanceTesting" + case support = "TuistSupport" + case kit = "TuistKit" + case graph = "TuistGraph" + case core = "TuistCore" + case generator = "TuistGenerator" + case scaffold = "TuistScaffold" + case loader = "TuistLoader" + case asyncQueue = "TuistAsyncQueue" + case plugin = "TuistPlugin" + case analytics = "TuistAnalytics" + case migration = "TuistMigration" + case dependencies = "TuistDependencies" + case automation = "TuistAutomation" + + public var isRunnable: Bool { + switch self { + case .tuistFixtureGenerator, .tuist, .tuistBenchmark: + return true + default: + return false + } + } + + public var acceptanceTestTargets: [Target] { + var targets: [Target] = [] + + if let acceptanceTestsTargetName { + targets.append(target( + name: acceptanceTestsTargetName, + product: .unitTests, + dependencies: acceptanceTestDependencies + )) + } + + return targets + } + + public var unitTestTargets: [Target] { + var targets: [Target] = [] + + if let unitTestsTargetName { + targets.append( + target( + name: unitTestsTargetName, + product: .unitTests, + dependencies: unitTestDependencies + ) + ) + } + + if let integrationTestsTargetName { + targets.append( + target( + name: integrationTestsTargetName, + product: .unitTests, + dependencies: integrationTestsDependencies + ) + ) + } + + return targets + } + + public var testTargets: [Target] { + return unitTestTargets + acceptanceTestTargets + } + + public var targets: [Target] { + var targets: [Target] = sourceTargets + + if let testingTargetName { + targets.append( + target( + name: testingTargetName, + product: product, + dependencies: testingDependencies + ) + ) + } + + return targets + testTargets + } + + public var sourceTargets: [Target] { + let isStaticProduct = product == .staticLibrary || product == .staticFramework + + return [ + target( + name: targetName, + product: product, + dependencies: dependencies + (isStaticProduct ? [ + .external(name: "Mockable"), + ] : []) + ), + ] + } + + fileprivate var sharedDependencies: [TargetDependency] { + return [ + .external(name: "SwiftToolsSupport"), + .external(name: "SystemPackage"), + ] + } + + public var acceptanceTestsTargetName: String? { + switch self { + case .tuist, .automation, .dependencies, .generator: + return "\(rawValue)AcceptanceTests" + default: + return nil + } + } + + public var testingTargetName: String? { + switch self { + case .tuist, .tuistBenchmark, .tuistFixtureGenerator, .kit, .projectAutomation, .projectDescription, .analytics, + .dependencies, .acceptanceTesting: + return nil + default: + return "\(rawValue)Testing" + } + } + + public var unitTestsTargetName: String? { + switch self { + case .automation, .analytics, .tuist, .tuistBenchmark, .tuistFixtureGenerator, .projectAutomation, .projectDescription, + .acceptanceTesting: + return nil + default: + return "\(rawValue)Tests" + } + } + + public var integrationTestsTargetName: String? { + switch self { + case .tuist, .tuistBenchmark, .tuistFixtureGenerator, .projectAutomation, .projectDescription, .graph, .asyncQueue, + .plugin, .analytics, .dependencies, .acceptanceTesting: + return nil + default: + return "\(rawValue)IntegrationTests" + } + } + + public var targetName: String { + rawValue + } + + public var product: Product { + switch self { + case .tuist, .tuistBenchmark, .tuistFixtureGenerator: + return .commandLineTool + case .projectAutomation, .projectDescription: + return .framework + default: + return .staticFramework + } + } + + public var acceptanceTestDependencies: [TargetDependency] { + let dependencies: [TargetDependency] = switch self { + case .tuist, .automation, .dependencies, .generator: + [ + .target(name: Module.acceptanceTesting.targetName), + .target(name: Module.support.testingTargetName!), + ] + default: + [] + } + return dependencies + sharedDependencies + } + + public var dependencies: [TargetDependency] { + var dependencies: [TargetDependency] = switch self { + case .acceptanceTesting: + [ + .target(name: Module.kit.targetName), + .target(name: Module.support.targetName), + .target(name: Module.support.testingTargetName!), + .target(name: Module.core.targetName), + .external(name: "XcodeProj"), + .sdk(name: "XCTest", type: .framework, status: .optional), + ] + case .tuist: + [ + .target(name: Module.kit.targetName), + .target(name: Module.projectDescription.targetName), + .target(name: Module.automation.targetName), + .external(name: "GraphViz"), + .external(name: "ArgumentParser"), + ] + case .tuistBenchmark: + [ + .external(name: "ArgumentParser"), + ] + case .tuistFixtureGenerator: + [ + .external(name: "ArgumentParser"), + ] + case .projectAutomation, .projectDescription: + [] + case .support: + [ + .target(name: Module.projectDescription.targetName), + .external(name: "AnyCodable"), + .external(name: "XcodeProj"), + .external(name: "KeychainAccess"), + .external(name: "CombineExt"), + .external(name: "Logging"), + .external(name: "ZIPFoundation"), + .external(name: "Difference"), + ] + case .kit: + [ + .target(name: Module.support.targetName), + .target(name: Module.generator.targetName), + .target(name: Module.automation.targetName), + .target(name: Module.projectDescription.targetName), + .target(name: Module.projectAutomation.targetName), + .target(name: Module.loader.targetName), + .target(name: Module.scaffold.targetName), + .target(name: Module.dependencies.targetName), + .target(name: Module.migration.targetName), + .target(name: Module.asyncQueue.targetName), + .target(name: Module.analytics.targetName), + .target(name: Module.plugin.targetName), + .target(name: Module.graph.targetName), + .external(name: "ArgumentParser"), + .external(name: "GraphViz"), + .external(name: "AnyCodable"), + ] + case .graph: + [ + .target(name: Module.support.targetName), + .external(name: "AnyCodable"), + ] + case .core: + [ + .target(name: Module.projectDescription.targetName), + .target(name: Module.support.targetName), + .target(name: Module.graph.targetName), + .external(name: "XcodeProj"), + ] + case .generator: + [ + .target(name: Module.core.targetName), + .target(name: Module.graph.targetName), + .target(name: Module.support.targetName), + .external(name: "SwiftGenKit"), + .external(name: "PathKit"), + .external(name: "StencilSwiftKit"), + .external(name: "XcodeProj"), + .external(name: "GraphViz"), + ] + case .scaffold: + [ + .target(name: Module.core.targetName), + .target(name: Module.graph.targetName), + .target(name: Module.support.targetName), + .external(name: "PathKit"), + .external(name: "StencilSwiftKit"), + ] + case .loader: + [ + .target(name: Module.core.targetName), + .target(name: Module.graph.targetName), + .target(name: Module.support.targetName), + .target(name: Module.projectDescription.targetName), + .external(name: "XcodeProj"), + ] + case .asyncQueue: + [ + .target(name: Module.core.targetName), + .target(name: Module.graph.targetName), + .target(name: Module.support.targetName), + .external(name: "Queuer"), + .external(name: "XcodeProj"), + ] + case .plugin: + [ + .target(name: Module.core.targetName), + .target(name: Module.graph.targetName), + .target(name: Module.loader.targetName), + .target(name: Module.support.targetName), + .target(name: Module.scaffold.targetName), + ] + case .analytics: + [ + .target(name: Module.asyncQueue.targetName), + .target(name: Module.core.targetName), + .target(name: Module.graph.targetName), + .target(name: Module.loader.targetName), + .target(name: Module.support.targetName), + .external(name: "AnyCodable"), + ] + case .migration: + [ + .target(name: Module.core.targetName), + .target(name: Module.graph.targetName), + .target(name: Module.support.targetName), + .external(name: "PathKit"), + .external(name: "XcodeProj"), + ] + case .dependencies: + [ + .target(name: Module.projectDescription.targetName), + .target(name: Module.core.targetName), + .target(name: Module.graph.targetName), + .target(name: Module.support.targetName), + ] + case .automation: + [ + .target(name: Module.core.targetName), + .target(name: Module.graph.targetName), + .target(name: Module.support.targetName), + .external(name: "XcodeProj"), + .external(name: "XcbeautifyLib"), + ] + } + if self != .projectDescription, self != .projectAutomation { + dependencies.append(contentsOf: sharedDependencies) + } + return dependencies + } + + public var unitTestDependencies: [TargetDependency] { + var dependencies: [TargetDependency] = switch self { + case .tuist, .tuistBenchmark, .tuistFixtureGenerator, .support, .acceptanceTesting: + [] + case .projectDescription: + [ + .target(name: Module.support.testingTargetName!), + .target(name: Module.support.targetName), + ] + case .projectAutomation: + [] + case .kit: + [ + .target(name: Module.automation.targetName), + .target(name: Module.support.testingTargetName!), + .target(name: Module.core.testingTargetName!), + .target(name: Module.projectDescription.targetName), + .target(name: Module.projectAutomation.targetName), + .target(name: Module.loader.testingTargetName!), + .target(name: Module.generator.testingTargetName!), + .target(name: Module.scaffold.testingTargetName!), + .target(name: Module.automation.testingTargetName!), + .target(name: Module.migration.testingTargetName!), + .target(name: Module.asyncQueue.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + .target(name: Module.plugin.targetName), + .target(name: Module.plugin.testingTargetName!), + .external(name: "ArgumentParser"), + .external(name: "GraphViz"), + .external(name: "AnyCodable"), + ] + case .graph: + [ + .target(name: Module.core.targetName), + .target(name: Module.core.testingTargetName!), + .target(name: Module.support.targetName), + .target(name: Module.support.testingTargetName!), + .external(name: "XcodeProj"), + ] + case .core: + [ + .target(name: Module.support.targetName), + .target(name: Module.graph.targetName), + .target(name: Module.support.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + ] + case .generator: + [ + .target(name: Module.core.testingTargetName!), + .target(name: Module.support.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + .external(name: "XcodeProj"), + .external(name: "GraphViz"), + ] + case .scaffold: + [ + .target(name: Module.support.testingTargetName!), + .target(name: Module.core.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + ] + case .loader: + [ + .target(name: Module.graph.testingTargetName!), + .target(name: Module.support.testingTargetName!), + .target(name: Module.core.testingTargetName!), + ] + case .asyncQueue: + [ + .target(name: Module.support.testingTargetName!), + .target(name: Module.core.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + .external(name: "Queuer"), + ] + case .plugin: + [ + .target(name: Module.projectDescription.targetName), + .target(name: Module.loader.targetName), + .target(name: Module.loader.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + .target(name: Module.support.targetName), + .target(name: Module.support.testingTargetName!), + .target(name: Module.scaffold.testingTargetName!), + .target(name: Module.core.testingTargetName!), + ] + case .analytics: + [ + .target(name: Module.support.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + .target(name: Module.core.testingTargetName!), + ] + case .migration: + [ + .target(name: Module.support.testingTargetName!), + .target(name: Module.core.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + ] + case .dependencies: + [ + .target(name: Module.core.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + .target(name: Module.loader.testingTargetName!), + .target(name: Module.support.testingTargetName!), + ] + case .automation: + [ + .target(name: Module.support.testingTargetName!), + .target(name: Module.core.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + ] + } + dependencies = dependencies + sharedDependencies + [.target(name: targetName), .external(name: "MockableTest")] + if let testingTargetName { + dependencies.append(.target(name: testingTargetName)) + } + return dependencies + } + + public var testingDependencies: [TargetDependency] { + let dependencies: [TargetDependency] = switch self { + case .tuist, .projectAutomation, .projectDescription, .acceptanceTesting: + [] + case .tuistBenchmark: + [ + .external(name: "ArgumentParser"), + ] + case .tuistFixtureGenerator: + [] + case .support: + [ + .target(name: Module.core.targetName), + .target(name: Module.graph.targetName), + ] + case .kit: + [] + case .graph: + [ + .target(name: Module.support.targetName), + .target(name: Module.support.testingTargetName!), + .external(name: "XcodeProj"), + ] + case .core: + [ + .target(name: Module.support.targetName), + .target(name: Module.graph.targetName), + .target(name: Module.support.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + ] + case .generator: + [ + .target(name: Module.core.testingTargetName!), + .target(name: Module.support.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + .external(name: "XcodeProj"), + ] + case .scaffold: + [ + .target(name: Module.graph.testingTargetName!), + .target(name: Module.graph.targetName), + ] + case .loader: + [ + .target(name: Module.core.targetName), + .target(name: Module.projectDescription.targetName), + .target(name: Module.support.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + .target(name: Module.graph.targetName), + ] + case .asyncQueue: + [ + .target(name: Module.graph.testingTargetName!), + ] + case .plugin: + [ + .target(name: Module.graph.targetName), + ] + case .analytics: + [] + case .migration: + [ + .target(name: Module.graph.testingTargetName!), + ] + case .dependencies: + [ + .target(name: Module.graph.testingTargetName!), + .target(name: Module.projectDescription.targetName), + ] + case .automation: + [ + .target(name: Module.core.targetName), + .target(name: Module.core.testingTargetName!), + .target(name: Module.projectDescription.targetName), + .target(name: Module.support.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + ] + } + return dependencies + sharedDependencies + [ + .target(name: targetName), + .sdk(name: "XCTest", type: .framework, status: .optional), + ] + } + + public var integrationTestsDependencies: [TargetDependency] { + var dependencies: [TargetDependency] = switch self { + case .tuistBenchmark, .tuistFixtureGenerator, .support, .projectAutomation, .projectDescription, .acceptanceTesting: + [] + case .tuist: + [ + .target(name: Module.generator.targetName), + .target(name: Module.support.testingTargetName!), + .target(name: Module.support.targetName), + .target(name: Module.core.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + .target(name: Module.loader.testingTargetName!), + .external(name: "SwiftToolsSupport"), + .external(name: "XcodeProj"), + ] + case .kit: + [ + .target(name: Module.core.testingTargetName!), + .target(name: Module.support.testingTargetName!), + .target(name: Module.projectDescription.targetName), + .target(name: Module.automation.targetName), + .target(name: Module.loader.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + .external(name: "XcodeProj"), + ] + case .graph: + [] + case .core: + [ + .target(name: Module.support.testingTargetName!), + ] + case .generator: + [ + .target(name: Module.core.testingTargetName!), + .target(name: Module.support.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + .external(name: "XcodeProj"), + ] + case .scaffold: + [ + .target(name: Module.support.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + ] + case .loader: + [ + .target(name: Module.graph.testingTargetName!), + .target(name: Module.support.testingTargetName!), + .target(name: Module.projectDescription.targetName), + ] + case .asyncQueue: + [] + case .plugin: + [] + case .analytics: + [] + case .migration: + [ + .target(name: Module.support.testingTargetName!), + .target(name: Module.core.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + ] + case .dependencies: + [] + case .automation: + [ + .target(name: Module.support.testingTargetName!), + .target(name: Module.graph.testingTargetName!), + ] + } + dependencies.append(contentsOf: sharedDependencies) + dependencies.append(.target(name: targetName)) + if let testingTargetName { + dependencies.append(contentsOf: [.target(name: testingTargetName)]) + } + return dependencies + } + + fileprivate func target( + name: String, + product: Product, + dependencies: [TargetDependency], + settings: Settings = .settings( + configurations: [ + .debug( + name: "Debug", + settings: ["SWIFT_ACTIVE_COMPILATION_CONDITIONS": "$(inherited) MOCKING"], + xcconfig: nil + ), + .release( + name: "Release", + + settings: [:], + xcconfig: nil + ), + ] + ) + ) -> Target { + let rootFolder: String + switch product { + case .unitTests: + rootFolder = "Tests" + default: + rootFolder = "Sources" + } + return .target( + name: name, + destinations: [.mac], + product: product, + bundleId: "io.tuist.\(name)", + deploymentTargets: .macOS("12.0"), + infoPlist: .default, + sources: ["\(rootFolder)/\(name)/**/*.swift"], + dependencies: dependencies, + settings: settings + ) + } + + fileprivate var settings: Settings { + switch self { + case .tuist: + return .settings( + base: [ + "LD_RUNPATH_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", + ], + configurations: [ + .debug(name: "Debug", settings: [:], xcconfig: nil), + .release(name: "Release", settings: [:], xcconfig: nil), + ] + ) + default: + return .settings( + configurations: [ + .debug( + name: "Debug", + settings: ["SWIFT_ACTIVE_COMPILATION_CONDITIONS": "$(inherited) MOCKING"], + xcconfig: nil + ), + .release( + name: "Release", + + settings: [:], + xcconfig: nil + ), + ] + ) + } + } +} diff --git a/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift b/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift deleted file mode 100644 index 9e0dd8f21ed..00000000000 --- a/Tuist/ProjectDescriptionHelpers/Target+Helpers.swift +++ /dev/null @@ -1,120 +0,0 @@ -import ProjectDescription - -public enum TargetType { - case tests - case sources -} - -extension Target { - public static func target( - name: String, - product: Product, - dependencies: [TargetDependency], - settings: Settings = .settings( - configurations: [ - .debug( - name: "Debug", - settings: ["SWIFT_ACTIVE_COMPILATION_CONDITIONS": "$(inherited) MOCKING"], - xcconfig: nil - ), - .release( - name: "Release", - - settings: [:], - xcconfig: nil - ), - ] - ) - ) -> Target { - let rootFolder: String - switch product { - case .unitTests: - rootFolder = "Tests" - default: - rootFolder = "Sources" - } - return .target( - name: name, - destinations: [.mac], - product: product, - bundleId: "io.tuist.\(name)", - deploymentTargets: .macOS("12.0"), - infoPlist: .default, - sources: ["\(rootFolder)/\(name)/**/*.swift"], - dependencies: dependencies, - settings: settings - ) - } - - public static func module( - name: String, - product: Product = .staticFramework, - hasTests: Bool = true, - hasTesting: Bool = true, - hasIntegrationTests: Bool = false, - dependencies: [TargetDependency] = [], - testDependencies: [TargetDependency] = [], - testingDependencies: [TargetDependency] = [], - integrationTestsDependencies: [TargetDependency] = [] - ) -> [Target] { - let isStaticProduct = product == .staticLibrary || product == .staticFramework - - var targets: [Target] = [ - .target( - name: name, - product: product, - dependencies: dependencies + (isStaticProduct ? [ - .external(name: "Mockable"), - ] : []) - ), - ] - var testTargets: [Target] = [] - if hasTests { - testTargets.append( - .target( - name: "\(name)Tests", - product: .unitTests, - dependencies: testDependencies + [ - .target(name: name), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - ] - + (hasTesting ? [.target(name: "\(name)Testing")] : []) - + (isStaticProduct ? [.external(name: "MockableTest")] : []) - ) - ) - } - - if hasTesting { - targets.append( - .target( - name: "\(name)Testing", - product: product, - dependencies: testingDependencies + [ - .target(name: name), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - .sdk(name: "XCTest", type: .framework, status: .optional), - ] - ) - ) - } - - if hasIntegrationTests { - testTargets.append( - .target( - name: "\(name)IntegrationTests", - product: .unitTests, - dependencies: integrationTestsDependencies + [ - .target(name: name), - .external(name: "SwiftToolsSupport"), - .external(name: "SystemPackage"), - ] - + (hasTesting ? [.target(name: "\(name)Testing")] : []) - ) - ) - } - - return targets + testTargets - } -} diff --git a/Workspace.swift b/Workspace.swift new file mode 100644 index 00000000000..5461298529a --- /dev/null +++ b/Workspace.swift @@ -0,0 +1,3 @@ +import ProjectDescription + +let workspace = Workspace(name: "Tuist", projects: ["."], generationOptions: .options(autogeneratedWorkspaceSchemes: .disabled)) From 26afbef4c1b3f03c7e77f1eb6d4119c315de9ce4 Mon Sep 17 00:00:00 2001 From: fortmarek Date: Tue, 20 Feb 2024 12:25:39 +0000 Subject: [PATCH 102/509] [Release] Tuist 4.3.1 --- .mise.toml | 2 +- CHANGELOG.md | 16 ++++++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index 4eea32c8391..1e40d9a6b88 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.3.0" +tuist = "4.3.1" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index 4048f500414..97dacf2a103 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## 4.3.1 - 2024-02-20 + +### Tuist + +#### Fixed + +- Add missing `region` parameter in static helper `RunActionOptions`.`options` [#5954](https://github.com/tuist/tuist/pull/5954) by [@mihaicris-adoreme](https://github.com/mihaicris-adoreme) +- Fix integration of local packages with Objective C targets [#5957](https://github.com/tuist/tuist/pull/5957) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +#### Changed + +- Improve error handling in the remote storage by [@pepicrft](https://github.com/pepicrft) +- Increase Tuist Cloud requests' timeout limit by [@pepicrft](https://github.com/pepicrft) + ## 4.3.0 - 2024-02-19 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 5ab177e4c93..9ca5d5144ad 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.3.0" + public static let version = "4.3.1" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From 9fa0e52cf083e18dfaf8c2063d43cf4e713c5c9c Mon Sep 17 00:00:00 2001 From: pepicrft Date: Tue, 20 Feb 2024 15:48:59 +0000 Subject: [PATCH 103/509] [Release] Tuist 4.3.1 From 61eaea8dc8e02b2a3493f89b550a6a414020ea1b Mon Sep 17 00:00:00 2001 From: pepicrft Date: Tue, 20 Feb 2024 16:43:33 +0000 Subject: [PATCH 104/509] [Release] Tuist 4.3.1 From 9dee68a48099311164e2709c9829c3c0c8fc9a5f Mon Sep 17 00:00:00 2001 From: fortmarek Date: Tue, 20 Feb 2024 21:58:58 +0000 Subject: [PATCH 105/509] [Release] Tuist 4.3.1 From df093006ae621c9cb72248b4a8f83b2650b13d12 Mon Sep 17 00:00:00 2001 From: fortmarek Date: Tue, 20 Feb 2024 22:32:36 +0000 Subject: [PATCH 106/509] [Release] Tuist 4.3.1 From 183bb252f7e70d765dea57a1ea6a5b8d4ea2ff0e Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 21 Feb 2024 09:05:37 +0100 Subject: [PATCH 107/509] Force run From 91614c1ebbbe6df71c78bfc9a2458c1bcf8946d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 21 Feb 2024 09:23:57 +0100 Subject: [PATCH 108/509] Remove PackageSettings platforms property (#5953) * Remove platforms from PackageSettings * Fix PackageInfoMapperTests * Fix interescting platforms for SPM --- Package.swift | 3 +- .../ProjectDescription/PackageSettings.swift | 8 +- .../Models/Dependencies/PackageSettings.swift | 7 +- .../Models/PackageSettings+TestData.swift | 6 +- .../SwiftPackageManagerGraphLoader.swift | 19 -- .../PackageSettings+ManifestMapper.swift | 4 +- .../PackageInfoMapper.swift | 18 +- .../DumpServiceIntegrationTests.swift | 2 +- .../Loaders/ManifestLoaderTests.swift | 10 +- .../Loaders/PackageSettingsLoaderTests.swift | 9 +- .../PackageInfoMapperTests.swift | 178 ++++++++---------- .../Add External Dependencies/Package.swift | 3 +- fixtures/app_with_plugins/Package.swift | 5 +- .../Tuist/Package.swift | 3 +- .../multiplatform_app_with_sdk/Package.swift | 8 - 15 files changed, 107 insertions(+), 176 deletions(-) diff --git a/Package.swift b/Package.swift index 4e2dec629b1..fe99dab075d 100644 --- a/Package.swift +++ b/Package.swift @@ -321,8 +321,7 @@ var targets: [Target] = [ // To revert once we release Tuist 4 targetSettings: [ "MockableTest": ["ENABLE_TESTING_SEARCH_PATHS": "YES"], - ], - platforms: [.macOS] + ] ) #endif diff --git a/Sources/ProjectDescription/PackageSettings.swift b/Sources/ProjectDescription/PackageSettings.swift index 3715f22509d..c344e76b390 100644 --- a/Sources/ProjectDescription/PackageSettings.swift +++ b/Sources/ProjectDescription/PackageSettings.swift @@ -39,27 +39,21 @@ public struct PackageSettings: Codable, Equatable { /// Custom project configurations to be used for projects generated from SwiftPackageManager. public var projectOptions: [String: Project.Options] - /// The custom set of `platforms` that are used by your project - public let platforms: Set - /// Creates `PackageSettings` instance for custom Swift Package Manager configuration. /// - Parameter productTypes: The custom `Product` types to be used for SPM targets. /// - Parameter baseSettings: Additional settings to be added to targets generated from SwiftPackageManager. /// - Parameter targetSettings: Additional settings to be added to targets generated from SwiftPackageManager. /// - Parameter projectOptions: Custom project configurations to be used for projects generated from SwiftPackageManager. - /// - Parameter platforms: The custom set of `platforms` that are used by your project public init( productTypes: [String: Product] = [:], baseSettings: Settings = .settings(), targetSettings: [String: SettingsDictionary] = [:], - projectOptions: [String: Project.Options] = [:], - platforms: Set = Set(PackagePlatform.allCases) + projectOptions: [String: Project.Options] = [:] ) { self.productTypes = productTypes self.baseSettings = baseSettings self.targetSettings = targetSettings self.projectOptions = projectOptions - self.platforms = platforms dumpIfNeeded(self) } } diff --git a/Sources/TuistGraph/Models/Dependencies/PackageSettings.swift b/Sources/TuistGraph/Models/Dependencies/PackageSettings.swift index bf72e4fa6b9..7bb709d5ea8 100644 --- a/Sources/TuistGraph/Models/Dependencies/PackageSettings.swift +++ b/Sources/TuistGraph/Models/Dependencies/PackageSettings.swift @@ -18,9 +18,6 @@ public struct PackageSettings: Equatable { /// Swift tools version of the parsed `Package.swift` public let swiftToolsVersion: Version - /// The custom set of `platforms` that are used by your project - public let platforms: Set - /// Initializes a new `PackageSettings` instance. /// - Parameters: /// - productTypes: The custom `Product` types to be used for SPM targets. @@ -32,14 +29,12 @@ public struct PackageSettings: Equatable { baseSettings: Settings, targetSettings: [String: SettingsDictionary], projectOptions: [String: TuistGraph.Project.Options] = [:], - swiftToolsVersion: Version, - platforms: Set + swiftToolsVersion: Version ) { self.productTypes = productTypes self.baseSettings = baseSettings self.targetSettings = targetSettings self.projectOptions = projectOptions self.swiftToolsVersion = swiftToolsVersion - self.platforms = platforms } } diff --git a/Sources/TuistGraphTesting/Models/PackageSettings+TestData.swift b/Sources/TuistGraphTesting/Models/PackageSettings+TestData.swift index e7c5571ae52..55830e1fca6 100644 --- a/Sources/TuistGraphTesting/Models/PackageSettings+TestData.swift +++ b/Sources/TuistGraphTesting/Models/PackageSettings+TestData.swift @@ -9,16 +9,14 @@ extension PackageSettings { baseSettings: Settings = .test(), targetSettings: [String: SettingsDictionary] = [:], projectOptions: [String: TuistGraph.Project.Options] = [:], - swiftToolsVersion: Version = Version("5.4.9"), - platforms: Set = [.iOS] + swiftToolsVersion: Version = Version("5.4.9") ) -> PackageSettings { PackageSettings( productTypes: productTypes, baseSettings: baseSettings, targetSettings: targetSettings, projectOptions: projectOptions, - swiftToolsVersion: swiftToolsVersion, - platforms: platforms + swiftToolsVersion: swiftToolsVersion ) } } diff --git a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift index fc621683659..0a7b146f3c9 100644 --- a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift +++ b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift @@ -163,24 +163,6 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi packageToTargetsToArtifactPaths: packageToTargetsToArtifactPaths ) - let destinations: ProjectDescription - .Destinations = Set(packageSettings.platforms.flatMap { platform -> ProjectDescription.Destinations in - switch platform { - case .iOS: - [.iPhone, .iPad, .appleVisionWithiPadDesign, .macWithiPadDesign] - case .macCatalyst: - [.macCatalyst] - case .macOS: - [.mac] - case .tvOS: - [.appleTv] - case .watchOS: - [.appleWatch] - case .visionOS: - [.appleVision] - } - }) - let externalProjects: [Path: ProjectDescription.Project] = try packageInfos.reduce(into: [:]) { result, packageInfo in let manifest = try packageInfoMapper.map( packageInfo: packageInfo.info, @@ -192,7 +174,6 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi targetSettings: packageSettings.targetSettings, projectOptions: packageSettings.projectOptions[packageInfo.name], minDeploymentTargets: preprocessInfo.platformToMinDeploymentTarget, - destinations: destinations, targetToProducts: preprocessInfo.targetToProducts, targetToResolvedDependencies: preprocessInfo.targetToResolvedDependencies, macroDependencies: preprocessInfo.macroDependencies, diff --git a/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift index af0f201606d..9dfc42b905c 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift @@ -20,15 +20,13 @@ extension TuistGraph.PackageSettings { let projectOptions: [String: TuistGraph.Project.Options] = manifest .projectOptions .mapValues { .from(manifest: $0) } - let platforms = try Set(manifest.platforms.map { try TuistGraph.PackagePlatform.from(manifest: $0) }) return .init( productTypes: productTypes, baseSettings: baseSettings, targetSettings: targetSettings, projectOptions: projectOptions, - swiftToolsVersion: swiftToolsVersion, - platforms: platforms + swiftToolsVersion: swiftToolsVersion ) } } diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 93b9d4356eb..9613b5f9234 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -135,7 +135,6 @@ public protocol PackageInfoMapping { targetSettings: [String: TuistGraph.SettingsDictionary], projectOptions: TuistGraph.Project.Options?, minDeploymentTargets: ProjectDescription.DeploymentTargets, - destinations: ProjectDescription.Destinations, targetToProducts: [String: Set], targetToResolvedDependencies: [String: [PackageInfoMapper.ResolvedDependency]], macroDependencies: Set, @@ -398,7 +397,6 @@ public final class PackageInfoMapper: PackageInfoMapping { targetSettings: [String: TuistGraph.SettingsDictionary], projectOptions: TuistGraph.Project.Options?, minDeploymentTargets: ProjectDescription.DeploymentTargets, - destinations: ProjectDescription.Destinations, targetToProducts: [String: Set], targetToResolvedDependencies: [String: [PackageInfoMapper.ResolvedDependency]], macroDependencies: Set, @@ -459,7 +457,6 @@ public final class PackageInfoMapper: PackageInfoMapping { productTypes: productTypes, baseSettings: baseSettings, targetSettings: targetSettings, - packageDestinations: destinations, minDeploymentTargets: minDeploymentTargets, targetToResolvedDependencies: targetToResolvedDependencies, targetToModuleMap: targetToModuleMap, @@ -511,7 +508,6 @@ extension ProjectDescription.Target { productTypes: [String: TuistGraph.Product], baseSettings: TuistGraph.Settings, targetSettings: [String: TuistGraph.SettingsDictionary], - packageDestinations: ProjectDescription.Destinations, minDeploymentTargets: ProjectDescription.DeploymentTargets, targetToResolvedDependencies: [String: [PackageInfoMapper.ResolvedDependency]], targetToModuleMap: [String: ModuleMap], @@ -542,7 +538,17 @@ extension ProjectDescription.Target { destinations = Set([.mac]) } else { // All packages implicitly support all platforms, we constrain this with the platforms defined in `Package.swift` - destinations = packageDestinations.intersection(Set(Destination.allCases)) + let packageDestinations: ProjectDescription.Destinations = Set( + try packageInfo.platforms.flatMap { platform -> ProjectDescription.Destinations in + return try platform.destinations() + } + ) + + if packageDestinations.isEmpty { + destinations = Set(Destination.allCases) + } else { + destinations = Set(Destination.allCases).intersection(packageDestinations) + } } if macroDependencies.contains(where: { dependency in @@ -1075,7 +1081,7 @@ extension ProjectDescription.Settings { } extension ProjectDescription.PackagePlatform { - fileprivate func destinations() throws -> ProjectDescription.Destinations { + fileprivate func destinations() -> ProjectDescription.Destinations { switch self { case .iOS: return [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign] diff --git a/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift b/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift index e3b1983b8bf..2ffb2ae2aa5 100644 --- a/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift +++ b/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift @@ -256,7 +256,7 @@ final class DumpServiceTests: TuistTestCase { import ProjectDescription let packageSettings = PackageSettings( - platforms: [.iOS, .watchOS] + targetSettings: ["TargetA": ["OTHER_LDFLAGS": "-ObjC"]] ) #endif diff --git a/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift b/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift index e79da78dd14..9296c975741 100644 --- a/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift +++ b/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift @@ -158,7 +158,7 @@ final class ManifestLoaderTests: TuistTestCase { import ProjectDescription let packageSettings = PackageSettings( - platforms: [.iOS, .watchOS] + targetSettings: ["TargetA": ["OTHER_LDFLAGS": "-ObjC"]] ) #endif @@ -188,7 +188,13 @@ final class ManifestLoaderTests: TuistTestCase { // Then XCTAssertEqual( got, - .init(platforms: [.iOS, .watchOS]) + .init( + targetSettings: [ + "TargetA": [ + "OTHER_LDFLAGS": "-ObjC", + ], + ] + ) ) } diff --git a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift index fd9095f7937..632e457de8b 100644 --- a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift @@ -50,12 +50,6 @@ final class PackageSettingsLoaderTests: TuistUnitTestCase { TSCUtility.Version("5.4.9") } - manifestLoader.loadPackageSettingsStub = { _ in - PackageSettings( - platforms: [.iOS, .macOS] - ) - } - // When let got = try subject.loadPackageSettings(at: temporaryPath, with: plugins) @@ -72,8 +66,7 @@ final class PackageSettingsLoaderTests: TuistUnitTestCase { defaultSettings: .recommended ), targetSettings: [:], - swiftToolsVersion: TSCUtility.Version("5.4.9"), - platforms: [.iOS, .macOS] + swiftToolsVersion: TSCUtility.Version("5.4.9") ) XCTAssertEqual(manifestLoader.registerPluginsCount, 1) XCTAssertEqual(got, expected) diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index e2964fbec0f..246de8ee913 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -40,7 +40,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test(name: "Target_1", type: .binary, url: "https://binary.target.com"), .test(name: "Target_2"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -103,7 +103,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -115,7 +115,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target_2"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -162,7 +162,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -174,7 +174,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "com.example.dep-1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -221,7 +221,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test(name: "Dependency_1"), .test(name: "Dependency_2"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -277,7 +277,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -291,7 +291,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test(name: "Target_2"), .test(name: "Target_3"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -334,7 +334,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -371,7 +371,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target1"), ], - platforms: [], + platforms: [PackageInfo.Platform(platformName: "iOS", version: "9.0", options: [])], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -415,8 +415,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { cxxLanguageStandard: nil, swiftLanguageVersions: nil ), - ], - platforms: [.macCatalyst] + ] ) XCTAssertEqual( @@ -452,7 +451,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -495,7 +494,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target_1", type: .binary, url: "https://binary.target.com"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -522,7 +521,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target_1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -569,7 +568,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -616,7 +615,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "com.example.target-1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -663,7 +662,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test(name: "Target1"), .test(name: "Target2"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -703,7 +702,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test(name: "Target2", type: .test), .test(name: "Target3", type: .binary), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -742,7 +741,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test(name: "Target2"), .test(name: "Target3"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -776,7 +775,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target1", sources: ["Subfolder", "Another/Subfolder/file.swift"]), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -848,7 +847,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -951,7 +950,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1003,7 +1002,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { name: "Target1" ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1051,13 +1050,12 @@ final class PackageInfoMapperTests: TuistUnitTestCase { type: .system ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil ), - ], - platforms: [.iOS] + ] ) XCTAssertBetterEqual( @@ -1106,7 +1104,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { type: .system ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1137,7 +1135,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { name: "Target1" ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1198,7 +1196,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), .test(name: "Dependency2"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1283,7 +1281,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { dependencies: [.product(name: "Dependency1", package: "Package2", moduleAliases: nil, condition: nil)] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1298,7 +1296,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { dependencies: [.product(name: "Dependency2", package: "Package3", moduleAliases: nil, condition: nil)] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1312,7 +1310,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { name: "Dependency2" ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1376,7 +1374,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { publicHeadersPath: "Headers" ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1438,7 +1436,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), .test(name: "Dependency1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1496,13 +1494,12 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target1"), ], - platforms: [], + platforms: [.ios, .tvos], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil ), - ], - platforms: [.iOS, .tvOS] + ] ) // Then @@ -1548,13 +1545,12 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target1"), ], - platforms: [], + platforms: [.tvos], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil ), - ], - platforms: [.tvOS] + ] ) XCTAssertEqual( project, @@ -1593,8 +1589,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { cxxLanguageStandard: nil, swiftLanguageVersions: nil ), - ], - platforms: [.iOS] + ] ) let other = ProjectDescription.Project.testWithDefaultConfigs( @@ -1635,7 +1630,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { settings: [.init(tool: .c, name: .headerSearchPath, condition: nil, value: ["value"])] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1675,7 +1670,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { settings: [.init(tool: .cxx, name: .headerSearchPath, condition: nil, value: ["value"])] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1719,7 +1714,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1762,7 +1757,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1804,7 +1799,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1843,7 +1838,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1882,7 +1877,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1921,7 +1916,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1959,7 +1954,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -1997,7 +1992,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2041,7 +2036,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2081,7 +2076,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2158,7 +2153,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2216,7 +2211,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2259,7 +2254,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2302,7 +2297,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2346,7 +2341,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), .test(name: "Dependency1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2387,7 +2382,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), .test(name: "Dependency1", type: .binary), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2436,7 +2431,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), .test(name: "Dependency1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2477,7 +2472,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), .test(name: "Dependency1", type: .binary, url: "someURL"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2526,7 +2521,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), .test(name: "Dependency1", type: .binary, path: "Dependency1/Dependency1.xcframework"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2570,7 +2565,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), .test(name: "Dependency1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2585,7 +2580,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test(name: "Target3"), .test(name: "Target4"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2638,7 +2633,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), .test(name: "Dependency1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2653,7 +2648,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test(name: "Target3"), .test(name: "Target4"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2703,7 +2698,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: "c99", cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2738,7 +2733,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: "gnu++14", swiftLanguageVersions: nil @@ -2773,7 +2768,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: ["4.0.0"] @@ -2808,7 +2803,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: ["4.0.0", "5.0.0", "4.2.0"] @@ -2843,7 +2838,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: ["4.0.0", "5.0.0", "4.2.0"] @@ -2879,7 +2874,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target1"), ], - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2922,7 +2917,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .init(name: "Product1", type: .library(.automatic), targets: allTargets), ], targets: allTargets.map { .test(name: $0) }, - platforms: [], + platforms: [.ios], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -2992,13 +2987,12 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test(name: "Dependency1"), .test(name: "Dependency2"), ], - platforms: [], + platforms: [.ios, .tvos], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil ), - ], - platforms: [.iOS, .tvOS] + ] ) let expected: ProjectDescription.Project = .testWithDefaultConfigs( @@ -3074,7 +3068,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ), ], - platforms: [], + platforms: [.ios, .tvos], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -3087,7 +3081,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test(name: "Target2"), .test(name: "Target3"), ], - platforms: [], + platforms: [.ios, .tvos], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -3095,8 +3089,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { let project = try subject.map( package: "Package", basePath: basePath, - packageInfos: ["Package": package1, "Package2": package2], - platforms: [.iOS, .tvOS] + packageInfos: ["Package": package1, "Package2": package2] ) let expected: ProjectDescription.Project = .testWithDefaultConfigs( @@ -3133,7 +3126,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { let projectTargets = project!.targets.sorted(by: \.name) let expectedTargets = expected.targets.sorted(by: \.name) - XCTAssertEqual( + XCTAssertBetterEqual( projectTargets, expectedTargets ) @@ -3162,7 +3155,6 @@ extension PackageInfoMapping { package: String, basePath: AbsolutePath = "/", packageInfos: [String: PackageInfo] = [:], - platforms: Set = [.iOS], baseSettings: TuistGraph.Settings = .default, targetSettings: [String: TuistGraph.SettingsDictionary] = [:], swiftToolsVersion: TSCUtility.Version? = nil, @@ -3192,23 +3184,6 @@ extension PackageInfoMapping { packageToTargetsToArtifactPaths: packageToTargetsToArtifactPaths ) - let destinations: ProjectDescription.Destinations = Set(platforms.flatMap { platform -> ProjectDescription.Destinations in - switch platform { - case .iOS: - [.iPhone, .iPad, .appleVisionWithiPadDesign, .macWithiPadDesign] - case .macCatalyst: - [.macCatalyst] - case .macOS: - [.mac] - case .tvOS: - [.appleTv] - case .watchOS: - [.appleWatch] - case .visionOS: - [.appleVision] - } - }) - return try map( packageInfo: packageInfos[package]!, packageInfos: packageInfos, @@ -3219,7 +3194,6 @@ extension PackageInfoMapping { targetSettings: targetSettings, projectOptions: projectOptions, minDeploymentTargets: preprocessInfo.platformToMinDeploymentTarget, - destinations: destinations, targetToProducts: preprocessInfo.targetToProducts, targetToResolvedDependencies: preprocessInfo.targetToResolvedDependencies, macroDependencies: preprocessInfo.macroDependencies, diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/Package.swift b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/Package.swift index 50334783781..b706ba0d8b9 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/Package.swift +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Add External Dependencies/Package.swift @@ -8,8 +8,7 @@ import PackageDescription let packageSettings = PackageSettings( productTypes: [ "Alamofire": .framework, // default is .staticFramework - ], - platforms: [.iOS] + ] ) #endif diff --git a/fixtures/app_with_plugins/Package.swift b/fixtures/app_with_plugins/Package.swift index a93a11c95d2..60be1a37250 100644 --- a/fixtures/app_with_plugins/Package.swift +++ b/fixtures/app_with_plugins/Package.swift @@ -10,10 +10,7 @@ import PackageDescription let localPlugin = LocalHelper(name: "local") let remotePlugin = RemoteHelper(name: "remote") - let packageSettings = PackageSettings( - platforms: [.iOS, .macOS] - ) - + let packageSettings = PackageSettings() #endif let package = Package( diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.swift b/fixtures/app_with_spm_dependencies/Tuist/Package.swift index 895c9e7582b..a3f9280a8a1 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/Package.swift +++ b/fixtures/app_with_spm_dependencies/Tuist/Package.swift @@ -9,8 +9,7 @@ import PackageDescription baseSettings: .targetSettings, projectOptions: [ "LocalSwiftPackage": .options(disableSynthesizedResourceAccessors: false), - ], - platforms: [.iOS, .watchOS] + ] ) #endif diff --git a/fixtures/multiplatform_app_with_sdk/Package.swift b/fixtures/multiplatform_app_with_sdk/Package.swift index 36f84b74369..49994d9822a 100644 --- a/fixtures/multiplatform_app_with_sdk/Package.swift +++ b/fixtures/multiplatform_app_with_sdk/Package.swift @@ -1,14 +1,6 @@ // swift-tools-version: 5.9 import PackageDescription -#if TUIST - import ProjectDescription - - let packageSettings = PackageSettings( - platforms: [.macOS, .iOS] - ) -#endif - let package = Package( name: "PackageName", dependencies: [ From c481dc48b587ec40f7dac65a2c0b24372c484d43 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 21 Feb 2024 10:14:01 +0000 Subject: [PATCH 109/509] [Release] Tuist 4.3.2 --- .mise.toml | 2 +- CHANGELOG.md | 14 ++++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index 1e40d9a6b88..49d66693867 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.3.1" +tuist = "4.3.2" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index 97dacf2a103..1954a04dc36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## 4.3.2 - 2024-02-21 + +### Tuist + +#### Changed + +- Remove PackageSettings platforms property [#5953](https://github.com/tuist/tuist/pull/5953) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +#### Fixed + +- Improve retrying logic when interacting with the remote cache by [@pepicrft](https://github.com/pepicrft) + ## 4.3.1 - 2024-02-20 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 9ca5d5144ad..115aec18122 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.3.1" + public static let version = "4.3.2" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From ca26b2c77e6472cc9ef8f495f921f54eff4a1371 Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 21 Feb 2024 12:06:17 +0100 Subject: [PATCH 110/509] Force run From 30737d0aae1afd8844e75ea2829a189bf8f37fdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:06:05 +0100 Subject: [PATCH 111/509] Migrate CI pipelines to Codemagic (#5913) * Move the lint workflow to Codemagic * Rename file * Force run * Activate Mise's experimental mode * Add environment variables * Remove execution pattern * Set MISE_EXPERIMENTAL=1 * Move the deployment of the docs * Move documentatino building to Codemagic * Add mise x * Fix execution * Fix pipeline * Move unit tests * Remove the Tuist pipeline * Migrate everything * Fix pipeline * Fix the step name * Merge most recent changes --- .../workflows/deploy-tuist-docc-dry-run.yml | 28 -- .github/workflows/deploy-tuist-docc.yml | 59 ---- .github/workflows/tuist.yml | 136 --------- codemagic.yaml | 281 ++++++++++++++++++ 4 files changed, 281 insertions(+), 223 deletions(-) delete mode 100644 .github/workflows/deploy-tuist-docc-dry-run.yml delete mode 100644 .github/workflows/deploy-tuist-docc.yml delete mode 100644 .github/workflows/tuist.yml create mode 100644 codemagic.yaml diff --git a/.github/workflows/deploy-tuist-docc-dry-run.yml b/.github/workflows/deploy-tuist-docc-dry-run.yml deleted file mode 100644 index 987500647b8..00000000000 --- a/.github/workflows/deploy-tuist-docc-dry-run.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Deploy Tuist DocC dry-run - -on: - pull_request: - paths: - - Sources/ProjectDescription/** - - docs/** - - .github/workflows/deploy-tuist-docc-dry-run.yml - -jobs: - deploy: - name: Deploy Documentation - runs-on: macos-13 - steps: - - name: Checkout Package - uses: actions/checkout@v3 - - name: Checkout all tuist versions - uses: actions/checkout@v3 - with: - fetch-depth: 0 - path: tuist-archive - - name: Select Xcode - run: sudo xcode-select -switch /Applications/Xcode_$(cat .xcode-version).app - - uses: jdx/mise-action@v2 - with: - experimental: true - - name: Build documentation - run: bash ./make/tasks/github/build-docc.sh diff --git a/.github/workflows/deploy-tuist-docc.yml b/.github/workflows/deploy-tuist-docc.yml deleted file mode 100644 index ef75ee2c2bc..00000000000 --- a/.github/workflows/deploy-tuist-docc.yml +++ /dev/null @@ -1,59 +0,0 @@ -# Build and deploy DocC to GitHub pages. Based off of PointFree's work here: -# https://github.com/pointfreeco/swift-parsing/blob/main/.github/workflows/documentation.yml -name: Deploy Tuist DocC - -on: - workflow_dispatch: {} - push: - branches: - - main - -concurrency: - group: tuist-docc-${{ github.head_ref }} - cancel-in-progress: true - -jobs: - deploy: - name: Deploy Documentation - runs-on: macos-13 - steps: - - name: Start deployment - uses: bobheadxi/deployments@v1 - id: deployment - with: - env: production - step: start - - name: Checkout Package - uses: actions/checkout@v3 - - name: Checkout all tuist versions - uses: actions/checkout@v3 - with: - fetch-depth: 0 - path: tuist-archive - - name: Select Xcode - run: sudo xcode-select -switch /Applications/Xcode_$(cat .xcode-version).app - - uses: jdx/mise-action@v2 - with: - experimental: true - - name: Build documentation - run: bash ./make/tasks/github/build-docc.sh - - name: Fix permissions - run: 'sudo chown -R $USER .build/documentation' - - name: Publish to Cloudflare Pages - uses: cloudflare/pages-action@v1 - with: - apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} - accountId: cc0237353f2f825680b0463629cd4a86 - projectName: tuist-docs - directory: .build/documentation - gitHubToken: ${{ secrets.GITHUB_TOKEN }} - wranglerVersion: '3' - - name: Finish deployment - uses: bobheadxi/deployments@v1 - if: always() - with: - env: ${{ steps.deployment.outputs.env }} - step: finish - status: ${{ job.status }} - deployment_id: ${{ steps.deployment.outputs.deployment_id }} - env_url: "https://docs.tuist.io" diff --git a/.github/workflows/tuist.yml b/.github/workflows/tuist.yml deleted file mode 100644 index f26b0d71b43..00000000000 --- a/.github/workflows/tuist.yml +++ /dev/null @@ -1,136 +0,0 @@ -name: Tuist - -on: - push: - branches: - - main - pull_request: - paths: - - .xcode-version - - Tuist/** - - Package.resolved - - Gemfile* - - Package.swift - - Project.swift - - Sources/** - - '!Sources/**/*.docc' - - Templates/** - - Tests/** - - fixtures/** - - .package.resolved - - .github/workflows/tuist.yml - -concurrency: - group: tuist-${{ github.head_ref }} - cancel-in-progress: true - -env: - TUIST_CONFIG_CLOUD_TOKEN: ${{ secrets.TUIST_CONFIG_CLOUD_TOKEN }} - -jobs: - test: - name: Test with Xcode - runs-on: macos-13 - steps: - - uses: actions/checkout@v3 - - name: Select Xcode - run: sudo xcode-select -switch /Applications/Xcode_$(cat .xcode-version).app - - uses: jdx/mise-action@v2 - with: - experimental: true - - name: Select Xcode - run: sudo xcode-select -switch /Applications/Xcode_$(cat .xcode-version).app - - uses: actions/cache@v3 - name: 'Cache fetched dependencies folder' - with: - path: Tuist/Dependencies/SwiftPackageManager/.build - key: spm-v1-${{ hashFiles('Package.resolved') }} - restore-keys: spm-v1-${{ hashFiles('Package.resolved') }} - - name: Install dependencies - run: tuist install - - name: Test - run: tuist test TuistUnitTests --result-bundle-path /tmp/tuist/test - - uses: actions/upload-artifact@v4 - if: ${{ always() }} - with: - name: test-${{ matrix.feature }} - path: | - /tmp/tuist/** - - cache-warm: - name: Cache warm with latest Tuist - runs-on: macos-13 - steps: - - uses: actions/checkout@v3 - - uses: jdx/mise-action@v2 - with: - experimental: true - - name: Select Xcode - run: sudo xcode-select -switch /Applications/Xcode_$(cat .xcode-version).app - - uses: actions/cache@v3 - name: 'Cache fetched dependencies folder' - with: - path: Tuist/Dependencies/SwiftPackageManager/.build - key: spm-v1-${{ hashFiles('Package.resolved') }} - restore-keys: spm-v1-${{ hashFiles('Package.resolved') }} - - name: Install dependencies - run: tuist install - - name: Print hashes - run: tuist cache --print-hashes - - name: Cache warm - run: tuist cache - - acceptance_tests: - name: Run ${{ matrix.feature }} - runs-on: macos-13 - env: - TUIST_CONFIG_CLOUD_TOKEN: ${{ secrets.TUIST_CONFIG_CLOUD_TOKEN }} - strategy: - matrix: - feature: - [ - 'tuistAcceptanceTests', - 'TuistAutomationAcceptanceTests', - 'TuistDependenciesAcceptanceTests', - 'TuistGeneratorAcceptanceTests' - ] - steps: - - uses: actions/checkout@v4 - - uses: jdx/mise-action@v2 - with: - experimental: true - - name: Select Xcode - # Xcode accepts -skipMacroValidation - run: sudo xcode-select -switch /Applications/Xcode_$(cat .xcode-version).app - - name: Skip Xcode Macro Fingerprint Validation - run: defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES - - name: Skip Xcode Package Validation - run: defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES - - uses: actions/cache@v3 - name: 'Cache fetched dependencies folder' - with: - path: Tuist/Dependencies/SwiftPackageManager/.build - key: spm-v1-${{ hashFiles('Tuist/Package.resolved') }} - restore-keys: spm-v1-${{ hashFiles('Tuist/Package.resolved') }} - - name: Install dependencies - run: tuist install - - name: Run acceptance tests - run: tuist test --result-bundle-path /tmp/tuist/test-${{ matrix.feature }} ${{ matrix.feature }} - - uses: actions/upload-artifact@v4 - if: ${{ always() }} - with: - name: test-${{ matrix.feature }} - path: | - /tmp/tuist/** - lint: - name: Lint - runs-on: macos-13 - steps: - - uses: actions/checkout@v3 - - uses: jdx/mise-action@v2 - with: - experimental: true - - name: Select Xcode - run: sudo xcode-select -switch /Applications/Xcode_$(cat .xcode-version).app - - name: Run - run: mise run lint diff --git a/codemagic.yaml b/codemagic.yaml new file mode 100644 index 00000000000..da8e2851144 --- /dev/null +++ b/codemagic.yaml @@ -0,0 +1,281 @@ +workflows: + lint: + name: Lint + max_build_duration: 60 + environment: + xcode: 15.2 + scripts: + - name: Set environment variables + script: | + echo "MISE_EXPERIMENTAL=1" >> $CM_ENV + - name: Install Mise + script: | + curl https://mise.run | sh + mise install + - name: Lint + script: mise run lint + triggering: &branch_triggering + events: + - push + - pull_request + branch_patterns: + - pattern: '*' + include: true + cancel_previous_builds: true + build_docs: + name: Build Documentation + max_build_duration: 60 + environment: + xcode: 15.2 + groups: + - tuist + scripts: + - name: Set environment variables + script: | + echo "MISE_EXPERIMENTAL=1" >> $CM_ENV + - name: Install Mise + script: | + curl https://mise.run | sh + mise install + - name: Build + script: bash ./make/tasks/github/build-docc.sh + triggering: + << : *branch_triggering + unit_tests: + name: Unit tests + max_build_duration: 60 + environment: + xcode: 15.2 + groups: + - tuist + cache: + cache_paths: + - $CM_BUILD_DIR/.build + artifacts: + - /tmp/tuist/** + scripts: + - name: Set environment variables + script: | + echo "MISE_EXPERIMENTAL=1" >> $CM_ENV + - name: Install Mise + script: | + curl https://mise.run | sh + mise install + - name: Install Tuist dependencies + script: mise x -- tuist install + - name: Run tests + script: mise x -- tuist test TuistUnitTests --result-bundle-path /tmp/tuist/test-result-bundle + triggering: + << : *branch_triggering + cache: + name: Cache + max_build_duration: 60 + environment: + xcode: 15.2 + cache: + cache_paths: + - $CM_BUILD_DIR/.build + artifacts: + - /tmp/tuist/** + scripts: + - name: Set environment variables + script: | + echo "MISE_EXPERIMENTAL=1" >> $CM_ENV + - name: Install Mise + script: | + curl https://mise.run | sh + mise install + - name: Install Tuist dependencies + script: mise x -- tuist install + - name: Print hashes + script: mise x -- tuist cache --print-hashes + - name: Cache + script: mise x -- tuist cache + triggering: + << : *branch_triggering + + deploy_docs: + name: Deploy Documentation + max_build_duration: 60 + environment: + xcode: 15.2 + scripts: + - name: Set environment variables + script: | + echo "MISE_EXPERIMENTAL=1" >> $CM_ENV + echo "CLOUDFLARE_ACCOUNT_ID=cc0237353f2f825680b0463629cd4a86" + - name: Install Mise + script: | + curl https://mise.run | sh + mise install + - name: Lint + script: bash ./make/tasks/github/build-docc.sh + - name: Fix permissions + script: sudo chown -R $USER .build/documentation + - name: Deploy to Cloudflare Pages + script: | + mise install node@latest + mise x npm:wrangler@latest -- wrangler pages deploy --branch main --commit-hash $CM_COMMIT --branch $CM_BRANCH --project-name tuist-docs .build/documentation + triggering: + events: + - push + branch_patterns: + - pattern: 'main' + include: true + cancel_previous_builds: true + tuist_acceptance_tests: + name: Tuist acceptance tests + max_build_duration: 60 + environment: + xcode: 15.2 + groups: + - tuist + cache: + cache_paths: + - $CM_BUILD_DIR/.build + artifacts: + - /tmp/tuist/** + scripts: + - name: Set environment variables + script: | + echo "MISE_EXPERIMENTAL=1" >> $CM_ENV + - name: Install Mise + script: | + curl https://mise.run | sh + mise install + - name: Skip Xcode Macro Fingerprint Validation + script: defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES + - name: Skip Xcode Package Validation + script: defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES + - name: Install Tuist dependencies + script: mise x -- tuist install + - name: Run tests + script: mise x -- tuist test --result-bundle-path /tmp/tuist/tuist-acceptance-test-result-bundle TuistAcceptanceTests + triggering: + << : *branch_triggering + + # FIXME: Merge all the schemes into one and remove all of the following workflows + + tuist_automation_acceptance_tests: + name: Tuist automation acceptance tests + max_build_duration: 60 + environment: + xcode: 15.2 + groups: + - tuist + cache: + cache_paths: + - $CM_BUILD_DIR/.build + artifacts: + - /tmp/tuist/** + scripts: + - name: Set environment variables + script: | + echo "MISE_EXPERIMENTAL=1" >> $CM_ENV + - name: Install Mise + script: | + curl https://mise.run | sh + mise install + - name: Skip Xcode Macro Fingerprint Validation + script: defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES + - name: Skip Xcode Package Validation + script: defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES + - name: Install Tuist dependencies + script: mise x -- tuist install + - name: Run tests + script: mise x -- tuist test TuistAutomationAcceptanceTests --result-bundle-path /tmp/tuist/automation-acceptance-test-result-bundle + triggering: + << : *branch_triggering + + tuist_dependencies_acceptance_tests: + name: Tuist dependencies acceptance tests + max_build_duration: 60 + environment: + xcode: 15.2 + groups: + - tuist + cache: + cache_paths: + - $CM_BUILD_DIR/.build + artifacts: + - /tmp/tuist/** + scripts: + - name: Set environment variables + script: | + echo "MISE_EXPERIMENTAL=1" >> $CM_ENV + - name: Install Mise + script: | + curl https://mise.run | sh + mise install + - name: Skip Xcode Macro Fingerprint Validation + script: defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES + - name: Skip Xcode Package Validation + script: defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES + - name: Install Tuist dependencies + script: mise x -- tuist install + - name: Run tests + script: mise x -- tuist test --result-bundle-path /tmp/tuist/dependencies-acceptance-test-result-bundle TuistDependenciesAcceptanceTests + triggering: + << : *branch_triggering + + tuist_generator_acceptance_tests: + name: Tuist generator acceptance tests + max_build_duration: 60 + environment: + xcode: 15.2 + groups: + - tuist + cache: + cache_paths: + - $CM_BUILD_DIR/.build + artifacts: + - /tmp/tuist/** + scripts: + - name: Set environment variables + script: | + echo "MISE_EXPERIMENTAL=1" >> $CM_ENV + - name: Install Mise + script: | + curl https://mise.run | sh + mise install + - name: Skip Xcode Macro Fingerprint Validation + script: defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES + - name: Skip Xcode Package Validation + script: defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES + - name: Install Tuist dependencies + script: mise x -- tuist install + - name: Run tests + script: mise x -- tuist test TuistGeneratorAcceptanceTests --result-bundle-path /tmp/tuist/generator-acceptance-test-result-bundle + triggering: + << : *branch_triggering + + tuist_acceptance_tests: + name: Tuist acceptance tests + max_build_duration: 60 + environment: + xcode: 15.2 + groups: + - tuist + cache: + cache_paths: + - $CM_BUILD_DIR/.build + artifacts: + - /tmp/tuist/** + scripts: + - name: Set environment variables + script: | + echo "MISE_EXPERIMENTAL=1" >> $CM_ENV + - name: Install Mise + script: | + curl https://mise.run | sh + mise install + - name: Skip Xcode Macro Fingerprint Validation + script: defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES + - name: Skip Xcode Package Validation + script: defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES + - name: Install Tuist dependencies + script: mise x -- tuist install + - name: Run tests + script: mise x -- tuist test tuistAcceptanceTests --result-bundle-path /tmp/tuist/tuist-acceptance-test-result-bundle + triggering: + << : *branch_triggering \ No newline at end of file From c9be5ba228f5930e6fde141e90edc18fde84edfc Mon Sep 17 00:00:00 2001 From: Ethan Parker Date: Wed, 21 Feb 2024 23:11:10 +0900 Subject: [PATCH 112/509] Support visionOS from the default asset templates to synthesize resources (#5963) * adding check for visionOS * Force run * adding check for visionOS --------- Co-authored-by: Daniele Formichelli Co-authored-by: Pedro --- .../Templates/AssetsTemplate.swift | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Sources/TuistGenerator/Templates/AssetsTemplate.swift b/Sources/TuistGenerator/Templates/AssetsTemplate.swift index b572ae90958..fd261a46475 100644 --- a/Sources/TuistGenerator/Templates/AssetsTemplate.swift +++ b/Sources/TuistGenerator/Templates/AssetsTemplate.swift @@ -152,11 +152,11 @@ extension SynthesizedResourceInterfaceTemplates { #if os(macOS) {{accessModifier}} typealias Color = NSColor - #elseif os(iOS) || os(tvOS) || os(watchOS) + #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) {{accessModifier}} typealias Color = UIColor #endif - @available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, *) + @available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, visionOS 1.0, *) {{accessModifier}} private(set) lazy var color: Color = { guard let color = Color(asset: self) else { fatalError("Unable to load color asset named \\(name).") @@ -166,7 +166,7 @@ extension SynthesizedResourceInterfaceTemplates { #if canImport(SwiftUI) private var _swiftUIColor: Any? = nil - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, visionOS 1.0, *) {{accessModifier}} private(set) var swiftUIColor: SwiftUI.Color { get { if self._swiftUIColor == nil { @@ -187,10 +187,10 @@ extension SynthesizedResourceInterfaceTemplates { } {{accessModifier}} extension {{colorType}}.Color { - @available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, *) + @available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, visionOS 1.0, *) convenience init?(asset: {{colorType}}) { let bundle = {{bundleToken}}.bundle - #if os(iOS) || os(tvOS) + #if os(iOS) || os(tvOS) || os(visionOS) self.init(named: asset.name, in: bundle, compatibleWith: nil) #elseif os(macOS) self.init(named: NSColor.Name(asset.name), bundle: bundle) @@ -201,7 +201,7 @@ extension SynthesizedResourceInterfaceTemplates { } #if canImport(SwiftUI) - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, visionOS 1.0, *) {{accessModifier}} extension SwiftUI.Color { init(asset: {{colorType}}) { let bundle = {{bundleToken}}.bundle @@ -215,8 +215,8 @@ extension SynthesizedResourceInterfaceTemplates { {{accessModifier}} struct {{dataType}} { {{accessModifier}} fileprivate(set) var name: String - #if os(iOS) || os(tvOS) || os(macOS) - @available(iOS 9.0, macOS 10.11, *) + #if os(iOS) || os(tvOS) || os(macOS) || os(visionOS) + @available(iOS 9.0, macOS 10.11, visionOS 1.0, *) {{accessModifier}} var data: NSDataAsset { guard let data = NSDataAsset(asset: self) else { fatalError("Unable to load data asset named \\(name).") @@ -226,12 +226,12 @@ extension SynthesizedResourceInterfaceTemplates { #endif } - #if os(iOS) || os(tvOS) || os(macOS) - @available(iOS 9.0, macOS 10.11, *) + #if os(iOS) || os(tvOS) || os(macOS) || os(visionOS) + @available(iOS 9.0, macOS 10.11, visionOS 1.0, *) {{accessModifier}} extension NSDataAsset { convenience init?(asset: {{dataType}}) { let bundle = {{bundleToken}}.bundle - #if os(iOS) || os(tvOS) + #if os(iOS) || os(tvOS) || os(visionOS) self.init(name: asset.name, bundle: bundle) #elseif os(macOS) self.init(name: NSDataAsset.Name(asset.name), bundle: bundle) @@ -247,13 +247,13 @@ extension SynthesizedResourceInterfaceTemplates { #if os(macOS) {{accessModifier}} typealias Image = NSImage - #elseif os(iOS) || os(tvOS) || os(watchOS) + #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) {{accessModifier}} typealias Image = UIImage #endif {{accessModifier}} var image: Image { let bundle = {{bundleToken}}.bundle - #if os(iOS) || os(tvOS) + #if os(iOS) || os(tvOS) || os(visionOS) let image = Image(named: name, in: bundle, compatibleWith: nil) #elseif os(macOS) let image = bundle.image(forResource: NSImage.Name(name)) @@ -267,7 +267,7 @@ extension SynthesizedResourceInterfaceTemplates { } #if canImport(SwiftUI) - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, visionOS 1.0, *) {{accessModifier}} var swiftUIImage: SwiftUI.Image { SwiftUI.Image(asset: self) } @@ -275,7 +275,7 @@ extension SynthesizedResourceInterfaceTemplates { } #if canImport(SwiftUI) - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, visionOS 1.0, *) {{accessModifier}} extension SwiftUI.Image { init(asset: {{imageType}}) { let bundle = {{bundleToken}}.bundle From ee7297d792e91fbf3a47a07e88943fd8978fb9a3 Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 21 Feb 2024 15:52:10 +0100 Subject: [PATCH 113/509] Force CI From aec19cab87c591df71e4e68d739cb60315916d3c Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 21 Feb 2024 15:01:20 +0000 Subject: [PATCH 114/509] [Release] Tuist 4.3.3 --- .mise.toml | 2 +- CHANGELOG.md | 15 +++++++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index 49d66693867..5701dac8f30 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.3.2" +tuist = "4.3.3" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index 1954a04dc36..8d3f0f4560c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## 4.3.3 - 2024-02-21 + +### Tuist + +#### Added + +- Migrate CI pipelines to Codemagic [#5913](https://github.com/tuist/tuist/pull/5913) by [@pepicrft](https://github.com/pepicrft) +- Support visionOS from the default asset templates to synthesize resources [#5963](https://github.com/tuist/tuist/pull/5963) by [@Ethan-IS](https://github.com/Ethan-IS) + +### Tuist Cloud + +#### Fixed + +- Override existing artifacts in the cache that are invalid by [@pepicrft](https://github.com/pepicrft) + ## 4.3.2 - 2024-02-21 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 115aec18122..b70a65caf5a 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.3.2" + public static let version = "4.3.3" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From 41fd9e760e7def0698ef0f50bf4c3447c12511ac Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 21 Feb 2024 16:01:25 +0100 Subject: [PATCH 115/509] Fix documentation deployment --- codemagic.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/codemagic.yaml b/codemagic.yaml index da8e2851144..a97f69249c6 100644 --- a/codemagic.yaml +++ b/codemagic.yaml @@ -99,6 +99,8 @@ workflows: max_build_duration: 60 environment: xcode: 15.2 + groups: + - tuist scripts: - name: Set environment variables script: | From ddd207c662d881a981085f47d02da0f6a27acc54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 21 Feb 2024 16:02:32 +0100 Subject: [PATCH 116/509] Update XcodeProj to 8.19.0 (#5967) --- Package.resolved | 4 ++-- Package.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Package.resolved b/Package.resolved index 0cd94db3c23..fa2dcae2b7f 100644 --- a/Package.resolved +++ b/Package.resolved @@ -221,8 +221,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/tuist/XcodeProj", "state" : { - "revision" : "e29e0db843062f5157f77d5b68f237eb5aa43f12", - "version" : "8.18.0" + "revision" : "75e787fb3eb5a8397c3d06d5a71e667ac2d20ac1", + "version" : "8.19.0" } }, { diff --git a/Package.swift b/Package.swift index fe99dab075d..9a1c79686b7 100644 --- a/Package.swift +++ b/Package.swift @@ -424,7 +424,7 @@ let package = Package( .package(url: "https://github.com/SwiftDocOrg/GraphViz", exact: "0.2.0"), .package(url: "https://github.com/SwiftGen/StencilSwiftKit", exact: "2.10.1"), .package(url: "https://github.com/SwiftGen/SwiftGen", exact: "6.6.2"), - .package(url: "https://github.com/tuist/XcodeProj", exact: "8.18.0"), + .package(url: "https://github.com/tuist/XcodeProj", exact: "8.19.0"), .package(url: "https://github.com/cpisciotta/xcbeautify", from: "1.4.0"), .package(url: "https://github.com/krzysztofzablocki/Difference.git", from: "1.0.2"), .package(url: "https://github.com/Kolos65/Mockable.git", from: "0.0.2"), From 822711688c293d4933e073e7c20c2ba2b4b87560 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 21 Feb 2024 15:11:55 +0000 Subject: [PATCH 117/509] [Release] Tuist 4.3.3 From d8b4c0fa0627246cf234d8fafd9f5e9ead1d7653 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 21 Feb 2024 15:22:57 +0000 Subject: [PATCH 118/509] [Release] Tuist 4.3.3 From a839d9bdf3ec5007759ec69212ddc313da6bda8d Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 21 Feb 2024 17:53:25 +0100 Subject: [PATCH 119/509] Force CI run From 1987758c23764689ba7d9400f97aaeb9d3ea2637 Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 21 Feb 2024 17:58:14 +0100 Subject: [PATCH 120/509] Force CI run From d553e4af3196caafa4f9a01773cfc69777fc62c0 Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 21 Feb 2024 18:29:10 +0100 Subject: [PATCH 121/509] Add missing account id --- codemagic.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemagic.yaml b/codemagic.yaml index a97f69249c6..e02d6b72280 100644 --- a/codemagic.yaml +++ b/codemagic.yaml @@ -105,7 +105,7 @@ workflows: - name: Set environment variables script: | echo "MISE_EXPERIMENTAL=1" >> $CM_ENV - echo "CLOUDFLARE_ACCOUNT_ID=cc0237353f2f825680b0463629cd4a86" + echo "CLOUDFLARE_ACCOUNT_ID=cc0237353f2f825680b0463629cd4a86" >> $CM_ENV - name: Install Mise script: | curl https://mise.run | sh From 2dec3baaf02daa5be75b781f96f45cfc5ff39dbf Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 21 Feb 2024 18:39:53 +0100 Subject: [PATCH 122/509] Fix acceptance tests that depended on the underlying architecture --- Tests/TuistAcceptanceTests/PrecompiledAcceptanceTests.swift | 2 +- .../TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/TuistAcceptanceTests/PrecompiledAcceptanceTests.swift b/Tests/TuistAcceptanceTests/PrecompiledAcceptanceTests.swift index d205ec5e50a..4001a1dcf1c 100644 --- a/Tests/TuistAcceptanceTests/PrecompiledAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/PrecompiledAcceptanceTests.swift @@ -28,7 +28,7 @@ final class PrecomiledAcceptanceTestiOSAppWithTransitiveFramework: TuistAcceptan try await run(BuildCommand.self, "App", "--platform", "iOS") try await XCTAssertProductWithDestinationContainsFrameworkWithArchitecture( framework: "Framework1", - architecture: "x86_64" + architecture: "arm64" ) try XCTAssertProductWithDestinationDoesNotContainHeaders( "App.app", diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index a05a127043b..f8fa4da5461 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -537,7 +537,7 @@ final class GenerateAcceptanceTestiOSAppWithAppClip: TuistAcceptanceTestCase { "App.app", destination: "Debug-iphonesimulator", appClip: "AppClip1", - architecture: "x86_64" + architecture: "arm64" ) try XCTAssertFrameworkEmbedded("Framework", by: "AppClip1") } From c723639b319332f76d7dcbe4438fa482452e5186 Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 21 Feb 2024 18:49:47 +0100 Subject: [PATCH 123/509] Fix acceptance tests --- .../Framework2/build.sh | 8 +- .../Mac/Framework2.framework/Framework2 | Bin 55008 -> 54712 bytes .../Headers/Framework2-Swift.h | 167 +++++---- .../Mac/Framework2.framework/Info.plist | 16 +- .../Project/arm64-apple-macos.swiftsourceinfo | Bin 1140 -> 1140 bytes .../arm64-apple-macos.private.swiftinterface | 5 +- .../arm64-apple-macos.swiftdoc | Bin 400 -> 400 bytes .../arm64-apple-macos.swiftinterface | 5 +- .../arm64-apple-macos.swiftmodule | Bin 17044 -> 20380 bytes .../iOS/Framework2.framework/Framework2 | Bin 171760 -> 170976 bytes .../Headers/Framework2-Swift.h | 330 +++++++++++------- .../iOS/Framework2.framework/Info.plist | Bin 836 -> 837 bytes .../arm64-apple-ios-simulator.swiftsourceinfo | Bin 1152 -> 1148 bytes ...x86_64-apple-ios-simulator.swiftsourceinfo | Bin 1152 -> 1148 bytes ...apple-ios-simulator.private.swiftinterface | 5 +- .../arm64-apple-ios-simulator.swiftdoc | Bin 408 -> 408 bytes .../arm64-apple-ios-simulator.swiftinterface | 5 +- .../arm64-apple-ios-simulator.swiftmodule | Bin 17256 -> 20676 bytes ...apple-ios-simulator.private.swiftinterface | 5 +- .../x86_64-apple-ios-simulator.swiftdoc | Bin 408 -> 408 bytes .../x86_64-apple-ios-simulator.swiftinterface | 5 +- .../x86_64-apple-ios-simulator.swiftmodule | Bin 17260 -> 20676 bytes 22 files changed, 349 insertions(+), 202 deletions(-) diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/build.sh b/fixtures/ios_app_with_transitive_framework/Framework2/build.sh index ccbf765e43c..a12e6fcacac 100755 --- a/fixtures/ios_app_with_transitive_framework/Framework2/build.sh +++ b/fixtures/ios_app_with_transitive_framework/Framework2/build.sh @@ -3,14 +3,14 @@ rm -rf prebuild tuist generate --no-open -TEMP_DIR="/tmp/tuist-framework-2-fixture" +TEMP_DIR=/private$(mktemp -d) IPHONE_SIM_DIR="$TEMP_DIR/Build/Products/Debug-iphonesimulator" MAC_OS_DIR="$TEMP_DIR/Build/Products/Debug" -rm -rf $TEMP_DIR -mkdir -p $TEMP_DIR +echo $TEMP_DIR +trap "rm -rf $TEMP_DIR" EXIT # Ensures it gets deleted -xcrun xcodebuild build -scheme Framework2-iOS -workspace Framework2.xcworkspace -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPhone 14 Pro,OS=latest" -derivedDataPath $TEMP_DIR ONLY_ACTIVE_ARCH=NO +xcrun xcodebuild build -scheme Framework2-iOS -workspace Framework2.xcworkspace -destination generic/platform=iOS -destination generic/platform=iOS\ Simulator -derivedDataPath $TEMP_DIR ONLY_ACTIVE_ARCH=NO xcrun xcodebuild build -scheme Framework2-macOS -workspace Framework2.xcworkspace -derivedDataPath $TEMP_DIR mkdir -p prebuilt/iOS/Framework2.framework diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Framework2 b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Framework2 index f4901b4999857a3ec2bd962c3fc73e4c33b3c1a9..0189f66a91a0260769f79ebd3cc85c2b1ec922e1 100755 GIT binary patch literal 54712 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 #endif -#pragma clang diagnostic ignored "-Wduplicate-method-match" #pragma clang diagnostic ignored "-Wauto-import" #if defined(__OBJC__) #include @@ -32,10 +31,30 @@ #include #include #include +#include +#include +#include +#include #else #include #include #include +#include +#endif +#if defined(__cplusplus) +#if defined(__arm64e__) && __has_include() +# include +#else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +# ifndef __ptrauth_swift_class_method_pointer +# define __ptrauth_swift_class_method_pointer(x) +# endif +#pragma clang diagnostic pop +#endif #endif #if !defined(SWIFT_TYPEDEFS) @@ -71,53 +90,66 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); # if __has_feature(objc_class_property) # define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ # else -# define SWIFT_CLASS_PROPERTY(...) +# define SWIFT_CLASS_PROPERTY(...) # endif #endif - -#if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -#else -# define SWIFT_RUNTIME_NAME(X) +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif #endif -#if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -#else -# define SWIFT_COMPILE_NAME(X) +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif #endif -#if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -#else -# define SWIFT_METHOD_FAMILY(X) +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif #endif -#if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -#else -# define SWIFT_NOESCAPE +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif #endif -#if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -#else -# define SWIFT_RELEASES_ARGUMENT +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif #endif -#if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -#else -# define SWIFT_WARN_UNUSED_RESULT +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif #endif -#if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -#else -# define SWIFT_NORETURN +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif #endif #if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_EXTRA #endif #if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_EXTRA #endif #if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA +# define SWIFT_ENUM_EXTRA #endif #if !defined(SWIFT_CLASS) # if __has_attribute(objc_subclassing_restricted) @@ -137,28 +169,25 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); # define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) # endif #endif - #if !defined(SWIFT_PROTOCOL) # define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA # define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA #endif - #if !defined(SWIFT_EXTENSION) # define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) #endif - #if !defined(OBJC_DESIGNATED_INITIALIZER) # if __has_attribute(objc_designated_initializer) # define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) # else -# define OBJC_DESIGNATED_INITIALIZER +# define OBJC_DESIGNATED_INITIALIZER # endif #endif #if !defined(SWIFT_ENUM_ATTR) -# if defined(__has_attribute) && __has_attribute(enum_extensibility) +# if __has_attribute(enum_extensibility) # define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) # else -# define SWIFT_ENUM_ATTR(_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) # endif #endif #if !defined(SWIFT_ENUM) @@ -187,14 +216,16 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); #if !defined(SWIFT_DEPRECATED_MSG) # define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) #endif -#if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -#else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif #endif #if defined(__OBJC__) #if !defined(IBSegueAction) -# define IBSegueAction +# define IBSegueAction #endif #endif #if !defined(SWIFT_EXTERN) @@ -207,26 +238,42 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); #if !defined(SWIFT_CALL) # define SWIFT_CALL __attribute__((swiftcall)) #endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif #if defined(__cplusplus) -#if !defined(SWIFT_NOEXCEPT) # define SWIFT_NOEXCEPT noexcept -#endif #else -#if !defined(SWIFT_NOEXCEPT) # define SWIFT_NOEXCEPT #endif +#if !defined(SWIFT_C_INLINE_THUNK) +# if __has_attribute(always_inline) +# if __has_attribute(nodebug) +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) +# else +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) +# endif +# else +# define SWIFT_C_INLINE_THUNK inline +# endif #endif -#if defined(__cplusplus) -#if !defined(SWIFT_CXX_INT_DEFINED) -#define SWIFT_CXX_INT_DEFINED -namespace swift { -using Int = ptrdiff_t; -using UInt = size_t; -} +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) +#endif +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL #endif #endif #if defined(__OBJC__) -#if __has_feature(modules) +#if __has_feature(objc_modules) #if __has_warning("-Watimport-in-framework-header") #pragma clang diagnostic ignored "-Watimport-in-framework-header" #endif @@ -251,11 +298,11 @@ using UInt = size_t; #if defined(__OBJC__) #endif -#if defined(__cplusplus) -#endif #if __has_attribute(external_source_symbol) # pragma clang attribute pop #endif +#if defined(__cplusplus) +#endif #pragma clang diagnostic pop #endif diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Info.plist b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Info.plist index a0991779f9e..08d45571ba2 100644 --- a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Info.plist +++ b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Info.plist @@ -3,7 +3,7 @@ BuildMachineOSBuild - 22E261 + 23C71 CFBundleDevelopmentRegion en CFBundleExecutable @@ -27,21 +27,21 @@ DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild - 14C18 + DTPlatformName macosx DTPlatformVersion - 13.1 + 14.2 DTSDKBuild - 22C55 + 23C53 DTSDKName - macosx13.1 + macosx14.2 DTXcode - 1420 + 1520 DTXcodeBuild - 14C18 + 15C500b LSMinimumSystemVersion - 13.1 + 14.2 NSHumanReadableCopyright Copyright Tuist©. All rights reserved. diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Modules/Framework2.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Modules/Framework2.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo index 0cbfad9637e0dbbda923139dfa81272f60d273d1..9674059f0c081efcbbe707b98b7d826b82aa7e99 100644 GIT binary patch delta 210 zcmeyu@r7f9J|m;SWCKPiJxe_!1&!kJ%(Rl6#JqG}Q;+}Bv|Avn9a!yQlrYeOY<+t5dF~N)S_bjg4BY{k3p|Po+sX{VX#L&dRK+izW z$WqVLP;+txqZ+fZp5f$$jM3~f_cBY1UNM@?%w#BA!@$5G1;ori%mKv6pk{I)lQd(^ zpElbVGFGwxYFDcC| XF3~S2%FjwoE-9YO!4fk$iA4witKKz{ diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-macos.private.swiftinterface b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-macos.private.swiftinterface index bf4ced477df..9b632896c17 100644 --- a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-macos.private.swiftinterface +++ b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-macos.private.swiftinterface @@ -1,11 +1,12 @@ // swift-interface-format-version: 1.0 -// swift-compiler-version: Apple Swift version 5.7.2 (swiftlang-5.7.2.135.5 clang-1400.0.29.51) -// swift-module-flags: -target arm64-apple-macos13.1 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -module-name Framework2 +// swift-compiler-version: Apple Swift version 5.9.2 (swiftlang-5.9.2.2.56 clang-1500.1.0.2.5) +// swift-module-flags: -target arm64-apple-macos14.2 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -module-name Framework2 // swift-module-flags-ignorable: -enable-bare-slash-regex import Foundation import Swift import _Concurrency import _StringProcessing +import _SwiftConcurrencyShims public class Framework2File { public init() public func hello() -> Swift.String diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-macos.swiftdoc b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-macos.swiftdoc index 330ca146f1d4237f2daba877dd0f5033c3e60e14..5618c6a78e561277e1a467c455aed399602cd7bd 100644 GIT binary patch delta 92 zcmbQhJb`(_V^0Gv1_lPlf`Xh>h2Zkcv=W7~)S}|d{5%CyJxe_!1&v~mU`}FQx-M8i l&q&YIOd%O8U}$P!pl7IO020$=n5@I7#%!WzG&z*f8UXs185sZo delta 92 zcmbQhJb`(_V^0Sz1_lPlf`Xh>h2Zkcv=W7~)S}|d{5%CyJ##%H1&v~mU`}FQx-M8i n&(PRZ&r~59EMjP4V4!E9XJn~oYN$C`hf$5$SkG{BD5Et10a_Ve diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-macos.swiftinterface b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-macos.swiftinterface index bf4ced477df..9b632896c17 100644 --- a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-macos.swiftinterface +++ b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-macos.swiftinterface @@ -1,11 +1,12 @@ // swift-interface-format-version: 1.0 -// swift-compiler-version: Apple Swift version 5.7.2 (swiftlang-5.7.2.135.5 clang-1400.0.29.51) -// swift-module-flags: -target arm64-apple-macos13.1 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -module-name Framework2 +// swift-compiler-version: Apple Swift version 5.9.2 (swiftlang-5.9.2.2.56 clang-1500.1.0.2.5) +// swift-module-flags: -target arm64-apple-macos14.2 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -module-name Framework2 // swift-module-flags-ignorable: -enable-bare-slash-regex import Foundation import Swift import _Concurrency import _StringProcessing +import _SwiftConcurrencyShims public class Framework2File { public init() public func hello() -> Swift.String diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-macos.swiftmodule b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/Mac/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-macos.swiftmodule index f909f21416e2c1beb510e027faef2117b34ec627..bd82756068676a1d4531918513882635dec4ab2e 100644 GIT binary patch literal 20380 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 diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Framework2 b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Framework2 index 7bb5fe927bd56e09f92f1b55452966613f3c37bf..9f4e3eb8933e94bbca01ccddef955ecd39eeec0e 100755 GIT binary patch delta 5783 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 delta 6011 zcmc&&3shBA8s7Wd3*38oU7n&491#&51pzTIgbN~GD#&Ny0=>Ki6hR&(C~^v0k;Moe zY-@uJj6Kv=DT+}(FGYst7!{V9DM$~TRWnYLW;V+F`<#7v+?8W%%~X4>z4!V4|2zBn zpMAf5d)swakLc>%-Mz0Ogd8wJc2FaP1<2l4#m5tTS`7zcHXB^W@mhqQL{5@>ERSNzM#Er4Mcr(`9?Fr_x zW-f|xLx`tnjN{#EnN!c46m!(M6`Wg{Q_Y+dOU{8fUfaZ+X<|p*B+(qN-XAqPp2J(k z$LFNrW#aicnUm{bmSG49wDI~5gl<3$b3q=Ex4w-~A+?`C$Y3YtCd|ZnVoQQg@cW*b z?f=q+wh{ctAKD^5-WCcZ9INuY_Snt=ROOjN#c&V;T*OR z&(A#$&`JDku9tYsI00KrPlLvM|61sojwlc^t?5W;x(71F-DjY~#MY3@VIp7UhQq`e zRnv4qjy@YG3Dt|mRb$2;fDs&Z2Y8SUW#Bjz#+pw3(s#spRqi9n=Bi04PYro(h1LlnmT|jB~I*HKff9; zg%{9GT0p`qT#bO~l)WUIyff6#L+0oMQ2AL1MZg2i8PQNcqR({4?2sDXm6+T#z`e9- z+92XM6~fXJMM%WLL;5a3dX@@C8&^Del>PAN>-spc$J%tBC}8`G+GG@Er8o91Em+D zHLKA2B2$Z3LmtC{ z^>9u}X@1cvbRH;stALVRUYMCvg3jQDWhMEmmZQIeL#QGfIUH2o$#%aDw%%JMpa^zm zbW?04AmwPf2G{{sT{(>$;l%OQ2`IoI??EiX(-72i`N1YH-Al8c}Wi8opA+u-w`|9owtM(>+yuU^D21L zqi{?F6(Q5`pxD77pAuw>EglyTytou-!7DOKgG)13WoH(x30|IGmRFuB4>!2Dq^KY# ztE`l)cfx6R@0O4swRi$a)8VmnZR|+D7Q1t~+45@Xp+{1#!=B_KC5+KwURpr{E9k7E zOV*&nq2%5n`z0+N$0ZdFt>jKj>UDS=&XwB3$)w8}CtIKC<~d~75aLhbT(CD^@P(qP|_Xn5o-H&;FaLzG$*Qw3V zzoK{7zV9yvomKPaf+x(ocsu<5PjmK1{@5OW`q^uxDLxVEWO0o3u8CS+o3%{j)TcTCa&m9o=is{q)h_Hjkb0+3xcjW_WuhIZpm& z*`sH0O=P5PPx8`(x}?=LmsTx3bd99D;>e^GhGwSYPgcW6x`ehx$)HQl*Lex8dBw z$-7-1YR&!p!nYF3@b1Q->?z|<);zg-*)BW7o@-5KT~|MouuSmk%TBACs(--arpcWTTdjz%qw zQ<|+t#4ViiAa!j}fGl-YAb)Wh*kAzoFw{37SUe!|;l~Aj#F1KwKU}#0;Wge^Z|5UP zY!Be>g<;af!?Tp)9jx>(;O(6F@9IT&l*qgkWd}oTxEe)ksUr_E70#)Czm7g0pb}Kk#}`0s-d!IzRml3dTYgp6$30Z1 zD*Cvm0%UI^xc`ejZl?NpfEI0QhxGB;N@!(RAGc8`>Er4<>Eo;Gfbw(tn5uW0nkpjv zqWq$GFS^f=sv&N?As%i-$+(4Lm4G&|&{A~t4TfbM?IIxMkW+-TkzC>Mrs_M%S8ofs z`jQ212b_zB)$3vlwYtgz!;nYG2@=}a|Sft01)PA3)6 z?Rdqk&{7!9htX2VTa>1l6KJc8YOY!_w}P1;T7QH(E$~GPeA@#1>PEjGWr0&Ha1~%s@o)uW zzjwrfaKZxrWPt-msc`rQ%mQx$Ohq{otU!+cKv zf4*)=je29oX}gp^}1zq&lQTm5!iqEq3P*Oo1aU%9E%>qDuJNq>pMF>rGqXHmv3%>em00_Zes*fslYu+zkK5)f z3~$JbPvYMH`jek#_LuGs@r<758Tde4d&Kk0-#lC4uzgQw#l%leshgU+_g~jedcLKP J-a3jC{sUS>DwhBN diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Headers/Framework2-Swift.h b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Headers/Framework2-Swift.h index 5cc89b42271..d4d6c9db6b5 100644 --- a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Headers/Framework2-Swift.h +++ b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Headers/Framework2-Swift.h @@ -1,6 +1,6 @@ #if 0 #elif defined(__arm64__) && __arm64__ -// Generated by Apple Swift version 5.7.2 (swiftlang-5.7.2.135.5 clang-1400.0.29.51) +// Generated by Apple Swift version 5.9.2 (swiftlang-5.9.2.2.56 clang-1500.1.0.2.5) #ifndef FRAMEWORK2_SWIFT_H #define FRAMEWORK2_SWIFT_H #pragma clang diagnostic push @@ -23,7 +23,6 @@ # include #endif -#pragma clang diagnostic ignored "-Wduplicate-method-match" #pragma clang diagnostic ignored "-Wauto-import" #if defined(__OBJC__) #include @@ -32,10 +31,30 @@ #include #include #include +#include +#include +#include +#include #else #include #include #include +#include +#endif +#if defined(__cplusplus) +#if defined(__arm64e__) && __has_include() +# include +#else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +# ifndef __ptrauth_swift_class_method_pointer +# define __ptrauth_swift_class_method_pointer(x) +# endif +#pragma clang diagnostic pop +#endif #endif #if !defined(SWIFT_TYPEDEFS) @@ -71,53 +90,66 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); # if __has_feature(objc_class_property) # define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ # else -# define SWIFT_CLASS_PROPERTY(...) +# define SWIFT_CLASS_PROPERTY(...) # endif #endif - -#if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -#else -# define SWIFT_RUNTIME_NAME(X) +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif #endif -#if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -#else -# define SWIFT_COMPILE_NAME(X) +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif #endif -#if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -#else -# define SWIFT_METHOD_FAMILY(X) +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif #endif -#if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -#else -# define SWIFT_NOESCAPE +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif #endif -#if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -#else -# define SWIFT_RELEASES_ARGUMENT +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif #endif -#if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -#else -# define SWIFT_WARN_UNUSED_RESULT +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif #endif -#if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -#else -# define SWIFT_NORETURN +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif #endif #if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_EXTRA #endif #if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_EXTRA #endif #if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA +# define SWIFT_ENUM_EXTRA #endif #if !defined(SWIFT_CLASS) # if __has_attribute(objc_subclassing_restricted) @@ -137,28 +169,25 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); # define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) # endif #endif - #if !defined(SWIFT_PROTOCOL) # define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA # define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA #endif - #if !defined(SWIFT_EXTENSION) # define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) #endif - #if !defined(OBJC_DESIGNATED_INITIALIZER) # if __has_attribute(objc_designated_initializer) # define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) # else -# define OBJC_DESIGNATED_INITIALIZER +# define OBJC_DESIGNATED_INITIALIZER # endif #endif #if !defined(SWIFT_ENUM_ATTR) -# if defined(__has_attribute) && __has_attribute(enum_extensibility) +# if __has_attribute(enum_extensibility) # define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) # else -# define SWIFT_ENUM_ATTR(_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) # endif #endif #if !defined(SWIFT_ENUM) @@ -187,14 +216,16 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); #if !defined(SWIFT_DEPRECATED_MSG) # define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) #endif -#if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -#else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif #endif #if defined(__OBJC__) #if !defined(IBSegueAction) -# define IBSegueAction +# define IBSegueAction #endif #endif #if !defined(SWIFT_EXTERN) @@ -207,26 +238,42 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); #if !defined(SWIFT_CALL) # define SWIFT_CALL __attribute__((swiftcall)) #endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif #if defined(__cplusplus) -#if !defined(SWIFT_NOEXCEPT) # define SWIFT_NOEXCEPT noexcept -#endif #else -#if !defined(SWIFT_NOEXCEPT) # define SWIFT_NOEXCEPT #endif +#if !defined(SWIFT_C_INLINE_THUNK) +# if __has_attribute(always_inline) +# if __has_attribute(nodebug) +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) +# else +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) +# endif +# else +# define SWIFT_C_INLINE_THUNK inline +# endif #endif -#if defined(__cplusplus) -#if !defined(SWIFT_CXX_INT_DEFINED) -#define SWIFT_CXX_INT_DEFINED -namespace swift { -using Int = ptrdiff_t; -using UInt = size_t; -} +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) +#endif +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL #endif #endif #if defined(__OBJC__) -#if __has_feature(modules) +#if __has_feature(objc_modules) #if __has_warning("-Watimport-in-framework-header") #pragma clang diagnostic ignored "-Watimport-in-framework-header" #endif @@ -251,16 +298,16 @@ using UInt = size_t; #if defined(__OBJC__) #endif -#if defined(__cplusplus) -#endif #if __has_attribute(external_source_symbol) # pragma clang attribute pop #endif +#if defined(__cplusplus) +#endif #pragma clang diagnostic pop #endif #elif defined(__x86_64__) && __x86_64__ -// Generated by Apple Swift version 5.7.2 (swiftlang-5.7.2.135.5 clang-1400.0.29.51) +// Generated by Apple Swift version 5.9.2 (swiftlang-5.9.2.2.56 clang-1500.1.0.2.5) #ifndef FRAMEWORK2_SWIFT_H #define FRAMEWORK2_SWIFT_H #pragma clang diagnostic push @@ -283,7 +330,6 @@ using UInt = size_t; # include #endif -#pragma clang diagnostic ignored "-Wduplicate-method-match" #pragma clang diagnostic ignored "-Wauto-import" #if defined(__OBJC__) #include @@ -292,10 +338,30 @@ using UInt = size_t; #include #include #include +#include +#include +#include +#include #else #include #include #include +#include +#endif +#if defined(__cplusplus) +#if defined(__arm64e__) && __has_include() +# include +#else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +# ifndef __ptrauth_swift_class_method_pointer +# define __ptrauth_swift_class_method_pointer(x) +# endif +#pragma clang diagnostic pop +#endif #endif #if !defined(SWIFT_TYPEDEFS) @@ -331,53 +397,66 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); # if __has_feature(objc_class_property) # define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ # else -# define SWIFT_CLASS_PROPERTY(...) +# define SWIFT_CLASS_PROPERTY(...) # endif #endif - -#if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -#else -# define SWIFT_RUNTIME_NAME(X) +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif #endif -#if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -#else -# define SWIFT_COMPILE_NAME(X) +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif #endif -#if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -#else -# define SWIFT_METHOD_FAMILY(X) +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif #endif -#if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -#else -# define SWIFT_NOESCAPE +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif #endif -#if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -#else -# define SWIFT_RELEASES_ARGUMENT +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif #endif -#if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -#else -# define SWIFT_WARN_UNUSED_RESULT +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif #endif -#if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -#else -# define SWIFT_NORETURN +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif #endif #if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_EXTRA #endif #if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_EXTRA #endif #if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA +# define SWIFT_ENUM_EXTRA #endif #if !defined(SWIFT_CLASS) # if __has_attribute(objc_subclassing_restricted) @@ -397,28 +476,25 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); # define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) # endif #endif - #if !defined(SWIFT_PROTOCOL) # define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA # define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA #endif - #if !defined(SWIFT_EXTENSION) # define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) #endif - #if !defined(OBJC_DESIGNATED_INITIALIZER) # if __has_attribute(objc_designated_initializer) # define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) # else -# define OBJC_DESIGNATED_INITIALIZER +# define OBJC_DESIGNATED_INITIALIZER # endif #endif #if !defined(SWIFT_ENUM_ATTR) -# if defined(__has_attribute) && __has_attribute(enum_extensibility) +# if __has_attribute(enum_extensibility) # define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) # else -# define SWIFT_ENUM_ATTR(_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) # endif #endif #if !defined(SWIFT_ENUM) @@ -447,14 +523,16 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); #if !defined(SWIFT_DEPRECATED_MSG) # define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) #endif -#if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -#else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif #endif #if defined(__OBJC__) #if !defined(IBSegueAction) -# define IBSegueAction +# define IBSegueAction #endif #endif #if !defined(SWIFT_EXTERN) @@ -467,26 +545,42 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); #if !defined(SWIFT_CALL) # define SWIFT_CALL __attribute__((swiftcall)) #endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif #if defined(__cplusplus) -#if !defined(SWIFT_NOEXCEPT) # define SWIFT_NOEXCEPT noexcept -#endif #else -#if !defined(SWIFT_NOEXCEPT) # define SWIFT_NOEXCEPT #endif +#if !defined(SWIFT_C_INLINE_THUNK) +# if __has_attribute(always_inline) +# if __has_attribute(nodebug) +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) +# else +# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) +# endif +# else +# define SWIFT_C_INLINE_THUNK inline +# endif #endif -#if defined(__cplusplus) -#if !defined(SWIFT_CXX_INT_DEFINED) -#define SWIFT_CXX_INT_DEFINED -namespace swift { -using Int = ptrdiff_t; -using UInt = size_t; -} +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) +#endif +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL #endif #endif #if defined(__OBJC__) -#if __has_feature(modules) +#if __has_feature(objc_modules) #if __has_warning("-Watimport-in-framework-header") #pragma clang diagnostic ignored "-Watimport-in-framework-header" #endif @@ -511,11 +605,11 @@ using UInt = size_t; #if defined(__OBJC__) #endif -#if defined(__cplusplus) -#endif #if __has_attribute(external_source_symbol) # pragma clang attribute pop #endif +#if defined(__cplusplus) +#endif #pragma clang diagnostic pop #endif diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Info.plist b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Info.plist index 01865eed0ac6246da696466d81909b0aac02215b..440a48af5e596156653fe4560822e450f2094153 100644 GIT binary patch delta 138 zcmX@Yc9dlwuh2xk^#xP>9ipD delta 129 zcmX@gc7$!iaYnWWKF4zaL#-Y>RJ6`#z*WWZQA*_KHfNJfImQYK{} zyOv2>wvK^;!3Bs}fLH{GkwM+$i%iO#AQeGC%r8`k}?C oMaB9BsRfzIMQJ7a#YM^b>6s-NrAd0p`MLTfrJ2PglSNo^0DM|F%K!iX delta 228 zcmeyv(ZIQYk@5ayMn*kGhsg$vQhMfkMhY6m<(X+EIf;4cx~3ojJwsztJyV5bu!y0F zfq|ZZo{^=VsiEfN3Pu%1v&nNA#ThqF-pc6D!TrnQ$*wmy#3u7F889|Ywq=qAl96Dt zlt~%Lu4R&zZDL?xZ~WKF4zaL#-Y>RJ6`#z*WWZQA*_KHfNJfImQYK{} zyOv2>wvK^;!3Bs}fLH{GkwM+$i%iO#AQeGC%r8`k}?C oMaB9BsRfzIMQJ7a#YM^b>6s-NrAd0p`MLTfrJ2PglSNo^0DSm3%m4rY delta 228 zcmeyv(ZIQYk@5ayMn*kGhsg$vQhMfkMhY6m<(X+EIf;4cx~3ojJwsztJyV5bu!y0F zfq|ZZo{^=VsiEfN3Px2%v&r)q#TYkE-pc6D!TrnQ$*wmy#3u7F889|Ywq=qAl96Dt zlt~%Lu4R&zZDL?xZ~ Swift.String diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-ios-simulator.swiftdoc b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-ios-simulator.swiftdoc index 00533eba208c9dd6a8b8c6d78d1b774c9144e7a8..1ed091506ac68c02e6ceacb3165882e68f3f8698 100644 GIT binary patch delta 90 zcmbQiJcD_{V^0Gv1_lPlf`Xh>h2Zkcv=W7~)S}|d{5%CyJxe_!1&v~mU`}FQx-M8i j&q&YIOd%O8U}$P!pl7IO020$=n5@I7!e~A@kkK6g&f^%+ delta 90 zcmbQiJcD_{V^0Sz1_lPlf`Xh>h2Zkcv=W7~)S}|d{5%CyJ##%H1&v~mU`}FQx-M8i l&(PRZ&r~59EMjP4V4!E9XJn~oYN$C`hf#&mY;qu@I{?)Y85RHl diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-ios-simulator.swiftinterface b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-ios-simulator.swiftinterface index 346639174d2..df83246e406 100644 --- a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-ios-simulator.swiftinterface +++ b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-ios-simulator.swiftinterface @@ -1,11 +1,12 @@ // swift-interface-format-version: 1.0 -// swift-compiler-version: Apple Swift version 5.7.2 (swiftlang-5.7.2.135.5 clang-1400.0.29.51) -// swift-module-flags: -target arm64-apple-ios16.2-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -module-name Framework2 +// swift-compiler-version: Apple Swift version 5.9.2 (swiftlang-5.9.2.2.56 clang-1500.1.0.2.5) +// swift-module-flags: -target arm64-apple-ios17.2-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -module-name Framework2 // swift-module-flags-ignorable: -enable-bare-slash-regex import Foundation import Swift import _Concurrency import _StringProcessing +import _SwiftConcurrencyShims public class Framework2File { public init() public func hello() -> Swift.String diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-ios-simulator.swiftmodule b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/arm64-apple-ios-simulator.swiftmodule index e8e1adac3b13c944ec9ecb61a1e0a3706439b350..4b07dfa8e084e8bea3cecb4c1f097f3773c79078 100644 GIT binary patch literal 20676 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 Y0Yw`6r)i>3|7B?|`;s(aPVx2s0KtU_!~g&Q literal 17256 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 Wph%=&&J%X}syu7HB2Tze{{4R}!rWZ| diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface index 4bf09e24e54..7c4d9572ca6 100644 --- a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface +++ b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface @@ -1,11 +1,12 @@ // swift-interface-format-version: 1.0 -// swift-compiler-version: Apple Swift version 5.7.2 (swiftlang-5.7.2.135.5 clang-1400.0.29.51) -// swift-module-flags: -target x86_64-apple-ios16.2-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -module-name Framework2 +// swift-compiler-version: Apple Swift version 5.9.2 (swiftlang-5.9.2.2.56 clang-1500.1.0.2.5) +// swift-module-flags: -target x86_64-apple-ios17.2-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -module-name Framework2 // swift-module-flags-ignorable: -enable-bare-slash-regex import Foundation import Swift import _Concurrency import _StringProcessing +import _SwiftConcurrencyShims public class Framework2File { public init() public func hello() -> Swift.String diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/x86_64-apple-ios-simulator.swiftdoc b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/x86_64-apple-ios-simulator.swiftdoc index acb7cacf69dcb9ed11ef779eb1070f72482fb7eb..8a6e1edfa88dde5bcd04b38c022383c9af2934a6 100644 GIT binary patch delta 90 zcmbQiJcD_{V^0Gv1_lPlf`Xh>h2Zkcv=W7~)S}|d{5%CyJxe_!1&v~mU`}FQx-M8i j&q&YIOd%O8U}$P!pl7IO020$=n5@I7%4j}0h|vuI&g>Y` delta 90 zcmbQiJcD_{V^0Sz1_lPlf`Xh>h2Zkcv=W7~)S}|d{5%CyJ##%H1&v~mU`}FQx-M8i l&(PRZ&r~59EMjP4V4!E9XJn~oYN$C`hf$T$Y;q8z8vxZB85aNm diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/x86_64-apple-ios-simulator.swiftinterface b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/x86_64-apple-ios-simulator.swiftinterface index 4bf09e24e54..7c4d9572ca6 100644 --- a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +++ b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/x86_64-apple-ios-simulator.swiftinterface @@ -1,11 +1,12 @@ // swift-interface-format-version: 1.0 -// swift-compiler-version: Apple Swift version 5.7.2 (swiftlang-5.7.2.135.5 clang-1400.0.29.51) -// swift-module-flags: -target x86_64-apple-ios16.2-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -module-name Framework2 +// swift-compiler-version: Apple Swift version 5.9.2 (swiftlang-5.9.2.2.56 clang-1500.1.0.2.5) +// swift-module-flags: -target x86_64-apple-ios17.2-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -module-name Framework2 // swift-module-flags-ignorable: -enable-bare-slash-regex import Foundation import Swift import _Concurrency import _StringProcessing +import _SwiftConcurrencyShims public class Framework2File { public init() public func hello() -> Swift.String diff --git a/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/x86_64-apple-ios-simulator.swiftmodule b/fixtures/ios_app_with_transitive_framework/Framework2/prebuilt/iOS/Framework2.framework/Modules/Framework2.swiftmodule/x86_64-apple-ios-simulator.swiftmodule index b4a4e53192c615629110d2ade76e98f275005cdf..642d1d19cc01fc05a61bfb2d7424a6f00a7ac295 100644 GIT binary patch literal 20676 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 XDALeBP7{6lFH3XTm!t`Eim(3%Cfo@F literal 17260 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 Date: Wed, 21 Feb 2024 18:59:28 +0100 Subject: [PATCH 124/509] Add missing group --- codemagic.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/codemagic.yaml b/codemagic.yaml index e02d6b72280..d3169fb9288 100644 --- a/codemagic.yaml +++ b/codemagic.yaml @@ -72,6 +72,8 @@ workflows: max_build_duration: 60 environment: xcode: 15.2 + groups: + - tuist cache: cache_paths: - $CM_BUILD_DIR/.build From 03dddab6d576ed7735cf71ed27d7846543ba674a Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 21 Feb 2024 18:01:05 +0000 Subject: [PATCH 125/509] [Release] Tuist 4.3.4 --- .mise.toml | 2 +- CHANGELOG.md | 10 ++++++++++ Sources/TuistSupport/Constants.swift | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.mise.toml b/.mise.toml index 5701dac8f30..4b404227125 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.3.3" +tuist = "4.3.4" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d3f0f4560c..382591f2ba1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 4.3.4 - 2024-02-21 + +### Tuist + +- no changes + +### Tuist Cloud + +- no changes + ## 4.3.3 - 2024-02-21 ### Tuist diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index b70a65caf5a..1e2c9e64d08 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,7 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.3.3" + public static let version = "4.3.4" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From e7f89cad159e8faffb74bedcc4aaefbb3d92e874 Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 21 Feb 2024 19:32:40 +0100 Subject: [PATCH 126/509] Force CI run From fe894cf442664ab0453dfcfb2d932287c002bb3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 22 Feb 2024 22:36:14 +0100 Subject: [PATCH 127/509] Prune targets with no destinations after platform narrowing (#5979) * Prune targets with no destinations after platform narrowing * Update acceptance test to test AppKitTests --- ...runeOrphanExternalTargetsGraphMapper.swift | 2 +- .../Factories/GraphMapperFactory.swift | 2 +- .../DependenciesAcceptanceTests.swift | 1 + ...rphanExternalTargetsGraphMapperTests.swift | 23 ++++++++++-- .../App/Project.swift | 13 +++++++ .../App/Tests/AppKit/AppKitTests.swift | 8 +++++ .../Tuist/Package.resolved | 36 +++++++++++++++++++ .../Tuist/Package.swift | 2 ++ 8 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 fixtures/app_with_spm_dependencies/App/Tests/AppKit/AppKitTests.swift diff --git a/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift b/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift index 4b66339deae..3714bdb79dd 100644 --- a/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift +++ b/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift @@ -21,7 +21,7 @@ public struct PruneOrphanExternalTargetsGraphMapper: GraphMapping { let targets = Dictionary(uniqueKeysWithValues: targets.compactMap { targetName, target -> (String, Target)? in let project = graph.projects[projectPath]! let graphTarget = GraphTarget(path: projectPath, target: target, project: project) - if orphanExternalTargets.contains(graphTarget) { + if orphanExternalTargets.contains(graphTarget) || target.destinations.isEmpty { return nil } else { return (targetName, target) diff --git a/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift b/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift index 8edd8f9a47a..6e167284979 100644 --- a/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift +++ b/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift @@ -54,8 +54,8 @@ public final class GraphMapperFactory: GraphMapperFactorying { ) -> [GraphMapping] { var mappers: [GraphMapping] = [] mappers.append(UpdateWorkspaceProjectsGraphMapper()) - mappers.append(PruneOrphanExternalTargetsGraphMapper()) mappers.append(ExternalProjectsPlatformNarrowerGraphMapper()) + mappers.append(PruneOrphanExternalTargetsGraphMapper()) if config.generationOptions.enforceExplicitDependencies { mappers.append(ExplicitDependencyGraphMapper()) } diff --git a/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift b/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift index ce76298bc95..3211f991a97 100644 --- a/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift +++ b/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift @@ -11,6 +11,7 @@ final class DependenciesAcceptanceTestAppWithSPMDependencies: TuistAcceptanceTes try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "App") + try await run(TestCommand.self, "AppKit") } } diff --git a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift index 3fea9dcf6ac..b5802f9095a 100644 --- a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift @@ -27,11 +27,21 @@ final class PruneOrphanExternalTargetsGraphMapperTests: TuistUnitTestCase { let appDependency = GraphDependency.target(name: app.name, path: project.path) let directPackageProduct = Target.test(name: "DirectPackage", destinations: [.iPhone], product: .app) let transitivePackageProduct = Target.test(name: "TransitivePackage", destinations: [.iPhone], product: .app) + let transitivePackageProductWithNoDestinations = Target.test( + name: "TransitivePackageWithNoDestination", + destinations: [], + product: .app + ) let packageDevProduct = Target.test(name: "DevPackage", destinations: [.iPhone], product: .app) let packageProject = Project.test( path: try! AbsolutePath(validating: "/Package"), name: "Package", - targets: [directPackageProduct, transitivePackageProduct, packageDevProduct], + targets: [ + directPackageProduct, + transitivePackageProduct, + transitivePackageProductWithNoDestinations, + packageDevProduct, + ], isExternal: true ) let directPackageProductDependency = GraphDependency.target(name: directPackageProduct.name, path: packageProject.path) @@ -39,6 +49,10 @@ final class PruneOrphanExternalTargetsGraphMapperTests: TuistUnitTestCase { name: transitivePackageProduct.name, path: packageProject.path ) + let transitivePackageProductWithNoDestinationsDependency = GraphDependency.target( + name: transitivePackageProductWithNoDestinations.name, + path: packageProject.path + ) let graph = Graph.test( path: project.path, @@ -48,11 +62,15 @@ final class PruneOrphanExternalTargetsGraphMapperTests: TuistUnitTestCase { ], packageProject.path: [ directPackageProduct.name: directPackageProduct, transitivePackageProduct.name: transitivePackageProduct, + transitivePackageProductWithNoDestinations.name: transitivePackageProductWithNoDestinations, packageDevProduct.name: packageDevProduct, ]], dependencies: [ appDependency: Set([directPackageProductDependency]), - directPackageProductDependency: Set([transitivePackageProductDependency]), + directPackageProductDependency: Set([ + transitivePackageProductDependency, + transitivePackageProductWithNoDestinationsDependency, + ]), ] ) @@ -64,5 +82,6 @@ final class PruneOrphanExternalTargetsGraphMapperTests: TuistUnitTestCase { XCTAssertNotNil(gotGraph.targets[packageProject.path]?[directPackageProduct.name]) XCTAssertNotNil(gotGraph.targets[packageProject.path]?[transitivePackageProduct.name]) XCTAssertNil(gotGraph.targets[packageProject.path]?[packageDevProduct.name]) + XCTAssertNil(gotGraph.targets[packageProject.path]?[transitivePackageProductWithNoDestinations.name]) } } diff --git a/fixtures/app_with_spm_dependencies/App/Project.swift b/fixtures/app_with_spm_dependencies/App/Project.swift index 2cd9bf803d6..e7e6d1a1fcb 100644 --- a/fixtures/app_with_spm_dependencies/App/Project.swift +++ b/fixtures/app_with_spm_dependencies/App/Project.swift @@ -43,6 +43,19 @@ let project = Project( ], settings: .targetSettings ), + .target( + name: "AppKitTests", + destinations: .iOS, + product: .unitTests, + bundleId: "io.tuist.app.kit", + infoPlist: .default, + sources: "Tests/AppKit/**", + dependencies: [ + .target(name: "AppKit"), + .external(name: "Nimble"), + ], + settings: .targetSettings + ), .target( name: "WatchApp", destinations: [.appleWatch], diff --git a/fixtures/app_with_spm_dependencies/App/Tests/AppKit/AppKitTests.swift b/fixtures/app_with_spm_dependencies/App/Tests/AppKit/AppKitTests.swift new file mode 100644 index 00000000000..820d06123ca --- /dev/null +++ b/fixtures/app_with_spm_dependencies/App/Tests/AppKit/AppKitTests.swift @@ -0,0 +1,8 @@ +import Nimble +import XCTest + +final class AppKitTests: XCTestCase { + func testExample() { + expect(1).to(equal(1)) + } +} diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.resolved b/fixtures/app_with_spm_dependencies/Tuist/Package.resolved index 01fcb0d02c9..77a1342b72e 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/Package.resolved +++ b/fixtures/app_with_spm_dependencies/Tuist/Package.resolved @@ -45,6 +45,24 @@ "version" : "1.0.0" } }, + { + "identity" : "cwlcatchexception", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mattgallagher/CwlCatchException.git", + "state" : { + "revision" : "3b123999de19bf04905bc1dfdb76f817b0f2cc00", + "version" : "2.1.2" + } + }, + { + "identity" : "cwlpreconditiontesting", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mattgallagher/CwlPreconditionTesting.git", + "state" : { + "revision" : "dc9af4781f2afdd1e68e90f80b8603be73ea7abc", + "version" : "2.2.0" + } + }, { "identity" : "googlesignin-ios", "kind" : "remoteSourceControl", @@ -72,6 +90,15 @@ "version" : "2.0.0" } }, + { + "identity" : "nimble", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Quick/Nimble", + "state" : { + "revision" : "c1f3dd66222d5e7a1a20afc237f7e7bc432c564f", + "version" : "13.2.0" + } + }, { "identity" : "nytphotoviewer", "kind" : "remoteSourceControl", @@ -90,6 +117,15 @@ "version" : "1.11.1" } }, + { + "identity" : "quick", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Quick/Quick", + "state" : { + "revision" : "a9e6c24033a25e158384d523a556c0b96c44a839", + "version" : "7.4.0" + } + }, { "identity" : "realm-core", "kind" : "remoteSourceControl", diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.swift b/fixtures/app_with_spm_dependencies/Tuist/Package.swift index a3f9280a8a1..85facb9f342 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/Package.swift +++ b/fixtures/app_with_spm_dependencies/Tuist/Package.swift @@ -29,6 +29,8 @@ let package = Package( .package(url: "https://github.com/microsoft/appcenter-sdk-apple", .upToNextMajor(from: "5.0.4")), // Has SWIFTPM_MODULE_BUNDLE .package(url: "https://github.com/tuist/NYTPhotoViewer", branch: "develop"), + .package(url: "https://github.com/Quick/Quick", exact: "7.4.0"), + .package(url: "https://github.com/Quick/Nimble", exact: "13.2.0"), .package(path: "../LocalSwiftPackage"), .package(path: "../StringifyMacro"), ] From 0440b6b7dfbe9e9bbdc13060a67b39e909fcddea Mon Sep 17 00:00:00 2001 From: Hai Feng Kao Date: Fri, 23 Feb 2024 16:52:30 +0800 Subject: [PATCH 128/509] avoid infinite loop caused by symbolic links (#5813) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * store the visited paths to avoid infinite loop close #5685 * fix linting --------- Co-authored-by: Daniele Formichelli Co-authored-by: Pedro Co-authored-by: Pedro Piñera Buendía <663605+pepicrft@users.noreply.github.com> --- .../Extensions/FileManager+Extras.swift | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/Sources/TuistSupport/Extensions/FileManager+Extras.swift b/Sources/TuistSupport/Extensions/FileManager+Extras.swift index 0fb4f4a6517..75e1bdf6e6f 100644 --- a/Sources/TuistSupport/Extensions/FileManager+Extras.swift +++ b/Sources/TuistSupport/Extensions/FileManager+Extras.swift @@ -5,9 +5,23 @@ extension FileManager { subdirectoriesResolvingSymbolicLinks(atNestedPath: nil, basePath: path) } - private func subdirectoriesResolvingSymbolicLinks(atNestedPath nestedPath: String?, basePath: String) -> [String] { + private func subdirectoriesResolvingSymbolicLinks( + atNestedPath nestedPath: String?, + basePath: String, + visitedPaths: inout Set + ) -> [String] { let currentLevelPath = nestedPath.map { NSString(string: basePath).appendingPathComponent($0) } ?? basePath let resolvedCurrentLevelPath = resolvingSymbolicLinks(path: currentLevelPath) + let standardizedPath = NSString(string: resolvedCurrentLevelPath).standardizingPath + + // Check if we've already visited this standardized path + guard !visitedPaths.contains(standardizedPath) else { + return [] + } + + // Mark this standardized path as visited + visitedPaths.insert(standardizedPath) + guard let resolvedSubpathsFromCurrentRoot = try? subpathsOfDirectory(atPath: resolvedCurrentLevelPath) else { return [] @@ -21,7 +35,11 @@ extension FileManager { if isSymbolicLinkToDirectory(path: completeSubpath) { resolvedSubpaths.append(relativeSubpath) resolvedSubpaths.append( - contentsOf: subdirectoriesResolvingSymbolicLinks(atNestedPath: relativeSubpath, basePath: basePath) + contentsOf: subdirectoriesResolvingSymbolicLinks( + atNestedPath: relativeSubpath, + basePath: basePath, + visitedPaths: &visitedPaths + ) ) } else if isDirectory(path: completeSubpath) { resolvedSubpaths.append(relativeSubpath) @@ -31,6 +49,11 @@ extension FileManager { return resolvedSubpaths } + private func subdirectoriesResolvingSymbolicLinks(atNestedPath nestedPath: String?, basePath: String) -> [String] { + var visitedPaths: Set = .init() + return subdirectoriesResolvingSymbolicLinks(atNestedPath: nestedPath, basePath: basePath, visitedPaths: &visitedPaths) + } + private func isSymbolicLinkToDirectory(path: String) -> Bool { let pathResolvingSymbolicLinks = resolvingSymbolicLinks(path: path) return pathResolvingSymbolicLinks != path && isDirectory(path: pathResolvingSymbolicLinks) From e7ea1b11f7fe67a37c15ba7df57a4fbe54a6eb81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Sat, 24 Feb 2024 13:17:02 +0100 Subject: [PATCH 129/509] Add support for the new `package` access modifier (#5983) * Pass the -package-name flag * Include the -package-name Swift compiler flag * Fix tests --- .../Graph/DependenciesGraph+TestData.swift | 28 ++++++++++--------- .../PackageInfoMapper.swift | 6 +++- .../PackageInfoMapperTests.swift | 8 +++++- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift b/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift index 6b0c76455b9..1aca7e029f8 100644 --- a/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift +++ b/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift @@ -93,7 +93,7 @@ extension TuistCore.DependenciesGraph { ), .sdk(name: "WatchKit", type: .framework, status: .required, condition: .when([.watchos])), ], - settings: Self.spmSettings(with: [ + settings: Self.spmSettings(packageName: "Tuist", with: [ "HEADER_SEARCH_PATHS": [ "$(SRCROOT)/customPath/cSearchPath", "$(SRCROOT)/customPath/cxxSearchPath", @@ -122,7 +122,7 @@ extension TuistCore.DependenciesGraph { path: Self.packageFolder(spmFolder: spmFolder, packageName: "another-dependency") ), ], - settings: Self.spmSettings() + settings: Self.spmSettings(packageName: "TuistKit") ), ] @@ -190,7 +190,7 @@ extension TuistCore.DependenciesGraph { name: "ALibraryUtils" ), ], - settings: Self.spmSettings() + settings: Self.spmSettings(packageName: "ALibrary") ), .target( name: "ALibraryUtils", @@ -203,7 +203,7 @@ extension TuistCore.DependenciesGraph { sources: [ "\(packageFolder.pathString)/Sources/ALibraryUtils/**", ], - settings: Self.spmSettings() + settings: Self.spmSettings(packageName: "ALibraryUtils") ), ] @@ -258,7 +258,7 @@ extension TuistCore.DependenciesGraph { sources: [ "\(packageFolder.pathString)/Sources/AnotherLibrary/**", ], - settings: Self.spmSettings() + settings: Self.spmSettings(packageName: "AnotherLibrary") ), ] @@ -321,7 +321,7 @@ extension TuistCore.DependenciesGraph { condition: .when([.ios, .macos, .tvos, .watchos]) ), ], - settings: Self.spmSettings() + settings: Self.spmSettings(packageName: "Alamofire") ), ] @@ -406,7 +406,7 @@ extension TuistCore.DependenciesGraph { .sdk(name: "z", type: .library, status: .required), .sdk(name: "StoreKit", type: .framework, status: .required), ], - settings: Self.spmSettings() + settings: Self.spmSettings(packageName: "GoogleAppMeasurementTarget") ), .target( name: "GoogleAppMeasurementWithoutAdIdSupportTarget", @@ -448,7 +448,7 @@ extension TuistCore.DependenciesGraph { .sdk(name: "z", type: .library, status: .required), .sdk(name: "StoreKit", type: .framework, status: .required), ], - settings: Self.spmSettings() + settings: Self.spmSettings(packageName: "GoogleAppMeasurementWithoutAdIdSupportTarget") ), ] @@ -527,7 +527,7 @@ extension TuistCore.DependenciesGraph { sources: [ "\(packageFolder.pathString)/Sources/GULAppDelegateSwizzler/**", ], - settings: Self.spmSettings() + settings: Self.spmSettings(packageName: "GULAppDelegateSwizzler") ), .target( name: "GULMethodSwizzler", @@ -540,7 +540,7 @@ extension TuistCore.DependenciesGraph { sources: [ "\(packageFolder.pathString)/Sources/GULMethodSwizzler/**", ], - settings: Self.spmSettings() + settings: Self.spmSettings(packageName: "GULMethodSwizzler") ), .target( @@ -554,7 +554,7 @@ extension TuistCore.DependenciesGraph { sources: [ "\(packageFolder.pathString)/Sources/GULNSData/**", ], - settings: Self.spmSettings() + settings: Self.spmSettings(packageName: "GULNSData") ), .target( name: "GULNetwork", @@ -567,7 +567,7 @@ extension TuistCore.DependenciesGraph { sources: [ "\(packageFolder.pathString)/Sources/GULNetwork/**", ], - settings: Self.spmSettings() + settings: Self.spmSettings(packageName: "GULNetwork") ), ] @@ -622,7 +622,7 @@ extension TuistCore.DependenciesGraph { sources: [ "\(packageFolder.pathString)/Sources/nanopb/**", ], - settings: Self.spmSettings() + settings: Self.spmSettings(packageName: "nanopb") ), ] @@ -661,6 +661,7 @@ extension DependenciesGraph { } static func spmSettings( + packageName: String, baseSettings: Settings = .settings(), with customSettings: SettingsDictionary = [:], moduleMap: String? = nil @@ -675,6 +676,7 @@ extension DependenciesGraph { "FRAMEWORK_SEARCH_PATHS": ["$(inherited)", "$(PLATFORM_DIR)/Developer/Library/Frameworks"], "GCC_NO_COMMON_BLOCKS": "NO", "USE_HEADERMAP": "NO", + "OTHER_SWIFT_FLAGS": ["-package-name", packageName], ] var settingsDictionary = customSettings.merging(defaultSpmSettings, uniquingKeysWith: { custom, _ in custom }) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 9613b5f9234..df49412f42c 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -418,7 +418,7 @@ public final class PackageInfoMapper: PackageInfoMapping { uniquingKeysWith: { userDefined, _ in userDefined } ) - let targetSettings = targetSettings.merging( + var targetSettings = targetSettings.merging( // Force enable testing search paths Dictionary( uniqueKeysWithValues: [ @@ -441,6 +441,10 @@ public final class PackageInfoMapper: PackageInfoMapping { userDefined.merging(defaultDictionary, uniquingKeysWith: { userDefined, _ in userDefined }) } ) + // Setting the -package-name Swift compiler flag + let baseSettings = baseSettings.with(base: [ + "OTHER_SWIFT_FLAGS": ["$(inherited)", "-package-name", name], + ]) let targets: [ProjectDescription.Target] = try packageInfo.targets .compactMap { target -> ProjectDescription.Target? in diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 246de8ee913..75ed9d65b4d 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -3278,6 +3278,7 @@ extension ProjectDescription.Target { fileprivate static func test( _ name: String, + packageName: String = "Package", basePath: AbsolutePath = "/", destinations: ProjectDescription.Destinations = [.iPhone, .iPad, .appleVisionWithiPadDesign, .macWithiPadDesign], product: ProjectDescription.Product = .staticFramework, @@ -3318,7 +3319,12 @@ extension ProjectDescription.Target { resources: resources.isEmpty ? nil : .resources(resources), headers: headers, dependencies: dependencies, - settings: DependenciesGraph.spmSettings(baseSettings: baseSettings, with: customSettings, moduleMap: moduleMap) + settings: DependenciesGraph.spmSettings( + packageName: packageName, + baseSettings: baseSettings, + with: customSettings, + moduleMap: moduleMap + ) ) } } From c8032dd8cfcc96161213ee23fdf16ded335ad30d Mon Sep 17 00:00:00 2001 From: Charles Pisciotta Date: Mon, 26 Feb 2024 08:39:06 -0500 Subject: [PATCH 130/509] Upgrade to xcbeautify 1.5.0 (#5993) --- Package.resolved | 4 ++-- Package.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Package.resolved b/Package.resolved index fa2dcae2b7f..4bf7f405fba 100644 --- a/Package.resolved +++ b/Package.resolved @@ -212,8 +212,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/cpisciotta/xcbeautify", "state" : { - "revision" : "84d24a9854e6fdcd2c91122d50a3189b072e8136", - "version" : "1.4.0" + "revision" : "9895885c427f758a9edfc1c016863418de8e9e8d", + "version" : "1.5.0" } }, { diff --git a/Package.swift b/Package.swift index 9a1c79686b7..42165c612fc 100644 --- a/Package.swift +++ b/Package.swift @@ -425,7 +425,7 @@ let package = Package( .package(url: "https://github.com/SwiftGen/StencilSwiftKit", exact: "2.10.1"), .package(url: "https://github.com/SwiftGen/SwiftGen", exact: "6.6.2"), .package(url: "https://github.com/tuist/XcodeProj", exact: "8.19.0"), - .package(url: "https://github.com/cpisciotta/xcbeautify", from: "1.4.0"), + .package(url: "https://github.com/cpisciotta/xcbeautify", from: "1.5.0"), .package(url: "https://github.com/krzysztofzablocki/Difference.git", from: "1.0.2"), .package(url: "https://github.com/Kolos65/Mockable.git", from: "0.0.2"), ], From 9a79bc284072ce054f22821f732a0776abe04741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Mon, 26 Feb 2024 16:27:32 +0100 Subject: [PATCH 131/509] Remove version command (#5995) --- Sources/TuistKit/Commands/TuistCommand.swift | 1 - Sources/TuistKit/Commands/VersionCommand.swift | 16 ---------------- Sources/TuistKit/Services/VersionService.swift | 9 --------- 3 files changed, 26 deletions(-) delete mode 100644 Sources/TuistKit/Commands/VersionCommand.swift delete mode 100644 Sources/TuistKit/Services/VersionService.swift diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index 35e696dd2e3..3a2945c2418 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -23,7 +23,6 @@ public struct TuistCommand: AsyncParsableCommand { RunCommand.self, ScaffoldCommand.self, TestCommand.self, - VersionCommand.self, ] ) } diff --git a/Sources/TuistKit/Commands/VersionCommand.swift b/Sources/TuistKit/Commands/VersionCommand.swift deleted file mode 100644 index 9e2b8a714f0..00000000000 --- a/Sources/TuistKit/Commands/VersionCommand.swift +++ /dev/null @@ -1,16 +0,0 @@ -import ArgumentParser -import Foundation -import TSCBasic - -struct VersionCommand: ParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "version", - abstract: "Outputs the current version of tuist" - ) - } - - func run() throws { - try VersionService().run() - } -} diff --git a/Sources/TuistKit/Services/VersionService.swift b/Sources/TuistKit/Services/VersionService.swift deleted file mode 100644 index 12179c35811..00000000000 --- a/Sources/TuistKit/Services/VersionService.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport - -final class VersionService { - func run() throws { - logger.notice("\(Constants.version)") - } -} From da309762c9f784230f4896d071e35aca9c2380f0 Mon Sep 17 00:00:00 2001 From: Charles Pisciotta Date: Mon, 26 Feb 2024 10:28:09 -0500 Subject: [PATCH 132/509] Upgrade to xcbeautify 1.6.0 (#5996) --- Package.resolved | 4 ++-- Package.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Package.resolved b/Package.resolved index 4bf7f405fba..faae6ad5f2c 100644 --- a/Package.resolved +++ b/Package.resolved @@ -212,8 +212,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/cpisciotta/xcbeautify", "state" : { - "revision" : "9895885c427f758a9edfc1c016863418de8e9e8d", - "version" : "1.5.0" + "revision" : "82bc54c25c78284555759277d4d92fef5627f95e", + "version" : "1.6.0" } }, { diff --git a/Package.swift b/Package.swift index 42165c612fc..728e06f7127 100644 --- a/Package.swift +++ b/Package.swift @@ -425,7 +425,7 @@ let package = Package( .package(url: "https://github.com/SwiftGen/StencilSwiftKit", exact: "2.10.1"), .package(url: "https://github.com/SwiftGen/SwiftGen", exact: "6.6.2"), .package(url: "https://github.com/tuist/XcodeProj", exact: "8.19.0"), - .package(url: "https://github.com/cpisciotta/xcbeautify", from: "1.5.0"), + .package(url: "https://github.com/cpisciotta/xcbeautify", from: "1.6.0"), .package(url: "https://github.com/krzysztofzablocki/Difference.git", from: "1.0.2"), .package(url: "https://github.com/Kolos65/Mockable.git", from: "0.0.2"), ], From e645ae03b7e2e5815fcb4fc155b54148a0ed2c84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 26 Feb 2024 17:46:11 +0100 Subject: [PATCH 133/509] Change SPM dependencies to implicitly support all platforms (#5990) --- .../Simulator/SimulatorController.swift | 14 ++- .../PackageInfoMapper.swift | 14 +-- .../DependenciesAcceptanceTests.swift | 1 + .../PackageInfoMapperTests.swift | 93 +++++++------------ .../App/Project.swift | 10 ++ .../Sources/VisionOS/App/VisionOSApp.swift | 10 ++ 6 files changed, 66 insertions(+), 76 deletions(-) create mode 100644 fixtures/app_with_spm_dependencies/App/Sources/VisionOS/App/VisionOSApp.swift diff --git a/Sources/TuistCore/Simulator/SimulatorController.swift b/Sources/TuistCore/Simulator/SimulatorController.swift index 4fdc9989af1..6d9770471cf 100644 --- a/Sources/TuistCore/Simulator/SimulatorController.swift +++ b/Sources/TuistCore/Simulator/SimulatorController.swift @@ -143,7 +143,6 @@ public final class SimulatorController: SimulatorControlling { deviceName: String? ) async throws -> [SimulatorDeviceAndRuntime] { let devicesAndRuntimes = try await devicesAndRuntimes() - let maxRuntimeVersion = devicesAndRuntimes.map(\.runtime.version).max() let availableDevices = devicesAndRuntimes .sorted(by: { $0.runtime.version >= $1.runtime.version }) .filter { simulatorDeviceAndRuntime in @@ -160,13 +159,18 @@ public final class SimulatorController: SimulatorControlling { guard simulatorDeviceAndRuntime.device.name == deviceName else { return false } } - if version == nil, let maxRuntimeVersion { - guard simulatorDeviceAndRuntime.runtime.version == maxRuntimeVersion else { return false } - } + return true + } + let maxRuntimeVersion = availableDevices.map(\.runtime.version).max() + + return availableDevices.filter { simulatorDeviceAndRuntime in + if version == nil, let maxRuntimeVersion { + return simulatorDeviceAndRuntime.runtime.version == maxRuntimeVersion + } else { return true } - return availableDevices + } } public func findAvailableDevice( diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index df49412f42c..e8dd06d2208 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -541,18 +541,8 @@ extension ProjectDescription.Target { if target.type == .macro { destinations = Set([.mac]) } else { - // All packages implicitly support all platforms, we constrain this with the platforms defined in `Package.swift` - let packageDestinations: ProjectDescription.Destinations = Set( - try packageInfo.platforms.flatMap { platform -> ProjectDescription.Destinations in - return try platform.destinations() - } - ) - - if packageDestinations.isEmpty { - destinations = Set(Destination.allCases) - } else { - destinations = Set(Destination.allCases).intersection(packageDestinations) - } + // All packages implicitly support all platforms + destinations = Set(Destination.allCases) } if macroDependencies.contains(where: { dependency in diff --git a/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift b/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift index 3211f991a97..b7ddeebafa3 100644 --- a/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift +++ b/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift @@ -11,6 +11,7 @@ final class DependenciesAcceptanceTestAppWithSPMDependencies: TuistAcceptanceTes try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "App") + try await run(BuildCommand.self, "VisionOSApp") try await run(TestCommand.self, "AppKit") } } diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 75ed9d65b4d..e7705e771f9 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -387,7 +387,13 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - deploymentTargets: .iOS("9.0") + deploymentTargets: .multiplatform( + iOS: "9.0", + macOS: "10.10", + watchOS: "2.0", + tvOS: "9.0", + visionOS: "1.0" + ) ), ] ) @@ -410,7 +416,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test(name: "Target1"), ], - platforms: [.init(platformName: "maccatalyst", version: "13.0", options: [])], + platforms: [.init(platformName: "maccatalyst", version: "12.0", options: [])], cLanguageStandard: nil, cxxLanguageStandard: nil, swiftLanguageVersions: nil @@ -418,7 +424,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", @@ -426,8 +432,14 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - destinations: [.macCatalyst], - deploymentTargets: .iOS("13.0") + destinations: Set(Destination.allCases), + deploymentTargets: .multiplatform( + iOS: "12.0", + macOS: "10.13", + watchOS: "4.0", + tvOS: "12.0", + visionOS: "1.0" + ) ), ] ) @@ -1509,10 +1521,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - destinations: [.iPad, .iPhone, .macWithiPadDesign, .appleVisionWithiPadDesign, .appleTv], customProductName: "Target1", customBundleID: "Target1", - deploymentTargets: .multiplatform(iOS: "12.0", tvOS: "12.0"), customSources: .custom(.sourceFilesList(globs: [ basePath.appending(try RelativePath(validating: "Package/Sources/Target1/**")) .pathString, @@ -1530,45 +1540,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { XCTAssertBetterEqual(projectTargets, expectedTargets) } - func testMap_whenIOSNotAvailable_takesOthers() throws { - let basePath = try temporaryPath() - let sourcesPath = basePath.appending(try RelativePath(validating: "Package/Sources/Target1")) - try fileHandler.createFolder(sourcesPath) - let project = try subject.map( - package: "Package", - basePath: basePath, - packageInfos: [ - "Package": .init( - products: [ - .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), - ], - targets: [ - .test(name: "Target1"), - ], - platforms: [.tvos], - cLanguageStandard: nil, - cxxLanguageStandard: nil, - swiftLanguageVersions: nil - ), - ] - ) - XCTAssertEqual( - project, - .testWithDefaultConfigs( - name: "Package", - targets: [ - .test( - "Target1", - - basePath: basePath, - destinations: [.appleTv], - deploymentTargets: .tvOS("12.0") - ), - ] - ) - ) - } - func testMap_whenPackageDefinesPlatform_configuresDeploymentTarget() throws { let basePath = try temporaryPath() let sourcesPath = basePath.appending(try RelativePath(validating: "Package/Sources/Target1")) @@ -1598,7 +1569,13 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - deploymentTargets: .iOS("13.0") + deploymentTargets: .multiplatform( + iOS: "13.0", + macOS: "10.13", + watchOS: "4.0", + tvOS: "12.0", + visionOS: "1.0" + ) ), ] ) @@ -1606,7 +1583,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { dump(project?.targets.first?.destinations) dump(other.targets.first?.destinations) - XCTAssertEqual( + XCTAssertBetterEqual( project, other ) @@ -3001,10 +2978,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - destinations: [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign, .appleTv], customProductName: "Target1", customBundleID: "Target1", - deploymentTargets: .multiplatform(iOS: "12.0", tvOS: "12.0"), customSources: .custom(.sourceFilesList(globs: [ basePath.appending(try RelativePath(validating: "Package/Sources/Target1/**")).pathString, ])), @@ -3016,10 +2991,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Dependency1", basePath: basePath, - destinations: [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign, .appleTv], customProductName: "Dependency1", customBundleID: "Dependency1", - deploymentTargets: .multiplatform(iOS: "12.0", tvOS: "12.0"), customSources: .custom(.sourceFilesList(globs: [ basePath.appending(try RelativePath(validating: "Package/Sources/Dependency1/**")).pathString, ])) @@ -3027,10 +3000,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Dependency2", basePath: basePath, - destinations: [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign, .appleTv], customProductName: "Dependency2", customBundleID: "Dependency2", - deploymentTargets: .multiplatform(iOS: "12.0", tvOS: "12.0"), customSources: .custom(.sourceFilesList(globs: [ basePath.appending(try RelativePath(validating: "Package/Sources/Dependency2/**")).pathString, ])) @@ -3042,7 +3013,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { let projectTargets = project!.targets.sorted(by: \.name) let expectedTargets = expected.targets.sorted(by: \.name) - XCTAssertEqual(projectTargets, expectedTargets) + XCTAssertBetterEqual(projectTargets, expectedTargets) } func testMap_whenTargetDependenciesOnProductHaveConditions() throws { @@ -3098,10 +3069,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - destinations: [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign, .appleTv], customProductName: "Target1", customBundleID: "Target1", - deploymentTargets: .multiplatform(iOS: "12.0", tvOS: "12.0"), customSources: .custom(.sourceFilesList(globs: [ basePath.appending(try RelativePath(validating: "Package/Sources/Target1/**")).pathString, ])), @@ -3280,11 +3249,17 @@ extension ProjectDescription.Target { _ name: String, packageName: String = "Package", basePath: AbsolutePath = "/", - destinations: ProjectDescription.Destinations = [.iPhone, .iPad, .appleVisionWithiPadDesign, .macWithiPadDesign], + destinations: ProjectDescription.Destinations = Set(Destination.allCases), product: ProjectDescription.Product = .staticFramework, customProductName: String? = nil, customBundleID: String? = nil, - deploymentTargets: ProjectDescription.DeploymentTargets = .multiplatform(iOS: "12.0"), + deploymentTargets: ProjectDescription.DeploymentTargets = .multiplatform( + iOS: "12.0", + macOS: "10.13", + watchOS: "4.0", + tvOS: "12.0", + visionOS: "1.0" + ), customSources: SourceFilesListType = .default, resources: [ProjectDescription.ResourceFileElement] = [], headers: ProjectDescription.Headers? = nil, diff --git a/fixtures/app_with_spm_dependencies/App/Project.swift b/fixtures/app_with_spm_dependencies/App/Project.swift index e7e6d1a1fcb..70bad39aefc 100644 --- a/fixtures/app_with_spm_dependencies/App/Project.swift +++ b/fixtures/app_with_spm_dependencies/App/Project.swift @@ -56,6 +56,16 @@ let project = Project( ], settings: .targetSettings ), + .target( + name: "VisionOSApp", + destinations: [.appleVision], + product: .app, + bundleId: "io.tuist.app.applevision", + sources: ["Sources/VisionOS/App/**"], + dependencies: [ + .external(name: "Alamofire"), + ] + ), .target( name: "WatchApp", destinations: [.appleWatch], diff --git a/fixtures/app_with_spm_dependencies/App/Sources/VisionOS/App/VisionOSApp.swift b/fixtures/app_with_spm_dependencies/App/Sources/VisionOS/App/VisionOSApp.swift new file mode 100644 index 00000000000..407db871a00 --- /dev/null +++ b/fixtures/app_with_spm_dependencies/App/Sources/VisionOS/App/VisionOSApp.swift @@ -0,0 +1,10 @@ +import SwiftUI + +@main +struct VisionOSTestApp: App { + var body: some Scene { + WindowGroup { + Text("Hello, world!") + } + } +} From fcf582c6967de48489edc09f4fc65aa5c78a60b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 27 Feb 2024 16:36:30 +0100 Subject: [PATCH 134/509] Fix spm bundle recursion (#5999) * Fix spm bundle recursion * Use bundleName * Trigger Build --- .../Mappers/ResourcesProjectMapper.swift | 14 +++++++++----- .../ResourcesProjectMapperTests.swift | 3 +-- .../app_with_spm_dependencies/App/Project.swift | 1 + .../App/Sources/AppKit/AppKit.swift | 4 ++++ .../Tuist/Package.resolved | 9 +++++++++ .../app_with_spm_dependencies/Tuist/Package.swift | 1 + 6 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index d13958a3bdb..6cd77069d9d 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -150,8 +150,7 @@ public class ResourcesProjectMapper: ProjectMapping { let content: String = ResourcesProjectMapper.objcImplementationFileContent( targetName: target.name, - bundleName: bundleName.replacingOccurrences(of: "-", with: "_"), - target: target + bundleName: bundleName.replacingOccurrences(of: "-", with: "_") ) return (filePath, content.data(using: .utf8)) } @@ -262,12 +261,17 @@ public class ResourcesProjectMapper: ProjectMapping { """ } - static func objcImplementationFileContent(targetName: String, bundleName _: String, target _: Target) -> String { + static func objcImplementationFileContent(targetName: String, bundleName: String) -> String { return """ #import #import "TuistBundle+\(targetName).h" - NSBundle* \(targetName)_SWIFTPM_MODULE_BUNDLE(void) { - return \(targetName)_SWIFTPM_MODULE_BUNDLE(); + + NSBundle* \(targetName)_SWIFTPM_MODULE_BUNDLE() { + NSURL *bundleURL = [[[NSBundle mainBundle] bundleURL] URLByAppendingPathComponent:@"\(bundleName).bundle"]; + + NSBundle *bundle = [NSBundle bundleWithURL:bundleURL]; + + return bundle; } """ } diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 7f32226de59..acc9b776655 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -375,8 +375,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { contents: ResourcesProjectMapper .objcImplementationFileContent( targetName: target.name, - bundleName: "\(project.name)_\(target.name)", - target: target + bundleName: "\(project.name)_\(target.name)" ) .data(using: .utf8) ), diff --git a/fixtures/app_with_spm_dependencies/App/Project.swift b/fixtures/app_with_spm_dependencies/App/Project.swift index 70bad39aefc..f8c1e52d854 100644 --- a/fixtures/app_with_spm_dependencies/App/Project.swift +++ b/fixtures/app_with_spm_dependencies/App/Project.swift @@ -40,6 +40,7 @@ let project = Project( .external(name: "AppCenterCrashes"), .external(name: "libzstd"), .external(name: "NYTPhotoViewer"), + .external(name: "SVProgressHUD"), ], settings: .targetSettings ), diff --git a/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift b/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift index ea714a77144..93d62dac28a 100644 --- a/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift +++ b/fixtures/app_with_spm_dependencies/App/Sources/AppKit/AppKit.swift @@ -11,6 +11,7 @@ import NYTPhotoViewer import Realm import RealmSwift import Sentry +import SVProgressHUD import Yams import ZipArchive @@ -48,6 +49,9 @@ public enum AppKit { // Use NYTPhotoViewer _ = NYTPhotosOverlayView() + + // Use SVProgressHUD + SVProgressHUD.show() } } diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.resolved b/fixtures/app_with_spm_dependencies/Tuist/Package.resolved index 77a1342b72e..7174fb4495c 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/Package.resolved +++ b/fixtures/app_with_spm_dependencies/Tuist/Package.resolved @@ -153,6 +153,15 @@ "version" : "8.20.0" } }, + { + "identity" : "svprogresshud", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SVProgressHUD/SVProgressHUD", + "state" : { + "revision" : "c33f7c775ba7feea6047a1fc3257f2e5863b44f7", + "version" : "2.3.1" + } + }, { "identity" : "swift-case-paths", "kind" : "remoteSourceControl", diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.swift b/fixtures/app_with_spm_dependencies/Tuist/Package.swift index 85facb9f342..30c22d90438 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/Package.swift +++ b/fixtures/app_with_spm_dependencies/Tuist/Package.swift @@ -31,6 +31,7 @@ let package = Package( .package(url: "https://github.com/tuist/NYTPhotoViewer", branch: "develop"), .package(url: "https://github.com/Quick/Quick", exact: "7.4.0"), .package(url: "https://github.com/Quick/Nimble", exact: "13.2.0"), + .package(url: "https://github.com/SVProgressHUD/SVProgressHUD", exact: "2.3.1"), .package(path: "../LocalSwiftPackage"), .package(path: "../StringifyMacro"), ] From f6acc220c5cca9c1857435dcbd4932ba2d756a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 27 Feb 2024 16:36:50 +0100 Subject: [PATCH 135/509] Add docs about GCS support (#5997) --- .../enterprise-environment.tutorial | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial b/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial index b804d92f840..fead030fbd2 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial @@ -79,6 +79,8 @@ | TUIST_S3_BUCKET_NAME | Name of the bucket | Yes | | `my-bucket` | | TUIST_S3_REGION | The bucket's region | No | `eu-west-1` | `us-east-1` | | TUIST_S3_ENDPOINT | Custom endpoint | No | `https://amazonaws.com` | `https://custom-domain.com` | + + For Google Cloud Storage, follow [these docs](https://cloud.google.com/storage/docs/authentication/managing-hmackeys) to get the `TUIST_S3_ACCESS_KEY_ID` and `TUIST_S3_SECRET_ACCESS_KEY` pair. The `TUIST_S3_ENDPOINT` should be set to `https://storage.googleapis.com`. Other environment variables are the same as for any other S3-compliant storage. } From ac12c8c2e1951502f7f9d8d159a96687d2586272 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 27 Feb 2024 17:23:21 +0100 Subject: [PATCH 136/509] Update docs for optional Cloud.Option (#6002) --- Sources/ProjectDescription/Cloud.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Sources/ProjectDescription/Cloud.swift b/Sources/ProjectDescription/Cloud.swift index 3ab94785122..27f540cb670 100644 --- a/Sources/ProjectDescription/Cloud.swift +++ b/Sources/ProjectDescription/Cloud.swift @@ -4,9 +4,8 @@ import Foundation public struct Cloud: Codable, Equatable { /// Options for cloud configuration. public enum Option: String, Codable, Equatable { - /// Marks whether cloud connection is optional. - /// If not present, tuist commands will fail regardless of whether an authentication token is available locally from - /// `tuist cloud auth` or not. + /// Marks whether Tuist Cloud authentication is optional. + /// If present, the interaction with Tuist Cloud will be skipped (instead of failing) if a user is not authenticated. case optional } From 956755e3a22a261a4e428584e37bea1763ea1fcb Mon Sep 17 00:00:00 2001 From: fess Date: Tue, 27 Feb 2024 18:03:07 +0000 Subject: [PATCH 137/509] Add `bundleId` and `settings` to `ProjectAutomation` graph (#5992) * feat: BundleId and Configurations in graph JSON * lint * more lint * configuration feedback * removed TuistGraph. * reverted ProjectAutomation. * Pr feedbacl * added TUIST_CONFIG_PLUGIN_BINARY_PATH for testing locally plugins * renamed file * graph update * fix lint * reverted typealias BuildConfigurationDictionary * reverted TuistGraph. * fixed missing type TuistGraph. * fix lint * fix for in --------- Co-authored-by: Stefan Fessler --- Sources/ProjectAutomation/Configuration.swift | 50 ++++ Sources/ProjectAutomation/Settings.swift | 13 + Sources/ProjectAutomation/Target.swift | 10 + Sources/TuistKit/Services/GraphService.swift | 159 ---------- .../ProjectAutomation+ManifestMapper.swift | 276 ++++++++++++++++++ Sources/TuistKit/Services/TuistService.swift | 12 +- .../PackageInfoMapper.swift | 8 +- 7 files changed, 364 insertions(+), 164 deletions(-) create mode 100644 Sources/ProjectAutomation/Configuration.swift create mode 100644 Sources/ProjectAutomation/Settings.swift create mode 100644 Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift diff --git a/Sources/ProjectAutomation/Configuration.swift b/Sources/ProjectAutomation/Configuration.swift new file mode 100644 index 00000000000..a3127dc94ba --- /dev/null +++ b/Sources/ProjectAutomation/Configuration.swift @@ -0,0 +1,50 @@ +import Foundation + +// MARK: - Configuration + +// A the build Configuration of a target. + +public struct Configuration: Equatable, Codable { + let settings: SettingsDictionary + + public init( + settings: SettingsDictionary + ) { + self.settings = settings + } +} + +// MARK: - BuildConfiguration + +public struct BuildConfiguration: Equatable, Codable, Hashable { + public enum Variant: String, Codable, Hashable { + case debug + case release + } + + public var name: String + public var variant: BuildConfiguration.Variant + + public init( + name: String, + variant: BuildConfiguration.Variant + ) { + self.name = name + self.variant = variant + } +} + +public typealias SettingsDictionary = [String: SettingValue] + +public enum SettingValue: Equatable, Codable { + case string(value: String) + case array(value: [String]) + + public init(string: String) { + self = .string(value: string) + } + + public init(array: [String]) { + self = .array(value: array) + } +} diff --git a/Sources/ProjectAutomation/Settings.swift b/Sources/ProjectAutomation/Settings.swift new file mode 100644 index 00000000000..0d69382e0cf --- /dev/null +++ b/Sources/ProjectAutomation/Settings.swift @@ -0,0 +1,13 @@ +import Foundation + +// A group of settings configurations. + +public struct Settings: Equatable, Codable { + public var configurations: [ProjectAutomation.BuildConfiguration: ProjectAutomation.Configuration?] + + public init( + configurations: [ProjectAutomation.BuildConfiguration: ProjectAutomation.Configuration?] + ) { + self.configurations = configurations + } +} diff --git a/Sources/ProjectAutomation/Target.swift b/Sources/ProjectAutomation/Target.swift index ad5f2626ecf..44644ba3711 100644 --- a/Sources/ProjectAutomation/Target.swift +++ b/Sources/ProjectAutomation/Target.swift @@ -8,26 +8,36 @@ public struct Target: Codable, Equatable { /// The product type the target produces. public let product: String + /// The bundleId of the target. + public let bundleId: String + /// List of file paths that are the target's sources. public let sources: [String] /// List of file paths that are the target's resources. public let resources: [String] + /// The target’s settings. + public let settings: Settings + /// The target’s dependencies. public let dependencies: [TargetDependency] public init( name: String, product: String, + bundleId: String, sources: [String], resources: [String], + settings: Settings, dependencies: [TargetDependency] ) { self.name = name self.product = product + self.bundleId = bundleId self.sources = sources self.resources = resources + self.settings = settings self.dependencies = dependencies } } diff --git a/Sources/TuistKit/Services/GraphService.swift b/Sources/TuistKit/Services/GraphService.swift index f57268bf38a..abb4997afbd 100644 --- a/Sources/TuistKit/Services/GraphService.swift +++ b/Sources/TuistKit/Services/GraphService.swift @@ -129,162 +129,3 @@ final class GraphService { try System.shared.runAndPrint(["brew", "install", "graphviz"], verbose: false, environment: env) } } - -private enum GraphServiceError: FatalError { - case jsonNotValidForVisualExport - case encodingError(String) - - var description: String { - switch self { - case .jsonNotValidForVisualExport: - return "json format is not valid for visual export" - case let .encodingError(format): - return "failed to encode graph to \(format)" - } - } - - var type: ErrorType { - switch self { - case .jsonNotValidForVisualExport: - return .abort - case .encodingError: - return .abort - } - } -} - -extension ProjectAutomation.Graph { - fileprivate static func from( - graph: TuistGraph.Graph, - targetsAndDependencies: [GraphTarget: Set] - ) -> ProjectAutomation.Graph { - // generate targets projects only - let projects = targetsAndDependencies - .map(\.key.project) - .reduce(into: [String: ProjectAutomation.Project]()) { - $0[$1.path.pathString] = ProjectAutomation.Project.from($1) - } - - return ProjectAutomation.Graph(name: graph.name, path: graph.path.pathString, projects: projects) - } - - fileprivate func export(to filePath: AbsolutePath) throws { - let encoder = JSONEncoder() - encoder.outputFormatting = [.sortedKeys, .prettyPrinted, .withoutEscapingSlashes] - let jsonData = try encoder.encode(self) - let jsonString = String(data: jsonData, encoding: .utf8) - guard let jsonString else { - throw GraphServiceError.encodingError(GraphFormat.json.rawValue) - } - - try FileHandler.shared.write(jsonString, path: filePath, atomically: true) - } -} - -extension ProjectAutomation.Project { - fileprivate static func from(_ project: TuistGraph.Project) -> ProjectAutomation.Project { - let packages = project.packages - .reduce(into: [ProjectAutomation.Package]()) { $0.append(ProjectAutomation.Package.from($1)) } - let schemes = project.schemes.reduce(into: [ProjectAutomation.Scheme]()) { $0.append(ProjectAutomation.Scheme.from($1)) } - let targets = project.targets.reduce(into: [ProjectAutomation.Target]()) { $0.append(ProjectAutomation.Target.from($1)) } - - return ProjectAutomation.Project( - name: project.name, - path: project.path.pathString, - isExternal: project.isExternal, - packages: packages, - targets: targets, - schemes: schemes - ) - } -} - -extension ProjectAutomation.Package { - fileprivate static func from(_ package: TuistGraph.Package) -> ProjectAutomation.Package { - switch package { - case let .remote(url, _): - return ProjectAutomation.Package(kind: ProjectAutomation.Package.PackageKind.remote, path: url) - case let .local(path): - return ProjectAutomation.Package(kind: ProjectAutomation.Package.PackageKind.local, path: path.pathString) - } - } -} - -extension ProjectAutomation.Target { - fileprivate static func from(_ target: TuistGraph.Target) -> ProjectAutomation.Target { - let dependencies = target.dependencies.map { Self.from($0) } - return ProjectAutomation.Target( - name: target.name, - product: target.product.rawValue, - sources: target.sources.map(\.path.pathString), - resources: target.resources.map(\.path.pathString), - dependencies: dependencies - ) - } - - private static func from(_ dependency: TuistGraph.TargetDependency) -> ProjectAutomation.TargetDependency { - switch dependency { - case let .target(name, _): - return .target(name: name) - case let .project(target, path, _): - return .project(target: target, path: path.pathString) - case let .framework(path, status, _): - let frameworkStatus: ProjectAutomation.FrameworkStatus - switch status { - case .optional: - frameworkStatus = .optional - case .required: - frameworkStatus = .required - } - return .framework(path: path.pathString, status: frameworkStatus) - case let .xcframework(path, status, _): - let frameworkStatus: ProjectAutomation.FrameworkStatus - switch status { - case .optional: - frameworkStatus = .optional - case .required: - frameworkStatus = .required - } - return .xcframework(path: path.pathString, status: frameworkStatus) - case let .library(path, publicHeaders, swiftModuleMap, _): - return .library( - path: path.pathString, - publicHeaders: publicHeaders.pathString, - swiftModuleMap: swiftModuleMap?.pathString - ) - case let .package(product, type, _): - switch type { - case .macro: - return .packageMacro(product: product) - case .plugin: - return .packagePlugin(product: product) - case .runtime: - return .package(product: product) - } - case let .sdk(name, status, _): - let projectAutomationStatus: ProjectAutomation.SDKStatus - switch status { - case .optional: - projectAutomationStatus = .optional - case .required: - projectAutomationStatus = .required - } - return .sdk(name: name, status: projectAutomationStatus) - case .xctest: - return .xctest - } - } -} - -extension ProjectAutomation.Scheme { - fileprivate static func from(_ scheme: TuistGraph.Scheme) -> ProjectAutomation.Scheme { - var testTargets = [String]() - if let testAction = scheme.testAction { - for testTarget in testAction.targets { - testTargets.append(testTarget.target.name) - } - } - - return ProjectAutomation.Scheme(name: scheme.name, testActionTargets: testTargets) - } -} diff --git a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift new file mode 100644 index 00000000000..75a1c6c1541 --- /dev/null +++ b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift @@ -0,0 +1,276 @@ +import Foundation +import ProjectAutomation +import TSCBasic +import TuistGraph +import TuistSupport + +extension ProjectAutomation.Graph { + static func from( + graph: TuistGraph.Graph, + targetsAndDependencies: [GraphTarget: Set] + ) -> ProjectAutomation.Graph { + // generate targets projects only + let projects = targetsAndDependencies + .map(\.key.project) + .reduce(into: [String: ProjectAutomation.Project]()) { + $0[$1.path.pathString] = ProjectAutomation.Project.from($1) + } + + return ProjectAutomation.Graph(name: graph.name, path: graph.path.pathString, projects: projects) + } + + func export(to filePath: AbsolutePath) throws { + let encoder = JSONEncoder() + encoder.outputFormatting = [.sortedKeys, .prettyPrinted, .withoutEscapingSlashes] + let jsonData = try encoder.encode(self) + let jsonString = String(data: jsonData, encoding: .utf8) + guard let jsonString else { + throw GraphServiceError.encodingError(GraphFormat.json.rawValue) + } + + try FileHandler.shared.write(jsonString, path: filePath, atomically: true) + } +} + +extension ProjectAutomation.Project { + static func from(_ project: TuistGraph.Project) -> ProjectAutomation.Project { + let packages = project.packages + .reduce(into: [ProjectAutomation.Package]()) { $0.append(ProjectAutomation.Package.from($1)) } + let schemes = project.schemes.reduce(into: [ProjectAutomation.Scheme]()) { $0.append(ProjectAutomation.Scheme.from($1)) } + let targets = project.targets.reduce(into: [ProjectAutomation.Target]()) { $0.append(ProjectAutomation.Target.from($1)) } + + return ProjectAutomation.Project( + name: project.name, + path: project.path.pathString, + isExternal: project.isExternal, + packages: packages, + targets: targets, + schemes: schemes + ) + } +} + +extension ProjectAutomation.Package { + static func from(_ package: TuistGraph.Package) -> ProjectAutomation.Package { + switch package { + case let .remote(url, _): + return ProjectAutomation.Package(kind: ProjectAutomation.Package.PackageKind.remote, path: url) + case let .local(path): + return ProjectAutomation.Package(kind: ProjectAutomation.Package.PackageKind.local, path: path.pathString) + } + } +} + +extension ProjectAutomation.Target { + static func from(_ target: TuistGraph.Target) -> ProjectAutomation.Target { + let dependencies = target.dependencies.map { Self.from($0) } + return ProjectAutomation.Target( + name: target.name, + product: target.product.rawValue, + bundleId: target.bundleId, + sources: target.sources.map(\.path.pathString), + resources: target.resources.map(\.path.pathString), + settings: ProjectAutomation.Settings.from(target.settings), + dependencies: dependencies + ) + } + + static func from(_ dependency: TuistGraph.TargetDependency) -> ProjectAutomation.TargetDependency { + switch dependency { + case let .target(name, _): + return .target(name: name) + case let .project(target, path, _): + return .project(target: target, path: path.pathString) + case let .framework(path, status, _): + let frameworkStatus: ProjectAutomation.FrameworkStatus + switch status { + case .optional: + frameworkStatus = .optional + case .required: + frameworkStatus = .required + } + return .framework(path: path.pathString, status: frameworkStatus) + case let .xcframework(path, status, _): + let frameworkStatus: ProjectAutomation.FrameworkStatus + switch status { + case .optional: + frameworkStatus = .optional + case .required: + frameworkStatus = .required + } + return .xcframework(path: path.pathString, status: frameworkStatus) + case let .library(path, publicHeaders, swiftModuleMap, _): + return .library( + path: path.pathString, + publicHeaders: publicHeaders.pathString, + swiftModuleMap: swiftModuleMap?.pathString + ) + case let .package(product, type, _): + switch type { + case .macro: + return .packageMacro(product: product) + case .plugin: + return .packagePlugin(product: product) + case .runtime: + return .package(product: product) + } + case let .sdk(name, status, _): + let projectAutomationStatus: ProjectAutomation.SDKStatus + switch status { + case .optional: + projectAutomationStatus = .optional + case .required: + projectAutomationStatus = .required + } + return .sdk(name: name, status: projectAutomationStatus) + case .xctest: + return .xctest + } + } +} + +extension ProjectAutomation.Scheme { + static func from(_ scheme: TuistGraph.Scheme) -> ProjectAutomation.Scheme { + var testTargets = [String]() + if let testAction = scheme.testAction { + for testTarget in testAction.targets { + testTargets.append(testTarget.target.name) + } + } + + return ProjectAutomation.Scheme(name: scheme.name, testActionTargets: testTargets) + } +} + +extension ProjectAutomation.Settings { + public static func from(_ settings: TuistGraph.Settings?) -> ProjectAutomation.Settings { + ProjectAutomation.Settings( + configurations: [ProjectAutomation.BuildConfiguration: ProjectAutomation.Configuration?].from( + settings?.configurations + ) + ) + } +} + +extension [ProjectAutomation.BuildConfiguration: ProjectAutomation.Configuration?] { + public static func from( + _ buildConfigurationDictionary: [TuistGraph.BuildConfiguration: TuistGraph.Configuration?]? + ) -> [ProjectAutomation.BuildConfiguration: ProjectAutomation.Configuration?] { + guard let buildConfigurationDictionary else { + return [:] + } + + var dict = [ProjectAutomation.BuildConfiguration: ProjectAutomation.Configuration?]() + + for (buildConfiguration, configuration) in buildConfigurationDictionary { + let item = ProjectAutomation.BuildConfiguration.from( + buildConfiguration + ) + dict[item] = ProjectAutomation.Configuration.from( + configuration + ) + } + + return dict + } +} + +extension ProjectAutomation.Configuration { + static func from( + _ configuration: TuistGraph.Configuration? + ) -> ProjectAutomation.Configuration? { + guard let configuration else { + return nil + } + + return ProjectAutomation.Configuration( + settings: ProjectAutomation.SettingsDictionary.from( + configuration.settings + ) + ) + } +} + +extension ProjectAutomation.SettingValue { + static func from( + _ value: TuistGraph.SettingValue + ) -> ProjectAutomation.SettingValue { + switch value { + case let .string(string): + return ProjectAutomation.SettingValue(string: string) + case let .array(array): + return ProjectAutomation.SettingValue(array: array) + } + } +} + +extension ProjectAutomation.SettingsDictionary { + static func from( + _ settings: TuistGraph.SettingsDictionary + ) -> ProjectAutomation.SettingsDictionary { + var dict = ProjectAutomation.SettingsDictionary() + for (key, value) in settings { + dict[key] = ProjectAutomation.SettingValue.from( + value + ) + } + return dict + } +} + +extension ProjectAutomation.BuildConfiguration { + static func from( + _ buildConfiguration: TuistGraph.BuildConfiguration + ) -> ProjectAutomation.BuildConfiguration { + BuildConfiguration( + name: buildConfiguration.name, + variant: ProjectAutomation.BuildConfiguration.Variant.from( + buildConfiguration.variant + ) + ) + } +} + +extension ProjectAutomation.BuildConfiguration.Variant { + static func from( + _ variant: TuistGraph.BuildConfiguration.Variant + ) -> ProjectAutomation.BuildConfiguration.Variant { + ProjectAutomation.BuildConfiguration.Variant( + variant: variant + ) + } +} + +extension ProjectAutomation.BuildConfiguration.Variant { + private init(variant: TuistGraph.BuildConfiguration.Variant) { + switch variant { + case .debug: + self = .debug + case .release: + self = .release + } + } +} + +enum GraphServiceError: FatalError { + case jsonNotValidForVisualExport + case encodingError(String) + + var description: String { + switch self { + case .jsonNotValidForVisualExport: + return "json format is not valid for visual export" + case let .encodingError(format): + return "failed to encode graph to \(format)" + } + } + + var type: ErrorType { + switch self { + case .jsonNotValidForVisualExport: + return .abort + case .encodingError: + return .abort + } + } +} diff --git a/Sources/TuistKit/Services/TuistService.swift b/Sources/TuistKit/Services/TuistService.swift index aa80318cb73..1219d5abfeb 100644 --- a/Sources/TuistKit/Services/TuistService.swift +++ b/Sources/TuistKit/Services/TuistService.swift @@ -40,10 +40,20 @@ final class TuistService: NSObject { } let config = try configLoader.loadConfig(path: path) - let pluginExecutables = try pluginService.remotePluginPaths(using: config) + + var pluginPaths = try pluginService.remotePluginPaths(using: config) .compactMap(\.releasePath) + + if let pluginPath: String = ProcessInfo.processInfo.environment["TUIST_CONFIG_PLUGIN_BINARY_PATH"] { + let absolutePath = try AbsolutePath(validating: pluginPath) + logger.debug("Using plugin absolutePath \(absolutePath.description)", metadata: .subsection) + pluginPaths.append(absolutePath) + } + + let pluginExecutables = try pluginPaths .flatMap(FileHandler.shared.contentsOfDirectory) .filter { $0.basename.hasPrefix("tuist-") } + if let pluginCommand = pluginExecutables.first(where: { $0.basename == commandName }) { arguments[0] = pluginCommand.pathString } else if System.shared.commandExists(commandName) { diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index e8dd06d2208..73b0d37899e 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -418,7 +418,7 @@ public final class PackageInfoMapper: PackageInfoMapping { uniquingKeysWith: { userDefined, _ in userDefined } ) - var targetSettings = targetSettings.merging( + let targetSettings = targetSettings.merging( // Force enable testing search paths Dictionary( uniqueKeysWithValues: [ @@ -1141,7 +1141,7 @@ extension ProjectDescription.Product { } extension ProjectDescription.SettingsDictionary { - fileprivate static func from(settingsDictionary: TuistGraph.SettingsDictionary) -> Self { + public static func from(settingsDictionary: TuistGraph.SettingsDictionary) -> Self { settingsDictionary.mapValues { value in switch value { case let .string(stringValue): @@ -1154,7 +1154,7 @@ extension ProjectDescription.SettingsDictionary { } extension ProjectDescription.Settings { - fileprivate static func from( + public static func from( settings: TuistGraph.Settings, adding: ProjectDescription.SettingsDictionary, packageFolder: AbsolutePath @@ -1172,7 +1172,7 @@ extension ProjectDescription.Settings { } extension ProjectDescription.Configuration { - fileprivate static func from( + public static func from( buildConfiguration: BuildConfiguration, configuration: TuistGraph.Configuration?, packageFolder: AbsolutePath From 456bebef853da0eeed8385179e658d1d3225cbf7 Mon Sep 17 00:00:00 2001 From: Daniele Formichelli Date: Tue, 27 Feb 2024 19:05:37 +0100 Subject: [PATCH 138/509] docs: remove references to `--template swiftui` (#6000) --- .../Getting-Started/Create Project/create-project.tutorial | 4 ---- .../Getting-Started/Create Project/tuist-init-swiftui.txt | 5 ----- 2 files changed, 9 deletions(-) delete mode 100644 docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Create Project/tuist-init-swiftui.txt diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Create Project/create-project.tutorial b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Create Project/create-project.tutorial index 7b37520c01f..3a4101b89bc 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Create Project/create-project.tutorial +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Create Project/create-project.tutorial @@ -25,10 +25,6 @@ > Note: If you have used the Swift Package Manager before, the Project.swift file is the equivalent to the Package.swift. } - @Step { - To create a SwiftUI project, you can specify the SwiftUI template. - @Code(name: "console", file: "tuist-init-swiftui.txt", previousFile: "make-directory.txt") - } } } diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Create Project/tuist-init-swiftui.txt b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Create Project/tuist-init-swiftui.txt deleted file mode 100644 index a91ec3c035b..00000000000 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/Tutorials/Tuist Tutorial/Getting-Started/Create Project/tuist-init-swiftui.txt +++ /dev/null @@ -1,5 +0,0 @@ -% mkdir MyApp -% cd MyApp - -% tuist init --platform ios --template swiftui -Project generated at path ~/Desktop/MyApp. From 609de2fc77ef32d8cd71c9394f769f153f20f165 Mon Sep 17 00:00:00 2001 From: pepicrft Date: Wed, 28 Feb 2024 13:33:01 +0000 Subject: [PATCH 139/509] Update .mise.toml and CHANGELOG.md with version 4.4.0 --- .mise.toml | 2 +- CHANGELOG.md | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 4b404227125..847f99d9d50 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.3.4" +tuist = "4.4.0" swiftlint = "0.54.0" swiftformat = "0.53.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index 382591f2ba1..499c7128d1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 4.4.0 - 2024-02-28 + +### Tuist + +- no changes + +### Tuist Cloud + +- no changes + ## 4.3.4 - 2024-02-21 ### Tuist From 7af8b1409ba2542f108e39f639e98a4012c48fa5 Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 28 Feb 2024 16:03:24 +0100 Subject: [PATCH 140/509] Add 4.4.0 release notes to the CHANGELOG --- CHANGELOG.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 499c7128d1f..7e90fca8e2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,28 @@ ### Tuist -- no changes +#### Added +* Add docs about GCS support by @fortmarek in https://github.com/tuist/tuist/pull/5997 +* Add support for the new `package` access modifier by @pepicrft in https://github.com/tuist/tuist/pull/5983 + +#### Fixed +* Fix spm bundle recursion by @fortmarek in https://github.com/tuist/tuist/pull/5999 +* Avoid infinite loop caused by symbolic links by @haifengkao in https://github.com/tuist/tuist/pull/5813 +* Prune targets with no destinations after platform narrowing by @fortmarek in https://github.com/tuist/tuist/pull/5979 + +#### Changed +* Upgrade to xcbeautify 1.6.0 by @cpisciotta in https://github.com/tuist/tuist/pull/5996 +* Update docs for optional Cloud.Option by @fortmarek in https://github.com/tuist/tuist/pull/6002 +* SPM dependencies now implicitly support all platforms by @fortmarek in https://github.com/tuist/tuist/pull/5990 + +#### Removed +* Remove version command by @pepicrft in https://github.com/tuist/tuist/pull/5995 ### Tuist Cloud -- no changes +#### Fixed + +* Add support for pasting the token to enable Tuist Cloud authentication via Safari by @pepicrft ## 4.3.4 - 2024-02-21 From 3931a83e34dca4093ffe4cc995d9268b179d333f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Thu, 29 Feb 2024 15:42:31 +0100 Subject: [PATCH 141/509] Document how to configure event hooks with Okta (#6004) --- .../enterprise-environment.tutorial | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial b/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial index fead030fbd2..a76ea081846 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial @@ -51,7 +51,22 @@ #### Okta - You can enable authentication with Okta through the [OAuth 2.0](https://oauth.net/2/) protocol. You'll have to [create an app](https://developer.okta.com/docs/guides/implement-oauth-for-okta/main/#create-an-oauth-2-0-app-in-okta) on Okta, and set the following environment variables: + You can enable authentication with Okta through the [OAuth 2.0](https://oauth.net/2/) protocol. You'll have to [create an app](https://developer.okta.com/docs/guides/implement-oauth-for-okta/main/#create-an-oauth-2-0-app-in-okta) on Okta with the following configuration: + + - **App integration name:** Tuist Cloud + - **Grant type:** Enable "Authorization Code" for "Client acting on behalf of a user" + - **Sign-in redirect URL:** `{url}/users/auth/github/callback` where `url` is the public URL your service is accessed through. + - **Assignments:** This configuration will depend on your security team requirements. + + If you'd like Tuist Cloud to detect when a user is removed from the application, you'll have to configure an [event hook](https://help.okta.com/en-us/content/topics/automation-hooks/event-hooks-main.htm). In your Okta organization, go to **Workflow > Event Hooks** and create a new event hook with the following data: + + - **Name:** Notify memberhip removal to Tuist Cloud + - **URL:** `{url}/webhooks/okta` where `url` is the public URL your service is accessed through. + - **Authentication field:** `Authorization` + - **Authentication secret:** A token that Tuist Cloud uses to validate the webhooks. + - **Subscribe to events** Include "User unassigned from app" + + Once the app is created you'll need to set the following environment variables: | Environment variable | Description | Required | Default | Example | | --- | --- | --- | --- | --- | @@ -61,8 +76,9 @@ | `TUIST_OKTA_AUTHORIZE_URL` | The authorize URL | No | `{OKTA_SITE}/oauth2//v1/authorize` | | | `TUIST_OKTA_TOKEN_URL` | The token URL | No | `{OKTA_SITE}/oauth2//v1/token` | | | `TUIST_OKTA_USER_INFO_URL` | The token URL | No | `{OKTA_SITE}/oauth2//v1/userinfo` | | - + | `TUIST_OKTA_EVENT_HOOK_SECRET` | A secret to validat event hooks delivered by Okta | No | | } + event_hook_secret @Section(title: "Storage") { From 0e88426e9e0690f3c97296fbdab810f456cb709d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Thu, 29 Feb 2024 17:16:05 +0100 Subject: [PATCH 142/509] Document how to set up authentication with OAuth2 and Google (#6010) --- .../enterprise-environment.tutorial | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial b/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial index a76ea081846..8d0e689e6a6 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/Tutorials/Tuist Cloud Tutorial/Tuist Cloud Tutorial Enterprise/enterprise-environment.tutorial @@ -49,6 +49,12 @@ | `TUIST_GITHUB_OAUTH_ID` | The client ID of the application | Yes | | `Iv1.a629723000043722` | | `TUIST_GITHUB_OAUTH_SECRET` | The client secret of the application | Yes | | `232f972951033b89799b0fd24566a04d83f44ccc` | + #### Google + + You can set up authentication with Google using [OAuth 2](https://developers.google.com/identity/protocols/oauth2). For that, you'll need to [create a new credential](https://console.cloud.google.com/apis/credentials?project=tuist-cloud-staging) of type OAuth client ID. When creating the credentials, select "Web Application" as application type, name it "Tuist Cloud", and set the redirect URI to `{base_url}/users/auth/google/callback` where `base_url` is the URL your hosted-service is running at. Once you create the app, copy the client ID and secret and set them as environment variables `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` respectively. + + > Note: You might need to create a consent screen. When you do so, make sure to add the `userinfo.email` and `openid` scopes and mark the app as internal. + #### Okta You can enable authentication with Okta through the [OAuth 2.0](https://oauth.net/2/) protocol. You'll have to [create an app](https://developer.okta.com/docs/guides/implement-oauth-for-okta/main/#create-an-oauth-2-0-app-in-okta) on Okta with the following configuration: From 89896affde8bb02189ca63c82d50512e30ea1f51 Mon Sep 17 00:00:00 2001 From: Antti Laitala <133648611+anlaital-oura@users.noreply.github.com> Date: Fri, 1 Mar 2024 12:51:58 +0200 Subject: [PATCH 143/509] Fix crash when accessing bundle resources in Previews (#6008) * Fix crash when accessing bundle resources in previews * Lint * Remove previous implementation that didn't work * Run lint * Remove warnings * Better fix * Add fixture * Lint * Rename fixture to app_with_previews * Add acceptance test for the fixture * Improve comment --------- Co-authored-by: Daniele Formichelli --- .../TuistAcceptanceFixtures.swift | 3 +++ .../XcodeBuild/XcodeBuildController.swift | 24 ++++++++--------- .../Mappers/ResourcesProjectMapper.swift | 11 +++++++- .../HTTPStatusCode+Extensions.swift | 12 ++------- .../HTTPStatusCodes/HTTPStatusCodes.swift | 27 ++++++++++++------- .../BuildAcceptanceTests.swift | 9 +++++++ .../PreviewsFramework/Sources/TestView.swift | 19 +++++++++++++ fixtures/app_with_previews/Project.swift | 17 ++++++++++++ .../ResourcesFramework/Package.swift | 25 +++++++++++++++++ .../ResourcesFramework/BundleReader.swift | 6 +++++ .../ResourcesFramework/Resources/file.txt | 1 + .../app_with_previews/Tuist/Package.swift | 10 +++++++ fixtures/tuist_plugin/Package.swift | 4 +-- .../Sources/CreateFile/main.swift | 2 +- .../Sources/InspectGraph/main.swift | 3 ++- .../Templates/custom_two/custom_two.swift | 2 +- .../Tests/CreateFileTests/Test.swift | 2 +- 17 files changed, 138 insertions(+), 39 deletions(-) create mode 100644 fixtures/app_with_previews/PreviewsFramework/Sources/TestView.swift create mode 100644 fixtures/app_with_previews/Project.swift create mode 100644 fixtures/app_with_previews/ResourcesFramework/Package.swift create mode 100644 fixtures/app_with_previews/ResourcesFramework/Sources/ResourcesFramework/BundleReader.swift create mode 100644 fixtures/app_with_previews/ResourcesFramework/Sources/ResourcesFramework/Resources/file.txt create mode 100644 fixtures/app_with_previews/Tuist/Package.swift diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift index e3c842f1047..88b1cce14be 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift @@ -4,6 +4,7 @@ public enum TuistAcceptanceFixtures { case appWithBuildRules case appWithFrameworkAndTests case appWithPlugins + case appWithPreviews case appWithSpmDependencies case appWithTestPlan case commandLineToolBasic @@ -69,6 +70,8 @@ public enum TuistAcceptanceFixtures { return "app_with_framework_and_tests" case .appWithPlugins: return "app_with_plugins" + case .appWithPreviews: + return "app_with_previews" case .appWithSpmDependencies: return "app_with_spm_dependencies" case .appWithTestPlan: diff --git a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift index d6ae9679203..a03f34bccb7 100644 --- a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift +++ b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift @@ -5,7 +5,6 @@ import TuistCore import TuistSupport public final class XcodeBuildController: XcodeBuildControlling { - // MARK: - Attributes /// Matches lines of the forms: @@ -19,7 +18,7 @@ public final class XcodeBuildController: XcodeBuildControlling { private let formatter: Formatting private let environment: Environmenting - + public convenience init() { self.init(formatter: Formatter(), environment: Environment.shared) } @@ -71,9 +70,9 @@ public final class XcodeBuildController: XcodeBuildControlling { case nil: break } - + // Derived data path - if let derivedDataPath = derivedDataPath { + if let derivedDataPath { command.append(contentsOf: ["-derivedDataPath", derivedDataPath.pathString]) } @@ -129,12 +128,12 @@ public final class XcodeBuildController: XcodeBuildControlling { } // Derived data path - if let derivedDataPath = derivedDataPath { + if let derivedDataPath { command.append(contentsOf: ["-derivedDataPath", derivedDataPath.pathString]) } // Result bundle path - if let resultBundlePath = resultBundlePath { + if let resultBundlePath { command.append(contentsOf: ["-resultBundlePath", resultBundlePath.pathString]) } @@ -186,10 +185,10 @@ public final class XcodeBuildController: XcodeBuildControlling { command.append(contentsOf: ["-archivePath", archivePath.pathString]) // Derived data path - if let derivedDataPath = derivedDataPath { + if let derivedDataPath { command.append(contentsOf: ["-derivedDataPath", derivedDataPath.pathString]) } - + // Arguments command.append(contentsOf: arguments.flatMap(\.arguments)) @@ -204,7 +203,7 @@ public final class XcodeBuildController: XcodeBuildControlling { command.append(contentsOf: arguments.flatMap(\.xcodebuildArguments)) command.append(contentsOf: ["-output", output.pathString]) command.append("-allow-internal-distribution") - + return try run(command: command) } @@ -228,10 +227,10 @@ public final class XcodeBuildController: XcodeBuildControlling { command.append(contentsOf: ["-scheme", scheme]) // Derived data path - if let derivedDataPath = derivedDataPath { + if let derivedDataPath { command.append(contentsOf: ["-derivedDataPath", derivedDataPath.pathString]) } - + // Target command.append(contentsOf: target.xcodebuildArguments) @@ -251,7 +250,7 @@ public final class XcodeBuildController: XcodeBuildControlling { var currentTarget: String? let flushTarget = { () in - if let currentTarget = currentTarget { + if let currentTarget { let buildSettings = XcodeBuildSettings( currentSettings, target: currentTarget, @@ -291,7 +290,6 @@ public final class XcodeBuildController: XcodeBuildControlling { } fileprivate func run(command: [String]) throws -> AsyncThrowingStream, Error> { - logger.debug("Running xcodebuild command: \(command.joined(separator: " "))") return System.shared.publisher(command) .compactMap { [weak self] event -> SystemEvent? in diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 6cd77069d9d..15e7d55f6d2 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -181,12 +181,21 @@ public class ResourcesProjectMapper: ProjectMapping { static let module: Bundle = { let bundleName = "\(bundleName)" - let candidates = [ + var candidates = [ Bundle.main.resourceURL, Bundle(for: BundleFinder.self).resourceURL, Bundle.main.bundleURL, ] + #if DEBUG + // This is a fix to make Previews work with bundled resources. + // Logic here is taken from SPM's generated `resource_bundle_accessors.swift` file, + // which is located under the derived data directory after building the project. + if let override = ProcessInfo.processInfo.environment["PACKAGE_RESOURCE_BUNDLE_PATH"] { + candidates.append(URL(fileURLWithPath: override)) + } + #endif + for candidate in candidates { let bundlePath = candidate?.appendingPathComponent(bundleName + ".bundle") if let bundle = bundlePath.flatMap(Bundle.init(url:)) { diff --git a/Sources/TuistSupport/Vendored/HTTPStatusCodes/HTTPStatusCode+Extensions.swift b/Sources/TuistSupport/Vendored/HTTPStatusCodes/HTTPStatusCode+Extensions.swift index d0080767717..727a23677d9 100644 --- a/Sources/TuistSupport/Vendored/HTTPStatusCodes/HTTPStatusCode+Extensions.swift +++ b/Sources/TuistSupport/Vendored/HTTPStatusCodes/HTTPStatusCode+Extensions.swift @@ -1,12 +1,3 @@ -// https://github.com/rhodgkins/SwiftHTTPStatusCodes -// -// HTTPStatusCodes+Extensions.swift -// HTTPStatusCodes -// -// Created by Richard Hodgkins on 07/06/2016. -// Copyright © 2016 Rich H. All rights reserved. -// - import Foundation extension HTTPStatusCode { @@ -122,7 +113,8 @@ extension HTTPStatusCode { /// /// Used in the resumable requests proposal to resume aborted PUT or POST requests. /// - /// - seealso: [Original proposal](https://web.archive.org/web/20151013212135/http://code.google.com/p/gears/wiki/ResumableHttpRequestsProposal) + /// - seealso: [Original + /// proposal](https://web.archive.org/web/20151013212135/http://code.google.com/p/gears/wiki/ResumableHttpRequestsProposal) @available(*, unavailable, renamed: "earlyHints", message: "Replaced by RFC standard code with different meaning") public static let checkpoint = __Unavailable diff --git a/Sources/TuistSupport/Vendored/HTTPStatusCodes/HTTPStatusCodes.swift b/Sources/TuistSupport/Vendored/HTTPStatusCodes/HTTPStatusCodes.swift index 122e34f2914..30da2c4467c 100644 --- a/Sources/TuistSupport/Vendored/HTTPStatusCodes/HTTPStatusCodes.swift +++ b/Sources/TuistSupport/Vendored/HTTPStatusCodes/HTTPStatusCodes.swift @@ -6,7 +6,8 @@ // import Foundation -/// HTTP status codes as per the [IANA HTTP status code registry](http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml). +/// HTTP status codes as per the [IANA HTTP status code +/// registry](http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml). /// /// Last updated: Fri, 21 Sep 2018 16:10:10 GMT /// @@ -276,7 +277,8 @@ import Foundation /// /// **Category**: Internet Information Services /// - /// - seealso: [Error message when you try to log on to Exchange 2007 by using Outlook Web Access: "440 Login Timeout"](http://support.microsoft.com/kb/941201/en-us) + /// - seealso: [Error message when you try to log on to Exchange 2007 by using Outlook Web Access: "440 Login + /// Timeout"](http://support.microsoft.com/kb/941201/en-us) @objc(HTTPStatusCodeIISLoginTimeout) case iisLoginTimeout = 440 @@ -299,7 +301,8 @@ import Foundation /// Blocked by Windows Parental Controls: 450 /// - /// A Microsoft extension. This error is given when Windows Parental Controls are turned on and are blocking access to the given webpage. + /// A Microsoft extension. This error is given when Windows Parental Controls are turned on and are blocking access to the + /// given webpage. case blockedByWindowsParentalControls = 450 /// Unavailable For Legal Reasons: 451 @@ -323,16 +326,19 @@ import Foundation /// nginx HTTP To HTTPS: 497 /// - /// An expansion of the 400 Bad Request response code, used when the client has made a HTTP request to a port listening for HTTPS requests. + /// An expansion of the 400 Bad Request response code, used when the client has made a HTTP request to a port listening for + /// HTTPS requests. /// /// **Category**: nginx case nginxHTTPToHTTPS = 497 /// Token Expired: 498 /// - /// Returned by [ArcGIS for Server](https://en.wikipedia.org/wiki/ArcGIS_Server). A code of 498 indicates an expired or otherwise invalid token. + /// Returned by [ArcGIS for Server](https://en.wikipedia.org/wiki/ArcGIS_Server). A code of 498 indicates an expired or + /// otherwise invalid token. /// - /// - seealso: [Using token-based authentication](http://help.arcgis.com/en/arcgisserver/10.0/apis/soap/index.htm#Using_token_authentication.htm) + /// - seealso: [Using token-based + /// authentication](http://help.arcgis.com/en/arcgisserver/10.0/apis/soap/index.htm#Using_token_authentication.htm) case tokenExpired = 498 /// nginx Client Closed Request: 499 @@ -390,7 +396,8 @@ import Foundation /// Bandwidth Limit Exceeded: 509 /// - /// The server has exceeded the bandwidth specified by the server administrator; this is often used by shared hosting providers to limit the bandwidth of customers. + /// The server has exceeded the bandwidth specified by the server administrator; this is often used by shared hosting + /// providers to limit the bandwidth of customers. /// /// - seealso: case bandwidthLimitExceeded = 509 @@ -407,11 +414,13 @@ import Foundation /// Site is frozen: 530 /// - /// Used by the [Pantheon](https://en.wikipedia.org/wiki/Pantheon_(software)) web platform to indicate a site that has been frozen due to inactivity. + /// Used by the [Pantheon](https://en.wikipedia.org/wiki/Pantheon_(software)) web platform to indicate a site that has been + /// frozen due to inactivity. case siteIsFrozen = 530 /// Network Connect Timeout Error: 599 /// - /// This status code is not specified in any RFCs, but is used by some HTTP proxies to signal a network connect timeout behind the proxy to a client in front of the proxy. + /// This status code is not specified in any RFCs, but is used by some HTTP proxies to signal a network connect timeout behind + /// the proxy to a client in front of the proxy. case networkConnectTimeoutError = 599 } diff --git a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift index 55d99a1bf1a..4a0c7028dae 100644 --- a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift +++ b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift @@ -14,6 +14,15 @@ final class BuildAcceptanceTestWithTemplates: TuistAcceptanceTestCase { } } +final class BuildAcceptanceTestAppWithPreviews: TuistAcceptanceTestCase { + func test_with_previews() async throws { + try setUpFixture(.appWithPreviews) + try await run(InstallCommand.self) + try await run(GenerateCommand.self) + try await run(BuildCommand.self) + } +} + final class BuildAcceptanceTestAppWithFrameworkAndTests: TuistAcceptanceTestCase { func test_with_framework_and_tests() async throws { try setUpFixture(.appWithFrameworkAndTests) diff --git a/fixtures/app_with_previews/PreviewsFramework/Sources/TestView.swift b/fixtures/app_with_previews/PreviewsFramework/Sources/TestView.swift new file mode 100644 index 00000000000..deb9f5ac3d7 --- /dev/null +++ b/fixtures/app_with_previews/PreviewsFramework/Sources/TestView.swift @@ -0,0 +1,19 @@ +import ResourcesFramework +import SwiftUI + +struct TestView: View { + var body: some View { + VStack { + Button("Click to read file from bundle") { + text = readFileFromBundle() + } + Text(text) + } + } + + @State var text = "-" +} + +#Preview { + TestView() +} diff --git a/fixtures/app_with_previews/Project.swift b/fixtures/app_with_previews/Project.swift new file mode 100644 index 00000000000..065218163ce --- /dev/null +++ b/fixtures/app_with_previews/Project.swift @@ -0,0 +1,17 @@ +import ProjectDescription + +let project = Project( + name: "PreviewsFramework", + targets: [ + .target( + name: "PreviewsFramework", + destinations: .iOS, + product: .framework, + bundleId: "io.tuist.previewsframework", + sources: "PreviewsFramework/Sources/**", + dependencies: [ + .external(name: "ResourcesFramework"), + ] + ), + ] +) diff --git a/fixtures/app_with_previews/ResourcesFramework/Package.swift b/fixtures/app_with_previews/ResourcesFramework/Package.swift new file mode 100644 index 00000000000..e13b3d219ca --- /dev/null +++ b/fixtures/app_with_previews/ResourcesFramework/Package.swift @@ -0,0 +1,25 @@ +// swift-tools-version: 5.9 + +import PackageDescription + +let package = Package( + name: "ResourcesFramework", + platforms: [.iOS(.v15), .macOS(.v14)], + products: [ + .library( + name: "ResourcesFramework", + type: .static, + targets: [ + "ResourcesFramework", + ] + ), + ], + targets: [ + .target( + name: "ResourcesFramework", + resources: [ + .process("Resources"), + ] + ), + ] +) diff --git a/fixtures/app_with_previews/ResourcesFramework/Sources/ResourcesFramework/BundleReader.swift b/fixtures/app_with_previews/ResourcesFramework/Sources/ResourcesFramework/BundleReader.swift new file mode 100644 index 00000000000..4ff0daa67cf --- /dev/null +++ b/fixtures/app_with_previews/ResourcesFramework/Sources/ResourcesFramework/BundleReader.swift @@ -0,0 +1,6 @@ +import Foundation + +public func readFileFromBundle() -> String { + let path = Bundle.module.url(forResource: "file", withExtension: "txt")! + return try! String(contentsOf: path) +} diff --git a/fixtures/app_with_previews/ResourcesFramework/Sources/ResourcesFramework/Resources/file.txt b/fixtures/app_with_previews/ResourcesFramework/Sources/ResourcesFramework/Resources/file.txt new file mode 100644 index 00000000000..ce013625030 --- /dev/null +++ b/fixtures/app_with_previews/ResourcesFramework/Sources/ResourcesFramework/Resources/file.txt @@ -0,0 +1 @@ +hello diff --git a/fixtures/app_with_previews/Tuist/Package.swift b/fixtures/app_with_previews/Tuist/Package.swift new file mode 100644 index 00000000000..2f00c24619f --- /dev/null +++ b/fixtures/app_with_previews/Tuist/Package.swift @@ -0,0 +1,10 @@ +// swift-tools-version: 5.9 + +import PackageDescription + +let package = Package( + name: "project_with_previews_crash", + dependencies: [ + .package(path: "../ResourcesFramework"), + ] +) diff --git a/fixtures/tuist_plugin/Package.swift b/fixtures/tuist_plugin/Package.swift index 3c90b8f9589..02c47a9e441 100644 --- a/fixtures/tuist_plugin/Package.swift +++ b/fixtures/tuist_plugin/Package.swift @@ -24,14 +24,14 @@ let package = Package( .target( name: "CreateFile", dependencies: [ - .product(name: "ProjectAutomation", package: "ProjectAutomation") + .product(name: "ProjectAutomation", package: "ProjectAutomation"), ] ), .testTarget(name: "CreateFileTests"), .target( name: "InspectGraph", dependencies: [ - .product(name: "ProjectAutomation", package: "ProjectAutomation") + .product(name: "ProjectAutomation", package: "ProjectAutomation"), ] ), ] diff --git a/fixtures/tuist_plugin/Sources/CreateFile/main.swift b/fixtures/tuist_plugin/Sources/CreateFile/main.swift index 6ab8847c5be..05c9198bede 100644 --- a/fixtures/tuist_plugin/Sources/CreateFile/main.swift +++ b/fixtures/tuist_plugin/Sources/CreateFile/main.swift @@ -5,4 +5,4 @@ try "File created with a plugin".write( atomically: true, encoding: .utf8 ) -print("File created with a plugin!") \ No newline at end of file +print("File created with a plugin!") diff --git a/fixtures/tuist_plugin/Sources/InspectGraph/main.swift b/fixtures/tuist_plugin/Sources/InspectGraph/main.swift index 2114a06761a..716bba8e1bf 100644 --- a/fixtures/tuist_plugin/Sources/InspectGraph/main.swift +++ b/fixtures/tuist_plugin/Sources/InspectGraph/main.swift @@ -3,7 +3,8 @@ import ProjectAutomation let graph: Graph if CommandLine.arguments.contains("--path"), - let path = CommandLine.arguments.last { + let path = CommandLine.arguments.last +{ graph = try Tuist.graph(at: path) } else { graph = try Tuist.graph() diff --git a/fixtures/tuist_plugin/Templates/custom_two/custom_two.swift b/fixtures/tuist_plugin/Templates/custom_two/custom_two.swift index f1fa949e85c..065c37003fd 100644 --- a/fixtures/tuist_plugin/Templates/custom_two/custom_two.swift +++ b/fixtures/tuist_plugin/Templates/custom_two/custom_two.swift @@ -11,7 +11,7 @@ let templateTwo = Template( description: "Custom template", attributes: [ nameAttributeTwo, - platformAttributeTwo + platformAttributeTwo, ], items: [ .string(path: "\(nameAttributeTwo)/custom.swift", contents: testContentsTwo), diff --git a/fixtures/tuist_plugin/Tests/CreateFileTests/Test.swift b/fixtures/tuist_plugin/Tests/CreateFileTests/Test.swift index 37a197b02ce..edd06abdace 100644 --- a/fixtures/tuist_plugin/Tests/CreateFileTests/Test.swift +++ b/fixtures/tuist_plugin/Tests/CreateFileTests/Test.swift @@ -5,4 +5,4 @@ final class CreateFileTests: XCTestCase { func test_example() { XCTAssertEqual("CreateFile", "CreateFile") } -} \ No newline at end of file +} From 6e31dcf064379752241148baf8522b4d0fc5136c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Sat, 2 Mar 2024 13:16:31 +0100 Subject: [PATCH 144/509] Support for SPM only projects (#6011) * WIP: Initial SPM package support * Remove unused values * Fix tests * Add tests for RecursiveManifestLoader * Fix mise lint * Minor refactors * Fix build failures * Add docs * Locate package manifest from root --------- Co-authored-by: Daniele Formichelli --- .../TuistAcceptanceFixtures.swift | 3 + .../Models/Dependencies/PackageSettings.swift | 2 +- .../TuistKit/Utils/ManifestGraphLoader.swift | 46 +- .../Loaders/CachedManifestLoader.swift | 4 +- .../TuistLoader/Loaders/ManifestLoader.swift | 7 +- .../Loaders/RecursiveManifestLoader.swift | 63 +- .../SwiftPackageManagerGraphLoader.swift | 56 +- .../Workspace+ManifestMapper.swift | 2 +- .../PackageInfoMapper.swift | 606 ++++++------------ .../Utils/ManifestFilesLocator.swift | 11 +- .../Loaders/Mocks/MockManifestLoader.swift | 5 +- .../SwiftPackageManager/PackageInfo.swift | 22 +- .../MockSwiftPackageManagerController.swift | 1 + .../PackageInfo+TestData.swift | 9 + .../GenerateAcceptanceTests.swift | 11 + .../Loaders/ManifestLoaderTests.swift | 5 +- .../Loaders/CachedManifestLoaderTests.swift | 6 +- .../RecursiveManifestLoaderTests.swift | 97 ++- .../PackageInfoMapperTests.swift | 352 +++++----- .../PackageInfoTests.swift | 1 + .../SwiftPackageManagerControllerTests.swift | 2 +- .../Articles/Tuist/Users/project-structure.md | 12 +- fixtures/spm_package/.gitignore | 8 + fixtures/spm_package/Package.resolved | 14 + fixtures/spm_package/Package.swift | 39 ++ fixtures/spm_package/Sources/MyCLI/main.swift | 3 + .../Sources/MyPackage/MyPackage.swift | 7 + .../Tests/MyPackageTests/MyPackageTests.swift | 12 + fixtures/spm_package/Tuist/.gitkeep | 0 29 files changed, 745 insertions(+), 661 deletions(-) create mode 100644 fixtures/spm_package/.gitignore create mode 100644 fixtures/spm_package/Package.resolved create mode 100644 fixtures/spm_package/Package.swift create mode 100644 fixtures/spm_package/Sources/MyCLI/main.swift create mode 100644 fixtures/spm_package/Sources/MyPackage/MyPackage.swift create mode 100644 fixtures/spm_package/Tests/MyPackageTests/MyPackageTests.swift create mode 100644 fixtures/spm_package/Tuist/.gitkeep diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift index 88b1cce14be..c1483d86261 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift @@ -56,6 +56,7 @@ public enum TuistAcceptanceFixtures { case plugin case projectWithFileHeaderTemplate case projectWithInlineFileHeaderTemplate + case spmPackage case tuistPlugin case visionosApp case workspaceWithFileHeaderTemplate @@ -174,6 +175,8 @@ public enum TuistAcceptanceFixtures { return "project_with_file_header_template" case .projectWithInlineFileHeaderTemplate: return "project_with_inline_file_header_template" + case .spmPackage: + return "spm_package" case .tuistPlugin: return "tuist_plugin" case .visionosApp: diff --git a/Sources/TuistGraph/Models/Dependencies/PackageSettings.swift b/Sources/TuistGraph/Models/Dependencies/PackageSettings.swift index 7bb709d5ea8..17c1a5eba5c 100644 --- a/Sources/TuistGraph/Models/Dependencies/PackageSettings.swift +++ b/Sources/TuistGraph/Models/Dependencies/PackageSettings.swift @@ -2,7 +2,7 @@ import Foundation import TSCUtility /// Contains the description of custom SPM settings -public struct PackageSettings: Equatable { +public struct PackageSettings: Equatable, Codable { /// The custom `Product` types to be used for SPM targets. public let productTypes: [String: Product] diff --git a/Sources/TuistKit/Utils/ManifestGraphLoader.swift b/Sources/TuistKit/Utils/ManifestGraphLoader.swift index 09acc9c7cbd..140754a4248 100644 --- a/Sources/TuistKit/Utils/ManifestGraphLoader.swift +++ b/Sources/TuistKit/Utils/ManifestGraphLoader.swift @@ -35,6 +35,8 @@ public final class ManifestGraphLoader: ManifestGraphLoading { private let manifestLinter: ManifestLinting private let workspaceMapper: WorkspaceMapping private let graphMapper: GraphMapping + private let packageSettingsLoader: PackageSettingsLoading + private let manifestFilesLocator: ManifestFilesLocating public convenience init( manifestLoader: ManifestLoading, @@ -54,7 +56,9 @@ public final class ManifestGraphLoader: ManifestGraphLoading { graphLoaderLinter: CircularDependencyLinter(), manifestLinter: ManifestLinter(), workspaceMapper: workspaceMapper, - graphMapper: graphMapper + graphMapper: graphMapper, + packageSettingsLoader: PackageSettingsLoader(manifestLoader: manifestLoader), + manifestFilesLocator: ManifestFilesLocator() ) } @@ -69,7 +73,9 @@ public final class ManifestGraphLoader: ManifestGraphLoading { graphLoaderLinter: CircularDependencyLinting, manifestLinter: ManifestLinting, workspaceMapper: WorkspaceMapping, - graphMapper: GraphMapping + graphMapper: GraphMapping, + packageSettingsLoader: PackageSettingsLoading, + manifestFilesLocator: ManifestFilesLocating ) { self.configLoader = configLoader self.manifestLoader = manifestLoader @@ -82,25 +88,43 @@ public final class ManifestGraphLoader: ManifestGraphLoading { self.manifestLinter = manifestLinter self.workspaceMapper = workspaceMapper self.graphMapper = graphMapper + self.packageSettingsLoader = packageSettingsLoader + self.manifestFilesLocator = manifestFilesLocator } // swiftlint:disable:next large_tuple public func load(path: AbsolutePath) async throws -> (Graph, [SideEffectDescriptor], [LintingIssue]) { - try manifestLoader.validateHasProjectOrWorkspaceManifest(at: path) + try manifestLoader.validateHasRootManifest(at: path) // Load Plugins let plugins = try await loadPlugins(at: path) // Load DependenciesGraph - let dependenciesGraph = try converter.convert( - manifest: try swiftPackageManagerGraphLoader.load( - at: path, - plugins: plugins - ), - path: path - ) - let allManifests = try recursiveManifestLoader.loadWorkspace(at: path) + let dependenciesGraph: TuistGraph.DependenciesGraph + let packageSettings: TuistGraph.PackageSettings? + if let packagePath = manifestFilesLocator.locatePackageManifest(at: path) { + let loadedPackageSettings = try packageSettingsLoader.loadPackageSettings( + at: packagePath.parentDirectory, + with: plugins + ) + dependenciesGraph = try converter.convert( + manifest: try swiftPackageManagerGraphLoader.load( + packagePath: packagePath, + packageSettings: loadedPackageSettings + ), + path: path + ) + packageSettings = loadedPackageSettings + } else { + packageSettings = nil + dependenciesGraph = .none + } + + let allManifests = try recursiveManifestLoader.loadWorkspace( + at: path, + packageSettings: packageSettings + ) let (workspaceModels, manifestProjects) = ( try converter.convert(manifest: allManifests.workspace, path: allManifests.path), allManifests.projects diff --git a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift index 2bfe5f7b75b..e09faaa69c3 100644 --- a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift @@ -105,8 +105,8 @@ public class CachedManifestLoader: ManifestLoading { manifestLoader.manifests(at: path) } - public func validateHasProjectOrWorkspaceManifest(at path: AbsolutePath) throws { - try manifestLoader.validateHasProjectOrWorkspaceManifest(at: path) + public func validateHasRootManifest(at path: AbsolutePath) throws { + try manifestLoader.validateHasRootManifest(at: path) } public func register(plugins: Plugins) throws { diff --git a/Sources/TuistLoader/Loaders/ManifestLoader.swift b/Sources/TuistLoader/Loaders/ManifestLoader.swift index e334beb60ad..64bff38ef14 100644 --- a/Sources/TuistLoader/Loaders/ManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/ManifestLoader.swift @@ -87,7 +87,7 @@ public protocol ManifestLoading { func manifests(at path: AbsolutePath) -> Set /// Verifies that there is a project or workspace manifest at the given path, or throws an error otherwise. - func validateHasProjectOrWorkspaceManifest(at path: AbsolutePath) throws + func validateHasRootManifest(at path: AbsolutePath) throws /// Registers plugins that will be used within the manifest loading process. /// - Parameter plugins: The plugins to register. @@ -149,9 +149,10 @@ public class ManifestLoader: ManifestLoading { Set(manifestFilesLocator.locateManifests(at: path).map(\.0)) } - public func validateHasProjectOrWorkspaceManifest(at path: AbsolutePath) throws { + public func validateHasRootManifest(at path: AbsolutePath) throws { let manifests = manifests(at: path) - guard manifests.contains(.workspace) || manifests.contains(.project) else { + let rootManifests: Set = [.workspace, .project, .package] + guard !manifests.intersection(rootManifests).isEmpty else { throw ManifestLoaderError.manifestNotFound(path) } } diff --git a/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift b/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift index 56e20c7b7b5..e212622e267 100644 --- a/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift @@ -6,7 +6,10 @@ import TuistSupport /// A component that can load a manifest and all its (transitive) manifest dependencies public protocol RecursiveManifestLoading { - func loadWorkspace(at path: AbsolutePath) throws -> LoadedWorkspace + func loadWorkspace( + at path: AbsolutePath, + packageSettings: TuistGraph.PackageSettings? + ) throws -> LoadedWorkspace } public struct LoadedProjects { @@ -22,16 +25,22 @@ public struct LoadedWorkspace { public class RecursiveManifestLoader: RecursiveManifestLoading { private let manifestLoader: ManifestLoading private let fileHandler: FileHandling + private let packageInfoMapper: PackageInfoMapping public init( manifestLoader: ManifestLoading = ManifestLoader(), - fileHandler: FileHandling = FileHandler.shared + fileHandler: FileHandling = FileHandler.shared, + packageInfoMapper: PackageInfoMapping = PackageInfoMapper() ) { self.manifestLoader = manifestLoader self.fileHandler = fileHandler + self.packageInfoMapper = packageInfoMapper } - public func loadWorkspace(at path: AbsolutePath) throws -> LoadedWorkspace { + public func loadWorkspace( + at path: AbsolutePath, + packageSettings: TuistGraph.PackageSettings? + ) throws -> LoadedWorkspace { let loadedWorkspace: ProjectDescription.Workspace? do { loadedWorkspace = try manifestLoader.loadWorkspace(at: path) @@ -51,7 +60,23 @@ public class RecursiveManifestLoader: RecursiveManifestLoading { manifestLoader.manifests(at: $0).contains(.project) } - let projects = try loadProjects(paths: projectPaths) + let packagePaths = try projectSearchPaths.map { + try generatorPaths.resolve(path: $0) + }.flatMap { + fileHandler.glob($0, glob: "") + }.filter { + fileHandler.isFolder($0) + }.filter { + let manifests = manifestLoader.manifests(at: $0) + return manifests.contains(.package) && !manifests.contains(.project) && !manifests.contains(.workspace) + } + + let packageProjects = try loadPackageProjects(paths: packagePaths, packageSettings: packageSettings) + + let projects = LoadedProjects(projects: try loadProjects(paths: projectPaths).projects.merging( + packageProjects.projects, + uniquingKeysWith: { _, newValue in newValue } + )) let workspace: ProjectDescription.Workspace if let loadedWorkspace { workspace = loadedWorkspace @@ -69,6 +94,36 @@ public class RecursiveManifestLoader: RecursiveManifestLoading { // MARK: - Private + private func loadPackageProjects( + paths: [AbsolutePath], + packageSettings: TuistGraph.PackageSettings? + ) throws -> LoadedProjects { + guard let packageSettings else { return LoadedProjects(projects: [:]) } + var cache = [AbsolutePath: ProjectDescription.Project]() + + var paths = Set(paths) + while !paths.isEmpty { + paths.subtract(cache.keys) + let projects = try Array(paths).map(context: ExecutionContext.concurrent) { + let packageInfo = try manifestLoader.loadPackage(at: $0) + return try packageInfoMapper.map( + packageInfo: packageInfo, + path: $0, + packageType: .local, + packageSettings: packageSettings, + packageToProject: [:] + )! + } + var newDependenciesPaths = Set() + for (path, project) in zip(paths, projects) { + cache[path] = project + newDependenciesPaths.formUnion(try dependencyPaths(for: project, path: path)) + } + paths = newDependenciesPaths + } + return LoadedProjects(projects: cache) + } + private func loadProjects(paths: [AbsolutePath]) throws -> LoadedProjects { var cache = [AbsolutePath: ProjectDescription.Project]() diff --git a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift index 0a7b146f3c9..cfc5b1187e8 100644 --- a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift +++ b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift @@ -47,8 +47,8 @@ public protocol SwiftPackageManagerGraphLoading { /// - Parameter path: The path to the directory that contains the `checkouts` directory where `SwiftPackageManager` installed /// dependencies. func load( - at path: AbsolutePath, - plugins: Plugins + packagePath: AbsolutePath, + packageSettings: TuistGraph.PackageSettings ) throws -> TuistCore.DependenciesGraph } @@ -57,46 +57,24 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi private let packageInfoMapper: PackageInfoMapping private let manifestLoader: ManifestLoading private let fileHandler: FileHandling - private let packageSettingsLoader: PackageSettingsLoading - private let manifestFilesLocator: ManifestFilesLocating - public convenience init( - manifestLoader: ManifestLoading - ) { - self.init( - manifestLoader: manifestLoader, - packageSettingsLoader: PackageSettingsLoader(manifestLoader: manifestLoader) - ) - } - - init( + public init( swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController(), packageInfoMapper: PackageInfoMapping = PackageInfoMapper(), manifestLoader: ManifestLoading = ManifestLoader(), - fileHandler: FileHandling = FileHandler.shared, - packageSettingsLoader: PackageSettingsLoading = PackageSettingsLoader(), - manifestFilesLocator: ManifestFilesLocating = ManifestFilesLocator() + fileHandler: FileHandling = FileHandler.shared ) { self.swiftPackageManagerController = swiftPackageManagerController self.packageInfoMapper = packageInfoMapper self.manifestLoader = manifestLoader self.fileHandler = fileHandler - self.packageSettingsLoader = packageSettingsLoader - self.manifestFilesLocator = manifestFilesLocator } // swiftlint:disable:next function_body_length public func load( - at path: AbsolutePath, - plugins: Plugins + packagePath: AbsolutePath, + packageSettings: TuistGraph.PackageSettings ) throws -> TuistCore.DependenciesGraph { - guard let packagePath = manifestFilesLocator.locatePackageManifest(at: path) - else { - return .none - } - - let packageSettings = try packageSettingsLoader.loadPackageSettings(at: packagePath.parentDirectory, with: plugins) - let path = packagePath.parentDirectory.appending( component: Constants.SwiftPackageManager.packageBuildDirectoryName ) @@ -148,7 +126,6 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi ) } - let idToPackage: [String: String] = Dictionary(uniqueKeysWithValues: packageInfos.map { ($0.id, $0.name) }) let packageToProject = Dictionary(uniqueKeysWithValues: packageInfos.map { ($0.name, $0.folder) }) let packageInfoDictionary = Dictionary(uniqueKeysWithValues: packageInfos.map { ($0.name, $0.info) }) let packageToFolder = Dictionary(uniqueKeysWithValues: packageInfos.map { ($0.name, $0.folder) }) @@ -156,9 +133,8 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi ($0.name, $0.targetToArtifactPaths) }) - let preprocessInfo = try packageInfoMapper.preprocess( + let externalDependencies = try packageInfoMapper.resolveExternalDependencies( packageInfos: packageInfoDictionary, - idToPackage: idToPackage, packageToFolder: packageToFolder, packageToTargetsToArtifactPaths: packageToTargetsToArtifactPaths ) @@ -166,26 +142,16 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi let externalProjects: [Path: ProjectDescription.Project] = try packageInfos.reduce(into: [:]) { result, packageInfo in let manifest = try packageInfoMapper.map( packageInfo: packageInfo.info, - packageInfos: packageInfoDictionary, - name: packageInfo.name, path: packageInfo.folder, - productTypes: packageSettings.productTypes, - baseSettings: packageSettings.baseSettings, - targetSettings: packageSettings.targetSettings, - projectOptions: packageSettings.projectOptions[packageInfo.name], - minDeploymentTargets: preprocessInfo.platformToMinDeploymentTarget, - targetToProducts: preprocessInfo.targetToProducts, - targetToResolvedDependencies: preprocessInfo.targetToResolvedDependencies, - macroDependencies: preprocessInfo.macroDependencies, - targetToModuleMap: preprocessInfo.targetToModuleMap, - packageToProject: packageToProject, - swiftToolsVersion: packageSettings.swiftToolsVersion + packageType: .external(artifactPaths: packageToTargetsToArtifactPaths[packageInfo.name] ?? [:]), + packageSettings: packageSettings, + packageToProject: packageToProject ) result[.path(packageInfo.folder.pathString)] = manifest } return DependenciesGraph( - externalDependencies: preprocessInfo.productToExternalDependencies, + externalDependencies: externalDependencies, externalProjects: externalProjects ) } diff --git a/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift index f46db00337c..56d97e7fc83 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift @@ -22,7 +22,7 @@ extension TuistGraph.Workspace { .lazy .filter(FileHandler.shared.isFolder) .filter { - manifestLoader.manifests(at: $0).contains(.project) + manifestLoader.manifests(at: $0).contains(where: { $0 == .package || $0 == .project }) } if projects.isEmpty { diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 73b0d37899e..ffc6a9a5be7 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -1,4 +1,5 @@ import Foundation +import Mockable import ProjectDescription import TSCBasic import TSCUtility @@ -10,7 +11,7 @@ import TuistSupport enum PackageInfoMapperError: FatalError, Equatable { /// Thrown when the default path folder is not present. - case defaultPathNotFound(AbsolutePath, String) + case defaultPathNotFound(AbsolutePath, String, [String]) /// Thrown when the parsing of minimum deployment target failed. case minDeploymentTargetParsingFailed(ProjectDescription.Platform) @@ -59,10 +60,10 @@ enum PackageInfoMapperError: FatalError, Equatable { /// Error description. var description: String { switch self { - case let .defaultPathNotFound(packageFolder, targetName): + case let .defaultPathNotFound(packageFolder, targetName, predefinedPaths): return """ Default source path not found for target \(targetName) in package at \(packageFolder.pathString). \ - Source path must be one of \(PackageInfoMapper.predefinedSourceDirectories.map { "\($0)/\(targetName)" }) + Source path must be one of \(predefinedPaths.map { "\($0)/\(targetName)" }) """ case let .minDeploymentTargetParsingFailed(platform): return "The minimum deployment target for \(platform) platform cannot be parsed." @@ -86,98 +87,60 @@ enum PackageInfoMapperError: FatalError, Equatable { } } +public enum PackageType { + case local + case external(artifactPaths: [String: AbsolutePath]) +} + // MARK: - PackageInfo Mapper /// Protocol that allows to map a `PackageInfo` to a `ProjectDescription.Project`. +@Mockable public protocol PackageInfoMapping { - /// Preprocesses SwiftPackageManager dependencies. - /// - Parameters: - /// - packageInfos: All available `PackageInfo`s - /// - idToPackage: Mapping from an identifier to its package - /// - packageToFolder: Mapping from a package name to its local folder - /// - packageToTargetsToArtifactPaths: Mapping from a package name its targets' names to artifacts' paths - /// - platforms: The configured platforms + /// Resolves external SwiftPackageManager dependencies. /// - Returns: Mapped project - func preprocess( + func resolveExternalDependencies( packageInfos: [String: PackageInfo], - idToPackage: [String: String], packageToFolder: [String: AbsolutePath], packageToTargetsToArtifactPaths: [String: [String: AbsolutePath]] - ) throws -> PackageInfoMapper.PreprocessInfo + ) throws -> [String: [ProjectDescription.TargetDependency]] /// Maps a `PackageInfo` to a `ProjectDescription.Project`. - /// - Parameters: - /// - packageInfo: `PackageInfo` to be mapped - /// - packageInfos: All available `PackageInfo`s - /// - name: Name of the package - /// - path: Path of the package - /// - productTypes: Product type mapping - /// - baseSettings: Base settings - /// - targetSettings: Settings to apply to denoted targets - /// - configuration: Configure automatic schemes and resource accessors generation for Swift Package - /// - projectOptions: Additional options related to the `Project` - /// - targetToPlatform: Mapping from a target name to its platform - /// - minDeploymentTargets: Minimum support deployment target per platform - /// - platforms: Set of supported platforms - /// - targetToProducts: Mapping from a target name to its products - /// - targetToResolvedDependencies: Mapping from a target name to its dependencies - /// - targetToModuleMap: Mapping from a target name to its module map - /// - packageToProject: Mapping from a package name to its path - /// - swiftToolsVersion: The version of Swift tools that will be used to map dependencies /// - Returns: Mapped project func map( packageInfo: PackageInfo, - packageInfos: [String: PackageInfo], - name: String, path: AbsolutePath, - productTypes: [String: TuistGraph.Product], - baseSettings: TuistGraph.Settings, - targetSettings: [String: TuistGraph.SettingsDictionary], - projectOptions: TuistGraph.Project.Options?, - minDeploymentTargets: ProjectDescription.DeploymentTargets, - targetToProducts: [String: Set], - targetToResolvedDependencies: [String: [PackageInfoMapper.ResolvedDependency]], - macroDependencies: Set, - targetToModuleMap: [String: ModuleMap], - packageToProject: [String: AbsolutePath], - swiftToolsVersion: TSCUtility.Version? + packageType: PackageType, + packageSettings: TuistGraph.PackageSettings, + packageToProject: [String: AbsolutePath] ) throws -> ProjectDescription.Project? } // swiftlint:disable:next type_body_length public final class PackageInfoMapper: PackageInfoMapping { - public struct PreprocessInfo { - public let platformToMinDeploymentTarget: ProjectDescription.DeploymentTargets - public let productToExternalDependencies: [String: [ProjectDescription.TargetDependency]] - public let targetToProducts: [String: Set] - public let targetToResolvedDependencies: [String: [PackageInfoMapper.ResolvedDependency]] - public let targetToModuleMap: [String: ModuleMap] - public let macroDependencies: Set - } - // Predefined source directories, in order of preference. // https://github.com/apple/swift-package-manager/blob/751f0b2a00276be2c21c074f4b21d952eaabb93b/Sources/PackageLoading/PackageBuilder.swift#L488 fileprivate static let predefinedSourceDirectories = ["Sources", "Source", "src", "srcs"] - fileprivate let moduleMapGenerator: SwiftPackageManagerModuleMapGenerating + fileprivate static let predefinedTestDirectories = ["Tests", "Sources", "Source", "src", "srcs"] + private let moduleMapGenerator: SwiftPackageManagerModuleMapGenerating - public init(moduleMapGenerator: SwiftPackageManagerModuleMapGenerating = SwiftPackageManagerModuleMapGenerator()) { + public init( + moduleMapGenerator: SwiftPackageManagerModuleMapGenerating = SwiftPackageManagerModuleMapGenerator() + ) { self.moduleMapGenerator = moduleMapGenerator } /// Resolves all SwiftPackageManager dependencies. /// - Parameters: /// - packageInfos: All available `PackageInfo`s - /// - idToPackage: Mapping from an identifier to its package /// - packageToFolder: Mapping from a package name to its local folder /// - packageToTargetsToArtifactPaths: Mapping from a package name its targets' names to artifacts' paths - /// - platforms: The configured platforms /// - Returns: Mapped project - public func preprocess( // swiftlint:disable:this function_body_length + public func resolveExternalDependencies( packageInfos: [String: PackageInfo], - idToPackage: [String: String], packageToFolder: [String: AbsolutePath], packageToTargetsToArtifactPaths: [String: [String: AbsolutePath]] - ) throws -> PreprocessInfo { + ) throws -> [String: [ProjectDescription.TargetDependency]] { let targetDependencyToFramework: [String: Path] = try packageInfos.reduce(into: [:]) { result, packageInfo in try packageInfo.value.targets.forEach { target in guard target.type == .binary else { return } @@ -198,71 +161,7 @@ public final class PackageInfoMapper: PackageInfoMapping { } } - let targetToProducts: [String: Set] = packageInfos.values.reduce(into: [:]) { result, packageInfo in - for product in packageInfo.products { - var targetsToProcess = Set(product.targets) - while !targetsToProcess.isEmpty { - let target = targetsToProcess.removeFirst() - let alreadyProcessed = result[target]?.contains(product) ?? false - guard !alreadyProcessed else { - continue - } - result[target, default: []].insert(product) - let dependencies = packageInfo.targets.first(where: { $0.name == target })!.dependencies - for dependency in dependencies { - switch dependency { - case let .target(name, _): - targetsToProcess.insert(name) - case let .byName(name, _) where packageInfo.targets.contains(where: { $0.name == name }): - targetsToProcess.insert(name) - case .byName, .product: - continue - } - } - } - } - } - - let resolvedDependencies: [String: [ResolvedDependency]] = try packageInfos.values - .reduce(into: [:]) { result, packageInfo in - try packageInfo.targets - .filter { - targetToProducts[$0.name] != nil - } - .forEach { target in - guard result[target.name] == nil else { return } - result[target.name] = try ResolvedDependency.from( - dependencies: target.dependencies, - packageInfo: packageInfo, - packageInfos: packageInfos, - idToPackage: idToPackage, - targetDependencyToFramework: targetDependencyToFramework - ) - } - } - - var macroTargetsAndDescendants = Set(packageInfos.values.flatMap { $0.targets.filter { $0.type == .macro }.map(\.name) }) - var visited: Set = [] - var macroDependencies = Set() - - while !macroTargetsAndDescendants.isEmpty { - guard let targetName = macroTargetsAndDescendants.popFirst(), !visited.contains(targetName) else { - continue - } - - visited.insert(targetName) - - for dependency in resolvedDependencies[targetName] ?? [] { - macroDependencies.insert(dependency) - let dependencyTargetName = dependency.targetName - if let dependencyTargetName, !visited.contains(dependencyTargetName) { - macroTargetsAndDescendants.insert(dependencyTargetName) - } - } - } - - var externalDependencies: [String: [ProjectDescription.TargetDependency]] = .init() - externalDependencies = try packageInfos + return try packageInfos .reduce(into: [:]) { result, packageInfo in for product in packageInfo.value.products { result[product.name] = try product.targets.flatMap { target in @@ -292,49 +191,6 @@ public final class PackageInfoMapper: PackageInfoMapping { } } } - - let version = try Version(versionString: try System.shared.swiftVersion(), usesLenientParsing: true) - let minDeploymentTargets = ProjectDescription.DeploymentTargets.oldestVersions(for: version) - - let targetToModuleMap: [String: ModuleMap] - targetToModuleMap = try packageInfos.reduce(into: [:]) { result, packageInfo in - for target in packageInfo.value.targets { - switch target.type { - case .system: - /// System library targets assume the module map is located at the source directory root - /// https://github.com/apple/swift-package-manager/blob/main/Sources/PackageLoading/ModuleMapGenerator.swift - let packagePath = try target.basePath(packageFolder: packageToFolder[packageInfo.key]!) - let moduleMapPath = packagePath.appending(component: ModuleMap.filename) - - guard FileHandler.shared.exists(moduleMapPath), !FileHandler.shared.isFolder(moduleMapPath) else { - throw PackageInfoMapperError.modulemapMissing( - moduleMapPath: moduleMapPath.pathString, - package: packageInfo.key, - target: target.name - ) - } - - result[target.name] = ModuleMap.custom(moduleMapPath, umbrellaHeaderPath: nil) - case .regular: - result[target.name] = try moduleMapGenerator.generate( - packageDirectory: packageToFolder[packageInfo.key]!, - moduleName: target.name, - publicHeadersPath: target.publicHeadersPath(packageFolder: packageToFolder[packageInfo.key]!) - ) - default: - continue - } - } - } - - return .init( - platformToMinDeploymentTarget: minDeploymentTargets, - productToExternalDependencies: externalDependencies, - targetToProducts: targetToProducts, - targetToResolvedDependencies: resolvedDependencies, - targetToModuleMap: targetToModuleMap, - macroDependencies: macroDependencies - ) } /** @@ -389,23 +245,13 @@ public final class PackageInfoMapper: PackageInfoMapping { // swiftlint:disable:next function_body_length public func map( packageInfo: PackageInfo, - packageInfos: [String: PackageInfo], - name: String, path: AbsolutePath, - productTypes: [String: TuistGraph.Product], - baseSettings: TuistGraph.Settings, - targetSettings: [String: TuistGraph.SettingsDictionary], - projectOptions: TuistGraph.Project.Options?, - minDeploymentTargets: ProjectDescription.DeploymentTargets, - targetToProducts: [String: Set], - targetToResolvedDependencies: [String: [PackageInfoMapper.ResolvedDependency]], - macroDependencies: Set, - targetToModuleMap: [String: ModuleMap], - packageToProject: [String: AbsolutePath], - swiftToolsVersion: TSCUtility.Version? + packageType: PackageType, + packageSettings: TuistGraph.PackageSettings, + packageToProject: [String: AbsolutePath] ) throws -> ProjectDescription.Project? { // Hardcoded mapping for some well known libraries, until the logic can handle those properly - let productTypes = productTypes.merging( + let productTypes = packageSettings.productTypes.merging( // Force dynamic frameworks Dictionary( uniqueKeysWithValues: [ @@ -418,7 +264,7 @@ public final class PackageInfoMapper: PackageInfoMapping { uniquingKeysWith: { userDefined, _ in userDefined } ) - let targetSettings = targetSettings.merging( + let targetSettings = packageSettings.targetSettings.merging( // Force enable testing search paths Dictionary( uniqueKeysWithValues: [ @@ -442,29 +288,47 @@ public final class PackageInfoMapper: PackageInfoMapping { } ) // Setting the -package-name Swift compiler flag - let baseSettings = baseSettings.with(base: [ - "OTHER_SWIFT_FLAGS": ["$(inherited)", "-package-name", name], + let baseSettings = packageSettings.baseSettings.with(base: [ + "OTHER_SWIFT_FLAGS": ["$(inherited)", "-package-name", packageInfo.name], ]) + var targetToProducts: [String: Set] = [:] + for product in packageInfo.products { + var targetsToProcess = Set(product.targets) + while !targetsToProcess.isEmpty { + let target = targetsToProcess.removeFirst() + let alreadyProcessed = targetToProducts[target]?.contains(product) ?? false + guard !alreadyProcessed else { + continue + } + targetToProducts[target, default: []].insert(product) + let dependencies = packageInfo.targets.first(where: { $0.name == target })!.dependencies + for dependency in dependencies { + switch dependency { + case let .target(name, _): + targetsToProcess.insert(name) + case let .byName(name, _) where packageInfo.targets.contains(where: { $0.name == name }): + targetsToProcess.insert(name) + case .byName, .product: + continue + } + } + } + } + let targets: [ProjectDescription.Target] = try packageInfo.targets .compactMap { target -> ProjectDescription.Target? in - guard let products = targetToProducts[target.name] else { return nil } - - return try ProjectDescription.Target.from( + return try map( target: target, - products: products, - packageName: name, + products: targetToProducts[target.name] ?? Set(), packageInfo: packageInfo, - packageInfos: packageInfos, + packageType: packageType, + path: path, packageFolder: path, packageToProject: packageToProject, productTypes: productTypes, baseSettings: baseSettings, - targetSettings: targetSettings, - minDeploymentTargets: minDeploymentTargets, - targetToResolvedDependencies: targetToResolvedDependencies, - targetToModuleMap: targetToModuleMap, - macroDependencies: macroDependencies + targetSettings: targetSettings ) } @@ -473,20 +337,27 @@ public final class PackageInfoMapper: PackageInfoMapping { } let options: ProjectDescription.Project.Options - if let projectOptions { + if let projectOptions = packageSettings.projectOptions[packageInfo.name] { options = .from(manifest: projectOptions) } else { + let automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions + switch packageType { + case .external: + automaticSchemesOptions = .disabled + case .local: + automaticSchemesOptions = .enabled() + } options = .options( - automaticSchemesOptions: .disabled, + automaticSchemesOptions: automaticSchemesOptions, disableSynthesizedResourceAccessors: true ) } return ProjectDescription.Project( - name: name, + name: packageInfo.name, options: options, settings: packageInfo.projectSettings( - swiftToolsVersion: swiftToolsVersion, + swiftToolsVersion: packageSettings.swiftToolsVersion, buildConfigs: baseSettings.configurations.map { key, _ in key } ), targets: targets, @@ -497,27 +368,32 @@ public final class PackageInfoMapper: PackageInfoMapping { fileprivate class func sanitize(targetName: String) -> String { targetName.replacingOccurrences(of: ".", with: "_") } -} -extension ProjectDescription.Target { // swiftlint:disable:next function_body_length - fileprivate static func from( + private func map( target: PackageInfo.Target, products: Set, - packageName: String, packageInfo: PackageInfo, - packageInfos: [String: PackageInfo], + packageType: PackageType, + path: AbsolutePath, packageFolder: AbsolutePath, - packageToProject: [String: AbsolutePath], + packageToProject _: [String: AbsolutePath], productTypes: [String: TuistGraph.Product], baseSettings: TuistGraph.Settings, - targetSettings: [String: TuistGraph.SettingsDictionary], - minDeploymentTargets: ProjectDescription.DeploymentTargets, - targetToResolvedDependencies: [String: [PackageInfoMapper.ResolvedDependency]], - targetToModuleMap: [String: ModuleMap], - macroDependencies: Set - ) throws -> Self? { - guard target.type.isSupported else { + targetSettings: [String: TuistGraph.SettingsDictionary] + ) throws -> ProjectDescription.Target? { + switch target.type { + case .regular, .system, .macro: + break + case .test, .executable: + switch packageType { + case .external: + logger.debug("Target \(target.name) of type \(target.type) ignored") + return nil + case .local: + break + } + default: logger.debug("Target \(target.name) of type \(target.type) ignored") return nil } @@ -533,34 +409,52 @@ extension ProjectDescription.Target { return nil } - let path = try target.basePath(packageFolder: packageFolder) + let targetPath = try target.basePath(packageFolder: packageFolder) + + let moduleMap: ModuleMap? + switch target.type { + case .system: + /// System library targets assume the module map is located at the source directory root + /// https://github.com/apple/swift-package-manager/blob/main/Sources/PackageLoading/ModuleMapGenerator.swift + let packagePath = try target.basePath(packageFolder: path) + let moduleMapPath = packagePath.appending(component: ModuleMap.filename) + + guard FileHandler.shared.exists(moduleMapPath), !FileHandler.shared.isFolder(moduleMapPath) else { + throw PackageInfoMapperError.modulemapMissing( + moduleMapPath: moduleMapPath.pathString, + package: packageInfo.name, + target: target.name + ) + } - let moduleMap = targetToModuleMap[target.name] + moduleMap = ModuleMap.custom(moduleMapPath, umbrellaHeaderPath: nil) + case .regular: + moduleMap = try moduleMapGenerator.generate( + packageDirectory: path, + moduleName: target.name, + publicHeadersPath: target.publicHeadersPath(packageFolder: path) + ) + default: + moduleMap = nil + } var destinations: ProjectDescription.Destinations - if target.type == .macro { - destinations = Set([.mac]) - } else { + switch target.type { + case .macro, .executable: + destinations = Set([.mac]) + default: // All packages implicitly support all platforms destinations = Set(Destination.allCases) } - if macroDependencies.contains(where: { dependency in - switch dependency { - case let .externalTarget(_, targetName, _), .target(let targetName, condition: _): - return target.name == targetName - default: - return false - } - }) { - destinations.insert(.mac) - } + let version = try Version(versionString: try System.shared.swiftVersion(), usesLenientParsing: true) + let minDeploymentTargets = ProjectDescription.DeploymentTargets.oldestVersions(for: version) let deploymentTargets = try ProjectDescription.DeploymentTargets.from( minDeploymentTargets: minDeploymentTargets, package: packageInfo.platforms, destinations: destinations, - packageName: packageName + packageName: packageInfo.name ) var headers: ProjectDescription.Headers? @@ -572,14 +466,14 @@ extension ProjectDescription.Target { } if target.type.supportsSources { - sources = try SourceFilesList.from(sources: target.sources, path: path, excluding: target.exclude) + sources = try SourceFilesList.from(sources: target.sources, path: targetPath, excluding: target.exclude) } if target.type.supportsResources { resources = try ResourceFileElements.from( sources: target.sources, resources: target.resources, - path: path, + path: targetPath, excluding: target.exclude ) } @@ -587,26 +481,62 @@ extension ProjectDescription.Target { var dependencies: [ProjectDescription.TargetDependency] = [] if target.type.supportsDependencies { - let resolvedDependencies = targetToResolvedDependencies[target.name] ?? [] + let linkerDependencies: [ProjectDescription.TargetDependency] = target.settings.compactMap { setting in + do { + let condition = try ProjectDescription.PlatformCondition.from(setting.condition) + + switch (setting.tool, setting.name) { + case (.linker, .linkedFramework): + return .sdk(name: setting.value[0], type: .framework, status: .required, condition: condition) + case (.linker, .linkedLibrary): + return .sdk(name: setting.value[0], type: .library, status: .required, condition: condition) + case (.c, _), (.cxx, _), (_, .enableUpcomingFeature), (.swift, _), (.linker, .headerSearchPath), ( + .linker, + .define + ), + (.linker, .unsafeFlags), (_, .enableExperimentalFeature): + return nil + } + } catch { + return nil + } + } - dependencies = try ProjectDescription.TargetDependency.from( - resolvedDependencies: resolvedDependencies, - settings: target.settings, - packageToProject: packageToProject - ) + dependencies = try linkerDependencies + target.dependencies.map { + switch $0 { + case let .byName(name: name, condition: condition), let .product( + name: name, + package: _, + moduleAliases: _, + condition: condition + ), + let .target( + name: name, + condition: condition + ): + let platformCondition = try ProjectDescription.PlatformCondition.from(condition) + if let target = packageInfo.targets.first(where: { $0.name == name }) { + if target.type == .binary, case let .external(artifactPaths: artifactPaths) = packageType { + guard let artifactPath = artifactPaths[target.name] else { + throw PackageInfoMapperError.missingBinaryArtifact(package: packageInfo.name, target: target.name) + } + return .xcframework(path: .path(artifactPath.pathString), status: .required, condition: nil) + } + return .target(name: name, condition: platformCondition) + } else { + return .external(name: name, condition: platformCondition) + } + } + } } let settings = try Settings.from( target: target, - targetDestinations: destinations, packageFolder: packageFolder, - packageName: packageName, - packageInfos: packageInfos, - packageToProject: packageToProject, - targetToResolvedDependencies: targetToResolvedDependencies, + packageName: packageInfo.name, settings: target.settings, platforms: packageInfo.platforms, - targetToModuleMap: targetToModuleMap, + moduleMap: moduleMap, baseSettings: baseSettings, targetSettings: targetSettings ) @@ -706,8 +636,15 @@ extension ProjectDescription.Product { productTypes: [String: TuistGraph.Product] ) -> Self? { // Swift Macros are command line tools that run in the host (macOS) at compilation time. - if type == .macro { + switch type { + case .macro: return .macro + case .executable: + return .commandLineTool + case .test: + return .unitTests + default: + break } if let productType = productTypes[name] { @@ -715,8 +652,8 @@ extension ProjectDescription.Product { } var hasLibraryProducts = false - let product: ProjectDescription.Product? = products.map(\.type).reduce(nil) { result, productType in - switch productType { + let product: ProjectDescription.Product? = products.reduce(nil) { result, product in + switch product.type { case let .library(type): hasLibraryProducts = true switch type { @@ -928,15 +865,11 @@ extension ProjectDescription.Settings { // swiftlint:disable:next function_body_length fileprivate static func from( target: PackageInfo.Target, - targetDestinations _: ProjectDescription.Destinations, packageFolder: AbsolutePath, - packageName: String, - packageInfos: [String: PackageInfo], - packageToProject: [String: AbsolutePath], - targetToResolvedDependencies: [String: [PackageInfoMapper.ResolvedDependency]], + packageName _: String, settings: [PackageInfo.Target.TargetBuildSettingDescription.Setting], platforms: [PackageInfo.Platform], - targetToModuleMap: [String: ModuleMap], + moduleMap: ModuleMap?, baseSettings: TuistGraph.Settings, targetSettings: [String: TuistGraph.SettingsDictionary] ) throws -> Self? { @@ -944,7 +877,6 @@ extension ProjectDescription.Settings { let mainRelativePath = mainPath.relative(to: packageFolder) var dependencyHeaderSearchPaths: [String] = [] - let moduleMap = targetToModuleMap[target.name] if let moduleMap { if moduleMap != .none, target.type != .system { let publicHeadersPath = try target.publicHeadersPath(packageFolder: packageFolder) @@ -953,30 +885,6 @@ extension ProjectDescription.Settings { } } - let allDependencies = Self.recursiveTargetDependencies( - of: target, - packageName: packageName, - packageInfos: packageInfos, - targetToResolvedDependencies: targetToResolvedDependencies - ) - - dependencyHeaderSearchPaths += try allDependencies - .compactMap { dependency in - // Add dependencies search paths if they require a modulemap - guard let packagePath = packageToProject[dependency.package] else { return nil } - let headersPath = try dependency.target.publicHeadersPath(packageFolder: packagePath) - // Not all the targets have module maps. For example, Swift Macro packages do not. - guard let moduleMap = targetToModuleMap[dependency.target.name] else { return nil } - - switch moduleMap { - case .none, .header: - return nil - case .directory, .custom: - return "$(SRCROOT)/\(headersPath.relative(to: packageFolder))" - } - } - .sorted() - var settingsDictionary: TuistGraph.SettingsDictionary = [ // Xcode settings configured by SPM by default "ALWAYS_SEARCH_USER_PATHS": "YES", @@ -1037,41 +945,6 @@ extension ProjectDescription.Settings { let package: String let target: PackageInfo.Target } - - fileprivate static func recursiveTargetDependencies( - of target: PackageInfo.Target, - packageName: String, - packageInfos: [String: PackageInfo], - targetToResolvedDependencies: [String: [PackageInfoMapper.ResolvedDependency]] - ) -> Set { - let result = transitiveClosure( - [PackageTarget(package: packageName, target: target)], - successors: { packageTarget in - let resolvedDependencies = targetToResolvedDependencies[packageTarget.target.name] ?? [] - return resolvedDependencies.flatMap { resolvedDependency -> [PackageTarget] in - switch resolvedDependency { - case let .target(name, _): - guard let packageInfo = packageInfos[packageTarget.package], - let target = packageInfo.targets.first(where: { $0.name == name }) - else { - return [] - } - return [PackageTarget(package: packageTarget.package, target: target)] - case let .externalTarget(package, target, _): - guard let packageInfo = packageInfos[package] else { return [] } - return packageInfo.targets - .filter { $0.name == target } - .map { - PackageTarget(package: package, target: $0) - } - case .xcframework: - return [] - } - } - } - ) - return result - } } extension ProjectDescription.PackagePlatform { @@ -1260,11 +1133,18 @@ extension PackageInfo.Target { if let path { return packageFolder.appending(try RelativePath(validating: path)) } else { - let firstMatchingPath = PackageInfoMapper.predefinedSourceDirectories + let predefinedDirectories: [String] + switch type { + case .test: + predefinedDirectories = PackageInfoMapper.predefinedTestDirectories + default: + predefinedDirectories = PackageInfoMapper.predefinedSourceDirectories + } + let firstMatchingPath = predefinedDirectories .map { packageFolder.appending(components: [$0, name]) } .first(where: { FileHandler.shared.exists($0) }) guard let mainPath = firstMatchingPath else { - throw PackageInfoMapperError.defaultPathNotFound(packageFolder, name) + throw PackageInfoMapperError.defaultPathNotFound(packageFolder, name, predefinedDirectories) } return mainPath } @@ -1277,29 +1157,11 @@ extension PackageInfo.Target { } extension PackageInfoMapper { - public enum ResolvedDependency: Equatable, Hashable { + public enum ResolvedDependency: Equatable { case target(name: String, condition: ProjectDescription.PlatformCondition? = nil) case xcframework(path: Path, condition: ProjectDescription.PlatformCondition? = nil) case externalTarget(package: String, target: String, condition: ProjectDescription.PlatformCondition? = nil) - public func hash(into hasher: inout Hasher) { - switch self { - case let .target(name, condition): - hasher.combine("target") - hasher.combine(name) - hasher.combine(condition) - case let .xcframework(path, condition): - hasher.combine("package") - hasher.combine(path) - hasher.combine(condition) - case let .externalTarget(package, target, condition): - hasher.combine("externalTarget") - hasher.combine(package) - hasher.combine(target) - hasher.combine(condition) - } - } - fileprivate var condition: ProjectDescription.PlatformCondition? { switch self { case let .target(_, condition): @@ -1320,55 +1182,6 @@ extension PackageInfoMapper { } } - fileprivate static func from( - dependencies: [PackageInfo.Target.Dependency], - packageInfo: PackageInfo, - packageInfos: [String: PackageInfo], - idToPackage: [String: String], - targetDependencyToFramework: [String: Path] - ) throws -> [ResolvedDependency] { - try dependencies.flatMap { dependency -> [Self] in - switch dependency { - case let .target(name, condition): - return Self.fromTarget( - name: name, - targetDependencyToFramework: targetDependencyToFramework, - condition: condition - ) - case let .product(name, package, _, condition): - return try Self.fromProduct( - package: idToPackage[package.lowercased()] ?? package, - product: name, - packageInfos: packageInfos, - targetDependencyToFramework: targetDependencyToFramework, - condition: condition - ) - case let .byName(name, condition): - if packageInfo.targets.contains(where: { $0.name == name }) { - return Self.fromTarget( - name: name, - targetDependencyToFramework: targetDependencyToFramework, - condition: condition - ) - } else { - guard let packageNameAndInfo = packageInfos - .first(where: { $0.value.products.contains { $0.name == name } }) - else { - throw PackageInfoMapperError.unknownByNameDependency(name) - } - - return try Self.fromProduct( - package: packageNameAndInfo.key, - product: name, - packageInfos: packageInfos, - targetDependencyToFramework: targetDependencyToFramework, - condition: condition - ) - } - } - } - } - fileprivate static func fromTarget( name: String, targetDependencyToFramework: [String: Path], @@ -1386,35 +1199,6 @@ extension PackageInfoMapper { return [] } } - - private static func fromProduct( - package: String, - product: String, - packageInfos: [String: PackageInfo], - targetDependencyToFramework: [String: Path], - condition packageConditionDescription: PackageInfo.PackageConditionDescription? - ) throws -> [Self] { - guard let packageProduct = packageInfos[package]?.products.first(where: { $0.name == product }) else { - throw PackageInfoMapperError.unknownProductDependency(product, package) - } - do { - let condition = try ProjectDescription.PlatformCondition.from(packageConditionDescription) - - return packageProduct.targets.map { name in - if let framework = targetDependencyToFramework[name] { - return .xcframework(path: framework, condition: condition) - } else { - return .externalTarget( - package: package, - target: PackageInfoMapper.sanitize(targetName: name), - condition: condition - ) - } - } - } catch { - return [] - } - } } } diff --git a/Sources/TuistLoader/Utils/ManifestFilesLocator.swift b/Sources/TuistLoader/Utils/ManifestFilesLocator.swift index c6dbef64315..6cfb31f51fe 100644 --- a/Sources/TuistLoader/Utils/ManifestFilesLocator.swift +++ b/Sources/TuistLoader/Utils/ManifestFilesLocator.swift @@ -193,9 +193,14 @@ public final class ManifestFilesLocator: ManifestFilesLocating { } public func locatePackageManifest(at locatingPath: AbsolutePath) -> AbsolutePath? { - guard let tuistDirectory = traverseAndLocateTuistDirectory(at: locatingPath) else { return nil } - let defaultPackageSwiftPath = tuistDirectory.appending(component: Constants.SwiftPackageManager.packageSwiftName) - let rootPackageSwiftPath = tuistDirectory.parentDirectory + guard let rootDirectory = rootDirectoryLocator.locate(from: locatingPath) else { return nil } + let defaultPackageSwiftPath = rootDirectory.appending( + components: [ + Constants.tuistDirectoryName, + Constants.SwiftPackageManager.packageSwiftName, + ] + ) + let rootPackageSwiftPath = rootDirectory .appending(component: Constants.SwiftPackageManager.packageSwiftName) if fileHandler.exists(defaultPackageSwiftPath) { return defaultPackageSwiftPath diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift index 4507029f86b..2f1de8baa0b 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift @@ -49,9 +49,10 @@ public final class MockManifestLoader: ManifestLoading { return manifestsAtStub?(path) ?? Set() } - public func validateHasProjectOrWorkspaceManifest(at path: AbsolutePath) throws { + public func validateHasRootManifest(at path: AbsolutePath) throws { let manifests = manifests(at: path) - guard manifests.contains(.workspace) || manifests.contains(.project) else { + let rootManifests: Set = [.workspace, .project, .package] + guard !manifests.intersection(rootManifests).isEmpty else { throw ManifestLoaderError.manifestNotFound(path) } } diff --git a/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift b/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift index 99d5824e1f1..f17e0e2661a 100644 --- a/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift +++ b/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift @@ -1,4 +1,5 @@ import ProjectDescription +import TSCBasic import TSCUtility // MARK: - PackageInfo @@ -7,6 +8,9 @@ import TSCUtility /// It decodes data encoded from Manifest.swift: https://github.com/apple/swift-package-manager/blob/06f9b30f4593940272f57f6284e5614d817d2f22/Sources/PackageModel/Manifest.swift#L372-L409 /// Fields not needed by tuist are commented out and not decoded at all. public struct PackageInfo: Hashable { + /// The name of the package. + public let name: String + /// The products declared in the manifest. public let products: [Product] @@ -27,9 +31,6 @@ public struct PackageInfo: Hashable { // Ignored fields - // /// The name of the package. - // let name: String - // /// The tools version declared in the manifest. // let toolsVersion: ToolsVersion @@ -46,6 +47,7 @@ public struct PackageInfo: Hashable { // let packageKind: PackageReference.Kind public init( + name: String, products: [Product], targets: [Target], platforms: [Platform], @@ -53,6 +55,7 @@ public struct PackageInfo: Hashable { cxxLanguageStandard: String?, swiftLanguageVersions: [TSCUtility.Version]? ) { + self.name = name self.products = products self.targets = targets self.platforms = platforms @@ -489,11 +492,12 @@ extension PackageInfo.Target { extension PackageInfo: Codable { private enum CodingKeys: String, CodingKey { - case products, targets, platforms, cLanguageStandard, cxxLanguageStandard, swiftLanguageVersions + case name, products, targets, platforms, cLanguageStandard, cxxLanguageStandard, swiftLanguageVersions } public init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) + name = try values.decode(String.self, forKey: .name) products = try values.decode([Product].self, forKey: .products) targets = try values.decode([Target].self, forKey: .targets) platforms = try values.decode([Platform].self, forKey: .platforms) @@ -608,16 +612,6 @@ extension PackageInfo.Product.ProductType: Codable { } extension PackageInfo.Target.TargetType { - /// Defines if the target would be processed when processing the package - public var isSupported: Bool { - switch self { - case .regular, .system, .macro: - return true - default: - return false - } - } - /// Defines if target may have a public headers path /// Based on preconditions in https://github.com/apple/swift-package-manager/blob/main/Sources/PackageDescription/Target.swift public var supportsPublicHeaderPath: Bool { diff --git a/Sources/TuistSupportTesting/SwiftPackageManager/MockSwiftPackageManagerController.swift b/Sources/TuistSupportTesting/SwiftPackageManager/MockSwiftPackageManagerController.swift index fc59a7c3060..30f6cd2e995 100644 --- a/Sources/TuistSupportTesting/SwiftPackageManager/MockSwiftPackageManagerController.swift +++ b/Sources/TuistSupportTesting/SwiftPackageManager/MockSwiftPackageManagerController.swift @@ -39,6 +39,7 @@ public final class MockSwiftPackageManagerController: SwiftPackageManagerControl invokedLoadPackageInfo = true return try loadPackageInfoStub?(path) ?? .init( + name: "Package", products: [], targets: [], platforms: [], diff --git a/Sources/TuistSupportTesting/SwiftPackageManager/PackageInfo+TestData.swift b/Sources/TuistSupportTesting/SwiftPackageManager/PackageInfo+TestData.swift index 6e54d165da5..29d27b3a09c 100644 --- a/Sources/TuistSupportTesting/SwiftPackageManager/PackageInfo+TestData.swift +++ b/Sources/TuistSupportTesting/SwiftPackageManager/PackageInfo+TestData.swift @@ -7,6 +7,7 @@ import TuistGraph extension PackageInfo { public static func test( + name: String = "Package", products: [Product] = [], targets: [Target] = [], platforms: [Platform] = [], @@ -15,6 +16,7 @@ extension PackageInfo { swiftLanguageVersions: [TSCUtility.Version]? = nil ) -> Self { .init( + name: name, products: products, targets: targets, platforms: platforms, @@ -576,6 +578,7 @@ extension PackageInfo { public static var test: PackageInfo { .init( + name: "tuist", products: [ .init(name: "Tuist", type: .library(.static), targets: ["Tuist"]), ], @@ -691,6 +694,7 @@ extension PackageInfo { public static var aDependency: PackageInfo { .init( + name: "ALibrary", products: [ .init(name: "ALibrary", type: .library(.automatic), targets: ["ALibrary", "ALibraryUtils"]), ], @@ -737,6 +741,7 @@ extension PackageInfo { static var anotherDependency: PackageInfo { .init( + name: "AnotherLibrary", products: [ .init(name: "AnotherLibrary", type: .library(.automatic), targets: ["AnotherLibrary"]), ], @@ -893,6 +898,7 @@ extension PackageInfo { public static var alamofire: PackageInfo { .init( + name: "Alamofire", products: [ .init(name: "Alamofire", type: .library(.automatic), targets: ["Alamofire"]), ], @@ -1251,6 +1257,7 @@ extension PackageInfo { public static var googleAppMeasurement: PackageInfo { .init( + name: "GoogleAppMeasurement", products: [ .init( name: "GoogleAppMeasurement", @@ -1392,6 +1399,7 @@ extension PackageInfo { public static var googleUtilities: PackageInfo { .init( + name: "GoogleUtilities", products: [ .init(name: "GULAppDelegateSwizzler", type: .library(.automatic), targets: ["GULAppDelegateSwizzler"]), .init(name: "GULMethodSwizzler", type: .library(.automatic), targets: ["GULMethodSwizzler"]), @@ -1463,6 +1471,7 @@ extension PackageInfo { public static var nanopb: PackageInfo { .init( + name: "nanopb", products: [ .init(name: "nanopb", type: .library(.automatic), targets: ["nanopb"]), ], diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index f8fa4da5461..7980c0d238c 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -750,6 +750,17 @@ final class GenerateAcceptanceTestiOSAppWithImplicitDependencies: TuistAcceptanc } } +final class GenerateAcceptanceTestSPMPackage: TuistAcceptanceTestCase { + func test_spm_package() async throws { + try setUpFixture(.spmPackage) + try await run(InstallCommand.self) + try await run(GenerateCommand.self) + try await run(BuildCommand.self, "MyPackage", "--platform", "ios") + try await run(BuildCommand.self, "MyCLI") + try await run(TestCommand.self, "--platform", "macos") + } +} + extension TuistAcceptanceTestCase { private func resourcePath( for productName: String, diff --git a/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift b/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift index 9296c975741..16dc3dbb477 100644 --- a/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift +++ b/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift @@ -92,7 +92,7 @@ final class ManifestLoaderTests: TuistTestCase { #endif let package = Package( - name: "PackageName", + name: "tuist", products: [ .executable(name: "tuist", targets: ["tuist"]), ], @@ -121,9 +121,10 @@ final class ManifestLoaderTests: TuistTestCase { let got = try subject.loadPackage(at: manifestPath.parentDirectory) // Then - XCTAssertEqual( + XCTAssertBetterEqual( got, .test( + name: "tuist", products: [ PackageInfo.Product(name: "tuist", type: .executable, targets: ["tuist"]), ], diff --git a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift index d0f1867ee77..29fcc203907 100644 --- a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift @@ -268,7 +268,7 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { manifestLoader.manifestsAtStub = { _ in [.project] } // Then - try subject.validateHasProjectOrWorkspaceManifest(at: path) + try subject.validateHasRootManifest(at: path) } func test_validate_workspaceExists() throws { @@ -279,7 +279,7 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { manifestLoader.manifestsAtStub = { _ in [.workspace] } // Then - try subject.validateHasProjectOrWorkspaceManifest(at: path) + try subject.validateHasRootManifest(at: path) } func test_validate_manifestDoesNotExist() throws { @@ -288,7 +288,7 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { // When / Then XCTAssertThrowsSpecific( - try subject.validateHasProjectOrWorkspaceManifest(at: path), + try subject.validateHasRootManifest(at: path), ManifestLoaderError.manifestNotFound(path) ) } diff --git a/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift index 0ade4223d33..17454f6f20a 100644 --- a/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift @@ -1,4 +1,5 @@ import Foundation +import MockableTest import ProjectDescription import TSCBasic import TuistSupport @@ -11,8 +12,10 @@ import XCTest final class RecursiveManifestLoaderTests: TuistUnitTestCase { private var path: AbsolutePath! private var manifestLoader: MockManifestLoader! + private var packageInfoMapper: MockPackageInfoMapping! private var projectManifests: [AbsolutePath: Project] = [:] private var workspaceManifests: [AbsolutePath: Workspace] = [:] + private var packageManifests: [AbsolutePath: PackageInfo] = [:] private var subject: RecursiveManifestLoader! @@ -25,15 +28,18 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { } manifestLoader = createManifestLoader() + packageInfoMapper = MockPackageInfoMapping() subject = RecursiveManifestLoader( manifestLoader: manifestLoader, - fileHandler: fileHandler + fileHandler: fileHandler, + packageInfoMapper: packageInfoMapper ) } override func tearDown() { path = nil manifestLoader = nil + packageInfoMapper = nil subject = nil super.tearDown() } @@ -46,7 +52,10 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { try stub(manifest: projectA, at: try RelativePath(validating: "Some/Path/A")) // When - let manifests = try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path/A"))) + let manifests = try subject.loadWorkspace( + at: path.appending(try RelativePath(validating: "Some/Path/A")), + packageSettings: nil + ) // Then XCTAssertEqual(withRelativePaths(manifests.projects), [ @@ -82,7 +91,10 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { try stub(manifest: projectC, at: try RelativePath(validating: "Some/Path/C")) // When - let manifests = try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path/A"))) + let manifests = try subject.loadWorkspace( + at: path.appending(try RelativePath(validating: "Some/Path/A")), + packageSettings: nil + ) // Then XCTAssertEqual(withRelativePaths(manifests.projects), [ @@ -134,7 +146,10 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { try stub(manifest: projectE, at: try RelativePath(validating: "Some/Path/E")) // When - let manifests = try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path/A"))) + let manifests = try subject.loadWorkspace( + at: path.appending(try RelativePath(validating: "Some/Path/A")), + packageSettings: nil + ) // Then XCTAssertEqual(withRelativePaths(manifests.projects), [ @@ -160,7 +175,10 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { // When / Then XCTAssertThrowsSpecific( - try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path/A"))), + try subject.loadWorkspace( + at: path.appending(try RelativePath(validating: "Some/Path/A")), + packageSettings: nil + ), ManifestLoaderError.manifestNotFound(.project, path.appending(try RelativePath(validating: "Some/Path/B"))) ) } @@ -200,7 +218,10 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { try stub(manifest: workspace, at: try RelativePath(validating: "Some/Path")) // When - let manifests = try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path"))) + let manifests = try subject.loadWorkspace( + at: path.appending(try RelativePath(validating: "Some/Path")), + packageSettings: nil + ) // Then XCTAssertEqual(manifests.path, path.appending(try RelativePath(validating: "Some/Path"))) @@ -246,7 +267,10 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { try stub(manifest: workspace, at: try RelativePath(validating: "Some/Path")) // When - let manifests = try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path"))) + let manifests = try subject.loadWorkspace( + at: path.appending(try RelativePath(validating: "Some/Path")), + packageSettings: nil + ) // Then XCTAssertEqual(manifests.path, path.appending(try RelativePath(validating: "Some/Path"))) @@ -281,7 +305,10 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { try stub(manifest: workspace, at: try RelativePath(validating: "Some/Path")) // When - let manifests = try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path"))) + let manifests = try subject.loadWorkspace( + at: path.appending(try RelativePath(validating: "Some/Path")), + packageSettings: nil + ) // Then XCTAssertEqual(manifests.path, path.appending(try RelativePath(validating: "Some/Path"))) @@ -291,6 +318,33 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { ]) } + func test_loadSPM_Package() throws { + // Given + let packageA = createPackage(name: "PackageA") + try stub(manifest: packageA, at: try RelativePath(validating: "Some/Path/A")) + given(packageInfoMapper).map( + packageInfo: .value(packageA), + path: .any, + packageType: .any, + packageSettings: .any, + packageToProject: .any + ) + .willReturn( + .test(name: "PackageA") + ) + + // When + let manifests = try subject.loadWorkspace( + at: path.appending(try RelativePath(validating: "Some/Path/A")), + packageSettings: .test() + ) + + // Then + XCTAssertEqual(withRelativePaths(manifests.projects), [ + "Some/Path/A": .test(name: "PackageA"), + ]) + } + // MARK: - Helpers private func createProject( @@ -303,6 +357,12 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { return .test(name: name, targets: targets) } + private func createPackage( + name: String + ) -> PackageInfo { + return .test(name: name) + } + private func withRelativePaths(_ projects: [AbsolutePath: Project]) -> [String: Project] { Dictionary(uniqueKeysWithValues: projects.map { ($0.key.relative(to: path).pathString, $0.value) @@ -345,6 +405,17 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { workspaceManifests[manifestPath.parentDirectory] = manifest } + private func stub( + manifest: PackageInfo, + at relativePath: RelativePath + ) throws { + let manifestPath = path + .appending(relativePath) + .appending(component: Manifest.package.fileName(path.appending(relativePath))) + try fileHandler.touch(manifestPath) + packageManifests[manifestPath.parentDirectory] = manifest + } + private func createManifestLoader() -> MockManifestLoader { let manifestLoader = MockManifestLoader() manifestLoader.loadProjectStub = { [unowned self] path in @@ -361,6 +432,13 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { return manifest } + manifestLoader.loadPackageStub = { [unowned self] path in + guard let manifest = packageManifests[path] else { + throw ManifestLoaderError.manifestNotFound(.workspace, path) + } + return manifest + } + manifestLoader.manifestsAtStub = { [unowned self] path in var manifests = Set() if let _ = projectManifests[path] { @@ -369,6 +447,9 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { if let _ = workspaceManifests[path] { manifests.insert(.workspace) } + if let _ = packageManifests[path] { + manifests.insert(.package) + } return manifests } return manifestLoader diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index e7705e771f9..35dae3eba99 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -26,13 +26,14 @@ final class PackageInfoMapperTests: TuistUnitTestCase { super.tearDown() } - func testPreprocess_whenProductContainsBinaryTarget_mapsToXcframework() throws { + func testResolveDependencies_whenProductContainsBinaryTarget_mapsToXcframework() throws { let basePath = try temporaryPath() try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Sources/Target_1"))) try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Sources/Target_2"))) - let preprocessInfo = try subject.preprocess( + let resolvedDependencies = try subject.resolveExternalDependencies( packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target_1", "Target_2"]), ], @@ -46,7 +47,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ), ], - idToPackage: [:], packageToFolder: ["Package": basePath], packageToTargetsToArtifactPaths: ["Package": [ "Target_1": try! @@ -55,21 +55,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ) XCTAssertEqual( - preprocessInfo.targetToProducts, - [ - "Target_1": [.init(name: "Product1", type: .library(.automatic), targets: ["Target_1", "Target_2"])], - "Target_2": [.init(name: "Product1", type: .library(.automatic), targets: ["Target_1", "Target_2"])], - ] - ) - XCTAssertEqual( - preprocessInfo.targetToResolvedDependencies, - [ - "Target_1": [], - "Target_2": [], - ] - ) - XCTAssertEqual( - preprocessInfo.productToExternalDependencies, + resolvedDependencies, [ "Product1": [ .xcframework(path: "/artifacts/Package/Target_1.xcframework"), @@ -79,14 +65,15 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ) } - func testPreprocess_whenPackageIDDifferentThanName() throws { + func testResolveDependencies_whenPackageIDDifferentThanName() throws { let basePath = try temporaryPath() try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Package/Sources/Target_1"))) try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Package/Sources/Target_2"))) try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Package2/Sources/Target_2"))) - let preprocessInfo = try subject.preprocess( + let resolvedDependencies = try subject.resolveExternalDependencies( packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target_1"]), ], @@ -109,6 +96,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ), "Package2": .init( + name: "Package2", products: [ .init(name: "Product2", type: .library(.automatic), targets: ["Target_2"]), ], @@ -121,7 +109,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ), ], - idToPackage: ["package2_different_name": "Package2"], packageToFolder: [ "Package": basePath.appending(component: "Package"), "Package2": basePath.appending(component: "Package2"), @@ -129,23 +116,36 @@ final class PackageInfoMapperTests: TuistUnitTestCase { packageToTargetsToArtifactPaths: [:] ) - XCTAssertEqual( - preprocessInfo.targetToResolvedDependencies, + XCTAssertBetterEqual( + resolvedDependencies, [ - "Target_1": [.externalTarget(package: "Package2", target: "Target_2", condition: nil)], - "Target_2": [], + "Product1": [ + .project( + target: "Target_1", + path: .path(basePath.appending(try RelativePath(validating: "Package")).pathString), + condition: nil + ), + ], + "Product2": [ + .project( + target: "Target_2", + path: .path(basePath.appending(try RelativePath(validating: "Package2")).pathString), + condition: nil + ), + ], ] ) } - func testPreprocess_whenDependencyNameContainsDot_mapsToUnderscoreInTargetName() throws { + func testResolveDependencies_whenDependencyNameContainsDot_mapsToUnderscoreInTargetName() throws { let basePath = try temporaryPath() try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Package/Sources/Target_1"))) try fileHandler .createFolder(basePath.appending(try RelativePath(validating: "com.example.dep-1/Sources/com.example.dep-1"))) - let preprocessInfo = try subject.preprocess( + let resolvedDependencies = try subject.resolveExternalDependencies( packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target_1"]), ], @@ -168,6 +168,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ), "com.example.dep-1": .init( + name: "com.example.dep-1", products: [ .init(name: "com.example.dep-1", type: .library(.automatic), targets: ["com.example.dep-1"]), ], @@ -180,7 +181,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ), ], - idToPackage: [:], packageToFolder: [ "Package": basePath.appending(component: "Package"), "com.example.dep-1": basePath.appending(component: "com.example.dep-1"), @@ -189,24 +189,35 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ) XCTAssertEqual( - preprocessInfo.targetToResolvedDependencies, + resolvedDependencies, [ - "Target_1": [ - .externalTarget(package: "com.example.dep-1", target: "com_example_dep-1", condition: nil), + "com.example.dep-1": [ + .project( + target: "com_example_dep-1", + path: .path(basePath.appending(try RelativePath(validating: "com.example.dep-1")).pathString), + condition: nil + ), + ], + "Product1": [ + .project( + target: "Target_1", + path: .path(basePath.appending(try RelativePath(validating: "Package")).pathString), + condition: nil + ), ], - "com.example.dep-1": [], ] ) } - func testPreprocess_whenTargetDependenciesOnTargetHaveConditions() throws { + func testResolveDependencies_whenTargetDependenciesOnTargetHaveConditions() throws { let basePath = try temporaryPath() try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Package/Sources/Target_1"))) try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Package/Sources/Dependency_1"))) try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Package/Sources/Dependency_2"))) - let preprocessInfo = try subject.preprocess( + let resolvedDependencies = try subject.resolveExternalDependencies( packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product", type: .library(.automatic), targets: ["Target_1"]), ], @@ -227,7 +238,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ), ], - idToPackage: [:], packageToFolder: [ "Package": basePath.appending(component: "Package"), ], @@ -235,26 +245,28 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ) XCTAssertEqual( - preprocessInfo.targetToResolvedDependencies, + resolvedDependencies, [ - "Target_1": [ - .target(name: "Dependency_1", condition: .when([.ios])), - .target(name: "Dependency_2", condition: .when([.tvos])), + "Product": [ + .project( + target: "Target_1", + path: .path(basePath.appending(try RelativePath(validating: "Package")).pathString), + condition: nil + ), ], - "Dependency_1": [], - "Dependency_2": [], ] ) } - func testPreprocess_whenTargetDependenciesOnProductHaveConditions() throws { + func testResolveDependencies_whenTargetDependenciesOnProductHaveConditions() throws { let basePath = try temporaryPath() try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Package_1/Sources/Target_1"))) try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Package_2/Sources/Target_2"))) try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Package_2/Sources/Target_3"))) - let preprocessInfo = try subject.preprocess( + let resolvedDependencies = try subject.resolveExternalDependencies( packageInfos: [ "Package_1": .init( + name: "Package_1", products: [ .init(name: "Product_1", type: .library(.automatic), targets: ["Target_1"]), ], @@ -283,6 +295,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ), "Package_2": .init( + name: "Package_2", products: [ .init(name: "Product_2", type: .library(.automatic), targets: ["Target_2"]), .init(name: "Product_3", type: .library(.automatic), targets: ["Target_3"]), @@ -297,7 +310,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ), ], - idToPackage: [:], packageToFolder: [ "Package_1": basePath.appending(component: "Package_1"), "Package_2": basePath.appending(component: "Package_2"), @@ -305,14 +317,29 @@ final class PackageInfoMapperTests: TuistUnitTestCase { packageToTargetsToArtifactPaths: [:] ) - XCTAssertEqual( - preprocessInfo.targetToResolvedDependencies, + XCTAssertBetterEqual( + resolvedDependencies, [ - "Target_2": [], - "Target_3": [], - "Target_1": [ - .externalTarget(package: "Package_2", target: "Target_2", condition: .when([.ios])), - .externalTarget(package: "Package_2", target: "Target_3", condition: .when([.tvos])), + "Product_1": [ + .project( + target: "Target_1", + path: .path(basePath.appending(try RelativePath(validating: "Package_1")).pathString), + condition: nil + ), + ], + "Product_2": [ + .project( + target: "Target_2", + path: .path(basePath.appending(try RelativePath(validating: "Package_2")).pathString), + condition: nil + ), + ], + "Product_3": [ + .project( + target: "Target_3", + path: .path(basePath.appending(try RelativePath(validating: "Package_2")).pathString), + condition: nil + ), ], ] ) @@ -328,6 +355,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -365,6 +393,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -379,7 +408,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", @@ -410,6 +439,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -457,6 +487,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -500,6 +531,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { package: "Package", packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target_1"]), ], @@ -527,6 +559,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target_1"]), ], @@ -567,6 +600,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -621,6 +655,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "com.example.product-1", type: .library(.automatic), targets: ["com.example.target-1"]), ], @@ -667,6 +702,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -706,6 +742,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1", "Target2", "Target3"]), ], @@ -743,6 +780,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), .init(name: "Product2", type: .plugin, targets: ["Target2"]), @@ -781,6 +819,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -843,6 +882,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -956,6 +996,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1006,6 +1047,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1053,6 +1095,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1107,6 +1150,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1139,6 +1183,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1194,6 +1239,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1227,8 +1273,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { customSettings: [ "HEADER_SEARCH_PATHS": [ "$(SRCROOT)/Sources/Target1/include", - "$(SRCROOT)/Sources/Dependency1/include", - "$(SRCROOT)/Sources/Dependency2/include", ], "DEFINES_MODULE": "NO", "OTHER_CFLAGS": .array(["-fmodule-name=Target1"]), @@ -1242,7 +1286,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { customSettings: [ "HEADER_SEARCH_PATHS": [ "$(SRCROOT)/Sources/Dependency1/include", - "$(SRCROOT)/Sources/Dependency2/include", ], "DEFINES_MODULE": "NO", "OTHER_CFLAGS": .array(["-fmodule-name=Dependency1"]), @@ -1253,7 +1296,9 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "Dependency2", basePath: basePath, customSettings: [ - "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Dependency2/include"], + "HEADER_SEARCH_PATHS": [ + "$(SRCROOT)/Sources/Dependency2/include", + ], "DEFINES_MODULE": "NO", "OTHER_CFLAGS": .array(["-fmodule-name=Dependency2"]), ], @@ -1284,6 +1329,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1299,6 +1345,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ), "Package2": .init( + name: "Package2", products: [ .init(name: "Dependency1", type: .library(.automatic), targets: ["Dependency1"]), ], @@ -1314,6 +1361,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ), "Package3": .init( + name: "Package3", products: [ .init(name: "Dependency2", type: .library(.automatic), targets: ["Dependency2"]), ], @@ -1329,7 +1377,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), ] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", @@ -1337,12 +1385,10 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - dependencies: [.project(target: "Dependency1", path: .path("\(basePath.pathString)/Package2"))], + dependencies: [.external(name: "Dependency1", condition: nil)], customSettings: [ "HEADER_SEARCH_PATHS": [ "$(SRCROOT)/Sources/Target1/include", - "$(SRCROOT)/../Package2/Sources/Dependency1/include", - "$(SRCROOT)/../Package3/Sources/Dependency2/include", ], "DEFINES_MODULE": "NO", "OTHER_CFLAGS": .array(["-fmodule-name=Target1"]), @@ -1374,6 +1420,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1438,6 +1485,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1463,10 +1511,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - dependencies: [.target(name: "Dependency1")], - customSettings: [ - "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Dependency1/include"], - ] + dependencies: [.target(name: "Dependency1")] ), .test( "Dependency1", @@ -1500,6 +1545,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1549,6 +1595,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1598,6 +1645,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1638,6 +1686,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1678,6 +1727,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1722,6 +1772,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1765,6 +1816,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1803,6 +1855,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1842,6 +1895,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1881,6 +1935,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1920,6 +1975,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -1958,6 +2014,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2001,6 +2058,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2041,6 +2099,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2059,17 +2118,19 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ), ], - baseSettings: .init( - configurations: [ - .init(name: "Debug", variant: .debug): .init( - settings: ["CUSTOM_SETTING_1": .string("CUSTOM_VALUE_1")], - xcconfig: sourcesPath.appending(component: "Config.xcconfig") - ), - .init(name: "Release", variant: .release): .init( - settings: ["CUSTOM_SETTING_2": .string("CUSTOM_VALUE_2")], - xcconfig: sourcesPath.appending(component: "Config.xcconfig") - ), - ] + packageSettings: .test( + baseSettings: .init( + configurations: [ + .init(name: "Debug", variant: .debug): .init( + settings: ["CUSTOM_SETTING_1": .string("CUSTOM_VALUE_1")], + xcconfig: sourcesPath.appending(component: "Config.xcconfig") + ), + .init(name: "Release", variant: .release): .init( + settings: ["CUSTOM_SETTING_2": .string("CUSTOM_VALUE_2")], + xcconfig: sourcesPath.appending(component: "Config.xcconfig") + ), + ] + ) ) ) XCTAssertEqual( @@ -2118,6 +2179,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2136,7 +2198,10 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ), ], - targetSettings: targetSettings + packageSettings: .test( + baseSettings: .default, + targetSettings: targetSettings + ) ) XCTAssertEqual( project, @@ -2166,6 +2231,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2220,6 +2286,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2263,6 +2330,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2308,6 +2376,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2349,6 +2418,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2398,6 +2468,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2437,6 +2508,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2486,6 +2558,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2505,7 +2578,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), ] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", @@ -2515,7 +2588,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, dependencies: [.xcframework(path: .path( basePath - .appending(try RelativePath(validating: "Package/Dependency1/Dependency1.xcframework")).pathString + .appending(try RelativePath(validating: "artifacts/Package/Dependency1/Dependency1.xcframework")) + .pathString ))] ), ] @@ -2532,6 +2606,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Package/Sources/Dependency1"))) let package1 = PackageInfo( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2548,6 +2623,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ) let package2 = PackageInfo( + name: "Package2", products: [ .init(name: "Product2", type: .library(.automatic), targets: ["Target2", "Target3"]), .init(name: "Product3", type: .library(.automatic), targets: ["Target4"]), @@ -2567,7 +2643,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: ["Package": package1, "Package2": package2] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", @@ -2576,14 +2652,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "Target1", basePath: basePath, dependencies: [ - .project( - target: "Target2", - path: .path(basePath.appending(try RelativePath(validating: "Package2")).pathString) - ), - .project( - target: "Target3", - path: .path(basePath.appending(try RelativePath(validating: "Package2")).pathString) - ), + .external(name: "Product2", condition: nil), ] ), ] @@ -2600,6 +2669,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Package/Sources/Dependency1"))) let package1 = PackageInfo( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2616,6 +2686,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ) let package2 = PackageInfo( + name: "Package2", products: [ .init(name: "Product2", type: .library(.automatic), targets: ["Target2", "Target3"]), .init(name: "Product3", type: .library(.automatic), targets: ["Target4"]), @@ -2635,7 +2706,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: ["Package": package1, "Package2": package2] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", @@ -2644,14 +2715,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { "Target1", basePath: basePath, dependencies: [ - .project( - target: "Target2", - path: .path(basePath.appending(try RelativePath(validating: "Package2")).pathString) - ), - .project( - target: "Target3", - path: .path(basePath.appending(try RelativePath(validating: "Package2")).pathString) - ), + .external(name: "Product2", condition: nil), ] ), ] @@ -2669,6 +2733,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2704,6 +2769,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2739,6 +2805,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2774,6 +2841,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2809,6 +2877,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2821,7 +2890,10 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: ["4.0.0", "5.0.0", "4.2.0"] ), ], - swiftToolsVersion: "4.4.0" + packageSettings: .test( + baseSettings: .default, + swiftToolsVersion: "4.4.0" + ) ) XCTAssertEqual( project, @@ -2845,6 +2917,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -2857,11 +2930,13 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ), ], - baseSettings: Settings( - configurations: [.release: nil, .debug: nil, .init(name: "Custom", variant: .release): nil], - defaultSettings: .recommended - ), - swiftToolsVersion: "4.4.0" + packageSettings: .test( + baseSettings: Settings( + configurations: [.release: nil, .debug: nil, .init(name: "Custom", variant: .release): nil], + defaultSettings: .recommended + ), + swiftToolsVersion: "4.4.0" + ) ) XCTAssertNotNil(project?.settings?.configurations.first(where: { $0.name == "Custom" })) @@ -2890,6 +2965,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: allTargets), ], @@ -2900,10 +2976,13 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ), ], - targetSettings: [ - "Nimble": ["ENABLE_TESTING_SEARCH_PATHS": "NO", "ANOTHER_SETTING": "YES"], - "Quick": ["ANOTHER_SETTING": "YES"], - ] + packageSettings: .test( + baseSettings: .default, + targetSettings: [ + "Nimble": ["ENABLE_TESTING_SEARCH_PATHS": "NO", "ANOTHER_SETTING": "YES"], + "Quick": ["ANOTHER_SETTING": "YES"], + ] + ) ) XCTAssertEqual( @@ -2950,6 +3029,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath: basePath, packageInfos: [ "Package": .init( + name: "Package", products: [ .init(name: "Product", type: .library(.automatic), targets: ["Target1"]), ], @@ -3023,6 +3103,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Package2/Sources/Target3"))) let package1 = PackageInfo( + name: "Package", products: [ .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), ], @@ -3045,6 +3126,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { swiftLanguageVersions: nil ) let package2 = PackageInfo( + name: "Package2", products: [ .init(name: "Product2", type: .library(.automatic), targets: ["Target2", "Target3"]), ], @@ -3075,16 +3157,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { basePath.appending(try RelativePath(validating: "Package/Sources/Target1/**")).pathString, ])), dependencies: [ - .project( - target: "Target2", - path: .path(basePath.appending(try RelativePath(validating: "Package2")).pathString), - condition: .when([.ios]) - ), - .project( - target: "Target3", - path: .path(basePath.appending(try RelativePath(validating: "Package2")).pathString), - condition: .when([.ios]) - ), + .external(name: "Product2", condition: .when([.ios])), ] ), ] @@ -3124,53 +3197,38 @@ extension PackageInfoMapping { package: String, basePath: AbsolutePath = "/", packageInfos: [String: PackageInfo] = [:], - baseSettings: TuistGraph.Settings = .default, - targetSettings: [String: TuistGraph.SettingsDictionary] = [:], - swiftToolsVersion: TSCUtility.Version? = nil, - projectOptions: TuistGraph.Project.Options? = nil + packageSettings: TuistGraph.PackageSettings = .test( + baseSettings: .default + ) ) throws -> ProjectDescription.Project? { - let packageToFolder: [String: AbsolutePath] = packageInfos.keys.reduce(into: [:]) { result, packageName in - result[packageName] = basePath.appending(component: packageName) - } let packageToTargetsToArtifactPaths: [String: [String: AbsolutePath]] = try packageInfos .reduce(into: [:]) { packagesResult, element in let (packageName, packageInfo) = element packagesResult[packageName] = try packageInfo.targets .reduce(into: [String: AbsolutePath]()) { targetsResult, target in - guard target.type == .binary, target.path == nil else { + guard target.type == .binary else { return } - targetsResult[target.name] = basePath.appending( - try RelativePath(validating: "artifacts/\(packageName)/\(target.name).xcframework") - ) + if let path = target.path { + targetsResult[target.name] = basePath.appending( + try RelativePath(validating: "artifacts/\(packageName)/\(path)") + ) + } else { + targetsResult[target.name] = basePath.appending( + try RelativePath(validating: "artifacts/\(packageName)/\(target.name).xcframework") + ) + } } } - let preprocessInfo = try preprocess( - packageInfos: packageInfos, - idToPackage: [:], - packageToFolder: packageToFolder, - packageToTargetsToArtifactPaths: packageToTargetsToArtifactPaths - ) - return try map( packageInfo: packageInfos[package]!, - packageInfos: packageInfos, - name: package, path: basePath.appending(component: package), - productTypes: [:], - baseSettings: baseSettings, - targetSettings: targetSettings, - projectOptions: projectOptions, - minDeploymentTargets: preprocessInfo.platformToMinDeploymentTarget, - targetToProducts: preprocessInfo.targetToProducts, - targetToResolvedDependencies: preprocessInfo.targetToResolvedDependencies, - macroDependencies: preprocessInfo.macroDependencies, - targetToModuleMap: preprocessInfo.targetToModuleMap, + packageType: .external(artifactPaths: packageToTargetsToArtifactPaths[package]!), + packageSettings: packageSettings, packageToProject: Dictionary(uniqueKeysWithValues: packageInfos.keys.map { ($0, basePath.appending(component: $0)) - }), - swiftToolsVersion: swiftToolsVersion + }) ) } } diff --git a/Tests/TuistSupportTests/SwiftPackageManager/PackageInfoTests.swift b/Tests/TuistSupportTests/SwiftPackageManager/PackageInfoTests.swift index 09443aacc37..f7e846a9fca 100644 --- a/Tests/TuistSupportTests/SwiftPackageManager/PackageInfoTests.swift +++ b/Tests/TuistSupportTests/SwiftPackageManager/PackageInfoTests.swift @@ -8,6 +8,7 @@ final class PackageInfoTests: XCTestCase { func test_packageInfo_codable() { XCTAssertCodable( PackageInfo( + name: "tuist", products: [ PackageInfo.Product(name: "tuist", type: .executable, targets: ["tuist"]), PackageInfo.Product(name: "tuist", type: .library(.dynamic), targets: ["ProjectDescription"]), diff --git a/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift b/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift index 5ca7b14c265..3db832d696e 100644 --- a/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift +++ b/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift @@ -87,7 +87,7 @@ final class SwiftPackageManagerControllerTests: TuistUnitTestCase { let packageInfo = try subject.loadPackageInfo(at: path) // Then - XCTAssertEqual(packageInfo, PackageInfo.test) + XCTAssertBetterEqual(packageInfo, PackageInfo.test) } func test_loadPackageInfo_Xcode14() throws { diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/project-structure.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/project-structure.md index 239e6f87417..071fd5db7c2 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/project-structure.md +++ b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/project-structure.md @@ -4,7 +4,7 @@ Learn about the structure of Tuist projects and how to organize them. ## Overview -Although Tuist projects are commonly used to supersede Xcode projects, they are not limited to this use case. Tuist projects are also used to generate other types of projects, such as templates, plugins, and tasks. This document describes the structure of Tuist projects and how to organize them. +Although Tuist projects are commonly used to supersede Xcode projects, they are not limited to this use case. Tuist projects are also used to generate other types of projects, such as SPM packages, templates, plugins, and tasks. This document describes the structure of Tuist projects and how to organize them. ### Xcode projects @@ -15,22 +15,22 @@ Xcode projects are **the most common type of project generated by Tuist.** They ```bash Tuist/ Config.swift + Package.swift ProjectDescriptionHelpers/ Projects/ App/ Project.swift Feature/ Project.swift -Package.swift Workspace.swift ``` - **Tuist directory:** This directory has two purposes. First, it signals **where the root of the project is**. This allows constructing paths relative to the root of the project, and also also running Tuist commands from any directory within the project. Second, it's the container for the following files: - [**Config.swift:**](doc:config) This file contains configuration for Tuist that's shared across all the projects, workspaces, and environments. For example, it can be used to disable automatic generation of schemes, or to define the deployment target of the projects. - [**ProjectDescriptionHelpers:**](sharing-code-across-manifests) This directory contains Swift code that's shared across all the manifest files. Manifest files can `import ProjectDescriptionHelpers` to use the code defined in this directory. Sharing code is useful to avoid duplications and ensure consistency across the projects. + - [**Package.swift:**](doc:dependencies) This file contains Swift Package dependencies for Tuist to integrate them using Xcode projects and targets (like [CocoaPods](https://cococapods)) that are configurable and optimizable. Learn more [here](doc:dependencies). - **Root directory**: The root directory of your project that also contains the `Tuist` directory. - - [**Package.swift:**](doc:dependencies) This file contains Swift Package dependencies for Tuist to integrate them using Xcode projects and targets (like [CocoaPods](https://cococapods)) that are configurable and optimizable. Learn more [here](doc:dependencies). - [**Workspace.swift:**](doc:workspace) This manifest represents an Xcode workspace. It's used to group other projects and can also add additional files and schemes. - [**Project.swift:**](doc:project) This manifest represents an Xcode project. It's used to define the targets that are part of the project, and their dependencies. @@ -38,5 +38,11 @@ When interacting with the above project, commads expect to find either a `Worksp > Tip: Xcode workspaces allowed splitting projects into multiple Xcode projects to reduce the likelihood of merge conflicts. If that's what you were using workspaces for, you don't need them in Tuist. Tuist auto-generates a workspace containing a project and its dependencies' projects. +### SPM packages + +Tuist also supports SPM package projects. If you are working on an SPM package, you shouldn't need to update anything. Tuist automatically picks up on your root `Package.swift` and all the features of Tuist work as if it was a `Project.swift` manifest. + +To get started, run `tuist install` and `tuist generate` in your SPM package. Your project should now have all the same schemes and files that you would see in the vanilla Xcode SPM integration. However, now you can also run `tuist cache` and have majority of your SPM dependencies and modules precompiled, making subsequent builds extremely fast. Learn more about binary caching [here](). + Text - -### Section header - -Text diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/project-structure.md b/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/project-structure.md deleted file mode 100644 index 071fd5db7c2..00000000000 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/project-structure.md +++ /dev/null @@ -1,48 +0,0 @@ -# Project structure - -Learn about the structure of Tuist projects and how to organize them. - -## Overview - -Although Tuist projects are commonly used to supersede Xcode projects, they are not limited to this use case. Tuist projects are also used to generate other types of projects, such as SPM packages, templates, plugins, and tasks. This document describes the structure of Tuist projects and how to organize them. - -### Xcode projects - -Xcode projects are **the most common type of project generated by Tuist.** They are used to build apps, frameworks, and libraries among others. Unlike Xcode projects, Tuist projects are defined in Swift, which makes them more flexible and easier to maintain. Tuist projects are also more declarative, which makes them easier to understand and reason about. The following structure shows a typical Tuist project that generates an Xcode project: - -> Note: The definition files are referred to as **manifest files** throughout the documentation. - -```bash -Tuist/ - Config.swift - Package.swift - ProjectDescriptionHelpers/ -Projects/ - App/ - Project.swift - Feature/ - Project.swift -Workspace.swift -``` - -- **Tuist directory:** This directory has two purposes. First, it signals **where the root of the project is**. This allows constructing paths relative to the root of the project, and also also running Tuist commands from any directory within the project. Second, it's the container for the following files: - - [**Config.swift:**](doc:config) This file contains configuration for Tuist that's shared across all the projects, workspaces, and environments. For example, it can be used to disable automatic generation of schemes, or to define the deployment target of the projects. - - [**ProjectDescriptionHelpers:**](sharing-code-across-manifests) This directory contains Swift code that's shared across all the manifest files. Manifest files can `import ProjectDescriptionHelpers` to use the code defined in this directory. Sharing code is useful to avoid duplications and ensure consistency across the projects. - - [**Package.swift:**](doc:dependencies) This file contains Swift Package dependencies for Tuist to integrate them using Xcode projects and targets (like [CocoaPods](https://cococapods)) that are configurable and optimizable. Learn more [here](doc:dependencies). - -- **Root directory**: The root directory of your project that also contains the `Tuist` directory. - - [**Workspace.swift:**](doc:workspace) This manifest represents an Xcode workspace. It's used to group other projects and can also add additional files and schemes. - - [**Project.swift:**](doc:project) This manifest represents an Xcode project. It's used to define the targets that are part of the project, and their dependencies. - -When interacting with the above project, commads expect to find either a `Workspace.swift` or a `Project.swift` file in the working directory or the directory indicated via the `--path` flag. The manifest should be in a directory or subdirectory of a directory containing a `Tuist` directory, which represents the root of the project. - -> Tip: Xcode workspaces allowed splitting projects into multiple Xcode projects to reduce the likelihood of merge conflicts. If that's what you were using workspaces for, you don't need them in Tuist. Tuist auto-generates a workspace containing a project and its dependencies' projects. - -### SPM packages - -Tuist also supports SPM package projects. If you are working on an SPM package, you shouldn't need to update anything. Tuist automatically picks up on your root `Package.swift` and all the features of Tuist work as if it was a `Project.swift` manifest. - -To get started, run `tuist install` and `tuist generate` in your SPM package. Your project should now have all the same schemes and files that you would see in the vanilla Xcode SPM integration. However, now you can also run `tuist cache` and have majority of your SPM dependencies and modules precompiled, making subsequent builds extremely fast. Learn more about binary caching [here](). - - + +Tuist Cloud is CLI-first, meaning that the actions you'd traditionally do on the web, you can do them from the command line. +The first to start using Tuist Cloud is to **sign up**. +For that, you can run the following command: + +```bash +tuist cloud auth +``` + +> [!TIP] ORGANIZATION AND USERS +> Like [GitHub](https://github.com) you projects (repositories in the context of GitHub) can be part of an organizations or your personal account. Account and organizations have handles, which are unique across the platform. For example, the Tuist organization uses the `tuist` handle. + +## Create an organization Optional + +If you are part of an organization to which you want to invite other members, you can create an organization. + +> [!NOTE] +> This is not necessary if you are working by yourself because you can create projects under your personal account. + +```bash +tuist cloud organization create my-organization # Create organization +``` + +## Create a project + +The next step is to create a project. You can easily do that with the following command: + +::: code-group +```bash [Project under user account] +tuist cloud project create my-project +``` +```bash [Project under organization] +tuist cloud project create my-project -o my-organization +``` +::: + +After creating the project, modify your `Tuist/Config.swift` file to reference the new project: + +```swift +import ProjectDescription + +let config = Config(cloud: .cloud(projectId: "my-organization/my-project")) +``` + +> [!TIP] PROJECT IDENTIFIER +> The project identifier is formed by concatenating the organization or user handle and the project handle with a slash. For example, the Tuist organization uses the `tuist` handle, and the project is named `tuist`. The project identifier would be `tuist/tuist`. + +## Authentication + +### As user + +Developers on your team can access Tuist Cloud if they are authenticated and added as members of the organization, which you can do using the `tuist cloud organization invite` command. + +### As project (e.g. for CI) +For CI environments, authentication is managed differently; it's done using **project-scoped tokens**. These tokens possess restricted permissions compared to those of the organization, including the ability to warm the cache with binaries. To obtain this token, you can execute the following command: + + +```bash +tuist cloud project token my-project -o my-organization +``` + +You will then need to set the token as an environment variable named `TUIST_CONFIG_CLOUD_TOKEN` to make it accessible. + +> [!NOTE] EXPOSING SECRET ENVIRONMENT VARIABLES IN CI ENVIRONMENTS +> How environment secret environment variables are exposed in CI environments varies depending on the CI provider. Ensure you follow the guidelines provided by your CI provider to securely manage these tokens. + +## Tuist and Tuist Cloud integration + +When the Tuist Cloud configuration is set up, and there's a valid session, either as a user or project, Tuist Cloud features will be available automatically without any additional configuration or actions. This is the beauty of Tuist Cloud's setup–it doesn't require the installation of additional tools, plumbing, or configuration. It just works™. \ No newline at end of file diff --git a/docs/docs/cloud/on-premise.md b/docs/docs/cloud/on-premise.md new file mode 100644 index 00000000000..f59c5478edd --- /dev/null +++ b/docs/docs/cloud/on-premise.md @@ -0,0 +1,216 @@ +--- +title: On premise +titleTemplate: ':title - Tuist Cloud' +description: Learn how to host Tuist Cloud on your own infrastructure. +--- + +# On premise + +We offer a self-hosted version of Tuist Cloud for organizations that require more control over their infrastructure. This version allows you to host Tuist Cloud on your own infrastructure, ensuring that your data remains secure and private. + +If you signed an agreement with us to use Tuist Cloud on-premise, you can follow the instructions below to set up your environment. + +## Release cadence + +Tuist Cloud is **released every Monday** and the version name follows the convention name `{MAJOR}.YY.MM.DD`. The date component is used to warn the CLI user if their hosted version is 60 days older than the release date of the CLI. It's crucial that on-premise organizations keep up with Tuist Cloud updates to ensure their developers benefit from the most recent improvements and that we can drop deprecated features with the confidence that we are not breaking any of the on-premise setups. + +The major component of the CLI is used to flag breaking changes in Tuist Cloud that will require coordination with the on-premise users. You should not expect us to use it, and in case we needed, rest asure we'll work with you in making the transition smooth. + +> [!NOTE] RELEASE NOTES +> You'll be given access to a `tuist/cloud-on-premise` repository associated with the registry where images are published. Every new released will be published in that repository as a GitHub release and will contain release notes to inform you about what changes come with it. + +## Runtime requirements + +This section outlines the requirements for hosting Tuist Cloud on your infrastructure. + +### Running Docker-virtualized images + +We distribute Tuist Cloud as a [Docker](https://www.docker.com/) image via [GitHub’s Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry). + + + +To run it, your infrastructure must support running Docker images. Note that most infrastructure providers support it because it’s become the standard container for distributing and running software in production environments. + +### Postgres database + +In addition to running the Docker images, you’ll need a [Postgres database](https://www.postgresql.org/) to store relational data. Most infrastructure providers include Posgres databases in their offering (e.g., [AWS](https://aws.amazon.com/rds/postgresql/) & [Google Cloud](https://cloud.google.com/sql/docs/postgres)). + +> [!INFO] MIGRATIONS +> The Docker image's entrypoint automatically runs any pending schema migrations before starting the service. + +### Storage + +You’ll also need a solution to store files (e.g. framework and library binaries). Currently we support any storage that's S3-compliant. + +## Configuration + +The configuration of the service is done at runtime through environment variables. Given the sensitive nature of these variables, we advise encrypting and storing them in secure password management solutions. Rest assured, Tuist Cloud handles these variables with utmost care, ensuring they are never displayed in logs. + +> [!NOTE] LAUNCH CHECKS +> The necessary variables are verified at startup. If any are missing, the launch will fail and the error message will detail the absent variables. + +### Base environment configuration + +| Environment variable | Description | Required | Default | Example | +| --- | --- | --- | --- | --- | +| `DATABASE_URL` | The URL to access the Postgres database. Note that the URL should contain the authentication information | Yes | | `postgres://username:password@cloud.us-east-2.aws.test.com/production` | +| `TUIST_APP_URL` | The base URL to access the instance from the Internet | Yes | | https://cloud.tuist.io | +| `TUIST_SECRET_KEY_BASE` | The key to use to encrypt information (e.g. sessions in a cookie) | Yes | | | `c5786d9f869239cbddeca645575349a570ffebb332b64400c37256e1c9cb7ec831345d03dc0188edd129d09580d8cbf3ceaf17768e2048c037d9c31da5dcacfa` | +| `TUIST_SECRET_KEY_PASSWORD` | | No | `$TUIST_SECRET_KEY_BASE` | | +| `TUIST_SECRET_KEY_TOKENS` | | No | `$TUIST_SECRET_KEY_BASE` | | +| `TUIST_USE_IPV6` | When `1` it configures the app to use IPv6 addresses | No | `0` | `1`| + +### Authentication environment configuration + +We facilitate authentication through [identity providers (IdP)](https://en.wikipedia.org/wiki/Identity_provider). To utilize this, ensure all necessary environment variables for the chosen provider are present in the Tuist Cloud’s operating environment. **Missing variables** will result in Tuist Cloud bypassing that provider. + +#### GitHub + +We recommend authenticating using a [GitHub App](https://docs.github.com/en/apps/creating-github-apps/about-creating-github-apps/about-creating-github-apps) but you can also use the [OAuth App](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app). Make sure to include all essential environment variables specified by GitHub in the Tuist Cloud environment. Absent variables will cause Tuist Cloud to overlook the GitHub authentication. To properly set up the GitHub app: +- In the GitHub app's general settings: + - Copy the `Client ID` and set it as `TUIST_GITHUB_OAUTH_ID` + - Create and copy a new `client secret` and set it as `TUIST_GITHUB_OAUTH_SECRET` + - Set the `Callback URL` as `http://YOUR_APP_URL/users/auth/github/callback`. `YOUR_APP_URL` can also be your server's IP address. +- In the `Permissions and events`'s `Account permissions` section, set the `Email addresses` permission to `Read-only`. + +You'll then need to expose the following environment variables in the environment where Tuist Cloud runs: + +| Environment variable | Description | Required | Default | Example | +| --- | --- | --- | --- | --- | +| `TUIST_GITHUB_OAUTH_ID` | The client ID of the application | Yes | | `Iv1.a629723000043722` | +| `TUIST_GITHUB_OAUTH_SECRET` | The client secret of the application | Yes | | `232f972951033b89799b0fd24566a04d83f44ccc` | + +#### Google + +You can set up authentication with Google using [OAuth 2](https://developers.google.com/identity/protocols/oauth2). For that, you'll need to [create a new credential](https://console.cloud.google.com/apis/credentials?project=tuist-cloud-staging) of type OAuth client ID. When creating the credentials, select "Web Application" as application type, name it `Tuist Cloud`, and set the redirect URI to `{base_url}/users/auth/google/callback` where `base_url` is the URL your hosted-service is running at. Once you create the app, copy the client ID and secret and set them as environment variables `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` respectively. + +> [!NOTE] CONSENT SCREEN SCOPES +> You might need to create a consent screen. When you do so, make sure to add the `userinfo.email` and `openid` scopes and mark the app as internal. + +#### Okta + +You can enable authentication with Okta through the [OAuth 2.0](https://oauth.net/2/) protocol. You'll have to [create an app](https://developer.okta.com/docs/guides/implement-oauth-for-okta/main/#create-an-oauth-2-0-app-in-okta) on Okta with the following configuration: + +- **App integration name:** `Tuist Cloud` +- **Grant type:** Enable *Authorization Code* for *Client acting on behalf of a user* +- **Sign-in redirect URL:** `{url}/users/auth/github/callback` where `url` is the public URL your service is accessed through. +- **Assignments:** This configuration will depend on your security team requirements. + +If you'd like Tuist Cloud to detect when a user is removed from the application, you'll have to configure an [event hook](https://help.okta.com/en-us/content/topics/automation-hooks/event-hooks-main.htm). In your Okta organization, go to **Workflow > Event Hooks** and create a new event hook with the following data: + +- **Name:** Notify memberhip removal to Tuist Cloud +- **URL:** `{url}/webhooks/okta` where `url` is the public URL your service is accessed through. +- **Authentication field:** `Authorization` +- **Authentication secret:** A token that Tuist Cloud uses to validate the webhooks. +- **Subscribe to events** Include *User unassigned from app* + +Once the app is created you'll need to set the following environment variables: + +| Environment variable | Description | Required | Default | Example | +| --- | --- | --- | --- | --- | +| `TUIST_OKTA_SITE` | The URL of your Okta organization | Yes | | `https://your-org.okta.com` | +| `TUIST_OKTA_CLIENT_ID` | The client ID to authenticate against Okta | Yes | | | +| `TUIST_OKTA_CLIENT_SECRET` | The client secret to authenticate against Okta | Yes | | | +| `TUIST_OKTA_AUTHORIZE_URL` | The authorize URL | No | `{OKTA_SITE}/oauth2//v1/authorize` | | +| `TUIST_OKTA_TOKEN_URL` | The token URL | No | `{OKTA_SITE}/oauth2//v1/token` | | +| `TUIST_OKTA_USER_INFO_URL` | The token URL | No | `{OKTA_SITE}/oauth2//v1/userinfo` | | +| `TUIST_OKTA_EVENT_HOOK_SECRET` | A secret to validat event hooks delivered by Okta | No | | + +### Storage environment configuration + + Tuist Cloud needs storage to house artifacts uploaded through the API. It's **essential to configure one of the supported storage solutions** for Tuist Cloud to operate effectively. + +#### S3-Compliant storages + +| Environment variable | Description | Required | Default | Example | +| --- | --- | --- | --- | --- | +| `TUIST_S3_ACCESS_KEY_ID` | The access key identifier | Yes | | `AKIAA2LQP3CCOZ6WT6CF` | +| `TUIST_S3_SECRET_ACCESS_KEY` | The access key secret | Yes | | `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` | +| `TUIST_S3_BUCKET_NAME` | Name of the bucket | Yes | | `my-bucket` | +| `TUIST_S3_REGION` | The bucket's region | No | `eu-west-1` | `us-east-1` | +| `TUIST_S3_ENDPOINT` | Custom endpoint | No | `https://amazonaws.com` | `https://custom-domain.com` | + +For Google Cloud Storage, follow [these docs](https://cloud.google.com/storage/docs/authentication/managing-hmackeys) to get the `TUIST_S3_ACCESS_KEY_ID` and `TUIST_S3_SECRET_ACCESS_KEY` pair. The `TUIST_S3_ENDPOINT` should be set to `https://storage.googleapis.com`. Other environment variables are the same as for any other S3-compliant storage. + +## Deployment + +On-premise users are granted access to the repository located at [tuist/cloud-on-premise](https://github.com/cloud/cloud-on-premise) which has a linked container registry for pulling images. Currently, the container registry allows authentication only as an individual user. Therefore, users with repository access must generate a **personal access token** within the Tuist organization, ensuring they have the necessary permissions to read packages. After submission, we will promptly approve this token. + +> [!IMPORTANT] USER VS ORGANIZATION-SCOPED TOKENS +> Using a personal access token presents a challenge because it's associated with an individual who might eventually depart from the enterprise organization. GitHub recognizes this limitation and is actively developing a solution to allow GitHub apps to authenticate with app-generated tokens. + +### Pulling the Docker image + +After generating the token, you can retrieve the image by executing the following command: + +```bash +echo $TOKEN | docker login ghcr.io -u USERNAME --password-stdin +docker pull ghcr.io/tuist/cloud-on-premise:latest +``` + +### Deploying the Docker image + +The deployment process for the Docker image will differ based on your chosen cloud provider and your organization's continuous deployment approach. Since most cloud solutions and tools, like [Kubernetes](https://kubernetes.io/), utilize Docker images as fundamental units, the examples in this section should align well with your existing setup. + +We recommend establishing a deployment pipeline that that runs **every Tuesday**, pulling and deploying fresh images. This ensures you consistently benefit from the latest improvements. + +> [!IMPORTANT] +> If your deployment pipeline needs to validate that the server is up and running, you can send a `GET` HTTP request to `/ready` and assert a `200` status code in the response. + +#### Fly + +To deploy the app on [Fly](https://fly.io/), you'll require a `fly.toml` configuration file. Consider generating it dynamically within your Continuous Deployment (CD) pipeline. Below is a reference example for your use: + +```toml +app = "tuist-cloud" +primary_region = "fra" +kill_signal = "SIGINT" +kill_timeout = "5s" + +[experimental] + auto_rollback = true + +[env] + # Your environment configuration goes here + # Or exposed through Fly secrets + +[processes] + app = "/usr/local/bin/hivemind /app/Procfile" + +[[services]] + protocol = "tcp" + internal_port = 8080 + auto_stop_machines = false + auto_start_machines = false + processes = ["app"] + http_options = { h2_backend = true } + + [[services.ports]] + port = 80 + handlers = ["http"] + force_https = true + + [[services.ports]] + port = 443 + handlers = ["tls", "http"] + [services.concurrency] + type = "connections" + hard_limit = 100 + soft_limit = 80 + + [[services.http_checks]] + interval = 10000 + grace_period = "10s" + method = "get" + path = "/ready" + protocol = "http" + timeout = 2000 + tls_skip_verify = false + [services.http_checks.headers] + +[[statics]] + guest_path = "/app/public" + url_prefix = "/" +``` + +Then you can run `fly launch --local-only --no-deploy` to launch the app. On subsequent deploys, instead of running `fly launch --local-only`, you will need to run `fly deploy --local-only`. Fly.io doesn't allow to pull private Docker images, which is why we need to use the `--local-only` flag. \ No newline at end of file diff --git a/docs/docs/cloud/selective-testing.md b/docs/docs/cloud/selective-testing.md new file mode 100644 index 00000000000..01d57fddee0 --- /dev/null +++ b/docs/docs/cloud/selective-testing.md @@ -0,0 +1,38 @@ +--- +title: Selective testing +titleTemplate: ':title - Tuist Cloud' +description: Speed up your test runs by running only the tests that have changed since the last successful test run. +--- + +# Selective testing + +As your project grows, so does the amount of your tests. For a long time, running all tests on every PR or push to `main` takes tens of seconds. But this solution does not scale to thousands of tests your team might have. + +On every test run on the CI, you probably build a project with cleaned derived data and re-run all the tests, regardless of the changes. `tuist test` helps you to drastically decrease the build time and then running the tests themselves. + +## Running tests selectively + +To run tests selectively, use the `tuist test` command. The command hashes your project the same way it does for [warming the cache](/cloud/binary-caching#cache-warming), and on success, it persists the hashes on Tuist Cloud to determine what has changed in future runs. + +In future runs `tuist test` transparently uses the hashes to filter down the tests to run only the ones that have changed since the last successful test run. + +For example, assuming the following dependency graph: + +- `FeatureA` has tests `FeatureATests`, and depends on `Core` +- `FeatureB` has tests `FeatureBTests`, and depends on `Core` +- `Core` has tests `CoreTests` + +`tuist test` will behave as such: + +| Action | Description | Internal state | +| ---- | --- | ---- | +| `tuist test` invocation | Runs the tests in `CoreTests`, `FeatureATests`, and `FeatureBTests` | The hashes of `FeatureATests`, `FeatureBTests` and `CoreTests` are persisted | +| `FeatureA` is updated | The developer modifies the code of a target | Same as before | +| `tuist test` invocation | Runs the tests in `FeatureBTests` because it hash has changed | The new hash of `FeatureBTests` is persisted | +| `Core` is updated | The developer modifies the code of a target | Same as before | +| `tuist test` invocation | Runs the tests in `CoreTests`, `FeatureATests`, and `FeatureBTests` | The new hash of `FeatureATests` `FeatureBTests`, and `CoreTests` are persisted | + +The combination of selective testing with binary caching can dramatically reduce the time it takes to run tests on your CI. + +> [!WARNING] MODULE VS FILE-LEVEL GRANULARITY +> Due to the impossibility of detecting the in-code dependencies between tests and sources, the maximum granularity of selective testing is at the target level. Therefore, we recommend keeping your targets small and focused to maximize the benefits of selective testing. \ No newline at end of file diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/tuist-cloud.md b/docs/docs/cloud/what-is-cloud.md similarity index 51% rename from docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/tuist-cloud.md rename to docs/docs/cloud/what-is-cloud.md index c11c7c1aecc..65e8275bea9 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist Cloud/Users/tuist-cloud.md +++ b/docs/docs/cloud/what-is-cloud.md @@ -1,42 +1,51 @@ -# What is Tuist Cloud +--- +title: What is Tuist Cloud +titleTemplate: ':title - Tuist Cloud' +description: Learn about Tuist Cloud, a service that provides a set of features to enhance the development experience with Tuist. +--- -Addressing large-scale challenges necessitates persisting state and service integration, for which Tuist Cloud is key. This paid solution is vital for Tuist project integration and its open-source project's longevity. +# Tuist Cloud -## Overview - -Utilizing a graph of dependencies for representing projects and converting them into Xcode projects showed that this approach could be **foundational for optimizing workflows**, thereby preventing unnecessary time wastage for organization's developers. Key features that leverage this foundational approach include **local binary caching**, which enables the generation of projects with some targets replaced by their pre-compiled binary counterparts, and selective testing, which allows running tests only for the targets impacted by changes. +Utilizing a graph of dependencies for representing projects and converting them into Xcode projects showed that this approach could be **foundational for optimizing workflows**, thereby preventing unnecessary time wastage for organization's developers. Key features that leverage this foundational approach include [binary caching](/cloud/binary-caching), which enables the generation of projects with some targets replaced by their pre-compiled binary counterparts, and [selective testing](/cloud/selective-testing), which allows running tests only for the targets impacted by changes. As we advanced towards enhancing productivity, it became evident that **certain solutions necessitated an HTTP server for state storage and building integrations with other HTTP services** like [GitHub](https://github.com), [Slack](https://slack.com), or [Apple Store Connect](https://appstoreconnect.apple.com/). For instance, caching could leverage a server to share binaries across local and CI environments, thereby accelerating build and test times. This realization led to the creation of Tuist Cloud. Tuist Cloud, a closed-source paid service, enhances Tuist by adding server-requisite functionalities. Integration of Tuist projects with Tuist Cloud not only augments existing functionalities but also introduces new ones. This service encapsulates years of experience in developing tools for mobile developers at [Shopify](https://shopify.com) (e.g., [Mobile Tophat](https://shopify.engineering/mobile-tophatting-at-shopify-1), [Mobile Release Engineering at Scale](https://shopify.engineering/mobile-release-engineering-scale-shipit-mobile), [Scaling iOS CI with Anka](https://shopify.engineering/scaling-ios-ci-with-anka)) and is envisioned as **the copilot for your platform teams**. Our objective is to help organizations cultivate a productive development environment. -> Note: Similar to many other open-source projects, Tuist also necessitated full-time dedicated personnel to adequately meet the demand for support and feature requests. Tuist Cloud plays a crucial role in fulfilling this requirement by enabling the financing of full-time personnel for the project. +## Sustainability -## Features +Similar to many other open-source projects, Tuist also necessitated full-time dedicated personnel to adequately meet the demand for support and feature requests. Tuist Cloud plays a crucial role in fulfilling this requirement by enabling the financing of full-time personnel for the project. + +Becoming Tuist Cloud user is synonym to supporting the the development of Tuist and many of the open source that makes Tuist and other community open source projects possible. We wished the economics of open source were much different and organizations and government recognized the value of open source and financially supported it, but at the time of write, that's unfortunately not the case, so creating a business is the only option we were left with. -### Available +> [!INFO] BUT I WANT TO USE MY CI CACHE... +> Users often don't understand the need for paying for caching when their CI provider already provides a solution. We understand it, it doesn't make sense logically, but financially, we believe it does, because Tuist has reached a point that needs funding to continue to support its development. Avoiding doing so, like we had to suffer from in the past, puts Tuist and all our efforts at risk. + + + +## Features -#### Binary caching across environments +### Binary caching across environments -Tuist Cloud offers a robust storage solution for Tuist, enabling the sharing of cache artifacts between local and remote settings, such as continuous integration. This ensures that developers avoid recompiling targets they don't intend to modify, provided they've already been compiled by a teammate or in a CI setting. Leveraging this caching can yield efficiency rates up to 90%, leading to significant time and cost savings for both local development and CI processes. +Tuist Cloud offers a robust storage solution for Tuist, enabling the sharing of cache artifacts between local and remote settings, such as continuous integration. This ensures that developers avoid recompiling targets they don't intend to modify, provided they've already been compiled by a teammate or in a CI setting. Leveraging this caching can yield efficiency [rates up to 90%](https://builders.travelperk.com/tuist-ing-travelperks-ios-app-for-faster-build-times-4796dcfa7809), leading to significant time and cost savings for both local development and CI processes. -> Tip: To assist organizations in evaluating their return on investment (ROI), we've developed an [**ROI calculator**](https://tuist.io/cloud). For instance, consider an organization with approximately 20 developers. If their clean builds take 10 minutes and they achieve a 70% cache effectiveness, they could potentially reduce development time by 24,000 hours and recover up to $6.4 million a year. +> [!TIP] RETURN OF INVESTMENT (ROI) +> To assist organizations in evaluating their return on investment (ROI), we've developed an [**ROI calculator**](https://tuist.io/cloud). For instance, consider an organization with approximately 20 developers. If their clean builds take 10 minutes and they achieve a 70% cache effectiveness, they could potentially reduce development time by 24,000 hours and recover up to $6.4 million a year. -#### Selective testing across environments +### Selective testing across environments Once teams reach a certain scale, they often grapple with optimizing their CI process to maintain quick turnaround times. While **testing everything** continually might work for smaller teams, it becomes impractical on a larger scale. At this juncture, many teams resort to investing in superior hardware, creating custom tools, complicating their CI pipelines, or worse, accepting slower development cycles. But there's a better way. **Tuist Cloud utilizes graph knowledge and fingerprinting technology—essential for binary caching—to discern which targets to test based on file modifications.** Not only that, as your tests will also be able to use binary caching, massively reducing the time it takes to both _build_ and _run_ your tests. -#### Insights +### Analytics While optimizing workflows based on our project insights is beneficial, it's crucial to ensure that your project's evolution doesn't lead to regressions, adversely affecting the developer experience. While our ultimate goal is to harness AI technologies to offer you a virtual co-pilot, we currently provide foundational insights to enhance your understanding of your project and workflows. This allows you to identify optimization opportunities and make data-driven decisions. We firmly believe this is data that Xcode ought to supply. However, recognizing the clear demand from teams, we're stepping up to deliver it. -> Info: You might be familiar with Spotify's open-source tool, [XCMetrics](https://xcmetrics.io/). While it shares a similar objective, its integration demands extra tool installations in developers' settings, and it lacks the ability to correlate data with project specifics. In contrast, Tuist offers enhanced analytics, drawing from the synergy between data and the project graph, and is seamlessly integrated without needing any extra installations. +> [!INFO] AN INTEGRATED SOLUTION +> You might be familiar with Spotify's open-source tool, [XCMetrics](https://xcmetrics.io/). While it shares a similar objective, its integration demands extra tool installations in developers' settings, and it lacks the ability to correlate data with project specifics. In contrast, Tuist offers enhanced analytics, drawing from the synergy between data and the project graph, and is seamlessly integrated without needing any extra installations. -### In development - -#### Advanced actionable insights +### Advanced actionable insights In progress Regressions can easily compromise the health of a project, build, or test suites. This is primarily because CI workflows focus on ensuring successful compilation and test suite outcomes. As a result, developers tend to merge pull requests (PRs) once they're approved and both the compilation and test runs are successful. Yet, such PRs might inadvertently affect other vital aspects that directly influence developer productivity. For instance, they could: @@ -47,3 +56,13 @@ Regressions can easily compromise the health of a project, build, or test suites In a conventional setup, these issues often go unnoticed until they've become significant problems. By the time they're detected, teams face the daunting task of tracing back to find the root cause before implementing a fix. This becomes especially challenging in dynamic environments where changes are constantly integrated. However, there's a more efficient approach. We aim to **gather data from builds, including build times, binary sizes, and test outcomes, and integrate this with graph information.** This consolidated data will then be transmitted to our server. From there, developers can **visually track performance trends over time**. Our goal is to not only make this information easily accessible but also **actionable**. By identifying potential deviations that might hinder productivity, we can flag them directly in PRs. This proactive approach ensures that potential regressions are intercepted before merging into the primary repository branch. In essence, Tuist Cloud is designed to serve as a vigilant co-pilot, ensuring a **consistently healthy and efficient development environment**. An optimal development environment is pivotal for maintaining developers' enthusiasm and commitment to the project. + +### Test quality Planned + +A common source of productivity loss is the time spent debugging flaky tests. Flaky tests can happen easily due to the non-functional nature of Swift, and Apple provides no tools to help developers prevent, identify, or fix them. Imagine a developer waiting for 30 minutes to get feedback on a PR, only to find out that the test failure was due to a flaky test. A retry then leads to a not-ready-to-merge green PR because someone had merged a PR that introduced conflicts. After solving the conflicts, the developer waits another 30 minutes to get feedback. This cycle can be frustrating and significantly impacts productivity. + +We plan to track flakiness server-side from Tuist Cloud, and extend `tuist test` to dynamically skip the tests that are flaky based on the information provided by Tuist Cloud. Organizations will get a clear view of the sources of flakiness in the dashboard, and have tools to set up tripwires, for example to prevent the introduction of new flaky tests by making PRs fail if they introduce flaky tests. + +### Team-scoped metrics Planned + +We plan to give organizations an API to declare ownership of various parts of the project graph. For example, they'll be able to indicate which team is the owner of a given target. Thanks to this information, platform teams can make teams accountable for various health metrics, such as build times, binary sizes, and test outcomes. This will help organizations to foster a culture of ownership and accountability, and to make data-driven decisions to improve the health of their projects. \ No newline at end of file diff --git a/docs/docs/contributors/code-reviews.md b/docs/docs/contributors/code-reviews.md new file mode 100644 index 00000000000..93aeefd4a08 --- /dev/null +++ b/docs/docs/contributors/code-reviews.md @@ -0,0 +1,32 @@ +--- +title: Code reviews +titleTemplate: ':title - Contribute to Tuist' +description: Learn how to contribute to Tuist by reviewing code +--- + +# Code reviews + +Reviewing pull requests is a common type of contribution. Despite continuous integration (CI) ensuring the code does what’s supposed to do, it’s not enough. There are contribution traits that can’t be automated: design, code structure & architecture, tests quality, or typos. The following sections represent different aspects of the code review process. + +## Readability + +Does the code express its intention clearly? **If you need to spend a bunch of time figuring out what the code does, the code implementation needs to be improved.** Suggest splitting the code into smaller abstractions that are easier to understand. Alternative, and as a last resource, they can add a comment explaining the reasoning behind it. Ask yourself if you’d be able to understand the code in a near future, without any surrounding context like the pull request description. + +## Small pull requests + +Large pull requests are hard to review and it’s easier to miss out details. If a pull request becomes too large and unmanageable, suggest the author to break it down. + +> [!NOTE] EXCEPTIONS +> There are few scenarios where splitting up the pull request is not possible, like when the changes are tightly coupled and can’t be split. In those cases, the author should provide a clear explanation of the changes and the reasoning behind them. + +## Consistency + +It’s important that the changes are consistent with the rest of the project. Inconsistencies complicate maintenance, and therefore we should avoid them. If there’s an approach to output messages to the user, or report errors, we should stick to that. If the author disagrees with the project’s standards, suggest them to open an issue where we can discuss them further. + +## Tests + +Tests allow changing code with confidence. The code on pull requests should be tested, and all tests should pass. A good test is a test that consistently produces the same result and that it’s easy to understand and maintain. Reviewers spend most of the review time in the implementation code, but tests are equally important because they are code too. + +## Breaking changes + +Breaking changes are a bad user experience for users of Tuist. Contributions should avoid introducing breaking changes unless it’s strictly necessary. There are many language features that we can leverage to evolve the interface of Tuist without resorting to a breaking change. Whether a change is breaking or not might not be obvious. A method to verify whether the change is breaking is running Tuist against the fixture projects in the fixtures directory. It requires putting ourselves in the user’s shoes and imagine how the changes would impact them. \ No newline at end of file diff --git a/docs/docs/contributors/get-started.md b/docs/docs/contributors/get-started.md new file mode 100644 index 00000000000..f78e0d718ed --- /dev/null +++ b/docs/docs/contributors/get-started.md @@ -0,0 +1,66 @@ +--- +title: Get started +titleTemplate: ':title - Contribute to Tuist' +description: Get started contributing to Tuist by following this guide. +--- + +# Get started + +If you have experience building apps for Apple platforms, like iOS, adding code to Tuist shouldn’t be much different. There are two differences compared to developing apps that are worth mentioning: + +- **The interactions with CLIs happen through the terminal.** The user executes Tuist, which performs the desired task, and then returns successfully or with a status code. During the execution, the user can be notified by sending output information to the standard output and standard error. There are no gestures, or graphical interactions, just the user intent. + +- **There’s no runloop that keeps the process alive waiting for input**, like it happens in an iOS app when the app receives system or user events. CLIs run in its process and finishes when the work is done. Asynchronous work can be done using system APIs like [DispatchQueue](https://developer.apple.com/documentation/dispatch/dispatchqueue) or [structured concurrency](https://developer.apple.com/tutorials/app-dev-training/managing-structured-concurrency), but need to make sure the process is running while the asynchronous work is being executed. Otherwise, the process will terminate the asynchronous work. + +If you don’t have any experience with Swift, we recommend [Apple’s official book](https://docs.swift.org/swift-book/) to get familiar with the language and the most used elements from the Foundation’s API. + +## Minimum requirements + +To contribute to Tuist, minimum requirements are: + +- macOS 14.0+ +- Xcode 15.0+ + +## Set up the project locally + +To start working on the project, we can follow the steps below: + +- Clone the repository by running: `git clone git@github.com:tuist/tuist.git` +- [Install](https://mise.jdx.dev/getting-started.html) Mise to provision the development environment. +- Run `mise install` to install the system dependencies needed by Tuist +- Run `tuist install` to install the external dependencies needed by Tuist +- Run `tuist generate` to generate the Tuist Xcode project using Tuist itself + +**The generated project opens automatically**. If you need to open again without generating it, run open `Tuist.xcworkspace` (or ue Finder). + +> [!NOTE] XED . +> If you try to open the project using `xed .`, it will open the package, and not the project generated by Tuist. We recommend using the Tuist-generated project to dog-food the tool. + +## Edit the project + +If you needed to edit the project, for example to add dependencies or adjust targets, you can use the [`tuist edit` command](/guide/project/editing). This is barely used, but it's good to know that it exists. + +## Run Tuist + +### From Xcode + + +To run `tuist` from the generated Xcode project, edit the `tuist` scheme, and set the arguments that you'd like to pass to the command. For example, to run the `tuist generate` command, you can set the arguments to `generate --no-open` to prevent the project from opening after the generation. + +![An example of a scheme configuration to run the generate command with Tuist](./scheme-arguments.png) + +You'll also have to set the working directory to the root of the project being generated. You can do that either by using the `--path` argument, which all the commmands accept, or configuring the working directory in the scheme as shown below: + +![An example of how to set the working directory to run Tuist](./scheme-working-directory.png) + +> [!WARNING] PROJECTDESCRIPTION COMPILATION +> The `tuist` CLI depends on the `ProjectDescription` framework's presence in the built products directory. If `tuist` fails to run because it can't find the `ProjectDescription` framework, build the `Tuist-Workspace` scheme first. + +### From the terminal + +Although `tuist` provides a [run command](/guide/automation/run) it does not support CLIs yet. Therefore, you'll have to use the Swift Package Manager to run the tool. To do that, you can run the following command: + +```bash +swift build --product ProjectDescription +swift run tuist generate --path /path/to/project --no-open +``` \ No newline at end of file diff --git a/docs/docs/contributors/issue-reporting.md b/docs/docs/contributors/issue-reporting.md new file mode 100644 index 00000000000..f122d78efac --- /dev/null +++ b/docs/docs/contributors/issue-reporting.md @@ -0,0 +1,51 @@ +--- +title: Issue reporting +titleTemplate: ':title - Contribute to Tuist' +description: Learn how to contribute to Tuist by reporting bugs +--- + +# Issue reporting + +As user of Tuist, you might come across bugs or unexpected behaviors. +If you do, we encourage you to report them so that we can fix them. + +## GitHub issues is our ticketing platform + +Issues should be reported on GitHub as [GitHub issues](https://github.com/tuist/tuist/issues) and not on Slack or other platforms. GitHub is better for tracing and managing issues, is closer to the codebase, and allows us to track the progress of the issue. Moreover, it encourages a long-form description of the problem, which forces the reporter to think about the problem and provide more context. + +## Context is crucial + +An issue without enough context will be deemed incomplete and the author will be asked for additional context. If not provided, the issue will be closed. Think about it this way: the more context you provide, the easier it is for us to understand the problem and fix it. So if you want your issue to be fixed, provide as much context as possible. Try to answer the following questions: + +- What were you trying to do? +- How does your graph look? +- What version of Tuist are you using? +- Is this blocking you? + +We also require you to provide a minimal **reproducible project**. + +## Reproducible project + +### What is a reproducible project? + +A reproducible project is a small Tuist project to demonstrate a problem - often this problem is caused by a bug in Tuist. Your reproducible project should contain the bare minimum features needed to clearly demonstrate the bug. + +### Why should you create a reproducible test case? + +A reproducible projects lets us isolate the cause of a problem, which is the first step towards fixing it! The most important part of any bug report is to describe the exact steps needed to reproduce the bug. + +A reproducible project is a great way to share a specific environment that causes a bug. Your reproducible project is the best way to help people that want to help you. + +### Steps to create a reproducible project + +- Create a new git repository. +- Initialize a project using `tuist init` in the repository directory. +- Add the code needed to recreate the error you’ve seen. +- Publish the code (your GitHub account is a good place to do this) and then link to it when creating an issue. + +### Benefits of reproducible projects + +- **Smaller surface area:** By removing everything but the error, you don’t have to dig to find the bug. +- **No need to publish secret code:** You might not be able to publish your main site (for many reasons). Remaking a small part of it as a reproducible test case allows you to publicly demonstrate a problem without exposing any secret code. +- **Proof of the bug:** Sometimes a bug is caused by some combination of settings on your machine. A reproducible test case allows contributors to pull down your build and test it on their machines as well. This helps verify and narrow down the cause of a problem. +- **Get help with fixing your bug:** If someone else can reproduce your problem, they often have a good chance of fixing the problem. It’s almost impossible to fix a bug without first being able to reproduce it. \ No newline at end of file diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Contributors/manifesto.md b/docs/docs/contributors/principles.md similarity index 51% rename from docs/Sources/tuist/tuist.docc/Articles/Tuist/Contributors/manifesto.md rename to docs/docs/contributors/principles.md index 82efd68d830..a6830958f7f 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Contributors/manifesto.md +++ b/docs/docs/contributors/principles.md @@ -1,26 +1,30 @@ -# Manifesto +--- +title: Principles +titleTemplate: ':title - Contribute to Tuist' +description: This document describes the principles that guide the development of Tuist. +--- -This page describes principles that are pillars to the design and development of Tuist. They evolve with the project and are meant to ensure a sustainable growth that is well-aligned with the project foundation. +# Principles -Here follows a list of the most important principles: +This page describes principles that are pillars to the design and development of Tuist. They evolve with the project and are meant to ensure a sustainable growth that is well-aligned with the project foundation. -## 1. Default to conventions +## Default to conventions -One of the reasons why Tuist exists is because Xcode is weak in conventions and that leads to complex projects that are hard to scale up and maintain. For that reason, Tuist takes a different approach by defaulting to simple and thoroughly designed conventions. Developers can opt-out from the conventions, but that’s a conscious decision that doesn’t feel natural. +One of the reasons why Tuist exists is because Xcode is weak in conventions and that leads to complex projects that are hard to scale up and maintain. For that reason, Tuist takes a different approach by defaulting to simple and thoroughly designed conventions. **Developers can opt-out from the conventions, but that’s a conscious decision that doesn’t feel natural.** -For example, there’s a convention for defining dependencies between targets by using the provided public interface. By doing that, Tuist ensures that the projects are generated with the right configurations for the linking to work. Developers have the option to define the dependencies through build settings, but they’d be doing it implicitly and therefore breaking Tuist features such as "graph" that rely on some conventions being followed. +For example, there’s a convention for defining dependencies between targets by using the provided public interface. By doing that, Tuist ensures that the projects are generated with the right configurations for the linking to work. Developers have the option to define the dependencies through build settings, but they’d be doing it implicitly and therefore breaking Tuist features such as `tuist graph` or `tuist cache` that rely on some conventions being followed. The reason why we default to conventions is that the more decision we can make on behalf of the developers, the more focus they’ll have crafting features for their apps. When we are left with no conventions like it’s the case in many projects, we have to make decisions that will end up not being consistent with other decisions and as a consequence, there’ll be an accidental complexity that will be hard to manage. -## 2. Manifests are the source of truth +## Manifests are the source of truth -Having many layers of configurations and contracts between them results in a project setup that is hard to reason about and maintain. Think for a second on an average project. The definition of the project lives in the _.xcodeproj_ directories, the CLI in scripts _(e.g Fastfiles)_, and the CI logic in pipelines. Those are three layers with contracts between them that we need to maintain. How often have you been in a situation where you changed something in your projects, and then a week later you realized that the release scripts broke? +Having many layers of configurations and contracts between them results in a project setup that is hard to reason about and maintain. Think for a second on an average project. The definition of the project lives in the `.xcodeproj` directories, the CLI in scripts (e.g `Fastfiles`), and the CI logic in pipelines. Those are three layers with contracts between them that we need to maintain. *How often have you been in a situation where you changed something in your projects, and then a week later you realized that the release scripts broke?* We can simplify this by having a single source of truth, the manifest files. Those files provide Tuist with the information that it needs to generate Xcode projects that developers can use to edit their files. Moreover, it allows having standard commands for building projects from a local or CI environment. -Tuist should own the complexity and expose a simple, safe, and enjoyable interface to describe their projects as explicitly as possible. +**Tuist should own the complexity and expose a simple, safe, and enjoyable interface to describe their projects as explicitly as possible.** -## 3. Make the implicit explicit +## Make the implicit explicit Xcode supports implicit configurations. A good example of that is inferring the implicitly defined dependencies. While implicitness is fine for small projects, where configurations are simple, as projects get larger it might cause slowness or odd behaviors. @@ -28,42 +32,35 @@ Tuist should provide explicit APIs for implicit Xcode behaviors. It should also The definition of dependencies is a good example of that. While developers can define dependencies through build settings and phases, Tuist provides a beautiful API that encourages its adoption. -Designing the API to be explicit allows Tuist to run some checks on the projects that otherwise wouldn’t be possible. Moreover, it enables features like “tuist graph”, which exports a representation of the dependency graph, or “tuist cache”, which caches all the frameworks as `.xcframeworks`. +**Designing the API to be explicit allows Tuist to run some checks and optimizations on the projects that otherwise wouldn’t be possible.** Moreover, it enables features like `tuist graph`, which exports a representation of the dependency graph, or `tuist cache`, which caches all the targets as binaries. -We should treat each request to port features from Xcode as an opportunity to simplify concepts with simple and explicit APIs. +> [!TIP] +> We should treat each request to port features from Xcode as an opportunity to simplify concepts with simple and explicit APIs. -## 4. Keep it simple +## Keep it simple -One of the main challenges when scaling Xcode projects comes from the fact that Xcode exposes a lot of complexity to the users. Due to that, teams have a high bus factor and only a few people in the team understand the project and the errors that the build system throws. That’s a bad situation to be in because the team relies on a few people. +One of the main challenges when scaling Xcode projects comes from the fact that **Xcode exposes a lot of complexity to the users.** Due to that, teams have a high bus factor and only a few people in the team understand the project and the errors that the build system throws. That’s a bad situation to be in because the team relies on a few people. Xcode is a great tool, but so many years of improvements, new platforms, and programming languages, are reflected on their surface, which struggled to remain simple. -Tuist should take the opportunity to keep things simple because working on simple things is fun and motivates us. No one wants to spend time trying to debug an error that happens at the very end of the compilation process, or understanding why they are not able to run the app on their devices. Xcode delegates the tasks to its underlying build system and in some cases it does a very poor job translating errors into actionable items. Have you ever got a “framework X not found” error and you didn’t know what to do? Imagine if we got a list of potential root causes for the bug. +Tuist should take the opportunity to keep things simple because working on simple things is fun and motivates us. No one wants to spend time trying to debug an error that happens at the very end of the compilation process, or understanding why they are not able to run the app on their devices. Xcode delegates the tasks to its underlying build system and in some cases it does a very poor job translating errors into actionable items. Have you ever got a *“framework X not found”* error and you didn’t know what to do? Imagine if we got a list of potential root causes for the bug. -## 5. Start from the developer's experience +## Start from the developer’s experience Part of the reason why there is a lack of innovation around Xcode, or put differently, not as much as in other programming environments, is because **we often start analyzing problems from existing solutions.** As a consequence, most of the solutions that we find nowadays revolve around the same ideas and workflows. While it’s good to include existing solutions in the equations, we should not let them constrain our creativity. -We like to think as [Tom Preston](https://tom.preston-werner.com/) puts it in [this podcast](https://tom.preston-werner.com/): _"Most things can be achieved, whatever you have in your head you can probably pull off with code as long as is possible within the constrains of the universe"_. If we imagine **how we'd like the developer experience to be**, it's just a matter of time to pull it off — by starting to analyze the problems from the developer experience gives us a unique point of view that will lead us to solutions that users will love to use. +We like to think as [Tom Preston](https://tom.preston-werner.com/) puts it in [this podcast](https://tom.preston-werner.com/): *“Most things can be achieved, whatever you have in your head you can probably pull off with code as long as is possible within the constrains of the universe”.* If **we imagine how we’d like the developer experience to be**, it’s just a matter of time to pull it off — by starting to analyze the problems from the developer experience gives us a unique point of view that will lead us to solutions that users will love to use. -We might feel tempted to follow what everyone is doing, even if that means sticking with the inconveniences that everyone continues to complain about. Let's not do that. _How do I imagine archiving my app? How would I love code signing to be? What processes can I help streamline with Tuist?_ For example, adding support for [Fastlane](https://fastlane.tools) is a solution to a problem that we need to understand first. We can get to the root of the problem by asking "why" questions. Once we narrow down where the motivation comes from, we can think of how Tuist can help them best. Maybe the solution is integrating with Fastlane, but it's important we don't disregard other equally valid solutions that we can put on the table before making trade-offs. +We might feel tempted to follow what everyone is doing, even if that means sticking with the inconveniences that everyone continues to complain about. Let’s not do that. How do I imagine archiving my app? How would I love code signing to be? What processes can I help streamline with Tuist? For example, adding support for [Fastlane](https://fastlane.tools/) is a solution to a problem that we need to understand first. We can get to the root of the problem by asking “why” questions. Once we narrow down where the motivation comes from, we can think of how Tuist can help them best. Maybe the solution is integrating with Fastlane, but it’s important we don’t disregard other equally valid solutions that we can put on the table before making trade-offs. -## 6. Errors can and will happen +## Errors can and will happen -We, developers, have an inherent temptation to disregard that errors can happen. -As a result, we design and test software only considering the ideal scenario. +We, developers, have an inherent temptation to disregard that errors can happen. As a result, we design and test software only considering the ideal scenario. -Swift, its type system, and a well-architected code might help prevent some errors, but not all of them because some are out of our control. -We can’t assume the user will always have an internet connection, or that the system commands will return successfully. -The environments in which Tuist runs are not sandboxes that we control, and hence we need to make an effort to understand how they might change and impact Tuist. +Swift, its type system, and a well-architected code might help prevent some errors, but not all of them because some are out of our control. We can’t assume the user will always have an internet connection, or that the system commands will return successfully. The environments in which Tuist runs are not sandboxes that we control, and hence we need to make an effort to understand how they might change and impact Tuist. -Poorly handled errors result in bad user experience, and users might lose trust in the project. -We want users to enjoy every single piece of Tuist, even the way we present errors to them. +Poorly handled errors result in bad user experience, and users might lose trust in the project. We want users to enjoy every single piece of Tuist, even the way we present errors to them. -We should put ourselves in the shoes of users and imagine what we’d expect the error to tell us. -If the programming language is the communication channel through which errors propagate, and the users are the destination of the errors, they should be written in the same language that the target (users) speak. -They should include enough information to know what happened and hide the information that is not relevant. -Also, they should be actionable by telling users what steps they can take to recover from them. +We should put ourselves in the shoes of users and imagine what we’d expect the error to tell us. If the programming language is the communication channel through which errors propagate, and the users are the destination of the errors, they should be written in the same language that the target (users) speak. They should include enough information to know what happened and hide the information that is not relevant. Also, they should be actionable by telling users what steps they can take to recover from them. -And last but not least, our test cases should contemplate failing scenarios. -Not only they ensure that we are handling errors as we are supposed to, but prevent future developers from breaking that logic. +And last but not least, our test cases should contemplate failing scenarios. Not only they ensure that we are handling errors as we are supposed to, but prevent future developers from breaking that logic. \ No newline at end of file diff --git a/docs/docs/contributors/scheme-arguments.png b/docs/docs/contributors/scheme-arguments.png new file mode 100644 index 0000000000000000000000000000000000000000..20c6656ac68107690049d053a777cb918b5ef3e6 GIT binary patch literal 205728 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�P!R#TW*KxBD+ps1C?SV; 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 z�o=C8)KD5;VxSHQ>B^=*Q1oHujNA1|OtYI)z)NT`Wg*6ETG>gpTq`rw(%X*>19Ti&g_BU3@#P$lSVjvcV%C+!|C&XHNPf)na?DR#Hfud!x;4%d2h4 z^<;Jx+!;U<`#85sJjm@eBUw{>J2ms{|nWAhimD+r55nQ}CXg`lll? zd4Z13SiiyVas9wX*qv*O+5PD!{!G|Gf`Cgd>rC^Pl#8Ec$K~4LN?j4c+NbBag-1X^ zB=nSQ@>0+H#H1YTcvHIhx2l9i_~F!^yRD1x!?H=-=awGEwfn*#CpfMdgm+2 z7gN8;;q@NMWS4I|bYdMY&6N>hSGtyNq`x*R%Ub)j0KjtEQ{G%TFL`#JZ%zvDR5&Qu z%rY5|;mRJiW67TuY|Is2;cU3R>~=ie$eyMCzV21IhZ0O06hCUB|7w$gfkixJBz|Qx z9_}@lNgcWFJyfUfG)0|J<8*NP*V;_3B>8o0TPn5As_mR$1Q)2Y z8M`OUdL%lUzbPav+2M7U%Cot>o>M$BSVP7*(THu^VzViaKwe(<_b-@u36WOyR#-Si3W2 z{F!g{BI>*2sjUC%GKnhmyQx@C`e?iJ2KUZ_~U= z#O&I$g&aEDi!Oaqu7%SrLpD6hTKG-9*Y4+3jjP;DFa5Nu!>G*MGd?B0-g+B%Jh#88 zc8Lr=oI3(8vym_SXfs|CFTTqelpnwfodv~q?F<(KXe^DY2MVbl7^H#H80gQGiL}1% z=qoR#Vxx%Wv+FNLyjhS7g>zmw@I?M1p_c1RSZn>RJJ!D

    dgqh}5 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�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 literal 0 HcmV?d00001 diff --git a/docs/docs/contributors/scheme-working-directory.png b/docs/docs/contributors/scheme-working-directory.png new file mode 100644 index 0000000000000000000000000000000000000000..a9cef0fcce4a1a7a8a29f70697dd24c2151cda8a GIT binary patch literal 224059 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 + +Understanding the build process is crucial to optimize the build times. Unfortunately, Xcode doesn't provide a lot of insights into the build process. Therefore, we are working on a set of features that will allow you to understand the build process better. This will require the usage of `tuist build`, so if you are not using it yet, we recommend you start using it. + +## Building schemes + +To build schemes of a project, you can use the `tuist build` command. This command will generate the project if needed, and then build it using the `xcodebuild` command-line tool. + +::: code-group +```bash [Build a scheme] +tuist build MyScheme +``` +```bash [Build a specific configuration] +tuist build MyScheme --configuration Debug +``` +```bash [Build all schemes without binary cache] +tuist build --no-binary-cache +``` +::: + +> [!NOTE] XCODEBUILD ARGUMENT FORWARDING +> We don't support forwarding arbitrary arguments to `xcodebuild` yet. If you need to pass arguments to `xcodebuild`, you can use the `--verbose` flag to see the command that Tuist is running, and then run it manually with the arguments you need. + diff --git a/docs/docs/guide/automation/clean.md b/docs/docs/guide/automation/clean.md new file mode 100644 index 00000000000..000e0dbd3bc --- /dev/null +++ b/docs/docs/guide/automation/clean.md @@ -0,0 +1,30 @@ +--- +title: Clean +description: Tuist provides a command to clean global caches and local caches +--- + +# Clean + +Tuist relies on project-scoped and global caches to speed up some of its workflows. If for any reason you want to clean these caches, you can use the `tuist clean` command. When no argument is passed, the command cleans all the cache categories. Otherwise, you can pass the cache category you want to clean. + +## Categories + +The following are the categories of caches that Tuist manages: + +| Category | Content | Scope | +| ---- | ---- | ---- | +| `binaries` | Binaries for [Tuist Cloud binary cache](/cloud/binary-caching) | Global | +| `selectiveTests` | State for [Tuist Cloud selective tests cache](/cloud/selective-testing) | Global | +| `plugins` | Pre-compiled plugins | Global | +| `generatedAutomationProjects` | Projects generated for automation tasks like `build` | Global | +| `projectDescriptionHelpers` | Pre-compiled modules for project description helpers | Global | +| `manifests` | JSON-serialized manifest files to speed up project generation | Global | +| `dependencies` | SPM dependencies fetched by Tuist | Project | + +You can can pass one or multiple categories to the `tuist clean` command. For example, to clean the `binaries` and `plugins` categories, you can run: + +::: code-group +```bash [Clean plugins and binaries] +tuist clean plugins binaries +``` +::: \ No newline at end of file diff --git a/docs/docs/guide/automation/generate.md b/docs/docs/guide/automation/generate.md new file mode 100644 index 00000000000..8994fc0dda2 --- /dev/null +++ b/docs/docs/guide/automation/generate.md @@ -0,0 +1,29 @@ +--- +title: Generate +description: Learn how to generate projects and workspaces with Tuist +--- + +# Generate + +Project generation is the core feature of Tuist upon which all other features are built. Once the project is defined following the [directory structure](/guide/project/directory-structure) and manifest files, you can generate the project using the `tuist generate` command. This command reads the manifest files, generates the Xcode projects and workspace, writes it to the disk, and opens it in Xcode. + +> [!NOTE] WORKSPACE GENERATION +> Tuist always generates a workspace, even if you have a single `Project.swift`. This is by design to ensure that the project is always generated in a consistent way. + +## Generating a project + +To generate a project, you can use the `tuist generate` command. This command will read the manifest files, generate the Xcode projects and workspace, write them to the disk, and open them in Xcode. + +::: code-group +```bash [Generate and open] +tuist generate +``` + +```bash [Generate without opening] +tuist generate --no-open +``` + +```bash [Generate without cache binaries] +tuist generate --no-binary-cache +``` +::: \ No newline at end of file diff --git a/docs/docs/guide/automation/graph.md b/docs/docs/guide/automation/graph.md new file mode 100644 index 00000000000..225a3748f57 --- /dev/null +++ b/docs/docs/guide/automation/graph.md @@ -0,0 +1,43 @@ +--- +title: Graph +description: Tuist provides a command to output and visualize a project graph +--- + +# Graph + +One of the advantages of extracting the project graph from from its implicitly codified form in Xcode projects and workspaces, is that Tuist knows it ahead of time and can provides useful features to developers. One of those features is the ability to export and visualize the graph through the `tuist graph` command. + +## Graph image + +By default, `tuist graph` outputs and opens the image `graph.png` at the root of the project: + +::: code-group +```bash [Opening it] +tuist graph +``` +```bash [Without opening it] +tuist graph --no-open +``` +```bash [In a different directory] +tuist graph --output-path /tmp/graphs +``` +::: + +## Algorithms and formats + +When the dependency graph is large, the generated image might be hard to visually parse. +In those scenarios, we recommend playing with other formats and algorithms and using interactive tools to work with them: + +- **Formats:** `.dot`, `.json`, `.png`, and `.svg` +- **Algorithms:** `dot`, `neato`, `twoapi`, `circo`, `fdp`, `sfdp`, and `patchwork`. + +## Filtering + +You can use some flags to filter nodes from the graph: + +- `--skip-test-targets`: Skip Test targets during graph rendering. +- `--skip-external-dependencies` Skip external dependencies. +- `--platform`: A platform to filter. Only targets for this platform will be showed in the graph. Available platforms: `ios`, `macos`, `tvos`, `watchos` + +> [!NOTE] PLANNED IMPROVEMENTS +> The filtering options are not flexible enough and can grow into an incosistent filtering interface. We are aware of that and we have plans to come up with a language that's universal across various commands. \ No newline at end of file diff --git a/docs/docs/guide/automation/run.md b/docs/docs/guide/automation/run.md new file mode 100644 index 00000000000..f061541a570 --- /dev/null +++ b/docs/docs/guide/automation/run.md @@ -0,0 +1,25 @@ +--- +title: Graph +description: Tuist provides a command to run xcodebuild-compiled artifacts such as iOS apps +--- + +# Run + +Unlike Xcode's GUI, Xcode's CLI, `xcodebuild`, doesn't provide a way to run the compiled artifacts of your project. Tuist provides a command to run the compiled artifacts of your project, such as iOS apps. + +> [!TIP] ONLY IOS APPS SUPPORTED +> We currently only support running iOS apps. Support for other platforms is planned. + +## Run an iOS app + +The `tuist run` command generates the project if needed, then compiles it with `xcodebuild`, and launches the built artifact from the derived data directory in the specified simulator. + +::: code-group + +```bash [Run on iPhone 15 with iOS 17.4.1] +tuist run MyApp --device "iPhone 15" --os "17.4.1" +``` +::: + +> [!NOTE] EXISTING SIMULATORS +> If Tuist can't find a destination that matches the specified device and OS, it will use the first available simulator. \ No newline at end of file diff --git a/docs/docs/guide/automation/test.md b/docs/docs/guide/automation/test.md new file mode 100644 index 00000000000..39907d20341 --- /dev/null +++ b/docs/docs/guide/automation/test.md @@ -0,0 +1,41 @@ +--- +title: Test +description: Learn how to use Tuist to run tests for your projects +--- + +# Test + +Tuist projects can declare test targets that run tests for the project. Traditionally, teams execute them using Xcode's GUI, the `xcodebuild` command-line tool, or higher-level abstraction tools like [Fastlane Scan](https://docs.fastlane.tools/actions/scan/). Tuist provides a command, `tuist test` to generate the project if needed, and then run the tests with the `xcodebuild` command-line tool. + +## Why Tuist over xcodebuild + +You might wonder what's the value of using `tuist test` over generating the project with `tuist generate` and running the tests with raw `xcodebuild`. + +- **Single command:** `tuist test` ensures the project is generated if needed before compiling the project. +- **Beautified output:** Tuist enriches the `xcodebuild` output using [xcbeautify](https://github.com/cpisciotta/xcbeautify) +- [**Selective testing:**](/cloud/selective-testing) If you are using Tuist Cloud, Tuist can selectively run tests based on previous runs. + +### Tuist Cloud Test + +Test flakiness is a tremendous source of frustration for developers and loss of productivity. Therefore, we are working on a set of features that will allow preventing, detecting, and fixing flaky tests. This will require the usage of `tuist test`, so if you are not using it yet, we recommend you start using it. + +## Running scheme tests + +To run the tests of a project, you can use the `tuist test` command. This command will generate the project if needed, and then run the tests using the `xcodebuild` command-line tool. + +::: code-group +```bash [Running scheme tests] +tuist test MyScheme +``` +```bash [Running all tests without binary cache] +tuist test --no-binary-cache +``` + +```bash [Running all tests without selective testing] +tuist test --no-selective-testing +``` +::: + +> [!NOTE] XCODEBUILD ARGUMENT FORWARDING +> We don't support forwarding arbitrary arguments to `xcodebuild` yet. If you need to pass arguments to `xcodebuild`, you can use the `--verbose` flag to see the command that Tuist is running, and then run it manually with the arguments you need. + diff --git a/docs/docs/guide/introduction/adopting-tuist/migrate-from-bazel.md b/docs/docs/guide/introduction/adopting-tuist/migrate-from-bazel.md new file mode 100644 index 00000000000..201d86987cb --- /dev/null +++ b/docs/docs/guide/introduction/adopting-tuist/migrate-from-bazel.md @@ -0,0 +1,83 @@ +--- +title: Migrate from Bazel +description: Learn how to migrate your projects from Bazel to Tuist. +next: + text: "Directory structure" + link: /guide/project/directory-structure +--- + +# Migrate from Bazel + +[Bazel](https://bazel.build) is a build system that Google open-sourced in 2015. It's a powerful tool that allows you to build and test software of any size, quickly and reliably. Some large organizations like [Spotify](https://engineering.atspotify.com/2023/10/switching-build-systems-seamlessly/), [Tinder](https://medium.com/tinder/bazel-hermetic-toolchain-and-tooling-migration-c244dc0d3ae), or [Lyft](https://semaphoreci.com/blog/keith-smiley-bazel) use it, however, it requires an upfront (i.e., learning the technology) and ongoing investment (i.e., keeping up with Xcode updates) to introduce and maintain. While this works for some organizations that treat it as a cross-cutting concern, it might not be the best fit for others that want to focus on their product development. For instance, we've seen organizations whose iOS platform team introduced Bazel and had to drop it after the engineers that led the effort left the company. Apple's stance on the strong coupling between Xcode and the build system is another factor that makes it hard to maintain Bazel projects over time. + +> [!TIP] TUIST UNIQUENESS LIES IN ITS FINESSE +> Instead of fighting Xcode and Xcode projects, Tuist embraces it. It's the same concepts (e.g., targets, schemes, build settings), a familiar language (i.e., Swift), and a simple and enjoyable experience that makes maintaining and scaling projects everyone's job and not just the iOS platform team's. + +## Rules + +Bazel uses rules to define how to build and test software. The rules are written in [Starlark](https://github.com/bazelbuild/starlark), a Python-like language. Tuist uses Swift as a configuration language, which provides developers with the convenience of using Xcode's autocompletion, type-checking, and validation features. For example, the following rule describes how to build a Swift library in Bazel: + +::: code-group +```starlark [BUILD (Bazel)] +swift_library( + name = "MyLibrary.library", + srcs = glob(["**/*.swift"]), + module_name = "MyLibrary" +) +``` + +```swift [Project.swift (Tuist)] +let project = Project( + // ... + targets: [ + .target(name: "MyLibrary", product: .staticLibrary, sources: ["**/*.swift"]) + ] +) +``` +::: + +Here's another example but compating how to define unit tests in Bazel and Tuist: + +:::code-group +```starlark [BUILD (Bazel)] +ios_unit_test( + name = "MyLibraryTests", + bundle_id = "io.tuist.MyLibraryTests", + minimum_os_version = "16.0", + test_host = "//MyApp:MyLibrary", + deps = [":MyLibraryTests.library"], +) + +``` +```swift [Project.swift (Tuist)] +let project = Project( + // ... + targets: [ + .target( + name: "MyLibraryTests", + destinations: .iOS, + product: .unitTests, + bundleId: "io.tuist.MyLibraryTests", + sources: "Tests/MyLibraryTests/**", + dependencies: [ + .target(name: "MyLibrary"), + ] + ) + ] +) +``` +::: + + +## Swift Package Manager dependencies + +In Bazel, you can use the [`rules_swift_package_manager`](https://github.com/cgrindel/rules_swift_package_manager) [Gazelle](https://github.com/bazelbuild/bazel-gazelle/blob/master/extend.md) plugin to use Swift Packages as dependencies. The plugin requires a `Package.swift` as a source of truth for the dependencies. Tuist's interface is similar to Bazel's in that sense. You can use the `tuist install` command to resolve and pull the dependencies of the package. After the resolution completes, you can then generate the project with the `tuist generate` command. + +```bash +tuist install # Fetch dependencies defined in Tuist/Package.swift +tuist generate # Generate an Xcode project +``` + +## Project generation + +The community provides a set of rules, [rules_xcodeproj](https://github.com/MobileNativeFoundation/rules_xcodeproj), to generate Xcode projects off Bazel-declared projects. Unlike Bazel, where you need to add some configuration to your `BUILD` file, Tuist doesn't require any configuration at all. You can run `tuist generate` in the root directory of your project, and Tuist will generate an Xcode project for you. \ No newline at end of file diff --git a/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodegen.md b/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodegen.md new file mode 100644 index 00000000000..6705e70fa0a --- /dev/null +++ b/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodegen.md @@ -0,0 +1,84 @@ +--- +title: Migrate from XcodeGen +description: Learn how to migrate your projects from XcodeGen to Tuist. +next: + text: "Directory structure" + link: /guide/project/directory-structure +--- + +# Migrate from XcodeGen + +[XcodeGen](https://github.com/yonaskolb/XcodeGen) is a project-generation tool that uses YAML as [a configuration format](https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md) to define Xcode projects. Many organizations **adopted it trying to escape from the frequent Git conflicts that arise when working with Xcode projects.** However, frequent Git conflicts is just one of the many problems that organizations experience. Xcode exposes developers with a lot of intricacies and implicit configurations that make it hard to maintain and optimize projects at scale. XcodeGen falls short there by design because it's a tool that generates Xcode projects, not a project manager. If you need a tool that helps you beyond generating Xcode projects, you might want to consider Tuist. + +> [!TIP] SWIFT OVER YAML +> Many organizations prefer Tuist as a project generation tool too because it uses Swift as a configuration format. Swift is a programming language that developers are familiar with, and that provides them with the convenience of using Xcode's autocompletion, type-checking, and validation features features. + +What follows are some considerations and guidelines to help you migrate your projects from XcodeGen to Tuist. + +## Project generation + +Both Tuist and XcodeGen provide a `generate` command that turns your project declaration into Xcode projects and workspaces. + +::: code-group + +```bash [XcodeGen] +xcodegen generate +``` + +```bash [Tuist] +tuist generate +``` +::: + +The difference lays in the editing experience. With Tuist, you can run the `tuist edit` command, which generates an Xcode project on the fly that you can open and start working on. This is particularly useful when you want to make quick changes to your project. + +## `project.yaml` + +XcodeGen's `project.yaml` description file becomes `Project.swift`. Moreover, you can have `Workspace.swift` as a way to customize how projects are grouped in workspaces. You can also have a project `Project.swift` with targets that reference targets from other projects. In those cases, Tuist will generate an Xcode Workspace including all the projects. + +::: code-group + +```bash [XcodeGen directory structure] +/ + project.yaml +``` + +```bash [Tuist directory structure] +/ + Tuist/ + Config.swift + Project.swift + Workspace.swift +``` +::: + +> [!TIP] XCODE'S LANGUAGE +> Both XcodeGen and Tuist embrace Xcode's language and concepts. However, Tuist's Swift-based configuration provides you with the convenience of using Xcode's autocompletion, type-checking, and validation features. + +## Spec templates + +One of the disadvantages of YAML as a language for project configuration is that it doesn't support reusability across YAML files out of the box. This is a common need when describing projects, which XcodeGen had to solve with their own propietary solution named *"templates"*. With Tuist's re-usability is built into the language itself, Swift, and through a Swift module named [project description helpers](/guide/project/code-sharing), which allow reusing code across all your manifest files. + +::: code-group +```swift [Tuist/ProjectDescriptionHelpers/Target+Features.swift] +import ProjectDescription + +extension Target { + /** + This function is a factory of targets that together represent a feature. + */ + static func featureTargets(name: String) -> [Target] { + // ... + } +} +``` +```swift [Project.swift] +import ProjectDescription +import ProjectDescriptionHelpers // [!code highlight] + +let project = Project(name: "MyProject", + targets: Target.featureTargets(name: "MyFeature")) // [!code highlight] +``` + +> [!NOTE] XCODEPROJGENERATOR +> We have plans to extract the project generation logic from Tuist into its own Swift Package, `XcodeProjGenerator`, which anyone can build their own generation tool on top of. \ No newline at end of file diff --git a/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md b/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md new file mode 100644 index 00000000000..a79ce1c3f3d --- /dev/null +++ b/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md @@ -0,0 +1,74 @@ +--- +title: Migrate from .xcodeproj +description: Assess the impact of Tuist and Tuist Cloud in your projects by using it with an existing Swift Package. +next: + text: "Directory structure" + link: /guide/project/directory-structure +--- + +# Migrate from .xcodeproj + +Unless you [create a new project using Tuist](/guide/introduction/adopting-tuist/new-project), in which case you get everything configured automatically, you'll have to define your Xcode projects using Tuist's primitives. **How tedious this process is, depends on how complex your projects are.** + +As you probably know, Xcode projects can become messy and complex over time: *groups that don't match the directory structure, files that are shared across targets, or file references that point to nonexisting files (to mention some).* All that accumulated complexity makes it hard for us to provide a command that reliably ports migrates project. + +Moreover, **manual migration is an excellent exercise to clean up and simplify your projects.** Not only the developers in your project will be thankful for that, but Xcode, who will be faster processing and indexing them. Once you have fully adopted Tuist, it will make sure that projects are consistently defined and that they remain simple. + +In the aim of easing that work, we are giving you some guidelines based on the feedback that we have received from the users. + +> [!TIP] SCALING A MATURE IOS CODEBASE WITH TUIST +> You won't be the first one to migrate a mature iOS codebase to Tuist.You can read how [Asana](https://asana.com/inside-asana/scaling-a-mature-ios-codebase-with-tuist) migrated theirs and the impact that it had on their development workflows, or how [Bumble](https://medium.com/bumble-tech/scaling-ios-at-bumble-76754fa874f7) evaluated Bazel, Tuist, and SPM and ultimately chose Tuist. + +## Extract your build settings into `.xcconfig` files + +The leaner the projects, the easier they are to migrate. To make them thinner, you can extract information like build settings that can be defined outside Xcode projects. You must prevent developers from defining settings using build settings. + +You can use this snippet for that: + +```bash +# Extract target build settings +tuist migration settings-to-xcconfig -p Project.xcodeproj -t MyApp -x MyApp.xcconfig + +# Extract project build settings +tuist migration settings-to-xcconfig -p Project.xcodeproj -x MyAppProject.xcconfig +``` + +After extracting the build settings into .xcconfig files, we recommend adding a check in continuous integration to ensure that build settings are not set to the project: + +```bash +tuist migration check-empty-settings -p Project.xcodeproj -t MyApp +``` + +## Migrate the most independent targets first + +Those are usually simpler since they contain fewer dependencies than the rest. That makes them good candidates from which we can start the migration. Use this command to list the targets of a project, sorted by number of dependencies. We recommend starting from the top, with the target that has the lowest number of dependencies. + +```bash +tuist migration list-targets -p Project.xcodeproj +``` + +## Remove broken references + + +Go through your target sources and resources build phases, and delete references to files that are missing. Although Xcode's build system ignores them, they might complicate the migration. + +## Remove files that are not used by any target + +There might be files that were once part of the project, but that they are no longer needed. Find and remove them. Otherwise, you might run into compilation issues because your glob patterns (e.g. `**/*.swift`) ended up matching them, and adding them as sources of your targets. + +## Prevent modifications of Xcode projects after they've been migrated + +After the migration of each project, add a script that fails CI if someone modifies the Xcode project directly, and lets developers know that they should change the manifest files instead. + +You can use a tool like [xcdiff](https://github.com/bloomberg/xcdiff) for that. + +## Use project description helpers + +They allow defining your own abstractions for defining your projects, and most importantly, they allow reusing content across all your manifest files. One of the most common use cases is defining functions that act as factories of templated projects. After migrating all your projects, go through the Project.swift files to identify common patterns and extract them into helpers. + +## Tools + +Here's a list of community-developed tools that can aid you on the migration process: + +- [xcdiff](https://github.com/bloomberg/xcdiff): A tool which helps you diff xcodeproj files. +- [Xcode Build Settings](https://xcodebuildsettings.com/): A reference for all the build settings available and their meaning. \ No newline at end of file diff --git a/docs/docs/guide/introduction/adopting-tuist/migrate-local-swift-packages.md b/docs/docs/guide/introduction/adopting-tuist/migrate-local-swift-packages.md new file mode 100644 index 00000000000..fde9ccc0b8d --- /dev/null +++ b/docs/docs/guide/introduction/adopting-tuist/migrate-local-swift-packages.md @@ -0,0 +1,71 @@ +--- +title: Migrate local Swift Packages +description: Learn how to migrate from Swift Package Manager as a solution for managing your projects to Tuist projects. +next: + text: "Directory structure" + link: /guide/project/directory-structure +--- + +# Migrate local Swift Packages + +## Using SPM as a project management + +Swift Package Manager emerged as a dependency manager for Swift code that uninentionally found itself solving the problem of managing projects and supporting other programming languages like Objective-C. Because the tool was designed with a different purpose in mind, it can be challenging to use it to manage projects at scale because it lacks flexibility, performance, and power that Tuist provides. This is well captured in the [Scaling iOS at Bumble](https://medium.com/bumble-tech/scaling-ios-at-bumble-239e0fa009f2) article, which includes the following table comparing the performance of Swift Package Manager and native Xcode projects: + +![A table that compares the regression in performance when using SPM over native Xcode projects](./performance-table.webp) + +We often come across developers and organizations that challenge the need for Tuist considering that Swift Package Manager can take a similar project management role. Some venture into a migration to later on realize that their developer experience has degraded signicantly. For instance, the rename of a file might take up to 15 seconds to re-index. 15 seconds! + +**Whether Apple will make Swift Package Manager a built-for-scale project manager is uncertain.** However, we are not seeing any signs that it's happening. In fact, we are seeing quite the opposite. They are making Xcode-inspired decisions, like achieving convenience through implicit configurations, which [as you might know,](/guide/introduction/cost-of-convenience) is the source of complications at scale. We believe it'd take Apple to go to first principles and revisit some decisions that made sense as a dependency manager but not as a project manager, for example the usage of a compiled language as an interface to define projects. + +> [!TIP] SPM AS JUST A DEPENDENCY MANAGER +> Tuist treats Swift Package Manager as a dependency manager, and it's a great one. We use it to resolve dependencies and to build them. We don't use it to define projects because it's not designed for that. + +## Migrating from Swift Package Manager to Tuist + +The similarities between Swift Package Manager and Tuist make the migration process straightforward. The main difference is that you'll be defining your projects using Tuist's DSL instead of `Package.swift`. + +First, create a `Project.swift` file next to your `Package.swift` file. The `Project.swift` file will contain the definition of your project. Here's an example of a `Project.swift` file that defines a project with a single target: + +```swift +import ProjectDescription + +let project = Project( + name: "App", + targets: [ + .target( + name: "App", + destinations: .iOS, + product: .app, + bundleId: "io.tuist.App", + sources: ["Sources/**/*.swift"]* + ), + ] +) +``` + +Some things to note: + +- **ProjectDescription**: Instead of using `PackageDescription`, you'll be using `ProjectDescription`. +- **Project:** Instead of exporting a `package` instance, you'll be exporting a `project` instance. +- **Xcode language:** The primitives that you use to define your project mimic Xcode's language, so you'll find schemes, targets, and build phases among others. + +Then create a `Tuist/Config.swift` file with the following content: + +```swift +import ProjectDescription + +let config = Config() +``` + +The `Config.swift` contains the configuration for your project and its directory, `Tuist`, serves as a reference to determine the root of your project. You can check out the [directory structure](/guide/project/directory-structure) document to learn more about the structure of Tuist projects. + +## Editing the project + +You can use [`tuist edit`](/guide/project/editing) to edit the project in Xcode. The command will generate an Xcode project that you can open and start working on. + +```bash +tuist edit +``` + +Depending on the size of the project, you might consider using it in one shot or incrementally. We recommend starting with a small project to get familiar with the DSL and the workflow. Our advise is always to start from the most depended upon target and work all the way up to the top-level target. \ No newline at end of file diff --git a/docs/docs/guide/introduction/adopting-tuist/new-project.md b/docs/docs/guide/introduction/adopting-tuist/new-project.md new file mode 100644 index 00000000000..13f4c98a571 --- /dev/null +++ b/docs/docs/guide/introduction/adopting-tuist/new-project.md @@ -0,0 +1,112 @@ +--- +title: Create a new project +description: Learn how to create a new project with Tuist. +next: + text: "Directory structure" + link: /guide/project/directory-structure +--- + +# Create a new project + +The most straightforward way to start a new project with Tuist is to use the `tuist init` command. This command generates a new project with a default structure and configuration. + +## Initializing an application project + +To start, you'll need to create a directory where the project will be created: + +```bash +mkdir MyApp +cd MyApp +``` + +Once the directory is created and you're inside it, run the following command: + +::: code-group +```bash [iOS project] +tuist init --platform ios +``` +```bash [macOS project] +tuist init --platform macos +``` +::: + +The command will initialize the project in the current directory. You can then [edit the project](/guide/project/editing) running `tuist edit`, and Xcode will open a project where you can edit the project. One of the files that are generated is the `Project.swift`, which contains the definition of your project. If you are familiar with the Swift Package Manager, think of it as the `Package.swift` but with the lingo of Xcode projects. + + +::: code-group +```swift [Project.swift] +import ProjectDescription + +let project = Project( + name: "MyApp", + targets: [ + .target( + name: "MyApp", + destinations: .iOS, + product: .app, + bundleId: "io.tuist.MyApp", + infoPlist: .extendingDefault( + with: [ + "UILaunchStoryboardName": "LaunchScreen.storyboard", + ] + ), + sources: ["MyApp/Sources/**"], + resources: ["MyApp/Resources/**"], + dependencies: [] + ), + .target( + name: "MyAppTests", + destinations: .iOS, + product: .unitTests, + bundleId: "io.tuist.MyAppTests", + infoPlist: .default, + sources: ["MyApp/Tests/**"], + resources: [], + dependencies: [.target(name: "MyApp")] + ), + ] +) +``` +::: + +> [!NOTE] +> We intentionally keep the list of available templates short to minimize maintenance overhead. If you want to create a project that doesn't represent an application, for example a framework, you can use `tuist init` as a starting point and then modify the generated project to suit your needs. + +## Manually creating a project + +Alternatively, you can create the project manually. We recommend doing this only if you're already familiar with Tuist and its concepts. The first thing that you'll need to do is to create additional directories for the project structure: + +```bash +mkdir MyFramework +cd MyFramework +``` + +The create a `Tuist/Config.swift` file, which will configure Tuist and is used by Tuist to determine the root directory of the project, and a `Project.swift`, where your project will be declared: + +::: code-group +```swift [Project.swift] +import ProjectDescription + +let project = Project( + name: "MyFramework", + targets: [ + .target( + name: "MyFramework", + destinations: .macOS, + product: .framework, + bundleId: "io.tuist.MyFramework", + sources: ["MyFramework/Sources/**"], + dependencies: [] + ) + ] +) +``` +```swift [Tuist/Config.swift] +import ProjectDescription + +let config = Config() +``` +::: + +> [!IMPORTANT] +> Tuist uses the `Tuist/` directory to determine the root of your project, and from there it looks for other manifest files globbing the directories. We recommend creating those files with your editor of choice, and from that point on, you can use `tuist edit` to edit the project with Xcode. \ No newline at end of file diff --git a/docs/docs/guide/introduction/adopting-tuist/performance-table.webp b/docs/docs/guide/introduction/adopting-tuist/performance-table.webp new file mode 100644 index 0000000000000000000000000000000000000000..c88f70643c329c4780e7043c5f83216e0909b587 GIT binary patch literal 56498 zcmbrk1ymi|)+UNe@L<8+-QC?GXmEFjAi)Xl?(VL^3GVLhZo%DlLvqf!=l1*ijUJc#8jY#fl4d8jkr zuE#g&X6QNY7W)bSe4nAa$~@<*=ey@c#Nk;*#JAfL%@L-05E&!2q=AW1MuxqJ)u9Jt$6v+9qJsm13b^%fxG~>{jb1){R*9Y zz&M~1VEo$u5;%!)ptH=^_&VTa0@yrm-}YjC8GrJ+2VCt_gSxA&t$*$v(F@7 zOWuK!dQAh6 zUqf$?4-+5po-z--=DaQda&N5y=zV+9VXqB<(ChqdB>=FYdbxfKxbW%%b7-AQ^_vEfthqj2%J`bPuFr}!d__{Urvg#fR)mj%4O9y1PxW+6;hi_ zloNS%1#_IBO7r#ghLxqOe8lJN;xRW}66ZK6Bhq{CGjcBx*3ZB1D5P7oBHJ`zI+v)* z(>tf;Zi`TnGNEO^y+JQ_kJBq#j5?mCUfIRjk> zKUkPz>-_o`qv0u2lN@H2tF8lK23Hh@sT{S^z&wB-+l6E2@d&RA8OllU_p=(Q2FX(w zV$2lWxT?G5bjERdO?;GNpa9Aqif`YU0)ij)J`}K96|>>WNloqoUaBmmda}QWXM1~K z=8-7HEiYE#?)^~`h_?83t2^$^@IYfjixnycfD}$E$#u!321b4Y1%Jgx){&sL+uBnxU?W0h}q-6&MLtoAjry)MAMJX9sH8xytl)(?(yKo$wDU+QEi#Cu~k)=o5 z`GoqAuF1cKu$*q_lk!E?7(cqDRJ?7Q6>Z8ez4xuuc-j`X@B8jTiiAsL`@m~OgK-%M z!c+>Ajsm6)MT~Qb(1V}n6k+!$eQxPpf1)9Oe;^8_@9nL4MpIDYy7&3eV$LK~xZDZA z5C#68xvt>&r__EVev_X%@7c-1kq$PD@1;X{ssfLhOu2$rLV$%0%=)k4J#)To(Jvl>l{aQGb4VRW{p*Yl~ zxS|joO+L?B)*!xnlLg5X>~jf??Z6ktR{zd{Q^}C7dJ z89XO#)q`ajGfTqSO_lyFP=3va$c~gdZM3G z0=WYIN(W9Bqf-8Kck7Kt&rT|o-RNi;#5|_1uPuGV5564w6yhELev0)f{tgu9+`I@V z#jFB0`mE~oH9gT@VMqQRaG~CwpuAoVooF!$9FWZ`MpNnoN?yQrQl*H_q)c4xhP>@+ zx(ga*JOHJr5X$WCWfHX?*BAh#wjJn+^%?*#DU@`rhQAyhP)WS2?5oxr>GdJyf|?KI zzVau0lpfJ&8J=Z0T6@VAUm>7^O8Ttz1DT+eBt;MVRu~d{&Mf&lz%9S?!PlU zY_4cuDAC`d{p3IOhCd`!=Xhzh?}23WJJO|1npS>?vHJ(@IAoX8_aJl2oca@I8S4v` zRC%TezUF^p;s3lWPWlSIfICed2UUfKIz{+p?Bhows*OtDwh#Be7cdBmJt>eJU4p_! z?x^RgojTzEUT70tkGhx7e-ZxFn-;;o{a-V^=e+q%#5&ZU1ma&c;N?o!|F7KG3`9n# zB;Jz45?Oba0XoM4I}m6FFKMvG_{iaCi_Mo4p!N9%dTueiRmj9loUrbAOx!Y{*5y=j zBg(%Eyzm^e`Bx_+@f!>QW0dImVkDBO5*R!oYJZBRY|sl}I7jaUbpncn+G`+Zzcmta zmC^hG*8&Eak-`|3OYZuRx-gppG6SAKv9Z>CsTv)bQy?ohKF-bC+t(h8Nvs$!)3k_=M+JwM+Dec|W2p zdfG&?O*ptQDQ|GQd)Bz(dBN#~+f>cyKGj8hsOcVy{6)FWjFnF!b6=YLW9fJ3<|)F* z@8zyWLtjY2j$pvr8`(b-NmY%UALK#Nw7=Fe><`df2#1S@f=VtKv3?$lzDd?J4QJf+ zMloKi)wB^*M(^_xEP-{RgMuZ0GN1Rj5pEq~3)WiKzRZ&w6nesqT~Xovah*30Znl0Q zoCfad?gw8N{8elXVxsRml1wB$(sk0X{*lctz=aR>ifwvj)?OXo7Ln9Fd+{jn3Ak#x z3+VX`c8#cxx|eD=<`m8_Ve>2TMe&YMe~2e(+@bOJx%VhP$w@C( zihp00_XlQq#vQx)jhGaj{{Le?wczR3Ro|rZ>NGz$qyQ(PpSG(}yYuRu$NGQ$VS~AG zcmC(Lzti&{wirMBO@nVw^Jv`xvB-G2luD|tRs$E#wV9j%g1Q_$ z;^>=3yK8`PHn|Gl>D7{hGn1-J6Rz@?ASqzVL66T$3B%xva>{q+9Qnx=UZI#cgJ#hl zB+r4b;dDT@t~r7Frb|8yW}+ISL0>i|(izTI4jvwZ$JJ|kc&EgAW3E{%cga3yzo6Ls zjRI@g&%pt+%*jum9Y1C=ZE-j3m5xt5WV2fwXUjvx_&!v>5{Hxz0l~%*ROvr1@7|4p z@#Xws%9SPVD*vO>Mqw+%qMcQ#g)LbxpLOgl(5o8+3bIq}(nGsFBgmq}CYSP|jQ!@Z zWe30d5a~U#C}26(!7?y=OL28!F-NNxb0dYM$QWha34Tz%bvXx->BM{FFPFdHS<^`^ zlH5yhTD_e!9{3%Pe{=Kx&bzQk8uyOqif2WSIg8kpb9nrXiUmx|GkkBr|8FM$&)J{)`X#DRLg08ger~UApvz7vHmp|kUG$H_j5Qp=d z!COubvv5JPl2~Ek#UrS2+7NxA@c(OuGZzZOlEAmh@74!J?wC%(smf<&rplHleJWI?tRV+^u%4CoAXpW0Ay*SgS~DV^TjC zfOPyvuWagmoZzXPnf?=nz!=4%w?c7bjU^kjD%*{xToG$A5B}mYIZky7e1{do9X^d> zf#k*0O0z67=ojeLZd?V5ku2MEm2KzM_DaxYM8ywM1=UWsBX$fVk8A7U7;wne!y|*ya%AM!n z(!&`^s+j|EEHh9Avn=Dnk*1|Yt23oLm`R2&zQW}s0s2fJL?3h-9>^Ft65+RtcxrVb zyHou(L@1X#cNmyjSjV)t^qu0}2+&5H0dY29s6!F94wu&y^#G;l&5Zm-Fj-dX!idb1HNst4gZG|sZXRk#r`YKrisEX z{}m}xsO-s2nEwZqBV(id{Qz_lqwkOWCUhrVwKgtw!`M+3$B{;mM%ZGC2!o}WUpf#9ykL?(2&Vg!-BtAq=Noh z@NgV}H#z{jNdBmf4-=MKm%488PUPZHax74Ej`BF2l(TQfGY!%O#i~wuc?Wf~0n)Z_FN)KXaAQUNd>Uza*y!+ehx8X;LzJvYQE-b!DbZ=K64-?Iy)H z#m3)5aMJHPwJkt$l(-$3yEi>(DE@YZ7~nnY<8}Yygx;%Xg5MFkK~yHQpsr^)dVO=_ z&ofs4&J^SvkpusQ=OX@p;z9pO=#6{d(dRz_QTo9`WOvVcTUMG4(wUT{3gp^A`qZaW1l!pf5bwEykpEXdB%k)CelyG2L2 z-51-uYQfj%JYwz9+DnZ|rT&sf?8Mt_MQ`O_&>fWEo?5Q`;z_@?=6g>OoEazO_S3Oj z)DSEF)Y?3JoPV>)spON40nDI$3pEg)E~ce5ev<13=zsPjUYd%nN}Lq{rKh*zdS=sn z?8%3Z(x<2iM^CeDTJDhd1F=_f-y82NjMf5jI98W9B>l_ZS?2Ou^86aC4un~4%XkyR zR3zUyw_Xg7%q`*GAqs?*6|U&0htcP;uhp#J&HrXs)M}T%HEYki7k+1q|5&{7QJxuO&L5jb$1Cjp+bo`X{l*ohjnCIvsqZQB4tmlYz%c*m`F}#- z(_+caza%hy$y_V{&3ud<*?)50j5$b<3#rfbuWmL;Q|xDpepCK`bjw@pW$fGjWm3P% zTK{p4|I+pZ+-__7L;c-b4`@%9N6Dk3G{2Z5o%T4p>mQQ~#=KCm5L&;=#sb&5-0+Tm zDPU(PH^P5cQTHgVje-a9F70hRZPqT|ew>oizt=&=q7@SwNY@=)kge57pKSU(TgRBQ z4v2&v-w?<#xKkC5nx#Fkh8Z{0BT2S#Qv~fRb~o|w|AyV^>9-I7Y?Ha>ROVf|rl*&6 ziEmZ)X}-{=2TAR_yE9lmz0LQwOL98vxEyHyqayFzbe#jka8A76uIuyV>68eUcdW}s zBUNc>^E=9_&g=w$=`LO(22*eX6|vIe;j@U^_F$a@r=1u90Z|J#h8iq`m@{J@yxHI%@{ z|ASk~t~++RCT=X1?_xwmjM*v|f*Rl#lnSYXB_aTZT2VV10JgGZ7Z(rvk9qpbLw&fX z<}*P?73xDV$KHpAMvDL6eN@xE^za`h8viX_m^O%Tklv^YLlzo0KCNy%2n!euIyrAo98x z*76lSKdY9DfOP1~6z>mNc9@`KULWS85hVQVPf@2GbNwXPGo7R9E9k_Sqjsg%e}NB6 zh_IqU2qHr6xcJEdPATD7B#!C#@zb}XwDv!Kp|qaw@1nJyJK6k<-zXO8HDAlGdV`7A zCz+mNOAsYTjV6iC=d*f(kqM?VD@`nL!HQ@geYWfXk_G11rzx`v>XH>k=w?GE&4 z<$ZHIU=|M_|M3TJjCuOE5lPJ3`y+Gn4>{g=@g2Or5$jvTEB_CZ5(_&ktq-EXU-~3u zEXt&Gx$eKD#~k?^+eGx(Wk~d7u!gpsewE`{_^q_nz1L>RTht1`i>~fMCW~do*X>tswRQzgGw5gfMI<4(f5J$E=egYEYkK#0 zH3@qCvJ2S5=n1yAUYJas8cuEN0_>@eopMb)T`0R`fdM^3a;Mr_$H~iJbQ9IRux_U! zX0)V8`3xaz5Yhf0`}gL_AEy}!n1YFBKD_+!G~I;Tf7fk9Ja$;;qq{~4BV#V~Y$d`o zFX-x_xdvPs6u#f=tCi4k`YAFYJ0;bg8@aAbsc_ypD2T`px1gp@QW*>6>yKc0km%HT zX}~lx(UkE_=?qvH8zt{=B|Ciz$9Eir!53RynaQIy2D6iK5jV^GB9suPGS51b#xhBx z6KJ)mMpfy6_`<9c((?+8d4}D44szkvpjLZ*FR_mPI>~;+*0@~fY*%4E*x9 z4yIOzAydkA_U@D|p3AlbHK}`shiE~KseFb78n=kkr+TA7(e~f8^~s1AL{aC4*>XZI z;H}8@u1g&r71Tf(jS=5UvOjjL3G3cvt9Iz!zoYn^oaJ}j=8b}4!~e2&dE0*}!b5bO z=n}A&Ddm4kNB>k{|Fr@)zp%Mc`rpN)PkZ%?rd)&UvHy5_4gduM_?mI`JntKh&K^uZ z5=CLeFs6OvLGQlfCe`@JLsdFicx7R5vEHEWoc)(zO;cA# z*t+<_zQdLV#r8^13t4I%v&j{lQ zLL_Xm)Oi&zAsb8jLCj8%c~16EcVpR=Qh0c6i>cig|bOn~`-n9qvRE;1E4H#zL3s2{K7``ZocGHSj$M z(|z&0w%mj4+(kmhPeD6Nc0V0?y$oNgln^27LK91>!wiv*)9{9WjK|Z8&I5nyI=)Ee z5avj-g@X?};)K*fPLA+f<#pxGa>6XMGQtQ7%&^CYGsEE7Bso{aA-Dow6{Y1BSLq8u z5@PD`>%l4_JuZ1uP#_Hz%SD4ojfzV7Dj_eKenaytjrDH}fggoWPtb6lL&gN?()1*y zP<)9@3$OS680a&X(rwUvva8LI0fu-mIMf56B?D~ZiX}TxJI5N}4bDU&xo-m{ZMo_l zaWUpdq#|^2$k2qLobZ+NV%{v!0Cc@JyLRk&h|Az6!E(|Q3C}ZDB`UK%Vn1zJw+L6o z4I<&I?NeQ;03sl%Tu#};4-+I^=}Bj22xa zYYe+peC<`F)rP8%i>qm<;IPdH3x?U=iZ?z|Q@%F8UG^I^{FUr04+w;qkMt1GZlV>D zpSDd@+x)eq=&|$$E-=c8?=3+o^|B@{J#(cIkXz>#_LAj3vnMg zGPH1{2X3vPEhn*DvNW9+^I%VnSTnU&dK@zCb_UcJPIwP?uV_atYE*1}EaL%>oa^`+ z?Oe>;)(i6|_1ajzv6aAUg%*Paw8>leG+EM;^)yuM+ykRf;05jJCfEg~@)ElAxajj$ z{z@2AIa+)ZPGRs)NA|uG0&u+>PT>tsAAAwpZo{0OU7$hv=q$cuhQV+?NZy_vsO|D<9nz&lAf4E|qBvSe8jYae?N>4!|UNvuK^A=mTEOU||#0p%P zk6*AMt!k=!|N1B`40}hWxjOCobI8P^BY@U-=1KA=DgURI>4r~_xfJ;Dt8~|n&8Guy z&R#$TB%o7V{jXbj}-M! z$wq>&Aw0`kR;yCkYK*#}@xH1`ge;Sl=%=bziuATe``@ka2wP|Z2gv&Bim151Ss=$q zz*}`9I|s_Wc-pEMzBtY#itP=#W9{CptLdMCRH-S4^6Y8lA-qY^OM^c$|F1kr$N5u@ zIVb0u{HriCW%pMmIfhnd*v8%`EN&F|ECR1TUy>BP+5wv&|p@|05j zpAK`@%T8L{Li^hcZnZiK^&Eq766nB({k2*-gA(*7+goGL+HHJg*u=>YOrHK12YG0A5{)U3M%EOv6o z4&YM8=eGON7wch>(D|~wC`y0M3RL$hO9wHT{EWjm_q z(-Pb*uA2-D ziW_`34F1~Z!*h+9tKNJOXG?0BQ4zFpJ3?7~&j!63P3IR&7-z#OE;RMY+0bhUZcz_s zoCx9sRNSw0@tE&ug@O8rCNZ>%*Ad>@)=J`So|) z`nb)4X?wK1!*5`yHRBg?cd{0qk_7RgRSm*DLWF8C{<{ksHn^X7@`j?llyW&SCHu@^ zK|4EZxej|(C-mKf4vzg}8An}9Aq?7jQH1lupzX^jT_E7*Fj;Y5b5-l^>OIlCf69Um z7MvJ#B|?|7*tuN_@A*^AlABm7-DL$jY*YQ(0|aE*MZiUg0lXb=h{bDF9k|o$HCII- z!!1OAd^o4w?Mn=KUZpnQzy!%FJ##?+ICaj~Nqxe2^^n#(qJ2PO|Le*n&Vv7Re1jpJ z?w7!MTHqs?>gi#?0*zZ=lGS97#ePfZHW6pg$wMeHP^dsrVy@n6hLL=cHAE~{ypw6T zL$0*Tx}+jGifLWGB;e>HgJJWET3cyitxO+?0#DD@Y}ZFAS5Kt$Y|ZZp zD+IYyyirr>X?+<39Te_WIJfjYW%`3O98pcRjM5&a8iOlpb4nDC$2QMJK@{bt)}Rz(&mpZ#)kN;fk5E61(X+pB z$sxZ;H;JxODwJUzt$|lET@0YJ@j<46Mf+iB5QcpYRyZolB$>t#$BQGS z{&bSiS3|tYZBz|MNbe50a5O&MaO5VI9+}Q+Zp=Y(P~bqeMMn&d0sr05YpRXpF56%u zUH#&lkr@{;n?_O7r{f-DVKe!lBT>k2%Z+P0u_DK;!vHw6G^c4Tp2r*0A-mh$;XL;A zc!l8zT2ySM(S`t}1Vc`DTh{m@wo8KEKn-{N#Pl7t$sdTaFMeBK%XPxYJJE4n;G~(v zZr-nr!V`1)bT{s4z5Zpb)3OQ2wh3y6(gx422xQ_rO~ATL1B^>|$g;Vory-vM)?)*o zA%0-!bt;<5BFIYe&OhyOwwj9}h!%z=obR2ujq$rzyekt8RT2_gyn7k- z$elP3NMCdl^tv=qG+gf1%^^v}F#|J~H<99#!Hap!`YH^)V)udqq;*o$oAI$qq>Jzh zZgRs=8SzAK6?Oa0eAv3pvYOLud81krPdH7di>)5Nb!G0bVLimgamuJzUzz$B4kI{S zy)Y{`I;N(k>v9oSb(^=TK%Le+iCxP$ecZ{wCuN?6>s0dU$JtXWDN~5HjrwKYZ(}sT z7e^Q%imUkZRY}g0Q$gAFmQ^Np`n!8^&UaofENxET()EwE>ZZt&_j1=F%DSmOJIc&8 zX?1Np73cT)^U9bY7EsmbCu3w0WLiXk*d>WN-bRy1}y6!}~^d0{PjJ;+K?H_PxSw z+_4@?E;oi;iaX=^SvVNs`ZD8@i41ExzCq#PTg%<~ zu9bmY9IVtSC3{aHmAYY;z$%1$2C6IfX@^Rl@Wq;2}^FGw6G1(x5pzdd}N z36wJ4tG1|>&GD>g~P-hJFnz8fR1c{;CBv)0PX zZMhs4YEau7F5S+bXw;y%o&)m{6DBab%7+GS$1j)AJ*9TU4_Nkjm)*<1l@rp~r40nm z$yeQZ*}qHM=)84V0QiT=D#Bil*O_(@mrkQeNBglCX_RtZH5^92BNl$Z^hcVqLK9byL~L6SavKw-smc! ziBl>$wSS!`d3*YQ*t3|&PMW$b0 z__Zseb2yirSdZG22Q~~3{K>O-$}bO!FiUEvEU6UyDpr*!$sWvW%ZDVQtf7~aw3C{S z)d(mnx=AqW*6d^0xuP_@v<3PrF!)3wH_&5F8KtB(&2!nOsW*n`fL2A=+(ewrT^o4h zf4G~F9A-6*VCGnW za;BdNT9xeh{1E6W>^1JX8+t_&>S`h?J&do70%aLOzL+D`q%8{wA;c1MRW7H)`_>;h z1Bg_aQvvVSGVOZ72(Cl{?6Q7m9CbkdC7c((()O48YLy-V;iU|Gq9med)V&QhWA?+2 z2eRjaO7q1QtEZuxh)dTlscB&+WP9T%v>Vs*L+k}VJ9vo7Z9Gfu+tNW-=I%nzwrx|i z#u{3QG7mpT5(7e@1@}>)3o>p`2k{$F058U+aW*)(yVsScBBXv_d(n#_1ZD-H`#4)O1O`7 zYv+*UznPY9n|a*}(NYKLeE6|(-#4CBqqAL$bn0;Imn-RYuxhVoMbEXlaT2MG+Mg0N zLbwrbRC@!vMrMgubQV~f8x*07M^#N2BNw@7XNSex!Z!H~8Xm;(mAvBX^Rt|M3cuxN zPyQ(0A*)WwO5I8%KmL&bZ<<0J`~6le9z>l9m7lJ`MQuxD!6=mG?wtFsi&ogf%k}V+ z7F4LL-aDA>f^mA=6&l3am*0>FPgE7a(p^476ZpxL!;yWsnR=PPwCMR@Q748IVal4y zBLm0u0`LE6ff&h^g_o_7QZdt4fgMQQDiS+RFCHKbDss3R@lyijlv6>~zAH%7d+9sk zA+-FLIGD}I5(zdd&EfQX5e~*MK8T*)I#K}2uOjH(8^S{uZa2arMSMDLiqCe=rRQ6!Sk!D2>5e5XKRk{t4_MMf&e>Jt%#D>&k2}f z0c)@8o5~026qOKuAc${5CQ|`RMo)fnh(JKZA2=ubCxC#y##)lv8;GrYc~9f3zZAUU zdl!E#_UVi+&(nI_3Ja@>M0KMnm*dIWS)%kKp{(MxY}oRDswW}G#dMqlieIIw z?u?@_kIW|vCxj8dbBHpAC&{lmu13!%r<9`_1eJ_KkuE8~Zu&qAWwqS}s<~=u)}~3J zWMgA0s4q-Ka$1n&XlPk5n9#)Ngb{}mL!pi*!>=HhqDD19003tJGq56y8J#S1!k{*k zlJM0k?8yzi#hV|{E=tX3Qvz-%mw4+X5)Fs(Bd|t$I)M-?oG{;6 zLwLCNSnePok#pDliVwA%yu`gc_FVa4!jUxEFFMJoV#mBO7<1DAVgj`Qx-?Q<@&|T4 z7D7vg(zSx+DunH?z&OLJWbCw@kK7eo*yq)V;0hj^EbX8Y>QvPq!I^#ClT0$$GO2yw zR^%!~^MOuTyUG2PNc5?5IN>RT<(%@{At2U4tuf>r9Fa_YF?JC}KFD2P?=v@E&+iE3 zeNQV4uKxHyBu{$p!OXi4@zF=egFVh)DxW5A53HaPn-wdFFXD@qFm z0*kw3tHVJlr;KO~@bVzR3;;l%f!`DZCMEpXyV4eDLZDftNo+={nHG1h2)V^ud<&;3DXK@rzlZ_&4ue3|>r zGs0e#a9elovujR#`#>%F#Lu{jSYMwBqsCUUQbH=wk1Z|ML<$C((}(mFM_#nO z84jwxaz&1OUAR~&D}~%AnZ2*g(>e%`BqvR~x?$d7kOcnqXq%m1(t9ramw`T6(8*4G zN7s>*BZc&9p!6QJ#d-9|AKX-#3}jqb8@C3<3(d0yo=RLC$F&d%JdVQlRf5yOT$kbD z3ezM}C|yuxMkWiKHttlf_IY-)8sC!ZtC<%t>31?QOx80IbN6iP3^&B8@Oe2WX zJX|WimY9~LgbpbSmkFBWu*`D`R(R7x@wdf~HDtx?QGwM;S+)lWeZfE`Yu7_2 z4J*06_3FkBC<#%^L(s|0c!t0-ast^R85FPS)VgkX5Hf{n?Zzn>Rr}Y^r{gdin3+(T zXFz&Zwx}f&EU%(QM9xyoC!g1kj!8oRNZ_KVw#XZ7CAy$eR;A>h?WjnFu@R)cdP{L zsAS6tXbd)vxgs@jz&_Y>on%_4g4gS#>ChcC@7$n_7oIEHlrUy?p?jjI>IQ+)kGAVN zCT?5w0VKqU>&3oE7oJ<1;g3ye`N5EWtE3!lzUjJxzX^Sz{HCRyxCeV~=+BJNprjJ>Ub2*zwb#B+w^i#`rl7OD0 zRsOtRHZFc9P4wXW&<1RYCV=)qqgEbg=L>WyG<f#dylDRw}G$&NCx&+vEn0%_}Xo z7-vWSBxt?Ho zgkZ0RD>etqvt3atBO@6ZqSKea;Pg6AX{BS@Bl~#SX}lM5K}|HMSi|SSg|K_U$_ov( zFQHI=h%8656L8io54g&Mbc-xa3^%c*o-6nO(XS?8?Fy#zO`n=N7P{93&jotYxPAen zBP|;Rt-zxrFR(_CnN;%A)Fl+|5dPr#^^FCuf4gb@DXQfemZ<>77n`3Uq@cgoke7;e zpYt;oVt4jc_Nx*LreE_{xG-obLj zsQj+14yM6K9_?igx!rx7AY~sUN9K>FsK-SV!H9~<-C^%mlb`Rf5H3uU&L64KDjG~L zD?EvygrZEM!908@E94B6K~+*(IJ4D|g8lZqNCB0sKtULvlYO|4vkm+)t%=gg?1mp9$A*|hTYk=3#g+e>i&;bxI0Ny=s~zSg*h4_#`Y<&Vl0#*XzId z*lvnFtUMFwoa5>YUV9m5L+^4-Vq=QilEKGl_*tgbC{x^OuGD+70~im2k)!u;MGR7@ z#||NYB{^LUiV2*WOH= zY<>S+pWe;?sGCti#_lq}bH<%bgrto49ewhA#2yv)D^?J4jNIgCv(CJ^3j#@cL6B@j zyYt*cps90PaA32{Mh6KGXpLNO}CF!KQkoG z_P$D!>N}*goW=B4h`R!@J)Ke_Q}P|<2_mJotdgNQ=`@cR(vC)FLiNL4+fZfOmIQSn z^D0=pp(oAgt)xncP=_b6xN=cQN4yIzY*f$mx;M4qq=qOQdX*j1w21*p1_Ea2}@8gBP z{616gBURbYcofNIwCncZUeP-Xg0Ks0V%+i$AjrT|%`#>yj%(Of%0W?1DctT&hnY;B z(je=YZM#ZGxTejAW+aPze5**`n_B)#7fo-$?iYdl3ix&Y&9D*4^*hAZ@9`ZlAvonR zgRij2_M~@GoGpYX7;d{Nrw(BT&#j?6;>*X$kRK5GbNs4{<4cAuH1h`T338?frar2678;MyOAULbS7!jIyX(d zgjINxS=9_2a0<%&I0WsyY&;Enu=G5*Y@+au?OcAqm4kqBs}m4Y-ePDX@W9p1+4266 zlI?&g&H-(ycW?%zGL4MTdg3{XArnbE^@eDC6Y_JHeBCFZRy=eoB&P})rr=OBPh9_( zd47Ml*T8H51beXqgS0A6x2oFLvWF;5dR24c^M{r_hW@&<=k$w5?f{7D!M^Q=qrsP} zh^RQ>8I}x5;KbMq51DMyHRi9GIh{7Qpk0wdX$)A$aEYS&%#sPgO!PoECWy7z#n$fU*j;xTojQ}t>Q-jeN@R!$^J)9_(-TW<07KM*c8rm z*^a{xGYkD>0eRa$JMZrq_~x|x^-KnXzo>70Qlg|{;GQE}(-R0fp%p;hf`hTR>rmS%~wag(F96h7-TxQfAW>;FnvFJOf z9!QC$84bpQkdDp&EH(p41r@dOO4jN0I&mMl9SGKGq5-!>S(34v_GpfYklA;H7fPneL&kF=2?c6V{T zG2z=k*M8MM1Y(T=V}3zW&OynaVl2t-kONzcZX)(GPK7qDV8wL5EIyKaaI? z#<4lkr(6g(8<&+=l~_vMc_IKITROTKW2lV!#7W7LUiB}D*uskoP(X2j3DWr@d=vr2 z)@U8SdJ=N9y&MV_|(Mb$uWwNB(gtVVGgm7VsfZ!}mq zAAvhMr(T!XyNq}2avUNCnkG11bW~Ve{XUkpWMm)?c$M^uQ&JBaiH}#^^%4XoZ`5 z;ABEpcop-mB&Yk#w=4@h8KAHXJv$&g7l++MCe&8V8;yn9To38Lk1vv^E2AG+#4keB z-{1D7xSPmi;EsdcH5PZK=>>Qy9ERkqOs?T@agDsBe7Mo1RY=U&;GE@-U`&S^)}CT4 zTY z3iPp!#N)*NmHVar5zf=7uFJ!oH>FXVxzq zHNunXu3Cv7%yIF%H7&KozG}U;GZFxItF};`bt-K`tBaUTgZpL9xBxjYvgq<&DmicF~%x20<1*NEKE^m984N5u*>fO)o-Hvxji^pz(E{z&qWyKl0 zg?#-GSt_Cv41`WcKkY)zz%^6-C9QT4VKPT zhD0@|&(IA+!1yH%p}ySqLatra%sh}2z@Ziel>17_3O@Vm{#>gTr5i+IT0jm@v-lU( z&Vcjn4uWFe=#hE%^LLBeqvU$6CIqgSaGY8Ba;?OI3qX&Vt==WXKN+%-tSQCz^9iC26z5AeU%%vMEDH357Hu9LyFNZdDKD1EaN#H=q zkE)j0dRV3$YG|7Yg)E;-O!HWvV6`Ek;WQQrNEa16X}R#(vEoCnPs(U?s}Xc9lVgd% zL^)e6;`n^#2OkgDt!qWPgxben*&+3xJ_cWA^SySN&zGIeo=DGg%e=UAh=&;)aKEZm z0^3fe3%_RjyJ5tjQmUJFfFpwkC(SvOqJ0omufm6qr$qAK71tFj)#A*6D~X2S_u5I? zzsr>!ECx#_RW{@ll(JQ3c+nw)`m#VR-TX0bZjZ0J922#zYh*;S$jW?SK{{babZIa4 zC$`Fnfspq)LUpF<(9@|xotd(1WomgoST3DJ?au-$m-9p{`mv1V)lJKP*;4C9yvv&zVx%ma6~l>8TNp%#qYMMUT)mXa5gD^@PHmb3 zx9$%XoUxQ&a1d}qU~D^Bee($%E58|Hyae7dE@aW?E9OjtCJ&y_u-Xrxqpb;w{P7}E zSM2NzZS7A2U>zc7pLsN5IEuy0?`~#BqfB?*9}Qu+u3ER(zKXiUc1VafJi!{2P+>K! zC{NoKIlR?cj?dCK4?G$;6`(iLWq5(YU8Yg+;JYSUo3P2INr** z*Qpmkbhaq(6>Xx;#NDb-#JJ|C7eS7XQ<|L7a~VEv7~H;m;f`Z= zo7wQR0&+<#8a0SAq=UpOd+jGB=&_XF03`kHFuPx3c!6ChYB#h__QeHnPt~C9r+Jdp zA00O8OB&KaV9;`|Tiu+XKr1@flF0+v|HuNjd;`PtpZ1PTxK)h`bFl3V*Qe?+Xuu#F zMUo~Wjr|MzP+`$~@Oqt{PO%`n-8Z`Y*Q34~G@aNgRr)@arWH- z=~Xs*hqGO|EUX&G(0sv+6Ol^=A=j+YiRX_;(;9kKkhOs?oE_k$)FErbTbauf3$^ti zqmk*f+hp-}DF>Ia1zY-zqC0tX5L*}i#!`|JbD14w9gm=H-ZmaIBL7Ih1H6UKk)Yf< z=O)Tr8n*gLjN9dwNm9E>&ws0ku9Yf8O7%^$YdWQidmpiP|6nNt6)$W*F1@G3?alCp zbs<|vKFFKYW?5kEX$h&##84b#|0VGe0yq4sz`UtH-lT2Rdu+TSt4RhnV4+;L@|mpV z3deh2Z4bib8lW72Pb$I=W8n?38ny6YfA1Y79wDxM=98-AR{*iarbj)Sq?jsMXEiO_ zvp4@R8Iq0p>j|+b=8?SFNG{^p4K!YLK_=Gh>a)yg0;Fl+2$K)ST9B!C><5izut^MuT$v%yGRVwgNYU?*NU6OF1gt5$R#8M%;JX#QnNG)WFG;q1v25!mQt7G*B=2B!Rlmp`+ zt(H7;%j{Wbdsyz(>SK!`n;8S5_+y4mmmjPKyn{I)7Pf3g2vw-oDXS-Tajto3Xtnd0 z*_r9K%~^DGoR>P&3Bl^-LbP)noDL+9Y>R?*AQ`Cm`k_{N)`~vEyLY9r#T)mS_1wW>^(mW{8va8#nUZJBO|^a$LKYki&H&&u z6ED-&Y8sDc@;`Cu7LtgnDAYJ9Utl`9;8Z{izzxmU9)fIflzNkc@ zTO^c9HvC#DR{4Gw|2vm`L1rF+$IQ;Xrzp!j;>D-y+((^(&=h-aC4cdRr+Umwqr#|W z99UI67!08`0$6e^?WQ-}Rc%3mka(|asg^Hn_(b3Pl(}Dt$M}GJk2=cl9mVZ6nDvb z1o;vgr}Um+63uNjA`HJ!!R%te`vugfPBTUqaDn1L8Qdon?yPPqJY6*}$h#To(W{JL zxxjp$>&VK9TwuO-PO}jwLXY#m2P)1Jym%1pn^+8zHCv0$Fs&C9*CWCx8OP)x)h$yH zf{bPbpFrSAc90muUPVg_z1EAQ2W4;7ii;&6rBLOgEVOj0)X}y|Y5Cz&hYh2ot8HF<{)*ymTDs|;y4)+Z9kYPXXX)K2@3X^M+2x>6u~Y4 z2jcgXzrFJ(JFnXMxuy^4(^{32dyHwLA+ElvT zt4a)zVD?-g%oq-;;A5!#u|kE^&>G}YXw zulDu?#GLbfEK%u{H)nQZI%%G8RaBRpM1FP_xAu@iUwv+?B!pz4O~1#4Ptg;8^~|Y2>wp|K=D6jSrdS#9I_r75=d%BpA-&N@wiTJSSg4 zNc!gY_c9QhNDtlp!OrlHRT(aKFcRK*?mPSG^$+r3N|Wm#I0A^S$Z_m` zCKw}Bgz?$@PjQiO$8gs*rjQy@rvp8DeO(_IYGgsp6#m|rJX(qXP2vrrzKBi;@b)&n z&d1u-CL?GC>LT@Xkg1;Vvv=0UV=Tl-be%tz{^Ip9J-_5_D~c&uYPXcCwXo6!ef)i7 z{)~ayzAl+1RF2y4zUw&&Sc^Ngsn+jc=N3OS4~FQ_bEbsDeEswKGopNN!CDZ& z54s)_X2y^4T4=PrEEe{tCxaDWywW{W`at-$<3tFrQPUccnIDrKWQ;FIpyDHR*5*S- z${$!1n&2T9GFjvorJ7&_9+?;$5=Ips-NN1FNo=%wK#$ds%Mbo=HYd^;C1yh9alecW z0>-oa{3R;lv9#&0>mIXj6-B^`sr{zr7e`bx3szc)3Q1<7mX6K3II`pG@tSu4FRnT_ zzdzvMcAmlj+R_$sn8-JOY-H%vzFLUJ#ZWCa2oUgH z?+axXYU=k@On2vta1z$J75ILvaZNJr zXsMmeje6qMok}u#z_@q87poRu!m@$UGV4{jJ>ogVK4+MhoIm8(7({516Nox>P8oXI zx62`P!)lKWRx*`;)hn{-^^1Txnbt-|y?Q@gbwq=(Q6SDLEMt2H;&eS}AcSu6 zAu6$8rnRkPFE%Q9&IydTq^`=zN&pSM)xIx^>l>Qt(M_Xpp6Gqi-XXwh37?EO8cj|&C=IoeLOcYZPu`C37*24*^AN4eIrl0 zmRq0(3Z+Fy`7_%-q;5FVndF9@Blfu<(_8xE9c?(KWfj}HDmwf)Nv9H8Ugg`7AtomB zOv@m-%R|@o}RgY2%<7Fal|~C zo4~yvF;Kf|)>SyZA=F)?=%7#i#QVK9yG1v%DE5nNwbyS8NoxxApu}STO0tKz}P`TVLDjMylnmX<+2D%{)D< zkwT1qBQd-<jhx^0e~$SqH%Tj5`A{UVKCuRuyZ#ZGk4q60w=e#08ewrBu zJ2nf#CY%VSDnBr|A@=d#Ihuuv&RF}MsrgtXq@bigSHvyJus>H!KaOrp%kuAbW0AvR^b4&K!W$72DOQ))Br zCJvJ6T4s^mf5n|T$Ye&&N1vp)wPB4-xUdwf;j@Z|HtUHUz8S_}X1k4bJ64vbq*Hl^ zB02PQ_NgA9noz-e5he;($7K3L z3l|2%o+#0aYqHI_P1y(5_oG{5mjD?yg|Dt+1@5VVuA+{+Vp^XmwoQy1rZI=DX!9iU zv|mr?Iinz3qPQhPvS)Vhh(XM$&SBVmOKxXa)1m#&_XhS05iOrIA@<4vR~_F-OtNVM z(RUZuzCX%$K_*wqYyh1WRL8R{WZvzMI=yS4t{HA_y;AdSNfQ+&|I=4!Oxl2E)yNTg>!|9n2XF zTMicgULFe6gQthtdK1-0&+?r}zofr+*?ue(=qMDAH{0TgV)hF>*Q$6yTT*&{T^3oL zub2-F1(Pi2=^h-dE{Kdkt&pNMV+8Mwjsg`%wYZKGjfm*J(V)hV*0+ZP?!k3wzJq4!OZT-Km(j=)`AY>QE8n6%uIwQLe`E#X>paB+yq|NhOT zKX@tdANQge8yR3PQ5;y5_vnC`%Ny4T^IUOeNMY#f^^21T)b<)s0k8K^!X~$*C5TR8 z(*0)oenq4B_M(t9UCdUr&wtmniWWwSE*!{s`rKx4(79_QnC6-ZE#M^eE+A3*jbxM~ zH4Rwa6?%Bdp%G}?HYX-|r{87#?Ma_XR@o&mWBIJEdIeX$sc-)lQXd zK$8MW!9xxi5fT+eO9`Mwf^D!b+*cHed2b*GA0M!uSQ-2jPciE)bZ)I7^fl}OcK*tv zgTK+8NjUdZ_}^Qy#=WkI^4%Bh4PB9TfW#s;MTxac21IED=&P6U+x7)oCW;t}h$jS_ z33c>CF1k&NIR*YPIUNg)r=uZL3CJasXK(AYy}+!vFjT!U6_z|npY_!z8y)vjpb4kJ^*f1Nbr<&s9ahb zP<`TPxF_*z(_Dud24Vb=@k%RzQ+umC4H5^~LznUKq}bN9Diasd+m^O&CWfbnm8(l_ zZWG`4iy-Je9k8a-T0VvPq7~JSuVYwB#9rwE(gv;UzGXnzXF*lU06Afxqy=TFpdN2n zNjCz<_?)=3{6(!}kcvSn=t=`IKsVT8M_t?)N66a!F!VedBz{ z1a--VQmb&DWRj!-XqhZrZ4pLbPpPXb9OZ)6yVU!G_j?3g1EPqIaeSaC#@FS8^7wTv za@YW_Eca~w+RMm)e-PV?*D;zcERXKg(xz^Q6E>g^yHEgl8ovc?k{6laz;sdWfJ&j5wY(AB(H%v2~ zIy0(@i~WHU3?B^{^is$vi2PcS z5e3J-Q>UjTNsph1LRqkev>SK56wkju7VfVYE!bsI`}O=0&~jt<6>i>T5>fjr1p;WB z#EZ2i`uKgJcv5#lzXuV(qgJp8)Sb4EQ6y++84^MMJGcMFri8?QmHgE|XNFt(n@?m$ zA;uDrad*58_x?LOMl&jdL^38Lc9d$;3wPULlrwN)-4{CB?5!rBhLsVtS-6#$J$fYdlD$a|!Kf^hd<>Z-pq~;xBKp4$$!g+VU zvFk#u?qyZdb&6KSyf7arI^%PX;#QNfa!jPt)K#W?QKOQ3@}=7KU{kL&tvj4VOGINw z(c7jqPM9HNJ+)|{Xzc2kB!3l|4^y|X(ZN%jL25dw;Bo3h6Br9gVRLQ!aVG?W7v1?A zT;2yQYk`We0aJL@2=kW;f+pX%(GdguVfPJqmHaxI5<~}q)st;O|C2}srElf{%4-#$ zaUxo;XPmY_)2$)3^|Ijy%sFU^|~3(eH~46saO() z6ivLGtDeUp-!=T!g?HF!6D2k`t%B5CjUL~duwUzNGKngK`Cv$nXD0I|NGs<#&pT?N zu2qAI`kFRmP~t^ri6~D&2Q_3Nl7M98Jfm1ZYb7HHWCG3$#xEksv?D$u6A+1KhF-IwD7jTmer)+zJ>;&sMBm5G~asy2`6I+(W$JXSoZgd_6{V% ztzH+psGTS&xP8>=PF?vd7*<18)Br>6f`fnGruHMybaX6wupJ;OwpGws6}X(!1Zx3$ zJ14d%_?)y&qiz*S5il@~(h2ZuZ~ch_4~1t>r$4QzQx!(TVHv8iM12f^-C zD}25m3!t9e4z+1|hB%>ihrQ~NA&#p(VsCh4h!bj$+nXL5;{3ncaQb>B zqn*d_@;qi!G4Nwxct}1=V0wmt-TRR~M~|dW@#E>U{6zX3-~Y3ezpd@!g-Cs*i@m2T zDBHC%78#PSY=;iL*`M=vvsMT9&;hiHj3Zz5BukjD<6go;FAjer#$}PX^Ns(y{K!fc ztD07nUA)JxO1ai^_W2<@U;L~P8ApW&G7j#sg-Rx`j>uHuCm-dHS zRz-~S=hR+5>GZshtQ_29o?*o7_vmdt&lQf*cQTzl!lEK5JV*W4C0lM-$;q6a= zk~i#l$K}6^>RRinnp9P|>1>$eQUdEuJIk@^?NoHltP_3Nc?92}xG0+buZNF7kSL!S ze|Ybr%Cv899r$8V&H-Sk?Yp^@2l$iza1k6>0?@P+09oSPhOmhLlA}Jtqu5=I_&;P+ z_Fuw-2hdjs3ZQq?`F0M8tnH&X%|nH(^1Rcu1~Z_E z;!6kM5uku^y5&?OliB5m%P`<;WpN^ZNAtaF6oo>2NDwFaX0Sj(X*01rrnj++#$xPT zvbM;eFq3v&V;>fD*V*d5A$-*8yXX0n(Z9Gh1w=xP+%b4R`2s< zlj`Gd-L`-5#j(@qC-o=)wD^{d4eWGk#pM=FsVSE(Z&;6hn3QfjpF_4^q#Fdq{{A9P zX-=?cia@g)dJ~J$Wd;4tvRWnq?=8eKFVYODzmbwMopU2a-{Ij$vhw?*qJ@pB&&@d944(+pfyMyAdZO zafzboq>q1HVYg}o76;wsZ`&=fHoSUesx@Z$Ci3mCY|6OB745P>6q)MZn+Ieu47 z&T-F*EO@Xx3xtN9;WO{+NGZVdG`voF>p}PJ3B*W%(l@o9DaQx*=cOCZ)t-uw3W(>-H$54L z0{|`?_MGX9(_qyR7kybOEEZ-u!RNKqWRMN0Fh1$At6f3NB}StzPU`q=PEK+sbC)>0);IC z^j-B#Ow-^wK8a_>qPa*6`23v~tu zF>*FGno|<$1C9!y5g;x)F1q?4Cv8Zd)nRgJtY!5nSU0~%YPhRWkfEi~&z_qGv!^_l zMQn5q_FRozlnb@HDu>syu8oSsB$!edVenLU^}xXLMUo1x7R~yQT;g+ z_-hxE`3KUOvCr#7p$6XNp&UX`#yvw7U_r^?SMbetlUFZEvIQ7z(2)OLVrUsRJozvf zB=XskI0bOxb;yN5$h3uGhrDiV8)p9j`5__E0(p!`!=GZiTg^>A+Mm@NeEI1Y7Ku)d z=s;NORaPJ=sZ$FCVnxm;-iOwl=3g;USlBqIKIrS3TI`9V{i33x#}KDke5s4v-R zXIe9$flpeVtj&%Ke=4EnPno2fcsc7f38vLyJ!~*_NyS@m3A`rYk|Qe1IoAPCH7uo& ze}T<`@<9WGukWY{2Oc=2t&D9m63T%c#))cO10AU{qL}SWQ%6W=a#&uwt_E3+b;8N( zGlr3K(;@lKI>ECw+oz<1TFv6F2pTmt6MG14je$`7Z1)3q=Gofbjo>V%wRJsY5o@Ak zAH?2~98OCQ5DEv4Y`eYqeAhxa2EN+ZHeIs_WCqg;B<9>2;V;)Nax5CmYtm_fC_Q~as zHr}yU);oAkcWrPw=j{vmLx0tyQwhK!DvTjc+*9BlpLvr2qV=XT_|uDy86HqY6k2k> zwVGScJ2HPpWTuqS?_xHYT0@iah!o8UBqToz%CczEMuwwdVmP|C(MrKxftJ$v%gp6C z%0FN3P`Qd@(gOt^ungw+ha3A>YDw@;$^2|yo?=&4zCT2|}Ba{`v%E-~0d zw=k&f`!7Pj9%Xhxht^eeenSApJ(p$*a1>Y4HBjU&X3U*)ZXb|IgGryC8@^wNN!}SN z=&YJ*O9a_gac)dal{WHOE#We8ZQW~0@cX7}RV6H-De)*4Ayf_B6{ok;sB1y5y& zu@L+8i>clqSqE?w{mV-PcISYnh1B?UnA2tln29$F+}>et9nawf(7CQBgl(gHnEO5m zA6;BPKh2PBfspXis6uO>nx)JuWWN%k*J)3D)4>#Qs9Tg#D#w_K(n`BVOQBs+13fHJSoYz3nwu<#`_)M=uJT;g0}~ zfI_jwD`@IzN56;&qkRf%zkW|haPQxgw+pCDwzbWeGpGY{F6s-JBjjSK7y-r(MAQkFDKV=muir--{0&peIl}ukC-<9wPkS z?6|{+-Iv$gTI>bjrCk;2s`Pjd-RxRT6F|mLXNww5w1-3My-rZ<86SD|uUGc)uwZ{7GLQ($XE@x%YVmHZDC7@3U2OQvds<0J5td`r zbrS8|Ly8AYsg4ISd9#=It@a6@ho zi=#=u%RXCd)PNT#?&{i(_fj4qs3So}Nwvw4bSqYrZjACE$MC_|^zSBpvC-1kcDabu zYe9Igbz*E~!cDdS8&dCM7a!fEk6Ah~9s<#JclM3biXl0#vkc9>uKrSpf)%!^0Y90& zP~Mz$g(5vIQ+WAPi?F|ix;^@K(S;yGozz3txbkANoG=Fb50|St)rllWKtZQZ{{;_G zV8K9{?;TWN?s1J-t}b8_@(tcTE9PeOxDlg_oZ(b<4+?ZL!EY~6dfloFR8*Tn7kgm( zjF?46lzKngbSBHUjW@7xg$yGCg~wZ2?qZwrlejEmO8?;x(vL)y)M8B+ZptdepWc45 zgmq_iKtbchODhee)kiW5kHsqUBBakj_xNz-I+WAzrO_b8$jMK(siX?OJjtk!bPJpD zdTl8`kl8#~<1m0R>pa}gYZ(CUL1hWSN)36Fxyr~C&801MHADyi+?iVK!P1f>?mvj= zM7a=AH|r}Nl!h32wOY&jj?An8SU+yKt27|^gkdlwJL3>FjU{6eX-zKal$EIG{H%8^ zBwW-KvPJ7S=P@UE%u{lfsa=;uTKid$d|ruk+JrI--B=|&7Cq*~W_;m*+N>wG7%5+2 z8YX|n-;28d*=J^q6EV5_L5*g)FOYJ(Xy6IIe1~r%xjSv5KB%-H;CGTeug!|Cm;f*{ zauk#Fb1uPZ_nTR2wRQ(r%ZP2Vhxc5O5zCJt2V}65uL5znu)9dCl|i`I-`$yr&9gP; zwo~Q7(r=7R4(F~?Q02Mea#HNJgfkLqoIb;2NQ%zk!Mt=oO9SiMd8UT_l4ujnh0qI2 zo?cIpc+lwuMb|y$B)3>lAC@1hlzU=cLJT4F=DUloOZD2onF%xLh<@X1_+=^+<46ci6~mGLPgE)}#S) zmvEiS{VCFoh>p%IL&sIkHl*I^u&TH=7gMqBXK)2Ey5kYq2>^6j8X`V#ti_P_zihfv zySB57q_f~O$5{aUtLu)h0~DR7@GBddls$@Fj?4l^x&W&4eFMKuKvavu!w~UcH5G0q ztPHU)`0DsCy1o@`w@Dm#*Z|RbFd-Fl;U#c6elCmyVo+TZqpcUtRp6Vf$U+^(#~A0( z&t&fF*j=MgJ(c>?=~E*mKizO^wFl}HVbYkw-zV{!S-3LQ12v#KY%|aT2INVWM>pz? zVxcZWSsH0VaBU>4{ogbxykVXpRH&uh$%LAvQgJ`65+ld6h7yXwAl_pMU#D8-O!;`b+x z-weLYX|!n$8!`A9jK7*{mle+_(1```_#`^|~_P)hK)c zR0jadw(|kjKohu-c#~p1xXQ3 z^6Fn;e}i;inE#${^F+6qY98^(amKv`-RQrbs6#Vq3QyPIzw#Z9<2b6#tP@(1vtpX# z5shs4T#X3ig=i*h!Jwt2-rPN@M{Po|1nghE>KjV%e2$3L{wLdk5fpvpjVCyB@al*O zqdXK@q8+b;{W@~Wy$BiZu6H8`V_l(RTw5)zDNXrUly#Prh}Qbd@Bh5gdowKxj_>wl z_ao-#alkp6e}9=}O_OfD@k}qXPH;ZT0CB2tMP8lae%h_^?+>gsJ$yz=c)ur7Wn3E( z^re$idO#}g*n-U8sbE^O;6nr2Bo4UwZ;CS}tQjCvv(3ogp+^W!^tAkt@^r4CyKrP^ zEIknt1tfWj>B;loS32TZsSdp{@G1w9D%6Q(?Un}(>KFH{gT=Yw=xN~mo` zID|iB=HH+c6ELx~O@)`%*!U;<02vwD^oavA=l(`*r`zrKmcruxp%@)vin51%N|E@6 zXh@>#lJM0FZavRcTyuFv!q2)CA0_TmNPKAmaB(!H0`5N*hK+k5N`L#;L_=d2?0CD0 z4Y8fb?uyr&N30WsG>lgv8r-uPr@L8+!?feVH_fqPfJ*kXk|v~_(0IjIrm?CGuksOL z1!mg^k)AZF7?2V;vPxtp3s5u#*cFy9BByLQ z6N4#UbM9ZLMa))eo+s+FIDDRGP5Y}8)E-O}plg#m^=z1-rs zILPpM8m4`2jrmb1+5(FVas~y=dVPv`%V7rID0jG>=#*fErVCQ0iyR}A9=F92z=?WX zo9F7@ZW=eN^mvqGhM0S&y9klr;jr(5sjstE*3rp_VOT4aeq@sDJhxb%z7MT3N7LHs zx*ji5e-$*R8fjUhq#&hc9AHv>fB$#?}2jwU>x zNy6>fqy)ZvA1l4_FFW=ab&1h=*%M6w86kH@qca^V8f zuhX_J4iw`6fN&oI3IUh&@cl5m0jJ{5;_LS)Rbk2KjfRrz9`66Dm$@on5+0WBJEI&L zn>SQ=bOXe}R3_hj-2bUVOJ?wGdLSJSBu13NSt#;+mj!Y<$I!j3f)^ldde+1@c{n*# ziOHQV1oeRJYE{XzSbTNM<(s`-q->@60fxNUILmyIH9seE)z!)0XVLv(SNs%jezD(gW|%vJy&Od@p>0Fm3tM9FVZ60b~Ky zu|JI$b!rzEf6ugkX*azy1EpV_j9gNq)r28@;4&<#q6rx14X^>kVrm__@j?;@9}asK z1j78V19Ar5;y+&fr2zlASMuK4I8NvhpYm{T1sZ}7vx8iP8l#*o895g0!Ad-=F00ox z!;CHq1k|OT58f!Vc;@FQ3jF4CI#-2Uo_-w9g9*090Qxpb*cwRJ+q|n-ovP3K_et`$ z6*&jee3g`ydjbGtdW3JOJtB_@@D$35C+O-neR zjPjEykz7#i7Jjo_YwenLT{UE3+|3ZG{oW zIWHZ|pU%L#BB>OFYN=pcp!xkq4`Hj5J^Z8d8t*z>htEX+xNoUdN`IuzQrsPI4V0Jv z2;2?tCO<%0oM=OYoTL-S7U|;AB`c=OcceLQ(T+OlYfYJ=;=YS?nRXw4u$_hlk%x_*L zKSkkc54Q+{RSV-fr0vhi@d8IsY+`p|(a9)L!a2VY%fv@5)Pi?K8EgdPk=Bcd z>wEMEHPFOr{v3llfOJSwf(Eeu3AK$$^zzttN%d&ZE)i7D-v^hG=M_7~RnM%~52>utcdoAeSZ{lvLsw~o{c#EmhoML%0N$L2q<$TW2t|k+ zy3GAlM=~_yqvV@`?z0)a)nNa!D9*C%R;@0GVdmbYkqPC!DO_^Z?X~O~VUXuU+JoZ- zl>&Nn3Ie4i7xUrvMMjP?Z1VSWj{7yS!#W`7-)#1UcmwC2=ug)-RuQuK0nUbecEG}c zR?CgfiE$8}7RqO_2QJYBi4w*yb@bY&l22Ff)=w;X7PaBHdlH2Mu-Pe**X+={s`r2escyM>pdO|7}1;}N^Q-To=#oL~AEGjy*yxnY*FOhx!$HH}FPf?aN`a5?$2$JY459dONDMK`MxfOkd zU`f7!fSz4m0A2H0HHIkmA^y>C6>ER41SR^Oqm=;6kKr|S%y8ZveN(w*60aFe1cu)< zqRC9tzJKHblxz!&1^h@)-PoA!ykF|%6cjX--(sF)oULn7S>2`J&wYO(yDdq6C>~AH zfm@e=KizeFUR@2qBhAuAqj*{M4F269X}Bltp#OZNB!v;)wB4Qbr#xOfQ&K*u8)QLZ zTZ$XhVwXKzqMo$Y0uCVfzj;@>Ty8%JiNb)gV@39`u2TdEu3q1-rw$WJf!otE>on<&ObWp3Ts;V(b!qGsE!aO4wc)K_?6MReQ{ z^(O|)-io6c#|o39Jxi_Bc(x_`lyr|h%Y!{YU#))$rqh6$Iz|BelBswY^$LgX6(bFS z%A;56OB|(8drIyMpijTdiHFc=O+tx1P^Hmzb+IC0j}rrC2waxWPKY3uv5DiBV?~cp zO^>hxk;XR&Nl*e)-ep~bln_rmgqK~mlH&^WU~9|&kbS@D*WvC2YI@9EoCrIdUU`2 zWK;}E=wz$srmdfm6E3)(R|6h4=(@C)IoKZ8x#EQ=^d<+`%n@#|5CO#}>2Xlh3?MA}h0g@t9c)8gB{X(_(f=Lr5j(d(P>3!Q@`B5fnipQkesC z?o#CAWSCWj%zJL+(USUN9tp-*vK) za?+cpno#p@z(_0^`Eg{U$O;$G=F&_?nM&-U?liYdxL%DfFBP;A+*)^G6!p=7sn9?=$JNA5L~Hq>}zoql=rC|2dg) zF$ZhI@~`;%^8d7ZDt`4pr7}4~2_L(^RiXDur~pYn@qiMor=gEd42Co{88rIH&QstV z@f78!))$~fZ^*+Fqzr^2jSs89XNY{=Fuf`QylCnQF| zPtiT~h+zV))CoVwi>h&qn6#P1@pmbAZZWCIBq}@6B z=M`r@!k!Me)v>;3vf3Wyr_kZ>5#oT<%rFzR^F9#e_MlTiqOvFA_komE?K24TM6u+h zepplXs#s%nd*?d|39mB{H#djyiRg4~YOrg=C}#BG5@iCKGql^GsIS)$z2h_=f+h~% zbmS(Q%F(!k>nKgfTY43I{P~?%8kt|e5H<23Kxh)usF;j3{_Kb~q%hPsBjuaew#QEy z?VkzAj2XYUkfcG3R9rME$0qFZM~6QS0e9ahKD{K z2Ak|D=DPKU+8n+u*#5cp8-iQa_Wn8-7}?BA%Z(<2dHIJ9qofNj^pk!{X>!S5VTxNQlbzp&An#kix{Brw^z5TXPF zXZd8nNsL6Lq58?9b%D!l6E>X%;nN9W>Y?az6K_XZg zeU;i$dF)2NWzsc&8D)s57;FXX`q_ok0RUNnpJc^{xu?_VU3C0!zPF(ka$LUh<^?4y zx&$kpLIq%)yJ}$xr>IdEgy5;L-;r+e`O#Q4Tb|1F%;Vq`q`oMiyG_zEUn-vHmq;P6 zK?>&My$h-*IJlsY22g#S0ArH7MSDRz9CsEpD^)wf5Ovri|HEfZl(!k0WW^0lD7^xO zQlg2L?$%_UGhG@j^92q-H3NDo4VUC^{0;o_+xzK78kZ_DS&!DdG&kqrkjr9 zVr3)wQT3Ec=H?b7T4|#ZE9bcq0kHVHS*FSIb%*p=Ki}sn>z=v=K*o+aPlRxvWB|tv zhIe^_Q5|U&4uI382bo0Jvl4hK1hhSYK@_A6oeF_OtC!I$geTJpUo+hyJoQMH6^5ij zcV`C6F1)IhP8w{OQxgHI(ZP>(JH0II{q`i@5Y({>W}P2XYkt}jXjOalxDX5i>_D3s zBv76?drAShLSGrIUq|zgUze1%nG*2S*8Rp(Nxs(yrvETxU8g8%1H>bFDme6g66T-+ z{rb9r{OdA|2bu^2_4CcLgoG+i@jbMQdE%Uv`+)H@t{{!P6E>sLC~b(Kkog+yXfE5` zi@}jSi;;B5_K2@XQ(O1SdD}rJp}A}QcX1{gjOb}t-h@8p&n&06?rnWhQ3A*mf;ya- zNc(+5!wnyNq3uAMZAvk;LSTymu!UQo^MA4RPBFSRVVm~Twr$(CZTD*1wrv}$ZQHhO z+gxpP-ar4w%$J$mN##z}MkTdVsiV&8DE$l7VbGWF(t5rxCeN3GmM7I3v7o_-jUK7q z&nC>u6%415sH0A;H^!~TgyOfX@? zQ3LzqYcx?KPoh&PRLLK2PHK16tOHM>U17SQ)U?U@{K-`#i={M!7w2%Aw!hj@;0`vT zmiefm?6t7^yFerODKbvT*xIv%dru!ZOjE2#VY<=g&$w>RU+oN=(hK>SWEI%Jr(|-a}f_)yE*Z|o~0LGwD+?3W?m<0X>uKNs4I?b*{9W@Sl zjw{dJFy6uQa(0dkh-h2&Pw=b^g+B-(ugZL;r84%wOHI#d+AV5}v%TPL=ClO~ou!Vv`OzafF(SvFF zSK3D>Pys>y?QcMT(&q!IORMMltbpAlDr(~iNR-&fN!>I4Ga5EZ{)Hbd z#}-7HMA`eDwEe5l>sr{=?FSnD2vQT0f|)B~Ik<)!w%pu?te5);1%!nM}2Ot|BzTw z&Ill$hp|H-cpQnvtU2M}(@kuv{NMW(8=Ylhojk~a8G}hA8Sg^alY39Tf5Hl|kNW)^ zP5T8?Y64;`N$ja82{Vyl*7YhsUKQ<>5&n`k$1on;{C5QeO^2JIXm32H3r0Ta8A?Sh zac`%>27X$P7)KmM3q8`_Su(O>Wqg- zX?*+wOqp!*7l}&!fH)RkQdI~dGIK=lPet98l>NjB^zpwLox&!3X7^!J>2+6z*!~v+ zgb7QxMtxd4cgXTm=emEZcgD0%`)+>e_-x!%7k-i$c1A!q7_KiYKVpsF^7Rp zpvhFls*;d4K&MNvte-nYdaxYoo#TS65PEOj2!$ z?rVPaUa2A+SpQKXUUG!;i&He8>ph7{sQ-Nd^)?Xxh;E!JF3DLE8B#&)Y!nBgGTj@Y zONx|*LJI^yG<|B)8AbxKk>6Cvh!Ro&0Mz12&Woc(R`D?Y2vOc|{yJ@MSzt=fhRXl| z0M_2-=F;koN85ZWM>=00MnGF#Y7;`P3jm<~ATa%+9;+E!m~vl5OvYPk!s!M8>Dmr9 zoh}_NCpwaN4=tqK#=?8a5E4oUE7vb;#HqTAaZcE~S}y-vv-idJ+e$}bJE6>cNRjiD zChsmm(Nm7BqY_<9DYTwc`kw=;AD_l#Qm;HU?)pyMXjQ~SgKZv-*qmx8^Ob7UsnR9N z6{`Q=4?k(B`KAUVxRs6}nfgv;?^oYNao5tA0(c(99np`(#<&BA!; zd+EJdgPt%I!8|ZA4hT-(fhZ&?0Up=}>PhG23^CmcEto59WY}}Zbju6KPj684z6AM6j{|aZn1;Auzv+dyIHmX zz5WZXD2JKO4n7eh0xg1-;9QC1kKiT*b3k!Dn-zuC>$9V~e4Iw5CO% z;n`i6a9um!0k^f{f)=L3uRJAH*xtJ!a}%yG=Qf_^-)ISqFQkhf_Q+WYWa8CmGZ5Vt z0uj)}P@k1@K~wtIcbG@{Zw38e3L|0tGQ`M`Z!_`UMbUtO5&&JcMJ7t!{=FH-2zBlW z6|Fnr#SyQ>~ERQGUo`>BgcaVzNBauS=iGk@t<^$D-r)?b;w& zw=A9LZcqXkBLFT+86D=i4wzM)WvLS9cF9* zj-Y)L2t@tqL4wnQ(-yj}iTLcVZ#aut=QJKiYt-M>mV`f|=Gos#m0HtW>E>ix-#Vna z7(zn#tW`5wTng80Iq~x#r%?zpgY1Q9s?R5&#()J~+xTw5hW(5`#umy#9#<9o3JgXp z*_=N?hkk$P_g_P_6w<4pF{Fr(_$OIa&M6FWwLgt2|Ky6p{zX$s*&wVmYZZ3v#)+OK z{|_C*WuM64Hn0ZPeD#v4KWH8Ke&4c;_E&Qk8U&aT0;U4~lg?qmqd7)1Y8Z(l>49iM zy2i;HA@;pyPCgwyeyV2hydOmu`44|!A46w68Gmh_5p>(d?S%1Vg`1D-EzuR*6_pl~ z+;BG@jyI0J@QQg)1wn~-5^A3>N>Cs8_HXdeJ!GG~(?yQp(Myli{86L}^u(!fUUrLO z$(w3Sqe?YX$PC^cN`Z-H_g49Bz+Eay0mRAwfYCd$;VU6>uo~fwwW18%>!pZcY3mYK zrpbQ;Bc_N>PWJhkOr%skvv%6^WZ|L~D!^;YtkaA%^^E~qRK;sags>&+SkVEzxx|+A zzBno8s!j){?&%c&j4T{0nKjpVa)5jth582*94G-gkq+c+N2 z8mFNw`hg6YD05`y@Mr~pS-lh*M6Ii5u>S!Qr&21SBSF3#F>=UsI4f!IK8W2ZNwF)N z-QvQUnQ-^|$cu|86O~a7ckyeq(o+eUUcS_q2KrWx=}A}}DpZ&S^!=rKAQ`T`iiowS z>L(c&W8CgN%@$+f4Z8ZG6NxmKt)?m1^D-Kd%*-(+2xOw27oBh1+CrkCgVv;4d1z-u zz2kL@ORT*?PG3cM%sq6%a8_4Ju8Oo zFh3SgZjsFc6gq%J z-B^B^aC8=L-bL*O4w}2RmjcCt~3e@?WBVjc&iwtM*Fi z_*$D&5Z{X5S2z-FtZh=?_Rgp44$+TVU0pGrkVd0z4Q<@qA~n23U|ci@@jf(L`D*;T>Ejk;8emy{fC{?NR!VB z0`5sR>dRBlqFpb0rG75W@dVy`vl!_gAl7hCVqSOTNgNvfj} zP`mk7P2fo>gUxn*&zu2X4k#IRF4+&#OK_T*P@T*m;EbQ%ugZ*)huO0)MnCJf4t&M} z$HUV{*Ett4OgW`B0(QkewY{%bYpeOsfh>^}Xh;erMfT|K-r{Z&M2LkhHI0=-f1!m& zu9dFVe94}%f`xp-2;MZ`lN(#R>WbY5?u)zcrubcWYfBYajdvB%lY(B}E>8QDRMOw7 z)DL?y==6=~M>U^31j_IEHz)>Plb#-%Esl13>hN?Q2E6><`};ecTo#>Mj0CJGQ^2fD zWI)w?o9vaqkoI>CW0o-3CT&Kt>m={pNE)J)>$TwkQ}%xI()MWhXXQiCW!EB7}) z)`T_bX@p*R?~1D3DXEkUI?R?$ZQgw2XN|p^DC=v9Uzt1B5+;D6ZstIa;Q)Y?n`}NT z|2(xSIl?^Cpg+XrT>8^GpM(Y;R2{hi<@Los4~CVG#FVo@Re6}0iEX0RI3l`qrlyJ^ z(aCjFzggP&{GRKFiMN3fs~aa>3U?soRXB2`W-z#pVZ5lK6C$roBH0();P`2empUco zfo^Co<*I$v1q~9LG;0=qXfAH^ipjg2cn9->=;;Z0!92v?H_C%YK@%lz zfIQ8-x7Qy7^jM@_2o|%x7z0Zs%5Q9d%A(f!)mEpcW_APgbp=9@)4H6*o8$TE(y5`F zmxDC$51CJc9K$xEdC(#uUbpV!Kr&wyr;YU={Iho8cG| zQX0t?(H$rqmmrYEG?4rN2_xI}UkY>kfvVqdTEWlv=J-Q-(ZU#=ZCHYY(n6AwPb8Dg zG4C-8mZESQJ(()q9g&+o3`tXrCumo}o*vcYYUA{?b_r=Y4~K#|Nv*cq5}7lWA3UTI z24OuAQFvsbj5jQy_d7M+jA}AsJjIaysvu5^M1Ou){-LDUpEehlO`p z4SYN{fv|7@zn(nFIO~5qF9QmppMqfKLBUh;FZnpi4lDG>LK>?1f7z;}C?q%(yhdNK zQYJXW)#F0vAG-~-olYWS@1gg~zq_c7Fmnta>7+H8dc%JxW4~TFgCoiUvUW^)xRB>d zeNf@!=GvCUBTt-YB``pM9*7lSV)9U$HLf8r_MA!WEFL6Bz=8c&H`>S*Vnu{p zB}4I39OK}ZlHwvt8wMo`>0cZK14BK)6w3A7tx%$Pc%!aiUBabZYdO=cbrsI>&OE14 zA(WmEC@tU7x*HmR?J9UssVy`6Wa%a?Exg^qhLoRZ6}CK*ETm>UP!d!kNt zn>issRnA!U^|x}laN0>_kXY!t z8ZqB(dweg-9V``(1Ro6!hM2oAB0w%jB4I_+SE`KR*kiX2Z4yvDb?iD1i`Hsz_N#MJ z?dZ$IpOh=O9Nd>Ab?KmZMwo0t>Bz%5D|RFxh~s6Ul@K7I$f9KsA&*EWbF88o$qQD1 zS-q!5R{daeqpZMemMY-gotopA?>iX00DeFtS zxG-P1uo}hWj6=g7#d}U(8*>hxioKK!cK7cuu0Ekl$*4P?4F9IRsPJM9^hFCq>U+%q z)_Ryuq@7XC%f>&I_$bnN)Gt_(90R?e>n$;q;8Uu(;C7N_PxBBzL(8(L9Vxl&&Evb> zOfk<%F$AheT)A{h^c5~oqa2pmhG-4eDR7-X^$Z}W5}ZL%e*D2T0z0ATSmBLqHlnBK zu|oSjpbNmXC<5g@rHCaeyk%i#Te)~y&Dm3+tf3O}jhaOPDr$bKo=!Bew<3UabD;}r z#^pD*EwfbXLZiN*^9CyLm_S|-kF6EPt-C3j2VprExT1O@yNQ)Lw%)p(5{ONF6a(=4 zzMa>Qi<1upXFU%t55CvWYSIU#Q4Q7Bnq5vAi->t!7{4kn4i5)2?lH*G?fjXO4iy+m zVz^!T!QCV^>)&2*CdGBx@#+4dDM`h1yI0MnV6DwcPe*7c9SqO8)OGi65vYHUNp#{& z77XGL-M=rqU;C&)BZPblR%&Z$Tsnmo&v4ksnh)kQoyK= zs}`ssCb#mBE^s)bO0C%HdMJ>(s0r$-!~dR_c!9;Wg%1*0p_Dc8K< zjo*;X9YfiV=&(Nkjlq>XVU3lu+(N-mph~PiYaVmlT$OGR4%>+QoW^Bbvg_5(f8qE= z(qQ(f(L0#J0qG#P(96bHplr!?*mG2!)7E2+Q9Uxn-$t0tNhs5;3_(Jw{$LXV`5wYx zf2pZKM94*=Vst)^Xj51bgZ9*XuU+twS&yMzjH=|^sk3hv48B-EAVX=WOI-h~oAsYj zBrR6F7TFtVbyt{9C=t?Aqr~>-6X2&^V^aJkJ^O@_olu*&T+Jc%i3yZkS;A~~n(E<+ z8Z9$XBkm7ha|P~N_(#e%=ZRGTUv(;|ks6#B3Eo!?uPjK&{+FePJNyrB0GV(Xp`&et zybD6d1`9uu$)K4g1|cF&s4mxwtuRZE5B{L9%{JtDwts^#$fH+--1f8HK^Y2YX~$aH zv6Zy1rX6WDS`zVe&QXCKYQ3zEHpY~X$#7*)1^l#ve5@l}83?4Fqk-4U@RcxG)1{4o zK@Q(F+~@I9Mhqj4Dq9xzWgT(A)V2=^7yCOPC=ff4QB5V zG*til`MtB==#m4SAgZh)g_tkcUIxEN@dr`vng`X*)>vy_ox&VJqh%=Ydi%z~HN;zW z(b9t&QEZpey}w2o8a^oJA#S;%Cpbpma{05PzOulH*(P7CDpx6)$1z9&`N)uDvV;TK z;^>K|r8F@?vc81yDmNmC{|Tn0n~??m>13i?#i%JMpmhWhlc{LVfT!`)Ic^Sq@}BWn z#W&RW_{SU1tnHYsoy&&_A+3j zK&uw8^=)u0s5iaHk~j+>ODHl9D9jj<#y@$sNmV&}^m5eOQp2Zn2IqcN+-yR1dnm;! zA~5@tr}tONiv6lyActdIXG}H_NDBmysEEH9SIHe=HM0!G6k4LD8^1&)%iIuUHA2>o z|3?yiw-yUUL4x+PN*6g|Zp~&_p<>YMq~oeOhw@;ik<2SN;dxz*D2$GV5lbj-vgARD z)Y%$j3-4qG(pyC{Wn3%-cZMJj+E(7REkC!UY%zlwRXD%bu9r;9ywaDNd9s4G35Ij0 zJyGxi+SBGo>dSlv-xm0h9Xja|GqlBr{N6_ds$=K`d1dXt;I1Oa>S%>5zbUKl+3m%5J49epfz2dY+a@BZ zPMqe(s?!PVXwpq5pUWSm^MVzFlML_8r%!!D>IH?P=tj5VN831Q?GHmSM=!P+iMo(8 zNL|ErR{6gRRV+IpIIb~n7B=#cZPAO(wz&R#>zE;TeU{9EHhq1Mu zj7?m1eFDAMt!SVzPHN+W9`6!od~{VTk+ z-G$6N*jJI~V<%#B+qYydJ}jxfO5aFxOLYB=cp) zIM;+T*JwFRF*dmQW|^s{plsvu`1S@4iEC_Hbro%n{vPn^P*2=wy)pw5cFk8otVq{* zsJ4n0#vJE`WR{u+#7G~Gq``y8gM4S^qogxF8rlgFRRxm87z&&h;!RYZ6aks)mHo6* zE6+4gZ#%ox{M?RVq8(LOYj-^Ma%;213UAhRJQnu&DxmT{15 z{Y9)zuw;1wrjYoq0dj3H0(BjVxBJ!;{qQP8c=GKr0cn4P1YzUN(07Q^=QmQo0Qa+E z8f}VeuSa+8vJ2H)!(L;JVqT=)Iv&O_HS*;)#F}sZO!BhsCoND*Nk~UF{gtft^*9cFZXWi^|~E~HJkK` zju?xn+N-ZTdhUgpXLcGnoaLJQmJQ5BXckG==!I~9>+R7vt=-~k&vGplOLfuK5*)uD zY1GyK2~TxWru>`dD(H-%o`k!*j?uXzQ1OfuIAvzSoUUQ+44Q&g zNbiQ)V70Wd;D6u z@N?DK$!HQis%)G>`Xp-`k%Mvw@#dizdY>iF{+9o{y5g<*ysadwDv^?`Z2}4(n?G(1v(R-{Ror#=rcs6K1Eu477<nIim znQ$sQ=dsBE>=X`I1ECuM^{1*X$=2d}@p4hrfAFQuChXKJif)(E83gn!F|enf2Yah$ zq@*FoTd+sx`z_;JR!(U?FB1xqX93S^?LTdX8Q;veE$VYiAXxhY%Ctj(R&GA`DI~mp?c_stXLPSUh|ITevUlj z;Qwr^6Yn?63YdK*gMU_jdEXPoc`bb{s#H;vE%qQUL0WYCX%^@aq-_xU6F2InRE7U$ zdo26wVxT|!<+)-3aPp`^A%c1F;qbXekE$K&!lIvp%`m+3uOl^Bq3u+~bcW-MOX;rJ z#He$qT>k~D_>;z_E#wT{mF=AgHlYjv=P9d7dp#i}U1%ovpUP&rC{JfEDiQl2ZkW^a zVpa7V2-F0eG;Zo}4uFN&XW{pldJ|MYS^d6MbXdyP8R=ZGpi(c3GZKHVU^~0oTBX$) zj}|{@+-nhv9<}&QOm^$F?Eo) z>5dP{c%Uf8~LU`N#0-OjS5 z)W^ge0ecq*Y?m&;RZ!p~?%nlVaWrRrsblvaOR{Wo*hv)VYm`I9?(k;(+!B6|`9;z3 zX!8@(_%HHtBH0zl$=VjIPK&?DwkOS_I?8WYRDk`FT{LVC+&L#u(Z2s`WzRG{X=U#v zuWDHe5mHrKcxFV;RA5JJ!;)OpvV}RnR)z~=`FfXSno5^&ul?{M( z29X6Wf;qUPaa)fjQh0KxZRhCN&+Jx;01I$xAZIK%(?Ak@l7QvzACmwB3$H1(WKNMa z8*8&QL@}@UbCCEUQ9F-QJIO=HQzsL=kyEb%(?jCY^Bv%ViZ3x57gPqH1hr^W6CY=Y z4+mAm1q2BhW2LL~aFB@B(1R~pi|*D@*!CuioczM&d%nyG!`2p?6m|03ehxC1VQ|*{ zUj9qpM1iPdX6u8b{mbrUxb^^Vi$2In2qd_3+{6dVzY9rg8-7_uJRPMOr2qE>GIEdB+V(w#m<_cBOWalq6N^3-EZo2B~VlxaC! z6p1%)KR3pj*%!8JuyF1T0opQSSHj^xAa=$TbD0@kM`M6@#Ot1Hgm(9f+`QxBd(Cyr z++KIP%_$urx5$GN$I@(+KKsU7a_{&N?iM-xSE3|v*6Iej5^DL`T1x{&Tynon5!F3v z0<}|=-c43{BcLi{tKXtjC(-KB6g)1X!X7oi)tb>9|0Z8>& z{j_)RxAq%mV&va7!X{!n@hJ%VPdNTFxwU+VsL5G&8Grdi{?;nROhO`9rR?a*W5C=dvXMH&7pXR*WlI zL`O6j(TZ{z;o7!PGA^F2K%NYPGs_S*RXw)Ma)yjbfU7(VGR7sy^spS3dSPZIfmix! z1KSKvHK53UG9|>?SDTVX3lC`1B8w54tW)eL7s4c!%5BC_Vly__6~8*_$6g2nc2=s@ z;yx9QAYqDxt3T<_(iTYiybMRVBCmpV2i=!uyvw{$Yhw9`K}pYRt%~M##su+8YX}Tb zxCd}tmR$YTzBt^8_Y8w;*1eu>6+8DA909X0&3^?A^4hT=LOblMc-6Z-BI~+HrPKFk zdB(U66cz>F#$K%jUbm!MoM;5jzC8s;zcRNxSZqi#G5k7ay`Mfix)G!x;<=-(t~Qdl z=}Ve&#SK$5FUq(3$r*|#2!Fr@&~{^*iBryx#?ulY;A2##5{Y<;%!eXdTXjBm?DD;$ zCI6{=wPeC4mR-Gfhs7i_q*OZe`Or-0+)71}o%pNfFKyYx#Fgl@88>YxFo7dZFl#>| zI~XfKqYF6yv!{28Li9(pwTi}|xo}sU@Y}5KM@8c*#Q6y|Oyx>&ai*fq&1m!b$&%Xr z#c+_kf|V3e8%acXjLw;}o=|*J%rIyrfcZ%tcF<0gF+Y}1rPAi~2dBM5ojAY?(&Q+o zLMSe(a4l~U7?2YGL%=i3J2K1mqR8(^3gM4(UGzyJ6S$!7lcslNSnG|;hRfSCu%}Ki zNqJBZdpdFElh~M3Z|`Rip~-1Wj-GKM+h7l7Y7~^$!c)?iE=%{@bNgn2NQ6GvUuG7E=xpZab z4g6QNQEffXs$B37>=fz56RmFy=>6Q~fG1v@WCTwc%JY|U5fCWWG=R0^uPyH%2*#3J zgy3`S9@I8{<@!Ya>FU^(!+h%`Zp#opA{I z&SG$g3ompaok>uoW({8siuh+U5WmHwaYz!2hh)Qz@!%fsjJYckIB9282Uy))Xwn%o z7T*e7g{#+GP_u@F(chSag=9I?hXYrPV*0)=Yi9C6xx`rvf@V;-DAv@Pqqx^}kFAcGC* z?|-RUI&XyfUtP2zx9;@~fz9szj;nM1J9LPiz1It^&Th(v&F=6Zp&bj>tl^JhZlGi4 zi-F2E1_&wVLQ&JM0PZYQoIefRED6B4a^nd$6MYl*2hOM3EE_tJXtpPTg*iD!&NgZ7 zLN99|vfU>AS$BXge#-3l>`WSaDxnu;^{_P}U)!;FH_K6*!{y~S!}}1cl?k@gAEW|R zghDuNJm(aKP0Y$12LKHxuXNP8-SB`!M_<-wH@UC-LG(LFxw->|_v5X4cj7; zPo>}iOZkd0<|5jVHbT6*LR~Xx)GP^m%Vf4VQ9^j?Gd}max^(zMw}!lx@9qjj+T*Pz zFC8A$xArmGXZDMaCo)88Bf@j`8oV> zASXTc(axjffA9}bjr(5%L$rdT7D24VRA=4Eex!B+jQ?~_QcFfI~ z(@CcRNdkE4rxkAM{XYsY;ch)38ysuriSU?8#C=9CTA&|-({BO)`@4C^BR-6kB9>)% z1y$1>1q8CD@{#2s02Lk*&i*&I`o_QKBPkICsu=on06=m-6&XOVyj8ArD`1m2=dqSo zOast4b~+R*IwgIzBJNpLsa6iO^wTrzxdyZRGjq#QS28XMznW6|KTw;nb?9&j$p?Ov zrBHUatMTGRsWStwh!9Y}7MO|z9*@>WjhwE8G>qGNC>vX#{NgEgjtMq~g;oVV)#L_( zEiOS2mB_#zdPgvxF;+)4SYVtg;@FB?5?CMh(F@<`=X821yI0AtH)x9wJ#`9~7(Rz= z;DDQSzsHNs#f`pe0;k z@V^$!YZnkK->%g;n&W)KZAoc{&NlSf1B$D=k`3} zNHceGpLZn#Uo@2CC|mVFJL~1Qgsh*)KV~ItruVIw8whq%t&3ttsWc3_veArY)Uy5EJY0FNu}uogGc-) z47+F6>YyZNswyyCmXG(hhy$lo%CA{i1_t8J@XAaNK6&c&&}HhbGj_`qSx!;W~I<>Q?#&CIT1GNqHjgW-xPM30Er zo?8Tm8gD*8FCGLHxL8)a(pbaYjy<7~ptVx@XmnmWwA#nD&C}V)aOJ@e$Gv28KEf-Q z`ybl4e@DA<*4C-_){7+P&W4Ci(R_6P3O7(suA2&frBysW!N2>i3oG0B+3%QiJTH_d zO<_$hu=(W)perF&yP>i46`Rp!c+sAy4v5;sy2Exc3DgZqAS;K9XfBmZ~|OllJ%!gVJWb6}%6zJQjA> zPJ2Nm6Ki*Mks|buc{P=PJ8NRWfGhIk+$572tXq_CaB;XIu*4@-Lc(XTJo3U%O;Cgu zsx+?_GR~RR*Z7?HP>JRGh*kHN(>v0^`?_4w3Y6*$mISfB`Yek(IT5`jz8XL_KDbwf zSWC>QYcRo@NJwp}3k6=2l*g&y#Xs+;G}t?rv&Fzeg8#X#CTO=YCij!JMIxUOntQsg z;D~Z<;_Z&~OFDg;5iaQ+=Qd%8YvOmG*Bfg1H81%zOh@1GL5dT6))Lg{FPh|S50LKq zFJj1m)m3!MWHX8T-mX+)^+0WD8w&gBHO%Bb5XMPTr;@~m7+Kk!%boqX01eDf5mJIC zCcy2Jxc88+qzAI^q(Ri?DTHfk;Cym8Ew3sp5aSx3+6!*agG>O}Ra z_{ql^bja5?NKbXUxj$PHvDWa__5+lv+E|ZnK+hMW^V@94FkVqtmCUyq7KLUdpHB?V z{;3ZPThJ=?R&TJ3T~K%qk2^^^0NJbLhcSUy>Tlc?(Q1b`A`lOZl<=`4H@_~>YO_Tj z8^NZ^B}zEC;KvAsa-teh!u@oD$l2T@ZX#oHdz(&)rxmvGtA&f#L-l3EntfE z1`V=pA>|Egs-$}f(vlkq?-D`l zHQ$JZ_;AlJsHJ`ktdNiBT>qlodBPCTTY$@$VuRP#wbSd*{tz)^nS#VqbTaXk;$Pc% z(`@eC(K9Zs9CN$6pDWI9-e#Wju4luKF{loC9@OZ$Ypa%H)$w|4hL*D!U}6i_>a-lJ ziqfTyUR20*Z6Hvvukf?_OG_eF9ONRZL}3>aPP$9DsxuP<*SvqY@rqk|lbl@Sd0~{7 z(fj<35)&z(Ts2l&KQj)_powv%kWxm?`*w?nG5>T~iwlB>IKnWjblx+L192m{;YdHW zaJK98N3Vta88^Tk2H}AXl4sj-m}X!!M;a8=8TZ{iTt!O-cgUH706PY0QBPIK>;xkX znIMdUsH(V~bfq9?UP4cwAq1Ib+}*UfhI@&!^6%9e=uLT(X(xO}s8|305py8aW9gV@ zu@f|4e?mP`MhD4A#@@m${=m`KWT8lM-D)GcOubf!&z?ShKTSTq`8;lv}3HvtBvw zHcr`K@R(o^U}yQ}9#;rO(6uv%(`-90Z4<<|F#v1lN5YAQrsR=lhN8w)_Gs5E?%Xy9 zc0XKa<%Y8cIEYAV$LqMcJ}zqU&Fzc9K-2P>Nr&H1N3_LZ;vY>+x3s#O~33;WVP5~Jx$t7Fn+`Q0BrFt6`Fs$}RhO8*?hGorPE_jES!I?#OkJuHC^Hsy zr}i(wauE7@NKodR|5jYWFfNGO?;2n5_A%P)u){?snh=?RQ*$ zlXLpk#=Pi;j$&b}Elx#I1+DGomX^5;wl%m|6L!BF^Xd{m)&hLJypRbL4R}ZEID}&P z8u^v74mz{VMX!?BKhrk_R_UHHxXs2+rmN>h_U=VdqkhaIRT+D&lPrNy_HJyu1rcIE zv-){dJ!v}=0kO075#d0m(y7cGuAXSt&%xXJ7n_Yu4Tloy5Y@cB6%RIg^(*=~DMW|M zm^rMc7+wEB38{5zESeXfncq*LqX|?@XFg7Y3>hXMctSOxajg*~)^$PlCm8Kd#)Rfz zLuBG4@iiIx9mPA9$MXw8rV7S+TVDcL?g zZhHXKbpU;FWE*(?l3h{%zw26WUtvNh)S2cQEsinj5J;g<%fHqaG0@`7;xZGGt}Zog zA>hS$fx507>+`lWR@P8;eRWkB5iqT|amIv11JyUMEJ>wu zxQuUTy}VmPe;g2%Uo7AdT!vGs&zUxF`tK2%?*?s>vm^&W(<&Y4CKepoZp@Si-wze> zQ|G#c_NH<@!3{(`Do$A@kYDJa*{<2~r+*>^c8Q+U{(@G(bdf>$k@p}*katN2T3#P| z#dhK7Hifag{ynX@uTS)wgZiWf*j z`-Upf`S3};D184=$hi(r?=Nc%!29k=XuN_UTwUzm zv4{O%wmW$lY{al0f&JZ|2S2_n6yq=3|1z7Q9X1_`fu}>w33uG^c_-jd#2Hpw$rd0w z@+F$3HZ!yKk~izOz&eCn$1ym>&jEnoB7HN#SNJMcT$PbwyP|_E81wj}6wc%-{k9Lq za!S`r`e0Ihos-|?pf~*v4yo+AtHRd#UuBhQAGACh^H$XAatTPieUK{}!;U`9<&k11 zt)gAB7sFy9ymKjf#nxh=$q2(x>8J(|6F#~Rk#|Jn zWd6Eh zxI4Ow(H#$O^u1J!EjYq)WLk!v@Outdc+od-aPbWbW!s9)>KY|wk!aV1OY{D7>T)}+ zST)_@#NfNE-Ynstsx7D^&$7=w=Vk94g4GXPyA@bZ%3LYXLJDZPlA{wMgu5WmW!a@% z{ZO56uW-4=0k-N)1UoiR-5xiHVF?4Dmt_0H*-F#Vdg@6MK~k|blIqGp>Zn}={h#lv zOPgBaX7xyR817k$8~qic9H42g%1pH9-jj4{>Fs!-K7n66J~v+R^TAQ-t!>QyMZH3X z(Svl*kC^XClnBGF(ub7-r2Hd;;PHq{EmjoDNy5yWRcABEUQ;2B!iWi@LT*gL@qDFh zx&{LLQ0{^bDqpot7D#?lg%VSpaxWXE2g0wACN&xI9V?=^E$H>1fHHBHgTdK?qPYsXomIe60`h!DHKCUf~Kx{%WCoAnB`EO!&{nbE<;*D zJkkw-1*gY<>(c#U(^beqt&;H8CuZn=B2snkGAq;QyH;8~fjnN$b~M4qtL%}j8&l?{0EgEvm$s@=m49gDh8`5=tU^9s7b~?r<-5wI_ASd6 zf$$DsBo*J>e}1-=XViMm>20^px(BiY)g+zJp4qH?3agzp5&RcS_G=mo#}5})CT+ZXkl*Nx8zE)TR;a-D6Ce7JCy%9{n4szT zCKmg`W_qz3i^i6OMY_E)e_p?R?+Nn zsnzJr)9eM=97_xU2iTw!o4l4U$ENn{R~+W8$N(gC!rQ&5l&WNku0~nt4EJw+sFgy9 z`c9z82X8jo>l1hI!ZiQXZBS5*7nw|eeWW_mykCjpe~q4%*03brR*h@#;k?!v;hGlz zE4fjR)VL#Nn_?*k{g{|mU>|mV@~d#o=w<9IhN>7$)5xHl6Cwc6A%=p7o?xq;ext=d zDttoxFhOyZ=P(IPVP%pze-ddQeIfOM$%ddRpFq=C1P}o5v&4 zyK@k@e5_*ETx4I)wdFCbiIZ)4nbHl&{t6y}O^4?)PV08W^?W@h8Q@YK=Or9|h8vktT^Ag2OlLgSA_zgRpASC&g6;wJ zGiMH4QO{dRh6xv`bb)BDjrCB_vDF)4rfmX4fHOL*!!Nnn^pdBCACY1AoltB1Y;=Be z7>*axSlXc^J3!`hgCqsAO_bPw>(;JhW!5WM-u+!tx3)eH-F*SYssokf>J@PSd>3-m z-ibbpFi#=bg(!QOe=k-W5=mVA5E0{6?P^vCTR6ZiXNVp4>@O#1Ia$0gSFw0dJu1kQV+g=3llM%odbKxnM&jR6 zw6Bjxe>Cu5bgpjYwGOG*BNuYf{uas#%v!STqe5Z&59XwBv(9y+wA)z*^kgz-dckV` z%(8CuF6|muY@;&;wc(_Ep!#D4RCwYL&(3~1>dINWd!4*-(u4Q-K_bi^f(Moh=rRq< zt~Taqcx)N!gbh=2!mjfGoyY$Hz{#Ab1<|oKucH;XwiyRa!5kuR&Hi>+VR{1-Av|&c zvmYKn;oAxpVTlkl>~;p-uv1 z%5C)%at;ek1R)G008KOu5|TOj@nFg?362fK#stupJF(^;M@sEnIu4U7OwiOGO^UQ` z16UB!%p{uOhi?+uuA+)_hdkkm?TdP@cWdy;V81x>fEuY2pLs;?E(s;7^3$0ICwD=que^oW(bg{)d zW8jN)TVSsVQSK!IMWphzB%*n2K4Oexc-(86fMus7npM=y$<_iQo0>_vN8P9l~$_sTv7PZ8~uiL3zB{A0xm+B|qcHR5+e~x_Ns`c|a>RUg* ze6gEAphfIUb(7k;`URcstIQipuc}1ymtj-6EFF=jQE&W9=Dc8{p&3&%+QjuMK_z#& z@6M@_h>Myn1A;s3gjVlWc)_@9{LjI{yK{s#nNQ+p?>O8_2XRDo-@CyIj(jLtyF|%G zWDdoEvY-=ApI9J$e1ARc&jS_q0;83oip5Pc;jA8a!-Z?YEZo#1%bB`&x>G2tfjD#Z zUK&Yl7Xy_MgAuIfQNrm=AF_tB=l=?c6?W>^T{?}YP_puWX`gXSHmd@|{1Fs+y*tbR z&t*L1yazcSH|!*k5W@g(0gsVZtny_kced6XOd?pW%-6+lwi1g-P``bIi|vBgo>;2^ zxB9`zfW4WdXCs^dOCd(b0Yx*4ls(Jp*(#^c=JevdwyHc@<_vZ2p|xfx?d41}Mn251 zKD{uK)NR*be>!iFxsI6v0<;D?Lq>f_IHK+!tu;<2$`p@Vcs)v|HqOE)tq_>pef*Fu zy<9RTo{m}fR=On-pRU=wpHqbO%X8ORI#I)$WJ>i1A?vV;LkwD0U^0U(l}qHJNaofD zwmZw35ca0CDUgc@IhsE{6xy8YZ$UjvPo*+sD1||M-F!;4&s6$UWtCD{W)^X~aUy}z z6!O{pllae?JlX~3Y!xNO3pp9f0;0l3;J4%(=n@~uA}f(bP3Y4x0q^VqXuB~1mU(hV zJjL>S`<%t|Y}ScwS5~9!HMdmwY%ph>8_4t#63d{U*{h3bL*YbUZ#zPEJM7p(;f=_3 zrh;S$kDRb4&zZKamJ?T8m0!2AotnI#(pq zh5{1U&qIu*4$U=fDSA@f1<)C_QcImU5?Un#esk)%U|nWw^;hI%3RT!`M2?i`wN{W1 ztJYG`oj-kTDNwYI$Y+?6tX%1xoYX$tu!LK4Ad8`!g7_kictw>8mIVEY-R{149@n2# z-C(=;IAwXTirO3$JNS56tfA*mECpLGFKbY%6A=0sRdO{xKa%scOa5M`GEu7i*D5x8 zu(kcGj&N%QZkSe}inylwMV110_L$o12R1iGCKCz=8>>Cb6#JQCMPSN+jRu^d>ub|L%%^wcqI`^15zfJZnJo4EkT zOpkXec#>F3#mnfg+7AQwa;{EWrrdVMo2U0Y! z+^5KWJ_eGI_LH}LWSL4dU4c6aSQ?9bK)YMg`7>z?olV-KQgzRmGVe@>LnmlU3m{AQQTXZuDkWd~uAG6%dL zOafC4KF1fxY*d7GyiHhgTnjoCCVt`>AWep?UJEdaGeks7wv1xJvg_l)MbSA~q=3kX z7t1acwyW9-)w=kb#dQ)iT(X+_0qFw|U!a3n{MCS?t?GWXO|srwLWD5T8n?enVwYm} z>-2~Jf7e}OMbnX1z^N!Z598CyUikp0eA%kOusb@l8S()mubGlNR3<%4IluH(otCO?gg8N1 zt_k12j8o3W5mnE%X;?hVTSM=F!wdMh7F5GF=Xg=RY*mAaV(Vxg0t32HnT-`c?0r$2 z5bsR1xTU3>iy^EDNa>`a>QfUL18a;Y^-?lFERY~&X_T5ouP6v_7UNBeii3%AvUiMh z)5c3!cq8OT)$6SEP?!8A_=Ug46WjF?{uE6YM9y|laCnkGdwTT6#Z}nlR>$NU{Ofo( zw2FJdTROxE75=HLwOQ{B*l{l=@gMm3t^)7l;e-jMo3ZSZ+pCmoB7oq+9c?;})x zQyHbjyd%54EEYojV2nVq7hp9h{vo+UPG(M-?bMzEL9*8|qAJ}W7FWODno|GHw+>E8 zDDe=SuL#x7##yUrVLSeYPi^iYp-e0GdF;n-Zg)$DT~qN1=ga`L%I5UfgyYQ~&}BUB zF|}-yS=Ep*}6o`l;1O zu{bMRXy=!M*s8gU)6#RkXgCGDGUic;>WEcnzz(P~jARbKm41`a`Vyi)p2jBZn^s}J z&LX7Y7SI#ckAZ%EL&p?)uBAq4=^eN&K^a|8U;}Q8R2dYMVsFATQ@!kAy1Wpcna@xE z0tghwQ~uI*0P1KbYY-h=`Wj+Rz3OZK@S<2xfw#jkzh5O0adgpR9~`YY_ozada%~^< z-)P2EV5*DR1UuQ0;huWCo2TJ2txx(i7WQcBx75E$nK-l&#;;`)nk>ifi>7(+wvAV9 zgcbjp!s!}r#Uw{J8AH7ga{OMEyVw;#EkpjhJ61U*g1q+jFLP(@JTVCs@RtALyn%(c3Sr+k-wSKuLKw7&GUGdv2*Mie5}M(9gBT-0Vwb{@;Y!4p8+3!0W8 zN{9v`0;W$`{F#9+i5Bf41Ms8)>lF7=X_68OdJcPcjF_WyO`#bNFmH4B#6N@i7^Ycg zAn!X@9p*GQg-Knz{$KMnzKQpXCQDGEh_5X@+`5X{iQcBrjwKaiZv5d!v%(2WQkJ7l zF8sIT{+|WQSmJ7vWbC6}f}N$Oh|&Lmn!XeBKhO}Z)_aPR)EcOP$Em{0{v2#Xb_BHp zFJp%m&`+j{3(gNxTy~D`A_K0rj&ws zRR~YHu9^|M>n4gdsdK8W)@E$>2F}PfX7IJt z9yP0)i-OFf_yc@9n)rro+gQNK%wv-)GKmWl3)TR(T!TSKcZrxhTiY)&MMY7fYEQvr z*;jhYC!?q$XK=I#*IVL97Y%HbKH-1g!SuSK7@7Aj^<6tv;jgq|E3S$r?rp={WCN$W zRz6TTM-8n=+J9=7d4dR+uxbAkzO3Da_kaYkmQK*6MoHl~N2bYgEj0PAD)+XWizqXCzM+o!!AS{(1X%?#IaOtxqWx=I++ zq^0JkB3$tTwx8q#1sXhl*l8oTIA%=ai=F?fy|V+Yla>odo4rO-_;$bW8Ws{=%)igb z#_*iC8^fjjw&nYcYk?&6WbRv9y(2b|!1z7BM;kyoJ?2JJHdcl1!=G5L>mP{8P=Jcq z^O3oE)=Q3uNRm7!0lR{fcPpS0Sshxe=b_`y?r%|$UOTjH;TXRcunN}^)l zryqqSH5+sbz_@xMi5#z_%3$xMoWjK}j|riMjRqa>G@IOQLTJc$VH9}d<-OoI%9dz% zmz$9`)5q7Q9=)uIt7@6c;dz*3cRM{&E=+&l(nc2y`A#xCQErFCX9lk#XKj7-AC+SD zX<2|o45>`Oo^{Z%wfCk3VkJ?+3j{BNO}+(|-r%Gl-XVwyMS2;3j`f^(KVEBTy)tY* znuujy^UH{Db2oC_BwRYx@rvsLEVWCNm()5tM_L>y&rowe7ucB;CKHD5GkW&yyoQ-Lz|_)aKovaL+ncX4WxOM;0< zQq5@UYcTs4d)X5QVSwD;Uv9mwYdn*+rSwx%LLV(?&5WGm>??^J1gpPoiETtPAPd z`@ncX61Mhd6Zos}>0abT-fp%0Q~j2k{JIp$JkBVjRr{dL6ZPE4>p87YZivitn^7$x z-**4h`O!Y6$hV}wx_r9DOMgPcZvujbi(>J8Ud87Kv|4Ix_SiIuN+G|c0{mTm!nnL= zah(61pHqNVMMg#3cixE1 z_DRBcRm83MKIX$Ot8#YM7`Y^IEfJZE@R*5kOi-KxRpVRjy}|vh`w+yy`+10Hgx8hw zh8nYbWA&_sq=2PPlaru`roAmYCZENo-RVRegFwiq$p_>oBQyw?I4|TF%jsp^$Q+W- z*y;;6IeVM4w0%g^AaKj+HrlHk?X2&r)D`i`v={ECwCm3Oa2z!*78YH+m#u$@Hzag>gASjYhxLu>+J)=9lWgEr zea-gvhmZX)yzFGuMJ_P;ahm(>^L2J0kPRAp8rjvcBfeivWj2z>EU(#1zk*I>LzF#S z82ndyGSG@sqmLq5KpZ+TPcB4+@P(faCfeC^>vg(;>MbL+S?bnkI!2$b=JFacOuka7 z!u{~CC3C$dD3_J}QiD%zvNAfAa@~&4Wjw?fLnO&>%t^tGJSbTG&$Ya{$|ynnLA9zZ zT(70wLnZra!vIiJ=7?|l6^2yiLD9^ls(NPK>-udcd;DF&BdjqY4ObRKKh7?9Hnl*w zI8=kCHjmQQ*Z5~Z8;fil3dgWyok*!zi{rVN2ZIVzY-8`8Zsx4#SD>I1a!6KwqSGZq z(L!Z{*nBVgPZ7a>jq|lc$xl3gq#ZFTHjT2u1Oqs>G8{eDfAcAf0vFO6Ow^HPN5U5b zfzCy|KnvT_9rthmIQD$bzxOz4R{b*}>kHVY1YG%tb$H;|_Zo<^DYVw|`!5#a%;>h{ zKdS$`+x9~7Lr&d=U3G0lEtS^CtgCEEV{c?kc}(TRPZ=cw;4^55w(1O}sp~6r|HH=$ zMWIkUvUlo>&g^?BU(O@4`hpncoc=GdL!>3UVYUNXS9kPayb*J9Mg9AlSG@$v z-M_R)=Gm}wN9R!)x1#LXl?a};bmK>=Sr@(486=Bt5VgJ+`&KHa*9!6K7l5{pym_E= zD9TO#Ir5}k+Nlpiojns!Qkrr2#e{E7QtYFxF>PIXm9~eQ7M_HL(@Hj88|9EAcA;+S zqF!c_k;ln7NTRZkk2cMHU>SIS>{}3kLR9udcWPxStpl88ql&s*EcO`Q5_B1)UdQw-;F7o1&~S^4qes5F+!&y`?BsS zjG8^62pR(IsK%+4S+JmFvk($Ap)?Db z8m#-eRJi&xZ@n&9oL zl+xQ1PkRMKR>fyveP97mAy@Kz4HlW!?6hrB{Sd3>>AV}zy0(MPKj5!LvG8S7B}Hl6 z%*IU3?Rb_gStOSJ{IPzB&`b3<@X} zc*`9QZF&c4K!f0?;?r!Cnu~gC|CEEgXM)q*a^ySP{XpiJaWW38az}nACv1deCNmn) z>rB0~(~~vS09sXIT=#o;U&oHkrKC*;Fa&>f@CA?8wBWrkq2^ut{6-ILs{3(Y0~^6d zdrm)y)_n&9T9iv%;3Jil`9EK&u|c(a66O^J7F!NK zHNQddI&;JlSC@7;9&??;ZL{q7MYfxUyh3Hov!jEA`u%p;f>?rmWdkMIlIwS^nq%8Z}e1^(E002c; zNk)DE002dJX=VTbO-%qQ0000800jXO00RI3009620003R00jU50096107?NH00jU5 z0096108#-c00RI300963004(+00aO40096109pV50000007w7;0096107w7;00963 fpaK8{00001000FCpaTE|00001000Et00000yKPxP literal 0 HcmV?d00001 diff --git a/docs/docs/guide/introduction/adopting-tuist/swift-package.md b/docs/docs/guide/introduction/adopting-tuist/swift-package.md new file mode 100644 index 00000000000..56c616d16c2 --- /dev/null +++ b/docs/docs/guide/introduction/adopting-tuist/swift-package.md @@ -0,0 +1,55 @@ +--- +title: Use Tuist with a Swift Package +description: Assess the impact of Tuist and Tuist Cloud in your projects by using it with an existing Swift Package. +next: + text: "Directory structure" + link: /guide/project/directory-structure +--- + +# Using Tuist with a Swift Package + +Tuist supports using `Package.swift` as a DSL for your projects–It converts your package targets into a native Xcode project and targets. + +> [!WARNING] +> The aim of this feature is to provide an easy way for developers to assess the impact of adopting Tuist and [Tuist Cloud](/cloud/what-is-cloud) in their Swift Packages. Therefore, we don't plan to support the full range of Swift Package Manager features nor to bring every Tuist's unique features like [project description helpers](/guide/project/code-sharing) to the packages world. + +## Using Tuist with a Swift Package + +We are going to use Tuist with the [Swift Composable Architecture](https://github.com/pointfreeco/swift-composable-architecture) repository, which contains a Swift Package. The first thing that we need to do is to clone the repository: + +```bash +git clone https://github.com/pointfreeco/swift-composable-architecture +cd swift-composable-architecture +``` + +Once in the repository's directory, we need to install the Swift Package Manager dependencies: + +```bash +tuist install +``` + +Under the hood `tuist install` uses the Swift Package Manager to resolve and pull the dependencies of the package. +After the resolution completes, you can then generate the project: + +```bash +tuist generate +``` + +Voilà! You have a native Xcode project that you can open and start working on. + +## Caching the dependencies as binaries + +One of the advantages of using native Xcode projects through Tuist over Xcode's standard integration is that you can use [binary caching](/cloud/binary-caching) to turn the package dependencies into binaries and speed up your workflows. To do that, you need to run the following command: + +```bash +tuist cache +``` + +It'll then build the dependencies and store them in the cache. The next time you generate the project, Tuist will fetch the dependencies from the cache instead of building them from source. + +```bash +tuist generate +``` + +> [!NOTE] +> Binary caching is part of [Tuist Cloud](/cloud/what-is-cloud) and is available for free within the same environment. If you want to share the artifacts across different environments, you'll need to upgrade to a paid plan. \ No newline at end of file diff --git a/docs/docs/guide/introduction/cost-of-convenience.md b/docs/docs/guide/introduction/cost-of-convenience.md new file mode 100644 index 00000000000..1901c68b70c --- /dev/null +++ b/docs/docs/guide/introduction/cost-of-convenience.md @@ -0,0 +1,128 @@ +--- +title: The cost of convenience +description: Learn about the cost of convenience in Xcode and how Tuist helps you prevent the issues that come with it. +--- + +# The cost of convenience + +Before continuing, let's take a moment to consider the cost of convenience in [Xcode](https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://developer.apple.com/xcodenp/&ved=2ahUKEwik55Xo35-FAxVqxzgGHZAZCz4QFnoECAYQAQ&usg=AOvVaw28WTg1BlCGAf937pcwXMip). + +Designing a code editor that the spectrum **from small to large-scale projects can use** is a challenging task. +Many tools approach the problem by layering their solution and providing extensibility. The bottom-most layer is very low-level and close to the underlying build system, and the top-most layer is a high-level abstraction that's convenient to use but less flexible. +By doing so, they make the simple things easy, and everything else possible. + +However, +**[Apple](https://www.apple.com) decided to take a different approach with Xcode**. +The reason is unknown, but it's likely that optimizing for the challenges of large-scale projects has never been their goal. +They overinvested in convenience for small projects, +provided little flexibility, +and strongly coupled the tools with the underlying build system. +To achieve the convenience, they provide sensible defaults, which you can easily replace, +and added a lot of implicit build-time-resolved behaviors that are the culprit of many issues at scale. + +## Explicitness and scale + +When working at scale, **explicitness is key**. +It allows the build system to analyze and understand the project structure and dependencies ahead of time, +and perform optimizations that would be impossible otherwise. +The same explicitness is also key in ensuring that editor features such as [SwiftUI previews](https://developer.apple.com/documentation/swiftui/previews-in-xcode) or [Swift Macros](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/macros/) work reliably and predictably. +Because Xcode and Xcode projects embraced implicitness as a valid design choice to achieve convenience, +a principle that the Swift Package Manager has inherited, +the difficulties of using Xcode are also present in the Swift Package Manager. + +> [!INFO] THE ROLE OF TUIST +> We could summarize Tuist's role as a tool that prevents implicitly-defined projects and leverages explicitness to provide a better developer experience (e.g. validations, optimizations). Tools like [Bazel](https://bazel.build) take it further by bringing it down to the build system level. + +This is an issue that's barely discussed in the community, but it's a significant one. +While working on Tuist, +we've noticed many organizations and developers thinking that the current challenges they face will be addressed by the [Swift Package Manager](https://www.swift.org/documentation/package-manager/), +but what they don't realize is that because it's building on the same principles, +even though it mitigates the so well-known Git conflicts, +they degrade the developer experience in other areas and continue to make the projects non-optimizable. + +In the following sections, we'll discuss some real examples of how implicitness affects the developer experience and the project's health. The list is not exhaustive, but it should give you a good idea of the challenges that you might face when working with Xcode projects or Swift Packages. + +## Convenience getting in your way + +### Shared built products directory + +Xcode uses a directory inside the derived data directory for each product. +Inside it, it stores the build artifacts, such as the compiled binaries, the dSYM files, and the logs. +Because all the products of a project go into the same directory, +which is visible by default from other targets to link against, +**you might end up with targets that implicitly depend on each other.** +While this might not be a problem when having just a few targets, +it might manifest as failing builds that are hard to debug when the project grows. + +The consequence of this design decision is that many projects acidentally compile with a graph that is not well-defined. + +> [!TIP] TUIST ENFORCEMENT OF EXPLICIT DEPENDENCIES +> Tuist provides a generation configuration option to disallow implicit dependencies. When enabled, if a target tries to import a dependencies that's not explicitly declared, the build will fail. + +### Find implicit dependencies in schemes + +Defining and maintaining a dependency graph in Xcode gets harder as the project grows. +It's hard because they are codified in the `.pbxproj` files as build phases and build settings, +there are no tools to visualize and work with the graph, +and the changes in the graph (e.g. adding a new dynamic precompiled framework), +might require configuration changes upstream (e.g. adding a new build phase to copy the framework into the bundle). + +Apple decided at some point that instead of evolving the graph model into something more manageable, +it'd make more sense to add an option to resolve implicit dependencies at build time. +This is once again a questionable design choice because you might end up with slower build times or unpredictable builds. +For example, a build might pass locally due to some state in derive data, +which acts as a [singleton](https://en.wikipedia.org/wiki/Singleton_pattern), +but then fail to compile on CI because the state is different. + +> [!TIP] +> We recommend disabling this in your project schemes, and use like Tuist that eases the management of the dependency graph. + +### SwiftUI Previews and static libraries/frameworks + +Some editor features like SwiftUI Previews or Swift Macros require the compilation of the dependency graph from the file that's being edited. This integration between the editor requires that the build system resolves any implicitness and output the right artifacts that are necessary for those features to work. As you can imagine, **the more implicit the graph is, the more challenging the task is for the build system**, and therefore it's not surprising that many of these features don't work reliably. We often hear from developers that they stopped using SwiftUI previews long time ago because they were too unreliable. Instead, they are using either example apps, or avoiding certaing things, like the usage of static libraries or script build phases, because they cause the feature to break. + +### Mergeable libraries + +Dynamic frameworks, while more flexible and easier to work with, have a negative impact in the launch time of apps. On the other side, static libraries are faster to launch, but impact the compilation time and are a bit harder to work with, specially in complex graph scenarios. *Wouldn't it be great if you could change between one or the other depending on the configuration?* That's what Apple must have thought when they decided to work on mergeable libraries. But once again, they moved more build-time inference to the build-time. If reasoning about a dependency graph, imagine having to do so when the static or dynamic nature of the target will be resolved at build-time based on some build settings in some targets. Good luck making that work reliably while ensuring features like SwiftUI previews don't break. + +**Many users come to Tuist wanting to use mergeable libraries and our answer is always the same. You don't need to.** You can control the static or dynamic nature of your targets at generation-time leading to a project whose graph is known ahead of compilation. No variables need to be resolved at build-time. + +```bash +# The value of TUIST_DYNAMIC can be read from the project +# to set the product as static or dynamic based on the value. +TUIST_DYNAMIC=1 tuist generate +``` + +## Explicit, explicit, and explicit + +If there's an important non-written principle that we recommend every developer or organization that wants their development with Xcode to scale, is that they should embrace explicitness. And if explicitness is hard to manage with raw Xcode projects, they should consider something else, either [Tuist](https://tuist.io) or [Bazel](https://bazel.build). **Only then reliability, predicability, and optimizations will be possible.** + +## Future + +Whether Apple will do something to prevent all the above issues is unknown. +Their continuous decisions embedded into Xcode and the Swift Package Manager don't suggest that they will. +Once you allow implicit configuration as a valid state, +**it's hard to move from there without introducing breaking changes.** +Going back to first principles and rethinking the design of the tools might lead to breaking many Xcode projects that accidentally compiled for years. Imagine the community uproar if that happened. + +Apple finds itself in a bit of a chicken-and-egg problem. +Convenience is what helps developers get started quickly and build more apps for their ecosystem. +But their decisions to make the experience convenience at that scale, +is making it hard for them to ensure some of the Xcode features work reliably. + +Because the future is unknown, +we try to **be as close as possible to the industry standards and Xcode projects**. +We prevent the above issues, +and leverage the knowledge that we have to provide a better developer experience. +Ideally we wouldn't have to resort to project generation for that, +but the lack of extensibility of Xcode and the Swift Package Manager make it the only viable option. +And it's also a safe option because they'll have to break the Xcode projects to break Tuist projects. + +Ideally, **the build system was more extensible**, +but wouldn't it be a bad idea to have plugins/extensions that contract with a world of implicitness? +It doesn't seem like a good idea. +So it seems like we'll need external tools like Tuist or [Bazel](https://bazel.build) to provide a better developer experience. +Or maybe Apple will surprise us all and make Xcode more extensible and explicit... + +Until that happens, you have to choose whether you want to embrace the convencience of Xcode and take on the debt that comes with it, or trust us on this journey to provide a better developer experience. +We won't disappoint you. \ No newline at end of file diff --git a/docs/docs/guide/introduction/from-v3-to-v4.md b/docs/docs/guide/introduction/from-v3-to-v4.md new file mode 100644 index 00000000000..52af4bd3278 --- /dev/null +++ b/docs/docs/guide/introduction/from-v3-to-v4.md @@ -0,0 +1,96 @@ +--- +title: From v3 to v4 +description: This page documents how to migrate your project from using Tuist 3 to Tuist 4 +--- + +# From Tuist v3 to v4 + +With the release of [Tuist 4](https://github.com/tuist/tuist/releases/tag/4.0.0), we took the opportunity to introduce some breaking changes to the project, which we believed would make the project easier to use and maintain in the long run. This document outlines the changes you will need to make to your project to upgrade from Tuist 3 to Tuist 4. + +### Dropped version management through `tuistenv` + +Prior to Tuist 4, the installation script installed a tool, `tuistenv`, that would get rename to `tuist` at installation time. The tool would take care of installing and activating versions of Tuist ensuring determinsm across environments. With the aim of reducing the feature surface of Tuist, we decided to drop `tuistenv` in favor of [Mise](https://mise.jdx.dev/), a tool that does the same job but is more flexible and can be used across different tools. If you were using `tuistenv`, you'll have to uninstall the current version of Tuist by running `curl -Ls https://uninstall.tuist.io | bash` and then install it using the installation method of your choice. We strongly recommend the usage of Mise because it's able to install and activate versions deterministically across environments. + +::: code-group + +```bash [Uninstall tuistenv] +curl -Ls https://uninstall.tuist.io | bash +``` +::: + +> [!IMPORTANT] MISE IN CI ENVIRONMENTS AND XCODE PROJECTS +> If you decide to embrace the determinism that Mise brings across the board, we recommend checking out the documentation for how to use Mise in [CI environments](https://mise.jdx.dev/continuous-integration.html) and [Xcode projects](https://mise.jdx.dev/ide-integration.html#xcode). + +> [!NOTE] HOMEBREW IS SUPPORTED +> Note that you can still install Tuist using Homebrew, which is a popular package manager for macOS. You can find the instructions on how to install Tuist using Homebrew in the [installation guide](/guide/introduction/installation#alternative-homebrew). + +### Dropped `init` constructors from `ProjectDescription` models + +With the aim of improving the readability and expressiveness of the APIs, we decided to remove the `init` constructors from all the `ProjectDescription` models. Every model now provides a static constructor that you can use to create instances of the models. If you were using the `init` constructors, you'll have to update your project to use the static constructors instead. + +> [!TIP] NAMING CONVENTION +> The naming convention that we follow is to use the name of the model as the name of the static constructor. For example, the static constructor for the `Target` model is `Target.target`. + +### Renamed `--no-cache` to `--no-binary-cache` + +Because the `--no-cache` flag was ambiguous, we decided to rename it to `--no-binary-cache` to make it clear that it refers to the binary cache. If you were using the `--no-cache` flag, you'll have to update your project to use the `--no-binary-cache` flag instead. + +### Renamed `tuist fetch` to `tuist install` + +We renamed the `tuist fetch` command to `tuist install` to align with the industry convention. If you were using the `tuist fetch` command, you'll have to update your project to use the `tuist install` command instead. + +### [Adopt `Package.swift` as the DSL for dependencies](https://github.com/tuist/tuist/pull/5862) + +Before Tuist 4, you could define dependencies in a `Dependencies.swift` file. This proprietary format broke the support in tools like [Dependabot](https://github.com/dependabot) or [Renovatebot](https://github.com/renovatebot/renovate) to automatically update dependencies. Moreover, it introduced unnecessary indirections ofr users. Therefore, we decided to embrace `Package.swift` as the only way to define dependencies in Tuist. If you were using the `Dependencies.swift` file, you'll have to move the content from your `Tuist/Dependencies.swift` to a `Package.swift` at the root, and use the `#if TUIST` directive to configure the integration. You can read more about how to integrate Swift Package dependencies [here](/guide/project/dependencies.html#swift-packages) + +### Renamed `tuist cache warm` to `tuist cache` + +For brevity, we decided to rename the `tuist cache warm` command to `tuist cache`. If you were using the `tuist cache warm` command, you'll have to update your project to use the `tuist cache` command instead. + + +### Renamed `tuist cache print-hashes` to `tuist cache --print-hashes` + +We decided to rename the `tuist cache print-hashes` command to `tuist cache --print-hashes` to make it clear that it's a flag of the `tuist cache` command. If you were using the `tuist cache print-hashes` command, you'll have to update your project to use the `tuist cache --print-hashes` flag instead. + +### Removed caching profiles + +Before Tuist 4, you could define caching profiles in `Tuist/Config.swift` which contained a configuration for the cache. We decided to remove this feature because it could lead to confusion when using it in the generation process with a profile other than the one that was used to generate the project. Moreover, it could lead to users using a debug profile to build a release version of the app, which could lead to unexpected results. In its place, we introduced the `--configuration` option, which you can use to specify the configuration you want to use when generating the project. If you were using caching profiles, you'll have to update your project to use the `--configuration` option instead. + +### Removed `--skip-cache` in favor of arguments + +We removed the flag `--skip-cache` from the `generate` command in favor of controlling for which targets the binary cache should be skipped by using the arguments. If you were using the `--skip-cache` flag, you'll have to update your project to use the arguments instead. + +::: code-group + +```bash [Before] +tuist generate --skip-cache Foo +``` + +```bash [After] +tuist generate Foo +``` +::: + +### [Dropped signing capabilities](https://github.com/tuist/tuist/pull/5716) + +Signing is already solved by community tooling like [Fastlane](https://fastlane.tools/) and Xcode itself, which do a much better job at that. We felt that signing was an stretch goal for Tuist, and that it was better to focus on the core features of the project. If you were using Tuist signing capabilities, which consisted of encrypting the certificates and profiles in the repository and installing them in the right places at generation time, you might want to replicate that logic in your own scripts that run before project generation. In particular: + - A script that decrypts the certificates and profiles using a key either stored in the file-system or in a environment variable, and installs certificates in the keychain, and the provisioning profiles in the directory `~/Library/MobileDevice/Provisioning\ Profiles`. + - A script that can take an existing profiles and certificates and encrypt them. + +> [!TIP] SIGNING REQUIREMENTS +> Signing requires the right certificates to be present in the keychain and the provisioning profiles to be present in the directory `~/Library/MobileDevice/Provisioning\ Profiles`. You can use the `security` command-line tool to install certificates in the keychain and the `cp` command to copy the provisioning profiles to the right directory. + +### Dropped Carthage integration via `Dependencies.swift` + +Before Tuist 4, Carthage dependencies could be defined in a `Dependencies.swift` file, which users could then fetch by running `tuist fetch`. We also felt that this was a stretch goal for Tuist, specially considering a future where Swift Package Manager would be the preferred way to manage dependencies. If you were using Carthage dependencies, you'll have to use `Carthage` directly to pull the pre-compiled frameworks and XCFrameworks into Carthage's standard directory, and then reference those binaries from your tagets using the `TargetDependency.xcframework` and `TargetDependency.framework` cases. + +> [!NOTE] CARTHAGE IS STILL SUPPORTED +> Some users understood that we dropped Carthage support. We didn't. The contract between Tuist and Carthage's output is to system-stored frameworks and XCFrameworks. The only thing that changed is who is responsible for fetching the dependencies. It used to be Tuist through Carthage, now it's Carthage. + +### Dropped the `TargetDependency.packagePlugin` API + +Before Tuist 4, you could define a package plugin dependency using the `TargetDependency.packagePlugin` case. After seeing the Swift Package Manager introducing new package types, we decided to iterate on the API towards something that would be more flexible and future-proof. If you were using `TargetDependency.packagePlugin`, you'll have to use `TargetDependency.package` instead, and pass the type of package you want to use as an argument. + +### [Dropped deprecated APIs](https://github.com/tuist/tuist/pull/5560) + +We removed the APIs that were marked as deprecated in Tuist 3. If you were using any of the deprecated APIs, you'll have to update your project to use the new APIs. diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/installation.md b/docs/docs/guide/introduction/installation.md similarity index 70% rename from docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/installation.md rename to docs/docs/guide/introduction/installation.md index dafdac59f9c..b21730a9272 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/installation.md +++ b/docs/docs/guide/introduction/installation.md @@ -1,19 +1,22 @@ -# Installation - -Learn how to install Tuist in your environment +--- +title: Installation +description: Learn how to install Tuist in local and CI environments. +--- -## Overview +# Installation -Tuist is a [command-line application](https://en.wikipedia.org/wiki/Command-line_interface) that you need to install in your environment before you can use it. The installation consists of an executable, dynamic frameworks, and a set of resources (for example, templates). Although you could manually build Tuist from the sources, we recommend using one of the following installation methods to ensure a valid installation. +Tuist is a [command-line application](https://en.wikipedia.org/wiki/Command-line_interface) that you need to install in your environment before you can use it. The installation consists of an executable, dynamic frameworks, and a set of resources (for example, templates). Although you could manually build Tuist from the sources, **we recommend using one of the following installation methods to ensure a valid installation.** -### Recommended: [mise](https://github.com/jdx/mise) +### Recommended: [Mise](https://github.com/jdx/mise) -Tuist defaults to [mise](https://github.com/jdx/mise) as a tool to deterministically manage and activate versions of Tuist. +Tuist defaults to [Mise](https://github.com/jdx/mise) as a tool to deterministically manage and activate versions of Tuist. If you don't have it installed on your system, you can use any of these [installation methods](https://mise.jdx.dev/getting-started.html). Remember to add the suggested line to your shell, which will ensure the right version is activated when you choose a Tuist project directory in your terminal session. -> Note: mise is recommended over alternatives like [Homebrew](https://brew.sh) because it supports scoping and activating versions to directories, ensuring every environment uses the same version of Tuist deterministically. +::: info +Mise is recommended over alternatives like [Homebrew](https://brew.sh) because it supports scoping and activating versions to directories, ensuring every environment uses the same version of Tuist deterministically. +::: Once installed, you can install Tuist through any of the following commands: @@ -91,10 +94,11 @@ jobs: - uses: jdx/mise-action@v2 ``` +::: tip +We recommend using `mise use --pin` in your Tuist projects to pin the version of Tuist across environments. The command will create a `.tool-versions` file containing the version of Tuist. +::: -> Tip: We recommend using `mise use --pin` in your Tuist projects to pin the version of Tuist across environments. The command will create a `.tool-versions` file containing the version of Tuist. - -### Alternative: Homebrew +### Alternative: [Homebrew](https://brew.sh) If version pinning across environments is not a concern for you, you can install Tuist using [Homebrew](https://brew.sh) and [our formulas](https://github.com/tuist/homebrew-tuist): @@ -107,11 +111,13 @@ brew install tuist@x.y.z ### Shell completions - - If you have Tuist **globally installed**, you can install shell completions for Bash and Zsh to autocomplete commands and options. +::: warning What is a global installation +A global installation is an installation that's available in your shell's `$PATH` environment variable. This means you can run `tuist` from any directory in your terminal. This is the default installation method for Homebrew. +::: + #### Zsh If you have [oh-my-zsh](https://ohmyz.sh/) installed, you already have a directory of automatically loading completion scripts — `.oh-my-zsh/completions`. Copy your new completion script to a new file in that directory called `_tuist`: @@ -146,4 +152,18 @@ Without bash-completion, you'll need to source the completion script directly. C ```bash source ~/.bash_completions/example.bash -``` \ No newline at end of file +``` + +## Next steps + +Once the installation is complete, you can start using Tuist to manage your projects. Here are some paths you might want to explore: + +- [**Create a new project**](/guide/introduction/adopting-tuist/new-project): If you are new to Tuist and don't have a project to migrate, you can start by creating a new project. We recommend introducing Tuist as early as possible in your project's lifecycle to be prepared for future growth and avoid laborious migrations. +- [**Use it with an existing Swift Package**](/guide/introduction/adopting-tuist/swift-package): If you have a project already declared using the Swift Package Manager, you might consider this option to explore how Tuist optimizations such as [binary caching](/cloud/binary-caching) or [selective testing](/cloud/binary-caching) might impact your workflows. + + \ No newline at end of file diff --git a/docs/Sources/tuist/tuist.docc/Tuist.md b/docs/docs/guide/introduction/what-is-tuist.md similarity index 84% rename from docs/Sources/tuist/tuist.docc/Tuist.md rename to docs/docs/guide/introduction/what-is-tuist.md index 5a907a76172..742c2fddab2 100644 --- a/docs/Sources/tuist/tuist.docc/Tuist.md +++ b/docs/docs/guide/introduction/what-is-tuist.md @@ -1,17 +1,18 @@ -# ``tuist`` +--- +title: What is Tuist? +description: Learn about Tuist, a tool that simplifies the complexities of modularization, optimizes workflows, and democratizes the evolution of Xcode projects. +--- -Tuist is a command-line interface (CLI) designed to tackle the complexities of building large-scale applications for Apple platforms. - -## Documentation migration - -> Important: We are in the process of rewriting the documentation towards the release of Tuist 4.0 and therefore some content might be missing here. We recommend checking out the [old documentation](https://docs.old.tuist.io) if you can't find what you are looking for. - -## Motivation +# Tuist As Xcode projects expand, **organizations may face a decline in productivity** due to several factors, including unreliable incremental builds, frequent clearing of Xcode's global cache by developers encountering issues, and fragile project configurations. To maintain rapid feature development, organizations typically explore various strategies. Some organizations choose to bypass the compiler by abstracting the platform using JavaScript-based dynamic runtimes, such as [React Native](https://reactnative.dev/). While this approach may be effective, it [complicates access to the platform's native features](https://shopify.engineering/building-app-clip-react-native). Other organizations opt for **modularizing the codebase**, which helps establish clear boundaries, making the codebase easier to work with and improving the reliability of build times. However, the Xcode project format is not designed for modularity and results in implicit configurations that few understand and frequent conflicts. This leads to a bad bus factor, and although incremental builds may improve, developers might still frequently clear Xcode's build cache (i.e., derived data) when builds fail. To address this, some organizations choose to **abandon Xcode's build system** and adopt alternatives like [Buck](https://buck.build/) or [Bazel](https://bazel.build/). However, this comes with a [high complexity and maintenance burden](https://bazel.build/migrate/xcode) (e.g., Xcode updates might disrupt the integration with Bazel, which is ultimately a hack). +::: tip The cost of convenience +Xcode's design optimizes for the convenience of small projects and often achieves this through implicit configurations. Implicitness resolved at build-time, while great at small scale, lead to unpredictable and unreliable builds and Xcode beharior at scale, and difficults optimizations. +::: + ## Tuist [Tuist](https://tuist.io) is a viable alternative that aids in surmounting these challenges while maintaining complexity and costs at an acceptable level. It considers Xcode projects as a fundamental element, ensuring resilience against future Xcode updates, and utilizes Xcode project generation to offer teams a modularization-focused declarative API. Tuist uses the project declaration to **simplify the complexities of modularization**, **optimize workflows** like build or test across various environments, and facilitate and **democratize the evolution of Xcode projects**. @@ -36,26 +37,28 @@ To get started with Tuist, all you need is to define your project using **Tuist' Once you've defined your project, Tuist offers various workflows to manage and interact with it: - **Generate:** This is a foundational workflow. Use it to create an Xcode project that's compatible with Xcode. -- **Build:** This workflow not only generates the Xcode project but also employs xcodebuild to compile it. -- **Test:** Operating much like the build workflow, this not only generates the Xcode project but utilizes xcodebuild to test it. +- **Build:** This workflow not only generates the Xcode project but also employs `xcodebuild` to compile it. +- **Test:** Operating much like the build workflow, this not only generates the Xcode project but utilizes `xcodebuild` to test it. -Additionally, as detailed in , Tuist offers a suite of optimizations. These include **target-focused project generation**, the ability to swap out targets and dependencies with their **binary** equivalents, and ensuring build and test incrementality across different environments (e.g., local machine vs. CI). Plus, it provides actionable insights to guide teams in making informed choices. +Additionally, Tuist offers a suite of optimizations, [Tuist Cloud](/cloud/what-is-cloud). These include **target-focused project generation**, the ability to swap out targets and dependencies with their **binary** equivalents, and ensuring build and test incrementality across different environments (e.g., local machine vs. CI). Plus, it provides actionable insights to guide teams in making informed choices. -> Tip: Tuist's optimizations and insights stem from the knowledge gained from your project's manifest files. To ensure teams remain productive, data-backed decisions are essential—something Xcode doesn't offer. As a result, teams often operate without clear insights, unsure if their choices benefit the project. +> [!TIP] +> Tuist's optimizations and insights stem from the knowledge gained from your project's manifest files. To ensure teams remain productive, data-backed decisions are essential—something Xcode doesn't offer. As a result, teams often operate without clear insights, unsure if their choices benefit the project. ## Frequently asked questions ### How does Tuist compare to... +
    -##### Swift Package Manager +#### Swift Package Manager While the Swift Package Manager (SPM) primarily focuses on dependencies, Tuist offers a different approach. With Tuist, you don't just define packages for SPM integration; you shape your projects using familiar concepts like projects, workspaces, targets, and schemes. -##### XcodeGen +#### XcodeGen [XcodeGen](https://github.com/yonaskolb/XcodeGen) is a dedicated project generator designed to reduce conflicts in collaborative Xcode projects and simplify some complexities of Xcode's internal workings. However, projects are defined using serializable formats like [YAML](https://yaml.org/). Unlike Swift, this doesn't allow developers to build upon abstractions or checks without incorporating additional tools. While XcodeGen does offer a way to map dependencies to an internal representation for validation and optimization, it still exposes developers to the nuances of Xcode. This might make XcodeGen a suitable foundation for [building tools](https://github.com/MobileNativeFoundation/rules_xcodeproj), as seen in the Bazel community, but it's not optimal for inclusive project evolution that aims to maintain a healthy and productive environment. -##### Bazel +#### Bazel [Bazel](https://bazel.build) is an advanced build system renowned for its remote caching features, gaining popularity within the Swift community primarily for this capability. However, given the limited extensibility of Xcode and its build system, substituting it with Bazel's system demands significant effort and maintenance. Only a few companies with abundant resources can bear this overhead, as evident from the select list of firms investing heavily to integrate Bazel with Xcode. Interestingly, the community created a [tool](https://github.com/MobileNativeFoundation/rules_xcodeproj) that employs Bazel's XcodeGen to generate an Xcode project. This results in a convoluted chain of conversions: from Bazel files to XcodeGen YAML and finally to Xcode Projects. Such layered indirection often complicates troubleshooting, making issues more challenging to diagnose and resolve. @@ -67,7 +70,7 @@ Rest assured, if any issues arise, you can simply add the Xcode projects and wor The choice is yours. By adding .xcodeproj and .xcworkspace files to your .gitignore, you can avoid many git conflicts. We suggest initially migrating the project to Tuist. After ensuring everything functions smoothly, guide your team on using tuist generate before they start working on a project. Once this becomes a routine, you can safely add those projects to .gitignore without any issues. -## Topics + diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/sharing-code-across-manifests.md b/docs/docs/guide/project/code-sharing.md similarity index 70% rename from docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/sharing-code-across-manifests.md rename to docs/docs/guide/project/code-sharing.md index cd6e53d03f4..40e0ed961ce 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/sharing-code-across-manifests.md +++ b/docs/docs/guide/project/code-sharing.md @@ -1,9 +1,9 @@ +--- +title: Code sharing +description: Learn how to share code across manifest files to reduce duplications and ensure consistency +--- -# Sharing code across manifests - -Project description helpers are a group of Swift files that can be accessed from any project manifest. They are useful to extract common patterns, define project conventions, or simplify the definition of projects. - -## Overview +# Code sharing One of the inconveniences of Xcode when we use it with large projects is that it doesn't allow reusing elements of the projects other than the build settings through `.xcconfig` files. Being able to reuse project definitions is useful for the following reasons: @@ -14,7 +14,10 @@ One of the inconveniences of Xcode when we use it with large projects is that it Reusing code across manifest files is possible in Tuist thanks to the concept of **project description helpers**. -### Definition +> [!TIP] A TUIST UNIQUE ASSET +> Many organizations like Tuist because they see in project description helpers a platform for platform teams to codify their own conventions and come up with their own language for describing their projects. For example, YAML-based project generators have to come up with their own YAML-based propietary templating solution, or force organizations onto building their tools upon. + +## Project description helpers Project description helpers are Swift files that get compiled into a module, `ProjectDescriptionHelpers`, that manifest files can import. The module is compiled by gathering all the files in the `Tuist/ProjectDescriptionHelpers` directory. @@ -26,18 +29,17 @@ import ProjectDescription import ProjectDescriptionHelpers ``` -`ProjectDescriptionHelpers` are available in: -- [Project.swift](project) -- [Package.swift](dependencies) (only behind the `#TUIST` compiler flag) -- [Workspace.swift](workspace) +`ProjectDescriptionHelpers` are available in the following manifests: +- `Project.swift` +- `Package.swift` (only behind the `#TUIST` compiler flag) +- `Workspace.swift` -### Example +## Example The snippets below contain an example of how we extend the `Project` model to add static constructors and how we use them from a `Project.swift` file: -**Project+Templates.swift** - -```swift +::: code-group +```swift [Tuist/Project+Templates.swift] import ProjectDescription extension Project { @@ -71,13 +73,13 @@ extension Project { } ``` -**Project.swift** - -```swift {2} +```swift {2} [Project.swift] import ProjectDescription import ProjectDescriptionHelpers let project = Project.featureFramework(name: "MyFeature") ``` +::: -> Tip: Note how through the function we are defining conventions about the name of the targets, the bundle identifier, and the folders structure. +> [!TIP] A TOOL TO ESTABLISH CONVENTIONS +> Note how through the function we are defining conventions about the name of the targets, the bundle identifier, and the folders structure. diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/dependencies.md b/docs/docs/guide/project/dependencies.md similarity index 54% rename from docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/dependencies.md rename to docs/docs/guide/project/dependencies.md index b401148dbb2..8931bfac481 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/dependencies.md +++ b/docs/docs/guide/project/dependencies.md @@ -1,12 +1,15 @@ -# Dependencies - -Learn how to declare internal and external dependencies in your project. +--- +title: Dependencies +description: Learn how to declare dependencies in your Tuist project. +--- -## Overview +# Dependencies When a project grows, it's common to split it into multiple targets to share code, define boundaries, and improve build times. Multiple targets means defining dependencies between them forming a **dependency graph**, which might include external dependencies as well. +## XcodeProj-codified graphs + Due to Xcode and XcodeProj's design, the maintenance of a dependency graph can be a tedious and error-prone task. Here are some examples of the problems that you might encounter: @@ -27,9 +30,10 @@ The intricacies and implementation details are abstracted away from you. In the following sections you'll learn how to declare dependencies in your project. -> Note: Tuist validates the graph when generating the project to ensure that there are no cycles and that all the dependencies are valid. Thanks to this, any team can take part in evolving the dependency graph without worrying about breaking it. +> [!TIP] GRAPH VALIDATION +> Tuist validates the graph when generating the project to ensure that there are no cycles and that all the dependencies are valid. Thanks to this, any team can take part in evolving the dependency graph without worrying about breaking it. -## Internal dependencies +## Local dependencies Targets can depend on other targets in the same and different projects, and on binaries. When instantiating a `Target`, you can pass the `dependencies` argument with any of the following options: @@ -42,9 +46,16 @@ When instantiating a `Target`, you can pass the `dependencies` argument with any - `SDK`: Declares a dependency with a system SDK. - `XCTest`: Declares a dependency with XCTest. -Note that every dependency type accepts a `condition` option to conditionally link the dependency based on the platform. By default, it links the dependency for all platforms the target supports. +> [!NOTE] DEPENDENCY CONDITIONS +> Every dependency type accepts a `condition` option to conditionally link the dependency based on the platform. By default, it links the dependency for all platforms the target supports. -> Warning: We haven't yet solved the problem of targets being able to import dependencies that they shouldn't. Some users have implemented their custom solutions to detect this, but we haven't yet found a solution that we're happy with. We are currently exploring customizing the directory where products are outputted to solve this problem. +> [!TIP] ENFORCING EXPLICIT DEPENDENCIES +> We have an experimental feature to enforce explicit dependencies in Xcode. We recommend enabling it to ensure targets can only import the dependencies that they've explicitly declared. +> ```swift +> import ProjectDescription +> let config = Config(generationOptions: .options(enforceExplicitDependencies: true)) +> ``` + ## External dependencies @@ -60,15 +71,81 @@ You can integrate them using Xcode's default integration mechanism or using Tuis Xcode's default integration while being the most convenient one, lacks flexibility and control that's required for medium and large projects. To overcome this, Tuist offers an XcodeProj-based integration that allows you to integrate Swift Packages in your project using XcodeProj's targets. -Thanks to that, we can not only give you more control over the integration but also make it compatible with workflows like binary caching () and selective testing (). +Thanks to that, we can not only give you more control over the integration but also make it compatible with workflows like [binary caching](/cloud/binary-caching) and [selective testing](/cloud/selective-testing). XcodeProj's integration is more likely to take more time to support new Swift Package features or handle more package configurations. However, the mapping logic between Swift Packages and XcodeProj targets is open-source and can be contributed to by the community. This is contrary to Xcode's default integration, which is closed-source and maintained by Apple. -You can follow the tutorial to learn more about how to integrate Swift Packages in your project. +To add external dependencies, you'll have to create a `Package.swift` either under `Tuist/` or at the root of the project. + +::: code-group +```swift [Tuist/Package.swift] +// swift-tools-version: 5.9 +import PackageDescription + +#if TUIST + import ProjectDescription + import ProjectDescriptionHelpers + + let packageSettings = PackageSettings( + productTypes: [ + "Alamofire": .framework, // default is .staticFramework + ] + ) + +#endif + +let package = Package( + name: "PackageName", + dependencies: [ + .package(url: "https://github.com/Alamofire/Alamofire", from: "5.0.0"), -> Note: The **schemes** are not automatically created for Swift Package projects to keep the schemes list clean. You can create them via Xcode's UI. + ] +) +``` +::: + +> [!TIP] PACKAGE SETTINGS +> The `PackageSettings` instance wrapped in a compiler directive allows you to configure how packages are integrated. For example, in the example above it's used to override the default product type used for packages. By default, you shouldn't need it. + +The `Package.swift` file is just an interface to declare external dependencies, nothing else. That's why you don't define any targets or products in the package. Once you have the dependencies defined, you can run the following command to resolve and pull the dependencies into the `Tuist/Dependencies` directory: + +```bash +tuist install +# Resolving and fetching dependencies. +# Installing Swift Package Manager dependencies. +``` + +As you might have noticed, we take an approach similar to [CocoaPods](https://cocoapods.org)', where the resolution of dependencies is its own command. This gives control to the users over when they'd like dependencies to be resolved and updated, and allows opening the Xcode in project and have it ready to compile. This is an area where we believe the developer experience provided by Apple's integration with the Swift Package Manager degrates over time as the project grows. + +From your project targets you can then reference those dependencies using the `TargetDependency.external` dependency type: + +::: code-group +```swift [Project.swift] +import ProjectDescription + +let project = Project( + name: "App", + organizationName: "tuist.io", + targets: [ + .target( + name: "App", + destinations: [.iPhone], + product: .app, + bundleId: "io.tuist.app", + deploymentTargets: .iOS("13.0"), + infoPlist: .default, + sources: ["Targets/App/Sources/**"], + dependencies: [ + .external(name: "Alamofire"), // [!code ++] + ] + ), + ] +) +``` +::: -> Note: The **product type** defaults to static framework when none is specified. +> [!NOTE] NO SCHEMES GENERATED FOR EXTERNAL PACKAGES +> The **schemes** are not automatically created for Swift Package projects to keep the schemes list clean. You can create them via Xcode's UI. #### Xcode's default integration @@ -101,7 +178,9 @@ carthage update tuist generate ``` -> Warning: Carthage dependencies are not compatible with workflows like `build` or `test` that run `xcodebuild` right after generating the project. We have plans to add support for pre and post generation hooks. +> [!WARNING] BUILD AND TEST +> If you build and test your project through `tuist build` and `tuist test` +> ### CocoaPods @@ -114,4 +193,5 @@ tuist generate pod install ``` -> Warning: CocoaPods dependencies are not compatible with workflows like `build` or `test` that run `xcodebuild` right after generating the project. They are also incompatible with binary caching and selective testing since the fingerprinting logic doesn't account for the Pods dependencies. +> [!WARNING] +> CocoaPods dependencies are not compatible with workflows like `build` or `test` that run `xcodebuild` right after generating the project. They are also incompatible with binary caching and selective testing since the fingerprinting logic doesn't account for the Pods dependencies. diff --git a/docs/docs/guide/project/directory-structure.md b/docs/docs/guide/project/directory-structure.md new file mode 100644 index 00000000000..1685246e068 --- /dev/null +++ b/docs/docs/guide/project/directory-structure.md @@ -0,0 +1,48 @@ +--- +title: Directory structure +description: Learn about the structure of Tuist projects and how to organize them. +--- + +# Directory structure + +Although Tuist projects are commonly used to supersede Xcode projects, they are not limited to this use case. Tuist projects are also used to generate other types of projects, such as SPM packages, templates, plugins, and tasks. This document describes the structure of Tuist projects and how to organize them. In later sections, we'll cover how to define templates, plugins, and tasks. + +## Standard Tuist projects + +Tuist projects are **the most common type of project generated by Tuist.** They are used to build apps, frameworks, and libraries among others. Unlike Xcode projects, Tuist projects are defined in Swift, which makes them more flexible and easier to maintain. Tuist projects are also more declarative, which makes them easier to understand and reason about. The following structure shows a typical Tuist project that generates an Xcode project: + +> [!INFO] MANIFEST FILES +> The definition files are referred to as **manifest files** throughout the documentation. + +```bash +Tuist/ + Config.swift + Package.swift + ProjectDescriptionHelpers/ +Projects/ + App/ + Project.swift + Feature/ + Project.swift +Workspace.swift +``` + +- **Tuist directory:** This directory has two purposes. First, it signals **where the root of the project is**. This allows constructing paths relative to the root of the project, and also also running Tuist commands from any directory within the project. Second, it's the container for the following files: + - **Config.swift:** This file contains configuration for Tuist that's shared across all the projects, workspaces, and environments. For example, it can be used to disable automatic generation of schemes, or to define the deployment target of the projects. + - **ProjectDescriptionHelpers:** This directory contains Swift code that's shared across all the manifest files. Manifest files can `import ProjectDescriptionHelpers` to use the code defined in this directory. Sharing code is useful to avoid duplications and ensure consistency across the projects. + - **Package.swift:** This file contains Swift Package dependencies for Tuist to integrate them using Xcode projects and targets (like [CocoaPods](https://cococapods)) that are configurable and optimizable. Learn more [here](doc:dependencies). + +- **Root directory**: The root directory of your project that also contains the `Tuist` directory. + - **Workspace.swift:** This manifest represents an Xcode workspace. It's used to group other projects and can also add additional files and schemes. + - **Project.swift:** This manifest represents an Xcode project. It's used to define the targets that are part of the project, and their dependencies. + +When interacting with the above project, commads expect to find either a `Workspace.swift` or a `Project.swift` file in the working directory or the directory indicated via the `--path` flag. The manifest should be in a directory or subdirectory of a directory containing a `Tuist` directory, which represents the root of the project. + +> [!TIP] +> Xcode workspaces allowed splitting projects into multiple Xcode projects to reduce the likelihood of merge conflicts. If that's what you were using workspaces for, you don't need them in Tuist. Tuist auto-generates a workspace containing a project and its dependencies' projects. + +## Swift Package + +Tuist also supports SPM package projects. If you are working on an SPM package, you shouldn't need to update anything. Tuist automatically picks up on your root `Package.swift` and all the features of Tuist work as if it was a `Project.swift` manifest. + +To get started, run `tuist install` and `tuist generate` in your SPM package. Your project should now have all the same schemes and files that you would see in the vanilla Xcode SPM integration. However, now you can also run [`tuist cache`](/cloud/binary-caching) and have majority of your SPM dependencies and modules precompiled, making subsequent builds extremely fast. \ No newline at end of file diff --git a/docs/docs/guide/project/dynamic-configuration.md b/docs/docs/guide/project/dynamic-configuration.md new file mode 100644 index 00000000000..2dceaa867d8 --- /dev/null +++ b/docs/docs/guide/project/dynamic-configuration.md @@ -0,0 +1,55 @@ +--- +title: Dynamic configuration +description: Learn how how to use environment variables to dynamically configure your project. +--- + +# Dynamic configuration + +There are certain scenarios where you might need to dynamically change to dynamically configure your project at generation time. For example, you might want to change the name of the app, the bundle identifier, or the deployment target based on the environment where the project is being generated. Tuist supports that via environment variables, which can be accessed from the manifest files. + +## Configuration through environment variables + +Tuist allows passing configuration through environment variables that can be accessed from the manifest files. For example: + +```bash +TUIST_APP_NAME=MyApp tuist generate +``` + +If you want to pass multiple environment variables just separate them with a space. For example: + +```bash +TUIST_APP_NAME=MyApp TUIST_APP_LOCALE=pl tuist generate +``` + +## Reading the environment variables from manifests + +Variables can be accessed using the [`Environment`](/reference/project-description/environment) type. Any variables following the convention `TUIST_XXX` defined in the environment or passed to Tuist when running commands will be accessible using the `Environment` type. The following example shows how we access the `TUIST_APP_NAME` variable: + +```swift +func appName() -> String { + if case let .string(environmentAppName) = Environment.appName { + return environmentAppName + } else { + return "MyApp" + } +} +``` + +Accessing variables returns an instance of type `Environment.Value?` which can take any of the following values: + +| Case | Description | +| --- | --- | +| `.string(String)` | Used when the variable represents a string. | + +You can also retrieve the string or boolean `Environment` variable using either of the helper methods defined below, these methods require a default value to be passed to ensure the user gets consistent results each time. This avoids the need to define the function appName() defined above. + +::: code-group + +```swift [String] +Environment.appName.getString(default: "TuistApp") +``` + +```swift [Boolean] +Environment.isCI.getBoolean(default: false) +``` +::: \ No newline at end of file diff --git a/docs/docs/guide/project/editing.md b/docs/docs/guide/project/editing.md new file mode 100644 index 00000000000..8b941749eef --- /dev/null +++ b/docs/docs/guide/project/editing.md @@ -0,0 +1,41 @@ +--- +title: Editing +description: Learn how to use Tuist's edit workflow to declare your project leveraging Xcode's build system and editor capabilities. +--- + +# Editing + +Unlike traditional Xcode projects or Swift Packages, +where changes are done through Xcode's UI, +Tuist-managed projects are defined in Swift code contained in **manifest files**. +If you're familiar with Swift Packages and the `Package.swift` file, +the approach is very similar. + +You could edit these files using any text editor, +but we recommend to use Tuist-provided workflow for that, +`tuist edit`. +The workflow creates an Xcode project that contains all manifest files and allows you to edit and compile them. +Thanks to using Xcode, +you get all the benefits of **code completion, syntax highlighting, and error checking**. + +## Edit the project + +To edit your project, you can run the following command in a Tuist project directory or a sub-directory: + +```bash +tuist edit +``` + +The command creates an Xcode project in a global directory and opens it in Xcode. +The project includes a `Manifests` directory that you can build to ensure all your manifests are valid. + +> [!INFO] GLOB-RESOLVED MANIFESTS +> `tuist edit` resolves the manifests to be included by using the glob `**/{Manifest}.swift` from the project's root directory (the one containing the `/Tuist` directory). Make sure the `/Tuist` directory contains a valid `Config.swift` + +## Edit and generate workflow + +As you might have noticed, the editing can't be done from the generated Xcode project. +That's by design to prevent the generated project from having a dependency on Tuist, +ensuring you can move from Tuist in the future with little effort. + +When iterating on a project, we recommend running `tuist edit` from a terminal session to get an Xcode project to edit the project, and use another terminal session to run `tuist generate`. \ No newline at end of file diff --git a/docs/docs/guide/project/plugins.md b/docs/docs/guide/project/plugins.md new file mode 100644 index 00000000000..5371aa6a2dd --- /dev/null +++ b/docs/docs/guide/project/plugins.md @@ -0,0 +1,142 @@ +--- +title: Plugins +description: Learn how to create and use plugins in Tuist to extend its functionality. +--- + +# Plugins + +Plugins are a tool to share and reuse Tuist artifacts across multiple projects. The following artifacts are supported: + +- [Project description helpers](/guide/project/code-sharing) across multiple projects. +- [Templates](/guide/project/templates) across multiple projects. +- Tasks across multiple projects. +- [Resource accessor](/guide/project/synthesized-files) template across multiple projects + +Note that plugins are designed to be a simple way to extend Tuist's functionality. Therefore there are **some limitations to consider**: + +- A plugin cannot depend on another plugin. +- A plugin cannot depend on third-party Swift packages +- A plugin cannot use project description helpers from the project that uses the plugin. + +If you need more flexibility, consider suggesting a feature for the tool or building your own solution upon Tuist's generation framework, [`TuistGenerator`](https://github.com/tuist/tuist/tree/main/Sources/TuistGenerator). + +> [!WARNING] NON-ACTIVELY-MAINTAINED +> Our plugin infrastructure is not actively maintained. We are looking for contributors to help us improve it. If you are interested, please reach out to us on [Slack](https://slack.tuist.io/). + +## Plugin types + +### Project description helper plugin + +A project description helper plugin is represented by a directory containing a `Plugin.swift` manifest file that declares the plugin's name and a `ProjectDescriptionHelpers` directory containing the helper Swift files. + +::: code-group +```bash [Plugin.swift] +import ProjectDescription + +let plugin = Plugin(name: "MyPlugin") +``` +```bash [Directory structure] +. +├── ... +├── Plugin.swift +├── ProjectDescriptionHelpers +└── ... +``` +::: + +### Resource accessor templates plugin + +If you need to share [synthesized resource accessors](/guide/project/synthesized-files.html#resource-accessors) you can use +this type of plugin. The plugin is represented by a directory containing a `Plugin.swift` manifest file that declares the plugin's name and a `ResourceSynthesizers` directory containing the resource accessor template files. + + +::: code-group +```bash [Plugin.swift] +import ProjectDescription + +let plugin = Plugin(name: "MyPlugin") +``` +```bash [Directory structure] +. +├── ... +├── Plugin.swift +├── ResourceSynthesizers +├───── Strings.stencil +├───── Plists.stencil +├───── CustomTemplate.stencil +└── ... +``` +::: + +The name of the template is the [camel case](https://en.wikipedia.org/wiki/Camel_case) version of the resource type: + +| Resource type | Template file name | +| ------------- | ------------------ | +| Strings | Strings.stencil | +| Assets | Assets.stencil | +| Property Lists | Plists.stencil | +| Fonts | Fonts.stencil | +| Core Data | CoreData.stencil | +| Interface Builder | InterfaceBuilder.stencil | +| JSON | JSON.stencil | +| YAML | YAML.stencil | + +When defining the resource synthesizers in the project, you can specify the plugin name to use the templates from the plugin: + +```swift +let project = Project(resourceSynthesizers: [.strings(plugin: "MyPlugin")]) +``` + +### Task plugin + +Tasks are `$PATH`-exposed executables that are invocable through the `tuist` command if they follow the naming convention `tuist-`. In earlier versions, Tuist provided some weak conventions and tools under `tuist plugin` to `build`, `run`, `test` and `archive` tasks represented by executables in Swift Packages, but we have deprecated this feature since it increases the maintenance burden and complexity of the tool. + +If you were using Tuist for distributing tasks, we recommend building your +- You can continue using the `ProjectAutomation.xcframework` distributed with every Tuist release to have access to the project graph from your logic with `let graph = try Tuist.graph()`. The command uses sytem process to run the `tuist` command, and return the in-memory representation of the project graph. +- To distribute tasks, we recommend including the a fat binary that supports the `arm64` and `x86_64` in GitHub releases, and using [Mise](https://mise.jdx.dev) as an installation tool. To insturct Mise on how to install your tool, you'll need a plugin repository. You can use [Tuist's](https://github.com/asdf-community/asdf-tuist) as a reference. +- If you name your tool `tuist-{xxx}` and users can install it by running `mise install`, they can run it either invoking it directly, or through `tuist xxx`. + +> [!NOTE] THE FUTURE OF PROJECTAUTOMATION +> We plan to consolidate the models of `ProjectAutomation` and `TuistGraph` into a single backward-compatible framework that exposes the entirity of the project graph to the user. Moreover, we'll extract the generation logic into a new layer, `XcodeProjectGenerator` that you can also use from your own CLI. Think of it as building your own Tuist. + +## Using plugins + +To use a plugin, you'll have to add it to your project's [`Config.swift`](/reference/project-description/config) manifest file: + +```swift +import ProjectDescription + + +let config = Config( + plugins: [ + .local(path: "/Plugins/MyPlugin") + ] +) +``` + +If you want to reuse a plugin across projects that live in different repositories, you can push your plugin to a Git repository and reference it in the `Config.swift` file: + +```swift +import ProjectDescription + + +let config = Config( + plugins: [ + .git(url: "https://url/to/plugin.git", tag: "1.0.0"), + .git(url: "https://url/to/plugin.git", sha: "e34c5ba") + ] +) +``` + +After adding the plugins, `tuist install` will fetch the plugins in a global cache directory. + +> [!NOTE] NO VERSION RESOLUTION +> As you might have noted, we don't provide version resolution for plugins. We recommend using Git tags or SHAs to ensure reproducibility. + +> [!TIP] PROJECT DESCRIPTION HELPERS PLUGINS +> Whe using a project description helpers plugin, the name of the module that contains the helpers is the name of the plugin +> ```swift +> import ProjectDescription +> import MyTuistPlugin +> let project = Project.app(name: "MyCoolApp", platform: .iOS) +> ``` \ No newline at end of file diff --git a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/synthesized-files.md b/docs/docs/guide/project/synthesized-files.md similarity index 79% rename from docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/synthesized-files.md rename to docs/docs/guide/project/synthesized-files.md index ea6623506f1..60695a592e7 100644 --- a/docs/Sources/tuist/tuist.docc/Articles/Tuist/Users/synthesized-files.md +++ b/docs/docs/guide/project/synthesized-files.md @@ -1,10 +1,13 @@ -# Synthesized files +--- +title: Synthesized files +description: Learn about synthesized files in Tuist projects. +--- -Learn how Tuist synthesizes code and resources at generation-time +# Synthesized files -## Overview +Tuist can generate files and code at generation-time to bring some convenience to managing and working with Xcode projects. In this page you'll learn about this functionality, and how you can use it in your projects. -### Target resources +## Target resources Xcode projects support adding resources to targets. However, they present teams with a few challenges, specially when working with a modular project where sources and resources are often moved around: @@ -14,9 +17,10 @@ Xcode projects support adding resources to targets. However, they present teams Tuist solves the problems above by **synthesizing a unified interface to access bundles and resources** that abstracts away the implementation details. -> Important: Even though accessing resources through the Tuist-synthesized interface is not mandatory, we recommend it because it makes the code easier to reason about and the resources to move around. +> [!IMPORTANT] RECOMMENDED +> Even though accessing resources through the Tuist-synthesized interface is not mandatory, we recommend it because it makes the code easier to reason about and the resources to move around. -### Synthesized resources +## Resources Tuist provides interfaces to declare the content of files such as `Info.plist` or entitlements in Swift. This is useful to ensure consistency across targets and projects, @@ -26,13 +30,14 @@ You can also come up with your own abstractions to model the content and share i When your project is generated, Tuist will synthesize the content of those files and write them into the `Derived` directory relative to the directory containing the project that defines them. -> Note: We recommend adding the `Derived` directory to the `.gitignore` file of your project. +> [!TIP] GITIGNORE THE DERIVED DIRECTORY +> We recommend adding the `Derived` directory to the `.gitignore` file of your project. -### Synthesized bundle accessor +## Bundle accessors Tuist synthesizes an interface to access the bundle that contains the target resources. -##### Swift +### Swift The target will contain an extension of the `Bundle` type that exposes the bundle: @@ -40,7 +45,7 @@ The target will contain an extension of the `Bundle` type that exposes the bundl let bundle = Bundle.module ``` -##### Objective-C +### Objective-C In Objective-C, you'll get an interface `{Target}Resources` to access the bundle: @@ -48,9 +53,10 @@ In Objective-C, you'll get an interface `{Target}Resources` to access the bundle NSBundle *bundle = [MyFeatureResources bundle]; ``` -> Tip: If a target product, for example a library, doesn't support resources, Tuist will include the resources in a target of product type `bundle` ensuring that it ends up in the final product and that the interface points to the right bundle. +> [!TIP] SUPPORTING RESOURCES IN LIBRARIES THROUGH BUNDLES +> If a target product, for example a library, doesn't support resources, Tuist will include the resources in a target of product type `bundle` ensuring that it ends up in the final product and that the interface points to the right bundle. -### Synthesized resource accessors +## Resource accessors Resources are identified by their name and extension using strings. This is not ideal because it's not caught at compile time and might lead to crashes in release. To prevent that, Tuist integrates [SwiftGen](https://github.com/SwiftGen/SwiftGen) into the project generation process to synthesize an interface to access the resources. Thanks to that, you can confidently access the resources leveraging the compiler to catch any issues. @@ -92,4 +98,5 @@ you can use the `Project.resourceSynthesizers` property passing the list of reso let project = Project(resourceSynthesizers: [.string(), .fonts()]) ``` -> Note: You can check out [this fixture](https://github.com/tuist/tuist/tree/main/fixtures/ios_app_with_templates) to see an example of how to use custom templates to synthesize accessors to resources. +> [!NOTE] REFERENCE +> You can check out [this fixture](https://github.com/tuist/tuist/tree/main/fixtures/ios_app_with_templates) to see an example of how to use custom templates to synthesize accessors to resources. diff --git a/docs/docs/guide/project/templates.md b/docs/docs/guide/project/templates.md new file mode 100644 index 00000000000..4d4f20ffd48 --- /dev/null +++ b/docs/docs/guide/project/templates.md @@ -0,0 +1,67 @@ +--- +title: Templates +description: Learn how to create and use templates in Tuist to generate code in your projects. +--- + +# Templates + +In projects with an established architecture, developers might want to bootstrap new components or features that are consistent with the project. With `tuist scaffold` you generate files, you can generate files from a template. You can define your own templates or use the ones that are vendored with Tuist. These are some scenarios where scaffolding might be useful: + +- Create a new feature that follows a given architecture: `tuist scaffold viper --name MyFeature`. +- Create new projects: `tuist scaffold feature-project --name Home` + +> [!NOTE] NON-OPINIONATED +> Tuist is not opinionated about the content of your templates, and what you use them for. They are only required to be in a specific directory. + +## Defining a template + +To define templates, you can run [`tuist edit`](/guide/project/editing) and then create a directory called `name_of_template` under `Tuist/Templates` that represents your template. Templates need a manifest file, `name_of_template.swift` that describes the template. So if you are creating a template called `framework`, you should create a new directory `framework` at `Tuist/Templates` with a manifest file called `framework.swift` that could look like this: + + +```swift +import ProjectDescription + +let nameAttribute: Template.Attribute = .required("name") + +let template = Template( + description: "Custom template", + attributes: [ + nameAttribute, + .optional("platform", default: "ios"), + ], + items: [ + .string( + path: "Project.swift", + contents: "My template contents of name \(nameAttribute)" + ), + .file( + path: "generated/Up.swift", + templatePath: "generate.stencil" + ), + .directory( + path: "destinationFolder", + sourcePath: "sourceFolder" + ), + ] +) +``` + +## Using a template + +After defining the template, we can use it from the `scaffold` command: + +```bash +tuist scaffold name_of_template --name Name --platform macos +``` + +> [!NOTE] +> Since platform is an optional argument, we can also call the command without the `--platform macos` argument. + +If `.string` and `.files` don't provide enough flexibility, you can leverage the [Stencil](https://stencil.fuller.li/en/latest/) templating language via the `.file` case. Besides that, you can also use additional filters defined here. + +Using string interpolation, `\(nameAttribute)` above would resolve to `{{ name }}`. If you'd like to use Stencil filters in the template definition, you can use that interpolation manually and add any filters you like. For example, you might use `{ { name | lowercase } }` instead of `\(nameAttribute)` to get the lowercased value of the name attribute. + +You can also use `.directory` which gives the possibility to copy entire folders to a given path. + +> [!TIP] PROJECT DESCRIPTION HELPERS +> Templates support the use of [project description helpers](/guide/project/code-sharing) to reuse code across templates. \ No newline at end of file diff --git a/docs/docs/guide/scale/ufeatures-architecture.md b/docs/docs/guide/scale/ufeatures-architecture.md new file mode 100644 index 00000000000..96dd42d53e0 --- /dev/null +++ b/docs/docs/guide/scale/ufeatures-architecture.md @@ -0,0 +1,153 @@ +# µFeatures architecture + + +uFeatures is an architectural approach to structure Apple OS applications to enable scalability, optimize build and test cycles, and ensure good practices in your team. Its core idea is to build your apps by building independent features that are interconnected using clear and concise APIs. + +These guidelines introduce the principles of the architecture, helping you identify and organize your application features in different layers. It also introduces tips, tools and advice if you decide to use this architecture. + +> [!INFO] NAME +> The name uFeatures (microfeatures) comes from the [microservices architecture](https://martinfowler.com/articles/microservices.html), where different "backend features" run as different services with defined APIs to enable communication between them. + + +## Context + +Apps are made of features. Typically these features are part of the same module, or target where the whole application is defined. The natural inclination in the team is to continue building features and its tests in the same targets. As a result, the application and its tests target grows in complexity which manifests in bugs, bad compilation times, and team performance. What seemed to be a good architecture, doesn't work out that well in large codebases or teams. + +This is frequently a big source of frustration when it comes to work on those projects. The time we spend goes into compiling rather than building and experimenting with the platform. + +## Motivation + +The µFeatures's main motivation is to support the scalability of large Xcode codebases leveraging platform features and tools. There are other solutions out there that could be also be considered to overcome those issues. A very popular one nowadays is [React Native](https://facebook.github.io/react-native/) that leverages the Javascript dynamism to offer developers a pleasant experience working in the code base, but at the same time a native experience from the user point of view. + +> [!IMPORTANT] NATIVE DEVELOPMENT CAN SCALE +> We believe that the usage of native tools and technologies can be optimized to overcome scalability challenges that sooner or later show up in our projects** + +### Before reading + +- Don't expect this to be a silver-bullet solution to your problems. You should take the core ideas, process them, and apply the principles to your projects. +- Each project is different, and so are the needs. With the ideas in the guidelines, and your needs, you should figure out what might work out for you. +- It can very tempting to scale your app architecture before it actually needs it. If your app needs it, you'll notice it, and only at that point, you should consider start tackling the issue. + +## Core principle + +Developers should be able to **build, test and try** their features fast, with independence of the main app. + +## What is a µFeature + +A µFeature represents an application feature and is a combination of the following five targets (referring with target to a Xcode target): + +- **Source:** Contains the feature source code (Swift, Objective-C, C++, React Native...) and its resources (images, fonts, storyboards, xibs). +- **Interface:** It's a companion target that contains the public interface and models of the feature. +- **Tests:** Contains the feature unit and integration tests. +- **Testing:** Provides testing data that can be used for the tests and from the example app. It also provides mocks for uFeature classes and protocols that can be used by other features as we'll see later. +- **Example:** Contains an example app that developers can use to try out the feature under certain conditions (different languages, screen sizes, settings). + +We recommend following a naming convention for targets, something that you can enforce in your project thanks to Tuist's DSL. + +| Target | Dependencies | Content | +| ---- | ---- | ---- | +| `Feature` | `FeatureInterface` | Source code and resources | +| `FeatureInterface` | - | Public interface and models | +| `FeatureTests` | `Feature`, `FeatureTesting` | Unit and integration tests | +| `FeatureTesting` | `Feature` | Testing data and mocks | +| `FeatureExample` | `FeatureTesting`, `Feature` | Example app | + +> [!IMPORTANT] COMPILER DIRECTIVES INSTEAD OF TESTING TARGETS +> Alternatively, you can use compiler directives to include test data and mocks in the mani feature target when compiling for `Debug`. You simplify the graph, but you'll end up compiling code that you won't need for running the app. + +## Why a µFeature + +### Clear and concise APIs + +When all the app source code lives in the same target is very easy to build implicit dependencies in code, and end up with the so well-known spaghetti code. Everything is strongly coupled, the state is sometimes unpredictable, and introducing new changes become a nightmare. When we define features in independent targets we need to design public APIs as part of our feature implementation. We need to decide what should be public, how our feature should be consumed, what should remain private. We have more control over how we want our feature clients to use the feature and we can enforce good practices by designing safe APIs. + +### Small modules + +[Divide and conquer](https://en.wikipedia.org/wiki/Divide_and_conquer). Working in small modules allows you to have more focus and test and try the feature in isolation. Moreover, development cycles are much faster since we have a more selective compilation, compiling only the components that are necessary to get our feature working. The compilation of the whole app is only necessary at the very end of our work, when we need to integrate the feature into the app. + +### Reusability + +Reusing code across apps and other products like extensions is encouraged using frameworks or libraries. By building µFeatures reusing them is pretty straightforward. We can build an iMessage extension, a Today Extension, or a watchOS application by just combining existing µFeatures and adding _(when necessary)_ platform-specific UI layers. + +## Types of µFeatures + +### Foundation + +Foundation µFeatures contain foundational tools (wrappers, extensions, ...) that are combined to build other µFeatures. Thus other µFeatures have access to the foundation ones. Some examples of foundations µFeatures are: + +- **µUI:** Provides custom views, UIKit extensions, fonts, and colors that are used to build user-facing layouts. +- **µTesting:** Facilitates testing by providing XCTest extensions as well as custom assertions. +- **µNetwork:** It contains utilities and tools to interact with the network. + +In practice, foundation µFeatures expose interfaces (Structs, Classes, Enums) and extensions of platform frameworks such as `XCTest`, `Foundation` or `UIKit`. + +> [!WARNING] STATIC INSTANCES +> Foundation µFeatures shouldn't expose static instances that are globally accessed. As we'll see later, it's up to the app to control the lifecycle of those foundation dependencies, and pass them to other µFeatures using dependency injection. + +> [!TIP] MODULE SIZE AND INCREMENTAL BUILDS AND BINARY CACHING EFFECTIVENESS +> We recommend smaller and more focused foundation µFeatures to achieve the highest performance of incremental builds and [Tuist Cloud binary caching](/cloud/binary-caching) + + + +### Product + +Product µFeatures contain features that the user can feel and interact with. They are built by combining foundation µFeatures. Some examples of product µFeatures are: + +- **µSearch:** Contains your product search feature that allows users searching content on the platform. +- **µPayments:** Contains the business logic to handle payment flows and upsell screens to upgrade users to premium plans. +- **µHome:** Contains the product home screen with the most recent platform content. + +> [!NOTE] PRODUCT DOMAIN +> Product µFeatures usually represent your product's features. + +In practice, product µFeatures expose **views** and **services**. In the following sections we'll see how the app target uses those views and services to build up the app. + +## Dependencies + +When a µFeature depends on another µFeature, it declares a dependency against its interface target. The benefit of this is two-fold. It prevents the implementation of a µFeature to be coupled to the implementation of another µFeature, and it speeds up clean builds because they only have to compile the implementation of our feature, and the interfaces of direct and transitive dependencies. This approach is inspired by SwiftRock's idea of [Reducing iOS Build Times by using Interface Modules](https://swiftrocks.com/reducing-ios-build-times-by-using-interface-targets). + +> [!WARNING] WORK IN PROGRESS +> We are currently exploring how to dependency injection in Tuist's codebase and we'll update this section with the best practices and recommendations. + +## Choosing the target product + +When architecting a modular app, +a question that arises often is **whether targets should be frameworks or libraries**, and whether they should be static or dynamic. +In pre-Tuist era, there were many factor that influenced that decision: + +- Whether the target includes resources or not. +- Whether the target depends on static targets that might lead to duplicated symbols issues upstream. +- The number of dynamic targets that need to be linked at startup time and therefore might increase the time to launch the app. + +Thanks to Tuist, +the decision process has been notably simplified. +Since Tuist supports defining resources in libraries, +we recommend sticking to **static libraries**, +unless you come across scenarios where a dynamic framework is more suitable. + +Bear in mind that Tuist makes changing the product a seamless process as long as you use the standard interface. + +## Frequently asked questions + +### One or multiple Git repositories? + +If you are working with git branches, we recommend you to keep everything in the same repository for convenience reasons. Facebook is a good example of a huge company keeping all the projects in a single repositories and Uber [wrote about it](https://eng.uber.com/ios-monorepo/) a year ago. + +### How do you version µFeatures? + +If µFeatures are part of the same repository, they are versioned with the app. If you have them in different repositories you can use Git Submodules, Carthage, or your own dependency resolver to fetch specific versions of your µFeatures to link from the app. + +### How to add external dependencies? + +This architecture doesn't limit you from using external dependencies. If you want to use an external dependency from a µFeature framework, we recommend you to use the [Swift Package Manager](https://swift.org/package-manager/). + +## Resources + +- [Building µFeatures](https://speakerdeck.com/pepibumur/building-ufeatures) +- [Framework Oriented Programming](https://speakerdeck.com/pepibumur/framework-oriented-programming-mobilization-dot-pl) +- [A Journey into frameworks and Swift](https://speakerdeck.com/pepibumur/a-journey-into-frameworks-and-swift) +- [Leveraging frameworks to speed up our development on iOS - Part 1](https://developers.soundcloud.com/blog/leveraging-frameworks-to-speed-up-our-development-on-ios-part-1) +- [Library Oriented Programming](https://academy.realm.io/posts/justin-spahr-summers-library-oriented-programming/) +- [Building Modern Frameworks](https://developer.apple.com/videos/play/wwdc2014/416/) +- [The Unofficial Guide to xcconfig files](https://pewpewthespells.com/blog/xcconfig_guide.html) +- [Static and Dynamic Libraries](https://pewpewthespells.com/blog/static_and_dynamic_libraries.html) diff --git a/docs/docs/guide/scale/xcode.md b/docs/docs/guide/scale/xcode.md new file mode 100644 index 00000000000..11e9654142b --- /dev/null +++ b/docs/docs/guide/scale/xcode.md @@ -0,0 +1 @@ +# Using Xcode at scale \ No newline at end of file diff --git a/docs/docs/public/favicon.ico b/docs/docs/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c38147e182efb06fd816c49a5d63bb6f3d897b9a GIT binary patch literal 5558 zcmd^DYfx0@8D0!tq9JOcwTaOXZ3NS3M4{;nbrs?Tt5MW~RU5QmRFoBn9aBe>HePD2 zX~tsgw3AVjjzzF)yaqHe-hd%7-V#7jSY#`AR@e*6<;cE$pYNRS>?PD8>Cb*M&%W2^ zeGa?qIp4PiLx7=&AvoB;HrNn4&|ny4Fc=05P~(+>2E%O5g>sHt43in?6N`Huw)Pkz zgE9@1Oqqs>IR^qJn%O!S%7FkQv8Bua23rwpzR0o9{hpeqSHTSK$E+NN2^w8pL$)C* zGP}nlOZFp^h%Fst3wXye4=eLNIj{Uf_!ek+U&Gkww8|fovL!Z z_?VA*LPO4G?UQ|`<(ztS8l8G{Dq|X*)U5PR51C8l?;WJ}#%Aj7LN7SELt@2DIqOtk z=y)`sozr)^Ij7%rVk?l#er~@Q%6%+`ic>SFy`lTM{?`X?(V7f89Tej;UuX%P>E<(! z&2XFvnn9m3U^%AG2F<3rUr9!?AXh{vJSvYtu0bgiV#@EKLq|R1V51(au$}W9o2fw#f8AtROen)+i z9+#VTk^KBSU2SyZ*;PGPVoawhz9zYpeQGAvJG29Z$gZr&J5S<;rbA zdti4_N!SYdI(RYReZ*=lspQ@`s{Z{yM2wfJ-+d(btv4%04!vJLyGU>`1IxkJ;?auJ z{i312q;G~UprU6~Td{Df=*LS9|6Qn6c)cI>?;jPtRs6k_3qJU$$z_h;B)FI%S4G@r zA1%x-8Mcsa4&!TO3)~4`MV$^8b@2E0*2pDXTSyJNJaa4Oza#o;-uyt0CHUap<(gcL z%)#7SBNN0d%)HIBr55IbQ#yPRl|H*z;5O{=#Zzjn=To$urxEO2~gkI-g9OPdR=3eKxoLT25UxdgI=r|3G38}{ivb*nP; zJp76gDjz*^S;ANAd8y;CVfoQgdKl^xJkNugnHxoK<;bPfuzaVK5x$&(9=X7kd2b6o z;!6Jiy7&CAsp|PeVTC^`k*XLn-@GkLjC1q<&%F>&tugV>Qid86-}CT8lL)<7wr$z! z9BrPQug+#&&ewz_DYYR3oD2%SzlPLLi*AoFMZA0;{TxQ+v2x*>Rt4Txqf^# zx7^%3CON11#bj!FaV0ftkiN9Y`}>ahTXcQL{H@=rcg69a4{gWT)obiylF2c4m4LU8 zoL$Syy0p&Oe6Pd4i~(QfyURzP?WJT>Lr7wfD=fw08ka&XFRdomxYfd{zRaoCCntJ6 z_3y#AP{=xQ7F5QiM7D*Q6b7}0r7&Pk)ULrhmU)@`cHAw#!q@9_22{e+A|FghwI~x( zNg2OJh4f)1Q1kb-9P`!ML--xzO%`b3?B~BIa$OKjNHe)3(sSJ5>1Ov&(jD&bG{qf} zMr>6?q*JGt&%FfbInM_a9mVD5|D1IBs>S099iC%Cp>u_MS@kr0;7W|d~u+NYdezczVtG9rA zvd@&f6MQy4(PyeSBY!?-DV6X17uky{v~#$N?8Ox#hZ_1$@R=Lu>63k?=AG^r<79}l zpZVP^a(5{D{mb7$&AcOv&OAPYzybGM|54cYm;3cyDWXQigomzl%;;4rT7o*Db*vbas+a?Oc5NNKcD&ASK5 ze&Gh$&)*O}a;Rb5ne&#$i>G4V-vZVTPm_)JSmnH*$1-z|gU<$lIreRlE00+(daV0$ zshIbe;N9VU7f|t26P5Emv~K-g>U6eJ8Sg=yxtGbofR9`~*US;TcY4_*IM^%R%_CY?NA=I9=arI$XS23R`_`CYyD2!*yKF% z%)xU9;Ag6^>~|bEFCb&tCoT8pwT7)WwvJ0_VNfeS7h3r_0UysDZ!2nEdBI^WzJnBz gYUF!#9^WgSY~8qLO5olNU$dy8Cr@Dxxc}?=5B$bo>i_@% literal 0 HcmV?d00001 diff --git a/docs/docs/public/logo.png b/docs/docs/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ac11cda918f195320e2d7b0060ee03ef4bfee9de GIT binary patch literal 1107120 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

    Vnz+ML-@2MZ*<}K?0=cjG1m}*ad%wE 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%0AMMm-ERA}dq;bVVnEt=YB`CMVNKf{ z%4{3^`ppNY)vU+QSsY~}C+-~JhYinPH2i3itc%1e} zrFJ?UpMx-!<7s09b1&EjH;P+uOaw~C=@EuW`=*=PHwomPyY$v^FtaGNGPn@eg1(r| zRUdy77&4Bz99hb-P)fM7HuT$FoWShA5Y06(VnxvFLOizrG5#!MJRD{h9e&00EdML> zDL?_Vw{)>?b<>8$Tj|mP=~_VKjg!_`Ae6)0(*JQQA{A5qxEamtn4VfOyq9!AcabC@ z<|wX;`TGpF`n4#~B)tmuk>~dp#%$9Mqoa>fzT0IV_Q*bGpXp(>q?}v2s7LP1SNl|D z&J%pV<>vI)-T~Tm=@Zp`=dB5*7``Db%Z~qGawdwlo> zwNDm-MvcPT`*CE!{ZKfT@h#^$Na#b5*<59IqCmmCBZJndS*_e%i#5oRi&O9&MIpQo zM<-K-=kB3!v&@MTeA6r(TSxw{k-SZ=?)vw2KqpPulz8TRm^{4BmCjVCcHhubZ?76N z_nt4-Fz$t{L9reuCWBidr_z5%b#Lc%zl9VZynOv&GYDPT<>3w4ef0sVa%}9Bnvw4hH1oF#B$usEv>A&s#$gB<#We`<~9TZkBe9{?D>)1NDhmn~luQICnM=wW3RL_nLl;2XA(T zZnf*LJZgiJF1v$@x17pC3isd2egl+1O!L#ZS3bf2ll31+g`O4!rnm!ZMkn8d+17O* zMYD~{e+KWaE97lLTigYw zP#IvPL`*zD1z!Gs(p0kPKv=1SqDk6c9H?KL^iB2EI>mMd^)Ibs9#$IeP48sVuFYN# za92PV{?p+MJ-b63Rgf%;?n$MUcRl&ljF)k+%CYy zD#gYc^2eqH>Bi+WpvCct80R0fYJj_9K6mc55O(pkioNxpsb4EZtZ^!gZ@40s@TI%i zbaqh9+RwE=Qtc|44rQsV5=u!WYgN}Ij8k98bG|ShjnPPGSf092$Aw6>tmUG9q#v6h zrKx7Rh+uwHK0#0Pu56um>nn!*e6KYaouCIlh*EX0JK!vnzo)w!NsV0|2b#on3MWLQ zTp>9@`UQEzMZKSDCa6txZjok^#y7^@Z7x2VuhBCC?nHXM6I?}z2KU`c-HTrNhBsjw zw2^>1w&}&*wdn@0r6MSvJ3GdKo`#;cx+P`!kJwK?41Rv&&J@6^c>t9l3EO*6oIy7k|#4ArM6UGf+xy%;4u`LHb(nq(n*8ekKYh?BS8- zKl*~&hnv!16J`0sUUM8 zi=y&9X9~4_EJpkZwP(^kx|FpjOz=pJKJ*52E)JWlmvEd_I*J;3kFEL28a242>m!CX zw=A8$2&hdC8+x~X2>qp|%CBK#@AS<*&|Y;2_)d`5QGfS+;=j$m^Uf_<5#^ELAot<- z#esLEWNq^m7g!Sw)fQ)v*%{Ydy(l6lIzU>B$$g$-LzV}mphf=%n!KpNhdbsbP-L;irPEiU8c5iNX?=rT?8^X zzpV6bmA^7ODgQEq*j^`Zu3BYAvJL%JAFk}?FSqCPNsNLmTP29#^syY<0^Y}4C4 zqaA6!4u}v(=wDY=Es>~i7pt_Of|OWIwVIaxXD?0%{QsL2LrerZM)Bf;oBW*`K^|1} z%0D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

    dPBkI)6hj3MZ2QtR?3bowIn5mNU2Wvh$K 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Ćs)5By-m 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

    yshg=ZIH5?%n|QpE+?C|+IebUdUB~_u7Kaj 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

    M5fbQw_oSChwL7(`}+l^eTrg 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

    Wg%P}f^tnqZ0slJ^u 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 vTR#uM-kry5yF)gQKo8V~!qjRVwpTCShk~Nsw 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 z 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 \ No newline at end of file diff --git a/docs/docs/reference/cli/[command].paths.js b/docs/docs/reference/cli/[command].paths.js new file mode 100644 index 00000000000..8720154c4ea --- /dev/null +++ b/docs/docs/reference/cli/[command].paths.js @@ -0,0 +1,12 @@ +import cliDataLoader from "./commands.data"; + +export default { + paths() { + return cliDataLoader.load().map((item) => { + return { + params: { command: item.command, title: item.title, description: item.description }, + content: item.content + } + }) + }, +}; diff --git a/docs/docs/reference/cli/commands.data.js b/docs/docs/reference/cli/commands.data.js new file mode 100644 index 00000000000..d8990077cb3 --- /dev/null +++ b/docs/docs/reference/cli/commands.data.js @@ -0,0 +1,12 @@ +export default { + load() { + return [ + { + title: "Generate", + command: "generate", + description: "Turn your Tuist projects itno Xcode projects", + content: "# Generate\nThis is just a test" + } + ]; + }, +}; diff --git a/docs/docs/reference/examples/[example].md b/docs/docs/reference/examples/[example].md new file mode 100644 index 00000000000..f782f730688 --- /dev/null +++ b/docs/docs/reference/examples/[example].md @@ -0,0 +1,16 @@ +--- +editLink: false +description: {{ $params.description }} +--- + + + + + +Check out example diff --git a/docs/docs/reference/examples/[example].paths.js b/docs/docs/reference/examples/[example].paths.js new file mode 100644 index 00000000000..fe4e54d645f --- /dev/null +++ b/docs/docs/reference/examples/[example].paths.js @@ -0,0 +1,17 @@ +import examplesDataLoader from "./examples.data"; + +export default { + paths() { + return examplesDataLoader.load().map((item) => { + return { + params: { + example: item.name, + title: item.title, + description: item.description, + url: item.url, + }, + content: item.content, + }; + }); + }, +}; diff --git a/docs/docs/reference/examples/examples.data.js b/docs/docs/reference/examples/examples.data.js new file mode 100644 index 00000000000..0d528f96d70 --- /dev/null +++ b/docs/docs/reference/examples/examples.data.js @@ -0,0 +1,32 @@ +import * as path from "node:path"; +import fg from "fast-glob"; +import fs from "node:fs"; + +const glob = path.join(import.meta.dirname, "../../../../fixtures/*/README.md"); + +export default { + watch: [glob], + load(files) { + if (!files) { + files = fg + .sync(glob, { + absolute: true, + }) + .sort(); + } + return files.map((file) => { + const content = fs.readFileSync(file, "utf-8"); + const titleRegex = /^#\s*(.+)/m; + const titleMatch = content.match(titleRegex); + return { + title: titleMatch[1], + name: path.basename(path.dirname(file)).toLowerCase(), + description: "foo", + content: content, + url: `https://github.com/tuist/tuist/tree/main/fixtures/${path.basename( + path.dirname(file) + )}`, + }; + }); + }, +}; diff --git a/docs/docs/reference/project-description/[type].md b/docs/docs/reference/project-description/[type].md new file mode 100644 index 00000000000..9635e3ce98e --- /dev/null +++ b/docs/docs/reference/project-description/[type].md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/docs/reference/project-description/[type].paths.js b/docs/docs/reference/project-description/[type].paths.js new file mode 100644 index 00000000000..839cc9fd69e --- /dev/null +++ b/docs/docs/reference/project-description/[type].paths.js @@ -0,0 +1,12 @@ +import typesDataLoader from "./types.data"; + +export default { + paths() { + return typesDataLoader.load().map((item) => { + return { + params: { type: item.name, title: item.title, description: item.description }, + content: item.content + } + }) + }, +}; diff --git a/docs/docs/reference/project-description/types.data.js b/docs/docs/reference/project-description/types.data.js new file mode 100644 index 00000000000..8332ded18be --- /dev/null +++ b/docs/docs/reference/project-description/types.data.js @@ -0,0 +1,28 @@ +import * as path from "node:path"; +import fg from "fast-glob"; +import fs from "node:fs"; + +export default { + load() { + const generatedDirectory = path.join( + import.meta.dirname, + "../../../docs/generated" + ); + const files = fg + .sync("**/*.md", { + cwd: generatedDirectory, + absolute: true, + ignore: ["**/README.md"], + }) + .sort(); + return files.map((file) => { + return { + category: path.basename(path.dirname(file)), + title: path.basename(file).replace(".md", ""), + name: path.basename(file).replace(".md", "").toLowerCase(), + description: "", + content: fs.readFileSync(file, "utf-8"), + }; + }); + }, +}; diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 00000000000..5a8580a0e69 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,20 @@ +{ + "name": "@tuist/docs", + "private": true, + "description": "Tuist's documentation website", + "license": "MIT", + "devDependencies": { + "execa": "^8.0.1", + "fast-glob": "^3.3.2", + "vitepress": "^1.0.1" + }, + "scripts": { + "dev": "vitepress dev", + "build": "vitepress build", + "preview": "vitepress preview", + "deploy": "vitepress build && wrangler pages deploy .vitepress/dist --project-name tuist-docs-next --branch main" + }, + "dependencies": { + "wrangler": "^3.37.0" + } +} \ No newline at end of file diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml new file mode 100644 index 00000000000..ebe055fb23e --- /dev/null +++ b/docs/pnpm-lock.yaml @@ -0,0 +1,2003 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + wrangler: + specifier: ^3.37.0 + version: 3.43.0 + +devDependencies: + execa: + specifier: ^8.0.1 + version: 8.0.1 + fast-glob: + specifier: ^3.3.2 + version: 3.3.2 + vitepress: + specifier: ^1.0.1 + version: 1.0.2(@algolia/client-search@4.23.2)(search-insights@2.13.0) + +packages: + + /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)(search-insights@2.13.0): + resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)(search-insights@2.13.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + dev: true + + /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)(search-insights@2.13.0): + resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} + peerDependencies: + search-insights: '>= 1 < 3' + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2) + search-insights: 2.13.0 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + dev: true + + /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2): + resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2) + '@algolia/client-search': 4.23.2 + algoliasearch: 4.23.2 + dev: true + + /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2): + resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + dependencies: + '@algolia/client-search': 4.23.2 + algoliasearch: 4.23.2 + dev: true + + /@algolia/cache-browser-local-storage@4.23.2: + resolution: {integrity: sha512-PvRQdCmtiU22dw9ZcTJkrVKgNBVAxKgD0/cfiqyxhA5+PHzA2WDt6jOmZ9QASkeM2BpyzClJb/Wr1yt2/t78Kw==} + dependencies: + '@algolia/cache-common': 4.23.2 + dev: true + + /@algolia/cache-common@4.23.2: + resolution: {integrity: sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw==} + dev: true + + /@algolia/cache-in-memory@4.23.2: + resolution: {integrity: sha512-rfbi/SnhEa3MmlqQvgYz/9NNJ156NkU6xFxjbxBtLWnHbpj+qnlMoKd+amoiacHRITpajg6zYbLM9dnaD3Bczw==} + dependencies: + '@algolia/cache-common': 4.23.2 + dev: true + + /@algolia/client-account@4.23.2: + resolution: {integrity: sha512-VbrOCLIN/5I7iIdskSoSw3uOUPF516k4SjDD4Qz3BFwa3of7D9A0lzBMAvQEJJEPHWdVraBJlGgdJq/ttmquJQ==} + dependencies: + '@algolia/client-common': 4.23.2 + '@algolia/client-search': 4.23.2 + '@algolia/transporter': 4.23.2 + dev: true + + /@algolia/client-analytics@4.23.2: + resolution: {integrity: sha512-lLj7irsAztGhMoEx/SwKd1cwLY6Daf1Q5f2AOsZacpppSvuFvuBrmkzT7pap1OD/OePjLKxicJS8wNA0+zKtuw==} + dependencies: + '@algolia/client-common': 4.23.2 + '@algolia/client-search': 4.23.2 + '@algolia/requester-common': 4.23.2 + '@algolia/transporter': 4.23.2 + dev: true + + /@algolia/client-common@4.23.2: + resolution: {integrity: sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g==} + dependencies: + '@algolia/requester-common': 4.23.2 + '@algolia/transporter': 4.23.2 + dev: true + + /@algolia/client-personalization@4.23.2: + resolution: {integrity: sha512-vwPsgnCGhUcHhhQG5IM27z8q7dWrN9itjdvgA6uKf2e9r7vB+WXt4OocK0CeoYQt3OGEAExryzsB8DWqdMK5wg==} + dependencies: + '@algolia/client-common': 4.23.2 + '@algolia/requester-common': 4.23.2 + '@algolia/transporter': 4.23.2 + dev: true + + /@algolia/client-search@4.23.2: + resolution: {integrity: sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw==} + dependencies: + '@algolia/client-common': 4.23.2 + '@algolia/requester-common': 4.23.2 + '@algolia/transporter': 4.23.2 + dev: true + + /@algolia/logger-common@4.23.2: + resolution: {integrity: sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw==} + dev: true + + /@algolia/logger-console@4.23.2: + resolution: {integrity: sha512-oo+lnxxEmlhTBTFZ3fGz1O8PJ+G+8FiAoMY2Qo3Q4w23xocQev6KqDTA1JQAGPDxAewNA2VBwWOsVXeXFjrI/Q==} + dependencies: + '@algolia/logger-common': 4.23.2 + dev: true + + /@algolia/recommend@4.23.2: + resolution: {integrity: sha512-Q75CjnzRCDzgIlgWfPnkLtrfF4t82JCirhalXkSSwe/c1GH5pWh4xUyDOR3KTMo+YxxX3zTlrL/FjHmUJEWEcg==} + dependencies: + '@algolia/cache-browser-local-storage': 4.23.2 + '@algolia/cache-common': 4.23.2 + '@algolia/cache-in-memory': 4.23.2 + '@algolia/client-common': 4.23.2 + '@algolia/client-search': 4.23.2 + '@algolia/logger-common': 4.23.2 + '@algolia/logger-console': 4.23.2 + '@algolia/requester-browser-xhr': 4.23.2 + '@algolia/requester-common': 4.23.2 + '@algolia/requester-node-http': 4.23.2 + '@algolia/transporter': 4.23.2 + dev: true + + /@algolia/requester-browser-xhr@4.23.2: + resolution: {integrity: sha512-TO9wLlp8+rvW9LnIfyHsu8mNAMYrqNdQ0oLF6eTWFxXfxG3k8F/Bh7nFYGk2rFAYty4Fw4XUtrv/YjeNDtM5og==} + dependencies: + '@algolia/requester-common': 4.23.2 + dev: true + + /@algolia/requester-common@4.23.2: + resolution: {integrity: sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q==} + dev: true + + /@algolia/requester-node-http@4.23.2: + resolution: {integrity: sha512-SVzgkZM/malo+2SB0NWDXpnT7nO5IZwuDTaaH6SjLeOHcya1o56LSWXk+3F3rNLz2GVH+I/rpYKiqmHhSOjerw==} + dependencies: + '@algolia/requester-common': 4.23.2 + dev: true + + /@algolia/transporter@4.23.2: + resolution: {integrity: sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q==} + dependencies: + '@algolia/cache-common': 4.23.2 + '@algolia/logger-common': 4.23.2 + '@algolia/requester-common': 4.23.2 + dev: true + + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.24.1: + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@cloudflare/kv-asset-handler@0.3.1: + resolution: {integrity: sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA==} + dependencies: + mime: 3.0.0 + dev: false + + /@cloudflare/workerd-darwin-64@1.20240329.0: + resolution: {integrity: sha512-/raHmsHrYjoC5am84wqyiZIDCRrrYN6YDFb4zchwWQzJ0ZHleUeY6IzNdjujrS/gYey/+Db9oyl2PD1xAZt4gA==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@cloudflare/workerd-darwin-arm64@1.20240329.0: + resolution: {integrity: sha512-3wnwVdfFDt+JUhlA6NWW+093ryGNF0HMuBmkOh0PG6j4GMRH8Y+EDsqzqrzT3ZoGGXbI9x1H7k15VKb3LAN/KA==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@cloudflare/workerd-linux-64@1.20240329.0: + resolution: {integrity: sha512-E909ZIXgjdr2iuq5bF/vq02elizDlPQoYRiKojdvODC7w8rbnpwnuptajS4xK5kmKh4XBiU2o9NDhut/W1kfyw==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@cloudflare/workerd-linux-arm64@1.20240329.0: + resolution: {integrity: sha512-PELA3FVW75pKchsSI5o40oiClFY2Uiq+KUx/f/srwz2pIJoM5YWLmFrv+s8feKoEwuabxIGSzHxy7QA++HyprQ==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@cloudflare/workerd-windows-64@1.20240329.0: + resolution: {integrity: sha512-/T+AcjVqTuqAeGBQmjAF4TOTm8sv3BSO/NtUPa1ghCvsp1sb03L6/c3wFc9ZonSdRYeBb0XDX7PnenGCvjr/Tw==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: false + + /@docsearch/css@3.6.0: + resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} + dev: true + + /@docsearch/js@3.6.0(@algolia/client-search@4.23.2)(search-insights@2.13.0): + resolution: {integrity: sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==} + dependencies: + '@docsearch/react': 3.6.0(@algolia/client-search@4.23.2)(search-insights@2.13.0) + preact: 10.20.1 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + - search-insights + dev: true + + /@docsearch/react@3.6.0(@algolia/client-search@4.23.2)(search-insights@2.13.0): + resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + dependencies: + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)(search-insights@2.13.0) + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2) + '@docsearch/css': 3.6.0 + algoliasearch: 4.23.2 + search-insights: 2.13.0 + transitivePeerDependencies: + - '@algolia/client-search' + dev: true + + /@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19): + resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} + peerDependencies: + esbuild: '*' + dependencies: + esbuild: 0.17.19 + dev: false + + /@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.17.19): + resolution: {integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==} + peerDependencies: + esbuild: '*' + dependencies: + esbuild: 0.17.19 + escape-string-regexp: 4.0.0 + rollup-plugin-node-polyfills: 0.2.1 + dev: false + + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@fastify/busboy@2.1.1: + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + dev: false + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + dev: true + + /@rollup/rollup-android-arm-eabi@4.13.2: + resolution: {integrity: sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.13.2: + resolution: {integrity: sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.13.2: + resolution: {integrity: sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.13.2: + resolution: {integrity: sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.13.2: + resolution: {integrity: sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.13.2: + resolution: {integrity: sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.13.2: + resolution: {integrity: sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.13.2: + resolution: {integrity: sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==} + cpu: [ppc64le] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.13.2: + resolution: {integrity: sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.13.2: + resolution: {integrity: sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.13.2: + resolution: {integrity: sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.13.2: + resolution: {integrity: sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.13.2: + resolution: {integrity: sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.13.2: + resolution: {integrity: sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.13.2: + resolution: {integrity: sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@shikijs/core@1.2.3: + resolution: {integrity: sha512-SM+aiQVaEK2P53dEcsvhq9+LJPr0rzwezHbMQhHaSrPN4OlOB4vp1qTdhVEKfMg6atdq8s9ZotWW/CSCzWftwg==} + dev: true + + /@shikijs/transformers@1.2.3: + resolution: {integrity: sha512-7m63LXtBW9feqH4+dafLe92oXm/vs05e6qaN1w5/Byozaf+RCqzOj3/b2/wu7OzTgLe3O9PzIrO3FebkGJK26g==} + dependencies: + shiki: 1.2.3 + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + + /@types/linkify-it@3.0.5: + resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} + dev: true + + /@types/markdown-it@13.0.7: + resolution: {integrity: sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==} + dependencies: + '@types/linkify-it': 3.0.5 + '@types/mdurl': 1.0.5 + dev: true + + /@types/mdurl@1.0.5: + resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} + dev: true + + /@types/node-forge@1.3.11: + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + dependencies: + '@types/node': 20.12.2 + dev: false + + /@types/node@20.12.2: + resolution: {integrity: sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==} + dependencies: + undici-types: 5.26.5 + dev: false + + /@types/web-bluetooth@0.0.20: + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + dev: true + + /@vitejs/plugin-vue@5.0.4(vite@5.2.7)(vue@3.4.21): + resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 + vue: ^3.2.25 + dependencies: + vite: 5.2.7 + vue: 3.4.21 + dev: true + + /@vue/compiler-core@3.4.21: + resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} + dependencies: + '@babel/parser': 7.24.1 + '@vue/shared': 3.4.21 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + dev: true + + /@vue/compiler-dom@3.4.21: + resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==} + dependencies: + '@vue/compiler-core': 3.4.21 + '@vue/shared': 3.4.21 + dev: true + + /@vue/compiler-sfc@3.4.21: + resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} + dependencies: + '@babel/parser': 7.24.1 + '@vue/compiler-core': 3.4.21 + '@vue/compiler-dom': 3.4.21 + '@vue/compiler-ssr': 3.4.21 + '@vue/shared': 3.4.21 + estree-walker: 2.0.2 + magic-string: 0.30.8 + postcss: 8.4.38 + source-map-js: 1.2.0 + dev: true + + /@vue/compiler-ssr@3.4.21: + resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==} + dependencies: + '@vue/compiler-dom': 3.4.21 + '@vue/shared': 3.4.21 + dev: true + + /@vue/devtools-api@7.0.25(vue@3.4.21): + resolution: {integrity: sha512-fL6DlRp4MSXCLYcqYvKU7QhQZWE3Hfu7X8pC25BS74coJi7uJeSWs4tmrITcwFihNmC9S5GPiffkMdckkeWjzg==} + dependencies: + '@vue/devtools-kit': 7.0.25(vue@3.4.21) + transitivePeerDependencies: + - vue + dev: true + + /@vue/devtools-kit@7.0.25(vue@3.4.21): + resolution: {integrity: sha512-wbLkSnOTsKHPb1mB9koFHUoSAF8Dp6Ii/ocR2+DeXFY4oKqIjCeJb/4Lihk4rgqEhCy1WwxLfTgNDo83VvDYkQ==} + peerDependencies: + vue: ^3.0.0 + dependencies: + '@vue/devtools-shared': 7.0.25 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + vue: 3.4.21 + dev: true + + /@vue/devtools-shared@7.0.25: + resolution: {integrity: sha512-5+XYhcHSXuJSguYnNwL6/e6VTmXwCfryWQOkffh9ZU2zMByybqqqBrMWqvBkqTmMFCjPdzulo66xXbVbwLaElQ==} + dependencies: + rfdc: 1.3.1 + dev: true + + /@vue/reactivity@3.4.21: + resolution: {integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==} + dependencies: + '@vue/shared': 3.4.21 + dev: true + + /@vue/runtime-core@3.4.21: + resolution: {integrity: sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==} + dependencies: + '@vue/reactivity': 3.4.21 + '@vue/shared': 3.4.21 + dev: true + + /@vue/runtime-dom@3.4.21: + resolution: {integrity: sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==} + dependencies: + '@vue/runtime-core': 3.4.21 + '@vue/shared': 3.4.21 + csstype: 3.1.3 + dev: true + + /@vue/server-renderer@3.4.21(vue@3.4.21): + resolution: {integrity: sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==} + peerDependencies: + vue: 3.4.21 + dependencies: + '@vue/compiler-ssr': 3.4.21 + '@vue/shared': 3.4.21 + vue: 3.4.21 + dev: true + + /@vue/shared@3.4.21: + resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} + dev: true + + /@vueuse/core@10.9.0(vue@3.4.21): + resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==} + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.9.0 + '@vueuse/shared': 10.9.0(vue@3.4.21) + vue-demi: 0.14.7(vue@3.4.21) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: true + + /@vueuse/integrations@10.9.0(focus-trap@7.5.4)(vue@3.4.21): + resolution: {integrity: sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==} + peerDependencies: + async-validator: '*' + axios: '*' + change-case: '*' + drauu: '*' + focus-trap: '*' + fuse.js: '*' + idb-keyval: '*' + jwt-decode: '*' + nprogress: '*' + qrcode: '*' + sortablejs: '*' + universal-cookie: '*' + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + dependencies: + '@vueuse/core': 10.9.0(vue@3.4.21) + '@vueuse/shared': 10.9.0(vue@3.4.21) + focus-trap: 7.5.4 + vue-demi: 0.14.7(vue@3.4.21) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: true + + /@vueuse/metadata@10.9.0: + resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==} + dev: true + + /@vueuse/shared@10.9.0(vue@3.4.21): + resolution: {integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==} + dependencies: + vue-demi: 0.14.7(vue@3.4.21) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: true + + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /algoliasearch@4.23.2: + resolution: {integrity: sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ==} + dependencies: + '@algolia/cache-browser-local-storage': 4.23.2 + '@algolia/cache-common': 4.23.2 + '@algolia/cache-in-memory': 4.23.2 + '@algolia/client-account': 4.23.2 + '@algolia/client-analytics': 4.23.2 + '@algolia/client-common': 4.23.2 + '@algolia/client-personalization': 4.23.2 + '@algolia/client-search': 4.23.2 + '@algolia/logger-common': 4.23.2 + '@algolia/logger-console': 4.23.2 + '@algolia/recommend': 4.23.2 + '@algolia/requester-browser-xhr': 4.23.2 + '@algolia/requester-common': 4.23.2 + '@algolia/requester-node-http': 4.23.2 + '@algolia/transporter': 4.23.2 + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + dependencies: + printable-characters: 1.0.42 + dev: false + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: false + + /blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + dev: false + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /capnp-ts@0.7.0: + resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} + dependencies: + debug: 4.3.4 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: false + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: true + + /data-uri-to-buffer@2.0.2: + resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + dev: false + + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: false + + /estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + dev: false + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + + /exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + dev: false + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /focus-trap@7.5.4: + resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} + dependencies: + tabbable: 6.2.0 + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false + + /get-source@2.0.12: + resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} + dependencies: + data-uri-to-buffer: 2.0.2 + source-map: 0.6.1 + dev: false + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: false + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: false + + /hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + dev: false + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.2 + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: false + + /magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: false + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /miniflare@3.20240329.0: + resolution: {integrity: sha512-kdHlMwhV241kck5oh8uyKPIhCusP1BL4+iOSeJZgcJ46EATA6crWtYqlARNU9t/iYXhzKhXOlOPJjjlCJuOgTA==} + engines: {node: '>=16.13'} + hasBin: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.11.3 + acorn-walk: 8.3.2 + capnp-ts: 0.7.0 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + stoppable: 1.1.0 + undici: 5.28.4 + workerd: 1.20240329.0 + ws: 8.16.0 + youch: 3.3.3 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /minisearch@6.3.0: + resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} + dev: true + + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: false + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false + + /perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + dev: true + + /preact@10.20.1: + resolution: {integrity: sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==} + dev: true + + /printable-characters@1.0.42: + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + dev: false + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + dev: true + + /rollup-plugin-inject@3.0.2: + resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. + dependencies: + estree-walker: 0.6.1 + magic-string: 0.25.9 + rollup-pluginutils: 2.8.2 + dev: false + + /rollup-plugin-node-polyfills@0.2.1: + resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} + dependencies: + rollup-plugin-inject: 3.0.2 + dev: false + + /rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + dependencies: + estree-walker: 0.6.1 + dev: false + + /rollup@4.13.2: + resolution: {integrity: sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.13.2 + '@rollup/rollup-android-arm64': 4.13.2 + '@rollup/rollup-darwin-arm64': 4.13.2 + '@rollup/rollup-darwin-x64': 4.13.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.13.2 + '@rollup/rollup-linux-arm64-gnu': 4.13.2 + '@rollup/rollup-linux-arm64-musl': 4.13.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.13.2 + '@rollup/rollup-linux-riscv64-gnu': 4.13.2 + '@rollup/rollup-linux-s390x-gnu': 4.13.2 + '@rollup/rollup-linux-x64-gnu': 4.13.2 + '@rollup/rollup-linux-x64-musl': 4.13.2 + '@rollup/rollup-win32-arm64-msvc': 4.13.2 + '@rollup/rollup-win32-ia32-msvc': 4.13.2 + '@rollup/rollup-win32-x64-msvc': 4.13.2 + fsevents: 2.3.3 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /search-insights@2.13.0: + resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} + dev: true + + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shiki@1.2.3: + resolution: {integrity: sha512-+v7lO5cJMeV2N2ySK4l+51YX3wTh5I49SLjAOs1ch1DbUfeEytU1Ac9KaZPoZJCVBGycDZ09OBQN5nbcPFc5FQ==} + dependencies: + '@shikijs/core': 1.2.3 + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: false + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: false + + /speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + dev: true + + /stacktracey@2.1.8: + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + dev: false + + /stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + dev: false + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + + /tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: false + + /undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.1 + dev: false + + /vite@5.2.7: + resolution: {integrity: sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.13.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitepress@1.0.2(@algolia/client-search@4.23.2)(search-insights@2.13.0): + resolution: {integrity: sha512-bEj9yTEdWyewJFOhEREZF+mXuAgOq27etuJZT6DZSp+J3XpQstXMJc5piSVwhZBtuj8OfA0iXy+jdP1c71KMYQ==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + postcss: + optional: true + dependencies: + '@docsearch/css': 3.6.0 + '@docsearch/js': 3.6.0(@algolia/client-search@4.23.2)(search-insights@2.13.0) + '@shikijs/core': 1.2.3 + '@shikijs/transformers': 1.2.3 + '@types/markdown-it': 13.0.7 + '@vitejs/plugin-vue': 5.0.4(vite@5.2.7)(vue@3.4.21) + '@vue/devtools-api': 7.0.25(vue@3.4.21) + '@vueuse/core': 10.9.0(vue@3.4.21) + '@vueuse/integrations': 10.9.0(focus-trap@7.5.4)(vue@3.4.21) + focus-trap: 7.5.4 + mark.js: 8.11.1 + minisearch: 6.3.0 + shiki: 1.2.3 + vite: 5.2.7 + vue: 3.4.21 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode + - less + - lightningcss + - nprogress + - qrcode + - react + - react-dom + - sass + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - typescript + - universal-cookie + dev: true + + /vue-demi@0.14.7(vue@3.4.21): + resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.4.21 + dev: true + + /vue@3.4.21: + resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@vue/compiler-dom': 3.4.21 + '@vue/compiler-sfc': 3.4.21 + '@vue/runtime-dom': 3.4.21 + '@vue/server-renderer': 3.4.21(vue@3.4.21) + '@vue/shared': 3.4.21 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /workerd@1.20240329.0: + resolution: {integrity: sha512-6wWuMOwWsp3K6447XsI/MZYFq0KlpV2zVbbNFEkv3N7UgJJKaHGwL/hilr6RlS4UFLU4co8nrF2lc5uR781HKg==} + engines: {node: '>=16'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20240329.0 + '@cloudflare/workerd-darwin-arm64': 1.20240329.0 + '@cloudflare/workerd-linux-64': 1.20240329.0 + '@cloudflare/workerd-linux-arm64': 1.20240329.0 + '@cloudflare/workerd-windows-64': 1.20240329.0 + dev: false + + /wrangler@3.43.0: + resolution: {integrity: sha512-v+uJmSVmxdv3aVRQsJLPHXgI5nhOBvJaZ5yUcSO8rJ+m5X2l9HzFQzFlUi1GtYIOejFSr8kcCuLm3YY6JbQruQ==} + engines: {node: '>=16.17.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20240320.1 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + dependencies: + '@cloudflare/kv-asset-handler': 0.3.1 + '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) + '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) + blake3-wasm: 2.1.5 + chokidar: 3.6.0 + esbuild: 0.17.19 + miniflare: 3.20240329.0 + nanoid: 3.3.7 + path-to-regexp: 6.2.1 + resolve: 1.22.8 + resolve.exports: 2.0.2 + selfsigned: 2.4.1 + source-map: 0.6.1 + xxhash-wasm: 1.0.2 + optionalDependencies: + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /xxhash-wasm@1.0.2: + resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} + dev: false + + /youch@3.3.3: + resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + dev: false + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false diff --git a/docs/scripts/generate-manifest-docs.mjs b/docs/scripts/generate-manifest-docs.mjs new file mode 100755 index 00000000000..8e8621236cb --- /dev/null +++ b/docs/scripts/generate-manifest-docs.mjs @@ -0,0 +1,45 @@ +#!/usr/bin/env node + +import { execa } from "execa"; +import path from "node:path"; +import fs from "node:fs"; +import fg from "fast-glob"; + +const rootDirectory = path.join(import.meta.dirname, "../.."); +const docsDirectory = path.join(import.meta.dirname, ".."); + +await execa("tuist", ["install"], { + cwd: rootDirectory, + stdio: "inherit", +}); + +await execa("tuist", ["generate", "--no-open", "--no-binary-cache"], { + cwd: rootDirectory, + stdio: "inherit", +}); + +await execa( + "sourcedocs", + [ + "generate", + "-o", + path.join(docsDirectory, "docs/generated/"), + "--clean", + "--table-of-contents", + "--module-name", + "ProjectDescription", + "--", + "-scheme", + "Tuist-Workspace", + "-workspace", + path.join(rootDirectory, "Tuist.xcworkspace"), + ], + { cwd: rootDirectory, stdio: "inherit" } +); + +fs.rmSync(path.join(docsDirectory, "docs/generated/README.md")); + +fg.sync(path.join(docsDirectory, "docs/generated/**/*.md")).forEach((file) => { + const renamedPath = file.replace(/\[(.*?)\]/g, "Array<$1>"); + fs.renameSync(file, renamedPath); +}); diff --git a/fixtures/app_with_build_rules/README.md b/fixtures/app_with_build_rules/README.md new file mode 100644 index 00000000000..7cb7e4be3d8 --- /dev/null +++ b/fixtures/app_with_build_rules/README.md @@ -0,0 +1,3 @@ +# Application with build rules + +This example contains an example that uses [build rules](https://developer.apple.com/documentation/xcode/creating-build-rules-for-custom-file-types), which instruct Xcode on how to compile a particular file. \ No newline at end of file diff --git a/fixtures/tuist_plugin/README.md b/fixtures/tuist_plugin/README.md deleted file mode 100644 index 6cbda4c6e6b..00000000000 --- a/fixtures/tuist_plugin/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# ExampleTuistPlugin -This is an example Tuist plugin for testing purposes. diff --git a/make/tasks/docs/build.sh b/make/tasks/docs/build.sh deleted file mode 100755 index 5ab69b4af96..00000000000 --- a/make/tasks/docs/build.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) - -if [ ! -d $ROOT_DIR/.build/documentation ]; then - mkdir -p $ROOT_DIR/.build/documentation -fi - -swift package --package-path $ROOT_DIR/docs --allow-writing-to-directory .build/documentation generate-documentation --target tuist --disable-indexing --output-path .build/documentation --transform-for-static-hosting - -# Copy favicon -cp $ROOT_DIR/assets/favicon.ico .build/documentation/favicon.ico -cp $ROOT_DIR/assets/favicon.svg .build/documentation/favicon.svg - -# Add Posthog snippet -INDEX_HTML=$ROOT_DIR/.build/documentation/index.html -POSTHOG_SCRIPT='' -sed -i.bak "s##$POSTHOG_SCRIPT#" $INDEX_HTML diff --git a/make/tasks/docs/preview.sh b/make/tasks/docs/preview.sh deleted file mode 100755 index 0ede39049cc..00000000000 --- a/make/tasks/docs/preview.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) - -swift package --package-path $ROOT_DIR/docs --disable-sandbox preview-documentation --target tuist \ No newline at end of file From e421c334b1d1344a1869fd88a3a80062f787fa90 Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 9 Apr 2024 17:18:13 +0200 Subject: [PATCH 215/509] Fix the documentation deploy pipeline --- codemagic.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/codemagic.yaml b/codemagic.yaml index 0e04da522c4..11b93b433f4 100644 --- a/codemagic.yaml +++ b/codemagic.yaml @@ -121,8 +121,6 @@ workflows: script: mise run docs:generate-manifests-docs - name: Build the documentation script: mise run docs:build - - name: Fix permissions - script: sudo chown -R $USER .build/documentation - name: Deploy to Cloudflare Pages script: | mise x npm:wrangler@latest -- wrangler pages deploy --commit-hash $CM_COMMIT --branch $CM_BRANCH --project-name tuist-docs docs/.vitepress/dist From dc3269cc56ef9e84c8c9698db8ad9dfb359e0dfe Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 9 Apr 2024 17:26:28 +0200 Subject: [PATCH 216/509] Fix the reference link --- docs/.vitepress/config.mjs | 2 +- docs/docs/reference/cli/commands.data.js | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 3fb17b32a7a..52f1b9bee16 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -90,7 +90,7 @@ export default defineConfig({ }, nav: [ { text: "Guide", link: "/guide/introduction/what-is-tuist" }, - { text: "Reference", link: "/reference/cli/generate" }, + { text: "Reference", link: "/reference/project-description/project" }, { text: "Tuist Cloud", link: "/cloud/what-is-cloud" }, { text: "Contributors", link: "/contributors/get-started" }, { text: "Changelog", link: "https://github.com/tuist/tuist/releases" }, diff --git a/docs/docs/reference/cli/commands.data.js b/docs/docs/reference/cli/commands.data.js index d8990077cb3..d7af1f7790b 100644 --- a/docs/docs/reference/cli/commands.data.js +++ b/docs/docs/reference/cli/commands.data.js @@ -1,12 +1,5 @@ export default { load() { - return [ - { - title: "Generate", - command: "generate", - description: "Turn your Tuist projects itno Xcode projects", - content: "# Generate\nThis is just a test" - } - ]; + return []; }, }; From e9c162a15d242ffed98e3121dba6fb148ae8e12e Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 9 Apr 2024 18:00:28 +0200 Subject: [PATCH 217/509] Fix home page --- docs/.vitepress/config.mjs | 250 +++++++++--------- .../what-is-tuist.md => index.md} | 0 2 files changed, 128 insertions(+), 122 deletions(-) rename docs/docs/{guide/introduction/what-is-tuist.md => index.md} (100%) diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 52f1b9bee16..92b3e3251b0 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -30,6 +30,124 @@ function capitalize(text) { } }); +const guideSidebar = [ + { + text: "Introduction", + items: [ + { + text: "What is Tuist?", + link: "/", + }, + { + text: "The cost of convenience", + link: "/guide/introduction/cost-of-convenience", + }, + { + text: "Installation", + link: "/guide/introduction/installation", + }, + { + text: "Adopting Tuist", + collapsed: true, + items: [ + { + text: "Create a project", + link: "/guide/introduction/adopting-tuist/new-project", + }, + { + text: "Use it with a Swift Package", + link: "/guide/introduction/adopting-tuist/swift-package", + }, + { + text: "Migrate from .xcodeproj", + link: "/guide/introduction/adopting-tuist/migrate-from-xcodeproj", + }, + { + text: "Migrate local Swift Packages", + link: "/guide/introduction/adopting-tuist/migrate-local-swift-packages", + }, + { + text: "Migrate from XcodeGen", + link: "/guide/introduction/adopting-tuist/migrate-from-xcodegen", + }, + { + text: "Migrate from Bazel", + link: "/guide/introduction/adopting-tuist/migrate-from-bazel", + }, + ], + }, + { + text: "From v3 to v4", + link: "/guide/introduction/from-v3-to-v4", + }, + ], + }, + { + text: "Project", + items: [ + { + text: "Directory structure", + link: "/guide/project/directory-structure", + }, + { text: "Editing", link: "/guide/project/editing" }, + { text: "Dependencies", link: "/guide/project/dependencies" }, + { text: "Code sharing", link: "/guide/project/code-sharing" }, + { + text: "Synthesized files", + link: "/guide/project/synthesized-files", + }, + { + text: "Dynamic configuration", + link: "/guide/project/dynamic-configuration", + }, + { + text: "Templates", + link: "/guide/project/templates", + }, + { + text: "Plugins", + link: "/guide/project/plugins", + }, + ], + }, + { + text: "Automation", + items: [ + { text: "Generate", link: "/guide/automation/generate" }, + { text: "Build", link: "/guide/automation/build" }, + { text: "Test", link: "/guide/automation/test" }, + { text: "Run", link: "/guide/automation/run" }, + { text: "Graph", link: "/guide/automation/graph" }, + { text: "Clean", link: "/guide/automation/clean" }, + ], + }, + { + text: "Scale", + items: [ + // { + // text: "Xcode", + // link: "/guide/scale/xcode", + // }, + { + text: "µFeatures architecture", + link: "/guide/scale/ufeatures-architecture", + }, + { + text: "Tuist Cloud", + link: "/cloud/what-is-cloud", + }, + ], + }, + { + text: "Extensions", + items: [ + { text: "Tasks", link: "/guide/extensions/tasks" }, + { text: "Templates" }, + { text: "Resource synthesizers" }, + ], + }, +]; + // https://vitepress.dev/reference/site-config export default defineConfig({ title: "Tuist", @@ -48,9 +166,7 @@ export default defineConfig({ }, async buildEnd({ outDir }) { const redirectsPath = path.join(outDir, "_redirects"); - const redirects = ` - -/ /guide/introduction/what-is-tuist 301 + const redirects = ` /documentation/tuist/installation /guide/introduction/installation 301 /documentation/tuist/project-structure /guide/project/directory-structure 301 /documentation/tuist/command-line-interface /guide/automation/generate 301 @@ -86,10 +202,15 @@ export default defineConfig({ themeConfig: { logo: "/logo.png", search: { - provider: "local", + provider: "algolia", + options: { + appId: "...", + apiKey: "...", + indexName: "...", + }, }, nav: [ - { text: "Guide", link: "/guide/introduction/what-is-tuist" }, + { text: "Guide", link: "/" }, { text: "Reference", link: "/reference/project-description/project" }, { text: "Tuist Cloud", link: "/cloud/what-is-cloud" }, { text: "Contributors", link: "/contributors/get-started" }, @@ -149,123 +270,8 @@ export default defineConfig({ ], }, ], - "/guide/": [ - { - text: "Introduction", - items: [ - { - text: "What is Tuist?", - link: "/guide/introduction/what-is-tuist", - }, - { - text: "The cost of convenience", - link: "/guide/introduction/cost-of-convenience", - }, - { - text: "From v3 to v4", - link: "/guide/introduction/from-v3-to-v4", - }, - { - text: "Installation", - link: "/guide/introduction/installation", - }, - { - text: "Adopting Tuist", - collapsed: true, - items: [ - { - text: "Create a project", - link: "/guide/introduction/adopting-tuist/new-project", - }, - { - text: "Use it with a Swift Package", - link: "/guide/introduction/adopting-tuist/swift-package", - }, - { - text: "Migrate from .xcodeproj", - link: "/guide/introduction/adopting-tuist/migrate-from-xcodeproj", - }, - { - text: "Migrate local Swift Packages", - link: "/guide/introduction/adopting-tuist/migrate-local-swift-packages", - }, - { - text: "Migrate from XcodeGen", - link: "/guide/introduction/adopting-tuist/migrate-from-xcodegen", - }, - { - text: "Migrate from Bazel", - link: "/guide/introduction/adopting-tuist/migrate-from-bazel", - }, - ], - }, - ], - }, - { - text: "Project", - items: [ - { - text: "Directory structure", - link: "/guide/project/directory-structure", - }, - { text: "Editing", link: "/guide/project/editing" }, - { text: "Dependencies", link: "/guide/project/dependencies" }, - { text: "Code sharing", link: "/guide/project/code-sharing" }, - { - text: "Synthesized files", - link: "/guide/project/synthesized-files", - }, - { - text: "Dynamic configuration", - link: "/guide/project/dynamic-configuration", - }, - { - text: "Templates", - link: "/guide/project/templates", - }, - { - text: "Plugins", - link: "/guide/project/plugins", - }, - ], - }, - { - text: "Automation", - items: [ - { text: "Generate", link: "/guide/automation/generate" }, - { text: "Build", link: "/guide/automation/build" }, - { text: "Test", link: "/guide/automation/test" }, - { text: "Run", link: "/guide/automation/run" }, - { text: "Graph", link: "/guide/automation/graph" }, - { text: "Clean", link: "/guide/automation/clean" }, - ], - }, - { - text: "Scale", - items: [ - // { - // text: "Xcode", - // link: "/guide/scale/xcode", - // }, - { - text: "µFeatures architecture", - link: "/guide/scale/ufeatures-architecture", - }, - { - text: "Tuist Cloud", - link: "/cloud/what-is-cloud", - }, - ], - }, - { - text: "Extensions", - items: [ - { text: "Tasks", link: "/guide/extensions/tasks" }, - { text: "Templates" }, - { text: "Resource synthesizers" }, - ], - }, - ], + "/guide/": guideSidebar, + "/": guideSidebar, "/reference/": [ { text: "Reference", diff --git a/docs/docs/guide/introduction/what-is-tuist.md b/docs/docs/index.md similarity index 100% rename from docs/docs/guide/introduction/what-is-tuist.md rename to docs/docs/index.md From 78ca5114e99e384017a5f7c89a6a7d1509158490 Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 9 Apr 2024 19:11:43 +0200 Subject: [PATCH 218/509] Fix search provider --- docs/.vitepress/config.mjs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 92b3e3251b0..38850585ab1 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -202,12 +202,7 @@ export default defineConfig({ themeConfig: { logo: "/logo.png", search: { - provider: "algolia", - options: { - appId: "...", - apiKey: "...", - indexName: "...", - }, + provider: "local", }, nav: [ { text: "Guide", link: "/" }, From f87e3d0bba393b91335b8a9466954de3be06370d Mon Sep 17 00:00:00 2001 From: costapombo <31352351+costapombo@users.noreply.github.com> Date: Wed, 10 Apr 2024 11:35:52 +0100 Subject: [PATCH 219/509] =?UTF-8?q?Fix=20=C2=B5Feature=20documentation=20d?= =?UTF-8?q?ependency=20logic=20(#6166)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pedro Costa <> --- docs/docs/guide/scale/ufeatures-architecture.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/docs/guide/scale/ufeatures-architecture.md b/docs/docs/guide/scale/ufeatures-architecture.md index 96dd42d53e0..dfb26249f23 100644 --- a/docs/docs/guide/scale/ufeatures-architecture.md +++ b/docs/docs/guide/scale/ufeatures-architecture.md @@ -49,11 +49,14 @@ We recommend following a naming convention for targets, something that you can e | `Feature` | `FeatureInterface` | Source code and resources | | `FeatureInterface` | - | Public interface and models | | `FeatureTests` | `Feature`, `FeatureTesting` | Unit and integration tests | -| `FeatureTesting` | `Feature` | Testing data and mocks | +| `FeatureTesting` | `FeatureInterface` | Testing data and mocks | | `FeatureExample` | `FeatureTesting`, `Feature` | Example app | +> [!TIP] UI Previews +> `Feature` can use `FeatureTesting` as a Development Asset to allow for UI previews + > [!IMPORTANT] COMPILER DIRECTIVES INSTEAD OF TESTING TARGETS -> Alternatively, you can use compiler directives to include test data and mocks in the mani feature target when compiling for `Debug`. You simplify the graph, but you'll end up compiling code that you won't need for running the app. +> Alternatively, you can use compiler directives to include test data and mocks in the `Feature` or `FeatureInterface` targets when compiling for `Debug`. You simplify the graph, but you'll end up compiling code that you won't need for running the app. ## Why a µFeature From 4f48459ce02032e718ba947d222b8b21781a2ab7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 10 Apr 2024 12:36:03 +0200 Subject: [PATCH 220/509] add costapombo as a contributor for code (#6168) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9c20474c36e..285b345f844 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1309,6 +1309,15 @@ "contributions": [ "code" ] + }, + { + "login": "costapombo", + "name": "costapombo", + "avatar_url": "https://avatars.githubusercontent.com/u/31352351?v=4", + "profile": "https://github.com/costapombo", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 5378f77e6c6..afb93f4f14e 100644 --- a/README.md +++ b/README.md @@ -521,6 +521,7 @@ Thanks goes to these wonderful people:
    PushedCrayon

    Stefano Mondino

    Łukasz Lech
    +
    costapombo
    From 1aa97a8f522800c0af37055fd1e4e235952bca31 Mon Sep 17 00:00:00 2001 From: costapombo <31352351+costapombo@users.noreply.github.com> Date: Wed, 10 Apr 2024 11:36:12 +0100 Subject: [PATCH 221/509] Fix documentation edit link (#6167) Co-authored-by: Pedro Costa <> --- docs/.vitepress/config.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 38850585ab1..d20f6f6cfe2 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -212,7 +212,7 @@ export default defineConfig({ { text: "Changelog", link: "https://github.com/tuist/tuist/releases" }, ], editLink: { - pattern: "https://github.com/tuist/docs/edit/main/docs/:path", + pattern: "https://github.com/tuist/tuist/edit/main/docs/docs/:path", }, sidebar: { "/contributors": [ From 0d31f0da11375d388a7686c04413b4fd3a20d101 Mon Sep 17 00:00:00 2001 From: Clemens Beck <39119695+Lilfaen@users.noreply.github.com> Date: Thu, 11 Apr 2024 11:20:59 +0200 Subject: [PATCH 222/509] Add support for privacy manifest file generation (#6117) * Implement xcprivacy as part of ResourceFileElements * Add acceptance tests * Fix tests * Fix acceptance test * Lint * Implement PR Feedback * Fix acceptance test * Add fixture for privacyManifest * Add acceptance test * Run lint:fix * Fix naming * Add documentation and more details in example * Run mise run lint:fix --- .../ProjectDescription/PrivacyManifest.swift | 48 +++++++++ .../ResourceFileElements.swift | 7 +- .../TuistAcceptanceFixtures.swift | 3 + .../Generator/BuildPhaseGenerator.swift | 2 +- .../ProjectDescriptorGenerator.swift | 2 +- .../Generator/ProjectFileElements.swift | 2 +- .../TuistGenerator/Linter/TargetLinter.swift | 4 +- ...GeneratePrivacyManifestProjectMapper.swift | 62 ++++++++++++ .../Mappers/ResourcesProjectMapper.swift | 6 +- ...esizedResourceInterfaceProjectMapper.swift | 4 +- .../TuistGraph/Models/PrivacyManifest.swift | 23 +++++ .../Models/ResourceFileElements.swift | 15 +++ Sources/TuistGraph/Models/Target.swift | 4 +- .../Models/Target+TestData.swift | 6 +- .../Factories/ProjectMapperFactory.swift | 3 + .../ProjectAutomation+ManifestMapper.swift | 2 +- .../Target+ManifestMapper.swift | 17 +++- .../PackageInfoMapper.swift | 4 +- Sources/TuistSupport/Constants.swift | 1 + .../GenerateAcceptanceTests.swift | 20 ++++ .../Generator/BuildPhaseGeneratorTests.swift | 20 ++-- .../ProjectDescriptorGeneratorTests.swift | 10 +- .../Generator/ProjectFileElementsTests.swift | 10 +- .../Generator/TargetGeneratorTests.swift | 2 +- .../Linter/TargetLinterTests.swift | 28 +++--- .../ResourcesProjectMapperTests.swift | 28 +++--- ...dResourceInterfaceProjectMapperTests.swift | 72 ++++++++------ .../Factories/ProjectMapperFactoryTests.swift | 12 +++ .../PackageInfoMapperTests.swift | 2 +- .../App/Project.swift | 44 ++++++--- .../ios_app_with_privacy_manifest/.gitignore | 70 +++++++++++++ .../AccentColor.colorset/Contents.json | 11 +++ .../AppIcon.appiconset/Contents.json | 98 +++++++++++++++++++ .../Resources/Assets.xcassets/Contents.json | 6 ++ .../MyApp/Resources/LaunchScreen.storyboard | 25 +++++ .../Preview Assets.xcassets/Contents.json | 6 ++ .../MyApp/Sources/ContentView.swift | 16 +++ .../MyApp/Sources/MyAppApp.swift | 10 ++ .../MyApp/Tests/MyAppTests.swift | 8 ++ .../Project.swift | 55 +++++++++++ .../ios_app_with_privacy_manifest/README.md | 3 + 41 files changed, 655 insertions(+), 116 deletions(-) create mode 100644 Sources/ProjectDescription/PrivacyManifest.swift create mode 100644 Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift create mode 100644 Sources/TuistGraph/Models/PrivacyManifest.swift create mode 100644 Sources/TuistGraph/Models/ResourceFileElements.swift create mode 100644 fixtures/ios_app_with_privacy_manifest/.gitignore create mode 100644 fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Assets.xcassets/Contents.json create mode 100644 fixtures/ios_app_with_privacy_manifest/MyApp/Resources/LaunchScreen.storyboard create mode 100644 fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 fixtures/ios_app_with_privacy_manifest/MyApp/Sources/ContentView.swift create mode 100644 fixtures/ios_app_with_privacy_manifest/MyApp/Sources/MyAppApp.swift create mode 100644 fixtures/ios_app_with_privacy_manifest/MyApp/Tests/MyAppTests.swift create mode 100644 fixtures/ios_app_with_privacy_manifest/Project.swift create mode 100644 fixtures/ios_app_with_privacy_manifest/README.md diff --git a/Sources/ProjectDescription/PrivacyManifest.swift b/Sources/ProjectDescription/PrivacyManifest.swift new file mode 100644 index 00000000000..b59504aa664 --- /dev/null +++ b/Sources/ProjectDescription/PrivacyManifest.swift @@ -0,0 +1,48 @@ +import Foundation + +/// Describe the data your app or third-party SDK collects and the reasons required APIs it uses. +public struct PrivacyManifest: Codable, Equatable { + /// A Boolean that indicates whether your app or third-party SDK uses data for tracking as defined under the App + /// Tracking Transparency framework. For more information, see [User Privacy and Data + /// Use](https://developer.apple.com/app-store/user-privacy-and-data-use/). + public var tracking: Bool + + /// An array of strings that lists the internet domains your app or third-party SDK connects to that + /// engage in tracking. If the user has not granted tracking permission through the App Tracking Transparency framework, + /// network requests to these domains fail and your app receives an error. If you set `tracking` to true then you need to + /// provide at least one internet domain in NSPrivacyTrackingDomains; otherwise, you can provide zero or more domains. + public var trackingDomains: [String] + + /// An array of dictionaries that describes the data types your app or third-party SDK collects. For + /// information on the keys and values to use in the dictionaries, see [Describing data use in privacy manifests](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests). + public var collectedDataTypes: [[String: Plist.Value]] + + /// An array of dictionaries that describe the API types your app or third-party SDK accesses that have + /// been designated as APIs that require reasons to access. For information on the keys and values to use in the dictionaries, + /// see [Describing use of required reason API](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api). + public var accessedApiTypes: [[String: Plist.Value]] + + /// Returns a PrivacyManifest. + /// - Parameter tracking: A Boolean that indicates whether your app or third-party SDK uses data for tracking. + /// - Parameter trackingDomains: An array of strings that lists the internet domains your app or third-party SDK connects to + /// that engage in tracking. + /// - Parameter collectedDataTypes: An array of dictionaries that describes the data types your app or third-party SDK + /// collects. + /// - Parameter accessedApiTypes: An array of dictionaries that describe the API types your app or third-party SDK accesses + /// that have + /// been designated as APIs that require reasons to access. + /// - Returns: PrivacyManifest. + public static func privacyManifest( + tracking: Bool, + trackingDomains: [String], + collectedDataTypes: [[String: Plist.Value]], + accessedApiTypes: [[String: Plist.Value]] + ) -> Self { + PrivacyManifest( + tracking: tracking, + trackingDomains: trackingDomains, + collectedDataTypes: collectedDataTypes, + accessedApiTypes: accessedApiTypes + ) + } +} diff --git a/Sources/ProjectDescription/ResourceFileElements.swift b/Sources/ProjectDescription/ResourceFileElements.swift index d5bb90918b2..8f009eb40bc 100644 --- a/Sources/ProjectDescription/ResourceFileElements.swift +++ b/Sources/ProjectDescription/ResourceFileElements.swift @@ -5,8 +5,11 @@ public struct ResourceFileElements: Codable, Equatable { /// List of resource file elements public var resources: [ResourceFileElement] - public static func resources(_ resources: [ResourceFileElement]) -> Self { - self.init(resources: resources) + /// Define your apps privacy manifest + public var privacyManifest: PrivacyManifest? + + public static func resources(_ resources: [ResourceFileElement], privacyManifest: PrivacyManifest? = nil) -> Self { + self.init(resources: resources, privacyManifest: privacyManifest) } } diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift index a254e441691..433c6b6baba 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift @@ -37,6 +37,7 @@ public enum TuistAcceptanceFixtures { case iosAppWithLocalSwiftPackage case iosAppWithMultiConfigs case iosAppWithPluginsAndTemplates + case iosAppWithPrivacyManifest case iosAppWithRemoteBinarySwiftPackage case iosAppWithRemoteSwiftPackage case iosAppWithStaticFrameworks @@ -140,6 +141,8 @@ public enum TuistAcceptanceFixtures { return "ios_app_with_multi_configs" case .iosAppWithPluginsAndTemplates: return "ios_app_with_plugins_and_templates" + case .iosAppWithPrivacyManifest: + return "ios_app_with_privacy_manifest" case .iosAppWithRemoteBinarySwiftPackage: return "ios_app_with_remote_binary_swift_package" case .iosAppWithRemoteSwiftPackage: diff --git a/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift b/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift index 8e6a2d1bace..9601a0631d3 100644 --- a/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift +++ b/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift @@ -349,7 +349,7 @@ final class BuildPhaseGenerator: BuildPhaseGenerating { pbxBuildFiles.append(contentsOf: try generateResourcesBuildFile( target: target, - files: target.resources, + files: target.resources.resources, fileElements: fileElements )) diff --git a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift index 51dbe495664..84b3c1b9627 100644 --- a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift @@ -296,7 +296,7 @@ final class ProjectDescriptorGenerator: ProjectDescriptorGenerating { var attributes: [String: Any] = [:] /// ODR tags - let tags = project.targets.map { $0.resources.map(\.tags).flatMap { $0 } }.flatMap { $0 } + let tags = project.targets.map { $0.resources.resources.map(\.tags).flatMap { $0 } }.flatMap { $0 } let uniqueTags = Set(tags).sorted() if !uniqueTags.isEmpty { diff --git a/Sources/TuistGenerator/Generator/ProjectFileElements.swift b/Sources/TuistGenerator/Generator/ProjectFileElements.swift index 37e403d41a0..d55b281f36d 100644 --- a/Sources/TuistGenerator/Generator/ProjectFileElements.swift +++ b/Sources/TuistGenerator/Generator/ProjectFileElements.swift @@ -173,7 +173,7 @@ class ProjectFileElements { // Elements var elements = Set() elements.formUnion(files.map { GroupFileElement(path: $0, group: target.filesGroup) }) - elements.formUnion(target.resources.map { + elements.formUnion(target.resources.resources.map { GroupFileElement( path: $0.path, group: target.filesGroup, diff --git a/Sources/TuistGenerator/Linter/TargetLinter.swift b/Sources/TuistGenerator/Linter/TargetLinter.swift index 9ab06356203..df232d96337 100644 --- a/Sources/TuistGenerator/Linter/TargetLinter.swift +++ b/Sources/TuistGenerator/Linter/TargetLinter.swift @@ -117,7 +117,7 @@ class TargetLinter: TargetLinting { private func lintCopiedFiles(target: Target) -> [LintingIssue] { var issues: [LintingIssue] = [] - let files = target.resources.map(\.path) + let files = target.resources.resources.map(\.path) let entitlements = files.filter { $0.pathString.contains(".entitlements") } if let targetInfoPlistPath = target.infoPlist?.path, files.contains(targetInfoPlistPath) { @@ -193,7 +193,7 @@ class TargetLinter: TargetLinting { return [] } - if target.resources.isEmpty == false { + if target.resources.resources.isEmpty == false { return [ LintingIssue( reason: "Target \(target.name) cannot contain resources. \(target.product) targets do not support resources", diff --git a/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift b/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift new file mode 100644 index 00000000000..5c2832e9e6a --- /dev/null +++ b/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift @@ -0,0 +1,62 @@ +import Foundation +import TSCBasic +import TuistCore +import TuistGraph +import TuistSupport +import XcodeProj + +/// A project mapper that generates derived privacyManifest files for targets that define it as a dictonary. +public final class GeneratePrivacyManifestProjectMapper: ProjectMapping { + public init() {} + + // MARK: - ProjectMapping + + public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { + logger.debug("Transforming project \(project.name): Synthesizing privacy manifest files'") + + let results = try project.targets + .reduce(into: (targets: [Target](), sideEffects: [SideEffectDescriptor]())) { results, target in + let (updatedTarget, sideEffects) = try map(target: target, project: project) + results.targets.append(updatedTarget) + results.sideEffects.append(contentsOf: sideEffects) + } + + return (project.with(targets: results.targets), results.sideEffects) + } + + // MARK: - Private + + private func map(target: Target, project: Project) throws -> (Target, [SideEffectDescriptor]) { + guard let privacyManifest = target.resources.privacyManifest else { + return (target, []) + } + + let dictionary: [String: Any] = [ + "NSPrivacyTracking": privacyManifest.tracking, + "NSPrivacyTrackingDomains": privacyManifest.trackingDomains, + "NSPrivacyCollectedDataTypes": privacyManifest.collectedDataTypes.map { $0.mapValues { $0.value } }, + "NSPrivacyAccessedAPITypes": privacyManifest.accessedApiTypes.map { $0.mapValues { $0.value } }, + ] + + let data = try PropertyListSerialization.data( + fromPropertyList: dictionary, + format: .xml, + options: 0 + ) + + let privacyManifestPath = project.path + .appending(component: Constants.DerivedDirectory.name) + .appending(component: Constants.DerivedDirectory.privacyManifest) + .appending(component: target.name) + .appending(component: "PrivacyInfo.xcprivacy") + let sideEffect = SideEffectDescriptor.file(FileDescriptor(path: privacyManifestPath, contents: data)) + + var resources = target.resources + resources.resources.append(.init(path: privacyManifestPath)) + + var newTarget = target + newTarget.resources = resources + + return (newTarget, [sideEffect]) + } +} diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 42bbb4a3a3f..4292edfc0c6 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -31,7 +31,7 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this // swiftlint:disable:next function_body_length public func mapTarget(_ target: Target, project: Project) throws -> ([Target], [SideEffectDescriptor]) { - if target.resources.isEmpty, target.coreDataModels.isEmpty { return ([target], []) } + if target.resources.resources.isEmpty, target.coreDataModels.isEmpty { return ([target], []) } var additionalTargets: [Target] = [] var sideEffects: [SideEffectDescriptor] = [] @@ -59,7 +59,7 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this coreDataModels: target.coreDataModels, filesGroup: target.filesGroup ) - modifiedTarget.resources = [] + modifiedTarget.resources.resources = [] modifiedTarget.copyFiles = [] modifiedTarget.dependencies.append(.target(name: bundleName, condition: .when(target.dependencyPlatformFilters))) additionalTargets.append(resourcesTarget) @@ -81,7 +81,7 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this if project.isExternal, target.supportsSources, target.sources.contains(where: { $0.path.extension == "m" || $0.path.extension == "mm" }), - !target.resources.filter({ $0.path.extension != "xcprivacy" }).isEmpty + !target.resources.resources.filter({ $0.path.extension != "xcprivacy" }).isEmpty { let (headerFilePath, headerData) = synthesizedObjcHeaderFile(bundleName: bundleName, target: target, project: project) diff --git a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift index 33328231464..86cc53cdc7b 100644 --- a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift @@ -70,7 +70,7 @@ public final class SynthesizedResourceInterfaceProjectMapper: ProjectMapping { / /// Map and generate resource interfaces for a given `Target` and `Project` private func mapTarget(_ target: Target, project: Project) throws -> (Target, [SideEffectDescriptor]) { - guard !target.resources.isEmpty, target.supportsSources else { return (target, []) } + guard !target.resources.resources.isEmpty, target.supportsSources else { return (target, []) } var target = target @@ -152,7 +152,7 @@ public final class SynthesizedResourceInterfaceProjectMapper: ProjectMapping { / target: Target, developmentRegion: String? ) -> [AbsolutePath] { - let resourcesPaths = target.resources + let resourcesPaths = target.resources.resources .map(\.path) var paths = resourcesPaths diff --git a/Sources/TuistGraph/Models/PrivacyManifest.swift b/Sources/TuistGraph/Models/PrivacyManifest.swift new file mode 100644 index 00000000000..be1e2fc39ed --- /dev/null +++ b/Sources/TuistGraph/Models/PrivacyManifest.swift @@ -0,0 +1,23 @@ +import Foundation + +public struct PrivacyManifest: Codable, Equatable { + public var tracking: Bool + + public var trackingDomains: [String] + + public var collectedDataTypes: [[String: Plist.Value]] + + public var accessedApiTypes: [[String: Plist.Value]] + + public init( + tracking: Bool, + trackingDomains: [String], + collectedDataTypes: [[String: Plist.Value]], + accessedApiTypes: [[String: Plist.Value]] + ) { + self.tracking = tracking + self.trackingDomains = trackingDomains + self.collectedDataTypes = collectedDataTypes + self.accessedApiTypes = accessedApiTypes + } +} diff --git a/Sources/TuistGraph/Models/ResourceFileElements.swift b/Sources/TuistGraph/Models/ResourceFileElements.swift new file mode 100644 index 00000000000..ec17e6fdfe1 --- /dev/null +++ b/Sources/TuistGraph/Models/ResourceFileElements.swift @@ -0,0 +1,15 @@ +import Foundation + +public struct ResourceFileElements: Codable, Equatable { + public var resources: [ResourceFileElement] + + public var privacyManifest: PrivacyManifest? + + public init( + _ resources: [ResourceFileElement], + privacyManifest: PrivacyManifest? = nil + ) { + self.resources = resources + self.privacyManifest = privacyManifest + } +} diff --git a/Sources/TuistGraph/Models/Target.swift b/Sources/TuistGraph/Models/Target.swift index 8589b391c84..3f13d5b6de7 100644 --- a/Sources/TuistGraph/Models/Target.swift +++ b/Sources/TuistGraph/Models/Target.swift @@ -31,7 +31,7 @@ public struct Target: Equatable, Hashable, Comparable, Codable { public var settings: Settings? public var dependencies: [TargetDependency] public var sources: [SourceFile] - public var resources: [ResourceFileElement] + public var resources: ResourceFileElements public var copyFiles: [CopyFilesAction] public var headers: Headers? public var coreDataModels: [CoreDataModel] @@ -60,7 +60,7 @@ public struct Target: Equatable, Hashable, Comparable, Codable { entitlements: Entitlements? = nil, settings: Settings? = nil, sources: [SourceFile] = [], - resources: [ResourceFileElement] = [], + resources: ResourceFileElements = .init([]), copyFiles: [CopyFilesAction] = [], headers: Headers? = nil, coreDataModels: [CoreDataModel] = [], diff --git a/Sources/TuistGraphTesting/Models/Target+TestData.swift b/Sources/TuistGraphTesting/Models/Target+TestData.swift index 675de306dfc..999953413cf 100644 --- a/Sources/TuistGraphTesting/Models/Target+TestData.swift +++ b/Sources/TuistGraphTesting/Models/Target+TestData.swift @@ -16,7 +16,7 @@ extension Target { entitlements: Entitlements? = nil, settings: Settings? = Settings.test(), sources: [SourceFile] = [], - resources: [ResourceFileElement] = [], + resources: ResourceFileElements = .init([]), copyFiles: [CopyFilesAction] = [], coreDataModels: [CoreDataModel] = [], headers: Headers? = nil, @@ -74,7 +74,7 @@ extension Target { entitlements: Entitlements? = nil, settings: Settings? = Settings.test(), sources: [SourceFile] = [], - resources: [ResourceFileElement] = [], + resources: ResourceFileElements = .init([]), copyFiles: [CopyFilesAction] = [], coreDataModels: [CoreDataModel] = [], headers: Headers? = nil, @@ -131,7 +131,7 @@ extension Target { entitlements: Entitlements? = nil, settings: Settings? = nil, sources: [SourceFile] = [], - resources: [ResourceFileElement] = [], + resources: ResourceFileElements = .init([]), copyFiles: [CopyFilesAction] = [], coreDataModels: [CoreDataModel] = [], headers: Headers? = nil, diff --git a/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift b/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift index 90432d1dbc6..e794d095b24 100644 --- a/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift +++ b/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift @@ -74,6 +74,9 @@ public final class ProjectMapperFactory: ProjectMapperFactorying { // Entitlements mappers.append(GenerateEntitlementsProjectMapper()) + // Privacy Manifest + mappers.append(GeneratePrivacyManifestProjectMapper()) + // Template macros mappers.append(IDETemplateMacrosMapper()) diff --git a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift index 75a1c6c1541..8215a0d48ed 100644 --- a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift +++ b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift @@ -69,7 +69,7 @@ extension ProjectAutomation.Target { product: target.product.rawValue, bundleId: target.bundleId, sources: target.sources.map(\.path.pathString), - resources: target.resources.map(\.path.pathString), + resources: target.resources.resources.map(\.path.pathString), settings: ProjectAutomation.Settings.from(target.settings), dependencies: dependencies ) diff --git a/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift index eb2db60ec73..a71558783a2 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift @@ -134,7 +134,7 @@ extension TuistGraph.Target { generatorPaths: GeneratorPaths // swiftlint:disable:next large_tuple ) throws -> ( - resources: [TuistGraph.ResourceFileElement], + resources: TuistGraph.ResourceFileElements, playgrounds: [AbsolutePath], coreDataModels: [AbsolutePath], invalidResourceGlobs: [InvalidGlob] @@ -143,8 +143,17 @@ extension TuistGraph.Target { TuistGraph.Target.isResource(path: path) } + let privacyManifest: TuistGraph.PrivacyManifest? = manifest.resources?.privacyManifest.map { + return TuistGraph.PrivacyManifest( + tracking: $0.tracking, + trackingDomains: $0.trackingDomains, + collectedDataTypes: $0.collectedDataTypes.map { $0.mapValues { TuistGraph.Plist.Value.from(manifest: $0) }}, + accessedApiTypes: $0.accessedApiTypes.map { $0.mapValues { TuistGraph.Plist.Value.from(manifest: $0) }} + ) + } + var invalidResourceGlobs: [InvalidGlob] = [] - var filteredResources: [TuistGraph.ResourceFileElement] = [] + var filteredResources: TuistGraph.ResourceFileElements = .init([], privacyManifest: privacyManifest) var playgrounds: Set = [] var coreDataModels: Set = [] @@ -163,14 +172,14 @@ extension TuistGraph.Target { for fileElement in allResources { switch fileElement { - case .folderReference: filteredResources.append(fileElement) + case .folderReference: filteredResources.resources.append(fileElement) case let .file(path, _, _): if path.extension == "playground" { playgrounds.insert(path) } else if path.extension == "xcdatamodeld" { coreDataModels.insert(path) } else { - filteredResources.append(fileElement) + filteredResources.resources.append(fileElement) } } } diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 4a185c01111..4657e75b069 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -500,7 +500,7 @@ public final class PackageInfoMapper: PackageInfoMapping { var headers: ProjectDescription.Headers? var sources: SourceFilesList? - var resources: ResourceFileElements? + var resources: ProjectDescription.ResourceFileElements? if target.type.supportsPublicHeaderPath { headers = try Headers.from(moduleMap: moduleMap) @@ -762,7 +762,7 @@ extension SourceFilesList { } } -extension ResourceFileElements { +extension ProjectDescription.ResourceFileElements { fileprivate static func from( sources: [String]?, resources: [PackageInfo.Target.Resource], diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 1e2c9e64d08..2d6f18e9a99 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -41,6 +41,7 @@ public enum Constants { public static let name = "Derived" public static let infoPlists = "InfoPlists" public static let entitlements = "Entitlements" + public static let privacyManifest = "PrivacyManifests" public static let moduleMaps = "ModuleMaps" public static let sources = "Sources" public static let signingKeychain = "signing.keychain" diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index f93fee7dce5..addf257a7ed 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -129,6 +129,26 @@ final class GenerateAcceptanceTestiOSAppWithFrameworkAndResources: TuistAcceptan "App.app", destination: "Debug-iphonesimulator" ) + try XCTAssertDirectoryContentEqual( + fixturePath.appending(components: "App", "Derived", "PrivacyManifests", "App"), + [ + "PrivacyInfo.xcprivacy", + ] + ) + } +} + +final class GenerateAcceptanceTestiOSAppWithPrivacyManifest: TuistAcceptanceTestCase { + func test_ios_app_with_privacy_manifest() async throws { + try setUpFixture(.iosAppWithPrivacyManifest) + try await run(GenerateCommand.self) + try await run(BuildCommand.self) + try XCTAssertDirectoryContentEqual( + fixturePath.appending(components: "Derived", "PrivacyManifests", "MyApp"), + [ + "PrivacyInfo.xcprivacy", + ] + ) } } diff --git a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift index 288b9874231..716ccc18515 100644 --- a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift @@ -475,7 +475,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // When try subject.generateResourcesBuildPhase( path: "/path", - target: .test(resources: resources), + target: .test(resources: .init(resources)), graphTraverser: graphTraverser, pbxTarget: nativeTarget, fileElements: fileElements, @@ -524,7 +524,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // When try subject.generateResourcesBuildPhase( path: "/path", - target: .test(resources: files.map { .file(path: $0) }), + target: .test(resources: .init(files.map { .file(path: $0) })), graphTraverser: GraphTraverser(graph: .test(path: path)), pbxTarget: nativeTarget, fileElements: fileElements, @@ -572,7 +572,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // When try subject.generateResourcesBuildPhase( path: "/path", - target: .test(resources: resourceFiles.map { .file(path: $0) }), + target: .test(resources: .init(resourceFiles.map { .file(path: $0) })), graphTraverser: GraphTraverser(graph: .test(path: path)), pbxTarget: nativeTarget, fileElements: fileElements, @@ -591,7 +591,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { versions: [try AbsolutePath(validating: "/Model.xcdatamodeld/1.xcdatamodel")], currentVersion: "1" ) - let target = Target.test(resources: [], coreDataModels: [coreDataModel]) + let target = Target.test(resources: .init([]), coreDataModels: [coreDataModel]) let fileElements = ProjectFileElements() let pbxproj = PBXProj() @@ -627,7 +627,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let temporaryPath = try temporaryPath() let path = try AbsolutePath(validating: "/image.png") - let target = Target.test(resources: [.file(path: path)]) + let target = Target.test(resources: .init([.file(path: path)])) let fileElements = ProjectFileElements() let pbxproj = PBXProj() let fileElement = PBXFileReference() @@ -664,7 +664,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { .file(path: "/file.type", tags: ["fileTag"]), .folderReference(path: "/folder", tags: ["folderTag"]), ] - let target = Target.test(resources: resources) + let target = Target.test(resources: .init(resources)) let fileElements = ProjectFileElements() let pbxproj = PBXProj() @@ -714,7 +714,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { .file(path: "/visionOS.type", inclusionCondition: .when([.visionos])), .file(path: "/watchOS.type", inclusionCondition: .when([.watchos])), ] - let target = Target.test(resources: resources) + let target = Target.test(resources: .init(resources)) let fileElements = ProjectFileElements() let pbxproj = PBXProj() @@ -1234,7 +1234,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let pbxProject = createPbxProject(pbxproj: pbxproj) let target = Target.test( sources: [], - resources: [], + resources: .init([]), scripts: [ TargetScript( name: "post", @@ -1309,7 +1309,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let pbxProject = createPbxProject(pbxproj: pbxproj) let target = Target.test( sources: [], - resources: [], + resources: .init([]), scripts: [ TargetScript( name: "post", @@ -1375,7 +1375,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let pbxProject = createPbxProject(pbxproj: pbxproj) let target = Target.test( sources: [], - resources: [], + resources: .init([]), scripts: [ TargetScript( name: "post", diff --git a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift index c901b1f6be6..d5409c81e72 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift @@ -195,9 +195,11 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { let project = Project.test( path: path, targets: [ - .test(resources: try resources.map { - .file(path: path.appending(try RelativePath(validating: $0))) - }), + .test(resources: .init( + try resources.map { + .file(path: path.appending(try RelativePath(validating: $0))) + } + )), ] ) @@ -283,7 +285,7 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { ] let project = Project.test( path: path, - targets: [.test(resources: resources)] + targets: [.test(resources: .init(resources))] ) // When diff --git a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift index 955bc249c65..7d4a4c2f8d8 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift @@ -393,10 +393,12 @@ final class ProjectFileElementsTests: TuistUnitTestCase { entitlements: .file(path: try AbsolutePath(validating: "/project/app.entitlements")), settings: settings, sources: [SourceFile(path: try AbsolutePath(validating: "/project/file.swift"))], - resources: [ - .file(path: try AbsolutePath(validating: "/project/image.png")), - .folderReference(path: try AbsolutePath(validating: "/project/reference")), - ], + resources: .init( + [ + .file(path: try AbsolutePath(validating: "/project/image.png")), + .folderReference(path: try AbsolutePath(validating: "/project/reference")), + ] + ), copyFiles: [ CopyFilesAction( name: "Copy Templates", diff --git a/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift index 5caf0938c7e..c0e30ff371b 100644 --- a/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift @@ -175,7 +175,7 @@ final class TargetGeneratorTests: XCTestCase { let graphTraverser = GraphTraverser(graph: graph) let target = Target.test( sources: [], - resources: [], + resources: .init([]), scripts: [ TargetScript( name: "post", diff --git a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift index 293234159d6..e1d0f2df25b 100644 --- a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift @@ -108,10 +108,12 @@ final class TargetLinterTests: TuistUnitTestCase { let target = Target.test( infoPlist: .file(path: infoPlistPath), - resources: [ - .file(path: infoPlistPath), - .file(path: googeServiceInfoPlistPath), - ] + resources: .init( + [ + .file(path: infoPlistPath), + .file(path: googeServiceInfoPlistPath), + ] + ) ) let got = subject.lint(target: target) @@ -134,7 +136,7 @@ final class TargetLinterTests: TuistUnitTestCase { func test_lint_when_a_entitlements_file_is_being_copied() { let path = try! AbsolutePath(validating: "/App.entitlements") - let target = Target.test(resources: [.file(path: path)]) + let target = Target.test(resources: .init([.file(path: path)])) let got = subject.lint(target: target) @@ -178,8 +180,8 @@ final class TargetLinterTests: TuistUnitTestCase { let path = temporaryPath.appending(component: "Image.png") let element = ResourceFileElement.file(path: path) - let staticLibrary = Target.test(product: .staticLibrary, resources: [element]) - let dynamicLibrary = Target.test(product: .dynamicLibrary, resources: [element]) + let staticLibrary = Target.test(product: .staticLibrary, resources: .init([element])) + let dynamicLibrary = Target.test(product: .dynamicLibrary, resources: .init([element])) let staticResult = subject.lint(target: staticLibrary) XCTContainsLintingIssue( @@ -208,7 +210,7 @@ final class TargetLinterTests: TuistUnitTestCase { sources: [ SourceFile(path: "/path/to/some/source.swift"), ], - resources: [] + resources: .init([]) ) // When @@ -230,7 +232,7 @@ final class TargetLinterTests: TuistUnitTestCase { destinations: .macOS, product: .bundle, sources: [], - resources: [] + resources: .init([]) ) // When @@ -245,9 +247,11 @@ final class TargetLinterTests: TuistUnitTestCase { let bundle = Target.empty( destinations: .iOS, product: .bundle, - resources: [ - .file(path: "/path/to/some/asset.png"), - ] + resources: .init( + [ + .file(path: "/path/to/some/asset.png"), + ] + ) ) // When diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index acc9b776655..87d87b2ca83 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -33,7 +33,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { func test_map_when_a_target_that_has_resources_and_doesnt_supports_them() throws { // Given let resources: [ResourceFileElement] = [.file(path: "/image.png")] - let target = Target.test(product: .staticLibrary, sources: ["/Absolute/File.swift"], resources: resources) + let target = Target.test(product: .staticLibrary, sources: ["/Absolute/File.swift"], resources: .init(resources)) project = Project.test(targets: [target]) // Got @@ -60,7 +60,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let gotTarget = try XCTUnwrap(gotProject.targets.first) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) - XCTAssertEqual(gotTarget.resources.count, 0) + XCTAssertEqual(gotTarget.resources.resources.count, 0) XCTAssertEqual(gotTarget.sources.count, 2) XCTAssertEqual(gotTarget.sources.last?.path, expectedPath) XCTAssertNotNil(gotTarget.sources.last?.contentHash) @@ -77,7 +77,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual(resourcesTarget.bundleId, "\(target.bundleId).resources") XCTAssertEqual(resourcesTarget.deploymentTargets, target.deploymentTargets) XCTAssertEqual(resourcesTarget.filesGroup, target.filesGroup) - XCTAssertEqual(resourcesTarget.resources, resources) + XCTAssertEqual(resourcesTarget.resources.resources, resources) XCTAssertEqual(resourcesTarget.settings?.base, [ "CODE_SIGNING_ALLOWED": "NO", ]) @@ -86,7 +86,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { func testMap_whenDisableBundleAccessorsIsTrue_doesNotGenerateAccessors() throws { // Given let resources: [ResourceFileElement] = [.file(path: "/image.png")] - let target = Target.test(product: .staticLibrary, resources: resources) + let target = Target.test(product: .staticLibrary, resources: .init(resources)) project = Project.test( options: .test( disableBundleAccessors: true @@ -105,7 +105,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { func testMap_whenNoSwiftSources() throws { // Given let resources: [ResourceFileElement] = [.file(path: "/image.png")] - let target = Target.test(product: .staticLibrary, sources: ["/Absolute/File.m"], resources: resources) + let target = Target.test(product: .staticLibrary, sources: ["/Absolute/File.m"], resources: .init(resources)) project = Project.test( targets: [target] ) @@ -120,7 +120,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let gotTarget = try XCTUnwrap(gotProject.targets.first) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) - XCTAssertEqual(gotTarget.resources.count, 0) + XCTAssertEqual(gotTarget.resources.resources.count, 0) XCTAssertEqual(gotTarget.sources.count, 1) XCTAssertEqual(gotTarget.dependencies.count, 1) XCTAssertEqual( @@ -135,7 +135,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual(resourcesTarget.bundleId, "\(target.bundleId).resources") XCTAssertEqual(resourcesTarget.deploymentTargets, target.deploymentTargets) XCTAssertEqual(resourcesTarget.filesGroup, target.filesGroup) - XCTAssertEqual(resourcesTarget.resources, resources) + XCTAssertEqual(resourcesTarget.resources.resources, resources) } func test_map_when_a_target_that_has_core_data_models_and_doesnt_supports_them() throws { @@ -170,7 +170,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let gotTarget = try XCTUnwrap(gotProject.targets.first) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) - XCTAssertEqual(gotTarget.resources.count, 0) + XCTAssertEqual(gotTarget.resources.resources.count, 0) XCTAssertEqual(gotTarget.sources.count, 2) XCTAssertEqual(gotTarget.sources.last?.path, expectedPath) XCTAssertNotNil(gotTarget.sources.last?.contentHash) @@ -193,7 +193,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { func test_map_when_a_target_that_has_resources_and_supports_them() throws { // Given let resources: [ResourceFileElement] = [.file(path: "/image.png")] - let target = Target.test(product: .framework, sources: ["/Absolute/File.swift"], resources: resources) + let target = Target.test(product: .framework, sources: ["/Absolute/File.swift"], resources: .init(resources)) project = Project.test(targets: [target]) // Got @@ -220,7 +220,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let gotTarget = try XCTUnwrap(gotProject.targets.first) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) - XCTAssertEqual(gotTarget.resources, resources) + XCTAssertEqual(gotTarget.resources.resources, resources) XCTAssertEqual(gotTarget.sources.count, 2) XCTAssertEqual(gotTarget.sources.last?.path, expectedPath) XCTAssertNotNil(gotTarget.sources.last?.contentHash) @@ -268,7 +268,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { func test_map_when_a_target_has_no_resources() throws { // Given let resources: [ResourceFileElement] = [] - let target = Target.test(product: .framework, resources: resources) + let target = Target.test(product: .framework, resources: .init(resources)) project = Project.test(targets: [target]) // Got @@ -285,7 +285,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { .file(path: "/Some/ResourceA"), .file(path: "/Some/ResourceB"), ] - let target = Target.test(product: .bundle, resources: resources) + let target = Target.test(product: .bundle, resources: .init(resources)) project = Project.test(targets: [target]) // Got @@ -303,7 +303,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { name: "test-tuist", product: .staticLibrary, sources: ["/Absolute/File.swift"], - resources: resources + resources: .init(resources) ) project = Project.test(targets: [target]) @@ -331,7 +331,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Given let sources: [SourceFile] = ["/ViewController.m"] let resources: [ResourceFileElement] = [.file(path: "/AbsolutePath/Project/Resources/image.png")] - let target = Target.test(product: .staticLibrary, sources: sources, resources: resources) + let target = Target.test(product: .staticLibrary, sources: sources, resources: .init(resources)) project = Project.test(path: try AbsolutePath(validating: "/AbsolutePath/Project"), targets: [target], isExternal: true) // Got diff --git a/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift index ee5fbd3e050..f817ce001cb 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift @@ -82,19 +82,21 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { let targetA = Target.test( name: "TargetA", - resources: [ - .folderReference(path: aAssets), - .file(path: frenchStrings), - .file(path: frenchStringsDict), - .file(path: englishStrings), - .file(path: englishStringsDict), - .file(path: emptyPlist), - .file(path: environmentPlist), - .file(path: ttfFont), - .file(path: otfFont), - .file(path: ttcFont), - .file(path: lottieFile), - ] + resources: .init( + [ + .folderReference(path: aAssets), + .file(path: frenchStrings), + .file(path: frenchStringsDict), + .file(path: englishStrings), + .file(path: englishStringsDict), + .file(path: emptyPlist), + .file(path: environmentPlist), + .file(path: ttfFont), + .file(path: otfFont), + .file(path: ttcFont), + .file(path: lottieFile), + ] + ) ) let resourceSynthesizers: [ResourceSynthesizer] = [ @@ -331,19 +333,21 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { let targetA = Target.test( name: "TargetA", - resources: [ - .folderReference(path: aAssets), - .file(path: frenchStrings), - .file(path: frenchStringsDict), - .file(path: englishStrings), - .file(path: englishStringsDict), - .file(path: emptyPlist), - .file(path: environmentPlist), - .file(path: ttfFont), - .file(path: otfFont), - .file(path: ttcFont), - .file(path: lottieFile), - ] + resources: .init( + [ + .folderReference(path: aAssets), + .file(path: frenchStrings), + .file(path: frenchStringsDict), + .file(path: englishStrings), + .file(path: englishStringsDict), + .file(path: emptyPlist), + .file(path: environmentPlist), + .file(path: ttfFont), + .file(path: otfFont), + .file(path: ttcFont), + .file(path: lottieFile), + ] + ) ) let resourceSynthesizers: [ResourceSynthesizer] = [ @@ -418,9 +422,11 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { targets: [ .test( name: "TargetA", - resources: [ - .file(path: ttfFont), - ] + resources: .init( + [ + .file(path: ttfFont), + ] + ) ), ], resourceSynthesizers: makeResourceSynthesizers() @@ -455,9 +461,11 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { targets: [ .test( name: "TargetA", - resources: [ - .file(path: ttfFont), - ] + resources: .init( + [ + .file(path: ttfFont), + ] + ) ), ], resourceSynthesizers: makeResourceSynthesizers() diff --git a/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift b/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift index 6096cbc2141..df78dfd0fae 100644 --- a/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift +++ b/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift @@ -59,6 +59,18 @@ final class ProjectMapperFactoryTests: TuistUnitTestCase { XCTAssertContainsElementOfType(got, GenerateInfoPlistProjectMapper.self, after: DeleteDerivedDirectoryProjectMapper.self) } + func test_default_contains_the_generate_privacy_manifest_mapper() { + // When + let got = subject.default() + + // Then + XCTAssertContainsElementOfType( + got, + GeneratePrivacyManifestProjectMapper.self, + after: DeleteDerivedDirectoryProjectMapper.self + ) + } + func test_default_contains_the_ide_template_macros_mapper() { // When let got = subject.default() diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 3810c730e5c..cfe5e603806 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -3199,7 +3199,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { } } -private func defaultSpmResources(_ target: String, customPath: String? = nil) -> ResourceFileElements { +private func defaultSpmResources(_ target: String, customPath: String? = nil) -> ProjectDescription.ResourceFileElements { let fullPath: String if let customPath { fullPath = customPath diff --git a/fixtures/ios_app_with_framework_and_resources/App/Project.swift b/fixtures/ios_app_with_framework_and_resources/App/Project.swift index bf42c204395..d3a02079100 100644 --- a/fixtures/ios_app_with_framework_and_resources/App/Project.swift +++ b/fixtures/ios_app_with_framework_and_resources/App/Project.swift @@ -10,20 +10,36 @@ let project = Project( bundleId: "io.tuist.App", infoPlist: "Config/App-Info.plist", sources: "Sources/**", - resources: [ - "Resources/**/*.png", - "Resources/*.xcassets", - "Resources/**/*.txt", - "Resources/**/*.strings", - "Resources/**/*.stringsdict", - "Resources/**/*.plist", - "Resources/**/*.otf", - "Resources/resource_without_extension", - .glob(pattern: "ODRResources/*.png", tags: ["tag1"]), - .glob(pattern: "ODRResources/odr_text.txt", tags: ["tag2"]), - .folderReference(path: "Examples"), - .folderReference(path: "ODRExamples", tags: ["tag1", "tag2"]), - ], + resources: .resources( + [ + "Resources/**/*.png", + "Resources/*.xcassets", + "Resources/**/*.txt", + "Resources/**/*.strings", + "Resources/**/*.stringsdict", + "Resources/**/*.plist", + "Resources/**/*.otf", + "Resources/resource_without_extension", + .glob(pattern: "ODRResources/*.png", tags: ["tag1"]), + .glob(pattern: "ODRResources/odr_text.txt", tags: ["tag2"]), + .folderReference(path: "Examples"), + .folderReference(path: "ODRExamples", tags: ["tag1", "tag2"]), + ], + privacyManifest: .privacyManifest( + tracking: false, + trackingDomains: [], + collectedDataTypes: [ + ], + accessedApiTypes: [ + [ + "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryUserDefaults", + "NSPrivacyAccessedAPITypeReasons": [ + "CA92.1", + ], + ], + ] + ) + ), dependencies: [ .project(target: "Framework1", path: "../Framework1"), .project(target: "StaticFramework", path: "../StaticFramework"), diff --git a/fixtures/ios_app_with_privacy_manifest/.gitignore b/fixtures/ios_app_with_privacy_manifest/.gitignore new file mode 100644 index 00000000000..24b244f9c45 --- /dev/null +++ b/fixtures/ios_app_with_privacy_manifest/.gitignore @@ -0,0 +1,70 @@ +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Xcode ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +### Xcode Patch ### +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcworkspace/contents.xcworkspacedata +/*.gcno + +### Projects ### +*.xcodeproj +*.xcworkspace + +### Tuist derived files ### +graph.dot +Derived/ + +### Tuist managed dependencies ### +Tuist/.build \ No newline at end of file diff --git a/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000000..eb878970081 --- /dev/null +++ b/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..9221b9bb1a3 --- /dev/null +++ b/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Assets.xcassets/Contents.json b/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/LaunchScreen.storyboard b/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/LaunchScreen.storyboard new file mode 100644 index 00000000000..865e9329f37 --- /dev/null +++ b/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Preview Content/Preview Assets.xcassets/Contents.json b/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/ios_app_with_privacy_manifest/MyApp/Resources/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_privacy_manifest/MyApp/Sources/ContentView.swift b/fixtures/ios_app_with_privacy_manifest/MyApp/Sources/ContentView.swift new file mode 100644 index 00000000000..48f62ebea83 --- /dev/null +++ b/fixtures/ios_app_with_privacy_manifest/MyApp/Sources/ContentView.swift @@ -0,0 +1,16 @@ +import SwiftUI + +public struct ContentView: View { + public init() {} + + public var body: some View { + Text("Hello, World!") + .padding() + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/fixtures/ios_app_with_privacy_manifest/MyApp/Sources/MyAppApp.swift b/fixtures/ios_app_with_privacy_manifest/MyApp/Sources/MyAppApp.swift new file mode 100644 index 00000000000..2db0d884171 --- /dev/null +++ b/fixtures/ios_app_with_privacy_manifest/MyApp/Sources/MyAppApp.swift @@ -0,0 +1,10 @@ +import SwiftUI + +@main +struct MyAppApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/fixtures/ios_app_with_privacy_manifest/MyApp/Tests/MyAppTests.swift b/fixtures/ios_app_with_privacy_manifest/MyApp/Tests/MyAppTests.swift new file mode 100644 index 00000000000..c36005b54f2 --- /dev/null +++ b/fixtures/ios_app_with_privacy_manifest/MyApp/Tests/MyAppTests.swift @@ -0,0 +1,8 @@ +import Foundation +import XCTest + +final class MyAppTests: XCTestCase { + func test_twoPlusTwo_isFour() { + XCTAssertEqual(2 + 2, 4) + } +} diff --git a/fixtures/ios_app_with_privacy_manifest/Project.swift b/fixtures/ios_app_with_privacy_manifest/Project.swift new file mode 100644 index 00000000000..f9d0e8d5127 --- /dev/null +++ b/fixtures/ios_app_with_privacy_manifest/Project.swift @@ -0,0 +1,55 @@ +import ProjectDescription + +let project = Project( + name: "MyApp", + targets: [ + .target( + name: "MyApp", + destinations: .iOS, + product: .app, + bundleId: "io.tuist.MyApp", + infoPlist: .extendingDefault( + with: [ + "UILaunchStoryboardName": "LaunchScreen.storyboard", + ] + ), + sources: ["MyApp/Sources/**"], + resources: .resources( + ["MyApp/Resources/**"], + privacyManifest: .privacyManifest( + tracking: false, + trackingDomains: [], + collectedDataTypes: [ + [ + "NSPrivacyCollectedDataType": "NSPrivacyCollectedDataTypeName", + "NSPrivacyCollectedDataTypeLinked": false, + "NSPrivacyCollectedDataTypeTracking": false, + "NSPrivacyCollectedDataTypePurposes": [ + "NSPrivacyCollectedDataTypePurposeAppFunctionality", + ], + ], + ], + accessedApiTypes: [ + [ + "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryUserDefaults", + "NSPrivacyAccessedAPITypeReasons": [ + "CA92.1", + ], + ], + ] + ) + ), + dependencies: [] + ), + .target( + name: "MyAppTests", + destinations: .iOS, + product: .unitTests, + bundleId: "io.tuist.MyAppTests", + infoPlist: .default, + sources: ["MyApp/Tests/**"], + resources: [], + dependencies: [.target(name: "MyApp")] + ), + ] +) diff --git a/fixtures/ios_app_with_privacy_manifest/README.md b/fixtures/ios_app_with_privacy_manifest/README.md new file mode 100644 index 00000000000..45d6d874f94 --- /dev/null +++ b/fixtures/ios_app_with_privacy_manifest/README.md @@ -0,0 +1,3 @@ +# Application with Privacy Manifest + +This example contains an example that uses a [Privacy Manifest](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files), which describe the data the app collects and the reasons required APIs it uses. \ No newline at end of file From 5271cb3ca8c3fce76839275d848e9348e10bb3a4 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 11 Apr 2024 14:30:58 +0200 Subject: [PATCH 223/509] Add the Tuxie logo --- docs/docs/index.md | 16 +++++++++++++++- docs/docs/tuxie.png | Bin 0 -> 3821815 bytes 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 docs/docs/tuxie.png diff --git a/docs/docs/index.md b/docs/docs/index.md index 742c2fddab2..6d81ad4048c 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -3,7 +3,21 @@ title: What is Tuist? description: Learn about Tuist, a tool that simplifies the complexities of modularization, optimizes workflows, and democratizes the evolution of Xcode projects. --- -# Tuist + + +
    + +

    Tuist

    +
    As Xcode projects expand, **organizations may face a decline in productivity** due to several factors, including unreliable incremental builds, frequent clearing of Xcode's global cache by developers encountering issues, and fragile project configurations. To maintain rapid feature development, organizations typically explore various strategies. diff --git a/docs/docs/tuxie.png b/docs/docs/tuxie.png new file mode 100644 index 0000000000000000000000000000000000000000..1291be1c6b4a472418ecc6cc7491ed2406628351 GIT binary patch literal 3821815 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 SG| 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 z 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

    Em-u&Fqg-Gi$x{a+f; zO})%myps6sCNl-}tr6U8sG4myU70<%hw5~SEXmFE1o13C*Shbj+5d5+1VsEU1*$uH z?hf%b0)PNp=06Huq5=Pw3;%oCNqqY+cblZ58=L-B*j*P!8A>i%=(0M)P-=is9h#+$(4StOi)XT41e3)eW%Rw1G0v z3F%{5y%9{)MT4PD;_lGu&Z#BImg%5eHe|Pf_LkN|A%6ljsi%DOBgx*z)2_=I{h#&c z*YnVgj(;XZn8A^~?EOK&9r&sE-x8dY36eG=H7y~Le{$H7|6XajX{=LsS6m8yLScA5HLfh37oSPKcXpp0Ztwzx1zMYZy6 z2oW@A5^>_w9d6_geLJMn*%X?~GT~Sz$~G}F>x(hv(S;cY(PiQP(%1Wy|bR97Q}gYn=L zkLO`a%Y!9-dzo5ojx)lQm-_ha-Lba?v(npOsUxR0W>|~uEkoSX!|jImW38M06qu^& zFT!PwU{nHey0{Uy0kAUF?kl0k$pb``q*318ME&PFIF#aORg1l!t!HqkoehI8gSDmqDA}Bhs?w17u^_t&#B1upHZ5Q_*jv z`|!n24xXMW!q7zVaaos#*Wnrv2Hzi>y-P+X4$SUG zKA9e(w7enl8ip0a@Tetl#H&+meA+`aIyNYXSj}-WvZekt)y*s8Kds1{ucR;np`f-Umd0t!n3Yc*}lty?+C`;a1b=&Q!C1A_{t#KAL&^Wsk{>u zn-U*>kquNcKQUHxvG6Y%p9QD9^{(s}|gQwE}b=cbu)Vf3H9YtVld|7m^sVIwt z5EKdgqVx{MO+5*QI)-OBJD9&Ty0oTJbfl(Kl6ceH;|!|%J(7)rVy5Z9g$1+6K>@1o zA78j&>1l82!kO}s>O8*dP~Cn)17j^?trNH{O&PGwyd5OBgpT%X2DrTbRnO+0w?VT= z7D19t0Qt0gG?9bCW=!ONYIyoa+QDK^ogI`uok4=cMk(#b0XltCxFaw__6Z(3F1Y73 zT9fJ}D{H^IPb=-Gd4KyQM`Nbf202Acw>aZ>Qy0a#q^Z{k-k!uR-89UFT^E{k(>e8o z(Z1!mCVUXs>aDHKK;S-_a*O*>06FtWDqMT^cN#|cO+|&VcSS{1 z+6jne_AjC7w}iI*gx68d+wH2zq~U;adcBP7irBX)hvj!7joGpS-=% zcah^58xMM|oml1R`8+DJn~EK~^4A9rOq;^~CswYR!!`^V=~RyeJ*QMsO-cEUGEkPz&6qu})(aDN3{ApY&Kfc-r=D?)KxjXx%&$DwBSR68`%c{X>en&Af_n%)y)hjiK7V%|bNEf<5n?mm{Cc*)g9z*` z;;Ge%eoH`R9i6I;^R!>^?M<2M`C=1JIc#y5PwhDX7XL24jnijl32eHZQ1n&4ji)Pb%G5YK#mB@A3kr`-bR@=| z_7yPxoPdbi#W4HJa!A2RUKY*5qR&p#a`2P)&J0;*k3Ma)hUCHGsV8l!`GO$!&vTfb zA!Cql;7c8TP^VRjUQAe*o@X;q-vTtiTUr2a*QF>Cc+{SaepFEHfO1E$1rQ&gPrN~- zV*Zf3hPYY}v0r;mNZmPwze%7}%I@jU_JY&MU&d9w1GR055fZjc5yzb2z zKmNnw7!6`2>q&$xrtkARorzlhiSJ}wTz~+X+g^JKOacXMfrShdWkOWO;pZ2?A-w_F zO?!w=xq?aH&x|#+kO-=7JTa!HL8=-mb@Hs#Lvg7V~S^wTTWv7pA{ld^k@3 zd+nF>-(m=9(8mo#Sj*!PJ*(^f!b==~Q*0&B;HMTEZ_Zh8jq)h*%P`W-^XKucmDrf_ z6249DdlE2Z;$xo%w;Yo4C|&&P0zW8V|MamW237cpj{ zTEF;8c^QNrs&$(7JZ1=U+k&mag!6}I>(p-r+kkiA-my%0A!Pz{`?{!7# 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

    SOPU8HueDXu4OF{+>e$xf~1XP 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%0AYHm~~PEyk@+!l&m@aeO7RKk{; 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

    (l*b1CRuerug4DFZC*jZ4DRrZAp9+pgn;+vyA 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
    4Lvg)mjoFd_WYsJvT63G` z#o%8Mm9>n9`yAo%0T>F3s3jssb{$OySkwoNokkflprncD&R2pOc<>CbxxG|3&WcS2 zA7=S{Xv0=>=`&?YI-0Bv=>1}zE4b;wd+^U2gJPo#rdai((o$#GVH2Og$-B(;ajjp@Yw=E zID`P$V)tm0>7(fRWffd}2{(dhZ^kTC-SjxMUVn>aiTd)E5@PEn|^p zlR5;Jc0}&{^y~)yxwivlkK#3jVY~d2=_yC#et8&fs7BR}Ph->CsJ#Jo*WlFHjA>ko zA_3z?KKjv#UgL(ZIrtN&Rx-%mfq@)Q>Ae&x z?q8Bu+ZASL9w9#YJe%f$kTL<+)`0eG2CvB|<+r9#kmOdqcRMV(H=`f=+XV2zxK^HqEkytU2(|5~FW-iSI8y=2!QK!GIGt?(9kLdXl2&uv7lWSO}G zuNd8d2&J9gO}K&wv^ZYl7sDSPa3%C9;z!*okS{jhr)pWRIa0d z30di{bwHcRT=>4T1?ZF(&JWXP@OPs17|KudsC;41b*r-{E$wHl!ZneLQY{3WtFD!F z6(q@Z<^s${_;QxCN5$=1#K(kngxb^o;`VN^^fOQ4ymvS8{|f^N{cn6$^A$u!_L%kZ7)vSbV60xph|C4FRO?J_!C(5-Pbb27KDX_>+jti8pAf@^y7(t}~rS zov{kzJW)Or;^I8TcrNI!f89Ge^+%|xg4d!Oj`U~61**wkHH0>`mb2Z}|CuaVe6$i> z{bW}7PRQ;3wSDa;ttCw7rj(yney)4{boAQnZQdY)M+bi)iSD!Mz>I}9>(w)!*4M9O z_#Hh{8vn_VKe2G>&_fw8V^XeN6WW1wafmzoCEp_A0uVK=u9b(F)+IGHe?5P8qIxH6 zbVYoMd--OwkKd)1DQ_`_Z#9Z{B5t;tY^HUykyRnmacDjiFo�f3}|-;R18qE7%Ms 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

    =f72fuj&^_@HsyH_i|D{XPP=Tpoc`mhtmR)Tp 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 W2XO9pz*C6leNjgZEm?(UhOVz5?xR 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 z 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

    =(!0)m5TjvwEDBhx2JS6ojyg}5?>G# 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�x8Fo>@CxIZ>FtdjW1pu91xyXKuNOBkn&#A?lHF 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 z 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 z -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

    Em@2UWPFWOz z+BZnE)R9@N6M}N?dDrNB#Z^AN=9BcR_7{F;=E;cX@5~zYh6|$_(KsrT@;>t6dPqac zVb&?aK!|?{{(DmTRGxo>N<2y-n_auOo%4X0nX7KYp(aSx`co8ix0(5L`uuHdtle4F zy0nF;sON{@9)RoD6Oqp<+J*Cv6U1_ylrJleMC8};rDWDhKhb!nBN2slzn}2LB4|2% zsB`XaU1j8K?SS_-)p>Hc_>9B7wTc%dN6xFqv-pWjb% zuHlL4^QR#FmstrVBi^Ux*?!BLiN}2A&S|3%N4 zLYBa5+dXt2pm?~)vOW`3F8&=$j-c%t5a~=V&$G`s>^)@ukVdjYytgMa^!f`gbhnJja-ZV=d3FuLmY>g1~N0ynXU*hms#L6heMDS5O zI*pzc-i5>POK5m}X2&nGe#J)P&1~VljIPqyTz93d(4~pGLFoB6Xa3(q+|QzorN^)G7t1pb<^V@E~!% z6waEehT8`;IMJc?@8ed)+{0ODeD}MQi}pA2qnS*P<4+6Hs4WhaGsli*dK}zpyb=A3qi2y>hvxFBI3sZ@hdeMF?RFK0#x*JweX&jLxW?*K%Hy7ww_|V z%D|Mfl5sA`AGodj1dvnM;+?ByRAmmlqb58ZE6%PtExo>yrNQH??I^`J1szsYQvi#7 zb)}Pk1{fR4JZzKyZG?Hy8(Ozt)aK(3C1W}3Ee#4m$YCtvGZX^39b^+_ccH;Xo-UWD zsk5Ip3?Kb1KqW(f803hYWrp(0ddMqdzi}w*uSM-}ztBtkcfjXB4@In(}O1#9e*xhx&Y?@ zaEZb^!nzDcG7jOy!NDO+Jdhu#3Q;M~`&4~D z)ho51`NoqiTZzBi0gT;SWQ=c766s!@@D2#zqA-t+h=JCDQsrn53OWLl2?+g5y`HI` zOGF!vGPeQ8;qnWJKKiRWu$8xP4#GBbaP8-h#L8uu6be>CiXZur2)!g&-Qyg>;x}Zx% zO7-(S3EQh)4a0XoPL`pM{i%u(t=H(QMkW^)B@idSbiU|+@FZUA;=$*3jZ-O(Z%xiT zDU{onzvMcaPzvrZ%={2~&OaPaB5ii49*x-f5CjV=8i%>}yAUVierwUy{i>Y0?YD>E zrmJBt*_yu;Z!fLSq4}!W#_6FTq2`2q!`*HkY@c3wv+;vdOy@=?7_lrhj;91#5?lO- zKX52oZfjp+J$KnRnkt$LJ3HOGjO@9&MfB|s)q(|n)4$ZZKm8lkY7qa{TVGau(KBIP{VHPP~G8q<5MMB6vwQ$gU85~yKJi7}SWv!^hn0sQFk zAt#bAvwm5E<~xtUmF9j~!4LaQmhq>u-na{~@(Y8qq=zPmrmyc@K>7|Rl8-X)j)Y7z zm;5E!(|shLcE-)!gF`c05DhNB3UeIB*VQ3zo$xMbe1g?K#btsZRuY?&A-- zBLNEwnQs)lD`?Y=k;hV6NuxjX)w#+y%-b-N=ZM9;kir1`7W85VA@Nxf8rcg5GMnkm z30EM=2uZbE&Wdyb33ipR&5mbxp*RfyThPX zF|q(gRxXpMYq@F0jl0)oNU=V+RI4`QDf^08w8iz&7hFdX=A8#~aux?F@MrmzoXp8O z@@F<5N0h*c7FB1nuzzBjP(#;JoDgf=4J99rIV)?E>FRzPv!TK#k_9ySt&w!^H3plV zEXKoHpE`e>B=UCV8GMAlM{>9;B~O) zx7MoSlkBx!i+X=S^})E4hxztikJRi@D8}R^hM0#Xt)Vc%H7Lp^&5ly^C1^WgAM4K{EX|G)F`G8cmMs_TE~n@VhNF zOM|g%9zh4?%0sUp%+mVxK;amcDM?577Jd^^tuB_Z=y#VGxq|DKv0L!~St`UP6ym1VLgv&B8{1#xDQr*s zxvl>_=`UQ4O+E|5X193Lw7-X{ugi1aC?z*NH>iEH$b}=FQh$@>ht&ok&eFsvrB%#Q5`*xsO6^Dog zmNH#0w`LOJ#X!L~x*&CODS59x6}qHk(()@zF~myWv`>0_%cJlWh*YK1={>msuaV3U zG~Rm&BICXmT5&*K@@ZEbN-mIUK+g`i5-59=s#QR%cOY*+wQi!lpMKwB6hX(>s zU|=5h#4Ts{F8^D-9LaJKrlf(#qZIsOu=S<8x^}MJF&zDVy(o?pk;u)B%>b@LIuuc< zUn*E&9BNey+ox9?fcr|xP&p8YEjNd_)s}2r};hg5GqbNSlIU%K%U@U%KY`;zH3I#VsHL$+nwq@ zy~KQR_E=ayB@XJ@AYl&S(5x8n52^La>z?R49_Du$p?v!d1bL?7cVGJKW41^diY2C# zyj2)OfdK851CA}g3s~7x+JZMw0^ex=CJDh5{>d?u`2=!TtPC{|20l z3}KHjQ}1I!GgPj0!|W%r_wu~U#Y89WCp-XmZh1@E=P)xga5pdlU`lKO?nM zY`<-5x_lIA&cL9^SN!)h!=JvUDt){t>!SEO#EVjs6G`N+N___nycfR=`CC(3a5=dg zU})^pi;7Zb>JyUwYlx}y*YC9Qtu6SzrI^x5C;&+$&((Z7IXm=aCYbk>yHN<%7*JX)-FYXV) zQpMab=Z$A0v{XQm*as3yt1b~BoVHGdV{z}Vb;}!PEzNow{Fe5qT>Be1dhq40&!v1CNs;Wb!LKDAqYRU9z1r zp5#M~{@8E_a{9b5RTp=b#!`*f+qlnkLkkR5o#2+3pVel}{*mvq4DUG02okqM^OeQl zHtR(~f_Q#pmcTP7WG3|MZcQjaCx}Q;UJR=245^^7Ha`RNRFBToc3a!IJzfo`NT>qm zD8xx5<)PbQKQQsCf$nEDRhE{Ix_n6gAV-~}e8gtjcpaBZ9w znZkCSUB^fK$9=pyim_FcYh+}|O(_W-Kf(x`i+@OZ$9BQWvfu!2xoNaq+7A9tO?&yV~{h#5SF4$^znl+df%3{G!X zH1=W+irH2wyRH0=T_E5`M5lcgfr0Z~e5#xSE=6qq4KbPu_ih>^z`f73)2`oVq_B(Y2ds43&qk7QoT;ZJ>%vBf4j zfW%xi9S+!j^h9z(S6@OklDeeoHn`QrXsK0|z-1C@{Yz>OmS8dmPjDZ3OzJP!%siQ2 zKPS6@+Qg|qw-*eyKGEvMMmkgd?lzK)7RWiNet?) zJj@(qhZZrOH`^;H9Ev}|G@ydmLypKe8c9_*vVIFzEkg|zpP@y|J`9R9M^Udp=|@1x z^FKDa^JJyfS^)>27AOLS9Ag|y?K8BxW5jt;;pM}G=emuR+eHBiLKD3VUP@Ze*Fzof zr%P@oQ5a7NE*&M1le$r!4OMc$9uCt2K%>wF+ojq(@Ce?DqMZI;(adh?fJy2<&CLCY z-$D*`Vq@W7-ot^m)3*i;QCVZZjhjMQ7eht)Zl}cJT?cl=cS zoyn3yc4~$eEJ*&%up<5RH&BLxgZ@mSc3b*V?YBa)09g6TQ+2<((`=U7XRcW;U#4o# z6((Thnl$boXsF3*38Z=RX1*+m|ECghoy&jdPGl$RSs{f}#p73#{&a%-_9D*r=;iYU zx)RdFa$YvP3ueO&*5rw>y?OG6d%jdZ@mE1zP~QGhvtX6xq($8xf5Iz zPdRYbO9*>j(eBXYW!N(E!G-=X_G$S=M=@5F59zscAv-jE0`+naUXN>cYe~>ZAy4RZb zoY$np_fx@Fr}leru~sR#&6AH5nfMTWNe2wji0q>DtPoyn#uyo zc`BX`g;7^v#YMm7ANnAdb3zxolLY38AM`hYbo}?A1e)enf1?lgz48-etXHYq z3-;HS)1oiHHPYq~pI!d9pY?_RU7gn6?`xsb*OsjGv=YuqG|9r+^O<9ezp0^hiElE588W z0SUYCJX#FN?$Zt4QXrrYC+A_uKjyD9toNH+e=N>pj6=1(7$Iv1ZpeuaDh&sWy5O5! zZU+Wa^!HmWE3erar){FMX7HXfG4gs4B~c*PuWu zbL_>H;DkH`6l2Z=kF?;5X^8Bc7UD5O6lgn)d$ZE`=@cA0%&rfPGn=Ora==P63*d?Z z)bd8Wt@aY^{?)7t_`%KD_v0<4+E=mQyZDsRL2|)7`r)}xF}$hR>L?&%3s+y!9d4co zmfGxQdh;pKK~;B))i z?3Z89sRd0=XwE!lO%O2^K~30xA?!A!8}8w|>EeHLvB655TTN-fJ|nXe$9WBH#)d3O z`)LV&jk|x`J{c<%1-~d3@SgXkePT+2{SNm&V4-Qx`W=1DFGIM6xz@e*>(&pGyR<`V ztnb>mkPz%kUB^@V_5hv@Xp@<`)DSh`F+K(hXjMDF4yfM{LCu~V*Gm&C(rD--x`dm- zXfw&Jn4D!E*cME%@ZBU-7K9<%N>xZu%!ExZ}>q;ixw z!+8*Hg|#MO(a7Ad-}`NbBsaSi_MaYZx4UU5NFqb6eYa3zV3WQ8Yg+p!Sol7E2IlI= zPBgZX6R|-w_}@zSN}I1^HB2~YIKmp5AM{MHu8eumh9lqnoWx7Y3NpNWSxk4D-AxYw zC{>EUJnfD=jlMXiX<4?Rnd{zNxxv)!vb1HzA)wHhxc?)qrTajI0HB46OcOcy5L+tI z4!%K)lD-a|G=mJ$h9Dl?m`3>sKekeEIb(@5xWl#61V-zo*j+y8(M)z~dxZ)Q1C+1qsd}S2P$bcL_Q??6=s$jaU+Z za}`@9$e`Hsmxiwq9z3Pu!+;~MO3UnU-?Ja2V=D8=qG-hVs4P_l*+{o*KpZq*P?X7j zJryb73ejTb{9p%ZQH7M>9H8$WKUdqe3o}4Y-0*i{XR1a)+Znt=;)1AVLj=(99=HsJ zyIs27ohvYA30eHY-GY~>k}u1c?~tRysVXz5G_Wp!L`56@!YK`yylTa*hz*&?l!JNN zd~km4ZYPUpBt_Has4r_@AZV!B0UBO`wwl!;C)?#|WAoc^E{~1G+U)iBL!Ol3R zbPMh=ml@Qq#|G!h9+Y0l8YLUF;!@f}fSZhb^J`u5NbiJR=R0_B?{&sRAmR^516BBR zAn{exE1W^lTvYzPR(ok(!hi{W_Q%H z8D|VL=O+9nG4&)XO#HCre%p;NkwgT2e3T@hbP6TcyfJg>|2yd3|F1}>cbS;Z;Wa}` zn!BI4nDI=&{$hAU7w?rVsK~@;o%BxIgQkCzOz&KK*dw3s)+@L1lzP8T>4mRztQvfS zxa@K@b!_^T<|)6*x5EdYqx^lRv)(J8WX*d-&^D_&ZF@oT$d%Al%Hr;sug!`d>b+js zB%R{QzHlXb@A#Hd}fHL+&gB z55y8i19?QQe14PVQypU!VuQ(_`>KwU`rYK9gL+?ov?}H1FQWTpPh)E3y>@z?A&bcT zTWUJ08qOnf509{nj{i9oAXp@9mit&hIO>MxSpI3%uUC6xZuKjZQ}@rzg}w@>sK^E7 z>R;0QbUeliHT6RFbMUSwTbOyqG`ziax)xA7)pUEoC;I61*N?bY`4`(bB|2HBYaX=o zn156oQEk3DCYNy5(%jGxOq1r{F46V~ zH?u6CrO#oE7g?(Gc{pXEG-wF4!2{*TR(>DZA=^y2)wkiwey%6L+wW6PBB_64-tGI$ z7mSi-@YLVU?N%Knr%<&`IOF7RWmY{5>{qniJ zm%cG&Oaao_E$eazSHj@e7(U4D9Y-KdzxLP3Tk!LzKHLrz1IUGT9Z~}82>4y8St3bA zHiMo)lu9b7cD@1M47RjD>afF!?=A>6(By)K>rPmzEi#Wi5YA%@1r{Wy+Bz|`BThQ+ z*27vP^qAx-n6sD`;~eTGGWB*k{Ldfxq+W|VgOiTpe!(=c{7L!P3{GYqpHW@b|GB)> zn_v64Sp3`T(?7n-=}V5CesJCYPDws@L0aR_Lz|y(^_Bc{L`Z$cRoe%dU&gv|)+3A3 zC;Psk*y8_kc3)5&kTZQiM>3bK(TOw{T(e!O`ICKM_oiGuCVXtndwt4%<3K6d=C?~R zB+e8ZF@};PoEExo1A|jo$%3I%Rl2`%YR=aFs}nD%$$$(0~K?n!KYncmE|> z_-!_CofSQ_KJ<^Bj)Efvbr{8xiOZp6+iKP{mxQuJhV;F<%9z1Y?Rv-LRT-v>??XwT> zx5B~BjmkfIBw6I|hdGQrk7xVsQX4|CY?m@A(^KH@g~f+P$lY@)Ufyb! zm|I_}TY99(j}PL|bwx148=)ng@M?tQj z*CDNo;YpN|1o&RP%!U~>POsAKLr;mS+Y~ZGToAbS^VxNgKs(L-212atuxLgXp6q6u z{c5QH2$UoRMEH-{v1XNn;kWgAwwPvd+FG<>Vc0GinP#J~7L|@%!UrkE)q`qj4hzH` z=^0#y!d+7iyO+bcX3xFPFBfcTx}AZQ^SL1PrTF_&Q5zo<61y1NhT=PEOndfp@HdKm z%d^+*{0%9Jg7eKTHSLJfeFv;64+cpR_3URMPt$8#4hJX5QHUvt;lTq159d1)6Rl}v^Z#Zo@ z6DYcUUg)Rnb0|A=Wa-d$5$)|EBMb4pPk__kjCduSVw%PH18@0|tXc9V_KrH0B>zti zw&;GYe=Ece8Ns*U#XQ%QRM%riV$R*c+8nYR*7&@A`Qq8-KsV;Y7Gd3VD}O5UGWw8V zeCjJYxSM}$KbFf%^&6XKR-Du(Ne)a zU~8VR**BAf@iN8$JDoEPp(m#~eO+#YNs z7=6y_O$qN3AHLz+F5Y}?zMnR4#0Y10%xo6=&P6^}l$;M~*n3!J9+bE6XFTvmex%ru zClzf^scG)DzD`F)PKRH6y{6XJpnKgjb-(RR^X#+kX*Ju#oCvjFcBxMxd=zQn%Fvg| z3x72u`l)N-CAZiTBK{WIA-Te50ReJtn2PC6F)I(&j#t0cyoGQ7QPqj&W!9qiO$L`U z=tI{_^CugspPy{&x){owIGR>f>v{Z(X40dwW8z2S^2O>zqXb1lPp*pHzWUxGSa8R= z);zpBmVeh_KlJl+F@fIg`6oa0=HSfiKM74IMN^ikspoDPIL4NKmHfE=n=s99pW2yn zRkoCa@*_F%4w)hfVuDm9^>XD#BZHcAjEuVGT$N@yslgP7E4!4ad93S?Zk&QL9YBv!4K2>* zbl849!7V}@7AE*%vvx))8~UhME7>irV2N$+=!f~s=?F|yVAqLFzlPH>5-6m3FkFGS z1#?2-xVbZsnN)GfcDwuLhD)e8oD;sJc2G_rV@^2~-msJQ{zh@OgoGD~8xMzHmp7r$ z$h;s&sY7Oe?DwvfTkW(UH)C7e3H*-Jm>n4T)Tpi1gx7R>KBdOMeVkk+Iw_t_c-h;d*AZ~X1 zURP4%fii6${m#r&Y7sfdk2P4{*61a&#PHCmIwdjC6mgVwsmcff~Jo;q4YcMc4e@sUWqK zL@yaT?O&4J6z}3W7h}#uVWad;M@voAxcZ$_*WU3NFwAn2>JQ_7&(7U1-VxqtWWzWCFm-- z>iw}QjA#GQZ7IJT>iltrsGt%pv7@7;hokV}WV@^smF9j?di@_<_h548Mt%7LDZD(X zyMi*yMvL)FBTl<+Hulos-shs;A%eCfSZ&uDn*Ap|w^?QQP-+uy;j>-w*iSs)v128* zB&Qdx`f=pigi4fzvtU1b8+Sh%bL80}@GOc8#WxiFeCFetDtVfD99ed*^0TOj%?t6t((}m!(r|4XAmQJPd+Z(w zkfM`DT|h3HgIm9eoO?or%TGK5WIW8grAg6q6`jSbr@(S$Sh)966ssjwQvQDOgdN1Y z>U9nD-+%wA2dRC@1r6hnci1A9`ASnN(Doh{;kzjhi=CONVQ%ft$qH}*Z5D8@=a4&* z(e74>1x!aqO@0F+I;oO3#0!gy$B#XwR?QiLY86HDXIaPuu2yl-=JW|vc%F*poGkJi zC}rUQanXQi1KD|x&jVTsFXS1#9cf80V;wDupadQ`dPD6ddZ5`fd_>vmM`#q4ZuFN1 z^no7EMVP81^B6DaWWPX~OzHto@EP-NASF(!iY6G$?vZ!%7MvR=4wp_9Qj^l-=CK*) zQVH8lJ!GLkGUe1ebV{!6H&3Fmgo_!ujXL!@^5c^%7ivBBmL=W07;Nh~*}NZ7;A+o&AHx0UmT-9+#Y{dkTTV7-gz+f2?IE995e$`VV-@>Rd60eiynF1;V#m9QH*TIAFkCE^Gbp`u3C3XspFrOfPR0-Y*-m@?QKh zn%K#*T_iFXJl|cz`ZUImPNwbQMo!hY%h)hu#S)nwRo2U+Z#W+|WZaZ|LFcQs?0;pU zYC?ICbmy;IH$@x0a?llG=h}tll8;ZL$<5#%{^2PJvc0fJ2lJlXGQB7pQOtmSKo5yV zedbhqYvR&dEnO0pji9Q2D(|1=px!+0C{KEWD9#r z#Iyr!XqW9D*8xXDtk0{d%`ajEH6^cU{0UIDg!SdmEC>{ zQ>%ieO|{W4^l0--NJVC37Q0*HoU=t(L;Q8O>4!nQ=UyAIN8^D<@xEIa^BNV%2B-M} zs5r#2PA0=f@Gxkm>jizN$YLKv;E}I;6rMnnZxDt6i5IRUTW2FcNT`8*hiR@xe$J9y9SB=Wx7&q$5&)x~;yShY6RSWMAc2e`}MyZZ)}q z#{O+jZFg<0HFbPg#_)adiQaGNm%k*!o{44`pTxdRAu2i?BV1HH@cyHGYH;1?^R9l( z&M6W5Nu+=^EaTh?#axv`B(=+wc`3I{_NVR}u66Zn&hfGp&8p3lyM%!jW^da?Vx|A?3Y9E1>>(i9VM zFX|3DgbWeA(4El6ld@MpptbuY9p&~~kWhSDnd%UWRb)wz1E3*Y#ap@0 z{>5|Z53J%l(yX!WJ2kW(gmmWd+dICMH#ce_?M-=}JNXk81p+@&Wl`Wcb9ozMt6j`* z4awg-5Pm#3M9U%Y zAfFpHTduW)!qaKm2Ts2Ot>SHFdo|d!my3sk5M|i4&EPy(GPEQL7BH^5F~RpBra;)1 z?J%ht?FPvf+b$t*h>uenESo6)5wUHs>Ssk!hb&Ff^F@z3A~C<15BK=mkTThJA%B=V z1Q_m%2KwP^#kSP%pc*qD04U+uNxs{YcBEiK$D z7ENNie~xO&)(`-@cO=7Q&r4{S_G^iOuO&y?fsze1D#>pn1-74hMjMXJbA;yfn+2z_ zNvWbN)Ji2w~Q^K&u!&X2#pgDHlxy)r!hO1Xh^EZ%u0E! zfMEODTd!)7Ijf$0Fo>~xzIJ|Ys5t7C71xplvsu$(wrrK(1s36T8^?$Y1l%4Tkyi^Z z<3OOD4h3C|(}FEwkcx+e|KH^c>;J6Ji&ptjXn$ghlOGsJ!YCZJSHB|PPNVz7j7xg5 zZgb%D>|SzZG+CMce1LuKCpJv$aUq71aSqeB46L%|M=o!uM2ZYwab5~+9TdqO;{*2ks>!hMzZquKr!eqCk@O-%F5d+Tf&!x(Ek4v?`?n|C_TDqdX zKlozPsY8SvbPN5G8fQ002!B2l-G6%e?WcfhjNEHWzx?sspA(yOKQgH5VI9L}^$9IE z9q2j5KGrFOV)sjz_@itt>CQF3qQ5I$Po~BkuN7o?h8hZe^>seA6f|E_;%9oLWHv#3 zEGcl%jk#tv6CxZ#seP;Del~rpSh1i8T07~3(O8V}IVKVF`vVOZSRsLD*X_Xek z6=`^O9OxxI|H7T&lmxRWDQVAprV5ICl&Z#U(xV_wQC4 zy{cC>vWlG{VhqMh@#JL}dH9BE?_jKgH&sZorWt>yEhq#o4sfd5FZ^%?eo?|kH!@+n zNi6Q0=7*)R7xy(1x~R;bDr@FY_02lY*23gw^a*QmSsFeas6wf0g$>CyWwU7a{dpn@ff@ZtJE^@=pXx!HN&(2s;~-zOcWmwSTUDM;x!jJs3fKt2cWVFPr#9fMOR((%97R(}HKW4o-k)g0WBMc1bl}(CQ$!@- zfSaBbG-6>31xc!hwActDL@m7TLOWYJo5fWMG0Wj)#`G4l$;6$fywTgsOV3nGYfXlLG z{@!Ju0d!TN!4rnB$%@KGKD`7)ziCU6hm zyTf))sLvZU7fgh!^5`t)TW**1Ex@xAWz_e~960L&4tkh4`CSi(xnVlWyrW!J$qJz- zI->%ZnqiW!x~Eh8viFz0@bMKLJ0hsd$6cS`7Zo- zC6sP&@p^|>`V7*h@ksWj1fO&!d!753m6s;#zpSiV>-;(40;S!lCHq8=htJ}_9b;MMw`k*gbgL(OCzFXXareN)qUxYDj0ki5jH z_Z-SN@*H~UAf};%bVqwjDk$A8wN@TTR3tx1+S1&)2B%^c+d+zI{38eV3%JbES-=yg zvG|C%oJb0?+j_EG!v8*Z8;J%{goHi0paGMXOtYR0X2Z6pn$24St3e#XaJ`@_Sclk| z?G=8E!75<*r@QC4UCYvdf$|ezwAedWFfadiLG>WVB&H2_z?HPcL_&LHO`|`>JueWM z#zQeBxMUJM)So@O%umz!T|Ckt7nFw z=v>wj5^;O+r$#0%6=2=ksC~JNN=Iaaqvxnh$DI`PK-4J^dzZ7Agszo7yqQ}>74D&j z70-Cl!<%l$`5-4@7=LeQ9-YH`xzgofvUM`(y$j5~?f{a1aY6|a%8_U8PY)jXlwUAU zS$kBQ1RGuM6w#rU7?&ky)(L*`xX3sxras_6>i>}NK4)nOKUoxyAA1Z1a~~`nx{s@X z9Gd5?EKa~_WoC#LS(8cI`jXAorMSOA$fU-tP(sB z`7QuugJMp8gXn7{#ks>-sj)x_+-b-28+eWfbq@J$d5iWp1tWRS z^6yyG{K*wBR`Qrwv821xmNBMFc2u@8URQ0Bod1S*%|}xwv%+p-t288k2Kjd%TQuY5 zslA=bb-&z^3pMhmTtG^!1Ur7E(|=x_VcGPh(dR6>FU~Ai2lZ06zC@mM$izo~f6}N_ zz_6kk+0dpk%ba(UKKttF@G#Y+6=f_T#+~+>-XJkX`7_I0l8*i71Af6X4@7y|tHqD) z_qq*rORv7U?mzmgu=LAiORg{KUt3Lt2dYam#f09-S#0u#TM)u@Nm52!=Ud}AhBU@v zd<9cQUxQp-kDYm~Zq%1BvoB&F+JWJ%$~y^-F<0j#kE$THI?KKbllXlWMSHA3DxnZ`bRCCEZjmXsRx~D(k=8)6>wv)xcH^}YXREJ!j4Jqq91J^e&6dS?<1-#UwB9d9l~-XZ!J4wA<|mkhnA>a61P} z*`SQYUs)+2j@+NP4o%Ku*UZy^#H^GcN>np?X%-;|*g#t5%hcN(%48X?aB)ovS1hv>(bGlO;bSB6S zy4;Z$U{#G+z$!*Lv~NjX@aYj-8$)m<0x)zyY}C_8@^9=|{#RT9m07aA_BZb%aJWXu z`OCfy@4dUQFnoEgraROG;hSu3kj~NeXmKtez7V^BuKi}i6bp>JsI`gTr6E3a@h?0= z6av>j8bSEHN&=9X&;a5Cf~x**go6SNKkKI>!MJTX3DH;dL3@;vH1J?+nIc9a3Yeqe z-lQoXlPPM$u*HszaJHMf%6~Z?^1eP1pVYX+ndzyQr=Dm{-*%$l6`M(tR|IaG!&Si( zzV)DMt@f{O?1Sz@hrM{KmsYo4&Fu5FJzjhAdh)YbLWvJ?$faA`vu}n{+T}e)G~P3A6~%u6etLq$`Hlt6KA;|bX!l^iIkLp`YWC5=t8Usu-<;(Q7tHgb1{aAd@DV74GM{2qM76=z6Cq;Z{op`~ProTn--5-K*H|?%( z+c&6=#6PmyfSgm>meSoWiab0&t08g1wcI#4N$LGax%FOb#qBaDlpz`JmJ6OpVl*F9#?X|WSYA+U~g1=t!7pzC%nvDxwzYlr_1b~Q7kIGp%aISta) z_0Wu|m=pcGx}t{Qz&QaBbZj&FU*o3GZ-*_RromJ=kpZ=-c>tS0 z%yG3`@O`j~pnh(*GZ{c4Amayc2GWoLzZwoQPlGF24dc3SuiCDMt@_-&2CL9B`O}y$ z-KlXq>pb4ht|jt4aOVa*W*fRDVOc};h>dXp(=rirkjxBGOfbH>12Ld#Fz$+j2p_O( zy!}1U+P_S!xrZcaVdNiI{OJ?>WQ6dJ$}h=8{Lx7WcX2;-Wi+R%8FwHbUemgLW`rSi zQ^@(wgYz<6>*9Y>zSh1mG`a=ve$RKKOiWBw3>IzuGAi;~E9$tEaT+}mi!X<(r$YV0 zD&y4E1WLwx97N<`Q0?8up~pR5V(b4}qDena|L-f$JrOPCvk`^mXCtO@zz4)bm3Ql8 z<}T}nUkA@Y3z?vuM?b#BK{or7>j(SZXCeX`++Gl;B04XU&xD~j%1)DHR2!%EFgQAr z!csDpX<4TLPVtrV^nJH|I*L<1F4*ScQ?9u;_5SDr9^-=9U(~;J1evINf6$(@B_r070 zi}4B0dy=@~@Im*n&O(BW(Ef(PT-u8|cVEW*PUox#{M0b_)&+z)zu)`kZU95YuQGr0 zTOLzb=|*zt2=ptma_qirpk0bU>#{$-Gt?~9{8+8-qt2S+(&|IhtD(+{N7k%&pT4Jv z^bT7!%5unYKspvKNN41FI4r`HM8^JPG{0%>4~VlO`o-i_>ix6{?w4+v@I;dynB=ff zO$V(JlHq8w0d$!8J~xFI?vwlt9(PM0nMJwkcB8-lG+H4h01Q%L>DLcSGwb^wY&kqN z-zu5=K0NNo*v5HLiU7YoTp2!bz}E%8f{{Kl@7}Gxcvyynm4SQc`=U0 zp9e@GaBkAU0$_gN?(-w~DRr;Ge;>z;Am&`!aP73u-~-z4tQ&A`?64M!LSVjJHP(C; z{%(HG462i6%3dB~DPvmOVJ5_txvA_;P8znsz-PLS{U*Yb{7eir|j z>vv@*q;Mj0|Cc}G0)g(%GdI0Qy_!9r|2Y0wDKlXnJ~Q4oNesIm#FAU9@jAgwTu8!? zgQUe~bFh?kY6_5YG8@%O)kic*z{L*uzsWW6i&4T?eap1S5Iy161@!=$` zWuVZ(Sa6!Q@F7JBo zE?d}lwO?OrROee>cHO!JqsNvH;eqhuzCXo|UqcRJPaoGgo#iJn(t~A=mbg{#pwr5z zetYxaF7WSnS=>L)TU;`eLoNemd%~&CT{>T!v+ZXab*zF5t zDm@%`9j_>P@;gC3XzCo}w%akSc-oJ~5)zQJH|D-P6A9{%Cow=Tm!x5HWLK_F$?sGT z@kS&o4>uK%?NVUFfD|LLOSgdBH;E$+kuZ-3?C8mVw=alChna%iead@A(|Ljk4)gnE zT5yAMX3QDth-?{J310E+vae*nJPVYj(ZkE|1|ob)mOYN+O{%q+Z(hN7Y=rD^N+7bU zD1~MaH_8k5v_=4kP0!$>-Nrn&^1+J10$MhN?oJ5;hIB$6N3t{($vjc$!rgnyRdn=^ zKq2X@Ot`W2_=USQKU5uOq?37eCuvnTOqy_?`XWcfW+REPd1;px_AU*SUEW?Gd`OyxhD^H@It zSnV*Jrdd}{2i?f`zFFT14=UfjV&p5Y72QG z*a+V~_(ob3j@kgr!a8uY8K%u)O(-pa6uCe4pY56bf2_`Y*lg#6lPUjYSZZ>7Tvn!C zqOdlSe+#@5FBta`7xPp7U#82suvkpglH^3n9yWwthECcQy*z7vr{sry^}NT@tb$&9 zXGpqO!|vEy*`E;x-yP&b_&Tan*|ooD?D(~{WFUGKg74u@4H*oUJ&xz9dc7= z7NrIm^r{2GOrw_2!yg!5UG12*!ceV;Jxj+0k5buE<&Q^S<)$}B3N0f_V-Z0wkhhLW z_&2wyf$y{6kT=~d&GRpqmqudiU!Q2V9u$dudfnpnWv36k+fh(Z=Zo9RMpBa2!xjlk zDPc7wT*j0r?^(>a0mRi0D0b;O52MDh3*q$ z;9hS6P6H_haznud+BY;=_aC^E<0lv~{h@ZP2p$005o!<2^sRP`@^8h+C)m(tb$ZDq z?YMuj)G8hiG6DB3#yRJlAs9z39k~cs+>v9IWo$*hC`{CtrQCuK+Zpm0APFi(01tgB}O>poz*(W{JX zV=4XXrD<@p%qi?As)I}q9ouaXul#A+wGEdml86IW?m9v>+I27VP{|GPK<}8-4LFyf z$maZL-OI2EX4u4`6<`F?V4iOu&Bj>a@7vwM>+3zp#EBn!cux~-F-Y6o2%DTmePtS9 zkXv9j_^6eA^xxz2@XgMW8*8(uh2}4RPQil6U(c`b1{@E(r%#rEqnU}+V~yK}C9??* z^h2jTYYVW$60i($V5goT;FbWh0MuV!)UPlrKYL)C|p0A#^=y5YMgL8=M@$OB7TDyU^$pKxuTTPdO+wQ58YvQzBGL5q9wTG2f-;^$adUG);;*pGU=z&dU=D}PgHSQQr*(tm;#~FgXmV04-glu3EkfWlFS@DY3+?(`x^x~ z3gZ;iX9lJLJI>(uuA#;Wnfs$>HFh*{7d`ejJ`sI69N>jI>OWuyDPdj5f3~=Tdw?&` z_!s4IHqspZZ#7jwzD+8O>&>f%|! z5_JX#uN+t>5Zw8s^XWlrUGHo$`BwJ7v2_Je91$Fr!XLXa(DK;CVf^xyxgSzD3j-Z4 zKYysmn;*AH3YZVjyvz~qDRE^m?QbAhq#99)zVCTr=Um3sl~VHr-{-E%<$sM~ioBE# z$12?7uVQ{zyyvXsb91}9MUmsWb)&){pq+dZAC^j~M|u-~sHgl*4Fx(~r$S)^SAT#W zN^pb)W@NCx(&r+HigMozT(&6PS9;>kbfaBQ!nf}Pf0Ay;~) z>R2Gkcv^V%CDg5VIQwV@69FU+3r1^D(H5fSe*l|%$L~oJI;konNXZx5rwPI-IGO=c z-?n<@d?n}RXomV(XHI<(zdTI!&_R(MR_V!_l7MCK5i(PcCw1!;sFr-22UOFVm4G{+ zeFQWaIDXPFJ=-!WO>Za0K}pUxApRT`dEKt*b6-pI1%<+zKTv@0K=S6sSy5Zzh9E%T z%HRuG0`6wUi?a4efcVixNN{-TSNQka!U8W92aIr zv@y2pZX&}qVFgvOp2+Mrpy5;D_uq>@9+82%PpwkkWHdrO)ZwG2`W&}3nNB^W>KjxU zt0USwWYL3`rR(JNrlC35DH}yt5_WO$)6G+JKE~}h_BQ#EOdw^8@TEl(frL~?1IdL` zYm89$C?7cf^hT;ZPC{%BofkmGSAui*p;5vp9*5Y*-9kFhC(N@G;E`eRlHe{H!SB}9 ztVmdil_Iq57+WhdkrM%sifw+_`PvCi3W(?p1ggKMu{;pCf49^vmcVD+LEWjXmK*y! zCpA7YyMkpKh7G+NmugDYE{LEKwM=V`P`US@z-zwiHA1$L^N&4u+JXNg&Mmm;_6XSi z?_|`1ru)z|p-ieOASJWgOc9!^0w_dM{g;G`?=zn~JohrkN05C^4BwLuo%_QjB}|gV zR*+c24Vc}XSCs2ZWz%+M9r6WO_a1hkZBI()M*mjmTwy0DP^j$(Dh3YU%ObyZ4zL^^ zW&X}=T=`DPW^*;tLEpo(An|b&8+_k1r^P4Z%jwx`kI(iG$vl5@jlME(>95t%LhV^b zMJH;SI+bDkk5r^9x8jwu9S+v%Xja~04iAp%iCD9+QspBzEHZCu{pe>Kavu8?e_Zmb zgZ<`ijM5WFvy>MRYJ;z(3uz(mMTh6glp`KfxMQf)wE2GJF0iup8v6UF2OMA+H^vAvqS9`AnYZGi^3}(rq4G;4 z+}L3o=yEA(3+I(=nX?iGqld#;C;UEb>}>6D$30DaeqXF$ zCU5K<&;p4SjZHuvlB7MT-TML7F}KcNQF3Qc-ZG5(PII4rT<5m8B%hotFUH% zGu-G^cxjlzRO?vLgp;hD1={jQKRi@fkc*x8>{AOK1m4Khv>875SLJ}!JF`9$XgJk(913g}+c@t2pF3y_tV!}xv@|M%K& zb*BC{^UUnHlE!W@hC8>9AV9oX}E`jM!bsO(Uu5AKgZXD1~Bcd&I!Fa12(TkE%&Pi zXWnSrx$bR;oj!N-RH8E8W5OMM0|V z)33yhoiJS9Y6BuA_$iv|?e=u%akp4j5^V^+*UZ*jx;4uq_Uj#_IlYVw*Km|MggC%t z@=J3U`W~^t9Ovb5I6D4rMU&W6hxWo{=H8)SDO)pNoi)Bg5><4f6L>@JTb4`wi|O4@ zzFixoF~w`=E@&f!=^l>R&^UgUHQVl*lkArn4ME913ABiB@=cf1x)!N4*sWyydQOF% zFaC|zMEK?hfl-zzojjqblGmJc5U$Nyv3i#;cqCP7@|n~wTz;5%UxUPwvK8~?>uWy6 zbp2V|#?0A`%8JCrB#EIRu3h*gP8oHl=lDJMg^FupB*j{myNAHeK!4d_AvXo~6TNc) zrw=>ADA!U(U;1{$(x2odagT+opYglE`V3kwwHe3oh^5vS+&iAIzNoh8e7;G?RHy90 z^gjx2TV@^wo#f|lNdRqRomzo;;~_B0Ry@MU z%;Q+H-?IsU{+E)MdPdrYEI@?D2+!PhUYYzI_N7^b8a!x zl#+CBuSEe5o~jFakdn8e*yE3QlJk5MOLzqfUrIEpc@8y?f`* zmEKQHoUgDq8~raE4raf#9wZDrf7Zb=M+i`f2p(4*O?tJrG?8+T73ZGqb(3rKkx|ZF zBF~x#`BP#3UaJ34$Z(R;{S&sVA*LtKPrCBv z+q8Lo%7J#Ldo~iUt>XnQ%|3nn?cptlBmIeO@8^#lIWzUxQV}agM3C}vUd~ZMf^MK> zR^ET+yq$?AWIA`a8ejD6&J~(N8LTPhf_27tOW_YJn*{d@a~WG3hix)R5UF-IeXC@*{Fufm!TXKF_% zVAH9$){I+_*A;bH9k~swLKhxSUDkZfg6v%Epu;aEz8ks=L=yJ04Hip6rTpOsbv^>W z&{t5XI62A{L0r$Z z0<>MRmyLF6Ofdxg1EMn-^#r$+ZK{S~44TmbJ)K}(a_W;c>V}j$>8@AOdg=-Fp!Vl9 zOe2F}afSKc4xBIBC=dL}$tC~rjPf|F^k3qx{uEz_VgMDr4F+>OhdP%$+p0WuD)Vwa z0x}Xa?VR#gef~*eS`er5a@;W8 zLloD9d;CC2tIwLpl;_r7OP%=TC&mKj7e<^Px>Ya~KgHO@0b#@6~?wdx_JPYn$C4C^C`Fx6P6sa2(36?cWg? zG+FgEj>=B!?PTtLF>8IuEp0rxj!+R3k`(0AF7YUS+Sw@0bS^IK?|qr!w&lK{Jzl*L zjPlCR7exJjyHSp0mqd5F zGA(Dji>1YNy;hQD9Ov`xoT_3ixbp@N-(LD9WE?R5*@7wecURO|92km8C=EVSAZ_uP zt|5)tQp8f>p;0R0WUd;zn4@Jf*E^=T18e4SMhm9|95d3N*$RXm&R7to7L~Y!;`gm}isyO_!;Z(#(q0i_~`< zozfD0uI*^Dy5;m{=gPQYDE80|#{|SJ z_~d9a4^x&@yY$C}mkDn!sCC_3hl5XD^?o~W!fH+PrpK|LtP8?2`0io>%j*U@?$=zZ z+Ho$-{EXDS^Fsxt4CZq^3Dk3LV2i?wsUR7<`&>#jceamG9l{AAKr}*%jPr{h_i*3~mQI!%PEJ=DeG&S_o3Uw~gBK^^q((nVA(=s&vK5$jS`F};p#W!e-*9F}Pw8UL9qN=`Ei ztbL%OKkfoG?*Z0L;;AEg;pJZyjSqC>-{>#V9QJsu7m)Fw_hK!x4SaH z%>sd7?4sN>dU5GKG|sXS2&B(p^gtbDQ=JY$OECLs76LcT1hh#np(KS6AY~JaQ-1v> z{NB4oG>@JPWNLz&KN1aAK^qu(~(yEjN zM{kwH|2BxM(y|)WDUFE~4`1q;Yuu;o@6Fnlt4Q7PGj3S8d9H1pJ%1%Spy_mgLin&} z_tcdyuammBX(Y_pMbcnz!T;a&OcxAnUFBgU5Iqm|cMOSC0e9!{2epmWdiIGCGI_BY zsmua)Apzw)o<#ohv_#1D&K*wr+r#$i1_?Xr>__%Q8=u`-;&@y6@DWg4)$KWlkHSTh z8Kr-;)#$<_W4y#w4#}3G85@qIs{C#(jO@gkhTr-?qJV-S%`9qZ$iW4B5}Q&hgt-ytyCrC-z4s{{@?wiCRDFIGixr zthettqtmAwT~+K?aK~^T``l7 z?4+R+(?vVeo%0xa#-ciyw}gJ)Gr{9Tjxdu6?v6OH>g`l6!-foGH(>}8>~iy&bMm}r zQ2g*!*f!p^Cj$O5aFbzAeg^f;CpX+Hyewe1 zg^rF}wj-C+hp6H0dAs0#%#s8(Y9&Q^Z)o7(SK^(I>d?`Sm-|wuoFAf}w=iZRrO1=> zD5o2*dT=XK7w66xNPWdUNg6xJBQa1ay@2L?izM1IH=IvXS2v?(pn-5H!?VSUXehFJ z8MM!-U)jF|sg%ivi$X7n!YBipN?tl24TYx%e{_Zb;!tTf@Tam3_8QYpttIdveB}Xs zL$p`IrYtUGh=P@=iG}Mw%gm$M4XyzM^y}u^U>fNDfpMe-C{8hB813NWM8I|RJIVZPDPY8$-Z2rvJQdVJa-na+NGS_$X+kqG`P?hlL zlZ#Hbvz%+JxbtMUhPS+QXt7)DSe3Z_%eZfGTxcQ7H`5uttT&B_)t;Bv8eaQmx@VG0 zJKugZ67#{?PedH05%!o88}xGQ6sJnO3jU5l*>bG`BFy>N+OJ9_X2P&anMa)R2Ki2@ zn=i=eyX8+L4Wepk;?4hK34BHjMvUIuf7RX)gM2W%`!|B&`^so9k1f5e*$XH;2(_l2 z%n1Qm+O%ZMa_HL{wv;V5kIK?QUw`z@Jij9NJhiNU@EX%| z)bs0QK#ZKuBhMw{^O^r3M;`f2QgBCaAnfAFM|G zZ-chg4NfwUQrug9xa&f=KZp+mq78?;JhpJQG~S}tusS_Rr+TUfn^jQu=V-fDE21B8 zt=rnLuvyW9g02_k`yDqYb6d&B7W2NYm_5miKrxWJd-i7>$#L%QJPN;!sJObPbFa>N zV}Px~jL*NZ#&01ZGS1=x$x;3~Q6HMRwSEr%5X%GSv1?G7eLJVe$s6F<(q&X0Rc4lb z2PqlENvD;e20n_*?4|SnyEX+2b*O<4q>8k8gE$ORM+}Mcz@GpseR(3y-SaBC|&c7rdxYtoTtNj zX#&H<=N$D~x=VK}=B~?zC{RaMp4qhf9)=fUM|S25!0Uzf%)hYrM{>duGQfo|B4$mf ziI5IQ47v>~;Hqd))bUDCZ<4O8-RY0^!h8fOe7sJBEl#DaO-@m`o+)C*4JIW<%|%vP#!u-^;sp${axJI}p_1_56%8rAyWBmIy6 z9qGTKn)l2PX0AB)gabQ0j2d#(aGKi|uj51d*?-+H2P)j}Kw4Cq1Kl{CRTxn*^n!D-y8=U5{@Uyg$vnsi7 zX|%xD{P^gJUNOCXDRhgd(L!h)A8zsen=?1NLD?c8_X{t091FxnW;d2hV!;E$8d z?qGdyQSVwD{B-Grl-5aN+)E)k54FrwT-HL@O05{q2IgIj5p&D!Pr78YBF|s`;5@j_ zB5^@G8xu>u;lGpW)*~s8O(jn!sH9k?ijwjbeO{fC5ZW}n+T;A}E{j~oLeOZo4 zY~Tb;O{jTpKT$5IGe>wdz+9+l-}7d|czIg>LYT`V?_z+>rr3NAkg#_BJ2-74*r{EukB7O_lb&hioo&7yQTPQ~C1i>=$uU~Fu2vv|1x9K>Tnt-~Z zxIzJSp$4FEGK*D%Uw1BqeW>=t|t+hX5V;EZ> zbJNBt3UiC$Lks;To7AX_ejUXTW3FNFBG0ioR9wA2?N?&AYu`B8mzhXq22z+~4QD%; zscHoslF)KzQwjwqw4QmPcbbn)fG{!jn+Na+;6 zr`c`J-1g~u8Hu%P$!4j1y=W`XbbQ55yHnXSB&JeNERL@oJw!c->O5_QbJia;;$WF zYgK&PTL#sezAJs5mf&3kb;pW-aF4jGh3#(i!P!n>bME6BvK5Zp_B5F5ai5IDNYd4g z_f{}KP38H*^=no=?#9doah1cbOTrESJw9Ez0sF)jHAd<)i*QGa4Y65KR{`JBRDArk z%?6cIHK%y_2JfXr2VQTAGIX{r%!RSLf_B$#ZSa&1SL%OJ{@n9-N$uKC(@gZ$(#$C( zuyiC!91+tLR8sI;wQucAz<`#uMZ6|gwL#>7hQ6_`e2aiM0ewz6_XZKaM$(%{ojVo- zV3Iq*WT2O}2ktq|%0cN??Q}O_kuP1>Y@ra)1a$U43MpY8Qv|zwZ9rQVw@&QV4ZnWQ zVVymY{hV3?LLFBRa~F?++hLuC%a)Trr9AsixC2fpZ!C1F;$Hn)P)P4#W9MkLckF8j zujW&(t?LzOA}VgG6Bz7Igsr6Q9q%U7EvP6V%l+0WwvNClrn0(?cOT^7=bck{TZ-Tz zM$6wD3Kq~UYPR8ZD1iByc_$n=sTaL#5z-N5Xj1AG4(!F0FMKIo;7YTK+Ur2!bnu^h z?AOE(>Smch6I(s#{B(90K^S^{AaUtfNf-z0px&{P44gJY%95q@=#2_04tJw0rH_RG z9;M!HPXug&C?ky!9?Sl$8+8jX70yT|qu-T>0POx$LzC>hdPWLL`861=tt>1SVHl?8 z7iE?2Y!cykzF=aH-Chsx@j_DrY}^(wKld%iMgyX0l+Iu<|r=N~zsDLSJ8~uqi=2wemi} z)MTV{>eVS^C=29UtbemdSb7wcclA$nQ-rKX|LbAL-l{SRoUzOHW|8E2(41bfds;o; zB0t^Lu-2#Ph@yMONzzZDEa#2v{ao=GNmmZwrYC93Jq2%!D+Thj63r4E>|g)pO_Ayt7!${@VAF{ z`mDo8Z$Gs0!qAWr;m905v}zMrq996(WAKG7%)ZIHcQ@fIy09dk?zqPWoWBheAPa@@ zCTxrl{2;0ov}gxPB?DOF;VSyrlWM0P1 z8Ci-KTPAq@GuS176ooMkh>qy$OJOiTKNlxO#(|>J3vow20R68PM3BM7Ke0X@ zFd{{CqAI`SBG!YNKuKYEso|*uGkgmn(Ausl!kX*XA+tX|p!y~=x7wz7GjPiLHww); zF^AtbW#aZuJb_?!aL)u_-BC9)3q+#;S6g0$`);Jl!HCF9xkB{D#flzKd_z(e{qM)f zLt~HDg13;0eZ%&Yc&8(XX$aZ?=L;Q_Ii3H082R`2yAvBT8*qOFX$oG~o@lxm>?J12 z6BV)b+Kj1lY<^^5=RV|_?KcX2s_5m_i3xhyHTEDrcG^y~TY1H6YJfNsZ*!n%_I!mc z@VTV>`r<27W}RarU!PAu+edJtly0U3NS*JCZJU zN$Cc8G6XZDj`!ro(zu}u*c~if>At>-&6tJY23pSYjM6j&)j*TG3Tw z&n&63s(OARaH<%+(kCx|RPB)-ax%TNEmBoy<-eVMd<06T|+qNbbCfzp;yA@9N=J-a8 zDl2TlQ@2@8d>qu=vr(?qE_KyP`dal}pFxxo_F+oNWSP4rwcE)}P)zsm^MbNNU$WX^ zx5J!FwX)Y9>9D;ne`z2D8NQ>UbS+z9Wu{fSqU6A+*UcjO|5C?7U{XRpl{v+ZT-Z5GDaaE2S@*t&>+1>jIF*U9n7%CQAtn;I|nhCju{_!O;h(7yy^Ec{dj9@&nGmfiAzo5_WYvq*})A zTy4w4C)?^OkTF}e8Xc&Km_%Pjc!`RTYPnxjIK)cKp-k+2Ti?KH7eAhXi@)|z;%4x) z8?LPv)881myr5TZ1q--=*>2gn=BIvU*$(D4HZL1<(_ zv)KLF)n6$T!;!E()EowHyNQu_SbCt2FhejNeL$4`qdATC-z3z3hp84q;Xz*V>1iG@{05h zvH3W5<0`Z*Us6P0&T^(#yg<)@EZWk8&|exKBPe;G`G1S2-o2fY|98bTro$9$h#HfH zC?xXiw&xd~Y_-iqMuWL>k)0E1lrlND&H~G;eAK$UfcgG&$GDi)cOIv^dwH|iU%7aw zp$I3Fdb^c5%}W0a0yOhu8d@I<}&dyhUKTp(Ue@99ZzVK^2&SZy3>XutK4!}Np`FwIQNf_w zEBkbi!`Wt8iO-qYhwp(-+LGeL12d}P!{)CSi_fowzM7^p+hWOP58$7FPS7GRK9W`C zQ_~9}tOYL~e_~;y@_;Md`kC&J-v#4&HB9fY3ksL+L5k{QGW{SH=T^;s`v$(PuJc{o5m1+`s0(ss&~w+rx57n zysmXG_H}fR+Lro@uNR_hDcRyiw!_7F{>{LpH-TKzA0)v5sW9rsCnFNTN^4{*-pSAi zGt38TFNzV-Jx9Jb5dQR1M>L@wCQ$s`b5MO26}!LyAI?lkp8y9DhZpyC=w&oqAubDF zd}v@%#@`kNu*XpX13M z90{hh%DTN1u+7LB15n1l%kqb&Rsr)-=;2-*8BY+P#w}p1je=m-nY++)FzJ~!Qd(GB z1a6=tX7DFGL_l@=8w(iE%vClkz8C;*iKnb7Q`|)5j_N_>n;S0H;L#xIVpXux(%Evm zT+!+4C8xivFC9L>kCAO}B-qCLfdig3{KO(8!wIgQfPa9ii2x;;>fzgY9<1E4@_3Lj z50G@$?&`N;F_-N`>d!+ykFP^RF^*)TGrBfj&A{Nk0KDw#0%DZqjv*|om+jc27Y@cp z6(En(b`U*D8)*&k)?q&x7Bbz&!9rZ9(YrlhKuY<`OvJQsjpW`;MG#fhxyS)7lrIno z9~^A}ksRHBl?Wo$K}Pi4;}}lhKgFKHh6r(=RrW3w2|2ONh9mR^;%Q$bhXgjfoGjh% z%}2EAj8khNYnesHjAR*u2W11wE@X+?vXJ3Pt6%T7$zAG?a7GxtEzA$YGE<YhmEoEg#XbmWat8oKvq z4zBf@-?_?qvEo(5Ul�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
  • X3_BKQZ z?@5k!TlWA9V&$HCR;$f6Tww@UN?0Ox4TvzA7U@N#=;%Cuk&O<=J?XU|rhd8Vat5Z( z!^oLcBVOMdXth(Jw4v7m_ToGEl0&$z*NfsGVcYT!(|8t`w_aoSx#9jE(P!Qj1r6hD z;z$Uc{xHhkaD};Y-pC)KX@SqQ{oV0<@zx{?I!c>Bil_>{lL_L5C~v_n*d!;gr5sJ0 zS@3-cDbWt1Za~rR18*OCZ98pfEP7!szijS8-hhlNEnu*m?M78P_bBbdf7S1+)qA8~ zL`v@A($Ufm^yh`iMMN{YW2T4uXe2BTM5eQfy-xjiF?V~&)WroCh{6HrS2&4O{S~Cs zi#_%2n+N#o!~3X5|NW=NFb{i-yZyw8nz{eFv1L`KuzK+PMhCH#tcon%)W=wmRgr`j z4#T8!+qo{ZjbSQP*OkV5{8JR)nl3+QF`_9--WGe}`6T()sOIK?__w#{*46M282j}t z!WKw+JhG!P36_CBHC3#xOHY@tJQub%Iv^(BSEczEuj2P(&|6u*{=ZNS4W@$`#v9=6IaTb1=AM+nQQf1q? zqZ0PgTMwqR+0aYen~}=*^E&#`#@mZde1G&b{PS!TjnPHmQrUBc**n^VryA_VY85XB zIyqM;$@>be4+ANRK8?yw{uY(ZwC}&5FL>){gO~K(^tml*8*j~Vfd43^{g)zkvV02r z=jyD1ulMCXu`rB$S)W*W`32W!c*R^mcCfIueSr1&`N2W!9W!dmr6}W&fisU6!o{M( zwQ{V~iZ?`MRd}zRlbWS(yYA-vBCBj;LCf_OBx-q)wk_rkIajs$Q79Rn&NBCxvRoY9 zBzrddP3pqEYef}(0cvCGbtmn-J%W`C{%;bRwNm-@5k=_jiLU3#6W0=6Q}teWYsdLG z!*%Jk$^9~~73S*w9TV$uf}L|UgF(P0^s>*@U$ifP{u!ktXmnOYh0}N(#MZ! zAtxrjd5qtwG+Y`6JtmK@{~<(_#WW*@+@&BJzu0Q)ly3xE6j0ysjK#^`Q~{)RH}8P4 zqUu3!@$&lo)dcE3!tQj!``Z&`^w34MJ&ejw-1hLuQ!tMgu?+W}p+}aq!TQLzfUHI! zM3c6Rbld#$fLM;H2T8vIGht9mX|w}_iCMis4(#GV#6lM61SnDaURlX6twme;`X-_dqk51N7V+Bi;@PF&S-vM7Zz2y%Ts1=pII$m7 zYtoRbA}<&W6G>NE*06G#ViXU5NVGJ;%0sMi^C+04+J{74ILVI%(8e_#=qR`yF$n|K z`0S|9wd6tFj>rh9;04ATs)6{nO>|olTvUbc8z)|jG7{C1z5Z_DKlQ@kjdm48!}&+M z*+=EO$HW!GbU}i0>!lp~3m%!A*xB+fqI3-DRP0VUgXqrB9&!fWBoP+szm>ur4g610 zoX@RZoILT+Q(+pOCbjZ;Z=g$$K;f-gyroyHlyUJ^FDKq$1acH=wa8EA_nW7Pp||7U zjjC=Y7kNd&BJI5x%bDLoT;vaN<-?ysRFEZ%F8#!_M656oZM_ZV#$$6zk_>&x9sO1; zJr)vh`#Vt?^XEngAa5})3fZw~eGwT_NUNTVl8=$ODOnE>*9{qK9r{x`s>Xol;oT*e=>eNUpAp=Kr)n0asWvM z<#N+o(t7)ToH=EQ%_jX@!9tO$_l|`}*TDOwCX<_@INi2C?(Tko${!lPeSJHMNF8sUN!S(EsLOnEa zdZ>XXu0@WHV41QjjVkk8(VD*n#gEoR0+i%-t?~r^{HxXS`+aF}|1u-7vFQPLDPNgB zx(6))39cXlrF0iC-Cv&HDPDl*8~fb=NR;(%dY#@9D(l(tsW?SxGoVSAj7qLz51YLW zceFURBmnW!EYtBeO|iP_ukx1h_uS+ScUg$OAvu(N&50Rs{t8JS?MvMKDWyu#N&LRI zyV{bx&vN_a>R2C}@|RK72hLX@V|Xiv`x(}7WOm8qJnBDgu=+{D0gDiEu<8S6ry~lu zGX6U<`vo=ICKvUGJHv9du|SSJv(=$E^>Idn#OIZAaep3}f?YG;4ZM4OcYm+1xiOmR z5;Qu+;673Jbs2{1x+G*o9+vb$4@VWd-F2$nwrKbG17Y;cqn%mM<4*n|*RMfn;20AH zt8b6or}@68+k%?Y%>ZYBE8OqG;)l3q3+9ng-nfu)>7Qzl0Z?<-jV`~G3XTRZFe*3G zgEhmF0kI3(n9_4mySw?ZynZ4100%KG#v%QZ#zEBwP$);1Keydj2R zA%xv4H6P) zX=%}g;a!Cr%I%Wj+0it2wAt+z5{(jy<9;;Iz8%;Kuy0(CNnA8|F$PftUKPW#LB0j&~mXXCBd z$}qu!wuuZ^|2VzUZ);1NqvA8|rsTM@{h!-jqgK}@ZuoH&k2Ioj?yY8%&3S6MBY(D3 z%&b~yJu)^WyfHqhbJ{fPvAxU)o}Z)8(%ayY-lnrrf`2GUwCL$V`0-gxmsycp{T9oDxCRD%TW!l>1a<0=Cla}fWpCH7p0<@9~<#*4)~&a zB=X|xL?s2s1J_kYjQgH&{WSMtn^Et_+!?9uHL1)l?{?r+IgTZ=%Ur#uMKL|@685TQ z*6dx)WJqdC)l;Rb8LAgX6kR{l$TwR^s3m4Fvhlqy7mScz5H0CUNw*}ED7Sq}WdHnu zDRY}%PWmIo%`~va>#=_7(k;^B<=#6}4yx`9!YALAs;<_4zF+BEIr`*P^24&^Q+Dl$ zg{}?j#pINR=$U(8KP6JP0&58yag0O?CYOJ3&DsPgnzHt9PN5~hWsU;G+R!t7fCEi+ zM3=?O2mcb{x=wrQ>?hA*@C=-ll7ERb7MOKBD4`@W+Y;A_{4%)x8g_fuj_E(2-u@B5 zeDwGVjda0{4b)P1pq6df$08j3L+*X(b!Az$OcFv;3t*+1X<}PWMJ!_Y*4L6&fd8^= z^cs|>=Y~XE;G5%$1@XFTjyU<=t`0ps4DN29&^A& z(R1*?-n#=`vT7-|CyfpTu3RPB-$AY*Hw+Ho0OPxf>}16i$hmG0{?Pm}s<#`M@Vpu1 zxtU2!JBaF{mJP(+Bx!>)%w6cca}=3OjrfpN7KZfHN$h4cmD`q-VIO+;@<=4WR9B|h zhRn2gxY+>@rEoO!@y`R)uwf@~!QT|*2sWnw%aLE!f~15G;!b4o5=KpP{RKV%uyGQ6 z7LY_YdN2%X5^9MXqj z!~fOn#PDeh$@?T6h;>3KkEcq8;?9qgb$XpL?p*gtckpA1JDB)m<0}IcwAJ2U@zPWo z851l1&u)#T{m5A4=AEG$=zx!FR>`RCdsKuO}cMj*M~25LpwV1IF#X6 zSZ4xKS*TXdA78ZzPG`6^~SU7Un+DCz<=#PI4)0lFM5z-3-Yw!3q89C-F3OS&pqr-9&#JZtPg#qC-AMxl} z&9bH{;Ct&RVY7WNEFWvW>Th{5*I(#z9}+gYG8b;ue_UW{11eCfPV7PAIQVP@Ax z!Z-aBg)z}B4x+Jpxnp|?`hL0jD*Vjyw*gH2U@sZi`vuUfVT7sh66_!<>R=H4ayarH z@nV%KX-1OpUbM+Fq769)Djy(@g9j|Yyr5TVif5N|&j2n+BccP6Ie&Y@4DKOxoCT(8 zA(X?s(W{t3t-5$Zuz=1xqSF;f_tW$4OVEej)=)gqWeN6%1Nf32a(q@QVxoflj zDv~D@@Ay`<4btU?#FvZ?>AoMA{1w~B90@HMy+X{jkP&PBo+BO!@#<|FCJBsb4S!rG z?jGt*!UOQFN;AtL@y;$Fjs-8z$#OZ1o+B5OHObHoP8EiXn?*a2^PCJznDHDs$SWH9 z?bU*o{tVntoO((|@}^cyO<}2R{O?sLHcW$zO3LZH(fETV+Z#arIi*)V_ZRg1u~VU* za6uX2-gWMKq^e_o$DsSQMCccXYx?rI6HMS%#~m>%;9yino_Aed|B)PF2SAJC_C+vt zprvN@>gJEXIzpXyE9{jhQy!h^tGe8vi<3e<$m&47Wn;SWhw9x*s5n8d_wN%CkI=7% z3!WZ3qWYVj6^Rk90ehb!N7iQ~dNOFfgie?z>Kj``bmY z{OE0CdrYG9fQZp)u54&OZ}y3aduga>)EDeBk?PLJm0>Htkhz{dxq1zp#bDKSt>$N> z)o%I9Nq0Xj^=a#z%(^|iE*mqA_7d%5Tw3f2DppnV|91JM085skiFjN1@ zFAj%O!90<=vYQ-mgX|)L#aM=FV=8SQ6|svSAINsccYcAkurLlcj)Bmb0@xQ!@TUL{ zp-J`qNE-UxddZhf;*hbj+Tp%Obhc=KnD4C1g#Ov_NT<`|v)1{zX>W8_v9)jNA!fKq(xAq+21!wXl zt*>LLCud#AO}7DLEWm(8&t75`;rUqFoJAl}Du;bo<4t0alfhH~20A|=Bg%Hh2j3K0 z*(z=hfCS*Kp-F%d8lv_Fvr@8kJr>YkD8aB_WG3CPpq`o-bx8h&Jx(+bu!z~Xe7I|> z9{y~IZ&`}84LP5s92qr!VC3L=Gt9L*_7h~s76SchCnIVG3of80v~yI@P!v7r z;$;J?{YZ0`VSxoq0&fDa(b@v#0cX5ED^bWO5e(stJ*B{t_~C+*bbd6|Aw2|^?C%?$ zOWX+}ed>7Gy!bxr4p$|!UTIQx{i;>$%l1D7^eEgiMIWyddy+%ibiRzp&$&9S?A186 zyDCk#N$xr|wgXX9I%b%|r+sW&dU85p;p8ul1iLdazI`+$Y;q?-hTJ41pG^YVloAPI zlY%4U_Oa<{kYzeZZjV?Y@wI~f%!yof^19PZ)i`O4@A`w&}ysDI_mc- z1T%7r@=#Ecm#LwK@jhEA&cSw9wUE6BE+v5Jh(a2qY`0AIg->&EUQ-)L1ijHz2sVq3}vmaYkpHgHJ zQ_Xe66gmyjxyd0Xl-5y93I^29qu$N)zk-XtXXxys|Ef#q=P}Djn|*cXl>beC%=4Rm zJ4bf$V#-fUs7k(D|AgIOOS^^IItxs$yrP8tX15n52FdjESO8LxoVhiXQa``wwa7iA zDOY2)tGAW+EaoxCsgfa+#+dQa1{XNiO8Nnx2ddt5$s7Z9f(c$ky+gR@)r;%g7%Qa^ zKn*9`o&Ans*2Jw!)lp?4+e+(-ROcm#5yhYx8wrSYAPq{pp>Dz;-uf(W54Ey&xO-gI zzu)k?f_YBS2eK5#v>@NdL$?*!PZAG;7%P(|jzHy`kvv@7liA!O^=#1E%IYhJ1*4Y) z{>sOXtRQlF@l!m1^d_LQzbkuTi<-s9J~{=r4AyUzwIZcz8|KkR`hrh+9YExA?=hMO z&S$`UYwjG)NP}+!=t4p#{5+!|k~3tZ0FgElpJcxC?}C??1@@-FS~_Ayf3*6m(<|&} zf_q$D1az0q*I^x4$9fSxH*W|WlsM#TIXyS-Q>ctH?ML2;yAE0SJJ|HW$cxRD{8vm< z8V`Sc4(5q7m5ucu=TXx-v?F3|AjG$ZG1`>1aj1-EFi=2n{RC>p-aOYR*yRWCz(OO= zFI3knV+lBqI^Bgh{{Kz)S3kJo)$dtwB}$Or zCb_)MhEQU4InE?2<<;*O=6|!!FiF-9DxcZF+#`kf1AjH;2-fUixo4~{7155~Un1Tu zGOiL*{Eaxqi)Kv>)eiAR9~>EnoiqeP3iEU_#PZkw3k|raC@!NU=y9E8zR}T8J{gY< znv7=KIFcT$KJdRecG@E&>6ful(8CUh%+g?JIJ(GMKSZEIzm0M4@A+9SE$AR88aW5lod^b7HB6KvRs{5gFc`6eK_KQH4m^cIwc{z^aem$+kt z=1|@vw=6nvL?!*Br98mznulMFW+EXrlimtD1E?yOkw2vekgvf9*~tgwHq_!o3WIw; zn|IC;lasJf*rU|id*cQ@7)-$CKHze0K?hM>S5EZY{_3_R4BA?1GCOtx6DAgY!Fq6I zXQ5298#oPLOmnHQMz0Kf1B3B^$Ng1hU{BZQ)E51DggaM~%^b)3{V2Hvyo)BFpnKBC z1e6r|bu+nd8FN{9qky$PXAq{~CHv>Dp!fD&!w0jFyIySZ08g-Z2uxOY>lCYeF)r9~ zcvzRqQXHjP=q$icY}uff^vpsMP);$@4=ZjQv(=_LrPx{vE1s<;oy6~aSw@4k=-m0J z{99h>XCk3aFkkZ2KL^Rd5rI(k!u>tj4>k@X+l0 zj{M@(yZZQ?n;r67uIa_K&K(h5+ivKt$Kw!q7A)l(J>?R{BVQsGyX&7BmKVMB@c7{F zdMSA3FE}{oLykP#9N(J*#2K4T5-dyRw=sUCgVMyQLtB6k8%$zuHE`pp%M`1*8r8yO z_tZrRtG|r;a%cQcyc7GsYSfZ#43kaJl9wAx#XI5H}*O6_u zU)3(K9?iQf?9nJU{b)Rd47!iUm|3}d-(6`jx1+rGysIs6Xu?eF6jFsRAL>fNL$ord z3pa&pp(r(}d~b=&3!OjMb*|Ov>Zr}0SMm8V5VYJKWj}BR+{ftGmFL{zC4kVmpJIwf z%_0T;;vcbR4ty($q( z*)y761oN&d6NURXu0n<1XrVWIgQ+-OhE*f8W%P$3CzxFM00(_rLi_feBgYR*JcC@B zn*rGcapKa~=jnma*MjVD!qdLbfMQXK{S)GPE*8EI5%eHZk%2D>4Yw*0>|p)%KznHg zHG1;QOZkz!MA-#>ew=c{H_@7vmJj$OHmIx@`GJ5-ocoOob&Ut~yMef3NlRDQQn8nZ zMSN#5!eu&a;zec$@g@B;^T2yImOOXANV1;9+q7rrz>^KrZuCKyNvGK|4#?82nCRPec!IU&<(XVQg^EVvbqldvo7l*R}Q z)C+k4PgmjXTZZ(}I`L!QznvWK2=(5qQA`Ahne_3P<$h_DA49CBNhz7x*R8iVLJ*L4^zE>8;`P#DeeO~pKtE5N`FF2%oDKKPob=ye|%B2`hO)X1{ z)*9MC4F^31gIL@m`O`K%R=&AnsrNDDOtsj!IDPVq@U_=@H$Rk-9Xnt-y577tQS-WF zFl6M>#u2kFi5QTdVMU+7S6gsPj^8kHcVkLQX#$iM@br#R*lkUzoiv8qU)#4 zmv}hm_}A}-vRmdbRTl}o{7b%_tq?lIZuZr3g-QLtnK~)v%dCyfonky zQS(M0*&rh0Uw$6cgd(payTkxG>CqBu7#3`XKG?t6L(S?F_)odcZ|Lr!usM_mf6meL zaZ1y#(A>oC7i@L!=25q_8^29?f3XLXR^KffDf>sD?m^Vs4hM*8yE@1;3VOZE4sBg3 zf_=Ehp!zB7+*rpW4sP62M|>dgm(y4o4i(5(b+h^RXW+^E9-o+n z1WOJ=C2(r(voC>aFBjR=YpO3bQ9yZ|QG4KU5FP5Q2&M1$jJKS^2nzAfA->|v@I-Qp0&vktRqf}*} z;uOAKZns!mh@63`n~X5o3A6FUyA`K2Zn0?Hg+~|qWpEsg^c7seL@D}}IL0s-Q`UY4iuoPqOsmp&3ryA1y?o(E%RWbno^XHiPdI?| zQ|H}=6T*7vHVGq0ui-#t{}6%p0-q&g<$RAcON`*!kcA{OKcWtjq@OH+V@`5+g@7Ig zQA)2-<7WfU&~jNFg#o!6ycwfUrrOiQ*`9J^3Bj7Q#r%{`mET_BZCsNpR6Q%$6JD*B z$-ZWfm;b?8r`hI}NVUE(tA_0~B`Cbiu_k*+kL8~{W3=ucUnGmEsEt+naGp4sjMF|P zzi}6*s`3J(_2a(I&C(w)P6K`tRL91BBF_Qp5Gz<4H0o8N+uNS6RV+@!+sX$k zo?ZDFyV`Cjq1;G0>Q#u8n;l^%Q#U?Tv)Y=MUfL!{eTR>xZ#fI?pXhaOm`Si$vzJ8G z_-OI|gK^$BH<+grq*b1l{AQ8(;vnO5%~bRX)EJY;6nPl+5GvfUCAhnYcR*%boKldQ z>H%tFauq$n%T8Ym?~aYts%00E62|^;j^w%EUg;om`cE3Xy(XQObegJQgL!cdF0OC7 zIJ=Q$(;+}x?|LmR@?aPJ^CLr0ytx^XA5eEF<8j2f#{ro+=+jU<+Nb+M);oV7Ae^Ya zYl_UKT;nw+C8q9}#CHjxrjuA(;Ut9(EXSsn!sUv#1l;1|Mbb8)y0aag4yG27ogK>< zo!E3JXp9{){y#*WWmr^g*sfJxMMXpfMRG)>OIkukMI@voMPj6-M7mjugmia|f^4+ zPG^3G*po}3@XXIuYi+XM_0rK#wB=f=_N6R(0)7JA6=v%r!XXUXlOECj>`?(F(T z{M6XXf;6F1=*!t1r7oAsT@u_tpZ$DHo~T;7perV9VBt2E1}6QTw51M7V|l^b?9{3} zEgioGsF~9%Bv1c0LAvZx^V{O}24|^MT6>;}t39t*+*tlmQ>en#7}m5NiT`M``X1D^1+*4_40+%2)aiX9*YYzhSr1Z0IsLHS$H&iIJm}5`&j|(C9L!@Y z(J5i$j5I)?Sk>i8<5%)imG{$RXhj;Vqe|}-hZ|jf>@GD7Xu9hQb(>@;G##*t8HY&8 zg^cA~Rz-RL{PQ{G{L?_YN7hVnT4M6LviF1qZBmoOL`&sK7oOiSUn}an;;d+d)M)>r zTuH9ayVrVrL{(xR{Jy6;Ie+zq8=J0*3eEyDdq|n~orR{0y#eNBGeggq(plnRTvYXMu4Yb+Cqc~xZMdGx_!|6G@1{@nUR*R z!eiN8%>{(+-oUZZ{w`12-t0{o^LMm|aO?^}1{urm*;rM=YRYV*KFl5Pn-xW-v8g6l zL3hr9UWfy-v;lazQ=b>mq_Te5ZwL?Ya6T)bsX6)~Zu#ceLGh*TJ$&sWR;YXx*^V;S zM-U@z${TG!B4{tE_6MeW&feJDLqBLs+j=h51m7-if$i#%Fp|56uEG7rL>l?O`;ZwA zR2OGnZ*5EA?InnB+u`iBiP9daP+UF^xNdV4NWYw)+mIlgR?#}6mIQ>6$nEq=tT_Z5 z&}%aTwqTohMD_K$CCDX^Nf!V-msv$gXBlb|#<}h9 z%HZu21FqGRI3o2)mZmU*gfH!arZJ~H`{784dk$>ZzZ+wc%*-4}+^+%r?Li#XUhn|P z&n!Q`>wb3WeiK~|HOczA!rhs^ecc>wrA$p3yl5d!sG$PgGqce_w0yO!qx+_#+4>XA zM|Rk%>%$y!cevoqti&poh;&9%MBQ!UR`28XR;E9}B&1x$W$a`;>0i3R5anV;Jp-M7 zR>KFOZm>QN6?Qo^{;aOF+)*(znEAKVq;lUV0t`LX<;@e%&HbCgGvrO}VQ+RS_#@LI zyChN`t1zl-$E&20fsQ^1_eq?4Zb%uM!Man{vMd{ewdd)7D!XF=+!hK9QYQCYv;}@`1qy zi(jXR49kUlIid@D_0Yu>qmKz}W?~dCUwMG3`m&)#V_*+ z*C4Ek-D$7)&m^AOW?v7hYzf^-?#8(Eof$dt9d*{lIVxaa5%XW+jQNTLt^b|Axzu|P zFoE5?zBj)`_ZSDqOXBlR6HT_zdj{XWm~&F5i(K5aeX$|A90vXSGj3?v?M@2ik+IvdVoQsS(qH{G3P{3VsSQ9xz zUTP+Y-_G>@u{w$6D?Sb)W#j(TURUku#PkztWFCUqdsMq4lwbf%AoCNCZowuzZ4$Xq zJM1!Fz+Tvpho3Eh*?D9T|HQHD0CF3puGxGZL`0ykYL4TvILb_v2xnDaOYA z@Y$HfW-k(ZHw}K46kI|EXKun>TtR?la~y0}{!B=u1Y68RSv+o%S~dZAPxl zuA$%?P*UCdeX89ICXnsSOJhd!hYiMvH~pd7wDE^ebI>(PJ#n)sHp86zt#OR>m^mjY zXze%fmzA#ARMIgl;($scC9me`1{wRAtp=d1XC~0@%IWP1NOZp6-+g(X6*h~>1^UvA zi{b?G{o@qB01i4O3s^OS_D`20aTUvG4MEw8o2v+8`J~*D8O}nc3`2VSYs7)`&{#o! zd7uy@1*sNe)qBB&GImXJQT#!H`0BepRj1R)sb@zEdBN>tW%&Q07cykN|Nr|Fo@;ZJ zOsEuj!Wm^`(~<@z>In-xNsXkN6%Vq6LON6F-+Z)H2b2JAL~=uJ*!0s1i`} zQ)IcYS~7r1)W84JjQUs!yL?7yqH{S>*I-m!NG$(8cbuIrYKl=-muX5HzSLy{r!k2NgBtzD(-pXrG}&M-NAX^cwTvffg-@#%|CzE zzFdxX@LkAJq{qVxSDll?;36tbI`X%(UCKe@S=d_)d#%V}myH5{ss6;i+K_8K2Hg&a zt+#`J1J!f~vE^J|xl)rObYtgV@$^i5$Eo}-xmzlJ{}r`<@B4!-WP}o*FD3`2>}~yG58vz4IixER|y(6|skw#5sz?U+xHYEDpg&k^i9!lV3Bnb{_nh z|Mk8XtayQ!Kkv^)F=E(YO3^aB%h3zWin<8HPn*WsLHgN`^V-i6@VfhgXTOwwjTPFz z47R-Q=Ok^8k~(I_@31BTy6f%`)yd;hVj>T*gCBYW3;j@yj7u=2v9*tA;rJKGGD<)X)mVm&abf#(3-K_dh-&2b`kYc=)2t_HyGRj z3%-8Cx=846u1qEdH!CoY$3S!q`?fd7s8?l%TT0tVvAd@iWsa)Q^Xfy+xddPOv0iag zov`bO3I%(laNp0{g?Elp(*6ofaf9ZF0;P4bB__`@i7 zzCD$1mO@ZW$?C~hQ|Cgi@y?>O$D;y51{H%|05x%r*l6?JS4-pEc(L>y<&u)m(xhLB zC4uWiJ!;bnPi8t~HJ_2{i3FtNKC%PVL!?bUWEOMpZHHK?KK1VVo8F`5M{}A(8{fRu z(hoOgC9&vwx%Oi64-q*Xl?zj?R0YM%)*i^=R~|-jk7rXdQlN3HI~D4*A3LuP9QrhX zxT7D2ZcJ1N<~R@cypwc$h}+2Lbbpm6^5xhx%S8*4I?W=r4@RCqLdfLy*KPj>`QNPm z+y1O-c|JwZ)Aj91{hbtq8CAT2_oG&2u{Ee+b=g;;_BJic-)hVP)Uoc$YdXOm)r@_+ zgDot&kTRoz^X)UoPnip6SgW?NS%4R}GG#|6c zUS)(rDfd{&ra7idYQ&vK*^6U*95lN8?y_f7I>RAFh7PHPPjYp}H54-$mmt&xG+siP zA!k}s+E?=Cis(a%jnW9977Zk?(1JgU@A1)qF26CY2bL=O<{&-`-i+v#@1{f5(XaO< zdkJfxm7!kwpwxd!z-1~2mGwF8kV<*@Fya#i5kq&NGXDBs09*xR)sEcXh8~2x>@6#S zGx-s}G0vSXXC#0$B_v1rtlQ+$AwgFUFJJ_FE(*i3T^I)c2=?m*U5h?kfmck5&@JIq zGyDQIa0yr^{BX5z^bzqWz#X+{OXP`!uU&|HfQ8(sYF5}qEh&?qXb(pZoI{_m020WATyJb_4!KZj2 zSXr)Y3WuPK8OdaXtBJZ(0EM!(i;&LIb;wLSX=X9xhsFvAh}h~w%qf8N2T*}fRE#|A zaK#=s?CqL$L^(*oJtwMRB-;FBd3A~H>J1V_F~c_8%?Gw^b_jxexwX<>q;cFMV(tO5 z!l24Q>@I~5Y5))sXm?mecDROnz4*XLB7aj)lCOw{Lzocn74h@Uk7}a3IJ5xC6wIGq znktuanQgOGmzR>eWO?Trpwd%WGMnqARvA@8{`nE8>7m^%j>fZ#oY(Q!?p^Qgp(GABpcDL5?3eg|xQiM5$YV+-O5Ifh~ zvh89@*R4krT(C=&6}hfqw7b&ip|BxDzeBFd&$LyEm402#=bcXhnk8AupA(3tr!t$d zhFNp8t_2?dZBRRe=O+34ExBm3Gia?HE*dUje|Np2O{z2Cdp*%#sH3~GA9yjKz0~Bg z+D5S=I8qJ>xT>tv&F>S}h;8>>#_X}0Jr|6OKj|+0vSn)E41P^T z(KBlidO3Ze;Ja2_&6Tb0f!AAa`>E>s!aK5Q3JhnB;!49&^6$`m|Iu$em-!Q~>X{a% z?!T!}AZ6Lav(B``5R@{b3)^<-W42`N?@)4f)q z6u=l+?N$U9u~8eA4`BY0Y;KfBzyXo1H@Vv1b?no{5hOKaZOSg_6 zYBMe&|Es zJ8M(j_T|>a!BAl~4jptOG*;;ijNUNpj*+|$9z!D|G;8-DC9>=I0qYU&lQcjPJU`;W zmIUd^g-oW*>yd<$V6hgZ3&_xglD8)* z`*0hxK7eB8d~BJkOguWAJ|KhG2g0D?3hFuHEGoX#XZPj)swFb8v9<1a+0yru{ptD< zJXFPZ7p@U+NWL5^_SNJvoUs|=%lf3`su}o@`(EU+MZ)WsE8u$fg45sr(PL)~l<)4P z6_&xjsvdbqF0RGx-V#)O-HAlq;~w$-b@nlB^ugMQ?xS@B0j!Rm+z&aq@<*llrJey@ z-|2Hi5{gy?K0HxYe(p3K)Bj>dwdbZmxM%zwd*ug&Ua{{RQ#8RYE%+p7){k#Iyi0A5u7=~K6Ay*HX8W^bo1$!n z-!EdZvBx^SxWqx;x|Hs<+bHs(xt2@vTgKXe&)seJS>nHg(26!zs$?zjXxQ|4L1A*d zyCPm^rD2O)O~-S0n0)(FlK!w}mFXP_!`8?N!iOAj?5HWS)O$_7hunPT=pBq$$Q&y0gqp1F0jjonCD`(DI=y;t-KCGs-5 z-(f1aqr8ak8;{dDX5Zi64?=!!(L=Qv-)z-Fh7b!A3LF0|Llie8%PC9tvhNApBWwIQ zmMM7j*JOYFd-5OSIGoF3tJ?waj5os7QG=Dxq8fk;qp zy9`!{QR7v(uuc58}=LoMHu{*&s9gFC-S4K3Yb2Jl2jnJ$O4%_RUcA6ef{trrXheEU&maO;T5Wc-qbrCg4T)GZ%881K+r^t=U^^sR# z_}06YFz5!4ef)Pza_JXwzcDu;b2L0i0!NoF?B4}HEs^j(Efu=(N7i&6#b*SAMs_$a zWMquanUP@Pi>V}3H;g9mnqqX@9n1j-}<}oWs%z^ioyq&5-1)kPT>>t~S`ED;npd zcPwKeJ1MT&KYD;+aakeyvFWbbaAqJosQU^l=6*j&wywzPOgw?q5zb4PH(RlRp*_eq zMBsE%{zvo2#LV4jof7#oL9_7jQ z9IKk^&T^A)f4<3iWbb77JvM(iWTjzhQ6qUeJ>!O;TkVRhSU%n1d5ISV5)5lPs{t}g zS}CDZK_f0FU8?+g6NA>n04}#RwdLxR`)z*pTK?rwC$pI}5%mUD117zLmFG^3@zQFp z4$8J=O;qGc!cT6gCTXQNo6K-W52Vd};5>(|ViGb>tmj@TwY0@tdI|G(+b zdZ;Jm(aBgzk>bWmgC&iUWOa@t?bm=_@4hR3={hwr30k282Nl%g6cc9t>hdJT7R zmq3YHEKW@+Hj}bCJnY47_)!dK?}YOABcp-Xn!R0{|86Q${ofJA1H21dItmTBcDtoP z)k^E%)z{q4T1ahi2;mofg=~f6G?aA%$lHh|Rc<1$1eZRZ3eB&MM!{I0waaZjJO`VT z7F;VA1_VU$R}-o3%Np7HE=ie={`&ZWuM0?6d}PuEk2wX#@sXcN`eoFh%RCws1>>h{ zyMQsLi}0pepcjL-LR^J5h6ikS?MSAHK=7d;WC*8Xu3v#e{(GfxF<6BKpySp5GT;uK z6|=u`)19R=mg#Xb#&8%9wM!w|#=*W)r1ZU5U7gL0oN+9Ht?4ib*(whHB_~Xjl9)!7 ztOWnY7J2%!gw^{$6ShapO1j)3!9q5&>EwM|D>)_&vBO^BdVh`%0mR8T2j6=tQv6$ads1tpI zSY}_9Gkm3g1!HO7)LrH3`|M<9^{A7GbccC!b#zv$y)2n2(yfN*JsF=PGI&5&)JT)b zqpzn(@8Cc2{H_Q8FaFnIL+>|sRxkI+Ei_!)u~O1p7AT2$eQm%(S;tePS>H7Fi%@B? zG3EA@3z3>(#3}k(GD3P3t=cTCu>M}M6dE;)P_Hl2hiv3VDP!|Z%^aogdvD zFY?t(H40BaH4>@Brmq1{v+ExPu)HaI6aT9&)F$9KJ;%pcKwTet>9DP7drzb+Wjg?E zvrTiMIbEyoXR(F{80r3CZ~w!`;}I>1VRLb=N~gtW8SmDwA-~!JweLH9FfgFZkbkP` zLjA+`9zRJoG&9R)fVy6*s`@#ZsI#2u(+=d7A?^=Ose8L1lm^gy{=rA;6B5Vx?txC8 z-PWTc+6&l|dk`;CSBK6nB^@UqPtZMdibE~d_Q3@eEh_qF4}gm5rCbE@^k9C18zrg> zBOtHoEIN=QYS4yh4IP|MkM_16bZI@@8dEY&BaDUvlWXWvtMYJChXu|D{{ByxxMrl3 z76I{3cg@Iq5I@?4RuG}gJ2JD=+ zqXGVI`iC;D-!{shzgR=+T?Xrkz>H8DU~gymGUD5Kq}6gEpsRTM@z6n?uk#3wdA3_Y zbCYCGsk#`G=G89g)~_r1G%AO3uXE9K`3H#b;cftH7-#->T&eZ{$CX}E$l!5rRlJQ> z92r952+y(T^faZSjd7IXsj`!{DPkr2L052onkYbr>}sgF5|7aX*4I4D3&*Ib<}8@m;KJK zE;!#?<2mVo5TB|vk1t#{oNBq;t!iTZJU(ZFw$WYSIh81b1B5L};LLsB{tvTS(YA$| zOp6&ew@=sYTMJ^gmaOt2e1DS^OIxoiP=Z8P$&7pmEbwu_#yyi@B}oqJ(tEsrT|6GR z>y?k5dz3D;QfE}OQt1@KY_#cR8Z)5+la7=e7%I=F)tNi`Pk4Cyjv~wE zZ+W6Rqp&CS1s|=2K<&6+PE1UBZMAw?sWWzQCbc&tBu^GIoWMSU+9 z#dXg-i1Sg8hp`w}^`}^Zz|#E}V7eQl4=)`_3-InGrfp@&H}=p&QRyG zhP4w8;+Nq=O-+UM?>Nb85`L{~;`@!u%s>0CF<{%|oH?H!HB&i7HeW^xzZ( zeY}x&xZO~Wc8n|0U-EqG^;MESGexf(>E!^j;B^k-hKK_I`R87(}~peVt^dzF9R!? z(|&H=;^*P?*8W!T~2I_|0d-zbj$pe6sk~mX)PvvZ6olww}LzCOG4t?rIUiN zNz3FBYFYktv=N2{U+(A}U+SM6pP8;8xob08{*H5*1^2ZRbc$AT6q1}Kr8<;2icDz^ zXhPhLU(DmTDsA&ET-UmPRV*XKBoW)?wCNUPvH!v)KlE+Y{#!a9VmjB(p*MAF({>a( zy>xJQ*Eu0F(81`{k;7MhS*rXFjG7l=;05jE&%@4~6IPFst|Kk0Hi+9E9q|t;UY{a& zV@@sMTQffxRW3<9{m_3BKNsm*a_qv^qqz@lnZj9Wa555Cj69KbRa>;d zo(P?7D-*e&HW~Lr+i?UEHm5%wLiR%N@QP4JGcb1>7nPQSOu=74L#fO?B!pg{+|^Lp z_%2pU6?9o26d<s_x*%duj$&u6_7zSGPF#0l=0m|mP3T{ z!fkVn03dm97vHdq`T`yLv>_dR?XMpF=Kbe-@vQSA(WM(>2p1%onk}QmhywBOetCA` z;2J3r_hl=73_73T1m9N5y8yvecuU%aQ9j#rrIRP`AuiH_vXDMWif^tE9?~x$kBgQN zPs+3llBO3h8V~pF8SvyFrG4c&tLyn}z6P)@{tk%;mQ`$umE8C*vBi>MZbWRI7R-7a z4%t@ypr5(ZQd6G{sDJ{exk3^3C9>my=1d$=Rad0S=3A5m&q0XeEu;!>9`Mv+aEqhk z#F!4H{+@~lJUIw7c`~xLA=*cTKc~_m(4SFO*i5sS21H$2B@K^stKp8gpsO@zN7yCM zklZ(eFfRGRpalstS?hP9l(TWs)*iyI^EOE;mJG^q+J(gv&qz*!>PD4AjO4GmA3)C> zFRP#AFQLc8hET79tDf*VJ~wxagS2`bz}cW%^certHy=>@a8hjVR;&?DqOP(mk&s9S zDX>qGW$=k4zPPZF6+?qxN@7Yhu}*ZB8Q)EltMWxhjIN~OsiJQs@%mi;ak5#w2b~y( zr&Gq7RzU(q_w6?*?EV*vcON?aUo4(|mZ;cZS?bfel;fe2%2_X~y@pwMn^XEWLZu&L zr;)~B(dY5((xUfgjqu#SShiQG|0=5HT(?GfTT1)iQa>`A6H3}*^=;wc@!N6VSgOxFA z_Z#=6T1Tk8Zuh17Fb_zkE-^S}^nL5os~+imd(8D6^`y((*6;BHs{gF2^Ck91DF5D) z%56*jqn=Vv9z(z0{Y4F|SnlIGs211nbmZEJ|7G{or6b?gKK331OFFBUM}6(8=wiPK zm+ET^0l1RFxWPL%r}&E4Y~{U=sJ9~;{txgeLoHqR*YDKN0`tW z?J2zI%GG!y@V*yEp*_jgm18ka)<%+UrY?M`a!uU!geU(c)qQPH)_|A55if_{+C!x( zc&6e6MiD5yz312C*NNZYUPZV-z8zBZaEKiHzW%wehYFot^!E#HAbs)Tb&|aKdy>R& z(IKim6y^IaOse14xXtayxW(#`vLtWhJK@i?= z?UHp6>_^>!bV>abeCgfy!$WSOm%s%k6_S^(VGHKZ0xK+H31@z0uuqlk75f71Omd>` zc~bierdsM*XkgWEq+q^UN+=7{nYi62)v&u6VJ`bw#fCF$-@FMi@5x8<0);?uG zik}90L<`Ryh6r&YW&N& z>hLEQ@jb&Lrrx~|^W-WtxM&ETf7}kQ;O$Mm$G=_1Ui?=5qwj!Z!+pNu1eyH_7@ip= znYO_N#ro*3FzD&E!OGXgew&LR)>f~EK-+}O{W|6bb7dZ=7N{lg7d(p`$DM_Zibtq= z(WG91JvA^D(@YEEB5@lwmRszzgt=MiLiT{4FZw5Lya-zuYQPUra<{W8I{Z^O3A2j{)H8&;wOQ)GyVwO<5AAb=cvE_*sxTolNu< z`28N-(|(n%Ryq^ya?Z`*;aXhXiA=g+N#|~9v^7JIchA)Mx?m$M_AVdWkpH@|X=Gfh z^hKnOR|}vK4wGIjmWB1ha;}gIlu^zet3QPv4o6oeLV{G$wvTItLj{pK{lYPZ*=4|Zf~And}S4v_lJbEUv&WovI@m?+Y`!1 z(rLcG{Ns46D$v*qA+Beru8XO{PqGLL;ro!>m{a=FW!|QXZe@XsRX;tSNroo3XTP5Q zU@0u*WFumv8q;VTTai~X}go9XUXaEyl1>h((BQxVZ(d2 z&MO~FnSQz0FlB#tWAdA8darp32w=gGI}mowYi#gYP*1`!LUcRej)RS`i`vL>jjKhJt@nV8nTK8p48!TTN&-7;{Eh&MoJl)zb&PRYcr)e7; zra_4lb$JPE{B!dtSzT)ztzINOYI|Im60}tj%IjUJ{|#tvx#XImk>JO5fmO< zFuj85)2-Y?8MvE2cCm7WA358%Jq>Mh{s_JtULfuBwoDJ>u!5{V|9tbXQ;4Rh*Q!2l z$a6R^bp2})w31}pA!+n-YDUfT|E7YUDjt#luNtE@mV0WDXYm)`frlaNxD@x-Z$1!u zsp3}NSFR;|{6WGZ;!|rY-C=EIdbQ2>S`Q75EHS!<5o^eEKJ3D~59GXzvee4OX@ru> zoBciEdzf~&QArzHYSVb{bIte+*(-0PvxMsv=z1$AY;3HY*z=gjgEQU5*kto0EC)n8 z|A<|wY~qjo8`PJRC~TQ}TVGw(FnHlNvXw~yV z-+li6J-wcdBIGnC^7Gucn9hJj9v;8I4{1?z`GuW?=U_}QX0&HKiuCQgfBFl$LAItz zG*kJH;=g3#-nfh02&P)yMk{N3D{(@+-i5~o&Gq)h`9-YP_j9Zt7{8a4l>JG%b}l5r zVZFTUL=u#Z`VDz>A)`o3U4*0iX>cdP#w9hBXzc|UmwCE%5y~mOE3QjA`4!i=hH@j4 z4{4l>u!<@WvP~f+=CDDo=W)BzHz5as=~c|BnSozzN1ndH)8uM`(RpchWtq+kjxv zsTS#8_(0g$8kt!K{p=xM={CCNV>k zi}NtXau=aqLIs}c{g*AsANObhiw<|vE1gGCb2mY{KbiLji1rN9(Z?v904p?^D^H|l zyHcC}Eg`h{4#@Ds2HtZFl)=KYVp3M+{5{AIPLuJ7$!{fyQpTw5`#lCzC8@*piL~{q zxF1jV#Gz5zJtEfYq}*Zeou~WV)mbcLJfz}5`7To7%eOW$3oFjT%~@UnE@!W`C2u*=C)<>lBn`WU6!kXa9N#T1W7p1h07nAsDSX0g0W~cWL#hdTv zI--lFWZ`)aborJYm238~w9iKchk=k>d%EsraL zEHVmq^oN5MSfcbiZyrkba%DUr7YMCy{1@lga5{=!*aY@vy^jl#=_A8TUr**+W{wyD zP`d$Nj|tI5H~v=rcwP9Mb}&)+#B(9=0vRqUAs-)eY)!cx^Y5KIEoGY%`J9YP}c)!zr z(EflfY&+M#0DYn5p6|;{AxeEyBpX}ctG=-bd>~h{B{S)K9`jqQS+DlbGmDrMm#QjE z@#JDiiMX8uCMhv}WbO91EN?MIO`zqHj)=ZXeHSrMRHyUYgur{r-mglyk5+=#fp5-&?zwY50{hNB@X<~ zhy&WpWSZbdOt?u^o@jq9Ra-&&oHlSi?9AN>+ur|?di;UyH#>)7OPH>QYnaI~&Ark9 zpsEk&MWToS+EUK?PLvic%9GbA;jAP1jq6%L5owUE)36%t+INSZX#-+piE8f=@#xnx z#RrNNg3*2ej}sbj0kcjuCU{A?cB#rQ!T9dF5a4k;Oq?{vz-ToRVPXyjh@wee)o@^~ z@ooV>$?~=s++*w6hoJ$jPSt{CR}$0+rJI+TAQpoKEFP8`-h0fvgk*kD9+5|SX~5A6 z-^{2C{ahZdAoNM8X_@0V*lyT!9Tuy8&amnceXxcc^Wz6B-~$~#%ioFyQ1%n$_evQ^ z^2uZn|6f0#5B1YQ;?h~=AI+wz@d5(o1Y{uGybunV)c%5AEX+k@JCMwol(Y$Cb0rIS zJ$bd$A{nP_L%I~>C}C{QX&%G8-9nhJ9@pIj4!2nK`I?aToX*ZGM2PeMCduBbibjot z2b7+DEF;zA29t_6_88~|D)=3lt=cVv-bHL5d?d)r&Yz?F}> zKd%hiG0u+XQkX{TkOHRI-KSq8^O)tB?Tn&U22^ggysTB}db_4&msNbsj8suWW_tX* z^1$%L(Ti82w^M%=73IimPa8)RF^y`a#shcu=SPm%)sEQ@D?F|lcFt=239Rh->3uJ^ zH9E8F8*PZ(4^3V1@gLAvS*h7aCgco5ir011hxBp|#7je``SOLGl>1J`|FXxuv+&^w z(-`njZ)2|h%Oqm+`E~|4!H*ck@8&U+vMX@J zR^UN_*wxzenO`~bNSX){y#h0M0o1tOz$@x0nR*}$@ueOYS~ z$N^0lmuP&h2;vmL#xR;9QIAkSLsrbB3osHs(|vxDfa;bJJfQK+#w&R51vA9kTWq^e z#_x5()8tEI;h{O15-0igvTa&oFB~^0s-UMY^GuYtu>V! zyyUgm-pX##m4LxRl-auk>+5AKYSgEvF@oIoD~ zSneC+&c*~C;_gC9$dHOvM9n^W-z%&3E-a)!tK^1}5|=*YA3S!XMEm|CitO`a5Fz$o z6TTkZWP8JVsRAL3?lw_RlsVEz{;GlcQ1jaYke%DjRqoW=)!cy1L16b)*@`aHyXoPE zvmv3u-#>qu{UNc8OmRh|-TPf59;8G{G*>!8)D5J@Xw!9{bCrup=k}Kw*tgLggAJBS zJ{Ng8!;d?0(?M;-gH0L?{i6O{2+jLkCAa4p=Wf5vl%CvPV|45(?$GV_5ZO3s274~r zNV19Yh?;Q)@-D~mgxLYqgbZW51et_t(HGl-lue@>uHmh7$4`S32AO`OpiE43@G9KY zC9hjXrj4`f#4cNM*j=Yi@KO5$Abq7zA_v9s~D*;?D)}L5@pkYB^+I3&nlcoX1g_=u^zjpk}?N791ko57KWEy zR^MsSMy^7!;cn75#)-)LdlKmokM71!0wm`!8Q0-Cr9A1KGxN}3<4bVqpKE#PREg&W zZGA-RlKgeE>y94!G++MwjMocqX1Mv3t9s>+ zF3%_KVtcA1q2Dl|TiO^t#yI-4sbe1{5M%g)GPNU4<)9_tH8k$TR9Y+7sVhkv-@ z0Uv8{^BCjKyoRzQ1^pG@EByu75?~=FEyrAt&qg4HK^s6fYZlq05U{`fga9Urtc%1sOo4HrQ-ybu!oAZ{33OoE16*5m`CJ4 zQZ8>0AySTE30?oxXQyHwl@2Hqb~PgM&HKJjI=iYbpzZYan)Hcln8wV8jSS!qne30U zhs4M#BF#jzC3v6&E2Ds4DQ9>Jzr`=07s^*%#l*$AT&-J>By?Pd5gZ^jNUg{wg`L7Q zdnfA~#YK~}RN|~Rr^@*ILc2cI>522$0*jg%op;HakDd%SyG*?2mmHA0;0_DTKd9Uz zo+X!e*2z--ACMvR7!BIW;Pm~hJ5`=8n6;+f9$N3GOTE- z77?G}tfN93C_d-jT=JejDyj6ue`K{ykiiW5Fegf8PzxQTFEYv)MWCXO(8eK)=19yH zx~Z>?(#SEqvo{mv|JXJCQ(?{t-CJU29A11?r3k!eFksL)<`%|Be{eg8X5-P&T;+Yy zpQqDcKNF58r@PO7bxxLjm8`z94ds~IFSd1MRA7BJs5*r8&sA#4wN+ZbocJqG7}S;& zmRY=L3N9E}6_#|lm7_fqKm3&vV7(Jmcm3^Pk+kr$-SVxFJ?Z-Lr=ExBynZZJZ+cm; zb9mdyS~{|J+l!2eq`psF(3|*Rn$7b0RP2R6wsaW?w)oswBJ!YSYjwg(JH`Dg%Mh0s zL!HAFhEAv46tbKzzx>+c7}KT{xyUYN?zb0Fk?Xwhbxrm9vv5U3@)p#Ttd+^@9LRVt zx#ZbtJ2HnfaHk^z2gk=IR#4HOZ8coNAd>kVzENFJa8DqQBroL$8`te!-pHpl76~x57{Tyg%=UrrhObp(<|GA7+?UofGSyoO-rmqH@2=Y z_}+woWkmLK{g}2|HEM8Sb`*!?_W2F?z9mBt1{|JbCUHT}nBJ0DJ#+Td?DbR5W*6)$ z*CEeIf8Q`*(-Zxl`vKbsNNUPAoB+~OSH6X@QFnr_q;TR||v zNjJJ&H$c)OrK3D6o4R+)fm*@9$^-_F%gS`CYByl)@ViUylTU z6M6T8Nsr#Ip}PfEG5jXC#bb-QJIO|Vu2c-jX}@%p638xMG>lhb(`=DejLt-Iyk?u* zk}0_yKt6jaAO0F7pGp!PxjLqi?>72G%5AiLLGNHHeK#_QFDhPOn>U)p!Tez>e?bbpZCYJ0vo_OVXwGx~m#nWve1peo6vyB9ABPte z#`KDHtsFSE@9uOn-#ILzp{tXN7!tnUW3)Fh7X}DQedq{f{81|wQRqs%QKquqq1_~& zrD}Fq<<6&TN+&;5OvNcZ`k7KKIgkUaH>=l97)K4~bW{Vo$NJ1~Ygf;wnbfPPcg+3N zM|64=RQf=Gf#*%$2HqwZ!iOCiO$YXvNP*K~L?XF)HH8g)US%WQ*Y>d$;wU-WTCJ}P z5jRU5d!d{7-Uj2Nqs+rwG~c|ch#Fka>nB50n*YQrA8}?trZZ6q=5E6&6VA^yUnEvk ziI4Xe(Jkoz!}D3KyrLd`g9TYIk1mMV4V$IvRyi?Jy-H1{Z49JJwX(iHxjE;@#~O-@8L7QzC|4cpwk# zt*a?Qbr6<*a_Zj9`{i=AZZ<=aj_z9_qV94$pkg2$^oC>0zekjmwS+~kJbJi-He+0> zgg=vA{fCq!ucsklaTCZ8ePV|nWc%es(D(u51J172H@zrNfO|J0i{L9mJsh600_x9t zz>ET|eGn;&kKlGXnBQ<~wBLuzA;Z-3rG)b%fOPyWgL5z-8jI_P^HVU*yAQ+Z5@Uar zZE>(lik)>0mMHBZ{w8|#h56o~{^lW!PZMZYv067so9AIN&}N_NhS>PtZW;6#Oc%`<_-jg_dYDV%K=&(m05em6 zaBvuu4IV;_tM@bm)@qsCUz=tYku|h%4{;duaFn+O^O6>%qeE~n3zAs5Z?0i&%dgvX z5OxEf!3|0CT>$oOopm?th(A3=#E_OQL+0Mo^C%Bq24Zf|v`DHZF_8qg<^vjb>}a*=3e&XnWNtS)S!@FollKZ?U-fD) zH*?&rR5QysiiO0gfmdM^!9}4=Gy`OAZ{OXbbiJS{Vx$$WV!UOppKP~438HD)A7oCn zjtZ>lNxr;>ra9@wMh0};V74CC|0^eiN!r>Oz8qib94s!bOKtG!7F;Xkv?%@h!{pa) zn~Qxob*cnK#sP^&n?_0D<@)c}E1iEdmW1{_>61^K;@__CxTxz(YO*_4me=BXd;Yp` zz2_69!>wCt-}2P49;qL_3pJ~QPopotyZ1KOr+k|Nl~(Y|kxqX$w(p7S{7i+*E7`lF z^IQd}O}&pLTO_?VgZyZLRWs}`s-S>cr#NQ6A(rc5d!TdfO&uk}A|k%^O<2eFfZwgL zU`Gv|xVo%?h{nmG;LlGMz4HHK{?CzPRG@@JZrBPZx#l=D&g#}R!B=mo|{y>cUWNuib`$6*7$9`u>db}))*p;)<~wY5W(#;V2Gz$MEHNunSP3zilUGd1`TV3!Hx@! z{qx8-7N_22Y>S9aa)c)gNg!W~fdZlbu|hXOSQs_~AhUj=y?t#6JMob`iOe{*4lWc= z%2=3Pz$icb4Ctqdfj*!7>E93{ZHV@Ni+!$u0(~%(MSVsk(USC;p0U>7rFy?IrxrvU z2)`Hrb$WaRROW?W#-g$wKa{$>qC&8T8uyi#@t7mJhLc%=#VTGqYzo0)2sY z{a&_sza7bSaAj9%_*U}BqMP4TQ2E36ZUqEyOuh`WYi0TkpGFUvY-e-5D6>4N&?xRu zG=3qV&Cp>T-3U~d&{_M?S+V%5UVClvx%bxtjgs>7GTQegG9G#qxP*1Ktz3i{p)Aa7 z`~A4^qbVGAC0Dp-w@&!hj@8Qq*0;Km+$AHV_s3sl9?mPX@5aR?oLq9{v7cbyZHa+dxn;04RgD``$9-?#NOAyQMLc@ z%^EcSC%D{+b9tTc0xsmahX{kJi5Qgr`~A5(*r$NVm4=Q)OY;&1Q~(ySJQn6&8ujGP zN0ya*yT)^4Gs>4RI7L(<@r&RuIs_dmboDjX^sZ%Pl7~OY$@d{H{ zlkRm2OVn!y5|U+@)uS)4poC_}v>-LRRMtK1+7~&=BtB2GECMv6Gh|-NfkPZ^vl$Kj zvjYL)-K5K`MxCXTmrLty&)wOKZJK>%V@`h@>AFI;Sv@&8o*@NO@sZ1aR(gUf+VV`o zzSKGY!ie{&ND<|CYWsp{)XgYTpZ(iiBHG`OM>|B$bpx^QmQm~813-#(2gaEsZ_Elc zz4&htRYP1W8@T4wjYI)PIIPJB3UC+)BL*9!rJJM*-W+)s!vk3U3~bW=AFkdzsHw2s z-WE|25wX#$ASzvYCn5qOAVrGQC>?3iLCO|Hs(|!PP!L3#6lnrcdhfl3j&w*U3531B z&3oSS&2P>>%*YI3aI$kh&$`#T){_TX#@|xY!#0ZYBis$}PJFuSY<+WM^ypALYb5zB zM*>jAc&np?swN$(j-EL9M>zToHyFK3hF;nnkoYITmO)hHkX+&K6=W1vAapq}3K07m zukJUWL%m2;-JmM}X1^Q`Xg>~v1mMFWtHvMT-^B^7>sJIBphq&*OGgY1{?U-z%*H9E zlVjy)585Ir>MGm8rbc8k^v`Jl z!7G-1 z3BJ$8jQCdJdghKGl&dS>J@%PdbXTAQsL0167m7^=Ra~vTRdlTcm>Z-7oJtz@EH-Qk zbY)wU)xU25kIkQ-@bgF0mw6`GAnQx&Yx;I~%NjeO;^zNOw*N==%Nr`73Her?P6$}J zbmia3qeMj)&?>HM#cg@Ty)U;8Igsgc)bHr->vF7)vAQ*5{HIbyEaQmm<@lBc8MQme zvP@F- z5==Kdh+n(P%5P|qBu#vv%YX6Gyk%vSo4#GBEuD!qUWst9zQ;K7?{cJ&aq(u~TaOEJ zN7j8m>p#}1I1WR68a%>&!3WUjsjoJQUCHcnXuQQ&lLvyRh&EDkyM6v z->&}cAOS5%nO98PuD&n(ZDGRJCY|BPrzW8vww}_wg;7fHm{UhE#m9xX2 z7Hxv$qyl}JT>oBy1g);aa3%^Iu=Xtqxcm4gTmranP_QrS=igN6_(Srb8nz z-s?`>&?SzYplzj<^v1vH!ZQ(l6I$O2JqN$r<(@x;JnH%Jv{~34nw*+{V|yr@9~;ge z0A%$V9-ercy8;GbY&>-MzJNPAI%kHbfPXLL{sn6@RL>#5nwEl3Z|cFd*kD4=e%N3T zV6t1X4A-yvWXSlpwm;mZiu4KOvF=1X+>NG(8l(mw!o_u zSfgD)%}OnE2D!k!CRd#olt9sK*!f77KiWL>us{9&I2(EnJ(C>^459Qu6AcT67oa-5 zMcQS0_c>OLJ{TacJP+O0a?&buSiiD@6vH1~M0EY`f-j+C-z|C&W!D+Lal zhNp6c0|Xg3Xywcn-*9AEcN$ssM};EL{6Cp63}I+zF#~g~vTm7J*}2xI;#pW8>O#4? zRm_#7GA^w1`4&PjYYf5&cOIr2Tsywr{7H`K;5<< z*2i)`f-{JvyJ_sBcW)UKZv;lVsmo8EN}En?K8t8~kP&E@^NL)?^)&ANVRL&!rD*M2 zc+%@ARK?NO{iEOT0+p`iToG{6=S$f1LLu{5F?kg>?eTdZxE5YFSNH#PIK5rZCN!M2 zk9HR|TmbwI++3ryg-K^dYzuLSK|l1pp5UE#rWBxZmy|JjU47M2T>uvlkd$JoLG2t_JOSlGp4hmPllb<24`zRka2`{PjCf`*&nl@IVw1`6GENcvi8O{D|(JnoyJxm zkDr+97jbde>KhENkSt58|Mp0kfhG!=KVy0RS?a_)UEf;3Na}2P`o*ttMzb= zoB&;h5REnu=m`C*hMQMR%W)3} zgzCeS!YoMZx8)R>`%}*C3AlpwzF~OGCje&6I)kpsPGdYcr$Pf> z8FxkEZ;(Bv-bI_!dSsK%D`BG}PWb%}BrdvNr`_LNWdEb-BKErw>M_Fb3)AJM2P z!pY&~9#v5xTX6(hnwWPZNAh(G`oOZw>l1XFTPpwTB`S)2to&YpTkDPJ8KaU#Rt`un zi-$k$&jw9J#lvNEfm18m%2a*%E;Jb}|ICj6A6|I^BAtX>gCMEP)nrjy}k?Z3e zY)tvKcnM^ryFGMBex>_*C@lZM;^OFNCftjO%7vduoW^~a>)r+nqjvL{W=29Ad=lSt zYG!}(v4rE<0M#Bq`0i`ahJFaOj}z~}-LJCXRzJl&D{P&&BlMMe%(3<&4rIq*GcVoQ zXAAGymyF$Lrq_Q2nykQEr&8ZP5tU&+mhxmPH`l#IHA$0LH}6KPZ<*FLCmZfYOd?Ix z{r<{!-}Fw@sTE&L|BbyheNWeA`@Vwiu(NHoqt&E|P%aPv99jNfi0(VJGQZKwRBfbE zf*Zf+GneeEC2b#uJP8+1k=}nLuf!!VOYI>sWM zBR&?EbD>#PZ&K1$b0kO8Kl@pqGGDRj9Z4~Eb$I;U$xS9L(#xmEUqp&E=T*^IaYM-6*Rh<@s!GGIU0bOJe zhlRxgp941g(z(G7N9JeNb1o)2H`6?s58s=nQ1WcpN7dBsNt0?83kO%<+mU41=OUS9 zD*F1I{Mvl(c1kQTJo{lxa2Xw0WHCF-7fWigjNlodJj?q>$gUzRIDV5>5|l5 zIILHl0yH~3!2zp3b|oPd_$^CQ*#|Qc@fr>$``mTcR21Pj^8zv!;(w`yAd!WO#(~T| z%m#e|Kp~_H-pL}nWF6pp(jG`OK^A`5J}7x<_Q_$qX0`+Fq<%KLm;bWhL^C) zX6c){TQZkrwTM(u@V}bxK;kkiUU9xb&lKDDcc~NbFs*0{%y<_H*dZv`yV3T$B?CJ6 z^X~_ns9V1!t9^tYbN61frcrhb45yky9^%P#$r|Eg*X2PK7noih{Q=H*)GCoom0CoE9BGI3t?MQ-HU7nIOH zA;?P`Jh%jMY)<1?-RCcX`IlCZ^6ESIqlyKL)ay?4^nb9^M=jQ4Dfx;Sx*n4i%tY}S z)zm{cG81e_gO4Kmq;#Y2L8q@C9|7lLExo}gz)3;dQOQv~hoIkFGU6Vf4$jveP~AY; zirovS`vgxRU}L%!E+oMzQ3!;NJe-F+M^=d9l)9iw4Z93Oyif6BJh81`5KFayn9BZA zvcyUO4(!47^PBH2ijLjh#{r>{NHJcfB}75CkJ6j2CfK8xfUmkUs&g@HPx5{=iS{z) z_^#b29~I-k55%$Z|3rG=uqF%q>DMA+^a>RCMi1rk(-X$vnucOW5bh^pn3;j#408f$ znSAQge8G(NTf=ssmil?~1v#y6<~A4I)}Mi#xJ1ra5q1F!wP%ssy(%I|)t~RC zYmu>jQyuYm$k{VlHZPcCcXw+zUAjwvON*Qdj{=ixv%^0N}kDl{im2n^3X3c1Q|e{7FNdlp4w4mX~&oa0eI-XvG4DC zPhl)D5GpLPTxm}KBvjly$GAw=T-pJbrTFUhjehDrOHlMrrgOn{CcbAOMTYi-oRNVJ zMHUtFh%A!EY#CHG7k`9=_3WWnL_}b{C{Les)6}bANE4bc`ab)rD|KadHt5Dc__Js2 z^AyQ-YcbSwe(Q2*x5fBqm7MI*m*eM=DxGrg^4vJ7W^kIq3Z_-M>PwHuACle%N0PaS zagOXShP#@=$sPS<7BQeV6XeK3d^4?w@S8lKi3r@<)% zITx;?4#qp>e6rMi`Q&fkE-aabZyHg+c1gu0r#H)}$*o`TLhA~Tc`KSeKH}F3>YLUA ztSa+O;bg3rDdCqBoJW04kXl5KN9caM2xaXF9*EDwaTLAbbinW*Imk(%&A{$FQwP5d ze>B279lig#Dht|~f#rcQ01K-=v1;hGa5sF!nq7hERRJ+TwMr2I?pIB_N(xEz0)3>~ zp-XV*4|NB?4!>*+#f@9w7cLGQEdLE%ahzl24@tDId~MkY7+WO1f(x8oK0#_@SSQ*$ z;wEbNzQ*4t0E6c;e1g;_ASMFgCP!6l$;>Ix3m0G^^olD9;;!fzU~C6&11cTEmDqu} zom9X`MimZ|oqeo~#9GQCaILGe{aq!k#6u%To{+&+|Bd_jQBQQVhVKe(HP_lgIiNq& zE38_k6&Grx#0#GBV(md#16sH(|}NP^$Y|?U{oZ zgU4`&(~+6pq%k`eEF<1h+1FV$4`AOW%%~UYeT(ZG79V2K0=?d{)e1&ZvH#<}Rm|(Q z$iP}@X^Zt{Bm2Q3IwNvSz{fi26%sZ<_@J+#y~-pJ2c_ zY?ly~%Hc|UJACiz1P;7qd=^C+FQ=g-jcJemrbBHdKFvf{K_F)O^tOO@XiX%HKlEZk zu*85tyMu~jL4OJymh2e&9^C6JF29eX!gAgg@x1*eZMbrM4yvMmpNlaxo0GyrOPFWH zYoeAl5UXXfgafUGZOxhqZ)MvaxuMO^^CHMmvkZ=D{@r8DH*gp#EU z@sX8m)`p^Y{6NvM_Brdr=7Wj+m&mG0%ZLj%pgimrNq`{eG( ziW|~Bb`?`u<4Xfk(pz$>-SuhVPf_cFsvWd^ckGSq>lI#jYBhwJ+l5G`d;teTMR}$^ zWffqi#x~~8K|+fdIdNE{hWDsdoMNw7=HLj{PHYhKOJ=i5IJ&4sQ0{%OSY1R;10I}% z)K86ws>?`2Vhq7a%z&ohMq2%g*NkUFfv4k2A+ZZa#&rS4f~y$I^4y^M+^xHif7@HI z=ldq&d$}toBrGHQ9K526<5QD(9@SWCRSVA&HC5$3HIH)K_y2~t!eIG-H56+ zkg5^SEBMMdxr7{ibpHsNOrAMGTN>l24qP@)QNxI3cuO9lN3~03MEw+8WL?4RK(VJn z-H_nf|61DO*{IIXNPr(jj<)NyL0iurTYUk0E6Lx6!sg&9i{~-WRbrE=jpRIQ{!IjD z@N5vQB{J0ZKUdUdVM)P8Q^NGuq%`~vC0bf;i6c&ILLhb`%}jU0y-2{|a(6++vX(8y zdlM7NDqe*@-4Arf+^!tt_5TsO|45F$sGSzFxgXEoV{I=n(Rv1!pBV}f`(Iv0+g)<9 z;+|{~F~2JEMC?-0a(Ti9sD#;FTu?QV=?Hek5c5bxO`hvhoYl>$}f`5X13+0tNMR^$T<(z^J2@rW}*jI4nNj8&p(}P zZLPGW5KB00oX&R(sAtM&9^n$FdE|SuD8=L?>{s)xja1Q8GlwBliDGZ{W}BJc;jY$` z?=^nh#0opy$Zuh8eIIAx+r(bff@Md+ky0Mg;d_*x_r)H2y=2=Aq>#e3r}mT5NJ#HF@eQIdl3skb+pnAPuSj1i*6 z`*pyfUGnDzV@HZ&mD!SOHez;8d*u96Zk)zRO7<81>guY_NBZAbckojFp4&$Yhgu@{ zlFl1xa=BUc3{`O6s*zE1do<*Wgbgl79UNTxtCE;RQHye1{ONO|^%zbSLtdUWFce2Lcmw7Sl&=d4DDVrz3d@Fl#i5$Qa>`kZFf+SMZ3C=1(|--(hrv z<}^^oes^QbKS2&_buyCtAB)BEh_I=bVaFf^ebu=PRF%v&d#S_EQ4n)QV9%mj!grgpFW z>R|G8jy_pRnr%Katn3|%BbHrzlA)?FhIQFk-(U~Sh;!NJs>oi5_Pw9{?zEmO=v16! z(&UrF;`^^lC3K}ie40OcEGK<^4;r7#nMZ%cL$jm%i+*orecdQLukE2}rWMqHRKSE~ zRFqZ7<4t(;R+pbNIU;=V%}9Mg)t+z4dC{>Iq6`Mcu5B&)v8W2x7%>aNWloT#QDNUW zbYF!J+!0@1fQF2TU!NQb+|V17qiEr%d)^by{`T?dxo}|@`*s|y%9O#y7MJN$G|?9P z#r3r7X1)?#e)pyB#0S0dl)^LYVvpkFvVA%~=l%`1x}bI=?NLWxbYX2Ds1!_Xz7JlG_Q%jyRA}V(>_j&>J!cX zqNo1=-O^ZIqlh0G+=v_DfN>k5i$3xWxY)44m?E5OYu>QGq3U4oR?h+p z+RbR{oB^?M+;bjKa1|OX<{&C$%i2zjplgWbEwCRPUNzkUTM`=j04JMX(|M$wf)c1c zZii2Tms0bHaDAV-^RR|!v2hdL9pz=#s(s5Ykp|V(qW{|cBR$;xpvgFQF`D>7=I9}G znOU7ci=x2idT*p!O)<3W6U(#qv?!6Rs+|&JIE+raYr+yd21gFkiHmPw>>5xJP8d@M zO%8r|%>LCJe#dq4eZ z_|?!UuOUl(*_$3+?blw-kE8sQb?Z9Zw>W{6JW74tWLnN((;yr%6zjR?$3TpK(z^6ivHM9ztUzhU@_`bq#W=y!O7 zUO=;-i#punROtbheIp3yAOCfhE*HF_pz;;Lp=m89xQr5Cftzn&Bz+?sjqqjwi_#+= zhDSj!E8vpRCCquOFjyZ&4eNh!lF<-P%kZ&cmo>8I>cP2pAl$RyuorwdcP1g9*>g~6 zxS@DY^HCf88)QSL`@5X;uqDLT9YFaIIn+CN>1;JRbDqtE(B@8bm4t(ZGWPCkm!V`V z#+5AFbBXoFZP`Yk;fr-If`WARRe#xSuuHu{Fq0TJDj!if(U*T7MRSelX^)MIxEYYjZM!J|$>5$7(5< zw<`dPh$_h!AqTf-FF3)3t!Yuoc_a<7Aev)rHyXA{K|^7mWFZD#;}*oEQiBtb;A9N; z4t9(C9sCk*z(@Oka)QR7zAZGvV#l$=JEjO%KeIcQt1>hO4t0lp-=sIwqniREPm0EA zUx@dutw{Q$F(?u4SG5)wbw++g*JzpE8^a3zzNg1Ya_N!H@jxdh;V@pi)q;(FR1xvK zVPi=`oHD{y{994P$6lR9m7YGIWAyHB6M6@ zCNW8g5So8{NpxxX)LBe`)lw4usf9`9hY#~R*N|wH?{|K5l`hxjY&cb3p5!8>-w5Hwrr&O?TyasT!|#6(ptPl~mXzWx1S(_gYG6A1S= z>;Tk%vkV2>4LxjVxL{PDi;C{V=`1gAbMRqK`o@NF@=MVCm<2e1236}0T2QPFD{xVa zFL(scWoSLZ>$GRAc_+^jEQupPoY@&XM@SS@#oLI3yh2+vDzRIj=_=%~y)LOhSG~TK zI47X~YK&r_Z~YdPO^qej%uK*O?u|Xh(e@@|fWq@P`~*nuWH0~W3FMG@i>kRIQ0CI; zJ^cgIp#@~85T*D-L&)xnTyt7+-Sr(-zAovT!dBx9ROXmjth&tco%BYmoNEv;7#)9%hO zMN50|d-`^QSczWeg~^jvBO9q$`-oVH^Zl;IqYOb*I+G9hQJO|iZyWahVdpIAs0nV6 z*39C85csxqpi5{KqtRMH*`3gQZz~Ee-GL?OKQ7@r=g>izjIo@_P=h11%5c)K9i0&^ zHr)(#Rh*5Fc_LiBNgBEuyv|MI#>~ zD*aAZKTC6k%v}k1s$2>bg)X1@pL$mC{+lRR%y4=&AV;2Ha3Zn;oh#52)^KoLWIZ9~ z@g;-`;{?R9CDKIkQ`_#ym=86PSC}D@!vd5M~dtP)1 z1UU>=eBmI=z4zCkHdn#hw?bhdwjXc!%j19Y!1HSVn+HC$_)DGE)`Gn9CRF-u;*0TH zp_1Ro?m4iJ%k>j^WFp-T`7tvF)l0HfbXqH_N!ori5)L1_-o!a@*LiXAMZdX^&P$#c z`m%1byp)_V70*`w<2XQ~>bV1HraHt?Yc~5-Eh@lK;dSkeJ(R#JBMs9T~lk`V( z6o6=1@zVHbo`Q@8{Cf*Vb>kb82WtZl-oBL&$0$8}SRe9`;6aHD?GhjGVHH)>`l%<( z^r)etx&8Jbdm`U{E5#RX7HCxFtpQ$0dLJqrq|yKRKJ=n7b^axuKpKsvB&RVOk&73O zQlV5K)Dih!$&&+$IoJi~I>mbCDGE84B}a!}U3ZHBWTN29c^~dFI8zx1O~%^u9F;W( zwkxa?H0uAQ18an&Ipi-NLZkdiO zAn)JiAm^K32VY`j z#Tv%8NSJ_T0b5{!gT99M*)v2S0>13m`29t1>}Xf>b3LNEf2{%AhC06RDtp=)+g(*41D7qd80^uRgP4x^Xb~XbdXj3weN#gU=#$5a>y6pxNDT^D> zPfhAsD~ZR9JM-dD1iJPAp;_R{S|$?Eh_E(m1q;TrmXet5B-dPMn3fs84=@0&d)t9Hi31jp)ZfT zST!Za9%qt*v(aU%8wzJXQt`d7o!Mz z3Kx~I!k;6yl%HOPZ-^XpJv)Qx!32qKpU*0c#{3>K{-}pL>lcx$FwYtg0XsY@&a^q! zSjMyTNg&YtLGo|-ZL4coIF7OkKd%I3kIie499w?8&j+(!bit3az96UGEu!jLQzzQ$ zx_b*67sd?!!V18|2SKJX)>3)PPPAA4N5DEApQIVM@+hu5Y5uNmZ5Mi%VUQoDRcA+E z0*h{ufgkZnjgV~;9Bolh+jv^lmI+8~H+yZ&!DK``)LiJH za}hWGplf>rq4<_5{+ecIQfP1n5_NwwUnxd5902QhA>Oy(!PTTWBiHl%eBsi4WtIi_ z5$+0vD$E^D3rDy$)@9&jLrFCLNKh{Y*vW=h0%1UN|H!B>911Qt{@Qu#%vfTVBw*rm zF)JmR!kq$Qz{cj<>Xa%xOMhat(ohk|dXC%EXxZ2?PJ3%$QeaP%vK!K6IQKL?>~4|6 ze69qo;5pHm?pk+n)icx?kW=Y3Pr(q2dt3Azb!r>8@V1?E*3F{x zw##cjT$&F(P08&v-X?eZhFWU6-k%3)AxxVeR;>KMj)pw9E1BP0~GZ!Y}qXS3P?E zmW$Qr=L=bbb{58829W`8uU)@Hcl>n5o9X#S=D7GfhpM#$v95fF@0CVXkgGmL)3zM4 zq9nr$I@?*!J{LMKi;?wW0zahI+1bCaDZlvcWeYCH4416LB0rFwKj}ZAlpnoVjxc&% zEaIeOUmMLI5hDEVItnGhldTZ=x&CcERjc&fPA8IST{n}cL2A8C1f%AEl}OR3rX$5Re3NOuNl3JhI>hc z{kUL94r0Cffe-;c1X|X($a|*&2G|{kU(Uk#Xu%l*tu}{kUm!Chv1zmTl=k$8&@Oy3 zYr0mk%GwOO3wZXTNnvCmLKx%x{_=U1G%Yw&kw83((D(RE7;D4z9c4BVDUu}Md=z+a z8QK-U$q6|!=F(BzGZJ)#ON@~0LhVHBMOZQv?3FP3kpOHTo51KObeAG=Lkv;`;g;;l z1gHY_fjC9lGPy^!fO07O#r9XG6W;i0!5hC=Fb^=3e>#njJo}iO+Mil5 zw@LQLm6a$k7f(DX^{YRb0*pMd)jO3XQmk@_$VcVN6=LoUXS1R^f3g zPgIV7;a0(9Y;0>awrXc;mgV*@jE{F+`SEk^kJG6^;Bu2t=y-5$UDrV|HwuTd9CFrI zeC|b@HNd$t4{;f5J)O?$az;Mgw*2X1$u#`8?oGYa25YU-@s*#k1jW0u$*Y1M=gY`V z;+-b&p~oVhHq~m{JGbNC+Mei+QN0Qk>=pMcCv$81cXeRG;n7%a?6UJjk9ZUG^xZ_- zdbFI*A8+f`{b!dCS)>SAxhV~%iQUQ@-VxYDk?KW&4ViKy|7t7}Vz=6yaBZ)U!nluh2QN(H{5 zN`uR93SW;h`MZF5Y)OcGqyn*wey%oQo3a%BEYm{EJ7Nd0O=I7N{Xm;z?1+8Fh^^Jg z7GF{KID*JXNy7xc`wZfbf?T?Cl+CF?uF~XD*h%{Q$q#YGt@3fq_@<>?@yV|_QB@;A zXYzY8V{pL!udb%&Z`&q3X#*FG8c*|JO4Nq%{qh{$J;If*qFQ2RSK>-h!t{^#*A&?d zAy;%|$5%nlXTCuv7iw6heng*s%$=#Y)i);g(#p8|ymzBu{ND1dufyIfL{$pvn{YCX zpKhslp69GrFYa{&Ao&M5MJjVnr1Fx zUdDFoU(*L+qlHT-OeTyDdVn9BLvlkBe*it6{12lK<(J{${ec7|w96VGH|~YNA|)>D zMR%eri>uuhL6VRZ#?eCs%2FAKXAvha3p*~470-bM{E__8h_HmTtD zqdTDu&j^+HF)qlPXSwtfVRi4RwqXu^RWM8{O%H^;<~){Actf0kFL((&{iwePqHj+mPT~4F6=?^!Fj~phx)e*($)SzvzsXB-?&H zcyK>Q@MzCpQ7)^r193<=I*IyW-h0nl0X4UYY}I?4niT6uT}zzNP>h z&zu@lffnjBB2LwnA|h;;^ZE!-&g?31XGSNNT7IvNOtesI{!`FNVCuAIi`IW|ym-s@ z@NopDNZ18ujOI@f;|w26a+G$5khd8DKU64{0e|^RAbIV%o6rA@w%4lv|6Oc2GttKN zNt#ZEsQBZQlRF}Nadj2F#|sQ!sKf%iy}-|Sd{our2=mXqIUVz92NmOSPEs;)w>INI zY{Uh#cULFWOcn8E+MkLXT-tG4Hd17leY9tnXrme&%!bFmY;Wf(({~F7F@|`XwTl}k zGd*SurcAC~&tFi>`0rcF zmI#Ks2Ql+%D2ei%nfy(MdtWPBUz^=x;x8oAOv@O!85V5L-{V2x+v~4AH$+D8THI2Q zvNkVJTR#~8@G9xp%eB%lS#1A~KCWamlN_o}09=|sVp6jmwA|;Av1jDvUYGC}G*>lY zz8Jz}X?h$t)sVlLOLvUXesNio~)phqxHORU@=f633jmj$f2E z!JO)Zwum{*Ny9aozrfqt7W6h24WlkPVVox%|L8L*>j6&22>1J+CS`TMPJ=7NR*`ib zwC3UB|8zjnJK`DMYD}`wJ*$$VWC;JjHtnjt;N&s8!=vw7>UB0%OH4_4GUNd4cZK*< zwvBi);2@*x)fXkS2A=748Spx6BM|xwv(BQ=bi%6I&Z*1#ur3Z`bdv!Ulf*r05dI^!4SgO62gnie2vr0Jyrhiw& zS6=2Fe|`*km$2$Ri*qTQ-TC3RXaS6p=xp+?m3dX{sn|hlU$6cZT&5Nt*<)aqoBq5q zHVT?a=O@Y!L9sTUZN}8tuAts`rN+l;?_xX@d*TLLO|mwQ-fW#uS&zf9Ip!Ok(jQ&w zrL7t@k8cm`DHvRNCHmSS0h3YcLSQK{xuL@&1>zF(zh#il$BGHD;CNvDU?M3QR4n4qe7U-%Qd1ZXLNzzT(}k!@qt4 zx+Qg|lu3LcKrAmRS0Rjebl6c9wiVz5 zfzG9MTf*x!c`gv(FE;mKP;4r4yWeK#JsTY7lodJt@gP>a^o~v#L|#<&JRIm%Fmlo| z9qUf24k9|DMG78fM`^~S@~JZXaCiG%JdtUbHn(iVuhrkBIp}XuL-Z^am$hwY5+oh# zQS>@cn54TE7iSfGLR7wU-s@=|iU-*RY{2ySuJKW{jicl)tNbOmJ#-Xs@<8Gbnu9(~ zzKQadm=OI(PMKt9=NkeOLMYZkUjOrlP`J%vyoKjf!iFbD5yci zi95Nvp$`?#vA>dC1?&rEx<-kp4+7K8=$7X&^Btd@R5}ea4gn5`1rwF*Yq!q=X}b|5 zz{O(s8qo~xa2Hma6AC4e^ML0czHd3Ht4bE^lLNf*{?FmtDW>ywW?prjoNlClOtlDM ztPx&&@!YX-_=i6VIG%@VR4~6>Z3X@{Y_`1+V_HRB6fz2VpQw{dTzm*E&^#u_shr=_ zq`?WuLb0%y1*N^aQ~&h^=*qw8(n7?vlH6EFH$sZ<2FRiJOpC1J)zA^q6)(2=$xq;m zkKTiy2L|()QC!EhYWNrt263HQ$I|O-HjpU$Z^u4%qjN89YF9M>xJrfLYF++nPH7$< zvaGGZpSMdynw|E2**}~FZ!QL$a#HsHUyCB&5N@I`>BuFNFup?f(bb~&!(fnz3=0KA z{F;kI~gh^J$O1(a3eCv%l zr7e9TtCIf2o9=NpOIgcdB6-=jtA~MNA*$oQPqNLN#}9u}O|jplz3TFz_?KM-;2Pxm z0T&4U+%N&*Id$aJHgyT2&nYI_?P6N!;9Q~E2Vk$2ouJW``^W)XQiX-793SvwjD%=1 z>p7Ct%k41x>=RI10-NotQs5;2E){ZIt`+XmB0DN|JLA-Q5Qm;7M;>5#|5y=ExchmX zUVa{<9OE++gx~w$PHFrO$z*KmE@2p_{=|>`wZxvQe`3-M*!MfViF{l|sQP#7kT4bi zU91pLIVI!7T0c=WQtRh*I3@kU0+bbdFgzjmm zCHKG5n$EN(9?n_LBX(q6LDesJvmJM-oM>%+>RG|Z(IFPdSy&C0?$HzPaa5eGJdn(` z5Hviu2p@OR0rx^n-8#@b#p--(V1{|#g$dZ7y9CE4^3vu-=n*;z~qxwWPz`Huz9|7xIPB(|;@R zt1#cbF{+->tGxGX$B*6#SS*rJ0c!e8g0TgHPQ;tGBV+eIZkycwtvFm)fQ|1@P$?bo zG^xoMk$-uz{=ym=bC_Ru_%3WOlCoEWaQ-$RM8`da?7lK>aQh`VVwZp+G)rp)?! zhI0wFs^hWjJzMHF?Y4S>M@i+$lgem$6e2J57Puv6)Yeh`MJZD5&$INt7e06&a$$A* zJ2jSJ4U((*Lz&m26TiI6aPtH0O3=TGji$URh;6387AbFZz8y~uQvtD*Zci?k_H=H@ zeDKA_ied-41ZV*rguKrf;*}2`nRlMc+M7)Z&TKHdY zk*!9-&pSSe)Yb(M6)pFH;!_#g&9c9JVnHT9`o>i%XLO&Qx=#$hTWcN9xj(Da!4<@P zRI+w)%?0Zw%Jl9KQgH@*bjDI=%+w!bJTn~p-fi~onTMTADN`af%i`L~yNW&0W^xFr zWo^D*r*h#tuYY4{vFnh-c=7{{rp?scME3Buat2-p1}hMt``VRd2dX0$jt}wjA}@4k ziOP&uAnSQr>mY{E49!7xtXBCJ>3e95O7GktW{6ca~6vJ@ntDh#GM{_H~Q!;8-cmzRb7W~z3nB)icEo^1$` z4d5!Y#-#)PRVtAgYYl`qDH%P@;|VY4-qzdDsKz!Q?Ld(BwhdR)MOt>%hd|#}8iR~Rj=>VhZ;L3l8W5pWv|0L7+29uV4qfdN0 zaRPd)2&h+|1zft?z?u50wb1A_Nw*q(Z`aPA4w3+SkVWfgH|K8Cu9$EYS+p^Qhbi1r z=C{CioYHXAp1azBBi; zNB0rT%U@BrdrkP~)0pVUevWtsB~ym<@vWK2e=Lentaz17*m*E&)9d1Ox*cF8?#jlW zUfC6FXlPSgq1z%;`bzz&uLWbj``50^+q@6L+Ak(+?lBbf121g<31BWQ`>i{~PUiAX z94Hd=TqjflM)TT3?$`@k+N(KmddV)$evLwHPtX4n z>Mn+If$5{O6INih#NR&wpR(_>df?kwAVa#hDak;wXD94si3^g2vV2VoWAEYaNZVyr%$e_MY~fzLy1hO| zdJ7bA6Lppb2iz_&U?@!VX8)jNBw@K0j&<$M<*&L2nWgYFp6|y z5gA9_^NRECq!boz4f5eWk*G))`YE__BXi|BLHX=wh33&=EVpNM< z@43wK;@@$Cm@0%gulf$s?#!iYvhg6KSk zwibJPBwG9SceD@qqFsTA#vYTS5Bp{l1^ic;>#&8v6WqR{ehXX3xhkj&-CW|kO*=zx zU|h01jW;>&LWvbIl>gWXWwPZ-nVGndOMze?)2&IWV%Un|DN#M8Ty;@vHBVkDkV+!f zPCRJI-SiVJ-x1>RT%|+i{Zq~)y~rf1k9(Uie*Fu&OvE6koUGSp_*$!PDY>;UdSBeO zHWOl5M5x(m)cbe`t7Zm=7P)Y$ z!OqI$^NyYo!bESNg#12R5Ps&h$y_+}A2}UfV~{lU%k|ozK(v*MW19N>_ZenSew*+3 z5XbZ60yV&6IHaqwGoJ?>M7&=A2Y=@zhBY;Go~q&-mnZPP_VDi76fM-iXrHEUy{aX9 zExv5nxB~8{`25J{%kQLBPk(`jT?Kt7s}R5gddD}{`^Rh(5lyyE8KirijbY=4VD^aL`E z@@6s;b;fh~QI^;SEiHep?l_!48qrhmLtyyTPiYHe)Cf@sYXfFCke(5fs32+GGgkFq zA04=_vN6FD(T+ZP0JAB$!Fg^EcX$YyfXg4TJA2QH#Eb4+w0i~O6zI!T;I_wkxwT7g z;FbkaA_X_3_4xygY)sq4?r6}zL<-}~D^zNLj<}17q=f#G=Hvk#1Hw@y z>pXI3-Dv^7&84kJ?Frbbnl|X0i@}DfFi4_d4zUB@k~EmPJ030~^A}T~N~;n{e{Wi@ z$o1G$+cMaKoDOhUr@=dvD*sQloJ$WWUp2x;P3r7taEUC%|3}kVKsEWlVP8bR1X1FL z(g+F&sFdWC5NSa|a?&6rEis1DAl*4ZDM{&`(lwB7Mo)S$VuP{gefYocd(O^bo`Ztt z@bLZK_jO&LE3on_y{?MDTS^ke)0l-NC=+l@ zoYdoT$bIXSn6MHokg+Zg=1gEo4Xx?z3 zz3s~>g~ofo$aH0y zGZp@}Pv;xOXzXs?#JVz$TU~F|iO4MaIW=pRKI-eerCERXLjrs?qowz|K&$-x>$3G? zI@*!ovb9=*zuWcx1Pnoi+&Ar#GuDY>Lh#tyZnx2~ly24NZ{DO=a*p|_@I!fl=G!5) zaUzGY&Ve67HclIL5_le4KxaKLSascpuU3TuY%7}tWdfEK=yty9?A?K<7fAT*YutQW zQ746_9KLdl%;7qrJ5NY$e^B&RPqn|){QM_J#IzE-nM33fP{+P2xcMaTQchppdW&fV-PJdNe_y|PuI{P zLl^!Clj}_Nu8YA3Y$fY0{HOn}U+nRjK&nrjZI0;Hq!MMOba5d?hL#n#YHMjzj402zZd1h3=DVoBIo)bpYC4T*OV`$Sf@BzDz3d9 z!V9QOFwT7{4Tc+|kYK9w0pN6Fw?TkV;JGSTECDRbLHSZI(#egzAX1zBYYygR>SxOv zRd*%=tf=3Qolo^4KS+DG6On|5n6>h*!!@H{unQp#bljKkqagm^+mnB}!_T*lO5GGH zvZ|Y|yn}L4#YDA@om#py3#9;&flqg1a${+IJ@*9b4z%nmc|$OTco591(j*ua^*8*B zk8W~j$7Kb5y=dly)}wv7+RnFScfYqdh&JiRcuwv=&06KRE9R7W^g@O!A@gaFn#y9X zG$K^y1v2ScRN{qGjR4QLF8EyW=bV=+K0+rl4Boo)uTuW0OK<13 z{BcN{!k%(EKN@xV=@+;$k6viCR_5`jOU-1icLEi|_X}_WgYxEViEUlzf6fgCCz=U5 z&>)%lWYfgQF#=wmEpzYDb;fQA$=&${v0GM>4MYt7)}*4&d!nV9LJ#)&_&G&)J2W zaWxcws1NtSr`tGJgF&z(h#%FEEXmMI4D&*)@|1GVll%$W9TgHBXE5b)EHRiDhMNv` z99|ORmQ}M4vNPKM(3vr`=^~p)idZ^ZcD&|io$D=iQn?*98WuHWelCECjJe{P-@(FG zoQGhjzB4GA>~Iubde-ZD9y5#Hb!^=j$}r#5ZAJP}h~S>-*M;}G*ldyWYpuLuap6l( zxrRy`i8=oXOCrJyaFGIKPx&K$pUi2xS2=xH0Dc|`Ms zbOYDL)5VrV4S{Py@J87p)(;9|c}ynM_OuC0*QDd=bM9ORv4m{naVQlCwe|^skM@-k3$84>P>CQ|@esxu z2GSpJOU7mza{g1!R_%YWU=UxRK^Q8wOo7)?3G55;8x`f<1>rkj*O#CPwR937W^2t1 z@}=X!Vw7FLn`P-zs`S>#tD00}jN? z$)!sGuHe#r5p-?b1-Ug=y^y8Hb7FPU>tK=#>K`oM&NJ{M0aOEmQ~pqqaIn;;Et{YV zE&t0Z+iQ}A$O``B5d6a();%Q!i3uXPI8Nvfl8$6H5<;>j8ZnUVLs1FwH2j1Ywg*Ce z7Fh@Mw?80G{~Osy=WDvKt?e(2M-qQuz!BeJYSapeXF`GCGduj`Dwtou@c{n_UY*Ps z(AsHDEdGW7jCy;K?EG($2r6a6|2#O3FVZ_395Wno4`=h2gbBuDm@xq23)G4jxy}(j z!-3;66Dm4t3Wk86MU-Kj*Y0roOa*AYD(Zgz>}bGU{LhUXA?pP*C&E=9x|U$UGnM@Q ziTf|CpQTMHcm-a1Nw*nWmc>uRo;)uxCa`$w);tR^fv!s`eENhJ;+*4}==+9_-iLgo ze-Je~#ew z{Ts{MY%*&ZTRmXZm{?y( z<7IW~b<_Ub&d=H`tL!a*HNI})*qr{bT$|5bG0X6JE(h`(sfM@7GMHA8`OYYY0YfPN zdqhkLvE_RaU*H}|;N%V(?t3B8*u7hU{Dc&fi+)xvKrxvDq-ubui!cGE7TTXfzad}1 zMh19va0;HWfAmO@a4Abqg40t8+}pG5loOeQ)!fVHAOaU)0s|bH+B-NKL^tiz_}8}y zG_8P#=k6a!P1vmS66nJ1g+{+D3!LHJ15u?&OA`=GRZ+2yq<`@ffpeZby-zwF>~{3+ zgjCuy6Tq8i|2clrR^I^Ye4~lu$HzmlD(JqmOx?zdQxLu|oDP@i0Yw6hXcN+sbMM=n zqi;&A-N${Hr%BZxjm4=N{esDf|Gb#J`rMxy<~;h5e* zb;3j02mG3tjTw8qcv?6xa^y)=-Tc%BiTZ`DHE(#dgNw0cPbgayI}noj_S+Xik|7R5 zVT?ix{-q3p@AAuGTU^9xB*~~5=mwso_=w*ftsE?iBkUNGzNQ?z-k9J-#XnIqk%f)y zBIN0<#mWd6zeoLro<;Mq^U+70`s%u5#rC=Lu&u64=O^Qey)9n~xxT!#?-q@6jfe2I z-E?)LiIneSW4t9JT+C$I!qU6SR#Dd1a_4@>T5+@HQW*jz6h9`_0-^ZXVkvG??qyPY zOGP+ua%;1}AY!Q$mQZqQ$Tw(;*DIqZ_*P!#nP<}O-k%3FPE&y_HoWfRp9vf?9|2C9 zQu3WA*M3Op)3lG}TDmsxXP@A_P-l<3C^&pkpPjv^nM;0^(Xd6%J%*8 zGFcjd&@ESya@9$e;USA3-D6Mt{Yr@^rF+FAqZS1?u=)Ty1d!H{&=KZ(n{SrM-M1hq|$ic}bf zr3|6T-5mL|TcT&UnkTXnrk@@(YmsI>`(@>+)@a$nrUy+{huS3ik6Z4kQ8TA|d6*S_ zIY2z!)7pfQq_V3PP+eSA!BbHC> zu!T0!Nkq6=xE9ZpRzn-Ij!Z==Xh7!TkrUL!ym)uFh@E2KIq((uruX4y{t6o-zWXb< z-mdtal65hSsb`GGUV6qbjzb@M$Ueoe^=_ZzV;GVggq8-GSpduQ$_sD9yg+8`NTne}~^uYVxQ3MI2 zTjkkbg&2CaAx(Rcc<&E4wUP_Mm@mY2r%W|^8Zfv6e@74mjzQ>aaiJv!j4SMDg&VFT zkCm0{7;9j6u@$O7;oofF7^vr0)`1edQi$w)t#TM#FTFm=Sk1>N-E^ z`+G-K9Wl{zVt)kuhxevrC}kA9>|3!c+y?t>4{Zp=S^^X%%q2K)M`))&kTZ!WRB zUZRMa4&Sye6`@V))Dg0(Vc`D0A77G#)eOLnF#*1JK z=GPDiySOM3Qn#}AWC85(NnkL5ikCJRG##gnCxYz;b@U4+r0?HEfmEE(>%g!jq)HZ% z9Oh3O8_szH$YHPhB2O&9r(!jeI7l8baCHeAqS4Z_+!a7a2OC3mfVN};12Nzh!oE@# z3CrFG0d8La9dIqu2U8a5}ofGzDDzt zX6L;7;1R0C6v!+)7=9j;1Pk-ZJ)rt?rr^-l_{N3xEw~PcMkjjeJ;Cjw%??inxz95 zT_5e#P56_?e0TjyQ_%cRzr!z(56O9zMuY4X^Uj=y)A9J;UN<~2l<-404!ZSMZ%SWzlf{PoRL&?*>CJwro=?4IM)5}QG_qc1FF%TF zu})!zF39zjTDHY)8gFUxrt)iTawctTDOjY~wN@f80a_r`CNH97_0RFGE)C|yd)%$7 zFK>%AJ-&Bqi+Ec?R@3N|b86q>hu0A3_!k1mTaQAKGVbRMGnmlnA)4N1AR)D>n+O@t z-Bsna%mj)%lYiiqSkd7I-(poMY916^9Of6yxp=xA;)Ji3%wwp z-IQ_l1fMAtE+dOUZQbn5FspW8KVqf?dx?hZEW07m2j!^;&@%3eMPx7BF1Nar7g(%4 zjOjqG>iB}Gml<93F*zulna`!{;DmzVG(i@ja0N`lMIsxtmesMYfxRZoYf#?X+Gk1_ zHf*r+{;LHH1QLFtCovGUwJV*Kr23Zp=9wEMoe2zgffwij;V ztDyDez{CxlK<(GiDct6J^&K6cw)MsC2u0Y*%fI-~OL$rd$^a3cf%;&A(kW1udxOZo z4vv~i2dWqwqQylXyPuR}E4(**jGw$g?7pX4^7N{E9~g&K=K>2huUT|K_`p$lkAy_X zc0l+=@l@7Ci(XI@(I;9HLm}pCrFfbw22!cO7a*ZpG^3wb=cfIbpK#(cQ`GT-hjj3g zghF$WX4hl@1KR`5(?~gA(&wkFHUnfLC&E=*jS?>XNkryJTUMd5W9jG!-e>ry35pRR zuoz?E)qnDS4m%O@NI*!E2mg+2t;O4$OOk(+ss3ULGdgw6pCx|=PGNP20dzMmJ03is zy=7PRAf{q?JJxzN*>61`_5CPJ(P7zM{M1q=>lO|5PfS7k+*i<#(l0O2WXgPZ!T(?Z zZ5T1Sd*IY&n!mpIItvaGnH6gg%Ew>l{>Z1))VYM@@4ZPH$njhAykxtdRzXdWmfzj4)3<;@2gc=5}s`t{};Enr)q zNxKWKw(`^{X(rvo?zw681Nj3}QNECkKD7z=Kl!>-PR0-)9CAZz@A1g%+&bVhH(Telr4?Xtqz&$qE`c$QeQ*wjYfl5JN;#-whU+Wza-2AF|zcxU9@lO6xVU2bIzVK@Gk?OfH-e$ zCZNPWioni|kX!zulxb#!{=V4VCX*taSw%jvk||A}rPTQUzCSm+ZN{8(usf=tr+c~N z5O(L|k+=OuYx8^_9an02Vf*=ci*L6yBdNGQ0^`wO&{K|qmsS_nByeYT^YwPBx?4Lj zRzAL-SyQF9n>O#e=f1sen3%lc|M(i$*=_XA9FwB4SB?5*iNE&VH4Z?8u40m`+$*-s z=lF^Ibtnb@9aJ=gdSyV;M1PMVo>eG4g5bDOVdg9U_ zm5yL@qLff<2njv+re3de8sBjgeVqFMtlf^D9P#c2P$;e6>Pz()9;F!MKyRCnE0K1b-X z?Zgd#bn@FVi9>m}o4_3*seAcWsOSvgz5D<1-Yk?rv!kboa49ak<*UUh*s>OnnYQ>e z_RV$s#El|_lAi=Lr$ox}t@_TkQWWtsMND};z-AaDp~s5*FG<`dD|p&4+oa@*mQjBz z|8dh0vNX`^;uuPLc0hw+)4%9{z)l^01?Q`+aS(I?i3d{q`+6Y1H;=gnk-wJwQ`Y0v zme7{j2bvRT6}`>SdFpx-&KbywsuNxqgzuIioU~S?j9WBeW1XZD>IR^8opKWoq_y z*MLkx97yVZO|oNNJMbdt$AgU;t^t5&^8uPvEj@0^C%ytXTm?*U=z|+tG5bPYkQ7Tj z8h0Xj5L&lfDLNyx7rWEE=v3Wt%>E06ZGMJ3vqxF56I+P90i7 zCWbKKyCZ;Yr5XIpMF3oGiFf&bg<~{Q3~c=vqH3Zl;rl^3Y&wbS`uv2iw(T;+9xLhYx`_JBIDrv2AUuy2QSWIrOLrC zdB7%fdYffsDkI9s5B9-$xKsCcYoJRk{7m8e<`G#~LjXp2&ZZKNb}Ja;6^2Y{S8v@- zhG#5}okQ-`(7_E%Myo;?P+i=|z4gQ5o--Ith*8V-PO{Sm`07t^qUo8t7}Q!uZG;}m z%Mw;sB*>2Ig80v_X$M}KW!V@@bsqQQbCV?I@jTtf5nwLRAH-_~S~85b@Dk$pv$6j7 z1*0}8hBm!^x6IoXsxJ+akLy<&l+_CbyT2Y_d*+;@R!PqgsMa7!r6#a-xFem<*5okG zY!mBmv~*9y;rYf@&0H&v__!O#;;}m#PV!RzmsP(nU5oHN`9+&JUb>%lCF=61_yB6Y zfgn51mJwzZ>M+aqRO`@A`IkKA1zIU3 zpKNFYp0&I__4vmqRU?)B>#N^Z&>InzN1lB9a2LdarN$ZO&~>_!j}dNUS3c{GekM3- z2`f&|@%MC!(<*FpX49D|Rqq8hzOrR{Djr5jCO}DM_ue|A?5)`t_loF0qRn+y_CUGe zQb%grE@MWbcm`+)_Jq+G8c6|KzdnNo9IH^cG!G#5-_48K@&R5j{0Sq;{9T+YCln}_ zO{}w8MSDiQAnTvpk1?m?jr4N+yG3B+Js}7ZZv_H$p36I;0}_Jjpj57jq48$hiSt zM8)Y}oi|4W!xhBu%SY5j(O;lendz`>7-D|c&3s32Z*P28*h9Ac zMD+xk)sox~4J$jy7za^MC=T;hL>;gjz#kqbzT_R%BR;9%-;4j#dYa?#ZvOWCdDpIHTu)A{m z@B|BqUwzGn&ZElli}`Viy~7sY{Z_huKlbo%BOU^@dhNgtkb5#Q!-M4@F+MaTTauoH zeDArtQIfI)ig=JSB+sa3_aJx<7652ShcATCk|G;Xx-*d6gp4zm!iQ+z4t^pEo#PA2o>TL3mgrjPQ^ z*!4E0d6Ebqat?PxZ@vuMp_oXzRIOx)tRcdgdjA20ukW(JY9;xdJkin%g=W!$x% zoV=x{EllBIo0vsS+LuSZYHabXS7jc*VQYQLk{xtzB4y)9+r-q+Aaf&1PprkEAuD|V z#VGDKuv%RL)YSGTZ^2k10GkbF{P+ary~;Pl@Q3p|hQ8n09c9hsFwPG>ywyQpUghKT zG#)@!xP(|I{_m4F7ck=SuNR&+3r;togp+q!&U}vDnSe$M7f>G!*N(G!)JJU6Xel+$ z_@CYBteyCfh82)%Lsmsb!~5+(Z$Erw_6uB{^lKSmzRVLmzr0`7ONV^dSXI9WJ|win zv%th&WL6)en9DD6fCHBZe**dl-||d!O8~(Q(ZFqZ8~ntj6BM+4TZKvAM;1NhySB2< zK7(*Z*;ns$ToHiJ<-;v{aK!>D4#zJ^^Us$qdU=bX^BK`}DIGkdIF5rh;P{#^(S8ip zg%s*=W#+`~OaPa2w)Ik1R*^DNaTkYv)>7#77x=Y?;TRzH`Jjg~Pa~h{B6@FKEH>H# z11(!em`-&SVsI!`5^d%kP;3OFN55&P8?sK47FG}=)L>8+?IcL_T`0>a6v-#L39$A+ zV(8!74M_TuRx}VN={B*Fl5I!^6PYl$nYRtGDoO(O!_<*xXx`)xgtY^{!pAyRw@17b zITUIhu}y#1vP9IE%y6=r&(4(J=_uYC3p3^U&f<8Z?PXz`VCJk{anc(~PXDP>ec@~S zOYe-jlR!vM2~+7o#$!U@KN|$>OUt42zBr`&Vm&!O!YDn@8ryI&=vnzNb)6Cx2%2CL zRGL=V#yX?f=eAZ;+E1zHVr)u-E9UE)cj1uLhur#``rvh$M@7O; zbQB;eT6?XWPHWiTyf&=9m+ty_^AwDcMDgE=fL!udzfi`i-Vtd-Gp;8E5?0qRFY}5k zd?mI6468aVu#W@;HX=Ko-l_^jQmAV$)T3Cq@XHjwuMM+gP*Ly&O0%H_N`I4T<>x;| zNdbS9MlM6AY1TqMM5^l8&=U;W(;QB0lMI&0C~-ye zVulK(iXjnPx87G)Xqn#9A_!@0d9wQoJ;jOa=e^Zhf(l{F&xoM`9q=Cd2?ZhR%i=~$ zkh9G`nHXtLf>(_~D>-nd;TH?rI@`MgApw?E zwD1Pu;XE~Q=_5o04LQB_~>X>@8mxEXWc6L ztfaPRj-a2cIrmr(B;g?K?MEXmGsQD3?s9$kDX5cSzl{Uesuq2qcf=a;Sw7Bp6`U^h zsF#$8_j^QQ_$Ri+1gQO%pflv3^20v^ePne7L3$#rd=;KDgJ2?|Ah{(S(6AKe+%5JS zF5U+ZslIyy7^&;Pu%^TGzu$0AX|S!$r!B3h*PZ2p)K7zhUIL9YM`~jCw~S=9@pTrp z_8ko1ST|3(b{kj_e+WDwY38tQ;2*lpE`ih+uq{5vvRrh|v}_qN!+nt38&+pu$-@5v z)pHDXPG}1XCgxfbeH{g{F|8KkeK~(q(P%p?(zMp$=0Lc zq3w9Uz#@V@hWAXAS0+8b;igs4W%b#1{f?u*Sw=0HrjB8x z8s?9;|IwV*U|JPRQvNI3dTa7k|CB#5;e6+cy;uQvDBq~@KBw^6f7}_Yn{oeyCeIz} zsT&*hz--fLosFvN{_nw-lyVj$_z%G@V@nY1tMBF66Wzh&ww5O67c&>Vzn5XTnQt{P zdcAvrwb7Fai_n!gwXBU&Wl{CQ#cmAy?xtBs@SST$7mm)FM97kCPEMIiVJrlFd+|J3 zw?*hA@$9m{P;I2NZ>$v!FikM{>5*E%|5_%qjA?~cgjH5f(&;QFA-l4*^^cQvdzHNn zLTGJo!&Zh>9;sPW)s&Ke!FV0-tzo3>R7+#57!d_9bU_pw*L)}d>cW0_DByagn6^>g z`*_3`;?D@dZ|(IFJ~Q1r?>I9NVf(o~VIfS}#(2olW}J{Zybnuv2}*F5y)&cdc!K?x z4u$|YpCXe|_2XYvqecGvRUtO$=)`e`s)%x@eP2pcm10}SHOUXVbn3aD__EkDW8-%_ z^Y>e8r)j7;`u{>QA3cnjn6A})J#*v9$VTMHgrTfv)}772Sv37}ov#O)9IY!v6Mj@} z>8{kLan8-y+cjgMLqG9prZJ!5;q z^uxzgH|vKti(*+WI(tFpt7mm7=twCb7RbhrkLW%DYe0Vz5#Wk&%SV#*nF(->gR@=L z2JWe*E{btUw8?_c125nTCSz8><5WH$RM$G;lV0BFY(Lv%;e$O%74SQD7H3-l#gkD_ zk;6JrKv_p0Ehe=HU9`$m5mF*A7|Zg9XBYpD7Ic{{P$M4Bf~OLV#stTb=MC;Omzy0E zw_He_R(JLL6iF_ivT_hJ$Y8A5E71$K#_QeOFW2lvh8Tvy`|kdj4J67ZfPY;)+zU@* zM925)_SWZVHV$4TFXNwBN0fRM%`ba8QK38}3>kYOk%K8vB}24G-vSZ-v6ECR8z8-{`bxgc5E`HUCl=iT_fd+)^KjBnWtc>G8G^izU?Wq;Gs7&A|Q*aJ5k zl-ThfnDo>NJ<6ae7*Vg3Yp2DxO?~OSS28|hduPKV!J&K;i@U;N+->~kS6#Nv>{LVu zdhaDwhc`!Xm;W8QNr;+qrLv5QQHhw0l=kPsUW#6n_wXyZ?Ds_p;jh*W1C0|I3)Kaj zouvEh`3G4Zdo6a3mA;2-es?T=;q1vFArPAz@0dofna0i1rU6^L^tpb8Cl3|;6-rLX zC0EA8->P^d+9vVw)1y2XmSmxRqjZxxmGb6&Be5hT44_e=cvwL?sygtZ&V zXk{CR@KN%{5!>;|$XjKK7=z^RFC}Xdz&+pr!ci70bc57lvUV9@PK1;2&>Pszm! zC07CERp)W=vFG2mY*TA`8#?Rb9PVOqaY0oJX?%~OicO(2>z1mn^J@sJa z{O~OO(=uGh{15N#eNF33zGT~9qQDGe`n~25xbsuCzFYiD(mb) zs*A4P12J~9RmjPMApr+shUHt*OBlck)**Q*?>4IT`W1mi_u#$LlFOdd>qPF^Wp$B5 zM^ooGPv*W9-ygfCd~ylQl*XQ10u<7OUSv1DZ%B9siqw2|zKSstdo!&NUzdk_0HF>$ z4|Mx}I$ky?UDr6pJ_N48u~5>TA!w$cG4ElDiXbLkBR)+ZiscZzof z;Ad_lu!-%=N~u7P2kv`6`r256j2Slm?H8!aA$+V{W<8Ifdhs!n_CY8I?&~LSe*2%5 z9{laa7_d^IYOmHkzM3$!a&Bx%I`TKl-)u;1GPaZ0ux0|ro-j}b?zyR=ttUu3crC@g zwFot2lT-4Ej9uf%r8T=NB@fKalul67vYnY=2e%}tuHA4;l0|m&0sdYP(pH%@$3(F; zOmsG7E0VoRvsKoai51s)mXDKv0`=WdZ$9hN-ye*us~sZkZ5^MWY=p4O)Amo5WQvv} zV_P3dHfu_9jvDRxeF2GNw6Y|Wu-{=ZCPBK(caWyr@7&jUrAku+{}1BtC#z$^e=;q? zP(PRS0>8$}S>2>%Y!k4eCAUPGN+nOG>NfH`n`3wT28zNqrr5!mjFCDoQ806vWfhoZ zH%Fhl6$qV`zfNX(S*RTrtaKo8rzpT#IcXft)w%!s=C zoxQ<>$k&XpjhWJ9MxMuqqBC_hu*bnuBca%vD$5FST#nBU?!Huu8a^9fdUChaGe|qe zlcmn+Opv=$h3I=NJ+wu^Te4?hXG10# z)-UGWlZjQOKS;G#Pj!i0p|n-{_)ofc@VjW3!+1<#AhS7u>{vJ5b>mgUtVFd-8c>n) zQivP?(OW|?c(0=?NUiVbHvcTU;0E{FX-U2k>d`ld{rsztE~}mhu!t?Dw``e2bjDB= z*6N9NyZz)Ru=(6HgRSO)Hkn|+sU+;0!l?cda^&+2wLn%aLVD!=!^Wj0u~R82G*oqx z5Z2VJDQ6(olN0|SQMZPV`^pQJ06jZjQr-8vB=XokeF!J+ zxm;Kd>kcV2>!AOCGLqOLtSu1GFk;;L=$wfI1w$ddCtpW%ljF0WJGTawGC!rsisq#~ zcD(9}2xXJ0Yk;yb^9W<#?qm*$0v7W-G)Vvba)SJA zpBjYJ$-_U>h{#^44b8>-T%`<{Tb^F`Fzn5ClJ4XvqYihT!^4J_oj>|d>dklailE8P zAw8}lea;8*;Q26o&yZWQn z3$uSb;cy<#&~B=IRqxPxHP_rKj+G#K$J?sYfGElF@`2<1d`!Z0m}7hh?tZZN_;scl zrYg|#qx5gYWR3Y(J3y$F5_0N8A~_!5V`?jOAMeSEN^iZh9ogorNqfpetOEoH=$ScF zmEnEoXA6OV?O`7>1XQ%FR-nljf)`k20x=i0B`V#_olgEj@OnkWfqV9ECWk9Y@bXX` z8&!+en;qL#2s;-^69f}4f`}f9M{7>C$VI5J#he$oXAG_;D7iB{X~>P1#0pJaRPx1v zU9nGn!^}-U;qI?jZX|B}p4lo|z-|!=+MB$%rUj?*s^I?GVin%ZW1)t&Wa8dAb$Y>!ufLus`-y%uP$}d6a zv*-_tuLEA7Pm3@_`mut3(ij0$@Je(b^FNGUHS`Dr#$eUVVF3RA{@Q0a|7X0jBX<|_ zj{%-)e=pgP01ANYq{zpOAdLmEHQsAF!7JSi5+>m?#G7qTs(8d!5-q?1)6AJ$me`#a+L~lF4%hh-Rq-B3n@u+e~2_r06`;5 zi!6pD>+>_5-0>XLBDMp=AJHPF2=zt!3T59tWo=1V?QoPzVVaIjV^C=M%vH&!|62c< zM3dKf4R0M~@5km2={JqcKRAg#O(X8Hci)!%phlmSUQ;<`_%rA5;o*G7reyDGqhVA{ zp}vhY|JBH?)MqTN3D4i|(Vs#$%JX1Z1$cExTiwCmA|g_ z(Ea*L)3_yfOhVwf!xP4{BJzlzU(|f3lXNGH@`!6I#>lzFB^m_}qWIHz_|RKWsY9J^ z1pykQB%ZRW^_30T_0g?$j*SJ2sk;R-4Xsz7O?n>{E3Zs>ln@INafEr{W?+4CKZ?=W z5&566s+Z83|H`yID1wM%cf?yGXcqi1YchL_S(E66XvAoZr}P$NH{qSQueWp(^&Zzr z4G{rXU#9|4@U{~YQNKNKvoVz?lP#Wbj`U+=BkH5Osu+jMCU!!&DhbpdsMFTFkXXR% zmuI}J-%bAN&Ypu)PxT|m(aFj>=PGJ#fnBeft&a2eg7bab%XwmMP8MH(NL`QBoLIG; z6eYsgOuT6?|1AZ))!6;`5war6qPw|1V(4L&YHvq9iLB=xUyGdF?PasNcSLnf4i^z; zT5|{5h`UCglwfa}BC<`CBm|yxyEF|S&GtDX2Y0QyLSE1;OqB=@@q0hxWa>ZaZWK;^ zz_bz*H%D|;m&mK?st{)X&M1J1r7*K@ZKnI6^Rv7rypFv5S^;&*{QR{KZmFq-tIw!V z`yFevr_H^VI8A{nZw64HD=+BswR#NpgaI@jb@g!-lyXXgNO!PlnPwThPc)bgE(iiS zTrxe#ZJcI?O8FXOhLA%nzVC(xKPgi3V<>)T;23092h9w2!2k6VCUX$#Ah)>SJ_w)u zLI>V1H9c9rWrJiQ!ESnD%G*vSYMe8Q-vs&DlYhk}Z8UEqkx=meV}7P14CT#@WR+W%w& zXkn24=p06NQkACRK@2_M)lCTf-Zx1vw$~4z38APU5B>}~O4c3$o)(0U;lO|po+ik0 z5&1w_;}yvy>^rfb`44gz2aQtXeSM}wTzLlkm=gs)t4>na55T3XYubT+?}Ti+Dp~6) zoNYO1SUEt$^~LF(W1_+RrObu3)0ddSshaY{co`!?GuwuZ4Jva)@8q;idyFLUKT#@@ zqTEY)za8XX`$uA}{_Uji;jQ*lgpagD6H$yF<1gn}qZ#S9fS4g6M{N-156_t|jzD)+ z=ofe27wZ>;Rq{sKHiUg8K^`t#ojmS(U62D_6JQ6|d*OaGL!g~7p zD76MN*}^-vyAB9)?ZPx0#I93!W}N<;#|d*CFABI%)?EkJOp&}_Jf9w+zL*(e4N3z% zn4Gi|o$q^yE(gqr#mIAwuIHta=UA0x9UW~8;LYLfz6+MO5wgW5*S!oz;L3;>qS6YJ zqeYH}UynyV^}MJ&H=5S6cWsU=_`81k%jLxgnbS*g^_n^$$SpBitXBMMLc)^nYYT1k z72Z|9z*=rs>oQ1(N`%z?^x z3uDScG~`o`8?S{^GPJ(F7o+~L;SZOo%|o(x;bb)-q8a86>6|0m*8#0;1jl%_Y0tTH zbwFG_b^GkYK&c~>Db+6(_rzZ(gr zI`AoY%A?;26p#6Vd|@LUmxWX~unx=C=fM~7OVl%@Snn_p#q+$;S0t_pvD#yk^38AV zV9~o!oKQ{lApG6p3OMShdzu`8B-LxAi~vG0SrYup-12s{sz^Hd4bo1aj)bsLPAzJd z4|wr7L`&>0xNMWpUPO}r-D3axpCp*P2iJCn_!EKM3)fM<70Kl@T&52aZ%~y94*%dD zJ1&KF6~WTlGnD!LTac*dGY%tl;)i^tg(t4ho|%!1Jo1WN zu|gnVtOE%?oW;sZ=xVTv9vN??5KJEoJgWmQtU6WW0vDwM&(@H-C(nT#7vp6_QtdM2 z(5B(&Vzn8@5im8oJh0T$OwFKKHrc64IwZ#XMbFjsa5|W2|>IE zKQ0Ftpx&6fpTcv}<(2=vom|WBF;Io}YvBL!3KwhWpo%~IJ-fwgsM3c|z1dy6;#%UEbtX$QQ+RogdNbd<{9D%KQ|N)J z&&KT)RNqbaZTmAE1z60%)H~}fsthC=c_7i zEs>VpnaPB+5DEqsGmyo%?ELfu%;`u}(K461k00aGcSVa9D|z%!N=IO7VIFn0;aejm zK&ypH#< zCKblA_<=U=(SRx8(dH$fkvFf+R+Y+|Asqcyd2Y*6Efic-$I36(w2>?m0y`bOE zBL<*jYRLp+agB!9m?C2OKE(JB@++~Q3p->N1FuXO?61nr1n;telb?M^pIcdCaOj$) z-;nXG+d$l~3#p+WeAKuuM0IcDAyD#Vn|XNgtTN$GRClM6L2J|!RQamR0MfJ_JR?r7PeHGAuuK5_Qw+b> zQ#HI-?_ah@E|Y=8ss>zI1;to@5n~^B%YL&0eRWegUH5qqs{e_OHl9a@$ytJK;s^qT zi?#36yz(}VG-C^GANhNpZ3#$k4Yy%;ER_xrI z2@nB&4BG$f{=xcvC<>)1D;|ArKU=pmeJxxDzV0zntvNj8;AnAqhj)UZ;LeHFjJ15$ z>hNV#*_16tGCxE8hgq`S@(!&_ET4#zoLA$hCdVFhr~b&4!FYI)(DQCbkE^Y=;Hcid zUR$TJkD-XwC~XrqFTT#{=f&z(CJ%Ji7vzk>BAJ|<)K0@b7+eY4lXj~`{fQqu{FtRO z-Sdca`%B~ItgPy0Zs!V6MCLqWFzzKnP1X)ujUo&M2U+$G{g2PWj&D;6!3$>EkCY6W#KQGwDCqur-p|JF zWxXmc-Hryv?&Xbd+j4vkY#IQ~w0==fZgxO=1KWxHJ;<~J*o6c5hE_I@PbN5^$+P>` zN8p{~!CM{m12lK^3+L$4zOsjK`wa)85*8trN^H`85HeSt);#0!kp(cj!(|dm&_9f? zXEAMu&;01$oa?0^eTPYr8Z=uvz{<2C|K^P>dNB;tZZ(ddFsZ|Nv0G%D#9Z=?1)k~E zoLvXhowFz?0qbDF@_l$go@%_U&{tw;;aK~-yv%tS(sZ}uCEuQ&1o34#2( z^D@ot^au%OQ5vaY9K!Cx_fe(%=b^w#T_;W3+CtxOfPIT)&l}ec`;(bd=wOi#+sDMt)yX@f zBUr#3x4F8D1;|`ABz`$LT2d1A8Kg-m{w;4>%U(b~HP|os7TnKcsbznhXQA;hz^^#8;(i&ld79Hb`r{N92YfAZD0%I{T zVOPb+dt?Z8zeVI+ekZ~|cx)^;fzb}jISdjFyzRTO`v#+xT>bT>lcq3ipW7w< zc`bIJx`%9{Xdf|nmT(|+vW#xb|374%XEa=K+wRju5<)5wEhKswy)zLJK@h!@kmyYG zZYPM|d!L9NEqc_ED5HxWgwaJWqs%a7pY3_x_nZ&so3&;wGmE`v|L^O*uHPlVI)K}W z-^k>|>>*9xycPrh{W0BzyGf8j@GuD1PF!X>Z_=9fXYAc*MSgQ0TaVx>) zZw8`ydJ&+@js)&8zAUn>PXjm??|_iiZo$L<#m@JxZ`mg1;v3&H_+u;e#0)dWPc<3i zPlfG8OAw7i<9!A%O0Vn%h1nYR3g~Ys--3Piezb422}*(>H8>BT(TqT#^&LVZr~;zF zi~lp|?7Ezi{3oYnkUzpk?I(LxW(@&O(e)y4Anwk)HQD2O+0KM5Mr-*6Rszz%9oANx z5hM4gd0Nsf#SQzbDXJx_SIKAPR!<%+2>`!4j#JHc#4-RK0YR-%wTG~ve}nH7x8j>k zWSuoi+)yV3tvvfjg3@^=i;b1D?JQKVi!y84djj)_R0oN^pfe%6-xE|4C{+DjK8QPNsd?+ zXI2mIBuuHl;Zm=lyf`Pun%bfGL|Uz?(d<1Hi7Q*%R?3p<@#H-!IwpF$LCo}{j1&*7 zMtpJit$ho@8oDRNM-Vwhpm`JN>gM7cPs`#oS zvfN`WQev^M1@jvV*>a#G$P1Tw_>xKXjJrm4O%`DC34X3`~*OZ2mG{i8v!vy?dVhz*066nZcTh+_Sh=UtIDh zptazlH?;DCPB>euvCWZ+)}MjLjpq(}Er|AZX$glU7lyPj=;bhRkWJLG#)EDTK^^@4 zl(5K2G!|LGI0!-OT7)TLt1~x>|@Ng`&)iccQh!Mm2x?B0)vk>SdyOnY1R*A z&>#oB8-BI&sf1vSDz0wIDy1@r{84)qLXjvJJ?*}LniydrPVW`t5z4~ZJ4CWD+ys59cZW8OEU9N5`%t2|J}9(XhQ zRG-=OO|+azelrEkk1RH9_g|fntp}IDLu&t(_aP1$5;i0&qVmRSoaUQM)UTNqQ}?h5 zoXGRMy>D}tvM_8lnm5T$U)H_Rpx!dMlG}e~C#r@_D0VbX{Ia3;^#!pUF6!4WgQiF} zJaCdc*6&>+Y&H-XHg zzK|C)?M$g5zqu6HR@v&JEZm!94^KLQr)gSQFGl3*+?o|5G+tt=CmNAh(=d*>mq%>k zq_RtLEn0oFKPr^GADZ5{BRAe0_=XXsJT9T^UFz8nd%DT8@-N$yqKPr}f|Q2-gpv32 zfya3G3tA)2)ii;u_2gF!l7}eV{)08VvgKhWwdqe%L`wjonOMWd(Kg}>guYKYngU=u zgW(`0ag%X(kl2qh1=ISLPS4E~C=m1+^i#>l-}(T;x4U;WHY^egob9)IeE8Z8llwv4 zMpJ>P8wRA#$R00044OvZwQL+BaP{@XB$zBKJ_AF#*cYv6YMaiq-%W1DgAXfKe+O6* zzE-RzXKjk5yEA$jf$<0BEH@PXahv7wR;~SbqKL^9fSbCnNBhoSd866U-F665#uxC+h9t9^m971n!!n4*!ANus2EN=F#$po7lW`bAWG9O5+}JR9gC3vE^yOqwL zdoerai?v)FWYDY4fp z0U*Ayy?wi3W}cA_GqVU-)P?i~fSc?$z{({EDtbX6>NDh8g7yz9y@XmbYl6ak%)1?Y zvMi<#LIQ29o}V_~-vSgvR=JNB1X_ z6Q+C_tLd?{31{xv-bkH|cU?}2??<~P$1BKhG#Y47Aa%n9G2cpj{vLsU>TY%2472$p zLTPgY+^m|0{nzE54F7*-zsskTUAXvPEt-n=GaHNds^V-^pY;vZf<4~_pMRA2DevrL z=am$1@+oi;bBRJmeRa({^?Ri)x)NuJEUs&2YH^oX-I<^7o@3UjQ}1!PBQ<@f#_;cc zH%G|{b8x%GxX9b%!s|*OHGF98ohuDyoO}B-S4Mv*ZA{BbiP_2+j8v%g>~MdVJ=~8x zc{mm3_2VubklUY@D7y1aG;~sF7B(FuZ_*u$TH?|{(t0&+rON+s`_UUaq*dx<&2udhGA5 zRuPAbWZnJ079xTNI(kGFLeHN)VIX09psMq-{;n#n?4UhEhoIRpMGNQM#XNsY6waNl z{_yQz+rEVUQ=Uzw0m8&hh&yE%5DwpCp`wBjG#LeUk#2TWi-gCrFRsX264IZO;?M~I z2VuHHdBvNd(?tyBp9RpAq9AF9>#75Yk!$ZxX7jerG!QUCaHWCyuvQvG{Sx8 zGPHH^N+0gH^R@1;K)|RMnzh6sA%CCItI;2bkH-y)p_bUSMZw>UxAT0P>nEQzTT#=T z-%+B8JLjI=lzp`|K9HR-@(n`Td_B)~{=<=C)x6%(ThaAOY+|7`vc9!7<-i~=c?m-n zD!*R2J1k-lWBQV?0gZS$f}q~HZ%JSm3aRXXOUCEK4ocYUKxF7DwP&=&?_unODsGnz z)y@bmW9*U2#zUX3(6k6vX$+h?j=T4>?eM%FIg|LSiQQcGekzfcIOo?foO^woX;d|! z{rg7K#>QM%^xuHdicg(yshVq%K^>V!!FMFJ_rNWBJ6kH8({;F_U#UPTEKUQ$XWvOtMsYv2HxZO0uFQ z%<$WcY(o}(0ZfPJ9{q5S(`GD;bg#34X@yxloDWpd>dAQeH`vZkeLAFI z)OhuUBK4~ViB;Ayzj0H7!mP<~hUS`pfc{L{e=+*9@_URisrF9jU&*Y=( z6^kc~X5$m~ob7WrlsYd#1<{?2*WWWwjKDAwh@Unnm_y=b3bS}yj;r5s~!#+=Lbo@ z7%*H0N8cMSVC??%_=$mH?Whm8pqg6VJ<6LekSUiKxz+e};tP2U|9Z+(`c7MlH3i|hVTF}j71j`Al zhl$YF$%ZVkYO^s5>Z*ZmsH7z?V$BANc&O;bJvC}{7R4QZw~k|i;W8D0v;e}&ucH1M zy4*4&CrngG?r1hdp4W=%5ZLOe@yU+~1$NzVhE9O_kMYR4XLn%{;P(8GM7f0elkPPq||1jzhmE=ItY0O|hoinlu|B0fd4ehR@JK?0CoCzVO=K%kz|T zrtdmLUk?!a zg=#H1h`qJ`qwnz_Yu{BXtF_Gil-ECYCKA>LE(^eFKC=M14NOV;dF#hR}A%Hygf3pF_|R;cAxrZ>Dbb}#f*va`0W(S zhw1;SleA@Qb+p&wIhCvwOU!y?(7mDdlZCW0$)^U-?oQ?h@VtIN7PPHYh`yV>cNM$B zW8+2IqWC?Lr)>Pr+9TlF%Yx_J9y~|lyaKRJ!5>(+BvwSa3P!PS%8*Zs`G@t*HrZ^q zQIWr)b&`0eX9ITWTeerly4Dh_v%IjLIksu>{+HM5D@NW`->le{wYrzRAhCNSNNX!P z|L(TIbPc^LJ6cW3Ba)n1o))&|dgN|S1VX9_LqC_DU=z+R-p?ZO~Q z)It2=&^m*By2SJ-9nBR>Z-kPj{PnbU*7pz4oo4Js+sm(rJHw7H(>3xW@8F9ax%nC* zvk=LQHodWM@1NWX<0sx^T}?OCc-jm@zIYdONy*wpOfMouey4niEUJ!u*qX?NM;F$) zjF!?;gThZ1K!;>#dVneygkPu9X+bFs<#|S$kc|E4B{XjE=|}{~Ubl-`Pt6d#U!Y^2 z{V{HPZ|7nPD=n7N;QQ_9wRr9DiN}|AigFBA?ZUHwi97@09vtJc&~%^9QNEM$vYB>N zTvF(h9Y;1_N{0m8Kb)w_yh8^{m!c1DCB=2o3NE>f+^=Kc#<-*sY;9UM99r|FYem%K zfNs=r#cMK)u@JY@1~f{pb`ClE;Ho|}8fo1mClo|>v?>!CgB();uQzYbQEX#V-~L?; z)TgW4<6C9A3^CP?bs#vwrq@q^V7L$SCIsN4O>B~ZiDPwQbB2!x-xefvCJ|QCbK^j< z4PjC4gp;RPl(^sgyKtKu?oNT=tH?&rd2n@mnAIF3T}86Y z-5pY1EHaU_Ir6&_wLm9xUmB#?!@~O>gIPn}lDf;4q(sM$&^8*_+M3u6KoQF_Fn6SN zZjKxrB0z^z2*2pJYx_FrNS)1H%XTCB__%9)+_#?wdVN`kKpp;znX|!T41r;?^F%u#6$gqf0W4t-ByCp7z!y=71Zv6q0vB+ndZf z;HY{grvvYj*IQE!w5OE4&O%#b)bY*+mu{;Kf~%QP<9piDg?sW|*YfH<54JI!2&k36 z48oT8G@YL4?h(^5tvk(xQ^K}>#>V8a`9!|Q?XJ~6nqDF&4mer}gyYJAP&f|y%40}L zCDVo@8MDBjYN%jr+rbR$?(V0;x?b$od&a*r}t?bj3j;NKp%^KAELc-_+{@JGvp;Hk97TQXfE-*M6talvuZxGBL75(Cr0UG_8 zp+7w_(QQBZJi)@ad12D_pOT%-aL*98DAy}WMe_S~%74M&K^kumn6{FzbD$DP6sc1b zw_ka}Mp@=Gsh*ENXrj@W#2lZP4ZF3}$BEhvOfi|!jtxjhe6ozKHbR zr_BB^!wYgK=*Qmzx@pj$*Fz~|4lZWuE>fb8}_QXPH0KTsB2 zf=i|W<-eg9p>w1j7B*yWJcm4aIWFf&ZDej7kCSFt*X%#_s8@1r@{2J)((gg1*x3>4 zI#A5co8aTdXnt*u;(KK!;3sYS)xqHHdYi+TYs^Q{ z$wpYbNj2)Kne)Vgqff7HLr2XYpMtDRRR0AH0?9{W6l}3cFdet6b!(=pseN zwsa}xO?K}Lb)N`-&JLz*jR5hLm zku=ibsl4X-h9jNCw4QZ-p6dy5)qcC-mH5mXq2l)|7Muy>TUJvg-Iu4e@g%8&tFdip^K{R2nb4bKCmq36SUy2yV-b$w~A-U z#yh@oHC{V&H+l(mCHs-xhufa(_~4Zjg+-`DA$`0y9db5sfc|!VEAW1^Xpo?9wPM`s zZkCFxd!vI!^Utu&3Z;ox2`jc ziGwckgnls!6+!mscMz;8M}_Cv>xDPUxAXmBQH zZ+!*72hjy;dz>TAoZTJ{PQj+DnoBo_a&h1!uSSh(%@YuHzf5Cwi>I^5 z!i2+lfb1;rVA;0GmUETdhKR~#e)+Jmy^U(-wMzP`@V54zSb(+znNP@S&e@gR?rp@p zW#cy@ygEsL(PH}et0MiTN^t0kYTuX6hMMm=)e(G|Qn$fgmruaa(_GzVLAQ@!l5s&} zjAIY{H+E+=6lh?pdcMy%vik4YRq5^s@Cr4}x~-`f(U|?^e)(l^l5|6uFwOifJpMN5 zMFQq8F2Tvz4PYXu1yo+6-r^(d9rHqZR*3S=SfP6qic_O5*mH)Y!X?y%Ysyp_C_^FB zc(qdlDBER>E1cs4i+Njd!B|8Re7P)hZKwaRDu=Mh3`vlTjS!QGuirZfN?@sd3X6ii z0DhbkPsb|D?)pOE&8U4uPmBi{)ubsJ*#Dx1`~*Nq#p+JQix=+l?^_a!e8^~j*z`+n zRDQ6>>b9Y-Gbwa}Q9yk=WW#`GeFU`yr1`;1h+&%yX>jk&01I&u8CAKBWjri#a@mT! z4o!TI`;KoAnS4F<_R2N<*9YL&>w3XkT#+LO?n7ZZm^P+onaht4%U@G!V6{h5(fdwk zlp@JHr1aJgg@|&(>kaM}&H~{-`fE0h5Cuv%WllFol!ZZ-|2&S8TCS`eee63A{BE&M zrjGg$x)tX1H{ShP9XaLkSc>|rh6*#!Tz)G|nz&ytzPYWvlp#r%`=gr;pb@&{LGdrX zI}YUIuPKeud7u_p&!FV`?<~$q-S2glRRddw;BZKkjUDYQU1~!tKb^~QyhOq1U=4^% zzoXSRgvi=2>RIrzE5I_{OM`_Y>poU=(lwFHHR=2sz#esmtEl&Xsy$j8%U!z6MIYm0 zk~pwj`gcIR#W0b_rjSPI>h&kuNTZ$ySe0IiN_N)2SLxB@#_lcf@`~_Oy-P+ZW|CR#wxc`t ze$?gnF{NbOPxUGc{2f1oR*bf)p%R=H>6&W~uqY0#zY=kP;~5P&du`H{dGp>flaPmR zDM_huwh3JkxigUkA6(V%8b@}HriOe!Q<30b5>RQ=qQ3OLkYQ)kto~ftDsn4$`XU)I z8=5_E!Fy`QaZ-Ko5RjR4EfKG_+qd%M@^>gLb+s-QFzSX+#y>&RN#;FU^X{G4a_>e_ zCbt9e$(^drt*Ab{T6(@$Tp7avWHs7*Lwt_}w(z27>L6=gA3YJ@a21sWDyc=CO83=r|FLX^vgr*d}p2nqv8x1+9r9LZz8{g9^}_?)ZCr&~ z+-?xT_>cl2h%i-{9v$?`B z9Vq3tW>UoU?@{k=qVe%`^NbnQqoQ6DITgB{_b-~E1zz;CRC7*ptP}wDY!I{@Sc)()gTP!uNYK&1!1^;Y_bv zMZBuNZ#=jzlcauOGS7!SptX>!@o$IT{i@4{^-tY>SU4M`kV0FuS?hTe@<$G3K=~YC zqOorrK4b?!X_>i;<~kM-GCDP~f1X20PP^MwopLEC=&Sl!#V#rjt@e%b@+Q`gZy|dv zjzBp!$eqa;0Qa_(Y{mHEt6L%4Q>J8o_G*pdI3&d0^l(N`0 zky$&Eu9PDDP@6PUV>$RX&P^i;i7z+SB>^0I1F*Q^LQX8)WqBYdEr3 z_$tzT@>GD82!y=l4|d9!f?`#OHkis{n40^I$%byS;D=2Sc4(3NuNukpg-pVjm|NCF z*7NRBzv%gk=3k74wTaNUE}(2j^6r7A0&@?Sl{1;X^~qG7^+|mc@uu1QumBdr6*b2d zvxWajJxLeoZf9MsvX_^kdqUG?waUJ|=!hmGM4Qoo!&oR{!Ga$=IeFM713n}uoBG{| z*gsUq?cBviw-MrTPmNK??iw^a1PJ}gw{IGq+>*5rei|l4z<{P~WX}$c?%ofl#%9K&> z{>XVh^EKk&ibb2@67LU2kj<8*F2Ed$&|-QtA09*0w*{!MQR#i!=gr+6bMsm`GB)-| zu*-880^IxuiUw8IE-^-t)>sV9@CfJ zP^jUGWa{XoB=YtzKyAL+BRSi^J0`YFX>-I~!{6PlMv`lYfhej< zQfr-0ce|s%kk#-!(Mlgyd5OsS8~Dcig1uvi2wTcX8Fz8Y=dQjeA^J<@a)gGDX?UGT zu6m6yyFsyFD%s!b>xihZz&7en${ICjwzO;8o73AU7pFqcc3Ph4;0xV1H7taeiuM*X zuHLTw82ciLSMJ}e=;0~8_8JSl!Mc6E`s?`C{ku%YZD+QIOW|`le1ag9o=Tb&#{@uL&>35cu7Ds?G{!74e=ArPkpmy$3e!=s$ z(fnU$dVh?_Ze5&_h$hv!GuR-!b1&c2qr1eI@E!Jv;oRpRFu+0c?#i{R#B_?>MN>E2 z@!Va~xs&^n+ZUfk*#+ZrHJKpD86)lHd#`mq$ zKZ##c4!cm0y!@IoT{g#6=mGo}9OCl)f+K&95iWN_KcnM-WjCsjGCY*#dz18E!_MnV z>GI!3W%ps!=hbxch86^64%=UFvI8Ng=T*K(xIe##x!oU{&Z3W^#7FswWNgkv>0Nq+ zE_qHVVNsUg{r(A>e`kb$5k(6>xC4&cLPNSJRH^)pw zeZSs$e%$d9C2_Co+`^%Ug#r)M2zW9h;h=GUi_upwxM5bT@t_}^M(kOF>xex_EgPV^ z@6<9#_zV;aa2E+A0e5>W8cqaxHDsio~zoCJu@KYdn z@x8Uxu8D3x-R=Tpx_NK-L6qyagH3IN9?NB7W1~W&TZVDI3_hl&GJ$Jb!MfwSFJl;r zyCrk+W=PIQ>TSl3en3Lp-8C)%y|S7pW8EiM<@zE%dAr42k#`T~zbBh&(PnO%;5Ne0 z@Nd9o8M$cmZ-C=wmC_2k5qX2T;5O_@lr+8agq5Cq)b&S_@5AQw^oM8S^S+mU=UTCs zpjF=YkckjhCdBmX-K?m;^P7~f-}u+>F|WGT_ir*s*DHcSY98sO`Iz9pr+RA!G!_%b zBF7I7y~vxL7`*YNE2fkjry3G)I_x(Jn1s(EiHERS zQVZVM(|t^Mc}ox_hymZ7%G0RLl6TbIb~l!CRyyA{-ukbdTtBhe|`m?%uL$^-V zGyw$lXNTaRXy*Qu!?u=`Y0_kXANsz$qg_V&!$gJm{^25yZxa-LHp>$ z9SQidK>lvj%Cp!HDzJSN4J{U??>7&}zP*kfOvWX5qGll;+C^w5$tY)thEPgq+-hF$ zFW_FRR_Yz4S0AUV50T?p)VO4G!t|=aLMtFX$^FuTCh-ol-sb9wo`R{&&AXog&wIp+ z=`||&a`8+E6)^~{kQr5&>@@#&^1S;1q2t@2AJqFo_|Lb;-`M6) ze?2#$5^^~9uYX4s*IsjMj z3PK5HKn;$n1zl1Hiwo-c2DHUWByH*TDbEEfrr`~FesYZ=K5B=N4R_)<2QKR#2c!xy#zMysNABtjEVt8apQ)tFrT%-#sE%(u=vSK55Siy8tr_Q3w>ptI8-^ zDzJ`@P=q3494;R1+CMocVkoy7$ZEW+(L~_9yzukEJ5WiMbkw;Du>)wzS<>d zF)59{C#~_XQ=zK3@oeweNBZmO0>RzNU;ikk1c-l=r*h6}7x8eYeSnax5V^$svbEv$ z{w#kxiC|BmgD?Ai!T?K=#8O;j4^&gIg9O*2~ih&l?+)U=imKC?`C0QA6wp< z3VBAkDWx*M`DVQ{plHdp`bt$AeCBkYX!})O^vl7|v{_+P$F+7a6N`+hqnm?7&_l~1 z7JqC1SU?Qa*GGjb{+(*wG!nE*Cak);{d)wu(?SUw=y4Ojn@4)gc|;(aE-EFTTJdS_ zLYXW9)xVLVgoY<6GDd>& zNl#1mV8<(%9r0h_>tcbe^~*aFMpbBNNKssoXf)hqJYgZKSii4G-+~`}Z$p{%1I40z zj9}_HE4SONY#w6Vkc|m$r|v?Ap=Q~_V5N9~Zprj3vog_Fu)Sy(a@h4uR#y51GY#5T z(GVkm+^BZ(2RO^N1JdyP<_l0==Rq3i7bd?U>b0*3>tD7wFFs}H0%Tc+t&@RVDPk%< z*?YI#F9MJ5LP1sqXjem>v|*6i2T0M;607+Pe)edU!j0ZmJ zs$8*5bx@KbBqF+UG zCFc3k#0l>p5Oo~3Wf^krr6mUnx*Mtiy)lat$fle_Iad?jgJ=SGgC%$HyC<~!xDMHD zg;dL*lp?}JsjA>a>6>!2Zo^7lkAoy6ky!un{#DgaZcU8T1Xbg-6TeW2`d~Zt`}4G} z_7k51jfq9((M2Um+#9CgD|_}YGA<9;K72Z+aZE|PjU{ZENE{K>W_{OmeHhD8XAhrS$jMD-zY3TV39)sEOUJ>f z0(fA%yI;qGfSMBPxVS_??Q3efb~Ig!?&j-eEmXfHd&^?eDaBWJEHP5PrEw!dKxo4d zf7+Y}`7bk~4Q0qt+r1rYtr7xQ2=fS&>Y|1{>{cuqct@*|E|4<4LB>ocSkYUVS^D=V zcJZ^8G{z?rzl;6z25f^d#X4OgK~za}DL1nc-Xl4KWLThb0)(#T+59i7&8}AJ4JbpuK1q;+khflBlo9Z}|SB+NIQ%MKQ+%g+VS}Y9WEoP_D@jo7YdsA8XwU9uj z{j}%BkuNb_qfR8`kK_H#8^jsoicW|4=byM;nwJ#Cun>j07>AaH`nFBUz)CdAEM;j`I1D{!YF5FH9gYHf0{JJmC0c<$ zvkAbrGk)T-7>HMo#_k+11)CFW(Wt*j=vP;K5-1oWBZjv65|^_GT-1X5YL9VU&@%;r zF^qt>eLY?_rHlam4*2n_`twQiwK^`bfWzkLE-devH29+n2npZ7CuafKhrexcu&+ybFpE;Jm?Va#&x5}k{)^Gp5?1x!_*mN_yS)85eSL5Aswm}U|d zqm=dkdb|wvf(Zuc)cXt_x|QEc)r`z^M0f|Zk5>vwK42glE#?t2S#(GG1U9=IbNGdx zv(2HBDcS!mnQB~HCjYlu?7T|)ZU7wUW(~R>oWqwSImSp)*u6+NPA4*JJS?t(x)z`M}QMweCP;Z^UKVT@jeD}@EBylXnRJyYNa>!C;8yXShlEz7^hzt8r0^?M$!GIEd=`GRy` zHrDOSa;#r!^X~>Ry(Q=AEgrbz-QOQB43Tj7#G7+3J&&QQU1nc*9@x*VczoOVW4_Vq za%^ykv6QgOJ<8ki?V%aALmJ|+V&C^0HAl`fY2+$TGZV;;J08Q$0*y7kgjZOL={+GM z)#9l&zo=^PGuFV5O>YViH()^p;PQL1n8xmJmNO9@B3+)xWKl+StUe~XJG6)0O-h}c zi*G+UI9opOC%u>3YmPi$WLKIuJfIJEfhsQKEs3Py^{M6622B!41hFu2)vh{qAIdpA#Vg>eAj zf#=8lvxiz}aN??zON@Q+z^UT1?1x?;OZi8zQI23f0P)JB&E@7zvpxbMcFR(d#F5Sr zkO|y60rpLO$yQCHJde!oTuT45uwjb72S1?(f}y?rhEtQ>(^`{nQNJaFj8Dbrl%*VY zrKfze{#^bWd?#YLzYN8EXhvTeWg=D^%4M$KCT%cCX3RNb@Bg+m$|$wr`?c~kw~n%t zfU**tNda`0%F*30?e!f42YZ&Ja_X+vUX~MCDSJ0k{KS~vQm#{JQ)~SXQ4p&Yq5XUN zL|^={?dKEfDBHYp#@}C!3CwE)2jcn0bh1H>*o^d?boymx9*N2Q>=wV2p%ce(>1*Fw zBrUwI1fSw}?ysd-Y{%|tD;}dZKJQyAge2@(D-cr+6?nTw;7{MsUUQB$3AD?Gs+`4# z1H;~PTyhzUcXD#uc4`QrF9pvJZuDYo*YRbJx`FDn<-uOr77UDQX{9abiLHx;?L?|2g%m`K!jfkfn=Lb6mV1FUO<3%3LtOa|7(_?s4{eKgJyWf>EH!5@Do`emesa*gB|p^21?l#F8h4~s|}&(D9&9qYA-s6V5_;(1#qIji7cbq$-Rk* zc-TZge&R7psV+C4vrwU@R;dhY(1K(05&cC*`F8Z|Nfll+F)z zPA)^j00hgi7HK@66-u{f<5@u__dyiq&mKyeZ|>_j4h|#*oO2pqax}<Nx@#RtGMTurSgv~h(Uonr9K9i`_yZiN8?L~+VIN{`akTG1 zT-nXN^6DtlD`CkyV{P1?)ToWkJY0{;>RAjXxp(#C@5>8Y#Gp%cSI4lk*Nd54^x|zr z`ZmBXhw#zbAx=#z0ubCr@{k>;GrfxHCyLwGkn3OT zGo-|3njUTW^Ghjg{=JPH4KR9&{O$hpTU??|Cj7`55emf3=Dfo{BNprmRY)L~`2bNi zyB|6ws?4ooOh}aw*O2hevG-MS?wLOnQt%1>uZ|1i?KfMn6Bh0HL#20Co+&1y`%O}1E8~N>lRGzzl2hJVYccso z;)mTHssxvcg&Sb@2L)U&njqr0*Dbt@4(xVP`*-u_b#{wJvpWew*K6olCV31r@2oD@ z-IcU6VZ2j~ss5Kd1<$rQkiEUke&M47e;$`;*n~ko3Ei8mB0Jbwrv=#ZhHwAQ8!P3! zmrs)rXA{31UJxr@y2ds%ZZm^-2*~9|THG;N`69;Tg5WZ$EO2u#+7&`np)4+}kPU!t zM-@2T71Oc>)C?oCrd(kjbM+TgKJAEGWq5Nf>{kSAy1O@@9|Co65n~~<s;s6>4N2ukmt^2nJLxji$fU3z z&4o*L+J~x=5&@e=3wLSo!TqWwAn8B7DpC8$pZhv>BYh$es*#LX^^u&2{#z+s{lw>f z1ju~P_wPJo%kS@KAknRR^+#&XB5JwLTG@$wdqkcnT|l}E^<+?Une(!2@R2`nN4XK| z%r%LJmp~&0$GZ)TAZ*qz8;)B$-YtcnvGTIOj?UmjVdAFg8PDuVCpuTTq5j-^e2scr4?B$bwpy_KTieKG-$&NR_&NJtt>;@?GoBx+v~TD#p)_8UsdG{PX}}Nq#7%Tyy@xw{FGsbkF{e89vyqvR)m*@ zUZ7Mvru)#2S|EAzoB#41cjxKC{NhHI$ToRovWr{C{<1o7%SJDRNBq>I2TeslTR+@Q zNmmvACW+CXHObAp>FDPD9sVp%xzrE3Zf==k7DRV$zoZ`h3Xm z{>ooh^&)@B_{W>>{fRB+yTsiptU6aKcUEBnp4*ake!`F#|3@cDQ+P<8sq+y!)W3VKT>L>9mFH znBSdSEivR|5^ko7259psB&@243E#?gUHn-YZ|Bpu<9=2#4pNkA3bd527i>2Gb!7L6 zY01#d5#K}E5Yatrghh) z1=XI1`v(>Wpgr2KMm^mlo|rb?M-j&3IcbJcEhlbVkE{KX=VM@2De=7V$1BUTyg?*# z=7U-$xKnXEeNokf`wDNRPcC1M*Pc>s(PS3GL=01zy7S@q8eKz!g{(yKce$Up1S`Xa zL|;L4H=sEUNZp0)tq}6(sZ9CI||+Xvk5 zpEuM(9JEFPV`^j?{V{AsM@xLhGUUf@;QF+jp3hVq!;0q^G{$C4~eH)z}B~A zq&Lwy{)OiSbHn(d>tN*y=FDutyB`(Ww1lx99GnKQ1`BX6zSnl&4z;^`bt-2HVFJH06T)sTd@dQa++qPMuMiU8sSvTb>&=zZswC=;?&8n$XmJu)_^yOXCUWY zV*2YTm$$Uwj04L71B|esGmu4K2K_>0I?73IVy!0UF;5UD0cnJ?^>e+IGj z9AJ}62Z2rYp?pvZ+r6y}6DpfZw$g>^uo7}gAaGg!OIVSk;WC?-+UKY zIQb5q8Tj(R!Sf#503D?wWt&A@1y#wKm|p5b6ID@V3e!&PcjZ5bfAmh^U0JJ>R|~II z_T6H=N`a$C7Jt#I4$0|1;#F1EXGJ6~W>zVzKFR3#@VBnl@FT^ZTiA*ZJAzqvwor$4 zcl-Hu{oq%obzRyaSqYF?^VI}0Z4A0)#nMO*qgjx%N4}F z7Py===o%;*CC3Q|(+vkpHuPb6NX()X;#JzLS?8Z1j-2Z1E8nbycEnL$Rw@dP+Pb#du_qD}$UvE(?8KId6+#DVJ5^d7{PE{ai zS*&V8-OPycmt(3GKpul1@tOB$P3-dK5k2p!N`fA9Q#`W5vNi}U!gEFhiL0Rj@=#Y7 z4&fch*be7t#|<97(*M(UhIiNB-+P<;4rdo3z;^U0)YSkP+>h6y3g))r<-pw0qmDuM;}p=q$Ca&wbtd9Pj|=+hxIxb9 zbT>TuGJbGdO|fe;eA8aM8*XsZ(Uchey!L@x1X$P>alVyf0e=zPZ6-y)#Yf;2>DSIyA^6LJFbU!Wzmbsrn}PWL zij$Mt)5LKRR>I{6_xcC{J(k3rOWp+7k~9Yu!ClreTEB6pe1qNH%}898 z4g8m!ulbpGR2{mGxuSM~vJKr?Z_Pod;o)4Rdg*mU2!x-6gCRR0F4<$NgX5bRd4W)% zJSMt@5GpY_8|+qcA@cM_U`xf*<~P13ZAKplqE*(>9`r{;BPF<021`yo`jNfy&CZ6} z4gIY)7d`JMluoKz2{C9^YEaPjGWvlQ&GA>#=Td0DToR^g?9ncZh|e31{UHsQ|5 zT+;Tn>2mnQYIf_hJ-6~Vre_KV?a3S4+F`=_<~3zi;eMv_p4Wa6sgF2>q*+p(o2KV6 zmmS6{Zbqc5cF3%MaXyh8xUsV3`pDRkBhQ?EbdFhdx_&|(V`=6%$U<}Cwk`8Hz2fD< zndAPTOad=Ds|S#}))tvlJ@oYthMh}EE4M{uxu=2cdMd219oF_Rkt2OYHqZIVorkx zO(A7aDQ*IiNBd9#&Yu8B=>tOew3He3t}p>>kd3FOf|U{!lwAm1VZR6RW;E>h@e|j< zuyBHAMor>fR-5!%O9Ju*u`QW;C79V!!*xvbN?GY@t?{Fi3RqWC}NWNT61lQrUH0Y+dy)}DRP{bERej3DoX z4}Y52^k%6;^{~TwkvN-5U5LN&x@xp|zGDHWQf^m9#5Fxvj%LmeUl2I%IQ?)&(fNe! zV_@_5NlEHz_4K@Ex`&Nj-<6n8g6jM9!cx2w^rWkk{7HYh9t?aIkDET0bO-w3FT7jZ zGMh(@8F%ef6ZXYj86Tx-NniVIWHa@8fU{1R%-x4wwOHsjjAOz?C?ort(uK2S4%bBZ zhDFwGam2dYl#Ebgf4?8M#>nT~G25Eezpb|F0dCTgKZtP%e&;l-0tFT9oMy&e@$UnzcD zHO4~HMKm;=c3+HKR(@TybgkCvLBYE}>^&iMiAC*Y6J9*_Uv3ta&Tu^5>E(n@6mY@G zMPz{dr4=NG>bCJ@03O{6_jx;i9XEJ%JNoLH93E=HIp3jALfnCtL10`_s+xYH1Ya&0 zQlFIw&@D1b%wsym8Xb`UEGIugv%{Vmr#rwXLaura#(5%?0!XC*9;dIRulygH&N`~e z_wVBt79uJVf^@fZGer?;1OdrOgOqeL1?lbvm6VijMt4XzBgW_)vBB8=-2Tq<{h!0( zaCYyyug~ZGe!ZvxhUdk4$IyKGPWZZ)5D-s3V86k%cg2Tcr7nDcQ#|Bl1eO*Q9EUNq zGKYr5mkVH0dHi9ppmHUN#&JCGT*N!!Yj_iRkV&-^;QsXAh&bW+76c=(0Wq`fIp}~a zP#6*0BaezOQ9Gc-v;8|j@mU-%G@y#Vl;H#_1|Zt3riszH|5ypsSU9JmlIi6hf(M9w zd>9E+;YdH1#WVMee|*6J)<%;EaY;^tusBPNKnj4*Sz#UO@jmW*b0kcx6Y#2+Cz2b} zUc$PAZ5DeNCW<@lQ;gCp98^%Nni;Nj>FX7HduQ_4tqIaCHz-BB71@W>7h3ngJHO$b zSb4YYnJxPs?e!oWQ@q%Gb*`yXScMTX9I<^yt>q|CMR2}BK3}g`QOApl=lPaLeV4_6 zdY*0(&Lwi=i49@vOy`~LY>A}pZ#(NUhJLb*u7k4Ccg~gKsLb+S{{$|CDt`Rg34W-k zUVkt<@F%(XRRyQc_c`dIw0a>XDecryKEA31T_}tEgT>nrxddU!*c!`nFVa{s)(v1K{zIwSGxr}G|k+DTDZHV zp?p5zF2%lZ=Qz!&&eC^7G(!Y{c$XzVxZ4Xe6sp~J<|yhAbCj+s{u_Y&<4IrkI%ILM z|1Lae3XohwX`5q(!{vX6e?Ee(qzRr5Zh4SA-%HAl4S4vpwp6xq#(sFsGL3OO>oj9T znWGM3ZM#iO7_gmsuzfl0sISuN|)Pao{y`R!WCvjqU=4 z<+d~~;rBI-{GYdg_um1;nZTT6w(RZV4`;wmQ)vjpEJIgmM{?(&oFqQ$?dYZQyS6c{ z`M}nx8-go|?trSE+_!Ctkl>du$vIa*uhnXo8KQwL%WDLbLqT?^OP-e>JOheZK`U$x z&w!IBTvg%J{B_$yK>V0@5H6?#3gmv{&@<2 zMijOq?uQ4_{>BZR5GLV?TCX%gQ^;m)RuRsm8i&HA_WO+|0@!>RX#lJ5{blsfSkxU3UdVMh z8TN1VXM%g7sf0PlHzoe4zS19+gpQnMegkx=SG>P(gpBd6UzIDf;G#9T)1I~k_{b@# z=yK+9vQ(SXlLI>(nTu}DGl8ZmGtpyJwfb+NiN3k#DNk}k8EGf0y?mrbmQrW$Gfr|( z0fHm%{kQVH;B<_2SDydNE&Evg*ZiDQ1_bb^4X+Id9>dt#IcQ*FrrKtq=Jxqj%1Muv zGB6d-m)Y3OnR zehao<{Cy8im7o~vMq79%EKkMlJP6C$}8VeHxb1E|DNw43bzOQi+{>v0E-vG!c zcXmN8{81e)F1_VYGQI@~xmjSyk|p^b@r4LjwO03tnrK~2z`5~HAA@a*1Zm!moK*_6 zSqkVuGCEJx_UKYZT3#0~)e!C?#RWAzfeq4dzxe#GvTUia0(OaEzp_p1^{1B2@N4~H zAmSkFibG+$q#v?I8`TOXqZy@0n@5KYjqQ8p;p>d|x0<5J)8$ZxYA9a<#?{ z(11ovW<2#W1j(J|xXbpe;eH4Szsd0;SpYJJ5g1oNz5sdI?=c|SK>egZtPk!7YiS8>GQf=FN?fCyDVXN1Uik~_DR$6`Du+NtNd(J>W^UVRL^Ys2?&+y3H zfn}_GV$!hcLCTCwoe)Wzv*xuanL=arcSBkkucaABeSPIFoGP@9rKZrll25B1_e441 ztG%XogIKPa!+)&d?)AZ)zbF;0^hhN7(OM6%%T=B&G@7SqT{K6PM?QHVSBiu)KWibq z1i>B`L@VXJ2j_F{?LAkO4~lEYw!25m%hW#Yrjd@)lX0fF@ZA~ru_Gj$a?z7?&h~~( zl|>G<&<XiwW2_Ueb{Mx~Nd``2@ubgGH}07E9(2vm`}5mN zN}RP~G;%LzNY5RLoXY%wb6*SAnd1K-+{-S`-v;-Y{rVtGCtrMSBo5z?ME@^=v2?4ctNGCa9q>>WVWQ z=CG1t;l!hbBs=Rx4V7KR7RfsmI`B&eGsems74x|7UjXSX+9@6Itd6U9Cev9dOa z@|VX;fa%2QBpdmrPQSfjkvN5f!mFd-H}#X%;uH0}6BLy5t?qg(*n~O~S92r`@DYB4 zhv@EUv;Oil54FVw*VA@Adlxm<1>|zSt8!BbP`=4Lp?r2tkLC0pi{AH1#cvHEGi&_M zp>g3u^2Kal21CuI#qx7^ZkGIQsHPoSoTOEu!!IW09B1`cc`-i#kx%0IjF0Qx>4d6K7rY<=TaPxjg`XJgR0zG)~ALvqPfhU+Tn?*Q8>=_d`b*> zDa&JY_y+D#&7jA;M6AzOA;zt#*!sGLWk{C7ubK8A{hpW!|CDR)>$zyqVhOc?Wmf154=wQZGg7W z+GQUk32|hPSO)<;HYF^wD_I*%Ame+ul6v9GEC86ViD* zHpwW?m>e7cn>IRw&^3OM+H8d@{X?V_W2c1x^S3825==62J-l9Tx|&3&u=ZFM;AOZh z<*8IV+%HLk=dcWiJJH0EYvpVpTq+l}u@>@8KF#l-msYZL+eAZe#rq)*k=?t736pA& z3}_uWCnfa0Kxx5=VJd`E=A^Km8sYe_p)8;ZRJ!a2dXNWj8SQ*T4p>& z`Mv2rm;Cccz&WDq$YA`{pOD{Yk+pIk2F{m`rb6^-3O>Xx!oT0#Y9Ul*3y^m5Ezr>B zR-xc^{rfyo@?ILzyi2`UmgCb2k9tM+Bi9_1dhm1}Zh~_mWb+{hgXOMcbasY{hDUbO z{ciahgXy6j*+Pl;{-{rP1_y$c$0Dt*U;fGdy>&NwRK1|hE@%<#aUAB!$yu&V z1RwTx9W^ugDY7c6hP7`{Us4ql_{LJ<*wXS#U6^?ErtDVm+m{PT>qwRE)VC4YR*lxj znx>WG8G~LR9v5xjZu)6c6qwzqe%%Q~0d!RD`v6Is%B*75>k=#IP1DasF z=6x;=9G#2f3FUu*(~owrx%ICH)(h|A4Uioe_U(dEyb1l*`|B`k(Z0|$3Z{M=Ho_GG z`n4bz)dk+vOpc?sbHbQGhXSI0p6p2#j3oXcPQ<|ze~C|Aw`@C(0eI@X?D0-`CF-{C zumN5y;rc!rF774-&^vAl+wAHi#$#a*)*vA-jz6(1KtCYLV zQ_zjxQJ>D?vZ#L+WD+6;kjy%jt!;k`#xM25)+IdM8(Af`#(LNzim2g|Qf#)4RmzP_ zb!XkOR}MLgIM6K~*wT~{0fTwpq)T{E-yhZy>`F2m zK#E}abI|_$AP9R0(>x6i-EbRuIC)e+b2jF4&}i?e@c$ef*j3n`QHqQC=?-?93l1Qf zct;Eu0)VZK-KmIJh*#(}_~k?C=UH3~O2iK=n^vCpvMPLT8eXFo{`q0(cW6f5J4VUD2hWREuU$Kv@_3W38M+-b<2Qw&WgnPVbBwg8 z5K1dwX|mzUlYMn*%6G^mf=XBwCt9p^T6K!I>^fWPt`YkXhM}RfL?v+R&J zSQ*6#a7*i9rvKP(K;}X_6W>}k64}udGNI}5)diw1OyJiAlOKj0%~z-Szp4ixGR5(6)`BRlO=YM{6eyxlzn zmXSW;hxGgORcl$F`Bxx^A--|{06qpxZ^#oXCZvPw?ywbW7ilZS@-p$56w^A&8v1(& z_n_Yob_40fibK82!&fl%i{KjI4i{W74Jnm240AP-ei|5BP1VhvHKMN4^naZG>nGX0t z-J1}JU`6`KN=Ms0-1Uq(gh>$JomQyVz`JN#p~XC1a= zqTQW`t8M6J-67e)F)mF^MuL>D78SaQJ8>$4^{-Z7yW?lrX%MN1$~vv;fq2IXp6R$# z{EL!K;Fvj5a;euq)Q5d#`%l{j>nJpQR(1r09x~Y+f~C9MHQMUJmZ?`b#v4$P6mY(jDR4+gJK z<=eT~v{v26S~)wA$agIrZmg-S3LHq*J1M9A{n?~Wa^3jV(^2NY{H!b6Iknus#8o?{ zg4+9xQz579VQcz6do3D6?kDV9Uk!E~HQ(T>t^eBC=xS@x z;jJpAjfFORDsoNH-*+My{F{+>aC}*+h(U%#)CerMl<HOB*)6xi0u@9OU-XhfmTxdhBmn=gxv9~wS(~Ze$>z>~X zR+s!-rdH#Gw$|lJ%^u+4_MZlaPFHF||57}F+JChToi;M)WGN8*aE}0K^XB&sY>OU* z3>?Rn6{bvM5x+6MC{cT$b_k}o(CNYd;F?m>v-d0;L$_?5O8Dq<*fo~SKX6pNp`e-@SK*r9 z%!=`H9a`vImAQK9i6B!D}rM0A{?oXHr zKRa#;Vdce6b zBga?b(-vSJi&qIlo+cI@D$9x^OaK#7G`G}b=JysbNp~YPGRDZvafH1WDS)f!+_ZC2 zPwe%!RM;a}1jvDtJ9}?#2*Qr<0iLR$A#{ZDN2K!KBm4E6Re?|#y=gmKs5XiJxa=Mu zI!X#}g@e#f16BLj*^R8}oCsKQhBd{{c_CMH>XEw;$l= zwbPCR^@*;{S&&+*^}(tjM`e6@?$9=z1*C2SZf5@Peg7Ir#w5TKOdpr|{Rz4Uq}uMj zOd|i0Bi>Wd_8XE?1(_j%b$Ap6%k3Js z@c$ZhUe*5s<>cc7A)`QpxEr1zx|N%qz_KT3T*@MvA?>5F@irZV*{m^X>}0*Jq(yD6SmqL1cc|MctG zBYuZmUaqb1kNxRD=@18CkVf+F@R6qmKmD+GoI%(PhBIt!BMZ&~_5nN1iJ6u|K^m^> zcfg+E!ePMvD={TZR9d#pO84^E;RoF7_)j6?NT1}RvgyMt`ou`s3Hthv+nu%9ZZxQd zR=9o_{62$GB+p)Yk5zeh^Mglp!|{_KbLr zvikA^Ww$5;OJ=1V!(j-)c3hJ16j+_$7j&h(gCS42(d`FNu*R3g{mf23EgyvIBLUOc z=?_@#hL*j1Mo!0$Y?jm)y_X9pCbEWP7-v4CZ5zlFm&iA22SrD~CyzGR!%jvZ?I9R2 zIR^Q!ASWpO8{znoeF_(5$YCq0EEecT~)6w zv4dD4dvrK4epLdq%-a$Hifp2C&VhdiFK~8nc%hf|D-2*HBZxL%C3Hx?uh)xthEI*(H^6pU(`lF{qRgr&jJdyh1JR3|3gCZW4|(W zDfw)!6HsvTw*0!Eej|v~=i`eE?<^=|n1pd^u#Qy=&?dryapxVE{Pl+B%jo$X8C&tC zj;pWl)}c8X$l{Bu5MT4LT7NUKu7wJK}@Kfbo_V^G!h!KasrC}R<1W4p`n>8-PO$16cIqV*B7^>~Zw>g$TL@)x8sw7*#gw<>B zPKB1IW@?KK(`BSd}P9a$>zJE1l=nX)ab) z*5H355rXpGEG3wHJuXhV?Ec+gjqf^hb6N_9k?Eb@WXKM?ihQSu@NESpzTFucG2t_D z2t905K@xEW6#^j=y`{{?pFM)8EBPhuvIk*_k8Be(98r*+uipSmwt$`;eJ~F-ho(Ir z!N?ukPY2+GVTqmCptQp?L^dwW1q=w2;f1gwm0w^|m|6}L+NKj$=m$>m0G@r%6j)@I zEjbflr!_<~>{m@RF{`{43!}%2{Yio758()9)}_E4@H}M|>8EK?06b#`VQU=UrF!9M z$I?JzK2^{?Eer(VSr{?ieT}h@-KGr=auaxYaNl8Lk2nC9wOAlrhZX3{cmxbChQsh? zJSYSR2~S$Py_BqmUJQm=xj0E#RmolW`-mB1*IguVwUQ=)>M<`~gQXi*{OWDvWf>I{ zNGh&9IQsD|NjKT@e4~<$#%l5&P*@<%gN~xclb|AD10wq-YezhS?cq&(l0K**Xlwcg(<{=BiU@hdovK?^ z!;Z5)q}_8!2Fzv3%Z6x$laCMfHus*N7I{tumjoD)<70%i?!3GOSdD9io=+N8rsBK| zZvvxG7O;Ly98xNIid;Vd+bl4NiOi=AAlq4$`hGGfr)M)K^7k>M2kLG*eu$(&Ex_>cYQpSR9dGg0Yvwa=Hxxp9gK1|AQ8Q%+Z2*tw@Ry}vQGC-Q)JN&^mdf$nUa?>6jU+fNx=j34Kr9`BbNiOq4_UNq$Ya3@raP(PFLeq;*he2Iiy^z>hlM=gRhEK|~3g z6kjzJFo<~qB8%p6O1vPs`f15BPL6XdhtVYqhuA}d2c_9E#Dhq#q-R}zBrVD!sEyZeu7(ORd~!E}K|O zem)zb5+_<_a zc-ISdU}o+^4bcO(4#Ey)VXF^xV4ArpaeemR+WvGU5_r|cu9@sE#_P9~^G!Z|9A-~R zn)tx1^_Rp3s$M|I>#~RCv(UHk2e&2x^3-$UqktjHr^`c`9H{|LmvxxKk3ZT)2GW%4 zeXz6+v);pnLe3mHw3V+2Y)`6MqvG$CAYV(TJuH44-)@jc{we~vtYY4MD<(*i<-c~Yi{lF;Kr)*UJ0k2Q|c*;*+)iyVONgT5-DpusqPZFV+$6n)krtyM5MOC ztarS}!(Tgv!_)-owyLELIPnBlNSXm6FLqpG{rlnvec)}WKK&z{t7Zk)n8FW;AKH7S z9Ui!xxl&=l0@oQ>i%E*VgDUZe+VGjA|2MlVMG67Eb z(^fdIVi`t`3dk5}hl9GeSfC0{3Jz{Sov&2je9jr(dYRSmbGpSrk&UB0(J)0c;!ayP*aQscwPslr5DS~=bEK{pJ;#Ux0YCYTdm-wlbd z@Ri2aHj`5xJ&%C%@o3@E(x2ToXz|ygQa$E$87qD|D(zxe^*C{Exr&E~sS*n?j{vO- z2Qp0#?Q1AZ*qiuFI8uexz`L%~l2`PC*_<9mdnL|_JiqsK!BBfQv*vz^LT~C-CDmQ@ z_s!Qr{eRWp4v0DZUO%edfHu4u{HC!N0V5)DdG^LJkH#nR^!oOTH0o&>2rHw4wPq?LIpr8AAoeoDOSD>*%y=bj_M< zL~gX_?E=jts7`AQlQiX&5jJu;b9znh6KQCT(C0X+EHt&)*(33ltqJ&yRjTM<3{nu2 z!wwF(@~0KXRRc;MZ<$)Dt5F%bi;Z%f6;d)1|lWuzmX+7v^s{4DQ^x|5@TgyRXj@92~-q_xU|V zVsz!6G2Hx36x&F72W=muB-;l9!k9pK4Tm=OzZf(B8p6a~;b#*PYM|nPXFc=b21IjD zrEUXE*|iphc6Epm%Wd;^xZITtzRoiUrqg@>B}isjL6Et9hVmUAy!xA{x{er#IHK)_ zKLT{IRm<=Ymg>J^zU%ouN`}Jv?NGikWpI*ffPeC8*lCx}yhK}u) z*xleni*v;CuIDDC4d|lwoD*>Q-Z7f_+k(cO4$A4Bo5v=7?Frpije&fQ>9xk=a%=4? z-#fQ@6`pKpSG(;GCU8!(3QW({yJ4H=wi!T}CbSkS_h5@`vZnX*3auc}D5Z=QX?*_( z;48KRRlRgu>WUC<3@^4i{=LRJBE0YBEHzMhy%lrrL*Ix!cX%Dr^9&%ls*9WfDd+P) zhH!B?*9eN4Sv{#X`8E)=zbYIjc7Gu!g@8rB?Ln9TdR*uZ^ReGX?b}$-=gSHR!zL<*JxHM(=Y3?i%#+tg(PZU3p!9jU7K68Pu}7S`}d| zxh??i)Zg6s^yuyM&7PcPe6mXa-+fBsU$ncu!=eeNRVOaPTyc{2(*EJ{L4t5FlDI0~pE%_ya zJ8OC;m&rbk);hF72Dp>#^TU{Zj8Kf~Cr?jzzcLt#yXo{q`8m?Tp2WVV)ow&W5&i%V z_3-RGzz@)_?Z8fk`Bf3cwea)YIDlb9`tsyt@~Q>JmO5g6-am}(QniNYHtdj6Mf!YY zky9QTVFDnlqlf%2N2gB!p`9b$4g)7E`mKhd+DRYbhyWQo23snHdA_27n){yKZ+neu zT}tDXvqxp-smSjLW|9+SD7q}AN=F|3A$E7lZycv=aS{Hotv{u2@G~v8rtitmoAd^u zIZTC5SqB^i-Fh2=gDaBTFVcXts0DBJXEran@rcl~BxMZChwYnhFrA6UPmWUl+!7Ko ze8tBK{|y?$K0joVQo1gFK;^oEhkJ0vi0x_i0j$t)@|mHR3~vX2ZstMJm6ytyvq}AY zWQ}=xidIz+;n#YI&Hx!g7Q!H&Zo!e~?QZ~%hKB4#iv)9QU#?|;N?@_g&76@+mNy{% zA`sTs@(Djq5e!=#f`3MRyW8U>jH&f>MVGa~PV^2BT$gccH-J=}9PO;R{w@-6>@LQ@ z)yw^F;<*k_g;}d!_;tcZ1bi;k?zlt+<4i+WGdj#9rJdw&Ytv5k}?708DA_4 zIIn@dLfJd0o;$0apRg;O-!a|a%G}>F_H@XyKyM+S-kYk#XqFGBn#Q7^^0Vd6I4()c z%P;|%!*_XKuE|GAuHzF*XxAWa#!m7{Eul$2SM)QJLQ@BhF>4!_;>=QSpvsBX`lY_J zO2=qF?8*EOmVhuWrcg1XL&EXKZDH08&8K=De1f}ew?>M)V!r42jwu!nCq8ACpRzWr zaK|YaNDs|$anW&WYL!U{XSc7H7={e|lqEa=62SBNy3eN(~@taHGGYNoV*(pGOTfKw*@n(2_bAV?9{sZ zrTSt@d0+81FKychR^j5lgG!_ZYcKb*HyPM7?O8PjOjz<*{N~B}qOafh{IW8QNq2EZ z(3a^qwK+>il=9ALpdR9O<>HHs7=VmR;_V-gAvj|19{x`k!>2Sz%!j z{3N4%Y+1eK^~MaGlUf;}KASLR`U-b>galq}Wcl-^!UzGg8~=n*h!*`-+6k!ahtuGt zaM;g8S6t;Any-@f%Pq06<^&jFD=M8NC4hHk87j%t+y(zoS{F>_e$Ej2vXq(wyjkWi zI^%lU#MK_)vI->&4p33}x043z&|gRD7_k0wIHDVBUA6-5Q-p3Hewu7yz?8PF6j({D zh+d+5`hXz9DfZjW#h1!+k<+LfjDTYosJc@ymV`)Alq2D+Ki8l$KW16tu~B5)m}!cr z;aO8+Ko>(CmY4xzL1~BKB7vXtYq+u6)R<|zD}+ta8dL;RYZ3sMORz#2Qmdk1GveFH zC3JYb?s*Kz=fpb%pIs=Q2?2sZJsWm-)!X!ySWpXTinE>>_k%6A!L8cEBj$!h{xEM$ zkOD3ljMC@+G~X*9erbDc{s9j^UgYhq#jmDqK%$+gDFd?|HoQr2G@`c5+x|}Gj5wd=!u7}sbP#D ziHM!#xTYenZz>CT-DoKr?>jHif4ZfgC(k`6lw;_v3E31%340JVI{WYJ({~!J@Q5(a zOjqnD+cFZ|)QR+9#^rp>lTAG?3vK(-{wP)7?9Jm8;rik|7Axz(`uH=XSGq6$RFUEG zcEtbAz6y?=SR8ozJ%>&l`JW@&^2L1iC#Mh3EPQX;OL`Dxb)O6%fgP|Gh)0&;IWwEZ zq?wrG?%{^Ynj;aHXma1dG}TWkY(q;MM<1_-hHP;zZo6z%oA2)iMA(QVy1Jz8m~l3v zevtz3p`-e1Uq_^Vy^lg|Kbh1SA&t0qBR=V6ZvLn8yWHq_zt@j^l_WoAV_!HFx9#Dx z;!i)>cm{Oompp`zn3$yugrCeCA6k}EMio`ncs2E!vWZyzc0G(;Evvdkxnp||@xgN46xQACNEjR4q8P5LJ{|Ph zTO)BONwq14M)NiY-zv-BuP>GcHU7P{?aa&^?o=G_Nu^Z7kYJ7gY`_iY)ylQ)@ymyU zJq(aP#q^K2yLbhBB(bhaD3r(o3x&Yp&0AtTgW#i97g>W5v5Jr)G;+b2q`|-wiWA?6 zp-lz~sw3n-;hPEHREC4y3+>03!B(#wYzDRdUcDih%pZh!;t3c5YF;Uz<+qzZY<3wM zT-XkVW{>E=n`6{zH{3JJ{c0Grci%ZGBgE_Fkpj-AWWd*)vhH0s9H-OPp4Pp=wf7*M zy^x9ZzLaAK@Z7rc;C>vwxPt&6gQF6?wz>ko9c}3H?FY4Ci5H=(w0$6vkykA0DL(80 zHNX^BeX0xQf#8_53TN}OKW=U;fLhIJ7_O14_6QP3(DrTwZg)7cUQbZ#cJ1Au;4u8f zzs@BIz`uduXWOd3{}&86E*(XU!KHwu+wkW2nkSw|JiMAt9-R=!m*gl&g%-Yg5Ez8O znmWOQ@{(a}MCS-hM1fT;FuMQk^Rt#Qvdx8h=^d%P<4ceA8Z{lkrR<0C$puk{flje} z_O9mk#OI<$B$Bgfi^xj$-wRYW#Fg_MD$Y=`Y03qWsi-|Y_>Y8zo8t10AQJ^V3b1E!^Tq?B}E}#T`)tvMw5Ox9nHj zlKrF4;-51)RV<8`w1pOMP?{U;3x8;`i-Ss1s0*=iug*z+H_uLu={iGR#Vp-;yjSy; zUh3X{A%k zJzlpfvctvAl(WVC*^+|<-Hi>Z0&d3LW z>E#s}IJryP^biqzOolnNIu@j+Z~|vhW35}qcE?fN|88Z)MgG8FkK?G7>s7sP5UFSB zpnuB7Spc7%UrlJ&eYJ$YF4`Oj+f0X1#etxN1^sFx&VIkECXaPmD+vYM>tqU$0o?pBt;^y=s z4c-cwc0{~m-)Jce5GDgt`qRqCWtUj{Q)XZYDFOa*v?9m6o$zp6BhO!|X7@)T!nr)IVWdM09(C+Kx9=u}_NkX@DbBUOh50B!YX z;D|i0?B*Nc)biYG!#zGrS@VzV3tl_4eK@D=$6I>|pinmC8^V)EVy4-?&r$x?*rawi zlCrOV4VUw7uP03Wwx^h(fjx=jtDn~Wju5~%l?j-*(VpLJZYq&PXRfD{Wbvg96l zfSV;gnl1Bv(YN3OGpbNUc#|TqMTjo#mP@T&zp;f!>_b3Q1kQB*X!Thd$NKZJ6F=MG zM_*>DFvnfL%L%@AzJ<<+zh7O_xBw^}^v{94i1V6|_hai(L!M2UgG15yj3|07go5vn zJE6K#Er;B;e;`{>VQOIj(%5%Exb;U^tACUCixt{x$N!6K^;Q~6^{3&=$X)DSX2>N_ z`mo&fe#zqx)$dqoG}Pp?QqJqF7o&Fw@?CYkr}LcITdu7?E|Qkuy?8w2o{D=W@aVI> zbk6vV8&l?{2#!TSu_P{jc2z4<8^N@LdD*L7YTJ^^VBb<`e{wpfE8)=rPx^fnh~|oS zvA)pMZrYnT-AGZe32dO)FT@U!O}lk}uMnS3%ONrx04YKFx&da2UA!3L`RTu~xGtGk zxoM{*0D**_9c49}5)tIv7_HaQj!#P5jz!{u2>XiEIF z!{qtf;$Ptg`~WrZrj*1?HHU^tdI~&UV5PkH*bCNh%CN z(gwgztpYQs^W3=0jmzf-kpwK> zCrPuuQzmzsRTEH>Zwwof@f?nskADn)F(ebIq>VBTdDc~kDNmiAU+{UsGhPsD;wf4) z4AdCco~A{RZi%$AeL-cyP995RK3#nsB>V;t{_i%IDJ}coIk%@!aU|ez&^!`>YFfCP*X!!$h&V~*%0a-VDkaH-@{a9 z6($44xrTkx^(|7DR$*W(I?;zGdPW^_^3$o(Pd7fHLaRU2+p;b>@ZLm*Tk7OqB0f%7 z+cZ@N)OUF~$@1V~2vc3b)XW?9yPD?{4DKJ9*6f}lOif?a-Zh`UE!8L@ILd?aA{kHCSBO;sl$*Q#Yg#b={OX zF++!o>MJvm7&h%&IN`@D95IH)J&~aYrfKx;^3`WL-aiP87cR?_<7P-?MtgJ;*N_dT z(Jo7(m7+CLq>o2qzB8pz$fV^}JZZ9OkS7^fR<5G;7?bhdf9d3Vm%w*fc~|b%!Tz>= zs_*SZhFRy}=geQIv1fPKv&s9uM}nxMgEsfeqTV2mC05qxAR5$2?eKr`ZnpHGCs7)=BgA@u$JQ?=Te)4KN3E4|pmYcNgi|`XclD zt3zV#b!>OgfcoywA>PO9#}0HwZwxEbz}>bSEm1JY6H|Qfu4FhnBKM~xU*%!MQ5(Du z%$j=DxfLR_y`r(RTPevxJat8_MJM}x=x31S`IrM`aS2+U?kE z{j%tYz^4iCJLioxYWa2_;27;=XNKOee#0gelx#rlk?{2ctm-1&nerf3?tMoIPH|W@ z0DRj;?B2$cz40RWH6kCM>2t>3a!QVf=LOox|FAY+oCHH~wE(F-?9u=eJ%*$~&q?YH zpJOpzBkZ0;6qvTe!CDe0ptUeBbBlN0t+e<@$=x_;9Q z+_B)#Q+1iv(SOeA8t}?~ylPQs$NGa+Q_u)8vmzCm3xCbtS^}}7D?$)6UvG$G!-_3K$jCtPazZbL~JLPk2c1;R9 zYUL)Is5iMduQBecy5E|!(A8WqTzTmt<2ZN4Zas?9XO|nTF2&pe`3=(w8n&^s@QF&$ zvOU<*?YkH!M)X{cKsxiKnz6`dE%=n$L#nbC-$|GK;w%1f-Z)_VH9s7%fOJj+n;9y3 z9?!}orT)E{6uDn|LC@6FoF-W`1F-LR5k+#TmT?)*?}gGJObn+r`NZWbnP+C|*cM;w zefVGg@UvSD>1@PWIRLHgA(4}e>nr<973KQ~V4(gXyL#hIiqhDv9#mSee_c)3v+mng zeGx6Af!mdqJQybu8yl{$)^BI{ruGHIUqDD$^`^$-;H(h z%uPjKbLZXmG?G82e~SKt3AB)#E9e1M$z;miqTmVDCGLovCOfYih>diYh6RQd#Uq8@ z#4q(a+I%=1Fjz#r-JeolZ%fD9M(chs*R7V*2gUJom>9*>D)FHD&n zy?t%x<{gthh;uun@?Km(PHQi`k|NXsv=c+7=(Q3&k)k^ccs*M1+vAA#|EN08pe7oy zU8~p;u>n$}ND*lQ0#c(`kgg)Vsr24^Srw2D(nM;MDhfn;6C%A6Is!uIp+gc%0%7+o z@AsXVbN({oU!Rt#`oRv!Ci2(GZMlaiiYa&*js&1O074a>N6vZT@eo zQ-D#GHcSm{o!j)eiWj}_F91$f@K7}i#=T8J^DDx?}S z;&esbfo7>H*RImp(VLm;X@d5DZJqtu)qX@d$WRNLaCXd3PIZuZppphmU#ax>!?6_$SV;rR&53`h1_vko?QB|+sexAak2zns2g9w} z;-EQ#RgK~@Vj-(J{R>009-%S#v`d#QLMxvdP(|ajIz8RYvF^ea#t|8A=$S<*|dg${uQxA?X`6J+^zI2D%SN69lT5bL; zRt8Dp6KNMsmkL?LPGyM)0*r>8^+oEK%AJCf-=YfQSWh=4k1{?#eafVTP5j)B zL3YnJ`^WG4MtL6lUpM$(PPeX<`=q!rZzaBe?MW4sP|A3X%Res}{ybZzlkQ!`a*|)) zt|KiXQM%&|)6my5>7@b3ix=pT-oK3Xop??lt&YFIpIH9hX+8L>Qn<*n^cPWit9k7% zuCd6hyI*4_P4imQ!3gF}CuW@e1EbN4QR_Q*BJJRGC@d5omdzEWU_ETEzd0>fag>l* zGH|yVT;%$D;V7QdE_v7d_0sj!V19@>o9nbcSHzcp?MO9sO|YB@?>_9Q7N7zCUNUTc zB#*`dD1o~(IJ@r68(btNa%Jx_C8l$a2zNy^3qv~!FYqN%HUmw?K%?GM(9H;XF8XO0 zn-))%g5(TZA-y1)M^!zrs>Qqk`Hy9W+BNpn#&Bx<;st6~5WJh$S%g0ePo=wCz-{;^ zkWCilYq%(M1#NKh?$KgXk%&`>gAWz?eUB%`B#ww|&p>a#TKFIi7OwMy{Un^*X;E)z zPLi;ev6uk;F8(~K1#0FB7(aY*@Jtiz`7(}=hQ2?DgREdyQU}1#H({zdkOm;K^xfeK z7T4(F2$lwt`uaC*+Mhd0#qm}r72t+0=^y=HmLf4>c+nPW>dDtRJNEZJ6v2X9G&mjph9RtE^QCAZ%Sn~c$%eMthE*T$VW~9feI7*3G zswt9DBBkssA8JH{kS7NtI=w_>WQ0mT%nS}u^YGBs(0K4v5{_K^I)0ez;~{ zcQWO>-Q-v4NV%HpuC9Z^l!92y4%+@wN?}Ll6q)m?_oG(-Ik4XFY_;%b&mKRLNRCOa zDne)Sr%zEnz%RTfhc2%i;P4%bw{Va0E2{}0H`Lw_IAOo_d7F}lo?As@7%)78dkt;r z@`6<0Fb3CB3GKveb!tvT4o3`$&#iCzpTq3oak7{T4<0(Moe}7rnW-kR4gQlT_T_G; zU`7V1lc92Hv|36`$W>=VvA^R9ZMj?s@i5XweQd8sjF%GKnHnRWrrA4cBu0Y#J52o7 ztE__~+vW#4cZNsAs`(fy`ukUi67wotT#|Qeq_cAot2B-;3=)*t<6WA*I@w|U{j8?W zc7$bUU$Vp)W`aD4De7KIH#r868U0+=9h|DF`6f+wqS)it^=M(et}CB5eJj**w0ZWU zvS0E5IXTv}ntXd#^{1O=Uv8--T{#{T`X-Szq30r}Hsek!&FeRF-{MD7MK`$01Dt&a zA{%_yTGX1}GM=bGf9gI~U;S&OU&ukaly0`-#gND4O4+tw^;Ra^gg=-V`s#NUMO@qO z`5;ZX{TH@_HAWm*8*}q;@-;d_l*M#o$_3q4{l9)gv%?k|WML!U z8az4e@D4}8`hOpY{7`^h2d)pcdn0D`2;90cTY~}CJqvl2%Qi9S3cM}P? zP8Sfn!!E~&qSj^vLUyZvkRAj_Jatp#pr8XC=bpJGOaoPQWAckuY+Er==XJI=cP{9+ zL{SlL9k9zoT=@5A_?uu<3c9`DaWmk^LAYA;rU#JWk*6!5=opbU5jzW8K&Y3$tk**& zs}qcU^c6!D+tk!Q0R=?VI<5=Z@j(q7?s5SQCQ^-`g3kPq1Mhc_X&{ClHhf~5{rX&6 zb~B}D1<5g4{hzz2_-b*eEd!$6mIR9%kh#=Vbx=G#my@^cu0g=o$`4k9^%LlB@JAB= z_kJX#SR-94n*3zm|9*U>n%obO4gIiYfy}PqQ#u%E<$5~mkqebR5$MysGAPt_y9va~ zFCPa2eQRLEbe_hG8srVvqpP3q;36k}n_pDW{BHI}nJl9C$sJMh^2uE%mnXs^u`{9s`b=wIHJT#PTiDZ&>!8l zZ>q~C`6jrCwfNh7X&Uf2t-LIMk6G?E_Wk9aCjnl9EH3E_*E-ZTISfniy1#LLCWXJ+ zo@X8#STFeW>y&HK#BssY3**qqWwun{*7AT=^Fg>#L>K+Uy$SEy9$U`?q}in#Y+tr3 zA0gXQPj=9+WiZ#>Y!;4OZO>4ZTr^Yi>ut4;z)jRiSGv-kb-Mdt$BeaY%SsW0WlI%A5)gjJmuWA9#yKVeav6PLtx~!xz7D zA7M4pyN>PveUtJ|@7zUsV66O`a=$F|1`Oaf$pAXPhuHR7PM9c2-aiAc-c#u=QhiINF$0hqycEXowfOiN^1sh`nxbse+^uc%5LGXq`E@N+wrHbDN|7$eW8XY zp>~O2_8xL&Qmq{k-Qctp17mdG1N;Ym?G#6%9RW_l?L5!ZV$n?o9BdP~n9Wqctg!~n zmB(<9W#?ELAl9b_a*tl_#*|%DxO98s=*b5I3yt1WkhrsV54Hx+pI>a0R-XJ*-KLt` z2`}`&5H=_OkxFN3Vg zulAcOgs*e!m%C_ZthLWkyuS7eq12;YDZXZn9=vqJD_-iBD0gFR+(SFAfT)567dunt zV;7umpPLs-7ht(x$*=e0mQk}x4Sw_9=BaLfME`Z|{q$BQY_h8&!Q1S5L1=_fld>X@;W2P*_=##>a5uv2xJMKnq? z=Fi5bP1>-U5&gs5v_&CZc#7HH1J@@ktt=z7bk}R+FW|EMy4)Y7Gf5Y%$)N51q8_s{ z{po?bMUz$Ex9L+q39}R}0(0SM@#xi5lM}mp+wZto{hV-{<$+rAv2B$X(5qQY#fJ#$ zY#v!lNn<_{?v5PAXMS^fvwEl9D$*D=_7sFL-P;t$-!VvP7tmZPiQ4Rh#wtyahc9{H z$z7|1$>-R{-I|Dy?Miz!sa%K2Z@)V}NfId1C#UH?OD`J~t3_@=zPo6+n<#V;IZ88jon zvk9$OCh`YFzXzE*|D30LR;dc(!%7wSb6b}`Fg|8Y+?CelQTLI@IvXPy7wR}v&&XEVaF_el>HWbJ6M9P zx6g=_yB35AU|u8 z4rp0nbYL*RHITF!NRGkQTk<+a(o>m$mzg~lw&%W_sVQ8$(-jVMQ}F!a=GY2;qb4dX zJA7Q^p|%A#BfIXsa9DsP?@0RGL_qcm)c-3Qm_62{yA?+ko?D8d-omF${cr_g+_xMW z;{%eU4Y(W$Cd8{y&W)}Kf}>vby;+2GI+V(NAw2f>_c?@~Cl;!IZ16Uh>YF}vzCML4 zDV5OG`oYp|FJ_k@+^^j$wuQb0f&LKyO8890z1CAHipQ^fF8zFH7jHHO)o@Uohj_hQS27X($aNgY+QIoXp6QltG8zL?4d5{G2Y z=iz~wM4f*(w_mm^b`$&4JZNQ81A=LH?<=~R*}b>3HKGHA*-f7RQoZpzInnX#V@W-( zKUrDENx5_5BU6kvpH|pN!Y{o{^7*pOw*ofH4A}S+dZJRMYJWvFTdpcTF3=x%`cITQ zv9NeEaiZI3@nUw6;VxWm=6c27I7vfJHSD$d+^0y}`z&R*k7?IOkYB;9kFNbk%Y7Gy z)c)(j^#HTNtHuNDfqJ-F`7UXZ$W!Yz_M+U2d8KYbpKwxHxWq(T2Fcjsh?l;aA{7_nYSO}D(b zihKTM39>pROxeUk%#b@cN=%1!2`H7|dBiQ~hMEHr+kJz>qZ&5QZXuw*x>oG=ZCou) zkaPY2_Iii9>0er5_X0A~;+|&5ooUIOrjfX@c}!)x z*9YOFMsA%P4SdK7!o#DW$mmF4TmJ9Qqw!Ovkd$+Iy;JQP57>_W!SKsSJcF$!o!2RN`QD4%N3Q@rp#VRuzK;4X|7UF$(JDnk zThNXYP%-9{e=urwx2XnK%T?hV^&k_h>(RUyNwxL(>{>M2cUfjmjG9@WmhBtd^DBp_ zfx2|{CI7ZxizB$KGrz69aMQiadji1wA{!;^4+fd!6W@M*oSTF%6UqNjlUJLIdHeF+ zz>cQ3U0{45r(bmfM$f88b3;=t_^+pfaf};r&)aaRJhFB`l~VGe&@SPYfqCaX8^Duz zhkZ7m&%vi>Ww1k};K`J{a2H3$#8<=no8D&a{P8Yc7goAVhHFLrSl<_qt*Aq`cWX_3 zn^z8&PHUz!RiyuHlPO2+-3fVVN$q;DECIRDL89YP&CTbxCFe}lrfK#v|MmQET@!9o zK9|n7gD+ZciZI>f6;U&bws1w=w7(;qUMb1+oE?fUmS^I;H@)-d;XJ`^yH5@0>GS3# zo0)%_?4Fy!ezpkdlDGUuh2QquV&5OcavkFqw6f1`=hfff{4!(?X!|M%ws* z-1cmS9~oNGR?C7=q@cbNfAXRRp%|9EEURBJYE81lq=gtXpWqi}P+l6sI7$wn_ihI% zS&Myo+!wnEom17h6n0%sd zHc5vLM9p-ad_zB&f4v@lN~_aH<+e~-g;>7W>hnElqJLmhF+9K0ufP5*?slc_j}3(} zg;dRnkJ?=wGZORT;-Sp$8#jh@&#j8ED*D835VdAmg2x{dko108qlMj4RT;3%8Bxwb zuX2H!=fqWNdz*qU!QMpoUR8D`3!NbWf=L1;PbF7(}>MX=SB zU~+zmvWXoPby!5HaDv6DfLhb~e)@VE<&3;Mc)*oD)#r~Q#wboh(;ihQKuC;oW+J#& zSJqWF5?V_<1--vfG=u22m#Lk{by<^YJa*F-bPr@eXEEpj-SH7B0s-y(YX_8aH>IH9 znJ%g(a{3OKza9;ffUDekAyv=3#P;`;kRd;_(KxE9iej74?X~5PqT1TLNq8AkV>D^5h|diOMLQ zk^;RuS8T7-l22^dOclqeIwKdwr)qR~0tj5`pdMH~tW+Of2=$#=|H0G-foGtr@?|`e%;ZOo>EoU|JSivRQZ-t}|9*&N&bE?ccf@H5X(&6z1x3gQSKfRj zz6EbZ_n(hQKtuSVPFm{E9q%p2m--KW`-e-*dG()){s39zbzs(}ky+lqnVDIsmb^YU z+74Ee{vgAyQ74{Ie;HfLSWxFqgUnAWSDB%T%cJy44&5Zb4&Zw#c~4rHfbe)st#uLu z#R5rihB#lH-0J8nuW$vO0SHi%V2(O++|6*^dLD63vLuZG@;V8!%U9@BjlCz{P`eAq zU9rViQyK<_T(%IV>=sl@Faw~cw%$Nd==tG2H$4J4D>*VJ1Qw%!ib9Wo23WjgyvbHn+q5$Hf`Iw^fn2K056;m0(NVi#*CD#BN$mtfO|reMIvbUD8HBBpS;fCJZ(rA?o70o%*f+A}5OF0P%^6Qe(yc0{`>6chAJcJLN$ zI&ZPW*9covgGyE|*0xI3r_XX@|Afh%#h$vF8oNr?NV;W<6+c$vQlui%v+FM@#+{x9 zSTE-=*1uR!nM^ayr-)3?2VFhHOq-w=Q2WyOKswNM-7JLRFvyD^MCgpCz;I5;oO=-} z?)1@Hj?XNWm-}qEiG;SO@4Dlg(7lDDO%YG1s~Q>U6Wib9+g_ke{!C`#Vg|K2QsK+j zf#adY#PjW5z+WQ&lRV}*ekN?X5O)|w8buv8VY9qgw7KVKpehQ_Mp5&ebqzdO}!!H)n2YV?kRm>DPs>TihmT%-Ux~R|fodtmXr?1(Xwr_xMMO>7r&uCWro+;Qmi?&IsLf+*$lg#Z05?g6z*6`JzQV z?fvT~Bw@Kt^()Ldt_CpNFmp|)d`&{yh0hy*EaGWi)*Fvd7dXd*-DIQ}Aa6V!q|d(k6(9_Gkm5Nfr4Z z61oTxfaaq|#pGb#ZFZ;sa`^9=rfxDR#12QX=Ygx~81TW(zyD>(%o`K;iOO zOxqymAmYZ>SFZxUxt)z6p&0GIFZB!6caSNL+!vGj*-y`)6w5K&R_~26{eka?#6Yb! zjpRJin5^Ryx4^PVmJP_3_M^pJ6I0Kh`fjOdQpLk{-gg#S{mR)pZv6cEH1Or%PStt$ zTdJzAeW`3zerAH}-;w+K)g)K2%KKUy_8~okZPxNAJ3AdJG$nfyTUcV6KY|~(DMcyk z*eag3U*mbd`!PS|Zk64#LHI?9Xt#@r3{T!KR$1pZBfneShej+2be}>mg+a3Se+!iA zmCFt8eh#^${K1sHAedFFZDgAU*GV^ zPQ6I&{rrifq*@vTYA)5x;u!SO78&4rCH%d*PS*K~M@TiFBhmW?vWcBR_|CmQ6Q2b4 zI*(9AWPGZWHrNhK6^J|}@i;_8uHljO$RK#0a6J5lf|DPJiX*BKKvyMw1k2Rokx~dv z*!`p+4J!5Bwrs^{>66cVfJ`UdCi_MORHz35U=~9E*s?Nw(86UZG($={N4%lRD@xAc z_TVGlL>SWfcNW<^Vii(=hc=>P$3m3XSIgQ4&YK%mW_2TRItA1N?24CxmY163oJkb$ zvviA||9;+AXMyk3TXv$vjsWnoh|etIDtK8_VGhw83lo@rH2_ut@c<_GkWCt!6MhPE z0>x!q8<9OpJd!qdsEoeMlo*v)i=&m&y>wFN#U~bHRH&%oWG(#U2Rblos*b9%V8TeP zHEM@3wHm$b2NXEwGz%-IfS=6lP{mVgcw9nEOj9S^`!(w?4nzYdp>LSq>f}XLqKUaW zs9|!H*a(1-R3Z6;^3h`6I>N{qe2D23nR-TRN&cMGqF%;%%6EEA{8xKQtgUi!nEaER|Sei*rpM|WOEgi-E#-IZ>kjf1IEgBU$jJ85D0xq{yZM` z9+!YHyR<=d)n%e%@@hf%8@rXkZr$Bu^=cs|dd+$7^U~+)cSX$|=ta~i`ekz_=sDD) zGkN=dO8+UCggWmWr)IV5|G8+%pc+16i(|6quZ9;crQDT(;$50!+CJ!;$}QLqxRD&@ zkW|anY~2X>Hs8fBitsRNL>9FH*zQu`NoU5 zL4(3p0f#1j3>q2rZwaD^^&aF}z`2}i?nG$CHSA8$;uqBgg+X;D)r9Y6hO{kF>>Rt3 z5HcM(aEJ*-STjZ6W4^VU=bt@-#LIrSc;cW9Xa=W(^UqBJozL1 zWzne5hH>W^i0fkPZ%IG8);KK%ZaL(>FbtWqzsAyK^?@N*Q_N13&4Uc_!L}KGk#q}T z+XMLu@y6mAd}+2GGzKY_<(G?g_7)Tm%}AeggXr52u9QFgZG5@rOyR4Gna8y>IH18L zdt}D9dj~8oZ9fDwQqRIZVov6;0wXHcG^_*DwMNkSs%(x5N7@w9gLBW5{u*tpJz3Pb zr{`NcwusCYq!_jO{k7La*z0|Rv@-SYm<16S6D z8K42gVEu2qHg!-$g&lG(Oj4towm?Jj;ak=xJ1{W}#upvngt4#VG$7!KgxS0*479qv zP*ozNrs#8zE6F<^_#sb=o5oxdwqvRK2pnvX%H55yK#*5yRJi=TrsVTSY6Ljh9&J9a z9$(N5aLgL~6T-#;=fH@Ek=2EK3x7|6miA9(U>~*!5oNAZoeLKQptPjec!#9XR~-H? z$w&tRqLHA=m|3zeKv5LjvwLd&Q|gS|2}r=8FvAUwQ(opgwm1m&P)DgRu768AavfB^ zke)Fyaa$}tH$b#5D@;fTo>z=@5ExD=kFoB}<-C|m*C5DmLQR`=cB_^t6n!Z;_LRNV)0mH;h(YtV zS!{wtberJj%ngC(9rHC%L*&APQC?HOD_DEt@bt8nb! z@cf?t@}=}Mu_sp1*0h$9h@P%kR;f zx@7J#J_S0`yZ07(6Q>(B{rOau`qsHVAlAf7WY*o3N^k1CbZtC*8kiihFU&;ooVxpW z_JjK)r&9AEu&$1Atk39xUZw&-RZebYhDq%MEX+`E#cDT@qVfeIYMQv?HEe|DiG_G%7+C+T;z@RN>PV7+*!8+MJ&)<-SP2Y zh>R`1@5M&h>zq5yK%f^*DB={H{6n=R#-zhqUrFYY!^>Zz1Cj~!CarRzM=8GxsCg&3 zZZfalW$LXYd@yiN`wm>H%opSbvoz^HeR65UI1n~--NS&LGvT@%>+|Vbs6~#s$v;3r zOxYenh`0%$XW=T^hts8ea8R)>ctu}-3sq4)jk3_fqb3@trFGh@8-pnj78+qC_X1>g z*~7J;f8+l<{lo)%^j^EtXI9P0OLNc0#rh(0Bc!Y7j70^Hhsf64w(^)0vd3I)ZcG0| zD}{fyNXuX5T4UFeF|XPaHvovy36&?27RyV<$iCohBdxmcoLNf?EGg|0E2fi+&C2O= zKNZ6^>wlB2z9!z2hBwUD9(SN~nMvfmw=}&LKcMgx-=~bM1 zvL@&lKfc>iN1h;@>MSC z1;>X)cpHOkC*x6GYVtz3`&ldYR(Il;WX@|+Vu+7rjR1WvcT9J3O;lK$3g;-D&<~7V z7=qVm!lB-wti^q*&@Dp9*J2;5lejaB0lc6*$-{w8UOBl~ovjv2$9nQ+DHFhr*FKy~ zk>A*_xY9*Dx(*!$?JE&+QrxWkM`gZg8DK}oYqwE2^Jd23SSiLF;k}^5*aiX@Th_(e zxVr&i(BPws{~ckWUyjoe=-rZ#TSW7V!qM#Ewdir-JYU&?5aFl_M`NKB0}khp9#Blu zI)}>7xnq|UU4=of<6Qn|lUav{Zv6^W`EuQLvU$a&dEdl8eyWiQ^ZKq2ds_=xA}Ff}js@%yvF=8T@S%lC-}Pl%t9~4XepN(nhuTC&i+PR;qV5(GGGcFkixB78yjMht>JRjanGojMv(0}Bam zEx?M^pGP*4JbHpH8&^v`1sTHt7KgyEr^Xv8fY1e2DpM@nbUqJh>(5|*UU~l*i!?9t zjakzzN5=v`-qZKjtQsz5Pyp#;?H570m?8@P%;Q(zOc%buzy5j1Cl(60?tcs#GLa$| zkg+~7V&HO$J@{e-GWHb@p8JDL1B8;uqoDDhpzEo52301q9w^>KF;1`cw>du>SEfbs zUkU1+E=2d*?Cv)iCXmnAwEYE9oS(9}xGFC-&4LM!&xiy@g$1rdQvTp{(_V4n_W!oM z{Lc@fdpG@XM`M?Y28Iusg!WrFmrZ(m(*xda(wcY~pnemZnbz|j+-Yr%vU(wtY5IN;>qBA624Y0&PHY}N7uEq-gK;l7E&{@W@6kJ7s)4?mh_C*=M7>-G}! zC}c-+U%;wGs~9@hI(rXpBz7o z8qt2*xzM@kpZE;4M zru@+KG3oK3dZyo2zc2S}sSZk#-=8)Omo;#4Q;H5n-fm|M?6>;a)qK48ci2mE$V7~F z=A20qwM&hf+Se@dUGVDBO29M_l7-8W@BonlEE~IU$FaVH71qptt9t+=1Lnk1o+KAlsJWf47OXCy{kH06W83sVz}xCo4 zm+CTP7cA&yavvG+LsiYlNTMKU0DiwsZp$J9ufZ3Tws7DT_`;zN=JqYCb-;V!-%(Bc zS69=raTNT2*BH$;^?x%U>Y8@nC>zabf6Vh1s@Lw}{oBdp)P7x2n z`(9iD%;WN)A|pA!060@Wc#BayK}xfUbMEDHK4cHrpQoY(MtJ3& z>WJG6eqg111d6J$IZb|3#3lFprBFPX-)-&QKoQT}w|v8kz}}hb1LB!cj(LRi4XD9X zUIoHg+yk!2YUmrozQeiXN|Umov20uDZ>uZK0Ora;@R@i)^V_y1VaBp8t;n#=SZ>pg z*|!AtgWVJgGwI?7%KJB&Tbd(_R44a~^i0^WbiHcEyHIRY`xJJCd;HzmtT2oFfo2?b zS*t4g8~elF^=0q%?UdVnSsE9D8SqP^-g57Ry-}cf zFGMMEfapDlo1>XKgy#8!T~iMSxZX=dk0^N;$v*xt4`^@xP&4kmQQAs6F_0?9`Mdp5 zlrnQ+RkVX&bvQKr2k*IvG-n~_ZSw4EQ70ZL)RKi44C>&*aC|@g5zpgW(kpp_a7-(* zl0bETyRG1UQn3=22mrJz-DKnrcE;&g=hWwD$kkXP)s}*M&N^=c#t8cj{>#c6`!S?< zPV)di1DZf}T-v2?CCCX=OMRA4{HRQ~|LysDEg%v6!*}JeGK0JW<_Scd&_aRoHtt8zxLgBWOg_t z($t$W zAw`=#oX!*)twu*;-gKY9%tYoLu(9&@-1@kc`k_ai4m{ zjAJF!I6<3zSJZ8mr+}~ISgP!r-4U$?}cu1oz}ze3fYIgxHQF^Iyou+BezX<`A!2=YRvBWX$hac*B|uN~BPOJm|~~IS0(6SiG-7hCHjUg`t3sa42w^2kgoCm&@@7dHeeB5NM!` z)43;Tv-Va#9B5qnS+G>P~H&_uz)!Fg*ES z!U4_1TGf8zB&GuUT7K&>n4td-Co?ioEzq0ojl`IlY=je0d97pLCW%FG)OexKKH-9 z&g$-ni50SW&cr%#X6JW7&E98~2=Gi|X=PE8Kf5mu!GS`pAC~Lv9xBY{38ovSkHTan zkUN=vhoW-Wk`@yYo0NPJeY>7K(Gx>iM$QLn{>)A1h@;F_2GF$O!%>IRa(3J-Bro$< z%JnILfi6tkPyf(83z-jdiAi}E52VewhQ$pYjzcB_ZYN&}+P^jfk`BF+lbSMJ1G`R0 zbPn}G$V1P+Gf>v|Z$M~v4vDAJFSTxH_0Rf)jGwG={gOffW!KrxUwlD76fH44N|*Oa zF~LOZRy_J^wDU+*i*{u}%k0eEoCBsTVl+8-Rx_`S8O$A1 zHI%n`S&?Yco%JikJiMux8@lIx%8Qx0m(*Nc#eNOm*d(#T^KMd11Wcy~#A82(QR0nWII)#LLTHc8H{cU)+wfhMfd^p*(hk&nHNeKO|dzSadfZu{)vr2Smeho(q;^% zy5}zNcNMsU!lSN!uV@6YodeFLoi1Wo9zr(&+ReEOX6*z+dfy#gChim%Xhpe^dYYzGuTzy_vU8Z`L2l_o%CkuwZSVLc?&~ z+VNShuAT2)7MRwN!5LuKC9!MIR9MJsAyKE=yDn?#r%n&4M{kRDRN?2YU0^jY!4|I^ z@z&&dX;c2sT%V4L58B@<%2=64ln9?L*LjTB3^yZ;u?a1bzUjcn% zo=UvfNBcH91x0{R#@99P6qm0sQqlsA=n`Qd3%gkH`!VFIg?)qAF`yY2KY zUcTf)0`UPHTu1nl_bLkFZ%CHr{o@B81*w5MoDj%9b+Y~&*I{`Ba+kEpgr(rd-2^P= z4#>hSH*h2LHRqBRjHYpB?plb%Txr2r1to)G(ca?Bbm{>h2R(_AYB{f1Wl0?r*M;9{ zC?SfjzZMbPRIg;9Ivwzq1xW|))QLGuqcM6shK=KTr>psI|9c><>cTiT6fh`L$^_;| z*@EW6&{qT)tDfJDv_YcD!lG^Zx5-G!O$$)d-OCQ9Zt~w zJw1=mYU#?nG5MwC*)$+Qo$C&=^@Gw2sZ1jU2bITR0oV2sDBN#j3;%K>Q>}UjHnDSF zxnD%SvTE6fIe#*^brzHQ!|(zG4E&&XVh* zx!y&zm>ycqmw?IBu=J_6tN$%M1%NZl-<)J+s5bIkuFC79W*HeFXF&1fm@I6?fN(9S zwf|2C`DfM9KL|y|V!vV~&HTP$o8oEY_fj2a@1@io>}|RSxCA^6i!BSz6*qAe)~Ch% z72T$$OI-ZCFz0_@i~|T)sqf-VuI$yiN{1y4QE+neURF*h0?faU*)) zCZ-gY;MMW#F5e4yEd4*xh;A_FTt{`)bO0R=Z=9!=QfG8T0z;F$?TIn5P#LOM;@Wj7 zOPw?D==VpWZ~2|jk8Y!B6HV}+F3Yg;@@7xiBRFsrXMTkDL9jMdl0!z9X=?KG&udeV z<)jBkFU;czX+R2Ip18yU3DrN?aafqBSyAfA3%Q(vzHGsmghb`vvA}1Bm{y=vMlxr2 zZbpl|TcVSH%f*kL^s}P>{O@jnU7Ls6)kBR4>EH+k;!0Cf;R6SzAZwEB{vI$fWxqB? zwP0f2B1vQEGhz2gE2R^zc($yWiTc5O`d=r0|5_H8q0kSXjmp8(j1mxU*Qas&{<=yW zxzsLo@X&WFMkuyruAiLr93*_cx;sQO)}*9i}Cl#T;%)y@$>u!}f^dXuDesXK2e-%0DD{P(C#+JS<=7CnNRE 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

    7K?^>U~wwd8d@okO>1$Ho&)8 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 z%0D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

    @? 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 z zxS=C9Z!inf>v_C{`d?e_4`wU}1NFjk?-T8Q{;XGAdL>xi5}Nzq^-ACX$70@Nu=(pR zYYV#}y$K60C-Xw8h3_F5lT?QQ%kXJ$2`|*%str2(esE zUZfp~N(~PQRUY@tRL8?E-)nuJ`6b)sl_k}&0tvWgrbf^}cuY_WzC_273FyYXn-`S% zCH|H8-csGbOJ1LEi=>~K46bE=sTtbDcJquDN#4FE=D4Zx*NYJFngAJP`x^A3S@IVSP4kvs5oKlkUu_lFl8v-ZBU824)9q0qlJRFQ1Sz*b76P=q z{%7z2Rgz{m_kU>2KU#@_JUlqV#Unt2tX>CuvoF`8=cL89!G+r=d&xEX{Wq`VV2xF@ z@_)C$b6%tx4Om5_!1fXKKFx{+xjt)Oo_~9ae5K=>!bP6aagT@^)fY2|Q4&fCpIGs` z_0PxAT`cH_l4<&XKX#-z?Iiz1dIys3tkFK2yLIM>gAC2@?mF%=M7hlhk7g>;Q@j42 zhOJ<6JSUtKypyTWbKkMqb~#~zg5%&|d;8a~hvgYfb8T_VUcMIu&5QPan94{+`kpb- zmgI!6jzn-H=kf zg05HPRc|NP=OT~x-ZrU445-6L93bN&=q0?dw}~J59j8%8EnP-CyjpChGiR>J7g0q>_0!ILx`#GjyV_(0c|ECPoRsdg8Gw=0Tt!~;-^ATilmM`wL>PcoEG18_%i zKi7J|GfBz1<(YP+PMaWnKBno{1|G`?yRVSeIKYMl0e}+3U`NU1KCfyW0Q$HYv#7LP zHH45>Jsz|j#HmaMEHd$S-|seA($+kHF33{SE#l2)wkjRQ(-I>PSSOgEmp~7W1~L44 zPsL#Jda$RuVWxkIY(S-K=k7Wkgs||7J9n+28~jiHRVwMfOeXX9z5pX|eKnwoqQ|BI zcXa-V{HP(cr>PXPog{=bzJOfQLHL(8rrmP>CqKE+ss7oO;*ARQT{e8jM00df=L8|GAYhqlp2M#6XU_486e zT_F?<_N)=aCFvGhZ`EdkMQM}XVvZ&Xo!NP#D`4)6(+EoW!bcnngj7ELU^4v0UsA*J zW`InM7J$lw)6?U>r^K8+?HBO=`Hpyx4>L;z+3k{m%ShbNdP>dumTHUim=WEIje{ta ziiUF%mqJmhVlAP#j;puySh}V@aLh;pgxO)yF`i@WdG%W#Fd1~DYd}E_0Q6xqX zg_8r*n?ULN-2)2vsW0JWAszz9IJ%Bg6wcBNXN(1JcUVTFruS5MM9@h9wZ$s9uwLGV zI>o$>1#`gT`|=nNT#;v*XYoatYPDfNu?C_MFK?U>m0u$JHQfgMg*oHEcu-DrdCJ3_ zS3#DcKrycU%rBrKG#+_qKkOX;9cuw{F$OT6M*kf#Cv}=RPKsmSosyo`9B`(p$PIj> z%%UA2Q6yE7IARECQYcM$ktd7nUZU%zOP+v;DGOftyLy zFU2-Mh?kyCvwn_$t#|6mSJkr1DhhI}+RKgD`NYe7Y)THaS$j@XjM?oz_HEq#y^sBc zQIb>ld&E`Tfvs81wKeF)mj6DWc4ZVjzQrye-Y$Olj`ZgKfw#%#6@6whHxtCOLqJxb zcOqJ&;taZG)SSNF6(6^X{o$kXJjU{elbh>9|Ch7r?YhNA2HT~&YgHelKTg6c+<8=K z`=2s?*?+?Vr@I>_#Y~08DM-Kv5DiIor3pA*g1xMB4!Uz*2%0(1b>#^Pz*&ORbl#hl zreCm;v!M+l`NhsoXZsFq6Y7f)8F4V=9PYll1hXRqOIhb*&i<;we=_gcD&5#7-w%`c z)8bE2@8&I3aP7I&ov-Uk=m*$wthw07>w`9b|b$Xs((4oXUxRy5mBjSI1xF=Ujv? zn*8Rs=s$5yjR#CkZ}%gwJ_SEppEM`Ip8y^1-+5LU#|RgwnaVM)?K6;kb$N^vAy>t2 zf$JFi0axK=v>KjVHQJ9aFgWB!ctJz~{=VmDC+Vs}PKsOYqy+l!Y!U0Joua~!gMs#D z{GZwJ0|iqaq*)B~tCVCjo@6?be`D_rhhSMjB6}hcU%5q(43wN#PuQvesJEv)3-wAM zxC{<~eRM-$;KaGq`t(D_VJL5f2NfVRI4JpC&kr$hYyvghGPi*j3t|C2*SM19C>jRn z=y$&o1oWU6V7wJsZ<73+1Bv3UOOWA4^>? zF#3;{9bT<-KIEp~*Alb3oLn#O1io@Ad06LLsA!T`nQUlLqb`wItg?^8i8@+jwZ8ZC z@4Q%Fu`>Jk&~3gIu zsyg)80Oa-pGw0&Kh0uD=+ZPjy@*oN$<(-=8JCz5+^Fhh@MJ>#MPEr5IZKH;iCy&*z!0`=-4}4Y%C~(@?P+0Nm3RiXjM6@ zjWO5nV+Nx|hKT`@d=loQ7mfs=oha6^Vhqx3-PhRK{CY15-`ewqG_f^?kW$#!sjDH_ z=Ys6KFsUuGH63PowLkAjYO!i4rKpOHSQDcS_Myw`l*G;N%%?fOdyX%kzM_E1C@5BF zuxDFHTrz{(=h^lg`K;y%rktuezpyTSfsQVl1;G;OXM46wT+}jK_Zcv0xEvKnNaFk| zdwr+jFWS0VT1RSLO=b_ec`Datak`*c^4~2Rhi0>6Y zb_pJ`wN?2HC7_6q;y#W@#sQOq3FLRM9X~VPO@~$y-lM=C%Sd61`j`#%XjVcZ9GL`txr2y3Jn_w9c2F~7MFZQ zg>!h%y}uh*sHPtE>sZ>|9vu^U#P+>WNi`i1(VQ?OdCWYQ&}qe2OT-PnVVl&Nf19rL zH(z=8F3F-f!q>jarf4M1mZv_#Q~Oui1@x}z^RLwd zyLiAb#zXtjpS48GoKt*X`VlQm=C7tTih_Fmfe*HuT1VFur8x%AC+u%ct=wljtmH}P zu7BJ8oK97@@tnw>R2})9`&yvltKCAVpn#n?4u)~dqccIj4@-qxe?EEeTUgXN-MQ<& zgXkzE5zUex?POJQj~0Ku0vfi1;2qH?MRdme7y7GYQRQb<%A3%e3!HmcqF0$=)^}{A zNLDkAZWo@;F%^-R>U7_%TsRWESC0YI1x!pU1)i>AC{f9;{V_O@KkWsG2{4t*s8#Y4v2n9=D588ZDDG7gK&zhdsChNR(y z$E!)j;{e(2(n>?ZfVZe1650gTl=v7?ZWe4K*%l?w)WC-XCtbew=b1yMeL7kI&U1D` zz}LUbULnl>SuIY%J1|f@M2A@4y#dMM2;&vuga-P^mdBcEWxmd{8iwbnE`^?0G{w5z zJ$P#co)!ybA2q-@J%6YjGjK*sh~5VJ5XZHz5j4ok!T?JXA!X%M`ThJBTPVgF? zTtHqAWb1t&Dn83g@#xj-E}UyP0U*%>YUk^>7ViS}&TT`1DGKDKz=w|bo@hyaosw4z zDQI!`XQ+y=+PMx)vv&3w!uU|z;VT#o$@Mqv?6k!SA@ZjDy5~1A5F;52FuLKbNX3E= z@bkw|+9V%tWYxVt;>;)=^Jy>IUjFdyyX*rr-gALi>IWNi-Nh`2xUk!Ra^PiEXK(VM z(n{Fv6T5s<>B}bwj#Q7CHzX13^A})~;`)yvo&FkhFw6m<9+3mM-hYlYp?mJ1KsWrK z`$_ww|7%oiTyE>r0cTg#JIbh21$F~g*73)D`6`4efCfj`($!23vvG-QEhb&#O*UR0 z{`O=2O!ReTL((ZJ8qa%r53cjcjLr|}Vk7ZUKXKGl8%DxdJR@SjS*LXgiUik;GB1K6 zS3n5A9w7E5&8J;E4ArPKml^nHXq#E%7n~ZK<0gJ82H%u9beo z)!s(q;w(7yg7+rBskFS1=X_oLdG1qblM3+C&f#5EcuOSNm}I+HvP>r45=KjgBk5w# zRjx5181o{0L9Qoc(9uQB$4xf+;yH4J$fZ^`#HxBV5QTzR#M>cqQ$qYPW_d32W6K(0KE1B@j1FJDwjdkGYaa$gn&J^5P*E)ji&XLvYXqarUxdJ0V^m-Q&T{l) z3pB+P9471>Ls>OjV3mTJp{BygD7_T%l2a$EG}#>nfKMUVh!J97YoT)%1dK35)3$lzMdszso>>wpX`LzaU~`qw4qi(S}}h&0|FS{wztwjA0Az%WGd@ zjbDdJyF+*Tvdc3UYKC2}XI~ls{@NTND$0I=NtB(|xcwv+PTLWKEILOll&7HIK8;aV)!&>6*>m1%HK8q za1tKeG8f5^GF6pQP@BD5;kTcCsXPk9$9V*z^qjqs7j7{)KH|&mD|$+8mz_FQ%6&TK zD%?R-*O%geTke!x0yn42uQnQO8`7!${`1sBpjAJdQ%?f@`_9q%E5{+&?hrH7GM4pa z0|(_?)zT_$H}e{vZIR}KkMG(aREA4k-OEqb^FVaS0YTSdnN?F7HQHLRUIUT!ZGQI9 z+24+T)~|?Mxw={QvC3N05yu?5Ng1}L#d>(_#A-A8N2!|o5qV~L!KE8>ZCM%FKC(4^ zDQow@n72q`Ukr!-u2I&p{y4!C#4@oW-Ft50OBE5mF6csKb9{S^DsYb~oNO6Gfqs-> zHe4ftHdpuS460q#3@F?-lQvw-Tz0_TSY|~?*H2~D%~KR(%mT_ozfE0 zT~g8v9a177Ee#^w&46@CcMK&dEik|^&pYn@-@kXQIhcc4Yfhe-`~Jq~x`w2pmROqx zsT6ijF}L5%%NMp{WyIcD;+qN2sp3pVNhJwjK>n6`4Nc+`1 zcI~)VUGDHFhGRmoNCGm@*Z&gGAQs+1T=ld*3w+T~Cu3ekUvuX7STTg9o?O^}nY`dh z-htQ*fRO-;(0Y+!ur?&@$0T8Ec7)vyCE^|k;t;$rOX-2#`60NU8Un(`p^6%5XD@$YRwzV5As&@9_ zt}#}u*GT`SUADBHY&LtF0KqOG(9!#$9p`^Zmp@CA{EY4S_?H}$x{{+sg~S$PM;oI6 z#dyi0=-QVAk{*2Q)&$7oT^juDm$67n0t~hh@j47`=KlQbsXu9`khop*cg%@^qKHfa zjj`D|insHX3nx3m^gTKu*waI}!$rMG{%Dh+W^J8$+ddy*hVTq}x=*(b721S=4a{bi z1Yk=2>F*)@gHS8RD+de4p`X7fJq-Tx`xqP0wi35ddnMnwTY$+Zr4KW?ki|DJ+k)(g z!X-dtq2Z6S&*9BG5bH<+95i@3j+arXGHeY4UcuuG1t&nsD#~8|ZbTF8Qt6W^pt(=y z9z%c#ys488>)K){zorwzbbqgW^yM;n0?!9#`4RzdCnBIqsdGDoz!f64^N{`*v`ZfE zTC@ce)%UK>bwfeHKqu(Ybp_G=wwCtGK&-Ql8J6Vcv8a(phuV0I^I3F!VZJPq=X&io zqwoSAc=CIyCV}gCtz=H__Q*&&FDPbMB`I3aE>$uuBFdx(3(Ih^Yb274S!C%22S*Jz zaD2c{>55!l(|G%*dPKP9j&K(B-e&q5c2@k5!3}D*l^W1}|Ne09dOlG^s?CK{&F8&d z1*)+Q1qPVe%y;}FQj2W&S)@2~HPz^HR`s?_Bj(9i+*A^<`TnuPU=k;IihS~of3k-P z(J+Jcu?T}!dlFuybjSDP601hi%k%V-2zvjtv&~qC$E83iNZa|Da|WMrxsdzMH=U5I z9>c5~eqmXFXHFxY(>Uiy)l@?`{;Msv?uK}F(3 zT9>`*omglWwu@`ipv})@Auu@V+fa*U&m5|D>9NUpUAmgSRl!5uRd=QRp2OaU#qfmA z1<4q??w4zYBP2eVtV>ygJ&l>N$S~T58Kof8)AVeLqrV}pW4ZJ_zgof|%NBDiY>PLR z)NsC61X(!DOhZHopku(gONy=FqPct=4o4e?8B~wlMLVuf!(-vUrFqlN^JW@ke)>ri zrIU;=ZbM3(@gC^&wrdY;2V@>ZeR__erKxFL(#1`WdjSQH;My+x1YO!f5r4Xv%Vda& zqdnwq43pY*SZ(CajLIs2t+a6&|^$=ixc~dVYH9VY+>NOejs11a9 z=K02N)FAlmv@0uB>T3fUHU=PNhT}DLbs>vC#Qau zV;w`EJnlEEYWZf|8cSzC`55=y)&@75Z^=Vm+~%%MVegAWrXpqK`#-GJoplYYS!PdI z%5=nmzI5+`Z|@^Pj1%&$@%6_D&*gwj2$b7U zoCNVFQ$;~{DvACO)18>-I#-yN=VdK1Ab&If9|8TSfa1MV{g#DbhX+O87jj6N_K^cS zU=JwTgBQ91%y}o@rgZ=$lYtPcEw&^6GE$~~U=d$8Us52x8*u{Z{Of$VQUV${STOmT zUI$HvXY$RwB0;|c5j^RN=tFk+B!q@YCr8tdemu>U%E-g=5}DLJzIU4Q5hZ1nJlnZd zYd~YCGx4axiy*P|WB~LRf~!NnzNCfhMmK*59Q7vdJ;*%6%=H`}B_~RD7TE^=+5>8a zL$488yd}&x`QHC!%VPbXzBM^C1hz6P^Cho!1or0uxc9-|Z4{1}!MZ&d$mK)*Rsi1` z7d51KmD5(kAGd3gH9uxlKB{b2De*q__K44Y7e+}^MLvD`eqt9rwLOg5|K?a=Z%8k_ zto#}8b1NnBD%x2?EeD^=Wf3tY{s;!Ou2I#3VQ2miOnj7X3Njw^qrN(H1QeP$BW&aoMf_^v$DpG3BgyX)?U<#L0TEutad+cC<{B(-g*+_8kjM>UbrGp z_joSZBx=I3)KDr4`)&9wfq^m)eMZr@^!yh)oWMBlS3y|Z2|CV|(ny*P11rgW9P$gv zc5Ya;2G`cE-L83pI`OGzpazS02gOcQc(n_i4zkrCbXWJgi<5-Nh;8zIKcPv%Dcg=b zNrJaIc+mIpk`~tBjW0@E;kiBlAOxK)Q6Thx4=43l z>KVE^$G<9pG$iT#*3S4r*Ju+#KuiaR0aZVLFg}CjV27=v!|A6G%1wNDUo7UD1gsp> zYItKef1Y858WIme9A*pT=E2kj{W7Eofn+1S$r5DhBERV566iAobJB*K$gdOuj}k$F z36kBohynjNeHn%?Crt?xZ&FvBN&1FDrxw_?xT6D!o_}rK@-jJ6%mm#e z_f86~r-^)6#BD)V$K%I->`Pv!JeRWrzIg% z&djZM%qRjerzOG7Z1HQ&>)S|TkP@I(0gy4OvZDwCO;n1?QUK$;#MFPmJNiy9U933r zg0%3U1CNIe=#_knJ8cjDD2>PAV^#u&i#)c^jEsL< z6P#e$e34I~&FUEHet;i$VD>TiSlC zCFlr*X~<;39;m?*<}${CU`}x{CP&jp{m-W{O!x2 z?e(wjA$VeGIMAYv_T8?Kd6GcU83d7WGAg(ZODw%^Js- z1>EjDK4U$0Te8i12Es!cEqrX2zq$Df;SyN_aUyfPaAtk+LGanGIV$QqwhNxSEptWK zuE;h7!F(ZJ?E~;%Z44v+-^maHRoKZ3AShJH?1u(2=^w@GgZz_#zM?tlyP zT62K{i=SAAd?xj7a*TqEwWa%!3zGaBi;W3o-C~CF#_BarVm)3>ilR0&8HVis*%p~} zMcq$#E6vqKk79o22Z&mj?2Sn_)gb|oH73QI^oZccKarRtT2k~%?0cf)zXxm ziC7lS+k<5g#F{yCmI{~XCW(SD#Iq2nMe5LxVz+rrFu3qdGBr)n-ZMuSiiBK##7(cu zbI2Mem1Q<{UOxZJI1n>4&XlWG%$|;_)1!|jD+_k}8Zsd{I(YAsUKDJ+UAv`}!>}cQ`@|tYnkV!y84{Sumdu{?Ab2mlFjR^FR~W)nRWf{GjRlJl zpE*N?@?fEU4Pq>KacJp*geBJQz*L7rO!aRq_5Ubsi89U)rv z7w!TuH7C4#dBw!@zt;Gu+mL}ek1u2-)3N`|d8E5#ic77-LHE=>QbW?vhCNjSAIbfF zD&ItPodTu!z{Q-Ms-Bx_1CH?@sU{4sXKkx&)ZA>|WgHfsbm%VoOz?v{ zsUCh#f0gl@|GEEooKfpYx$it}Z@Mvv_10oDK>lN;nW^E!y7M5xhWmcGhdapZ)zS3u z{P*z zO6|Gd9@|%f*LACpcxfzXn(V(Nh}@D`K^<kYl2PN}06%@32cnAf|-X;UBvdJ{w_mU%6P2vuo=a!7ri=#ANMuRbxG^(u# z6G^4kQ0vJ03wK)DAZSm}ZlHOk(1w*&Jx1({UAum`>r{)cCYPPvpU2C0HU2QXOY`Cz zRT(4;*XkODN)J{f|FrS1`=9UuXLC3I>)tmKNTK8)laTL$Es4T<_9k_FtFTdndc~1R zKDWR)UvXboWyhy&!ZS^&l!ZPP_cK!2+;_!^g6q-PJowZntOGuYmjT$K!p4(R*4apD~ z!8Vqfl!mwG)u7wLti$~<;nu8<^$5TTsx2d2|NRT#tOhAL&4{2tA9ip+h`nyq1a!G$eu&{~$&dRKP&x zcf?YD)(%AYlIIkAJ`V~um7Wuy`+6bM%K6llkS$hhI<8E+_^G5N_SxwiyVv)1)IuGW zU#os9hIu#7t5099uGuh8V$?0ZpfwZ~c5kqyn)OU3+6LDEbF%!ypz+!CbMc2k2%smd z@>}U(&016ZpWGEz$L`CZ@4V4c;1OQ`%y<+SsoU%ZLxg&AE_N1w6o ze$2tWS0CmSv9y+p8m+C(x42!Nx$xl}NfJ8LUfvTm*5l_=*^EId?3xRpj(XZ)L*5)6QiJ*Eg z`L^jFpBd`DGw7Z?9!vivEYzfKi;Q6X!pWPrrpsDLb9QQ4U#u(dl3xA7t4K>HH8>Y-Q$f0_ljQ+|LV=s7={*m#cYCSK>$pCCv?N19Kc>t@LUaYXI^$> zRV0?xx0p(JlP)CDlnc%}bjCg~5NRTPa8-ZQ^)=q&piXSj0G3d=lkPtds2&S!(UZ9e z7Mv5Tv6wNEWbd(~h_xHoyjgmw2EU10WRqLO*Zn@zwh>mU{l;FFu+}M>M&VlJBf&)~ z0bm&Lsh?u0ODhk4cUepD4BG_fn}#BcGM>#+dJw2?U(Gt+g^Dn`jfAj3Us*H35W?L% zXBxUU(fhbAm;ifwrYf}6BH@CEi+p`ohE$CM5t~d7FwXna6nSY*r8KjG0nf?8`{!n~ z-ADpqZ53~*e$@ZLOm!FwTr@_4^xsctz$*3sy*Rk|+j8r4B9vkOpi&tcFzdW4162#I zXF`aRZhZi6hQ?aI#yfr z&BCP=Q)TF=y7BVCGpi@8(yk#N zxzlo^oizbEapPK!^VdIrUC&UTM-dPoqtF%hnOZBU=(yZ~5^Xj0`s^aFYO?lv5| zS}Tpy=q61glV?paCL59J>hFGw@%Vb$W_sqUix~8<#>fWBrB3hoemGB=xHPZl z``pg{F05ZBrR;!eg3J4}-!FBmWv`$}Agv(Av1N~s0I}nZM3hjyKTvi!uDIdqde+hd zirsMv2{HOSL&dhTU`uN&Pr*7WaL1iEDB~s1;yeLaIhC}}6$Wdft~q*Ag4V*M=URpV zN$Gm-e9a*sxRc}40rWsD@YZ^x?ZXNwu3PB~pRe9O=Z-g}Hh{Osk3g$N^1MWzIY`st zH`)8+=~1sk2QxK@-Sz$2kM&EWn>^f;*ICJkb#C)LO3;l;`=ZG938ZtVoE5&r;NQMD zE1YfJw2O)~u=kT^I$N!h3AfkbV85w~F?M<%IB~{L5GH69Z#o-Gn(UtB_}VO)#DNh3 z52c=Xu5U%ut$HWtkObtAjlu30H`u5D%|2?!l@zTS+RB799et3peHuif+^kSr=}3QE z+Ebh-M*G9&{1X$$_hSdX=Hg9Gd=7&;>vyA`1Do@y1tF`z>XyMd2#O(^{0B? zT0^qzvzK023j_5gOW%^^8`0c_M443vzll5dLet+kW1BAhQ1egzBu-ByMeCV#Z^>5v zOyhZ2G>XPOKTS8fn-6lvxF!}&oXLJSFlg3N=RPvzN_6RWEefi+PlU$&!T8rk)<*%f zd36StwJlNvVB@kd3CtmQ_!7yU!X;$Pp_+}ip!rKLc=Dq5ZW~P3xg%3RN#1|}m?MUb zCD^yQ2&z*e0j`PiFY7JLWkuc3Qt+_E6I3KD_zX8X@kc~C0jx&$g0}mb(EhT+B@WW! zzCtm-vcqkA!5%3H=AapZ2!gmfKx`?Xt>K78%!~oB>oz2~W&EXWBGfnMW~k~?%kvi| z)7WoM0+$pEwGIWPb@yE-3Lt0xo;41!ln{cw=In&+PC-S*p*Q?D+jUCJFSVrzNUkbt zmh8{58L7`=!J27xbc$RG>BGle$@~`pY?GSykH4jP7X07NluGjdQPPuRrQ1gSpCRvL zJM)B|B3owjS(sn`rBzW0EEXd>(@M5UnxZ>>uU;6fH&TYph0%!WW>i#58>f*qyY4Lx zyBa@klJ`YNZ#q!#YEuu@CV2DR+@%xCKO13a6VQ`{@Po|`c{Kuc)P~GB zuUlzdQO4)|2#VA*HVWpyEdwhY!gLUFbz6guSN9y9E9L0O;7DU6yy zUs$!l=pf|h)qQKDTv>spgCQKJrg&z2F;b-I@|6tDZZ6rOgrGvFk)3MYm->BBegE_j z_B3KF&%;)KW`=2(jfcT5TSTeJAkH3M)>=M~xKSWFqX@$lctx>aW;Tu(Q8GYSpoTwX zR_Ak!VnCg!03zo})hjdlt^>(?*FGF@L!~=H`qeoM*8KMxXHMbHd{BP#}!_@P>n zkqb5Etbqj@<30kKHmWe}Mbro*t$w-f=ET@Ak#1gipCSZ^iObac#~Az~ys=HY(sEgQ zxQj@CQ^V6Ql3SE{-!WnGY>S(3)4C1VL5E3(Ku3YicPIQ}T>z`MRr1FX%ppOwr!a;I74m-n&rzfjVWf{lbW%V-g2ujXigAa?8dy!ojuN zz~{Mk-^pK{%Ue@t(^As&{eqw&VoCgkrZd?>L#Ims)n;+)5v(@CWYcJm84zPUGatha z?b&VBeDNcs27KN>6aGWo?S#N^DBU~wKCrNy-^Of4Jw)k7mpW8(2MJ}|?Cnav&^?lP z<@*2w+wQX8*SEntSZQ!)Dm_HvwS)19^`_(3xj(ocG&3Fo$ZVa2vaK+phW41g#9Nee z{RZGm?aysh8nT!@NFJLfJiuBGK3%w9%dh=8cz7fT(#zM$BIsdkOSwV4Am4*+EH_s=DOH7gaPe>Azw@x+s<=L!(cf&Mu^Qu%jP~@W>~H{R_|CqM?dDPeJbmz%uys7bCbVxX<**Gp z)tTDwr9fIkhVTx+#&`f~*qdKSaew@LXpV;0(IEQFdl%oVb^+%n+wT@G=}aeG`z6f3 zsy@Hvl3SLv-)u?Utc}g~Y|ow;8j;zY5T1bAzFq>*@X1F4BIT^>fUvh-)jtkds&@F( z_ITckT{b1#@f3}9unY+6|P3^iHR6l@OZ%>UwGl}3I?$22Xh3Y zqeknj7bKW?k*rXYnJIvL%tDJwNhmRs~*KkmLh?b5ULJNh3ka8nP zRYu56DTi-369AK6y&#ieHMnsSg2LYmR2t^no+Laaj>l56@h1SqczH*S92(yfsGR(A z7KA;OpZQ6DY*O(oZRdAM8d9^|Wuc4$`_}>Ly&473RSCtUVB=7B-pZqehL3|LLss&sG<~MEHMYd9m4RW%aNGn}YS1j)T z_!5?K%d>+bCcC53Aw3hcC@-kWQJ$G&FQraF)VSjwq{r%6crpEdXZXOio(gq!F%mjFM;;AXVGsRJ$aM8HQ zUNkCd5@#8|%v4M)I81FuqTC}KG@3_O#Ny$Ocvgj=>0~5t#XNTzF0MugiVTE5DN$py z_oGawbMq>Tyl&0I&Sif$R9%O4Y`HVJ`|I=T5{)V*ZNqjojWj&PHa-4L=gtagPe#8fX`f6tnOE}R6(C(gpVm?Khnm&5jSHCM zoM4`vGa?oy4K5su0!M#?Wm(kY;GDfcj1@Ive!2YFBLf=k$&)`uytaMG>~f+Efe$z_kAzq79=1I5o~`W?M@H`!@xe7KT>n9Y`YOefNI ziQ}6t(h;=k6Xj0!F3c1V)B%D;q{>+O?bibz><5Jb{1s)R#fj)wVMi@`%G|WY!=KU1 z!CV(&*JT1-hRR$QG6DlAw3TlD`=*Qt7LRSg1_e^`1}mnA_DKO;X3kA;OKiSztc3E& z{^-mDiSq|H_#^oK!VG&?Ebg>Xxe>kgJ=VT+*QAZm{&XMd!%6Y9%L0Ijhk5DV$S+y0 zisW`gW^dPhz;EYhu++O+CD!Pvu}70Hv=a!=S&47Q(r-UD_hu~*Y4O}|34?<-U%}R1 z05^>*cT_+$+IzeEQ3Y25vUsbc5;*vp#VP1*R1MwSZjTF_60-M<;s7Y&7v1FI%L;8QQ?W^e;j)B zS#60NG;P~l{fOk&uc5S$1bB9edy-?__4&vKgNhFyWtmZi+Bpx8th?3IM4mmC>3)*M z04EL`y!YPh`4y<*aRuf7L7x>+*?lkW-S+aaivTzvXSZ3f`Ykq8&@5PZ^Z6rkz@!j< zMsffT62&ZwUq+T9l^7nXMWe_`G%j7-+L->=R*~nQYpyOZ(hrW@O>JM(gm-w5+du#C zIUG+$_Jb>Gn?H<}?+<>hRkwWS5>vZrB8JRMN!yjTng;O-56iHsFPEU}8&I;VIpmwi zn%-H?-U&BIC;o(&CMf+%fc6u|D5opgeKSS0su>`F8`Ze(r(qoh`oVJnFrfoD?2K>< zqA(A$U5M)iK3wR`5n*JN_;;ZM)3%6y0tKQ0Y2Y1m4A=oL5CSvlL(EOa31H)~Ad*7u zU4$9@pHT+^4$KmO#DOkf)yPg$LR%5aj!P{Cdk8%V07Zy&l9;g&&^Vc_^UHh%L)Zx# zaLkXI_AL?gS7H0bGvIChyTi!KbJ0p@%)~{L(!Lf7aJu!3_JNC2%Tbz!tbVl1@vEEu zd(CZc#ExTSjD7=P&km&>bG2%0I6yh#b+dv|rpE;1bmensvif{n<9>Re1+_okW{wYr z(EUGa;9rbGNxJ{=q5di<)>_Z~FKmdIxsOH=5zMm-=q(sIe z=pCtZ8#NulzV3aTj@I#y*MXh_tv+w34SsCP3M>o8AAW5z`qC8Vh^D}F8)Sk3<)arK zv?_hu*~NetJ=`ye9mcI5UATUT%ZxPvyl$w zPe0XOtM1-Q$RRg<&d53!6E3t6*ekBysIai_HH;N-i19NR!73zRDj` zb^a<6e-dQ=yg22X)TOC-5k-T7AeDgjOugalk1wso|4?!C?k4d!f4c0WdNpH9Yb1yhTpc?Nq%B6E2U*JArTr%iuR? ztn87cMvvVEeRAO{H;3$oGtUJ9T}-^y~nKo%n3#GqqdTxTI^my;Bcj%Z|s7L zLGT60I((BY`1jNRS5I3ehog`&;B9GFVBUnQt)|(*G~2$nX3O-)O@9vmdykw_$#wkS z;kY!@tm9AVWOV6|ap=4=y+1~J2aD)8dOw;CF(i+6{6SdnfB!Ir!%k_TKO7{<)|f?IzthoF4NL^8 zYJMK4Y5&4?tjg9Npv9C5k%EaOThYJsAuB}$OcY{744p>jj}M20HL5x$$_2X9Ytc%` zBQ(j`LK_C{&82wx~pXMwm!`y2OWLvaT6VEG|%nc$)AC zG_VmqBoXAZc+uBB0B$Y?0n@kVyf1QsXwy1I1k{GF^U_mO6hcU&N-6c&%`cdtxJFi-~=b7 zXoIhr*z`PEdV!ak<=#gWCXV4i>$9je73UH?>XsX)!^kBIaD42IlL7xAjZ2Qqfgwvr zZ2IrZPOsV3{j?TdNqt49+{8+1FO351r{gfS#(WPI+_(STDarXhUEiZ%NZ7!ut%k*pSu z^Z7Pkh-b=aRZcSSDHx7Xsq<0YO^sQ`g>*^RM^KA%18Y>kG3RHoO zd%&<-^Dk+a=yh>i=c>a&JhWJF|3lX(kk~&|5u#0S;a-LgeC`VcEya%`;sUmxK>kz! zLZU0$**JEY%%wX9H{uv!B5D|L zQ`7~hJ!nzCKQTXrduTVSe1%drXBV`P^Cr*KT*mz60cudLG| zKb(cX1kTv&t=#~%M+hLTUM=2-&7!3R*j7;Be^DkX?w|gbGX&XqBR2a^{73OxW`nM@ z!0B4j_lYe>Ek2eRxpY|r>m=6)nKtw;;pYTQ-a7fqiY_a2bbiyMhkPr;>MvHrSO;WL zAJVX$LLUNy;e@jF*)0BNS7VYmOL1Fz=9|A4IP#t2Es8@V6=Zb%^{};w3HvsmJkDHw z!hgwP+48Z|gwCds7UBx_;RlYJO;PaXEiw|!r{uz3j`!Cwx^QFjz4-b)J+W7(NCrwB zZFuINJ24ji$(X0i#6ewvx4b@M6aTVsfIj;f>5i`=AvFCwdzI}i8JYq1wCcMzl=J+; zp-3A2VPBu-R(hP}O`)*~%|G9p2Y)J!B-9;Sj-WUAh{b>Z%O;r?-JBpTN{9(eibIMv zsn#!_;3S6(I=Ei!eMU_P?>AxnGxOcHDQBCeu>nSppf8treF&;0-j;dqoe|z2V(7nN zx<7)%^c;@v$qB^+F-kyVG|?+;|8+p~l>=b{chqo|sP$M9xYyg)ySy4Z=0V6sx%r<5 zMv9?J=&7`~uM?pr7G$?;W*jv;c>Fmf=Vh_K99@lcW-juQlkK7IDJz3c!Sym$Kq`J`#&h z)(4;dRta>g3L;LyDLQ#bFg`A+!I3;>;Bsf@j!QgV=;7qbS5nT%G->WBo6!d#II%9{ zo3T0eC!nb=yLqZmkcj^XvP;`Exs%Z?uzCZqdv!N&e;>MoZ~g#e#6Qib7}wMuH1C*q z;?QOdA?9C;B!;u=vcfzeUPyJetHX4`_B+9n#}^vAkj;|uCX-mKK|zh(O}FkJx+Z-> zfy4lx`zycnFjGSv5qL&V&bz10L)dwJiS=nPch)e6c=a*kF6doS<7)2sSNubsTWO~J zAQyfbHw)Ntuj4omI#BVER%==NC5dPG&L%yzl+9HOu36AG+`_a7ZMzuTn=js4d6I~f zq2SIDUpJqkd3X(Ck2f9+D-W3YQTbp9C(RP4Yh(Vt@!8KsQUqJ+882Rn-=CX(4t%Fh zmVwlSx;_)@IX{l^-DGcze$|b>u7~s46yr0EC5z{-=~cAOc0M@hzaRR&IFphXHYNTt zOyW54S~YRoZz~W0<$0@oaFJ)CBHx8YS9s?Yq*iIRRm=cK7YJx;bJaSt--y#l*O+<)BJZx*sm_^N(23(=#Jog~@oB^a%f48lq_?7hbs7aq|K!6=0y2y9GhLX7Y{i!xrv65bu2fFx)4Mxx%~#WZxx? z;k4SYUC`dXdIuhQfS>^U{h$`_M371@K71`=j~p;H-+`dFMu1iZWxR_OTB0g?!RA~W zdd{{xkd7OfE%V};nQ*)g4RiVXam0US5LPj2H0$P0v}g@XEC z#M3(X;UuxUpU*S+;#whu^?y}H^#5OFD9eQ0T;iE)xr8*O?~{QaDvZ#^UuF#|E@%4B z?l?@`t=ao;#rlPcgtY!4lZ-{xJqxOg-9CcLAqS%g7@H2W?r7gRWzACsX?28ZUl<8SOXdWZ)jg!+f0ve&mMfdrTuUwqqc??<ogbZF>I=tpO7&dJFYRXq{m*D zw|LU1@d}aq)8*a7gpx!K{~E=cFulxYwVsD|8gmd*JpZA|esf9)y(PRoh0thzO`(#KPIq}|dUgpQhygHnY9{2k8270F};Fu}^i$6pG{K?NkV7|BoYpICiz!LG) zS*})qTkx4Bpcz!AQQ^A3sOHZv@m8MYxb&5--h7zAG!Hf>|DOo_$;G}pkcrOMvee(Q(*hugf@q;9Ki z`RU}0%V}a17v{5dwGu@qflXJEt3UF@&IVg{J{a*PH+jJhK19*aT<{(TlO`2d)~c&;YmSnjhCDK^kI9x>b^JWKoNkRgy=dRi?n`|x3GyuW-?=M1&A z;0gAxTkK!ao@J2hB40o})6-o^;K`lVtu8?*ZqQpoT%g}ivC*nhl}*0C=j!mVP3Y!2 zUh(5F6evCMpZi;O97Glq{7o%T(hHdKuEkE@58z=dcMm%EHB(p+3cfL+9mAvz(e5;q zhw*$oXsIE^RF@JPgi%_`E+nkvu|&09^*6hU{@EAy zx%SUTZ6!=!D;dVUpA$0cz`~W~m=uugeSf{5qt&{bsA|3qfq3DvR$**5-o1C04(ND1 z$~ww=r$(6?yg&-q$KZet3(L#b{**z6uUu+L!A%lR-6KJA2&)H7z7G{fbo^%I>5nw5 zakOp6yjDWgXlpBW$3%bePrfJ{B8RuC_W<;Q=0aCirFP64LJ)I(bU?5dT>XOquGPAe z&oNH~N9Oo&#`~ZcLW%X3z9Fb*dq)bHR_gM=PSZq{Pq1Q^Dn(({rK54 zk&xSJTDU*7nvXGA@bhxud5=8gezVmfk>=#iFK|K@liGV)Rx2$DmH$8QKpHBy27AlJ&u^)YE`{jGKNS?DZwc4tsZM#Y zI=Kj!PzrB7$%s;sd`U&{o%7MUCPN9QS#z(pI!W4$IUlq!9xMzN5{ z+Cjg%`@ZL%@@G6Drb<;6lM+!eJ{rEV$gT;MdRX~`71oL$XZBlCB(3!{x3J%3?i*=6 zeJ?Sb805W3rZ}sCNkZ}N5WX6BrIL+B0(%NXc3-t9Ly+bG%|wkn${AIc;~+{ zN{*FVZbXt1c;Rf;w`3qEywM9+!vdnMuTkF%BK7TM;3B`#o6Y<2LP9^zlA{-Fm>PAzAK)_x;b0l3$&|zexn9Ygr%zr-8!Y6SN3ujGA4$pT04=-si|Cjco$$tg% z;V-1TI=W<8_+qcn^NaX@rUf_3!Q&tFXt14L|AcHVc!3ZoaU+NLDYvjU82*J~fhyls zl@S~dMS5l)7wc-l2`4^ zf8%m@ec2#O${$NsindU>ln_-Jlp7u%j|OlFQO zJRy9a7+}^2CxG3}FTLv~?))MB`M`F8LtfcmObTu&vhdu^D$2MLED&VS%e1vjhgCC! z3&VRW>e=S(ZMbKqRBEVZx+D|s&1j{5u00AJCRdQb9rLHMlCyEA@7qqmk@7EaKFRQN z2red_Fh(rYcSbH1N*Gz1Y~*tiD2sY_CX3gvg1}6;+$))aaLyJ z9K3lev+&nw#ae_o3?PK-iaB9M;5vG1I8Xv@vL+UiONqO>VwUTFtowOm(%c2nD2@n0 z<73_BuT3a7{O<;{qn#C+q&L4T*H_#t?XM55TCc_b@E3*mc39DUyF8c2#9)rUiEAi6 zLIF0BKc35X+-komr5#3PQZ|9f#P>`4mYVqWC?xj_)dd#B$lS-i4?4~B=DOb;2Gs&P zmAIBg2_a9_IoUU(k11?WeL2oHUIHPkQOoo+!^HFA$4?Na<;CCP5Go8{70 zV*7mM1J$<=C57*;TLn};-JmlptKbc>+uV}Z`(XGNb?M2W7!GW@{G`)aLOn4tYfA8dh+>6>Jr&I6M z7@+M~VMn_eTesqCkY&*Tg{XOGo$js*{ldR6FC< zBtTO*i1_Qc;%|&}F|Yt^4grNn1w6%8qU(Li7M70_GHWLo1o3i)7nHdhzWkc2JiRwy z6446o{lz50Y3X%NK9s)m03P+<%J@5$54zTJh}eYXjYs6;i60_Xp~VlM&w9Mx|IfQx zw&0^~ksf7AMB#e81W|W>pZksBr?8{3UA=1qH(wlK-~-xrD&qjljd8S=n+diO9{aMX zu<%#UJbbyQj`}oM(G}W z+CkF!Cf^gT=H!}=tdLizEJkzcOg=NXGAup^4-Q*3(E6;clo~{1ynz)UtJku*f1c(| zQM&l6Vj$NOYk^FKW!j`6=E8BpCFN|gY<`lx=U*tG_#8cgbKPcFy}nm-NI`T@%k?d@ zLt2ESV3Qz7&$X=n<4I_Fo7}oD85CXSmkSxiq^`ic+3`)=G(x6a0G=J51yzbDQR)f@N+OA zyjK7fKKcG{U4c*iA1g3C zd7UVJ#m^(h(xRj&|0u9tw%q@XA{~hYyfu#j4cf+lWMTP}%Gq>TEtfpMIJfcxVU@7% zr!Y_l5!@CBU^{#PZ50KGfr{8j(7QqKjgm9;6%K3Q|Hsr@Mn%cdAHtcQ+_4-91PQFw8#loc}rRdB4qCd(F3f@9VyP8K2%EqO&y! zaTOh1{Q+h38Aq5VIdqqzjg1|}|UC*EPU!c%w>g}FVU8?KS63V%%WbKtFy(dSu4z?q6d+p@e(Lei7B&HfX zNelQdd89eFnsUROOfKBp*ivDEyKOJ{|E4Fv-2Qr1fsb}IAo-MA1Vb+(@>8`c|KPBI zqgr$X-gPHkB*gZl`}~t$a4z}z%P86NxQZ#M--V>)PQl0Z?ytVL9H*%iQx5sJ!@Gue z`unHYgrDQ2ZP9=%!-R{eU!cy_%*TVf?BO;Db!Z@-yPK7T?j*BV^+|4V!@@A#!FM7q z#2G~Nw5kRjlq@PAIDA4sPWh7WTk2mN_{W9&dyUlXo8zBfhs5VcW0;eqZ$NLPOr9(! zqkMNLE1Z6pWjEoD{M6WN?Lh7dv{Tae$~|53(U4JpIx!NQN`5GbQ3FqyxSv$i4!qti z6}me6nfgBHDe-Y4yT2P_;kTy_Xu%oA&;d!hAAw$qIQ=56l%;&%^5gOw^4p*W^r<(Y zD__2=J+ zSftaRR6EsFNS!nGVzA^a4QCtm-Ii<++GO^yzlHKrJ8%mDOT~9I7j0U<`KjKZ^M)(+ zk^i7{X^+v%M7HsOM7}@N0$CuD^K5e>!P~UpMBat{_X(s($HpkgLy{&a zCV4w7BtWtuZGr=yp+&(AlD$wxi=>2mBi9K_kmEP*@TarSHVsZpW);#@p-_Dunbm5f zjFr}PuC1#3GPm3z&(x_>MLRdux5!m4w!*|;Y|){#Om19qBU5of^U2DFs(AInNf5Oe z@2KegNe5M4{oC92{H@r%Wm7GpNIPhjEBTJ%p!mRnsPXrme(qgFCZVcA z@2i(WU1~mP^L$9Jsq-6eh?Ol|-Om|W=iqVsnZu$m61{#P2DLjH$*GcE`ULrM?$Pzk zucy87n^F&OLG30G32{ArbRQdWetpLM=uo4TBQ^kbWJZT`8^0m%C1&;fF=4aDDF~~m z_ue&MCSYcU4aoK0i1KwLf>q(?5->R$YgozgNBWO2oQ?JufafbX_u^YIzB35j116MB zw2cC;;eF&0|8A{yt6);vhXnW)Q`6sL5(Y#p*x0_ms+sRV2AYA9A--V{QA8#>S=rzt zS)>pnq6Vog4i{2jv$zYo!T*{tyv_!nIYeCgGc!LG@nqo6zby{>KJwCU$C7fu{Owwl zSp0+0hO~zXG0FnILLBrFtXAVxwb#lN`%hU;#&o=`Q~cn(2Zm$BwBfV$?|&8t%)gj4 zm^O%+QWyrOT<~Y}wLXV;T*9L_9;cTwE}JProf{eqCbi{w2!q-QJtSB9nb=)Q*!&5j z_z!-iy5%6gm=TzJLfYq>rzFXN9s)7E`K!p}ap_`Ut6P3Ibq+q_z7Ma%0=Mz(D$SzI zhTE@m=lccYsOLi=wkaC*af*&?25po*Jsu35P?5{sX8-nsYNf{pJ7 zIU@r}IdaqNs$@mcQGD6L0HL<5RQ)*4l4S!I85#rlx9Cv?2^3wY5J^VkaDG#i+}tDu z#du8VYh4jpk(UDZ>}6FhNaig4QRgYtEwQNfnF-%sXe`{Xejh2Ggr3}x z3{tntNtr$^BY}@HKK@pZ^AP1Uw5^PLDcgE|u+-m2SR|^VQE+r(lC&`xg2%?T^HSbrwu+*y8D+cS2!qRFd=H-6sqL)iz0mQv(K=mxFeMaCU`A)hpbp`rgE>230aCwc|Z9*+r;!jt~9>vtB(@ED|89` zL(Wc?vVnQrCv@dgKu%t9!0=OCaFH0B#c0Dkc^sL2IBrdC>jeSHV}Rt{pzgteYz|uf z%G<6ln)ii07VJGI6%l)b|Kfe($+=`Gbn=I}nWA=!kgx*R;|cltY+xoNr+V#v@0b_h zzzIYv?*@0+!)J3Sa^;3MiHkaXO3 zNGF+S-leEc1RT5^O*oEZsclkiaegSW4 z>3=kC^WnY8XT6LLg#Mr!9uQzKR{eDA3;{Q3xpe>Gb|CQ{>{dx2Qk0lrF~$EQVht-8 zT&0P(btF*xcWpBALq8+aH27-ux?tHalHi)YWI_X@-iBbs?Zc0i7vTg}&zq2$FN47T zyzhVavjQaG_pUirV+?pdC>|UM=|ck$-*_(rwR~K-Z#4MgiXh?6kqrv6gL(A#ob`gq zaWF{|!A)}k5ZZESzLAUZ|O|8UupIG-5Oa!S%znG_td6~2QJSoiy%%j zUn3~=pruE(a`0wo_niNKqfD4mcoO)d)ClAW^I5nY{BS`9%WPhuoS*HX4W{|>fZWz z8^hD=NUj)t%|M<#`JMr0`M|LEGS%StMV&=V>E`+P!(0jJZ%hB5@xz_zo;xzBnS&l^ z6J7$Uvb6k!p~1OWM;z#HjL#J4Um%gJv$8dRyTWQUcrV+D5*X-%k79&p#IIBoUO=?H zIKiXLk!pvWMcLspaC^OCHZ!sE5?xlcFRV01TsnZ0uGqmL5Y&wR?uJ(F>=&8!Oej%p zn-O@8ib1t;993PNrP>)2<;;Ii$IMf=G3`m7sFgxqPbhf8%KsO~BKzQ(OjwEY_2)K+ zEJzwdQSoKD$8G`El8^dkDKa5R2>N3hb_{}p#1G*6{$ahGsVZE#O7c~u0ioa6q+4y} zO3g!+Ldzb(CI46iXu**LpD&mjrQSg@;&kUzNgy>3#a00;w56Rq5Y3RDZO{ncz_&=z;MePGxmQ})017m!B0i>t3JqKU)z3!(aG|2RS=&7^ zj=^BctpW)c$+scTe^mdqO+6G3AOWAb;eW~5NxPAN>MII(j&0Y?53=Kk40CcXR2+egUT#vM1Lp?S8(Rxoz6WvJ_Rd`}%fMksCJBsQm7nU!|_}J`AF477=O952ufvx0Ii?FLzyeyytl| zFE$lBcQ?{EbY`lYCjP>zs_EMSckJ7(&3HwvlYCjU#{)iCNJA>c0A54uvG}~^RRR2a zKw=}G>Kn&V8V9x3KaJQ={MXY34s@a>&zYp0V{95{GBpGY$ng*5VzEK0li2timOK}^Tx3eG>~a~kDpnCXw$FwDrhbXQozR%CJI?@LmiRZfX=Hc1UR;Xq0P z75&9b0k{*0#Uk3|dK3>j(q=R=9IZwBQcKHDA}sa@cyknNT=g+i*z`!AW46bvNZ-i%iOkARUU4K41yge`Qeo-|!7od6Ag0Sa z`jC(RY*U+hT|acF?&_KN4<09fqq~kwjyqlwSu>_u_FwDOuK8C6VZ%yGQsSTRQ`Ke9 zsil^|&4HAW7D?D$TY$FM7b!a>V-KY$CQ^LrZUJFfj^+XMKC`FB@N5Wt6kAx=apgLx z4si|5+v>Su>1LIs1?-d;b~l%vX7Z`@x(rW$V;r15Nuu>6@PPG;qX&3rSM1yjOq#Vs`D$G5Pq%YsWO% z;@%AEZyHj4s9I;dsw~M>`He^(xD&o!$S?6T8LJBAsXS0=`_*|FbZ~DV1;|j!2SUwfSz_EKtL`6_7|2&?`)2>7w;#K#Xplumu4osz*=3NQ)^>dw; zzr?|p_u;50393n#H*My)X zyhfdsB#b3gG+V`heqXR+t>T$0BsVrPu}SJBGC~@PU{|BhUf$c!$>%`Pn;N7t@S(Pr z>DoqSWM8`>@(t(bQ)v%bV~%MaZ0BD`)nnXq?bKOhrko6?x>3ksI_~37+i~aqVE;wz zLKiFL=L@nRagOQAmdoGHVJsUwbN!A8Pk~f~bdI2tjN;Gc%7E5ZmRd)C)nR3u6z%m)uRBCo=)r);zsgI4gv5tkQDL>GPiW(h4Yn}~H#VcQfBb`F1QO$g*( zCSA=eZ513q?cx#8SEI6$dVP>z8r0@Riwh;noZulmP7d9q> z8(vNC(y|+g)tJOzX?egFz5^A`7FE=Kw>UNAGjfm1YMZ9`W0GpbAZp#LG->|CKhC)s zpM_M~d>22XqFvP#LVOdGCr=FUqfj{n1H5-Zl=USVDe;hZduFQ}rHqY9HeaQ^s7)Uq z%3=HFPYO%Ahe*-AaXOrI{|HxX!gUX)X6Zu6X#e2i=NEC_w+NT)6};hk`uS8MptN+! zc<%KRLqfp2SR&czO>0+nOL=lko}R)sTY~RuQpCH-;pgPD4t}GDM3)p9!v=}=)5+7j zme@Jzyc-fLa^qF6?9+(aB--~vR^GE7)jK_}v2c=8HoB7#{^7rvnatp-+~{8(@1H6d zUJ7YYEy|f~*l_5hSrI@Fev@``gi!T+xfV%Y)9R;t+;apJiq{GD0_7UZ_kjlFq)kza z*Pi$?ixc0MGtKOlOx0^^Hz}#eS1n&pMqzBh~XD>{6Ustt_ z*u+~8v3~}a>2)R9SMXdq$vt%?0Sb>!B@#wo?LNc~zaQRBJ(*Xuy}7om7oFat$?Q!E ziUcEd5U!N~3jsMvATsZF{wYy*3SE=0j5?z8_e5h)s@J zthT)V^D7G4rg5!;1XLkuy;sX$)g?G?6V7r&Uw8k=alx2|$otmqNOf=jzCK2wR7Z7D z9i^6`DyH0s@wOjiTy?p}3cVr1hJ1D@u5=lBHZ=={ApD^Iza$~`?&}1s+JkQ?na*r| zkdmKG$BdGfsodShd(eJPs~Nn#L5jvqGKxnPjmEjKQ?|0K4f9bWpyhEO`M8v$_%ZDj z!Ho|g6WIoIe#q^0m?^%+7n?p1p24;>c3h>%-wKBgS4vBtArGl^7V@tx1G2>-CFy3& zJ7|O2$!Vf~B+DpBJf=+7?2LU3$ryE4WYwteBsrpq zyr;a;sPV{{r;?DBxBi}P-!x|df(5I7#4BWL1xv>me;zefYPfYh-Zb!Z==A#UhOgA5)xoTuE27#)=AY{540l# zLW7`fKU~V?=NK|n-M1g*pYoC;8rFNA%xhv}h6!zONHV9VbI%1tn)Oq@b$Tndw zIe*`WTD_>i__p1e;C$cZ8*P`fjX{08N#SF(JApR(yD7TpS1B6f zjTwYWdL>WW#G_y|Jn7*K#{R+Ok2Z|{N_{ zSB-69<&T4^g7k8f7i@a*nkLN;mKz+o!ZUN5RiCyn97-k1xjqkrg-pFy%*(RY$dAph zM=P}K+AVs4U!mkK+6V)`(j7;c3}0vr?t4GT=Y-F`OS7hZjeW=in@8;p42By#j(iU< z)Lgulk;*LZD*0(iBqy@6pAo zf|X+%HwZEP{P?;7O}I7Q~Jbi)vG8a&8Lto5^nzK44}9ubFr8OCeVNl zC5@A`KC~aqDru1gPJVx_0YTgkn0%K=M=C^YA6h$>%EL99_3k=D+KE&$^g-?>8?1h5 z?o^ReM3M}lkREisawvz~ixhsiJJy&UsO$9jXGrlygb(AkKS;9n3k*b=L6K4YW=iwD zq-e*dH~#;~Ne-cJqBNE*?MYG?FBm$Fxqg)#Hjo8gz9*LZAuFG@7*&6q>i8`xpOJ z4*KQGQ-7^ykwAm#$yl(9Ojwh4B*seYr+C5s4W7;Eao5zy$;>xL}Y`kNzqISgdMzqXQ6l? zE@k=0UE zjbU<9@NefF@PSrBJ6R9d+80e)i@C!Uh1u=R%DM5pWJgpd#L-Q|2Yw^UJfJPNON`bd zJtC44{o!D)^eQ}h*6DNXe-*31KMZ)ECvj<%X48>ieacg-3)&!t9&cZ(Qn5Lb(kTiS3w7x)`1!#&&Ri+=7s;yX_J(QIWuEU?TO}&=^WRa(LT}vfgw)bP z_+M&~7gbPpb_ak8W?tst!?5wX@vC^}`m|Hz88?Moxfd32iJZTFP5rd`r-6yqCXOxc zts5hc+p9Jaj8GrqZAQyD&P;o90)6HzXb@$yXtKrIn6JVM$>_c}7BV;k{EL?me(mP^ zeugi?VoRVyZF!@sTQ%qY4|67=+PaS-Dqub|ZEv0-l8=r#{=zF)UZ3YBWcoMg<99?OVz*3n+Q0@`JIi&6Z zaHCv9onzNPPbp&>UDC=LQ|&KvyWhPMaE`t2GQLX#oN)2op4%Q0nC=kRS|9)!9lnpq zHQ3p#q}l?-k3(kqK2mjj#1i?URqhd|q4%H0ood0I4Zx{LKUmAwe`?UIaB22*^oLFu*JW4LU!~F|MT&lg-0I?=u`36Oib40!S{HoLOVSDE zkF=xyCMme{cr_k8sE5rZpA#^79_$)p06ZO)Y56?sA^#F5mn{oasLYtG*!W3VqTNl~ zjK3hGV2_+QWcc#cPw$XLrvis9>tof5S7DL(j6qVsLD9n#)cgg>IJI2QDovUIUF`m+ zQAXG1F*7f#iPv|LQ>}k$Ipv<%S6Ne0FRqimj`i@RL|LFn}{)rwG?TmK)-DY_4%1NVsDNsr6pAnUP6r67qlOm_enJ ze}Z&F3Pm6Tb+0oKwCmn{Sz?J$3}~bdS%X-ST=Q+>Y3NK z^3sX&wA}B{fXdkxas-Vvt=&>eqxWD~R_3}Y`I7O(&AJk~I@&h=8($gw9|7AFYg8nB zcc7Z1U+1L7r350wD^upaybdl7Q;R&yYtAi2DBd_tB1UJRMOtfD{~?gZl@`NFIJhsO zKpg&KyFdxb_VuLrKSV(03Ju_ySTyMcC0!NZqbr|nwcII7ZqJW&CxYLI5}&FF^??OL z;sN`KCMdzN=$soO`U^g=w@M&f77FeG4fcGC?xcbvP@nMiz?uJ&>YNxq!wR?_@SsV; z{6jsT8ITRGFCt*2dTL(TTcE}3o3E+CQtWVEj%js74|V#?^wEx%BJ?m4+>HW^6-_~A zhJ5N!Z1xQ2Hqf3cF+3@f6&flz@>4c=C$$2n)Uw~JK6ugv9ph0w%Dk8y3-Fj zHlIYEkCZ@#5FS~^H?755)(r!kzm~Q{_te6*BuNvtp>FZG49C{HKP77oX0$Ux)5CsKKHB%;KgavIT)Vgu*8VgaEFKeN zG=?(!sxsi@ne6^7aDBWje+bB|>mp_#&mnvo-YZj2Sk5YB4t0Tg63K8sS#yx?mny&A zRT2I9)VSIcr&&vpS+t7U0ljuQQO`@mw2V% zL@Ve(JhZ}SO$0t?=&-hQH4_X@o5KYbnL{?eYG(SIzk?(>BeEwj^6-H{AIj0-MCc&{ zyhJ<{pE)LG7^?5iNJ!I&3R}PevJr-|QLD*lZc^Q9?`ZH6KLgw$8f@4H@`5e}HQnqo za2-z5NZG9^Lo>SmgTVfXU_kG`#UR7SAe&FR{mRl(u+e`vCuC;FK5~y)_kC;DdvbL1 zyrYE_LVZ$DJbFb6h3sYI-hFSbMEUD>ETZw^?HvWG7TffwN{oiG@V@mt4u>AIebizyUX*GHe=6;ZMBY!ej9 zPyrocrwcle<7)~;Q4!Z;F0;}^-LO~tgsJO7_SDnGyQZM7Kc^9R{DEd55p|DS8`oRi z3SO9|=NX=gn)SYC(R}FR_tz16s`5_ce_P%gBu$yv%mO)iHOG{@eg;bG;bHW%ZD0N- zr)^rx3>{{_{Zabbp#4qNgMv3n-&BNqj#M?Jcxa26f0d-!DG=egp8o{Ak5W`zh#ZlE zifSu=ns74^SYSAjdAt#?xw$8n^F*CeBv>jnR|~RzGz>(gaTOMIFs%ou*Aj4R5Y=;0 zGD?2d9vRj!LGN1mXK2B2{w}41nKk~sFLWop{%nf>-pkFZDp$(uOhwS?FjZ{ybJ0`E z)Q7Blcd?_zn|lR%RscSQ{@kG7KV)(+`D|M;Z#ceE-R)S~Q6J;3+wU)YpQ zr;l%tN*OEtu2Aq|GgjjK+M~HKs)4GQVYEb(&YQc&?tu-%X3UT}5kb=B(I=Oj@_u`? zVOp#H3PQf2;d{3!hnpfh9a&a)QQ`HWWjD`*Xrf0PQf93dSX9jw?wP{o-CK*aIwJGZ zQTEmjx2gv2W})hPAuTI43u>GrvPF<-{kZDMxAos-G~zR?f#x+tUzti?C8PEdkhPtE z?npN~lc8|iAg_Zkl(nelqOQ|YCWY=GMT2Z!=S7`EW=IfvS@Q$vQmGtFmsN~!=d1Y$ zh)>B!u>$hS`zW13oGx{QdYve+TG91q4Pw@B1Tj;=!yVpsMX24h=)sQ?Q-TE+e|)2ES=#pvQSXj0Nnpdcziw5PJQJaKJt)M&hdHY|fodx?*mXD1}Nu z$!Ib)U8ImFu4`tT2J&jj;<=zVZp7rzbKHTT%Id9Al^p4la&j+QA9ic4Q$I%5=e+Kw z=etbNGO6W<|E^KkdLMU2L?{Kj+ zls>WkFdnfdCk|#t7I|+%MP)nt`Hc?)`Pyd={4S4wK4#EV0(9_gN7=L;l}tVVk_cK#jqv;9r?xrS<-shkb2 zkSiQ#k5wj&eq9)1{~5x21}YL$oa1;R9VAZn#2PVoadu}c(AVXC9s43+?j2P$)x)`{ z=178VY6-+)>Dm?J+?akSNm9OcOFrw1YTM|%?d#y+A}WR~8b$UJY~`yGNR_u^2xbOy zN6^Y5f%?Oqg!&xzA{MK2b2Ajj_fsS*XEVjPjwPB6xs7wquFi!9H5Xb)CRZ;OfsuRs zM+O{{*%vATi}oMLVj=C5xdD~0a{N@z3$V-+H1drsY)$IkIU^LP%d$DV>lB*l!A0Lm zO1Bh*>d8V%XG1t&qK3Xgcx*tv9_rFG@Ue63=Rpa0NJu=`crq1#T=v+(j;JedYm@5W zfdeoY0Kqq6{-dz#98*Pi3jAO=S4VgL?~J2@8FmVypadRS1~fYN{ZNX_w5}qj3p@~JP+Rgq+O*LEWpQI(Dr|8c1eZY5T z6Qu%0dy|XllZFujC7lUkN`5(qKMs4jf9VEU->gM*tbFc8JL#wQy|-@CzHxtFuetJy za??1~NVLX);|urH_g}vFn!fXz;U@GNoUt<$Zk?&=aETzTuCyBmiD#{Gia;%dtI`9z znq=S*%ko%5_sunf=#-r@XOx-*Z5sbxsxNT=&O%krc9;1d&m2QgZAM}TDy(7>iW;cR zw>Cue?jy&8V_#~!t6(b^Yxbyt%nw^sWH&QuWK`Bj9e=9=I5uluc7MV9~xcPo+ zKtN(t*1`hUL=Rl0Q>4q`t)=qL8xJim%Nscj-(+=)a7a6|4T8HMKSNs>Dl8Ir3ed}N z%PNziw2{M+G}g;M-qm40WXGSpuNi7LN(Xsjo5BFk>uQ|gJZTeWmgQavu@TG*cM5oi z?BDp3V0Pn6{+0H`S9_NCWx~Y!nboaF5od%y?7be# zJ@t#LfjHbpu_8~+UwWLm#%5Pw;)4LO5D^GLiv+CUbQyAF-P;SogAiEyN%a5nx5w1UVqo-y^@mnWh0-poC9(Vf%wxPyw65=FgbW z3WooLT!UIsz#^a6dt0RHQ@}Sb5fLY!g#07=tHFn`f0h7;M@TQfZIk=%%YDWnON z`=VbBwDl?Pcy(toZj%!AU1SbS@39?#njp?k%)U{QFU5?^0vzo^C2 zEF$-QRPj{(VqwE9j|aX;iV6f;&DVuJJpv|gg9ur%+l+A4*hLhdn9Yo7?%6IX|3b6FFm5WA-@)>e?$pHdI8 zwWV?}(>b)ryDaYbPJLB^+949z6H$->wn~J^IHgQMfv~2I^ED!86K=R4kuBg%0rw?? z%MtRt20r7#e=JL!BPLQ#)3==6d^?;*s`$xUh>GLx#Zs25@21!893r!){6|>h1^jb_pRJn51WK%c!;L--FL1? zbsu7E9|$M=(IE;~_jpmL>oGzP-ia`kMz?=sKd&SvV0XJksneO$ioiIO9M*9`sn@B@ zo8!_D!Q3!al>YSs+8zys(k*^W>_=bZD+gsJ_nGUm z?SWoyhKmc?FQ8gJ0Zz@wfxzf2 zslEwqPAS~Icfmz!7%qej>KH!UZ8Yw&TgpfKYbQ1H7_7O!y%@#`*-GeWI#e06KCpA5 zq)phxsTxDP9Z5&l1@KCla_A$%G4#3W;d*42|MAiMS5{-vh&x2FY(RW{fxOml@m+mHo2abz4mCf+7OOCRtV5%?Zct zkhH3WemgRvvNoA`9!FRK3&8r9UyFT?(4K^5k;HuEzEAfT&{osTkaZOHP#hL-Ms#bx zqPzN?J$>F8?T|2@r_rraGuW5}+h9*HgZ=~LToQbkpFf{@$F>mW! zHx?`ZB>wqC=8y-A3eSvwdl}?cg3y}p6x?kUh+gpqgWq+MY!zTB2?)YSxGd4$YtXi{ zHk*jC!JbyBPagqFc*H_Tgg88l7_LQsOrqCWvjc)IM%HZga90VTXYwu&_o(=WgL(ct z^~g`cuo3dbs~Oo`U*_L=6IzJ>U;`hpNoc8acj*Mg|ML-UunvK)$eySWa@~AXpgs{S zyLk%BNtK0-Jev1|^k5U5@Y|3`&;DmnjENFDkUL00h5~pZyk#UnM$1UBK;**5rm2fB zP|V_ELKViUZy?pvdya~GjB7EMQhNi>@NI+Ms~+gh)u|)NkJ1k3#$nBC+ zcG$m;ayeKh5TI-b(x$GQyqBOG-lR_4IJXCTF8Sv-Xx98#f2mLUKB}>Zza1*Gw=OZ~ zyH%;NFuG1aZ$|pcR=xAUr;$dr9ka4p#QWP)>}OZb%1Rv@m(R^eu?FRUCF6AJ5!PnQ zHRE?neuii~Y`rFf(mqkiI@b%b(5Z@Ek#M728ivd*V`@cJ@^Ex~q~&s(BzZs1P~~WJ zD_9?+_7V%_cN}I)wwr`uv}Bgl@TLKSm$+0zv~72huSnh><&^OjeEmb(yI_%Y!SLUMLxL4+T-}xue zf%nl)GT4BuKZGC(HhL=jBdQ^PrvL-$3Tp&g)h!UWEJ-w7oT}_>LTR_mE>`I@fB zGlJ34>pOBLo`Tya>DZ~ByDUfNph_6)65mFVWs-CKONAR}WF{yB=Rn5|>Qkt*z`jHW zyb@2YPO>csr-+UEx6qZ*bL0YYj6Y7c{?u#Vy7yf$T=2Bo z75H??4yXbPR6=zrL)zQaqHIg?H1LH+mA5Eeu>z2vK^1A zRfBTkejT{qhuZ(-6TSdmf3Z%v;h*Astzfb+m`pd0Z_(tu2zG{XlpS&L4*?eH??))S zxevYy{Ark>(GO(P`uBoDi%II>-E~)bDyG8?vOuHieB9C_c!HBjl|Z!x#;`Xxiu&$jn-Vp55Ktu2gzCY@k_>Ch)Y#&Kz}K!%cnoj$=lz?nEOH@HU~ zTJsZwZ02~FTu%^MGgmD{Kf^8cW%oH@v%yJgXLj-q3Vgb0#D6?1n=7hzx=5Pe@B^eB z#K@9e)HYQA#q>N3{CPs?I$rr*!BBNvN3l!835e>+Bc1{X_EtuRsW}lcx%6Jw-HNFm z<7DTK4dc{wu)*}=P0l{{$QE_?NG?_U8uJY0 zpe-ZoYixjhFX!fOPG7k@Z?=CA%fXc4B=8i5)nroFWO>bc#OlooDw&0&y$hB++eslp z-QZqQ*>^Ze3d8s+I{c1R_nAkG)dEP{Vz%C=9rj&5yefEMyVu=b$MKF&eViGejUA=QkcSxiZVPns0=9q;!?YUXw-c!IcgCPH|rph+kL zl7n8^kQsC!{EQ8zFP;b~2zT%^=<9JWg(_h(va<^49 z&HtsDJgurw5Y-YUUAfj`_b6int6bb+uKl1nN;of4OQ+tf_k1#rjS)nCO#60W@kM8z z^B590?5px)7HxWK$z zEvRwY{`=n%EFV*Jumts7g`e`hMZH@>lq%=QS<)@x_(aAB7CFM90o(+sNP4%lmRS|7 zenF8Rt|SknQ}u7l(t6V=kixibNaV=M<)YCngI%#zV@r>4;uJOmJd`%rerN7e+Z*(2 zS44XgFITfO5#cr>B}avucrS|e`yeTVBMNNqvT=nSp7E2z($Qz|4BJSZKonM;A(OQG zHlGJ(>8uVFGi#r5Esg6eGS2}vFej0jts)w4tAA39-mEANMzY1dbaH7} z#d*2>w2u`wmvXQPEMOL81l%bX^5Y)~=k9l&D_4iS6$IqqVfkVqS-KX{R=aeS^oe7S zA+|x;gK`J7ViyHQ1YEp?;S?Dyqb||YIKA`9>+Nxjb>S}=0Qu5{AaJwIvt_8O?+1uh z2)G*+&f&>Q>W=@=e8-KO>z347dg&<)AGq&LeLB-j0t}jDryIFn0hXkVWI!VwU`G53 zwjd3|Og#(Ghxwz=R%-|8AQTG?aj634~0Ki)|3p^`K` z?Tq$)!}Rr{Ro0{5N0cRSZ(X`su@(l|6o=Bkl|z!ruS+!4EK#XH*9zSZARYUghP|(Z zR_W?m@*j%Q{-_^Uyr=oCqRWC{iPERgr}Bo#@*3(opLAgOh|{%)zt^T*}T(uN`YYxQ1jc-oOwznl*!o%L5#0UNC;35lVkI|U@9l^7aPLb|)9L^?;LyBlc)rMnrr zk#6bkp+^{I?)csHefRzWXU#8j)_LD|@BQrBpmkNI2n26e>)rUTG0%)}ibZsl<66`l zL2gMsWs;G|Gwuzc{a0*&!sF8b#n!RK2ZoGM>{4xs87!yBl|-d{WCDTv3vpY^`Wu&B z5zn+n-hhN+LuBm|cHh(QreEXKFFi$j-KAL84sD18c&bD%9=@`xqH_piW}k0$peSXG zvyO}$leA-f6QZ`uz<5IYH}7Y?+R9sim=d%%co1c7)6e{}q70RzL(dm~fjY6@#*8fhI*!T94^H7`G= z{_zSBhCEQPcLP-}U6k+ zH+GXDlMc|*FvJhy4bvnD*lcHH3o-pS5m(G2e?gpXTrB7rqoLaQei@zt8+W>99&tbi zy{Hhz^EBRNg#!P?uVLNCHOnaD_@U;nNKTR%dH0hoUpPrE_7%Ut5_VW```)@`N1rd7 zl@Go{j+)dr`xoNAJIzP`)mc#gr?Z$f9B}i4;1fWOS+D|)G!dTG;b}S(WcG*t+hyXs zwH211dowCq7C|q=6h(=8W}lzdUQwkDqgKX&doaGd7l(4lIh;HfHJ^{P{{`OvUMY}6 zuQn(hLiL3-#_>q5VNM!ZdR74kSbF@Re^g|8y$U}Nc4gbYamT-Vp7qv1TsDNMsl>Mz zorMhl{T9=cO_1Kwhk@;&1Z+WtHxFUhoWP2Io)|yQh zs}cAMeZX057kb-R0{!0Pj7=>8s$xD$KMa8ONSm~g3|nCjeUy-m3kO}UIevfS(8m?b zcbL?6Qqc?-nL=IcVFM9#z9@5sc2lGg`O7X-tqO(yB%-gyC*GT3)eI)h*}O74P^9nZ z+{GoJ@*J1`)SIsx^;^Gty;Y>u5dG z9|0yN0r_8dsHp+R<0ZYg+}lfqF;&=@GmP1A;oJj8t;z+z_T)W>T--NZg6OvLlGn3n zzduJjLz+B;5HEL-4FgDE1PG#IKa%U_0-QMa=u zXH7YtW(Ry!3Uyy?$( zsf2#;y5+%P{K@O}(~E=QC1&Z|-y1U-rmZS7<{k#5u^wVy5g&0=hmNGlT3m43EVwdA zeUp_Q+ha4<3eQ6nd@Jx1ap0O4+)(D0ddcL1SJFBB_$L@DR;I?(%*hv%VKLgf!pjL2 zk5THl9o24!GGK&umd1LI#l7>?~^9mF73ZW7_MLEKsQ66&fy zgU!Wzce6k9g{PjgrhI9Alv&+D@O2_94kXtv1K6G7$F#RKR%?28b6+ntbXC4(DKQd7 z76$wT#}=7$RbcNn`owPMu|p5O947mj)y-!Qk_ocW&GUl;$c3s)z%#OIVj~NBf$VET z(%J249(m&8+$(NVtitY?#(taoN@Ih^k2jOx&aCrfFvOq&QM(jpWlyn4(P&aYiqKUY z<_L4iw?%L_y?N7V+}$!a{HuhVcY(_|O#e<$ir(?H^RClkLmqmwk)rtBfTBrZ2WNay z7b*FB%bSwZgvq}h7UZVwJuTU3NJP;eiRYim)^)WcMKxjoJ?YI@^(u5P>0@z9@mC1d zYV<@@sSLa(eT^-!IfsAsM}{rkk2UFxF<)>)a?0Aaaxu|S67_g)JhM(GSo9$=LCY0! zYMI|sv6qB8_1@4Nf5Ii$z7_P@?ijyx`Q(x+V`hk=W^VbxH!?iOHFac(wjs&!+d0YY z4?BvA`~dFx#_(02ybAUJt@ATNxx|10;0u_;cj?8Qyq4|{3~+E5NW0A_8bMRLP$vMt z%|}(cGzBxmjRkeLfx8}J@FN0fX~lvzEIISJV`jz<;uNa5-n~H1*C;ERd3jvP4o&B} zoUBzG)ICME+NMCNMGQSopQ}L?%Qa#353=Yzc!&mM4}>A!jv&mhJ(MuG?o}V#KNF7f z$5)%CP-JL$?reh#>8t^ntRn-3KcxdQ6t$Q_E{7>(o;}*nfTBcKsV1`?a8LVyOtL@MU11SMBM+&q$Z)qv2;)XMXl!~JGTGVh z`C5^Ivye~gz1pelM;4d#`Em;J(=y!k-8>TlBl?PZ>GyE$bft`LI)pVs+=(%}} zvy>A>=GEOw@ly;cXZ&cRnFja|W$#-h+f&Dp?;8lUYxSAjJc+wTk zYia=g4-^bX|6m8XreyJ}L4_LOpNk`1)XZLI3oZFMoeLRDhC;o+(M$AH+Wnk~Y-AX` z@q3A|-Z*G&u`o1Q<(+BriAq!S2EU^iN_OoPyq10q0J{=Ue1Do2GV&s6E_KSZyO|0x z+sy7plY6<|!qAf+D1crkaXlK1Bu=35$n#~$5b*E`!P?$PrI3G7?=?pQE7%7~jE!hC zqgc!iC?(lpFeL_ekmss)O`*I?m;!{Pu((dLVw4q(G9I_tVxumgW9k-)7_at^S~x7?4M@-RJC{Ie9=*6vjq}p#owg>V;`aP1^+nIo zFJ`&{;Ua{D?i^7T0_$I?7(9(Vxf1SYol=%#qCw7+;?&dK~HNRpNzi${`#xH~Hb|pP8%z>zw-6=gFp_8`hQ$iaJUn zzC0qMWq&X=qq#0af4?Lk&LBzjKkU7ZJRqc=JzR-?al-R*z3?k_k)dIcBpD&u4o<|(V2+kkC`Qr4>x1OvL1g2HN|0&oIhgZgB2ZzeNR;Vr4k+$3it~T zjwC|I=9HBY@2bZl-j?Fe>lAi+6kJ{$O(=*fFB0210d~+S;N(|OdQaVE4w(Gr zp%~`=qvmSyWPH}Irff{6v{|~we{Gw5^rh3&t|@ZuxP;>VXbY>*Ta*p^x9PXS{p1DR z6?>||;FsKtv1NV00Z5Q0(~oQjAl+*#FJLH;H2poYQNwD>eh4ge2m-=8yStHn(0O(d zp#P+O?MV;=49G0*nHG*N2BU^K;o2G%*@&n{g8Dc1|p z_Cg4eNnppyS1QQjNK60(9I;~psrIMfk++C6z329R^Jf7;h|s#^eTI0^J3(`|1$Gyb zCH6$kK`InA1kX?o45}vmLuWde!KYZvFB8`aqm*=bI{!LeN^`vOuhGi1f*+ZN~p_o)!f++*s`G&yloz7 zS~?xb_HxDr^>w}ae(#cSm<28|hsxFxeTqN&yFrwUf z%!STNzEkD%-{h{24)iGEF5+96n4IlsoIo}Hb|gPP;`3x6T&DF6Y1nt%d>kB=lN?(n z{gHI*_Ea1H`11U=4sDcr_x;eQv8W(1mUL;_dA1q~o<^LO$Dn7Qydtt$I@>j9pU_mPFj^f%tOtItQeo%1w_}YpzM$%p0zl9B*3#>1wQ`$gIO(y)%*?KzMX!+l@Sg#ne?3j%0P6Qvj#dQ~C zbKFDKjMN4Z9x$SCCIhs>-QJ>#S57*gpTuq1OGA- zh{uKh#Rz%g>n=`gsTHALsAflWO?hVB?xJ5eu!=9rG&V6k04Xt!YsNiP zo4Nf6LjOjA+-F_@KQq`H&tY;uG~ry5JCk@DRWk=BH}h&)0r)K9;Z2tvPzitLh>@me zZccqdB;qH-Xj2oxef|ui!(G4Uh&Vre$?vx#DXZMXDSmNtOHn-Cte0U@Y{<;273sZt z+oM_utjFIxRc;PnJfetH&+VJI`(Wta8bSiVQ`-cvskHv47(i2@$|M?9a#v1(5*|#x z;5VC`$#F%cI2BqaMsXm)0~;&M&@m}O85Ft;j}%{e<=ZE8qp5H~3CoVrd^)37f*$ny!gSW~FX<;N%OFVazzO)`^jbm);kneB>8alKq;$Q#Z=uuN$wB`d5 zogoafyqOc)SqH!j@PTSeF}+kqV*Z6j8*1tZ?&2s~(GO5t4{e#dUq1&Hx*qSEkJgah zCf7@@q_?rW^e3&BrdlP|dg@8bBh^p+nDz#XW?-CI*d=7D)$38*r ztm5_HbDbiKvDmu?W`eK=d}2H)Bqhq%q*-_W7vTp6Hk%Hnk~BFev%y?h#fq+E-P5(=Nk;^ zVezz#_iZp)!n5;q@<_}x$1!vY&4UG8QMp?c!t@HQ&_Z$wChPEly{PZ2`OP>nEeS5{ zY%F_xhQJa$<&KSQ}bIKQnAd^B2WswO9;gp(74L2^ay|t4A`ZHXPN{ z!WBKBw!d2_w@qKq`nR39eM9aK2QS}3P5%?d&?JfiH6LOx42?2E{~#NGwlqIIr6!P4C-67ZS*MQve{6@a74`is0~Nh8hp4rjL=&R<3r{v$bwpia?rc2CXP9!#Sx>_22p(zg74h(m)BYN_wLm;RO3$nvA6KdAikv$0k9o4|3? zYRkY^SXi9KKK71Z7wz94UM~=g##o>>o~t$+bvOJ7e~BZBKW6urIdU}>2QHww_lS@A zStU(^ARmh3$lb)|mArkgC^VS_N!z+Z%S6iIRpR{rHo z{o@(?6sQuP_xOldAfuW^Y3Q)l$#Nz?b4AetegN+mCjKtAgp@Czs5O;6jtxHK@PC^ z!b^8;BZ1eyjek!F(l3srF4`X5iMAxw#~>yQGaANP8jQ@w&iZLCp8#UP za)i#)8W#Q#;yv&-lzz%>GOyGJ_<*FD6;*>X*eKQy4)?7-nMf}pEQ-FEDVl|>2xkuE z4Ls^oEEqeIxL2&VkN^OiDl_=a#JHXz*~gulb5ME`ydihv`G;7YQ0LrcTXy@_3Es%- zu<#IrZ@Bf_BW6buT|0*@8TUFL%)B!$a zyhLuHmnu68;Px0t&8o3ve`BQ~qD1Yz3GkHJro*rh7JXeX@_+T0C&qKh0N&WJ-KJB+cWwD($win=f6f4J-^?_ zV1}F4AK8KF`4|@kvMYlMN~M`chkGBtiv>>y)0$;&0_WXqVI*nt0j*5IUOCS4yxBvW+Bed%nh+-uB1bo_y)D|uVXRMUPkPa)v0G%Sz zjPihv6dMM$Um<~qNL~>E%;C-A)`k;s2WXbWNwZC#B#sYr8vt^_Z}HhX0TeqMFiG3} z@hYSTHw1D0S9#E7{C>$n3%=doKmYnXy$?`4%HlcTPrtBL-aoPbZJmQd$B}Fzm^<`vY;q(t8qub|RPeqIgQ#%vx-iek55~ z$60o)%jwVFHcC$P{QVpeyn)tW;Bx(%QPjw)c2m&sd)NmNJ|+^KzVM83rn`QdH-qFI z&qgyw{}BlpJ?B!IH}Jo5YYBG)u}3J}xSxrjK^2Rc;jChM>aY({axUATzoOC!*RFrr z%btDv?YwAWLWBl{S1;xAXEe&u=L{vbEkq6kxx(5SCrH8CZ8Y|1;XYV!bOzY$ zn5NLdjV6+%z7AkXN9P~WnK3@5k$o_Bo;c4&>VTP7DB2R+U&acdHPA!}D(llwsv1F5 zuQc)`j?z6SP00zl*#mz8&R>yR4Sd33<*4iw;RKbRwuIR=px~)@2q;Ma!|jn=+2Z#f z^lB(}cF{8dmlkue4^B#>@#5lB@jjJv-&3zjCWRfG6oWYv=OciX&-f*M__NC ztLi{p?robwNot=9W6&6qs|EO?-&2)U=MyC!s2D&9+P6uCyUh){ZG`11@iwKafC(_=eToH%3&>IY$$u7z8O7$}h*ZYC>P*rx) z1(^FIU)_AA;qe(?!W*t!?SB_uZf^q5rgtzE)bS&8I6$*A6t4}xF5WEBgYl|Zys}vm zuBdl9eN{-Z@!IkAwKz&m>uNF?Ow(V$9CYG}0B&Y5e- zpQS1_D_+nfXbI5Q;$|&g_LX{|#8>W+SLG%>b^ty5L%8^{w?dkbQIK?vRjz}6tSY?e z+nq30yl%U=-cIkGCnj%Ct_8h$KvQf-Q!)F46q9P0%tIT&8vSodQ;&**_g9SJp(lpd zpYgwpY+c?>d9m}3hLcfjEY-k*BySaNhTl{}W%B9P?Hi-UQervI6U-d4nXG^9x0fj` z7VC|r%(ymFv`h%p<#fIRQR$9pFCaYhr7)gy&U%q4KW$iaQ-H|7t1acG=|DF#EPSLs zTFoi_O#C+ithD*-pRWjEg*sn5WQQ}S$sIPrc`XRRGro9?eAJ+7U2FgoFa+$i7lFUA z>Wl=fgoBI&w18E*WG`z)I2R(BagXD&!KjWzYt%>?+Qs6Nb(?Z^59pJ~8a{G%G3WtH zt7b<*7g;R)_(DW?kUCO&H{vhsWv6u9v7Gc1L5DSmoUDZTA!Xkzbk(8}|GG`IA}*!dAh(i9GC{+TvOqjrfM$9j~>KKs6K z2_q&5gL|3H3~#YS4(vfJ0eY#O_4S-l6*U^}i+{|2R=Skz;S)Vx#8VCIku9wj4keG) ziFkId-=@Mw*7~mJ4EvSbc+ZA~`t#xJ9M)&%`JeB?_xzS0Y!g|_(#5+=&3V=RYBB}S z#o`UHEosOi1anpO(doh(#%%BKUl6;T67ruvrJ#w_TN8dAm@g(%Wz@a8#WWlS`td0; zl*m~Qzxb406)FY#?J|=sh5ap9zAhG;V_|Jw&UZ@oRi09Wt*axcXkg+7N1o9kh#zBW zvsR~Cje6~d61!;>W-sHG^7-w!l{ACQ<4l>#CQzu+Cu0c+=qet0y~4hUlN9^wT?1WI zD4w9;svI*>wm1;(mx8CzLML=I zbhyt~5R=%eO%LQ~U>XDpx|&!InNqm*>;ckQ1pC3qERwxiX@g_fz z_bk*5;aY(KWI9Cqri-eU9AV|^_JaV?w%@lVqkINON2HMUviToR~`h+ijfph?hYUWNuRVx|kX@D!=1a>i zI5DCd?WL@xsh;`G-5jIoeAKL8lVM`c3!cBOX_{7OWR)n&qdK59p7c!!s%h-lLNU@A zi@Pc==6zrGMHee8sT@#-Yi8V-oA>tnN+b7om2s!x<5>oi`4iP7TBuslWdPD3^C91g z*A#r?$=1wd|2^qk&JG`*N~m7sw~{yY5`iHfnckUAWb1Q`XBm?X#@n;dY>N{vDb7^30t12=}wkfCdEqq?`vUJB0Hr zK)~#i>%PtZ;H%r+$2=&E>*mk(q*B}D!u=c+v_5|B zBDAU1)tMFgvkk`TwuLTI4}dzpKvpCShNG+)6<=<`wiFx#-mS9wnu_2H%#8^Bc>j9d zzDUTy6(VA%`Dd!7ia`w{+&jy$7NsY$#N`W_H$g^Yy5URTBPu}fI9jvu}+c-mCP_AHT>Xoq~wJ(a^p0nAaKw(+FWwGvl)%B8vHSciXhgoe*5jwLm zYf|d!vE?G_RiXBPtsk>uJx8RdWX0`rU-e24UIb!jDg24=MHM1lQp5N~*A)#a>XK5RNg{W}EMB#MqJJH$5KZDXQ9y&iR8 z(M1=?p1|xwJ6`x@;kR&9#OxJvy`Q~%GK>krkt9O!^{Ybf>HdR`I0>RO=m9|@q3Lu8 zJP;Cv6%VS6KYEW`PUs0T8?olXI*ho#1$M_M5?{z9I@c<61Jjm`gV7)ixT<|iP9&$x zUvPu;vETtJKR?o~H$I_dmHwr>HSa0!XDYcxpurA2NJvQZ}RlX z3mNpLqEcWlu`-r$0^buXeN-N8RV@q>$-e2m;67f!_uR!1ZsxfA`~Apq)@?&Cmx+t8 z$f5dUP2?-}mElSO{k*dGI@;r3IfS3fB3-_}$%mUv)BDq# zJp`wpyQR-D1vPOP@lWa`X7X<~Kda!`m^AQzPL>rJ@q-l?Dwi`oq4c>2^Kug7v1zn7 zc;QI;)dp#zRGd?PLPq+xg6jwo$htiOq=msH zZDBpcl9Ou3)Oir7?;a#MTzS%&eFY_b1EIB^^?)<%vcoZ9mfPJx00f{-wS$Ae zfTrXBv$;_bkVhRO%OGPR8zV7HlBdEi_k&U_$FZU5F`xtnb?xMBaL=0@YFDC9_yVV{?lL5T%R{{(l(G>fj*tNUDN8UGU6z!eV>7-;trStK-kG|3>BgA= z?|UpU{%L#-F6J)wL5E}(xW)&urOGkClfd_43FY~wE7FG4=T{1iS(BR9sIOO^T?y1g zQkHAXmPiVFA&!{2P?C#%Le0F$?4SKomUmOFS0Euh9R-`Zxfz;M;3oyv(_}opWd2l5h|^!Z;v!OmZH_)A-Wh28nATjX zUY2{gxvL=VXZkzXKMhBO==rYe2LIGamI^7scJ+$eljOsb`%h1t+lT(|HeSu@gNN_K zSj(&HCDqOP@Iqmg-#Ayy)4Lx)H`BF9oyVZKYJ~SnZ_al^cMc6g`D##@q#gUaBCwX^;dXLjm3bG*R1D82RMl_%xa+|2RsEJ-f(Nw(Hj6@!IGwn{m)DyL|UQS$X1y)LypjaX-b4lyD11URV2d)PD;Ib{!tg3ttrMMbp%| ztJ4#?sE3r1T&8CPV{dnjs?&Qa1b9AGgulk-D|RW_>`o9|{iM=8u}4922?c)^^1$ne z-qHGcba%uL*$$}W_88Qd$nOJ^2rN<3pb*w{(jn%;y^*y60O&=B9SP@hAgCYsP-9b{ z=`!R)V!LUIVa8El*$)glU8#%#RY9>jj)eL^wmWu?fVG=7GF`jlG4-`vAnNw?Gj^|E@|jmM_>QV+yu@2&)l;`&Y&>PSWYf$5?VF z(rKSn@1f7qc%$Ae`)qfM8#<~!3IlVJUZY~}VmTKe=%HT>Et@G!b9r%O+o4Pfd(;m* zo=eB=E+B`Kv)4$A!pHyCE=jokPpjxY%FEkmQC3|y`fz>gvb{eh-0r;L#9Ti)5aL)= z`K;W-w1CI%m}dE#?Au#QJT?0lCb{8yE8M+Ua|u8q6MrVPU@24&zq8*5{w`#*YSDFT z=_42B($|LR`e%QqnHMtHha9uTBS>mlH|#1xS5&?5%$i=Nc4mq0@ALKCmR9D&A+eZr z1w;{d2@=w51N{7x{jY=W-lbxxy~`8b%HA|IiRX$mwv5W>$R;e~$v=qf8mZU*B#ilb zmh6pqJGXsnP2&0(OOy!6fuS6SgxSq^ZAA@|kvfF<&S!=aj(&Q?jkd!0{_#( zNQ=x_eb)8bA7oBM!`WH7{AKmp4vD2b`;5OciS)!#;vmp%kOz~xFBs?jKruK6#Kngl z8LMc%2a_ScIQQ1k2_l4>8{Yn;= zyo0#f&xr4WTbMS??47;lMZ`8A21xUEe3rN9XH0hpQ*76zI)^G+yhNKkv~%eF=-2(T~PX^nFr(NXeTz1v= zS%VM-019R2oo-Dw>Axu_MX>A!oiw{QMRmmMZcpcnv?r1o9NSRR(oTRxH#uE>A6mEgI*U*L=YUBsgx z+FVDSif<6}3fn!RHn_q%STI=x+XBMysR}fGQFIBkrj8i2qV=E%RXc^)CxlhaWen>? z^$3}8IK)ez?|oEAm3nZBK`)D_IfpJ_DXs>{w=b!gjr=C~b6uz6E{-Mq%+{ z8LxP#J3pR;v+NhwP#fa1o6_)wtz2pP^|zZ0wJ;4BK9l3*wJ`Up#PVj3uHLU&R2Zox zw0>JRF@up^$}N08P#ULQ_&7Y!TLqOfa1%Dz8 zyToTQ7ywJcl#yPhE*!)joDfmT!BL6NBz$?XS8$nV8AT-c74*RyAFhq}94$Cmw-py* zg_IG0_JKO4-?<4&q96|0k!-1yXVJnvKx5~Ll1D^+Jjld5ErDCjlUPTa*KiRe*w3TLX0gUweEPj5>c$Q zAS}p$Q>dBb^2`#f$j=*n$P0HegQB1)Dq4krL(Az_zH|C5D(EHJ-3Re*@Z(Yl!WnPa z&fy1!Xu?bLSHT=Prh@H$_iOZ*BH&IqGCw!}1o(dt5b*z24Thv-*viUNGZ;bp00)2- z=g=}BCI>JZl9?L9N7!5;E#bMNbb}FCF@mYaf|^Y{QX$7IS!916N95q0s#B@l@4$=X zsff>P8TZ4Qdpu!sR?Sraqm~A6F&uf3m7ZK9v4tsJoe@%nJ)`No>vtMGQ z;yBQex>VRjZxM;tO{`c%GZT5wurvj|J#Gl~Yj;VFx@M^*%5$*N3O?vzlJDe^jDNtQ zxO)3l-qp}(V2->(?q)1|#wu`nn$m-NH+$(?`}yNXn^h7knY$S1q7D{G3)RkrrFr^+H(LjytLINyf zKwIXj(yamT);@3);yJ7tS7n|AHWr91ef8X=f4&h6;@B7I2JNCKId3BwGx5`2l{pKS z06itR9WKJi8_=#EhJtX0QzE`RgHr+o-lQSTcSP_=1*Dyo7kqB7a8vuQF-hW{4ml@C z5O9h6w1<$Mmf&Vj#G<^W5^U72WRbTlU*#`qi&147sq}g0kaT$=Z{f6Y+JhdZ+m@{>2jAPyWs@;uNep zm8sCUj~Djg@0FsQsVnD;EdF2ScWUx39u{y5_U4_BhK24%Ec?1Z_ywSrdp)K<@=TQ0D4K zl@~?73jayfB9EiB`&hX_Oe1pZyR?Jf5;vx6HHIGWL05GtD)zv825}ER_JyT)Q|(Q( zZfEOiT>2UH+vVsDNz8XxCjoO<*5c3NMmNtN%JRmtHn-U6!t5KZzuSPM1pQ`Fm1$<7 zSl6G=5F`7sGT3!*;idcydS?&5>8W7d$CpP;?g{o}F z3vI|BQ5`P|*OaJy!f-{+Z7h1>Y-zCZ^+(>h0Biow%ZO?b(=!JU*4Um7P6Ou>pt^de82Mj4jAJL8F&#{fA_hhs@d{yDl*W169dCiJj|yP+X;W>l-5OOSU(`Z{ydKa8PGe6YXkzh_Iv(qGQIDug4jpTh zZF((l_I_F&guE*Cy^cSc;QhV3(X#n| zcyl1$Lpyz_6Gg9lmDUmiitk=43B;2cD1MqQQY6ie6v}XK8hK^Upln-q`I$OqQlVuc zw`Dts?O=+^C5U0hE_BpX)Mk8CRSN8s}2FJ)Jj9(&oZG?I%E#xU+6SX9hymv(Uj1o*J%Un*c zC&(zx5cgD1DJhHE<@#rpSe@re<%opF>s>1uXzR&I&? z9n^A(0Y79I;+L5P9CbKtER7xCZC2uc5RQiEAp>`k5uh7D%;;44w#qebQgBi_?g48S z>)k$sl;S(0%i|zM(bZrz&FSt2Z>k|9vvC4bqki8ovovfvilh(_-FBYtKPk9@1o2>q zEKn&Hz)6*BSGLigMS~tZ_JVJq@wyY)p1!bap?|XV;k!?AuK0+V9aBRvE<&&mSW)4$ z19X+gLG(L2xWN?FSN{bjxP;ozF4ZCsbBJqa7>NlXr2T=k_cgp;)nx$4{0{{q*b7v@ z!i`6OAS8g5Rm+aH+`tC`(}H{Sky)iQ(Y?f8y&{B2grUle1E0my~P0%hjr!JFpsOguEIozEPlPjk-cc=$?i7yG&1g}8AEJC-`A+KR}{TYJotndlZz2T0nlG>?q> zUtl0?{?xXWE&CcOzpeahXHoxIrCai4s(dHOODDaJ5YNtjht&COSEU1R$pPT@V*zi& zvHrDJf?JwT-e6a0tiPDCRP#}LS{{Zb@w<^-&)~)S+#t(iR$!4jRqmfWCHJBT2_w8! zQ+Lh*)j@sF#8|qaj*t3QSTH>}6BCfI=+2xv!!qZYO9aE|*hdEmxD)ROm7zYe7l9%Y ztozeR$!m)@8uhUsDmQ=hxF{pbaZffrpxX0ETVk30Eg+y~_fE9W8Tk2&!jNyvhE_Zw zPW!YZt7|pCb!BJo2CXURD1!@(JRi^*ANY6{-ZCCDOyVH|WJZ7IdhNCfRK}}}^Jmfe zxJMi_rfI_jh$OMa{^IWkiW}^Xp~LP2QD)M&ta?F|S?`>VFj0~|HM#R2FGN_t)V$9E zN&U~DdCqi*YNIRB@DZiAlq@jv&_-A9X#qup)p6nCIk2<|Wo&yf-d331_?9#>myB>?$u%Vf@=;2bNItFne(>#H=(3uQ1d4%1w<@9zBGL;;TGok4!ED$@s{z68tD!~;ng{vz^JAB`82qq^xJ)EZdCgZ*Fb4SOQ1=vMwgNACQIl+rz#0OS75rK=SCf=Wa!>n5R?Pg!?4DaDro z^hk!56PXulP?#v(G={9Li-KCySL4~i>L=w~uQw{h9PUp&H@4Q1M?q$M-7AA>lcZbL zuVG@FB1ws~oRP^dNJT=JRB69h4e|)yU>zArxOR_>{6<}h(Dqvnb*v&urU+Z7y;~L9do@KssC~8Z)awv6XtJ z^M?&9@Y7>)4B28~f6iz;CVJdUmydBN8!0K)PAsWEE{=j`KF0@F7hw81hyG1a>G&T1 zhd!U?&!iHEQd;xSlvme1w?WZR+RgvK8W;adyU{izI4bJ|LV}x*9)bStDlpa8yw+^0 z(pewWKO~e)l&uUjU8Z`lYB?qguG%^WFW6}I z)-5G|dny$d+oLjinIhu9cg5jaS^1LO-{hxy6)rcHRiWVbnkEMA)%=NXL|@6o$uQF> z9Bku@x7eJx(%%OgeD}!?#>y>{`L-FEK0%~B>mBP7;qv;OWS)dgZ&nDb`MCl%x=$f$ zBN=laa>)7W;2}EZXQOu-Xo^H132~S8zDAA5(QmvhH#U&_h`~&H%5>x4 ziz1gdN1{ewC;C~OJ9Jy5|7-tPq#2fjVWoI{RKeDVXyG^KAsP{^g(_o1nH@0fA59Dz zjtgYmrSm>AAFek)W7xxPJ1zF=u)H(HhsVs*ZQ_x|tsueiPcHx{kqY)2D59k6DBCiP zb<1boI10$H2$}d|n*gi_5NQ(mM28V1g(EZ|O%C*vCUej+US*_czIE4Q+sb?5P zEeymDGkmqa>&Ff6WS~omRKX`eDlI419ReN|cG>J=7V4;8B|q**7;;|BZ%as5JlSt(!!| zeb1yP2bsO}Cli`FWHe!h#z~{)yY^2HYh?Mfg!Xi}$&Nn${RfXgWNK8N%V4bC=4Se+gil zS#MmS-vpUl0GZ`p+IC)a#nc%$@IM<3Cm3rdR;nYSz}oR*iHGZLs4(X&z=K9FzJc7w z^)!#E?TvK2Iw4$wsv`Ua>RA*hF|$iTeX^axzxv!OB}E4btvibBT^;4Lp2Sx+y63a{yq~d2m(H!Y7%qA=+w>Fkc0|;6&h6oHzz^3P`b`xN+&vc*$Rm@tLWpdAMJ|r=)g&N~og{fUthf0nUmA z5%VpM<>uTB`DcxZF1k{;+mLtTy5oTEpq92sRDO3r`8oNTwm~(2}u@D?D-V=tUZ#THCGd z3s3dJa6(v0m{N6wI_6A4n9Ib3-u$JJ`Pb?43`&I)p$A)h!7@Aaf(sp=Cj{$SFG3!@ zdf2xhM~3LAS^KHQ1mVkOhfiv1@%)xZ8HtQDcLPW894pgt=9=qn^Mu<2;o4Y z|5#ob@FR3ZI)QgLtc@ojo_^0`H=qI4F<><=m(9NA_pH+;sQL)7!2RIG-_tWbbVJaP zmXW9xE0Age3E;IhhPRB4q%sO&@Rmiime~h&kENv2Ic%Afof!@QqW?L^BDxEld$Ixv ze;I`SANR90l$vSIw-=HchjkA|&$tOz!va$5tuOB@6f+HSg*ao-kV$6c;aXH{x6T4$ zALVViWa9+-L+bb%x(PJ1XNw$mG_&iFm5-2=q^BlCbN+Arw;DI0M5`gOmaEf~HOrVu zy8EM0ud9Bi|J`Y{$A=#=fbCrF@*sW+NISRe3Uaolk&h}D< zC}cf!&+?P{L0s5~S3^KZUo>NS-2&m_GGn-M{BeL*7QD{CmK8gngnM{NkW+=Pw887s z^7@5Z;K&R;dWZJI>!UtZA9!~>}J9n+oIHmwKH@WlO&&jf49))W&Qm>bTnJ-6{jJNB499vTj+< z-#kDEKRXd$G>X^6TW?h>LBD}R{vCnfl}Mt;?YG<$Kc#?X?rFOmI5sMo%2G1+aZv1b zM-054Qz8F()ai73cJF;8_Sdt5H(bC+Hg?Eo-_!OOog!k)v6Hen5i^5Q~dG6&}A%akJ93dj8ZqiP@PH?c{}RtOHwnc^F<{r*M$ zm%LX09NvLt1AuLfiv8(BcLbeC3R3K(Skh)`^T>A2Rb{ntPEf@&j}rk>%RY^FI<|9s zd#ik~t3SoycVK=s3clSqcm&<0m=snbhC$QS?<0q82VS*k8ia9s&)+{)NmrVZSj9}^ zVVP=_v-!F}Fkrr#KV}oT+7#k zuR)J%;|qe(C)QSFvbh|f2(%&;iT%)+Azk7riu*h))Y(4i7`qqqJJmvLCu8U;A2Pw= zi-C%`@-ccqe9Fjm#@tSnyNZyH-sa9c?i|pLSf_Dt{sDfq@x)*sM25_hY&IcI3Z=W0 zLTE>>nuLI-DcK%`5O%*NMTQ*c*CB;MMK&m||0W;u`732deuRpP5Guz{)^%{aTRVrI zR&JO)LlJ@b2gK$JNsG~u<3q-MKw;UmB+B}oMnfrU*ac~Z{sioy+K5}^4iWs!Ap_y7 zXL{y=kh^oIn?+aGUC-&BqlfyPO}4(CQ|h}(Gt1Txp#7R=#cZ9UZu>W@BI(3(m1j)O zXh%#8Q90{6EHZo8(k8h(?1V%r7~j?ZProX2CT#X!m!8=E%R=z^iWA~Z&RtGLVKZ%9 zGi~DFN5;3zJeAqw1b$N)#i+jHQ z#`-S%?xo2A(X$z~wV9|W#_+_;g#_&%DyHN4AkO=4>J(|JfL%#xs}rlkV4J&hoP}I0 zp}g{{hgQ3@KUppT0~J0z152?^6g*$75Z`HkhK8|9JAUXV+kAVYNP?xU!evQw_R5p^ z&(#NM`V^Y*=4Mqq(9*W=%e=%VUYtcm3m0V5L0YdXY$aZ-QWH=1TQsIY8MppE_-p(6 zU=kFBjNUhWuQZfzCUv3c#-uRA=eG>pidYAs1zA7mIRCDTXuMeR%5kp4q=GP&SyEzgkPLAXaI2~7B31fUBvjMlr7?66McJHw!dL;$Nw$w5hjJjVk>aG zwTY|hihx|*M_pY4JCsE=ZK%~yUH=2m13wuC|G;f?hQf#9rQ!9nuLTBP?6lvS%?=8- z={W1g?19@Sv&v2Yo>AOyX)7uiM=t`c6z)7zaG_D= zy?t6LVtQpGI%W}t3m*}^77bTT3MKfohLDP~|11IG(x^UKP*)_+FKUm5YwiWL5o=Q{f$NPVLC1IF$@J`YGPv<& zO`puZke}0bhUl)HjoQXFk_X&1Ng?pwb?%-#j&W3|vhtes$Zu4rHXq^o;1>jk9tPa* zgZTuSCk#w{GCB~gCPqYEh8@5n*J6WjAZ1FZnnNg^H%)9sMY?7BdIF=HFF|d~fU_3IU^whKn$HkWOODy7b!+mQ1 z9FGTu>-NX!y#wF@YLdO{byi6~34x!1iNkIL!>M+TK!5w`y z4DCjnq*Q2hF{ z{%_>SK_fy2!VpOJ1xc`2UeuH-{D9##XmWOb&Z!>!JveO*#;&;7)P`p{LBj< zS?$dQX9cOcc_mCTdG)%DZ)KIUt5NPjIpV(7zGsl3wKS?mjw8=Mf>M9Lg+b56{@JaO ze&c?WJU?dz-#hK2;**R|`=elgGHQW{L_L_C&nos4_J-=r5g!nZWTFWBQy>f{taBb8RNAdda-acEZZzUfxDzI z_}$Kf6P~D%7!W8&^$e*I>~7XIX!y1Ni+|K8BHhHP#m@|`m^N|_h209kVhQ8Wg(Q@o z3U!_R=?9hgPXUw1kU4myw<&nsT}n+*vOBM$xEgJT6s z$Bq5y28OM&@8j)A&jjou1;R1 zzDvADg1m18hwi*rKc{z3_)X89Tbl`xGv@!@eMoi6Lqbpbzv}>cn}oTtHkP_@cE9cBBou z#d|D=+$!I%aJQ?Yu8MPhFV{=(d!4iIq)(V;$}#~`T#XD+3-!&<-;}0VVg>*gr^}XP zx@tSqFqPTgh*g=j5b~unj%+@)f$J?dx;CMH`t3{pgQ+d%w+u1y)MxJx=I+y0Kcg8|oSWc4z6LBjEKc-O*<%GAdgh!bdd7RobrkE7W3)qa`km~j~hgK_AvJkamrgymsM8|dNW4#7oxIX%uTid zVkN7gW$w|@!Dru76Vsj;(gN_FJrWZ>t1{~URG?AZ(ha}D5=PxrO!u4|J>GmIRHyMcaj{88GgshZ^{0dsYy1(Iq0C*PN zs)3ld(`0x@63UNs@fPa=i$D3cD}lYz5BYF*!H*m^nnCWtP`lK!~Df*2gbXmy?%ny9|hP?t@t13OYeO zsEpkDuY2HsdBK`>@Bc=l(m;U!mi1jPxGs4&q4JT#@3?SyI-BFgCi;ui-fxDttW5>$ z_#2KNRr59TDg4Mn7o_o@eOSgf`mN82d6$_iD{6J@7hHTSZhuhi_Mme9;%5>mkDXM zYKa786B(?2vDHAH_k$X#X+x+k8^^50m z{3jW^I#vxZDXbQb2Fmvfdcf2Sqp;XANne;3atC}BRY#EnLA|A1P^4L_$L8-}EZGSh zyN1nMeUxDrzqCuAd>;%h_7WxF`Zbj<(bsMN@El)T(+aZQ7(4Xd%Co&HIep(&TD2)) zWwE5VIV1EmMd&I%p6G}8Y$MXqZ@El5{k>TW-bY%ci#?YQ*p%d99=zs+eO--5mZKN9 z$)a&AiRd1ow%GWQx(*E(GF}~$xi#fzhQeaqxA=p2$mlk8yw^L*NAM->T#Q@)KRofE z(d+&B$Z*JGed7Ue4@JgxAbd>nxdA9x{kGcWq9Wte7`YvF)%>6OMhw*EiUQV+)KOpI$lZ9Z9@{=_dx7U$WA5$z{(T5%o3GYD z&ZE|~o&YC~aFwd~*wtgUo1}L42qL_niy1L`TP1 zb(SJL>U(VYkd6i?2fL~lQxDM@L~tVK>z#oU-zSlM>O5I$Cg-t?RxaQ zjn5w~=eg%Pr5TgVqxAail{R*UpQa-%h=0yEfz~G@>9=yiZgL<0^`7DmJPM}V>bNZLKQ zn7z$SeUF4ZI$8*n&DC{^-KTYYGIn1u7T|PRJ+F4&8Q)6$OmEl7bigyDW%kYJE_;Lg zh($Jgfs7PR8)5#W;meXix}m+Xxh*awxN}0q(~eA5AhEu_ktl=5FF|HmLgk$0iIYNd zYRgzM=~|+!P{+U|hE0OmDh7dq;R;J|74a>Qxp`J%^sHvU44%G z9X3zH;R*8@(jo9)hVl|o_f9cSauz&x(mEEbEyi*HgIcr%fo1VKD1d6Abxw#dLi@r! zk@)?e5!B?8p#CQigieV84F%#M8@Y>?u|T#Mf;FSaG^nx%e8~MQrw#`QimSsbUoB}b zg*QUq5%;2E1K(yx6n)o5O{n`r7XF(p@CI-5zp86=BrckrXSnY9*_$^fJXjZKKprKY zpyf~P2ju=_>&#-Dg=+2A>tVpyRcZx!Hd) z*rH)h?9V!^k{g&jn{GWDn`dTVy*q)50$V2e|7(yL$o|(LKfezvhQdb&jC#T1tzguY zz#4Svx!o0vV_(~rYSFLCg+VFyt6o_|70Tgko=~?y5|~k9o>1~@A7n`J`@+oLIFn9| zO43N*u+~?TIGME8z=fV!=!c$ho+D|Zt)a)xNmuY*ig4mSGnJ>UthBTS#z9xu&hpk- zim$Z;iK|16V{ga|L(pGG;rFS_ztZV72>_U-p%hOiJEDtyNiTN$2@Yg+R zcl2t1+X4+Yq&R*OoEBno2X$e7Bx@@V`*=&*$9cf?GD$DAlkZ8J82wZG0uZ9ADB+m} zje>>m>)(E1xm4Jz_Y&RzAPrxdoS)%PvMpntYgFfhf|9U+tTo;M!Il^`q2-&FS96qN z&J`M1uF4erK9pDPYT2AQIH$EfWtMhkhiit)`Iurb$8QX%aG>5!In zaM{Fru=g%}FR1wu9{c?1i3u*ot@!zw=l<+CL>Bx2dOZF{oFim;rH#sRA6ND|RL^kY ziNUG+<_yyebyiN|l_!GbiYq zAdX_Ajgc#XoOPhxLN94dqnq)0j_-my9C~cr23ZaRhBM4M;2`ANd(T)97|kg{Mqj>} z3As0avu1L6tCS+g2e~lu&Gz2`0TP6k72OeY%M0Ei+|uqH6f+KO1$QDI&=_f6O3q@IP!-jR7KJz#rm?C%siU72u> zJZ0c%8Sc-Ka=6Q7@bm^XIuSc*L;|QLS@A4$A9yqY$(%_dGyjuA_{Xk2Oy&z%48jMz z%`;_@0swxN!1nv92v7EHzV}`urx7oe)I(uHp_EUQ6(nWKm%l9{@s;}f#Ch^ui3|#6>j+m7b?vT|JF~#a>>cli5@ns7A)a})!$B@H zUxjBHWmB5Op;>ztFOBS1u#KN+TD29}WQqR?w*;v$c-9Tu+kv3h-Lgf>T1h9diI$dK< z*Y4RDKy;jf3*p>8iV6C7pSD~YUXT!Yhp&xu9Y=D}RoC*wpQkQ4} zZ*UCwLa@aPKbs6WZuuBn!%2SM@dLoy$%1Qm5L|EU{5BX!8hY^cj~!3xt0QdrO8cb4 zI<;|Od-pnql3$oab%A;v60M&YvU9@y*MsYIP=pFB+Y+L3D{he0iYFL_lGZO@)mK84 z?U=3aj#KudujT(|?fUuuM{9VGZyx&x{AWhyDU=oR|{eb&~q_Fch7L!VLV&mXbOW6<( zX{XTguxD34vDhJw^NGPk0(gc-sruBkn#OU&@>BP}XbTwH@6b-l6MtD~2-ML~cZlZi zaUTErs$E-tEu2xHJ;TTF$CR2IP1nGkz3*2v?gt#luFefpc8|7s}kvHCpe=4%G3H0&*8T@k1|A@0tbxTMY(Dh?ORa2W^TmWXJ@#;eb3O*$vN^| zBLw=3F7Zf9t)Z5t8}qd*B5KeK3y`Nfn*?+bm{R2Cen?SdK10?f!-4Xq$xf%dHUhW+ zU*cb#GZEw5J6uHpNJvp^$CacvD9#tLB~Q$tej4LGYm!q~>mvXex4HDp8woBr^00i8 zoz7I8Q!U(LTuFHOmvm#{SGcdcPAA%O3pL?qPw~-v=tCiC;}RzaAC+j`JzXseL~p8c zp%`}pOMRmHon)Vkd*8&2JgX32m!yzOXf9!$gwB%dKiSHOpIhaG$+r#Fc87}6zfpq= z{PqRiEHq=8*;)i}{OD6H)?yJ*P%vmI-8(i6s8@%w4YV{Y5>;V$6Qc^`A(i z>S5%-?b2=JjzP7yJ6)J?hjO1+(vWgyZ?)w>1bNy8Q&RkE)@no?TYB;^Mu{Ht>t99h zB;hPJWN5f%(&(5NnN%YOnNF4d2ye-oHK?dHHm0|*^X@}O`+UBxC*WN^YggXxGvB)Q zZ?Cl6{g$~6tTNIHzLL8dB$iZg-QKw`!iF6g1GsL^O8(njQ&RB$l*wDfM&pzxa!uGB z8x6MMHPwk3ut=lGdGFcw$pqqMOLsU|oE98CpjMT8FD3(-fglK6@U(MJA{}_o9$_YFME%FaTrq4*47#DVx>vvUm*;Ov z+TFNU8B7r|x>Ljm7*v+~u^;g%ZQ{eQPxO~Y2Eo4z&vfppY7YV8ez2OKxSk-gvX$o6 zfp=`+NWi`eUr-2i^u~%s%BLF!5ziu7T0!TnE3Q6aLr$}Z|I_%FZGlW4**1A4hHsy} z>kJ)Lo!^=miqfG_04`F_^0@sG6|hGW??fp;C3d@Fd4TocB|d>l>hTGNJD3ko_nyE+ zn8e^`)+P^L-wN2<4zoJ+*37&vM&AsvEyrffD<;!g##FYpdwCGknCdR)s&2qw_{WfJ z8T*mIACUMRx2el+w{}WanjL{>084as>07xk|Jmyt}tNN;iHPgN!@=f z@R^5r_Xt-B{A2|psDyrL)V#Cxk@UzxNCelAHEfBQl8t#7L|Y2tZ@n64-|;83*t@`& zxx*SeBHg|iRKblV{avOSYH0q~?+<0NB_YnT&A_1P@5~BHh$RjaT9E9WG?s;a1bF&O zF@S?058>fQuCidGz_YTp=>&2^VOtPGhIOc4@Un5O=I<`ZFu9%^f?WAHEvyAo?MIoG zcN9+Gzg?Jypw%4@f;>A-#+P#of*c#-)pU|-4gk-CG^2q(OsIdthEw@H96;?Kp656) ze$C|(wvN;Y0Sa=skXTfz?%P;<9+s(oAJba|lSq5YanT@1hJ}P{Y_0 z{BER!vGNzTXzYCt+CKGdxKz>FUTA=F1$4G~<=W2z$Jr;kjfr>ugkV(^y?BC(tU3S8 zXFUDNjNjl)X1)1(c!=2WOKp&N5v_E@g;CqHD7ukXyWKT7)h|8rMcdUR9sADG%6<|i zR4@K25ldAq#~u@e(7f=f<8_!2GGMI&C!}DNN{9P*s5}koe>RDr^T9V`lE_>2K3^j_ zq*g#ApyjBtFW9u;i8I+ZW$3hM!^q%`5)zBAd@T6kIHKRs1h)^c>MmlNnEPac{}R0w zUX1u6cy980{7>wJjvm$k>o>+f#oAjSA~wF#9zxA*I%K=CekbUe;y?Uzzo$r<=*$0* zBn9BNrW`&-f-Ljv&>g*&mI=3i*zO6xqgAO;6I~tnd<_P1q-`%`kl;ZLMLdER!>ykq zOZp+zFIv(ML&%;kee?d$_GfaCkUBCx%NP)h0*kOG!8BeyBy0j5x<(lLD&v%9}OxWa$B+3$)$xQ|e zO>x9U+pNGMUHd=PTE6ybq;1eP8>{$+rb}kdZRGg0RD{?;iLGQbWA&#^2jJUp#s~kD zgr?w>YK^y)Q)X_aCGb84w2= zD0HG>nvgZr>(=2=0@tkqyjEf+qc-TqhJ2uIjdAPV^b=9~3wiFv!5K*gk~9iq&2~j; zct+C}ZU4<4ab)DQV^E#KUanIAb^kd(U`sIyFB`S!-DTtS{dQsLu(X83Yx-VV_hYqL zLdQqzq@wZ|O3m%*tTZHKPH>vGf%j|$EplHKR=JqtdrbDYZGy1Af;=|gPCB&#CR3NX z6*>|D_EaLKp``t?Iy_cly-@DL0iOps$ynb_#`aq$aAL(;frre$J4RWauFyPojI9pkJ%WW9a!7;ay0!&mtpKe> zZIgMCPgImXFOh!h>Mq1bM*QxQ=k(kwCURk$fK_q5#M-}xwinx0ZWM5kgOBIlk8Joz zR?mayDwx%8qbF9@$i7vf*rxtBnR#C1?o*tUx@t&@TYg>PjL<&WkXz3@c^b$0_-4r$ z=RyBiQHs>}OXnmF4UND`8qTDK0>GcOmuhTVDIvnZ^L_p*gtS5JUVf4M9z*E|Ycc+B zWsX#*qZ-m9_c1fnqwP7qCm*(<+Esz^;tYDm%*L0<#G3~*JssIV@bC2r%rjKUC11jMfjjlB%i+?~DpSalUuZN-qc=nSo*MLj!#Cec z-R!Vd1^pp-fz43EST7 zZ~Vfb@#%4g`@223u0$U3d+~3$m){X!b_E%6+$4>=wz^WRmg6yh5Bm2kZn{sl``?Wl z_kea?2rVBY@y##AgruEtGoFD20XB^_s_)g(3GYOwWC$fyJ10M8_W2Z4a4}q%nRZHX z8d`2hsdoMuSJEK;XGtKS_d$gmkJc^jbHuZx4eR|PuOPCekQAosuB?e(K4_jGH)A1l zsmjqr%ND!3Y9t7M?r&DrBDxM~=|UM%pDc6V@ragOZTLl~-%WU#PHUy({CW-=;6>OO z`SY(VYu|j+psNnVq8j_mcKSj7e4EpOb7sT7K&*|hq@4~2txfrj*3KEK8rS=>c0rO+ zl{&v1A3pwJgE>bBUb#KB4uYa~c;26LP3Q-Md5W=tZ2zx=zi^hOWs1qSKq7}5COSlzbo9jqH`Nh=RCmGG!!IPHYU-TUm6vDzG|_)2*$@v4ZlpO>paDSE@7y~ zZJX+z;PbG0LQ@~aT|dr|0~fLIZJI&AdXY3utu=uwWIqH3vK8eE(;<0(f+R}m)h8kD z*s7n71@>4$&0J;G9=1$ACgMb0SLJj8TeW&vhFkQl@`Q;dFC^*J!-kIglvErf@ToZN zh7%H9^KGJi)gNxsFFj52t?5A;DUc;c%|%MT(_}iy>;2a)-wq-bam;(seUx99GkxnT z?q|hX`O2R?!NY8>n%PPI9r0{);&V1}=u_D<(oZ+p6%xXV=Psx8l_7ZSjChmecyP(( z1qTN?ll={o$T-%$MzwIsS)qq}OS3?v4nfU#MP|Y$4&e=jv+{cPcCUrJ8n(z``+P<@?(L5^t z7;$C=#g??3&WtI@r$37hr5YAsAKKx@CQ9r=d_j^ywO$eDtASnb8u0#64C z37+p>Q)93E#XB-(Q0@#@EDer2xia zwsKti0>MKK3PuQ4T?J0$sv@jD-_Fep50@pK5cY{MV|ef3tJn@NS~KUwiTVs(q5Ou^ z*VVs0@fbgrfDhf^mGH*dzE@`EF#K4*^cX7(-^_cbc9S(2Wa9ryH_d8q9bMewe@prw z6+0;7W&DG&`a^N9Y53?~!gN992t>5Ihk})jp9A)%9Gk<}-wK`WZS>V&>~ThVQ}Wh> zWGpXxvjcSM_c#*&f+F5yOd7=Kh0W19I5N>EvogG#Y?!j~wsXHLNF5CR@M_@k*7Zlm z(ND{8sqb}`l>BC3S*fZoC6eumyzgg+v?NDapjBmgZzG?6`SCf?np-6!`H;u>Pb7r` ze8eHx*W1aY?(s>+T-wLR4n=xK9$Kt`vLJ@2@qKdF_igL{IJkxOQucpg&pw@ZFlQ1j ziZ#X4MJIkW1S8&(b04Lb>RngPq_jB=TtLGood~^Weu*X1$hI6MoWaZaiRabCI|(7B z@bl~bPb5#!Fwf{s@fXt_KIgKO=J0vaODx~ze_!!f=cLkPU~PY4#u$sIR7R~Ccr0H- zpoz_Haq6r54R?{!Y^{kT)>SLJ>$D)bD-XW+OhjA1E5nBjsX|B_;PHtcnWp*DF(o`r z2ktou-yFw1hYZ7S13bN-QUv~--(c8zYn2iToh)ZhCZ9=I^U>eVnYSDJ*#8J-#k#uNib)6s%w+S&sYus1FB`wmWt2gz< z27{;+6>@ylLwyb5=VUr!I89@GtKYJdto;Nr9=Bc58sXTk1O70spdr0qHSF}&e|i3% z{(4%_cE;A7O7PYW>Ka)`LZmxO$b_v`A&BwC*u}&~Qij~iS(221!t29Ibe^D?QJN$3 z$HpujNKw7(6r)w=Yvq}gA0w`W+SHDx(f-B0Jo~A`;5Riy^!}_p z8ki);6Ha^LbG&*<1+e|tmZ7rYlFQMGqL_n^j?XUq4|`&#VjmZ8C*?q}(rNVgZnM{l zBRFEIDvjyHrwo4%{LUVYUHyRDmBQhx12FR4ebTLzgdnmWSP~|&w=E&?!3JuB81h^a zZI!L8BeO%}-U8Vy#B_-HB97f%k*<7o5Y7N;{drHI0OF?HzkZd#-mKpsd1F(_+M|6e z>|j|Febjqzn$hdSvHs2pmGpe#@O8hW+2zOAT<`L{<0qAxPBiBB-K6L$-$aGo4)o6M z#hV;MmmmJ-+`nbW1$IElf$3#)`z0r`>Vus>PwGrEq)Bv^Wl9KN%df%C?&&*TmEG*v z-T&}=@ZUH?-e2AQ6lB@bwPBB!I86ZFIF|91`{&V?Gq?8SpP@y`FehH9tTjLK zEcFw{zu$kX|BCjG4cLx%hLvyUg40?LzDD1rX4trlR5_|n_lVg6@*n%8g5U5T-VJ9D zr8J8i8zxnCeB?dQCG z|5P3Pu5sOo?3_;^#?YIJu1W#ANslEvJ0>&J=fT}ZNN@8;KTIl1TX`}(9O&5yU4nS! z5IZGTF&2TD&GHk+tP6HH8ccb2tY5kCj3hh!9UwaSQ5h^D-LW~1l|lHTy%{J?IT zSZ0!@0U@Rxz4pOXj>0kBCw4T63AD4=s@U=3Y~e{bh5TBRjz;{lGy{ftQ8k|`Yi0P> zuoB|A3CV(GY?qWhHjlW?zQv5Ny#VILmlC$1&77Wa?9H4DG!}aoXfj=??71^0>*D>w zjDt5P(x?DsF_&EB;z*=`nWUqrNNlBv{IOs$as=w;0>w~4y*dYjpLrpgQ&|)C#Tr|tLXdhq?ggt{+r4~ht?f(^0m^fdOd`M zuf~t>4!flA#d7hB<`5)&f0Om@$U-OIiTb!2Eub&@CFcPxH4C)6i8u9?UU8pS0Mk%F zh`-+Pwo(r=>&u(3YW#xS(QsF+z*-{w-5{eD8BDxwjI_jcm8z1 zTu~&Jn?2vvF@pZ#Yqqs_ihfBzZ=Fpqzc2d!oB1kSM9W)6rkB}}el9*U>*cF3{f!Om zMog#b(_B3f17DyCMKIE*(aB(-8J=ks@=po}?c zhdc?^W`V?8? z)ZtndryT|O85kq`Q!a*$0kWajIFjcV0|(Ec=awzD`yCIz^909Ng$SsVPlwlUwTyrB zGGWXgiT!C#=>!?Y@cC&9627QbKbTPtwrjq*m%2@tsN!way_G9jIux64D|-%0n|`x3 z$lg?}IKrL!U21f{W7$J7w|-R@u5nQTD!C?J<)_MR{WUu`C|<5)8>K-r=#Z^IW)eGc zm-sV?jnW2L^}aFgMwtFX$x)|7`~4ALJ!Ob?(p^W7$^H9m2gMLzBdZC@FWTCG3e97Y zVL<7n&*!%9k=7Cs$1IGN9K)F-t6oeAYuaDh3y9|a-sh;F&u@A3UEdsstoW!)cXSu4 z9fo@kreBkLj2-%;x$p&VNGu%w3y(|wZ^~hKR?g-I zu9b&dO>cipydoaJFqPVc-eytys<d&CebsO zhljuUAVaYKiptz(uHrMuuzv8x>rR|Qys5Ww=jTMp)w*i?ba$wQ%sni)rnov>W0>m) z&Zp0a(pVAH)#Fe`5BLxNmI=8B$`Nhk$%M%FBmcR@9)bQ{k_n-GJgXN1*3~U=N9>95 zAz}9@-ft#-I9LiDiE7xb5Pk^q!(iQwoZqBu;w9%Ab}-1%R!$3CICFFZy0g{=et!n{ zZ2n=WBWN7}u7GL80FPdo`T2Wx3FpoClfTkL3&W&mTy1*=QG4|(87hs85t6CZ1zU;f zq6eCwTKdTIbKjTGUV9WK5*wEp&SIL43_f{_j5G(j&2x5}8wY49ujLrxJQ05X7t+|| zXJj^D^8GiYp&_&dDAIHk}URn@qTr0m8kc6g@J-s}h|+LUrtKbL8ZllFP!i{kW=69tlnbyD}sO(`xX zb=JzlzWYCyK6ogFheTuRYe^(-WUWf(Z`6nPZ-T@|%K9P`!bvJG&MC{ZE#6!lgb!}5$6;3_pI^jvu1t+l@v*Ig2*>> z_F!iUWBBkCE@Vj+NeE`Mj&q$_I{BeqOIbpww`S^weZ-{HL&g(|j`rv;ty|US=^M zgag5*yXR>ZU#6rZb?S6>`^8wmu3LW=)ZP4uSt8$`9-rT+(q5}-d_1T;$6snWeN4^W zr}?lU9d%?8^!2K5Vp}YJI3?U*;%a(4sXo!FfDO1E&< z%xQhU(cNfOi5XsQ{eR9p?qUe=p=z?2Q}}3}PjTrSqxrf-%p`G<7#> z(HGu)&%UhJy6$pCw#|>fIN3QL2VlhqF+O7&PKi{SO2Q0QrcG<*8Oe8_m&XNbgu&KZ zUKMRilXmQ%*$WRSWd2^MFd8=QzQ<}qo|{>u z_0N2sI9Ey-_&W7!Yx+okFM8X2EXDY&#Zlm74A{)=2z!F@5usf6xR; z+|@ZjCCqSkX4S*mykGG$`jHb0&7lL+3RV&;zv!KxxX2tAe>oFy+_Z)a#5JHqd=q8* zMQUT4PGJGRA1%o}qA!&gB}M-1y|eG(-? zM@{e4RQ#P^TyLupB1`xs|H8P5IwE503{h|?vDZjjEabt@bB)2zpAnb>v_M?|7&1nO zaE$`=YVi;WG*KJZs38WAMT{3jRQP$?Nd(sR{j@{Rr8aSCe1KG zLVuG@%r9B$?)GQR85QlxxEj=Bn=gycQpm)&w`arlX5|Dj-{QYi>bC4LpptM7<64w6lMKZ6U$ z(F1M-a!UP=(YyY%oe~7LMmQEtQuekNXSN1IVbq|dip*A9LR9)$0YUG6<(yHx8RNPi zoc3ailI-UW#@D;HA7ekW2N1^I#v`REQV^jLam&PF$%1VKrL^$X+xJJ9z5oakC9hcZMZsNte+u9>Z)T^wJHzTLB z8MVV3DqcIgd~As1i>1N79oa6`EDs39R!0)|$^}*wn`}y9%y)J@rRh~j1ie%!FtE9a zWsaa|1i51%dDA5FGgdU`V8z?yeh{*BDA8=jhUTA?4gl!E-b<9PvE)!=+UxzQZeU## zI&?oA6V_A9WP&1@7-u^OOse?Hr9B+df(*s`!k0`3PHiLxZ@t|LJ%8ys(A-DTt_OU$ z3t19XGfUkF*rs+ zL=G6gNu3=9H5r_}DaQa{WooEZOW6K{YGYP|7YE;4sQxCZaw2qpE5Z=15jCu%z;)rS z9X>e+s0;-6HR~IMVg;DADb+#3bDb}frO(1qmV%X)OK~oDn>&|wbG(rOvv<=LtX%1L zy&+?V@~CMj0Bu#Qaim6bzcpCBpJzOz1n^-0ay{jjp55j3*?v-kU@wZELX|IiKm5%E zve~hD^&)@N!Bg<-`UUpdr}Eu8DsCDP1|6m*N770jwpJm5`LMMFPwL>YzYJ;C*D3DL zH(UG6rOk5A)i8~RG~&^T~BX6TaW&JUcXQDJYG7g{+#hq2jZ19c(4s#I0KLVXN8Z1trCXCah4?3mwHP3kw-19sECV2>H29d^abx z+RS*K>Q9xmm8z{fASm+eYVAcjm*KG6_)H!M@H46_GI~aS=%OV|&o<8iw#pPtS<~$>T0=jSJ zHhW34d~aV1jqjU>DNo`OX`(*Q-;#QL>eIR2)OJ^N=G^I6b- zS35(wuJMtu_Qe>{(p{LnYS5;Kt`A|x=MbflF-wN~v?vys(?=c#lmJ@@l0d|l(~aU} zySs`oz}!W6Culb+^}#^v>nW>Uu2|sdPR`<94$P{q91XN#e!96bhdtcps5i-rPzMf( zx9|d}1a@oJ3uy%{@$F@O z+Eft|P0hZmf}S z4F&fn{oFgr>z;f$L*-y57r$7t4TDLxL;m;M7lYxgO0P6uC9;!8)t_$Ub#*n+PLur6 zLwZh+b31L)SgZP2h*e*434$6L6Zj&#W|w+Ha4UYfirHeZA!rBZNnuNrnTTBGLQLdrv!gb;zp+x3y2=tjl#$M zneXqr!mLuXvi)(khcKegVAUiBrt(>Fgw}oiGs4zGUxSpgTy!S>85^y@E`;)HB+^ft z3-0Sc9|0-h?|*U@@_7B}e;irI{wS$>Z8T8bQHEnI>v3b~hX@FPubx+6FhxSp&||P7 zT{F^LCQOy#3k70_(Lm6!al)&FU9Mv_kiJ>ms2HPshDh?Td5se_%ix(7!GkPxW1)f4 zZfja6)Q}T6uy;pE53t@rm!r6lN&>tWX{(`zsp?bnhG>PIV~&!zi~ON^k*HB15*TCL ziw`k+T{Bd2@9?Q%-cIX0S;#5zW)qf#odDiboIY+z^NB-rBhw?cLOnqz=V3UC+%GZO zPMmu2ePLsZ2!*`v;2>j}-is;*UX`9Zt3kei&!0+Wzqf83muu5$V^=~uCKpmCm@bap z4X{tm84Oh9*!17nD$UD69J8uARSpMC@b@=kc3*U@bX+GH@+`(HMX~A*LB`fadR5M$ zTb^twmsApGqY}XSC@9_aW^j$WF5H-%^1o+*$BtBRO@kWcOZa~!{@H;cwv!HFnVrcd zyn}&fi0^CvRR_;QgW*c(GW;UnF5cK05coK2_5$1S%BqOIV2U(v#rei|C=Ei=96!iW zOl_Xp?*mWoX+v9kd)V;U!G=z47V%d2fv|{&XJD1Wi98lI!G*T?EvnYyKi6V`{WSV=wZ2YZ9n|>(Tyu{utyHG;;CCZ1O6f)aGaL{a5 zBuMJ=PtvD%pCSMvnwZyKEo`ZgIrGmV-8rtxq|Y3Bu6#VE<@+Z?PnA{QF+JA(e@tU5 z$8Enb-!I(B@nLNE>_MX^)2;P0e^X9w`9^2^frSm8tu4w&oo?Fn++O*HuMZToKMb1T zZE@2nc72SAd=jX3PtrQy?YuCEIWZI|p0*V*8S|X0=8VVA(s3(Z#w5>pax$2obF>N_ zB&NMQxs7piCBz-G$|NcE2LH$azcZPz90+X2SDUtefP>2$@6V)uMF<+_JDRM=Z6^#( z#Jugvvy4b9p>Sa?Ltj$p&-{l%#D`HnwQq+(e}`=NfG5G^$?2!`&_EhegxET4pFq*iC|)Qz zz*Af<=Z!B@_B059mTe1wwXIM0s1_q(v%D{-wLef46S^3+m|2AYA;7@^X@7wIWzT}4 zJmJTCTlW%QN)cy6z<(x5p)CG?A*y8(R=zRsn?%5CO9C)69Q3|C6iB)YY?7p@>;W#f zRze$GNg-tefT!!N2dcRtKYc%!c1x1)NTk>l6$jT&iY&WAY_EPQO=<}&SDCmRGs z{8ka$MKu!5Ye?lbsl@8&_LUGjg|&1LN$lR&Q713b>k<#GW;=iuY#(L(!_HnF;2k$r^d}Fv z$;}r$J7b)44%zQSHOxxXrJ?mzVGHMAe>mh|IX zp`SfWzDuUma;Vy0ws+X)=MfPaOJP@TE<4&Eq zJYO~&W#*SAonHlB>Sz9y=3II2{k}S#Q>|#W2o?D|O)2`jPdMV_4!8g|f;W@U3kw#Utez}L)=+!9OCKFfkjY4+qi6gJ zJogS%f(}i(W;f5CNUZb%H9Z<q!s9sy5slNF!@KR4teJikezBem(HloTXrO(U4j=jaBT&JqeW!9I8}n!~XXu3c z{=qjv`6^_T^&t;d-A2#bhKe?Z&(09rOZgI?yK{5)tlM)TmO)Y9yMk4Osg-Nv;7d1^ z*FGxX9pJ5G?%khq?JANdtgP|Z`-d;?9*4MG6hm`FdtO=QN$yG2vax=r^8Z=!DsDZB zR7Xp4@zyb%yvns5pO7ju2~8C7cw7kL;!r%SiC@=g=ag6w`|@B8iGC=)=!Xq_37m~BuMsAL$^<$v7^rJ;Ws%!I$g@1qo7x^(xr4r3_RUaH*kR2=#j6cEnb$(v<)lw%rhrW z{&nyjL&Il5U7f^RE3SI6P>Y+Xv4NODk7yC<=-W(^EVG?&THG;1SHhD<2mf?5msLc` z6So*_TfDpmU$FS@Ku^nteME?$?NuoXn6J?-UgpC-!F~&6{h~z$6|}m|4^>5BNkxKB z6ADCc#k=5dZ7nFF6agqZj`wPdz7me^LCODCzd*~>8@@zK%~HVW#yiG}G~0L5?Uo<@ zs=s3kE8+RV++lwUr%qT?W{8n{zP)EGco2BsFODmFv7z;SSy08VTp|W)n*DC&p0}iC zrGDOy&SUhA4y9^~z)Gj9iqEJ@UXi5Fi)*<3x=)7vi+_&>ah z^}IF}8>h$DlKaIfCoA58sI^y~r50A{3<-Kly?|>et4BA<>nN461#))l1;WWRY;#-4h_zY5+>+~(_9-JE@%J`F8ehs&L(lo4O_EEg!-;UW1CZ-k zz@ zSGSwAzg4JH-Z_?{YjFI&|r}El=5RgSs!UT3#ALsV3(fTx_$ugE2spf)eFLq%b=z@dXzrj z_@V*8J4mH!5_mcQR6+!$QBUNX%>xbfIoyF_XFDR2K}STeLcXR|x(+wdy}A8E2lBHW zsstg3WK|~i=N*tl{h#amI`wU6KvR2E*Ukic_4vnQGj`tu!{_eQV{@9$SNIvbCO1#| zDu|br*OKzkOs@!s=V6aXHgiB8vr{hHQ6xfm%Z;i`7lTlyyP(OWlIdlA*wI~1k)hY; z-TjOfXBA70RS;zsD^9iDacO4EPH0!a*|naxKU~)fdIJ{45y*mtxV-fH9?`GRZ|pek zb6L!mQ&GCC#TiWF>rF-83ft6jjELMTx6BDwB)N!Zr<%_E#~cr^ln`(y_RZG|q)o+W zey=wFUhiz>o&5|iCH#$3HBIbW0JN7QpLW_OKzm2L;yO|&Pk&LNU)S{>% zA!;FtkXU)5PUV$E`MfXfHRj%tZod$UBp13CqJ2~o3!T~d;}<7ZOFTwLw`6!L>S#+6{yL zS~T&OQWX&8&yYLwcYtW|tVhZS;KdvQ)HPPL7f{&^aD_#b$_Ih-iTfI(IAm$3PeFZ@ z9|S4>lT>*zWDW2F4e>?##|(k4kTTk9Ts%pj^Dx#q80La-eB~p8?$oKo0?Vrpc`8Z< z0PfdQzF>qc3h>-GB&STrKc((Vch@kUtRhGC?GS`~a)!j7Y$%)Uk<$a5Z}Tez%F*@0 zXQ4&AN#!mrp6_h~FD7+E-Jd2466ZY1-#05oHRSG}VUH}!tb{fV5^@e1r*jOxrM~T? zS>$+!m>=&vQFZKHz>M+#qs*{>T*V%?{qMJkPRIM~P@|65fF=r{?*-F@s%NC4?s2&E z;_^HOhMYi6A1)kC_)6M@z45Kxnc-_UeXzr=PpT{FcSD_T4C%~Bs_DAi<_t!OHbm^@ zE+?%jx_fi**r2u9olRDK5A$K8gfWQ!xZm6t@e3mK9WRoV)eKM&)-3%8D*~epmrAlD zJ4l6aQYyRxK;1a!w?p$e`Z!s9X3*abUYWV6MLG*dsXzQM9C+G0SK><@Y_B5{- z&;)W{Cm3CX&tH@YWE_46F|e%Q96oH=u!w|y+wub2ko|qonH>Io&q5REQ7kw`3avwj za>YVR6^zYN(hN{`w}3f_Q2m{plp7ohTPo;uCn*%ZUy1P9uflS%D}!Tt_||jlku~ag6?+Y6m`8^b!23Bg3cq>?WTTb zbN?Z5MtWyEgb6bctdkjgEqQsS3=16*nzd!Y`JM;GDth_sIe5}5Mfc@}_!fPQZTE-X z%g-+jzsuUOvaHRS(C2}`BLlujS*zZV@C5aAwmw~VLfA|dg@9};_GPQ&DxQ+U^^;^n z+;2e0Mh|e0#IrbR^8q_hsOqS{KM3Z3X?;eHLFjVFD)m7nnh6T?{cU5DAwc@+HUg4k zrR*N>-a+|0yUpb{!Qz)x)FV}HWt<=2clVqru*#`QTGVW~ma z8|G~kd}<*r@WAMP$NGSzqs-#G-9`lj@tx2DUP-*p)(nO00$g3%=T~t|3(jN+0^IE631{+zEEY=NhAw7I=##pJT(q7gn6=40*_uhjR ziJY=3u&sif9S3r8^7cpDqjkHUw|9PyU0k3t2KnT(2jyY6+n;s&pCe^|{E8ZAn1t@( zcysCJrL}nHNh#cAiFphE1Rry{vC|*?sb^{Bpleb4L0cu?z`0I|KJrJfi(>0ZhCCH*1fXA2Ef8X8N z4OmtT0$LkLz0CA=9qlGn^>j7Okoo=sJC9|evn(veplHEV{8*r25OlArpuomY)p;>@ zQIMoqKWaq%(`b9T#;@;kC*4^6?3`6bd_~KIrc9)>KL;Y48Wz2`y9gqT!D7tsTb#E; z?K*UAS*Fm|clk4_3|hQ2DPL#%qN_eFZr*r$PRag{p&s^ODD{8#ddn{&9+$6xrhB44 zZI|t0O`E?u(SgT4Dvp;ji0=aMhu=3NsJyR5)%?Ous6c=x#h&gousmuXCdB;`aWRjG zK`)n_Q-+4Mbbz_&V3OY%H#mC%%H+$uw!)8J<*N=I*2KiaG}qzL63|n~rMr#Bsz|iO z_@%?M;i{2vGDiN*Uc;ebaNw>ZB1BF4f~`93UcX3jP6qwcvB&sa}~;~Z;+2QC5n>Y20g|C zdewLZRG3llR*-#wb$DiNy<%J?H8CUjrz6*l+;ynqmJ^P>wA2-5NRS61JqmjFUSQ0* z{NKKFX6N^h5>Chpk*XpRKBFA|m8M{aP`F^UVo%mUPX6!3kmhYPF zOA^nd>2TzuLsfrBF*6S>B_#E8F~WeH37o=mic0O-2nFUro60iTB0)P{KC(FSw4%vM zYAEyDIbm_^-9W@of4o4keNOrd?<1=tun06VTJTHgQ_n~a(b4530seLT5qQ%1#nz`K&;;ygVE`qr~c+YyGeK?>K~rKO*7F=1&T zCMU&{InGv#>lrGMwtMc%2m|RQPNoPwTG;F5b-CK)MP~Ns4r8W4 ziy~6%*pGRh5H8+Y+RLynQ|)r}OQcJeB%G;oUWk08%qKW`3(8GT^vkWu<&8hzkQ9A4 zprVR_t_X*&3uy|VvM92@8SDKlZn$>_+^D`7LC>dV7CtSld!@>72LfzzGvYLWEhRiBfQXbF?$hyL$0V_pK^vJ^kaN)?90FpQUtX znuRKL--98=wv90v*rYZ*{x@3uHxa5GT}^8-SxfP_ZPV z$_V+LAK{tWQU;40=McWBYeQo+@n{ouK1%+s?M$!8RG zK7z4p$mdc4=DwA$I;fKzQ%}&%FTHDMa4deMrsi4`NqljphB?b?Ay(KWjy_IarP!VC z294^JF>mAo`9I>>yVzS_^ruzIpw{lW_IlWt0DoXAFZ)M067VL;PY1Zhka|=!L_kd| zmmTh!OU@ErOsd945=K$P&muKy7_C1iarR==P#5i5w57-e{}H`-sYFY&J{jFvCaD4R8C)hXOr zYRf&4;Ka{Am~u-jf27?9%-(P9a}_;mB`UE~!~cLNpQ(QPT7;uO0jXWSOU(wQwr`z% zk%YAq{Wp{9r8*n)zv)y(X-+aqY+0Sck0SI~bDMUEOj;;><^@gd%@O+$h~hl1syZ<^eC#2`E$QF3I44bx67kP7_gPAD-Tpd?Qe*RAatDn+ z@CkD%k7YdZmZY+58J4O3@Z|mx%q@zi??u-CSv)e0%16dY;dZcu&~Fl%MoOTt#U?N? zyd8A++%pSE)_csBden>C)h8J{krEJ@(u}OreAHSMkv5AEQ8tQ=@)UtnhgYL32C&D` zE9!hZR9&bS2aM9*Eb|~|x9k6Ut`)N!C@cq~mwr2EjnV;^A6F2V{i49@TWk1~ApuUk ze>4!Q8AwqO5@eri#CI}*)*@=FfY(CL%83XlQ#hf7u8hnoJP{-2k2V|I(wc1c!W5OG-al(zmu zGe{-a-Woj$2L8RCLI4*ij&DA-j>dHL0tK&SPBs;c+#ROmGB4YXm|OqIT{cVF5woi` zN9k(pglNdG8;EhAV1PbMo^LcEoVnOYf5Cgs!5LUHq*n3d$0c1rs8ONHO{T|O`uiiq2~ z2E2Iprv3ZM%5Q6**^F9Z_j{sfUQe>d(Ko* z33NS#j+T=jC(7MdazTZM_d8Pcoh0+=vwXagx#v45Jeb?ZO^P*%bfJUM*>#?MeaN z)2YZtMALQHPkupn?o`|9YC!p9m~im}YStxEn=-ci{bidfU3J01rvWt$YH(zf;TC>) z?VaM8I_Re0X^5&jc9bs3R>0$I=aaVv$WL4z|BX@w+s;s6U2VPo^*)|V-H<+|I}`sP z4L#PEJ8F9mDK=aa!UyONwQi>Lr|%WY>V!Ks%xpg9KJEf$1GYi{|vJ@6>Z4Pm3vxfVPHXwOJJ-7T`dBT4} zy067fZ6`-L1lT0dB^n9T2piu4n25pMlEQ>;WUwrfGYF+oEkPPQ1h*#!UP6|S0ESyh z6e@v;!_S;SO+GD^BD&!~w%nY!*#Y2RW~^_p_Cg=nii{j$g$AWCIA|PXZyu}#UGbOS zsMuUj&G!KHZ)k45f-PQGKi!4ZKvD1#zlh2w%a`E()l9W0%Wkl-?gP%?)(hx$Rh2Mm zvDr9#ahVVSHZ?m{OmPOj-b3+X;FiQgfM{8I8$a!a-_mqEt;dLdiQS<6xE);>gCP%y ztzu$4AvFKbM^8*+=kUKV*<)&5ugLL*qv~mjCZjk#2azdGy+h@C35$S*E0C|@kjz?0^+|E6sk1~?@GWCElzf=0Gr)bsf!olKG1#<_M#DCa{rw&c@vdmY9D-gsY|rOX?2k{^JiKs8G%p6vJ8#kFWK%llJI!3 zNy`tp2i>1q(Q*t4ux4ayer}SIED@hGLqQwxv@?E>{!vtv(+>nukCy6;0_h7$OZ8W7 z#dH`ctp-j4m<4r=+&D2}7z1l&?Y^(uE1ilQtjK$_1MUp(X~MT2EZ>_nG_tM(~NbsiiA_fO^9x{!}p*EyUFnV^%M zoGEN*ID0=J3l6F=hYvx!&RLyW9{{R@N3K;UUu6u}(e*DsKiDT}mZ+)hK^ zgB$3Fd6rh4qUg3RJLR^$HFhv~Qrs3ONtLNYCWV$%@`DnOdB%KwKBvxY752?rS1I>C z&viQM$!d2q1INvLq(>Ft$SlwEREiyf)Itl+lo>0JIK2N1LFIXWV4(}raYox!vHa7* zgL$)DZv+6jh;9IHow!J2cDr8mVoa6;+P4s~%4TlP_j2 zo`8j>Qe}hcr7h}Xs_m&rlb1yqUJYE!P^MS*y0T(*H~pYSsFLgjzsh&>mmB}~>0BNS z*ldtc#h#VBn8Zc+>S~IrW@$^W@NER44eWxbMt@&*%VBy<~^pDzhLJRS}hhv%-h@m8~32UK1JWrC^UHsnx2ll9+E=cYbG)0CYrSd zpy~KtrZM^IU%NW6ew`oH(SYJZeRp)xqdnU-XC zC9Mb>lmVb-;GVRuv4B$-;gACf`lBom$aV$52#w^><`}{>b~EKI<__cHL4euYm&Y1X zsLS5Xl}BFRHTxr`QkmVdnR3}>jEK(hLgjMm5XH`C$k@-Au#_7>R-$15Fm*Bjev*bp;|JBu9a4TV)-hpc2!M6{A$3d7Y3?^PPm#;ET zJ-4%&zW@evLySp`O;+|Bjs_+QkVk(X-C(-KV%x`xKTHd9aiO<;1@w0&Kv%Jt8&P$? zx|rWWx%yQWZ;Bh#TQJyyx~cpRgj$`S?xP=Y(wUr%YZ=e=^x7l1BJGm4C5Lj>F%JDtjxzoBJYh;i zV~xMY`&qZmz^SbYWZ!_bN`0dblF0op^`vw07oV4Kzj|gyO09nrGtq5o^yVrIORgK` zJiuLO`SIExHU3cO;Z4t$)$1Vo0+W4a9p!2mkwqSfBBuIp44sWdVj^ zpTR3a5S%9T7am3kMA-wpynoZ)Zrja41)c2}jR{)cu;VwoFTR7$4*(u+*t!4HFKXD^ z^#Stsu;L4*TJXJuY%2`{Tzy`QL9x}5FhQ^D!N!w6?pj6d2G(H&CPp3vH6c^_1Chg* zzAn^DfR2v#dU*BhF{7O4I4;<{ zl&wOxE)Iso8#~|$s!78yo8%v~5qe4&Otr!Xd zXZ41nc1a{33u4#9;KED?m*`FsvL~dMk!{xK*&XJl_kQ_mwoKFEqGUE14cIyLo{HRk zTNSlg$$W48sg$h!!;*drgS$h=WmhVo?OUDz_mAVm(KLrR!}}av7d2;sEl+9a6i*OT z9JNGFUm)m+p!t&*r{S9TvIm_#_o?AddB&X!A4~~QU zqfW`-{WG+Lbe{(>5PFs9#cvKpCJFTNl_}l>KFy8RO_+{ev0k^nIui77 zA`ep=M+DF6eb#489~!G1$~P9v{5s|HrO-~C1nrUckXFd^==EFzW}-)b>&Fq1qVhfF zmWSy3D#w2~tvkAS56XVQ+($dp`2Y=N90A3O@?5i5;=gU~>;XUWlne%!_2OfR3hf%L zu`jiH_Y6Xr2e%aZ(D*7mKVoVk;uTO@eXaSR`&OK`Db7x2s)NSADCXBchLORsX-(YD z6PJ@Xn;?Tt0qw%AA7oepB}k6xNB*W4ydX1@vBK`?3{j4P4o*&m7~Xs~%IbiQI(QFs zK9-sGQP=ZK%DvL3Sg($EU<08z>YLP6BZ)>S2{nfAO+PN@Rs?u-*>6$?X$>|ww{PW5jrBrS6T zHYzf!5djuRxLcJ>i9+}&$cBCR42s?082I=1hEFe97T9rK$ZLyg&OZDb`fdDEHxrNKxFoU*+z zcwtHK$Y0MepwX7@U>9^aaa9_uK8&|^@Y&|3$Q_PbmaDr9D;NdzWWw_K;W~#!3(Rdw zld`4~uszG3FCF|Is$FHc@_*5*r7w0U zKmV&T38wut#=k#zPCYK4GMqJnq`7}w^O>p@ug~}5`zNzI8m!J3$%UlTpZ}Fe{;tFs zgqi*T7b1-=$5*|^+94EeVNFc2_T4S!1<#dMbsah0=g^^+3-$1z)c+fxj{cR=n!>6^ zo{4D34xLT3Z}IWed>fyT^<%?8u-Xn?fn{1)Q##G^j!I2wAkriMAJmsrjh_#t{>>3A z-{HQ2tzI=m==)A_w>Ul*qDV5$N>heo${P;Gg*Vx1FjZF^WYx$yQ%6>c{AE%dsSO*0 z$=?|1mOp}-h&0NT4lAB`){j(_#5c?g`A5e0F9Ni%JCg4mb;J}qiM;22qn#qZp9o&& z6>{7~aUzdIq_q5)XP+6f>yICgZmC0Zf!_v!tp@>y4)6KMAYua4 zpG#U!Nix)XXwZ=@Scq@i8y^J<1_i)2EsHA7%Z8CaK{%-8`!Nu^mBOJYggKeu&3&7&Ny*AH0EiC0Vi&ni zc`ewKp_Hoj8ZdQHpRqfV?B2xEw8BNz@NE(XX&<#+(k)nMdN#nPUzsAv9B{0hMqygV zVz~sr!RO`p&*IyN`s9wEl0R?D-EnFCIPf5)iT5LT=MKty@~XrlXEo4M<{mAOBmC3C zo@Mjt_fSK;+ikcMVZ$#(TbT|#I%WDqfARG(?pG&ug*zf-Ei%0XEr(}!s_a6a z`9;x$mk9+5Z{u^Q5NK#5^BpQ-z`?di1s7V39)NcJ3Nh)?A$o->2JdVplkbyZZmhV_ z>}Zks$IgQ6SYZn7@utp^m$z0ZPR!p&I36#L36vgwgN(K2&D7@RN`FoA3Igy84h-`6W%5Kpf~QaEzuZE^dx(1#qTh`PP#_y%*R(6jZ9f+j!g2jR&QBFoy8 z&TJ$QI-I12wlvQlFP{xd2>W?1p--VEexO+B#>oUHJXaW}Vbz*159sn2?V8%jlAiuo zk-<_FIBSU+Ecv}^4!=}z<4@1W_AWVJ`o9hMb`=Tk+GsARcZ2+b=b$~nJ??*4ZA>wP zOY?^-w6J+p)d9K~N-_FS8lLytEm}?B_ffa2!WT#piDStwHPwJ)LMa8*1~0IyEU{R< zaYml6Wz1GjR&gA++QqHIX_*NNTs2fzpbI}VfbDg0BS26%wMYC9<8xWIHfd&nHW)kR zUuDK&ILa0+@Pf=@R99$6*tC@rgGO=!|%B%?0X8Ec5w?u=t{4T zg`dIn(Z$=E3wW_+_RskG!eMn2J#vL(!jwfZaRc6IBM1HBv0SYC=k~P-1DBBsMCICr z+!Q}70qTBt$OPEo{ehi{%6TJ+evaE;j*+a5|Dc`w6bKY9Fe*H^Pj0yxeOh8kDh6BS zH2w-pUJb3JMRL$bdE(w`ypFRm2WaOZ4^NkcL#tf2d+5ZU|J_hCx7s@a8}rIi}NVS`vvLfa{!u=_^|`wcFP$b$;ayq<~#Ezv|9=LSLJWI4=`PN5-C;T20J zlJa0Qj@_-H`QM&KHmSAantl@vwBKW)zwoZN?zjxVR3yqTpb}BYN(s9&h`6g*Vg!_$ z&H4gDsp*GMnU(f*-S$4lHU*EHP3*!B7}B=yCRFewm2KC|Y3AQN>0h;|z6LEyc+qh9 z?M)orG~g{~u5b{X^c(!i_*=cVrpp%p`6lD!%zdbfEm^R_)~Ta#ufMirDX>Jc+^_r7 z{%e0?>@2(p7-MPkrs@B7$A$m5J3juQdq?z#F}prG%Oqo+=39z+RWsygqV$YBzZ5$E zFgDZ+I2o@W z`JrSea`eR?$q>+2V8Z)A;)Ev(ob@oE5|z$76|eced{2gIxGD**xkO`r)S0H`KHTtjm!Uq$q%PG|N!NiATV0G9A;nR!FjS5#Uz>r(-5#FE}(XjfOnh;XJ zHT4(PoE6)CcC9k0Vra_=R{ss%7TU@AXn_Nr-!=j+fEeG=3NS-vvco2^p(*TpMz`>T z@c$DhhlRVkIJyC0qFWTOPF)E?*yO|viR3xpzBbZ_-1Pd@*Ypi`Jc&y45sXl{E9NY$ zn&GNz$&U(yMCq!yu1D(`TS9U5O(t(}o(o?xIQGg_2CihX+Z}^c$YtJ{C?)9p`<;PT zKH)|BbSaC3hD?orxcQZp?t9+Q<_A5k4`La}z$aJ1Hj+?TWC05*jW77FMh6Snj9RMBuU?|sLUx6~_-5ollfWrWHP zI974COt91vE{N~oi~J}w-x6zA^si)fX{u0Roi3wzo;b~jG`zU3xHP{n$a2dxpG(j3 z$AOtkNbn?}&(+Z{P?SNi`=Hax0Ggv3cQ^kAOvxYD7I`8IlN~)EJn+&jzT}S)diE-| zB_?$WCsvu47W}-_`pecRhd`Zm4jY{v5>qqBkbZ*o{l-MU=K#GsT;++rjlef9sq8j`{JeWE;CG64m_cVQ1| z7^&s5*6j?5DTtLE{c{`ZGmN2VF)}5O6GpD4>>Kv#HP4waLQ^M*(ULt7kdZ13YFMeq z@fm}Nb0_d_U0Drf{h@NvAUeBDFo3 z?C0WQ_mUjjxA%FEGui!%U`1yC)Fg`Q>*gNNZPDpCO;9l?@gM#f=EaV-*#&jSLvP8n zn{+O%D0W!MPBa_KywdGK_X)GT+ZB_iT@9$rKkV zI-kh@LkxY5U?&GgTvQGNT3%v8I+S97v&=grJ6kPD*bo6w;{V6gS^h;8w(Xim8Ug7L zDQW3uDCv}t20^;J8A9oj?vj!Q=^DC`?(XgyV3^tS>^JuQ3)YwQTlc!J>pYJ`AGO?| z51>gcfnGxf8=%pgn6$Yznbn6xznb>LI6{XXG3np09$9 zE=bOtYc6kBdyv_G2}NrY|99XoGov8aj-C4*s-tYY-~O7s z3jONGi(NS4{aWe|W;D)PJ6_9p2quUtQ(*of>VRP!{zLZ)q6HlAv}-Jz%`IPz1^ zL#&T6Y@C2XETY_9H+7F&lgc~CW2TdCGqx9nZ_CooHgojPLjze(#by#wyw=q?uOUl@ zS*bnC-RGzXe3x~6?_s%tx4#BD>-d$N>Np)&Q<1~%ncaFAYa^{hwRSsfAQn*#iRj$R zyR3#OR>8anEF8!Fi)e&d%hG6C8)lm5Pi$wOwG7l3>cAYHO~OJH+e9?i2<2mA6>^3} zj62IHo~;EF_~DAW`uDXTv6nrxj7ehVxdMYDerF_>{c3FLbULrDE9gzxj}J1&gYDU2 zlp~ACrywo-OIXc3<;g;|vligsTD*3aAER0$77qd7W!E<|o3%HP!_GAiSs++g)fJUP zfT}(~{8e5?TOb&{hHZhYvImeu3&m;AXJRzKx3J!k1ebNqvj6dE=^hj_5leAgYSj0U2|jox1QIcbV+G zwP|sSY|T^MGPVWCg*2vADlXnryzVbQIx{<5tE{d&XC+dEFFqOl zUDZZy?~{?W9bEZl^BOR9i%(Tp$B^T3^Jy|wm!Tv{Lk%yKJK!@m@bO3X*h51IdIcM5 zlE`9iJ4HspZe^8*C;polSj>v6qSw>Zc6Z+;h_-BCgD!echVwY`2Ug1ku6F>NSCtGUiA z!Sb&CYwA95FNx&1)v9{RpzCzL%BX0N{fUj}0SRhFb&g~@nK@NDPOr2+I0^+kGhIj| z&~Z!!>rkj+1iI+!#kZ2?6hW&4lzFsm%7?`>B;{`dZDKiE+wc~@%&2b6rhneY3bR=- z%u*1M>edn)su7}kXai)C-sx>GZ`%END20EVm4Q&$tJl$vxtiBWEf8;rwTS_b(~jor zzPY=cXvbpAqVRFw-W*Bq<;K$A5nUr@!QXo@AKp&|-N5sqM^KHCSfNS4(cim;=FYf_ z7UwQa)(4aGoVCaCE#Q>e9j;-u2yf76b`OB?{%TST!j!l42RCVPF#(nB@TTmbgHchP*ZmIs*36ihZM!Y0 z4-Cq2?fJn?YY=@7rl9#?Ej!53Vz{LRDw=@oHLA4IS6TM|iHO@B}y%x({L22%&8$G!!}0Kwn>n#+XTpWnn zNsx>MdYo3Ge?WrGmgYMOO-VOW35u68UZ8X^OJ?ea-GVti5TVg$0U$P`A*bu1uBza)u0P*o_^2c5M*OQ@?1nfzcoUZJ@)R)BO2Fbf?7M z&-SOIe0VyAMb^~&cXlXCA(kJ9=XMgiLxmisyafmnn&h}AJB6jHwA`Fm&MpsknRWs847d?|lK7xfgWzEWc*EsZ9irfjw&ieoxIz8ZbsO%zTalwwOu z*F#f0(2BvZWN}bZ&VK(BL)KKBs(K4Et4ci`&IUAm4_n@a_Xs8%kYLHz@F0?YFg);S zvMBQoip&^WU@QPZFNZrY5up=~wvZ$(GWJ!Een8a_(4q2knF2@!wwYp9*bT>msyVg` zpuoCc?;bNZpWm-PC9Z~_gGYF-;$6v&dQ@bLWGQzlPb_vpg)&<+1$q}DXuSXVx$!G|Ke>mLxAnqYy9P;jbb z;i4Y)DE##po3*r|O>a@49E6tRh4dr8dX#zbfua^R1iUo5gX|v~Sp`2Dw|={vct2YG z$bVPTUu+nL7>7gKq7b)aL*->lT=WL;#zCX)G4LL}gMaJve17C{!J{*s^ z@9UzaJKj;%RQcRat-VgZuB08uwL29rLhUxE`1`vECm!_ZmeqH?QpF=x9VVG3s-I-5 zBp`W3QF}?DXj~ZR<>~o znu4ExYkz87ygIpE1{H{M!z(uDIEQBB_nXVc>YoaYGhVZSyOSMR;xE&jvb0=p&vb`7 zD9vxO@#3$nMZYkXYH4o_^Tn1{@m+}w{@P*^VQemKe-wYh*>r|@oh6yP612VaQn~Ms z-n!o}G5KB5YLjoa&Td3V7Qlw;93Re?ti=3|xdZ-#vu*}%3d~j=I`t$*%9q>p$6V&M za;%@8BWAT3tsB0-v!zyY3|7e`R{nhrleePM!Bk+%YuLXs3l>O_4P6-!y-j+%;BLv< zc&eW(Qt9&hUXUL60oUcj&=RxioQ=}t=cx{dnpRKiOg>j(EPe8^fX>-i``ropNw*`+P`C zh7NXSe@yCWbvF9(t|#@o+WrX-sIkZQXY=gLSC)$3O(BR(&Lfx9SCz+!;hLDOq{LvE zxR4L@Zg#y-HoJ75kr*YC-F z0EAF)e~&(LViBC0IMr!%Dtmy7JuWC!X`Ah>GIOUNTI<&YiT0nA8A7Y;&PiHlP{Zxv z(;Y`>QsY4(4R(MTzxpdAI$lV>!-akEe`ZP;VbjzP-I;D=q7goWlvh{ zwNtD_=+X8j+ISovE+k9xpwXIqH&0CR;T)b~*)bu4bp!$3QHrHSgnh;P4ec{bW4YE) zlrKo93U|V>wybS?UANlP5G`bhRTr;jA@3ekE=11Gr4TU+kFqFt`VamZCF4vUh!3x+ z56iHD7K)qH;H2^Y)DMs)bt(3!^3optfBbh2_UN;6^Z$_ka}weX+W_vOUVf`b(7%&n z(k1~9iEBPXs5wPs*JSt8`e8=8 zRS|la%g{**|79h1$~ok1Wz>SN%UXA%R6YL7A%s&cZCW?v#|~eX_1)VdhW9*;SR76>5sw?~9A&kP z*3|YIvES4G++{wv4h@8OQ$~1e@sI9&S2%N^k8fL|Dx4Bv=q_8Y3pW}k1`i`cNYAGQ znfV^c&SxS2Xv* ztSoSn&~)|6pckJ*VZ;~0h<>xAwMYfMq9k6H#ajgXsdtet2HWWU-eFR=xQS4*ud+qi&i74iJ)fAw!bT z?(up+lwm+}ICvawlFQv0qIp_K4pCy`&bJOd#D(_ZV#62@S2?pw(>gE2$*0c`IcLX= zpXt|?>F>AG`AQ~U{Vqa()@v1ynv2C51m|SMO>!YC-(uI$ewTgTw@{~-%U@Ss`_c7L zvDS0zUB&z}i6gObp1I1fo>Se90G zQ^A!cdB}6S-`=_Z5okD7J!(C+ON%yTFF-YAP;TDSk^n;_)v% zsI47qN?8R!NVLB*3Uv{|rm+sjx$rFH_nGSe(Yy{DI+tbU-}9SLL)^QIw9;%69Avn` z#$UrRbQboxFEV*qGQN0pa!+?Y#o)+vQ!&aCR1V=T#AAZ1joYRhyRl|Fw^cL03V8l3y?s<#YC6M;9ddecs42aC-f$|u6o;> zZE=W;Kjnadj0ABvH9S=)8m4*EGWnAD6&TwE zzHS#5utDk(&wV%ofj=11Dq3Ij(8L+U4|Dag+1#L$Us!Qt%gR;mKQH|h1;M5aVhEA1 zTUc%ylU`@9#rV(tcE#+iDJ5TM{3C#MebgM%Z}+V9*H-wzH4;<9p1$VcD;X=D zCtOuLoLhiY<-3H*?f-xbENQwJy2(HFg66=FiDl719%9;>u0a4Cpp*iB)T*wm-yFbR z{&DaegRB??n+nBQz=~7-2~2_S?*$a2CQ)^5x`ZInt2l0N5C(e)4qYq9Lhsj6A$^%o zfd$i(#6F{m6-!+`3jRnv0A%y}ju>@VC%P=)Kufa=lG zBF)!dt1L`;U+E1hQ`ZurZBC+1?KLPYNZ44_!Yufw#IN^$S7}@Lf=Q}7cb)#bg-y{p zZ1bmY^}mN;de7Bvz~jTXQbQ+-b-j#huS z3Ce;H9w3SIjvUnS=nn#Sl}Pbl=I&*%@k0mexZWQdGF`TP6Hj4NcZ%Q)c_p`|vk!L* zJqi8L$5w<%z>644G*x1rXzbk^f}Ka&<)@Ga8__hq%*q4R zL3ve!LZ%GPXnY^ivf<(*rQIeDv^cZEwYcxR;1*VGg-3*-7Kcy$g>nzs_y5k3q}Z{X zZl4>LMchYE_Rf8hX&H>i9}5CfW$=qUgc`vna)DszAU|KXasB5RlE5VK z=bp)#P3R@?0{rro{6+6M;A7`m3dxZgbbeC_ZqaRLP4KAPKsf%2*A1Kn#s+TEYyB-< zlzoMf64Y*I>-?@W_}7oC)5{M0$3wI7DD!RXDb-i(MKz-!0}3lC=t|utd=y+0>%_03V1j2DygVVZ`H-{wq!9lQ2p)pMm-Dc_%fOcD*-w_3n}w@Ubs?o> z632Lu7f?>uA^cZGLSd3NR?d0v9iI*PRf)4iIezZX_#j zbp@pzw}stur5pQW_bt(j#Y)^b?odw-BMS?ok$pas0J<;q4DLx|`?vhset82a0?|si zx9zq6*+pA!hy)#KgKk2lUT1IG)V1((}$S~%_|`C)NVOh)+4F7-YjbY!E~|bGt>PYmDzBJ7TH^hx`mB9ZX(n?TQOPwI z)oz=3<0-6z)s73LX`0l~bc#uf|6f@v?JAQ_8L^W^`Jr_76 z{l9<67;Z$^aD^B7! z%pfCqIKR0om}b?aVIl*cze)CanhrFLmwswQWMmGmS~&=??uX(C&n0De|19QkNWYfV z&i_&}aWb_+#La-ukRkK;ZE?vvp*LvhN&(o>a@p>3*=9PqN|=|VPF1Hj?)ws|+;=g+ zS_Za19tivF#Km6-1xjqci+4^J8}Mtg+EwQwe0Be>YtbTD_Rls}p2HZmn@&8(iy4yz zsE|}pF)Bwq2+uGWMGMkGS=$YM0_|`t{>=U(xZuEAs*G&k0YGX}OYNT}P$b3wF5 zgRR$7=rzLuM%%D^&@P|G)6$cEmaT5_q%NHqifB z!D9Z*rA7I~mdxG^12%u~tK86L%+a!f{d`mLiUbx9kleiQbShZ=NAvLIw*9gdZZNLe zl!q;>g6wu)c|g$5ZLa%137_qle%mQEsNJ5y1!BYS*sK?{OW;uZDwowcM68r6~WGet_$r*6~cVO^`WBXJ$;Z`k!+utTyOu6TF0&`X(s zLBB;+2`2W!#r{^+-?M8)1a3S_Ag-c)ADx!or1ARJ>gm*ro!@G+n_!+x4yQX;%fEOW zsPQpuiTL-sX?AxRrSCgY21$NMw2!EFe{R`)3Gd2*-ol<>pKAj9#*Wq7UUEfB1pYyC z0pRny@wyoC7m9eF=w}DM`jOOaZTAwCYqb{0-ONEo+R*lMXz2TkJ2dA&?r0KQqyZnE4}nu)qZZCtVsynfz9stZj=yK z%8jwJIXDJ&lH-5(KrU(-b*(yWaG}X7e$h4L9pM{tdvK03O_Dr%wMEk&-+;dD=jib{ zu*<3~^<=>>VZ{5}Y9%f^d$m)Wc&B6-#x87yI38Z=pIgBFVE|ODrOjE+6Oyy(*v8vW zbg#KlDlwl=z{u&WVxbwePu3rhlPYvvJIm*N&)>4kccXGeVELWT8%F!B#JaQV~bc%lx>?~3dS&A&QK|_}9;K-}V(jm~M=1)IiPh%tef$qLX_v=YASO*eJ_?~EJ zG#G4kt2+K3y&F`bd}u9Uau)IywrESaljj_Hix1DT;MuOj1XoDv0sfycV5uV(<7KX% z88461`Fh)VAmoxdduNw#-*oxqJci{)#`>UnGj04#l-~jPPMH|D1m>eJz(&VeoW%~( zB^uz)t^3oB8!vrHxVZB<6+q^{Kl^tc|Iag~`q@O#ce1Z$BB+=hggs|7^D z^zJbg32i^T5%m+rltPtkUvGV*ssM{*^?Aafm;0sfquj%9B5ew- zwuQhRZf1v$hkW@XPU@(nQ%n_ohmU|y-pvYoe`=V6BeZ+fzI%<-3WNwZrT!wnW^uGn zqUAGi=Ni{Vyis40|1{ju7n!R?OE0;yuc-nh-cOzy7??-KJ!VfWuFxe3_k93 zauANz4B(Du68`lTniwt`0I=l?LD}(@w6;M9aOf`urFt}MDt>F77P`F2p}k(Jxt#}B z34O}@l(cISI@6f)xgD|DnUqtk4t>S734C}Dp6m*Q2U)M<-yS6&ND)E=V z9Ag&a8AwnBn$O7H~i<<)vPmeaioleCy;;($q z<23+&<)I2H1HfxiyqL7tS^#V3Lsd-~;R;C7SyxC>3Fqh67%Zw-vnY`eDf{a$T_-1zVC1?Gqoj_K1nJgbREFza#uhl(jl zYw-O~eSt3?8S5u_H0Jr#z`ada_}x=Hu=NX#bY*pNEPOn^2T9LF=2HpqnDri>yi;=e z&DY9#nJQiacrFdZdyRzMJyQAW)|I?UW?U|Wa$mxjK;lpP_Sb^Lq_-rx9Ii=>PEXLf zM__K?>7^gfy70A_V6La$~)US)_lv<=@I9_r3CPTB*svoAOaEq2DZLlc0 z3p-USJuz^?&j}l%SQlTv>MY+da3u7FBzf^Kx>VnShd|?RISAZG862u}b|jR~3K=(t z$5-yR0;obFykPcDL{q27RYY9yW}|uW6vLUDPT-qe7_GN`p#6!Z46EqOht?MZ}D#);qs+?X&NJdaDwi-crr0 ze!$D7f@gQ3mQO-wF#!^V6lX5fTFC2jK$4r>+JyTA;0`5WrB-<(ID17V%)7D)%Jdy#8W~g5NoC8j+?nS4YL(1Ne{}_Kn7p$Q+U-*tw1r zUUxQ!{e%iv3=DzOY74tTch_p(jN{d*ePV$sxIF+?=;v!1SB+@t4f@sG#-UG_aAP!w zyqmrf7;f&vzIkOA6@&1+uZxEHThm=}uDrXup8N}rFa8Th;34$y%e%X~vrn|j^=Gqh z`f#H1FD^OLI|vB|NNbQ}czSQMm?WfA+Und>o0r;woBgyiwwH|F#mruu;pXs^Uzv27 zbo&0J_JeHen`J!ZbOeCVWBzBea2oW#4w{_Ig^te$)gqS%29BNV6LMqYG3L~NYP1KQ zZg>lva+@a4Wu1Gm=lvJ|+QmM{)``})xIEqBSf|IWwto0Q9==Jzzuk_&$((RVlijD6 zY}Nb{H0kISJrHoh642L(#jrz{ygqOl@nZugw(b-s zE;lWVr%AH~zcS0t_yf3jUjs#ly&c_<>`qyaDJGb^@mGfswGc9tiiS8XcFEz~k#|&{ z6xCuUMg?c;F!MV#41bGB9Ntv$SG%vWfGnnxI+z3l%gTB|=cQ!ZH2*oV53c|gD=7p; zcjh9uMb|`}hDVCvp%c>U8e#oGK&6&`J0;A~xZ>(^;T@nS>pir107M>0;2FNQQTeP} z@>9@NQ~?wIu3R0=g_}m$HYlu7Zs(~*0n>1blSCt69YPt2q@d&Gt|*Rz~0xCqmO}5pFm>%gXnGuT7DID9>z#PbX^s$ggd9faIu zHwi6002z$UPvs^PLYko5`zXfV&Pi1N`TI#dzsnbeBmBp2q?gC-gTVRC7y2@C!3UNC z%YDKz%6+nB)5B-rlN=0J%*=di%(JmYrZM1c zyFr{Wh0Faq3wr(b`~-TL7M6~Fy6XhXT!zouE1#AzrYiT;bUzB^GGNGbfJG56R;yB= z>zj{Ncb8BSV9>wB2Xu?BN4!9EqgIG$z!_cM*Nv9n;;Ik?i zzFbfShs2A@poZlI?AljFZ$oIJ?9y6_8OOu{w=+YEV|mb`DIO5fQmkJUe zsn;>iGP$3dr}c0aW?|rGwNy&Atel=$zq659Uf$0WcdUr+yB43A#rnPYxA+N6m?wCt zHwP3uVmr;ExUE+3`hBz@5?3NHYzVd8=ryxH-yDU^{hpj!%QCNX|GZ#Zo2k6EuoH{*es(KvKFmQP%bb{C5fh;oH+??W zaL`6{G=`nCEp=hAQK9^%8%HnJk<-~zViF^ngdVY(+&#$4R{ki2jrv!mq$?B?RxQ>I z+Ii^*H!}l&0?RGT8R1EAvy8@t4rKRXLNsY$ zTD!m*rtrWhXy4CIyP1~RQh#vke+XiM7zsu+5gzgpm>})vZd){qOi#*JlkcE?l#M<1 zDkI>-ZeUQ`0BC&MgmnMCrKfL13?giUCW2b?8;t4Z15{-Z2Wm7QR?~N7!hVSkMK-r) z{jgY8O+GTmx)9;c`G;^Kzo5;~=?yB>hSABh$58B(^C9WCDc$;8Hen)-UXt?FIqemU zRLMVUN2evyH4N~Q3t;kpnM}`LBme(nqVw|s%evR(SOlA(S#W0htUl!!Q|w!e>+sLr zKk5@ye95Sz>9nbmLn7IicRkp^_9>xW5OJyg@UlHN*7v8Gq|a!tatKByK;t8z5uzY3|(u)2jW zSYPHdpTSNJskILNJpZ8-!jM2ly|Auqsv0;Hg8$`)P zE8pQ%PI=FGGVT>{|8COA3C4SdMc4Qc>SCNk-= zI&XNJzWU{WuDv?r95Z|rZz)V*WNE_1#@esU{1GXbe@OsnwE_p!=we{4$?pL5jSm2kcv&Cf2Vm{n>$J#XWu*6s9E_<%K^i^!f12c;=o+<&3t zFKQm^QUvTh{6N_8EKW^5Dh1w=9Gi4J{;e1_hm~rE*Tk$8R~mj57%Dw%j)8uZIr$__ zcF3}OA&S6MKXeCx-sKgcQ+LEyqn~dw-mV5t8XQRjU?ay9sC6MKSk=Bc9_OKV84>$8N!g1)Wv!2|O8f1hzQat3J8Q`mS@oq}W_aPp1$|`Oy|lx;aw2XWqvQ zy-i5BbeNCqLr2>@ue^ZkDB{P1x}4g^{pT_YmW3LUH+N=o-#gyF zp-{U&`p?M61Qx&X`70;jvMHgo(^y`aNa!w9oWI2F$Yfxa^SVVwFt*Ni%koM7fo-S@ z%y4J&Isx!J5g59&HaT#5$`w#SCk5Pfsm%9 z`#qVkJ?g-CBzI_=*zLxLjAuK$N`z6R@w!&lDGXj@IJG;KR=J)NoY(vzeWvz|Bxj*Ib|8LG7ey*BT_NRT#rv`pVQA?r8^l}7 zwh;(l<2xMsa){KuZGYjrQ7R6+YA25;_H%n%umNbD>*@vYT`Zz-0@z(p8dz&G!IYM84NU zX|Cb}Ub&&n+a?_ay&)5p{=bzd`?n5)ek|i_{y<3V!de=G?Cs1ew?OfKoxY zFr@z=_bfZ4A$EgE+@#TQ*OSip!_#Ai=Ca)!c-rJ1R~sI1I2 z605GrP7xQBsoy%#S7nI7v<1E_L#*V#a;h)C;*0>=jP(@yfjQ56b-qK?Kyh#f!4IHb zD3BKKhu3wy)B={H+x39YX%K|sh75^rtY=YzWA^^V6ce=;AH7LhfBRX$ z69K9zV4-5t4O%T=ma z3b{<$Fn2A<4>ydF|v9q3Yw^*%v@6zgx zdjE%6XqHx+Mv;HxH?O#iO`iHt1&U6ZQ%4cBpA@GU`|H{#wRMkSVM^yNd#nhgQEtC2 z4Kgg=(rJbW8pZ1Ml;?ywulZ*9yG`kghrq~p<-0HO935{|m=}1+IbFs&aAUtMyjZ8^ zw&#xlIUe|^1Z#{H;9@Jk0q3iK-NerfMNcz_*{*Sb9!w`$MP9i5C{V(#uw}RE{$ug&zdMz|G7y0 zm&pR#1>Of030?$h`hA!iQ<%?O2&25uJ160NspUfdb-aTwhSqsn)0vms>8_W>y62`% zb!cke8&E2LGrfSF2R+OW;+j?;ROWj){r-tey`1Ursx^6Kk>=G4ly=c}=-HNg_p%9H zJqEnwLEo%fxaEzOOqWY*CSI(z2%>HbLl9>-UoN3!a}j|8X<_%x_2)_+GG(j1YB8>w zK$TZy-Oi^!=7zEXb`NO9)h9?9)ox$+mebmjHIhyXj;t$Z>`u)9UWz9%FpMEsc+74> zcOLKZSzFOm!tSSC(emEX>ccu&g@{+Zd8{u#XqL#zd`|x?G5k8K&+}xjqKM98ud13| zd6J@x6RPm-jwpDwA;3yWmM_4`KMlfYR~67}I|qkRXZ-Db=7 zRR1`7E*CJ})qO6XB+hZH*KZ~}V)h+EeM3^tY04br z^f|b{jwr}c!X;7+iI1FxjVjCkJ)H-wC)$$AHF@o{i`@2cUfA@!Qar&{X%}IY~ za@x2gd51aJ@@FZ1Z26Sg;X%BQWUwAak{+`(_#-@~!*s?S7P0@!xz;Q$y4 zXHtz;BCwYaDbywgI8dan{~I25zYnHO^XdiQU2{f*9|N$)ks)fRT>UpYMOf0&-Pqpm zpdPQ2QPL&^=kCbghv*OiXAbU?A>_K(lP9ZTU?vJ!`D7D1J3;rCYbVCq2w-LpXyvC_ zCgexdj_kP2PnmJ3wg8b}aW@D78vR<;57-5RdO-%+?{s!)8W#HCew5DF2%tgI-^K_t zvk15?!z9}AY7ztHd8!T}$;Eb?X8c<Bh7!z(jY~*4=&*6+@LgqMgf*-iU8b8f;4sT3BM5qh@ z+o1C-TzDQd{$BzHE2-J<$KEr%X$O(f@re@M_8;;fHp(H+aYyJnca0U)HCP&AFK2i4%m(e(Oz+T6-u|gU80cSQTD6(Rx4Ky3F6`$V6q)hDkvMZZ z&nwg@WcGNKpw6E)&GuI2MS7=9I(P5}QxBnkxzSXeu*9JsfntbG2TnpK#=eV1{b@qj zY090ql}6xDCsE(Mor_K}Bh^5H*A2(Nn?ex82>3M})`!uE12N^wgb{R@|GZgFW# zW-(xW^`)bnT-JFw=QZya`N*X0I3tK36MlCs=diP`?$rjCC z$+hH#@+}29rZzla_MeM_P6Q_V_RI;ta(xPh6n=t&F8fwqU2Zo3UTbqi0(-6IUR_df zV~pb;fxCFVJ66ZTD3{O`r%b)j*E%q$JFqUOejAAaBe07fl-vk+O_CgAW}Yal;$gYG;bnS5FeE6`tpO*^(84bn#Vq@`Y8w0Euah8^g14^!%g#-osgqaCE3)bLI-X$}_31t`X4LGdZ-~#>a7iqjT znBcm*`-}H&_8!!HiK9L5;=XIKw&FGYeIU9|*v}l)>)rr&hkK7gPf9ZJvKUn)4eVuS zX>AVeb_Cp3Qv%D%ioSRCZBx9muVJhCwi6?68q{x*U6If6kbNHEdTR1H`r%-QC))aKKPNUt`Q@n% z_)}d^VzCn)-wJedmcTY)Gm`@5NjECO1KNvA)h;4vO2|_S_vJ1ewe|WQSO>x7P z)Y-2z^qCqY0QREQg<6ZWf z+|FR*m7*Cw)(SvhfAd^@`J(ge1bu*oU$i;5pS-irQ}>!7!;@&QNUwH43fv=9n`#H{ zrP=Ui>XQ4tAK4P|Ds2UK){v2z8p?#3`|XX}Gdklwm@T3PNUrh~7a)3a>KdKvAFO9s z8ibeE4dgOtW9MyyK}{uBO8n*(_9J)sb?gz+`{GgM;$zoX6#9|n?!}Zhfq%uXQglft zVb+y9eC~|56+G3qKLs29rXF~ouK#U{3+Q)kUChE2t992G_F8>wh{wmO zF5ShS7CWnLtPTvoruz|~-ZNsXXi&$=OfgkJ9V_Cun*BNWp7oS^i9~^K@Sn4@wgsYC zg9zJdBRYD12T*NFXQsDHEFvaf3q8%SojW zoO|+!htN+P1~a2;Y(I~Z34qvN@r<&ai)LKBowU%f8?mEK3%-1xhysl{A=FNZM@Os5Ge>bqwB%{F( zyg1q+p3ru!6ztXq7|p1t`&8|g>Pmdg8NLNTv9j>EcKTox3cUX+9PR?i0vf~dg%G79 z9ohffbjriK7aL+GNq03p;po*qz{#3}n$MK42w0%n@(OQ#Qy-!k3JWNwqj_wrM)}JG zJ}iuN=w(Twd366EbB`Z>T3-gm)qvx3uX^lBa57{!9FSHn>igPiZ0y2H)c%X^)dfS2AW3yBJn36-Gy+3g(I-ZhVuoD?h$+PYHw3!zLQ>Y zRPvaPd)FYH?04r=_1^ftxtr|+!Ij^e{%XcyRNt zVM#EjYv-dj$+Nip@rGYsVOEsqP(er!#drOsgt1bucnMD^1;{*CHP9%>=GL{QkQ&(` z@^!Mcf!huARW;1f2_cetwXN(^sV*QTnbct|KYWwn7%8A7CKCZ#=w~1W>i1?R6)qm81)`;^v!o z%W(CE-27eU@^(i7Dq*3}ticQl4?6C_Nx~9ohnDfB8^<}R=zCE%^z-2Ihratq(5d;| zB+aw3V%jT0Ps(^G{g7?N@h{czW_6j>Fw!K&c(JHhqUExFVR3O*&BMDFH`v8$yvd$F;1#wfDY@`?L9uJ;epsI90nl-$(ksAF_5_9_8R)7>7 zi8}6)etX{P$cwB>*xJab=gDVzsspyw(|ByV0aD{ zKD5`X2w<%tL=WU=sJd>_b`vMWTdnU7+}dC^%!7r_$wLY!bzSGIfyj8FYkqy}>$dKp zQUBbP{iFGEol=tlY{$0>MQ{3(Goa_5lZJ7dL$G0Jx2N)=CFgd0W%FQGvS{kjyq-vo z%$wts-$;HjNx70i()zIEpu}-M=TE)n-EWOgera;Hv~^0B(d%v*{S|(iok3Nl=RRu1 zY!aKDBn!i0qVj^tUmFbT4B(Fe1U%Y((>{ylX)AIBIE-!LpOk7sV6I zM5LUMyIVvREG&TC|1IAC-r#<99ahj*Mni9ab0)5tuw#v}z4JtS#5es@jPHR@HFoN%}_<(gZ={?u1 ztXaoyM+fvKEFIq z6?Y>v`3*=H8U?FZ__+AC-i$uB6t6z+i-`WX`Zax@nG*K=d+laFOiIX`r}ZlyJ@!+_ zM-|DDVhj_zai0GzimWcH~x?IA@fgG>xh`g z;RoOg)z`aEX0Dd56B1F`XOW$^9%IG9)D5hOiRwzTzmL9+q+mrxzQMwLec;&ZJV}cJ znn7-4JLP$YBWso7-=}rZUbwJ44|(A`Szh-y3?%0*a&vaLj9};4a@1|8m)9+e#4x9% zFkxDavjv;cPTkHCTlpQ~lw$U=yuopm=~?eSE_2nI{Y`7z=aA&mP#z;WJsqk^{P4r1 z-GuNWlHV|K8~qj0_#ahQJ?``j;x|{b^b|U6(Q;gwZ!p-ovXzA}m>GjUpGl!dV&^-U z_d5OfmL4`SV$nCkB4uKL#;%E)*Q-BQSY|5KO{}>4ocN6T-A=H!E4R9D@wBi4({l`E z+Bs+erG{St>rP+$^MblRI$F!?Yn9&%*-ERX-4?wg|6I$Bi0a{vA>EL7g)&RSm0SK0 zqn6w(Bi+T4LwrL^X83wMNWA&-!z3f`gGTyoA|0D4WMDYCkR1#r+)Qoo4 zT*x1~<3wJ0o2T8%a8S^uls`uCk6Js@Hgxmk#LcI{Mx)#mHfOK$eHIH8ybdHamLz;p7-AH4e^}G0B%wI8xxaG-Wzd@xwe)#J|Thl!Td# z7S7}5wH}+cC#vVw-PpM3RWy=9L-D_l*NLgH1CMg)<{0GtmE#KXbD0-^ z@q30nZs>N*%k&wELswrvArugE=Ver?o{D?F{eD-UGi`q|*qJqit-Wa6Z>2>>IL{!Z z$To%-!I+;xq1_=31#>W`v3%%ZOhq!8?fZY&ws<%f$U%!At+t5I%=s&T$BLuW@(ucn zlg)L3_v-6JKo&py0fSsRwVb`rbZHW9R-TS1=;qMP4|uS@ zPCzVkl1v_uz5P=)&~e`U)UEzGiUcHZ8_Cwb!!5K0zLf71hAZ4)tk~MHIX-ZV*d<+T zbbONAyldkTJAAd2A1;s2WFCerPfpuyEHGW{^`30A*U%^dQkU0<<6NZ}v`tps__c|t z!I#q^e&4-1%hIhR_>Bl~DDLMQ-@F9Hr4IwgHmNOxz-GYhhf71Jc3P3DL&So(VCRQ2 zFyOL&%g%XsKi-7!VoKiHHj|P3!xihyt9^BO*&ja!YIz=}4zM2Vc*y)v`!#qjqu(G% zsG{rtz{1&bG=xHzn1D38`f-g4L5lw_wmhJFb?SGU~3^RzCqqZC~r@>cp2fo)zv~UtbYP9 zxhiT=l{u?aXA_o)JzY0-;2JfvF zPuT0V-iJt$vqIf-st8Sj-M;qa5rhO7^1dgpFCoSp(6(qPk5{2u4#4un=I~1lXQ;vr z78kEI@jn+F#4(+-WbLxE&9NtZCKwx|U{yiZ!d8vm`qjv4*9Fw`ZCso(XyNrM!Z9h* z7{&&wNOHC@$C;=)l6s8F5ws}i>|e|ljshp^@8~k@&ZK3ph-3{yriY=_m5X1!szN^O z5o;*OR6XBSXnFSe;PQkBYI;9c9LeRmXmPF3y6yYj^hWNN)InQ@D<%#UQ$PmmI z>f-RnXvlyh9*BdJ9pr$qgYnxt4EWg<2B}4U9TQvmC;++1j@CxL)x|knuApJ4n_WzJ zHDv0rrchq%sbveS@{%V4a=4MNU8@uRtPJn&szCK)#3Y8oR9#avjzL=UP#W^sruH`}3WvEoOTaSk@_*({qBKz%2*R0}4 zFj9W*z_jml4ki$5mB@U)AlY%J%%HD;3-O@4fHd53^tRJ1_$=yUW!!}@xS$aFSIAbq zea4%Z`a+wmJo-mb61z`gl98wUyle_?tr?Fh<|~%W&y7EmT}z_2gN-aBei)^vydBXl zs{EW`j0WPe^|(SVa2XG%lW#rsJP|O?_DmD9h!cfSWvd)~_O^QF? zt#2??c5-#pd-cY@HWuD@0KKQ}bM5>07T&6<)9E31gU6WdI?nV11E_h*-2&;D#Wk8H#5zHQpepo z?UnAX6MzeuCtuu|hE)IoLHKBXNq+D1Cj0GS8{U&OaIEV}%rH#%{<8wLJf_t_Ws>z& zk{#$%zxs{~hvNR*&Mc2AguL{6)Fy}OpBeGHpJ^!OgF{4m;L4{;!i^+N#;nIstv&9W z9_hwviy+9@6JW?w+{L=5+7?*)w4k~tAoBOOD+BK0(hxy8Uu@jU zX=xqbrIh07k~&P8f9oKEHQ3OxEsJ9we@on?r|pV+cT8Nzw{UQCfu*XOe}^$TR^m-l zotdw7AA8n1qa*QMiJ&;vZA_Fl{=SeEBH3s|=X;&BYd?7gbkv*rxYfLUMNxhv#Cp-@ z@+jEOhV%iw|N3`}?kY_6wt=2WFCEr9^=G;9;()-pr3O zS?klBY+2iHHV~36a6{v!X$VBB3NHD@8Tvx$Gnf0)`N7o+4r)$Rt=sR&*z;(N&8T)3 z+f}w@{8DxH>#Z?S;8kC_rJSwdID>^ODM({sWs0<0nSAs%ghn4^f)OPmkr_=3$v}oV zrbv7_XziEQCkSq)Pbl7fg&?EN$ukIg_TNnw4bkuKh6b5w!H=aPaE7~u5Sy>#n=xW3 zmwn9|#jBF6WThW0Zn5X52`%FxRY)ARl<`Hn%u^EiC4Hn9-nLBJFPuxh~r_y$3EP^TvXs&mps?o1Q$W8JRjSvkU2pgxeC z%)hz?zh~1HT6`cu-0|Hl)MhUIH&wAG1uS-J43XwX0Zq7216qN*470O|PgRE&6*ATQ zk6q}NpI!?qTg@C1!vw{sjAcf{+>6+yp*+ewv}eHMmh#jr_QPJr+GAhcw3_H?)2y24 zlW@sX(8T{77L*LS7~FEgG8-kQu|nPc%B$e!DS6=E%Vu4Pk(F0yiW`&is!lPYIv*Xo zndZV61zpBfM&A9_H+SLNG8c2h9HHN<`Ku?LvL5S?_QCBHUlcY^AqUsg$JJ6yj37Fd zzV(I)s6pZ8>#)heQCrC~%Ho!!RqBfz@tDm-MtZL=UN|2d4wpPbTAC#Y-$rPyTPBLp zR2kOeL{IxH3$$m7v@y6;m8bW%*nPRTd3E=fbqjX&6W8ExvHuT26!t&04paI4fBbj; zc3JgrDl3642%S&*7$O@7&PGtXtH%q36$gup{X^K?q(jaUec$)fqk9v(eS2IPanP9R zLkT~tiC!zad)eg0A=TE#F*FfmNI~a9vL4VYc7Zr>E z;yUZ$frx|F?Pi7YZ+9;xl`$X%R^b3F+mpp%KDRkDm&Jqu z4vIVSgti@Kwl8+&V+3K?@ZT}fsSh(V%(DJ2e!2IVhf_nI6PMA0`blorCOKEHpjka7 z2U4;lx{Weg#+H``3{-lXy(dK0_&qA^_)G#DcKx_0a6Q)W`W%WMch1G<@)673A1%J*-Hh#s)Slv6Y zIWcN8ioMAH+Sax^Tegrt$)%AT+H27oAj?Dh$)Suh07`H$xNls#JT9m0td(qK+yQ}v z=*XUqJt<;+azN=Map_ofAoaVphWKSR!U-t_sn%jgTdvb}^6EZ~O=%qJL03i^H$XDNRkqFd)Ux^^v zaBJGAoW1mZW9Myu3sZoBEJ-5O=EY}q>UH`p0){9}=&bx0#9ykHhU+cQ>yj<`Wo>ZB zRf~|nwL-g^$Di@wJZT9loG?W=r#R|WzRf+`v)*ib1l4hh2qHAkv{wQcJ+=W7m+y_M z$ddKjR>eKaQ&{j{x=6qtD1d#XD>d(+(pmx&MV0|-%o^;C*Z-X}4`# zGR3p^=`lsIi(pH>62CWdXmo~C(j8f)AKVA)a?>ua=F-<57C9COC_t9-@x@|L!K-LbK2-wsb+r_uUN5#Vfv<*Y!M067V@u2oT^wr{~9?FYCmDAL5_shVv!q_9>QaS z)Z1bV_>1oYZt1hR)Q%y^%ar?JM!TjHx%WhZ>Jrh&~S@%ZHwDx;S{eS zY->38F?NsQe0y{u8F83!_{Bl`F7CYRgOMDneYD7$D_xtpvZRy>{?4(mMLW*Dm$TqY z-vhe~j^CiP27;8@n>pM;X#S(f2cD?<9#C!ss+c3sGGVWbTrq!L5=DBhx1nyP~_EW(7Dj9xG@tz&rz> zdHVTX1D{m|-14^kit%4VS(a7sCtxk$&e3e^OUqkc^6^nF#_A@OpJz;vi#aeF(EU(hH;*&y7g=p7Aj^P_a`qia;ib}u_D z{mpioQp@EhxGzbk8(GCT;?3#|hRR)F9P_ z!O$Rr|5M~)L?FT0zoBnzGCoC?T|uCn3?1k3%aK6C%lw|=Q1$ijA_>zwylVAe_K7?6 zit!HwnOwzu{A^mOX}5fQ!(lCGB3_ZJ!fGv{E4i5mKj+4XNEI#A@ZT-a1$U>$sH+7y zO}dn5x~m&Ys1V*bL3EZ<W`FGiMdFy875`{_ro(E;q;C=IMDs&NA8Po~v4+c*M?adN z>lwf^gcSD=I#vrS*WM5R=U%sz^wu$JaXWaW|@-uSs3)DL1sPP@BrItrO>NKk-hV!MW6ZxOaZ z5N-4xU>Nks^v~x6fAXM`)oE?P{6L0|!FPvtPqBBYwEmf3ZnPmScVDRBIhMIl~qNQ`1YI(}Z;b(K|Zvu%kLNB4H- zZ=>}&k4%W^6C=Us=K(vNtcp*2f@#y`Vx3af%53`cA2X~)xUuQ5f1j6%6}zBOBI(v2 z-cbHTsa_LUY<=lj;}}kycDZuy^L8+4Vy{*%v?Xl$dlPfM!!Wyi=r2avy=R-mXjspM z3K_=$=rK3v(So`EYy#Q%KW9v$9ZTmb4M*ofy#Vu+-p}&`Xf`^f^aJ(ohwO0BQ)T(# zQ(5-|4oEfs5e|_x&$;7C?){6&frZ_M(0YoFjaQ&oZjdc~bG*>woN$paMAA;-g=X4 zNIXPNJ@)Obaozi}mjkv!>=ECjsr1D}h zAWie8cE76`95YbuJztO`V3@)hl%b{;;{2y05-7Ddf4WM*7;rQ!A%z52=?tNR{>K5; zeahis@Hjy>A1WN+YM9?!hgGE_LxvT5P) z*6OBLVDDKzmL}-OV4O>iNRzPcnBZ`>WT!CG5y}0^D-`~~8Y&^`nb*O!GdZt#mJ27f zYQ6_O-XzurbTrLE9y7%`cHlGbrniwgI#Q|cmP2S2@Q_-{U1JD{7KQo|TfCk-)*V*rP-Kh&U$=0rZS)#h^{9|>kVpADJd?lCv zCPl*D)}7%1noOchQ$FFJ zppr_m9`h_S(Rm9d^{lI&W@_`3UAgV*z6U8!WrXkOp7%(|q>lnJf0wB<^X)B4^{*dS zkq#-%Vg2~j?4(X)w#)+7F9x%fR()0$Gn`E-e^bxBWZHP`3UGXR;gt5$MlFC6M~k}5 zj(e#yLWex!i?h)FKPfAIV^3IX-=|tOu;I#NAzC2)MD^$#&4#5yqKGQ8(cX$Da5T5U z+RlFZE2`tw5HhecF8z%e-~GnpYKnI zqzsfjJ}1Ba&G3u&8EO3d?Fo#{Gn(8k(_ADPjotLwh+y~%Lyma7oU{;`sf20+{Pa{h z<~ZX-5~oe;JK(IV4i%M-IPpvGXnD{;+fO;&op@8Pm~OWy{w75`npK7e&HvX{p~^ zoGSIOe$+$JbuCo!QnUN%XJ;(^K8ytrkrzE(a-H3WwMX9fiEEL6Ca&?qB~>yABN__- z1%k#7in2i@W&%#_KkE9+wfsP9(;7{;<7XmP+Kc|?{X)uLhbW_Tgx2coZ-M&Jv}KL) z?Oz}M^kEW>a*Og_eCc>-xvLxYc8P8F=Q>d$3l?(RziY) zfwGT_GhgW&(@m=a2!67{g;8Ziu?&>To@b3W<((RPnx}kC3()uZ{0nE1 zk%tORz07RqR*dB-Hj+>0Fc4C1Ujz1qR038mUr!DMsc#!5$v@!`Nk*0je2f+xFCQmJ z-v0TuqFO{r$P*9qJO&MKTsC;_LywP21^?u+Eu3p~8z05TJzoWXewqs7=E!B{n|~0xmwCp; z&23C5Se9`01wMrJ6wY}+gGo2HC|A%nI}u8^X$uMaBZ~vaHe{V|B7NJ3sn|C+`}+a^ z?LS6+zZPD76V=+8$D^h z@&&qMb{LJM3pHLE;vk~^uI`dfvFCZHbD^5~Eq6;6<_H}x_4c%_H|qkcDG$K5uyL>D zmt*!QKZB0Q8_-xxiN3KxN{{O33Dw`z>SZnwZUE#ivbWOE+{FUkDXq01klG}-vPY}U zJ8K~3S{jSk1kt^H4jrU*ZJF#_g^z0rxMhp|Y~rJpv{5bh*MI>;R}D*R%dz@vr2sfo zR=>#Z%pY5VG2WvUH-hLRIMQs%E_0k(w&rYd|KIY*m0Gg7v&CZv*PQ{deyBNKQ!{!- z?)+y58n!l)fp$S7o7hk;(%eSE-Uo=5Rfe3F&?7@^9nJx;S*!p=O%aeF3cqAusH4Fn z)@A=@_IS7oAlwjJ$4)ee+LJKArd%X1dkcgYqqYG)sn*8;+-VU8zEFV!sCq-DtrVb@Znd%*&%@4{lo*%VXX?m^yB+{ zh$Olc668QH1Og$12^!M?h8O3%mF18_+I(|mG!3YV#DzoV)w4Ruz`(*UDaysxiGr-+yAKO+QFtpwUDqu`?H|O= zxBn?Uh+ngTl2*uige*!}(*FUaPF>@I{>@J2x4!rRB9v<3ix*?iGT+?Z>~c)ce3E<2 zy`2@}m2uJ(Z$sJN*&QpN$aO?}8NV_Mcgy>xGq|+6pCcoMu>reKB>G@5@Py#c z9~CE-#`c)-_dm`t-@A-nGG`S3sCC3tqZa4iRAY0NOcFw$3)a!mTCA$}u*071#rKeS zQQSSSi(bcJN8M}XRhuD9q^+j>h|}AP{0a+g)_VksyJv6YN7fn4FLhXXD!FihXd-@8 zRl*jb0!K3s`WqqUjC2$cKJIHCa$NMBc?2q5qo6)?i|bCe*)qZX-8#PQ$7d7u1!~?` znT;zvE($su$zP{2nGBd+HW)8vaV_6}r@&uY_96oc8%TFa;n@$kP$$Pij;@c%^ay6; z3(N?CFic4|P{XFG(PR-VmG3sz9ZD~me1l{O>~j0MOIurbbDuvF1Zqmdkwv*sVa+EyuRR#cVndS(9krG1 zZZ5C0YqFFX-ToryhAjU>2EK=!CUxsNL1fu&8G(D@NKF977HYt$S67F>xYhhb(&{7g z`Qu=(7E{x)PV19SYlHY5hq$LAmtNoX zw#kPMU1pAxW6@Rh8?Wfp#LT_~fcx|p4CDM2FXSKX zBYG_(=DKV=a<+lXp$>iq|7;DY)u^uR*#2*;zKoo_42%HbDlRbJ#-n5 zeoZ(n%H1uj->{29vcLN;tBEQ0M}hI)MYnq3cKe7So*jPjA;`|Jo_0V$Xd?XKgS-S% zwE5l-lYjT~;ZXIDX9Ay}JEQV430m&$n=igs*({&fpP6|W^j4hqpY1!q63l0@^~s@r zdAs++lXI6w95v9D2ZXrHzA4q|N`3v)kO<_^D7rW6QP=kLlgtvFU8t!#uj?lDDjqE` zQI)cW9ZVeL+p=0?EVRc~^E|1P^iG{ha6a7kIlBMZ-o7KrzuT9){1TDvXnaEZYE&mH z)M4yTBT6n4E~zxHmUK91emxAd`N@Bytz+o*qm|>h_a0n9W|Uex`i$eFHn)E>bolpd zXKRAm-N-rV5PJCalt2(};8XJ6b~1-Os{NKf%=UHb3nnpnYW%vdH0n^riBGRex9Gl- zwhIn}@GjOrzLb;96B`E27jJ>Q+wxDidb{O3;VEBSCE?~6tT5J>3TEBIz?1At68Q0i zTon5s_Nf^aLafYUBP#nr9x&GBaLAkPVj_g<$8zZU84)nE znNJ9mbq3a#ZXqq+7~}WtVdWtZ<9;`hAufFNMX~W6&hRyz#X)R}QR=$mN8xkHK z1DChQwsThTCX9aZc8G5f4*nSRMpSwRDzQ1$qOCkm&S1 zFa3W*xPT2?(CbFzItaNFLMvnkC;8l`y^L=iZL`oC4^>C))mzLfMSG$A&B9A6yJYzM zR`CvPo9Zn^*?brMf^iAjm33#r@j7uld(L^!dvAaZda_Zd(jQQI}@||Jj=l5o-8^)&S&k}nRW-H7Gfga>fq@s^3-v4S$w5?L` zGI`%#tE`~uf98{XnmIbyYU*L2_p1YYqPMc!Z{^8jT2m_a=W37(iteVq441(oK4Z(s z-=AG>w;X5>3iV0(Yb2PoLhCZ}sYW%-x$(gjVq)DhURW`5c~ao`=3bSD>1gp!i)qox zh_}K|p&vO9QmIL6Nz!Dn;`a7a?#v$@9wS zO-_a{r$fF6cTP2l#5Op&7W+S_i+3!J80-xaFi@{RL1?cUbGFDLp$Z<=M!uG4k$i^) zGT*|gkdhk<8TPo#grK}|O5=e?957{(?K*f^{mkE3XD)(IUZ`uqhf%*gcH#l9!~jbj z3W9T@;n-Rh6Nc5fK?V<{cY|M9LZ?`v`46-y!c^Bhh;3m}oN$Pd+-vTW2uJrP|D#6r zi-@z;B1-YVJ8k4j$Yov5`SJG9`wI!%JEp=fUr(zAiuTZQ-SP92B*lX5Gwv#5HFtWS zbXeqluvM?N^s)#s^q&`YIf$Ml3e@#K<2m_M^T++$;mjl(yN-NDdLCoWw!(d_&veDe zfdKabpVL}xF|~R#qq^G)xf6TbM`OizKClf6m?dpVO7QnYuRK};j43gTVarq&@+7?5 zmFC*F{zUp@7{azg06C1Ht8|?SHRz%^BcM!zW`i;_qqFcyU9o$!X z=flAm(A%$$Sd3%^4m4Y8B0=*_EjsZ(d1#2wtzA$bE2qSy1f$}!8$fsW<>gaSeKwR& zcG(Qhffu`w%fBs@9n0!Td}plGkw=Qvb|U81dqV~`H8*73Bj@c#9r2Ti)v36W+#I39 zG=gHt0E?PEl->Y!L!MW=D=I89`7I1|)cY#Clz8IDq29<2n4Ry5_Hg)le`yLWIrlIk z(W;8o8T10o7$ca{o$9JZX&O_?6*cP0Uz}4Hu)A`-~(z}|GhP_0pT|j$wviNuJq1X8DAyjmyg})Al;67eC8|y>3N3HwKgbcZ`z3i@Xr>> zDBhK2FqM2ly_Yxm61*I{Bl}qpfQ(#A4g_2=?w9emy zlMiQGj-i8mbiPgZYgu3UK!HC=wRs)qusTJOd%~U86KT~yWQc49g*@(NHnugHojM|{ z+JwCoAgmYZ_e^*B!$Wrhf*Rd-7;Z3`*P_Z^y<%eC^Jy}BzPA}N8nrQshr!Yr(*WIe zc4@)&4@M1flDhqH#&1(`V>S9p5v#N;%m-rgx{kJjD$) zx_y}U_0Fm=AHle)N3A(L3Jwcw{MA;}DdDmD<~x|1K}BT3!m`PuwE`!$ESDf{_Oh7_ z#5G7A2pWcr_5ah@OYT`~JT8|OWZEaOXZ$Fx$XZFjFZgY|>Y$lda*lt16u`>b%71~t zxByp}x)*Fvbl0NAUnE!#Vh1IP2HF;F<#R+qvbOVW;vvf+03Tmb8075!sxl!XD0Bk_ zfz$0WJ+f}Nbk?0lyVQ|oW0awSAb~D1VFnz|bx{kf0p|^sEX4ncNYUvj)!zlf?_hKYUYx@94dsw{HaIyf5 zooah2uqgm7`mNC~`LxDD>VMGupZ-tc4}S5)dZtVddX zPu8%E_~SLt{4K)LN#&64oBSW)wy|38dld8n+0TejIQyZu&XC(cp#vtpPwo~@S09BR z2K3&8HHM>21_uo(&A=q|Pn%bEY3dHBFQqtT#}{d^YE7GYj!aDb&~(h_1)XBP1bWfQ z`3uVyY5ZIIaUq$N6jmH<+V2h9xp4HWRil?(d1kp=ZC)o-HeotPo_&hPzm-jbymoR+ z9%B0=w&+NSj1>M1>7yTjk0h--Sj#4?1Jre>fU9{Sc(wUhg#y=Q4U1{qKdudR??*LQ4bFHq`8si;X;LY;U8$h zg~t{=gmAkLu)Zu30}~HwAJ#!o8@3&SQoSg3PoqMCFZ}^5|}7`i}0H&*Z{Zj@2Ekic;Q#C5Hg%Rh)Kte zaA2c(7!-_;EH*0_>b!8lPOk61aIN0%;6pLE))#~KZWw??HTO8xmb+AYKQJ5*PAC+9 zx?lwtWXu1cj(4ek?pjHNWg6*n(fb>U8^w7j{DD2jFBV0 zBsGL%lI<#0)UBj_@1RxGS7rRCxD{Fl%(g^KU!UT+xGK_E$Frk`Hm0q0@X^kg#v0#z zc-x~eGZRcf7|8g;R!S4?V>I4Hc{_?n+*_rVFN?_e!#)4}Pd!|sG5m?4X8ew&B_pUSCZd|pv`#uIDjES4< z_!VzPgeGg5v``T27ZG@z9~f|-CQ$nzPlH{f^!qQ=sg?8xuA%zHIz47SQQRL=^9x$b zG{K@-n-xj4&c?3M#W(Zu(Rw9Ko4RV(J%%yE5=jqVUT$HpUX^4!p9I4!rh#pidyQaM zD*%K)3|o4!5JxB6RkPz3V&O{D5UQI6H|`Sxt1neak!h|-z47$HeQI1XjCm{twh7$i zWlQle&J>uqSa?=GU%%i=ApcrXqHOu$?fPs*r^(e{#art+F@u0N_{FP)4+jB(NbWZr zcX8xEw`c0vlckut8xD3G&B`f3-qRh_a3 zLhG98y+5(^9H?Yj9Uiw#ttsK`lGX}Si-Iu?T79sY7*8h6*-5ssTPz=N^Rw8r>8`0W z;}BtIuC$9sZ~voiqkF9iTgZ#`1o~e{?fjAojMI2-YrnVlP1Vvr*|H+%QL zJ`Hs0al|$ zI*XHZ`D&Udft=sV(1Y8#qrsF@+8Dnw z$t=BZR4#57%HeVJ`JC%VbDq9jq;#fcBL0T{(=uAR;P4sI{)(^fsK}&*!2WgF+p!z% zz(36zK4cAeTSJT^v|JmelDu#_TtLK84o+A1(lb&L<8_fVc_uE+Ou4DU>%@x$EsKpP zhk%hP-EdyBcH5g#nA2KjL^wnw4)S3arf<9f<}zEHl`&?_+NOiiZ6niQ^INv*j-UHl z+egPE!OT9=cL9Hj;RdGrNMID;{L#NA2q@9T#Wl|rXOriHn7&ndkIW7PBRS)j0 z?zen;B@^JKe@j7^|xk@2&*1WgkQ|A~Q|QY^C0` zpsY~))VpZB)~N0f9{V(XgpRLJossS1f<-0g$Ln2JbMnJB^dC`)sZ6zBg)lIZO?K?aO;fwRb1?UtBT)7W) z6Tce``P+YS%MYK``!93s<760Qwp$zCVchCIZ*2k3RzpX^7vzwZx5?HdubMLljW-yQ z@z@5_eWKaUM~bCqVdZ$Rax$cqIQRv^77v*8n+Q{t73+b7MD|+nA`D;@fM-7wUh)Ukco6-UA^c#F_9MdFW4q488Dgm}gr4Y%cF10_?%w z#CQGLJM3S*nvzlQ&&D*Bz?fWleU_SK?xuEAY<1fW5;1|Vovz=XX#V&rF*M*QzJ&Nl z28F&XY4(=xcWGc}dJO820scOJ&>NE}$l}egSDppckw%lZi`ZRd4Zi^$KQ_2{f6O~< zOyz3)yNY9=$u{tXU)klhE*_<{K8Rl`4k;>^?#G7THK!e3xlf77?a$+x+fwrxo~GS2 zO@w;?!S8;gT0gj1NssF!XoyRBE$rZml}u&{#Z{19g1O*o@|{g6aSsM!KkA~Jj}-i7 zPN7m6<{W{afPtw3ydpK5cP?E@pQ_VDGuDAPNZkigfW_XyI-XnC;xn!@)!#)MER_f3 zYYl=-xtpluT5Zaj8+gQ_yVYw{dY<26co@+YeHO>N`UD&mt`ap-ZZ%7Al|vgw6yfLs zX;qVNJz-f7!0K%Pkl!Dv7V7q^*D_7MO1S-dg9*<+9*$HO+JB!hw{~?#p8)8B@_MHN z_+g9A)BpDaO%rY=4Q}13mh3JGxHfgU=!;5jF0~#IJ3L?&E9Gxov^g9Qh=eVs?Y8d7 z|0cm2>TD0FI1(bzNKoneagKVsa!4fI5&VjVm|vb9^6vrESub z=DC=?H!-5-8XiD#<<8oqDmTMpW~uq@ogV=`rMlWq$b~2tbM`2S$=*{xeX`DMSe?d- z7K9F)sO{DvZW){mTTjdOKXO`@el|n(bfei~p`%S+Jb(WwyimWQW1Wwn*G!1n4n)}= zz2k|e_HAbGR<6;%|Bj+BM4U_G2B0H-!n(?@{^Gj%5wb)Z%<%qiD`NY-P&pNzQIiC& z%y<|?0InsAuXmtdaMgkVye!Bb69D5P?*T&)D)8xolL`uHhz33;9`|-Xslo2hBAR_| zcvH_?I>0w8E}k2!1Ee83QWg~m|UwS|@HA7C`8N_B*@5U8_YMFzyQM|q0; zf{6d`QYH7*DVD|mto(fo+>hSzaCTpYbc9c!{Pip!x=x(Q=9`czmLLv~6C1x4F>W(a zi~anv=3S@-^FRo1o0iJnt}9S|XeQ*wqCJ%N zbT`XnPB6pwLC}ddKh{wX^qm5A6R+UV5q&{ir$KR;Gylquo`}v&7)2{HZzF9xS*w8VC zMD@D4E=u>3|6nR7lBzt|-MMLvL>!@u4LE5(e3{|1 z6aY~=(sbHj7#Uu{S$?5Tb)hcJ)88%7PWK#1cGQ0@ptp=7C_)D`kpX((a##k}-`DsJ z&hbP_3N_XZ5{QWu_v7E}S${|px|IZzH*k3T8SK*6-xDv6^PBw~+vwV{HK+a5Zjn%v zo9-g)ibv$;NsXX$h0b2so8%!cTtuIoA zEGP-ywLO2{WmwlQX9}b&e`~WZfb-gN)VHKhgtTlx&;iOx!W4Xvbem^APeyCmJ24er zCThkgQW$UP;L_tAu&@poUG|p8nfagaZUl++6(Tg7$@O!0D;ix)#{R~B=7-*j zdy06ogDBIOjnjKu=IU&xY+S#i>PEQY91kM5o>U_D|2Q{4{eD8KZ~{%jF9Y@OOcLEq zk5dUgqW|{5>_M_yX=W)?XEtB_e{8*FP@4_Zc8g1KDDK6jxLcr5C|-({;#R!4OK^90 zE!N`h?(XgscMlMfljnP9-tWwr^M{$t@Gmp>oxS(E)^%+-`R(Fcu-7~fR~k-=hnrg_@O46!zhVVgyU!q}W2o*0)P}@{lgW{3WTtAcN#ECjuZ%I3$Dqo?X z;^bIh814MZgunSnf52@=$nG*`qN680*y>u_l*@x zkCj!2uc1>K)u+`{NtTg_5mWxf1PYurV|JYHdC?}~zHZ@ra#6jz_Bg$%HHIUo5dW6Q zn`|@K(7^zPe&hrS>%?L&Hl?Avv58Ii6HcTSAID=Qy37*Y(9LWKD{D;_C#FkN%@ zsN)+N#W=SJrdL82>u6}Mr=`Kv*!A2sLx~iOpE2T4uf%?hA%Y8|ImwdhrZQZnhTc&! ziJ|>{8p+%>BxkNkVXrzB7<>W#BYbhtgR%6QK_je)DN`m02EG@?NrrK)Z&Yt||A+a4 z{lS6zf4vUwEwl7GdA$9EI^>4s$Q1=vPrp}@nUCHSLvOMYv`>vO+o4Z161*TfOy3Xfr@6hg%zo}~xpd!248QfgGtZz4 z(8onQ`k-bj>t>;ETk$A3^=0!qguwG!EkrPEGfP)2Iq~P^O(V|Afb#d$OToAb_Tui7 z?nV0Sm~(8RO-$)Tv0szr0fvEU!Yhmpk^BP(F^tk-N)%2Bdk*-nGXlumrSV5=;K3cx z2-P1(XP2@2SO&mX$=U?E?3CSs+3lv^dmRB2;##h2=1fX%V6^j-+qg4|1KZPg21?i+ znO(I2^ryszeqN9)1^SY5Xq8ccY^@HJ>#{%qA0UeopQ|>bKDoCRsSYb@F59ooDlZ1r z*@`qM7M@pi&lMdq>N-O-n1wm$n4ui+t3MzhME)9}h#tm7DWZENT1 z3Rd4O*z4ZTZVLof+xK=a^{)}$Il-!|^Eg7F3@@yZN)+Y;Apqtb`M? zR3eZ?T+l5hm^|0wKX$n>d5uR-h>3|kHSZ>_gP@3(OE{cY^ZKf|NhETBrFIe|sHfHo zVEM(TKLmth)okB`ZMe;%z8OCi#ko?UUvFrfnI4>Rd#c48tLJ$Hz~+h<+*!J~ulLoZ z<;)lHKeIT#{YYYbFn*A7m*i$K2u^$WJ4QGuk1}mR_)!VL#8k%EnCDA$zsp~|s~~vzAvOqLXwqUi5dPYg zfZn4Vn(_|`Vv%)m>T5TA{JDZI>Jj>=ZI}=6zBJ&>4~QB2Y}U@bab5X_AKQv#GukLN z!juu;I%)QEhOu7C*g2eMx_a9?>DLF!ZmsK9SU~243$rqvN*@oFl&eQq2sj?^er)_8 z*B+?+pfB{fn-9pJC=L;ImE#)QA!Wo9*-Wbx2S||@stD@eijnYd4eU+p$KrKAiVLWW zb9?6|`UY9NWruW5*S)$WPz(zp_(oWi@Ro|UK1h5=@kC#Q0FFFmvvLXD6E(&b$;$^) zQpA=<2!jw<F%eL z{!qihI8|*l7K)=CTM^yb(#Qfk1K&7jU|iRaAre|=tm8#e7b7+FESLfB^_Cbq;zX9* z!gxU-K(O|wzk3J7vTvxe1Be+)SYLK2gM{Q<^YX{v9kt)`zg)#Uk5Z%a=nQKzQ zKZd6d)ACzWKW%R5+c?SBwdC@Bn=*`6CA+wqMYYf`q~L`Q!fC7cA1+D5u$E}UicMAb zl;zX}E)74kOO$J*Ep%PwwK-UlWCOE4Re z?hPkxdoVNzPP%>)>Q9Q7{*sRqf(pvpD1Rh8q3NGhLOSem9ua3-7oCEyM+J0 zZwZ%dz0JJbx7#1t=823uq{kEkCiOa5m05H%g8%SUa!7IHYJNWp1SEwOpG&4W;Db=C zvs%`NezeyY!j93(zyYh>G0^_rnnT!y(YT8@M{t%{e0Mt1QOD=2IE;Ht6|{q_{YqD@ znqP-@R>bxs3(^ziwC1$=!t_2Lx@%6eT0gga#&yTZ*b!HK{Shi#JE?t20-tmJB2db3 z_zUbTq}dVRZ4pA{r7*=2(+fgIxhs8HHj&I-5;&hyXo?Z0SRY(VllrmX1dP@dbp3NpPF9Qa3`f^d@aZ-K8M@cMTz$zI16eHVJbImA^|}u8yqOjU>?PMWWh% zAx2lJw`gQQArCeqLm-s&jNy4gGq&i-Uq<0-IITV1cQ81%2m(mrIZN0#P3%a=@)~m1<*3By^n2LS z6+ciA`nu^FeQrzbAreFWJ(kTDA@SKka;!4H57OUrGS1KzJgX>(anih0PgnoBD9 zba729?vcg>*UxGd?BCyCABw*P+hl<1@o&jvTp@bn@``V}t=hvrr7MwqvYmWlAAkSM&`h(=~M%E6I6= zI0mF3UqbZcm)Az1^(Q=i2}~!B#?1O>~xW zA=u-~Pjy@A8XO!^{d}<|her;kv^8yByHfclpvWeJXD5f(_b|Xz!AU?H%q-c8np%~V z3!c#ZI}La?rDi&F&he?|s@g1=t$*mo(7rnSXHnx}Lf$@WUH@hPzDdp7!x;Jp65x9< zEt$MB=gRl{&OY5wt9lgUuy2cGBA8foy^D*8X`bTjJ}#~oNB#$AwWi7@(7wWO%-wmU zrda3gDXBte$TBq#dnF!S4<{Ny_vJXAz81^=-R`{r;T;r}AX7N$C4X^yN=VBFVvT+&btnytcB=<67l_*5^v=F><5kqsAWOv%*+g31GhcbpeNJ7xgO?GVr1)SE#vo zQoWpX=b?4#pwM{LGbA@v_q=6?xtT>BP)DBS;gBN=W@><~g>O^?RLM0e|C5C1g_bj2 z=Y?g8kV=Brr+IJkkOqWC9sk=fH@`CM4kG;*G-1h*D(&x%N%%*06K6A(E3qp1!4T(` zL2jVCsT8R5nTxi4LI;`_4JCRo35QN(eLv864EsM|FR{SXU3Swh;QTefJHfsecnFxv^QcaPW|4rHZN?QJ3zN&N` z^<}-`mM~+V{vxK?z;t`XmMzNeWouH`(MgqEqE(RkyGNZZkBy47t6v!^eo5laqVXpA z-!Lwht7?1fTlr=XBU4_62tkDECr(wT`LB;pjS)2s&o_zoHRD}%g9%X=F%}yuO9~=> z8FIk0l7AzBG2}3G;%)T!G1Yg$;jyu9?w=G46wEuE zEfCTBX^~g?jg>KGkBWlE%QDj|iP9b0JPqf`7&yY;_Ja8Q3FihD@AawDBuyki}twbHbl zrsrYYuIOpHrumA^b1w9?l#iHHFnaN^{H1J4Ws&g7BFLHd+TI1GpYp|nf!d|8gF^hr zoG9QBatswTy?ch`zlfplpzbaZ9ju;8sZR;@%MU|k%?NgpOMLMV_}M4of0P2mx4hdrnFgf~4F=FW)-n zFHaRbFZqQZCwEAB@oNLd1_3(97uXSJtcmo6?Grrr2vf83w#TlIh~ z&}0LOdIPf4fLJ&)BR%Ou0Xt$3#``z#v#jMURahQwsOv-j8UQJ{Ld#eh`FeqxImw*v zF{`?pz?q-*!t_%W7HN!ehE>O7d>GsaYbKyJrNl_a_Br5yK!?ZI$@=q%I{$qLc)Ft;yVV zBm7$mCp@FSk`K6o68+dlceXAF;bWO`ia(I~J~Vd|A`FRDTXPgl*48$dU8PU%Q`f{3=ofyLy7xl>dZ}k3Q z+d!0t_nSZl!=Qx6SvT~d#!(Mh`&>rY5+K8V61V2%U0j^L4p7BF#`lVNAUypiPP zw%tLK>th!CuAYor1^1kBf%v0Cq-MMweH2-`1aFT6bxX-g<<8Fa+YhS|IF;(JxBd+; zQGSiRKHFbW%>IqD%Iw5-3TZ`qFO3X48)w|sNty~RK}T*EQD&t&g4uD*(P->;d#s7t z%+hCw83!$={_We4MzIdO(7^_;+cYCBAN;jyXg~()mJ~@~fWu75$IyO<`6cF+fvW=} zH_!o^{2N8D$H)>s`^T|w#aA3&X*5F&9${k*CNxXhy$NltwI9M%)t8~7;PsYB zf&VzFyG+%nGgH3dZW@TXH_4C}_zo9}aMK}UzQWIMuae&b{Lx(BhCewF#yBF$6Ih^}sB8eE_Qm8VBsekNq9B?fh zSc&ARccdkWiUQKM(t8KHc1)LT2Xn^!#zYwekX4CQG=!}FJFERGSz^M#7Nwk#V7wft zP(_(dYQ`MY5HO)^q|Mqfuv4^XW9i{jWoZ~Ax`u+N0bI`JplF6vmGre)0rdH0SS zUV&wN4=ocFj96?}pOs%w2l`_(e&3vdN8PBSei6DDp9mjoJ1PYI;L9ADuc=14BOf<< z5iFkGze!#?;NR_h1YUi#cb%KuSIVg;%W=FOB0B9}u_o|z2JNC^hTk&MI>lk?z9kxl z=P*TZDNdehMtDyX5wqCZNeQ-{mHfO8Vejpt#@vwnXezJRdptm^Z`Lv6{Qgip?pF9z z_Iou&Y7Qd^g{T^FBZ^pgko#YqeRT;xXR;T_Y-h*PR{9c)anGQhUhWHO`;MjsxCb{Y zz2OZ^R=$ZxvBI?}tJ6{+<}itz^XH=3!;{wiQJQ}5!Re3=C~J{=Gk0qtmrEHrvSQsK zpZAdzcn)!U`r?=<*jzn`l!s|Z%<`p~aZ=^H$_I}Fm)G|khp!FK%HJ)oEV`Tg;c}jdHgT2x)wu|8PmQR*c_L0>n9@x-lYwz?7#@d| z7_+Hjh@2Iz5>l=+b(p8WAa6Md89Bp*lB{m+U6#NP*YBhb=(cW6@v8LLp+Sax3kQ#| z&T%w7ltI0c7*{Zm$Ie!zVJ;OY{7*#tFgwmLL|}+uq+ZXiHKrDOML2R?!ps8t5}MaA z5?ZmF-;+62HP|!1b98vk52Ca4D{>sYacWa5r?#b3^g4O=zQ3sMjCW`psG6N$^tWo~ zlwDnRtSDL|FI=i8PkJv(l4Wv zev@Sc!PZKPVi4n=ZnNljfhG8GlhleFY^X%*->Qt;&vCG9C-sIxaxk!3^)h*Iryh&K zmDv4AaaFfVR5XT;kfHGjs~sG1V@51J0-Y<)C;!k7+&__Fo{e@1iJn6D*OrAzQs$td z&L@%6eCq(Od(rC^ zdI;(?q??Ta8%_)@L4JZ;;WR2?=*8%vhg*&k$d_aDDD%$==J@rXgo+;VkU`bGw#>!f zeR>t+wK+Sy^eTI-{o<4Hsh9+k;vs}>ajbMsI=Bq_I#4diA(WdE>Cxke8cW>=4G(*g zPD9#@AXP}#T{Zh|E&BG+jaoSTv={Ebp@c&>> z)KIj0$auG9d9)A~4Hw-v!8S5^{=rci5S`;X3x$=lL6erhA#r%j$j<3Ry!9E=xbA~* z{@CVkO;p-P9%`e-c=k3@an?2Vcpd^&IEul?I(ikKhf0bt>Nb`Vi=U1hHLpL{nUyd0 z$taxS3-oNoO+0gh;o2io(ir_VG^W(B)<-BxGIz0{6k#SU8rp+lZ11MzDtM`}d2oXu z_kJk$~FkWjxZ1+Zu!o5*E%{tS@9pGq68B7b2#zJRn0^7V)^S_I)-hsU) z_|F1?te_)oXyTwX$Ue*k1w?G7dmlyP5AT*r4k1ut1PwQs1d$wZCM}k4rg3xbnm4lV-<0}m@19x~SB3ZD?}Ntvfd5d}zr$wh5AqJ`4wihQ#remn zl|H_b#|T+B2ry9;u6EvE3|KRpw1T3N>q#-rKoK!8-gY|Oj~Bf;XUR5~R}BmQClu)R z0yq1=slc#LFn`zGqo^Ee^W^F}(#+wwB0cxf4E|37tta+Ip;bKiu6I9tBwjT49f$&< zay`U9k2r*$zkQkO!%IG?|8_6Pk~eOfC%P0Ve4 z3>^ei;bsLUIj?36PabmQ4HmGxchYDr6(mpj^Zd_n`x^1Ul4=zG6d&&ted<$!KQFFK z?{1nQLf@{Y%o)=?I zF&%$vMQ)JNw^IC3(JHI<$=f~W3c#o~LA5+Yk_bpvC{aiRBsgCRWtrbs^ONq>c z@OyK-5w;I~;!K<@JAhM74`-F&GH=JsN^e4)A!2SN>W%2H9Yke@TzurqXR0GTl;OP@ z>oTuv$R?a%n*_QY>ZR!{^(0un1|6DfbDeZ;IC>5I0(wdftZN;qD;n_&1kRi4V$}MX zQ2wWFQ@)8?oC0xrC_cv$SE=p-w8$}`9LO+eZVaq+bM-_CVcE}{8U~t|@K1-QWtR+h z+x7v|wvqF~p!ez`lD}XS!)1i(_Q!~Q$gHUS{J#6utTJ7zD~6x&gdBG}ZZ2P-lI|;J z;{3sHj}5*dM~j&8eKBV$8?rW8n~ZAiO>VC6IKnSKCF_^3k?!#T8waL2wd<;JVWvcn z$jqmTs{L0yW>aV5dVhijvHE7eyDyRTm4NcZ5+<=Gf?SSDG=)_I^6RMF@RqP`tgNu# zWwU>2U6S1u&^DfK6}QlRKjHhs`skSEL#}_Vd#BK>fv#n0lR6VT*nXnuz*#2il zZTOaB?@qD97^~IhB8*m%`a*qdvcu`}u^U+fOlA(xCK4!5&c1qEaL+Uq`tN?@tR>~X z&%H}dFvaiE9(?rA*>^pQv_w)L!EtYlzFN!1;CC~Ek|>vh-IY(*Zk9yG4bvP*i9xc^@K{4Uwa@VZ)L z0QM`xzNg!0g#`Kr+J5n1Jd0EyRCg&aQAByNSP54@Jk(I?y8WGudLmFVD352LczGVg zhIYrENgy+XO|hJGBBXtUa~=4;n^7P4)+yhCHTFDTUSHNl*4e(WQiPUm9~!2N6BUQ* z%Y0xw?rh^Z?4b%d)(yID0iI?sQJP!lu(fJC#go+PH@fX}{VZLM>UF`K$qM1o&qR;@rt z2np?es5Qy&)wFJ$bIP!to{S_4v7-%+cxs}S5jYj(;J3jJW)Z>ZY%%dF-tUcXig+vK zO+&{+-tt5nzLk{`8u;W}Rl?t*db#}@1UMx84|;cJZn?surZsD;{>1GWUe%y#c#-NK z3k|Fpt}9MoAK*mBj%y&T;}m?LDb!0zR&6&2?*%^^BG}B${8>mVc5%e(x7$>O3;Dw8 zfB|9QuP((?K&*&{B4S6X>;dXvJ()c$e1vq6+O3;C;m4r&&tDaXfIrgMKxya@-L?@R z78LdcF@W2t2XAorBc0E^z09Yp0wpaMu$ETWS{V4Th+$@eOV ztEQ#~x_1*Yz&7x|)awh}-2dzGKU_Vsk(cwf-zZeQ<=r~LHF;%}rLyn;X~N5H-%Uwg z_-E*5pwwM|-F>}o;R^$*?-qqxV)o7@;xQ#iB+6oc)Ni;VvzPh;<8qfqK?i;5BUr5b z)8o&z^EII^*ZrC7NUgjT+dPaDMZT>C=aQ`Wto}hU^3fAE{w$9mMQ689tq|GGD2H?@ z74vq!1$JtkYMf0Qx-@JO@fRcP*k+X_JSs+&|g!w*J_pE4$g(#EZ={iK0ty zHs`HAyYEpx{>sI=E|b?3ttf9B+Bjm7^X)#?+6X{ZB=N>z9yn`_G!rX8oYiX!bWN?Xmgc+9^o66VFs#e7lOh#T{7*3yN_DWf>9^v-!rH0&mpZmgjA zGGl$_d=qa`v^5Srhd3_}B1XFAi^a}w<2ipWcWT1L zk;45udQ&F;T2$>5W>zwA()=|)O$_pdfFf&!ywpH#!_B!CgC+0v?z24{iR7RS9rC%A z!Fi?gw`B|8>tR7~6f(?VHBW=ZWrV*Xc`IJYHC;1#+zsXIJ~5_h-Tb%B{e?CUO8iIU zJOH~e&^&I8;T9cyG*A@y?xu!%TPE!b(@2a_cTY|u!#l!giR!EB6IGJ@T&5KZ-N*HpKx>3lxj+#=r7$dCgHk5^0|`)8opu9mt!q&+h_XE>aQtYS+D2@ zzzgMcqUI=x z)s3c=Hr^*iY7|M{-E==)acT8+RY`rwQtb+#wk~S0}W!oGL9c1u{fF$K4}`eAh`<51;cN)`KG%;^ImG>($t(< zK@#7*YYo=Fs?Ls4YUI+L)<{p3nE+xs#1m7d3TMh`6-&tiw{?$&6fzJOv{05B(VUJg&Cr0d=*U za9-kYaM)`YY29||+HWWZYh)FbITqdpn3B$BoQLS(aWv?{zF`kEuZHz=PlgD%z2-hd zmk5R^&G_4Z3|$DYN#t*yTtTp{(8=1hs#kSOZvb~rAIyJO?}l^D$>$)zyW|@UEKmkL z`B;F63FkidcCVTYz%;&jhTq$;pxM`)w6p`=HwOP5j&L5MZ1+yY6vBY|_b^0p#kVmA z9kr`^uLq%|Hy$}Mr_?L|lL12-JA*P|wTLULsk9U0n7SvUHp0+-$xlZ`w-;pPiu(Qw z3?4h_a3rw->^<%ftPk2`Z&-qo+*-~24u&LH^Y^kLy$krA#a_7WIV2g8iN zLWOy!GUr2o@>DAus`c{g-DXsO)OxKTqC*Bmx1-MY0S-V0*`BoTa9nyc-aceP&rpp> zqT;^v72VShR`yWv@43Azx5ZC9e8aE^^W>8K#wV98Jhbt-r|a-&3h@JJ8|{sMfX8nk ze=b}!C&?1g4}3~Rv1Sk1p%hYAfv zLN|OPXva+5CCJ!p{Uq2OZaO0Fq}L8La5AhiPBEQ^>uWc$C0ePO{?L&O%}Fh?$_4!- zNDU^B)NV-UcnBn9<>3}Kb^Kaovgdy>W1A}Z0@@?IP21N-ec6d|$_BA>0D=f$0^9Vx z?M@GAaFN{1c13c_SeX0VI@xB1uE2so20Fv9(WEp#5fkX&X-QE zpZ`S{Y?>+|2G3fx=n$BpLjm+OBe5q7-Up=h0)JmzbNWa?_?w%0xch;@ioF0r+OJ$f zL%>+b%nfw(HR{IZ{w8j7X40zJ9w+7Q3s0jd8OBEsi}}NoHZB(J%w)RN64!kq(tj4a zAVE6d6x+=bPuT$CVd4yT66dF{=skGMq<-2ILV7LK*!s;8ez9@|Kdq(2JzPR~`Z%I|)%*ZmC5r~L zAhc@rEcrMa_==G|Liu=;l*Gpy9S<4Z$QQB8{|LGmYYIY-o4Zr|iZ)#;bkR&n{mXxA z*Q^c#!wL^1qSV_t$t@+TzbUqE4G2xTR7Ebl<#DY>d%Eu*Jps?iU6M{pftLWCs^f7d z{U4_}Z&4m-12>$;{c(l~trV3wDxUAf-3P~bUNzyM#!Gk)c+Jzf1<*JFWl)-*Qpaz; ze)LxPvUjea;V$M?83h%_=u>0v?C9T0Zy-*X>!|#11VRRQYUn5CxA_*cOW9 z%Y5^|&#X>ZtRxK-Dq8d}PtRWm$KTTINZY8hS0KK&hbSDibR)HpSP}epVGy9ytkIQy3YM~isqP!J5}xHWxpSQ(YvXK>jNpEM z7WZqjTTS3MpPu+e`g-b;aInLav=x%?!~hP)7i>W&GyqZCfCG!`P$KesM<2U%c^YRP zz4@<VOfPBz*ze6OvQw>y`;>$VLUFu|O^q1q29d`E^#K zfeXv7;Q9B^Z`X0@2>&gAuh?DkHQ4J34-a@IucyT!#h(U<%F<;`yMtDRWWg4V(>7ha zU^z8(D9>;=Jy=dVzH7{UniWF&TjyHUv1RzCI)m9zYzT156W7HdLq_!qj71&M4Z^D0#fsD9I?V9BG_j9Dv0ihJN7*4Cy0D~mqIn`GBQv>> zp4geG$yVr4j z?r;CPe1alF$LoKxAy1kvpqE?n@GTbKaN5;QozcNc4ZwMz3H{93Fo}CauTw^MXVpO_HQM+QY0Tr1bPHmWwG~`-6)!#Gqcqi%HuN{71egA z+PZ9*ayR;~*lP$K(6Es4hivt*tBAaOrl#A$Ql&LEmncNFks@{&XHEG`8BMU#A2u}w zyzA(&U7Ks_H-jQ)0T*Lv;y-TyIA(dP#NPJ;c?S#DE`Egs82sd%!tESMH@8kgDOxOq zwT=JOLtK-wM@}Hp7;|5Y-~G%9p>7+!p9dbakglJuyJHx*mS-|pVOvCkhhYZyx!w;p z%-=AJ{V>*1(|L+kGu+iCBoF1cD1feCGIC*Q>%rA8Y;Vv}Tb0$fWa49hl8Giei-HBK z6}Uar;?bPM;AynsFfyjd?&^K}=7cLv9D!8PD}S$!VOK4bY2gwr!lp5Gv9M6NK&e#2 z{61P$tebW5&)Rh1d&9ReAPM~dW*;0VbR{g<-8=l8d=!RNe!VP=bl~E#m0;SLX*Z$mH^SNcIR8g=+Hk74CIF&QPh|*%~t89Rsg(=y~-6{Ia~hcy*HO z{`svf7esXrCN!XO0R{j&WNVc?m|@XVS6Qz-A=_uemZ*KwlO3!7KM${W#)OxCLk%X3EUD`a} z8U?J2h0*zPOMgkPf6beF*>%GY+^>eZUBIc83QALeWeyr>wG8w69snhLaA*K0g6M@b z;l{}W0k@qSuUJs7MTDbq^k9W@;MzDsz>!zc+nm*bSJmr>~##~do>L8|`?(_|wUD_}o`-d_RaSu=j%G<#NCNRf@nMl>a>pwzc zu^K)$VrgC58&3_RfYrl*_4+B1RQ7!UKBT?v&i8o{# zxltj~tf)#jKeXS}R)8%^K}d>s@!rk!hfjf5c_gN^p9&0&YRX7UN2s&It&L{5Y`{;z zVUn;twom;WKl=(Wc-gvZkbQc7(fr@zGR^-zE|<9gsX&T0(}sQrAw<(TUw6LZa& zXOE+IMD};qg6`5G#aG64-v`{DOI&Uy#VJ|JkI#1WT2Ci|ora^^NXW116VIa>6wb-5 z7^{PHcLL9Q`1N*u)ffb=v6ssCIUih$yj^>Y{>ci9R_?p`St% z0w?{BXI3Nuc)E6596<2kalG&UOK#=Wq(gy%VxZ08zebm<$;A4DKwu-&#%|v906;|w z6PkFfx*P%IZ5eFSdC_vD+RH19tgv9TRg)SY8AB534g`AiwW=sfjCUh~@7_b55TKd% zJ9&Ga{Q%V)RT%>CycJj-&C`D|xzyMt5{Lr6gON;K9^4l{!-4jK1;Ic=hfm<7=Pvc3 zIN%Eh%#=QrKQgqkIlOamD;WOo(XPFy;YRP4P)5r+zfuF|VN7A}!J=$1`HB=0Z_d&! zdZFVfK+pcQj1w1QsOF<*EEU#+CqAJE-Z0%D1mmBu*BE36kBp$1q07=7nDTieDPY>C z7FG>#rYCNSw};3pKIW-gKT7%{Qn;k!oMz)NuN|syr2i{OEL>~doskcT9VeI<@%>>K zmR6+IOObXoxYmlSb|-Z4&A7h z=?eKR( zD_y*!_r1Ridq|^SrORM(Nh-UoyndTnHVlrzA)+EL_X07|986f7UGa(<9d3u3mPdqG ze!fyE+UNQ5aiBw-rA!~H#FPd?WsFmV&c&Ixor__GE=ojy(_E=Wu-l-)Tdu?V)rjs< zj5_|OiNiVfUb?Zn+BE%U$Xf|8lBjTR?Q`aQ&N^LSQr`i_Yv=K}#I>CBzG>C&mvG}d z?dR`UlZwM%Y5}dYOL1xN^taT0aPvD<9hn;??jg;Czb${LWGWJU>t4TS1r9 zdvVi+d)rRw?@8RAIY+V!|9sE(!aX~Z^Bt>rSQdaRb1#P{4M|f$!!8KM!q|GKuHm3X z*i(Ug!jT(8$3KB#`Idoo+5F1schtJH<9$^!2H;T$hr z^xr?1`kfO9FlyoQxTHOtAz*~J+I_GH`o;VA^ay*~6oQX{E!k832d9uab!A|Cf+47y z?Cw4Y9xL6;02R|4bT^uxDIl#&xSH_+m_hh^J`Jnz?a9+`-#sFZJpBSWgo9kx^E+yS zXlK+0^!FFLicNtZyn{a-Ee!KLKRs^T3Ogj$QipPH4X!gEA~#{1grV?Z{M@eiWrOb~ z+0$i-=i_f5b{<856uMPm;T1sAI*rthf%RRYxt9moq;Y>0dN?Xn%?293af+)j1U3`< z;;|;3rg^wLa?bR41>!h3*bR8`wT~K()fhz))Rh=X>ER4wyTso{dKSja@(8VMj?E2{ zC;r{ZV}t12p{v>Ucbm#SXuv^NkivmBN#7L{CqYcZ-Dp+NNmu|WCjiI-x-!cLaez=O zXdp?joO?MY|9hz8%7<(o?H&N9A~ISdzDex*XI|ynZ0F=V5vjK z(Wh1lY*Cl36{SrI;!I=Ee$qTm2QJ3nvD9UzoAr9@lb(k!n^m!ccn&nV3ya5lfs2Di zS+nz|`?9uue(+O-u483)hy;vblxEiUW5RHM5B2CB{1Zi*`&6an=?|07&j=2_%IE&l zbfP%f^gM>&jVirv_#Jck;hNrjTFuJ|KSOULt6-{S;P1dL+-oHK`ZC=_?FUzF)FV#v z_e>vdM-1{Dwm?oJ38|do4oscr4^G0Xv^*AzIsTdCMMvm6nL_7ZFriv#h-^82cuk*# zMt7p{LX$MoKv=HlU4eMr`~9MFlvQ@Bm&|6>$2T@Y@8qg#v!p8!?mwOD45ZzYUpBJO z>}wETcJ=TL1GqUr@kj6=3%&OnfzV_eb1+>l86U!b5BgMX!#w7&$RWn7GRuIG?hNOF zuiO+~;d5KTd|ypc{=I|X{Tf0ckowPAtjq)lwK7ISHU_Xl%mbk&GBuw9zfWe z{_(Q8v67ojMTi^|4>#)fO~^YAakrl_7?6Y~W1+Rd1mBYzfP$j$$EI19BGvV%9kN*I zC;}8Cq`OnZUI{yyKx~S3{O4?{Nsk6A*1*&Ec6RC~W<%U9)sBt|I0E90f{)O~>_1F% zqjAoU&a2Zpml4{xB;^7U90`gB((3!*O_kO`(9Bf>Gcf5~`L4w##>$W$=!?aRa240u^YqAzA zb>IB@b+-MAxPU_zJ3wpFYvLkc$S6R0R$Nb~~@0}F^b|!;88*GX1 z3$zlZxgshL>WB%BZ1y#zUM$wD_gGEL&vz-Dyi2ue;$smY8eYaf5GW|IXU>q`Z?=1( zGaY@IV8XG7BF~iGUOT1MNU&P4ZFRFy4HGp7#~PJ7U(8upx|z@>X}7+C^NS2SYm;!L zX(CYA*qD}@>srgd)|ouKkC?CHD|wMumgHdLufUGAjR9YTsbSKhE=woi6)@c$p+4Xq@TgM43cD`atNyf6Au`OKFpFV{cl0nlN>O zSW6}g{xuZiy6M5Q&z2&ae0N2uR$t<#{veB(`8K6Pg80X#)*W-H@Oj=RZ zu3>UbdwHcG_viOyd)>9npPw>%8drA>l>me0Qj`!*jyNF3$#pfFKXN|{#IE*|9@42J z+&_E`Ot_|w-FNtvI|OVhR?=!M`LKRHjRBt^j|Rqv98AeRwG@*r_0)77ynj58)Ex;TMt z**eq|Q?GX(EFJ@8fB)i5DLQ;Lpy~2@avCT17QP;tZBeONSElJR6*t2kxs*Ots-{9h z6&Z{%TWf4Nv&3B*kWaQWEH9RF1CX$0>?Wb>SnG7p6c_R-q9lVm`HN>~mlfok#jXDT zP<2*eZ3S$$#@(T~6xZVJEycaGxVyVsa44>&6fI71cY?bXcehd`xP;`SGiT;M=O$Nq za<#KRTkBmwSG@(nQ{CWn+kQEJIZu@MZt4%m__arF=|k5g2z^32sS{$uQT%-PvO3Hd zxPm&Lpz1ttOWzoBdx^4hSm!2{wkTj##yjm1lS6#|{lbWwkJ18-C)+mYvbPPr2_beHQSKp#wDuOJE0&G2 zn=4qpE(Ti>=s|;0wV$Ci1|?&c0!pt2V-|g<`OoSUyKUKSzi$-!YJP+r*eBUE% zg>@;Z;9ZfXwqT=P-#RyXOz(<&fF4+Qt^bOccS*n^LzBT%1feQd>o85;RAI z)@IUoG=gc3L_i1j5g{wYe5de^26*vznuFl#Z;~H**-)L3{5Dr6@TI8!?lY{bOs%-Q z)9w+&q7}wz5NM2qzq#2L?Kkfn6kLB{a^?z`FsXGRbM%m8s86@+vB;NU&vvpOk*pCS zOL`S^eOolvclOJv{xLl}F?k6W41IQHQR5Bg!{^qib9cnDck6-*J^kX`X99!0P=EK3 zfT7e}YetR|#q~h2caQWEr~%FiHSzjNnT$F!40uxd_if~UOi{eBoppy}5}ivum}Ng- zaMuJ6`juox9yCL7<#Ohq4&p+F`fH59f@}c3JbKZ9ipN&Ltet$=SO4p!&xc&2pDh?z zm#0@B*znb4L<$~a7X}^f+J&LiNC52ES6QMl?0Y6v72!6kqt8z(a2&vhs=<(*;Qt_^DG<;B1)3>5Ku2E ze;7$wamo-$zf`5fJy@Cy9HQZ;K;EWKWE&tuAKtr0&=U!9qFX+OGe)aJUv*Wj*e2w~ zvIes+>wB(@S}XLYuRu!ayI;b6PXC$XV1vf_!wJpY|4pF{lKy|@j50CQ=Zu$39qXB- zv^JqFN0;X`U61>O<2FcfFqXtBUSIHBYxW8U0R2N!<{*+#ULY? z$r}JSG#f^42k}4a?y=cXn3vU?WQ8#j%3@|QfdhisnZVO_ZKVu2a-H~QCLP!Ep8&N7 z!=@{X00uJ#c;!@#CM81m2d@-`6-q-)C}-{d@~4=|N*K%;4_{QQFS^?CU4uAf?>SSV z>5>^yAcA%uKTh~Xef*CUEFk9z$KCN`g^YPqzpIN+x$?D+}fFJmb08dAN9d~O{xCH3_R)E4} zwENajLmoQxcaO*x%lVx~J_U8M@c5tgI? z76#8hKrj7-Md%c7)j6+u>SlU%^-$0v6IF27YvXdrXU?|=DykGf{)vT5kkj@SYQ z-Q2aFzC3J=W8Ntg`HACRxricVM}3lK?L%d~l-NRfyv!>yTD3>Dx;xg>GfG`6NV_gi zHp3-)^Jch7ha1k^++-?I$J5)C>N3GMWQ(oj4|quQ#%wL>o{+#Mv@ zSJhL;d+)L5jkR0hq()@o?7*q9yGWTo0|_CE{tA>~>3TM{=Q#dn*>&mi@P^AByl8k% z{#hyx$=$NT>mZ927f4+8>z7*f;EvX@$4d?9`_{m;T*-jbr)raAkxaRcK7K7v&W9*Z z%FdNgn(Jd;7OyR43(5gNJXKZtq_d^wFm%O4(N%YTdCC&e+Ps|A6nIW1n_UuEQ%|#d z%Gr5F1D#ZauQAGB)V<4;jUlSkf)`%PO-Ytlc_L$lV<3v+UywKhRk z<~?#&?FhS%&{wAR1JmQz9cV)rxx`aet4_WYD63OfzqLuuNlSE@5bemu>eV)UIH5kH z+i~UvYR%G4_5G*o$4}Sid&|gZLf-zPh@OFNrcbS^IACR@ zRj5m_lSH~S)&!k*OyM`JvbZT6D*fmIo_L3zgP6)|0vdXO-FnWn;w4Qg!@YV6Q87x| ziuqRTb5&`ieWS|GR_^ebRjbnTw^O)OhTPBdS(_$K*~w>Xau@Pi6epq4C(Ou}&Je)v zib7J$=JJDh^_sJ$UQ0^inQUMiBg*@={ow+P11dx~Z4p*^KOQ)^?P-+pq(sSP&#z(8kHJp#D zzFF=!+{IK8h;pF}HUtD(n+r6SHvqAw9#X6t3ztEuir@8mRv2KDwwI(_+3RKvF^(dK zp)Jj}ibTTmhtnBj|HP$};A@-w60WWf|0{wj`Hu)HH!-d5g|F4bIPPD*tWk}jclD5g zbZ_W;NNM3=yB|CnRV9(w8g5a>@V9m@`}J&f{kExB%D_HA5^g2$b&tc${d_d>O7!N&UOD_KQo>sCtBOfj==Mrze{tN_`H?I-ek!!-)ZStwrUr8<#%XypQ=| zZZDEW06`4Ll0_d^ph_c__O`W51d#8TgqX3aorVDdonMw6tSxfV zD=0suVgRMF(6T(g)Fl{`Y2_JZKU(?vC$6S64XVP=Upf8mXz$TNP%X)rT&;uTnHJ(K zeh?Na#;7^h?PPGXSH4Wq5908S#(R+1R9}6w4g~yiqNN9!cp|g_*PR9Mf=J zb&WT$z}ht|3in|6k)Pba0=ImV%qq=U);$xdPsN?1^X7srB31xbIhq`)GvMdBzuT`3 zf(z{LPTqpcDe_w>c&mN^ES>eUHN=FD2!CXm@nzPiZCb^c3fJG3WK_^5$l}zB@Y9rF2uHT<2#z3xTKOCuzDIIEZ$qplj2VouVPFCuM=Y z39l!LWOCIjH~R#M0yI`E124wu2IQV^0gfTntEOPhd!{nIqUl>g(E@Mj;V=uZSc6IR z=%aeVhd!zF=~v(3)eqUuY$*$jR~JDDx3A4Eih&7^9?Qw^wgESXQpONxwxE0F;KA%i zh4UVCK`}P}bu#sVqo894fLtd1)+6O!NvK+YwS}u957}qYGyRR)j7d8V>uITe9(a~Q zl`Ag0Ns=$UXKk1G0ER{9$dfnh#ojf_YKV;j)PJ3dSHC++N~Nbi_s#Zd$Nxo5?EGA} zx0~v2F-}MMO|)4PKe2`BENt!L&XjWHt2Mfugp}3ujP2SNQ4uHrj-Q-ngGh3zUwzJN zakt^nB_5gX+L86A4$i=R8Az(ek}~)W>6d$WW-fU4f|WPCTHHG-BY{q>}~0D2fc@ z@2m&VAwxf|UnQYtj~-IPF6zKaWLJQbL)U&AMt`|C~zgoX#kL_R-h4=J*$@N%r+;r<{P|zda(fK1+xT@vQ z2YeRt^&Z;lXfnjciYNe0K-t~jQbZn3=C73$c=Hlxa{MaG(B=)F?V#+7?t9+qx!t$G zkN;an{u5AsiMjb;20d>+uHDL??Dp~Hni@!2@C)BqCrmpzVu=~+27)5NW&zRG51-NQmhs1`SjuVgP`QOD`a*F7DToL3*()f|D>3S9 zYt>FIu0p#H^l?h^wLM-Oxrg>9t{KyXtqL*WCx^8tzw;aiG2T!t^7HSY@ymj<#v|4- zTE0uA_HGj=QsdDOB~#|cg@?_#z~%?etWW6JOlh6pka1+@a>@QWX|dVi(D@LVcXG@S zAETFTCS1_)B{(BzcaaUAVWLJccsctU2e(PjY97>3R8@#Re6*(;wahe&*|{<$f~OGv zBIrzSIw0YL^A29V?F&ba6+z_JRXo7@M5>=yZz?ghlF^km8fE@hA5g0+)c_ZgpW2(- zR#N=5o%a|H4hj3le7YPOM#r&$t5alH?g>mVrw8IH@X$~raO(#WftC9J95@1bFi!kf zcia))azJM1jrA@cxN*lnVt+d|G~msd@E{<)9Ul5P!wRk>+`hRTW=hq1JbnWfi;C>` z3ql94)3K0%<6_yW!r=yO`5d|}&E z=-3p*a&1u2(`Y$yjqN>ox;*@`-d^O49i|=ZV<%E0u866$EHNVdsXy7}*g{)j@7GG7 z{;d9*WbKoLH{WRBX)p_Mf@`u4@<598ysQ6s6vMPx2JmE`wb~>#YCXTq+%*3!B(_{{ zAGRH?6wc$3tRy3|6DF=NQRS2o9G1?i&4>h9W2glA3b^OKWwHt=JA)#9odofrStt+# z2qf}V8fwnlf414G8%IhRs~={iun$~=+Z8g)-?7N|#?729V-%y6$vTttVwPFkz@d3z z#U;6213-U?WWj9tSWeTTd;33Av-ialOiqOWuSdc4JM=y@Mm6{MBOjf$@I={6PQ@xM zRwiaP&oEPZ0gj|(nI-r|>Xj&bvGk}J>&m9Oa<5O5_g4qOL=U`8si^aZV}exWRlbx% z6BXSqp+DCveT}a!_p#%+!mssRCT3}}UI)T?6KArrj_qBJUI9DCO1@w*&iD%buC{A# zqaWXx{*>gGz9o-rZF*qMm{`2TJnxvM0TRHir8C5~@!VMZr$K+tf__u(hnh-vY=F3@v|&arf&THgw4B^|eGWsP z*|bp}7|-7ElRva=N@mTm4tVI1!x;=)xqY?qKyiG3dF{kuHiObXR0moKR|bB&Q3#&+ zMO;#y%A`mmSjhLIMLpZ{_DYe-Nf;A)(>o&4ke8H1jrDIRiK=U$lY&gnsWUGvV?L8@ zNKsX&gsfTFoHuMPw7}z0dau=aTjy@DQWEG>LM94v)J@iT!W_Bjw3z z{kZIC8vCtYDb=%>WR_5HXyu^6bAc7)acBAaUdW11kg=O|rbin7Os2<=3P-%|xFWUA zs{-%)607AQDBGVI6bq2;Ukd#&z5+zsr7Qd*J@UqB6GO1`_)dzXjmml7>!0_62j)~a z8S>?XSYbn}dsQEgW1+-tWKb0?F#XZKG%llrSOTC!6e1JvJYvyB^q7eQrOgz9_=Nz< z2|WZqnlGV&Xs#6=nGL0Q+Xuc_<*omeh>`KFD;x3?rh$t8vuV8JWCn+;nh$khTe-bT zt@Fo@Tx)o&x@wNf_MY%4Itd@UZ{7tf0R{Ks#0jGbZc zbK;X3CZ-7U_Z*)Z>Z7}+Luw<0Pr-y%)`^)#;;)&aaH~{f7lVy@fx?jsn&^%~BZ^gP zamsJelR&>}x_uoqJ&=BcOH+M8TCEd>9P~c=*?1BDR<~|X_o15XvpGjU>%Y{R@qUA&UsY{^RkJN%ti#=&9dn|+AS1ySn3+s!o z_xBOkQ@ufR&Gm}YoOJ{^uSZ;);1*ob$!B>+ONoA9kBE}Qna$4j zpiRB&A$JkDg*?9*T@pM+YOT)j2qmIf0R_x(kHex!A25@_*tJ+7BO z1kG%ekV$|ZCH!xvt%PhPOglUR+L8V?Qm-+wDT-3*2zgTH+wb?K@qAUGSxhXL_)T(I zA~i@@YeZj|!7HA4lm#i@NK?61@-3b(>L7fReIV8|!cSi+BH=cPU#N*teMPx$M5Kr& zW>Qz$_A5xi45G3()9CBBJdo|LPVvsD)VO&-@H|9vXKq_6r?u0*78_0nIP122=13dd);yg z3J<=F3a&438ZNC-bD9jfS2qtlwMZ}qCORb&b!vP_+-&^DYKnfuVarYbb7VrrfvHDC z+J2b-qQs_UcyF8mqOD(_?cQ$ruKE$FM4f`_Q?s!HhiRJhyq(+Jf3TpIWlL1XUWQoww+20n20)7Y?%d)foAvE-?2@m z{Nh4MYcAgNz;r<;)$$ZiZf?s?$=QfktX}9c@YM9qv20Z#e z8M}ioRXe`k&W%W_d=Z~xBWADzU*gX<4+T6ux!cw!wWPG@CimL8h^YDqSJ+OQg#cb7 zU&THpd5Pa9x5vo5Io{oNNFkv?8M{&m5GK*4P3%bO1U2bw^i)Pr}q z6X8D}8vmlI?n@r-mY5VJN!=V3PkO(ufRtwhr_DFss#*P62LtNORtC^typ~jlus_vY z

    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%0At=&CszLFz{sQU$BJ@7~fFfJh&Le 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

    8XI>?f6wi*Vjk(jxIMoiWLUSSs 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⁢(CZ0i-Xog^h+KiTyWb+Z3wxD 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 z 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�uAeQK#z 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 j`^X-UvZ^XDQcV2XQY?~Rg`ZF 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�~UR?|&-=M22ElLe`8u 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

    qUt~wQ9K1Ab{4NO>@iSBDw8w^(!yY zD@b>yB>N?URkD-+>pdrn59)0Q`&1I1k$@nVC8|9I^%Fr?qh#d;_O!L(zd2V4E>y-o z1FSC?n+kN>=-+r5@VtihvHTQaIcoD$^TcKRR{We^w7Zp+EG;ZdQ7 z_q4NU&JeCfD1FwNxM^NnH~%GNvFqMDuBX$cs^`KQQ~S(ffz3vrXQ>f9Cm(~%$Nrw4 z4@Y5yc)qK+Qn>IbXO&&`*65uZIS0m6jn+Edrc1@Jilro~>}TIjyQZ6;A~eOE*FJ;> zkJuzSciVd95)OPL&_CwBH_MTN62t7;S-974G#DjeyTSl~-(&Pladi;=@8d z&=G1B%HM6b9!}Rf>{aqDfoF54VNcV6juC!{7A67@^t@W!_aeppC#{F<`sk4m5idDIp7${;O1B|x$X0~9_+J>nf}u!0v@UITB69>RFvx@-r-Fhp2}IN|6&#l}*Hn5h>I z{$c37!%#@HQQMrdA=RCiWpTUvtF%1svJHbfK~seMxO445E(bh zb*bcrBpKP1lRR#c&`4Zo=`&h9q>~A}b79&C(tlV2pDaBEKczB9z^Gv?Uj~e0{%G=y z9r6C9`~$=sV&>{k+3GG=HtoQTsqz~L*%fXRE?^hHk=R>bTs8x=Q}9Y3C>_;uh^a?D zNZVP=Dy(#W(F z2473ebd^7@Y!qAn-U%Y2uVKVMmWt`08cEy;|gH2o{A-d_-wQm zAi2w089Ztfjl&G(aH%}&-F9tVNY?`bGinLpZxio8F^G~rvDezEG2i&%6mq%ZQh(AO zAa}^tdubh5*{A32Zi7fPdmuVX3q9(8CXnP@M%=DD$lV5YFCRE>Eb@1iP&~Zth|d!qJAIft?_f}f z1&sd*%uNe0^uXhf_#dI#aiET0730G{uMijb;Y}Zq=G!x206#f6sShWG2HpAi!YKT+ z&Gr0|F z42D-}JMj8_rfg8V``MXD>Ho&x(xY9iwuS1fpbekJ*W}OZhsDPrIf~ttWWd!w zcyb*hT|>62wY=#%a{S;eb(4tv;D(0sFK|~@Gk#B2Tzh@=AyjHkVUB~ni#0i<)Y<4z z+riwRj{oC z{_GKw<(pDS)24oQ`Z(Kdkx6$cA4TjD7`ntdQL_=h>8o9ZIO}da85On(No|tyF1RJqW>7|H@x2-?P|R7BQ?Ov!(2~K zlTLbjGW9^gPFj+E0G9C`2|VhyN_Y7h=Tzw=K)eLa@@Ek-BHdYa>8QDF7*Q>t9Wgyb zA8eh7&ijichjvlLz63GjO&z;tLR&vqR)6Qfr53HayvoZd|KDRJR45L@yMG>}Wyra#qq!imh6eHbvl z7uQG539{~8r69llCU}hOSUyAfgk83X%5KP_ev*rp^4014(n zVsiLePYLak3u1mK*3L*FHWDn4^vZ(uu2)-BTvTh(o6_Uro;VD+^<~rld|RliZf29_ zB1D(ft~a1@87;OiZdA+6>Is8szRaNfLXvH`BxBb>6W0HWW(L={;}UODfI2TL`Xxd9 z3{CXz!xvTh?-15T9-wfZuF+h~zy0-p=cm#{u|ueG8D*Duf>!7rczLBhci( zUU!F7O1E3`H}+RR1mv{(0v2|g@EeVXSaxvvd<^;)b~h$ULXL9LUjgRP+pKJIUD-w*V-sdt zCx0f^WS$0aepFF_*uAV33z~NVG(OZJX(5c!B8WGCLXE71EvTelB!ak$q_su$vkk); zx(cOcO-LvSI#N02gu}3Kegt#OCkMF|Xs=xtRt?MtzO-B6BYCQfpwqEXajoNmgNb)0 z%iXgqIlM2ZAwI|nnf1tRP!D1*F(tBSAo7ypA3AO2yI8Hv9s{C^H_bhaiED(eUcT!r@J|bH;0}D_>!$V8dJ!d!YULIu^R|~-SD*AWc)7$=6CRa&;Zt3X-oIR zM0ne~UU;s%X5AugJc8vAHoV_FGAN*ILU}UU$VujbdfCULggFvTPoNl=60U!71^I-v%5A|B^Tr^ZU`9ZqGfpO%{R5O=f zprphqqNkFh(?v{ix^gn*rH#!I>{~JZk-z$yx%Jn9w2hUw&yC(lrlJxagc1jfkK`}7 zhEN9ZS=mSMJ)MpvHfo;FiLYd&W3m0n=Gz9oYR*PyKS$!*?9-@9s!yqdi%>bE@je#h zAD;C8mX!5*rwtRsNg&f{n}w3LH_y}ehC`7iAdvVRrGFnB!!mY(!G5CfOY~THb@k2c7J965uM@84{5}HEKY4r>C~KS{zw+BEcWrQ@Z^jXSzN4 zR1m$?x~QFoJ&sK2ysI#t0LNQxSQhv}_XtV!OvOH8+^X}Qx>AOxC@S5YavbwgmR*l@1e70a%{GFl$)uIH>XH_WFFXvadKSP)B8UKb!c(Bqj5!E{**7VMEZxx`{ zdYG!e?a;b*KTQF`R2&AR%7>mlhI%L*85AT@?U~sso~UuTHF!3 zo#pnp9g)06KR7}n(Dy@MI0i@<@oR0LBG=+C*YmK5*PKz({Iqyy?7%A&N`gCG8=ZXF zm*q|>KJDo*7U*qbe{Q!JVR`y-<3tGh&J|4*0=B%AFbJ0M1Em?CTFP5=MSqZ{*V|01 z(@mYAZh;D7G6A=hl|!SuJG#0%;kqgCH9J%lY2=QZZguQLeYSzw{MEx+&A9viueXJ! zglgkso;-828S<8%Xsfj?sTBi32AN}3whaLN@iO=hWNtCVvS#^Ol|;W`#vDqaRt`X`E+Xg(wm{cVw!A7a^UF6Nm|_e8kXb&mdq2gMU$_HDGP?VwcqHtAT#0)PJtJxrjRPPiXYYm z1rq2o3XNRueai1}a!?c%&RI?^AcWvi1X{}ia||PYFJ6`v7Ve<#Z-M(L-d??6(PhZ5 zle{DO=lBYqa*DVg-_Z5dy(N=U4p;sq;{_Er^65z5Fg3R{1~GX_U|v6k2c-WtdknJR zQk5gV!|LOy(9Ti@vxXtfu16m?3LvJQ08LfQ1%Ki*Zem5JVRez=oFvrqkbnL%MNxZE z-@1b|y1uta*T53yLGJrd07Xe&rb}P`*3SA)9N-8y{+|GF^FOWt)c;(8ulU0p$V(n; z_mDDR%(`3Qh822#9tnrsTCIA|Jn}bG%PxQTx`h>OGKLa4{7)1FAHK$$&t^T@>gX8l zXdm)3r zvPx~FZ$+mcyWt>-v0HSq0WupT>vJbRS!tCCP%lWt{ISJOCbsuE=-92jP=-9^zoqv^JP8e zNhj({?UhrR6qiFI*6CIB)e10<1?5ZD%`RIk-V20r_3V&>`eho1_{?oA0}F+b?MK8< z>9*DZ-U+Hzi<~i|sjtQB)gtwMo4LwUZDlC}eeGc`i zRVPLV?zNs(hjSJWr?of8j(?3AX@FEWEX{ol5IrVe#!Zu#%6N~3;BHL&zqMXsR2a84 ztxkeY*tBhkl~;Y!^Dz2i)5F-1$jossg(NUbl3}Q~U41v{UhjnCn!~%;I8D*Hr&)q6>1OQX z%gqM#3V-j^#SauO{ux435TUjThnR@EPtXwi2)f7o4r$mSh$E}cNgBCTkmjS7kk=7_ zcr<7v*$A&b^krFxHs(+2IYu?J>H~u)d199O{vs> zfo$Aeh_8W-s4H;5+`q-U)OUbu(8Ld;9P$|_S;UdbA?LMPT%8F(5w%ujkg`(|PoM$m zHC^onO?Cp-E45yMj$*cXM9hNE6mLkOa=k=PKzb_-wu0zGZoNH9y5H0`;e)8(08TU26QKS%w#mu;8yI3l68p#0B25}4hfeQ> zPhEp_Rjw&EGw^<(ehM!ZpH3_sD`~u&x-D{$Hi4rdMPvrlqalx$5KfyUiNl*jBLuVi|Ml;ghJv&`zHxhY4!#$$^c0~Ezjf_DeowFWBkW&_*$l{A3L#;2Km*7 z%(jRK*nfk!v5Y>bkSI0DP$r@u-?2?byF)9s?uznnOwxDG5)6f_+-oBqVm>^eitzSM zye^_-@LUpy)4>b#QsWiJOOu25zofnNHx){8fp*(z6Bmxi&Vv$!Gbk~MeCY{42N&Sy z*_*<&H6iErzTt|-@u)OZq>B63x~lF~Mfu(@u!<$b8RW~ad7eYe4x?XXuJ2Ih#fbT` z+T1MN(tZ;B)8n+zYVx*IWR7_ckrJ|bd%}qR zA#MNYM#V7yaNH_8v#Xb?bbQLwfKm#1=c3qaipEU!5Zho4_)7kizYRns?}+DW^?}AjELq%z*6uT8z#3OsZ3Eh zNbWoxL3q&%N`q~}ix2QIHT6+9d2*AhDBt5t2~bI1;DaK}!Mw1>E) znK2*k)Ybh;V*dTQkWx|Fp{I4Tih&@&xoQgVaMArbs6b;BfPLMWREiTF@zHAcB)nmC0R5)*hi8$dQ@8q3{r^%Ws0_S& zx&ex`@0NgYh5IPcEaH3!haHnfay--PgfC_Ao#OK~7O5Abj4sOZQ#lj-P|UMuk+#J2MI%*dGU18w`W_OOLY(QG%uRnR6Q`sE)X?#_q4a>T5@p zAbrn88rJ@e70d+1ZPYuo6bc`t7 zG3;BHj!cJwN{TeqASpuo42{gNe~sW$^XC-RkGCiDVNFLRS+Z|lUH!=3$e$`~_}uvx za8+aE*i}o%ZSXjF3Z2z4;CrxW3k2^ zXsrn`HlCGn_%|vspi(2T_?$>Ef`z_yOK3@L733(#qzZo1J0}`g8Mom=MbpovAp}jJ z)1s>o&M};`jp)E{!|mBfMd2(M=|LZ+GeNNhN+Ed@Z)(gJm9k0=NB0CL>Y`%5lzhA? zrgT2TOQ!HYVVj1kT*f`h|G8j0nIKi)KOf-HBGl;Qg6x?5#1dPXyx`dIvhu7^qnHt9!VWM!`;IBPr zd8RFV7=B~hxMvTwi~oMkn@`((Q%~?JOwQTBm?cByp#^f(3wJ(wtA7cOFl_Gf#nx)z zsYv8)j`H4AxQ$(%^#`}+h^}i`T7g{_>c8ZXlMt;=4espgtZZ9#}8F)+{x?gd9 zOYLDhOHt|Wk%ib|Tz5@znu%h56&tcJ3s_Pi{vs#v`3+thqtN zP6C2(1DJMq0qXefMQZ{-jnc5cSPa_z^fHOp<#n2j!;Cuf>OoI-h7&BtM>Dy-P&k$2 zM-BN9x?4!uaN^RoACih7@%uP+!MoAQx>GOY*RvJG=pAr=*{MTtRVqV9w+bwfP>lRT zA{!u>AN?H=5I@pZU69N%I|k?}jCQ{|yu;-PoIjUM=l`X6Yr(wP&h>2#R_yl}9udCA zv7_Moo)y0bj@*EcQJNeqFp*P~;EyKFeh0EnAeyHJBjgpzSDMEKbwD5fGZ0}ZyslR% zen+bM_u`Ec&r5R`{Tg7C8BBc-@E=x%jQXv-{n$9dNQKce!w@C>hoqw&FC+3w)3G;a zh$B=vp~hIvJ0KFoFE7aW4?$`xufTuM;g4oT2Hz`i{1(4`N7$nt*2&F0Bn{IwBe1m% zJPDs)1SKu(x}v8s+~X~L&mHh=*v4uz@zg5iqalszrUNPS%rf68$LJyuhaRO7UHL?G&F8!u}9n^l?9xHwbQ&#RZ`tgwo4o-yuxzr z(jthW(C2UQhoS{!X^mXEPPQoGtK5yAO848*d4hkT+#+0e^qtdB$l0YLD}v4XU755Z zL~DmiT$Ddnj`Dz2Iyza8=7h1vXdXT$^E$J^yBx_w+J-4C4n^YZoOFXPzla zI#0($_1kvb1a4_$SaX+f&Hg;)TN^84kddwUS7yH05Iu%G)ADG-3h@Mcg0JqNe_r-q zSI8tKp2g52YJb$>ny(bD%09p_QR`jfMTjDl2f#)(b))0ORW`yD5hx~!+t!SKab1F@ z+(aZPV^434W?lsRCVf+!WVU3(U#UiEYo*~&*Ts)APDp$bvhi&hd9O*=p}g~v!luv3 zg6a5Am@Y=$!d){0@}qa8uvoM9h7YX+vs5DPo2qaK!<7(1W$-ez%3WvQYpy-40ub_Q zEhL;KY|@%8JZu$vyjRzUUSfZd* zZgYjKc3Cq%fWlp6EJPIde?(OJSYR%h65f6|Oq4d{O`Nt29XVKI#|VaFf3PYK>~->7wgev>{3l%O)vt=Rg1sx&UY1KYgY?d?VbDwl!<8Mu+ZTrKs=rMMR|H!} zJTx(i#;Z?t+R}GHp$$vURRa~Koa(eKo)A6VJLC1|0b9D5(+T+MUkjKp0JqlnhJ5L) z3`E4rTJtZu=O5W-&lCIqo#z9giTj6!a6UG+QL5YxwaO4Y zJ^k2VswNzC1$%^~VujE#i|y8G?QH>rveTs-Af4k5uXC+1en4Rw%Y+Y~X!|Uea(z;- z^|jdvpVu)}IH zqqAJYUY_;LPn)b))T7HW7SDUf}Av^(k? z8<;wARm!!jXd$^o{f&K^2`E!l>mn8tyn%A{P&GAcFSdpLE^)+$MfnX|!k+R#*)rDZ z!Jm)6+P~JJj}@r}-0!O-yUw=SP` z%n@(S6i^zs=I&ioi+i}M;?n(QWw<-A=Qss7Q81pa);<#`DP9nH*GgoSr^C~98BkUA zTDNtzvNB~Rh{2%(p7#2#3q69IdGz@e49y#Qfg`4#BAR$N_w4`_+4h6v+n=HPrN zDd<`t4xl({mw*}mWV>#PxkA7_h=O>;su`jY{VWiC*^N|n4Is{d^FkS>zs@yHi8Eo= zLOls<|QOJ2Lz|Nh$q(d8u*JpG>VyMyvu zBK*hXAjVwvv=h9DWa6#jyMWgZsR~oy5&0Q26y$D{^oJ#!nZuUbKUOJw;&Gf!lA~27 zbNwBvFB^!TxR?M*{jV4O*C%~_AmRBL#^S%tJ=!LOp_)tcoO=nL<8g}J;eUGru^d69 zr*DhOzVO2D$wqzIU!R%`@Isw(6tYDKW-h~N%sI{3g@XCJdE`R5CmZ1_QZW0d{|w`KAX&p8TfAlD~Q2p=g%*U{lsy z(tYM!=1LOJ4B|8klZv1Eu%UqIjr&l-gAFl4>w(&(z5BmWA88 zmCLi*mH;`yIQgeuK?5VF^64f1-rrmw{bk+POZ8Mu9Sn_}F4Li*fq|_7L26&gvzS%I zx<4A=g;Q6)Lbgj zo!W$B`=6x0(87&aNx?umwf4`9HfE=-iMY7M(jIC^~v9V=X&-PBqXf=b&Rz z_B!>%|L61*EGmACDnFVO(!=d7CE3%@f3-82){=IYcGpKF%Wm+ud2B=fCi~9z4QZ?w z(7j|f@i;;jHiiyAwUnrDij+K&zb`)vrJe0Hn1_xmeVsl`7!LJG?lxPKr0>sYeT zZ{2@+s1LNsfAf%|SZCyFU}l?{=z0B03iT_1u+rg3HhYJvQaw{c9@b-Ag+`dS{%;$+ zycB&}t`@!{bj)5S4$B^L)psc{9~K`9EHeU#Lq^e)bS%J*lDbNR;u`NCrQq${%NgJZ zG8#hdHtxZ&KdDUJjd?S2q6FCv#iJ@gL(LrAp*2}L>M4gx%G-|ytT`q$%j^iP2}pKB ze^nS!6dW=^<8%DH?$~|1{h^lRsW6V+1594Iz3g&fpbTAPNc6Yj1f)c|JXZIYe{yZY zs&g(4s5dP1B8_MFm%lhAg1Qm*BKmnH*ZN4DKEhyUM~o_05V%AK6vXDsFDtqqBQ)xE zcfWDQFSJtiY$n%2Jf8kKWN?T#Kh*T^-2r=KHrW0aLN#89@8BA}m}H|uz7d2?Qd=Kk zSZ$)?vg04^wGX?gd6FyExqFsR`Hz4MRDCR*p<0UUU@hN!soS$jvxfGX3bNph!!cPi zt)siUD24AC{rxfK%;^+G_7s8V>6r^Z-_G3Cb+_hrndu&}_~Y-CoXWe9za1ToJnG!L zUx><>t^j!)?N{K_CGhpl7e3|{n6KXk14`YftE<4w#;SQNzlo_G!zJL7O#c2Jz=()9 z`fs10qnFBg6^_7X^IkWfaOxUBeK>y)c*n8@LGM(VTk9f2E(7-paCiS?4yGP3S_N9v z4>q@e(vr)=_kfW`^xkg0qbMqp>Zg`xYX^>oI>0Ewt?4HeP1GwO$NV)w>efWjE?7i` zR)!KK`+&7?`3krje+OdXE&)QmOmphSwZYxvby}U$^D*Is6cH4=h6x|^P-B*%+kooC zvFw(GJ6YX%ENJL4aq&xniX-OCY%j5}F*{vHaQNV>!sVUF8-^<1gjU$+3p5XZx{FMK zrhdV(+#%Uzm+_Zk*O7a~QDH{OOK4x=z|>LD8^wotw0F+?ccc>DKYzeh?d+K_$&XAR zHm;PsU;WCH{ReU_zQ-~k<&RS-%4)~U*qU!Ru2L|CxGLIaGpk5HN$F#qn06=aZ|ifQ zJI=&aB@aKgoLcAS59TN$LA+fVZ2CFXg_g2PCY*?|H$6JY1RqC}@Aq9O3QvUII9;!| z4cc8!M$$K830% zTmyA`iVt^vm;#E*LO1vK8{PYXyHzCcNLX0EvwQ1*e9=}&9FCIV<`{CS=kn3)e(ODQ zPqtni8-bqmVFuT6`g8G!r?@q%?T3&}eqagX!oQFaByy=BV~L2$PhCBa3?evMhEAGd zdN?ZG^|7?as+3&#ms}=UsPGN-w>BqD-!_WZ&>IWM70dm>5Kx&?oC z+@#@))j2gnfQV#$9@g2~d|s9yRhJ%5V*OREyP(CNAlR{QxK?}Z2Z>anE`eHJ`D2&7 z-W8$Ku9g88YOA&Iz5IvO?xn&Smnh!f%z6eQs1Kh7W`3Iuxi?0b9J<1K`Bo~6TH9fG zEbv%}29xbD0grAfH4aApBh}~|MO;|v84-Fivhgzdd8j>Q$M;Drb)(*L-!6=~{X|u5 z5ABE_AA&zE9hu)ko62^H7&MuHY!M{(X@Q?Af8b%LLFe#`RGz!U34YbV#)(tU#65o( z=9jqR)RaNL;MApoRxavPqIUyZXm}>dw_Z9xr?ym(iA_FD->U>Y8Y@+6?67FGr;Dk$ zP3_NfD%mGg7$xja8Wb^HCHJH1m^Y>1wV8QP;fX}{J`B&y&aYsz#{i!HRdC3G{nB30 zwJp(4J$Gwy^24*kA7{DyX(;0JUs}xh#zmT-?B=LHo=ZsB5B!ThJn7T19{cyr(Y+(+ zpWr#GBEN}1Z~3}99*0GVuT`Mm3e@3k&Q2wIMy&NerWmgDWzjH>`2^KX7Y^z9&dEgo zsefscU@_$*P`=XDJ2;;Pg?dCN$b(Dy8RKwI-frNm=+);HFJe#d&=3v7B#Mya48iOK5)oK&H+Y$KM?JM@K`|_*p)#B9K z+BcP)!uP(bp!2DEYT)6;f+9?v@y_W`gf30|yuAUYPA~*n%pg@xj}l0g`@z(SpbK_% zVM5f3x^+0EZ}1wujU#U9M19`NFw5b08?HYs{&KFnX}=3i_TAp%ucj$OeM$1PS-paT z|HXN7jzPhhzA`XNrXYPIX7E{fd$G9||5_54{>!P7ZEzVnueP>t`~x|hT}J64kJ0_lG_atJG2k^TZCQ^!xhP#lvCLAZ@SkQ=?1zA2gs>KyYWG zsKe>Als_+e z6%797l?(M63!bW&BY3Z}xT_n7cDOmpPa6vyOi*=q(-f8M{xeaa3*}n+Ec$h_tvfeE2r%X{^o)t2140cg9$LeN>Pv zThJ#v``gt5@&RsYPiKr?`MbPMxDB8UH|$f^AU#>ye-*oPW-r~n2V`V0T@NIcSkE8T zVMckKkDZ(zng`6`7-FV}n7@hMnd(~}P=B4*XO4Uen+;@56Rqc*%v%l_FON@WnMXY6 zN?l?m^ROFz`(?mH30L(wJ>6Uq(H1|vG9#qiexQ??0ba_jML8BD-PzmEUhX*Ilfgta z=CrF_){G(4Q1?W{2f@lA=p)>IhKE*@N}HUra}_F<D(f9=NrjdM+q^^eopPKID1gEch7b3=Flqf_mX^rY+rHFPjRV?8EI zBWDins!J(b;+WDeE_i}~1FNYpv>a`V7tZcm4DDx<`tc*5la78Y>dzbpI39(;K;pdS z#1Nw6KUFd7{ME9#a_d*}B!8@vng-$pUm31K%#>!7U)}IlgU$YL|Ga7}m?d=k;pXh@ zCD_{ku_3}Pliz}1k$nLwk>~|XMAdvdO@;O2M*;Wk97gFd=g)Tj;YlcivzmlPtM{42 zmhpjR%*98=i>SpK#jB^O;mGA1*b!*~fq+%$93e3mFQ3KB8z`QrxRLIPoU)DY=4N}p z$vK%F&z!X!HngvBc-lW+8@M}JUxI8QlSM88Qwr^TVC~?}*=P?A;<=;6KfZn#a-9N0 zDK9;c-UK4rxABaY)A{)?84mCk+DGN%T#$@lleRaW4ONAG zJF)f>g@s<=VF`9XO~Ec?0)l21h(UxK%pfa;=rT<@S>@@1nvSp=J*!-bWwEWGFDQ0- z!jAJ1u=&^OJ!nGVmMWzZu2KhO;snFv59Hg`m+VFC*i$~XBabI(fsJbf%Fbln*0FXy zCI$KL!kQA(A8b$-o#3j!khT9Z0Y_LI8!P=X1eOo(Uw9~tG-fthuIG%vk2`Z)8&8O@ zz#{~iYiWP z0|b6{X@>wJ45FTr4Z;{GU-~j>&XfXx+_x;H8h<>IzAc-D7qbeyu(@D`$s7$Y%HE+? zn^s`PB_pl9SrAXaCcN2ezA3s+H(3Lzvu<~Vl@Lk$+` z*VRl6$DyJQ?XoXAzYO9{NAuy@M6;*}GSr)f`~cZ|Cu-FHgh zWEoz500|fUJ}0XToZVIXW6Ec#L7_GonUEvF!*HcPtC*jqZj*#S6xDeQwh3TrE9_q_ zwkuYUi>$AJdy##~r;D4%A4G~98qW%2X6*s*AqL0;dk?}Te!Y|UyUoc4FKpn4E;cav zkGeht60Sg-5cKWRx}Gm#*S8J^(^a{8>VNa~;^#Rjyc6wncBm_Y;Uj|0e#IgSY{nzr z4P`j0UVVtj!*D;i!2V#m;il%CyfhI<6?v_j=0StL@*^+rflBJhtZlJ3q$`?^D|TAW zxdX+WQ|=q3$=x>Y9y%>DnyFN@ldUyzqp`X zci5xghh1E0rJ=!$0svB3}0z-$_m8WPP|2LEZ*IUBXs6}K zBqrQ5miCe@%tFq#UKkYDx$$utadVyXBRpB%Me3;Rf&2dID;i23BXYy3Q=S2i|W}_3%M-DFitk-5Lyf@srsp# zrH^g1vMHcduypL2JWKN(t+DEYuEjVHHEaw)2-i}WwZjrBtHv~u!olp@Z#wyF1=x=| z5sh5le>rDnrTvd+bzv}tU4Q%kP2So5|H~(fzEZbUyij)!Mb{CEp?Y%lz_5e?T-JoC zRFsc$>}~aZ4LrA4AOYpF&owc!;tHaLsjluUBj)YH`3KR>Q@z*j$WiFYBaCz8BKMa! zlWf?;4{1Nx7dAW6FuyKLQU%sHiQS0iqBQUvxaZqNjMz`dkeMK%=-^OU-^QTR5a3r#NrZ{XB&hlr6%wtys%{OQD=x zMK-eJs6g9@#+X84R`2^V6IEVpQ~OaY{9ibue8m-#{%S^Q$aZsS9NGsG^ZwRR2S8J>{a~cUqWzJqkL@} z+h1DJ?*$T*{O-Oy&*fkISGWWXrowtk#!e_r&OTMcxs7vbbEs}He z#pQy9lNU{3hv#_d_f-F?oFu#hI+^<{O-0Xrx&d*8)gYo{NQw{yp>Cr^ff#<-uTf$> z2?hQphPFzQel_KqW)WGNM_4}5hcmaa+uo&J%ji?pN5>q& zuU5#6tjJcPR~{2*+em8xQWI5GjD-(;2Rw?0QROP;Li;>E#|h%+J*pUYV}+#PsOt%ziKFU6CW;aed_s!Z{*zWzg5U-!aT823{&Xx}S;v zR~MnOW+A;K=AO1v&wZO~e8AJ~34MCn+Lh87$SNRA=zj6e)!SR^5|e$TQFADZjJ$Di zi1)-apstlk|5iD&YHe^HGp^R(2{IRa#9=bf6Z;-rpBJZGzKn+EzN}`UrT#-DByotD z&zVv(SP0aB=62K>*7JXeI_LkmqqbWo4I8VmZ8x^rplNJ0Y-~-OG`8(DPGj44(%823 zJ@Y*8d(Qb~{($++?0xThU2CnoiZ?@MXhZ(Q?Arw1x=9auH8Wiua5T6qFX5CW z+Hxjxa-A+LQ-;F|Z&LL;o2%-p=ydz-MDtcokUI8IAjx<8sgoMWg*O?F=wGKIUS%N; z=zg_48P~RV)a=qxF3YMT1?S}Yh2oUOe;O5yL@BEAMsQOmqz4^vHdvscJ3oo139kER z1Z9T!F~&CwL`!LDV?2vwjI_W^Rosomzy)fkYOJ~UNO|GfIi2qO`i2z264^eHCmfvY z3Pt^|H}1em5-@&6IHViXeLNxQ_IF5m#fmhn~dc{_ZDYrlN94zS@bkIex&BB*RMt5eY{95cJJKvkyF}xfFLfT<1K-2D{d3+r!p2u@O_qC3V z<#0i`kIWwe->V{!nB3t^Hl2|}r}G8fZpMq4ENPHuy}Z#uCW3LH$8tx+{fnyVgL!YR z=D|FL_wF_WSJwzOIvy?jlh$~SbQl~rQ@@@yjEi#JlWXXTot~tUx*KXi%(ymbm#V%ubcq~ z)MkzwLjMb;TCQxBK%Qh6tSZ@YZ*UqM6ZwVNYR7>t^mHKS0}0`>X@{r1DSUMN&8=}e z_HEx)y+9vR>j*bp%I&(o#hrG85?Qv3_l&etGusyBwXVcLKW>+_zmZI^b{y)bi$*!- zNt)=I*?6#8jxGKw4?c2pTh|aN`YdpZ0^+t2Uo+C-M+ognS3d{~@bKL2Xf#=~te#=U zlziQk$=uv!g8%VwGoEKjG%GRo4$A-Wr{#zKwZ7(srhQEmmu|auFF)cxOCLqCSxNT- z8#WvEI`_*&;Cgcm)L7fS5zsGg7XHp-Z3yymEz)8-@w7 z2wk2uep1=b?pp@u#CA)f71RJZZDqHyB}yHuql5z$187`Aew*9iqn_fSsR_t2*YX$+ zcJ(|67z4n0wd7(g?&RwT)lUkv92)=)z?^d^lYH?2VBX|Si@Y#8gU{;WgWp!jtWAJj zoy;;6^+`W zXFgL9z$H=U0ZO=ZKS)wXwY})GTy~S~ky2%ZB0DIEyr>r>*-^PU&P6;NB42aouwQd;k981Oj zX!~(tC^~ROZzN{^u?Mp0Nb%849%(% zC9&@hN=mH^Gtr;jEr@ue^1sY!Z!ZLB3bQa;{|JMApc<_g7Rqsb9C&ZJ*F-W>WI1Vl zo`>HbE-Wq4whxypQe-(NhDKyd51T3xZ25{YJY%E7$kgb=js$;J-~1A0n`*7^SC|w( zQf<%oVL48RbNE*gto{%&dgqk~6 zHYyO1_TI> zCe`U7%QJp=r(dN&k6%crvKdW%_cZhma6T@lW-;6kjxT3~Kjyni)-MA7??NFE%1D^b zfLZy{c3za7XM0L?jrLbZHRds?A?H~t0X7|a-g`wOi|L6b;PUA^iOP5azR#Yh@AJU> znQ3XOcB&CnEpdr)4DwLS%8hK=Lbv+Tk|zR{$tQW@9!We=LJc!o_vmNo zu>0BXCCDg>l=!!+VitKsgW3t!U5zgpvvrOAzt3(69KIkr(z3ek(bO;d>WBO7A8Ntc zjez7gze2;l&TifREU)>t^&!XmR;`NUJdNA`v#=F``wtb}0ooiHy8zDNckkPJ zk&j<#&^ZoBEpa)+Qxua#A&(=zC13-Bz?YQjQgu3xvj*(c80Fs!T({{smP?XM{#Dx{ z6JnLlnk3rGVIRN#F<0EyL~^+8trk%M%%k1;X^7Y~DXZqFNIabf53jIWXTx=V>VIm! z@>VSZp63yr-S_H%=+>~t*@x6~_1M6^Dr4WCbarVa+md+9x%TBxGb7|cCN>@h@y1&( zOP#)e-IbD}Z|{GjxZQs8fxpmOkl;&P=o{{qb8Uah$%?t8K*;V)=431KtOJr?YRr>J zW3_ZdtJG9FA1nvfzoQYaCwz_-*qC)fEO5#b{Bi(3US_rUwl8O`RHxz_1BXor+>;iKzc#us{UHO!}l$0#=h z@fZY!Gf(}TbwJ6Fbdd&d1edfL0bN%PxWq@U?F;0E$5*RfN9U9LMB{z$KtRJeLCJ7; zWnPX^s6a(qa*ZO9K@GqH)gP=|A;JD?!1!0UbKbn|o{^?k`W5)?JkDF1ZE0YzxzE-5 z3KXZS=_&5^fwT~`q7TKX9sv>4wh&pO;EfhEdm(Nsmh{eckRTV`* z#%8z{J;r9Md<&UQ3QNc^t2QLV0SiP!!}zY&s3g1bdfD%o7VFW3`NUo;tD%jAm`;VV`A>B#-8m80W|L*z*0p;UuUXjQ+`fX3D>pe=tZ zQZ6HNto+fH1kK66_;3GBAh^pz6>@vtM09p_&AwQBW+OqPy={3N2Ug_Urhu*cyQJzF z@O*dm9aYC~9QKmnX${lBb7!T^;K_g)^zkywo`Ol=akVCW{Ch~q+0rK4bT@Tx4k=+f z_aJJ;pHjB2HW}GFb(~4lKNHhbJrJ7Mspc4Caca@-F$S=sVr0u_@l4$s}V3q({{+&yI#%#OQMXg%kj z9?>1n;vjU^gvS8xH8d*6cwJm7FS169LJw0!{yL6-R#;z%u{}8iFu$7SzF5|6`_icD zCvuHA!?3m|QMnk(j8SPlDcXld9~HJ5Jjd|LS0I!Ak`?fE&{ah@Xlm~M>GhKC9bdq;nYJ%?Jx;a*O z0xciYEtj`Ps1efmbzyiVZrk^8d|5&w!G6kzB^VlYVz=-9u2?SF0yNa(agb!x$_=?3 zNkaE|lyNk_>KPsJ(n}7_j}JdUIa{djX9@kSjS@tHvUfKT)pODY9{;1{{^x$6==PoM zc(ZGjErwjnh>d}-iW;rQOBKE*awE9HQ@{Uwc4U-|l?|gRbIZlwlIbqd)k!4@2H=+uxRseV#8FAY@Lz z;tfTd{G7(woi>%AP+t&tgW=~IYdV=JLL(O>6u6F&tVky?9bwtVX<{8w;gWoHA7J`J!&%l%0}q@h@MMB#4&;kVWw?`Cm7o)h5^ zi5T{P5@^HpDP`QzS-}qajL^XGT~8Zv@3c3~*48xvDuOR6z6Gv3v0V$|jKZk$jznWN zhgOoTKXc1hTqJHEKsv#Pp>grYoE!L|odZh*+&PHWS335sBN#XOdLKG=Z`tAn-D~dP zLMCuC?Y%vJ4z1V!9lw>^`0Qz}KAZSopw`{2HL-uG&kVkB&f#sNwx|{a?_B~)$TR}G0uM; zEAMr`)0>0&Uu}%o0`Rn6n&>iPIfdU?5HakKr*i@>z`4=?YH1GSBoeNQKFQhw2A0&j zhKIw>yP4V#xOX~Qp^?$L*YtZ-(j``aFlPSvaTur=D_nAS~>kU zt>rQ`8g}wS0QcDR&nmWDVt-qqgB+xC&Syvb((eSSkp*Io*rR1eM%=2{b9a`3F-!XpHvLL?&5y+K;_poy&?5-uxxU-SsCW zc3Xd@+=vr6rLV5Lf(u~QK#d+5smk zvyoMd24;pvOtY>&>#j~=SLuup!~E)6rB}3XQSD-?RfSsi$gmb7J}qpTxPG}+rZ;^J zTHmMxl~b7cC_AD!xc_OII!sl0Mp0}J@(aG9u1gWRF*{*lma1A(d|_)J>Us$-Q8O}G z6%k;}Q93RK^@t`0l$sYRCQmv%YX_`9^{cV8w@3zzU&z5Ffj)n9cMDqb*HFWyw>ZpJ zm(>tJ(3RAiv*^$R7s5^xkqMA6E}SZch@JTsY*LH5#ei$t%g#O&QIemKD%$U0#D19b`C;koi~K+YAaP4-KgtR@MK*B# z##|!)+F2D@syC3!u$0D5$TdOeHpe%d#P@{k(<)k%rxY*G!9I?D3G)9w0=C>^FE*zJ zyN~fY3c8)YhHXILqpjJ0dCUIs7v+z_Je7>$zzyN;_&atRXG>QHMx}Zc!eo#c@j>6F zz)?1zY*~VNnDXvQqa!|xPL(7=mvq#4)OxO>K0A43!xf;gl^9=fD#kj{QO@(*!DBI0&0oVsH!f%bWbHG^S$Ga;WcD z0m57SqF$43xH5i|ol9OxTbJfpi=WeRkVpR#LBwy80gK@)hcWj=Fvfif4TH@uZe>n}m__BM!1Y@LV=tY0U_~ee{`?+vAXi(J;gI`zyWf2e2;CI;eu(em$x7Qt1607Vf(3)$1O=l~n3jnECkIeY z1pk(g6&ct>n4e7Guo0i0(&+2C8z6Ky`pfe+)co!sX7VQkUx$lWOs9Q>?^_nX^YsIa zc}L14#`}jb6FA*Gec3kc^X2Y`uxM+sL&0nfVE1}LmBaiCePM@W#XoOyc53pY%Qunx z@-Oo$kP`R_%-T7U3To-~U-hW1>=w0u)_=%kgF$Wld!g61l>y$_Q6Lv2$l*;$x;SbPfYzuIkq!n5Z6DR%_xf&C9sws339Hf#fZmiXmDqQCM zPJj0**V&o0P6!3JWU)Xb(L=Bt1TM^vDv}_o%5+&TQh#olopI+IHnnZhU&E>7+rNlQ zPZe97_Ri1TM%`%zuTfBs1GvOddfnrNGej>MNsV_^mq2Fc9dFjqzpt|pcv6J0M$KWE z*(7jjO?RpNsSNvTJ{V|>=7Ej0ji0C4!{|C#n%0Aa8HDt)v~Z>ZQwe)e8UMVf>@6jZ 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 Gt_-r4A(IZ8r(zm5Uic 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

    9Pd$%grUe=_a4&x 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

    Tl5t(e2i(C^4m7%Z!%=_ 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�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%0A1^ot1!%&iD)dVqr;ScZ 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 aINs*QR~;9j#1W)XDSTISSmVb>&ixOqQvu}w literal 0 HcmV?d00001 From 4f2f30392c7c4df64148901ac99a707d56110798 Mon Sep 17 00:00:00 2001 From: Miguel Ferrando Date: Fri, 12 Apr 2024 17:30:08 +0200 Subject: [PATCH 224/509] Fix README's broken links (#6181) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix broken links * Update README.md * Update README.md --------- Co-authored-by: Marek Fořt --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index afb93f4f14e..36a7d30f352 100644 --- a/README.md +++ b/README.md @@ -33,13 +33,13 @@ tuist generate # Generates Xcode project & workspace tuist build # Builds your project ``` -Check out [the project "Get Started" guide](https://docs.tuist.io/documentation/tuist) to learn more about Tuist and all its features. +Check out [the project "Adopting Tuist" guide](https://docs.tuist.io/guide/introduction/adopting-tuist/new-project) to learn more about Tuist and all its features. ## 📝 Documentation Do you want to know more about what Tuist can offer you? Or perhaps want to contribute to the project and you need a starting point? -You can check out [the project documentation](https://docs.tuist.io/documentation/tuist/). +You can check out [the project documentation](https://docs.tuist.io). ### 🔬 Sample projects From a7883795203f17ff19856d05767e0ccb2d0a056c Mon Sep 17 00:00:00 2001 From: Florian Fittschen Date: Fri, 12 Apr 2024 17:30:39 +0200 Subject: [PATCH 225/509] Fix some typos from-v3-to-v4.md (#6180) --- docs/docs/guide/introduction/from-v3-to-v4.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/guide/introduction/from-v3-to-v4.md b/docs/docs/guide/introduction/from-v3-to-v4.md index 52af4bd3278..bdd138f0cbc 100644 --- a/docs/docs/guide/introduction/from-v3-to-v4.md +++ b/docs/docs/guide/introduction/from-v3-to-v4.md @@ -41,7 +41,7 @@ We renamed the `tuist fetch` command to `tuist install` to align with the indust ### [Adopt `Package.swift` as the DSL for dependencies](https://github.com/tuist/tuist/pull/5862) -Before Tuist 4, you could define dependencies in a `Dependencies.swift` file. This proprietary format broke the support in tools like [Dependabot](https://github.com/dependabot) or [Renovatebot](https://github.com/renovatebot/renovate) to automatically update dependencies. Moreover, it introduced unnecessary indirections ofr users. Therefore, we decided to embrace `Package.swift` as the only way to define dependencies in Tuist. If you were using the `Dependencies.swift` file, you'll have to move the content from your `Tuist/Dependencies.swift` to a `Package.swift` at the root, and use the `#if TUIST` directive to configure the integration. You can read more about how to integrate Swift Package dependencies [here](/guide/project/dependencies.html#swift-packages) +Before Tuist 4, you could define dependencies in a `Dependencies.swift` file. This proprietary format broke the support in tools like [Dependabot](https://github.com/dependabot) or [Renovatebot](https://github.com/renovatebot/renovate) to automatically update dependencies. Moreover, it introduced unnecessary indirections for users. Therefore, we decided to embrace `Package.swift` as the only way to define dependencies in Tuist. If you were using the `Dependencies.swift` file, you'll have to move the content from your `Tuist/Dependencies.swift` to a `Package.swift` at the root, and use the `#if TUIST` directive to configure the integration. You can read more about how to integrate Swift Package dependencies [here](/guide/project/dependencies.html#swift-packages) ### Renamed `tuist cache warm` to `tuist cache` @@ -74,7 +74,7 @@ tuist generate Foo ### [Dropped signing capabilities](https://github.com/tuist/tuist/pull/5716) Signing is already solved by community tooling like [Fastlane](https://fastlane.tools/) and Xcode itself, which do a much better job at that. We felt that signing was an stretch goal for Tuist, and that it was better to focus on the core features of the project. If you were using Tuist signing capabilities, which consisted of encrypting the certificates and profiles in the repository and installing them in the right places at generation time, you might want to replicate that logic in your own scripts that run before project generation. In particular: - - A script that decrypts the certificates and profiles using a key either stored in the file-system or in a environment variable, and installs certificates in the keychain, and the provisioning profiles in the directory `~/Library/MobileDevice/Provisioning\ Profiles`. + - A script that decrypts the certificates and profiles using a key either stored in the file-system or in an environment variable, and installs certificates in the keychain, and the provisioning profiles in the directory `~/Library/MobileDevice/Provisioning\ Profiles`. - A script that can take an existing profiles and certificates and encrypt them. > [!TIP] SIGNING REQUIREMENTS From 40138c57c813bcf683d280f656174ed495069550 Mon Sep 17 00:00:00 2001 From: Pedro Date: Fri, 12 Apr 2024 18:15:15 +0200 Subject: [PATCH 226/509] Document the license --- docs/docs/cloud/on-premise.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/docs/cloud/on-premise.md b/docs/docs/cloud/on-premise.md index f59c5478edd..129155f8955 100644 --- a/docs/docs/cloud/on-premise.md +++ b/docs/docs/cloud/on-premise.md @@ -49,6 +49,17 @@ The configuration of the service is done at runtime through environment variable > [!NOTE] LAUNCH CHECKS > The necessary variables are verified at startup. If any are missing, the launch will fail and the error message will detail the absent variables. +### License configuration + +As an on-premise user, you'll receive a license key that you'll need to expose as an environment variable. This key is used to validate the license and ensure that the service is running within the terms of the agreement. + +| Environment variable | Description | Required | Default | Example | +| --- | --- | --- | --- | --- | +| `TUIST_LICENSE` | The license provided after signing the service level agreement | Yes | | `******` | + +> [!IMPORTANT] EXPIRATION DATE +> Licenses have an expiration date. Users will receive a warning while using Tuist commands that interact with Tuist Cloud if the license expires in less than 30 days. If you are interested in renewing your license, please reach out to [contact@tuist.io](mailto:contact@tuist.io). + ### Base environment configuration | Environment variable | Description | Required | Default | Example | From 159c32e4577d3683e0543e8def30606336fbc499 Mon Sep 17 00:00:00 2001 From: Vijay Tholpadi Date: Mon, 15 Apr 2024 21:22:31 +0800 Subject: [PATCH 227/509] Fixes documentation typos (#6190) * Fix documentation typos * Fixes warning about resolving Carthage dependencies before generate/build/test with Tuist * Removes todo about wrapper script as it's already present --- docs/docs/guide/introduction/adopting-tuist/new-project.md | 4 ++-- docs/docs/guide/project/dependencies.md | 3 +-- docs/docs/guide/project/directory-structure.md | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/docs/guide/introduction/adopting-tuist/new-project.md b/docs/docs/guide/introduction/adopting-tuist/new-project.md index 13f4c98a571..c6017a1edbe 100644 --- a/docs/docs/guide/introduction/adopting-tuist/new-project.md +++ b/docs/docs/guide/introduction/adopting-tuist/new-project.md @@ -81,7 +81,7 @@ mkdir MyFramework cd MyFramework ``` -The create a `Tuist/Config.swift` file, which will configure Tuist and is used by Tuist to determine the root directory of the project, and a `Project.swift`, where your project will be declared: +Then create a `Tuist/Config.swift` file, which will configure Tuist and is used by Tuist to determine the root directory of the project, and a `Project.swift`, where your project will be declared: ::: code-group ```swift [Project.swift] @@ -109,4 +109,4 @@ let config = Config() ::: > [!IMPORTANT] -> Tuist uses the `Tuist/` directory to determine the root of your project, and from there it looks for other manifest files globbing the directories. We recommend creating those files with your editor of choice, and from that point on, you can use `tuist edit` to edit the project with Xcode. \ No newline at end of file +> Tuist uses the `Tuist/` directory to determine the root of your project, and from there it looks for other manifest files globbing the directories. We recommend creating those files with your editor of choice, and from that point on, you can use `tuist edit` to edit the project with Xcode. diff --git a/docs/docs/guide/project/dependencies.md b/docs/docs/guide/project/dependencies.md index 8931bfac481..dcaec410001 100644 --- a/docs/docs/guide/project/dependencies.md +++ b/docs/docs/guide/project/dependencies.md @@ -179,8 +179,7 @@ tuist generate ``` > [!WARNING] BUILD AND TEST -> If you build and test your project through `tuist build` and `tuist test` -> +> If you build and test your project through `tuist build` and `tuist test`, you will similarly need to ensure that the Carthage-resolved dependencies are present by running the `carthage update` command before `tuist build` or `tuist test` are run. ### CocoaPods diff --git a/docs/docs/guide/project/directory-structure.md b/docs/docs/guide/project/directory-structure.md index 1685246e068..2d9d4d51705 100644 --- a/docs/docs/guide/project/directory-structure.md +++ b/docs/docs/guide/project/directory-structure.md @@ -36,7 +36,7 @@ Workspace.swift - **Workspace.swift:** This manifest represents an Xcode workspace. It's used to group other projects and can also add additional files and schemes. - **Project.swift:** This manifest represents an Xcode project. It's used to define the targets that are part of the project, and their dependencies. -When interacting with the above project, commads expect to find either a `Workspace.swift` or a `Project.swift` file in the working directory or the directory indicated via the `--path` flag. The manifest should be in a directory or subdirectory of a directory containing a `Tuist` directory, which represents the root of the project. +When interacting with the above project, commands expect to find either a `Workspace.swift` or a `Project.swift` file in the working directory or the directory indicated via the `--path` flag. The manifest should be in a directory or subdirectory of a directory containing a `Tuist` directory, which represents the root of the project. > [!TIP] > Xcode workspaces allowed splitting projects into multiple Xcode projects to reduce the likelihood of merge conflicts. If that's what you were using workspaces for, you don't need them in Tuist. Tuist auto-generates a workspace containing a project and its dependencies' projects. @@ -45,4 +45,4 @@ When interacting with the above project, commads expect to find either a `Worksp Tuist also supports SPM package projects. If you are working on an SPM package, you shouldn't need to update anything. Tuist automatically picks up on your root `Package.swift` and all the features of Tuist work as if it was a `Project.swift` manifest. -To get started, run `tuist install` and `tuist generate` in your SPM package. Your project should now have all the same schemes and files that you would see in the vanilla Xcode SPM integration. However, now you can also run [`tuist cache`](/cloud/binary-caching) and have majority of your SPM dependencies and modules precompiled, making subsequent builds extremely fast. \ No newline at end of file +To get started, run `tuist install` and `tuist generate` in your SPM package. Your project should now have all the same schemes and files that you would see in the vanilla Xcode SPM integration. However, now you can also run [`tuist cache`](/cloud/binary-caching) and have majority of your SPM dependencies and modules precompiled, making subsequent builds extremely fast. From 77acd40b6c1e0e5bcdb36e7a2b731db98a02167e Mon Sep 17 00:00:00 2001 From: danibachar Date: Tue, 16 Apr 2024 00:53:19 -0600 Subject: [PATCH 228/509] Add Cuckoo testing search path (#6195) To allow compilation of Cuckoo dependent targets, I have added Cuckoo into the hard coded list --- Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift | 1 + fixtures/app_with_spm_dependencies/App/Project.swift | 1 + .../App/Tests/AppKit/AppKitTests.swift | 1 + fixtures/app_with_spm_dependencies/Tuist/Package.swift | 2 ++ 4 files changed, 5 insertions(+) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 4657e75b069..f18849cfab0 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -282,6 +282,7 @@ public final class PackageInfoMapper: PackageInfoMapping { "XCTVapor", // https://github.com/vapor/vapor "MockableTest", // https://github.com/Kolos65/Mockable.git "Testing", // https://github.com/apple/swift-testing + "Cuckoo", // https://github.com/Brightify/Cuckoo ].map { ($0, ["ENABLE_TESTING_SEARCH_PATHS": "YES"]) } diff --git a/fixtures/app_with_spm_dependencies/App/Project.swift b/fixtures/app_with_spm_dependencies/App/Project.swift index e2fa5917552..1c9b3032a41 100644 --- a/fixtures/app_with_spm_dependencies/App/Project.swift +++ b/fixtures/app_with_spm_dependencies/App/Project.swift @@ -58,6 +58,7 @@ let project = Project( .target(name: "AppKit"), .external(name: "Nimble"), .external(name: "Testing"), + .external(name: "Cuckoo"), ], settings: .targetSettings ), diff --git a/fixtures/app_with_spm_dependencies/App/Tests/AppKit/AppKitTests.swift b/fixtures/app_with_spm_dependencies/App/Tests/AppKit/AppKitTests.swift index 9d9da04bc65..85cf7b5bb37 100644 --- a/fixtures/app_with_spm_dependencies/App/Tests/AppKit/AppKitTests.swift +++ b/fixtures/app_with_spm_dependencies/App/Tests/AppKit/AppKitTests.swift @@ -1,3 +1,4 @@ +import Cuckoo import Nimble import Testing diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.swift b/fixtures/app_with_spm_dependencies/Tuist/Package.swift index f665fa2cfe9..b69cf5cb6ac 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/Package.swift +++ b/fixtures/app_with_spm_dependencies/Tuist/Package.swift @@ -41,5 +41,7 @@ let package = Package( .package(path: "../LocalSwiftPackage"), .package(path: "../StringifyMacro"), .package(url: "https://github.com/kishikawakatsumi/UICKeyChainStore", exact: "2.2.1"), + // Has XCTest API in a non-test target. Tuist will add Test Search path to support it + .package(url: "https://github.com/Brightify/Cuckoo.git", exact: "1.10.4"), ] ) From 895ef48c7d89e6d8623898c558ede525fbc435c1 Mon Sep 17 00:00:00 2001 From: rsarv3006 <77516949+rsarv3006@users.noreply.github.com> Date: Tue, 16 Apr 2024 03:02:30 -0500 Subject: [PATCH 229/509] Update docs for automaticCodeSigning devTeam to refer to apple docs on finding your devteam ID (#6173) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update docs for automaticCodeSigning to indicate it's looking for the devTeam ID string * Update Sources/ProjectDescription/SettingsTransformers.swift Co-authored-by: Marek Fořt * Fix for linting - line length --------- Co-authored-by: Marek Fořt --- Sources/ProjectDescription/SettingsTransformers.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Sources/ProjectDescription/SettingsTransformers.swift b/Sources/ProjectDescription/SettingsTransformers.swift index f07d9b17d40..5bb8da3b1e7 100644 --- a/Sources/ProjectDescription/SettingsTransformers.swift +++ b/Sources/ProjectDescription/SettingsTransformers.swift @@ -55,6 +55,9 @@ extension SettingsDictionary { } /// Sets `"CODE_SIGN_STYLE"` to `"Automatic"` and `"DEVELOPMENT_TEAM"` to `devTeam` + /// - Parameters: + /// - devTeam: Your Apple Developer Team ID. See + /// [here](https://developer.apple.com/help/account/manage-your-team/locate-your-team-id/) how you can find it. public func automaticCodeSigning(devTeam: String) -> SettingsDictionary { merging([ "CODE_SIGN_STYLE": "Automatic", From 88a176331ddb8b965849cbf5339370e13b41ec9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 16 Apr 2024 10:03:08 +0200 Subject: [PATCH 230/509] Fix missing external target settings with config conditions (#6170) * Fix external target settings with config condition * Address PR feedback * Update Package.resolved of app_with_spm_dependencies --- Sources/TuistGraph/Models/Settings.swift | 4 +- .../PackageInfoMapper.swift | 39 +++++----- .../SwiftPackageManager/SettingsMapper.swift | 72 ++++++++++++------- .../PackageInfoMapperTests.swift | 30 +++++++- .../SettingsMapperTests.swift | 20 +++--- .../App/Project.swift | 1 + .../Tuist/Package.resolved | 21 +++++- .../Tuist/Package.swift | 1 + 8 files changed, 130 insertions(+), 58 deletions(-) diff --git a/Sources/TuistGraph/Models/Settings.swift b/Sources/TuistGraph/Models/Settings.swift index 78b054767fa..cd4876921f6 100644 --- a/Sources/TuistGraph/Models/Settings.swift +++ b/Sources/TuistGraph/Models/Settings.swift @@ -76,8 +76,8 @@ extension SettingsDictionary { public struct Configuration: Equatable, Codable { // MARK: - Attributes - public let settings: SettingsDictionary - public let xcconfig: AbsolutePath? + public var settings: SettingsDictionary + public var xcconfig: AbsolutePath? // MARK: - Init diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index f18849cfab0..a8da43d12b3 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -997,7 +997,26 @@ extension ProjectDescription.Settings { mappedSettingsDictionary.merge(projectDescriptionSettingsToOverride) } - return .from(settings: baseSettings, adding: mappedSettingsDictionary, packageFolder: packageFolder) + let configurations: [ProjectDescription.Configuration] = try baseSettings.configurations + .map { buildConfiguration, configuration in + var configuration = configuration ?? Configuration(settings: [:]) + configuration.settings = configuration.settings.merging( + try mapper.settingsForBuildConfiguration(buildConfiguration.name), + uniquingKeysWith: { $1 } + ) + return .from( + buildConfiguration: buildConfiguration, + configuration: configuration, + packageFolder: packageFolder + ) + } + + return .settings( + base: .from(settingsDictionary: baseSettings.base).merging(mappedSettingsDictionary, uniquingKeysWith: { $1 }), + configurations: configurations + .sorted { $0.name.rawValue < $1.name.rawValue }, + defaultSettings: .from(defaultSettings: baseSettings.defaultSettings) + ) } fileprivate struct PackageTarget: Hashable { @@ -1085,24 +1104,6 @@ extension ProjectDescription.SettingsDictionary { } } -extension ProjectDescription.Settings { - public static func from( - settings: TuistGraph.Settings, - adding: ProjectDescription.SettingsDictionary, - packageFolder: AbsolutePath - ) -> Self { - .settings( - base: .from(settingsDictionary: settings.base).merging(adding, uniquingKeysWith: { $1 }), - configurations: settings.configurations - .map { buildConfiguration, configuration in - .from(buildConfiguration: buildConfiguration, configuration: configuration, packageFolder: packageFolder) - } - .sorted { $0.name.rawValue < $1.name.rawValue }, - defaultSettings: .from(defaultSettings: settings.defaultSettings) - ) - } -} - extension ProjectDescription.Configuration { public static func from( buildConfiguration: BuildConfiguration, diff --git a/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift b/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift index 7ce66a26e93..0035101f0b1 100644 --- a/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift @@ -19,33 +19,55 @@ struct SettingsMapper { private let mainRelativePath: RelativePath private let settings: [PackageInfo.Target.TargetBuildSettingDescription.Setting] - // `nil` means settings without a condition - private func settingsForPlatform(_ platformName: String?) throws - -> [PackageInfo.Target.TargetBuildSettingDescription.Setting] - { - settings.filter { setting in - if let platformName, setting.hasConditions { - return setting.condition?.platformNames.contains(platformName) == true - } else { - return !setting.hasConditions - } + func settingsForPlatforms(_ platforms: [PackageInfo.Platform]) throws -> TuistGraph.SettingsDictionary { + var resolvedSettings = try settingsDictionary() + + for platform in platforms.sorted(by: { $0.platformName < $1.platformName }) { + let platformSettings = try settingsDictionary(for: platform) + resolvedSettings.overlay(with: platformSettings, for: try platform.graphPlatform()) } + + return resolvedSettings + } + + func settingsForBuildConfiguration( + _ buildConfiguration: String + ) throws -> TuistGraph.SettingsDictionary { + try map( + settings: settings.filter { setting in + return setting.hasConditions && setting.condition?.config?.uppercasingFirst == buildConfiguration + } + ) } // swiftlint:disable:next function_body_length - func settingsDictionaryForPlatform(_ platform: PackageInfo.Platform?) throws -> TuistGraph.SettingsDictionary { + func settingsDictionary(for platform: PackageInfo.Platform? = nil) throws -> TuistGraph.SettingsDictionary { + let platformSettings = try settings(for: platform?.platformName) + + return try map( + settings: platformSettings, + headerSearchPaths: headerSearchPaths, + defines: ["SWIFT_PACKAGE": "1"], + swiftDefines: "SWIFT_PACKAGE" + ) + } + + private func map( + settings: [PackageInfo.Target.TargetBuildSettingDescription.Setting], + headerSearchPaths: [String] = [], + defines: [String: String] = [:], + swiftDefines: String = "" + ) throws -> TuistGraph.SettingsDictionary { var headerSearchPaths = headerSearchPaths - var defines = ["SWIFT_PACKAGE": "1"] - var swiftDefines = "SWIFT_PACKAGE" + var defines = defines + var swiftDefines = swiftDefines var cFlags: [String] = [] var cxxFlags: [String] = [] var swiftFlags: [String] = [] var linkerFlags: [String] = [] var settingsDictionary = TuistGraph.SettingsDictionary() - let platformSettings = try settingsForPlatform(platform?.platformName) - - for setting in platformSettings { + for setting in settings { switch (setting.tool, setting.name) { case (.c, .headerSearchPath), (.cxx, .headerSearchPath): headerSearchPaths.append("$(SRCROOT)/\(mainRelativePath.pathString)/\(setting.value[0])") @@ -113,15 +135,17 @@ struct SettingsMapper { return settingsDictionary } - func settingsForPlatforms(_ platforms: [PackageInfo.Platform]) throws -> TuistGraph.SettingsDictionary { - var resolvedSettings = try settingsDictionaryForPlatform(nil) - - for platform in platforms.sorted(by: { $0.platformName < $1.platformName }) { - let platformSettings = try settingsDictionaryForPlatform(platform) - resolvedSettings.overlay(with: platformSettings, for: try platform.graphPlatform()) + // `nil` means settings without a condition + private func settings(for platformName: String?) throws + -> [PackageInfo.Target.TargetBuildSettingDescription.Setting] + { + settings.filter { setting in + if let platformName, setting.hasConditions { + return setting.condition?.platformNames.contains(platformName) == true + } else { + return !setting.hasConditions + } } - - return resolvedSettings } } diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index cfe5e603806..4e069310138 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -611,6 +611,15 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .init(tool: .c, name: .define, condition: nil, value: ["FOO1=\"BAR1\""]), .init(tool: .cxx, name: .define, condition: nil, value: ["FOO2=\"BAR2\""]), .init(tool: .cxx, name: .define, condition: nil, value: ["FOO3=3"]), + .init( + tool: .cxx, + name: .define, + condition: PackageInfo.PackageConditionDescription( + platformNames: [], + config: "debug" + ), + value: ["FOO_DEBUG=1"] + ), ] ), ], @@ -621,7 +630,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), ] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", @@ -629,6 +638,23 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, + baseSettings: .settings( + configurations: [ + .debug( + name: .debug, + settings: [ + "GCC_PREPROCESSOR_DEFINITIONS": [ + "$(inherited)", + "FOO_DEBUG=1", + ], + ] + ), + .release( + name: .release, + settings: [:] + ), + ] + ), customSettings: [ "GCC_PREPROCESSOR_DEFINITIONS": [ // Escaped @@ -1064,7 +1090,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), ] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift index 42348267082..7cbbd1bc8b7 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift @@ -20,7 +20,7 @@ final class SettingsMapperTests: XCTestCase { settings: [] ) - let resolvedSettings = try mapper.settingsDictionaryForPlatform(nil) + let resolvedSettings = try mapper.settingsDictionary() XCTAssertEqual(resolvedSettings, [ "GCC_PREPROCESSOR_DEFINITIONS": .array(["$(inherited)", @@ -44,7 +44,7 @@ final class SettingsMapperTests: XCTestCase { settings: settings ) - let resolvedSettings = try mapper.settingsDictionaryForPlatform(nil) + let resolvedSettings = try mapper.settingsDictionary() XCTAssertEqual( resolvedSettings["GCC_PREPROCESSOR_DEFINITIONS"], @@ -72,7 +72,7 @@ final class SettingsMapperTests: XCTestCase { settings: settings ) - let resolvedSettings = try mapper.settingsDictionaryForPlatform(nil) + let resolvedSettings = try mapper.settingsDictionary() XCTAssertEqual( resolvedSettings["HEADER_SEARCH_PATHS"], @@ -93,7 +93,7 @@ final class SettingsMapperTests: XCTestCase { settings: settings ) - let resolvedSettings = try mapper.settingsDictionaryForPlatform(nil) + let resolvedSettings = try mapper.settingsDictionary() XCTAssertEqual( resolvedSettings["SWIFT_ACTIVE_COMPILATION_CONDITIONS"], @@ -112,7 +112,7 @@ final class SettingsMapperTests: XCTestCase { settings: settings ) - let resolvedSettings = try mapper.settingsDictionaryForPlatform(nil) + let resolvedSettings = try mapper.settingsDictionary() XCTAssertEqual( resolvedSettings["OTHER_CFLAGS"], @@ -131,7 +131,7 @@ final class SettingsMapperTests: XCTestCase { settings: settings ) - let resolvedSettings = try mapper.settingsDictionaryForPlatform(nil) + let resolvedSettings = try mapper.settingsDictionary() XCTAssertEqual( resolvedSettings["OTHER_CPLUSPLUSFLAGS"], @@ -152,7 +152,7 @@ final class SettingsMapperTests: XCTestCase { settings: settings ) - let resolvedSettings = try mapper.settingsDictionaryForPlatform(nil) + let resolvedSettings = try mapper.settingsDictionary() XCTAssertEqual( resolvedSettings["OTHER_SWIFT_FLAGS"], @@ -176,7 +176,7 @@ final class SettingsMapperTests: XCTestCase { settings: settings ) - let resolvedSettings = try mapper.settingsDictionaryForPlatform(nil) + let resolvedSettings = try mapper.settingsDictionary() XCTAssertEqual( resolvedSettings["OTHER_LDFLAGS"], @@ -204,14 +204,14 @@ final class SettingsMapperTests: XCTestCase { settings: settings ) - let allPlatformSettings = try mapper.settingsDictionaryForPlatform(nil) + let allPlatformSettings = try mapper.settingsDictionary() XCTAssertEqual( allPlatformSettings["SWIFT_ACTIVE_COMPILATION_CONDITIONS"], .string("$(inherited) SWIFT_PACKAGE Define1") ) - let iosPlatformSettings = try mapper.settingsDictionaryForPlatform(.ios) + let iosPlatformSettings = try mapper.settingsDictionary(for: .ios) XCTAssertEqual( iosPlatformSettings["SWIFT_ACTIVE_COMPILATION_CONDITIONS"], diff --git a/fixtures/app_with_spm_dependencies/App/Project.swift b/fixtures/app_with_spm_dependencies/App/Project.swift index 1c9b3032a41..118dc196f34 100644 --- a/fixtures/app_with_spm_dependencies/App/Project.swift +++ b/fixtures/app_with_spm_dependencies/App/Project.swift @@ -44,6 +44,7 @@ let project = Project( .external(name: "AirshipPreferenceCenter"), .external(name: "MarkdownUI"), .external(name: "GoogleMobileAds"), + .external(name: "LookinServer"), ], settings: .targetSettings ), diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.resolved b/fixtures/app_with_spm_dependencies/Tuist/Package.resolved index be250eab6bd..94bd38db4b4 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/Package.resolved +++ b/fixtures/app_with_spm_dependencies/Tuist/Package.resolved @@ -1,4 +1,5 @@ { + "originHash" : "d97ce5778061e5c442f34dc995c6b958648d4f6c778b322c7334b33b5231fd13", "pins" : [ { "identity" : "alamofire", @@ -45,6 +46,15 @@ "version" : "1.0.0" } }, + { + "identity" : "cuckoo", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Brightify/Cuckoo.git", + "state" : { + "revision" : "0cfbb729d0aced6494c19c58c0c31ea16d1cbf66", + "version" : "1.10.4" + } + }, { "identity" : "cwlcatchexception", "kind" : "remoteSourceControl", @@ -99,6 +109,15 @@ "version" : "17.7.3" } }, + { + "identity" : "lookinserver", + "kind" : "remoteSourceControl", + "location" : "https://github.com/QMUI/LookinServer", + "state" : { + "revision" : "e553d1b689d147817dc54ad5c28fcff71e860101", + "version" : "1.2.8" + } + }, { "identity" : "networkimage", "kind" : "remoteSourceControl", @@ -370,5 +389,5 @@ } } ], - "version" : 2 + "version" : 3 } diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.swift b/fixtures/app_with_spm_dependencies/Tuist/Package.swift index b69cf5cb6ac..10425b1f634 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/Package.swift +++ b/fixtures/app_with_spm_dependencies/Tuist/Package.swift @@ -41,6 +41,7 @@ let package = Package( .package(path: "../LocalSwiftPackage"), .package(path: "../StringifyMacro"), .package(url: "https://github.com/kishikawakatsumi/UICKeyChainStore", exact: "2.2.1"), + .package(url: "https://github.com/QMUI/LookinServer", from: "1.2.8"), // Has XCTest API in a non-test target. Tuist will add Test Search path to support it .package(url: "https://github.com/Brightify/Cuckoo.git", exact: "1.10.4"), ] From 5e5536df66dfb9e8b4fe2b7b4da4d2b8b377a4f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:01:36 +0200 Subject: [PATCH 231/509] Document manifest files (#6197) * Document manifest files * Explain why we include the project --- docs/.vitepress/config.mjs | 4 ++ .../docs/guide/project/directory-structure.md | 9 +-- docs/docs/guide/project/manifests.md | 68 +++++++++++++++++++ 3 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 docs/docs/guide/project/manifests.md diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index d20f6f6cfe2..7ca8d3fd79e 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -85,6 +85,10 @@ const guideSidebar = [ { text: "Project", items: [ + { + text: "Manifests", + link: "/guide/project/manifests", + }, { text: "Directory structure", link: "/guide/project/directory-structure", diff --git a/docs/docs/guide/project/directory-structure.md b/docs/docs/guide/project/directory-structure.md index 2d9d4d51705..07a46d0be32 100644 --- a/docs/docs/guide/project/directory-structure.md +++ b/docs/docs/guide/project/directory-structure.md @@ -11,9 +11,6 @@ Although Tuist projects are commonly used to supersede Xcode projects, they are Tuist projects are **the most common type of project generated by Tuist.** They are used to build apps, frameworks, and libraries among others. Unlike Xcode projects, Tuist projects are defined in Swift, which makes them more flexible and easier to maintain. Tuist projects are also more declarative, which makes them easier to understand and reason about. The following structure shows a typical Tuist project that generates an Xcode project: -> [!INFO] MANIFEST FILES -> The definition files are referred to as **manifest files** throughout the documentation. - ```bash Tuist/ Config.swift @@ -28,13 +25,13 @@ Workspace.swift ``` - **Tuist directory:** This directory has two purposes. First, it signals **where the root of the project is**. This allows constructing paths relative to the root of the project, and also also running Tuist commands from any directory within the project. Second, it's the container for the following files: - - **Config.swift:** This file contains configuration for Tuist that's shared across all the projects, workspaces, and environments. For example, it can be used to disable automatic generation of schemes, or to define the deployment target of the projects. + - [**Config.swift:**](/guide/project/manifests.html#config-swift) This file contains configuration for Tuist that's shared across all the projects, workspaces, and environments. For example, it can be used to disable automatic generation of schemes, or to define the deployment target of the projects. - **ProjectDescriptionHelpers:** This directory contains Swift code that's shared across all the manifest files. Manifest files can `import ProjectDescriptionHelpers` to use the code defined in this directory. Sharing code is useful to avoid duplications and ensure consistency across the projects. - **Package.swift:** This file contains Swift Package dependencies for Tuist to integrate them using Xcode projects and targets (like [CocoaPods](https://cococapods)) that are configurable and optimizable. Learn more [here](doc:dependencies). - **Root directory**: The root directory of your project that also contains the `Tuist` directory. - - **Workspace.swift:** This manifest represents an Xcode workspace. It's used to group other projects and can also add additional files and schemes. - - **Project.swift:** This manifest represents an Xcode project. It's used to define the targets that are part of the project, and their dependencies. + - [**Workspace.swift:**](/guide/project/manifests.html#workspace-swift) This manifest represents an Xcode workspace. It's used to group other projects and can also add additional files and schemes. + - [**Project.swift:**](/guide/project/manifests.html#project-swift) This manifest represents an Xcode project. It's used to define the targets that are part of the project, and their dependencies. When interacting with the above project, commands expect to find either a `Workspace.swift` or a `Project.swift` file in the working directory or the directory indicated via the `--path` flag. The manifest should be in a directory or subdirectory of a directory containing a `Tuist` directory, which represents the root of the project. diff --git a/docs/docs/guide/project/manifests.md b/docs/docs/guide/project/manifests.md new file mode 100644 index 00000000000..5c3dede790d --- /dev/null +++ b/docs/docs/guide/project/manifests.md @@ -0,0 +1,68 @@ +--- +title: Manifests +description: Learn about the manifest files that Tuist uses to define projects and workspaces and configure the generation process. +--- + +# Manifests + +Tuist defaults to Swift files as the primary way to define projects and workspaces and configure the generation process. These files are referred to as **manifest files** throughout the documentation. + +The decision of using Swift was inspired by the [Swift Package Manager](https://www.swift.org/documentation/package-manager/), which also uses Swift files to define packages. Thanks to the usage of Swift, we can leverage the compiler to validate the correctness of the content and reuse code across different manifest files, and Xcode to provide a first-class editing experience thanks to the syntax highlighting, auto-completion, and validation. + +> [!NOTE] CACHING +> Since manifest files are Swift files that need to be compiled, Tuist caches the compilation results to speed up the parsing process. Therefore, you'll notice that the first time you run Tuist, it might take a bit longer to generate the project. Subsequent runs will be faster. + +## Project.swift + +The [`Project.swift`](/reference/project-description/project) manifest declares an Xcode project. The project gets generated in the same directory where the manifest file is located with the name indicated in the `name` property. + +```swift +// Project.swift +let project = Project( + name: "App", + targets: [ + // .... + ] +) +``` + + +> [!WARNING] ROOT VARIABLES +> The only variable that should be at the root of the manifest is `let project = Project(...)`. If you need to reuse code across various parts of the manifest, you can use Swift functions. + +## Workspace.swift + +By default, Tuist generates an [Xcode Workspace](https://developer.apple.com/documentation/xcode/projects-and-workspaces) containing the project being generated and the projects of its dependencies. If for any reason you'd like to customize the workspace to add additional projects or include files and groups, you can do so by defining a [`Workspace.swift`](/reference/project-description/workspace) manifest. + +```swift +// Workspace.swift +import ProjectDescription + +let workspace = Workspace( + name: "App-Workspace", + projects: [ + "./App", // Path to directory containing the Project.swift file + ] +) +``` + +> [!NOTE] +> Tuist will resolve the dependency graph and include the projects of the dependencies in the workspace. You don't need to include them manually. This is necessary for the build system to resolve the dependencies correctly. + +### Multi or mono-project + +A question that often comes up is whether to use a single project or multiple projects in a workspace. In a world without Tuist where a mono-project setup would lead to frequent Git conflicts the usage of workspaces is encouraged. However, since we don't recommend including the Tuist-generated Xcode projects in the Git repository, Git conflicts are not an issue. Therefore, the decision of using a single project or multiple projects in a workspace is up to you. + +In the Tuist project we lean on mono-projects because the cold generation time is faster (fewer manifest files to compiler) and we leverage [project description helpers](/guide/project/code-sharing) as a unit of encapsulation. However, you might want to use Xcode projects as a unit of encapsulation to represent different domains of your application, which aligns more closely with the Xcode's recommended project structure. + +## Config.swift + +Tuist provides [sensible defaults](/contributors/principles.html#default-to-conventions) to simplify project configuration. However, you can customize the configuration by defining a [`Config.swift`](/reference/project-description/config) manifest under the `Tuist` directory, which is used by Tuist to determine the root of the project. + +```swift +import ProjectDescription + +let config = Config( + generationOptions: .options(enforceExplicitDependencies: true) +) +``` \ No newline at end of file From aa91701c29307aa69ed4d0b0c7658fe7d1b14175 Mon Sep 17 00:00:00 2001 From: Ihor Savynskyi Date: Fri, 19 Apr 2024 10:25:42 +0300 Subject: [PATCH 232/509] Fix documentation typos (#6204) --- docs/docs/guide/automation/clean.md | 2 +- docs/docs/guide/automation/graph.md | 4 ++-- .../introduction/adopting-tuist/migrate-from-xcodeproj.md | 6 +++--- docs/docs/guide/introduction/cost-of-convenience.md | 2 +- docs/docs/guide/introduction/from-v3-to-v4.md | 2 +- docs/docs/guide/project/dynamic-configuration.md | 2 +- docs/docs/guide/project/manifests.md | 2 +- docs/docs/guide/project/plugins.md | 4 ++-- docs/docs/guide/project/templates.md | 2 +- docs/docs/index.md | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/docs/guide/automation/clean.md b/docs/docs/guide/automation/clean.md index 000e0dbd3bc..294cf8b0234 100644 --- a/docs/docs/guide/automation/clean.md +++ b/docs/docs/guide/automation/clean.md @@ -21,7 +21,7 @@ The following are the categories of caches that Tuist manages: | `manifests` | JSON-serialized manifest files to speed up project generation | Global | | `dependencies` | SPM dependencies fetched by Tuist | Project | -You can can pass one or multiple categories to the `tuist clean` command. For example, to clean the `binaries` and `plugins` categories, you can run: +You can pass one or multiple categories to the `tuist clean` command. For example, to clean the `binaries` and `plugins` categories, you can run: ::: code-group ```bash [Clean plugins and binaries] diff --git a/docs/docs/guide/automation/graph.md b/docs/docs/guide/automation/graph.md index 225a3748f57..6273b9e7f00 100644 --- a/docs/docs/guide/automation/graph.md +++ b/docs/docs/guide/automation/graph.md @@ -5,7 +5,7 @@ description: Tuist provides a command to output and visualize a project graph # Graph -One of the advantages of extracting the project graph from from its implicitly codified form in Xcode projects and workspaces, is that Tuist knows it ahead of time and can provides useful features to developers. One of those features is the ability to export and visualize the graph through the `tuist graph` command. +One of the advantages of extracting the project graph from its implicitly codified form in Xcode projects and workspaces, is that Tuist knows it ahead of time and can provide useful features to developers. One of those features is the ability to export and visualize the graph through the `tuist graph` command. ## Graph image @@ -40,4 +40,4 @@ You can use some flags to filter nodes from the graph: - `--platform`: A platform to filter. Only targets for this platform will be showed in the graph. Available platforms: `ios`, `macos`, `tvos`, `watchos` > [!NOTE] PLANNED IMPROVEMENTS -> The filtering options are not flexible enough and can grow into an incosistent filtering interface. We are aware of that and we have plans to come up with a language that's universal across various commands. \ No newline at end of file +> The filtering options are not flexible enough and can grow into an inconsistent filtering interface. We are aware of that and we have plans to come up with a language that's universal across various commands. diff --git a/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md b/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md index a79ce1c3f3d..6896de4555b 100644 --- a/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md +++ b/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md @@ -10,14 +10,14 @@ next: Unless you [create a new project using Tuist](/guide/introduction/adopting-tuist/new-project), in which case you get everything configured automatically, you'll have to define your Xcode projects using Tuist's primitives. **How tedious this process is, depends on how complex your projects are.** -As you probably know, Xcode projects can become messy and complex over time: *groups that don't match the directory structure, files that are shared across targets, or file references that point to nonexisting files (to mention some).* All that accumulated complexity makes it hard for us to provide a command that reliably ports migrates project. +As you probably know, Xcode projects can become messy and complex over time: *groups that don't match the directory structure, files that are shared across targets, or file references that point to nonexisting files (to mention some).* All that accumulated complexity makes it hard for us to provide a command that reliably migrates project. Moreover, **manual migration is an excellent exercise to clean up and simplify your projects.** Not only the developers in your project will be thankful for that, but Xcode, who will be faster processing and indexing them. Once you have fully adopted Tuist, it will make sure that projects are consistently defined and that they remain simple. In the aim of easing that work, we are giving you some guidelines based on the feedback that we have received from the users. > [!TIP] SCALING A MATURE IOS CODEBASE WITH TUIST -> You won't be the first one to migrate a mature iOS codebase to Tuist.You can read how [Asana](https://asana.com/inside-asana/scaling-a-mature-ios-codebase-with-tuist) migrated theirs and the impact that it had on their development workflows, or how [Bumble](https://medium.com/bumble-tech/scaling-ios-at-bumble-76754fa874f7) evaluated Bazel, Tuist, and SPM and ultimately chose Tuist. +> You won't be the first one to migrate a mature iOS codebase to Tuist. You can read how [Asana](https://asana.com/inside-asana/scaling-a-mature-ios-codebase-with-tuist) migrated theirs and the impact that it had on their development workflows, or how [Bumble](https://medium.com/bumble-tech/scaling-ios-at-bumble-76754fa874f7) evaluated Bazel, Tuist, and SPM and ultimately chose Tuist. ## Extract your build settings into `.xcconfig` files @@ -71,4 +71,4 @@ They allow defining your own abstractions for defining your projects, and most i Here's a list of community-developed tools that can aid you on the migration process: - [xcdiff](https://github.com/bloomberg/xcdiff): A tool which helps you diff xcodeproj files. -- [Xcode Build Settings](https://xcodebuildsettings.com/): A reference for all the build settings available and their meaning. \ No newline at end of file +- [Xcode Build Settings](https://developer.apple.com/documentation/xcode/build-settings-reference): A reference for all the build settings available and their meaning. diff --git a/docs/docs/guide/introduction/cost-of-convenience.md b/docs/docs/guide/introduction/cost-of-convenience.md index 1901c68b70c..7d99fd406d4 100644 --- a/docs/docs/guide/introduction/cost-of-convenience.md +++ b/docs/docs/guide/introduction/cost-of-convenience.md @@ -5,7 +5,7 @@ description: Learn about the cost of convenience in Xcode and how Tuist helps yo # The cost of convenience -Before continuing, let's take a moment to consider the cost of convenience in [Xcode](https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://developer.apple.com/xcodenp/&ved=2ahUKEwik55Xo35-FAxVqxzgGHZAZCz4QFnoECAYQAQ&usg=AOvVaw28WTg1BlCGAf937pcwXMip). +Before continuing, let's take a moment to consider the cost of convenience in [Xcode](https://developer.apple.com/xcode). Designing a code editor that the spectrum **from small to large-scale projects can use** is a challenging task. Many tools approach the problem by layering their solution and providing extensibility. The bottom-most layer is very low-level and close to the underlying build system, and the top-most layer is a high-level abstraction that's convenient to use but less flexible. diff --git a/docs/docs/guide/introduction/from-v3-to-v4.md b/docs/docs/guide/introduction/from-v3-to-v4.md index bdd138f0cbc..10393e69046 100644 --- a/docs/docs/guide/introduction/from-v3-to-v4.md +++ b/docs/docs/guide/introduction/from-v3-to-v4.md @@ -9,7 +9,7 @@ With the release of [Tuist 4](https://github.com/tuist/tuist/releases/tag/4.0.0) ### Dropped version management through `tuistenv` -Prior to Tuist 4, the installation script installed a tool, `tuistenv`, that would get rename to `tuist` at installation time. The tool would take care of installing and activating versions of Tuist ensuring determinsm across environments. With the aim of reducing the feature surface of Tuist, we decided to drop `tuistenv` in favor of [Mise](https://mise.jdx.dev/), a tool that does the same job but is more flexible and can be used across different tools. If you were using `tuistenv`, you'll have to uninstall the current version of Tuist by running `curl -Ls https://uninstall.tuist.io | bash` and then install it using the installation method of your choice. We strongly recommend the usage of Mise because it's able to install and activate versions deterministically across environments. +Prior to Tuist 4, the installation script installed a tool, `tuistenv`, that would get renamed to `tuist` at installation time. The tool would take care of installing and activating versions of Tuist ensuring determinism across environments. With the aim of reducing the feature surface of Tuist, we decided to drop `tuistenv` in favor of [Mise](https://mise.jdx.dev/), a tool that does the same job but is more flexible and can be used across different tools. If you were using `tuistenv`, you'll have to uninstall the current version of Tuist by running `curl -Ls https://uninstall.tuist.io | bash` and then install it using the installation method of your choice. We strongly recommend the usage of Mise because it's able to install and activate versions deterministically across environments. ::: code-group diff --git a/docs/docs/guide/project/dynamic-configuration.md b/docs/docs/guide/project/dynamic-configuration.md index 2dceaa867d8..b25543b5813 100644 --- a/docs/docs/guide/project/dynamic-configuration.md +++ b/docs/docs/guide/project/dynamic-configuration.md @@ -5,7 +5,7 @@ description: Learn how how to use environment variables to dynamically configure # Dynamic configuration -There are certain scenarios where you might need to dynamically change to dynamically configure your project at generation time. For example, you might want to change the name of the app, the bundle identifier, or the deployment target based on the environment where the project is being generated. Tuist supports that via environment variables, which can be accessed from the manifest files. +There are certain scenarios where you might need to dynamically configure your project at generation time. For example, you might want to change the name of the app, the bundle identifier, or the deployment target based on the environment where the project is being generated. Tuist supports that via environment variables, which can be accessed from the manifest files. ## Configuration through environment variables diff --git a/docs/docs/guide/project/manifests.md b/docs/docs/guide/project/manifests.md index 5c3dede790d..df6368f23bf 100644 --- a/docs/docs/guide/project/manifests.md +++ b/docs/docs/guide/project/manifests.md @@ -53,7 +53,7 @@ let workspace = Workspace( A question that often comes up is whether to use a single project or multiple projects in a workspace. In a world without Tuist where a mono-project setup would lead to frequent Git conflicts the usage of workspaces is encouraged. However, since we don't recommend including the Tuist-generated Xcode projects in the Git repository, Git conflicts are not an issue. Therefore, the decision of using a single project or multiple projects in a workspace is up to you. -In the Tuist project we lean on mono-projects because the cold generation time is faster (fewer manifest files to compiler) and we leverage [project description helpers](/guide/project/code-sharing) as a unit of encapsulation. However, you might want to use Xcode projects as a unit of encapsulation to represent different domains of your application, which aligns more closely with the Xcode's recommended project structure. +In the Tuist project we lean on mono-projects because the cold generation time is faster (fewer manifest files to compile) and we leverage [project description helpers](/guide/project/code-sharing) as a unit of encapsulation. However, you might want to use Xcode projects as a unit of encapsulation to represent different domains of your application, which aligns more closely with the Xcode's recommended project structure. ## Config.swift diff --git a/docs/docs/guide/project/plugins.md b/docs/docs/guide/project/plugins.md index 5371aa6a2dd..a89f1c54559 100644 --- a/docs/docs/guide/project/plugins.md +++ b/docs/docs/guide/project/plugins.md @@ -93,7 +93,7 @@ Tasks are `$PATH`-exposed executables that are invocable through the `tuist` com If you were using Tuist for distributing tasks, we recommend building your - You can continue using the `ProjectAutomation.xcframework` distributed with every Tuist release to have access to the project graph from your logic with `let graph = try Tuist.graph()`. The command uses sytem process to run the `tuist` command, and return the in-memory representation of the project graph. -- To distribute tasks, we recommend including the a fat binary that supports the `arm64` and `x86_64` in GitHub releases, and using [Mise](https://mise.jdx.dev) as an installation tool. To insturct Mise on how to install your tool, you'll need a plugin repository. You can use [Tuist's](https://github.com/asdf-community/asdf-tuist) as a reference. +- To distribute tasks, we recommend including the a fat binary that supports the `arm64` and `x86_64` in GitHub releases, and using [Mise](https://mise.jdx.dev) as an installation tool. To instruct Mise on how to install your tool, you'll need a plugin repository. You can use [Tuist's](https://github.com/asdf-community/asdf-tuist) as a reference. - If you name your tool `tuist-{xxx}` and users can install it by running `mise install`, they can run it either invoking it directly, or through `tuist xxx`. > [!NOTE] THE FUTURE OF PROJECTAUTOMATION @@ -134,7 +134,7 @@ After adding the plugins, `tuist install` will fetch the plugins in a global cac > As you might have noted, we don't provide version resolution for plugins. We recommend using Git tags or SHAs to ensure reproducibility. > [!TIP] PROJECT DESCRIPTION HELPERS PLUGINS -> Whe using a project description helpers plugin, the name of the module that contains the helpers is the name of the plugin +> When using a project description helpers plugin, the name of the module that contains the helpers is the name of the plugin > ```swift > import ProjectDescription > import MyTuistPlugin diff --git a/docs/docs/guide/project/templates.md b/docs/docs/guide/project/templates.md index 4d4f20ffd48..6a45db50bee 100644 --- a/docs/docs/guide/project/templates.md +++ b/docs/docs/guide/project/templates.md @@ -5,7 +5,7 @@ description: Learn how to create and use templates in Tuist to generate code in # Templates -In projects with an established architecture, developers might want to bootstrap new components or features that are consistent with the project. With `tuist scaffold` you generate files, you can generate files from a template. You can define your own templates or use the ones that are vendored with Tuist. These are some scenarios where scaffolding might be useful: +In projects with an established architecture, developers might want to bootstrap new components or features that are consistent with the project. With `tuist scaffold` you can generate files from a template. You can define your own templates or use the ones that are vendored with Tuist. These are some scenarios where scaffolding might be useful: - Create a new feature that follows a given architecture: `tuist scaffold viper --name MyFeature`. - Create new projects: `tuist scaffold feature-project --name Home` diff --git a/docs/docs/index.md b/docs/docs/index.md index 6d81ad4048c..7ef878d4bfd 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -24,7 +24,7 @@ As Xcode projects expand, **organizations may face a decline in productivity** d Some organizations choose to bypass the compiler by abstracting the platform using JavaScript-based dynamic runtimes, such as [React Native](https://reactnative.dev/). While this approach may be effective, it [complicates access to the platform's native features](https://shopify.engineering/building-app-clip-react-native). Other organizations opt for **modularizing the codebase**, which helps establish clear boundaries, making the codebase easier to work with and improving the reliability of build times. However, the Xcode project format is not designed for modularity and results in implicit configurations that few understand and frequent conflicts. This leads to a bad bus factor, and although incremental builds may improve, developers might still frequently clear Xcode's build cache (i.e., derived data) when builds fail. To address this, some organizations choose to **abandon Xcode's build system** and adopt alternatives like [Buck](https://buck.build/) or [Bazel](https://bazel.build/). However, this comes with a [high complexity and maintenance burden](https://bazel.build/migrate/xcode) (e.g., Xcode updates might disrupt the integration with Bazel, which is ultimately a hack). ::: tip The cost of convenience -Xcode's design optimizes for the convenience of small projects and often achieves this through implicit configurations. Implicitness resolved at build-time, while great at small scale, lead to unpredictable and unreliable builds and Xcode beharior at scale, and difficults optimizations. +Xcode's design optimizes for the convenience of small projects and often achieves this through implicit configurations. Implicitness resolved at build-time, while great at small scale, lead to unpredictable and unreliable builds and Xcode behavior at scale, and difficult optimizations. ::: ## Tuist From 257394428652c0346b49e384949cb0a7ee706530 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 19 Apr 2024 09:26:39 +0200 Subject: [PATCH 233/509] add isavynskyi as a contributor for doc (#6207) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 285b345f844..58e9e1097df 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1318,6 +1318,15 @@ "contributions": [ "code" ] + }, + { + "login": "isavynskyi", + "name": "Ihor Savynskyi", + "avatar_url": "https://avatars.githubusercontent.com/u/18377497?v=4", + "profile": "https://github.com/isavynskyi", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 36a7d30f352..38525435a5b 100644 --- a/README.md +++ b/README.md @@ -522,6 +522,7 @@ Thanks goes to these wonderful people:
    Stefano Mondino

    Łukasz Lech

    costapombo
    +
    Ihor Savynskyi
    From 01eeb8fe9aa2a580e307017a76a2f73e9cfad46d Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Mon, 22 Apr 2024 02:47:52 -0400 Subject: [PATCH 234/509] Only write module map files if the contents change. (#6212) * Only write module map files if the contents change. Fixes #6211 * Linting * Update Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift Co-authored-by: Daniele Formichelli * Update callsites --------- Co-authored-by: Daniele Formichelli --- ...wiftPackageManagerModuleMapGenerator.swift | 43 +++++++-- ...ackageManagerModuleMapGeneratorTests.swift | 94 ++++++++++++------- 2 files changed, 93 insertions(+), 44 deletions(-) diff --git a/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift b/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift index 72e04e11ac3..44b78a5a7ee 100644 --- a/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift +++ b/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift @@ -1,4 +1,5 @@ import TSCBasic +import TuistCore import TuistSupport /// The type of modulemap file @@ -43,7 +44,11 @@ public protocol SwiftPackageManagerModuleMapGenerating { } public final class SwiftPackageManagerModuleMapGenerator: SwiftPackageManagerModuleMapGenerating { - public init() {} + private let contentHasher: ContentHashing + + public init(contentHasher: ContentHashing = ContentHasher()) { + self.contentHasher = contentHasher + } // swiftlint:disable:next function_body_length public func generate( @@ -81,9 +86,12 @@ public final class SwiftPackageManagerModuleMapGenerator: SwiftPackageManagerMod if let customModuleMapPath { return .custom(customModuleMapPath, umbrellaHeaderPath: umbrellaHeaderPath) } - try FileHandler.shared.write( - umbrellaHeaderModuleMap(umbrellaHeaderPath: umbrellaHeaderPath, sanitizedModuleName: sanitizedModuleName), - path: generatedModuleMapPath, + try writeIfDifferent( + moduleMapContent: umbrellaHeaderModuleMap( + umbrellaHeaderPath: umbrellaHeaderPath, + sanitizedModuleName: sanitizedModuleName + ), + to: generatedModuleMapPath, atomically: true ) // If 'PublicHeadersDir/ModuleName.h' exists, then use it as the umbrella header. @@ -92,9 +100,12 @@ public final class SwiftPackageManagerModuleMapGenerator: SwiftPackageManagerMod if let customModuleMapPath { return .custom(customModuleMapPath, umbrellaHeaderPath: nestedUmbrellaHeaderPath) } - try FileHandler.shared.write( - umbrellaHeaderModuleMap(umbrellaHeaderPath: nestedUmbrellaHeaderPath, sanitizedModuleName: sanitizedModuleName), - path: generatedModuleMapPath, + try writeIfDifferent( + moduleMapContent: umbrellaHeaderModuleMap( + umbrellaHeaderPath: nestedUmbrellaHeaderPath, + sanitizedModuleName: sanitizedModuleName + ), + to: generatedModuleMapPath, atomically: true ) // If 'PublicHeadersDir/ModuleName/ModuleName.h' exists, then use it as the umbrella header. @@ -114,13 +125,29 @@ public final class SwiftPackageManagerModuleMapGenerator: SwiftPackageManagerMod export * } """ - try FileHandler.shared.write(generatedModuleMapContent, path: generatedModuleMapPath, atomically: true) + try writeIfDifferent(moduleMapContent: generatedModuleMapContent, to: generatedModuleMapPath, atomically: true) + return .directory(moduleMapPath: generatedModuleMapPath, umbrellaDirectory: publicHeadersPath) } else { return .none } } + /// Write our modulemap to disk if it is distinct from what already exists. + /// This addresses an issue with dependencies that are included in a precompiled header. + /// https://github.com/tuist/tuist/issues/6211 + /// - Parameters: + /// - moduleMapContent: contents of the moduleMap file to write + /// - path: destination to write file contents to + /// - atomically: whether to write atomically + func writeIfDifferent(moduleMapContent: String, to path: AbsolutePath, atomically: Bool) throws { + let newContentHash = try contentHasher.hash(moduleMapContent) + let currentContentHash = try? contentHasher.hash(path: path) + if currentContentHash != newContentHash { + try FileHandler.shared.write(moduleMapContent, path: path, atomically: true) + } + } + static func customModuleMapPath(publicHeadersPath: AbsolutePath) throws -> AbsolutePath? { guard FileHandler.shared.exists(publicHeadersPath) else { return nil } diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift index 87f70cf29b9..b1745edde5d 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift @@ -1,4 +1,5 @@ import TSCBasic +import TuistCoreTesting import TuistSupportTesting import XCTest @@ -6,10 +7,12 @@ import XCTest class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { private var subject: SwiftPackageManagerModuleMapGenerator! + private var hasher: MockContentHasher! override func setUp() { super.setUp() - subject = SwiftPackageManagerModuleMapGenerator() + hasher = MockContentHasher() + subject = SwiftPackageManagerModuleMapGenerator(contentHasher: hasher) } override func tearDown() { @@ -40,7 +43,7 @@ class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { } private func test_generate(for moduleMap: ModuleMap) throws { - var writeCalled = false + var writeCount = 0 fileHandler.stubContentsOfDirectory = { _ in switch moduleMap { case .none: @@ -81,41 +84,12 @@ class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { } } fileHandler.stubWrite = { content, path, atomically in - writeCalled = true - let expectedContent: String - switch moduleMap { - case .none, .custom: + writeCount += 1 + guard let expectedContent = self.expectedContent(for: moduleMap) else { XCTFail("FileHandler.write should not be called") return - case let .header(umbrellaHeaderPath, moduleMapPath: _): - if umbrellaHeaderPath.parentDirectory.basename == "Module" { - expectedContent = """ - framework module Module { - umbrella header "/Absolute/Public/Headers/Path/Module/Module.h" - - export * - module * { export * } - } - """ - } else { - expectedContent = """ - framework module Module { - umbrella header "/Absolute/Public/Headers/Path/Module.h" - - export * - module * { export * } - } - """ - } - case .directory: - expectedContent = """ - module Module { - umbrella "/Absolute/Public/Headers/Path" - export * - } - - """ } + XCTAssertEqual(content, expectedContent) XCTAssertEqual(path, "/Absolute/PackageDir/Derived/Module.modulemap") XCTAssertTrue(atomically) @@ -125,12 +99,60 @@ class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { moduleName: "Module", publicHeadersPath: "/Absolute/Public/Headers/Path" ) + + // Set hasher for path on disk + hasher.stubHashForPath["/Absolute/PackageDir/Derived/Module.modulemap"] = try hasher + .hash(expectedContent(for: moduleMap) ?? "") + // generate a 2nd time to validate that we dont write content that is already on disk + let _ = try subject.generate( + packageDirectory: "/Absolute/PackageDir", + moduleName: "Module", + publicHeadersPath: "/Absolute/Public/Headers/Path" + ) + XCTAssertEqual(got, moduleMap) switch moduleMap { case .none, .custom: - XCTAssertFalse(writeCalled) + XCTAssertEqual(writeCount, 0) case .directory, .header: - XCTAssertTrue(writeCalled) + XCTAssertEqual(writeCount, 1) + } + } + + private func expectedContent(for moduleMap: ModuleMap) -> String? { + let expectedContent: String + switch moduleMap { + case .none, .custom: + return nil + case let .header(umbrellaHeaderPath, moduleMapPath: _): + if umbrellaHeaderPath.parentDirectory.basename == "Module" { + expectedContent = """ + framework module Module { + umbrella header "/Absolute/Public/Headers/Path/Module/Module.h" + + export * + module * { export * } + } + """ + } else { + expectedContent = """ + framework module Module { + umbrella header "/Absolute/Public/Headers/Path/Module.h" + + export * + module * { export * } + } + """ + } + case .directory: + expectedContent = """ + module Module { + umbrella "/Absolute/Public/Headers/Path" + export * + } + + """ } + return expectedContent } } From 15af7d874d10339a1e668de3394caeb0f3075007 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 09:23:52 +0200 Subject: [PATCH 235/509] add woin2ee as a contributor for code (#6216) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 58e9e1097df..35df230db08 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1127,7 +1127,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/81426024?v=4", "profile": "https://github.com/woin2ee", "contributions": [ - "doc" + "doc", + "code" ] }, { From afcd2dc129da3c87945fc9a86da1d51bb25d0ff1 Mon Sep 17 00:00:00 2001 From: Jaewon-Yun <81426024+woin2ee@users.noreply.github.com> Date: Mon, 22 Apr 2024 16:24:11 +0900 Subject: [PATCH 236/509] Add simulated location support on testable target configuration (#6187) * Support simulated location for testable targets * Fix typo in default location * Add simulated location to `ios_app_with_custom_scheme` fixture * Add test for finding GPX files * Avoid breaking compatibility * Add assertions for simulated location * Make assertion method clear --- .../ProjectDescription/RunActionOptions.swift | 81 ++----------------- .../SimulatedLocation.swift | 69 ++++++++++++++++ .../ProjectDescription/TestableTarget.swift | 23 +++++- .../TuistAcceptanceTestCase+Extra.swift | 50 ++++++++++++ .../Generator/ProjectFileElements.swift | 45 +++++++++-- .../SchemeDescriptorsGenerator.swift | 18 +++++ .../TuistGraph/Models/RunActionOptions.swift | 46 ----------- .../TuistGraph/Models/SimulatedLocation.swift | 46 +++++++++++ .../TuistGraph/Models/TestableTarget.swift | 7 +- .../Models/TestableTarget+TestData.swift | 21 +++++ .../RunActionOptions+ManifestMapper.swift | 2 +- .../TestableTarget+ManifestMapper.swift | 28 +++++-- .../GenerateAcceptanceTests.swift | 15 ++++ .../Generator/ProjectFileElementsTests.swift | 60 ++++++++++++++ .../SchemeDescriptorsGeneratorTests.swift | 9 ++- .../App/Project.swift | 18 ++++- 16 files changed, 395 insertions(+), 143 deletions(-) create mode 100644 Sources/ProjectDescription/SimulatedLocation.swift create mode 100644 Sources/TuistGraph/Models/SimulatedLocation.swift create mode 100644 Sources/TuistGraphTesting/Models/TestableTarget+TestData.swift diff --git a/Sources/ProjectDescription/RunActionOptions.swift b/Sources/ProjectDescription/RunActionOptions.swift index be17fef12a1..bdf40319b92 100644 --- a/Sources/ProjectDescription/RunActionOptions.swift +++ b/Sources/ProjectDescription/RunActionOptions.swift @@ -14,7 +14,7 @@ public struct RunActionOptions: Equatable, Codable { public var storeKitConfigurationPath: Path? /// A simulated GPS location to use when running the app. - public var simulatedLocation: SimulatedLocation? + public var simulatedLocation: ProjectDescription.SimulatedLocation? /// Configure your project to work with the Metal frame debugger. public var enableGPUFrameCaptureMode: GPUFrameCaptureMode @@ -40,7 +40,7 @@ public struct RunActionOptions: Equatable, Codable { language: SchemeLanguage? = nil, region: String? = nil, storeKitConfigurationPath: Path? = nil, - simulatedLocation: SimulatedLocation? = nil, + simulatedLocation: ProjectDescription.SimulatedLocation? = nil, enableGPUFrameCaptureMode: GPUFrameCaptureMode = GPUFrameCaptureMode.default ) { self.language = language @@ -74,7 +74,7 @@ public struct RunActionOptions: Equatable, Codable { language: SchemeLanguage? = nil, region: String? = nil, storeKitConfigurationPath: Path? = nil, - simulatedLocation: SimulatedLocation? = nil, + simulatedLocation: ProjectDescription.SimulatedLocation? = nil, enableGPUFrameCaptureMode: GPUFrameCaptureMode = GPUFrameCaptureMode.default ) -> Self { self.init( @@ -87,76 +87,6 @@ public struct RunActionOptions: Equatable, Codable { } } -extension RunActionOptions { - /// Simulated location represents a GPS location that is used when running an app on the simulator. - public struct SimulatedLocation: Codable, Equatable { - /// The identifier of the location (e.g. London, England) - public var identifier: String? - /// Path to a .gpx file that indicates the location - public var gpxFile: Path? - - private init( - identifier: String? = nil, - gpxFile: Path? = nil - ) { - self.identifier = identifier - self.gpxFile = gpxFile - } - - public static func custom(gpxFile: Path) -> SimulatedLocation { - .init(gpxFile: gpxFile) - } - - public static var london: SimulatedLocation { - .init(identifier: "London, England") - } - - public static var johannesburg: SimulatedLocation { - .init(identifier: "Johannesburg, South Africa") - } - - public static var moscow: SimulatedLocation { - .init(identifier: "Moscow, Russia") - } - - public static var mumbai: SimulatedLocation { - .init(identifier: "Mumbai, India") - } - - public static var tokyo: SimulatedLocation { - .init(identifier: "Tokyo, Japan") - } - - public static var sydney: SimulatedLocation { - .init(identifier: "Sydney, Australia") - } - - public static var hongKong: SimulatedLocation { - .init(identifier: "Hong Kong, China") - } - - public static var honolulu: SimulatedLocation { - .init(identifier: "Honolulu, HI, USA") - } - - public static var sanFrancisco: SimulatedLocation { - .init(identifier: "San Francisco, CA, USA") - } - - public static var mexicoCity: SimulatedLocation { - .init(identifier: "Mexico City, Mexico") - } - - public static var newYork: SimulatedLocation { - .init(identifier: "New York, NY, USA") - } - - public static var rioDeJaneiro: SimulatedLocation { - .init(identifier: "Rio De Janeiro, Brazil") - } - } -} - extension RunActionOptions { public enum GPUFrameCaptureMode: String, Codable, Equatable { case autoEnabled @@ -169,3 +99,8 @@ extension RunActionOptions { } } } + +extension RunActionOptions { + @available(*, deprecated, message: "Use ProjectDescription.SimulatedLocation directly instead.") + public typealias SimulatedLocation = ProjectDescription.SimulatedLocation +} diff --git a/Sources/ProjectDescription/SimulatedLocation.swift b/Sources/ProjectDescription/SimulatedLocation.swift new file mode 100644 index 00000000000..b34b38e2968 --- /dev/null +++ b/Sources/ProjectDescription/SimulatedLocation.swift @@ -0,0 +1,69 @@ +import Foundation + +/// Simulated location represents a GPS location that is used when running an app on the simulator. +public struct SimulatedLocation: Codable, Equatable { + /// The identifier of the location (e.g. London, England) + public var identifier: String? + /// Path to a .gpx file that indicates the location + public var gpxFile: Path? + + private init( + identifier: String? = nil, + gpxFile: Path? = nil + ) { + self.identifier = identifier + self.gpxFile = gpxFile + } + + public static func custom(gpxFile: Path) -> SimulatedLocation { + .init(gpxFile: gpxFile) + } + + public static var london: SimulatedLocation { + .init(identifier: "London, England") + } + + public static var johannesburg: SimulatedLocation { + .init(identifier: "Johannesburg, South Africa") + } + + public static var moscow: SimulatedLocation { + .init(identifier: "Moscow, Russia") + } + + public static var mumbai: SimulatedLocation { + .init(identifier: "Mumbai, India") + } + + public static var tokyo: SimulatedLocation { + .init(identifier: "Tokyo, Japan") + } + + public static var sydney: SimulatedLocation { + .init(identifier: "Sydney, Australia") + } + + public static var hongKong: SimulatedLocation { + .init(identifier: "Hong Kong, China") + } + + public static var honolulu: SimulatedLocation { + .init(identifier: "Honolulu, HI, USA") + } + + public static var sanFrancisco: SimulatedLocation { + .init(identifier: "San Francisco, CA, USA") + } + + public static var mexicoCity: SimulatedLocation { + .init(identifier: "Mexico City, Mexico") + } + + public static var newYork: SimulatedLocation { + .init(identifier: "New York, NY, USA") + } + + public static var rioDeJaneiro: SimulatedLocation { + .init(identifier: "Rio de Janeiro, Brazil") + } +} diff --git a/Sources/ProjectDescription/TestableTarget.swift b/Sources/ProjectDescription/TestableTarget.swift index 9067aa6de8d..a4a7e919cd4 100644 --- a/Sources/ProjectDescription/TestableTarget.swift +++ b/Sources/ProjectDescription/TestableTarget.swift @@ -5,30 +5,44 @@ public struct TestableTarget: Equatable, Codable, ExpressibleByStringInterpolati public var isSkipped: Bool public var isParallelizable: Bool public var isRandomExecutionOrdering: Bool + public var simulatedLocation: SimulatedLocation? init( target: TargetReference, isSkipped: Bool, isParallelizable: Bool, - isRandomExecutionOrdering: Bool + isRandomExecutionOrdering: Bool, + simulatedLocation: SimulatedLocation? = nil ) { self.target = target self.isSkipped = isSkipped self.isParallelizable = isParallelizable self.isRandomExecutionOrdering = isRandomExecutionOrdering + self.simulatedLocation = simulatedLocation } + /// Returns a testable target. + /// + /// - Parameters: + /// - target: The name or reference of target to test. + /// - isSkipped: Whether to skip this test target. If true, the test target is disabled. + /// - isParallelizable: Whether to run in parallel. + /// - isRandomExecutionOrdering: Whether to test in random order. + /// - simulatedLocation: The simulated GPS location to use when testing this target. + /// Please note that the `.custom(gpxPath:)` case must refer to a valid GPX file in your project’s resources. public static func testableTarget( target: TargetReference, isSkipped: Bool = false, isParallelizable: Bool = false, - isRandomExecutionOrdering: Bool = false + isRandomExecutionOrdering: Bool = false, + simulatedLocation: SimulatedLocation? = nil ) -> Self { self.init( target: target, isSkipped: isSkipped, isParallelizable: isParallelizable, - isRandomExecutionOrdering: isRandomExecutionOrdering + isRandomExecutionOrdering: isRandomExecutionOrdering, + simulatedLocation: simulatedLocation ) } @@ -37,7 +51,8 @@ public struct TestableTarget: Equatable, Codable, ExpressibleByStringInterpolati target: TargetReference(projectPath: nil, target: value), isSkipped: false, isParallelizable: false, - isRandomExecutionOrdering: false + isRandomExecutionOrdering: false, + simulatedLocation: nil ) } } diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase+Extra.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase+Extra.swift index 21f96af0ed0..a96095d0e32 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase+Extra.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase+Extra.swift @@ -78,4 +78,54 @@ extension TuistAcceptanceTestCase { return } } + + /// Asserts that a simulated location is contained in a specific testable target. + /// - Parameters: + /// - xcodeprojPath: A specific `.xcodeproj` file path. + /// - scheme: A specific scheme name. + /// - testTarget: A specific test target name. + /// - simulatedLocation: A simulated location. This value can be passed a `location string` or a `GPX filename`. + /// For example, "Rio de Janeiro, Brazil" or "Grand Canyon.gpx". + public func XCTAssertContainsSimulatedLocation( + xcodeprojPath: AbsolutePath, + scheme: String, + testTarget: String, + simulatedLocation: String, + file: StaticString = #file, + line: UInt = #line + ) throws { + let xcodeproj = try XcodeProj(pathString: xcodeprojPath.pathString) + + guard let scheme = xcodeproj.sharedData?.schemes + .filter({ $0.name == scheme }) + .first + else { + XCTFail( + "The '\(scheme)' scheme doesn't exist.", + file: file, + line: line + ) + return + } + + guard let testableTarget = scheme.testAction?.testables + .filter({ $0.buildableReference.blueprintName == testTarget }) + .first + else { + XCTFail( + "The '\(testTarget)' testable target doesn't exist.", + file: file, + line: line + ) + return + } + + XCTAssertEqual( + testableTarget.locationScenarioReference?.identifier.contains(simulatedLocation), + true, + "The '\(testableTarget)' testable target doesn't have simulated location set.", + file: file, + line: line + ) + } } diff --git a/Sources/TuistGenerator/Generator/ProjectFileElements.swift b/Sources/TuistGenerator/Generator/ProjectFileElements.swift index d55b281f36d..e2ac660c71c 100644 --- a/Sources/TuistGenerator/Generator/ProjectFileElements.swift +++ b/Sources/TuistGenerator/Generator/ProjectFileElements.swift @@ -127,15 +127,11 @@ class ProjectFileElements { // Add the .gpx files if needed. GPS Exchange files must be added to the // project/workspace so that the scheme can correctly reference them. // In case the configuration already contains such file, we should avoid adding it twice - let gpxFiles = project.schemes.compactMap { scheme -> GroupFileElement? in - guard case let .gpxFile(path) = scheme.runAction?.options.simulatedLocation else { - return nil - } - - return GroupFileElement(path: path, group: project.filesGroup) - } + let runActionGPXFiles = gpxFilesForRunAction(in: project.schemes, filesGroup: project.filesGroup) + fileElements.formUnion(runActionGPXFiles) - fileElements.formUnion(gpxFiles) + let testActionGPXFiles = gpxFilesForTestAction(in: project.schemes, filesGroup: project.filesGroup) + fileElements.formUnion(testActionGPXFiles) return fileElements } @@ -739,4 +735,37 @@ class ProjectFileElements { return nil } } + + /// Finds and returns the gpx files used by the Run Action for all schemes. + func gpxFilesForRunAction(in schemes: [Scheme], filesGroup: ProjectGroup) -> [GroupFileElement] { + let gpxFiles = schemes.compactMap { scheme -> GroupFileElement? in + guard case let .gpxFile(path) = scheme.runAction?.options.simulatedLocation else { + return nil + } + + return GroupFileElement(path: path, group: filesGroup) + } + + return gpxFiles + } + + /// Finds and returns the gpx files used by the Test Action for all schemes. + func gpxFilesForTestAction(in schemes: [Scheme], filesGroup: ProjectGroup) -> [GroupFileElement] { + let gpxFiles = schemes.compactMap { scheme -> [GroupFileElement] in + guard let testAction = scheme.testAction else { return [] } + + let elements = testAction.targets.compactMap { target -> GroupFileElement? in + guard case let .gpxFile(path) = target.simulatedLocation else { + return nil + } + + return GroupFileElement(path: path, group: filesGroup) + } + + return elements + } + .flatMap { $0 } + + return gpxFiles + } } diff --git a/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift b/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift index 1f5c30b4b87..3a8ceac254e 100644 --- a/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift +++ b/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift @@ -298,11 +298,29 @@ final class SchemeDescriptorsGenerator: SchemeDescriptorsGenerating { else { continue } + + var locationScenarioReference: XCScheme.LocationScenarioReference? + + if let locationScenario = testableTarget.simulatedLocation { + var identifier = locationScenario.identifier + + if case let .gpxFile(gpxPath) = locationScenario { + let fileRelativePath = gpxPath.relative(to: graphTraverser.workspace.xcWorkspacePath) + identifier = fileRelativePath.pathString + } + + locationScenarioReference = .init( + identifier: identifier, + referenceType: locationScenario.referenceType + ) + } + let testable = XCScheme.TestableReference( skipped: testableTarget.isSkipped, parallelizable: testableTarget.isParallelizable, randomExecutionOrdering: testableTarget.isRandomExecutionOrdering, buildableReference: reference, + locationScenarioReference: locationScenarioReference, skippedTests: skippedTests ) testables.append(testable) diff --git a/Sources/TuistGraph/Models/RunActionOptions.swift b/Sources/TuistGraph/Models/RunActionOptions.swift index 2ae79b94435..1faaa026ff9 100644 --- a/Sources/TuistGraph/Models/RunActionOptions.swift +++ b/Sources/TuistGraph/Models/RunActionOptions.swift @@ -52,52 +52,6 @@ public struct RunActionOptions: Equatable, Codable { } } -extension RunActionOptions { - public enum SimulatedLocation { - case gpxFile(AbsolutePath) - case reference(String) - - /// A unique identifier string for the selected simulated location. - /// - /// In case of Xcode's simulated locations, this is a string representing the location. - /// In case of a custom GPX file, this is a path to that file. - public var identifier: String { - switch self { - case let .gpxFile(path): - return path.pathString - case let .reference(identifier): - return identifier - } - } - - /// A reference type is 1 if using Xcode's built-in simulated locations. - /// Otherwise, it is 0. - public var referenceType: String { - if case .gpxFile = self { return "0" } - return "1" - } - } -} - -extension RunActionOptions.SimulatedLocation: Equatable, Codable { - public init(from decoder: Decoder) throws { - let container = try decoder.singleValueContainer() - let value = try container.decode(String.self) - - guard value.hasSuffix(".gpx") else { - self = .reference(value) - return - } - - self = .gpxFile(try AbsolutePath(validating: value)) - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.singleValueContainer() - try container.encode(identifier) - } -} - extension RunActionOptions { public enum GPUFrameCaptureMode: String, Codable, Equatable { case autoEnabled diff --git a/Sources/TuistGraph/Models/SimulatedLocation.swift b/Sources/TuistGraph/Models/SimulatedLocation.swift new file mode 100644 index 00000000000..587cc2d43a5 --- /dev/null +++ b/Sources/TuistGraph/Models/SimulatedLocation.swift @@ -0,0 +1,46 @@ +import Foundation +import TSCBasic + +public enum SimulatedLocation { + case gpxFile(AbsolutePath) + case reference(String) + + /// A unique identifier string for the selected simulated location. + /// + /// In case of Xcode's simulated locations, this is a string representing the location. + /// In case of a custom GPX file, this is a path to that file. + public var identifier: String { + switch self { + case let .gpxFile(path): + return path.pathString + case let .reference(identifier): + return identifier + } + } + + /// A reference type is 1 if using Xcode's built-in simulated locations. + /// Otherwise, it is 0. + public var referenceType: String { + if case .gpxFile = self { return "0" } + return "1" + } +} + +extension SimulatedLocation: Equatable, Codable, Hashable { + public init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + let value = try container.decode(String.self) + + guard value.hasSuffix(".gpx") else { + self = .reference(value) + return + } + + self = .gpxFile(try AbsolutePath(validating: value)) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode(identifier) + } +} diff --git a/Sources/TuistGraph/Models/TestableTarget.swift b/Sources/TuistGraph/Models/TestableTarget.swift index 67ffc6021e9..b53e6099ee9 100644 --- a/Sources/TuistGraph/Models/TestableTarget.swift +++ b/Sources/TuistGraph/Models/TestableTarget.swift @@ -1,5 +1,4 @@ import Foundation -import TSCBasic /// Testable target describe target and tests information. public struct TestableTarget: Equatable, Hashable, Codable { @@ -11,16 +10,20 @@ public struct TestableTarget: Equatable, Hashable, Codable { public let isParallelizable: Bool /// Execute tests in random order. public let isRandomExecutionOrdering: Bool + /// A simulated location used when testing this test target. + public let simulatedLocation: SimulatedLocation? public init( target: TargetReference, skipped: Bool = false, parallelizable: Bool = false, - randomExecutionOrdering: Bool = false + randomExecutionOrdering: Bool = false, + simulatedLocation: SimulatedLocation? = nil ) { self.target = target isSkipped = skipped isParallelizable = parallelizable isRandomExecutionOrdering = randomExecutionOrdering + self.simulatedLocation = simulatedLocation } } diff --git a/Sources/TuistGraphTesting/Models/TestableTarget+TestData.swift b/Sources/TuistGraphTesting/Models/TestableTarget+TestData.swift new file mode 100644 index 00000000000..e83651a36cb --- /dev/null +++ b/Sources/TuistGraphTesting/Models/TestableTarget+TestData.swift @@ -0,0 +1,21 @@ +import TSCBasic +import TuistGraph +import TuistSupport + +extension TestableTarget { + public static func test( + target: TargetReference = TargetReference(projectPath: "/Project", name: "App"), + skipped: Bool = false, + parallelizable: Bool = false, + randomExecutionOrdering: Bool = false, + simulatedLocation: SimulatedLocation? = nil + ) -> TestableTarget { + TestableTarget( + target: target, + skipped: skipped, + parallelizable: parallelizable, + randomExecutionOrdering: randomExecutionOrdering, + simulatedLocation: simulatedLocation + ) + } +} diff --git a/Sources/TuistLoader/Models+ManifestMappers/RunActionOptions+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/RunActionOptions+ManifestMapper.swift index 371545fb66b..37ec4bac4b9 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/RunActionOptions+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/RunActionOptions+ManifestMapper.swift @@ -14,7 +14,7 @@ extension TuistGraph.RunActionOptions { ) throws -> TuistGraph.RunActionOptions { var language: String? var storeKitConfigurationPath: AbsolutePath? - var simulatedLocation: SimulatedLocation? + var simulatedLocation: TuistGraph.SimulatedLocation? var enableGPUFrameCaptureMode: GPUFrameCaptureMode language = manifest.language?.identifier diff --git a/Sources/TuistLoader/Models+ManifestMappers/TestableTarget+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TestableTarget+ManifestMapper.swift index 4a0b9342852..3e052ec126a 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TestableTarget+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TestableTarget+ManifestMapper.swift @@ -13,14 +13,30 @@ extension TuistGraph.TestableTarget { manifest: ProjectDescription.TestableTarget, generatorPaths: GeneratorPaths ) throws -> TuistGraph.TestableTarget { - TestableTarget( - target: TuistGraph.TargetReference( - projectPath: try generatorPaths.resolveSchemeActionProjectPath(manifest.target.projectPath), - name: manifest.target.targetName - ), + let target = TuistGraph.TargetReference( + projectPath: try generatorPaths.resolveSchemeActionProjectPath(manifest.target.projectPath), + name: manifest.target.targetName + ) + + var simulatedLocation: TuistGraph.SimulatedLocation? + + if let manifestLocation = manifest.simulatedLocation { + switch (manifestLocation.identifier, manifestLocation.gpxFile) { + case let (identifier?, .none): + simulatedLocation = .reference(identifier) + case let (.none, gpxFile?): + simulatedLocation = .gpxFile(try generatorPaths.resolveSchemeActionProjectPath(gpxFile)) + default: + break + } + } + + return TestableTarget( + target: target, skipped: manifest.isSkipped, parallelizable: manifest.isParallelizable, - randomExecutionOrdering: manifest.isRandomExecutionOrdering + randomExecutionOrdering: manifest.isRandomExecutionOrdering, + simulatedLocation: simulatedLocation ) } } diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index addf257a7ed..c3cc7bcca63 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -255,6 +255,21 @@ final class GenerateAcceptanceTestsiOSAppWithCustomScheme: TuistAcceptanceTestCa try await run(BuildCommand.self, "App-Debug") try await run(BuildCommand.self, "App-Release") try await run(BuildCommand.self, "App-Local") + + let xcodeprojPath = fixturePath.appending(components: ["App", "MainApp.xcodeproj"]) + + try XCTAssertContainsSimulatedLocation( + xcodeprojPath: xcodeprojPath, + scheme: "App-Debug", + testTarget: "AppTests", + simulatedLocation: "Rio de Janeiro, Brazil" + ) + try XCTAssertContainsSimulatedLocation( + xcodeprojPath: xcodeprojPath, + scheme: "App-Release", + testTarget: "AppTests", + simulatedLocation: "Grand Canyon.gpx" + ) } } diff --git a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift index 7d4a4c2f8d8..0db784356d7 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift @@ -972,6 +972,66 @@ final class ProjectFileElementsTests: TuistUnitTestCase { let projectGroup = groups.sortedMain.group(named: "Project") XCTAssertEqual(projectGroup?.flattenedChildren, []) } + + func test_gpxFilesForRunAction() { + // Given + let schemes: [Scheme] = [ + .test(runAction: nil), + .test(runAction: .test( + options: RunActionOptions(simulatedLocation: .gpxFile("/gpx/A")) + )), + .test(runAction: .test( + options: RunActionOptions(simulatedLocation: .gpxFile("/gpx/B")) + )), + .test(runAction: .test( + options: RunActionOptions(simulatedLocation: .reference("London, England")) + )), + .test(runAction: .test( + options: RunActionOptions(simulatedLocation: .gpxFile("/gpx/C")) + )), + ] + let filesGroup: ProjectGroup = .group(name: "Project") + + // When + let gpxFiles = subject.gpxFilesForRunAction(in: schemes, filesGroup: filesGroup) + + // Then + XCTAssertEqual(gpxFiles, [ + GroupFileElement(path: "/gpx/A", group: filesGroup), + GroupFileElement(path: "/gpx/B", group: filesGroup), + GroupFileElement(path: "/gpx/C", group: filesGroup), + ]) + } + + func test_gpxFilesForTestAction() { + // Given + let schemes: [Scheme] = [ + .test(testAction: nil), + .test(testAction: .test(targets: [ + .test(simulatedLocation: .gpxFile("/gpx/A")), + ])), + .test(testAction: .test(targets: [ + .test(simulatedLocation: .gpxFile("/gpx/B")), + .test(simulatedLocation: .reference("London, England")), + ])), + .test(testAction: .test(targets: [ + .test(simulatedLocation: .gpxFile("/gpx/C")), + .test(simulatedLocation: .gpxFile("/gpx/D")), + ])), + ] + let filesGroup: ProjectGroup = .group(name: "Project") + + // When + let gpxFiles = subject.gpxFilesForTestAction(in: schemes, filesGroup: filesGroup) + + // Then + XCTAssertEqual(gpxFiles, [ + GroupFileElement(path: "/gpx/A", group: filesGroup), + GroupFileElement(path: "/gpx/B", group: filesGroup), + GroupFileElement(path: "/gpx/C", group: filesGroup), + GroupFileElement(path: "/gpx/D", group: filesGroup), + ]) + } } extension PBXGroup { diff --git a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift index 7440dca454b..ff174692a33 100644 --- a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift @@ -376,7 +376,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(targets: [target, testTarget]) let testAction = TestAction.test( - targets: [TestableTarget(target: TargetReference(projectPath: project.path, name: "AppTests"))], + targets: [ + TestableTarget( + target: TargetReference(projectPath: project.path, name: "AppTests"), + simulatedLocation: .reference("Rio de Janeiro, Brazil") + ), + ], arguments: nil ) @@ -418,6 +423,8 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let buildableReference = testable.buildableReference XCTAssertEqual(testable.skipped, false) + XCTAssertEqual(testable.locationScenarioReference?.referenceType, "1") + XCTAssertEqual(testable.locationScenarioReference?.identifier, "Rio de Janeiro, Brazil") XCTAssertEqual(buildableReference.referencedContainer, "container:Project.xcodeproj") XCTAssertEqual(buildableReference.buildableName, "AppTests.xctest") XCTAssertEqual(buildableReference.blueprintName, "AppTests") diff --git a/fixtures/ios_app_with_custom_scheme/App/Project.swift b/fixtures/ios_app_with_custom_scheme/App/Project.swift index 43c6dd6062d..12d3556014c 100644 --- a/fixtures/ios_app_with_custom_scheme/App/Project.swift +++ b/fixtures/ios_app_with_custom_scheme/App/Project.swift @@ -9,7 +9,14 @@ let debugScheme: Scheme = .scheme( preActions: [debugAction], runPostActionsOnFailure: true ), - testAction: TestAction.targets(["AppTests"]), + testAction: .targets( + [ + .testableTarget( + target: "AppTests", + simulatedLocation: .rioDeJaneiro + ), + ] + ), runAction: .runAction( customLLDBInitFile: "../Scripts/lldb/_lldbinit", executable: "App", @@ -27,7 +34,14 @@ let releaseScheme: Scheme = .scheme( name: "App-Release", shared: true, buildAction: .buildAction(targets: ["App"], preActions: [releaseAction]), - testAction: TestAction.targets(["AppTests"]), + testAction: .targets( + [ + .testableTarget( + target: "AppTests", + simulatedLocation: .custom(gpxFile: "Resources/Grand Canyon.gpx") + ), + ] + ), runAction: .runAction( executable: "App", options: .options( From 6038b591264a5917c8452930b7c623886a3a683b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 22 Apr 2024 17:14:21 +0200 Subject: [PATCH 237/509] Use relative paths instead of absolute paths for header search paths for modulemaps (#6218) --- .../Mappers/ModuleMapMapper.swift | 111 +++++++++--------- .../Factories/GraphMapperFactory.swift | 1 + .../Factories/WorkspaceMapperFactory.swift | 4 - .../ProjectMappers/ModuleMapMapperTests.swift | 76 ++++++++---- .../Factories/GraphMapperFactoryTests.swift | 8 ++ .../WorkspaceMapperFactoryTests.swift | 11 -- 6 files changed, 119 insertions(+), 92 deletions(-) diff --git a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift index 3d9d72bf5ba..0fc99495764 100644 --- a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift +++ b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift @@ -45,7 +45,7 @@ enum ModuleMapMapperError: FatalError { /// Mapper that maps the `MODULE_MAP` build setting to the `-fmodule-map-file` compiler flags. /// It is required to avoid embedding the module map into the frameworks during cache operations, which would make the framework /// not portable, as the modulemap could contain absolute paths. -public final class ModuleMapMapper: WorkspaceMapping { // swiftlint:disable:this type_body_length +public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this type_body_length private static let modulemapFileSetting = "MODULEMAP_FILE" private static let otherCFlagsSetting = "OTHER_CFLAGS" private static let otherLinkerFlagsSetting = "OTHER_LDFLAGS" @@ -65,36 +65,32 @@ public final class ModuleMapMapper: WorkspaceMapping { // swiftlint:disable:this public init() {} // swiftlint:disable function_body_length - public func map(workspace: WorkspaceWithProjects) throws -> (WorkspaceWithProjects, [SideEffectDescriptor]) { + public func map(graph: Graph) throws -> (Graph, [SideEffectDescriptor]) { logger .debug( - "Transforming workspace \(workspace.workspace.name): Mapping MODULE_MAP build setting to -fmodule-map-file compiler flag" + "Transforming graph \(graph.name): Mapping MODULE_MAP build setting to -fmodule-map-file compiler flag" ) - let (projectsByPath, targetsByName) = Self.makeProjectsByPathWithTargetsByName(workspace: workspace) var targetToDependenciesMetadata: [TargetID: Set] = [:] - for project in workspace.projects { - for target in project.targets { - try Self.dependenciesModuleMaps( - workspace: workspace, - project: project, - target: target, - targetToDependenciesMetadata: &targetToDependenciesMetadata, - projectsByPath: projectsByPath, - targetsByName: targetsByName - ) - } + let graphTraverser = GraphTraverser(graph: graph) + for target in graphTraverser.allTargets() { + try Self.dependenciesModuleMaps( + graph: graph, + target: target, + targetToDependenciesMetadata: &targetToDependenciesMetadata + ) } - var mappedWorkspace = workspace - for projectIndex in 0 ..< workspace.projects.count { - var mappedProject = workspace.projects[projectIndex] - for targetIndex in 0 ..< mappedProject.targets.count { - var mappedTarget = mappedProject.targets[targetIndex] - let targetID = TargetID(projectPath: mappedProject.path, targetName: mappedTarget.name) - var mappedSettingsDictionary = mappedTarget.settings?.base ?? [:] + var graph = graph + + graph.projects = Dictionary(uniqueKeysWithValues: graph.projects.map { projectPath, project in + var project = project + project.targets = project.targets.map { target in + var target = target + let targetID = TargetID(projectPath: project.path, targetName: target.name) + var mappedSettingsDictionary = target.settings?.base ?? [:] let hasModuleMap = mappedSettingsDictionary[Self.modulemapFileSetting] != nil - guard hasModuleMap || !(targetToDependenciesMetadata[targetID]?.isEmpty ?? true) else { continue } + guard hasModuleMap || !(targetToDependenciesMetadata[targetID]?.isEmpty ?? true) else { return target } if hasModuleMap { mappedSettingsDictionary[Self.modulemapFileSetting] = nil @@ -132,17 +128,21 @@ public final class ModuleMapMapper: WorkspaceMapping { // swiftlint:disable:this mappedSettingsDictionary[Self.otherLinkerFlagsSetting] = updatedOtherLinkerFlags } - let targetSettings = mappedTarget.settings ?? Settings( + let targetSettings = target.settings ?? Settings( base: [:], configurations: [:], - defaultSettings: mappedProject.settings.defaultSettings + defaultSettings: project.settings.defaultSettings ) - mappedTarget.settings = targetSettings.with(base: mappedSettingsDictionary) - mappedProject.targets[targetIndex] = mappedTarget + target.settings = targetSettings.with(base: mappedSettingsDictionary) + + graph.targets[project.path]?[target.name] = target + + return target } - mappedWorkspace.projects[projectIndex] = mappedProject - } - return (mappedWorkspace, []) + + return (projectPath, project) + }) + return (graph, []) } // swiftlint:enable function_body_length private static func makeProjectsByPathWithTargetsByName(workspace: WorkspaceWithProjects) @@ -164,41 +164,40 @@ public final class ModuleMapMapper: WorkspaceMapping { // swiftlint:disable:this /// Each target must link the module map of its direct and indirect dependencies. /// The `targetToDependenciesMetadata` is also used as cache to avoid recomputing the set for already computed targets. private static func dependenciesModuleMaps( // swiftlint:disable:this function_body_length - workspace: WorkspaceWithProjects, - project: Project, - target: Target, - targetToDependenciesMetadata: inout [TargetID: Set], - projectsByPath: [AbsolutePath: Project], - targetsByName: [String: Target] + graph: Graph, + target: GraphTarget, + targetToDependenciesMetadata: inout [TargetID: Set] ) throws { - let targetID = TargetID(projectPath: project.path, targetName: target.name) + let targetID = TargetID(projectPath: target.path, targetName: target.target.name) if targetToDependenciesMetadata[targetID] != nil { // already computed return } + let graphTraverser = GraphTraverser(graph: graph) + var dependenciesMetadata: Set = [] - for dependency in target.dependencies { + for dependency in target.target.dependencies { let dependentProject: Project - let dependentTarget: Target + let dependentTarget: GraphTarget switch dependency { case let .target(name, _): - guard let dependentTargetFromName = targetsByName[name] else { + guard let dependentTargetFromName = graphTraverser.target(path: target.path, name: name) else { throw ModuleMapMapperError.invalidTargetDependency( - sourceProject: project.path, - sourceTarget: target.name, + sourceProject: target.project.path, + sourceTarget: target.target.name, dependentTarget: name ) } - dependentProject = project + dependentProject = target.project dependentTarget = dependentTargetFromName case let .project(name, path, _): - guard let dependentProjectFromPath = projectsByPath[path], - let dependentTargetFromName = targetsByName[name] + guard let dependentProjectFromPath = graph.projects[path], + let dependentTargetFromName = graphTraverser.target(path: path, name: name) else { throw ModuleMapMapperError.invalidProjectTargetDependency( - sourceProject: project.path, - sourceTarget: target.name, + sourceProject: target.project.path, + sourceTarget: target.target.name, dependentProject: path, dependentTarget: name ) @@ -210,18 +209,15 @@ public final class ModuleMapMapper: WorkspaceMapping { // swiftlint:disable:this } try Self.dependenciesModuleMaps( - workspace: workspace, - project: dependentProject, + graph: graph, target: dependentTarget, - targetToDependenciesMetadata: &targetToDependenciesMetadata, - projectsByPath: projectsByPath, - targetsByName: targetsByName + targetToDependenciesMetadata: &targetToDependenciesMetadata ) // direct dependency module map let dependencyModuleMapPath: AbsolutePath? - if case let .string(dependencyModuleMap) = dependentTarget.settings?.base[Self.modulemapFileSetting] { + if case let .string(dependencyModuleMap) = dependentTarget.target.settings?.base[Self.modulemapFileSetting] { let pathString = dependentProject.path.pathString dependencyModuleMapPath = try AbsolutePath( validating: dependencyModuleMap @@ -234,7 +230,7 @@ public final class ModuleMapMapper: WorkspaceMapping { // swiftlint:disable:this } var headerSearchPaths: [String] - switch dependentTarget.settings?.base[Self.headerSearchPaths] ?? .array([]) { + switch dependentTarget.target.settings?.base[Self.headerSearchPaths] ?? .array([]) { case let .array(values): headerSearchPaths = values case let .string(value): @@ -254,7 +250,7 @@ public final class ModuleMapMapper: WorkspaceMapping { // swiftlint:disable:this } // indirect dependency module maps - let dependentTargetID = TargetID(projectPath: dependentProject.path, targetName: dependentTarget.name) + let dependentTargetID = TargetID(projectPath: dependentProject.path, targetName: dependentTarget.target.name) if let indirectDependencyMetadata = targetToDependenciesMetadata[dependentTargetID] { dependenciesMetadata.formUnion(indirectDependencyMetadata) } @@ -289,7 +285,10 @@ public final class ModuleMapMapper: WorkspaceMapping { // swiftlint:disable:this for headerSearchPath in dependenciesHeaderSearchPaths.sorted() { mappedHeaderSearchPaths.append( - headerSearchPath + ( + try? AbsolutePath(validating: headerSearchPath) + .relative(to: targetID.projectPath).pathString + ).map { "$(SRCROOT)/\($0)" } ?? headerSearchPath ) } diff --git a/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift b/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift index 6b6161bc47c..438bb15d021 100644 --- a/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift +++ b/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift @@ -53,6 +53,7 @@ public final class GraphMapperFactory: GraphMapperFactorying { config: Config ) -> [GraphMapping] { var mappers: [GraphMapping] = [] + mappers.append(ModuleMapMapper()) mappers.append(UpdateWorkspaceProjectsGraphMapper()) mappers.append(ExternalProjectsPlatformNarrowerGraphMapper()) mappers.append(PruneOrphanExternalTargetsGraphMapper()) diff --git a/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift b/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift index 0e5bb6c8d03..36791a6c363 100644 --- a/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift +++ b/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift @@ -59,10 +59,6 @@ public final class WorkspaceMapperFactory: WorkspaceMapperFactorying { AutogeneratedWorkspaceSchemeWorkspaceMapper(forceWorkspaceSchemes: forceWorkspaceSchemes) ) - mappers.append( - ModuleMapMapper() - ) - mappers.append( LastUpgradeVersionWorkspaceMapper() ) diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift index d30a043e2f0..f310aeabbb5 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift @@ -70,12 +70,21 @@ final class ModuleMapMapperTests: TuistUnitTestCase { ) // When - let (gotWorkspaceWithProjects, gotSideEffects) = try subject.map( - workspace: WorkspaceWithProjects( + let (gotGraph, gotSideEffects) = try subject.map( + graph: .test( workspace: workspace, projects: [ - projectA, - projectB, + projectAPath: projectA, + projectBPath: projectB, + ], + targets: [ + projectAPath: [ + targetA.name: targetA, + ], + projectBPath: [ + targetB1.name: targetB1, + targetB2.name: targetB2, + ], ] ) ) @@ -96,7 +105,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { "-Xcc", "-fmodule-map-file=$(SRCROOT)/../B/B2/B2.module", ]), - "HEADER_SEARCH_PATHS": .array(["$(inherited)", "\(projectBPath)/B1/include", "\(projectBPath)/B2/include"]), + "HEADER_SEARCH_PATHS": .array(["$(inherited)", "$(SRCROOT)/../B/B1/include", "$(SRCROOT)/../B/B2/include"]), "OTHER_LDFLAGS": .array(["$(inherited)", "-ObjC"]), ]), dependencies: [ @@ -116,7 +125,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { settings: .test(base: [ "OTHER_CFLAGS": .array(["$(inherited)", "-fmodule-map-file=$(SRCROOT)/B2/B2.module"]), "OTHER_SWIFT_FLAGS": .array(["$(inherited)", "-Xcc", "-fmodule-map-file=$(SRCROOT)/B2/B2.module"]), - "HEADER_SEARCH_PATHS": .array(["$(SRCROOT)/B1/include", "\(projectBPath)/B2/include"]), + "HEADER_SEARCH_PATHS": .array(["$(SRCROOT)/B1/include", "$(SRCROOT)/B2/include"]), "OTHER_LDFLAGS": .array(["$(inherited)", "-ObjC"]), ]), dependencies: [ @@ -141,14 +150,23 @@ final class ModuleMapMapperTests: TuistUnitTestCase { ) XCTAssertBetterEqual( - gotWorkspaceWithProjects, - WorkspaceWithProjects( + Graph.test( workspace: workspace, projects: [ - mappedProjectA, - mappedProjectB, + projectAPath: mappedProjectA, + projectBPath: mappedProjectB, + ], + targets: [ + projectAPath: [ + mappedTargetA.name: mappedTargetA, + ], + projectBPath: [ + mappedTargetB1.name: mappedTargetB1, + mappedTargetB2.name: mappedTargetB2, + ], ] - ) + ), + gotGraph ) XCTAssertEqual(gotSideEffects, []) } @@ -190,12 +208,20 @@ final class ModuleMapMapperTests: TuistUnitTestCase { ) // When - let (gotWorkspaceWithProjects, gotSideEffects) = try subject.map( - workspace: WorkspaceWithProjects( + let (gotGraph, gotSideEffects) = try subject.map( + graph: .test( workspace: workspace, projects: [ - projectA, - projectB, + projectAPath: projectA, + projectBPath: projectB, + ], + targets: [ + projectAPath: [ + targetA.name: targetA, + ], + projectBPath: [ + targetB.name: targetB, + ], ] ) ) @@ -214,7 +240,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { "-Xcc", "-fmodule-map-file=$(SRCROOT)/../B/B/B.module", ]), - "HEADER_SEARCH_PATHS": .array(["$(inherited)", "\(projectBPath)/B/include"]), + "HEADER_SEARCH_PATHS": .array(["$(inherited)", "$(SRCROOT)/../B/B/include"]), "OTHER_LDFLAGS": .array(["$(inherited)", "-ObjC"]), ], configurations: [:], @@ -249,14 +275,22 @@ final class ModuleMapMapperTests: TuistUnitTestCase { ) XCTAssertBetterEqual( - gotWorkspaceWithProjects, - WorkspaceWithProjects( + Graph.test( workspace: workspace, projects: [ - mappedProjectA, - mappedProjectB, + projectAPath: mappedProjectA, + projectBPath: mappedProjectB, + ], + targets: [ + projectAPath: [ + mappedTargetA.name: mappedTargetA, + ], + projectBPath: [ + mappedTargetB.name: mappedTargetB, + ], ] - ) + ), + gotGraph ) XCTAssertEqual(gotSideEffects, []) } diff --git a/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift b/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift index aa2fd837188..2bfd6884259 100644 --- a/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift +++ b/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift @@ -52,4 +52,12 @@ final class GraphMapperFactoryTests: TuistUnitTestCase { // Then XCTAssertDoesntContainElementOfType(got, ExplicitDependencyGraphMapper.self) } + + func test_default_contains_the_modulemap_mapper() { + // When + let got = subject.default(config: .test()) + + // Then + XCTAssertContainsElementOfType(got, ModuleMapMapper.self) + } } diff --git a/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift b/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift index 96eef2d5ab7..0e8986215c1 100644 --- a/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift +++ b/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift @@ -81,17 +81,6 @@ final class WorkspaceMapperFactoryTests: TuistUnitTestCase { XCTAssertContainsElementOfType(got, AutogeneratedWorkspaceSchemeWorkspaceMapper.self) } - func test_default_contains_the_modulemap_mapper() { - // Given - subject = WorkspaceMapperFactory(projectMapper: SequentialProjectMapper(mappers: projectMapperFactory.default())) - - // When - let got = subject.default() - - // Then - XCTAssertContainsElementOfType(got, ModuleMapMapper.self) - } - func test_default_contains_the_last_upgrade_version_mapper() { // Given subject = WorkspaceMapperFactory(projectMapper: SequentialProjectMapper(mappers: projectMapperFactory.default())) From 3bebe423ac73a3604454c956ad0bd13946a994ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 22 Apr 2024 17:54:46 +0200 Subject: [PATCH 238/509] Embed external xcframeworks regardless of linking type (#6217) * Embed external xcframeworks regardless of linking type * Do not embed xcframework if a static library --- Sources/TuistCore/Graph/GraphLoader.swift | 10 +- Sources/TuistCore/Graph/GraphTraverser.swift | 6 +- .../NodeLoaders/XCFrameworkLoader.swift | 9 +- .../NodeLoaders/MockXCFrameworkLoader.swift | 17 --- .../TuistGenerator/Linter/TargetLinter.swift | 2 +- .../TuistGraph/Graph/GraphDependency.swift | 10 +- .../TuistGraph/Models/TargetDependency.swift | 8 +- .../Graph/GraphDependency+TestData.swift | 4 +- .../ProjectAutomation+ManifestMapper.swift | 2 +- .../Loaders/ManifestModelConverter.swift | 3 +- .../Project+ManifestMapper.swift | 3 +- .../Target+ManifestMapper.swift | 6 +- .../TargetDependency+ManifestMapper.swift | 6 +- .../BuildAcceptanceTests.swift | 18 ++- .../Graph/GraphLoaderTests.swift | 4 +- .../Graph/GraphTraverserTests.swift | 118 ++++++++++++++++-- .../NodeLoaders/XCFrameworkLoaderTests.swift | 6 +- ...TargetDependency+ManifestMapperTests.swift | 32 +++-- 18 files changed, 193 insertions(+), 71 deletions(-) delete mode 100644 Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift diff --git a/Sources/TuistCore/Graph/GraphLoader.swift b/Sources/TuistCore/Graph/GraphLoader.swift index e29133ae9c2..f573e830f8a 100644 --- a/Sources/TuistCore/Graph/GraphLoader.swift +++ b/Sources/TuistCore/Graph/GraphLoader.swift @@ -162,11 +162,12 @@ public final class GraphLoader: GraphLoading { cache: cache ) - case let .xcframework(frameworkPath, status, _): + case let .xcframework(frameworkPath, status, _, isExternal): return try loadXCFramework( path: frameworkPath, cache: cache, - status: status + status: status, + isExternal: isExternal ) case let .sdk(name, status, _): @@ -249,7 +250,8 @@ public final class GraphLoader: GraphLoading { private func loadXCFramework( path: AbsolutePath, cache: Cache, - status: FrameworkStatus + status: FrameworkStatus, + isExternal: Bool ) throws -> GraphDependency { if let loaded = cache.xcframeworks[path] { return loaded @@ -266,7 +268,7 @@ public final class GraphLoader: GraphLoading { linking: metadata.linking, mergeable: metadata.mergeable, status: metadata.status, - macroPath: metadata.macroPath + isExternal: isExternal )) cache.add(xcframework: xcframework, at: path) return xcframework diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index 7641ce01b05..9b9b70b8dc1 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -253,7 +253,7 @@ public class GraphTraverser: GraphTraversing { /// Precompiled frameworks var precompiledFrameworks = filterDependencies( from: .target(name: name, path: path), - test: { $0.isPrecompiledDynamicAndLinkable }, + test: { $0.isPrecompiledAndEmbeddable }, skip: or(canDependencyEmbedProducts, isDependencyPrecompiledMacro) ) // Skip merged precompiled libraries from merging into the runnable binary @@ -362,7 +362,7 @@ public class GraphTraverser: GraphTraversing { } let precompiledLibrariesAndFrameworks = Set(precompiled + precompiledDependencies) - .filter(\.isPrecompiledDynamicAndLinkable) + .filter(\.isPrecompiledAndEmbeddable) .compactMap { dependencyReference(to: $0, from: targetGraphDependency) } references.formUnion(precompiledLibrariesAndFrameworks) @@ -525,7 +525,7 @@ public class GraphTraverser: GraphTraversing { let from = GraphDependency.target(name: name, path: path) let precompiledFrameworksPaths = filterDependencies( from: from, - test: { $0.isPrecompiledDynamicAndLinkable }, + test: { $0.isPrecompiledAndEmbeddable }, skip: canDependencyEmbedProducts ) .lazy diff --git a/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift b/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift index 8b293b4772b..4f9ff0fb2e1 100644 --- a/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift +++ b/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift @@ -1,4 +1,5 @@ import Foundation +import Mockable import TSCBasic import TuistGraph import TuistSupport @@ -23,11 +24,13 @@ enum XCFrameworkLoaderError: FatalError, Equatable { } } +@Mockable public protocol XCFrameworkLoading { /// Reads an existing xcframework and returns its in-memory representation, `GraphDependency.xcframework`. /// - Parameter path: Path to the .xcframework. /// - Parameter status: `.optional` to weakly reference the .xcframework. - func load(path: AbsolutePath, status: FrameworkStatus) throws -> GraphDependency + /// - Parameter isExternal: Whether the XCFramework comes from an external SPM project + func load(path: AbsolutePath, status: FrameworkStatus, isExternal: Bool) throws -> GraphDependency } public final class XCFrameworkLoader: XCFrameworkLoading { @@ -44,7 +47,7 @@ public final class XCFrameworkLoader: XCFrameworkLoading { self.xcframeworkMetadataProvider = xcframeworkMetadataProvider } - public func load(path: AbsolutePath, status: FrameworkStatus) throws -> GraphDependency { + public func load(path: AbsolutePath, status: FrameworkStatus, isExternal: Bool) throws -> GraphDependency { guard FileHandler.shared.exists(path) else { throw XCFrameworkLoaderError.xcframeworkNotFound(path) } @@ -59,7 +62,7 @@ public final class XCFrameworkLoader: XCFrameworkLoading { linking: metadata.linking, mergeable: metadata.mergeable, status: metadata.status, - macroPath: metadata.macroPath + isExternal: isExternal ) return .xcframework(xcframework) } diff --git a/Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift b/Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift deleted file mode 100644 index 34352b42408..00000000000 --- a/Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift +++ /dev/null @@ -1,17 +0,0 @@ -import Foundation -import TSCBasic -import TuistCore -import TuistGraph - -public final class MockXCFrameworkLoader: XCFrameworkLoading { - public init() {} - - var loadStub: ((AbsolutePath) throws -> GraphDependency)? - public func load(path: AbsolutePath, status: FrameworkStatus) throws -> GraphDependency { - if let loadStub { - return try loadStub(path) - } else { - return .testXCFramework(path: path, status: status) - } - } -} diff --git a/Sources/TuistGenerator/Linter/TargetLinter.swift b/Sources/TuistGenerator/Linter/TargetLinter.swift index df232d96337..e9c133a321d 100644 --- a/Sources/TuistGenerator/Linter/TargetLinter.swift +++ b/Sources/TuistGenerator/Linter/TargetLinter.swift @@ -324,7 +324,7 @@ extension TargetDependency { return target case let .framework(path, _, _): return path.basename - case let .xcframework(path, _, _): + case let .xcframework(path, _, _, _): return path.basename case let .library(path, _, _, _): return path.basename diff --git a/Sources/TuistGraph/Graph/GraphDependency.swift b/Sources/TuistGraph/Graph/GraphDependency.swift index 98d13d6f216..2c54241e8eb 100644 --- a/Sources/TuistGraph/Graph/GraphDependency.swift +++ b/Sources/TuistGraph/Graph/GraphDependency.swift @@ -9,6 +9,7 @@ public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Coda public let linking: BinaryLinking public let mergeable: Bool public let status: FrameworkStatus + public let isExternal: Bool public init( path: AbsolutePath, @@ -17,7 +18,7 @@ public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Coda linking: BinaryLinking, mergeable: Bool, status: FrameworkStatus, - macroPath _: AbsolutePath? + isExternal: Bool ) { self.path = path self.infoPlist = infoPlist @@ -25,6 +26,7 @@ public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Coda self.linking = linking self.mergeable = mergeable self.status = status + self.isExternal = isExternal } public var description: String { @@ -206,11 +208,13 @@ public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Coda } } - public var isPrecompiledDynamicAndLinkable: Bool { + public var isPrecompiledAndEmbeddable: Bool { switch self { case .macro: return false case let .xcframework(xcframework): - return xcframework.linking == .dynamic + return xcframework + .linking == .dynamic || + (xcframework.isExternal && xcframework.infoPlist.libraries.first?.path.extension == "framework") case let .framework(_, _, _, _, linking, _, _), let .library(path: _, publicHeaders: _, linking: linking, architectures: _, swiftModuleMap: _): return linking == .dynamic diff --git a/Sources/TuistGraph/Models/TargetDependency.swift b/Sources/TuistGraph/Models/TargetDependency.swift index bfee06a3669..e26d7049768 100644 --- a/Sources/TuistGraph/Models/TargetDependency.swift +++ b/Sources/TuistGraph/Models/TargetDependency.swift @@ -21,7 +21,7 @@ public enum TargetDependency: Equatable, Hashable, Codable { case target(name: String, condition: PlatformCondition? = nil) case project(target: String, path: AbsolutePath, condition: PlatformCondition? = nil) case framework(path: AbsolutePath, status: FrameworkStatus, condition: PlatformCondition? = nil) - case xcframework(path: AbsolutePath, status: FrameworkStatus, condition: PlatformCondition? = nil) + case xcframework(path: AbsolutePath, status: FrameworkStatus, condition: PlatformCondition? = nil, isExternal: Bool = false) case library( path: AbsolutePath, publicHeaders: AbsolutePath, @@ -40,7 +40,7 @@ public enum TargetDependency: Equatable, Hashable, Codable { condition case .framework(path: _, status: _, condition: let condition): condition - case .xcframework(path: _, status: _, condition: let condition): + case .xcframework(path: _, status: _, condition: let condition, _): condition case .library(path: _, publicHeaders: _, swiftModuleMap: _, condition: let condition): condition @@ -60,8 +60,8 @@ public enum TargetDependency: Equatable, Hashable, Codable { return .project(target: target, path: path, condition: condition) case .framework(path: let path, status: let status, condition: _): return .framework(path: path, status: status, condition: condition) - case .xcframework(path: let path, status: let status, condition: _): - return .xcframework(path: path, status: status, condition: condition) + case .xcframework(path: let path, status: let status, condition: _, isExternal: let isExternal): + return .xcframework(path: path, status: status, condition: condition, isExternal: isExternal) case .library(path: let path, publicHeaders: let headers, swiftModuleMap: let moduleMap, condition: _): return .library(path: path, publicHeaders: headers, swiftModuleMap: moduleMap, condition: condition) case .package(product: let product, type: let type, condition: _): diff --git a/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift b/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift index 25364742161..2335fc285bb 100644 --- a/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift +++ b/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift @@ -39,7 +39,7 @@ extension GraphDependency { .appending(try! RelativePath(validating: "Test.xcframework/Test")), linking: BinaryLinking = .dynamic, status: FrameworkStatus = .required, - macroPath: AbsolutePath? = nil + isExternal: Bool = false ) -> GraphDependency { .xcframework( GraphDependency.XCFramework( @@ -49,7 +49,7 @@ extension GraphDependency { linking: linking, mergeable: false, status: status, - macroPath: macroPath + isExternal: isExternal ) ) } diff --git a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift index 8215a0d48ed..bbcdfb5547f 100644 --- a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift +++ b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift @@ -90,7 +90,7 @@ extension ProjectAutomation.Target { frameworkStatus = .required } return .framework(path: path.pathString, status: frameworkStatus) - case let .xcframework(path, status, _): + case let .xcframework(path, status, _, _): let frameworkStatus: ProjectAutomation.FrameworkStatus switch status { case .optional: diff --git a/Sources/TuistLoader/Loaders/ManifestModelConverter.swift b/Sources/TuistLoader/Loaders/ManifestModelConverter.swift index 426d59e9715..b94eefc4834 100644 --- a/Sources/TuistLoader/Loaders/ManifestModelConverter.swift +++ b/Sources/TuistLoader/Loaders/ManifestModelConverter.swift @@ -89,7 +89,8 @@ public final class ManifestModelConverter: ManifestModelConverting { try TuistGraph.TargetDependency.from( manifest: targetDependencyManifest, generatorPaths: GeneratorPaths(manifestDirectory: path), - externalDependencies: [:] // externalDependencies manifest can't contain other external dependencies, + externalDependencies: [:], // externalDependencies manifest can't contain other external dependencies, + isExternal: true ) } } diff --git a/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift index 1240e461ffd..d3bf14f52c1 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift @@ -33,7 +33,8 @@ extension TuistGraph.Project { try TuistGraph.Target.from( manifest: $0, generatorPaths: generatorPaths, - externalDependencies: externalDependencies + externalDependencies: externalDependencies, + isExternal: isExternal ) } diff --git a/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift index a71558783a2..c038e5205b7 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift @@ -28,7 +28,8 @@ extension TuistGraph.Target { static func from( manifest: ProjectDescription.Target, generatorPaths: GeneratorPaths, - externalDependencies: [String: [TuistGraph.TargetDependency]] + externalDependencies: [String: [TuistGraph.TargetDependency]], + isExternal: Bool ) throws -> TuistGraph.Target { let name = manifest.name let destinations = try TuistGraph.Destination.from(destinations: manifest.destinations) @@ -43,7 +44,8 @@ extension TuistGraph.Target { try TuistGraph.TargetDependency.from( manifest: $0, generatorPaths: generatorPaths, - externalDependencies: externalDependencies + externalDependencies: externalDependencies, + isExternal: isExternal ) } diff --git a/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift index beeb63a6e72..d0d64073c77 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift @@ -29,7 +29,8 @@ extension TuistGraph.TargetDependency { static func from( // swiftlint:disable:this function_body_length manifest: ProjectDescription.TargetDependency, generatorPaths: GeneratorPaths, - externalDependencies: [String: [TuistGraph.TargetDependency]] + externalDependencies: [String: [TuistGraph.TargetDependency]], + isExternal: Bool ) throws -> [TuistGraph.TargetDependency] { switch manifest { case let .target(name, condition): @@ -79,7 +80,8 @@ extension TuistGraph.TargetDependency { .xcframework( path: try generatorPaths.resolve(path: path), status: .from(manifest: status), - condition: condition?.asGraphCondition + condition: condition?.asGraphCondition, + isExternal: isExternal ), ] case .xctest: diff --git a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift index 1a2aefd9dff..18abdd57089 100644 --- a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift +++ b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift @@ -120,7 +120,23 @@ final class BuildAcceptanceTestMultiplatformAppWithSDK: TuistAcceptanceTestCase try setUpFixture(.multiplatformAppWithSdk) try await run(InstallCommand.self) try await run(GenerateCommand.self) - try await run(BuildCommand.self, "App", "--platform", "macos") + try System.shared.runAndPrint( + [ + "/usr/bin/xcrun", + "xcodebuild", + "clean", + "build", + "-scheme", + "App", + "-workspace", + workspacePath.pathString, + "-destination", + "platform=macOS", + "CODE_SIGN_IDENTITY=\"\"", + "CODE_SIGNING_REQUIRED=NO", + "CODE_SIGNING_ALLOWED=NO", + ] + ) try await run(BuildCommand.self, "App", "--platform", "ios") } } diff --git a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift index a3bbe0fc400..96d34500da9 100644 --- a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift @@ -391,7 +391,7 @@ final class GraphLoaderTests: TuistUnitTestCase { linking: .dynamic, mergeable: false, status: .required, - macroPath: nil + isExternal: false ) ), ]), @@ -440,7 +440,7 @@ final class GraphLoaderTests: TuistUnitTestCase { linking: .dynamic, mergeable: true, status: .required, - macroPath: nil + isExternal: false ) ), ]), diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index 8fc09e4f49c..3350b62e1c1 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -1338,6 +1338,104 @@ final class GraphTraverserTests: TuistUnitTestCase { XCTAssertEqual(got.first, GraphDependencyReference(frameworkDependency)) } + func test_embeddableFrameworks_when_dependencyIsAnExternalXCFramework() throws { + // Given + let xcframeworkPath = try AbsolutePath(validating: "/test/test.xcframework") + let target = Target.test(name: "Main", platform: .iOS) + let project = Project.test(targets: [target]) + + // Given: Value Graph + let xcframeworkDependency = GraphDependency.testXCFramework( + path: xcframeworkPath, + infoPlist: .test( + libraries: [ + .test( + path: try RelativePath(validating: "MyFramework.framework") + ), + ] + ), + linking: .static, + isExternal: true + ) + let graph = Graph.test( + projects: [project.path: project], + targets: [project.path: [target.name: target]], + dependencies: [ + .target(name: target.name, path: project.path): Set(arrayLiteral: xcframeworkDependency), + ] + ) + let subject = GraphTraverser(graph: graph) + + // When + let got = subject.embeddableFrameworks(path: project.path, name: target.name).sorted() + + // Then + XCTAssertEqual(got.first, GraphDependencyReference(xcframeworkDependency)) + } + + func test_embeddableFrameworks_when_dependencyIsAStaticLibraryAndAnExternalXCFramework() throws { + // Given + let xcframeworkPath = try AbsolutePath(validating: "/test/test.xcframework") + let target = Target.test(name: "Main", platform: .iOS) + let project = Project.test(targets: [target]) + + // Given: Value Graph + let xcframeworkDependency = GraphDependency.testXCFramework( + path: xcframeworkPath, + infoPlist: .test( + libraries: [ + .test( + path: try RelativePath(validating: "MyStaticLibrary.a") + ), + ] + ), + linking: .static, + isExternal: true + ) + let graph = Graph.test( + projects: [project.path: project], + targets: [project.path: [target.name: target]], + dependencies: [ + .target(name: target.name, path: project.path): Set(arrayLiteral: xcframeworkDependency), + ] + ) + let subject = GraphTraverser(graph: graph) + + // When + let got = subject.embeddableFrameworks(path: project.path, name: target.name).sorted() + + // Then + XCTAssertEmpty(got) + } + + func test_embeddableFrameworks_when_dependencyIsAnInternalXCFramework() throws { + // Given + let xcframeworkPath = try AbsolutePath(validating: "/test/test.xcframework") + let target = Target.test(name: "Main", platform: .iOS) + let project = Project.test(targets: [target]) + + // Given: Value Graph + let xcframeworkDependency = GraphDependency.testXCFramework( + path: xcframeworkPath, + linking: .static, + isExternal: false + ) + let graph = Graph.test( + projects: [project.path: project], + targets: [project.path: [target.name: target]], + dependencies: [ + .target(name: target.name, path: project.path): Set(arrayLiteral: xcframeworkDependency), + ] + ) + let subject = GraphTraverser(graph: graph) + + // When + let got = subject.embeddableFrameworks(path: project.path, name: target.name).sorted() + + // Then + XCTAssertEmpty(got) + } + func test_embeddableFrameworks_when_transitiveXCFrameworks() throws { // Given let app = Target.test(name: "App", platform: .iOS, product: .app) @@ -1356,7 +1454,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .dynamic, mergeable: false, status: .required, - macroPath: nil + isExternal: false ) ) let dDependency = GraphDependency.xcframework( @@ -1371,7 +1469,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .dynamic, mergeable: false, status: .required, - macroPath: nil + isExternal: false ) ) let eDependency = GraphDependency.xcframework( @@ -1387,7 +1485,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .dynamic, mergeable: true, status: .required, - macroPath: nil + isExternal: false ) ) let dependencies: [GraphDependency: Set] = [ @@ -1437,7 +1535,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .dynamic, mergeable: false, status: .required, - macroPath: nil + isExternal: false ) ) let dDependency = GraphDependency.xcframework( @@ -1452,7 +1550,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .dynamic, mergeable: false, status: .required, - macroPath: nil + isExternal: false ) ) let eDependency = GraphDependency.xcframework( @@ -1468,7 +1566,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .dynamic, mergeable: true, status: .required, - macroPath: nil + isExternal: false ) ) let dependencies: [GraphDependency: Set] = [ @@ -4057,7 +4155,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .static, mergeable: false, status: .required, - macroPath: nil + isExternal: false ) ) let directFramework = GraphDependency.framework( @@ -4082,7 +4180,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .static, mergeable: false, status: .required, - macroPath: nil + isExternal: false ) ) let transitiveXCFramework = GraphDependency.xcframework( @@ -4097,7 +4195,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .static, mergeable: false, status: .required, - macroPath: nil + isExternal: false ) ) let frameworkTransitiveXCFramework = GraphDependency.xcframework( @@ -4112,7 +4210,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .static, mergeable: false, status: .required, - macroPath: nil + isExternal: false ) ) diff --git a/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift b/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift index 5bfa725f15d..384853b42b2 100644 --- a/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift +++ b/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift @@ -48,7 +48,7 @@ final class XCFrameworkLoaderTests: TuistUnitTestCase { // Then XCTAssertThrowsSpecific( - try subject.load(path: xcframeworkPath, status: .required), + try subject.load(path: xcframeworkPath, status: .required, isExternal: false), XCFrameworkLoaderError.xcframeworkNotFound(xcframeworkPath) ) } @@ -76,7 +76,7 @@ final class XCFrameworkLoaderTests: TuistUnitTestCase { } // When - let got = try subject.load(path: xcframeworkPath, status: .required) + let got = try subject.load(path: xcframeworkPath, status: .required, isExternal: false) // Then XCTAssertEqual( @@ -89,7 +89,7 @@ final class XCFrameworkLoaderTests: TuistUnitTestCase { linking: linking, mergeable: false, status: .required, - macroPath: nil + isExternal: false ) ) ) diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift index f5304d0c136..8d50e44c076 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift @@ -19,17 +19,19 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let got = try TuistGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, - externalDependencies: ["library": [.xcframework(path: "/path.xcframework", status: .required)]] + externalDependencies: ["library": [.xcframework(path: "/path.xcframework", status: .required, isExternal: true)]], + isExternal: true ) // Then XCTAssertEqual(got.count, 1) - guard case let .xcframework(path, status, _) = got[0] else { + guard case let .xcframework(path, status, _, isExternal) = got[0] else { XCTFail("Dependency should be xcframework") return } XCTAssertEqual(path, "/path.xcframework") XCTAssertEqual(status, .required) + XCTAssertTrue(isExternal) } func test_from_when_external_project() throws { @@ -41,7 +43,8 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let got = try TuistGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, - externalDependencies: ["library": [.project(target: "Target", path: "/Project")]] + externalDependencies: ["library": [.project(target: "Target", path: "/Project")]], + isExternal: true ) // Then @@ -65,20 +68,22 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { generatorPaths: generatorPaths, externalDependencies: [ "library": [ - .xcframework(path: "/path.xcframework", status: .required), + .xcframework(path: "/path.xcframework", status: .required, isExternal: true), .project(target: "Target", path: "/Project"), ], - ] + ], + isExternal: true ) // Then XCTAssertEqual(got.count, 2) - guard case let .xcframework(frameworkPath, status, _) = got[0] else { + guard case let .xcframework(frameworkPath, status, _, isExternal) = got[0] else { XCTFail("First dependency should be xcframework") return } XCTAssertEqual(frameworkPath, "/path.xcframework") XCTAssertEqual(status, .required) + XCTAssertTrue(isExternal) guard case let .project(target, path, _) = got[1] else { XCTFail("Dependency should be project") @@ -97,7 +102,8 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let got = try TuistGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, - externalDependencies: [:] + externalDependencies: [:], + isExternal: false ) // Then @@ -119,7 +125,8 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let got = try TuistGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, - externalDependencies: [:] + externalDependencies: [:], + isExternal: false ) // Then @@ -141,7 +148,8 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let got = try TuistGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, - externalDependencies: [:] + externalDependencies: [:], + isExternal: false ) // Then @@ -163,7 +171,8 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let got = try TuistGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, - externalDependencies: [:] + externalDependencies: [:], + isExternal: false ) // Then @@ -185,7 +194,8 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let got = try TuistGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, - externalDependencies: [:] + externalDependencies: [:], + isExternal: false ) // Then From 89e71c58430af545b6583d49f09861ef5ed09fc6 Mon Sep 17 00:00:00 2001 From: Tuist Date: Mon, 22 Apr 2024 16:14:17 +0000 Subject: [PATCH 239/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.10.0 --- .mise.toml | 2 +- CHANGELOG.md | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index a405768e260..9789381fec6 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.9.0" +tuist = "4.10.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f660e48d85..b203205821c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## 4.10.0 - 2024-04-22 + +### Tuist + +#### Added + +- Add support for privacy manifest file generation [#6117](https://github.com/tuist/tuist/pull/6117) by [@Lilfaen](https://github.com/Lilfaen) +- Add simulated location support on testable target configuration [#6187](https://github.com/tuist/tuist/pull/6187) by [@woin2ee](https://github.com/woin2ee) + +#### Fixed + +- Fix resources filename mismatch when a dependency has a + [#6151](https://github.com/tuist/tuist/pull/6151) by [@fortmarek](https://github.com/fortmarek) +- Fix integration of Cuckoo [#6195](https://github.com/tuist/tuist/pull/6195) by [@danibachar](https://github.com/danibachar) +- Fix missing external target settings with config conditions [#6170](https://github.com/tuist/tuist/pull/6170) by [@fortmarek](https://github.com/fortmarek) +- Skip rewriting modulemaps if not changed to fix issues with pch [#6212](https://github.com/tuist/tuist/pull/6212) by [@waltflanagan](https://github.com/waltflanagan) +- Use relative paths instead of absolute paths for header search paths for modulemaps [#6218](https://github.com/tuist/tuist/pull/6218) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +- no changes + ## 4.9.0 - 2024-04-02 ### Tuist From 39ea0c383bb151bb75dfaa6befe671bed2f94bda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Mon, 22 Apr 2024 19:28:58 +0200 Subject: [PATCH 240/509] Delete the version from Constants.swift (#6219) --- Sources/TuistSupport/Constants.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 2d6f18e9a99..93eab4b7d11 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -8,7 +8,6 @@ public enum Constants { public static let githubAPIURL = "https://api.github.com" public static let githubSlug = "tuist/tuist" public static let communityURL = "https://github.com/tuist/tuist/discussions/categories/general" - public static let version = "4.3.4" public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" From 50460e810ad28d455c00d901cfd20b434215619d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 22 Apr 2024 19:36:10 +0200 Subject: [PATCH 241/509] Fix regression in ModuleMapMapper due to outdated Graph properties (#6221) --- .../Mappers/ModuleMapMapper.swift | 82 ++----------------- .../ProjectMappers/ModuleMapMapperTests.swift | 26 ++++++ 2 files changed, 33 insertions(+), 75 deletions(-) diff --git a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift index 0fc99495764..468ccbfd684 100644 --- a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift +++ b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift @@ -4,44 +4,6 @@ import TuistCore import TuistGraph import TuistSupport -enum ModuleMapMapperError: FatalError { - case invalidTargetDependency(sourceProject: AbsolutePath, sourceTarget: String, dependentTarget: String) - case invalidProjectTargetDependency( - sourceProject: AbsolutePath, - sourceTarget: String, - dependentProject: AbsolutePath, - dependentTarget: String - ) - - /// Error type. - var type: ErrorType { - switch self { - case .invalidTargetDependency, .invalidProjectTargetDependency: return .abort - } - } - - /// Error description. - var description: String { - switch self { - case let .invalidTargetDependency(sourceProject, sourceTarget, dependentTarget): - return """ - Target '\(sourceTarget)' of the project at path '\(sourceProject.pathString)' \ - depends on a target '\(dependentTarget)' that can't be found. \ - Please make sure your project configuration is correct. - """ - case let .invalidProjectTargetDependency(sourceProject, sourceTarget, dependentProject, dependentTarget): - return """ - Target '\(sourceTarget)' of the project at path '\(sourceProject.pathString)' \ - depends on a target '\(dependentTarget)' of the project at path '\( - dependentProject - .pathString - )' that can't be found. \ - Please make sure your project configuration is correct. - """ - } - } -} - /// Mapper that maps the `MODULE_MAP` build setting to the `-fmodule-map-file` compiler flags. /// It is required to avoid embedding the module map into the frameworks during cache operations, which would make the framework /// not portable, as the modulemap could contain absolute paths. @@ -177,48 +139,18 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ let graphTraverser = GraphTraverser(graph: graph) var dependenciesMetadata: Set = [] - for dependency in target.target.dependencies { - let dependentProject: Project - let dependentTarget: GraphTarget - switch dependency { - case let .target(name, _): - guard let dependentTargetFromName = graphTraverser.target(path: target.path, name: name) else { - throw ModuleMapMapperError.invalidTargetDependency( - sourceProject: target.project.path, - sourceTarget: target.target.name, - dependentTarget: name - ) - } - dependentProject = target.project - dependentTarget = dependentTargetFromName - case let .project(name, path, _): - guard let dependentProjectFromPath = graph.projects[path], - let dependentTargetFromName = graphTraverser.target(path: path, name: name) - else { - throw ModuleMapMapperError.invalidProjectTargetDependency( - sourceProject: target.project.path, - sourceTarget: target.target.name, - dependentProject: path, - dependentTarget: name - ) - } - dependentProject = dependentProjectFromPath - dependentTarget = dependentTargetFromName - case .framework, .xcframework, .library, .package, .sdk, .xctest: - continue - } - + for dependency in graphTraverser.directTargetDependencies(path: target.path, name: target.target.name) { try Self.dependenciesModuleMaps( graph: graph, - target: dependentTarget, + target: dependency.graphTarget, targetToDependenciesMetadata: &targetToDependenciesMetadata ) // direct dependency module map let dependencyModuleMapPath: AbsolutePath? - if case let .string(dependencyModuleMap) = dependentTarget.target.settings?.base[Self.modulemapFileSetting] { - let pathString = dependentProject.path.pathString + if case let .string(dependencyModuleMap) = dependency.target.settings?.base[Self.modulemapFileSetting] { + let pathString = dependency.graphTarget.path.pathString dependencyModuleMapPath = try AbsolutePath( validating: dependencyModuleMap .replacingOccurrences(of: "$(PROJECT_DIR)", with: pathString) @@ -230,7 +162,7 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ } var headerSearchPaths: [String] - switch dependentTarget.target.settings?.base[Self.headerSearchPaths] ?? .array([]) { + switch dependency.target.settings?.base[Self.headerSearchPaths] ?? .array([]) { case let .array(values): headerSearchPaths = values case let .string(value): @@ -238,7 +170,7 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ } headerSearchPaths = headerSearchPaths.map { - let pathString = dependentProject.path.pathString + let pathString = dependency.graphTarget.path.pathString return ( try? AbsolutePath( validating: $0 @@ -250,7 +182,7 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ } // indirect dependency module maps - let dependentTargetID = TargetID(projectPath: dependentProject.path, targetName: dependentTarget.target.name) + let dependentTargetID = TargetID(projectPath: dependency.graphTarget.path, targetName: dependency.target.name) if let indirectDependencyMetadata = targetToDependenciesMetadata[dependentTargetID] { dependenciesMetadata.formUnion(indirectDependencyMetadata) } diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift index f310aeabbb5..d65a93b3e81 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift @@ -85,6 +85,14 @@ final class ModuleMapMapperTests: TuistUnitTestCase { targetB1.name: targetB1, targetB2.name: targetB2, ], + ], + dependencies: [ + .target(name: targetA.name, path: projectAPath): [ + .target(name: targetB1.name, path: projectBPath), + ], + .target(name: targetB1.name, path: projectBPath): [ + .target(name: targetB2.name, path: projectBPath), + ], ] ) ) @@ -164,6 +172,14 @@ final class ModuleMapMapperTests: TuistUnitTestCase { mappedTargetB1.name: mappedTargetB1, mappedTargetB2.name: mappedTargetB2, ], + ], + dependencies: [ + .target(name: targetA.name, path: projectAPath): [ + .target(name: targetB1.name, path: projectBPath), + ], + .target(name: targetB1.name, path: projectBPath): [ + .target(name: targetB2.name, path: projectBPath), + ], ] ), gotGraph @@ -222,6 +238,11 @@ final class ModuleMapMapperTests: TuistUnitTestCase { projectBPath: [ targetB.name: targetB, ], + ], + dependencies: [ + .target(name: targetA.name, path: projectAPath): [ + .target(name: targetB.name, path: projectBPath), + ], ] ) ) @@ -288,6 +309,11 @@ final class ModuleMapMapperTests: TuistUnitTestCase { projectBPath: [ mappedTargetB.name: mappedTargetB, ], + ], + dependencies: [ + .target(name: projectA.name, path: projectAPath): [ + .target(name: projectB.name, path: projectBPath), + ], ] ), gotGraph From eccef727fe7965f6a70d2e48ee233da56efcaee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Mon, 22 Apr 2024 19:51:20 +0200 Subject: [PATCH 242/509] Document the hashing logic (#6220) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Document the hashing logic * Update docs/docs/cloud/hashing.md Co-authored-by: Marek Fořt * Update docs/docs/cloud/hashing.md Co-authored-by: Marek Fořt --------- Co-authored-by: Marek Fořt --- docs/.vitepress/config.mjs | 4 ++++ docs/docs/cloud/hashing.md | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 docs/docs/cloud/hashing.md diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 7ca8d3fd79e..6a03eff41ad 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -262,6 +262,10 @@ export default defineConfig({ text: "Selective testing", link: "/cloud/selective-testing", }, + { + text: "Hashing", + link: "/cloud/hashing", + }, { text: "On-premise", link: "/cloud/on-premise", diff --git a/docs/docs/cloud/hashing.md b/docs/docs/cloud/hashing.md new file mode 100644 index 00000000000..cfe28175390 --- /dev/null +++ b/docs/docs/cloud/hashing.md @@ -0,0 +1,38 @@ +--- +title: Hashing +description: Learn about Tuist's hashing logic upon which features like binary caching and selective testing are built. +--- + +# Hashing + +To determine if a target has changed, Tuist **calculates a hash for each target** in the dependency graph. [Binary caching](/cloud/binary-caching) leverages that information to determine whether binaries should be used for a particular target, or if the tests of a target should be run. The hash is calculated based on the following attributes: + +- The target's attributes (e.g., name, platform, product, etc.) +- The target's files +- The hash of the target's dependencies + +### Binary caching + +Additionally, when calculating the hash for [binary caching](/cloud/binary-caching), we also hash the following attributes. + +#### Swift version + +We hash the Swift version obtained from running the command `/usr/bin/xcrun swift --version` to prevent compilation errors due to Swift version mismatches between the targets and the binaries. + +> [!NOTE] MODULE STABILITY +> Previous versions of binary caching relied on the `BUILD_LIBRARY_FOR_DISTRIBUTION` build setting to enable [module stability](https://www.swift.org/blog/library-evolution#enabling-library-evolution-support) and enable using binaries with any compiler version. However, it caused compilation issues in projects with targets that don't support module stability. Generated binaries are bound to the Swift version used to compile them, and the Swift version must match the one used to compile the project. + +#### Configuration + + +The idea behind this flag was to ensure debug binaries were not used in release builds and viceversa. However, we are still missing a mechanism to remove the other configurations from the projects to prevent them from being used. + +## Debugging + +If you notice non-deterministic behaviors when using the caching across environments or invocations, it might be related to differences across the environments or a bug in the hashing logic. We recommend following these steps to debug the issue: + +1. Ensure the same [configuration](#configuration) and [Swift version](#swift-version) is used across environments. +2. Check if there are differences between the Xcode projects generated by two consecutive invocations of `tuist generate` or across environments. You can use the `diff` command to compare the projects. The generated projects might include **absolute paths** causing the hashing logic to be non-deterministic. + +> [!NOTE] BETTER DEBUGGING EXPERIENCE PLANNED +> Improving our debugging experience is in our roadmap. The print-hashes command, which lacks the context to understand the differences, will be replaced by a more user-friendly command that uses a tree-like structure to show the differences between the hashes. \ No newline at end of file From 760a7bb89af38c0f9109b9501431bf5a8082baf9 Mon Sep 17 00:00:00 2001 From: Pedro Date: Mon, 22 Apr 2024 20:02:16 +0200 Subject: [PATCH 243/509] Add the version back --- Sources/TuistSupport/Constants.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 93eab4b7d11..55b691614ba 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -1,6 +1,9 @@ import Foundation public enum Constants { + // NOTE: We expect tuist-cloud to set the value before running the CLI + public static var version: String! = "x.y.z" + public static let versionFileName = ".tuist-version" public static let binFolderName = ".tuist-bin" public static let binName = "tuist" From 555263a2cd8ca7472ee7cdea417af7776a23467e Mon Sep 17 00:00:00 2001 From: Tuist Date: Mon, 22 Apr 2024 18:22:09 +0000 Subject: [PATCH 244/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.10.1 --- .mise.toml | 2 +- CHANGELOG.md | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 9789381fec6..4d869f83edc 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.10.0" +tuist = "4.10.1" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index b203205821c..c60a844e365 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 4.10.1 - 2024-04-22 + +### Tuist + +#### Fixed + +- Fix regression in ModuleMapMapper due to outdated Graph properties [#6221](https://github.com/tuist/tuist/pull/6221) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +- no changes + ## 4.10.0 - 2024-04-22 ### Tuist From 2c3001cf578ff614b8a4cfa0670fe9a413caffe7 Mon Sep 17 00:00:00 2001 From: Tuist Date: Tue, 23 Apr 2024 11:33:48 +0000 Subject: [PATCH 245/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.10.2 --- .mise.toml | 2 +- CHANGELOG.md | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 4d869f83edc..9d79f3473c9 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.10.1" +tuist = "4.10.2" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index c60a844e365..734a7251715 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 4.10.2 - 2024-04-23 + +### Tuist + +- no changes + +### Tuist Cloud + +- no changes + ## 4.10.1 - 2024-04-22 ### Tuist From c09f01fae363eedf7722a4718530323e77a9e182 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 23 Apr 2024 14:56:29 +0200 Subject: [PATCH 246/509] add kapitoshka438 as a contributor for code (#6229) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 35df230db08..2dfbaf8828b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1328,6 +1328,15 @@ "contributions": [ "doc" ] + }, + { + "login": "kapitoshka438", + "name": "Eduard Miniakhmetov", + "avatar_url": "https://avatars.githubusercontent.com/u/3232401?v=4", + "profile": "https://github.com/kapitoshka438", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 38525435a5b..f119fad4878 100644 --- a/README.md +++ b/README.md @@ -523,6 +523,7 @@ Thanks goes to these wonderful people:
    Łukasz Lech

    costapombo

    Ihor Savynskyi
    +
    Eduard Miniakhmetov
    From 781f3dc7f7972f89564065c12dda8a93be1a0098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 23 Apr 2024 14:59:25 +0200 Subject: [PATCH 247/509] Improve XcodeBuildController API (#6228) --- .../XcodeBuild/XcodeBuildController.swift | 4 +- .../Automation/XcodeBuildControlling.swift | 57 +------------------ .../Automation/MockXcodeBuildController.swift | 4 +- .../XcodeBuildControllingTests.swift | 32 ----------- 4 files changed, 5 insertions(+), 92 deletions(-) delete mode 100644 Tests/TuistCoreTests/Automation/XcodeBuildControllingTests.swift diff --git a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift index 29dae2fba1f..55f49c1662b 100644 --- a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift +++ b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift @@ -196,11 +196,11 @@ public final class XcodeBuildController: XcodeBuildControlling { } public func createXCFramework( - arguments: [XcodeBuildControllerCreateXCFrameworkArgument], + arguments: [String], output: AbsolutePath ) throws -> AsyncThrowingStream, Error> { var command = ["/usr/bin/xcrun", "xcodebuild", "-create-xcframework"] - command.append(contentsOf: arguments.flatMap(\.xcodebuildArguments)) + command.append(contentsOf: arguments) command.append(contentsOf: ["-output", output.pathString]) command.append("-allow-internal-distribution") diff --git a/Sources/TuistCore/Automation/XcodeBuildControlling.swift b/Sources/TuistCore/Automation/XcodeBuildControlling.swift index 696812c855a..e4caf1fccb2 100644 --- a/Sources/TuistCore/Automation/XcodeBuildControlling.swift +++ b/Sources/TuistCore/Automation/XcodeBuildControlling.swift @@ -7,61 +7,6 @@ public enum XcodeBuildDestination: Equatable { case mac } -/// An enum that represents value pairs that can be passed when creating an .xcframework. -public enum XcodeBuildControllerCreateXCFrameworkArgument { // swiftlint:disable:this type_name - /** - An argument that represents a framework archive. The argument is a tuple containing the - absolute path to the archive, and the name of the framework inside the archive. - - xcodebuild -create-xcframework - -archive archives/MyFramework-iOS.xcarchive -framework MyFramework.framework - -archive archives/MyFramework-iOS_Simulator.xcarchive -framework MyFramework.framework - -archive archives/MyFramework-macOS.xcarchive -framework MyFramework.framework - -archive archives/MyFramework-Mac_Catalyst.xcarchive -framework MyFramework.framework - -output xcframeworks/MyFramework.xcframework - */ - case framework(archivePath: AbsolutePath, framework: String) - - /** - An argument that represents a library. The argument is a tuple containing the absolute path - to the library, and the absolute path to the directory containing the headers. - - xcodebuild -create-xcframework - -library products/iOS/usr/local/lib/libMyLibrary.a -headers products/iOS/usr/local/include - -library products/iOS_Simulator/usr/local/lib/libMyLibrary.a -headers products/iOS/usr/local/include - -library products/macOS/usr/local/lib/libMyLibrary.a -headers products/macOS/usr/local/include - -library products/Mac\ Catalyst/usr/local/lib/libMyLibrary.a -headers products/Mac\ Catalyst/usr/local/include - -output xcframeworks/MyLibrary.xcframework - */ - case library(path: AbsolutePath, headers: AbsolutePath) - - /** - It passes the -debug-symbol argument when creating frameworks. - */ - case debugSymbols(path: AbsolutePath) - - /** - Returns the arguments that represent his argument when invoking xcodebuild. - */ - public var xcodebuildArguments: [String] { - func sanitizedPath(_ path: AbsolutePath) -> String { - // It's workaround for Xcode 15 RC bug - // remove it since bug will be fixed - // more details here: https://github.com/tuist/tuist/issues/5354 - path.pathString.hasPrefix("/var/") ? path.pathString.replacingOccurrences(of: "/var/", with: "/private/var/") : path - .pathString - } - switch self { - case let .framework(archivePath, framework): - return ["-archive", sanitizedPath(archivePath), "-framework", framework] - case let .library(libraryPath, headers): - return ["-library", sanitizedPath(libraryPath), "-headers", sanitizedPath(headers)] - case let .debugSymbols(path): - return ["-debug-symbols", sanitizedPath(path)] - } - } -} - public protocol XcodeBuildControlling { /// Returns an observable to build the given project using xcodebuild. /// - Parameters: @@ -130,7 +75,7 @@ public protocol XcodeBuildControlling { /// - arguments: A set of arguments to configure the XCFramework creation. /// - output: Path to the output .xcframework. func createXCFramework( - arguments: [XcodeBuildControllerCreateXCFrameworkArgument], + arguments: [String], output: AbsolutePath ) throws -> AsyncThrowingStream, Error> diff --git a/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift b/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift index f4007b01c6b..95982d6877a 100644 --- a/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift +++ b/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift @@ -131,11 +131,11 @@ final class MockXcodeBuildController: XcodeBuildControlling { } var createXCFrameworkStub: ( - ([XcodeBuildControllerCreateXCFrameworkArgument], AbsolutePath) + ([String], AbsolutePath) -> [SystemEvent] )? func createXCFramework( - arguments: [XcodeBuildControllerCreateXCFrameworkArgument], + arguments: [String], output: AbsolutePath ) -> AsyncThrowingStream, Error> { if let createXCFrameworkStub { diff --git a/Tests/TuistCoreTests/Automation/XcodeBuildControllingTests.swift b/Tests/TuistCoreTests/Automation/XcodeBuildControllingTests.swift deleted file mode 100644 index 5cf87cd3417..00000000000 --- a/Tests/TuistCoreTests/Automation/XcodeBuildControllingTests.swift +++ /dev/null @@ -1,32 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport -import XCTest -@testable import TuistCore -@testable import TuistSupportTesting - -final class XcodeBuildControllerCreateXCFrameworkArgumentTests: TuistUnitTestCase { - func test_xcodebuildArguments() throws { - // When: Framework - let archive = try AbsolutePath(validating: "/test.xcarchive") - let framework = "Test.framework" - XCTAssertEqual( - XcodeBuildControllerCreateXCFrameworkArgument.framework(archivePath: archive, framework: framework) - .xcodebuildArguments, - ["-archive", archive.pathString, "-framework", framework] - ) - - // When: Library - let library = try AbsolutePath(validating: "/library.a") - let headers = try AbsolutePath(validating: "/headers") - XCTAssertEqual(XcodeBuildControllerCreateXCFrameworkArgument.library( - path: library, - headers: headers - ).xcodebuildArguments, [ - "-library", - library.pathString, - "-headers", - headers.pathString, - ]) - } -} From e7a26b18776c0d04a24cb3a4678dd9d0c9c94b05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 23 Apr 2024 19:42:27 +0200 Subject: [PATCH 248/509] Some documentation improvements (#6230) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Document how to set up the projects to benefit from the binary cache * Mention that projects might require adjustments to be onboarded on Tuist Cloud * Add a trouble-shooting section * Update docs/docs/cloud/binary-caching.md Co-authored-by: Marek Fořt * Update docs/docs/cloud/binary-caching.md Co-authored-by: Marek Fořt * address comment --------- Co-authored-by: Marek Fořt --- docs/docs/cloud/binary-caching.md | 38 ++++++++++++++++++++++++------- docs/docs/cloud/what-is-cloud.md | 3 +++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/docs/docs/cloud/binary-caching.md b/docs/docs/cloud/binary-caching.md index 291064afd3e..db2fe699bf4 100644 --- a/docs/docs/cloud/binary-caching.md +++ b/docs/docs/cloud/binary-caching.md @@ -26,9 +26,6 @@ tuist cache The command re-uses binaries to speed up the process. -> [!TIP] CACHE WARMING IN CI ENVIRONMENTS -> We recommend setting up a CI pipeline exclusively to keep the cache warmed. That way developers in your team will have access to those binaries, thereby reducing their local build times. - ## Using the cache binaries By default, when Tuist commands necessitate project generation, they automatically substitute dependencies with their binary equivalents from the cache, if available. Additionally, if you specify a list of targets to focus on, Tuist will also replace any dependent targets with their cached binaries, provided they are available. For those who prefer a different approach, there is an option to opt out of this behavior entirely by using a specific flag: @@ -62,10 +59,6 @@ We are working on supporting libraries and targets that depend on XCTest. > [!NOTE] UPSTREAM DEPENDENCIES > When a target is non-cacheable it makes the upstream targets non-cacheable too. For example, if you have the dependency graph `A > B`, where A depends on B, if B is non-cacheable, A will also be non-cacheable. -## Hashing - -The hash of a target is calculated by hashing its attributes, the files the target depends on, and the hashes of its dependencies. The current hashing logic is a bit opaque, but we are working on improving it to make it more transparent and predictable. We also have plans to expose APIs such that you can customize the hashing logic to suit your needs. For example, you could instruct Tuist to hash an environment variable that has an impact on the target's output. - ## Cache effectiveness The level of effectiveness that can be achieved with binary caching depends strongly on the graph structure. To achieve the best results, we recommend the following: @@ -74,4 +67,33 @@ The level of effectiveness that can be achieved with binary caching depends stro 2. Define dependencies with protocol/interface targets instead of implementation ones, and dependency-inject implementations from the top-most targets. 3. Split frequently-modified targets into smaller ones whose likelihood of change is lower. -The above suggestions are part of the [µFeatures architecture](/guide/scale/ufeatures-architecture), which we propose as a way to structure your projects to maximize the benefits not only of binary caching but also of Xcode's capabilities. \ No newline at end of file +The above suggestions are part of the [µFeatures architecture](/guide/scale/ufeatures-architecture), which we propose as a way to structure your projects to maximize the benefits not only of binary caching but also of Xcode's capabilities. + +## Recommended setup + +We recommend having a CI job that **runs in every commit in the main branch** to warm the cache. This will ensure the cache always contains binaries for the changes in `main` so local and CI branch build incrementally upon them. + +> [!TIP] CACHE WARMING USES BINARIES +> The `tuist cache` command also makes use of the binary cache to speed up the warming. + +The following are some examples of common workflows: + +### A developer starts to work on a new feature + +1. They create a new branch from `main`. +2. They run `tuist generate`. +3. Tuist pulls the most recent binaries from `main` and generates the project with them. + +### A developer pushes changes upstream + +1. The CI pipeline will run `tuist build` or `tuist test` to build or test the project. +2. The workflow will pull the most recent binaries from `main` and generate the project with them. +3. It will then build or test the project incrementally. + +## Troubleshooting + +### It doesn't use binaries for my targets + +Ensure that the [hashes are deterministic](/cloud/hashing.html#debugging) across environments and runs. This might happen if the project has references to the environment, for example through absolute paths. You can use the `diff` command to compare the projects generated by two consecutive invocations of `tuist generate` or across environments or runs. + +Also make sure that the target doesn't depend either directly or indirectly on a [non-cacheable target](/cloud/binary-caching.html#cacheable-products). \ No newline at end of file diff --git a/docs/docs/cloud/what-is-cloud.md b/docs/docs/cloud/what-is-cloud.md index 65e8275bea9..10037eda760 100644 --- a/docs/docs/cloud/what-is-cloud.md +++ b/docs/docs/cloud/what-is-cloud.md @@ -12,6 +12,9 @@ As we advanced towards enhancing productivity, it became evident that **certain Tuist Cloud, a closed-source paid service, enhances Tuist by adding server-requisite functionalities. Integration of Tuist projects with Tuist Cloud not only augments existing functionalities but also introduces new ones. This service encapsulates years of experience in developing tools for mobile developers at [Shopify](https://shopify.com) (e.g., [Mobile Tophat](https://shopify.engineering/mobile-tophatting-at-shopify-1), [Mobile Release Engineering at Scale](https://shopify.engineering/mobile-release-engineering-scale-shipit-mobile), [Scaling iOS CI with Anka](https://shopify.engineering/scaling-ios-ci-with-anka)) and is envisioned as **the copilot for your platform teams**. Our objective is to help organizations cultivate a productive development environment. +> [!IMPORTANT] PROJECT ONBOARDING +> Due to [Xcode's default to convenience](/guide/introduction/cost-of-convenience) your project might contain implicit configurations that can prevent some Tuist Cloud features from working as expected, and therefore require manual adjustments. + ## Sustainability Similar to many other open-source projects, Tuist also necessitated full-time dedicated personnel to adequately meet the demand for support and feature requests. Tuist Cloud plays a crucial role in fulfilling this requirement by enabling the financing of full-time personnel for the project. From 5f55980b0b67b896efddc7c8906ef4309f297b18 Mon Sep 17 00:00:00 2001 From: John Yorke Date: Wed, 24 Apr 2024 13:23:30 +0100 Subject: [PATCH 249/509] Fix typo in `appleVisionWithiPadDesign` comment (#6231) --- Sources/ProjectDescription/Destination.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/ProjectDescription/Destination.swift b/Sources/ProjectDescription/Destination.swift index b9f10ee2d61..29a7d815e60 100644 --- a/Sources/ProjectDescription/Destination.swift +++ b/Sources/ProjectDescription/Destination.swift @@ -39,7 +39,7 @@ public enum Destination: String, Codable, Equatable, CaseIterable { case appleTv /// visionOS support case appleVision - /// visionOS support useing iPad design + /// visionOS support using iPad design case appleVisionWithiPadDesign /// SDK Platform of a destination From b4be486db012f1359edc14abed0ee7cc1b0eacf5 Mon Sep 17 00:00:00 2001 From: Alexander Filimonov Date: Wed, 24 Apr 2024 15:42:28 +0100 Subject: [PATCH 250/509] Fix generating CoreData models in resourceSynthesizer .coreData() (#6201) * fix coredata template generating * fix formatter issues * modify fixture test * fix coredata stencil template * add readme for coredata fixture --------- Co-authored-by: Alexander Filimonov --- ...esizedResourceInterfaceProjectMapper.swift | 6 +- .../GenerateAcceptanceTests.swift | 11 +++ ...dResourceInterfaceProjectMapperTests.swift | 69 ++++++++++++++++++- .../Unversioned.xcdatamodel/contents | 7 +- .../Users.xcdatamodeld/1.xcdatamodel/contents | 7 +- .../Users.xcdatamodeld/2.xcdatamodel/contents | 7 +- .../1.xcdatamodel/contents | 7 +- .../2.5.xcdatamodel/contents | 7 +- .../2.xcdatamodel/contents | 7 +- fixtures/ios_app_with_coredata/Project.swift | 3 +- fixtures/ios_app_with_coredata/README.md | 3 + .../ResourceSynthesizers/CoreData.stencil | 10 +++ 12 files changed, 109 insertions(+), 35 deletions(-) create mode 100644 fixtures/ios_app_with_coredata/README.md create mode 100644 fixtures/ios_app_with_coredata/Tuist/ResourceSynthesizers/CoreData.stencil diff --git a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift index 86cc53cdc7b..3f7ae196643 100644 --- a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift @@ -70,7 +70,9 @@ public final class SynthesizedResourceInterfaceProjectMapper: ProjectMapping { / /// Map and generate resource interfaces for a given `Target` and `Project` private func mapTarget(_ target: Target, project: Project) throws -> (Target, [SideEffectDescriptor]) { - guard !target.resources.resources.isEmpty, target.supportsSources else { return (target, []) } + let resourcesForSynthesizersPaths = target.resources.resources + .map(\.path) + target.coreDataModels.map(\.path) + guard !resourcesForSynthesizersPaths.isEmpty, target.supportsSources else { return (target, []) } var target = target @@ -153,7 +155,7 @@ public final class SynthesizedResourceInterfaceProjectMapper: ProjectMapping { / developmentRegion: String? ) -> [AbsolutePath] { let resourcesPaths = target.resources.resources - .map(\.path) + .map(\.path) + target.coreDataModels.map(\.path) var paths = resourcesPaths .filter { $0.extension.map(resourceSynthesizer.extensions.contains) ?? false } diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index c3cc7bcca63..21bc07b141e 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -560,6 +560,17 @@ final class GenerateAcceptanceTestiOSAppWithCoreData: TuistAcceptanceTestCase { resource: resource ) } + XCTAssertTrue( + FileHandler.shared.exists( + fixturePath.appending( + components: [ + "Derived", + "Sources", + "TuistCoreData+App.swift", + ] + ) + ) + ) } } diff --git a/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift index f817ce001cb..11c19f3ffac 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift @@ -58,6 +58,11 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { let otfFont = targetAPath.appending(component: "otfFont.otf") let ttcFont = targetAPath.appending(component: "ttcFont.ttc") let lottieFile = targetAPath.appending(component: "LottieAnimation.lottie") + let coreDataModelFolder = targetAPath.appending(component: "CoreDataModel.xcdatamodeld") + let coreDataModelVersionFile = targetAPath.appending( + components: "CoreDataModel.xcdatamodeld", + "CoreDataModel.xcdatamodel" + ) try fileHandler.createFolder(aAssets) try fileHandler.touch(aAsset) @@ -65,6 +70,7 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { try fileHandler.touch(frenchStringsDict) try fileHandler.touch(englishStrings) try fileHandler.touch(englishStringsDict) + try fileHandler.touch(coreDataModelVersionFile) try fileHandler.write("a", path: frenchStrings, atomically: true) try fileHandler.write("a", path: frenchStringsDict, atomically: true) try fileHandler.write("a", path: englishStrings, atomically: true) @@ -79,6 +85,10 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { try fileHandler.write("a", path: lottieFile, atomically: true) let stringsTemplatePath = projectPath.appending(component: "Strings.stencil") try fileHandler.write("strings template", path: stringsTemplatePath, atomically: true) + let coreDataTemplatePath = projectPath.appending(component: "CoreData.stencil") + try fileHandler.write("core data template", path: coreDataTemplatePath, atomically: true) + try fileHandler.createFolder(coreDataModelFolder) + try fileHandler.write("a", path: coreDataModelVersionFile, atomically: true) let targetA = Target.test( name: "TargetA", @@ -96,7 +106,16 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { .file(path: ttcFont), .file(path: lottieFile), ] - ) + ), + coreDataModels: [ + CoreDataModel( + path: coreDataModelFolder, + versions: [ + coreDataModelVersionFile, + ], + currentVersion: "CoreDataModel" + ), + ] ) let resourceSynthesizers: [ResourceSynthesizer] = [ @@ -155,6 +174,17 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { extensions: ["lottie"], template: .file(lottieTemplatePath) ), + .init( + parser: .coreData, + parserOptions: [ + "stringValue": "test", + "intValue": 999, + "boolValue": true, + "doubleValue": 1.0, + ], + extensions: ["xcdatamodeld"], + template: .file(coreDataTemplatePath) + ), ] let project = Project.test( @@ -207,6 +237,12 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { contents: "TargetA/LottieAnimation.lottie".data(using: .utf8) ) ), + .file( + FileDescriptor( + path: derivedSourcesPath.appending(component: "TuistCoreData+TargetA.swift"), + contents: "TargetA/CoreDataModel.xcdatamodeld".data(using: .utf8) + ) + ), ] ) XCTAssertEqual( @@ -250,8 +286,15 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { compilerFlags: nil, contentHash: try contentHasher.hash("TargetA/LottieAnimation.lottie".data(using: .utf8)!) ), + SourceFile( + path: derivedSourcesPath + .appending(component: "TuistCoreData+TargetA.swift"), + compilerFlags: nil, + contentHash: try contentHasher.hash("TargetA/CoreDataModel.xcdatamodeld".data(using: .utf8)!) + ), ], - resources: targetA.resources + resources: targetA.resources, + coreDataModels: targetA.coreDataModels ), ], resourceSynthesizers: resourceSynthesizers @@ -265,6 +308,7 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { SynthesizedResourceInterfaceTemplates.plistsTemplate, SynthesizedResourceInterfaceTemplates.fontsTemplate, "lottie template", + "core data template", ] ) [ @@ -273,6 +317,7 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { ResourceSynthesizer.Parser.plists, ResourceSynthesizer.Parser.fonts, ResourceSynthesizer.Parser.json, + ResourceSynthesizer.Parser.coreData, ].forEach { parser in XCTAssertEqual( parserOptionsStrings[parser], @@ -309,6 +354,11 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { let otfFont = targetAPath.appending(component: "otfFont.otf") let ttcFont = targetAPath.appending(component: "ttcFont.ttc") let lottieFile = targetAPath.appending(component: "LottieAnimation.lottie") + let coreDataModelFolder = targetAPath.appending(component: "CoreDataModel.xcdatamodeld") + let coreDataModelVersionFile = targetAPath.appending( + components: "CoreDataModel.xcdatamodeld", + "CoreDataModel.xcdatamodel" + ) try fileHandler.createFolder(aAssets) try fileHandler.touch(aAsset) @@ -330,6 +380,10 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { try fileHandler.write("a", path: lottieFile, atomically: true) let stringsTemplatePath = projectPath.appending(component: "Strings.stencil") try fileHandler.write("strings template", path: stringsTemplatePath, atomically: true) + let coreDataTemplatePath = projectPath.appending(component: "CoreData.stencil") + try fileHandler.write("core data template", path: coreDataTemplatePath, atomically: true) + try fileHandler.createFolder(coreDataModelFolder) + try fileHandler.write("a", path: coreDataModelVersionFile, atomically: true) let targetA = Target.test( name: "TargetA", @@ -381,6 +435,17 @@ final class SynthesizedResourceInterfaceProjectMapperTests: TuistUnitTestCase { extensions: ["lottie"], template: .file(lottieTemplatePath) ), + .init( + parser: .coreData, + parserOptions: [ + "stringValue": "test", + "intValue": 999, + "boolValue": true, + "doubleValue": 1.0, + ], + extensions: ["xcdatamodeld"], + template: .file(coreDataTemplatePath) + ), ] let project = Project.test( diff --git a/fixtures/ios_app_with_coredata/CoreData/Unversioned.xcdatamodeld/Unversioned.xcdatamodel/contents b/fixtures/ios_app_with_coredata/CoreData/Unversioned.xcdatamodeld/Unversioned.xcdatamodel/contents index c02c3e68527..9c33e04760a 100644 --- a/fixtures/ios_app_with_coredata/CoreData/Unversioned.xcdatamodeld/Unversioned.xcdatamodel/contents +++ b/fixtures/ios_app_with_coredata/CoreData/Unversioned.xcdatamodeld/Unversioned.xcdatamodel/contents @@ -1,10 +1,7 @@ - - + + - - - \ No newline at end of file diff --git a/fixtures/ios_app_with_coredata/CoreData/Users.xcdatamodeld/1.xcdatamodel/contents b/fixtures/ios_app_with_coredata/CoreData/Users.xcdatamodeld/1.xcdatamodel/contents index 9e3da4939f4..836fb1cbc9a 100644 --- a/fixtures/ios_app_with_coredata/CoreData/Users.xcdatamodeld/1.xcdatamodel/contents +++ b/fixtures/ios_app_with_coredata/CoreData/Users.xcdatamodeld/1.xcdatamodel/contents @@ -1,10 +1,7 @@ - - + + - - - \ No newline at end of file diff --git a/fixtures/ios_app_with_coredata/CoreData/Users.xcdatamodeld/2.xcdatamodel/contents b/fixtures/ios_app_with_coredata/CoreData/Users.xcdatamodeld/2.xcdatamodel/contents index d21bb709bdd..21856a47e36 100644 --- a/fixtures/ios_app_with_coredata/CoreData/Users.xcdatamodeld/2.xcdatamodel/contents +++ b/fixtures/ios_app_with_coredata/CoreData/Users.xcdatamodeld/2.xcdatamodel/contents @@ -1,10 +1,7 @@ - - + + - - - \ No newline at end of file diff --git a/fixtures/ios_app_with_coredata/CoreData/UsersAutoDetect.xcdatamodeld/1.xcdatamodel/contents b/fixtures/ios_app_with_coredata/CoreData/UsersAutoDetect.xcdatamodeld/1.xcdatamodel/contents index 59d8f899b83..971d919d12e 100644 --- a/fixtures/ios_app_with_coredata/CoreData/UsersAutoDetect.xcdatamodeld/1.xcdatamodel/contents +++ b/fixtures/ios_app_with_coredata/CoreData/UsersAutoDetect.xcdatamodeld/1.xcdatamodel/contents @@ -1,10 +1,7 @@ - - + + - - - \ No newline at end of file diff --git a/fixtures/ios_app_with_coredata/CoreData/UsersAutoDetect.xcdatamodeld/2.5.xcdatamodel/contents b/fixtures/ios_app_with_coredata/CoreData/UsersAutoDetect.xcdatamodeld/2.5.xcdatamodel/contents index d6255643ab1..971d919d12e 100644 --- a/fixtures/ios_app_with_coredata/CoreData/UsersAutoDetect.xcdatamodeld/2.5.xcdatamodel/contents +++ b/fixtures/ios_app_with_coredata/CoreData/UsersAutoDetect.xcdatamodeld/2.5.xcdatamodel/contents @@ -1,10 +1,7 @@ - - + + - - - \ No newline at end of file diff --git a/fixtures/ios_app_with_coredata/CoreData/UsersAutoDetect.xcdatamodeld/2.xcdatamodel/contents b/fixtures/ios_app_with_coredata/CoreData/UsersAutoDetect.xcdatamodeld/2.xcdatamodel/contents index b0480147863..3224638ff56 100644 --- a/fixtures/ios_app_with_coredata/CoreData/UsersAutoDetect.xcdatamodeld/2.xcdatamodel/contents +++ b/fixtures/ios_app_with_coredata/CoreData/UsersAutoDetect.xcdatamodeld/2.xcdatamodel/contents @@ -1,10 +1,7 @@ - - + + - - - \ No newline at end of file diff --git a/fixtures/ios_app_with_coredata/Project.swift b/fixtures/ios_app_with_coredata/Project.swift index b2f01994781..c0ad2eafd15 100644 --- a/fixtures/ios_app_with_coredata/Project.swift +++ b/fixtures/ios_app_with_coredata/Project.swift @@ -16,5 +16,6 @@ let project = Project( .coreDataModel("CoreData/Unversioned.xcdatamodeld"), ] ), - ] + ], + resourceSynthesizers: .default + [.coreData()] ) diff --git a/fixtures/ios_app_with_coredata/README.md b/fixtures/ios_app_with_coredata/README.md new file mode 100644 index 00000000000..f53aed3e279 --- /dev/null +++ b/fixtures/ios_app_with_coredata/README.md @@ -0,0 +1,3 @@ +# Application with CoreData models + +This example showcases a project that utilizes CoreData models and code generation for these models using resourceSynthesizer. \ No newline at end of file diff --git a/fixtures/ios_app_with_coredata/Tuist/ResourceSynthesizers/CoreData.stencil b/fixtures/ios_app_with_coredata/Tuist/ResourceSynthesizers/CoreData.stencil new file mode 100644 index 00000000000..e8b5c21ac32 --- /dev/null +++ b/fixtures/ios_app_with_coredata/Tuist/ResourceSynthesizers/CoreData.stencil @@ -0,0 +1,10 @@ +import CoreData +import Foundation + +{% for model in models %} +{% for name, entity in model.entities %} +@objc({{ entity.className }}) +public final class {{ entity.className }}: NSManagedObject { +} +{% endfor %} +{% endfor %} \ No newline at end of file From c7e0b57b3f70a1c3f63cb41861f1077f3a915696 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 24 Apr 2024 16:49:12 +0200 Subject: [PATCH 251/509] add alexfilimon as a contributor for code (#6233) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 +++ 2 files changed, 12 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2dfbaf8828b..dc1030498d2 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1337,6 +1337,15 @@ "contributions": [ "code" ] + }, + { + "login": "alexfilimon", + "name": "Alexander Filimonov", + "avatar_url": "https://avatars.githubusercontent.com/u/19904867?v=4", + "profile": "https://github.com/alexfilimon", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index f119fad4878..8a8fa8077cc 100644 --- a/README.md +++ b/README.md @@ -525,6 +525,9 @@ Thanks goes to these wonderful people:
    Ihor Savynskyi

    Eduard Miniakhmetov
    + +
    Alexander Filimonov
    + From 3e2d777d4066335ac6ffe90bf24ba1186d592689 Mon Sep 17 00:00:00 2001 From: danibachar Date: Wed, 24 Apr 2024 08:56:07 -0600 Subject: [PATCH 252/509] Align resource bundle accessor generation with SPM (#6146) * Comply to SPM bundle accessors * unit tests fix * templates updates * small fixes * Updates * removed duplicated bundle module symbol * lint * PR fixes * MR fixes --------- Co-authored-by: Daniel Bachar --- .../Mappers/ResourcesProjectMapper.swift | 235 ++++++++++-------- .../Templates/AssetsTemplate.swift | 18 +- .../Templates/StringsTemplate.swift | 2 +- .../ResourcesProjectMapperTests.swift | 148 +++++++++-- .../App/Project.swift | 2 + .../Sources/Styles/StylesResources.swift | 10 + .../Tuist/Package.resolved | 20 +- .../Tuist/Package.swift | 3 +- 8 files changed, 303 insertions(+), 135 deletions(-) create mode 100644 fixtures/app_with_spm_dependencies/LocalSwiftPackage/Sources/Styles/StylesResources.swift diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 4292edfc0c6..072c1cde61d 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -66,8 +66,7 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this } if target.supportsSources, - target.sources.contains(where: { $0.path.extension == "swift" }), - !target.sources.contains(where: { $0.path.basename == "\(target.name)Resources.swift" }) + target.sources.containsSwiftFiles { let (filePath, data) = synthesizedSwiftFile(bundleName: bundleName, target: target, project: project) @@ -78,10 +77,9 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this sideEffects.append(sideEffect) } - if project.isExternal, - target.supportsSources, - target.sources.contains(where: { $0.path.extension == "m" || $0.path.extension == "mm" }), - !target.resources.resources.filter({ $0.path.extension != "xcprivacy" }).isEmpty + if target.supportsSources, + target.sources.containsObjcFiles, + target.resources.containsBundleAccessedResources { let (headerFilePath, headerData) = synthesizedObjcHeaderFile(bundleName: bundleName, target: target, project: project) @@ -129,19 +127,16 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this let content: String = ResourcesProjectMapper.fileContent( targetName: target.name, bundleName: bundleName.replacingOccurrences(of: "-", with: "_"), - target: target + target: target, + in: project ) return (filePath, content.data(using: .utf8)) } - private func synthesizedObjcHeaderFile(bundleName: String, target: Target, project: Project) -> (AbsolutePath, Data?) { + private func synthesizedObjcHeaderFile(bundleName _: String, target: Target, project: Project) -> (AbsolutePath, Data?) { let filePath = synthesizedFilePath(target: target, project: project, fileExtension: "h") - let content: String = ResourcesProjectMapper.objcHeaderFileContent( - targetName: target.name, - bundleName: bundleName.replacingOccurrences(of: "-", with: "_"), - target: target - ) + let content: String = ResourcesProjectMapper.objcHeaderFileContent(targetName: target.name) return (filePath, content.data(using: .utf8)) } @@ -165,107 +160,34 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this } // swiftlint:disable:next function_body_length - static func fileContent(targetName: String, bundleName: String, target: Target) -> String { + static func fileContent(targetName _: String, bundleName: String, target: Target, in project: Project) -> String { + var content = """ + // swiftlint:disable all + // swift-format-ignore-file + // swiftformat:disable all + import Foundation + """ if !target.supportsResources { - return """ - // swiftlint:disable all - // swift-format-ignore-file - // swiftformat:disable all - import Foundation - - // MARK: - Swift Bundle Accessor - - private class BundleFinder {} - - extension Foundation.Bundle { - /// Since \(targetName) is a \( - target - .product - ), the bundle containing the resources is copied into the final product. - static let module: Bundle = { - let bundleName = "\(bundleName)" - - var candidates = [ - Bundle.main.resourceURL, - Bundle(for: BundleFinder.self).resourceURL, - Bundle.main.bundleURL, - ] - - // This is a fix to make Previews work with bundled resources. - // Logic here is taken from SPM's generated `resource_bundle_accessors.swift` file, - // which is located under the derived data directory after building the project. - if let override = ProcessInfo.processInfo.environment["PACKAGE_RESOURCE_BUNDLE_PATH"] { - candidates.append(URL(fileURLWithPath: override)) - - // Deleting derived data and not rebuilding the frameworks containing resources may result in a state - // where the bundles are only available in the framework's directory that is actively being previewed. - // Since we don't know which framework this is, we also need to look in all the framework subpaths. - if let subpaths = try? FileManager.default.contentsOfDirectory(atPath: override) { - for subpath in subpaths { - if subpath.hasSuffix(".framework") { - candidates.append(URL(fileURLWithPath: override + "/" + subpath)) - } - } - } - } - - for candidate in candidates { - let bundlePath = candidate?.appendingPathComponent(bundleName + ".bundle") - if let bundle = bundlePath.flatMap(Bundle.init(url:)) { - return bundle - } - } - fatalError("unable to find bundle named \(bundleName)") - }() - } - - // MARK: - Objective-C Bundle Accessor - - @objc - public class \(target.productName.toValidSwiftIdentifier())Resources: NSObject { - @objc public class var bundle: Bundle { - return .module - } - } - // swiftlint:enable all - // swiftformat:enable all - - """ + content += swiftSPMBundleAccessorString(for: target, and: bundleName) } else { - return """ - // swiftlint:disable all - // swift-format-ignore-file - // swiftformat:disable all - import Foundation - - // MARK: - Swift Bundle Accessor - - private class BundleFinder {} - - extension Foundation.Bundle { - /// Since \(targetName) is a \( - target - .product - ), the bundle for classes within this module can be used directly. - static let module = Bundle(for: BundleFinder.self) - } - - // MARK: - Objective-C Bundle Accessor - - @objc - public class \(target.productName.toValidSwiftIdentifier())Resources: NSObject { - @objc public class var bundle: Bundle { - return .module - } - } - // swiftlint:enable all - // swiftformat:enable all + content += swiftFrameworkBundleAccessorString(for: target) + } - """ + // Add public accessors only for non external projects + if !project.isExternal, !target.sourcesContainsPublicResourceClassName { + content += publicBundleAccessorString(for: target) } + + content += """ + // swiftlint:enable all + // swiftformat:enable all + """ + return content } - static func objcHeaderFileContent(targetName: String, bundleName _: String, target _: Target) -> String { + static func objcHeaderFileContent( + targetName: String + ) -> String { return """ #import @@ -283,7 +205,10 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this """ } - static func objcImplementationFileContent(targetName: String, bundleName: String) -> String { + static func objcImplementationFileContent( + targetName: String, + bundleName: String + ) -> String { return """ #import #import "TuistBundle+\(targetName).h" @@ -297,4 +222,96 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this } """ } + + private static func publicBundleAccessorString(for target: Target) -> String { + """ + // MARK: - Objective-C Bundle Accessor + @objc + public class \(target.productName.toValidSwiftIdentifier())Resources: NSObject { + @objc public class var bundle: Bundle { + return .module + } + } + """ + } + + private static func swiftSPMBundleAccessorString(for target: Target, and bundleName: String) -> String { + """ + // MARK: - Swift Bundle Accessor - for SPM + private class BundleFinder {} + extension Foundation.Bundle { + /// Since \(target.name) is a \( + target + .product + ), the bundle containing the resources is copied into the final product. + static let module: Bundle = { + let bundleName = "\(bundleName)" + var candidates = [ + Bundle.main.resourceURL, + Bundle(for: BundleFinder.self).resourceURL, + Bundle.main.bundleURL, + ] + // This is a fix to make Previews work with bundled resources. + // Logic here is taken from SPM's generated `resource_bundle_accessors.swift` file, + // which is located under the derived data directory after building the project. + if let override = ProcessInfo.processInfo.environment["PACKAGE_RESOURCE_BUNDLE_PATH"] { + candidates.append(URL(fileURLWithPath: override)) + // Deleting derived data and not rebuilding the frameworks containing resources may result in a state + // where the bundles are only available in the framework's directory that is actively being previewed. + // Since we don't know which framework this is, we also need to look in all the framework subpaths. + if let subpaths = try? FileManager.default.contentsOfDirectory(atPath: override) { + for subpath in subpaths { + if subpath.hasSuffix(".framework") { + candidates.append(URL(fileURLWithPath: override + "/" + subpath)) + } + } + } + } + for candidate in candidates { + let bundlePath = candidate?.appendingPathComponent(bundleName + ".bundle") + if let bundle = bundlePath.flatMap(Bundle.init(url:)) { + return bundle + } + } + fatalError("unable to find bundle named \(bundleName)") + }() + } + """ + } + + private static func swiftFrameworkBundleAccessorString(for target: Target) -> String { + """ + // MARK: - Swift Bundle Accessor for Frameworks + private class BundleFinder {} + extension Foundation.Bundle { + /// Since \(target.name) is a \( + target + .product + ), the bundle for classes within this module can be used directly. + static let module = Bundle(for: BundleFinder.self) + } + """ + } +} + +extension [SourceFile] { + fileprivate var containsObjcFiles: Bool { + contains(where: { $0.path.extension == "m" || $0.path.extension == "mm" }) + } + + fileprivate var containsSwiftFiles: Bool { + contains(where: { $0.path.extension == "swift" }) + } +} + +extension ResourceFileElements { + fileprivate var containsBundleAccessedResources: Bool { + !resources.filter { $0.path.extension != "xcprivacy" }.isEmpty + } +} + +extension Target { + fileprivate var sourcesContainsPublicResourceClassName: Bool { + sources.contains(where: { $0.path.basename == "\(name)Resources.swift" }) + } } diff --git a/Sources/TuistGenerator/Templates/AssetsTemplate.swift b/Sources/TuistGenerator/Templates/AssetsTemplate.swift index fd261a46475..0f8c037f8c7 100644 --- a/Sources/TuistGenerator/Templates/AssetsTemplate.swift +++ b/Sources/TuistGenerator/Templates/AssetsTemplate.swift @@ -131,7 +131,7 @@ extension SynthesizedResourceInterfaceTemplates { @available(iOS 11.3, *) {{accessModifier}} extension ARReferenceImage { static func referenceImages(in asset: {{arResourceGroupType}}) -> Set { - let bundle = {{bundleToken}}.bundle + let bundle = Bundle.module return referenceImages(inGroupNamed: asset.name, bundle: bundle) ?? Set() } } @@ -139,7 +139,7 @@ extension SynthesizedResourceInterfaceTemplates { @available(iOS 12.0, *) {{accessModifier}} extension ARReferenceObject { static func referenceObjects(in asset: {{arResourceGroupType}}) -> Set { - let bundle = {{bundleToken}}.bundle + let bundle = Bundle.module return referenceObjects(inGroupNamed: asset.name, bundle: bundle) ?? Set() } } @@ -189,7 +189,7 @@ extension SynthesizedResourceInterfaceTemplates { {{accessModifier}} extension {{colorType}}.Color { @available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, visionOS 1.0, *) convenience init?(asset: {{colorType}}) { - let bundle = {{bundleToken}}.bundle + let bundle = Bundle.module #if os(iOS) || os(tvOS) || os(visionOS) self.init(named: asset.name, in: bundle, compatibleWith: nil) #elseif os(macOS) @@ -204,7 +204,7 @@ extension SynthesizedResourceInterfaceTemplates { @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, visionOS 1.0, *) {{accessModifier}} extension SwiftUI.Color { init(asset: {{colorType}}) { - let bundle = {{bundleToken}}.bundle + let bundle = Bundle.module self.init(asset.name, bundle: bundle) } } @@ -230,7 +230,7 @@ extension SynthesizedResourceInterfaceTemplates { @available(iOS 9.0, macOS 10.11, visionOS 1.0, *) {{accessModifier}} extension NSDataAsset { convenience init?(asset: {{dataType}}) { - let bundle = {{bundleToken}}.bundle + let bundle = Bundle.module #if os(iOS) || os(tvOS) || os(visionOS) self.init(name: asset.name, bundle: bundle) #elseif os(macOS) @@ -252,7 +252,7 @@ extension SynthesizedResourceInterfaceTemplates { #endif {{accessModifier}} var image: Image { - let bundle = {{bundleToken}}.bundle + let bundle = Bundle.module #if os(iOS) || os(tvOS) || os(visionOS) let image = Image(named: name, in: bundle, compatibleWith: nil) #elseif os(macOS) @@ -278,17 +278,17 @@ extension SynthesizedResourceInterfaceTemplates { @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, visionOS 1.0, *) {{accessModifier}} extension SwiftUI.Image { init(asset: {{imageType}}) { - let bundle = {{bundleToken}}.bundle + let bundle = Bundle.module self.init(asset.name, bundle: bundle) } init(asset: {{imageType}}, label: Text) { - let bundle = {{bundleToken}}.bundle + let bundle = Bundle.module self.init(asset.name, bundle: bundle, label: label) } init(decorative asset: {{imageType}}) { - let bundle = {{bundleToken}}.bundle + let bundle = Bundle.module self.init(decorative: asset.name, bundle: bundle) } } diff --git a/Sources/TuistGenerator/Templates/StringsTemplate.swift b/Sources/TuistGenerator/Templates/StringsTemplate.swift index 4bd3773f16c..92281a6d3d1 100644 --- a/Sources/TuistGenerator/Templates/StringsTemplate.swift +++ b/Sources/TuistGenerator/Templates/StringsTemplate.swift @@ -83,7 +83,7 @@ extension SynthesizedResourceInterfaceTemplates { {% if param.lookupFunction %} let format = {{ param.lookupFunction }}(key, table) {% else %} - let format = {{bundleToken}}.bundle.localizedString(forKey: key, value: nil, table: table) + let format = Bundle.module.localizedString(forKey: key, value: nil, table: table) {% endif %} return String(format: format, locale: Locale.current, arguments: args) } diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 87d87b2ca83..4fccf2afad1 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -51,7 +51,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { .appending(component: Constants.DerivedDirectory.sources) .appending(component: "TuistBundle+\(target.name).swift") let expectedContents = ResourcesProjectMapper - .fileContent(targetName: target.name, bundleName: "\(project.name)_\(target.name)", target: target) + .fileContent(targetName: target.name, bundleName: "\(project.name)_\(target.name)", target: target, in: project) XCTAssertEqual(file.path, expectedPath) XCTAssertEqual(file.contents, expectedContents.data(using: .utf8)) @@ -102,10 +102,10 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual(gotSideEffects, []) } - func testMap_whenNoSwiftSources() throws { + func test_map_when_no_sources() throws { // Given let resources: [ResourceFileElement] = [.file(path: "/image.png")] - let target = Target.test(product: .staticLibrary, sources: ["/Absolute/File.m"], resources: .init(resources)) + let target = Target.test(product: .staticLibrary, sources: [], resources: .init(resources)) project = Project.test( targets: [target] ) @@ -121,7 +121,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.resources.count, 0) - XCTAssertEqual(gotTarget.sources.count, 1) + XCTAssertEqual(gotTarget.sources.count, 0) XCTAssertEqual(gotTarget.dependencies.count, 1) XCTAssertEqual( gotTarget.dependencies.first, @@ -161,7 +161,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { .appending(component: Constants.DerivedDirectory.sources) .appending(component: "TuistBundle+\(target.name).swift") let expectedContents = ResourcesProjectMapper - .fileContent(targetName: target.name, bundleName: "\(project.name)_\(target.name)", target: target) + .fileContent(targetName: target.name, bundleName: "\(project.name)_\(target.name)", target: target, in: project) XCTAssertEqual(file.path, expectedPath) XCTAssertEqual(file.contents, expectedContents.data(using: .utf8)) @@ -211,7 +211,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { .appending(component: Constants.DerivedDirectory.sources) .appending(component: "TuistBundle+\(target.name).swift") let expectedContents = ResourcesProjectMapper - .fileContent(targetName: target.name, bundleName: irrelevantBundleName, target: target) + .fileContent(targetName: target.name, bundleName: irrelevantBundleName, target: target, in: project) XCTAssertEqual(file.path, expectedPath) XCTAssertEqual(file.contents, expectedContents.data(using: .utf8)) @@ -249,7 +249,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { .appending(component: Constants.DerivedDirectory.sources) .appending(component: "TuistBundle+\(target.name).swift") let expectedContents = ResourcesProjectMapper - .fileContent(targetName: target.name, bundleName: irrelevantBundleName, target: target) + .fileContent(targetName: target.name, bundleName: irrelevantBundleName, target: target, in: project) XCTAssertEqual(file.path, expectedPath) XCTAssertEqual(file.contents, expectedContents.data(using: .utf8)) @@ -322,12 +322,70 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { .appending(component: Constants.DerivedDirectory.sources) .appending(component: "TuistBundle+\(target.name.camelized.uppercasingFirst).swift") let expectedContents = ResourcesProjectMapper - .fileContent(targetName: target.name, bundleName: "\(project.name)_test_tuist", target: target) + .fileContent(targetName: target.name, bundleName: "\(project.name)_test_tuist", target: target, in: project) XCTAssertEqual(file.path, expectedPath) XCTAssertEqual(file.contents, expectedContents.data(using: .utf8)) } - func test_map_when_a_target_has_objc_source_files() throws { + func test_map_when_a_project_is_external_target_has_swift_source_but_no_resource_files() throws { + // Given + let sources: [SourceFile] = ["/ViewController.swift"] + let resources: [ResourceFileElement] = [] + let target = Target.test(product: .staticLibrary, sources: sources, resources: .init(resources)) + project = Project.test(path: try AbsolutePath(validating: "/AbsolutePath/Project"), targets: [target], isExternal: true) + + // Got + let (gotProject, gotSideEffects) = try subject.map(project: project) + + // Then + XCTAssertEqual(gotProject.targets, [target]) + XCTAssertEmpty(gotSideEffects) + } + + func test_map_when_a_project_is_not_external_target_has_swift_source_but_no_resource_files() throws { + // Given + let sources: [SourceFile] = ["/ViewController.swift"] + let resources: [ResourceFileElement] = [] + let target = Target.test(product: .staticLibrary, sources: sources, resources: .init(resources)) + project = Project.test(path: try AbsolutePath(validating: "/AbsolutePath/Project"), targets: [target], isExternal: false) + + // Got + let (gotProject, gotSideEffects) = try subject.map(project: project) + + // Then + XCTAssertEqual(gotProject.targets, [target]) + XCTAssertEmpty(gotSideEffects) + } + + func test_map_when_a_project_is_external_target_has_swift_source_and_resource_files() throws { + // Given + let sources: [SourceFile] = ["/ViewController.swift"] + let resources: [ResourceFileElement] = [.file(path: "/AbsolutePath/Project/Resources/image.png")] + let target = Target.test(product: .staticLibrary, sources: sources, resources: .init(resources)) + project = Project.test(path: try AbsolutePath(validating: "/AbsolutePath/Project"), targets: [target], isExternal: true) + + // Got + let (_, gotSideEffects) = try subject.map(project: project) + + // Then: Side effects + try verify(gotSideEffects, for: target, in: project, by: "\(project.name)_\(target.name)") + } + + func test_map_when_a_project_is_not_external_target_has_swift_source_and_resource_files() throws { + // Given + let sources: [SourceFile] = ["/ViewController.swift"] + let resources: [ResourceFileElement] = [.file(path: "/AbsolutePath/Project/Resources/image.png")] + let target = Target.test(product: .staticLibrary, sources: sources, resources: .init(resources)) + project = Project.test(path: try AbsolutePath(validating: "/AbsolutePath/Project"), targets: [target], isExternal: false) + + // Got + let (_, gotSideEffects) = try subject.map(project: project) + + // Then: Side effects + try verify(gotSideEffects, for: target, in: project, by: "\(project.name)_\(target.name)") + } + + func test_map_when_a_project_is_external_target_has_objc_source_files() throws { // Given let sources: [SourceFile] = ["/ViewController.m"] let resources: [ResourceFileElement] = [.file(path: "/AbsolutePath/Project/Resources/image.png")] @@ -339,6 +397,63 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then let gotTarget = try XCTUnwrap(gotProject.targets.first) + verifyObjcBundleAccessor( + for: target, + gotTarget: gotTarget, + gotSideEffects: gotSideEffects + ) + } + + func test_map_when_a_project_is_not_external_target_has_objc_source_files() throws { + // Given + let sources: [SourceFile] = ["/ViewController.m"] + let resources: [ResourceFileElement] = [.file(path: "/AbsolutePath/Project/Resources/image.png")] + let target = Target.test(product: .staticLibrary, sources: sources, resources: .init(resources)) + project = Project.test(path: try AbsolutePath(validating: "/AbsolutePath/Project"), targets: [target], isExternal: false) + + // Got + let (gotProject, gotSideEffects) = try subject.map(project: project) + + // Then + let gotTarget = try XCTUnwrap(gotProject.targets.first) + verifyObjcBundleAccessor( + for: target, + gotTarget: gotTarget, + gotSideEffects: gotSideEffects + ) + } + + // MARK: - Verifiers + + private func verify( + _ gotSideEffects: [SideEffectDescriptor], + for target: Target, + in project: Project, + by bundleName: String + ) throws { + XCTAssertEqual(gotSideEffects.count, 1) + let sideEffect = try XCTUnwrap(gotSideEffects.first) + guard case let SideEffectDescriptor.file(file) = sideEffect else { + XCTFail("Expected file descriptor") + return + } + let expectedPath = expectedTuistBundleSwiftFilePath(for: target) + let expectedContents = ResourcesProjectMapper + .fileContent( + targetName: target.name, + bundleName: bundleName, + target: target, + in: project + ) + XCTAssertEqual(file.path, expectedPath) + XCTAssertEqual(file.contents, expectedContents.data(using: .utf8)) + } + + private func verifyObjcBundleAccessor( + for target: Target, + gotTarget: Target, + gotSideEffects: [SideEffectDescriptor] + ) { XCTAssertEqual( gotTarget.settings?.base["GCC_PREFIX_HEADER"], .string( @@ -363,11 +478,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { FileDescriptor( path: expectedBasePath.appending(component: "TuistBundle+\(target.name).h"), contents: ResourcesProjectMapper - .objcHeaderFileContent( - targetName: target.name, - bundleName: "\(project.name)_\(target.name)", - target: target - ) + .objcHeaderFileContent(targetName: target.name) .data(using: .utf8) ), FileDescriptor( @@ -382,4 +493,13 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { ] ) } + + // MARK: - Helpers + + private func expectedTuistBundleSwiftFilePath(for target: Target) -> AbsolutePath { + project.path + .appending(component: Constants.DerivedDirectory.name) + .appending(component: Constants.DerivedDirectory.sources) + .appending(component: "TuistBundle+\(target.name.camelized.uppercasingFirst).swift") + } } diff --git a/fixtures/app_with_spm_dependencies/App/Project.swift b/fixtures/app_with_spm_dependencies/App/Project.swift index 118dc196f34..a8d25a31c60 100644 --- a/fixtures/app_with_spm_dependencies/App/Project.swift +++ b/fixtures/app_with_spm_dependencies/App/Project.swift @@ -16,6 +16,8 @@ let project = Project( .target(name: "AppKit"), .project(target: "FeatureOneFramework_iOS", path: .relativeToRoot("Features/FeatureOne")), .external(name: "Styles"), + .external(name: "BrazeKit"), + .external(name: "BrazeUI"), ], settings: .targetSettings ), diff --git a/fixtures/app_with_spm_dependencies/LocalSwiftPackage/Sources/Styles/StylesResources.swift b/fixtures/app_with_spm_dependencies/LocalSwiftPackage/Sources/Styles/StylesResources.swift new file mode 100644 index 00000000000..c2a22774a23 --- /dev/null +++ b/fixtures/app_with_spm_dependencies/LocalSwiftPackage/Sources/Styles/StylesResources.swift @@ -0,0 +1,10 @@ +import Foundation + +// Public Accessors + +@objc +public class StylesResources: NSObject { + @objc public class var bundle: Bundle { + return .module + } +} diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.resolved b/fixtures/app_with_spm_dependencies/Tuist/Package.resolved index 94bd38db4b4..8f44471b26c 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/Package.resolved +++ b/fixtures/app_with_spm_dependencies/Tuist/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "d97ce5778061e5c442f34dc995c6b958648d4f6c778b322c7334b33b5231fd13", + "originHash" : "78f7dd0ebfab47739cc0e35c49d4996c86d420124374e3f4789e90b5a00daa6a", "pins" : [ { "identity" : "alamofire", @@ -28,6 +28,15 @@ "version" : "5.0.4" } }, + { + "identity" : "braze-swift-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/braze-inc/braze-swift-sdk.git", + "state" : { + "revision" : "f893978502a08b02124d2d15c6117eb1a06b7f6f", + "version" : "8.4.0" + } + }, { "identity" : "cocoalumberjack", "kind" : "remoteSourceControl", @@ -181,6 +190,15 @@ "version" : "10.46.0" } }, + { + "identity" : "sdwebimage", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SDWebImage/SDWebImage.git", + "state" : { + "revision" : "f6afa0132961d593f07970d84e2d8b588c29ea04", + "version" : "5.19.1" + } + }, { "identity" : "sentry-cocoa", "kind" : "remoteSourceControl", diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.swift b/fixtures/app_with_spm_dependencies/Tuist/Package.swift index 10425b1f634..5fab2c02833 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/Package.swift +++ b/fixtures/app_with_spm_dependencies/Tuist/Package.swift @@ -33,7 +33,8 @@ let package = Package( .package(url: "https://github.com/Quick/Nimble", exact: "13.2.0"), .package(url: "https://github.com/SVProgressHUD/SVProgressHUD", exact: "2.3.1"), // Has missing resources and its own resource bundle accessors - .package(url: "https://github.com/urbanairship/ios-library.git", .exact("17.7.3")), + .package(url: "https://github.com/urbanairship/ios-library.git", exact: "17.7.3"), + .package(url: "https://github.com/braze-inc/braze-swift-sdk.git", exact: "8.4.0"), // Has an umbrella header where moduleName must be sanitized .package(url: "https://github.com/gonzalezreal/swift-markdown-ui", from: "2.2.0"), .package(url: "https://github.com/googleads/swift-package-manager-google-mobile-ads", from: "11.1.0"), From c8c5f8a7ece4f4ca6e9a81e1248f6a93c2e30691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:00:18 +0200 Subject: [PATCH 253/509] Redirect to the home page (#6235) * Redirect to the home page * Remove non-used section --- docs/.vitepress/config.mjs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 6a03eff41ad..a76fd987501 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -142,14 +142,6 @@ const guideSidebar = [ }, ], }, - { - text: "Extensions", - items: [ - { text: "Tasks", link: "/guide/extensions/tasks" }, - { text: "Templates" }, - { text: "Resource synthesizers" }, - ], - }, ]; // https://vitepress.dev/reference/site-config @@ -199,7 +191,7 @@ export default defineConfig({ /documentation/tuist/code-reviews /contributors/code-reviews 301 /documentation/tuist/reporting-bugs /contributors/issue-reporting 301 /documentation/tuist/championing-projects /contributors/get-started 301 -/documentation/tuist/* /reference/project-description/:splat 301 +/documentation/tuist/* / 301 `; fs.writeFile(redirectsPath, redirects); }, From 492b3503ad994dadc4658276e40402fb724cfa6e Mon Sep 17 00:00:00 2001 From: danibachar Date: Thu, 25 Apr 2024 01:02:18 -0600 Subject: [PATCH 254/509] Align bundle name sanization with SPM (#6234) * Comply to SPM bundle accessors * unit tests fix * templates updates * small fixes * Updates * removed duplicated bundle module symbol * lint * PR fixes * MR fixes * Fix bundle name parsing * Adding naming tests * lint --------- Co-authored-by: Daniel Bachar --- .../Mappers/ResourcesProjectMapper.swift | 6 +++--- .../ResourcesProjectMapperTests.swift | 19 +++++++++++++++++++ .../App/Sources/App/AppDelegate.swift | 8 ++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 072c1cde61d..ef232bdcb01 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -36,7 +36,7 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this var additionalTargets: [Target] = [] var sideEffects: [SideEffectDescriptor] = [] - let bundleName = "\(project.name)_\(target.name)" + let bundleName = "\(project.name)_\(target.name.replacingOccurrences(of: "-", with: "_"))" var modifiedTarget = target if !target.supportsResources { @@ -126,7 +126,7 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this let content: String = ResourcesProjectMapper.fileContent( targetName: target.name, - bundleName: bundleName.replacingOccurrences(of: "-", with: "_"), + bundleName: bundleName, target: target, in: project ) @@ -149,7 +149,7 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this let content: String = ResourcesProjectMapper.objcImplementationFileContent( targetName: target.name, - bundleName: bundleName.replacingOccurrences(of: "-", with: "_") + bundleName: bundleName ) return (filePath, content.data(using: .utf8)) } diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 4fccf2afad1..04162da4ddb 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -423,6 +423,25 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { ) } + func test_map_when_project_name_has_dashes_in_it_bundle_name_include_dash_for_project_name_and_underscore_for_target_name( + ) throws { + // Given + let projectName = "sdk-with-dash" + let targetName = "target-with-dash" + let expectedBundleName = "\(projectName)_\(targetName.replacingOccurrences(of: "-", with: "_"))" + let sources: [SourceFile] = ["/ViewController.m", "/ViewController2.swift"] + let resources: [ResourceFileElement] = [.file(path: "/AbsolutePath/Project/Resources/image.png")] + let target = Target.test(name: targetName, product: .staticLibrary, sources: sources, resources: .init(resources)) + project = Project.test(path: try AbsolutePath(validating: "/AbsolutePath/Project"), name: projectName, targets: [target]) + + // Got + let (gotProject, _) = try subject.map(project: project) + let bundleTarget = try XCTUnwrap(gotProject.targets.first(where: { $0.product == .bundle })) + + // Then + XCTAssertEqual(expectedBundleName, bundleTarget.name) + } + // MARK: - Verifiers private func verify( diff --git a/fixtures/app_with_spm_dependencies/App/Sources/App/AppDelegate.swift b/fixtures/app_with_spm_dependencies/App/Sources/App/AppDelegate.swift index 53774a9ffcb..45aaeb9e54d 100644 --- a/fixtures/app_with_spm_dependencies/App/Sources/App/AppDelegate.swift +++ b/fixtures/app_with_spm_dependencies/App/Sources/App/AppDelegate.swift @@ -1,4 +1,5 @@ import AppKit +import BrazeUI import Styles import UIKit @@ -36,6 +37,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate { fatalError("singleFile is missing") } + let brazeUILocalizedString = BrazeUIResources.bundle?.localizedString( + forKey: "braze.in-app-message.close-button.title", + value: nil, + table: nil + ) + precondition(brazeUILocalizedString == "Close", "Failed to fetch localized resource from BrazeUI") + AppKit.start() return true From e04d3ced83481d32042820ed9186c83e8c587553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 26 Apr 2024 16:55:24 +0200 Subject: [PATCH 255/509] Revert "Embed external xcframeworks regardless of linking type (#6217)" (#6237) This reverts commit 3bebe423ac73a3604454c956ad0bd13946a994ba. --- Sources/TuistCore/Graph/GraphLoader.swift | 10 +- Sources/TuistCore/Graph/GraphTraverser.swift | 6 +- .../NodeLoaders/XCFrameworkLoader.swift | 9 +- .../NodeLoaders/MockXCFrameworkLoader.swift | 17 +++ .../TuistGenerator/Linter/TargetLinter.swift | 2 +- .../TuistGraph/Graph/GraphDependency.swift | 10 +- .../TuistGraph/Models/TargetDependency.swift | 8 +- .../Graph/GraphDependency+TestData.swift | 4 +- .../ProjectAutomation+ManifestMapper.swift | 2 +- .../Loaders/ManifestModelConverter.swift | 3 +- .../Project+ManifestMapper.swift | 3 +- .../Target+ManifestMapper.swift | 6 +- .../TargetDependency+ManifestMapper.swift | 6 +- .../BuildAcceptanceTests.swift | 18 +-- .../Graph/GraphLoaderTests.swift | 4 +- .../Graph/GraphTraverserTests.swift | 118 ++---------------- .../NodeLoaders/XCFrameworkLoaderTests.swift | 6 +- ...TargetDependency+ManifestMapperTests.swift | 32 ++--- 18 files changed, 71 insertions(+), 193 deletions(-) create mode 100644 Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift diff --git a/Sources/TuistCore/Graph/GraphLoader.swift b/Sources/TuistCore/Graph/GraphLoader.swift index f573e830f8a..e29133ae9c2 100644 --- a/Sources/TuistCore/Graph/GraphLoader.swift +++ b/Sources/TuistCore/Graph/GraphLoader.swift @@ -162,12 +162,11 @@ public final class GraphLoader: GraphLoading { cache: cache ) - case let .xcframework(frameworkPath, status, _, isExternal): + case let .xcframework(frameworkPath, status, _): return try loadXCFramework( path: frameworkPath, cache: cache, - status: status, - isExternal: isExternal + status: status ) case let .sdk(name, status, _): @@ -250,8 +249,7 @@ public final class GraphLoader: GraphLoading { private func loadXCFramework( path: AbsolutePath, cache: Cache, - status: FrameworkStatus, - isExternal: Bool + status: FrameworkStatus ) throws -> GraphDependency { if let loaded = cache.xcframeworks[path] { return loaded @@ -268,7 +266,7 @@ public final class GraphLoader: GraphLoading { linking: metadata.linking, mergeable: metadata.mergeable, status: metadata.status, - isExternal: isExternal + macroPath: metadata.macroPath )) cache.add(xcframework: xcframework, at: path) return xcframework diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index 9b9b70b8dc1..7641ce01b05 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -253,7 +253,7 @@ public class GraphTraverser: GraphTraversing { /// Precompiled frameworks var precompiledFrameworks = filterDependencies( from: .target(name: name, path: path), - test: { $0.isPrecompiledAndEmbeddable }, + test: { $0.isPrecompiledDynamicAndLinkable }, skip: or(canDependencyEmbedProducts, isDependencyPrecompiledMacro) ) // Skip merged precompiled libraries from merging into the runnable binary @@ -362,7 +362,7 @@ public class GraphTraverser: GraphTraversing { } let precompiledLibrariesAndFrameworks = Set(precompiled + precompiledDependencies) - .filter(\.isPrecompiledAndEmbeddable) + .filter(\.isPrecompiledDynamicAndLinkable) .compactMap { dependencyReference(to: $0, from: targetGraphDependency) } references.formUnion(precompiledLibrariesAndFrameworks) @@ -525,7 +525,7 @@ public class GraphTraverser: GraphTraversing { let from = GraphDependency.target(name: name, path: path) let precompiledFrameworksPaths = filterDependencies( from: from, - test: { $0.isPrecompiledAndEmbeddable }, + test: { $0.isPrecompiledDynamicAndLinkable }, skip: canDependencyEmbedProducts ) .lazy diff --git a/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift b/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift index 4f9ff0fb2e1..8b293b4772b 100644 --- a/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift +++ b/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift @@ -1,5 +1,4 @@ import Foundation -import Mockable import TSCBasic import TuistGraph import TuistSupport @@ -24,13 +23,11 @@ enum XCFrameworkLoaderError: FatalError, Equatable { } } -@Mockable public protocol XCFrameworkLoading { /// Reads an existing xcframework and returns its in-memory representation, `GraphDependency.xcframework`. /// - Parameter path: Path to the .xcframework. /// - Parameter status: `.optional` to weakly reference the .xcframework. - /// - Parameter isExternal: Whether the XCFramework comes from an external SPM project - func load(path: AbsolutePath, status: FrameworkStatus, isExternal: Bool) throws -> GraphDependency + func load(path: AbsolutePath, status: FrameworkStatus) throws -> GraphDependency } public final class XCFrameworkLoader: XCFrameworkLoading { @@ -47,7 +44,7 @@ public final class XCFrameworkLoader: XCFrameworkLoading { self.xcframeworkMetadataProvider = xcframeworkMetadataProvider } - public func load(path: AbsolutePath, status: FrameworkStatus, isExternal: Bool) throws -> GraphDependency { + public func load(path: AbsolutePath, status: FrameworkStatus) throws -> GraphDependency { guard FileHandler.shared.exists(path) else { throw XCFrameworkLoaderError.xcframeworkNotFound(path) } @@ -62,7 +59,7 @@ public final class XCFrameworkLoader: XCFrameworkLoading { linking: metadata.linking, mergeable: metadata.mergeable, status: metadata.status, - isExternal: isExternal + macroPath: metadata.macroPath ) return .xcframework(xcframework) } diff --git a/Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift b/Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift new file mode 100644 index 00000000000..34352b42408 --- /dev/null +++ b/Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift @@ -0,0 +1,17 @@ +import Foundation +import TSCBasic +import TuistCore +import TuistGraph + +public final class MockXCFrameworkLoader: XCFrameworkLoading { + public init() {} + + var loadStub: ((AbsolutePath) throws -> GraphDependency)? + public func load(path: AbsolutePath, status: FrameworkStatus) throws -> GraphDependency { + if let loadStub { + return try loadStub(path) + } else { + return .testXCFramework(path: path, status: status) + } + } +} diff --git a/Sources/TuistGenerator/Linter/TargetLinter.swift b/Sources/TuistGenerator/Linter/TargetLinter.swift index e9c133a321d..df232d96337 100644 --- a/Sources/TuistGenerator/Linter/TargetLinter.swift +++ b/Sources/TuistGenerator/Linter/TargetLinter.swift @@ -324,7 +324,7 @@ extension TargetDependency { return target case let .framework(path, _, _): return path.basename - case let .xcframework(path, _, _, _): + case let .xcframework(path, _, _): return path.basename case let .library(path, _, _, _): return path.basename diff --git a/Sources/TuistGraph/Graph/GraphDependency.swift b/Sources/TuistGraph/Graph/GraphDependency.swift index 2c54241e8eb..98d13d6f216 100644 --- a/Sources/TuistGraph/Graph/GraphDependency.swift +++ b/Sources/TuistGraph/Graph/GraphDependency.swift @@ -9,7 +9,6 @@ public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Coda public let linking: BinaryLinking public let mergeable: Bool public let status: FrameworkStatus - public let isExternal: Bool public init( path: AbsolutePath, @@ -18,7 +17,7 @@ public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Coda linking: BinaryLinking, mergeable: Bool, status: FrameworkStatus, - isExternal: Bool + macroPath _: AbsolutePath? ) { self.path = path self.infoPlist = infoPlist @@ -26,7 +25,6 @@ public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Coda self.linking = linking self.mergeable = mergeable self.status = status - self.isExternal = isExternal } public var description: String { @@ -208,13 +206,11 @@ public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Coda } } - public var isPrecompiledAndEmbeddable: Bool { + public var isPrecompiledDynamicAndLinkable: Bool { switch self { case .macro: return false case let .xcframework(xcframework): - return xcframework - .linking == .dynamic || - (xcframework.isExternal && xcframework.infoPlist.libraries.first?.path.extension == "framework") + return xcframework.linking == .dynamic case let .framework(_, _, _, _, linking, _, _), let .library(path: _, publicHeaders: _, linking: linking, architectures: _, swiftModuleMap: _): return linking == .dynamic diff --git a/Sources/TuistGraph/Models/TargetDependency.swift b/Sources/TuistGraph/Models/TargetDependency.swift index e26d7049768..bfee06a3669 100644 --- a/Sources/TuistGraph/Models/TargetDependency.swift +++ b/Sources/TuistGraph/Models/TargetDependency.swift @@ -21,7 +21,7 @@ public enum TargetDependency: Equatable, Hashable, Codable { case target(name: String, condition: PlatformCondition? = nil) case project(target: String, path: AbsolutePath, condition: PlatformCondition? = nil) case framework(path: AbsolutePath, status: FrameworkStatus, condition: PlatformCondition? = nil) - case xcframework(path: AbsolutePath, status: FrameworkStatus, condition: PlatformCondition? = nil, isExternal: Bool = false) + case xcframework(path: AbsolutePath, status: FrameworkStatus, condition: PlatformCondition? = nil) case library( path: AbsolutePath, publicHeaders: AbsolutePath, @@ -40,7 +40,7 @@ public enum TargetDependency: Equatable, Hashable, Codable { condition case .framework(path: _, status: _, condition: let condition): condition - case .xcframework(path: _, status: _, condition: let condition, _): + case .xcframework(path: _, status: _, condition: let condition): condition case .library(path: _, publicHeaders: _, swiftModuleMap: _, condition: let condition): condition @@ -60,8 +60,8 @@ public enum TargetDependency: Equatable, Hashable, Codable { return .project(target: target, path: path, condition: condition) case .framework(path: let path, status: let status, condition: _): return .framework(path: path, status: status, condition: condition) - case .xcframework(path: let path, status: let status, condition: _, isExternal: let isExternal): - return .xcframework(path: path, status: status, condition: condition, isExternal: isExternal) + case .xcframework(path: let path, status: let status, condition: _): + return .xcframework(path: path, status: status, condition: condition) case .library(path: let path, publicHeaders: let headers, swiftModuleMap: let moduleMap, condition: _): return .library(path: path, publicHeaders: headers, swiftModuleMap: moduleMap, condition: condition) case .package(product: let product, type: let type, condition: _): diff --git a/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift b/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift index 2335fc285bb..25364742161 100644 --- a/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift +++ b/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift @@ -39,7 +39,7 @@ extension GraphDependency { .appending(try! RelativePath(validating: "Test.xcframework/Test")), linking: BinaryLinking = .dynamic, status: FrameworkStatus = .required, - isExternal: Bool = false + macroPath: AbsolutePath? = nil ) -> GraphDependency { .xcframework( GraphDependency.XCFramework( @@ -49,7 +49,7 @@ extension GraphDependency { linking: linking, mergeable: false, status: status, - isExternal: isExternal + macroPath: macroPath ) ) } diff --git a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift index bbcdfb5547f..8215a0d48ed 100644 --- a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift +++ b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift @@ -90,7 +90,7 @@ extension ProjectAutomation.Target { frameworkStatus = .required } return .framework(path: path.pathString, status: frameworkStatus) - case let .xcframework(path, status, _, _): + case let .xcframework(path, status, _): let frameworkStatus: ProjectAutomation.FrameworkStatus switch status { case .optional: diff --git a/Sources/TuistLoader/Loaders/ManifestModelConverter.swift b/Sources/TuistLoader/Loaders/ManifestModelConverter.swift index b94eefc4834..426d59e9715 100644 --- a/Sources/TuistLoader/Loaders/ManifestModelConverter.swift +++ b/Sources/TuistLoader/Loaders/ManifestModelConverter.swift @@ -89,8 +89,7 @@ public final class ManifestModelConverter: ManifestModelConverting { try TuistGraph.TargetDependency.from( manifest: targetDependencyManifest, generatorPaths: GeneratorPaths(manifestDirectory: path), - externalDependencies: [:], // externalDependencies manifest can't contain other external dependencies, - isExternal: true + externalDependencies: [:] // externalDependencies manifest can't contain other external dependencies, ) } } diff --git a/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift index d3bf14f52c1..1240e461ffd 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift @@ -33,8 +33,7 @@ extension TuistGraph.Project { try TuistGraph.Target.from( manifest: $0, generatorPaths: generatorPaths, - externalDependencies: externalDependencies, - isExternal: isExternal + externalDependencies: externalDependencies ) } diff --git a/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift index c038e5205b7..a71558783a2 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift @@ -28,8 +28,7 @@ extension TuistGraph.Target { static func from( manifest: ProjectDescription.Target, generatorPaths: GeneratorPaths, - externalDependencies: [String: [TuistGraph.TargetDependency]], - isExternal: Bool + externalDependencies: [String: [TuistGraph.TargetDependency]] ) throws -> TuistGraph.Target { let name = manifest.name let destinations = try TuistGraph.Destination.from(destinations: manifest.destinations) @@ -44,8 +43,7 @@ extension TuistGraph.Target { try TuistGraph.TargetDependency.from( manifest: $0, generatorPaths: generatorPaths, - externalDependencies: externalDependencies, - isExternal: isExternal + externalDependencies: externalDependencies ) } diff --git a/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift index d0d64073c77..beeb63a6e72 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift @@ -29,8 +29,7 @@ extension TuistGraph.TargetDependency { static func from( // swiftlint:disable:this function_body_length manifest: ProjectDescription.TargetDependency, generatorPaths: GeneratorPaths, - externalDependencies: [String: [TuistGraph.TargetDependency]], - isExternal: Bool + externalDependencies: [String: [TuistGraph.TargetDependency]] ) throws -> [TuistGraph.TargetDependency] { switch manifest { case let .target(name, condition): @@ -80,8 +79,7 @@ extension TuistGraph.TargetDependency { .xcframework( path: try generatorPaths.resolve(path: path), status: .from(manifest: status), - condition: condition?.asGraphCondition, - isExternal: isExternal + condition: condition?.asGraphCondition ), ] case .xctest: diff --git a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift index 18abdd57089..1a2aefd9dff 100644 --- a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift +++ b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift @@ -120,23 +120,7 @@ final class BuildAcceptanceTestMultiplatformAppWithSDK: TuistAcceptanceTestCase try setUpFixture(.multiplatformAppWithSdk) try await run(InstallCommand.self) try await run(GenerateCommand.self) - try System.shared.runAndPrint( - [ - "/usr/bin/xcrun", - "xcodebuild", - "clean", - "build", - "-scheme", - "App", - "-workspace", - workspacePath.pathString, - "-destination", - "platform=macOS", - "CODE_SIGN_IDENTITY=\"\"", - "CODE_SIGNING_REQUIRED=NO", - "CODE_SIGNING_ALLOWED=NO", - ] - ) + try await run(BuildCommand.self, "App", "--platform", "macos") try await run(BuildCommand.self, "App", "--platform", "ios") } } diff --git a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift index 96d34500da9..a3bbe0fc400 100644 --- a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift @@ -391,7 +391,7 @@ final class GraphLoaderTests: TuistUnitTestCase { linking: .dynamic, mergeable: false, status: .required, - isExternal: false + macroPath: nil ) ), ]), @@ -440,7 +440,7 @@ final class GraphLoaderTests: TuistUnitTestCase { linking: .dynamic, mergeable: true, status: .required, - isExternal: false + macroPath: nil ) ), ]), diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index 3350b62e1c1..8fc09e4f49c 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -1338,104 +1338,6 @@ final class GraphTraverserTests: TuistUnitTestCase { XCTAssertEqual(got.first, GraphDependencyReference(frameworkDependency)) } - func test_embeddableFrameworks_when_dependencyIsAnExternalXCFramework() throws { - // Given - let xcframeworkPath = try AbsolutePath(validating: "/test/test.xcframework") - let target = Target.test(name: "Main", platform: .iOS) - let project = Project.test(targets: [target]) - - // Given: Value Graph - let xcframeworkDependency = GraphDependency.testXCFramework( - path: xcframeworkPath, - infoPlist: .test( - libraries: [ - .test( - path: try RelativePath(validating: "MyFramework.framework") - ), - ] - ), - linking: .static, - isExternal: true - ) - let graph = Graph.test( - projects: [project.path: project], - targets: [project.path: [target.name: target]], - dependencies: [ - .target(name: target.name, path: project.path): Set(arrayLiteral: xcframeworkDependency), - ] - ) - let subject = GraphTraverser(graph: graph) - - // When - let got = subject.embeddableFrameworks(path: project.path, name: target.name).sorted() - - // Then - XCTAssertEqual(got.first, GraphDependencyReference(xcframeworkDependency)) - } - - func test_embeddableFrameworks_when_dependencyIsAStaticLibraryAndAnExternalXCFramework() throws { - // Given - let xcframeworkPath = try AbsolutePath(validating: "/test/test.xcframework") - let target = Target.test(name: "Main", platform: .iOS) - let project = Project.test(targets: [target]) - - // Given: Value Graph - let xcframeworkDependency = GraphDependency.testXCFramework( - path: xcframeworkPath, - infoPlist: .test( - libraries: [ - .test( - path: try RelativePath(validating: "MyStaticLibrary.a") - ), - ] - ), - linking: .static, - isExternal: true - ) - let graph = Graph.test( - projects: [project.path: project], - targets: [project.path: [target.name: target]], - dependencies: [ - .target(name: target.name, path: project.path): Set(arrayLiteral: xcframeworkDependency), - ] - ) - let subject = GraphTraverser(graph: graph) - - // When - let got = subject.embeddableFrameworks(path: project.path, name: target.name).sorted() - - // Then - XCTAssertEmpty(got) - } - - func test_embeddableFrameworks_when_dependencyIsAnInternalXCFramework() throws { - // Given - let xcframeworkPath = try AbsolutePath(validating: "/test/test.xcframework") - let target = Target.test(name: "Main", platform: .iOS) - let project = Project.test(targets: [target]) - - // Given: Value Graph - let xcframeworkDependency = GraphDependency.testXCFramework( - path: xcframeworkPath, - linking: .static, - isExternal: false - ) - let graph = Graph.test( - projects: [project.path: project], - targets: [project.path: [target.name: target]], - dependencies: [ - .target(name: target.name, path: project.path): Set(arrayLiteral: xcframeworkDependency), - ] - ) - let subject = GraphTraverser(graph: graph) - - // When - let got = subject.embeddableFrameworks(path: project.path, name: target.name).sorted() - - // Then - XCTAssertEmpty(got) - } - func test_embeddableFrameworks_when_transitiveXCFrameworks() throws { // Given let app = Target.test(name: "App", platform: .iOS, product: .app) @@ -1454,7 +1356,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .dynamic, mergeable: false, status: .required, - isExternal: false + macroPath: nil ) ) let dDependency = GraphDependency.xcframework( @@ -1469,7 +1371,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .dynamic, mergeable: false, status: .required, - isExternal: false + macroPath: nil ) ) let eDependency = GraphDependency.xcframework( @@ -1485,7 +1387,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .dynamic, mergeable: true, status: .required, - isExternal: false + macroPath: nil ) ) let dependencies: [GraphDependency: Set] = [ @@ -1535,7 +1437,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .dynamic, mergeable: false, status: .required, - isExternal: false + macroPath: nil ) ) let dDependency = GraphDependency.xcframework( @@ -1550,7 +1452,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .dynamic, mergeable: false, status: .required, - isExternal: false + macroPath: nil ) ) let eDependency = GraphDependency.xcframework( @@ -1566,7 +1468,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .dynamic, mergeable: true, status: .required, - isExternal: false + macroPath: nil ) ) let dependencies: [GraphDependency: Set] = [ @@ -4155,7 +4057,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .static, mergeable: false, status: .required, - isExternal: false + macroPath: nil ) ) let directFramework = GraphDependency.framework( @@ -4180,7 +4082,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .static, mergeable: false, status: .required, - isExternal: false + macroPath: nil ) ) let transitiveXCFramework = GraphDependency.xcframework( @@ -4195,7 +4097,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .static, mergeable: false, status: .required, - isExternal: false + macroPath: nil ) ) let frameworkTransitiveXCFramework = GraphDependency.xcframework( @@ -4210,7 +4112,7 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .static, mergeable: false, status: .required, - isExternal: false + macroPath: nil ) ) diff --git a/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift b/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift index 384853b42b2..5bfa725f15d 100644 --- a/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift +++ b/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift @@ -48,7 +48,7 @@ final class XCFrameworkLoaderTests: TuistUnitTestCase { // Then XCTAssertThrowsSpecific( - try subject.load(path: xcframeworkPath, status: .required, isExternal: false), + try subject.load(path: xcframeworkPath, status: .required), XCFrameworkLoaderError.xcframeworkNotFound(xcframeworkPath) ) } @@ -76,7 +76,7 @@ final class XCFrameworkLoaderTests: TuistUnitTestCase { } // When - let got = try subject.load(path: xcframeworkPath, status: .required, isExternal: false) + let got = try subject.load(path: xcframeworkPath, status: .required) // Then XCTAssertEqual( @@ -89,7 +89,7 @@ final class XCFrameworkLoaderTests: TuistUnitTestCase { linking: linking, mergeable: false, status: .required, - isExternal: false + macroPath: nil ) ) ) diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift index 8d50e44c076..f5304d0c136 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift @@ -19,19 +19,17 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let got = try TuistGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, - externalDependencies: ["library": [.xcframework(path: "/path.xcframework", status: .required, isExternal: true)]], - isExternal: true + externalDependencies: ["library": [.xcframework(path: "/path.xcframework", status: .required)]] ) // Then XCTAssertEqual(got.count, 1) - guard case let .xcframework(path, status, _, isExternal) = got[0] else { + guard case let .xcframework(path, status, _) = got[0] else { XCTFail("Dependency should be xcframework") return } XCTAssertEqual(path, "/path.xcframework") XCTAssertEqual(status, .required) - XCTAssertTrue(isExternal) } func test_from_when_external_project() throws { @@ -43,8 +41,7 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let got = try TuistGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, - externalDependencies: ["library": [.project(target: "Target", path: "/Project")]], - isExternal: true + externalDependencies: ["library": [.project(target: "Target", path: "/Project")]] ) // Then @@ -68,22 +65,20 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { generatorPaths: generatorPaths, externalDependencies: [ "library": [ - .xcframework(path: "/path.xcframework", status: .required, isExternal: true), + .xcframework(path: "/path.xcframework", status: .required), .project(target: "Target", path: "/Project"), ], - ], - isExternal: true + ] ) // Then XCTAssertEqual(got.count, 2) - guard case let .xcframework(frameworkPath, status, _, isExternal) = got[0] else { + guard case let .xcframework(frameworkPath, status, _) = got[0] else { XCTFail("First dependency should be xcframework") return } XCTAssertEqual(frameworkPath, "/path.xcframework") XCTAssertEqual(status, .required) - XCTAssertTrue(isExternal) guard case let .project(target, path, _) = got[1] else { XCTFail("Dependency should be project") @@ -102,8 +97,7 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let got = try TuistGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, - externalDependencies: [:], - isExternal: false + externalDependencies: [:] ) // Then @@ -125,8 +119,7 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let got = try TuistGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, - externalDependencies: [:], - isExternal: false + externalDependencies: [:] ) // Then @@ -148,8 +141,7 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let got = try TuistGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, - externalDependencies: [:], - isExternal: false + externalDependencies: [:] ) // Then @@ -171,8 +163,7 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let got = try TuistGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, - externalDependencies: [:], - isExternal: false + externalDependencies: [:] ) // Then @@ -194,8 +185,7 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let got = try TuistGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, - externalDependencies: [:], - isExternal: false + externalDependencies: [:] ) // Then From f5a21ba3e2a369171bb7618802a4332ca70f04ed Mon Sep 17 00:00:00 2001 From: Tuist Date: Mon, 29 Apr 2024 15:41:06 +0000 Subject: [PATCH 256/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.11.0 --- .mise.toml | 2 +- CHANGELOG.md | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 9d79f3473c9..96240ef7e6d 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.10.2" +tuist = "4.11.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index 734a7251715..9345382b24a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## 4.11.0 - 2024-04-29 + +### Tuist + +#### Fixed + +- Fix generating CoreData models in resourceSynthesizer .coreData() [#6201](https://github.com/tuist/tuist/pull/6201) by [@alexfilimon](https://github.com/alexfilimon) +- Align resource bundle accessor generation with SPM [#6146](https://github.com/tuist/tuist/pull/6146) by [@danibachar](https://github.com/danibachar) +- Align bundle name sanization with SPM [#6234](https://github.com/tuist/tuist/pull/6234) by [@danibachar](https://github.com/danibachar) +- Revert "Embed external xcframeworks regardless of linking type (#6217)" [#6237](https://github.com/tuist/tuist/pull/6237) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +- no changes + ## 4.10.2 - 2024-04-23 ### Tuist From abf4a632cf9dc2b44c8024bd25cca4d3737eb05c Mon Sep 17 00:00:00 2001 From: Tuan Hoang <48347505+hoangatuan@users.noreply.github.com> Date: Tue, 30 Apr 2024 00:54:08 +0800 Subject: [PATCH 257/509] fix: Update tuist cloud document (#6239) --- docs/docs/cloud/selective-testing.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/cloud/selective-testing.md b/docs/docs/cloud/selective-testing.md index 01d57fddee0..3a8a55e3d2c 100644 --- a/docs/docs/cloud/selective-testing.md +++ b/docs/docs/cloud/selective-testing.md @@ -28,11 +28,11 @@ For example, assuming the following dependency graph: | ---- | --- | ---- | | `tuist test` invocation | Runs the tests in `CoreTests`, `FeatureATests`, and `FeatureBTests` | The hashes of `FeatureATests`, `FeatureBTests` and `CoreTests` are persisted | | `FeatureA` is updated | The developer modifies the code of a target | Same as before | -| `tuist test` invocation | Runs the tests in `FeatureBTests` because it hash has changed | The new hash of `FeatureBTests` is persisted | +| `tuist test` invocation | Runs the tests in `FeatureATests` because it hash has changed | The new hash of `FeatureATests` is persisted | | `Core` is updated | The developer modifies the code of a target | Same as before | | `tuist test` invocation | Runs the tests in `CoreTests`, `FeatureATests`, and `FeatureBTests` | The new hash of `FeatureATests` `FeatureBTests`, and `CoreTests` are persisted | The combination of selective testing with binary caching can dramatically reduce the time it takes to run tests on your CI. > [!WARNING] MODULE VS FILE-LEVEL GRANULARITY -> Due to the impossibility of detecting the in-code dependencies between tests and sources, the maximum granularity of selective testing is at the target level. Therefore, we recommend keeping your targets small and focused to maximize the benefits of selective testing. \ No newline at end of file +> Due to the impossibility of detecting the in-code dependencies between tests and sources, the maximum granularity of selective testing is at the target level. Therefore, we recommend keeping your targets small and focused to maximize the benefits of selective testing. From d2af8da9af6b0ab5885155061eaff439fe7f81c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 30 Apr 2024 08:57:44 +0200 Subject: [PATCH 258/509] Add docs for AWS_PROFILE env variable (#6240) --- docs/docs/cloud/on-premise.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/cloud/on-premise.md b/docs/docs/cloud/on-premise.md index 129155f8955..d5e8ae4915a 100644 --- a/docs/docs/cloud/on-premise.md +++ b/docs/docs/cloud/on-premise.md @@ -140,6 +140,7 @@ Once the app is created you'll need to set the following environment variables: | `TUIST_S3_BUCKET_NAME` | Name of the bucket | Yes | | `my-bucket` | | `TUIST_S3_REGION` | The bucket's region | No | `eu-west-1` | `us-east-1` | | `TUIST_S3_ENDPOINT` | Custom endpoint | No | `https://amazonaws.com` | `https://custom-domain.com` | +| `AWS_PROFILE` | Set an [AWS profile](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-using-profiles) for authorization. Doesn't work with other storages | No | | `user1` | For Google Cloud Storage, follow [these docs](https://cloud.google.com/storage/docs/authentication/managing-hmackeys) to get the `TUIST_S3_ACCESS_KEY_ID` and `TUIST_S3_SECRET_ACCESS_KEY` pair. The `TUIST_S3_ENDPOINT` should be set to `https://storage.googleapis.com`. Other environment variables are the same as for any other S3-compliant storage. From baa4afbda44039e7388366f92ff49e35f1739769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 30 Apr 2024 16:16:25 +0200 Subject: [PATCH 259/509] Document how to disable SSL connections to the database (#6241) * Document how to disable SSL connections to the database * Include a Docker Compose example * Add a note explaining why CI cache solutions are not suitable for Tuist caching needs --- docs/docs/cloud/on-premise.md | 94 +++++++++++++++++++++++++++++++- docs/docs/cloud/what-is-cloud.md | 15 ++--- 2 files changed, 95 insertions(+), 14 deletions(-) diff --git a/docs/docs/cloud/on-premise.md b/docs/docs/cloud/on-premise.md index d5e8ae4915a..df1b5840b31 100644 --- a/docs/docs/cloud/on-premise.md +++ b/docs/docs/cloud/on-premise.md @@ -65,10 +65,11 @@ As an on-premise user, you'll receive a license key that you'll need to expose a | Environment variable | Description | Required | Default | Example | | --- | --- | --- | --- | --- | | `DATABASE_URL` | The URL to access the Postgres database. Note that the URL should contain the authentication information | Yes | | `postgres://username:password@cloud.us-east-2.aws.test.com/production` | +| `TUIST_USE_SSL_FOR_DATABASE` | When true, it uses [SSL](https://en.wikipedia.org/wiki/Transport_Layer_Security) to connect to the database | No | `1` | `1` | | `TUIST_APP_URL` | The base URL to access the instance from the Internet | Yes | | https://cloud.tuist.io | | `TUIST_SECRET_KEY_BASE` | The key to use to encrypt information (e.g. sessions in a cookie) | Yes | | | `c5786d9f869239cbddeca645575349a570ffebb332b64400c37256e1c9cb7ec831345d03dc0188edd129d09580d8cbf3ceaf17768e2048c037d9c31da5dcacfa` | -| `TUIST_SECRET_KEY_PASSWORD` | | No | `$TUIST_SECRET_KEY_BASE` | | -| `TUIST_SECRET_KEY_TOKENS` | | No | `$TUIST_SECRET_KEY_BASE` | | +| `TUIST_SECRET_KEY_PASSWORD` | Pepper to generate hashed passwords | No | `$TUIST_SECRET_KEY_BASE` | | +| `TUIST_SECRET_KEY_TOKENS` | Secret key to generate random tokens | No | `$TUIST_SECRET_KEY_BASE` | | | `TUIST_USE_IPV6` | When `1` it configures the app to use IPv6 addresses | No | `0` | `1`| ### Authentication environment configuration @@ -225,4 +226,91 @@ kill_timeout = "5s" url_prefix = "/" ``` -Then you can run `fly launch --local-only --no-deploy` to launch the app. On subsequent deploys, instead of running `fly launch --local-only`, you will need to run `fly deploy --local-only`. Fly.io doesn't allow to pull private Docker images, which is why we need to use the `--local-only` flag. \ No newline at end of file +Then you can run `fly launch --local-only --no-deploy` to launch the app. On subsequent deploys, instead of running `fly launch --local-only`, you will need to run `fly deploy --local-only`. Fly.io doesn't allow to pull private Docker images, which is why we need to use the `--local-only` flag. + +### Docker Compose + +Below is an example of a `docker-compose.yml` file that you can use as a reference to deploy the service: + +```yaml +version: '3.8' +services: + db: + image: postgres:14.1-alpine + restart: always + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + ports: + - '5432:5432' + volumes: + - db:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 5s + timeout: 5s + retries: 5 + + pgweb: + container_name: pgweb + restart: always + image: sosedoff/pgweb + ports: + - "8081:8081" + links: + - db:db + environment: + PGWEB_DATABASE_URL: postgres://postgres:postgres@db:5432/postgres?sslmode=disable + depends_on: + - db + + tuist: + image: ghcr.io/tuist/cloud-on-premise:latest + container_name: tuist_cloud + depends_on: + - db + ports: + - "80:80" + - "8080:8080" + - "443:443" + expose: + - "80" + - "8080" + - "443:443" + environment: + # Base Tuist Env - https://docs.tuist.io/cloud/on-premise#base-environment-configuration + TUIST_USE_SSL_FOR_DATABASE: "0" + TUIST_LICENSE: # ... + TUIST_CLOUD_HOSTED: "0" + DATABASE_URL: postgres://postgres:postgres@db:5432/postgres?sslmode=disable + TUIST_APP_URL: https://localhost:8080 + TUIST_SECRET_KEY_BASE: # ... + WEB_CONCURRENCY: 80 + + # Auth - one method + # GitHub Auth - https://docs.tuist.io/cloud/on-premise#github + TUIST_GITHUB_OAUTH_ID: + TUIST_GITHUB_OAUTH_SECRET: + + # Okta Auth - https://docs.tuist.io/cloud/on-premise#okta + TUIST_OKTA_SITE: + TUIST_OKTA_CLIENT_ID: + TUIST_OKTA_CLIENT_SECRET: + TUIST_OKTA_AUTHORIZE_URL: # Optional + TUIST_OKTA_TOKEN_URL: # Optional + TUIST_OKTA_USER_INFO_URL: # Optional + TUIST_OKTA_EVENT_HOOK_SECRET: # Optional + + # Storage + TUIST_S3_ACCESS_KEY_ID: # ... + TUIST_S3_SECRET_ACCESS_KEY: # ... + TUIST_S3_BUCKET_NAME: # ... + TUIST_S3_REGION: # ... + TUIST_S3_ENDPOINT: # https://amazonaws.com + + # Other + +volumes: + db: + driver: local +``` \ No newline at end of file diff --git a/docs/docs/cloud/what-is-cloud.md b/docs/docs/cloud/what-is-cloud.md index 10037eda760..34659a678a6 100644 --- a/docs/docs/cloud/what-is-cloud.md +++ b/docs/docs/cloud/what-is-cloud.md @@ -15,17 +15,6 @@ Tuist Cloud, a closed-source paid service, enhances Tuist by adding server-requi > [!IMPORTANT] PROJECT ONBOARDING > Due to [Xcode's default to convenience](/guide/introduction/cost-of-convenience) your project might contain implicit configurations that can prevent some Tuist Cloud features from working as expected, and therefore require manual adjustments. -## Sustainability - -Similar to many other open-source projects, Tuist also necessitated full-time dedicated personnel to adequately meet the demand for support and feature requests. Tuist Cloud plays a crucial role in fulfilling this requirement by enabling the financing of full-time personnel for the project. - -Becoming Tuist Cloud user is synonym to supporting the the development of Tuist and many of the open source that makes Tuist and other community open source projects possible. We wished the economics of open source were much different and organizations and government recognized the value of open source and financially supported it, but at the time of write, that's unfortunately not the case, so creating a business is the only option we were left with. - -> [!INFO] BUT I WANT TO USE MY CI CACHE... -> Users often don't understand the need for paying for caching when their CI provider already provides a solution. We understand it, it doesn't make sense logically, but financially, we believe it does, because Tuist has reached a point that needs funding to continue to support its development. Avoiding doing so, like we had to suffer from in the past, puts Tuist and all our efforts at risk. - - - ## Features ### Binary caching across environments @@ -35,6 +24,10 @@ Tuist Cloud offers a robust storage solution for Tuist, enabling the sharing of > [!TIP] RETURN OF INVESTMENT (ROI) > To assist organizations in evaluating their return on investment (ROI), we've developed an [**ROI calculator**](https://tuist.io/cloud). For instance, consider an organization with approximately 20 developers. If their clean builds take 10 minutes and they achieve a 70% cache effectiveness, they could potentially reduce development time by 24,000 hours and recover up to $6.4 million a year. +> [!NOTE] CI CACHE +> CI built-in caches either don't provide hash-based caching or they do, but they don't support the artifact-level hashing granularity that's required for an efficient cache. Therefore, they are not a suitable solution for Tuist's caching requirements. + + ### Selective testing across environments Once teams reach a certain scale, they often grapple with optimizing their CI process to maintain quick turnaround times. While **testing everything** continually might work for smaller teams, it becomes impractical on a larger scale. At this juncture, many teams resort to investing in superior hardware, creating custom tools, complicating their CI pipelines, or worse, accepting slower development cycles. But there's a better way. From fea5e2e7ff25e0d0c5c286fc89b48ab015ccddb8 Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 1 May 2024 15:23:22 +0200 Subject: [PATCH 260/509] Add posthog to the docs to better understand how users interact with the documentation to improve it --- docs/.vitepress/config.mjs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index a76fd987501..ff095d0288d 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -157,6 +157,16 @@ export default defineConfig({ lange: "en", }, }, + head: [ + [ + "script", + {}, + ` + !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys onSessionId".split(" "),n=0;n Date: Thu, 2 May 2024 15:22:39 +0200 Subject: [PATCH 261/509] Get PRODUCT_NAME value from settings if consistent and present (#6242) * Get PRODUCT_NAME value from settings if consistent and present * Remove error * Add a target linter that warns if names are inconsistent across the configurations or it contains variables resolved at build-time --- .../Graph/ModelExtensions/Target+Core.swift | 25 +++++++++- .../TuistGenerator/Linter/TargetLinter.swift | 31 ++++++++++++ .../Linter/TargetLinterTests.swift | 42 ++++++++++++++++ .../TuistGraphTests/Models/TargetTests.swift | 48 +++++++++++++++++++ 4 files changed, 145 insertions(+), 1 deletion(-) diff --git a/Sources/TuistCore/Graph/ModelExtensions/Target+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/Target+Core.swift index 4f36d8d1027..99d5f54b2d3 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/Target+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/Target+Core.swift @@ -18,8 +18,31 @@ public enum TargetError: FatalError, Equatable { } extension Target { - /// Returns the product name including the extension. + /// Returns the product name including the extension + /// if the PRODUCT_NAME build setting of the target is set and contains a static value that's consistent + /// throughout all the configurations, it uses that value, otherwise it defaults to the target's default. public var productNameWithExtension: String { + var settingsProductNames: Set = Set() + + if let value = settings?.base["PRODUCT_NAME"], case let SettingValue.string(baseProductName) = value { + settingsProductNames.insert(baseProductName) + } + settings?.configurations.values.forEach { configuration in + if let value = configuration?.settings["PRODUCT_NAME"], + case let SettingValue.string(configurationProductName) = value + { + settingsProductNames.insert(configurationProductName) + } + } + + let productName: String + + if settingsProductNames.count == 1, !settingsProductNames.first!.contains("$") { + productName = settingsProductNames.first! + } else { + productName = self.productName + } + switch product { case .staticLibrary, .dynamicLibrary: return "lib\(productName).\(product.xcodeValue.fileExtension!)" diff --git a/Sources/TuistGenerator/Linter/TargetLinter.swift b/Sources/TuistGenerator/Linter/TargetLinter.swift index df232d96337..112e764eee8 100644 --- a/Sources/TuistGenerator/Linter/TargetLinter.swift +++ b/Sources/TuistGenerator/Linter/TargetLinter.swift @@ -28,6 +28,7 @@ class TargetLinter: TargetLinting { func lint(target: Target) -> [LintingIssue] { var issues: [LintingIssue] = [] issues.append(contentsOf: lintProductName(target: target)) + issues.append(contentsOf: lintProductNameBuildSettings(target: target)) issues.append(contentsOf: lintValidPlatformProductCombinations(target: target)) issues.append(contentsOf: lintBundleIdentifier(target: target)) issues.append(contentsOf: lintHasSourceFiles(target: target)) @@ -89,6 +90,36 @@ class TargetLinter: TargetLinting { return [] } + private func lintProductNameBuildSettings(target: Target) -> [LintingIssue] { + var settingsProductNames: Set = Set() + var issues: [LintingIssue] = [] + + if let value = target.settings?.base["PRODUCT_NAME"], case let SettingValue.string(baseProductName) = value { + settingsProductNames.insert(baseProductName) + } + target.settings?.configurations.values.forEach { configuration in + if let value = configuration?.settings["PRODUCT_NAME"], + case let SettingValue.string(configurationProductName) = value + { + settingsProductNames.insert(configurationProductName) + } + } + if settingsProductNames.count > 1 { + issues.append(.init( + reason: "The target '\(target.name)' has a PRODUCT_NAME build setting that is different across configurations and might cause unpredictable behaviours.", + severity: .warning + )) + } + if settingsProductNames.contains(where: { $0.contains("$") }) { + issues.append(.init( + reason: "The target '\(target.name)' has a PRODUCT_NAME build setting containing variables that are resolved at build time, and might cause unpredictable behaviours.", + severity: .warning + )) + } + + return issues + } + private func lintHasSourceFiles(target: Target) -> [LintingIssue] { let supportsSources = target.supportsSources let sources = target.sources diff --git a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift index e1d0f2df25b..e975fd4a3c9 100644 --- a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift @@ -53,6 +53,48 @@ final class TargetLinterTests: TuistUnitTestCase { XCTAssertInvalidProductNameApp(Target.test(productName: "ؼFramework")) } + func test_lint_when_inconsistentProductNameBuildSettingAcrossConfigurations() { + // Given + let target = Target.test(settings: .test( + base: ["PRODUCT_NAME": "1"], + debug: .test(settings: ["PRODUCT_NAME": "2"]), + release: .test(settings: ["PRODUCT_NAME": "3"]) + )) + + // When + let got = subject.lint(target: target) + + // Then + XCTContainsLintingIssue( + got, + LintingIssue( + reason: "The target '\(target.name)' has a PRODUCT_NAME build setting that is different across configurations and might cause unpredictable behaviours.", + severity: .warning + ) + ) + } + + func test_lint_when_productNameBuildSettingWithVariables() { + // Given + let target = Target.test(settings: .test( + base: ["PRODUCT_NAME": "$VARIABLE"], + debug: .test(settings: ["PRODUCT_NAME": "$VARIABLE"]), + release: .test(settings: ["PRODUCT_NAME": "$VARIABLE"]) + )) + + // When + let got = subject.lint(target: target) + + // Then + XCTContainsLintingIssue( + got, + LintingIssue( + reason: "The target '\(target.name)' has a PRODUCT_NAME build setting containing variables that are resolved at build time, and might cause unpredictable behaviours.", + severity: .warning + ) + ) + } + func test_lint_when_target_has_invalid_bundle_identifier() { let XCTAssertInvalidBundleId: (String) -> Void = { bundleId in let target = Target.test(bundleId: bundleId) diff --git a/Tests/TuistGraphTests/Models/TargetTests.swift b/Tests/TuistGraphTests/Models/TargetTests.swift index 1657cbb2256..e1ec0763b58 100644 --- a/Tests/TuistGraphTests/Models/TargetTests.swift +++ b/Tests/TuistGraphTests/Models/TargetTests.swift @@ -56,6 +56,54 @@ final class TargetTests: TuistUnitTestCase { ) } + func test_productNameWithExtension_when_buildSettingsProductNameStaticAndConsistentValue() { + // Given + let target = Target.test( + name: "Test", + product: .framework, + settings: .test( + base: ["PRODUCT_NAME": "Tuist"], + debug: .test(settings: ["PRODUCT_NAME": "Tuist"]), + release: .test(settings: ["PRODUCT_NAME": "Tuist"]) + ) + ) + + // When + XCTAssertEqual(target.productNameWithExtension, "Tuist.framework") + } + + func test_productNameWithExtension_when_buildSettingsProductNameDynamicAndConsistentValue() { + // Given + let target = Target.test( + name: "Test", + product: .framework, + settings: .test( + base: ["PRODUCT_NAME": "$OTHER_VARIABLE"], + debug: .test(settings: ["PRODUCT_NAME": "$OTHER_VARIABLE"]), + release: .test(settings: ["PRODUCT_NAME": "$OTHER_VARIABLE"]) + ) + ) + + // When + XCTAssertEqual(target.productNameWithExtension, "Test.framework") + } + + func test_productNameWithExtension_when_buildSettingsProductNameStaticAndInconsistentValue() { + // Given + let target = Target.test( + name: "Test", + product: .framework, + settings: .test( + base: ["PRODUCT_NAME": "Tuist"], + debug: .test(settings: ["PRODUCT_NAME": "TuistDebug"]), + release: .test(settings: ["PRODUCT_NAME": "TuistRelease"]) + ) + ) + + // When + XCTAssertEqual(target.productNameWithExtension, "Test.framework") + } + func test_productNameWithExtension_when_staticLibrary() { let target = Target.test(name: "Test", product: .staticLibrary) XCTAssertEqual(target.productNameWithExtension, "libTest.a") From d77b13e0af1b78e241d663a500e73696f7033434 Mon Sep 17 00:00:00 2001 From: Shai Mishali Date: Fri, 3 May 2024 09:57:56 +0300 Subject: [PATCH 262/509] [fix] Add (void) to generated Obj-C Bundle accessor (#6247) --- Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index ef232bdcb01..7fb209c2fd2 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -213,7 +213,7 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this #import #import "TuistBundle+\(targetName).h" - NSBundle* \(targetName)_SWIFTPM_MODULE_BUNDLE() { + NSBundle* \(targetName)_SWIFTPM_MODULE_BUNDLE(void) { NSURL *bundleURL = [[[NSBundle mainBundle] bundleURL] URLByAppendingPathComponent:@"\(bundleName).bundle"]; NSBundle *bundle = [NSBundle bundleWithURL:bundleURL]; From 84113482dc84494ddd848033d525274ac374d0b2 Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Mon, 6 May 2024 02:46:48 -0400 Subject: [PATCH 263/509] Fix missing Products group in generated Projects (#6252) * Put Products group above others to avoid Xcode bug * Linting * Fix Tests --- .../TuistGenerator/Generator/ProjectGroups.swift | 13 ++++++++----- .../Generator/ProjectGroupsTests.swift | 4 ++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Sources/TuistGenerator/Generator/ProjectGroups.swift b/Sources/TuistGenerator/Generator/ProjectGroups.swift index 0047352696a..e0992a7dc6f 100644 --- a/Sources/TuistGenerator/Generator/ProjectGroups.swift +++ b/Sources/TuistGenerator/Generator/ProjectGroups.swift @@ -114,6 +114,14 @@ class ProjectGroups { projectGroups.append((item, projectGroup)) } + /// Products + /// If the products group is the last non-empty group, it will not appear. + /// This appears to be an Xcode bug that is still there as of Xcode 15.3 + /// https://developer.apple.com/forums/thread/77406 + let productsGroup = PBXGroup(children: [], sourceTree: .group, name: "Products") + pbxproj.add(object: productsGroup) + mainGroup.children.append(productsGroup) + /// SDSKs & Pre-compiled frameworks let frameworksGroup = PBXGroup(children: [], sourceTree: .group, name: "Frameworks") pbxproj.add(object: frameworksGroup) @@ -124,11 +132,6 @@ class ProjectGroups { pbxproj.add(object: cacheGroup) mainGroup.children.append(cacheGroup) - /// Products - let productsGroup = PBXGroup(children: [], sourceTree: .group, name: "Products") - pbxproj.add(object: productsGroup) - mainGroup.children.append(productsGroup) - return ProjectGroups( main: mainGroup, projectGroups: projectGroups, diff --git a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift index ba4536d0e57..c92ac26c8fe 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift @@ -114,9 +114,9 @@ final class ProjectGroupsTests: XCTestCase { "B", "C", "A", + "Products", "Frameworks", "Cache", - "Products", ]) } @@ -157,9 +157,9 @@ final class ProjectGroupsTests: XCTestCase { let paths = subject.sortedMain.children.map(\.nameOrPath) XCTAssertEqual(paths, [ "Project", + "Products", "Frameworks", "Cache", - "Products", ]) } From a4909f2faab34d879e3757211ac663e398b96447 Mon Sep 17 00:00:00 2001 From: Eduard Miniakhmetov Date: Mon, 6 May 2024 10:07:04 +0300 Subject: [PATCH 264/509] Add On Demand Resources Support (#6178) * Add On Demand Resources Support * Optimize KnownAssetTagsGenerator * Remove EditAcceptanceTestAppWithOnDemandResources * Move knownAssetsGenerator to instance vars * Renaming & readme --- .../OnDemandResourcesTags.swift | 15 +++ Sources/ProjectDescription/Target.swift | 9 +- .../TuistAcceptanceFixtures.swift | 3 + .../Generator/ConfigGenerator.swift | 16 +++ .../Generator/KnownAssetTagsFetcher.swift | 62 ++++++++++++ .../ProjectDescriptorGenerator.swift | 17 ++-- .../TuistGenerator/Linter/TargetLinter.swift | 14 +++ .../Models/OnDemandResourcesTags.swift | 9 ++ Sources/TuistGraph/Models/Target.swift | 5 +- .../Models/Target+TestData.swift | 6 +- .../Target+ManifestMapper.swift | 7 +- .../GenerateAcceptanceTests.swift | 30 ++++++ .../Linter/TargetLinterTests.swift | 19 ++++ fixtures/README.md | 7 ++ .../.gitignore | 70 +++++++++++++ .../OnDemandResources/on-demand-data.json | 0 .../Contents.json | 14 +++ .../AccentColor.colorset/Contents.json | 11 +++ .../AppIcon.appiconset/Contents.json | 98 +++++++++++++++++++ .../Resources/Assets.xcassets/Contents.json | 6 ++ .../Cube Texture.cubetextureset/Contents.json | 43 ++++++++ .../Universal +X.mipmapset/Contents.json | 11 +++ .../Universal +Y.mipmapset/Contents.json | 11 +++ .../Universal +Z.mipmapset/Contents.json | 11 +++ .../Universal -X.mipmapset/Contents.json | 11 +++ .../Universal -Y.mipmapset/Contents.json | 11 +++ .../Universal -Z.mipmapset/Contents.json | 11 +++ .../Data.dataset/Contents.json | 16 +++ .../Image.imageset/Contents.json | 25 +++++ .../Assets.xcassets/NewFolder/Contents.json | 11 +++ .../nestedimage.imageset/Contents.json | 25 +++++ .../Sprites.spriteatlas/Contents.json | 11 +++ .../Sprite.imageset/Contents.json | 20 ++++ .../Content.imageset/Contents.json | 16 +++ .../Back.imagestacklayer/Contents.json | 6 ++ .../Stack.imagestack/Contents.json | 22 +++++ .../Content.imageset/Contents.json | 16 +++ .../Front.imagestacklayer/Contents.json | 6 ++ .../Content.imageset/Contents.json | 16 +++ .../Middle.imagestacklayer/Contents.json | 6 ++ .../Texture.textureset/Contents.json | 18 ++++ .../Universal.mipmapset/Contents.json | 11 +++ .../Resources/LaunchScreen.storyboard | 25 +++++ .../Preview Assets.xcassets/Contents.json | 6 ++ .../Sources/AppWithOnDemandResourcesApp.swift | 10 ++ .../Sources/ContentView.swift | 16 +++ .../Tests/AppWithOnDemandResourcesTests.swift | 8 ++ .../on-demand-data.txt | 0 .../Project.swift | 39 ++++++++ .../Tuist/Config.swift | 3 + 50 files changed, 846 insertions(+), 13 deletions(-) create mode 100644 Sources/ProjectDescription/OnDemandResourcesTags.swift create mode 100644 Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift create mode 100644 Sources/TuistGraph/Models/OnDemandResourcesTags.swift create mode 100644 fixtures/ios_app_with_on_demand_resources/.gitignore create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/OnDemandResources/on-demand-data.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/AR Resources.arresourcegroup/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal +X.mipmapset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal +Y.mipmapset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal +Z.mipmapset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal -X.mipmapset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal -Y.mipmapset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal -Z.mipmapset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Data.dataset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Image.imageset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/NewFolder/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/NewFolder/nestedimage.imageset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Sprites.spriteatlas/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Sprites.spriteatlas/Sprite.imageset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Back.imagestacklayer/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Front.imagestacklayer/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Texture.textureset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Texture.textureset/Universal.mipmapset/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/LaunchScreen.storyboard create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Sources/AppWithOnDemandResourcesApp.swift create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Sources/ContentView.swift create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Tests/AppWithOnDemandResourcesTests.swift create mode 100644 fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/on-demand-data.txt create mode 100644 fixtures/ios_app_with_on_demand_resources/Project.swift create mode 100644 fixtures/ios_app_with_on_demand_resources/Tuist/Config.swift diff --git a/Sources/ProjectDescription/OnDemandResourcesTags.swift b/Sources/ProjectDescription/OnDemandResourcesTags.swift new file mode 100644 index 00000000000..cd11ee29f51 --- /dev/null +++ b/Sources/ProjectDescription/OnDemandResourcesTags.swift @@ -0,0 +1,15 @@ +/// On-demand resources tags associated with Initial Install and Prefetched Order categories +public struct OnDemandResourcesTags: Codable, Equatable { + /// Initial install tags associated with on demand resources + public let initialInstall: [String]? + /// Prefetched tag order associated with on demand resources + public let prefetchOrder: [String]? + + /// Returns OnDemandResourcesTags. + /// - Parameter initialInstall: An array of strings that lists the tags assosiated with the Initial install tags category. + /// - Parameter prefetchOrder: An array of strings that lists the tags associated with the Prefetch tag order category. + /// - Returns: OnDemandResourcesTags. + public static func tags(initialInstall: [String]?, prefetchOrder: [String]?) -> Self { + OnDemandResourcesTags(initialInstall: initialInstall, prefetchOrder: prefetchOrder) + } +} diff --git a/Sources/ProjectDescription/Target.swift b/Sources/ProjectDescription/Target.swift index 41526004291..86268baeb43 100644 --- a/Sources/ProjectDescription/Target.swift +++ b/Sources/ProjectDescription/Target.swift @@ -70,6 +70,9 @@ public struct Target: Codable, Equatable { /// Specifies whether if the target can be merged as part of another binary or not public var mergeable: Bool + /// The target's tags associated with on demand resources + public var onDemandResourcesTags: OnDemandResourcesTags? + public static func target( name: String, destinations: Destinations, @@ -92,7 +95,8 @@ public struct Target: Codable, Equatable { additionalFiles: [FileElement] = [], buildRules: [BuildRule] = [], mergedBinaryType: MergedBinaryType = .disabled, - mergeable: Bool = false + mergeable: Bool = false, + onDemandResourcesTags: OnDemandResourcesTags? = nil ) -> Self { self.init( name: name, @@ -116,7 +120,8 @@ public struct Target: Codable, Equatable { additionalFiles: additionalFiles, buildRules: buildRules, mergedBinaryType: mergedBinaryType, - mergeable: mergeable + mergeable: mergeable, + onDemandResourcesTags: onDemandResourcesTags ) } } diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift index 433c6b6baba..57cb9127aa2 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift @@ -36,6 +36,7 @@ public enum TuistAcceptanceFixtures { case iosAppWithLocalBinarySwiftPackage case iosAppWithLocalSwiftPackage case iosAppWithMultiConfigs + case iosAppWithOnDemandResources case iosAppWithPluginsAndTemplates case iosAppWithPrivacyManifest case iosAppWithRemoteBinarySwiftPackage @@ -139,6 +140,8 @@ public enum TuistAcceptanceFixtures { return "ios_app_with_local_swift_package" case .iosAppWithMultiConfigs: return "ios_app_with_multi_configs" + case .iosAppWithOnDemandResources: + return "ios_app_with_on_demand_resources" case .iosAppWithPluginsAndTemplates: return "ios_app_with_plugins_and_templates" case .iosAppWithPrivacyManifest: diff --git a/Sources/TuistGenerator/Generator/ConfigGenerator.swift b/Sources/TuistGenerator/Generator/ConfigGenerator.swift index eaaca10299b..6fb8f1a5216 100644 --- a/Sources/TuistGenerator/Generator/ConfigGenerator.swift +++ b/Sources/TuistGenerator/Generator/ConfigGenerator.swift @@ -361,6 +361,22 @@ final class ConfigGenerator: ConfigGenerating { } } + if let initialInstallTags = target.onDemandResourcesTags?.initialInstall, !initialInstallTags.isEmpty { + settings["ON_DEMAND_RESOURCES_INITIAL_INSTALL_TAGS"] = .string( + initialInstallTags.sorted().map { + $0.replacingOccurrences(of: " ", with: "\\ ") + }.joined(separator: " ") + ) + } + + if let prefetchOrder = target.onDemandResourcesTags?.prefetchOrder, !prefetchOrder.isEmpty { + settings["ON_DEMAND_RESOURCES_PREFETCH_ORDER"] = .string( + prefetchOrder.map { + $0.replacingOccurrences(of: " ", with: "\\ ") + }.joined(separator: " ") + ) + } + return settings } diff --git a/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift b/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift new file mode 100644 index 00000000000..358f22fadac --- /dev/null +++ b/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift @@ -0,0 +1,62 @@ +import Foundation +import PathKit +import TuistGraph + +private struct ContentJson: Decodable { + struct ContentProperties: Decodable { + enum CodingKeys: String, CodingKey { + case onDemandResourceTags = "on-demand-resource-tags" + } + + let onDemandResourceTags: [String] + } + + let properties: ContentProperties +} + +protocol KnownAssetTagsFetching: AnyObject { + func fetch(project: Project) throws -> [String] +} + +final class KnownAssetTagsFetcher: KnownAssetTagsFetching { + func fetch(project: Project) throws -> [String] { + var tags = project.targets.map { $0.resources.resources.map(\.tags).flatMap { $0 } }.flatMap { $0 } + + let initialInstallTags = project.targets.compactMap { + $0.onDemandResourcesTags?.initialInstall?.compactMap { $0 } + }.flatMap { $0 } + + let prefetchOrderTags = project.targets.compactMap { + $0.onDemandResourcesTags?.prefetchOrder?.compactMap { $0 } + }.flatMap { $0 } + + tags.append(contentsOf: initialInstallTags) + tags.append(contentsOf: prefetchOrderTags) + + var assetContentsPaths: Set = [] + let decoder = JSONDecoder() + for target in project.targets { + let assetCatalogs = target.resources.resources.filter { $0.path.extension == "xcassets" } + for assetCatalog in assetCatalogs { + guard let children = try? assetCatalog.path.path.recursiveChildren() else { continue } + let contents = children.filter { $0.lastComponent == "Contents.json" } + for content in contents { + assetContentsPaths.insert(content) + } + } + } + + var assetsTags: [String] = [] + for path in assetContentsPaths { + guard let data = try? Data(contentsOf: path.url) else { continue } + guard let attributes = try? decoder.decode(ContentJson.self, from: data) else { continue } + assetsTags.append(contentsOf: attributes.properties.onDemandResourceTags) + } + + tags.append(contentsOf: assetsTags) + + let uniqueTags = Set(tags).sorted() + + return uniqueTags + } +} diff --git a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift index 84b3c1b9627..8fa3ea47e9f 100644 --- a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift @@ -54,6 +54,9 @@ final class ProjectDescriptorGenerator: ProjectDescriptorGenerating { /// Generator for the project schemes. let schemeDescriptorsGenerator: SchemeDescriptorsGenerating + /// Fetcher for the project known asset tags associated with on-demand resources. + let knownAssetTagsFetcher: KnownAssetTagsFetching + // MARK: - Init /// Initializes the project generator with its attributes. @@ -62,14 +65,17 @@ final class ProjectDescriptorGenerator: ProjectDescriptorGenerating { /// - targetGenerator: Generator for the project targets. /// - configGenerator: Generator for the project configuration. /// - schemeDescriptorsGenerator: Generator for the project schemes. + /// - knownAssetTagsFetcher: Fetcher for the project known asset tags associated with on-demand resources. init( targetGenerator: TargetGenerating = TargetGenerator(), configGenerator: ConfigGenerating = ConfigGenerator(), - schemeDescriptorsGenerator: SchemeDescriptorsGenerating = SchemeDescriptorsGenerator() + schemeDescriptorsGenerator: SchemeDescriptorsGenerating = SchemeDescriptorsGenerator(), + knownAssetTagsFetcher: KnownAssetTagsFetching = KnownAssetTagsFetcher() ) { self.targetGenerator = targetGenerator self.configGenerator = configGenerator self.schemeDescriptorsGenerator = schemeDescriptorsGenerator + self.knownAssetTagsFetcher = knownAssetTagsFetcher } // MARK: - ProjectGenerating @@ -295,12 +301,9 @@ final class ProjectDescriptorGenerator: ProjectDescriptorGenerating { private func generateAttributes(project: Project) -> [String: Any] { var attributes: [String: Any] = [:] - /// ODR tags - let tags = project.targets.map { $0.resources.resources.map(\.tags).flatMap { $0 } }.flatMap { $0 } - let uniqueTags = Set(tags).sorted() - - if !uniqueTags.isEmpty { - attributes["KnownAssetTags"] = uniqueTags + // On Demand Resources tags + if let knownAssetTags = try? knownAssetTagsFetcher.fetch(project: project), !knownAssetTags.isEmpty { + attributes["KnownAssetTags"] = knownAssetTags } // BuildIndependentTargetsInParallel diff --git a/Sources/TuistGenerator/Linter/TargetLinter.swift b/Sources/TuistGenerator/Linter/TargetLinter.swift index 112e764eee8..524e0e4b4f2 100644 --- a/Sources/TuistGenerator/Linter/TargetLinter.swift +++ b/Sources/TuistGenerator/Linter/TargetLinter.swift @@ -41,6 +41,7 @@ class TargetLinter: TargetLinting { issues.append(contentsOf: validateCoreDataModelsExist(target: target)) issues.append(contentsOf: validateCoreDataModelVersionsExist(target: target)) issues.append(contentsOf: lintMergeableLibrariesOnlyAppliesToDynamicTargets(target: target)) + issues.append(contentsOf: lintOnDemandResourcesTags(target: target)) for script in target.scripts { issues.append(contentsOf: targetScriptLinter.lint(script)) } @@ -323,6 +324,19 @@ class TargetLinter: TargetLinting { } return [] } + + private func lintOnDemandResourcesTags(target: Target) -> [LintingIssue] { + guard let onDemandResourcesTags = target.onDemandResourcesTags else { return [] } + guard let initialInstall = onDemandResourcesTags.initialInstall else { return [] } + guard let prefetchOrder = onDemandResourcesTags.prefetchOrder else { return [] } + let intersection = Set(initialInstall).intersection(Set(prefetchOrder)) + return intersection.map { tag in + LintingIssue( + reason: "Prefetched Order Tag \"\(tag)\" is already assigned to Initial Install Tags category for the target \(target.name) and will be ignored by Xcode", + severity: .warning + ) + } + } } extension TargetDependency { diff --git a/Sources/TuistGraph/Models/OnDemandResourcesTags.swift b/Sources/TuistGraph/Models/OnDemandResourcesTags.swift new file mode 100644 index 00000000000..75da69d16bd --- /dev/null +++ b/Sources/TuistGraph/Models/OnDemandResourcesTags.swift @@ -0,0 +1,9 @@ +public struct OnDemandResourcesTags: Codable, Equatable { + public let initialInstall: [String]? + public let prefetchOrder: [String]? + + public init(initialInstall: [String]?, prefetchOrder: [String]?) { + self.initialInstall = initialInstall + self.prefetchOrder = prefetchOrder + } +} diff --git a/Sources/TuistGraph/Models/Target.swift b/Sources/TuistGraph/Models/Target.swift index 3f13d5b6de7..70761bd70a4 100644 --- a/Sources/TuistGraph/Models/Target.swift +++ b/Sources/TuistGraph/Models/Target.swift @@ -46,6 +46,7 @@ public struct Target: Equatable, Hashable, Comparable, Codable { public var prune: Bool public let mergedBinaryType: MergedBinaryType public let mergeable: Bool + public let onDemandResourcesTags: OnDemandResourcesTags? // MARK: - Init @@ -75,7 +76,8 @@ public struct Target: Equatable, Hashable, Comparable, Codable { buildRules: [BuildRule] = [], prune: Bool = false, mergedBinaryType: MergedBinaryType = .disabled, - mergeable: Bool = false + mergeable: Bool = false, + onDemandResourcesTags: OnDemandResourcesTags? = nil ) { self.name = name self.product = product @@ -103,6 +105,7 @@ public struct Target: Equatable, Hashable, Comparable, Codable { self.prune = prune self.mergedBinaryType = mergedBinaryType self.mergeable = mergeable + self.onDemandResourcesTags = onDemandResourcesTags } /// Target can be included in the link phase of other targets diff --git a/Sources/TuistGraphTesting/Models/Target+TestData.swift b/Sources/TuistGraphTesting/Models/Target+TestData.swift index 999953413cf..6eb66fe0dd1 100644 --- a/Sources/TuistGraphTesting/Models/Target+TestData.swift +++ b/Sources/TuistGraphTesting/Models/Target+TestData.swift @@ -139,7 +139,8 @@ extension Target { environmentVariables: [String: EnvironmentVariable] = [:], filesGroup: ProjectGroup = .group(name: "Project"), dependencies: [TargetDependency] = [], - rawScriptBuildPhases: [RawScriptBuildPhase] = [] + rawScriptBuildPhases: [RawScriptBuildPhase] = [], + onDemandResourcesTags: OnDemandResourcesTags? = nil ) -> Target { Target( name: name, @@ -160,7 +161,8 @@ extension Target { environmentVariables: environmentVariables, filesGroup: filesGroup, dependencies: dependencies, - rawScriptBuildPhases: rawScriptBuildPhases + rawScriptBuildPhases: rawScriptBuildPhases, + onDemandResourcesTags: onDemandResourcesTags ) } diff --git a/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift index a71558783a2..798971680f3 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift @@ -99,6 +99,10 @@ extension TuistGraph.Target { TuistGraph.BuildRule.from(manifest: $0) } + let onDemandResourcesTags = manifest.onDemandResourcesTags.map { + TuistGraph.OnDemandResourcesTags(initialInstall: $0.initialInstall, prefetchOrder: $0.prefetchOrder) + } + return TuistGraph.Target( name: name, destinations: destinations, @@ -123,7 +127,8 @@ extension TuistGraph.Target { additionalFiles: additionalFiles, buildRules: buildRules, mergedBinaryType: mergedBinaryType, - mergeable: manifest.mergeable + mergeable: manifest.mergeable, + onDemandResourcesTags: onDemandResourcesTags ) } diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index 21bc07b141e..3e835a7b578 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -138,6 +138,36 @@ final class GenerateAcceptanceTestiOSAppWithFrameworkAndResources: TuistAcceptan } } +final class GenerateAcceptanceTestiOSAppWithOnDemandResources: TuistAcceptanceTestCase { + func test_ios_app_with_on_demand_resources() async throws { + try setUpFixture(.iosAppWithOnDemandResources) + try await run(GenerateCommand.self) + try await run(BuildCommand.self) + let pbxprojPath = xcodeprojPath.appending(component: "project.pbxproj") + let data = try Data(contentsOf: pbxprojPath.url) + let pbxProj = try PBXProj(data: data) + let attributes = try XCTUnwrap(pbxProj.projects.first?.attributes) + let knownAssetTags = try XCTUnwrap(attributes["KnownAssetTags"] as? [String]) + let givenTags = [ + "ar-resource-group", + "cube-texture", + "data", + "data file", + "datafile", + "datafolder", + "image", + "image-stack", + "json", + "nestedimage", + "newfolder", + "sprite", + "tag with space", + "texture", + ] + XCTAssertEqual(knownAssetTags, givenTags) + } +} + final class GenerateAcceptanceTestiOSAppWithPrivacyManifest: TuistAcceptanceTestCase { func test_ios_app_with_privacy_manifest() async throws { try setUpFixture(.iosAppWithPrivacyManifest) diff --git a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift index e975fd4a3c9..1b3deb0e70b 100644 --- a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift @@ -496,4 +496,23 @@ final class TargetLinterTests: TuistUnitTestCase { severity: .warning )) } + + func test_lint_when_target_has_invalid_on_demand_resources_tags() throws { + // Given + let target = Target.empty( + onDemandResourcesTags: .init( + initialInstall: ["tag1", "tag2"], + prefetchOrder: ["tag2", "tag3"] + ) + ) + + // When + let got = subject.lint(target: target) + + // Then + XCTContainsLintingIssue(got, .init( + reason: "Prefetched Order Tag \"tag2\" is already assigned to Initial Install Tags category for the target \(target.name) and will be ignored by Xcode", + severity: .warning + )) + } } diff --git a/fixtures/README.md b/fixtures/README.md index e257dbb281f..c9d647e00d4 100644 --- a/fixtures/README.md +++ b/fixtures/README.md @@ -157,6 +157,13 @@ An iOS application with local Swift package. An workspace that contains an application and frameworks that leverage multiple configurations (Debug, Beta and Release) each of which also has an associated xcconfig file within `ConfigurationFiles`. +## ios_app_with_on_demand_resources + +An iOS applicaiton with on-demand resources. It contains file resources and asset catalogs associated with tags which in turn are distributed between three categories: +- Initial install tags +- Prefetch tag order +- Dowloaded only on demand + ## ios_app_with_remote_swift_package An iOS application with remote Swift package. diff --git a/fixtures/ios_app_with_on_demand_resources/.gitignore b/fixtures/ios_app_with_on_demand_resources/.gitignore new file mode 100644 index 00000000000..24b244f9c45 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/.gitignore @@ -0,0 +1,70 @@ +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Xcode ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +### Xcode Patch ### +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcworkspace/contents.xcworkspacedata +/*.gcno + +### Projects ### +*.xcodeproj +*.xcworkspace + +### Tuist derived files ### +graph.dot +Derived/ + +### Tuist managed dependencies ### +Tuist/.build \ No newline at end of file diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/OnDemandResources/on-demand-data.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/OnDemandResources/on-demand-data.json new file mode 100644 index 00000000000..e69de29bb2d diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/AR Resources.arresourcegroup/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/AR Resources.arresourcegroup/Contents.json new file mode 100644 index 00000000000..55e99f6affc --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/AR Resources.arresourcegroup/Contents.json @@ -0,0 +1,14 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "on-demand-resource-tags" : [ + "ar-resource-group" + ] + }, + "resources" : [ + + ] +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000000..eb878970081 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..9221b9bb1a3 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Contents.json new file mode 100644 index 00000000000..3d253b36e8a --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Contents.json @@ -0,0 +1,43 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "on-demand-resource-tags" : [ + "cube-texture" + ] + }, + "textures" : [ + { + "cube-face" : "x-", + "filename" : "Universal -X.mipmapset", + "idiom" : "universal" + }, + { + "cube-face" : "y-", + "filename" : "Universal -Y.mipmapset", + "idiom" : "universal" + }, + { + "cube-face" : "z-", + "filename" : "Universal -Z.mipmapset", + "idiom" : "universal" + }, + { + "cube-face" : "x+", + "filename" : "Universal +X.mipmapset", + "idiom" : "universal" + }, + { + "cube-face" : "y+", + "filename" : "Universal +Y.mipmapset", + "idiom" : "universal" + }, + { + "cube-face" : "z+", + "filename" : "Universal +Z.mipmapset", + "idiom" : "universal" + } + ] +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal +X.mipmapset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal +X.mipmapset/Contents.json new file mode 100644 index 00000000000..bdd33d560db --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal +X.mipmapset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "levels" : [ + { + "mipmap-level" : "base" + } + ] +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal +Y.mipmapset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal +Y.mipmapset/Contents.json new file mode 100644 index 00000000000..bdd33d560db --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal +Y.mipmapset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "levels" : [ + { + "mipmap-level" : "base" + } + ] +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal +Z.mipmapset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal +Z.mipmapset/Contents.json new file mode 100644 index 00000000000..bdd33d560db --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal +Z.mipmapset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "levels" : [ + { + "mipmap-level" : "base" + } + ] +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal -X.mipmapset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal -X.mipmapset/Contents.json new file mode 100644 index 00000000000..bdd33d560db --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal -X.mipmapset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "levels" : [ + { + "mipmap-level" : "base" + } + ] +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal -Y.mipmapset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal -Y.mipmapset/Contents.json new file mode 100644 index 00000000000..bdd33d560db --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal -Y.mipmapset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "levels" : [ + { + "mipmap-level" : "base" + } + ] +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal -Z.mipmapset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal -Z.mipmapset/Contents.json new file mode 100644 index 00000000000..bdd33d560db --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Cube Texture.cubetextureset/Universal -Z.mipmapset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "levels" : [ + { + "mipmap-level" : "base" + } + ] +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Data.dataset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Data.dataset/Contents.json new file mode 100644 index 00000000000..201158c1dcf --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Data.dataset/Contents.json @@ -0,0 +1,16 @@ +{ + "data" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "on-demand-resource-tags" : [ + "data" + ] + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Image.imageset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Image.imageset/Contents.json new file mode 100644 index 00000000000..844e883a81d --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Image.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "on-demand-resource-tags" : [ + "image" + ] + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/NewFolder/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/NewFolder/Contents.json new file mode 100644 index 00000000000..31835dbfe49 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/NewFolder/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "on-demand-resource-tags" : [ + "newfolder" + ] + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/NewFolder/nestedimage.imageset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/NewFolder/nestedimage.imageset/Contents.json new file mode 100644 index 00000000000..a7d77d928d2 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/NewFolder/nestedimage.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "on-demand-resource-tags" : [ + "nestedimage" + ] + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Sprites.spriteatlas/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Sprites.spriteatlas/Contents.json new file mode 100644 index 00000000000..7ff56454647 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Sprites.spriteatlas/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "on-demand-resource-tags" : [ + "sprite" + ] + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Sprites.spriteatlas/Sprite.imageset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Sprites.spriteatlas/Sprite.imageset/Contents.json new file mode 100644 index 00000000000..a19a5492203 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Sprites.spriteatlas/Sprite.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000000..795cce17243 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.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/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Back.imagestacklayer/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Contents.json new file mode 100644 index 00000000000..0503b6204e8 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Contents.json @@ -0,0 +1,22 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ], + "properties" : { + "on-demand-resource-tags" : [ + "image-stack" + ] + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000000..795cce17243 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.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/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Front.imagestacklayer/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000000..795cce17243 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.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/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Middle.imagestacklayer/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Stack.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Texture.textureset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Texture.textureset/Contents.json new file mode 100644 index 00000000000..ce82bfc2c9b --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Texture.textureset/Contents.json @@ -0,0 +1,18 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "on-demand-resource-tags" : [ + "tag with space", + "texture" + ] + }, + "textures" : [ + { + "filename" : "Universal.mipmapset", + "idiom" : "universal" + } + ] +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Texture.textureset/Universal.mipmapset/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Texture.textureset/Universal.mipmapset/Contents.json new file mode 100644 index 00000000000..bdd33d560db --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Assets.xcassets/Texture.textureset/Universal.mipmapset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "levels" : [ + { + "mipmap-level" : "base" + } + ] +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/LaunchScreen.storyboard b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/LaunchScreen.storyboard new file mode 100644 index 00000000000..865e9329f37 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Preview Content/Preview Assets.xcassets/Contents.json b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Resources/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Sources/AppWithOnDemandResourcesApp.swift b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Sources/AppWithOnDemandResourcesApp.swift new file mode 100644 index 00000000000..78a641b4810 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Sources/AppWithOnDemandResourcesApp.swift @@ -0,0 +1,10 @@ +import SwiftUI + +@main +struct AppWithOnDemandResourcesApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Sources/ContentView.swift b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Sources/ContentView.swift new file mode 100644 index 00000000000..48f62ebea83 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Sources/ContentView.swift @@ -0,0 +1,16 @@ +import SwiftUI + +public struct ContentView: View { + public init() {} + + public var body: some View { + Text("Hello, World!") + .padding() + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Tests/AppWithOnDemandResourcesTests.swift b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Tests/AppWithOnDemandResourcesTests.swift new file mode 100644 index 00000000000..6fc1cbd2f6f --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/Tests/AppWithOnDemandResourcesTests.swift @@ -0,0 +1,8 @@ +import Foundation +import XCTest + +final class AppWithOnDemandResourcesTests: XCTestCase { + func test_twoPlusTwo_isFour() { + XCTAssertEqual(2 + 2, 4) + } +} diff --git a/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/on-demand-data.txt b/fixtures/ios_app_with_on_demand_resources/AppWithOnDemandResources/on-demand-data.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/fixtures/ios_app_with_on_demand_resources/Project.swift b/fixtures/ios_app_with_on_demand_resources/Project.swift new file mode 100644 index 00000000000..6e8d9bdcd05 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/Project.swift @@ -0,0 +1,39 @@ +import ProjectDescription + +let project = Project( + name: "AppWithOnDemandResources", + targets: [ + .target( + name: "AppWithOnDemandResources", + destinations: .iOS, + product: .app, + bundleId: "io.tuist.AppWithOnDemandResources", + infoPlist: .extendingDefault( + with: [ + "UILaunchStoryboardName": "LaunchScreen.storyboard", + ] + ), + sources: ["AppWithOnDemandResources/Sources/**"], + resources: [ + "AppWithOnDemandResources/Resources/**", + .folderReference(path: "AppWithOnDemandResources/OnDemandResources", tags: ["datafolder"]), + .glob(pattern: "AppWithOnDemandResources/on-demand-data.txt", tags: ["datafile"]), + ], + dependencies: [], + onDemandResourcesTags: .tags( + initialInstall: ["json", "data file"], + prefetchOrder: ["image-stack", "image", "tag with space"] + ) + ), + .target( + name: "AppWithOnDemandResourcesTests", + destinations: .iOS, + product: .unitTests, + bundleId: "io.tuist.AppWithOnDemandResourcesTests", + infoPlist: .default, + sources: ["AppWithOnDemandResources/Tests/**"], + resources: [], + dependencies: [.target(name: "AppWithOnDemandResources")] + ), + ] +) diff --git a/fixtures/ios_app_with_on_demand_resources/Tuist/Config.swift b/fixtures/ios_app_with_on_demand_resources/Tuist/Config.swift new file mode 100644 index 00000000000..ff8e64fa9ee --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/Tuist/Config.swift @@ -0,0 +1,3 @@ +import ProjectDescription + +let config = Config() From bc6c0741f034c5e325b70c0e4c8be56e3fd27507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 6 May 2024 18:54:57 +0200 Subject: [PATCH 265/509] Migrate single fixtures README to individual README files (#6254) --- fixtures/README.md | 317 ------------------ .../README.md | 3 + .../README.md | 3 + fixtures/ios_app_with_actions/README.md | 3 + .../ios_app_with_build_variables/README.md | 3 + .../ios_app_with_custom_workspace/README.md | 15 + fixtures/ios_app_with_extensions/README.md | 3 + .../README.md | 21 ++ .../README.md | 34 ++ fixtures/ios_app_with_frameworks/README.md | 32 ++ fixtures/ios_app_with_helpers/README.md | 3 + .../README.md | 3 + .../ios_app_with_incompatible_xcode/README.md | 3 + .../README.md | 3 + fixtures/ios_app_with_multi_configs/README.md | 3 + .../README.md | 6 + .../README.md | 3 + fixtures/ios_app_with_sdk/README.md | 5 + .../ios_app_with_static_frameworks/README.md | 41 +++ .../ios_app_with_static_libraries/README.md | 33 ++ .../README.md | 5 + fixtures/ios_app_with_tests/README.md | 3 + .../README.md | 25 ++ fixtures/ios_app_with_xcframeworks/README.md | 19 ++ .../README.md | 3 + fixtures/macos_app_with_extensions/README.md | 3 + 26 files changed, 278 insertions(+), 317 deletions(-) delete mode 100644 fixtures/README.md create mode 100644 fixtures/app_with_organization_name_project/README.md create mode 100644 fixtures/framework_with_environment_variables/README.md create mode 100644 fixtures/ios_app_with_actions/README.md create mode 100644 fixtures/ios_app_with_build_variables/README.md create mode 100644 fixtures/ios_app_with_custom_workspace/README.md create mode 100644 fixtures/ios_app_with_extensions/README.md create mode 100644 fixtures/ios_app_with_framework_and_resources/README.md create mode 100644 fixtures/ios_app_with_framework_linking_static_framework/README.md create mode 100644 fixtures/ios_app_with_frameworks/README.md create mode 100644 fixtures/ios_app_with_helpers/README.md create mode 100644 fixtures/ios_app_with_incompatible_dependencies/README.md create mode 100644 fixtures/ios_app_with_incompatible_xcode/README.md create mode 100644 fixtures/ios_app_with_local_swift_package/README.md create mode 100644 fixtures/ios_app_with_multi_configs/README.md create mode 100644 fixtures/ios_app_with_on_demand_resources/README.md create mode 100644 fixtures/ios_app_with_remote_swift_package/README.md create mode 100644 fixtures/ios_app_with_sdk/README.md create mode 100644 fixtures/ios_app_with_static_frameworks/README.md create mode 100644 fixtures/ios_app_with_static_libraries/README.md create mode 100644 fixtures/ios_app_with_static_library_and_package/README.md create mode 100644 fixtures/ios_app_with_tests/README.md create mode 100644 fixtures/ios_app_with_transitive_framework/README.md create mode 100644 fixtures/ios_app_with_xcframeworks/README.md create mode 100644 fixtures/ios_workspace_with_dependency_cycle/README.md create mode 100644 fixtures/macos_app_with_extensions/README.md diff --git a/fixtures/README.md b/fixtures/README.md deleted file mode 100644 index c9d647e00d4..00000000000 --- a/fixtures/README.md +++ /dev/null @@ -1,317 +0,0 @@ -# Fixtures - -This folder contains sample projects we use in the integration and acceptance tests. -Please keep this list in alphabetical order. - -## app_with_organization_name_project - -An iOS app where the organization name is defined at the `Project` level. - -## framework_with_environment_variables - -A framework project that leverages environment variables to change the name of the framework. - -## invalid_manifest - -A project with an invalid manifest. - -## invalid_workspace_manifest_name - -Contains a single file `Workspac.swift`, incorrectly named workspace manifest file. - -## ios_app_with_actions - -An iOS app with a target that has pre and post actions. - -## ios_app_with_build_variables - -An iOS app with a Xcode build variables defined in pre action. - -## ios_app_with_coredata - -A simple iOS app with a Core Data model and Mapping Model (.xcmappingmodel). - -## ios_app_with_custom_workspace - -Contains a few projects and a `Workspace.swift` manifest file. - -The workspace manifest defines: - -- glob patterns to list projects -- glob patterns to include documentation files -- folder reference to directory with html files - -The App's project manifest leverages `additionalFiles` that: - -- defines glob patterns to include documentation files -- includes a Swift `Danger.swift` file that shouldn't get included in any build phase -- defines folder references to a directory with json files - -## ios_app_with_extensions - -Sample application with extension targets. - -## ios_app_with_framework_and_resources - -A workspace with an application that includes resources. - -``` -Workspace: - - App: - - MainApp (iOS app) - - MainAppTests (iOS unit tests) - - Framework1: - - Framework1 (dynamic iOS framework) - - StaticFramework - - StaticFramework (static iOS framework) - - StaticFrameworkResources (iOS bundle) -``` - -Dependencies: - -- App -> Framework1 -- App -> StaticFramework -- App -> StaticFrameworkResources - -## ios_app_with_framework_linking_static_framework - -An example project demonstrating an iOS application linking a dynamic framework which itself depends on a static framework with transitive static dependencies. - -Only `Framework1.framework` should be linked and included into App, everything else should be statically linked into the Framework1 executable. - -``` -Workspace: - - App: - - MainApp (iOS app) - - MainAppTests (iOS unit tests) - - Framework1: - - Framework1 (dynamic iOS framework) - - Framework1Tests (iOS unit tests) - - Framework2: - - Framework2 (static iOS framework) - - Framework2Tests (iOS unit tests) - - Framework3: - - Framework3 (static iOS framework) - - Framework3Tests (iOS unit tests) - - Framework4: - - Framework4 (static iOS framework) - - Framework4Tests (iOS unit tests) -``` - -Dependencies: - -- App -> Framework1 -- Framework1 -> Framework2 -- Framework1 -> Framework3 -- Framework3 -> Framework4 - -## ios_app_with_frameworks - -Slightly more complicated project consists of an iOS app and few frameworks. - -``` -Workspace: - - App: - - MainApp (iOS app) - - MainAppTests (iOS unit tests) - - Framework1: - - Framework1 (dynamic iOS framework) - - Framework1Tests (iOS unit tests) - - Framework2: - - Framework2 (dynamic iOS framework) - - Framework2Tests (iOS unit tests) - - Framework3: - - Framework3 (dynamic iOS framework) - - Framework4: - - Framework4 (dynamic iOS framework) - - Framework5: - - Framework5 (dynamic iOS framework) -``` - -Dependencies: - -- App -> Framework1 -- App -> Framework2 -- Framework1 -> Framework2 -- Framework2 -> Framework3 -- Framework3 -> Framework4 -- Framework4 -> Framework5 - -## ios_app_with_helpers - -A basic iOS app that has some manifest bits extracted into helpers. - -## ios_app_with_incompatible_dependencies - -An iOS app that has a dependency with a dependency with a framework for macOS. - -## ios_app_with_incompatible_xcode - -An iOS app whose Config file requires an Xcode version that is not available in the system. - -## ios_app_with_local_swift_package - -An iOS application with local Swift package. - -## ios_app_with_multi_configs - -An workspace that contains an application and frameworks that leverage multiple configurations (Debug, Beta and Release) each of which also has an associated xcconfig file within `ConfigurationFiles`. - -## ios_app_with_on_demand_resources - -An iOS applicaiton with on-demand resources. It contains file resources and asset catalogs associated with tags which in turn are distributed between three categories: -- Initial install tags -- Prefetch tag order -- Dowloaded only on demand - -## ios_app_with_remote_swift_package - -An iOS application with remote Swift package. - -## ios_app_with_sdk - -An application that contains an application target that depends on system libraries and frameworks (`.framework` and `.tbd`). - -One of the dependencies is declared as `.optional` i.e. will be linked weakly. - -## ios_app_with_static_frameworks - -This fixture contains an application that depends on static frameworks, both directly and transitively. - -``` -Workspace: - - App: - - MainApp (iOS app) - - MainAppTests (iOS unit tests) - - Modules - - A: - - A (static framework iOS) - - ATests (iOS unit tests) - - B: - - B (static framework iOS) - - BTests (iOS unit tests) - - C: - - C (static framework iOS) - - CTests (iOS unit tests) - - D: - - D (dynamic framework iOS) -``` - -A standalone `Prebuilt` project is used to generate a prebuilt static framework: - -``` -- Prebuilt - - PrebuiltStaticFramework (static framework iOS) -``` - -Dependencies: - -- App -> A -- App -> C -- App -> PrebuiltStaticFramework -- A -> B -- A -> C -- C -> D - -Note: to re-create `PrebuiltStaticFramework.framework` run `ios_app_with_static_frameworks/Prebuilt//build.sh` - -## ios_app_with_static_libraries - -This application provides a top level application with two static library dependencies. The first static library dependency has another static library dependency so that we are able to test how Tuist handles the transitiveness of the static libraries in the linked frameworks of the main app. - -``` -Workspace: - - App: - - MainApp (iOS app) - - MainAppTests (iOS unit tests) - - A: - - A (static library iOS) - - ATests (iOS unit tests) - - B: - - B (static library iOS) - - BTests (iOS unit tests) -``` - -A standalone C project is used to generate a prebuilt static library: - -``` - - C: - - C (static library iOS) - - CTests (iOS unit tests) -``` - -Dependencies: - -- App -> A -- A -> B -- A -> prebuild C (libC.a) - -Note: to re-create `libC.a` run `ios_app_with_static_libraries/Modules/C/build.sh` - -## ios_app_with_static_library_and_package - -An iOS application that depends on static library that depends on Swift package where static library is defined first. - -Note: to re-create `PrebuiltStaticFramework.framework` run `ios_app_with_static_library_and_package/Prebuilt/build.sh` - -## ios_app_with_tests - -Simple app with tests, which includes a setup manifest and uses `.notGrouped` autogenerated schemes. - -## ios_app_with_transitive_framework - -``` -Workspace: - - App: - - MainApp (iOS app) - - MainAppTests (iOS unit tests) - - Framework1: - - Framework1 (dynamic iOS framework) - - Framework1Tests (iOS unit tests) -``` - -A standalone Framework2 project is used to generate a prebuilt dynamic framework: - -``` - - Framework2: - - Framework2 (dynamic iOS framework) -``` - -Dependencies: - -- App -> Framework1 -- Framework1 -> Framework2 (prebuilt) - -Note: to re-create `Framework2.framework` run `ios_app_with_transitive_framework/Framework2/build.sh` - -## ios_app_with_xcframeworks - -``` -Workspace: - - App: - - MainApp (iOS app) - - MainAppTests (iOS unit tests) - - MyFramework: - - MyFramework (dynamic iOS framework) - - MyStaticFramework: - - MyStaticFramework (static iOS framework) - - MyStaticLibirary: - - MyStaticLibrary (static iOS libraries) -``` - -An example of an application which depends on prebuilt `.xcframework`s. - -The `.xcframework` can be obtained by running the `build.sh` script within the each of the xcframework directories -e.g. `ios_app_with_xcframeworks/XCFrameworks/MyFramework/build.sh`. - -## ios_workspace_with_dependency_cycle - -An example of a workspace that has a dependency cycle between targets in different projects. - -## macos_app_with_extensions - -The project contains a macOS app with various types of extensions. - -## manifest_with_logs - -A project that contains logs to verify that the logs are forwarded by Tuist. diff --git a/fixtures/app_with_organization_name_project/README.md b/fixtures/app_with_organization_name_project/README.md new file mode 100644 index 00000000000..46ec1205b1f --- /dev/null +++ b/fixtures/app_with_organization_name_project/README.md @@ -0,0 +1,3 @@ +# App with organization name defined in `Project` + +An iOS app where the organization name is defined at the `Project` level. \ No newline at end of file diff --git a/fixtures/framework_with_environment_variables/README.md b/fixtures/framework_with_environment_variables/README.md new file mode 100644 index 00000000000..900f4677285 --- /dev/null +++ b/fixtures/framework_with_environment_variables/README.md @@ -0,0 +1,3 @@ +# Framework with environment variables + +A framework project that leverages environment variables to change the name of the framework. \ No newline at end of file diff --git a/fixtures/ios_app_with_actions/README.md b/fixtures/ios_app_with_actions/README.md new file mode 100644 index 00000000000..3d6e0dd5cf9 --- /dev/null +++ b/fixtures/ios_app_with_actions/README.md @@ -0,0 +1,3 @@ +# iOS app with actions + +An iOS app with a target that has pre and post actions. \ No newline at end of file diff --git a/fixtures/ios_app_with_build_variables/README.md b/fixtures/ios_app_with_build_variables/README.md new file mode 100644 index 00000000000..c60d7ef797f --- /dev/null +++ b/fixtures/ios_app_with_build_variables/README.md @@ -0,0 +1,3 @@ +# iOS app with build variables + +An iOS app with a Xcode build variables defined in pre action. \ No newline at end of file diff --git a/fixtures/ios_app_with_custom_workspace/README.md b/fixtures/ios_app_with_custom_workspace/README.md new file mode 100644 index 00000000000..fd0e30983ca --- /dev/null +++ b/fixtures/ios_app_with_custom_workspace/README.md @@ -0,0 +1,15 @@ +# iOS app with a custom workspace + +iOS with a few projects and a `Workspace.swift` manifest file. + +The workspace manifest defines: + +- glob patterns to list projects +- glob patterns to include documentation files +- folder reference to directory with html files + +The App's project manifest leverages `additionalFiles` that: + +- defines glob patterns to include documentation files +- includes a Swift `Danger.swift` file that shouldn't get included in any build phase +- defines folder references to a directory with json files \ No newline at end of file diff --git a/fixtures/ios_app_with_extensions/README.md b/fixtures/ios_app_with_extensions/README.md new file mode 100644 index 00000000000..ec28324ec44 --- /dev/null +++ b/fixtures/ios_app_with_extensions/README.md @@ -0,0 +1,3 @@ +# iOS app with extensions + +Sample iOS application with extension targets. \ No newline at end of file diff --git a/fixtures/ios_app_with_framework_and_resources/README.md b/fixtures/ios_app_with_framework_and_resources/README.md new file mode 100644 index 00000000000..f97e44547f6 --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/README.md @@ -0,0 +1,21 @@ +# iOS app with a framework and resources + +A workspace with an application that includes resources. + +``` +Workspace: + - App: + - MainApp (iOS app) + - MainAppTests (iOS unit tests) + - Framework1: + - Framework1 (dynamic iOS framework) + - StaticFramework + - StaticFramework (static iOS framework) + - StaticFrameworkResources (iOS bundle) +``` + +Dependencies: + +- App -> Framework1 +- App -> StaticFramework +- App -> StaticFrameworkResources \ No newline at end of file diff --git a/fixtures/ios_app_with_framework_linking_static_framework/README.md b/fixtures/ios_app_with_framework_linking_static_framework/README.md new file mode 100644 index 00000000000..25fd131c333 --- /dev/null +++ b/fixtures/ios_app_with_framework_linking_static_framework/README.md @@ -0,0 +1,34 @@ +# iOS app with a dynamic framework that links a static framework + + +An example project demonstrating an iOS application linking a dynamic framework which itself depends on a static framework with transitive static dependencies. + +Only `Framework1.framework` should be linked and included into App, everything else should be statically linked into the Framework1 executable. + +``` +Workspace: + - App: + - MainApp (iOS app) + - MainAppTests (iOS unit tests) + - Framework1: + - Framework1 (dynamic iOS framework) + - Framework1Tests (iOS unit tests) + - Framework2: + - Framework2 (static iOS framework) + - Framework2Tests (iOS unit tests) + - Framework3: + - Framework3 (static iOS framework) + - Framework3Tests (iOS unit tests) + - Framework4: + - Framework4 (static iOS framework) + - Framework4Tests (iOS unit tests) +``` + +Dependencies: + +- App -> Framework1 +- Framework1 -> Framework2 +- Framework1 -> Framework3 +- Framework3 -> Framework4 + + diff --git a/fixtures/ios_app_with_frameworks/README.md b/fixtures/ios_app_with_frameworks/README.md new file mode 100644 index 00000000000..709a38c9145 --- /dev/null +++ b/fixtures/ios_app_with_frameworks/README.md @@ -0,0 +1,32 @@ +# iOS app with frameworks + + +Slightly more complicated project that consists of an iOS app and few frameworks. + +``` +Workspace: + - App: + - MainApp (iOS app) + - MainAppTests (iOS unit tests) + - Framework1: + - Framework1 (dynamic iOS framework) + - Framework1Tests (iOS unit tests) + - Framework2: + - Framework2 (dynamic iOS framework) + - Framework2Tests (iOS unit tests) + - Framework3: + - Framework3 (dynamic iOS framework) + - Framework4: + - Framework4 (dynamic iOS framework) + - Framework5: + - Framework5 (dynamic iOS framework) +``` + +Dependencies: + +- App -> Framework1 +- App -> Framework2 +- Framework1 -> Framework2 +- Framework2 -> Framework3 +- Framework3 -> Framework4 +- Framework4 -> Framework5 \ No newline at end of file diff --git a/fixtures/ios_app_with_helpers/README.md b/fixtures/ios_app_with_helpers/README.md new file mode 100644 index 00000000000..39cc669261c --- /dev/null +++ b/fixtures/ios_app_with_helpers/README.md @@ -0,0 +1,3 @@ +# iOS app with helpers + +A basic iOS app that leverages `ProjectDescriptionHelpers`. diff --git a/fixtures/ios_app_with_incompatible_dependencies/README.md b/fixtures/ios_app_with_incompatible_dependencies/README.md new file mode 100644 index 00000000000..29d0dedfbd5 --- /dev/null +++ b/fixtures/ios_app_with_incompatible_dependencies/README.md @@ -0,0 +1,3 @@ +# iOS app with incompatible dependencies + +An iOS app that has a dependency with a dependency on a framework for macOS. \ No newline at end of file diff --git a/fixtures/ios_app_with_incompatible_xcode/README.md b/fixtures/ios_app_with_incompatible_xcode/README.md new file mode 100644 index 00000000000..504c7379872 --- /dev/null +++ b/fixtures/ios_app_with_incompatible_xcode/README.md @@ -0,0 +1,3 @@ +# iOS app with incompatible Xcode + +An iOS app whose Config file requires an Xcode version that is not available in the system. \ No newline at end of file diff --git a/fixtures/ios_app_with_local_swift_package/README.md b/fixtures/ios_app_with_local_swift_package/README.md new file mode 100644 index 00000000000..89d7ab03c30 --- /dev/null +++ b/fixtures/ios_app_with_local_swift_package/README.md @@ -0,0 +1,3 @@ +# iOS app with a local Swift package + +An iOS application that depends on a local Swift package. \ No newline at end of file diff --git a/fixtures/ios_app_with_multi_configs/README.md b/fixtures/ios_app_with_multi_configs/README.md new file mode 100644 index 00000000000..f2f40c42d93 --- /dev/null +++ b/fixtures/ios_app_with_multi_configs/README.md @@ -0,0 +1,3 @@ +# iOS app with multiple configurations and an xcconfig + +A workspace that contains an application and frameworks that leverage multiple configurations (Debug, Beta and Release) each of which also has an associated xcconfig file within `ConfigurationFiles`. \ No newline at end of file diff --git a/fixtures/ios_app_with_on_demand_resources/README.md b/fixtures/ios_app_with_on_demand_resources/README.md new file mode 100644 index 00000000000..a5bddf95356 --- /dev/null +++ b/fixtures/ios_app_with_on_demand_resources/README.md @@ -0,0 +1,6 @@ +# iOS app with on demand resources + +An iOS applicaiton with on-demand resources. It contains file resources and asset catalogs associated with tags which in turn are distributed between three categories: +- Initial install tags +- Prefetch tag order +- Dowloaded only on demand \ No newline at end of file diff --git a/fixtures/ios_app_with_remote_swift_package/README.md b/fixtures/ios_app_with_remote_swift_package/README.md new file mode 100644 index 00000000000..14993460770 --- /dev/null +++ b/fixtures/ios_app_with_remote_swift_package/README.md @@ -0,0 +1,3 @@ +# iOS App with a remote Swift package + +An iOS application with a remote Swift package. \ No newline at end of file diff --git a/fixtures/ios_app_with_sdk/README.md b/fixtures/ios_app_with_sdk/README.md new file mode 100644 index 00000000000..fe15d894ce4 --- /dev/null +++ b/fixtures/ios_app_with_sdk/README.md @@ -0,0 +1,5 @@ +# iOS app with an SDK + +An application that contains an application target that depends on system libraries and frameworks (`.framework` and `.tbd`). + +One of the dependencies is declared as `.optional` i.e. will be linked weakly. \ No newline at end of file diff --git a/fixtures/ios_app_with_static_frameworks/README.md b/fixtures/ios_app_with_static_frameworks/README.md new file mode 100644 index 00000000000..903637fbeb7 --- /dev/null +++ b/fixtures/ios_app_with_static_frameworks/README.md @@ -0,0 +1,41 @@ +# iOS app with static frameworks + + +This fixture contains an application that depends on static frameworks, both directly and transitively. + +``` +Workspace: + - App: + - MainApp (iOS app) + - MainAppTests (iOS unit tests) + - Modules + - A: + - A (static framework iOS) + - ATests (iOS unit tests) + - B: + - B (static framework iOS) + - BTests (iOS unit tests) + - C: + - C (static framework iOS) + - CTests (iOS unit tests) + - D: + - D (dynamic framework iOS) +``` + +A standalone `Prebuilt` project is used to generate a prebuilt static framework: + +``` +- Prebuilt + - PrebuiltStaticFramework (static framework iOS) +``` + +Dependencies: + +- App -> A +- App -> C +- App -> PrebuiltStaticFramework +- A -> B +- A -> C +- C -> D + +Note: to re-create `PrebuiltStaticFramework.framework` run `ios_app_with_static_frameworks/Prebuilt//build.sh` \ No newline at end of file diff --git a/fixtures/ios_app_with_static_libraries/README.md b/fixtures/ios_app_with_static_libraries/README.md new file mode 100644 index 00000000000..9832024700e --- /dev/null +++ b/fixtures/ios_app_with_static_libraries/README.md @@ -0,0 +1,33 @@ +# iOS app with static libraries + + +This application provides a top level application with two static library dependencies. The first static library dependency has another static library dependency so that we are able to test how Tuist handles the transitiveness of the static libraries in the linked frameworks of the main app. + +``` +Workspace: + - App: + - MainApp (iOS app) + - MainAppTests (iOS unit tests) + - A: + - A (static library iOS) + - ATests (iOS unit tests) + - B: + - B (static library iOS) + - BTests (iOS unit tests) +``` + +A standalone C project is used to generate a prebuilt static library: + +``` + - C: + - C (static library iOS) + - CTests (iOS unit tests) +``` + +Dependencies: + +- App -> A +- A -> B +- A -> prebuild C (libC.a) + +Note: to re-create `libC.a` run `ios_app_with_static_libraries/Modules/C/build.sh` \ No newline at end of file diff --git a/fixtures/ios_app_with_static_library_and_package/README.md b/fixtures/ios_app_with_static_library_and_package/README.md new file mode 100644 index 00000000000..5213863c2e4 --- /dev/null +++ b/fixtures/ios_app_with_static_library_and_package/README.md @@ -0,0 +1,5 @@ +# iOS app with a static library and a package + +An iOS application that depends on static library that depends on Swift package where static library is defined first. + +Note: to re-create `PrebuiltStaticFramework.framework` run `ios_app_with_static_library_and_package/Prebuilt/build.sh` \ No newline at end of file diff --git a/fixtures/ios_app_with_tests/README.md b/fixtures/ios_app_with_tests/README.md new file mode 100644 index 00000000000..c3edb1919b2 --- /dev/null +++ b/fixtures/ios_app_with_tests/README.md @@ -0,0 +1,3 @@ +# iOS app with tests + +A simple iOS app with tests, which includes a setup manifest and uses `.notGrouped` autogenerated schemes. \ No newline at end of file diff --git a/fixtures/ios_app_with_transitive_framework/README.md b/fixtures/ios_app_with_transitive_framework/README.md new file mode 100644 index 00000000000..9ef4648a858 --- /dev/null +++ b/fixtures/ios_app_with_transitive_framework/README.md @@ -0,0 +1,25 @@ +# iOS app with a transitive framework + +``` +Workspace: + - App: + - MainApp (iOS app) + - MainAppTests (iOS unit tests) + - Framework1: + - Framework1 (dynamic iOS framework) + - Framework1Tests (iOS unit tests) +``` + +A standalone Framework2 project is used to generate a prebuilt dynamic framework: + +``` + - Framework2: + - Framework2 (dynamic iOS framework) +``` + +Dependencies: + +- App -> Framework1 +- Framework1 -> Framework2 (prebuilt) + +Note: to re-create `Framework2.framework` run `ios_app_with_transitive_framework/Framework2/build.sh` \ No newline at end of file diff --git a/fixtures/ios_app_with_xcframeworks/README.md b/fixtures/ios_app_with_xcframeworks/README.md new file mode 100644 index 00000000000..7f7bb68683e --- /dev/null +++ b/fixtures/ios_app_with_xcframeworks/README.md @@ -0,0 +1,19 @@ +# iOS app with xcframeworks + +``` +Workspace: + - App: + - MainApp (iOS app) + - MainAppTests (iOS unit tests) + - MyFramework: + - MyFramework (dynamic iOS framework) + - MyStaticFramework: + - MyStaticFramework (static iOS framework) + - MyStaticLibirary: + - MyStaticLibrary (static iOS libraries) +``` + +An example of an application which depends on prebuilt `.xcframework`s. + +The `.xcframework` can be obtained by running the `build.sh` script within the each of the xcframework directories +e.g. `ios_app_with_xcframeworks/XCFrameworks/MyFramework/build.sh`. \ No newline at end of file diff --git a/fixtures/ios_workspace_with_dependency_cycle/README.md b/fixtures/ios_workspace_with_dependency_cycle/README.md new file mode 100644 index 00000000000..f092838b117 --- /dev/null +++ b/fixtures/ios_workspace_with_dependency_cycle/README.md @@ -0,0 +1,3 @@ +# iOS workspace with a dependency cycle + +An example of a workspace that has a dependency cycle between targets in different projects. \ No newline at end of file diff --git a/fixtures/macos_app_with_extensions/README.md b/fixtures/macos_app_with_extensions/README.md new file mode 100644 index 00000000000..b3aa4872a80 --- /dev/null +++ b/fixtures/macos_app_with_extensions/README.md @@ -0,0 +1,3 @@ +# macOS app with extensions + +The project contains a macOS app with various types of extensions. \ No newline at end of file From d8361d9f42a800a1e380b214ab6d4f3233ea8de1 Mon Sep 17 00:00:00 2001 From: Tuist Date: Mon, 6 May 2024 17:10:57 +0000 Subject: [PATCH 266/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.12.0 --- .mise.toml | 2 +- CHANGELOG.md | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 96240ef7e6d..56377aa0d7e 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.11.0" +tuist = "4.12.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index 9345382b24a..b5867819f4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## 4.12.0 - 2024-05-06 + +### Tuist + +#### Added + +- Add On Demand Resources Support [#6178](https://github.com/tuist/tuist/pull/6178) by [@kapitoshka438](https://github.com/kapitoshka438) + +#### Fixed + +- Add (void) to generated Obj-C Bundle accessor [#6247](https://github.com/tuist/tuist/pull/6247) by [@freak4pc](https://github.com/freak4pc) + +### Tuist Cloud + +- no changes + ## 4.11.0 - 2024-04-29 ### Tuist From 3ccc5346b1457293979a455d92b700f414ba8999 Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Tue, 7 May 2024 08:24:02 -0400 Subject: [PATCH 267/509] Add Linting to require conditions for multiplatform dependencies with mismatched platforms. (#6251) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Extract dependency relationship linting to dedicated method * Add linting to ensure conditions are included for targets that dont supported all the required platforms of a target. * Linting * Reword error message * Update Sources/TuistGenerator/Linter/GraphLinter.swift Co-authored-by: Marek Fořt * One last string update --------- Co-authored-by: Marek Fořt --- .../TuistGenerator/Linter/GraphLinter.swift | 65 +++++++++++++++--- .../Linter/GraphLinterTests.swift | 66 +++++++++++++++++++ 2 files changed, 123 insertions(+), 8 deletions(-) diff --git a/Sources/TuistGenerator/Linter/GraphLinter.swift b/Sources/TuistGenerator/Linter/GraphLinter.swift index 7b19aab3034..2c4a86d86e5 100644 --- a/Sources/TuistGenerator/Linter/GraphLinter.swift +++ b/Sources/TuistGenerator/Linter/GraphLinter.swift @@ -89,6 +89,62 @@ public class GraphLinter: GraphLinting { private func lintDependencies(graphTraverser: GraphTraversing, config: Config) -> [LintingIssue] { var issues: [LintingIssue] = [] + + issues.append(contentsOf: lintDependencyRelationships(graphTraverser: graphTraverser)) + issues.append(contentsOf: lintLinkableDependencies(graphTraverser: graphTraverser)) + issues.append(contentsOf: staticProductsLinter.lint(graphTraverser: graphTraverser, config: config)) + issues.append(contentsOf: lintPrecompiledFrameworkDependencies(graphTraverser: graphTraverser)) + issues.append(contentsOf: lintPackageDependencies(graphTraverser: graphTraverser)) + issues.append(contentsOf: lintAppClip(graphTraverser: graphTraverser)) + + return issues + } + + private func lintLinkableDependencies(graphTraverser: GraphTraversing) -> [LintingIssue] { + let linkableProducts: Set = [ + .framework, + .staticFramework, + .staticLibrary, + .dynamicLibrary, + ] + + let dependencyIssues = graphTraverser.dependencies.flatMap { fromDependency, _ -> [LintingIssue] in + guard case let GraphDependency.target(fromTargetName, fromTargetPath) = fromDependency, + let fromTarget = graphTraverser.target(path: fromTargetPath, name: fromTargetName) else { return [] } + + let fromPlatforms = fromTarget.target.supportedPlatforms + + let dependencies: [LintingIssue] = graphTraverser.directTargetDependencies(path: fromTargetPath, name: fromTargetName) + .flatMap { dependentTarget in + guard linkableProducts.contains(dependentTarget.target.product) else { return [LintingIssue]() } + + var requiredPlatforms = fromPlatforms + + if let condition = dependentTarget.condition { + requiredPlatforms.formIntersection(Set(condition.platformFilters.compactMap(\.platform))) + } + + let platformsSupportedByDependency = dependentTarget.target.supportedPlatforms + let unaccountedPlatforms = requiredPlatforms.subtracting(platformsSupportedByDependency) + + if !unaccountedPlatforms.isEmpty { + let missingPlatforms = unaccountedPlatforms.map(\.rawValue).joined(separator: ", ") + return [LintingIssue( + reason: "Target \(fromTargetName) which depends on \(dependentTarget.target.name) does not support the required platforms: \(missingPlatforms). The dependency on \(dependentTarget.target.name) must have a dependency condition constraining to at most: \(platformsSupportedByDependency.map(\.rawValue).joined(separator: ", ")).", + severity: .error + )] + } else { + return [LintingIssue]() + } + } + + return dependencies + } + + return dependencyIssues + } + + private func lintDependencyRelationships(graphTraverser: GraphTraversing) -> [LintingIssue] { let dependencyIssues = graphTraverser.dependencies.flatMap { fromDependency, toDependencies -> [LintingIssue] in toDependencies.flatMap { toDependency -> [LintingIssue] in guard case let GraphDependency.target(fromTargetName, fromTargetPath) = fromDependency else { return [] } @@ -98,14 +154,7 @@ public class GraphLinter: GraphLinting { return lintDependency(from: fromTarget, to: toTarget) } } - - issues.append(contentsOf: dependencyIssues) - issues.append(contentsOf: staticProductsLinter.lint(graphTraverser: graphTraverser, config: config)) - issues.append(contentsOf: lintPrecompiledFrameworkDependencies(graphTraverser: graphTraverser)) - issues.append(contentsOf: lintPackageDependencies(graphTraverser: graphTraverser)) - issues.append(contentsOf: lintAppClip(graphTraverser: graphTraverser)) - - return issues + return dependencyIssues } private func lintDependency(from: GraphTarget, to: GraphTarget) -> [LintingIssue] { diff --git a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift index 4351a7da991..b8ae396bb27 100644 --- a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift @@ -1904,6 +1904,12 @@ final class GraphLinterTests: TuistUnitTestCase { .target(name: macOnlyTarget.name, path: path), ], .target(name: macOnlyTarget.name, path: path): [], + ], + dependencyConditions: [ + GraphEdge( + from: .target(name: iOSAndMacTarget.name, path: path), + to: .target(name: macOnlyTarget.name, path: path) + ): try .test([.macos]), ] ) let config = Config.test() @@ -1953,4 +1959,64 @@ final class GraphLinterTests: TuistUnitTestCase { // Then XCTAssertFalse(results.isEmpty) } + + func test_lint_multiDestinationTarget_dependsOnTargetWithFewerSupportedPlatforms() throws { + // Given + let path = try temporaryPath() + let iOSAndMacTarget = Target.test(name: "IOSAndMacTarget", destinations: [.iPhone, .mac], product: .framework) + let iOSOnlyTarget = Target.test(name: "iOSOnlyTarget", destinations: [.iPhone], product: .framework) + + let iOSApp = Target.test(name: "iOSApp", destinations: [.iPhone], product: .app) + let watchApp = Target.test( + name: "WatchApp", + destinations: [.appleWatch], + product: .watch2App, + bundleId: "io.tuist.iOSApp.WatchApp" + ) + + let project = Project.test( + path: path, + targets: [ + iOSAndMacTarget, + iOSOnlyTarget, + iOSApp, + watchApp, + ] + ) + let graph = Graph.test( + projects: [path: project], + targets: [ + path: [ + iOSAndMacTarget.name: iOSAndMacTarget, + iOSOnlyTarget.name: iOSOnlyTarget, + iOSApp.name: iOSApp, + watchApp.name: watchApp, + ], + ], + dependencies: [ + .target(name: iOSAndMacTarget.name, path: path): [ + .target(name: iOSOnlyTarget.name, path: path), + ], + .target(name: iOSOnlyTarget.name, path: path): [], + .target(name: iOSApp.name, path: path): [ + .target(name: watchApp.name, path: path), + ], + .target(name: watchApp.name, path: path): [], + ] + ) + let config = Config.test() + let graphTraverser = GraphTraverser(graph: graph) + + // When + let results = subject.lint(graphTraverser: graphTraverser, config: config) + + // Then + XCTAssertEqual( + results, + [LintingIssue( + reason: "Target IOSAndMacTarget which depends on iOSOnlyTarget does not support the required platforms: macos. The dependency on iOSOnlyTarget must have a dependency condition constraining to at most: ios.", + severity: .error + )] + ) + } } From 40a322f2c903593ada0ee51cc8fc286da66cd5f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 7 May 2024 15:53:44 +0200 Subject: [PATCH 268/509] Update the documentation of environment variables to configure the storage (#6259) --- docs/docs/cloud/on-premise.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/docs/cloud/on-premise.md b/docs/docs/cloud/on-premise.md index df1b5840b31..60eca20aa56 100644 --- a/docs/docs/cloud/on-premise.md +++ b/docs/docs/cloud/on-premise.md @@ -136,12 +136,14 @@ Once the app is created you'll need to set the following environment variables: | Environment variable | Description | Required | Default | Example | | --- | --- | --- | --- | --- | -| `TUIST_S3_ACCESS_KEY_ID` | The access key identifier | Yes | | `AKIAA2LQP3CCOZ6WT6CF` | -| `TUIST_S3_SECRET_ACCESS_KEY` | The access key secret | Yes | | `A2dAWLnB4k3px9DVunCsnV1fap/zkTx8+lIVcqry` | +| `TUIST_S3_ACCESS_KEY_ID`, `AWS_ACCESS_KEY_ID` | The access key identifier | Yes | | `AKIAA2LQP3CCOZ6WT6CF` | +| `TUIST_S3_SECRET_ACCESS_KEY`, `AWS_SECRET_ACCESS_KEY` | The access key secret | Yes | | `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` | | `TUIST_S3_BUCKET_NAME` | Name of the bucket | Yes | | `my-bucket` | -| `TUIST_S3_REGION` | The bucket's region | No | `eu-west-1` | `us-east-1` | +| `TUIST_S3_REGION`, `AWS_REGION` | The bucket's region | No | `eu-west-1` | `us-east-1` | | `TUIST_S3_ENDPOINT` | Custom endpoint | No | `https://amazonaws.com` | `https://custom-domain.com` | -| `AWS_PROFILE` | Set an [AWS profile](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-using-profiles) for authorization. Doesn't work with other storages | No | | `user1` | +| `TUIST_AWS_PROFILE`, `AWS_PROFILE` | Set an [AWS profile](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-using-profiles) for authorization. Doesn't work with other storages | No | | `user1` | +| `TUIST_AWS_SESSION_TOKEN`, `AWS_SESSION_TOKEN` | [Session token](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html) to authenticate requests | No | | `8ea7c2b4e79bec6f2990afe47f8439a44ed7dc4` | +| `TUIST_USE_SESSION_TOKEN` | When `1` it uses the [session token](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html) to authenticate requests | No | | `1` | For Google Cloud Storage, follow [these docs](https://cloud.google.com/storage/docs/authentication/managing-hmackeys) to get the `TUIST_S3_ACCESS_KEY_ID` and `TUIST_S3_SECRET_ACCESS_KEY` pair. The `TUIST_S3_ENDPOINT` should be set to `https://storage.googleapis.com`. Other environment variables are the same as for any other S3-compliant storage. From cb2a34ffb585d7011d425509fd116cf9c7f0acb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 7 May 2024 15:54:28 +0200 Subject: [PATCH 269/509] Remove trailing backslash from Cloud url (#6258) --- .../Cloud+ManifestMapper.swift | 2 +- .../Cloud+ManifestMapperTests.swift | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift diff --git a/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift index 9ca5bd4fcc6..97608f83ba8 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift @@ -28,7 +28,7 @@ enum CloudManifestMapperError: FatalError { extension TuistGraph.Cloud { static func from(manifest: ProjectDescription.Cloud) throws -> TuistGraph.Cloud { var cloudURL: URL! - if let manifestCloudURL = URL(string: manifest.url) { + if let manifestCloudURL = URL(string: manifest.url.dropSuffix("/")) { cloudURL = manifestCloudURL } else { throw CloudManifestMapperError.invalidCloudURL(manifest.url) diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift new file mode 100644 index 00000000000..f271ca378f2 --- /dev/null +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift @@ -0,0 +1,27 @@ +import Foundation +import TuistGraph +import XCTest + +@testable import TuistLoader +@testable import TuistSupportTesting + +final class CloudManifestMapperTests: TuistUnitTestCase { + func test_removes_trailing_back_slash_if_present_in_url() throws { + // When + let got = try TuistGraph.Cloud.from( + manifest: .cloud( + projectId: "tuist/tuist", + url: "https://cloud.tuist.io/" + ) + ) + + // Then + XCTAssertEqual( + got, + .test( + url: URL(string: "https://cloud.tuist.io")!, + projectId: "tuist/tuist" + ) + ) + } +} From 1bc3173776aa79083f2fe7e49a8ccc37b0a4c01e Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 7 May 2024 18:37:23 +0200 Subject: [PATCH 270/509] Set up Koala --- docs/.vitepress/config.mjs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index ff095d0288d..5e1ece0a323 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -166,6 +166,13 @@ export default defineConfig({ posthog.init('phc_pNR89Xu2WWDZdXReTnuePI7XO2Ktb2orTpzVWxHlBxq',{api_host:'https://eu.i.posthog.com'}) `, ], + [ + "script", + {}, + ` + !function(t){if(window.ko)return;window.ko=[],["identify","track","removeListeners","open","on","off","qualify","ready"].forEach(function(t){ko[t]=function(){var n=[].slice.call(arguments);return n.unshift(t),ko.push(n),ko}});var n=document.createElement("script");n.async=!0,n.setAttribute("src","https://cdn.getkoala.com/v1/pk_3f80a3529ec2914b714a3f740d10b12642b9/sdk.js"),(document.body || document.head).appendChild(n)}(); + `, + ], ], sitemap: { hostname: "https://docs.tuist.io", From 2d71fef7e67d3feb1f862a17739e373705ac57b5 Mon Sep 17 00:00:00 2001 From: Tuist Date: Tue, 7 May 2024 17:20:54 +0000 Subject: [PATCH 271/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.12.1 --- .mise.toml | 2 +- CHANGELOG.md | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 56377aa0d7e..04e35859246 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.12.0" +tuist = "4.12.1" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index b5867819f4a..9575d57869b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## 4.12.1 - 2024-05-07 + +### Tuist + +#### Added + +- Add Linting to require conditions for multiplatform dependencies with mismatched platforms. [#6251](https://github.com/tuist/tuist/pull/6251) by [@waltflanagan](https://github.com/waltflanagan) + +#### Fixed + +- Remove trailing backslash from Cloud url if present [#6258](https://github.com/tuist/tuist/pull/6258) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +- no changes + ## 4.12.0 - 2024-05-06 ### Tuist From d3ab9d146e163d469bf370d1108cebfcb8faeef4 Mon Sep 17 00:00:00 2001 From: ahmdyasser <42544598+ahmdyasser@users.noreply.github.com> Date: Mon, 13 May 2024 13:43:34 +0300 Subject: [PATCH 272/509] Update migrate-from-xcodegen.md (#6274) --- .../introduction/adopting-tuist/migrate-from-xcodegen.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodegen.md b/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodegen.md index 6705e70fa0a..31ba7ecccc3 100644 --- a/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodegen.md +++ b/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodegen.md @@ -11,7 +11,7 @@ next: [XcodeGen](https://github.com/yonaskolb/XcodeGen) is a project-generation tool that uses YAML as [a configuration format](https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md) to define Xcode projects. Many organizations **adopted it trying to escape from the frequent Git conflicts that arise when working with Xcode projects.** However, frequent Git conflicts is just one of the many problems that organizations experience. Xcode exposes developers with a lot of intricacies and implicit configurations that make it hard to maintain and optimize projects at scale. XcodeGen falls short there by design because it's a tool that generates Xcode projects, not a project manager. If you need a tool that helps you beyond generating Xcode projects, you might want to consider Tuist. > [!TIP] SWIFT OVER YAML -> Many organizations prefer Tuist as a project generation tool too because it uses Swift as a configuration format. Swift is a programming language that developers are familiar with, and that provides them with the convenience of using Xcode's autocompletion, type-checking, and validation features features. +> Many organizations prefer Tuist as a project generation tool too because it uses Swift as a configuration format. Swift is a programming language that developers are familiar with, and that provides them with the convenience of using Xcode's autocompletion, type-checking, and validation features. What follows are some considerations and guidelines to help you migrate your projects from XcodeGen to Tuist. @@ -81,4 +81,4 @@ let project = Project(name: "MyProject", ``` > [!NOTE] XCODEPROJGENERATOR -> We have plans to extract the project generation logic from Tuist into its own Swift Package, `XcodeProjGenerator`, which anyone can build their own generation tool on top of. \ No newline at end of file +> We have plans to extract the project generation logic from Tuist into its own Swift Package, `XcodeProjGenerator`, which anyone can build their own generation tool on top of. From 662e7dd50369999537502a49665e05d03f8ae07f Mon Sep 17 00:00:00 2001 From: Gorbenko Roman <45801227+rofle100lvl@users.noreply.github.com> Date: Mon, 13 May 2024 13:52:38 +0200 Subject: [PATCH 273/509] Resolve Documentation Collision for Extensions and Structs Sharing Names (#6270) * Added category to identifier of Type * Changed old links --- docs/.vitepress/config.mjs | 4 ++-- docs/docs/guide/project/dynamic-configuration.md | 2 +- docs/docs/guide/project/manifests.md | 6 +++--- docs/docs/guide/project/plugins.md | 2 +- .../project-description/{[type].md => [identifier].md} | 0 .../{[type].paths.js => [identifier].paths.js} | 2 +- docs/docs/reference/project-description/types.data.js | 9 ++++++--- 7 files changed, 14 insertions(+), 11 deletions(-) rename docs/docs/reference/project-description/{[type].md => [identifier].md} (100%) rename docs/docs/reference/project-description/{[type].paths.js => [identifier].paths.js} (82%) diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 5e1ece0a323..b974e784b75 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -24,7 +24,7 @@ function capitalize(text) { .filter((item) => item.category === category) .map((item) => ({ text: item.title, - link: `/reference/project-description/${item.name}`, + link: `/reference/project-description/${item.identifier}`, })), }); } @@ -219,7 +219,7 @@ export default defineConfig({ }, nav: [ { text: "Guide", link: "/" }, - { text: "Reference", link: "/reference/project-description/project" }, + { text: "Reference", link: "/reference/project-description/structs/project" }, { text: "Tuist Cloud", link: "/cloud/what-is-cloud" }, { text: "Contributors", link: "/contributors/get-started" }, { text: "Changelog", link: "https://github.com/tuist/tuist/releases" }, diff --git a/docs/docs/guide/project/dynamic-configuration.md b/docs/docs/guide/project/dynamic-configuration.md index b25543b5813..39ef6a27cec 100644 --- a/docs/docs/guide/project/dynamic-configuration.md +++ b/docs/docs/guide/project/dynamic-configuration.md @@ -23,7 +23,7 @@ TUIST_APP_NAME=MyApp TUIST_APP_LOCALE=pl tuist generate ## Reading the environment variables from manifests -Variables can be accessed using the [`Environment`](/reference/project-description/environment) type. Any variables following the convention `TUIST_XXX` defined in the environment or passed to Tuist when running commands will be accessible using the `Environment` type. The following example shows how we access the `TUIST_APP_NAME` variable: +Variables can be accessed using the [`Environment`](/reference/project-description/enums/environment) type. Any variables following the convention `TUIST_XXX` defined in the environment or passed to Tuist when running commands will be accessible using the `Environment` type. The following example shows how we access the `TUIST_APP_NAME` variable: ```swift func appName() -> String { diff --git a/docs/docs/guide/project/manifests.md b/docs/docs/guide/project/manifests.md index df6368f23bf..b7a42fd9bd3 100644 --- a/docs/docs/guide/project/manifests.md +++ b/docs/docs/guide/project/manifests.md @@ -14,7 +14,7 @@ The decision of using Swift was inspired by the [Swift Package Manager](https:// ## Project.swift -The [`Project.swift`](/reference/project-description/project) manifest declares an Xcode project. The project gets generated in the same directory where the manifest file is located with the name indicated in the `name` property. +The [`Project.swift`](/reference/project-description/structs/project) manifest declares an Xcode project. The project gets generated in the same directory where the manifest file is located with the name indicated in the `name` property. ```swift // Project.swift @@ -32,7 +32,7 @@ let project = Project( ## Workspace.swift -By default, Tuist generates an [Xcode Workspace](https://developer.apple.com/documentation/xcode/projects-and-workspaces) containing the project being generated and the projects of its dependencies. If for any reason you'd like to customize the workspace to add additional projects or include files and groups, you can do so by defining a [`Workspace.swift`](/reference/project-description/workspace) manifest. +By default, Tuist generates an [Xcode Workspace](https://developer.apple.com/documentation/xcode/projects-and-workspaces) containing the project being generated and the projects of its dependencies. If for any reason you'd like to customize the workspace to add additional projects or include files and groups, you can do so by defining a [`Workspace.swift`](/reference/project-description/structs/workspace) manifest. ```swift // Workspace.swift @@ -57,7 +57,7 @@ In the Tuist project we lean on mono-projects because the cold generation time i ## Config.swift -Tuist provides [sensible defaults](/contributors/principles.html#default-to-conventions) to simplify project configuration. However, you can customize the configuration by defining a [`Config.swift`](/reference/project-description/config) manifest under the `Tuist` directory, which is used by Tuist to determine the root of the project. +Tuist provides [sensible defaults](/contributors/principles.html#default-to-conventions) to simplify project configuration. However, you can customize the configuration by defining a [`Config.swift`](/reference/project-description/structs/config) manifest under the `Tuist` directory, which is used by Tuist to determine the root of the project. ```swift import ProjectDescription diff --git a/docs/docs/guide/project/plugins.md b/docs/docs/guide/project/plugins.md index a89f1c54559..77e6e615ce3 100644 --- a/docs/docs/guide/project/plugins.md +++ b/docs/docs/guide/project/plugins.md @@ -101,7 +101,7 @@ If you were using Tuist for distributing tasks, we recommend building your ## Using plugins -To use a plugin, you'll have to add it to your project's [`Config.swift`](/reference/project-description/config) manifest file: +To use a plugin, you'll have to add it to your project's [`Config.swift`](/reference/project-description/structs/config) manifest file: ```swift import ProjectDescription diff --git a/docs/docs/reference/project-description/[type].md b/docs/docs/reference/project-description/[identifier].md similarity index 100% rename from docs/docs/reference/project-description/[type].md rename to docs/docs/reference/project-description/[identifier].md diff --git a/docs/docs/reference/project-description/[type].paths.js b/docs/docs/reference/project-description/[identifier].paths.js similarity index 82% rename from docs/docs/reference/project-description/[type].paths.js rename to docs/docs/reference/project-description/[identifier].paths.js index 839cc9fd69e..684c3174bd8 100644 --- a/docs/docs/reference/project-description/[type].paths.js +++ b/docs/docs/reference/project-description/[identifier].paths.js @@ -4,7 +4,7 @@ export default { paths() { return typesDataLoader.load().map((item) => { return { - params: { type: item.name, title: item.title, description: item.description }, + params: { type: item.name, title: item.title, description: item.description, identifier: item.identifier }, content: item.content } }) diff --git a/docs/docs/reference/project-description/types.data.js b/docs/docs/reference/project-description/types.data.js index 8332ded18be..e219f4da395 100644 --- a/docs/docs/reference/project-description/types.data.js +++ b/docs/docs/reference/project-description/types.data.js @@ -16,10 +16,13 @@ export default { }) .sort(); return files.map((file) => { + const category = path.basename(path.dirname(file)) + const fileName = path.basename(file).replace(".md", "") return { - category: path.basename(path.dirname(file)), - title: path.basename(file).replace(".md", ""), - name: path.basename(file).replace(".md", "").toLowerCase(), + category: category, + title: fileName, + name: fileName.toLowerCase(), + identifier: category + "/" + fileName.toLowerCase(), description: "", content: fs.readFileSync(file, "utf-8"), }; From cbdeb22c8ea98b0ceaf7acd80e17cc55f648db52 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 13:52:49 +0200 Subject: [PATCH 274/509] add rofle100lvl as a contributor for doc (#6276) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index dc1030498d2..6dc970410d7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1346,6 +1346,15 @@ "contributions": [ "code" ] + }, + { + "login": "rofle100lvl", + "name": "Gorbenko Roman", + "avatar_url": "https://avatars.githubusercontent.com/u/45801227?v=4", + "profile": "https://github.com/rofle100lvl", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 8a8fa8077cc..00f1b72c9f0 100644 --- a/README.md +++ b/README.md @@ -527,6 +527,7 @@ Thanks goes to these wonderful people:
    Alexander Filimonov
    +
    Gorbenko Roman
    From e9d5c9b45c34e1d5a291791f6395356eeb9d5e65 Mon Sep 17 00:00:00 2001 From: Kabir Khan Date: Mon, 13 May 2024 14:37:45 +0200 Subject: [PATCH 275/509] Fix Doc C typos (#6277) --- Sources/ProjectDescription/Destination.swift | 6 +++--- Sources/TuistGraph/Models/RunActionOptions.swift | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/ProjectDescription/Destination.swift b/Sources/ProjectDescription/Destination.swift index 29a7d815e60..d8faa0ac330 100644 --- a/Sources/ProjectDescription/Destination.swift +++ b/Sources/ProjectDescription/Destination.swift @@ -1,9 +1,9 @@ import Foundation -/// Set of deployment destinstions +/// Set of deployment destinations public typealias Destinations = Set -/// Convenience collections of desitions mapped to platforms terminology. +/// Convenience collections of destinations mapped to platforms terminology. extension Destinations { public static var watchOS: Destinations = [.appleWatch] /// Currently we omit `.visionOSwithiPadDesign` from our default because `visionOS` is unreleased. @@ -14,7 +14,7 @@ extension Destinations { } extension Destinations { - /// Convience set of platforms that are supported by a set of destinations + /// Convenience set of platforms that are supported by a set of destinations public var platforms: Set { let platforms = map(\.platform) return Set(platforms) diff --git a/Sources/TuistGraph/Models/RunActionOptions.swift b/Sources/TuistGraph/Models/RunActionOptions.swift index 1faaa026ff9..3fe6dc8d5e4 100644 --- a/Sources/TuistGraph/Models/RunActionOptions.swift +++ b/Sources/TuistGraph/Models/RunActionOptions.swift @@ -35,7 +35,7 @@ public struct RunActionOptions: Equatable, Codable { /// /// - enableGPUFrameCaptureMode: The Metal Frame Capture mode to use. e.g: .disabled /// If your target links to the Metal framework, Xcode enables GPU Frame Capture. - /// You can disable it to test your app in best perfomance. + /// You can disable it to test your app in best performance. public init( language: String? = nil, From 60aceac9552c303349b61349235440df35346dcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 13 May 2024 17:51:18 +0200 Subject: [PATCH 276/509] Add docs for domain-based authorization (#6278) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add docs for domain-based authorization * Update docs/docs/cloud/get-started.md Co-authored-by: Pedro Piñera Buendía <663605+pepicrft@users.noreply.github.com> --------- Co-authored-by: Pedro Piñera Buendía <663605+pepicrft@users.noreply.github.com> --- docs/docs/cloud/get-started.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/docs/cloud/get-started.md b/docs/docs/cloud/get-started.md index f626da0006d..e67456a4966 100644 --- a/docs/docs/cloud/get-started.md +++ b/docs/docs/cloud/get-started.md @@ -45,6 +45,15 @@ If you are part of an organization to which you want to invite other members, yo tuist cloud organization create my-organization # Create organization ``` +### Organization SSO + +If you have a Google Workspace organization and you want any developer who signs in with the same Google hosted domain to be added to your Tuist organization, you can set it up with: +```bash +tuist cloud organization update sso my-organization --provider google --organization-id my-domain.com +``` + +> [!IMPORTANT] +> You must be authenticated with Google using an email tied to the organization whose domain you are setting up. ## Create a project The next step is to create a project. You can easily do that with the following command: From 03c54acb137687b8afc31328d37c4f304ee75d44 Mon Sep 17 00:00:00 2001 From: Eduard Miniakhmetov Date: Tue, 14 May 2024 09:50:38 +0300 Subject: [PATCH 277/509] Enclose package name inside quotes if it contains spaces (#6264) * Enclose package name inside quotes if it contains spaces * Add test --- .../TuistAcceptanceFixtures.swift | 3 ++ .../Graph/DependenciesGraph+TestData.swift | 2 +- .../PackageInfoMapper.swift | 2 +- .../Extensions/String+Extras.swift | 9 ++++ .../BuildAcceptanceTests.swift | 9 ++++ .../DependenciesAcceptanceTests.swift | 10 +++++ .../PackageInfoMapperTests.swift | 42 ++++++++++++++++++- .../AccentColor.colorset/Contents.json | 11 +++++ .../AppIcon.appiconset/Contents.json | 13 ++++++ .../Resources/Assets.xcassets/Contents.json | 6 +++ .../Preview Assets.xcassets/Contents.json | 6 +++ .../App/Sources/AppApp.swift | 10 +++++ .../App/Sources/ContentView.swift | 24 +++++++++++ .../AppTests/AppTests.swift | 20 +++++++++ .../Project.swift | 31 ++++++++++++++ .../ios_app_with_spm_dependencies/README.md | 3 ++ .../Tuist/Package.resolved | 15 +++++++ .../Tuist/Package.swift | 10 +++++ 18 files changed, 223 insertions(+), 3 deletions(-) create mode 100644 fixtures/ios_app_with_spm_dependencies/App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 fixtures/ios_app_with_spm_dependencies/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 fixtures/ios_app_with_spm_dependencies/App/Resources/Assets.xcassets/Contents.json create mode 100644 fixtures/ios_app_with_spm_dependencies/App/Resources/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 fixtures/ios_app_with_spm_dependencies/App/Sources/AppApp.swift create mode 100644 fixtures/ios_app_with_spm_dependencies/App/Sources/ContentView.swift create mode 100644 fixtures/ios_app_with_spm_dependencies/AppTests/AppTests.swift create mode 100644 fixtures/ios_app_with_spm_dependencies/Project.swift create mode 100644 fixtures/ios_app_with_spm_dependencies/README.md create mode 100644 fixtures/ios_app_with_spm_dependencies/Tuist/Package.resolved create mode 100644 fixtures/ios_app_with_spm_dependencies/Tuist/Package.swift diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift index 57cb9127aa2..cd515bd21ba 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift @@ -39,6 +39,7 @@ public enum TuistAcceptanceFixtures { case iosAppWithOnDemandResources case iosAppWithPluginsAndTemplates case iosAppWithPrivacyManifest + case iosAppWithSpmDependencies case iosAppWithRemoteBinarySwiftPackage case iosAppWithRemoteSwiftPackage case iosAppWithStaticFrameworks @@ -142,6 +143,8 @@ public enum TuistAcceptanceFixtures { return "ios_app_with_multi_configs" case .iosAppWithOnDemandResources: return "ios_app_with_on_demand_resources" + case .iosAppWithSpmDependencies: + return "ios_app_with_spm_dependencies" case .iosAppWithPluginsAndTemplates: return "ios_app_with_plugins_and_templates" case .iosAppWithPrivacyManifest: diff --git a/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift b/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift index ca330d75b45..1cc8e7e65c2 100644 --- a/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift +++ b/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift @@ -676,7 +676,7 @@ extension DependenciesGraph { "FRAMEWORK_SEARCH_PATHS": ["$(inherited)", "$(PLATFORM_DIR)/Developer/Library/Frameworks"], "GCC_NO_COMMON_BLOCKS": "NO", "USE_HEADERMAP": "NO", - "OTHER_SWIFT_FLAGS": ["-package-name", packageName], + "OTHER_SWIFT_FLAGS": ["-package-name", packageName.quotedIfContainsSpaces], ] var settingsDictionary = customSettings.merging(defaultSpmSettings, uniquingKeysWith: { custom, _ in custom }) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index a8da43d12b3..94c09ccefdd 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -295,7 +295,7 @@ public final class PackageInfoMapper: PackageInfoMapping { let baseSettings = packageSettings.baseSettings.with( base: packageSettings.baseSettings.base.combine( with: [ - "OTHER_SWIFT_FLAGS": ["$(inherited)", "-package-name", packageInfo.name], + "OTHER_SWIFT_FLAGS": ["$(inherited)", "-package-name", packageInfo.name.quotedIfContainsSpaces], ] ) ) diff --git a/Sources/TuistSupport/Extensions/String+Extras.swift b/Sources/TuistSupport/Extensions/String+Extras.swift index 747068d554d..55a713fadab 100644 --- a/Sources/TuistSupport/Extensions/String+Extras.swift +++ b/Sources/TuistSupport/Extensions/String+Extras.swift @@ -223,6 +223,15 @@ extension String { return true } } + + /// Encloses the current string inside quotes if it contains spaces + public var quotedIfContainsSpaces: String { + if contains(" ") { + return "\"\(self)\"" + } else { + return self + } + } } extension Array where Element: CustomStringConvertible { diff --git a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift index 1a2aefd9dff..1a44a25945a 100644 --- a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift +++ b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift @@ -152,3 +152,12 @@ final class BuildAcceptanceTestMultiplatformAppWithMacrosAndEmbeddedWatchOSApp: try await run(BuildCommand.self, "App", "--platform", "ios") } } + +final class BuildAcceptanceTestIosAppWithSPMDependencies: TuistAcceptanceTestCase { + func test() async throws { + try setUpFixture(.iosAppWithSpmDependencies) + try await run(InstallCommand.self) + try await run(GenerateCommand.self) + try await run(BuildCommand.self, "App", "--platform", "ios") + } +} diff --git a/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift b/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift index b7ddeebafa3..f87a4dcaeb9 100644 --- a/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift +++ b/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift @@ -31,3 +31,13 @@ final class DependenciesAcceptanceTestAppWithSPMDependenciesWithoutInstall: Tuis XCTFail("Generate should have failed.") } } + +final class DependenciesAcceptanceTestIosAppWithSPMDependencies: TuistAcceptanceTestCase { + func test_ios_app_spm_dependencies() async throws { + try setUpFixture(.iosAppWithSpmDependencies) + try await run(InstallCommand.self) + try await run(GenerateCommand.self) + try await run(BuildCommand.self, "App") + try await run(TestCommand.self, "App") + } +} diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 4e069310138..31d54cf908a 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -3223,6 +3223,46 @@ final class PackageInfoMapperTests: TuistUnitTestCase { expectedTargets ) } + + func testMap_whenTargetNameContainsSpaces() throws { + let packageName = "Package With Space" + let basePath = try temporaryPath() + let sourcesPath = basePath.appending(try RelativePath(validating: "\(packageName)/Sources/Target1")) + try fileHandler.createFolder(sourcesPath) + + let project = try subject.map( + package: packageName, + basePath: basePath, + packageInfos: [ + packageName: .init( + name: packageName, + products: [ + .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), + ], + targets: [ + .test(name: "Target1"), + ], + platforms: [.ios], + cLanguageStandard: nil, + cxxLanguageStandard: nil, + swiftLanguageVersions: nil + ), + ] + ) + XCTAssertBetterEqual( + project, + .testWithDefaultConfigs( + name: packageName, + targets: [ + .test( + "Target1", + packageName: packageName, + basePath: basePath + ), + ] + ) + ) + } } private func defaultSpmResources(_ target: String, customPath: String? = nil) -> ProjectDescription.ResourceFileElements { @@ -3394,7 +3434,7 @@ extension ProjectDescription.Target { // swiftlint:disable:next force_try sources = .sourceFilesList(globs: [ - basePath.appending(try! RelativePath(validating: "Package/Sources/\(name)/**")) + basePath.appending(try! RelativePath(validating: "\(packageName)/Sources/\(name)/**")) .pathString, ]) } diff --git a/fixtures/ios_app_with_spm_dependencies/App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/fixtures/ios_app_with_spm_dependencies/App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000000..eb878970081 --- /dev/null +++ b/fixtures/ios_app_with_spm_dependencies/App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_spm_dependencies/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/fixtures/ios_app_with_spm_dependencies/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..13613e3ee1a --- /dev/null +++ b/fixtures/ios_app_with_spm_dependencies/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_spm_dependencies/App/Resources/Assets.xcassets/Contents.json b/fixtures/ios_app_with_spm_dependencies/App/Resources/Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/ios_app_with_spm_dependencies/App/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_spm_dependencies/App/Resources/Preview Content/Preview Assets.xcassets/Contents.json b/fixtures/ios_app_with_spm_dependencies/App/Resources/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/ios_app_with_spm_dependencies/App/Resources/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_spm_dependencies/App/Sources/AppApp.swift b/fixtures/ios_app_with_spm_dependencies/App/Sources/AppApp.swift new file mode 100644 index 00000000000..1295f66aa3e --- /dev/null +++ b/fixtures/ios_app_with_spm_dependencies/App/Sources/AppApp.swift @@ -0,0 +1,10 @@ +import SwiftUI + +@main +struct AppApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/fixtures/ios_app_with_spm_dependencies/App/Sources/ContentView.swift b/fixtures/ios_app_with_spm_dependencies/App/Sources/ContentView.swift new file mode 100644 index 00000000000..fdd6050bbf1 --- /dev/null +++ b/fixtures/ios_app_with_spm_dependencies/App/Sources/ContentView.swift @@ -0,0 +1,24 @@ +import Buy +import Pay +import SwiftUI + +struct ContentView: View { + init() { + // Use Mobile Buy SDK + _ = Card.CreditCard(firstName: "", lastName: "", number: "", expiryMonth: "", expiryYear: "") + _ = PayAddress() + } + + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + Text("Hello, world!") + } + .padding() + } +} + +#Preview { + ContentView() +} diff --git a/fixtures/ios_app_with_spm_dependencies/AppTests/AppTests.swift b/fixtures/ios_app_with_spm_dependencies/AppTests/AppTests.swift new file mode 100644 index 00000000000..d62dc3d9072 --- /dev/null +++ b/fixtures/ios_app_with_spm_dependencies/AppTests/AppTests.swift @@ -0,0 +1,20 @@ +import XCTest +@testable import App + +final class AppTests: 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. + } +} diff --git a/fixtures/ios_app_with_spm_dependencies/Project.swift b/fixtures/ios_app_with_spm_dependencies/Project.swift new file mode 100644 index 00000000000..5da81033323 --- /dev/null +++ b/fixtures/ios_app_with_spm_dependencies/Project.swift @@ -0,0 +1,31 @@ +import ProjectDescription + +let project = Project( + name: "App", + targets: [ + .target( + name: "App", + destinations: .iOS, + product: .app, + bundleId: "io.tuist.app", + deploymentTargets: .iOS("14.0"), + infoPlist: .default, + sources: "App/Sources/**", + resources: "App/Resources/**", + dependencies: [ + .external(name: "Buy"), + .external(name: "Pay"), + ] + ), + .target( + name: "AppTests", + destinations: .iOS, + product: .unitTests, + bundleId: "io.tuist.app.tests", + deploymentTargets: .iOS("14.0"), + infoPlist: .default, + sources: "AppTests/**", + dependencies: [.target(name: "App")] + ), + ] +) diff --git a/fixtures/ios_app_with_spm_dependencies/README.md b/fixtures/ios_app_with_spm_dependencies/README.md new file mode 100644 index 00000000000..2b052bf2b94 --- /dev/null +++ b/fixtures/ios_app_with_spm_dependencies/README.md @@ -0,0 +1,3 @@ +# iOS app with SPM dependencies + +An iOS application project with various SPM dependencies. \ No newline at end of file diff --git a/fixtures/ios_app_with_spm_dependencies/Tuist/Package.resolved b/fixtures/ios_app_with_spm_dependencies/Tuist/Package.resolved new file mode 100644 index 00000000000..050a192d473 --- /dev/null +++ b/fixtures/ios_app_with_spm_dependencies/Tuist/Package.resolved @@ -0,0 +1,15 @@ +{ + "originHash" : "6ed714a381b77d6163cdedad8446d73742573b78187635c59175fa22d0a3df2c", + "pins" : [ + { + "identity" : "mobile-buy-sdk-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Shopify/mobile-buy-sdk-ios", + "state" : { + "revision" : "6bd23c2f6243f73ef6ec135723d4909bc068409e", + "version" : "12.0.0" + } + } + ], + "version" : 3 +} diff --git a/fixtures/ios_app_with_spm_dependencies/Tuist/Package.swift b/fixtures/ios_app_with_spm_dependencies/Tuist/Package.swift new file mode 100644 index 00000000000..588a3a7506d --- /dev/null +++ b/fixtures/ios_app_with_spm_dependencies/Tuist/Package.swift @@ -0,0 +1,10 @@ +// swift-tools-version: 5.10 +import PackageDescription + +let package = Package( + name: "PackageName", + dependencies: [ + // Has space symbols in package name + .package(url: "https://github.com/Shopify/mobile-buy-sdk-ios", exact: "12.0.0"), + ] +) From 1cbbec091133488d9a672ac9d0038f4ed68158b6 Mon Sep 17 00:00:00 2001 From: danibachar Date: Tue, 14 May 2024 00:52:43 -0600 Subject: [PATCH 278/509] Align bundle name with dashes sanitizing with SPM (#6265) * Fix issue where bundle target name and product name diverge due to replace - with _ * fixed fixture localization table * adding additional test to trigger ci --------- Co-authored-by: Daniel Bachar --- Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift | 2 +- .../ProjectMappers/ResourcesProjectMapperTests.swift | 2 ++ .../app_with_spm_dependencies/App/Sources/App/AppDelegate.swift | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 7fb209c2fd2..41162489e41 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -44,7 +44,7 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this name: bundleName, destinations: target.destinations, product: .bundle, - productName: nil, + productName: bundleName, bundleId: "\(target.bundleId).resources", deploymentTargets: target.deploymentTargets, infoPlist: .extendingDefault(with: [:]), diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 04162da4ddb..67bc431488c 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -440,6 +440,8 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then XCTAssertEqual(expectedBundleName, bundleTarget.name) + XCTAssertEqual(expectedBundleName, bundleTarget.productName) + XCTAssertEqual(2, gotProject.targets.count) // One code target, one bundle target } // MARK: - Verifiers diff --git a/fixtures/app_with_spm_dependencies/App/Sources/App/AppDelegate.swift b/fixtures/app_with_spm_dependencies/App/Sources/App/AppDelegate.swift index 45aaeb9e54d..7706415911f 100644 --- a/fixtures/app_with_spm_dependencies/App/Sources/App/AppDelegate.swift +++ b/fixtures/app_with_spm_dependencies/App/Sources/App/AppDelegate.swift @@ -40,7 +40,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { let brazeUILocalizedString = BrazeUIResources.bundle?.localizedString( forKey: "braze.in-app-message.close-button.title", value: nil, - table: nil + table: "InAppMessageLocalizable" ) precondition(brazeUILocalizedString == "Close", "Failed to fetch localized resource from BrazeUI") From 4b07b9476492b07e8712e25de56390b39fb0d0ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 14 May 2024 12:57:35 +0200 Subject: [PATCH 279/509] Remove HTTPResource (#6282) --- Sources/TuistCore/Cloud/CloudClienting.swift | 6 -- Sources/TuistCore/Cloud/CloudResponse.swift | 15 ---- .../TuistCore/Cloud/CloudResponseError.swift | 20 ----- .../Cloud/CloudResponse+TestData.swift | 8 -- .../Cloud/CloudResponseError+TestData.swift | 14 --- .../Cloud/MockCloudClient.swift | 77 ---------------- .../HTTP/HTTPRequestDispatcher.swift | 88 ------------------- Sources/TuistSupport/HTTP/HTTPResource.swift | 82 ----------------- .../Extensions/XCTestCase+Extras.swift | 71 --------------- .../HTTP/HTTPResource+TestData.swift | 24 ----- .../HTTP/MockHTTPRequestDispatcher.swift | 22 ----- 11 files changed, 427 deletions(-) delete mode 100644 Sources/TuistCore/Cloud/CloudClienting.swift delete mode 100644 Sources/TuistCore/Cloud/CloudResponse.swift delete mode 100644 Sources/TuistCore/Cloud/CloudResponseError.swift delete mode 100644 Sources/TuistCoreTesting/Cloud/CloudResponse+TestData.swift delete mode 100644 Sources/TuistCoreTesting/Cloud/CloudResponseError+TestData.swift delete mode 100644 Sources/TuistCoreTesting/Cloud/MockCloudClient.swift delete mode 100644 Sources/TuistSupport/HTTP/HTTPRequestDispatcher.swift delete mode 100644 Sources/TuistSupport/HTTP/HTTPResource.swift delete mode 100644 Sources/TuistSupportTesting/HTTP/HTTPResource+TestData.swift delete mode 100644 Sources/TuistSupportTesting/HTTP/MockHTTPRequestDispatcher.swift diff --git a/Sources/TuistCore/Cloud/CloudClienting.swift b/Sources/TuistCore/Cloud/CloudClienting.swift deleted file mode 100644 index cc81ce8257b..00000000000 --- a/Sources/TuistCore/Cloud/CloudClienting.swift +++ /dev/null @@ -1,6 +0,0 @@ -import Foundation -import TuistSupport - -public protocol CloudClienting { - func request(_ resource: HTTPResource) async throws -> (object: T, response: HTTPURLResponse) -} diff --git a/Sources/TuistCore/Cloud/CloudResponse.swift b/Sources/TuistCore/Cloud/CloudResponse.swift deleted file mode 100644 index 3f9d929eabf..00000000000 --- a/Sources/TuistCore/Cloud/CloudResponse.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation - -public struct CloudResponse: Decodable { - public let status: String - public let data: T - - public init(status: String, data: T) { - self.status = status - self.data = data - } -} - -public struct CloudEmptyResponse: Decodable { - public init() {} -} diff --git a/Sources/TuistCore/Cloud/CloudResponseError.swift b/Sources/TuistCore/Cloud/CloudResponseError.swift deleted file mode 100644 index 2a3eda429ac..00000000000 --- a/Sources/TuistCore/Cloud/CloudResponseError.swift +++ /dev/null @@ -1,20 +0,0 @@ -import Foundation -import TuistSupport - -public struct CloudResponseError: Decodable, LocalizedError, Equatable { - public var status: String - public var errors: [Error]? - - public struct Error: Decodable, Equatable { - var code: String - var message: String - } - - public var errorDescription: String? { - errors?.map { $0.message.capitalizingFirstLetter() }.joined(separator: "\n") - } -} - -public struct CloudEmptyResponseError: Decodable, LocalizedError, Equatable { - public init() {} -} diff --git a/Sources/TuistCoreTesting/Cloud/CloudResponse+TestData.swift b/Sources/TuistCoreTesting/Cloud/CloudResponse+TestData.swift deleted file mode 100644 index 6b093651d38..00000000000 --- a/Sources/TuistCoreTesting/Cloud/CloudResponse+TestData.swift +++ /dev/null @@ -1,8 +0,0 @@ -import Foundation -@testable import TuistCore - -extension CloudResponse { - static func test(status: String = "status", data: T) -> CloudResponse { - CloudResponse(status: status, data: data) - } -} diff --git a/Sources/TuistCoreTesting/Cloud/CloudResponseError+TestData.swift b/Sources/TuistCoreTesting/Cloud/CloudResponseError+TestData.swift deleted file mode 100644 index 9cac0a21de5..00000000000 --- a/Sources/TuistCoreTesting/Cloud/CloudResponseError+TestData.swift +++ /dev/null @@ -1,14 +0,0 @@ -import Foundation -@testable import TuistCore - -extension CloudResponseError.Error { - public static func test(code: String = "Code", message: String = "Message") -> CloudResponseError.Error { - .init(code: code, message: message) - } -} - -extension CloudResponseError { - public static func test(status: String = "Error status", errors: [Error]? = [.test()]) -> CloudResponseError { - .init(status: status, errors: errors) - } -} diff --git a/Sources/TuistCoreTesting/Cloud/MockCloudClient.swift b/Sources/TuistCoreTesting/Cloud/MockCloudClient.swift deleted file mode 100644 index 09f4f3b038b..00000000000 --- a/Sources/TuistCoreTesting/Cloud/MockCloudClient.swift +++ /dev/null @@ -1,77 +0,0 @@ -import Foundation -import TuistSupport - -@testable import TuistCore - -public enum MockCloudClientingError: Error { - case mockedError -} - -public final class MockCloudClient: CloudClienting { - public init() {} - - // MARK: Factories - - public var invokedRequest = false - public var invokedRequestCount = 0 - public var invokedRequestParameterList = [Any]() - - private var stubbedResponse: HTTPURLResponse? - private var stubbedObject: Any? - private var stubbedError: Error? - - public var stubbedResponsePerURLRequest: [URLRequest: HTTPURLResponse] = [:] - public var stubbedObjectPerURLRequest: [URLRequest: Any] = [:] - public var stubbedErrorPerURLRequest: [URLRequest: Error] = [:] - - // MARK: Configurations - - public func mock(error: Error) { - stubbedError = error - stubbedObject = nil - stubbedResponse = nil - } - - public func mock(object: Any, response: HTTPURLResponse) { - stubbedError = nil - stubbedObject = object - stubbedResponse = response - } - - public func mock( - responsePerURLRequest: [URLRequest: HTTPURLResponse] = [:], - objectPerURLRequest: [URLRequest: Any] = [:], - errorPerURLRequest: [URLRequest: Error] = [:] - ) { - stubbedError = nil - stubbedObject = nil - stubbedResponse = HTTPURLResponse.test() - stubbedResponsePerURLRequest = responsePerURLRequest - stubbedObjectPerURLRequest = objectPerURLRequest - stubbedErrorPerURLRequest = errorPerURLRequest - } - - // MARK: Public Interface - - public func request(_ resource: HTTPResource) async throws -> (object: T, response: HTTPURLResponse) { - invokedRequest = true - invokedRequestCount += 1 - invokedRequestParameterList.append(resource) - - let urlRequest = resource.request() - let errorCandidate = stubbedErrorPerURLRequest[urlRequest] ?? stubbedError - if let error = errorCandidate { - throw error - } else { - let objectCandidate = stubbedObjectPerURLRequest[urlRequest] ?? stubbedObject - guard let object = objectCandidate as? T - else { - fatalError( - "This function input parameter type should be the same as the one provided in this object's initializer.\nReceived type: \(String(describing: objectCandidate.self))\nExpected type: \(T.self)" - ) - } - let responseCandidate = stubbedResponsePerURLRequest[urlRequest] ?? stubbedResponse - return (object, responseCandidate!) - } - } -} diff --git a/Sources/TuistSupport/HTTP/HTTPRequestDispatcher.swift b/Sources/TuistSupport/HTTP/HTTPRequestDispatcher.swift deleted file mode 100644 index 9e9a25dad88..00000000000 --- a/Sources/TuistSupport/HTTP/HTTPRequestDispatcher.swift +++ /dev/null @@ -1,88 +0,0 @@ -import Combine -import Foundation - -public enum HTTPRequestDispatcherError: LocalizedError, FatalError { - case urlSessionError(URLRequest, Error) - case parseError(URLRequest, Error) - case invalidResponse(URLRequest) - case serverSideError(URLRequest, Error, HTTPURLResponse) - - // MARK: - LocalizedError - - public var errorDescription: String? { description } - - // MARK: - FatalError - - public var description: String { - switch self { - case let .urlSessionError(request, error): - return "Received a session error when performing \(request.descriptionForError): \(error.localizedDescription)" - case let .parseError(request, error): - return "Error parsing the network response of \(request.descriptionForError): \(error.localizedDescription)" - case let .invalidResponse(request): - return "Received unexpected response from the network when performing \(request.descriptionForError)" - case let .serverSideError(request, error, response): - return """ - Error returned by the server when performing \(request.descriptionForError): - - URL: \(response.url!.absoluteString) - - Code: \(response.statusCode) - - Description: \(error.localizedDescription) - """ - } - } - - public var type: ErrorType { - switch self { - case .urlSessionError: return .bug - case .parseError: return .abort - case .invalidResponse: return .bug - case .serverSideError: return .bug - } - } -} - -public protocol HTTPRequestDispatching { - func dispatch(resource: HTTPResource) async throws -> (object: T, response: HTTPURLResponse) -} - -public final class HTTPRequestDispatcher: HTTPRequestDispatching { - let session: URLSession - - public init(session: URLSession = URLSession.shared) { - self.session = session - } - - public func dispatch(resource: HTTPResource) async throws -> (object: T, response: HTTPURLResponse) { - let request = resource.request() - do { - let (data, response) = try await session.data(for: request) - guard let response = response as? HTTPURLResponse else { - throw HTTPRequestDispatcherError.invalidResponse(request) - } - switch response.statusCode { - case 200 ..< 300: - do { - let object = try resource.parse(data, response) - return (object: object, response: response) - } catch { - throw HTTPRequestDispatcherError.parseError(request, error) - } - default: // Error - let thrownError: Error - do { - let parsedError = try resource.parseError(data, response) - thrownError = HTTPRequestDispatcherError.serverSideError(request, parsedError, response) - } catch { - thrownError = HTTPRequestDispatcherError.parseError(request, error) - } - throw thrownError - } - } catch { - if error is HTTPRequestDispatcherError { - throw error - } else { - throw HTTPRequestDispatcherError.urlSessionError(request, error) - } - } - } -} diff --git a/Sources/TuistSupport/HTTP/HTTPResource.swift b/Sources/TuistSupport/HTTP/HTTPResource.swift deleted file mode 100644 index c7059d6945e..00000000000 --- a/Sources/TuistSupport/HTTP/HTTPResource.swift +++ /dev/null @@ -1,82 +0,0 @@ -import Foundation - -public struct HTTPResource: Equatable, Hashable, CustomStringConvertible { - public let request: () -> URLRequest - public let parse: (Data, HTTPURLResponse) throws -> T - public let parseError: (Data, HTTPURLResponse) throws -> E - - public init( - request: @escaping () -> URLRequest, - parse: @escaping (Data, HTTPURLResponse) throws -> T, - parseError: @escaping (Data, HTTPURLResponse) throws -> E - ) { - self.request = request - self.parse = parse - self.parseError = parseError - } - - public func withURL(_ url: URL) -> HTTPResource { - HTTPResource(request: { - URLRequest(url: url) - }, parse: parse, parseError: parseError) - } - - public func mappingRequest(_ requestMapper: @escaping (URLRequest) throws -> URLRequest) throws -> HTTPResource { - let request = try requestMapper(request()) - return HTTPResource( - request: { request }, - parse: parse, - parseError: parseError - ) - } - - public func eraseToAnyResource() -> HTTPResource { - HTTPResource { - request() - } parse: { data, response in - try parse(data, response) as Any - } parseError: { data, response in - try parseError(data, response) - } - } - - // MARK: - Hashable - - public func hash(into hasher: inout Hasher) { - hasher.combine(request()) - } - - // MARK: - Equatable - - public static func == (lhs: HTTPResource, rhs: HTTPResource) -> Bool { - lhs.request() == rhs.request() - } - - // MARK: - CustomStringConvertible - - public var description: String { - let request = request() - - return "[\(request.httpMethod ?? "GET")] - \(request.url?.path ?? "")" - } -} - -extension HTTPResource where T: Decodable, E: Decodable { - public static func jsonResource(request: @escaping () -> URLRequest) -> HTTPResource { - let jsonDecoder = JSONDecoder() - jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase - return HTTPResource( - request: request, - parse: { data, _ in - try jsonDecoder.decode(T.self, from: data) - }, - parseError: { data, _ in try jsonDecoder.decode(E.self, from: data) } - ) - } - - public static func jsonResource(for url: URL, httpMethod: String) -> HTTPResource { - var request = URLRequest(url: url) - request.httpMethod = httpMethod - return .jsonResource { request } - } -} diff --git a/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift b/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift index 24917b844a7..995aec19475 100644 --- a/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift +++ b/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift @@ -271,77 +271,6 @@ extension XCTestCase { return element } - // MARK: - HTTPResource - - public func XCTAssertHTTPResourceMethod( - _ resource: HTTPResource, - _ method: String, - file: StaticString = #file, - line: UInt = #line - ) { - let request = resource.request() - XCTAssertEqual( - request.httpMethod!, - method, - "Expected the HTTP request method \(method) but got \(request.httpMethod!)", - file: file, - line: line - ) - } - - public func XCTAssertHTTPResourceContainsHeader( - _ resource: HTTPResource, - header: String, - value: String, - file: StaticString = #file, - line: UInt = #line - ) { - let request = resource.request() - let headers = request.allHTTPHeaderFields ?? [:] - guard let headerValue = headers[header] else { - XCTFail("The request doesn't contain the header \(header)", file: file, line: line) - return - } - XCTAssertEqual( - headerValue, - value, - "Expected header \(header) to have value \(value) but got \(headerValue)", - file: file, - line: line - ) - } - - public func XCTAssertHTTPResourcePath( - _ resource: HTTPResource, - path: String, - file: StaticString = #file, - line: UInt = #line - ) { - let request = resource.request() - let url = request.url! - let components = URLComponents(string: url.absoluteString)! - let requestPath = components.path - XCTAssertEqual(requestPath, path, "Expected the path \(path) but got \(requestPath)", file: file, line: line) - } - - public func XCTAssertHTTPResourceURL( - _ resource: HTTPResource, - url: URL, - file: StaticString = #file, - line: UInt = #line - ) { - let request = resource.request() - let requestUrl = request.url! - let components = URLComponents(string: requestUrl.absoluteString)! - XCTAssertEqual( - components.url!, - url, - "Expected the URL \(url.absoluteString) but got \(components.url!)", - file: file, - line: line - ) - } - @discardableResult public func XCTAssertContainsElementOfType( _ collection: [Any], _ type: T.Type, diff --git a/Sources/TuistSupportTesting/HTTP/HTTPResource+TestData.swift b/Sources/TuistSupportTesting/HTTP/HTTPResource+TestData.swift deleted file mode 100644 index 7cad274e50a..00000000000 --- a/Sources/TuistSupportTesting/HTTP/HTTPResource+TestData.swift +++ /dev/null @@ -1,24 +0,0 @@ -import Foundation -import TuistSupport - -extension HTTPResource { - public static func void() -> HTTPResource { - HTTPResource { - URLRequest(url: URL(string: "https://test.tuist.io")!) - } parse: { _, _ in - () - } parseError: { _, _ in - fatalError("The code execution shouldn't have reached this point") - } - } - - public static func noop() -> HTTPResource { - HTTPResource { - URLRequest(url: URL(string: "https://test.tuist.io")!) - } parse: { _, _ in - () - } parseError: { _, _ in - TestError("noop HTTPResource") - } - } -} diff --git a/Sources/TuistSupportTesting/HTTP/MockHTTPRequestDispatcher.swift b/Sources/TuistSupportTesting/HTTP/MockHTTPRequestDispatcher.swift deleted file mode 100644 index c77e92a0700..00000000000 --- a/Sources/TuistSupportTesting/HTTP/MockHTTPRequestDispatcher.swift +++ /dev/null @@ -1,22 +0,0 @@ -import Combine -import Foundation -import TuistSupport - -public class MockHTTPRequestDispatcher: HTTPRequestDispatching { - public var requests: [URLRequest] = [] - - public func dispatch(resource: HTTPResource) async throws -> (object: T, response: HTTPURLResponse) { - if T.self != Void.self { - fatalError( - """ - MockHTTPRequestDispatcher only supports resources with Void as its generic value. \ - Use HTTPResource.noop from TuistSupportTesting. - """ - ) - } - requests.append(resource.request()) - let response = HTTPURLResponse() - // swiftlint:disable:next force_cast - return (object: () as! T, response: response) - } -} From 7e474a2d58fa12024d89336c23e97ab07a9a7e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 14 May 2024 16:18:57 +0200 Subject: [PATCH 280/509] Add defaultConfiguration generation option to Config.swift (#6255) --- .../ConfigGenerationOptions.swift | 10 +- .../TuistAcceptanceFixtures.swift | 3 + .../Models/ConfigGenerationOptions.swift | 5 +- .../Models/Config+TestData.swift | 6 +- .../Config+ManifestMapper.swift | 3 +- .../GenerateAcceptanceTests.swift | 8 ++ .../.gitignore | 70 +++++++++++++ .../.mise.toml | 2 + .../AccentColor.colorset/Contents.json | 11 +++ .../AppIcon.appiconset/Contents.json | 98 +++++++++++++++++++ .../Resources/Assets.xcassets/Contents.json | 6 ++ .../App/Resources/LaunchScreen.storyboard | 25 +++++ .../Preview Assets.xcassets/Contents.json | 6 ++ .../App/Sources/AppApp.swift | 10 ++ .../App/Sources/ContentView.swift | 16 +++ .../App/Tests/AppTests.swift | 8 ++ .../Framework/Sources/Framework.swift | 7 ++ .../Project.swift | 40 ++++++++ .../README.md | 3 + .../Tuist/Config.swift | 7 ++ .../Tuist/Package.swift | 22 +++++ 21 files changed, 360 insertions(+), 6 deletions(-) create mode 100644 fixtures/app_with_custom_default_configuration/.gitignore create mode 100644 fixtures/app_with_custom_default_configuration/.mise.toml create mode 100644 fixtures/app_with_custom_default_configuration/App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 fixtures/app_with_custom_default_configuration/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 fixtures/app_with_custom_default_configuration/App/Resources/Assets.xcassets/Contents.json create mode 100644 fixtures/app_with_custom_default_configuration/App/Resources/LaunchScreen.storyboard create mode 100644 fixtures/app_with_custom_default_configuration/App/Resources/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 fixtures/app_with_custom_default_configuration/App/Sources/AppApp.swift create mode 100644 fixtures/app_with_custom_default_configuration/App/Sources/ContentView.swift create mode 100644 fixtures/app_with_custom_default_configuration/App/Tests/AppTests.swift create mode 100644 fixtures/app_with_custom_default_configuration/Framework/Sources/Framework.swift create mode 100644 fixtures/app_with_custom_default_configuration/Project.swift create mode 100644 fixtures/app_with_custom_default_configuration/README.md create mode 100644 fixtures/app_with_custom_default_configuration/Tuist/Config.swift create mode 100644 fixtures/app_with_custom_default_configuration/Tuist/Package.swift diff --git a/Sources/ProjectDescription/ConfigGenerationOptions.swift b/Sources/ProjectDescription/ConfigGenerationOptions.swift index c27c04fc5b2..671c4738c34 100644 --- a/Sources/ProjectDescription/ConfigGenerationOptions.swift +++ b/Sources/ProjectDescription/ConfigGenerationOptions.swift @@ -31,19 +31,25 @@ extension Config { /// dependencies won't build until all dependencies are declared explicitly. public let enforceExplicitDependencies: Bool + /// The default configuration to be used when generating the project. + /// If not specified, Tuist generates for the first (when alphabetically sorted) debug configuration. + public var defaultConfiguration: String? + public static func options( resolveDependenciesWithSystemScm: Bool = false, disablePackageVersionLocking: Bool = false, clonedSourcePackagesDirPath: Path? = nil, staticSideEffectsWarningTargets: StaticSideEffectsWarningTargets = .all, - enforceExplicitDependencies: Bool = false + enforceExplicitDependencies: Bool = false, + defaultConfiguration: String? = nil ) -> Self { self.init( resolveDependenciesWithSystemScm: resolveDependenciesWithSystemScm, disablePackageVersionLocking: disablePackageVersionLocking, clonedSourcePackagesDirPath: clonedSourcePackagesDirPath, staticSideEffectsWarningTargets: staticSideEffectsWarningTargets, - enforceExplicitDependencies: enforceExplicitDependencies + enforceExplicitDependencies: enforceExplicitDependencies, + defaultConfiguration: defaultConfiguration ) } } diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift index cd515bd21ba..008d6478b3f 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift @@ -2,6 +2,7 @@ import Foundation public enum TuistAcceptanceFixtures { case appWithBuildRules + case appWithCustomDefaultConfiguration case appWithFrameworkAndTests case appWithPlugins case appWithPreviews @@ -73,6 +74,8 @@ public enum TuistAcceptanceFixtures { switch self { case .appWithBuildRules: return "app_with_build_rules" + case .appWithCustomDefaultConfiguration: + return "app_with_custom_default_configuration" case .appWithFrameworkAndTests: return "app_with_framework_and_tests" case .appWithPlugins: diff --git a/Sources/TuistGraph/Models/ConfigGenerationOptions.swift b/Sources/TuistGraph/Models/ConfigGenerationOptions.swift index c2150f6f589..c3912c3b184 100644 --- a/Sources/TuistGraph/Models/ConfigGenerationOptions.swift +++ b/Sources/TuistGraph/Models/ConfigGenerationOptions.swift @@ -14,19 +14,22 @@ extension Config { public let clonedSourcePackagesDirPath: AbsolutePath? public let staticSideEffectsWarningTargets: StaticSideEffectsWarningTargets public let enforceExplicitDependencies: Bool + public let defaultConfiguration: String? public init( resolveDependenciesWithSystemScm: Bool, disablePackageVersionLocking: Bool, clonedSourcePackagesDirPath: AbsolutePath? = nil, staticSideEffectsWarningTargets: StaticSideEffectsWarningTargets = .all, - enforceExplicitDependencies: Bool = false + enforceExplicitDependencies: Bool = false, + defaultConfiguration: String? = nil ) { self.resolveDependenciesWithSystemScm = resolveDependenciesWithSystemScm self.disablePackageVersionLocking = disablePackageVersionLocking self.clonedSourcePackagesDirPath = clonedSourcePackagesDirPath self.staticSideEffectsWarningTargets = staticSideEffectsWarningTargets self.enforceExplicitDependencies = enforceExplicitDependencies + self.defaultConfiguration = defaultConfiguration } } } diff --git a/Sources/TuistGraphTesting/Models/Config+TestData.swift b/Sources/TuistGraphTesting/Models/Config+TestData.swift index ba545fb9b09..2629bab80cb 100644 --- a/Sources/TuistGraphTesting/Models/Config+TestData.swift +++ b/Sources/TuistGraphTesting/Models/Config+TestData.swift @@ -29,14 +29,16 @@ extension Config.GenerationOptions { disablePackageVersionLocking: Bool = false, clonedSourcePackagesDirPath: AbsolutePath? = nil, staticSideEffectsWarningTargets: TuistGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets = .all, - enforceExplicitDependencies: Bool = false + enforceExplicitDependencies: Bool = false, + defaultConfiguration: String? = nil ) -> Self { .init( resolveDependenciesWithSystemScm: resolveDependenciesWithSystemScm, disablePackageVersionLocking: disablePackageVersionLocking, clonedSourcePackagesDirPath: clonedSourcePackagesDirPath, staticSideEffectsWarningTargets: staticSideEffectsWarningTargets, - enforceExplicitDependencies: enforceExplicitDependencies + enforceExplicitDependencies: enforceExplicitDependencies, + defaultConfiguration: defaultConfiguration ) } } diff --git a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift index 78043737c21..a574ffb6dde 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift @@ -64,7 +64,8 @@ extension TuistGraph.Config.GenerationOptions { clonedSourcePackagesDirPath: clonedSourcePackagesDirPath, staticSideEffectsWarningTargets: TuistGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets .from(manifest: manifest.staticSideEffectsWarningTargets), - enforceExplicitDependencies: manifest.enforceExplicitDependencies + enforceExplicitDependencies: manifest.enforceExplicitDependencies, + defaultConfiguration: manifest.defaultConfiguration ) } } diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index 3e835a7b578..219cc787ba4 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -839,6 +839,14 @@ final class GenerateAcceptanceTestSPMPackage: TuistAcceptanceTestCase { } } +final class GenerateAcceptanceTestAppWithDefaultConfiguration: TuistAcceptanceTestCase { + func test_app_with_custom_default_configuration() async throws { + try setUpFixture(.appWithCustomDefaultConfiguration) + try await run(GenerateCommand.self) + try await run(BuildCommand.self) + } +} + extension TuistAcceptanceTestCase { private func resourcePath( for productName: String, diff --git a/fixtures/app_with_custom_default_configuration/.gitignore b/fixtures/app_with_custom_default_configuration/.gitignore new file mode 100644 index 00000000000..24b244f9c45 --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/.gitignore @@ -0,0 +1,70 @@ +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Xcode ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +### Xcode Patch ### +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcworkspace/contents.xcworkspacedata +/*.gcno + +### Projects ### +*.xcodeproj +*.xcworkspace + +### Tuist derived files ### +graph.dot +Derived/ + +### Tuist managed dependencies ### +Tuist/.build \ No newline at end of file diff --git a/fixtures/app_with_custom_default_configuration/.mise.toml b/fixtures/app_with_custom_default_configuration/.mise.toml new file mode 100644 index 00000000000..faee01cee73 --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/.mise.toml @@ -0,0 +1,2 @@ +[tools] +tuist = "4.11.0" diff --git a/fixtures/app_with_custom_default_configuration/App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/fixtures/app_with_custom_default_configuration/App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000000..eb878970081 --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/app_with_custom_default_configuration/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/fixtures/app_with_custom_default_configuration/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..9221b9bb1a3 --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/app_with_custom_default_configuration/App/Resources/Assets.xcassets/Contents.json b/fixtures/app_with_custom_default_configuration/App/Resources/Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/App/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/app_with_custom_default_configuration/App/Resources/LaunchScreen.storyboard b/fixtures/app_with_custom_default_configuration/App/Resources/LaunchScreen.storyboard new file mode 100644 index 00000000000..865e9329f37 --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/App/Resources/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fixtures/app_with_custom_default_configuration/App/Resources/Preview Content/Preview Assets.xcassets/Contents.json b/fixtures/app_with_custom_default_configuration/App/Resources/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/App/Resources/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/app_with_custom_default_configuration/App/Sources/AppApp.swift b/fixtures/app_with_custom_default_configuration/App/Sources/AppApp.swift new file mode 100644 index 00000000000..1295f66aa3e --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/App/Sources/AppApp.swift @@ -0,0 +1,10 @@ +import SwiftUI + +@main +struct AppApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/fixtures/app_with_custom_default_configuration/App/Sources/ContentView.swift b/fixtures/app_with_custom_default_configuration/App/Sources/ContentView.swift new file mode 100644 index 00000000000..48f62ebea83 --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/App/Sources/ContentView.swift @@ -0,0 +1,16 @@ +import SwiftUI + +public struct ContentView: View { + public init() {} + + public var body: some View { + Text("Hello, World!") + .padding() + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/fixtures/app_with_custom_default_configuration/App/Tests/AppTests.swift b/fixtures/app_with_custom_default_configuration/App/Tests/AppTests.swift new file mode 100644 index 00000000000..70c453ba3f3 --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/App/Tests/AppTests.swift @@ -0,0 +1,8 @@ +import Foundation +import XCTest + +final class AppTests: XCTestCase { + func test_twoPlusTwo_isFour() { + XCTAssertEqual(2 + 2, 4) + } +} diff --git a/fixtures/app_with_custom_default_configuration/Framework/Sources/Framework.swift b/fixtures/app_with_custom_default_configuration/Framework/Sources/Framework.swift new file mode 100644 index 00000000000..19a008d12ea --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/Framework/Sources/Framework.swift @@ -0,0 +1,7 @@ +import Foundation + +public enum Framework { + public static func hello() -> String { + "Hello from Framework!" + } +} diff --git a/fixtures/app_with_custom_default_configuration/Project.swift b/fixtures/app_with_custom_default_configuration/Project.swift new file mode 100644 index 00000000000..65012836f5b --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/Project.swift @@ -0,0 +1,40 @@ +import ProjectDescription + +let project = Project( + name: "App", + targets: [ + .target( + name: "App", + destinations: .iOS, + product: .app, + bundleId: "io.tuist.App", + infoPlist: .extendingDefault( + with: [ + "UILaunchStoryboardName": "LaunchScreen.storyboard", + ] + ), + sources: ["App/Sources/**"], + resources: ["App/Resources/**"], + dependencies: [ + .target(name: "Framework"), + ] + ), + .target( + name: "AppTests", + destinations: .iOS, + product: .unitTests, + bundleId: "io.tuist.AppTests", + infoPlist: .default, + sources: ["App/Tests/**"], + resources: [], + dependencies: [.target(name: "App")] + ), + .target( + name: "Framework", + destinations: .iOS, + product: .framework, + bundleId: "io.tuist.framework", + sources: ["Framework/Sources/**"] + ), + ] +) diff --git a/fixtures/app_with_custom_default_configuration/README.md b/fixtures/app_with_custom_default_configuration/README.md new file mode 100644 index 00000000000..ed4987f6b5d --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/README.md @@ -0,0 +1,3 @@ +# App with a custom default configuration + +App that showcases a custom default configuration generationo option. \ No newline at end of file diff --git a/fixtures/app_with_custom_default_configuration/Tuist/Config.swift b/fixtures/app_with_custom_default_configuration/Tuist/Config.swift new file mode 100644 index 00000000000..c38ad99b85c --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/Tuist/Config.swift @@ -0,0 +1,7 @@ +import ProjectDescription + +let config = Config( + generationOptions: .options( + defaultConfiguration: "Release" + ) +) diff --git a/fixtures/app_with_custom_default_configuration/Tuist/Package.swift b/fixtures/app_with_custom_default_configuration/Tuist/Package.swift new file mode 100644 index 00000000000..c22106db8fe --- /dev/null +++ b/fixtures/app_with_custom_default_configuration/Tuist/Package.swift @@ -0,0 +1,22 @@ +// swift-tools-version: 5.9 +import PackageDescription + +#if TUIST + import ProjectDescription + + let packageSettings = PackageSettings( + // Customize the product types for specific package product + // Default is .staticFramework + // productTypes: ["Alamofire": .framework,] + productTypes: [:] + ) +#endif + +let package = Package( + name: "App", + dependencies: [ + // Add your own dependencies here: + // .package(url: "https://github.com/Alamofire/Alamofire", from: "5.0.0"), + // You can read more about dependencies here: https://docs.tuist.io/documentation/tuist/dependencies + ] +) From 9f0b55be99f255b094ff57a978b12dec2a977850 Mon Sep 17 00:00:00 2001 From: David Harris Date: Tue, 14 May 2024 10:42:05 -0400 Subject: [PATCH 281/509] Do not automatically add -ObjC flag when integrating Objective-C dependencies (#6244) * Revert "Fix runtime error when using objc dependencies (#5929)" This reverts commit 92970222bfa7a0e5fab9a56a86623907d375c4f5. * Update app_with_spm_dependencies fixture to rely on -ObjC flag and document --- .../Mappers/ModuleMapMapper.swift | 33 ------------------- .../ProjectMappers/ModuleMapMapperTests.swift | 3 -- docs/docs/guide/project/dependencies.md | 8 +++++ .../App/Project.swift | 4 +-- fixtures/app_with_spm_dependencies/README.md | 5 +++ .../Settings+Templates.swift | 1 + 6 files changed, 16 insertions(+), 38 deletions(-) create mode 100644 fixtures/app_with_spm_dependencies/README.md diff --git a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift index 468ccbfd684..436be1f472d 100644 --- a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift +++ b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift @@ -10,7 +10,6 @@ import TuistSupport public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this type_body_length private static let modulemapFileSetting = "MODULEMAP_FILE" private static let otherCFlagsSetting = "OTHER_CFLAGS" - private static let otherLinkerFlagsSetting = "OTHER_LDFLAGS" private static let otherSwiftFlagsSetting = "OTHER_SWIFT_FLAGS" private static let headerSearchPaths = "HEADER_SEARCH_PATHS" @@ -82,14 +81,6 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ mappedSettingsDictionary[Self.headerSearchPaths] = updatedHeaderSearchPaths } - if let updatedOtherLinkerFlags = Self.updatedOtherLinkerFlags( - targetID: targetID, - oldOtherLinkerFlags: mappedSettingsDictionary[Self.otherLinkerFlagsSetting], - targetToDependenciesMetadata: targetToDependenciesMetadata - ) { - mappedSettingsDictionary[Self.otherLinkerFlagsSetting] = updatedOtherLinkerFlags - } - let targetSettings = target.settings ?? Settings( base: [:], configurations: [:], @@ -277,28 +268,4 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ return .array(mappedOtherCFlags) } - - private static func updatedOtherLinkerFlags( - targetID: TargetID, - oldOtherLinkerFlags: SettingsDictionary.Value?, - targetToDependenciesMetadata: [TargetID: Set] - ) -> SettingsDictionary.Value? { - guard let dependenciesModuleMaps = targetToDependenciesMetadata[targetID]?.compactMap(\.moduleMapPath), - !dependenciesModuleMaps.isEmpty - else { return nil } - - var mappedOtherLinkerFlags: [String] - switch oldOtherLinkerFlags ?? .array(["$(inherited)"]) { - case let .array(values): - mappedOtherLinkerFlags = values - case let .string(value): - mappedOtherLinkerFlags = value.split(separator: " ").map(String.init) - } - - if !mappedOtherLinkerFlags.contains("-ObjC") { - mappedOtherLinkerFlags.append("-ObjC") - } - - return .array(mappedOtherLinkerFlags) - } } diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift index d65a93b3e81..59208d00a5d 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift @@ -114,7 +114,6 @@ final class ModuleMapMapperTests: TuistUnitTestCase { "-fmodule-map-file=$(SRCROOT)/../B/B2/B2.module", ]), "HEADER_SEARCH_PATHS": .array(["$(inherited)", "$(SRCROOT)/../B/B1/include", "$(SRCROOT)/../B/B2/include"]), - "OTHER_LDFLAGS": .array(["$(inherited)", "-ObjC"]), ]), dependencies: [ .project(target: "B1", path: projectBPath), @@ -134,7 +133,6 @@ final class ModuleMapMapperTests: TuistUnitTestCase { "OTHER_CFLAGS": .array(["$(inherited)", "-fmodule-map-file=$(SRCROOT)/B2/B2.module"]), "OTHER_SWIFT_FLAGS": .array(["$(inherited)", "-Xcc", "-fmodule-map-file=$(SRCROOT)/B2/B2.module"]), "HEADER_SEARCH_PATHS": .array(["$(SRCROOT)/B1/include", "$(SRCROOT)/B2/include"]), - "OTHER_LDFLAGS": .array(["$(inherited)", "-ObjC"]), ]), dependencies: [ .target(name: "B2"), @@ -262,7 +260,6 @@ final class ModuleMapMapperTests: TuistUnitTestCase { "-fmodule-map-file=$(SRCROOT)/../B/B/B.module", ]), "HEADER_SEARCH_PATHS": .array(["$(inherited)", "$(SRCROOT)/../B/B/include"]), - "OTHER_LDFLAGS": .array(["$(inherited)", "-ObjC"]), ], configurations: [:], defaultSettings: .recommended diff --git a/docs/docs/guide/project/dependencies.md b/docs/docs/guide/project/dependencies.md index dcaec410001..9a135988c38 100644 --- a/docs/docs/guide/project/dependencies.md +++ b/docs/docs/guide/project/dependencies.md @@ -194,3 +194,11 @@ pod install > [!WARNING] > CocoaPods dependencies are not compatible with workflows like `build` or `test` that run `xcodebuild` right after generating the project. They are also incompatible with binary caching and selective testing since the fingerprinting logic doesn't account for the Pods dependencies. + +## Objective-C Dependencies + +When integrating Objective-C dependencies, the inclusion of certain flags on the consuming target may be necessary to avoid runtime crashes as detailed in [Apple Technical Q&A QA1490](https://developer.apple.com/library/archive/qa/qa1490/_index.html). + +Since the build system and Tuist have no way of inferring whether the flag is necessary or not, and since the flag comes with potentially undesirable side effects, Tuist will not automatically apply any of these flags, and because Swift Package Manager considers `-ObjC` to be included via an `.unsafeFlag` most packages cannot include it as part of their default linking settings when required. + +Consumers of Objective-C dependencies (or internal Objective-C targets) should apply `-ObjC` or `-force_load` flags when required by setting `OTHER_LDFLAGS` on consuming targets. \ No newline at end of file diff --git a/fixtures/app_with_spm_dependencies/App/Project.swift b/fixtures/app_with_spm_dependencies/App/Project.swift index a8d25a31c60..13a1ace9a55 100644 --- a/fixtures/app_with_spm_dependencies/App/Project.swift +++ b/fixtures/app_with_spm_dependencies/App/Project.swift @@ -84,8 +84,8 @@ let project = Project( with: [ "WKCompanionAppBundleIdentifier": "io.tuist.app", ] - ), - sources: ["Sources/Watch/App/**"], + ), sources: ["Sources/Watch/App/**"], + dependencies: [ .target(name: "WatchExtension"), ] diff --git a/fixtures/app_with_spm_dependencies/README.md b/fixtures/app_with_spm_dependencies/README.md new file mode 100644 index 00000000000..b98f319091e --- /dev/null +++ b/fixtures/app_with_spm_dependencies/README.md @@ -0,0 +1,5 @@ +# Application with Swift Package Manager Dependencies + +This example contains an example that uses Swift Package Manager dependencies. + +It also contains a static Objective-C dependency that relies on the `-ObjC` linker flag to be added to the consuming application. \ No newline at end of file diff --git a/fixtures/app_with_spm_dependencies/Tuist/ProjectDescriptionHelpers/Settings+Templates.swift b/fixtures/app_with_spm_dependencies/Tuist/ProjectDescriptionHelpers/Settings+Templates.swift index e4fac629fdb..5db66ebcd62 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/ProjectDescriptionHelpers/Settings+Templates.swift +++ b/fixtures/app_with_spm_dependencies/Tuist/ProjectDescriptionHelpers/Settings+Templates.swift @@ -12,6 +12,7 @@ extension ProjectDescription.Settings { .settings( base: [ "SOME_BASE_FLAG": .string("VALUE"), + "OTHER_LDFLAGS": .string("-ObjC"), ].otherSwiftFlags("-enable-actor-data-race-checks"), configurations: BuildEnvironment.allCases.map(\.targetConfiguration) ) From 4ecde1dbb3fea6d5664eb870deb919ce0b8e4bd5 Mon Sep 17 00:00:00 2001 From: Tuist Date: Tue, 14 May 2024 15:54:27 +0000 Subject: [PATCH 282/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.13.0 --- .mise.toml | 2 +- CHANGELOG.md | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 04e35859246..c08cc167375 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.12.1" +tuist = "4.13.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index 9575d57869b..a506640da3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## 4.13.0 - 2024-05-14 + +### Tuist + +#### Added + +- Add defaultConfiguration generation option to Config.swift [#6255](https://github.com/tuist/tuist/pull/6255) by [@fortmarek](https://github.com/fortmarek) + +#### Fixed + +- Fix integration of SPM packages with spaces in their name [#6264](https://github.com/tuist/tuist/pull/6264) by [@kapitoshka438](https://github.com/kapitoshka438) +- Align bundle name with dashes sanitizing with SPM [#6265](https://github.com/tuist/tuist/pull/6265) by [@danibachar](https://github.com/danibachar) +- Do not automatically add -ObjC flag when integrating Objective-C dependencies [#6244](https://github.com/tuist/tuist/pull/6244) by [@thedavidharris](https://github.com/thedavidharris) + +### Tuist Cloud + +- no changes + ## 4.12.1 - 2024-05-07 ### Tuist From 51e6fb3c9a00633ea81c6650a3cec7a5389bcebb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 15 May 2024 12:58:27 +0200 Subject: [PATCH 283/509] Add docs for Timescale Postgres extension (#6286) --- docs/docs/cloud/on-premise.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/docs/cloud/on-premise.md b/docs/docs/cloud/on-premise.md index 60eca20aa56..3f8730184cf 100644 --- a/docs/docs/cloud/on-premise.md +++ b/docs/docs/cloud/on-premise.md @@ -35,6 +35,8 @@ To run it, your infrastructure must support running Docker images. Note that mos In addition to running the Docker images, you’ll need a [Postgres database](https://www.postgresql.org/) to store relational data. Most infrastructure providers include Posgres databases in their offering (e.g., [AWS](https://aws.amazon.com/rds/postgresql/) & [Google Cloud](https://cloud.google.com/sql/docs/postgres)). +For performant analytics, we use a [Timescale Postgres extension](https://www.timescale.com/). You need to make sure that TimescaleDB is installed on the machine running the Postgres database. Follow the installation instructions [here](https://docs.timescale.com/self-hosted/latest/install/) to learn more. + > [!INFO] MIGRATIONS > The Docker image's entrypoint automatically runs any pending schema migrations before starting the service. @@ -238,7 +240,7 @@ Below is an example of a `docker-compose.yml` file that you can use as a referen version: '3.8' services: db: - image: postgres:14.1-alpine + image: timescale/timescaledb-ha:pg16 restart: always environment: - POSTGRES_USER=postgres From daa042c967f1f19c9c402e051b4391c8a067670a Mon Sep 17 00:00:00 2001 From: Eduard Miniakhmetov Date: Wed, 15 May 2024 16:34:50 +0300 Subject: [PATCH 284/509] Fix integration of SPM packages with slashes in their targets names (#6260) * Allow slash in non-uti-compliant target names * Sanitize paths --- Sources/TuistGenerator/Linter/TargetLinter.swift | 2 +- .../Mappers/ResourcesProjectMapper.swift | 3 ++- Sources/TuistGraph/Models/Target.swift | 2 +- .../SwiftPackageManager/PackageInfoMapper.swift | 3 ++- .../SwiftPackageManagerModuleMapGenerator.swift | 10 +++++----- Sources/TuistSupport/Extensions/String+Extras.swift | 6 ++++++ .../ProjectMappers/ResourcesProjectMapperTests.swift | 2 +- .../App/Sources/ContentView.swift | 3 +++ fixtures/ios_app_with_spm_dependencies/Project.swift | 2 ++ .../Tuist/Package.resolved | 11 ++++++++++- .../ios_app_with_spm_dependencies/Tuist/Package.swift | 2 ++ 11 files changed, 35 insertions(+), 11 deletions(-) diff --git a/Sources/TuistGenerator/Linter/TargetLinter.swift b/Sources/TuistGenerator/Linter/TargetLinter.swift index 524e0e4b4f2..8821d54cefc 100644 --- a/Sources/TuistGenerator/Linter/TargetLinter.swift +++ b/Sources/TuistGenerator/Linter/TargetLinter.swift @@ -62,7 +62,7 @@ class TargetLinter: TargetLinting { bundleIdentifier = bundleIdentifier.replacingOccurrences(of: "\\$\\(.+\\)", with: "", options: .regularExpression) var allowed = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") - allowed.formUnion(CharacterSet(charactersIn: "-.")) + allowed.formUnion(CharacterSet(charactersIn: "-./")) if !bundleIdentifier.unicodeScalars.allSatisfy({ allowed.contains($0) }) { let reason = diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 41162489e41..4b3a2e5f74d 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -36,7 +36,8 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this var additionalTargets: [Target] = [] var sideEffects: [SideEffectDescriptor] = [] - let bundleName = "\(project.name)_\(target.name.replacingOccurrences(of: "-", with: "_"))" + let sanitizedTargetName = target.name.sanitizedModuleName + let bundleName = "\(project.name)_\(sanitizedTargetName)" var modifiedTarget = target if !target.supportsResources { diff --git a/Sources/TuistGraph/Models/Target.swift b/Sources/TuistGraph/Models/Target.swift index 70761bd70a4..f091e803a94 100644 --- a/Sources/TuistGraph/Models/Target.swift +++ b/Sources/TuistGraph/Models/Target.swift @@ -83,7 +83,7 @@ public struct Target: Equatable, Hashable, Comparable, Codable { self.product = product self.destinations = destinations self.bundleId = bundleId - self.productName = productName ?? name.replacingOccurrences(of: "-", with: "_") + self.productName = productName ?? name.sanitizedModuleName self.deploymentTargets = deploymentTargets self.infoPlist = infoPlist self.entitlements = entitlements diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 94c09ccefdd..d9fb9ad054b 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -375,6 +375,7 @@ public final class PackageInfoMapper: PackageInfoMapping { fileprivate class func sanitize(targetName: String) -> String { targetName.replacingOccurrences(of: ".", with: "_") + .replacingOccurrences(of: "/", with: "_") } // swiftlint:disable:next function_body_length @@ -596,7 +597,7 @@ public final class PackageInfoMapper: PackageInfoMapping { .sanitize(targetName: target.name) .replacingOccurrences(of: "-", with: "_"), bundleId: target.name - .replacingOccurrences(of: "_", with: "."), + .replacingOccurrences(of: "_", with: ".").replacingOccurrences(of: "/", with: "."), deploymentTargets: deploymentTargets, infoPlist: .default, sources: sources, diff --git a/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift b/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift index 44b78a5a7ee..20b14deffd7 100644 --- a/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift +++ b/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift @@ -56,10 +56,10 @@ public final class SwiftPackageManagerModuleMapGenerator: SwiftPackageManagerMod moduleName: String, publicHeadersPath: AbsolutePath ) throws -> ModuleMap { - let sanitizedModuleName = moduleName.replacingOccurrences(of: "-", with: "_") + let sanitizedModuleName = moduleName.sanitizedModuleName let umbrellaHeaderPath = publicHeadersPath.appending(component: sanitizedModuleName + ".h") let nestedUmbrellaHeaderPath = publicHeadersPath - .appending(components: sanitizedModuleName, moduleName + ".h") + .appending(components: sanitizedModuleName, sanitizedModuleName + ".h") let customModuleMapPath = try Self.customModuleMapPath(publicHeadersPath: publicHeadersPath) let generatedModuleMapPath: AbsolutePath @@ -69,12 +69,12 @@ public final class SwiftPackageManagerModuleMapGenerator: SwiftPackageManagerMod .parentDirectory .appending( components: Constants.DerivedDirectory.dependenciesDerivedDirectory, - moduleName, - "\(moduleName).modulemap" + sanitizedModuleName, + "\(sanitizedModuleName).modulemap" ) } else { generatedModuleMapPath = packageDirectory.appending( - components: Constants.DerivedDirectory.name, "\(moduleName).modulemap" + components: Constants.DerivedDirectory.name, "\(sanitizedModuleName).modulemap" ) } diff --git a/Sources/TuistSupport/Extensions/String+Extras.swift b/Sources/TuistSupport/Extensions/String+Extras.swift index 55a713fadab..651ebd6c65c 100644 --- a/Sources/TuistSupport/Extensions/String+Extras.swift +++ b/Sources/TuistSupport/Extensions/String+Extras.swift @@ -232,6 +232,12 @@ extension String { return self } } + + /// Formats the current string to a Uniform Type Identifier + public var sanitizedModuleName: String { + replacingOccurrences(of: "-", with: "_") + .replacingOccurrences(of: "/", with: "_") + } } extension Array where Element: CustomStringConvertible { diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 67bc431488c..a337b0e7f80 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -428,7 +428,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Given let projectName = "sdk-with-dash" let targetName = "target-with-dash" - let expectedBundleName = "\(projectName)_\(targetName.replacingOccurrences(of: "-", with: "_"))" + let expectedBundleName = "sdk-with-dash_target_with_dash" let sources: [SourceFile] = ["/ViewController.m", "/ViewController2.swift"] let resources: [ResourceFileElement] = [.file(path: "/AbsolutePath/Project/Resources/image.png")] let target = Target.test(name: targetName, product: .staticLibrary, sources: sources, resources: .init(resources)) diff --git a/fixtures/ios_app_with_spm_dependencies/App/Sources/ContentView.swift b/fixtures/ios_app_with_spm_dependencies/App/Sources/ContentView.swift index fdd6050bbf1..3df539af66d 100644 --- a/fixtures/ios_app_with_spm_dependencies/App/Sources/ContentView.swift +++ b/fixtures/ios_app_with_spm_dependencies/App/Sources/ContentView.swift @@ -1,4 +1,5 @@ import Buy +import KSCrash_Installations import Pay import SwiftUI @@ -7,6 +8,8 @@ struct ContentView: View { // Use Mobile Buy SDK _ = Card.CreditCard(firstName: "", lastName: "", number: "", expiryMonth: "", expiryYear: "") _ = PayAddress() + // Use KSCrash + _ = KSCrashInstallationStandard() } var body: some View { diff --git a/fixtures/ios_app_with_spm_dependencies/Project.swift b/fixtures/ios_app_with_spm_dependencies/Project.swift index 5da81033323..233f6f6be12 100644 --- a/fixtures/ios_app_with_spm_dependencies/Project.swift +++ b/fixtures/ios_app_with_spm_dependencies/Project.swift @@ -15,6 +15,8 @@ let project = Project( dependencies: [ .external(name: "Buy"), .external(name: "Pay"), + .external(name: "KSCrash"), + .sdk(name: "c++", type: .library, status: .required), ] ), .target( diff --git a/fixtures/ios_app_with_spm_dependencies/Tuist/Package.resolved b/fixtures/ios_app_with_spm_dependencies/Tuist/Package.resolved index 050a192d473..684a9699fcf 100644 --- a/fixtures/ios_app_with_spm_dependencies/Tuist/Package.resolved +++ b/fixtures/ios_app_with_spm_dependencies/Tuist/Package.resolved @@ -1,6 +1,15 @@ { - "originHash" : "6ed714a381b77d6163cdedad8446d73742573b78187635c59175fa22d0a3df2c", + "originHash" : "fc3374625da9a1a42edd765287e0715853d94414eda5959e9d420d041ec3b010", "pins" : [ + { + "identity" : "kscrash", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kstenerud/KSCrash", + "state" : { + "revision" : "0ad825211ec38404e03b6f677a2312deb728528a", + "version" : "1.17.1" + } + }, { "identity" : "mobile-buy-sdk-ios", "kind" : "remoteSourceControl", diff --git a/fixtures/ios_app_with_spm_dependencies/Tuist/Package.swift b/fixtures/ios_app_with_spm_dependencies/Tuist/Package.swift index 588a3a7506d..dd9886efd1b 100644 --- a/fixtures/ios_app_with_spm_dependencies/Tuist/Package.swift +++ b/fixtures/ios_app_with_spm_dependencies/Tuist/Package.swift @@ -6,5 +6,7 @@ let package = Package( dependencies: [ // Has space symbols in package name .package(url: "https://github.com/Shopify/mobile-buy-sdk-ios", exact: "12.0.0"), + // Has targets with slash symbols in their names + .package(url: "https://github.com/kstenerud/KSCrash", exact: "1.17.1"), ] ) From 361c497f5eb1009cc7dc167fc002cf8ff1d56faf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Thu, 16 May 2024 12:26:37 +0200 Subject: [PATCH 285/509] Add Widget Extension support to AppClips (#6287) * Adds widget extension support to AppClips * Fix tests * Remove additional fixture * Remove non-existing fixture --------- Co-authored-by: Alex little --- .../TuistGenerator/Linter/GraphLinter.swift | 1 + .../GenerateAcceptanceTests.swift | 12 +++ .../AccentColor.colorset/Contents.json | 11 +++ .../AppIcon.appiconset/Contents.json | 98 +++++++++++++++++++ .../Resources/Assets.xcassets/Contents.json | 6 ++ .../WidgetBackground.colorset/Contents.json | 11 +++ .../AppClip1Widgets/Sources/Widget.swift | 69 +++++++++++++ fixtures/ios_app_with_appclip/Project.swift | 18 ++++ 8 files changed, 226 insertions(+) create mode 100644 fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/Contents.json create mode 100644 fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/WidgetBackground.colorset/Contents.json create mode 100644 fixtures/ios_app_with_appclip/AppClip1Widgets/Sources/Widget.swift diff --git a/Sources/TuistGenerator/Linter/GraphLinter.swift b/Sources/TuistGenerator/Linter/GraphLinter.swift index 2c4a86d86e5..b7da73c6d21 100644 --- a/Sources/TuistGenerator/Linter/GraphLinter.swift +++ b/Sources/TuistGenerator/Linter/GraphLinter.swift @@ -450,6 +450,7 @@ public class GraphLinter: GraphLinting { LintableTarget(platform: .iOS, product: .dynamicLibrary), LintableTarget(platform: .iOS, product: .framework), LintableTarget(platform: .iOS, product: .staticFramework), + LintableTarget(platform: .iOS, product: .appExtension), LintableTarget(platform: .macOS, product: .macro), ], LintableTarget(platform: .iOS, product: .extensionKitExtension): [ diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index 219cc787ba4..c0e70bf70d4 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -616,6 +616,18 @@ final class GenerateAcceptanceTestiOSAppWithAppClip: TuistAcceptanceTestCase { architecture: "arm64" ) try XCTAssertFrameworkEmbedded("Framework", by: "AppClip1") + try await XCTAssertProductWithDestinationContainsAppClipWithArchitecture( + "App.app", + destination: "Debug-iphonesimulator", + appClip: "AppClip1", + architecture: "arm64" + ) + try XCTAssertFrameworkEmbedded("Framework", by: "AppClip1") + try await XCTAssertProductWithDestinationContainsExtension( + "AppClip1.app", + destination: "Debug-iphonesimulator", + extension: "AppClip1Widgets" + ) } } diff --git a/fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000000..eb878970081 --- /dev/null +++ b/fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..9221b9bb1a3 --- /dev/null +++ b/fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/Contents.json b/fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/WidgetBackground.colorset/Contents.json b/fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/WidgetBackground.colorset/Contents.json new file mode 100644 index 00000000000..eb878970081 --- /dev/null +++ b/fixtures/ios_app_with_appclip/AppClip1Widgets/Resources/Assets.xcassets/WidgetBackground.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_appclip/AppClip1Widgets/Sources/Widget.swift b/fixtures/ios_app_with_appclip/AppClip1Widgets/Sources/Widget.swift new file mode 100644 index 00000000000..eac88f57911 --- /dev/null +++ b/fixtures/ios_app_with_appclip/AppClip1Widgets/Sources/Widget.swift @@ -0,0 +1,69 @@ +#if canImport(WidgetKit) + + import SwiftUI + import WidgetKit + + struct Provider: TimelineProvider { + public typealias Entry = SimpleEntry + + func placeholder(in _: Context) -> SimpleEntry { + SimpleEntry(date: Date()) + } + + func getSnapshot(in _: Context, completion _: @escaping (SimpleEntry) -> Void) {} + + func getTimeline(in _: Context, completion _: @escaping (Timeline) -> Void) {} + + public func snapshot(with _: Context, completion: @escaping (SimpleEntry) -> Void) { + let entry = SimpleEntry(date: Date()) + completion(entry) + } + + public func timeline(with _: Context, completion: @escaping (Timeline) -> Void) { + var entries: [SimpleEntry] = [] + + // Generate a timeline consisting of five entries an hour apart, starting from the current date. + let currentDate = Date() + for hourOffset in 0 ..< 5 { + let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! + let entry = SimpleEntry(date: entryDate) + entries.append(entry) + } + + let timeline = Timeline(entries: entries, policy: .atEnd) + completion(timeline) + } + } + + struct SimpleEntry: TimelineEntry { + public let date: Date + } + + struct PlaceholderView: View { + var body: some View { + Text("Placeholder View") + } + } + + struct MyWidgetEntryView: View { + var entry: Provider.Entry + + var body: some View { + Text(entry.date, style: .time) + } + } + + @main + struct MyWidget: Widget { + private let kind: String = "MyWidget" + + public var body: some WidgetConfiguration { + StaticConfiguration(kind: kind, provider: Provider()) { entry in + MyWidgetEntryView(entry: entry) + } + .configurationDisplayName("MyWidget") + .description("This is an example widget.") + } + } + +#endif diff --git a/fixtures/ios_app_with_appclip/Project.swift b/fixtures/ios_app_with_appclip/Project.swift index 8e55428408a..6d997ef2f74 100644 --- a/fixtures/ios_app_with_appclip/Project.swift +++ b/fixtures/ios_app_with_appclip/Project.swift @@ -44,6 +44,7 @@ let project = Project( dependencies: [ .target(name: "Framework"), .target(name: "StaticFramework"), + .target(name: "AppClip1Widgets"), ] ), .target( @@ -69,5 +70,22 @@ let project = Project( .target(name: "AppClip1"), ] ), + .target( + name: "AppClip1Widgets", + destinations: .iOS, + product: .appExtension, + bundleId: "io.tuist.App.Clip.Widgets", + infoPlist: .extendingDefault(with: [ + "CFBundleDisplayName": "$(PRODUCT_NAME)", + "NSExtension": [ + "NSExtensionPointIdentifier": "com.apple.widgetkit-extension", + ], + ]), + sources: "AppClip1Widgets/Sources/**", + resources: "AppClip1Widgets/Resources/**", + dependencies: [ + .target(name: "StaticFramework"), + ] + ), ] ) From f9f3f98b8730503de7ee0d874bedb600af9cb862 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 12:12:40 +0200 Subject: [PATCH 286/509] add lucasmpaim as a contributor for code (#6294) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6dc970410d7..d159fc6958c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1355,6 +1355,15 @@ "contributions": [ "doc" ] + }, + { + "login": "lucasmpaim", + "name": "Lucas Mrowskovsky Paim", + "avatar_url": "https://avatars.githubusercontent.com/u/7849484?v=4", + "profile": "https://www.linkedin.com/in/lucas-paim/", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 00f1b72c9f0..a67e3ce6f24 100644 --- a/README.md +++ b/README.md @@ -528,6 +528,7 @@ Thanks goes to these wonderful people:
    Alexander Filimonov

    Gorbenko Roman
    +
    Lucas Mrowskovsky Paim
    From e157ebda61f6d81b72d130c767865537cebd22f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 20 May 2024 14:33:06 +0200 Subject: [PATCH 287/509] Fix tuist generate when a binary dependency is removed (#6298) --- .../PackageInfoMapper.swift | 22 ++++++++---- .../PackageInfoMapperTests.swift | 36 +++++++++++++++++++ 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index d9fb9ad054b..469fc074b9d 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -150,14 +150,24 @@ public final class PackageInfoMapper: PackageInfoMapping { packageToFolder[packageInfo.key]!.appending(try RelativePath(validating: path)) .pathString ) - } else { - // remote binaries are checked out by SPM in artifacts//.xcframework - // or in artifacts//.xcframework when using SPM 5.6 and later - guard let artifactPath = packageToTargetsToArtifactPaths[packageInfo.key]?[target.name] else { - throw PackageInfoMapperError.missingBinaryArtifact(package: packageInfo.key, target: target.name) - } + } + // remote binaries are checked out by SPM in artifacts//.xcframework + // or in artifacts//.xcframework when using SPM 5.6 and later + else if let artifactPath = packageToTargetsToArtifactPaths[packageInfo.key]?[target.name] { result[target.name] = .path(artifactPath.pathString) } + // If the binary path is not present in the `.build/workspace-state.json`, we try to use a default path. + // If the target is not used by a downstream target, the generation will ignore a missing binary artifact. + // Otherwise, users will get an error that the xcframework was not found. + else { + result[target.name] = .path( + packageToFolder[packageInfo.key]!.appending( + components: target.name, + "\(target.name).xcframework" + ) + .pathString + ) + } } } diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 31d54cf908a..1d71733e330 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -65,6 +65,42 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ) } + func testResolveDependencies_whenProductContainsBinaryTargetMissingFrom_packageToTargetsToArtifactPaths() throws { + let basePath = try temporaryPath() + try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Sources/Target_1"))) + try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Sources/Target_2"))) + let resolvedDependencies = try subject.resolveExternalDependencies( + packageInfos: [ + "Package": .init( + name: "Package", + products: [ + .init(name: "Product1", type: .library(.automatic), targets: ["Target_1", "Target_2"]), + ], + targets: [ + .test(name: "Target_1", type: .binary, url: "https://binary.target.com"), + .test(name: "Target_2"), + ], + platforms: [.ios], + cLanguageStandard: nil, + cxxLanguageStandard: nil, + swiftLanguageVersions: nil + ), + ], + packageToFolder: ["Package": basePath], + packageToTargetsToArtifactPaths: [:] + ) + + XCTAssertEqual( + resolvedDependencies, + [ + "Product1": [ + .xcframework(path: "\(basePath.pathString)/Target_1/Target_1.xcframework"), + .project(target: "Target_2", path: .relativeToManifest(basePath.pathString)), + ], + ] + ) + } + func testResolveDependencies_whenPackageIDDifferentThanName() throws { let basePath = try temporaryPath() try fileHandler.createFolder(basePath.appending(try RelativePath(validating: "Package/Sources/Target_1"))) From b9f1fb047fbd4134b979e5972716be1735ff525a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 20 May 2024 16:12:08 +0200 Subject: [PATCH 288/509] Add status to CommandEvent (#6285) --- .../TuistAnalytics/Models/CommandEvent.swift | 10 ++++- .../CommandEventFactory.swift | 3 +- .../TrackableCommand/TrackableCommand.swift | 22 +++++++--- .../CommandEventFactoryTests.swift | 6 ++- .../TrackableCommandTests.swift | 40 ++++++++++++++++++- 5 files changed, 70 insertions(+), 11 deletions(-) diff --git a/Sources/TuistAnalytics/Models/CommandEvent.swift b/Sources/TuistAnalytics/Models/CommandEvent.swift index ded8d4c20a2..0f58efa3d9f 100644 --- a/Sources/TuistAnalytics/Models/CommandEvent.swift +++ b/Sources/TuistAnalytics/Models/CommandEvent.swift @@ -15,6 +15,11 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent { public let macOSVersion: String public let machineHardwareName: String public let isCI: Bool + public let status: Status + + public enum Status: Codable, Equatable { + case success, failure(String) + } public let id = UUID() public let date = Date() @@ -32,6 +37,7 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent { case macOSVersion = "macos_version" case machineHardwareName case isCI + case status } public init( @@ -45,7 +51,8 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent { swiftVersion: String, macOSVersion: String, machineHardwareName: String, - isCI: Bool + isCI: Bool, + status: Status ) { self.name = name self.subcommand = subcommand @@ -58,5 +65,6 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent { self.macOSVersion = macOSVersion self.machineHardwareName = machineHardwareName self.isCI = isCI + self.status = status } } diff --git a/Sources/TuistKit/Commands/TrackableCommand/CommandEventFactory.swift b/Sources/TuistKit/Commands/TrackableCommand/CommandEventFactory.swift index dc6a91bb0cf..c3ea3ec95da 100644 --- a/Sources/TuistKit/Commands/TrackableCommand/CommandEventFactory.swift +++ b/Sources/TuistKit/Commands/TrackableCommand/CommandEventFactory.swift @@ -27,7 +27,8 @@ public final class CommandEventFactory { swiftVersion: machineEnvironment.swiftVersion, macOSVersion: machineEnvironment.macOSVersion, machineHardwareName: machineEnvironment.hardwareName, - isCI: machineEnvironment.isCI + isCI: machineEnvironment.isCI, + status: info.status ) return commandEvent } diff --git a/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift b/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift index 0323b0a443e..9de3317e372 100644 --- a/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift +++ b/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift @@ -1,6 +1,7 @@ import AnyCodable import ArgumentParser import Foundation +import TuistAnalytics import TuistAsyncQueue import TuistSupport @@ -11,6 +12,7 @@ public struct TrackableCommandInfo { let parameters: [String: AnyCodable] let commandArguments: [String] let durationInMs: Int + let status: CommandEvent.Status } /// A `TrackableCommand` wraps a `ParsableCommand` and reports its execution to an analytics provider @@ -41,11 +43,20 @@ public class TrackableCommand: TrackableParametersDelegate { if let command = command as? HasTrackableParameters { type(of: command).analyticsDelegate = self } - if var asyncCommand = command as? AsyncParsableCommand { - try await asyncCommand.run() - } else { - try command.run() + do { + if var asyncCommand = command as? AsyncParsableCommand { + try await asyncCommand.run() + } else { + try command.run() + } + try dispatchCommandEvent(timer: timer, status: .success) + } catch { + try dispatchCommandEvent(timer: timer, status: .failure("\(error)")) + throw error } + } + + private func dispatchCommandEvent(timer: any ClockTimer, status: CommandEvent.Status) throws { let durationInSeconds = timer.stop() let durationInMs = Int(durationInSeconds * 1000) let configuration = type(of: command).configuration @@ -55,7 +66,8 @@ public class TrackableCommand: TrackableParametersDelegate { subcommand: subcommand, parameters: trackedParameters, commandArguments: commandArguments, - durationInMs: durationInMs + durationInMs: durationInMs, + status: status ) let commandEvent = commandEventFactory.make(from: info) try asyncQueue.dispatch(event: commandEvent) diff --git a/Tests/TuistKitTests/CommandTracking/CommandEventFactoryTests.swift b/Tests/TuistKitTests/CommandTracking/CommandEventFactoryTests.swift index a96093d58c6..dae7ab13451 100644 --- a/Tests/TuistKitTests/CommandTracking/CommandEventFactoryTests.swift +++ b/Tests/TuistKitTests/CommandTracking/CommandEventFactoryTests.swift @@ -32,7 +32,8 @@ final class CommandEventFactoryTests: TuistUnitTestCase { subcommand: "warm", parameters: ["foo": "bar"], commandArguments: ["cache", "warm"], - durationInMs: 5000 + durationInMs: 5000, + status: .failure("Failed!") ) let expectedEvent = CommandEvent( name: "cache", @@ -45,7 +46,8 @@ final class CommandEventFactoryTests: TuistUnitTestCase { swiftVersion: "5.1", macOSVersion: "10.15.0", machineHardwareName: "arm64", - isCI: false + isCI: false, + status: .failure("Failed!") ) // When diff --git a/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift b/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift index fe56aff609b..1c7ea14b983 100644 --- a/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift +++ b/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift @@ -25,9 +25,12 @@ final class TrackableCommandTests: TuistTestCase { super.tearDown() } - private func makeSubject(flag: Bool = true) { + private func makeSubject( + flag: Bool = true, + shouldFail: Bool = false + ) { subject = TrackableCommand( - command: TestCommand(flag: flag), + command: TestCommand(flag: flag, shouldFail: shouldFail), commandArguments: ["cache", "warm"], clock: WallClock(), asyncQueue: mockAsyncQueue @@ -64,18 +67,51 @@ final class TrackableCommandTests: TuistTestCase { XCTAssertEqual(event.name, "test") XCTAssertEqual(event.params, expectedParams) } + + func test_whenCommandFails_dispatchesEventWithExpectedInfo() async throws { + // Given + makeSubject(flag: false, shouldFail: true) + let expectedParams: [String: AnyCodable] = ["flag": false] + // When + await XCTAssertThrowsSpecific(try await subject.run(), TestCommand.TestError.commandFailed) + + // Then + XCTAssertEqual(mockAsyncQueue.invokedDispatchCount, 1) + let event = try XCTUnwrap(mockAsyncQueue.invokedDispatchParameters?.event as? CommandEvent) + XCTAssertEqual(event.name, "test") + XCTAssertEqual(event.status, .failure("Command failed")) + } } private struct TestCommand: ParsableCommand, HasTrackableParameters { + enum TestError: FatalError, Equatable { + case commandFailed + + var type: TuistSupport.ErrorType { + switch self { + case .commandFailed: + return .abort + } + } + + var description: String { + "Command failed" + } + } + static var configuration: CommandConfiguration { CommandConfiguration(commandName: "test") } var flag: Bool = false + var shouldFail: Bool = false static var analyticsDelegate: TrackableParametersDelegate? func run() throws { + if shouldFail { + throw TestError.commandFailed + } TestCommand.analyticsDelegate?.addParameters(["flag": AnyCodable(flag)]) } } From 900bf00d4330251fdc49ddc8c4cd2cdb6e2d910a Mon Sep 17 00:00:00 2001 From: Tuist Date: Mon, 20 May 2024 16:47:28 +0000 Subject: [PATCH 289/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.14.0 --- .mise.toml | 2 +- CHANGELOG.md | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index c08cc167375..4a98a291960 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.13.0" +tuist = "4.14.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index a506640da3a..5f7d70d484f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## 4.14.0 - 2024-05-20 + +### Tuist + +#### Added + +- Add Widget Extension support to AppClips [#6287](https://github.com/tuist/tuist/pull/6287) by [@pepicrft](https://github.com/pepicrft) + +#### Fixed + +- Fix integration of SPM packages with slashes in their targets names [#6260](https://github.com/tuist/tuist/pull/6260) by [@kapitoshka438](https://github.com/kapitoshka438) +- Fix tuist generate when a binary SPM dependency is removed [#6298](https://github.com/tuist/tuist/pull/6298) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +- no changes + ## 4.13.0 - 2024-05-14 ### Tuist From 8fcda83f25f1c920867e3fe63c447a5749980059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 20 May 2024 19:37:09 +0200 Subject: [PATCH 290/509] Fix missing -package-name when a target has custom swiftSettings (#6299) * Fix missing -package-name when a target has custom swiftSettings * Align iOS version in ios_app_with_spm_dependencies fixture --- .../Graph/DependenciesGraph+TestData.swift | 2 +- .../PackageInfoMapper.swift | 13 ++++- .../PackageInfoMapperTests.swift | 16 ++++--- .../App/Sources/ContentView.swift | 3 ++ .../Project.swift | 5 +- .../Tuist/Package.resolved | 47 ++++++++++++++++++- .../Tuist/Package.swift | 2 + 7 files changed, 77 insertions(+), 11 deletions(-) diff --git a/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift b/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift index 1cc8e7e65c2..e5891ac26d7 100644 --- a/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift +++ b/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift @@ -678,7 +678,7 @@ extension DependenciesGraph { "USE_HEADERMAP": "NO", "OTHER_SWIFT_FLAGS": ["-package-name", packageName.quotedIfContainsSpaces], ] - var settingsDictionary = customSettings.merging(defaultSpmSettings, uniquingKeysWith: { custom, _ in custom }) + var settingsDictionary = defaultSpmSettings.combine(with: customSettings) if let moduleMap { settingsDictionary["MODULEMAP_FILE"] = .string(moduleMap) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 469fc074b9d..c69db3ed6c5 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -1023,7 +1023,18 @@ extension ProjectDescription.Settings { } return .settings( - base: .from(settingsDictionary: baseSettings.base).merging(mappedSettingsDictionary, uniquingKeysWith: { $1 }), + base: .from(settingsDictionary: baseSettings.base) + .merging( + mappedSettingsDictionary, + uniquingKeysWith: { + switch ($0, $1) { + case let (.array(leftArray), .array(rightArray)): + return SettingValue.array(leftArray + rightArray) + default: + return $1 + } + } + ), configurations: configurations .sorted { $0.name.rawValue < $1.name.rawValue }, defaultSettings: .from(defaultSettings: baseSettings.defaultSettings) diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 1d71733e330..6226827aed8 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -2019,12 +2019,16 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), ] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", targets: [ - .test("Target1", basePath: basePath, customSettings: ["OTHER_SWIFT_FLAGS": ["key1", "key2", "key3"]]), + .test( + "Target1", + basePath: basePath, + customSettings: ["OTHER_SWIFT_FLAGS": ["$(inherited)", "key1", "key2", "key3"]] + ), ] ) ) @@ -2058,7 +2062,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), ] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", @@ -2066,7 +2070,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - customSettings: ["OTHER_SWIFT_FLAGS": ["-enable-upcoming-feature \"Foo\""]] + customSettings: ["OTHER_SWIFT_FLAGS": ["$(inherited)", "-enable-upcoming-feature \"Foo\""]] ), ] ) @@ -2101,7 +2105,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ), ] ) - XCTAssertEqual( + XCTAssertBetterEqual( project, .testWithDefaultConfigs( name: "Package", @@ -2109,7 +2113,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - customSettings: ["OTHER_SWIFT_FLAGS": ["-enable-experimental-feature \"Foo\""]] + customSettings: ["OTHER_SWIFT_FLAGS": ["$(inherited)", "-enable-experimental-feature \"Foo\""]] ), ] ) diff --git a/fixtures/ios_app_with_spm_dependencies/App/Sources/ContentView.swift b/fixtures/ios_app_with_spm_dependencies/App/Sources/ContentView.swift index 3df539af66d..64638708a26 100644 --- a/fixtures/ios_app_with_spm_dependencies/App/Sources/ContentView.swift +++ b/fixtures/ios_app_with_spm_dependencies/App/Sources/ContentView.swift @@ -1,4 +1,5 @@ import Buy +import JWTKit import KSCrash_Installations import Pay import SwiftUI @@ -10,6 +11,8 @@ struct ContentView: View { _ = PayAddress() // Use KSCrash _ = KSCrashInstallationStandard() + // Use JWTKit + _ = JWTKit.ES256PrivateKey() } var body: some View { diff --git a/fixtures/ios_app_with_spm_dependencies/Project.swift b/fixtures/ios_app_with_spm_dependencies/Project.swift index 233f6f6be12..8d55b98f37d 100644 --- a/fixtures/ios_app_with_spm_dependencies/Project.swift +++ b/fixtures/ios_app_with_spm_dependencies/Project.swift @@ -8,7 +8,7 @@ let project = Project( destinations: .iOS, product: .app, bundleId: "io.tuist.app", - deploymentTargets: .iOS("14.0"), + deploymentTargets: .iOS("16.0"), infoPlist: .default, sources: "App/Sources/**", resources: "App/Resources/**", @@ -16,6 +16,7 @@ let project = Project( .external(name: "Buy"), .external(name: "Pay"), .external(name: "KSCrash"), + .external(name: "JWTKit"), .sdk(name: "c++", type: .library, status: .required), ] ), @@ -24,7 +25,7 @@ let project = Project( destinations: .iOS, product: .unitTests, bundleId: "io.tuist.app.tests", - deploymentTargets: .iOS("14.0"), + deploymentTargets: .iOS("16.0"), infoPlist: .default, sources: "AppTests/**", dependencies: [.target(name: "App")] diff --git a/fixtures/ios_app_with_spm_dependencies/Tuist/Package.resolved b/fixtures/ios_app_with_spm_dependencies/Tuist/Package.resolved index 684a9699fcf..0933805b29f 100644 --- a/fixtures/ios_app_with_spm_dependencies/Tuist/Package.resolved +++ b/fixtures/ios_app_with_spm_dependencies/Tuist/Package.resolved @@ -1,6 +1,24 @@ { - "originHash" : "fc3374625da9a1a42edd765287e0715853d94414eda5959e9d420d041ec3b010", + "originHash" : "1daeb9a853c51e17c138cf3bca0322cfb85340fe1fbf28fe3baeb52cd037df48", "pins" : [ + { + "identity" : "bigint", + "kind" : "remoteSourceControl", + "location" : "https://github.com/attaswift/BigInt.git", + "state" : { + "revision" : "0ed110f7555c34ff468e72e1686e59721f2b0da6", + "version" : "5.3.0" + } + }, + { + "identity" : "jwt-kit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/vapor/jwt-kit.git", + "state" : { + "revision" : "6f512cb5a531e684f2e5238924be81db0b3303b4", + "version" : "5.0.0-beta.3" + } + }, { "identity" : "kscrash", "kind" : "remoteSourceControl", @@ -18,6 +36,33 @@ "revision" : "6bd23c2f6243f73ef6ec135723d4909bc068409e", "version" : "12.0.0" } + }, + { + "identity" : "swift-asn1", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-asn1.git", + "state" : { + "revision" : "c7e239b5c1492ffc3ebd7fbcc7a92548ce4e78f0", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-certificates", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-certificates.git", + "state" : { + "revision" : "83640c8097acaec17c9835a083e89678cb0f2b66", + "version" : "1.3.0" + } + }, + { + "identity" : "swift-crypto", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-crypto.git", + "state" : { + "revision" : "bc1c29221f6dfeb0ebbfbc98eb95cd3d4967868e", + "version" : "3.4.0" + } } ], "version" : 3 diff --git a/fixtures/ios_app_with_spm_dependencies/Tuist/Package.swift b/fixtures/ios_app_with_spm_dependencies/Tuist/Package.swift index dd9886efd1b..c449bf33443 100644 --- a/fixtures/ios_app_with_spm_dependencies/Tuist/Package.swift +++ b/fixtures/ios_app_with_spm_dependencies/Tuist/Package.swift @@ -8,5 +8,7 @@ let package = Package( .package(url: "https://github.com/Shopify/mobile-buy-sdk-ios", exact: "12.0.0"), // Has targets with slash symbols in their names .package(url: "https://github.com/kstenerud/KSCrash", exact: "1.17.1"), + // Has custom `swiftSettings` and uses the package access level + .package(url: "https://github.com/vapor/jwt-kit.git", .upToNextMajor(from: "5.0.0-beta.2.1")), ] ) From 48cab5ad38ae9bcbc571f1e2b4e1f26529b87d44 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 21 May 2024 08:13:46 +0200 Subject: [PATCH 291/509] add ActuallyTaylor as a contributor for code (#6303) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d159fc6958c..d0e82e0ef8e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1364,6 +1364,15 @@ "contributions": [ "code" ] + }, + { + "login": "ActuallyTaylor", + "name": "Taylor Lineman", + "avatar_url": "https://avatars.githubusercontent.com/u/32944568?v=4", + "profile": "http://actuallytaylor.com", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index a67e3ce6f24..722888cf92e 100644 --- a/README.md +++ b/README.md @@ -529,6 +529,7 @@ Thanks goes to these wonderful people:
    Alexander Filimonov

    Gorbenko Roman

    Lucas Mrowskovsky Paim
    +
    Taylor Lineman
    From 382372f20efca16339c952e46d1a929b8d2f5c33 Mon Sep 17 00:00:00 2001 From: Taylor Lineman Date: Tue, 21 May 2024 02:14:28 -0400 Subject: [PATCH 292/509] Support "Code Sign on Copy" in Copy Files Actions (#6302) * Added Codesign attribute * Added tests * Updated name and documentation * Fixed tests * Fixed linting --- .../ProjectDescription/CopyFileElement.swift | 12 +++++++----- .../Generator/BuildPhaseGenerator.swift | 14 +++++++++++++- .../TuistGraph/Models/CopyFileElement.swift | 17 ++++++++++++----- .../CopyFileElement+ManifestMapper.swift | 17 +++++++++++++---- .../Generator/BuildPhaseGeneratorTests.swift | 18 ++++++++++++++++++ 5 files changed, 63 insertions(+), 15 deletions(-) diff --git a/Sources/ProjectDescription/CopyFileElement.swift b/Sources/ProjectDescription/CopyFileElement.swift index 20f867fd287..3da4fb22edf 100644 --- a/Sources/ProjectDescription/CopyFileElement.swift +++ b/Sources/ProjectDescription/CopyFileElement.swift @@ -1,13 +1,15 @@ import Foundation -/// A file element from a glob pattern or a folder reference which is conditionally applied to specific platforms. +/// A file element from a glob pattern or a folder reference which is conditionally applied to specific platforms with an optional +/// "Code Sign On Copy" flag. public enum CopyFileElement: Codable, Equatable { - /// A file path (or glob pattern) to include with an optional PlatformCondition to control which platforms it applies to. - case glob(pattern: Path, condition: PlatformCondition? = nil) + /// A file path (or glob pattern) to include with an optional PlatformCondition to control which platforms it applies. + /// "Code Sign on Copy" can be optionally enabled for the glob. + case glob(pattern: Path, condition: PlatformCondition? = nil, codeSignOnCopy: Bool = false) /// A directory path to include as a folder reference with an optional PlatformCondition to control which platforms it applies - /// to. - case folderReference(path: Path, condition: PlatformCondition? = nil) + /// to. "Code Sign on Copy" can be optionally enabled for the folder reference. + case folderReference(path: Path, condition: PlatformCondition? = nil, codeSignOnCopy: Bool = false) private enum TypeName: String, Codable { case glob diff --git a/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift b/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift index 9601a0631d3..9a0bb296dec 100644 --- a/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift +++ b/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift @@ -410,8 +410,20 @@ final class BuildPhaseGenerator: BuildPhaseGenerating { throw BuildPhaseGenerationError.missingFileReference(filePath) } + var settings: [String: Any]? + + /// File ATTRIBUTES + /// example: `settings = {ATTRIBUTES = (Codesign, )`} + if file.codeSignOnCopy { + var settingsCopy = settings ?? [:] + var attributes = settingsCopy["ATTRIBUTES"] as? [String] ?? [] + attributes.append("CodeSignOnCopy") + settingsCopy["ATTRIBUTES"] = attributes + settings = settingsCopy + } + if buildFilesCache.contains(filePath) == false { - let pbxBuildFile = PBXBuildFile(file: fileReference) + let pbxBuildFile = PBXBuildFile(file: fileReference, settings: settings) pbxBuildFile.applyPlatformFilters(file.condition?.platformFilters) pbxBuildFiles.append(pbxBuildFile) buildFilesCache.insert(filePath) diff --git a/Sources/TuistGraph/Models/CopyFileElement.swift b/Sources/TuistGraph/Models/CopyFileElement.swift index 562be62ecf5..b6a070c13fd 100644 --- a/Sources/TuistGraph/Models/CopyFileElement.swift +++ b/Sources/TuistGraph/Models/CopyFileElement.swift @@ -2,14 +2,14 @@ import Foundation import TSCBasic public enum CopyFileElement: Equatable, Hashable, Codable { - case file(path: AbsolutePath, condition: PlatformCondition? = nil) - case folderReference(path: AbsolutePath, condition: PlatformCondition? = nil) + case file(path: AbsolutePath, condition: PlatformCondition? = nil, codeSignOnCopy: Bool = false) + case folderReference(path: AbsolutePath, condition: PlatformCondition? = nil, codeSignOnCopy: Bool = false) public var path: AbsolutePath { switch self { - case let .file(path, _): + case let .file(path, _, _): return path - case let .folderReference(path, _): + case let .folderReference(path, _, _): return path } } @@ -25,8 +25,15 @@ public enum CopyFileElement: Equatable, Hashable, Codable { public var condition: PlatformCondition? { switch self { - case let .file(_, condition), let .folderReference(_, condition): + case let .file(_, condition, _), let .folderReference(_, condition, _): return condition } } + + public var codeSignOnCopy: Bool { + switch self { + case let .file(_, _, codeSignOnCopy), let .folderReference(_, _, codeSignOnCopy): + return codeSignOnCopy + } + } } diff --git a/Sources/TuistLoader/Models+ManifestMappers/CopyFileElement+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/CopyFileElement+ManifestMapper.swift index d6e1edb5059..8b3d4892fce 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/CopyFileElement+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/CopyFileElement+ManifestMapper.swift @@ -51,12 +51,21 @@ extension TuistGraph.CopyFileElement { } switch manifest { - case let .glob(pattern: pattern, condition: condition): + case let .glob(pattern: pattern, condition: condition, codeSignOnCopy: codeSign): let resolvedPath = try generatorPaths.resolve(path: pattern) - return try globFiles(resolvedPath).map { .file(path: $0, condition: condition?.asGraphCondition) } - case let .folderReference(path: folderReferencePath, condition: condition): + return try globFiles(resolvedPath).map { .file( + path: $0, + condition: condition?.asGraphCondition, + codeSignOnCopy: codeSign + ) + } + case let .folderReference(path: folderReferencePath, condition: condition, codeSignOnCopy: codeSign): let resolvedPath = try generatorPaths.resolve(path: folderReferencePath) - return folderReferences(resolvedPath).map { .folderReference(path: $0, condition: condition?.asGraphCondition) } + return folderReferences(resolvedPath).map { .folderReference( + path: $0, + condition: condition?.asGraphCondition, + codeSignOnCopy: codeSign + ) } } } } diff --git a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift index 716ccc18515..1933e4697e7 100644 --- a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift @@ -866,6 +866,9 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { .file(path: "/path/fonts/font1.ttf"), .file(path: "/path/fonts/font2.ttf"), .file(path: "/path/fonts/font3.ttf", condition: .when([.macos])), + .file(path: "/path/fonts/font4.ttf", codeSignOnCopy: true), + .file(path: "/path/fonts/font5.ttf", condition: .when([.macos]), codeSignOnCopy: true), + .file(path: "/path/fonts/font6.ttf", codeSignOnCopy: false), ] let templates: [CopyFileElement] = [ @@ -898,12 +901,27 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { "font1.ttf", "font2.ttf", "font3.ttf", + "font4.ttf", + "font5.ttf", + "font6.ttf", ]) XCTAssertEqual(firstBuildPhase.files?.map(\.platformFilters), [ nil, nil, ["macos"], + nil, + ["macos"], + nil, + ]) + + XCTAssertEqual(firstBuildPhase.files?.map(\.settings) as? [[String: [String]]?], [ + nil, + nil, + nil, + ["ATTRIBUTES": ["CodeSignOnCopy"]], + ["ATTRIBUTES": ["CodeSignOnCopy"]], + nil, ]) let secondBuildPhase = try XCTUnwrap(nativeTarget.buildPhases.last as? PBXCopyFilesBuildPhase) From 69413b2e8394bc88515d5fbfbfc9f0631823724d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 21 May 2024 09:42:05 +0200 Subject: [PATCH 293/509] add nandodelauni as a contributor for code (#6304) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d0e82e0ef8e..2d5830f080a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1373,6 +1373,15 @@ "contributions": [ "code" ] + }, + { + "login": "nandodelauni", + "name": "Miguel Ferrando", + "avatar_url": "https://avatars.githubusercontent.com/u/1938501?v=4", + "profile": "https://github.com/nandodelauni", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 722888cf92e..a618625cdfa 100644 --- a/README.md +++ b/README.md @@ -530,6 +530,7 @@ Thanks goes to these wonderful people:
    Gorbenko Roman

    Lucas Mrowskovsky Paim

    Taylor Lineman
    +
    Miguel Ferrando
    From e9db733a3779c53d4113c75994e6826163858860 Mon Sep 17 00:00:00 2001 From: Eduard Miniakhmetov Date: Tue, 21 May 2024 10:46:49 +0300 Subject: [PATCH 294/509] Fix target linter to allow hyphen (#6290) --- Sources/TuistGenerator/Linter/TargetLinter.swift | 8 ++++---- .../Linter/TargetLinterTests.swift | 11 +++++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Sources/TuistGenerator/Linter/TargetLinter.swift b/Sources/TuistGenerator/Linter/TargetLinter.swift index 8821d54cefc..b85afaeaf36 100644 --- a/Sources/TuistGenerator/Linter/TargetLinter.swift +++ b/Sources/TuistGenerator/Linter/TargetLinter.swift @@ -76,14 +76,14 @@ class TargetLinter: TargetLinting { private func lintProductName(target: Target) -> [LintingIssue] { var allowed = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_") - let allowsDot = target.product == .app || target.product == .commandLineTool - if allowsDot { - allowed.formUnion(CharacterSet(charactersIn: ".")) + let allowsExtraCharacters = target.product != .framework && target.product != .staticFramework + if allowsExtraCharacters { + allowed.formUnion(CharacterSet(charactersIn: ".-")) } if target.productName.unicodeScalars.allSatisfy(allowed.contains) == false { let reason = - "Invalid product name '\(target.productName)'. This string must contain only alphanumeric (A-Z,a-z,0-9)\(allowsDot ? ", period (.)" : ""), and underscore (_) characters." + "Invalid product name '\(target.productName)'. This string must contain only alphanumeric (A-Z,a-z,0-9)\(allowsExtraCharacters ? ", period (.), hyphen (-)" : ""), and underscore (_) characters." return [LintingIssue(reason: reason, severity: .warning)] } diff --git a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift index 1b3deb0e70b..40db52f5139 100644 --- a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift @@ -27,12 +27,12 @@ final class TargetLinterTests: TuistUnitTestCase { let got = self.subject.lint(target: target) let reason: String switch target.product { - case .app, .commandLineTool: + case .framework, .staticFramework: reason = - "Invalid product name '\(target.productName)'. This string must contain only alphanumeric (A-Z,a-z,0-9), period (.), and underscore (_) characters." + "Invalid product name '\(target.productName)'. This string must contain only alphanumeric (A-Z,a-z,0-9), and underscore (_) characters." default: reason = - "Invalid product name '\(target.productName)'. This string must contain only alphanumeric (A-Z,a-z,0-9), and underscore (_) characters." + "Invalid product name '\(target.productName)'. This string must contain only alphanumeric (A-Z,a-z,0-9), period (.), hyphen (-), and underscore (_) characters." } self.XCTContainsLintingIssue(got, LintingIssue(reason: reason, severity: .warning)) @@ -44,11 +44,14 @@ final class TargetLinterTests: TuistUnitTestCase { } XCTAssertValidProductNameApp(Target.test(product: .app, productName: "MyApp.iOS")) + XCTAssertValidProductNameApp(Target.test(product: .app, productName: "MyApp-iOS")) + XCTAssertValidProductNameApp(Target.test(product: .bundle, productName: "MyBundle.macOS")) + XCTAssertValidProductNameApp(Target.test(product: .bundle, productName: "MyBundle-macOS")) XCTAssertValidProductNameApp(Target.test(productName: "MyFramework_iOS")) XCTAssertValidProductNameApp(Target.test(productName: "MyFramework")) XCTAssertInvalidProductNameApp(Target.test(product: .framework, productName: "MyFramework.iOS")) - XCTAssertInvalidProductNameApp(Target.test(productName: "MyFramework-iOS")) + XCTAssertInvalidProductNameApp(Target.test(product: .framework, productName: "MyFramework-iOS")) XCTAssertInvalidProductNameApp(Target.test(productName: "ⅫFramework")) XCTAssertInvalidProductNameApp(Target.test(productName: "ؼFramework")) } From a647f6f902bcec66cfd952d2bd5525f2bb64898c Mon Sep 17 00:00:00 2001 From: Lucas Mrowskovsky Paim Date: Tue, 21 May 2024 04:55:11 -0300 Subject: [PATCH 295/509] Add capability to specify variable entitlements (#6293) * Add capability to set CODE_SIGN_ENTITLEMENTS on XCConfig fix for #5940 Currently, Xcode don't have a good support for variables inside an entitlement value, causing an issue in projects with multiple environments and appclip * rename entitlement.xcconfig to entitlment.variable also add a new unit test to test variable set by string literal * expand docs for Entitlement.variable --- Sources/ProjectDescription/Entitlements.swift | 28 ++++++- .../Generator/ConfigGenerator.swift | 16 ++-- Sources/TuistGraph/Models/Plist.swift | 9 ++- .../Entitlements+ManifestMapper.swift | 2 + .../Generator/ConfigGeneratorTests.swift | 81 +++++++++++++++++++ 5 files changed, 128 insertions(+), 8 deletions(-) diff --git a/Sources/ProjectDescription/Entitlements.swift b/Sources/ProjectDescription/Entitlements.swift index 135d4042f77..b3ffdb20f2d 100644 --- a/Sources/ProjectDescription/Entitlements.swift +++ b/Sources/ProjectDescription/Entitlements.swift @@ -9,6 +9,28 @@ public enum Entitlements: Codable, Equatable { /// A dictionary with the entitlements content. Tuist generates the .entitlements file at the generation time. case dictionary([String: Plist.Value]) + /** + A user defined xcconfig variable map to .entitlements file. + + This should be used when the project has different entitlements files per config (aka: debug,release,staging,etc) + + ```` + .target( + ... + entitlements: .variable("$(ENTITLEMENT_FILE_VARIABLE)"), + ) + ```` + + Or as literal string + ```` + .target( + ... + entitlements: $(ENTITLEMENT_FILE_VARIABLE), + ) + ```` + */ + case variable(String) + // MARK: - Error public enum CodingError: Error { @@ -31,6 +53,10 @@ public enum Entitlements: Codable, Equatable { extension Entitlements: ExpressibleByStringInterpolation { public init(stringLiteral value: String) { - self = .file(path: .path(value)) + if value.hasPrefix("$(") { + self = .variable(value) + } else { + self = .file(path: .path(value)) + } } } diff --git a/Sources/TuistGenerator/Generator/ConfigGenerator.swift b/Sources/TuistGenerator/Generator/ConfigGenerator.swift index 6fb8f1a5216..58a8bb431c3 100644 --- a/Sources/TuistGenerator/Generator/ConfigGenerator.swift +++ b/Sources/TuistGenerator/Generator/ConfigGenerator.swift @@ -251,12 +251,16 @@ final class ConfigGenerator: ConfigGenerating { } // Entitlements - if let entitlements = target.entitlements, let path = entitlements.path { - let relativePath = path.relative(to: sourceRootPath).pathString - if project.xcodeProjPath.parentDirectory == sourceRootPath { - settings["CODE_SIGN_ENTITLEMENTS"] = .string(relativePath) - } else { - settings["CODE_SIGN_ENTITLEMENTS"] = .string("$(SRCROOT)/\(relativePath)") + if let entitlements = target.entitlements { + if let path = entitlements.path { + let relativePath = path.relative(to: sourceRootPath).pathString + if project.xcodeProjPath.parentDirectory == sourceRootPath { + settings["CODE_SIGN_ENTITLEMENTS"] = .string(relativePath) + } else { + settings["CODE_SIGN_ENTITLEMENTS"] = .string("$(SRCROOT)/\(relativePath)") + } + } else if case let .variable(configName) = entitlements { + settings["CODE_SIGN_ENTITLEMENTS"] = .string(configName) } } diff --git a/Sources/TuistGraph/Models/Plist.swift b/Sources/TuistGraph/Models/Plist.swift index 2b5eb101b9a..4d0ee174cc5 100644 --- a/Sources/TuistGraph/Models/Plist.swift +++ b/Sources/TuistGraph/Models/Plist.swift @@ -140,6 +140,9 @@ public enum Entitlements: Equatable, Codable { // User defined dictionary of keys/values for an .entitlements file. case dictionary([String: Plist.Value]) + // A user defined xcconfig variable map to .entitlements file + case variable(String) + // MARK: - Public public var path: AbsolutePath? { @@ -156,6 +159,10 @@ public enum Entitlements: Equatable, Codable { extension Entitlements: ExpressibleByStringLiteral { public init(stringLiteral value: String) { - self = .file(path: try! AbsolutePath(validating: value)) // swiftlint:disable:this force_try + if value.hasPrefix("$(") { + self = .variable(value) + } else { + self = .file(path: try! AbsolutePath(validating: value)) // swiftlint:disable:this force_try + } } } diff --git a/Sources/TuistLoader/Models+ManifestMappers/Entitlements+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Entitlements+ManifestMapper.swift index c91e62b504d..c5260ea4621 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Entitlements+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Entitlements+ManifestMapper.swift @@ -19,6 +19,8 @@ extension TuistGraph.Entitlements { return .dictionary( dictionary.mapValues { TuistGraph.Plist.Value.from(manifest: $0) } ) + case let .variable(setting): + return .variable(setting) case .none: return .none } diff --git a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift index f3d8304713e..33334d55972 100644 --- a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift @@ -839,6 +839,87 @@ final class ConfigGeneratorTests: TuistUnitTestCase { XCTAssertEqual(targetSettingsResult, nil) } + func test_generateTargetConfig_entitlementAreCorrectlyMappedToXCConfig_when_targetIsAppClipAndXCConfigIsProvided() throws { + let projectSettings = Settings.default + let appClip = Target.test( + name: "app", + platform: .iOS, + product: .appClip, + entitlements: .variable("$(MY_CUSTOM_VARIABLE)") + ) + + let project = Project.test(targets: [appClip]) + + let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ + project.path: [ + appClip.name: appClip, + ], + ]) + let graphTraverser = GraphTraverser(graph: graph) + + // When + try subject.generateTargetConfig( + appClip, + project: project, + pbxTarget: pbxTarget, + pbxproj: pbxproj, + projectSettings: projectSettings, + fileElements: ProjectFileElements(), + graphTraverser: graphTraverser, + sourceRootPath: try AbsolutePath(validating: "/project") + ) + + // Then + let targetSettingsResult = try pbxTarget + .buildConfigurationList? + .buildConfigurations + .first { $0.name == "Debug" }? + .buildSettings + .toSettings()["CODE_SIGN_ENTITLEMENTS"] + XCTAssertEqual(targetSettingsResult, "$(MY_CUSTOM_VARIABLE)") + } + + func test_generateTargetConfig_entitlementAreCorrectlyMappedToXCConfig_when_targetIsAppClipAndXCConfigIsProvidedByStringLiteral( + ) throws { + let projectSettings = Settings.default + let appClip = Target.test( + name: "app", + platform: .iOS, + product: .appClip, + entitlements: "$(MY_CUSTOM_VARIABLE)" + ) + + let project = Project.test(targets: [appClip]) + + let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ + project.path: [ + appClip.name: appClip, + ], + ]) + let graphTraverser = GraphTraverser(graph: graph) + + // When + try subject.generateTargetConfig( + appClip, + project: project, + pbxTarget: pbxTarget, + pbxproj: pbxproj, + projectSettings: projectSettings, + fileElements: ProjectFileElements(), + graphTraverser: graphTraverser, + sourceRootPath: try AbsolutePath(validating: "/project") + ) + + // Then + let targetSettingsResult = try pbxTarget + .buildConfigurationList? + .buildConfigurations + .first { $0.name == "Debug" }? + .buildSettings + .toSettings()["CODE_SIGN_ENTITLEMENTS"] + XCTAssertEqual(targetSettingsResult, "$(MY_CUSTOM_VARIABLE)") + } + // MARK: - Helpers private func generateProjectConfig(config _: BuildConfiguration) throws { From de6dcbad2248193484d852d85ba6274360c99e18 Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Tue, 21 May 2024 03:59:33 -0400 Subject: [PATCH 296/509] Lowercase all input to be more flexible when calling test/build (#6268) --- Sources/TuistGraph/Models/Platform.swift | 21 ++++++++++++ Sources/TuistKit/Services/BuildService.swift | 8 ++--- Sources/TuistKit/Services/TestService.swift | 4 +-- .../Models/PlatformTests.swift | 32 +++++++++++++++++++ 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/Sources/TuistGraph/Models/Platform.swift b/Sources/TuistGraph/Models/Platform.swift index df0208185b1..6e65dc21757 100644 --- a/Sources/TuistGraph/Models/Platform.swift +++ b/Sources/TuistGraph/Models/Platform.swift @@ -1,4 +1,14 @@ import Foundation +import TuistSupport + +struct UnsupportedPlatformError: FatalError, CustomStringConvertible, Equatable { + let type: TuistSupport.ErrorType = .abort + + let input: String + var description: String { + "Specified platform \(input) does not map to any of these supported platforms: \(Platform.allCases.map(\.caseValue).joined(separator: ", ")) " + } +} public enum Platform: String, CaseIterable, Codable, Comparable { case iOS = "ios" @@ -17,6 +27,17 @@ public enum Platform: String, CaseIterable, Codable, Comparable { } } + init?(commandLineValue: String) { + self.init(rawValue: commandLineValue.lowercased()) + } + + public static func from(commandLineValue: String) throws -> Platform { + guard let platform = Platform(rawValue: commandLineValue.lowercased()) else { + throw UnsupportedPlatformError(input: commandLineValue) + } + return platform + } + public static func < (lhs: Platform, rhs: Platform) -> Bool { lhs.rawValue < rhs.rawValue } diff --git a/Sources/TuistKit/Services/BuildService.swift b/Sources/TuistKit/Services/BuildService.swift index bb977383a77..979c1a7397a 100644 --- a/Sources/TuistKit/Services/BuildService.swift +++ b/Sources/TuistKit/Services/BuildService.swift @@ -110,8 +110,8 @@ public final class BuildService { let buildPlatform: TuistGraph.Platform - if let platform, let inputPlatform = TuistGraph.Platform(rawValue: platform) { - buildPlatform = inputPlatform + if let platform { + buildPlatform = try TuistGraph.Platform.from(commandLineValue: platform) } else { buildPlatform = try graphTarget.target.servicePlatform } @@ -141,8 +141,8 @@ public final class BuildService { let buildPlatform: TuistGraph.Platform - if let platform, let inputPlatform = TuistGraph.Platform(rawValue: platform) { - buildPlatform = inputPlatform + if let platform { + buildPlatform = try TuistGraph.Platform.from(commandLineValue: platform) } else { buildPlatform = try graphTarget.target.servicePlatform } diff --git a/Sources/TuistKit/Services/TestService.swift b/Sources/TuistKit/Services/TestService.swift index e8c4ad5c8bd..b2db4632c7f 100644 --- a/Sources/TuistKit/Services/TestService.swift +++ b/Sources/TuistKit/Services/TestService.swift @@ -338,8 +338,8 @@ public final class TestService { // swiftlint:disable:this type_body_length let buildPlatform: TuistGraph.Platform - if let platform, let inputPlatform = TuistGraph.Platform(rawValue: platform) { - buildPlatform = inputPlatform + if let platform { + buildPlatform = try TuistGraph.Platform.from(commandLineValue: platform) } else { buildPlatform = try buildableTarget.target.servicePlatform } diff --git a/Tests/TuistGraphTests/Models/PlatformTests.swift b/Tests/TuistGraphTests/Models/PlatformTests.swift index 07d3e3d6743..11833f8e465 100644 --- a/Tests/TuistGraphTests/Models/PlatformTests.swift +++ b/Tests/TuistGraphTests/Models/PlatformTests.swift @@ -19,6 +19,38 @@ final class PlatformTests: XCTestCase { XCTAssertCodable(subject) } + func test_caseInsensitiveCommandInput() { + XCTAssertEqual(Platform.macOS, Platform(commandLineValue: "macos")) + XCTAssertEqual(Platform.macOS, Platform(commandLineValue: "macOS")) + XCTAssertEqual(Platform.macOS, Platform(commandLineValue: "MACOS")) + XCTAssertEqual(Platform.iOS, Platform(commandLineValue: "ios")) + XCTAssertEqual(Platform.iOS, Platform(commandLineValue: "iOS")) + XCTAssertEqual(Platform.iOS, Platform(commandLineValue: "IOS")) + XCTAssertEqual(Platform.tvOS, Platform(commandLineValue: "tvos")) + XCTAssertEqual(Platform.tvOS, Platform(commandLineValue: "tvOS")) + XCTAssertEqual(Platform.watchOS, Platform(commandLineValue: "watchos")) + XCTAssertEqual(Platform.watchOS, Platform(commandLineValue: "watchOS")) + XCTAssertEqual(Platform.visionOS, Platform(commandLineValue: "visionos")) + XCTAssertEqual(Platform.visionOS, Platform(commandLineValue: "visionOS")) + } + + func test_caseInvalidPlatform_throws() { + do { + let _ = try Platform.from(commandLineValue: "not_a_platform") + XCTFail("Expected erro to be thrown") + } catch let error as UnsupportedPlatformError { + XCTAssertEqual(error, UnsupportedPlatformError(input: "not_a_platform")) + } catch { + XCTFail("Unexpected error thrown") + } + } + + func test_caseValidPlatform_doesNotThrow() throws { + XCTAssertEqual(Platform.iOS, try Platform.from(commandLineValue: "iOS")) + XCTAssertEqual(Platform.macOS, try Platform.from(commandLineValue: "macOS")) + XCTAssertEqual(Platform.macOS, try Platform.from(commandLineValue: "macos")) + } + func test_xcodeSdkRoot_returns_the_right_value() { XCTAssertEqual(Platform.macOS.xcodeSdkRoot, "macosx") XCTAssertEqual(Platform.iOS.xcodeSdkRoot, "iphoneos") From 073673a4765a457dc38bb0fd53aa5c384c63ea6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 21 May 2024 15:09:56 +0200 Subject: [PATCH 297/509] Some documentation adjustments (#6305) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Group everything under Tuist Projects * Rename uFeatures to TMA * Remove the Tuist Cloud sidebar * Fix dead link * Update docs/docs/cloud/binary-caching.md Co-authored-by: Marek Fořt * Update docs/docs/guide/scale/tma-architecture.md Co-authored-by: Marek Fořt * Update docs/docs/guide/scale/tma-architecture.md Co-authored-by: Marek Fořt * Update docs/docs/guide/scale/tma-architecture.md Co-authored-by: Marek Fořt * Update docs/docs/guide/scale/tma-architecture.md Co-authored-by: Marek Fořt * Update docs/docs/guide/scale/tma-architecture.md Co-authored-by: Marek Fořt * Update docs/docs/guide/scale/tma-architecture.md Co-authored-by: Marek Fořt * Update docs/docs/guide/scale/tma-architecture.md Co-authored-by: Marek Fořt * Update docs/docs/guide/scale/tma-architecture.md Co-authored-by: Marek Fořt * Add code example --------- Co-authored-by: Marek Fořt --- docs/.vitepress/config.mjs | 98 +++++------ docs/docs/cloud/binary-caching.md | 2 +- docs/docs/guide/scale/tma-architecture.md | 107 ++++++++++++ .../guide/scale/ufeatures-architecture.md | 156 ------------------ 4 files changed, 152 insertions(+), 211 deletions(-) create mode 100644 docs/docs/guide/scale/tma-architecture.md delete mode 100644 docs/docs/guide/scale/ufeatures-architecture.md diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index b974e784b75..0f2f33135d5 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -83,7 +83,7 @@ const guideSidebar = [ ], }, { - text: "Project", + text: "Tuist Projects", items: [ { text: "Manifests", @@ -112,33 +112,50 @@ const guideSidebar = [ text: "Plugins", link: "/guide/project/plugins", }, + { + text: "Commands", + collapsed: true, + items: [ + { text: "Generate", link: "/guide/automation/generate" }, + { text: "Build", link: "/guide/automation/build" }, + { text: "Test", link: "/guide/automation/test" }, + { text: "Run", link: "/guide/automation/run" }, + { text: "Graph", link: "/guide/automation/graph" }, + { text: "Clean", link: "/guide/automation/clean" }, + ], + }, + { + text: "The Modular Architecture", + link: "/guide/scale/tma-architecture", + }, ], }, { - text: "Automation", - items: [ - { text: "Generate", link: "/guide/automation/generate" }, - { text: "Build", link: "/guide/automation/build" }, - { text: "Test", link: "/guide/automation/test" }, - { text: "Run", link: "/guide/automation/run" }, - { text: "Graph", link: "/guide/automation/graph" }, - { text: "Clean", link: "/guide/automation/clean" }, - ], - }, - { - text: "Scale", + text: "Tuist Cloud", items: [ - // { - // text: "Xcode", - // link: "/guide/scale/xcode", - // }, { - text: "µFeatures architecture", - link: "/guide/scale/ufeatures-architecture", + text: "What is Tuist Cloud?", + link: "/cloud/what-is-cloud", }, { - text: "Tuist Cloud", - link: "/cloud/what-is-cloud", + text: "Get started", + link: "/cloud/get-started", + }, + { + text: "Binary caching", + link: "/cloud/binary-caching", + }, + { + text: "Selective testing", + link: "/cloud/selective-testing", + }, + { + text: "Hashing", + link: "/cloud/hashing", + }, + { + text: "On-premise", + link: "/cloud/on-premise", }, ], }, @@ -208,6 +225,8 @@ export default defineConfig({ /documentation/tuist/code-reviews /contributors/code-reviews 301 /documentation/tuist/reporting-bugs /contributors/issue-reporting 301 /documentation/tuist/championing-projects /contributors/get-started 301 +/guide/scale/ufeatures-architecture.html /guide/scale/tma-architecture.html 301 +/guide/scale/ufeatures-architecture /guide/scale/tma-architecture 301 /documentation/tuist/* / 301 `; fs.writeFile(redirectsPath, redirects); @@ -219,8 +238,10 @@ export default defineConfig({ }, nav: [ { text: "Guide", link: "/" }, - { text: "Reference", link: "/reference/project-description/structs/project" }, - { text: "Tuist Cloud", link: "/cloud/what-is-cloud" }, + { + text: "Reference", + link: "/reference/project-description/structs/project", + }, { text: "Contributors", link: "/contributors/get-started" }, { text: "Changelog", link: "https://github.com/tuist/tuist/releases" }, ], @@ -251,37 +272,6 @@ export default defineConfig({ ], }, ], - "/cloud": [ - { - text: "Tuist Cloud", - items: [ - { - text: "What is Tuist Cloud?", - link: "/cloud/what-is-cloud", - }, - { - text: "Get started", - link: "/cloud/get-started", - }, - { - text: "Binary caching", - link: "/cloud/binary-caching", - }, - { - text: "Selective testing", - link: "/cloud/selective-testing", - }, - { - text: "Hashing", - link: "/cloud/hashing", - }, - { - text: "On-premise", - link: "/cloud/on-premise", - }, - ], - }, - ], "/guide/": guideSidebar, "/": guideSidebar, "/reference/": [ diff --git a/docs/docs/cloud/binary-caching.md b/docs/docs/cloud/binary-caching.md index db2fe699bf4..e6ed0dd16d7 100644 --- a/docs/docs/cloud/binary-caching.md +++ b/docs/docs/cloud/binary-caching.md @@ -67,7 +67,7 @@ The level of effectiveness that can be achieved with binary caching depends stro 2. Define dependencies with protocol/interface targets instead of implementation ones, and dependency-inject implementations from the top-most targets. 3. Split frequently-modified targets into smaller ones whose likelihood of change is lower. -The above suggestions are part of the [µFeatures architecture](/guide/scale/ufeatures-architecture), which we propose as a way to structure your projects to maximize the benefits not only of binary caching but also of Xcode's capabilities. +The above suggestions are part of the [The Modular Architecture](/guide/scale/tma-architecture), which we propose as a way to structure your projects to maximize the benefits not only of binary caching but also of Xcode's capabilities. ## Recommended setup diff --git a/docs/docs/guide/scale/tma-architecture.md b/docs/docs/guide/scale/tma-architecture.md new file mode 100644 index 00000000000..9f7d7c20047 --- /dev/null +++ b/docs/docs/guide/scale/tma-architecture.md @@ -0,0 +1,107 @@ +# The Modular Architecture (TMA) + + +TMA is an architectural approach to structure Apple OS applications to enable scalability, optimize build and test cycles, and ensure good practices in your team. Its core idea is to build your apps by building independent features that are interconnected using clear and concise APIs. + +These guidelines introduce the principles of the architecture, helping you identify and organize your application features in different layers. It also introduces tips, tools, and advice if you decide to use this architecture. + +> [!INFO] µFEATURES +> This architecture was previously known as µFeatures. We've renamed it to The Modular Architecture (TMA) to better reflect its purpose and the principles behind it. + +## Core principle + +Developers should be able to **build, test, and try** their features fast, independently of the main app, and while ensuring Xcode features like UI previews, code completion, and debugging work reliably. + +## What is a module + +A module represents an application feature and is a combination of the following five targets (where target referts to an Xcode target): + +- **Source:** Contains the feature source code (Swift, Objective-C, C++, JavaScript...) and its resources (images, fonts, storyboards, xibs). +- **Interface:** It's a companion target that contains the public interface and models of the feature. +- **Tests:** Contains the feature unit and integration tests. +- **Testing:** Provides testing data that can be used in tests and the example app. It also provides mocks for module classes and protocols that can be used by other features as we'll see later. +- **Example:** Contains an example app that developers can use to try out the feature under certain conditions (different languages, screen sizes, settings). + +We recommend following a naming convention for targets, something that you can enforce in your project thanks to Tuist's DSL. + +| Target | Dependencies | Content | +| ---- | ---- | ---- | +| `Feature` | `FeatureInterface` | Source code and resources | +| `FeatureInterface` | - | Public interface and models | +| `FeatureTests` | `Feature`, `FeatureTesting` | Unit and integration tests | +| `FeatureTesting` | `FeatureInterface` | Testing data and mocks | +| `FeatureExample` | `FeatureTesting`, `Feature` | Example app | + +> [!TIP] UI Previews +> `Feature` can use `FeatureTesting` as a Development Asset to allow for UI previews + +> [!IMPORTANT] COMPILER DIRECTIVES INSTEAD OF TESTING TARGETS +> Alternatively, you can use compiler directives to include test data and mocks in the `Feature` or `FeatureInterface` targets when compiling for `Debug`. You simplify the graph, but you'll end up compiling code that you won't need for running the app. + +## Why a module + +### Clear and concise APIs + +When all the app source code lives in the same target it is very easy to build implicit dependencies in code and end up with the so well-known spaghetti code. Everything is strongly coupled, the state is sometimes unpredictable, and introducing new changes become a nightmare. When we define features in independent targets we need to design public APIs as part of our feature implementation. We need to decide what should be public, how our feature should be consumed, what should remain private. We have more control over how we want our feature clients to use the feature and we can enforce good practices by designing safe APIs. + +### Small modules + +[Divide and conquer](https://en.wikipedia.org/wiki/Divide_and_conquer). Working in small modules allows you to have more focus and test and try the feature in isolation. Moreover, development cycles are much faster since we have a more selective compilation, compiling only the components that are necessary to get our feature working. The compilation of the whole app is only necessary at the very end of our work, when we need to integrate the feature into the app. + +### Reusability + +Reusing code across apps and other products like extensions is encouraged using frameworks or libraries. By building modules reusing them is pretty straightforward. We can build an iMessage extension, a Today Extension, or a watchOS application by just combining existing modules and adding _(when necessary)_ platform-specific UI layers. + +## Dependencies + +When a module depends on another module, it declares a dependency against its interface target. The benefit of this is two-fold. It prevents the implementation of a module to be coupled to the implementation of another module, and it speeds up clean builds because they only have to compile the implementation of our feature, and the interfaces of direct and transitive dependencies. This approach is inspired by SwiftRock's idea of [Reducing iOS Build Times by using Interface Modules](https://swiftrocks.com/reducing-ios-build-times-by-using-interface-targets). + +Depending on interfaces requires apps to build the graph of implementations at runtime, and dependency-inject it into the modules that need it. Although TMA is non-opinionated about how to do this, we recommend using dependency-injection solutions or patterns or solutions that don't add built-time indirections or use platform APIs that were not designed for this purpose. + +## Product types + +When building a module, you can choose between **libraries and frameworks**, and **static and dynamic linking** for the targets. Without Tuist, making this decision is a bit more complex because you need to configure the dependency graph manually. However, thanks to Tuist Projects, this is no longer a problem. + +We recommend using dynamic libraries or frameworks during development using [bundle accessors](/guide/project/synthesized-files#bundle-accessors) to decouple the bundle-accessing logic from the library or framework nature of the target. This is key for fast compilation times and to ensure [SwiftUI Previews](https://developer.apple.com/documentation/swiftui/previews-in-xcode) work reliably. And static libraries or frameworks for the release builds to ensure the app boots fast. You can leverage [dynamic configuration](/guide/project/dynamic-configuration#configuration-through-environment-variables) to change the product type at generation-time: + +```bash +# You'll have to read the value of the variable from the manifest +# and use it to change the linking type +TUIST_PRODUCT_TYPE=static-library tuist generate +``` + +```swift +// You can place this in your manifest files or helpers +// and use the returned value when instantiating targets. +func productType() -> Product { + if case let .string(productType) = Environment.productType { + return productType == "static-library" ? .staticLibrary : .framework + } else { + return .framework + } +} +``` + + +> [!IMPORTANT] MERGEABLE LIBRARIES +> Apple attempted to alleviate the cumbersomeness of switching between static and dynamic libraries by introducing [mergeable libraries](https://developer.apple.com/documentation/xcode/configuring-your-project-to-use-mergeable-libraries). However, that introduces build-time non-determinism that makes your build non-reproducible and harder to optimize so we don't recommend using it. + +## Code + +TMA is non-opinionated about the code architecture and patterns for your modules. However, we'd like to share some tips based on our experience: + +- **Leveraging the compiler is great.** Over-leveraging the compiler might end up being non-productive and cause some Xcode features like previews to work unreliably. We recommend using the compiler to enforce good practices and catch errors early, but not to the point that it makes the code harder to read and maintain. +- **Use Swift Macros sparingly.** They can be very powerful but can also make the code harder to read and maintain. +- **Embrace the platform and the language, don't abstract them.** Trying to come up with ellaborated abstraction layers might end up being counterproductive. The platform and the language are powerful enough to build great apps without the need for additional abstraction layers. Use good programming and design patterns as a reference to build your features. + + +## Resources + +- [Building µFeatures](https://speakerdeck.com/pepibumur/building-ufeatures) +- [Framework Oriented Programming](https://speakerdeck.com/pepibumur/framework-oriented-programming-mobilization-dot-pl) +- [A Journey into frameworks and Swift](https://speakerdeck.com/pepibumur/a-journey-into-frameworks-and-swift) +- [Leveraging frameworks to speed up our development on iOS - Part 1](https://developers.soundcloud.com/blog/leveraging-frameworks-to-speed-up-our-development-on-ios-part-1) +- [Library Oriented Programming](https://academy.realm.io/posts/justin-spahr-summers-library-oriented-programming/) +- [Building Modern Frameworks](https://developer.apple.com/videos/play/wwdc2014/416/) +- [The Unofficial Guide to xcconfig files](https://pewpewthespells.com/blog/xcconfig_guide.html) +- [Static and Dynamic Libraries](https://pewpewthespells.com/blog/static_and_dynamic_libraries.html) diff --git a/docs/docs/guide/scale/ufeatures-architecture.md b/docs/docs/guide/scale/ufeatures-architecture.md deleted file mode 100644 index dfb26249f23..00000000000 --- a/docs/docs/guide/scale/ufeatures-architecture.md +++ /dev/null @@ -1,156 +0,0 @@ -# µFeatures architecture - - -uFeatures is an architectural approach to structure Apple OS applications to enable scalability, optimize build and test cycles, and ensure good practices in your team. Its core idea is to build your apps by building independent features that are interconnected using clear and concise APIs. - -These guidelines introduce the principles of the architecture, helping you identify and organize your application features in different layers. It also introduces tips, tools and advice if you decide to use this architecture. - -> [!INFO] NAME -> The name uFeatures (microfeatures) comes from the [microservices architecture](https://martinfowler.com/articles/microservices.html), where different "backend features" run as different services with defined APIs to enable communication between them. - - -## Context - -Apps are made of features. Typically these features are part of the same module, or target where the whole application is defined. The natural inclination in the team is to continue building features and its tests in the same targets. As a result, the application and its tests target grows in complexity which manifests in bugs, bad compilation times, and team performance. What seemed to be a good architecture, doesn't work out that well in large codebases or teams. - -This is frequently a big source of frustration when it comes to work on those projects. The time we spend goes into compiling rather than building and experimenting with the platform. - -## Motivation - -The µFeatures's main motivation is to support the scalability of large Xcode codebases leveraging platform features and tools. There are other solutions out there that could be also be considered to overcome those issues. A very popular one nowadays is [React Native](https://facebook.github.io/react-native/) that leverages the Javascript dynamism to offer developers a pleasant experience working in the code base, but at the same time a native experience from the user point of view. - -> [!IMPORTANT] NATIVE DEVELOPMENT CAN SCALE -> We believe that the usage of native tools and technologies can be optimized to overcome scalability challenges that sooner or later show up in our projects** - -### Before reading - -- Don't expect this to be a silver-bullet solution to your problems. You should take the core ideas, process them, and apply the principles to your projects. -- Each project is different, and so are the needs. With the ideas in the guidelines, and your needs, you should figure out what might work out for you. -- It can very tempting to scale your app architecture before it actually needs it. If your app needs it, you'll notice it, and only at that point, you should consider start tackling the issue. - -## Core principle - -Developers should be able to **build, test and try** their features fast, with independence of the main app. - -## What is a µFeature - -A µFeature represents an application feature and is a combination of the following five targets (referring with target to a Xcode target): - -- **Source:** Contains the feature source code (Swift, Objective-C, C++, React Native...) and its resources (images, fonts, storyboards, xibs). -- **Interface:** It's a companion target that contains the public interface and models of the feature. -- **Tests:** Contains the feature unit and integration tests. -- **Testing:** Provides testing data that can be used for the tests and from the example app. It also provides mocks for uFeature classes and protocols that can be used by other features as we'll see later. -- **Example:** Contains an example app that developers can use to try out the feature under certain conditions (different languages, screen sizes, settings). - -We recommend following a naming convention for targets, something that you can enforce in your project thanks to Tuist's DSL. - -| Target | Dependencies | Content | -| ---- | ---- | ---- | -| `Feature` | `FeatureInterface` | Source code and resources | -| `FeatureInterface` | - | Public interface and models | -| `FeatureTests` | `Feature`, `FeatureTesting` | Unit and integration tests | -| `FeatureTesting` | `FeatureInterface` | Testing data and mocks | -| `FeatureExample` | `FeatureTesting`, `Feature` | Example app | - -> [!TIP] UI Previews -> `Feature` can use `FeatureTesting` as a Development Asset to allow for UI previews - -> [!IMPORTANT] COMPILER DIRECTIVES INSTEAD OF TESTING TARGETS -> Alternatively, you can use compiler directives to include test data and mocks in the `Feature` or `FeatureInterface` targets when compiling for `Debug`. You simplify the graph, but you'll end up compiling code that you won't need for running the app. - -## Why a µFeature - -### Clear and concise APIs - -When all the app source code lives in the same target is very easy to build implicit dependencies in code, and end up with the so well-known spaghetti code. Everything is strongly coupled, the state is sometimes unpredictable, and introducing new changes become a nightmare. When we define features in independent targets we need to design public APIs as part of our feature implementation. We need to decide what should be public, how our feature should be consumed, what should remain private. We have more control over how we want our feature clients to use the feature and we can enforce good practices by designing safe APIs. - -### Small modules - -[Divide and conquer](https://en.wikipedia.org/wiki/Divide_and_conquer). Working in small modules allows you to have more focus and test and try the feature in isolation. Moreover, development cycles are much faster since we have a more selective compilation, compiling only the components that are necessary to get our feature working. The compilation of the whole app is only necessary at the very end of our work, when we need to integrate the feature into the app. - -### Reusability - -Reusing code across apps and other products like extensions is encouraged using frameworks or libraries. By building µFeatures reusing them is pretty straightforward. We can build an iMessage extension, a Today Extension, or a watchOS application by just combining existing µFeatures and adding _(when necessary)_ platform-specific UI layers. - -## Types of µFeatures - -### Foundation - -Foundation µFeatures contain foundational tools (wrappers, extensions, ...) that are combined to build other µFeatures. Thus other µFeatures have access to the foundation ones. Some examples of foundations µFeatures are: - -- **µUI:** Provides custom views, UIKit extensions, fonts, and colors that are used to build user-facing layouts. -- **µTesting:** Facilitates testing by providing XCTest extensions as well as custom assertions. -- **µNetwork:** It contains utilities and tools to interact with the network. - -In practice, foundation µFeatures expose interfaces (Structs, Classes, Enums) and extensions of platform frameworks such as `XCTest`, `Foundation` or `UIKit`. - -> [!WARNING] STATIC INSTANCES -> Foundation µFeatures shouldn't expose static instances that are globally accessed. As we'll see later, it's up to the app to control the lifecycle of those foundation dependencies, and pass them to other µFeatures using dependency injection. - -> [!TIP] MODULE SIZE AND INCREMENTAL BUILDS AND BINARY CACHING EFFECTIVENESS -> We recommend smaller and more focused foundation µFeatures to achieve the highest performance of incremental builds and [Tuist Cloud binary caching](/cloud/binary-caching) - - - -### Product - -Product µFeatures contain features that the user can feel and interact with. They are built by combining foundation µFeatures. Some examples of product µFeatures are: - -- **µSearch:** Contains your product search feature that allows users searching content on the platform. -- **µPayments:** Contains the business logic to handle payment flows and upsell screens to upgrade users to premium plans. -- **µHome:** Contains the product home screen with the most recent platform content. - -> [!NOTE] PRODUCT DOMAIN -> Product µFeatures usually represent your product's features. - -In practice, product µFeatures expose **views** and **services**. In the following sections we'll see how the app target uses those views and services to build up the app. - -## Dependencies - -When a µFeature depends on another µFeature, it declares a dependency against its interface target. The benefit of this is two-fold. It prevents the implementation of a µFeature to be coupled to the implementation of another µFeature, and it speeds up clean builds because they only have to compile the implementation of our feature, and the interfaces of direct and transitive dependencies. This approach is inspired by SwiftRock's idea of [Reducing iOS Build Times by using Interface Modules](https://swiftrocks.com/reducing-ios-build-times-by-using-interface-targets). - -> [!WARNING] WORK IN PROGRESS -> We are currently exploring how to dependency injection in Tuist's codebase and we'll update this section with the best practices and recommendations. - -## Choosing the target product - -When architecting a modular app, -a question that arises often is **whether targets should be frameworks or libraries**, and whether they should be static or dynamic. -In pre-Tuist era, there were many factor that influenced that decision: - -- Whether the target includes resources or not. -- Whether the target depends on static targets that might lead to duplicated symbols issues upstream. -- The number of dynamic targets that need to be linked at startup time and therefore might increase the time to launch the app. - -Thanks to Tuist, -the decision process has been notably simplified. -Since Tuist supports defining resources in libraries, -we recommend sticking to **static libraries**, -unless you come across scenarios where a dynamic framework is more suitable. - -Bear in mind that Tuist makes changing the product a seamless process as long as you use the standard interface. - -## Frequently asked questions - -### One or multiple Git repositories? - -If you are working with git branches, we recommend you to keep everything in the same repository for convenience reasons. Facebook is a good example of a huge company keeping all the projects in a single repositories and Uber [wrote about it](https://eng.uber.com/ios-monorepo/) a year ago. - -### How do you version µFeatures? - -If µFeatures are part of the same repository, they are versioned with the app. If you have them in different repositories you can use Git Submodules, Carthage, or your own dependency resolver to fetch specific versions of your µFeatures to link from the app. - -### How to add external dependencies? - -This architecture doesn't limit you from using external dependencies. If you want to use an external dependency from a µFeature framework, we recommend you to use the [Swift Package Manager](https://swift.org/package-manager/). - -## Resources - -- [Building µFeatures](https://speakerdeck.com/pepibumur/building-ufeatures) -- [Framework Oriented Programming](https://speakerdeck.com/pepibumur/framework-oriented-programming-mobilization-dot-pl) -- [A Journey into frameworks and Swift](https://speakerdeck.com/pepibumur/a-journey-into-frameworks-and-swift) -- [Leveraging frameworks to speed up our development on iOS - Part 1](https://developers.soundcloud.com/blog/leveraging-frameworks-to-speed-up-our-development-on-ios-part-1) -- [Library Oriented Programming](https://academy.realm.io/posts/justin-spahr-summers-library-oriented-programming/) -- [Building Modern Frameworks](https://developer.apple.com/videos/play/wwdc2014/416/) -- [The Unofficial Guide to xcconfig files](https://pewpewthespells.com/blog/xcconfig_guide.html) -- [Static and Dynamic Libraries](https://pewpewthespells.com/blog/static_and_dynamic_libraries.html) From ac46a759a21ee3db6d87a71694218fed2794eb6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 21 May 2024 15:14:14 +0200 Subject: [PATCH 298/509] Add tele2 and altel logos to the README (#6306) --- README.md | 10 ++++++++++ assets/companies/altel.svg | 10 ++++++++++ assets/companies/tele2.svg | 30 ++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 assets/companies/altel.svg create mode 100644 assets/companies/tele2.svg diff --git a/README.md b/README.md index a618625cdfa..1efde20d6ce 100644 --- a/README.md +++ b/README.md @@ -268,6 +268,16 @@ The financial sustainability of the project is possible thanks to the ongoing co crunchyroll_logo + + + altel_logo + + + + + altel_logo + + diff --git a/assets/companies/altel.svg b/assets/companies/altel.svg new file mode 100644 index 00000000000..b000eeeb02d --- /dev/null +++ b/assets/companies/altel.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/companies/tele2.svg b/assets/companies/tele2.svg new file mode 100644 index 00000000000..70df773f78f --- /dev/null +++ b/assets/companies/tele2.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 52a33daa39759f2f2427a3c350f01155910e948c Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 22 May 2024 08:24:04 +0200 Subject: [PATCH 299/509] Fix Posthog id --- docs/.vitepress/config.mjs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 0f2f33135d5..1d83701674d 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -179,8 +179,10 @@ export default defineConfig({ "script", {}, ` - !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys onSessionId".split(" "),n=0;n + !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys onSessionId".split(" "),n=0;n `, ], [ From 1fc08abdb3905a2f330d8df8942866a504727899 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 22 May 2024 10:12:53 +0200 Subject: [PATCH 300/509] Fix the initialization of projects in Homebrew-managed installations (#6309) --- Sources/TuistScaffold/TemplatesDirectoryLocator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistScaffold/TemplatesDirectoryLocator.swift b/Sources/TuistScaffold/TemplatesDirectoryLocator.swift index 157492bc047..5d5ac7c1221 100644 --- a/Sources/TuistScaffold/TemplatesDirectoryLocator.swift +++ b/Sources/TuistScaffold/TemplatesDirectoryLocator.swift @@ -57,7 +57,7 @@ public final class TemplatesDirectoryLocator: TemplatesDirectoryLocating { share/ Templates */ - bundlePath.parentDirectory.appending(try! RelativePath(validating: "share/Templates")), + bundlePath.parentDirectory.appending(try! RelativePath(validating: "share")), // swiftlint:disable:previous force_try ] let candidates = paths.map { path in From b4a21dbb77501c328ba7291c59111b95745fbadd Mon Sep 17 00:00:00 2001 From: Eduard Miniakhmetov Date: Wed, 22 May 2024 12:24:05 +0300 Subject: [PATCH 301/509] Ignore excluded resourceFileElements (#6312) --- .../PackageInfoMapper.swift | 11 ++++++++--- .../PackageInfoMapperTests.swift | 19 ------------------- 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index c69db3ed6c5..4ad5f69c689 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -795,9 +795,14 @@ extension ProjectDescription.ResourceFileElements { /// - Parameters: /// - resourceAbsolutePath: The absolute path of that resource /// - Returns: A ProjectDescription.ResourceFileElement mapped from a `.process` resource rule of SPM - func handleProcessResource(resourceAbsolutePath: AbsolutePath) throws -> ProjectDescription.ResourceFileElement { + func handleProcessResource(resourceAbsolutePath: AbsolutePath) throws -> ProjectDescription.ResourceFileElement? { let absolutePathGlob = resourceAbsolutePath.extension != nil ? resourceAbsolutePath : resourceAbsolutePath .appending(component: "**") + for exclude in excluding { + if absolutePathGlob.isDescendantOfOrEqual(to: path.appending(try RelativePath(validating: exclude))) { + return nil + } + } return .glob( pattern: .path(absolutePathGlob.pathString), excluding: try excluding.map { @@ -808,7 +813,7 @@ extension ProjectDescription.ResourceFileElements { ) } - var resourceFileElements: [ProjectDescription.ResourceFileElement] = try resources.map { + var resourceFileElements: [ProjectDescription.ResourceFileElement] = try resources.compactMap { let resourceAbsolutePath = path.appending(try RelativePath(validating: $0.path)) switch $0.rule { @@ -840,7 +845,7 @@ extension ProjectDescription.ResourceFileElements { // They are handled like a `.process` rule if sources == nil { resourceFileElements += try defaultResourcePaths(from: path) - .map { try handleProcessResource(resourceAbsolutePath: $0) } + .compactMap { try handleProcessResource(resourceAbsolutePath: $0) } } // Check for empty resource files diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 6226827aed8..8e003a0eeb4 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -1019,25 +1019,6 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ], tags: [] ), - .glob( - pattern: .path( - basePath - .appending( - try RelativePath(validating: "Package/Sources/Target1/AnotherOne/Resource/Folder/**") - ) - .pathString - ), - excluding: [ - .path( - basePath - .appending( - try RelativePath(validating: "Package/Sources/Target1/AnotherOne/Resource/**") - ) - .pathString - ), - ], - tags: [] - ), ] ), ] From 33ed12776f1897b18fc4da0d4dad183ba11831c1 Mon Sep 17 00:00:00 2001 From: Tuist Date: Thu, 23 May 2024 13:55:22 +0000 Subject: [PATCH 302/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.15.0 --- .mise.toml | 2 +- CHANGELOG.md | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 4a98a291960..bf39ce03361 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.14.0" +tuist = "4.15.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f7d70d484f..443673de7ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## 4.15.0 - 2024-05-23 + +### Tuist + +#### Added + +- Support "Code Sign on Copy" in Copy Files Actions [#6302](https://github.com/tuist/tuist/pull/6302) by [@ActuallyTaylor](https://github.com/ActuallyTaylor) +- Add capability to specify variable entitlements [#6293](https://github.com/tuist/tuist/pull/6293) by [@lucasmpaim](https://github.com/lucasmpaim) + +#### Fixed + +- Fix missing -package-name when a target has custom swiftSettings [#6299](https://github.com/tuist/tuist/pull/6299) by [@fortmarek](https://github.com/fortmarek) +- Fix target linter warnings for target products that allow dots and hyphens [#6290](https://github.com/tuist/tuist/pull/6290) by [@kapitoshka438](https://github.com/kapitoshka438) +- Fix --platform case sensitivity with test and build commands [#6268](https://github.com/tuist/tuist/pull/6268) by [@waltflanagan](https://github.com/waltflanagan) +- Fix the initialization of projects in Homebrew-managed installations [#6309](https://github.com/tuist/tuist/pull/6309) by [@pepicrft](https://github.com/pepicrft) + +### Tuist Cloud + +- no changes + ## 4.14.0 - 2024-05-20 ### Tuist From 6254c95c69190a14ae12a67288bd31158d850db1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 11:29:16 +0200 Subject: [PATCH 303/509] add BarredEwe as a contributor for doc (#6330) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2d5830f080a..7108e54f757 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1382,6 +1382,15 @@ "contributions": [ "code" ] + }, + { + "login": "BarredEwe", + "name": "BarredEwe", + "avatar_url": "https://avatars.githubusercontent.com/u/19188911?v=4", + "profile": "https://www.linkedin.com/in/barredewe", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 1efde20d6ce..35f17c79043 100644 --- a/README.md +++ b/README.md @@ -541,6 +541,7 @@ Thanks goes to these wonderful people:
    Lucas Mrowskovsky Paim

    Taylor Lineman

    Miguel Ferrando
    +
    BarredEwe
    From f1a713afbe6527442589f51ec2b0eb8a65c089ca Mon Sep 17 00:00:00 2001 From: BarredEwe Date: Mon, 27 May 2024 16:29:41 +0700 Subject: [PATCH 304/509] Add OzonTech logo to Readme.md (#6327) --- README.md | 5 +++++ assets/companies/ozontech.svg | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 assets/companies/ozontech.svg diff --git a/README.md b/README.md index 35f17c79043..9385166828d 100644 --- a/README.md +++ b/README.md @@ -278,6 +278,11 @@ The financial sustainability of the project is possible thanks to the ongoing co altel_logo + + + ozontech_logo + + diff --git a/assets/companies/ozontech.svg b/assets/companies/ozontech.svg new file mode 100644 index 00000000000..5bf57768d7a --- /dev/null +++ b/assets/companies/ozontech.svg @@ -0,0 +1,4 @@ + + + + From 247d4ebc6dcee6907cb73f59f5b60385a3a0adb3 Mon Sep 17 00:00:00 2001 From: Isaac Halvorson Date: Mon, 27 May 2024 04:30:49 -0500 Subject: [PATCH 305/509] Add some Google library troubleshooting notes to the documentation (#6319) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add some Google library troubleshooting notes to the documentation * Update docs/docs/guide/project/dependencies.md Co-authored-by: Marek Fořt * Add example of FBLPromises crash log --------- Co-authored-by: Marek Fořt --- docs/docs/guide/project/dependencies.md | 64 +++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/docs/docs/guide/project/dependencies.md b/docs/docs/guide/project/dependencies.md index 9a135988c38..40a8240b992 100644 --- a/docs/docs/guide/project/dependencies.md +++ b/docs/docs/guide/project/dependencies.md @@ -46,7 +46,7 @@ When instantiating a `Target`, you can pass the `dependencies` argument with any - `SDK`: Declares a dependency with a system SDK. - `XCTest`: Declares a dependency with XCTest. -> [!NOTE] DEPENDENCY CONDITIONS +> [!NOTE] DEPENDENCY CONDITIONS > Every dependency type accepts a `condition` option to conditionally link the dependency based on the platform. By default, it links the dependency for all platforms the target supports. > [!TIP] ENFORCING EXPLICIT DEPENDENCIES @@ -144,7 +144,7 @@ let project = Project( ``` ::: -> [!NOTE] NO SCHEMES GENERATED FOR EXTERNAL PACKAGES +> [!NOTE] NO SCHEMES GENERATED FOR EXTERNAL PACKAGES > The **schemes** are not automatically created for Swift Package projects to keep the schemes list clean. You can create them via Xcode's UI. #### Xcode's default integration @@ -192,13 +192,67 @@ tuist generate pod install ``` -> [!WARNING] +> [!WARNING] > CocoaPods dependencies are not compatible with workflows like `build` or `test` that run `xcodebuild` right after generating the project. They are also incompatible with binary caching and selective testing since the fingerprinting logic doesn't account for the Pods dependencies. -## Objective-C Dependencies +## Troubleshooting + +### Objective-C Dependencies When integrating Objective-C dependencies, the inclusion of certain flags on the consuming target may be necessary to avoid runtime crashes as detailed in [Apple Technical Q&A QA1490](https://developer.apple.com/library/archive/qa/qa1490/_index.html). Since the build system and Tuist have no way of inferring whether the flag is necessary or not, and since the flag comes with potentially undesirable side effects, Tuist will not automatically apply any of these flags, and because Swift Package Manager considers `-ObjC` to be included via an `.unsafeFlag` most packages cannot include it as part of their default linking settings when required. -Consumers of Objective-C dependencies (or internal Objective-C targets) should apply `-ObjC` or `-force_load` flags when required by setting `OTHER_LDFLAGS` on consuming targets. \ No newline at end of file +Consumers of Objective-C dependencies (or internal Objective-C targets) should apply `-ObjC` or `-force_load` flags when required by setting `OTHER_LDFLAGS` on consuming targets. + +### Firebase & Other Google Libraries + +Google's open source libraries — while powerful — can be difficult to integrate within Tuist as they often use non-standard architecture and techniques in how they are built. + +Here are a few tips that may be necessary to follow to integrate Firebase and Google's other Apple-platform libraries: + +#### Ensure `-ObjC` is added to `OTHER_LDFLAGS` + +Many of Google's libraries are written in Objective-C. Because of this, any consuming target will need to include the `-ObjC` tag in its `OTHER_LDFLAGS` build setting. This can either be set in an `.xcconfig` file or manually specified in the target's settings within your Tuist manifests. An example: + +```swift +Target.target( + ... + settings: .settings( + base: ["OTHER_LDFLAGS": "$(inherited) -ObjC"] + ) + ... +) +``` + +Refer to the [Objective-C Dependencies](#objective-c-dependencies) section above for more details. + +#### Set the product type for `FBLPromises` to dynamic framework + +Certain Google libraries depend on `FBLPromises`, another of Google's libraries. You may encounter a crash that mentions `FBLPromises`, looking something like this: + +``` +NSInvalidArgumentException. Reason: -[FBLPromise HTTPBody]: unrecognized selector sent to instance 0x600000cb2640. +``` + +Explicitly setting the product type of `FBLPromises` to `.framework` in your `Package.swift` file should fix the issue: + +```swift [Tuist/Package.swift] +// swift-tools-version: 5.10 + +import PackageDescription + +#if TUIST +import ProjectDescription +import ProjectDescriptionHelpers + +let packageSettings = PackageSettings( + productTypes: [ + "FPLPromises": .framework, + ] +) +#endif + +let package = Package( +... +``` From 9c9d606b1433eb0bd9a8c3972404c4775e8ec8c5 Mon Sep 17 00:00:00 2001 From: sabade-omkar <112235933+sabade-omkar@users.noreply.github.com> Date: Mon, 27 May 2024 15:01:34 +0530 Subject: [PATCH 306/509] Fixes #6321: Handle formatting multiline text (#6322) --- .../XcodeBuild/XcodeBuildController.swift | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift index 55f49c1662b..5afc8602440 100644 --- a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift +++ b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift @@ -298,14 +298,14 @@ public final class XcodeBuildController: XcodeBuildControlling { if self?.environment.isVerbose == true { return SystemEvent.standardError(XcodeBuildOutput(raw: line)) } else { - return SystemEvent.standardError(XcodeBuildOutput(raw: self?.formatter.format(line) ?? "")) + return SystemEvent.standardError(XcodeBuildOutput(raw: self?.format(line) ?? "")) } case let .standardOutput(outputData): guard let line = String(data: outputData, encoding: .utf8) else { return nil } if self?.environment.isVerbose == true { return SystemEvent.standardOutput(XcodeBuildOutput(raw: line)) } else { - return SystemEvent.standardOutput(XcodeBuildOutput(raw: self?.formatter.format(line) ?? "")) + return SystemEvent.standardOutput(XcodeBuildOutput(raw: self?.format(line) ?? "")) } } } @@ -313,3 +313,17 @@ public final class XcodeBuildController: XcodeBuildControlling { .stream } } + +// MARK: - Helpers + +fileprivate extension XcodeBuildController { + func format(_ multiLineText: String) -> String { + multiLineText.split(separator: "\n").map { + let line = String($0) + let formattedLine = formatter.format(line) + + return formattedLine ?? "" + } + .joined(separator: "\n") + } +} From 677f1c873134c3c4cc0554c00f1c04b3a8610b0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 27 May 2024 18:02:27 +0200 Subject: [PATCH 307/509] Opensource tuist cloud commands (#6326) * Opensource tuist cloud commands * Fix Package.swift definition * Use MISE_PROJECT_ROOT * Rename TuistApp to TuistServer * Run lint:fix --- .../workspace/generate/cloud-openapi-code | 6 + .swiftformat | 2 +- .swiftlint.yml | 2 + Package.resolved | 21 +- Package.swift | 21 + .../Backends/TuistAnalyticsBackend.swift | 1 + Sources/TuistAnalytics/Log/Logger.swift | 3 + .../Analytics}/CommandEvent.swift | 36 +- Sources/TuistCore/Cache/CacheCategory.swift | 14 + .../Cache/CacheDirectoriesProvider.swift | 30 + .../CacheDirectoriesProviderFactory.swift | 2 + .../Cache/MockCacheDirectoriesProvider.swift | 30 - .../MockCacheDirectoriesProviderFactory.swift | 18 - .../Cloud/CloudAnalyticsCommand.swift | 27 + .../Commands/Cloud/CloudAuthCommand.swift | 24 + .../Commands/Cloud/CloudCleanCommand.swift | 27 + .../Commands/Cloud/CloudInitCommand.swift | 41 + .../Commands/Cloud/CloudLogoutCommand.swift | 26 + .../CloudOrganizationBillingCommand.swift | 33 + .../Cloud/CloudOrganizationCommand.swift | 23 + .../CloudOrganizationCreateCommand.swift | 33 + .../CloudOrganizationDeleteCommand.swift | 34 + .../CloudOrganizationInviteCommand.swift | 39 + .../Cloud/CloudOrganizationListCommand.swift | 33 + .../CloudOrganizationRemoveCommand.swift | 18 + ...CloudOrganizationRemoveInviteCommand.swift | 39 + ...CloudOrganizationRemoveMemberCommand.swift | 39 + .../CloudOrganizationRemoveSSOCommand.swift | 33 + .../Cloud/CloudOrganizationShowCommand.swift | 39 + .../CloudOrganizationUpdateCommand.swift | 17 + ...CloudOrganizationUpdateMemberCommand.swift | 46 + .../CloudOrganizationUpdateSSOCommand.swift | 54 + .../Commands/Cloud/CloudProjectCommand.swift | 19 + .../Cloud/CloudProjectCreateCommand.swift | 41 + .../Cloud/CloudProjectDeleteCommand.swift | 40 + .../Cloud/CloudProjectListCommand.swift | 33 + .../Cloud/CloudProjectTokenCommand.swift | 41 + .../Commands/Cloud/CloudSessionCommand.swift | 26 + Sources/TuistKit/Commands/CloudCommand.swift | 24 + .../CommandEventFactory.swift | 1 + .../TrackableCommand/TrackableCommand.swift | 1 + Sources/TuistKit/Commands/TuistCommand.swift | 25 +- .../Cloud/CloudAnalyticsService.swift | 46 + .../Services/Cloud/CloudAuthService.swift | 46 + .../Services/Cloud/CloudCleanService.swift | 74 + .../Services/Cloud/CloudInitService.swift | 108 + .../Services/Cloud/CloudLogoutService.swift | 44 + .../CloudOrganizationBillingService.swift | 47 + .../CloudOrganizationCreateService.swift | 49 + .../CloudOrganizationDeleteService.swift | 49 + .../CloudOrganizationInviteService.swift | 61 + .../Cloud/CloudOrganizationListService.swift | 61 + ...CloudOrganizationRemoveInviteService.swift | 52 + ...CloudOrganizationRemoveMemberService.swift | 52 + .../CloudOrganizationRemoveSSOService.swift | 50 + .../Cloud/CloudOrganizationShowService.swift | 139 + ...CloudOrganizationUpdateMemberService.swift | 55 + .../CloudOrganizationUpdateService.swift | 63 + .../Cloud/CloudProjectCreateService.swift | 53 + .../Cloud/CloudProjectDeleteService.swift | 65 + .../Cloud/CloudProjectListService.swift | 60 + .../Cloud/CloudProjectTokenService.swift | 57 + .../Services/Cloud/CloudSessionService.swift | 48 + .../Utils/TuistAnalyticsCloudBackend.swift | 45 + Sources/TuistServer/Client/Client+Cloud.swift | 35 + .../CloudClientAuthenticationMiddleware.swift | 42 + ...udClientCLIMetadataHeadersMiddleware.swift | 21 + .../CloudClientOutputWarningsMiddleware.swift | 62 + .../CloudClientRequestIdMiddleware.swift | 18 + .../CloudClientVerboseLoggingMiddleware.swift | 42 + Sources/TuistServer/Log/Logger.swift | 3 + .../Models/CloudCacheArtifact.swift | 57 + .../Models/CloudCommandEvent.swift | 42 + .../TuistServer/Models/CloudInvitation.swift | 54 + .../Models/CloudOrganization.swift | 166 + Sources/TuistServer/Models/CloudProject.swift | 42 + Sources/TuistServer/Models/CloudUser.swift | 42 + .../TuistServer/Models/SSOOrganization.swift | 5 + .../Network/URLSession+Cloud.swift | 27 + .../CacheCategoryParameter+Extras.swift | 12 + Sources/TuistServer/OpenAPI/Client.swift | 1926 ++++++ Sources/TuistServer/OpenAPI/Types.swift | 5280 +++++++++++++++++ Sources/TuistServer/OpenAPI/cloud.yml | 1441 +++++ .../Services/CacheExistsService.swift | 81 + .../CancelOrganizationInviteService.swift | 71 + .../Services/CleanCacheService.swift | 69 + .../Services/CloudURLService.swift | 40 + .../Services/CreateCommandEventService.swift | 104 + .../CreateOrganizationInviteService.swift | 81 + .../Services/CreateOrganizationService.swift | 70 + .../Services/CreateProjectService.swift | 79 + .../Services/DeleteOrganizationService.swift | 70 + .../Services/DeleteProjectService.swift | 70 + .../Services/GetAuthTokenService.swift | 67 + .../Services/GetCacheService.swift | 83 + .../Services/GetOrganizationService.swift | 74 + .../Services/GetProjectService.swift | 77 + .../Services/ListOrganizationsService.swift | 64 + .../Services/ListProjectsService.swift | 70 + .../MultipartUploadCompleteCacheService.swift | 90 + ...ltipartUploadGenerateURLCacheService.swift | 90 + .../MultipartUploadStartCacheService.swift | 84 + .../RemoveOrganizationMemberService.swift | 79 + .../UpdateOrganizationMemberService.swift | 84 + .../Services/UpdateOrganizationService.swift | 102 + .../Session/CloudSessionController.swift | 119 + .../CloudAuthenticationController.swift | 63 + .../Utilities/CloudCredentialsStore.swift | 154 + .../Utilities/UniqueIDGenerator.swift | 13 + Sources/TuistSupport/Constants.swift | 5 + Sources/tuist/TuistApp.swift | 4 +- .../Utilities/BuildGraphInspectorTests.swift | 2 +- .../Generator/ProjectFileElementsTests.swift | 15 +- .../Cloud/CloudAuthServiceTests.swift | 52 + .../Cloud/CloudCleanServiceTests.swift | 64 + .../Cloud/CloudInitServiceTests.swift | 115 + .../Cloud/CloudLogoutServiceTests.swift | 52 + .../CloudOrganizationInviteServiceTests.swift | 67 + .../CloudOrganizationListServiceTests.swift | 72 + ...oudOrganizationRemoveSSOServiceTests.swift | 60 + .../CloudOrganizationShowServiceTests.swift | 120 + .../CloudOrganizationUpdateSSOService.swift | 62 + .../CloudProjectDeleteServiceTests.swift | 73 + .../Cloud/CloudProjectListServiceTests.swift | 73 + .../Cloud/CloudSessionServiceTests.swift | 52 + .../CommandEventFactoryTests.swift | 1 + .../TrackableCommandTests.swift | 2 +- .../Services/CleanServiceTests.swift | 22 +- .../Services/TestServiceTests.swift | 11 +- .../TuistAnalyticsCloudBackendTests.swift | 88 + .../Utils/TuistAnalyticsDispatcherTests.swift | 82 + .../Loaders/CachedManifestLoaderTests.swift | 17 +- .../TuistPluginTests/PluginServiceTests.swift | 46 +- ...dClientOutputWarningsMiddlewareTests.swift | 71 + .../Session/CloudSessionControllerTests.swift | 128 + .../CloudCredentialsStoreTests.swift | 36 + Tuist/ProjectDescriptionHelpers/Module.swift | 22 +- .../guide/project/dynamic-configuration.md | 2 +- .../App/Sources/TuistApp.swift | 2 +- .../App/AppDelegate.swift | 2 +- .../Example/Sources/AppDelegate.swift" | 2 +- 141 files changed, 15085 insertions(+), 88 deletions(-) create mode 100755 .mise/tasks/workspace/generate/cloud-openapi-code create mode 100644 Sources/TuistAnalytics/Log/Logger.swift rename Sources/{TuistAnalytics/Models => TuistCore/Analytics}/CommandEvent.swift (62%) delete mode 100644 Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProvider.swift delete mode 100644 Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProviderFactory.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudProjectCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift create mode 100644 Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift create mode 100644 Sources/TuistKit/Commands/CloudCommand.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudAnalyticsService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudAuthService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudCleanService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudInitService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudLogoutService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudOrganizationBillingService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudOrganizationCreateService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudOrganizationDeleteService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudOrganizationInviteService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveInviteService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveMemberService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveSSOService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateMemberService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudProjectListService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift create mode 100644 Sources/TuistKit/Services/Cloud/CloudSessionService.swift create mode 100644 Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift create mode 100644 Sources/TuistServer/Client/Client+Cloud.swift create mode 100644 Sources/TuistServer/Client/CloudClientAuthenticationMiddleware.swift create mode 100644 Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift create mode 100644 Sources/TuistServer/Client/CloudClientOutputWarningsMiddleware.swift create mode 100644 Sources/TuistServer/Client/CloudClientRequestIdMiddleware.swift create mode 100644 Sources/TuistServer/Client/CloudClientVerboseLoggingMiddleware.swift create mode 100644 Sources/TuistServer/Log/Logger.swift create mode 100644 Sources/TuistServer/Models/CloudCacheArtifact.swift create mode 100644 Sources/TuistServer/Models/CloudCommandEvent.swift create mode 100644 Sources/TuistServer/Models/CloudInvitation.swift create mode 100644 Sources/TuistServer/Models/CloudOrganization.swift create mode 100644 Sources/TuistServer/Models/CloudProject.swift create mode 100644 Sources/TuistServer/Models/CloudUser.swift create mode 100644 Sources/TuistServer/Models/SSOOrganization.swift create mode 100644 Sources/TuistServer/Network/URLSession+Cloud.swift create mode 100644 Sources/TuistServer/OpenAPI/CacheCategoryParameter+Extras.swift create mode 100644 Sources/TuistServer/OpenAPI/Client.swift create mode 100644 Sources/TuistServer/OpenAPI/Types.swift create mode 100644 Sources/TuistServer/OpenAPI/cloud.yml create mode 100644 Sources/TuistServer/Services/CacheExistsService.swift create mode 100644 Sources/TuistServer/Services/CancelOrganizationInviteService.swift create mode 100644 Sources/TuistServer/Services/CleanCacheService.swift create mode 100644 Sources/TuistServer/Services/CloudURLService.swift create mode 100644 Sources/TuistServer/Services/CreateCommandEventService.swift create mode 100644 Sources/TuistServer/Services/CreateOrganizationInviteService.swift create mode 100644 Sources/TuistServer/Services/CreateOrganizationService.swift create mode 100644 Sources/TuistServer/Services/CreateProjectService.swift create mode 100644 Sources/TuistServer/Services/DeleteOrganizationService.swift create mode 100644 Sources/TuistServer/Services/DeleteProjectService.swift create mode 100644 Sources/TuistServer/Services/GetAuthTokenService.swift create mode 100644 Sources/TuistServer/Services/GetCacheService.swift create mode 100644 Sources/TuistServer/Services/GetOrganizationService.swift create mode 100644 Sources/TuistServer/Services/GetProjectService.swift create mode 100644 Sources/TuistServer/Services/ListOrganizationsService.swift create mode 100644 Sources/TuistServer/Services/ListProjectsService.swift create mode 100644 Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift create mode 100644 Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift create mode 100644 Sources/TuistServer/Services/MultipartUploadStartCacheService.swift create mode 100644 Sources/TuistServer/Services/RemoveOrganizationMemberService.swift create mode 100644 Sources/TuistServer/Services/UpdateOrganizationMemberService.swift create mode 100644 Sources/TuistServer/Services/UpdateOrganizationService.swift create mode 100644 Sources/TuistServer/Session/CloudSessionController.swift create mode 100644 Sources/TuistServer/Utilities/CloudAuthenticationController.swift create mode 100644 Sources/TuistServer/Utilities/CloudCredentialsStore.swift create mode 100644 Sources/TuistServer/Utilities/UniqueIDGenerator.swift create mode 100644 Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift create mode 100644 Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift create mode 100644 Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift create mode 100644 Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift create mode 100644 Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift create mode 100644 Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift create mode 100644 Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift create mode 100644 Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift create mode 100644 Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift create mode 100644 Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift create mode 100644 Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift create mode 100644 Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift create mode 100644 Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift create mode 100644 Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift create mode 100644 Tests/TuistServerTests/Client/CloudClientOutputWarningsMiddlewareTests.swift create mode 100644 Tests/TuistServerTests/Session/CloudSessionControllerTests.swift create mode 100644 Tests/TuistServerTests/Utilities/CloudCredentialsStoreTests.swift diff --git a/.mise/tasks/workspace/generate/cloud-openapi-code b/.mise/tasks/workspace/generate/cloud-openapi-code new file mode 100755 index 00000000000..06ed38b4e1d --- /dev/null +++ b/.mise/tasks/workspace/generate/cloud-openapi-code @@ -0,0 +1,6 @@ +#!/bin/bash +# mise description="Generates the Swift code off the Open API specification." + +set -euo pipefail + +mint run apple/swift-openapi-generator@0.1.5 generate --mode types --mode client --output-directory $MISE_PROJECT_ROOT/Sources/TuistServer/OpenAPI $MISE_PROJECT_ROOT/Sources/TuistServer/OpenAPI/cloud.yml diff --git a/.swiftformat b/.swiftformat index 4a206dd03eb..4fa9546694b 100644 --- a/.swiftformat +++ b/.swiftformat @@ -2,7 +2,7 @@ --symlinks ignore --exclude Tests/XCTestManifests.swift,Sources/TuistSupport/Vendored,fixtures/Targets/SlothCreator,Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift ---exclude fixtures/tuist_plugin +--exclude fixtures/tuist_plugin,Sources/TuistServer/OpenAPI --disable conditionalAssignment --disable hoistAwait --disable hoistTry diff --git a/.swiftlint.yml b/.swiftlint.yml index 45de5169d0c..038fde68ab1 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -22,3 +22,5 @@ type_name: min_length: error: 1 warning: 1 +excluded: + - Sources/TuistServer/OpenAPI diff --git a/Package.resolved b/Package.resolved index 06677ba25e3..160bbaf7591 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,4 +1,5 @@ { + "originHash" : "d37db3f22e16eeca44eacdba528daf5f694b1c811b68c38e2fd77199db920165", "pins" : [ { "identity" : "aexml", @@ -171,6 +172,24 @@ "version" : "1.5.3" } }, + { + "identity" : "swift-openapi-runtime", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tuist/swift-openapi-runtime", + "state" : { + "branch" : "swift-tools-version", + "revision" : "863d51ca0b55a72143462f4517065d906a24e0fb" + } + }, + { + "identity" : "swift-openapi-urlsession", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tuist/swift-openapi-urlsession", + "state" : { + "branch" : "swift-tools-version", + "revision" : "91b1694705584a09827049b690e07f9118cdab5d" + } + }, { "identity" : "swift-syntax", "kind" : "remoteSourceControl", @@ -253,5 +272,5 @@ } } ], - "version" : 2 + "version" : 3 } diff --git a/Package.swift b/Package.swift index c91c5963ef7..d8468618b22 100644 --- a/Package.swift +++ b/Package.swift @@ -90,6 +90,7 @@ var targets: [Target] = [ "TuistPlugin", "TuistGraph", "Mockable", + "TuistServer", ], swiftSettings: [ .define("MOCKING", .when(configuration: .debug)), @@ -302,6 +303,20 @@ var targets: [Target] = [ .define("MOCKING", .when(configuration: .debug)), ] ), + .target( + name: "TuistServer", + dependencies: [ + "TuistCore", + "TuistSupport", + swiftToolsSupportDependency, + .product(name: "OpenAPIRuntime", package: "swift-openapi-runtime"), + .product(name: "OpenAPIURLSession", package: "swift-openapi-urlsession"), + ], + exclude: ["OpenAPI/cloud.yml"], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), + ] + ), ] #if TUIST @@ -391,6 +406,10 @@ let package = Package( name: "TuistAcceptanceTesting", targets: ["TuistAcceptanceTesting"] ), + .library( + name: "TuistServer", + targets: ["TuistServer"] + ), /// TuistGenerator /// /// A high level Xcode generator library @@ -424,6 +443,8 @@ let package = Package( .package(url: "https://github.com/cpisciotta/xcbeautify", exact: "2.0.1"), .package(url: "https://github.com/krzysztofzablocki/Difference.git", from: "1.0.2"), .package(url: "https://github.com/Kolos65/Mockable.git", from: "0.0.2"), + .package(url: "https://github.com/tuist/swift-openapi-runtime", branch: "swift-tools-version"), + .package(url: "https://github.com/tuist/swift-openapi-urlsession", branch: "swift-tools-version"), ], targets: targets ) diff --git a/Sources/TuistAnalytics/Backends/TuistAnalyticsBackend.swift b/Sources/TuistAnalytics/Backends/TuistAnalyticsBackend.swift index 513a413be4f..e5fad51eda1 100644 --- a/Sources/TuistAnalytics/Backends/TuistAnalyticsBackend.swift +++ b/Sources/TuistAnalytics/Backends/TuistAnalyticsBackend.swift @@ -1,4 +1,5 @@ import Foundation +import TuistCore /// An analytics backend an entity (e.g. an HTTP server) /// that can process analytics events generated by the Tuist CLI. diff --git a/Sources/TuistAnalytics/Log/Logger.swift b/Sources/TuistAnalytics/Log/Logger.swift new file mode 100644 index 00000000000..a4d4e6e2f0a --- /dev/null +++ b/Sources/TuistAnalytics/Log/Logger.swift @@ -0,0 +1,3 @@ +import TuistSupport + +let logger = Logger(label: "io.tuist.analytics") diff --git a/Sources/TuistAnalytics/Models/CommandEvent.swift b/Sources/TuistCore/Analytics/CommandEvent.swift similarity index 62% rename from Sources/TuistAnalytics/Models/CommandEvent.swift rename to Sources/TuistCore/Analytics/CommandEvent.swift index 0f58efa3d9f..871ca992231 100644 --- a/Sources/TuistAnalytics/Models/CommandEvent.swift +++ b/Sources/TuistCore/Analytics/CommandEvent.swift @@ -1,6 +1,5 @@ import AnyCodable import Foundation -import TuistCore /// A `CommandEvent` is the analytics event to track the execution of a Tuist command public struct CommandEvent: Codable, Equatable, AsyncQueueEvent { @@ -23,7 +22,7 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent { public let id = UUID() public let date = Date() - public let dispatcherId = TuistAnalyticsDispatcher.dispatcherId + public let dispatcherId = "TuistAnalytics" private enum CodingKeys: String, CodingKey { case name @@ -68,3 +67,36 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent { self.status = status } } + +#if MOCKING + extension CommandEvent { + public static func test( + name: String = "generate", + subcommand: String? = nil, + params: [String: AnyCodable] = [:], + commandArguments: [String] = [], + durationInMs: Int = 20, + clientId: String = "123", + tuistVersion: String = "1.2.3", + swiftVersion: String = "5.2", + macOSVersion: String = "10.15", + machineHardwareName: String = "arm64", + status: Status = .success + ) -> CommandEvent { + CommandEvent( + name: name, + subcommand: subcommand, + params: params, + commandArguments: commandArguments, + durationInMs: durationInMs, + clientId: clientId, + tuistVersion: tuistVersion, + swiftVersion: swiftVersion, + macOSVersion: macOSVersion, + machineHardwareName: machineHardwareName, + isCI: false, + status: status + ) + } + } +#endif diff --git a/Sources/TuistCore/Cache/CacheCategory.swift b/Sources/TuistCore/Cache/CacheCategory.swift index a0ae5334404..70aa7308be6 100644 --- a/Sources/TuistCore/Cache/CacheCategory.swift +++ b/Sources/TuistCore/Cache/CacheCategory.swift @@ -24,4 +24,18 @@ public enum CacheCategory: String, CaseIterable, RawRepresentable { return "Manifests" } } + + public enum App: String, CaseIterable { + case binaries + case selectiveTests + + public var directoryName: String { + switch self { + case .binaries: + return "BinaryCache" + case .selectiveTests: + return "SelectiveTests" + } + } + } } diff --git a/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift b/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift index 81a9e8dc2e8..18deb06a157 100644 --- a/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift +++ b/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift @@ -1,12 +1,19 @@ import Foundation +import Mockable import TSCBasic import TuistGraph import TuistSupport +@Mockable public protocol CacheDirectoriesProviding { /// Returns the cache directory for a Tuist cache category func tuistCacheDirectory(for category: CacheCategory) throws -> AbsolutePath + func tuistCloudCacheDirectory(for category: CacheCategory.App) throws -> AbsolutePath + func tuistCloudSelectiveTestsDirectory() throws -> AbsolutePath + func tuistCloudBinaryCacheDirectory() throws -> AbsolutePath + func tuistCloudCacheDirectory() throws -> AbsolutePath + func cacheDirectory() throws -> AbsolutePath } @@ -36,4 +43,27 @@ public final class CacheDirectoriesProvider: CacheDirectoriesProviding { return FileHandler.shared.homeDirectory.appending(components: ".cache") } } + + public static func tuistCloudCacheDirectory(for category: CacheCategory.App, cacheDirectory: AbsolutePath) -> AbsolutePath { + cacheDirectory.appending(components: ["tuist-cloud", category.directoryName]) + } + + public func tuistCloudCacheDirectory(for category: CacheCategory.App) throws -> AbsolutePath { + switch category { + case .binaries: return try tuistCloudBinaryCacheDirectory() + case .selectiveTests: return try tuistCloudSelectiveTestsDirectory() + } + } + + public func tuistCloudSelectiveTestsDirectory() throws -> AbsolutePath { + try tuistCloudCacheDirectory().appending(component: CacheCategory.App.selectiveTests.directoryName) + } + + public func tuistCloudBinaryCacheDirectory() throws -> AbsolutePath { + try tuistCloudCacheDirectory().appending(component: CacheCategory.App.binaries.directoryName) + } + + public func tuistCloudCacheDirectory() throws -> AbsolutePath { + try cacheDirectory().appending(components: ["tuist-cloud"]) + } } diff --git a/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift b/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift index daf8a93bfce..456834a2e7a 100644 --- a/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift +++ b/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift @@ -1,7 +1,9 @@ import Foundation +import Mockable import TuistGraph import TuistSupport +@Mockable public protocol CacheDirectoriesProviderFactoring { func cacheDirectories() throws -> CacheDirectoriesProviding } diff --git a/Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProvider.swift b/Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProvider.swift deleted file mode 100644 index 8a5d7a9a4f8..00000000000 --- a/Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProvider.swift +++ /dev/null @@ -1,30 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport -@testable import TuistCore - -public final class MockCacheDirectoriesProvider: CacheDirectoriesProviding { - private let directory: TemporaryDirectory - - public init() throws { - directory = try TemporaryDirectory(removeTreeOnDeinit: true) - } - - private var _tuistCacheDirectory: AbsolutePath { - tuistCacheDirectoryStub ?? directory.path.appending(component: "TuistCache") - } - - private var _cacheDirectory: AbsolutePath { - cacheDirectoryStub ?? directory.path - } - - public var tuistCacheDirectoryStub: AbsolutePath? - public func tuistCacheDirectory(for category: TuistCore.CacheCategory) throws -> TSCBasic.AbsolutePath { - _tuistCacheDirectory.appending(component: category.directoryName) - } - - public var cacheDirectoryStub: AbsolutePath? - public func cacheDirectory() throws -> AbsolutePath { - return _cacheDirectory - } -} diff --git a/Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProviderFactory.swift b/Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProviderFactory.swift deleted file mode 100644 index de5d806bef8..00000000000 --- a/Sources/TuistCoreTesting/Cache/MockCacheDirectoriesProviderFactory.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation -import TSCBasic -import TuistGraph -import TuistSupport -@testable import TuistCore - -public final class MockCacheDirectoriesProviderFactory: CacheDirectoriesProviderFactoring { - public var cacheDirectoriesStub: (() -> CacheDirectoriesProviding)? - private let provider: CacheDirectoriesProviding - - public init(provider: CacheDirectoriesProviding) { - self.provider = provider - } - - public func cacheDirectories() -> CacheDirectoriesProviding { - cacheDirectoriesStub?() ?? provider - } -} diff --git a/Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift new file mode 100644 index 00000000000..76b3adfd199 --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift @@ -0,0 +1,27 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudAnalyticsCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "analytics", + _superCommandName: "cloud", + abstract: "Open Tuist Cloud analytics dashboard." + ) + } + + @Option( + name: .shortAndLong, + help: "The path to the Tuist Cloud project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudAnalyticsService().run( + path: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift new file mode 100644 index 00000000000..823be9ba23e --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift @@ -0,0 +1,24 @@ +import ArgumentParser +import Foundation +import TSCBasic + +struct CloudAuthCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "auth", + _superCommandName: "cloud", + abstract: "Authenticates the user for using Cloud" + ) + } + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudAuthService().authenticate(directory: path) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift new file mode 100644 index 00000000000..8c4ecd2d83f --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift @@ -0,0 +1,27 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudCleanCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "clean", + _superCommandName: "cloud", + abstract: "Cleans the remote cache." + ) + } + + @Option( + name: .shortAndLong, + help: "The path to the Tuist Cloud project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudCleanService().clean( + path: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift new file mode 100644 index 00000000000..1e48c27198a --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift @@ -0,0 +1,41 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudInitCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "init", + _superCommandName: "cloud", + abstract: "Creates a new tuist cloud project." + ) + } + + @Argument( + help: "The name of the project to create.", + completion: .directory + ) + var name: String + + @Option( + name: .shortAndLong, + help: "Organization to initialize the Cloud project with. If not specified, the project is created with your personal Cloud account." + ) + var organization: String? + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudInitService().createProject( + name: name, + organization: organization, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift new file mode 100644 index 00000000000..527687beaac --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift @@ -0,0 +1,26 @@ +import ArgumentParser +import Foundation +import TSCBasic + +struct CloudLogoutCommand: ParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "logout", + _superCommandName: "cloud", + abstract: "Removes an existing Cloud session." + ) + } + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() throws { + try CloudLogoutService().logout( + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift new file mode 100644 index 00000000000..9fc32a68d6c --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift @@ -0,0 +1,33 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudOrganizationBillingCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "billing", + _superCommandName: "organization", + abstract: "Open billing dashboard for the specified organization." + ) + } + + @Argument( + help: "The name of the organization to show billing dashboard for." + ) + var organizationName: String + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudOrganizationBillingService().run( + organizationName: organizationName, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationCommand.swift new file mode 100644 index 00000000000..dca1e589613 --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationCommand.swift @@ -0,0 +1,23 @@ +import ArgumentParser +import Foundation +import TSCBasic + +struct CloudOrganizationCommand: ParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "organization", + _superCommandName: "cloud", + abstract: "A set of commands to manage your Cloud organizations.", + subcommands: [ + CloudOrganizationCreateCommand.self, + CloudOrganizationListCommand.self, + CloudOrganizationDeleteCommand.self, + CloudOrganizationShowCommand.self, + CloudOrganizationInviteCommand.self, + CloudOrganizationRemoveCommand.self, + CloudOrganizationUpdateCommand.self, + CloudOrganizationBillingCommand.self, + ] + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift new file mode 100644 index 00000000000..655c1d6707e --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift @@ -0,0 +1,33 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudOrganizationCreateCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "create", + _superCommandName: "organization", + abstract: "Create a new organization." + ) + } + + @Argument( + help: "The name of the organization to create." + ) + var organizationName: String + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudOrganizationCreateService().run( + organizationName: organizationName, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift new file mode 100644 index 00000000000..6f7111041a0 --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift @@ -0,0 +1,34 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudOrganizationDeleteCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "delete", + _superCommandName: "organization", + abstract: "Delete a new organization." + ) + } + + @Argument( + help: "The name of the organization to delete.", + completion: .directory + ) + var organizationName: String + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudOrganizationDeleteService().run( + organizationName: organizationName, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift new file mode 100644 index 00000000000..95c32372b50 --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift @@ -0,0 +1,39 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudOrganizationInviteCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "invite", + _superCommandName: "organization", + abstract: "Invite a new member to your organization." + ) + } + + @Argument( + help: "The name of the organization to invite the user to." + ) + var organizationName: String + + @Argument( + help: "The email of the user to invite." + ) + var email: String + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudOrganizationInviteService().run( + organizationName: organizationName, + email: email, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift new file mode 100644 index 00000000000..fdec3366b86 --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift @@ -0,0 +1,33 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudOrganizationListCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "list", + _superCommandName: "organization", + abstract: "List your organizations." + ) + } + + @Flag( + help: "The output in JSON format." + ) + var json: Bool = false + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudOrganizationListService().run( + json: json, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveCommand.swift new file mode 100644 index 00000000000..2625a55aede --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveCommand.swift @@ -0,0 +1,18 @@ +import ArgumentParser +import Foundation +import TSCBasic + +struct CloudOrganizationRemoveCommand: ParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "remove", + _superCommandName: "organization", + abstract: "A set of commands to remove members or cancel pending invitations.", + subcommands: [ + CloudOrganizationRemoveInviteCommand.self, + CloudOrganizationRemoveMemberCommand.self, + CloudOrganizationRemoveSSOCommand.self, + ] + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift new file mode 100644 index 00000000000..8f58359c85f --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift @@ -0,0 +1,39 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudOrganizationRemoveInviteCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "invite", + _superCommandName: "remove", + abstract: "Cancel pending invitation." + ) + } + + @Argument( + help: "The name of the organization to cancel the invitation for." + ) + var organizationName: String + + @Argument( + help: "The email of the user to cancel the invitation for." + ) + var email: String + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudOrganizationRemoveInviteService().run( + organizationName: organizationName, + email: email, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift new file mode 100644 index 00000000000..d93382b2847 --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift @@ -0,0 +1,39 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudOrganizationRemoveMemberCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "member", + _superCommandName: "remove", + abstract: "Remove a member from your organization." + ) + } + + @Argument( + help: "The name of the organization to remove the organization member from." + ) + var organizationName: String + + @Argument( + help: "The username of the member you want to remove from the organization." + ) + var username: String + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudOrganizationRemoveMemberService().run( + organizationName: organizationName, + username: username, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift new file mode 100644 index 00000000000..e2d6087d857 --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift @@ -0,0 +1,33 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudOrganizationRemoveSSOCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "sso", + _superCommandName: "remove", + abstract: "Remove the SSO provider for your organization." + ) + } + + @Argument( + help: "The name of the organization for which you want to update the SSO provider for." + ) + var organizationName: String + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudOrganizationRemoveSSOService().run( + organizationName: organizationName, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift new file mode 100644 index 00000000000..a63ed10da9f --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift @@ -0,0 +1,39 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudOrganizationShowCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "show", + _superCommandName: "organization", + abstract: "Show information about the specified organization." + ) + } + + @Argument( + help: "The name of the organization to show." + ) + var organizationName: String + + @Flag( + help: "The output in JSON format." + ) + var json: Bool = false + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudOrganizationShowService().run( + organizationName: organizationName, + json: json, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateCommand.swift new file mode 100644 index 00000000000..0b05955941d --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateCommand.swift @@ -0,0 +1,17 @@ +import ArgumentParser +import Foundation +import TSCBasic + +struct CloudOrganizationUpdateCommand: ParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "update", + _superCommandName: "organization", + abstract: "A set of commands to update the organization.", + subcommands: [ + CloudOrganizationUpdateMemberCommand.self, + CloudOrganizationUpdateSSOCommand.self, + ] + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift new file mode 100644 index 00000000000..cc47b57bb3a --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift @@ -0,0 +1,46 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudOrganizationUpdateMemberCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "member", + _superCommandName: "update", + abstract: "Update a member from your organization." + ) + } + + @Argument( + help: "The name of the organization for which you want to update the member for." + ) + var organizationName: String + + @Argument( + help: "The username of the member you want to update." + ) + var username: String + + @Option( + help: "The new member role", + completion: .list(["admin", "user"]) + ) + var role: String + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudOrganizationUpdateMemberService().run( + organizationName: organizationName, + username: username, + role: role, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift new file mode 100644 index 00000000000..dbf85f2bdb5 --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift @@ -0,0 +1,54 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +enum SSOProvider: String, ExpressibleByArgument { + case google + + static var allValueStrings: [String] { + ["google"] + } +} + +struct CloudOrganizationUpdateSSOCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "sso", + _superCommandName: "update", + abstract: "Update the SSO provider for your organization." + ) + } + + @Argument( + help: "The name of the organization for which you want to update the SSO provider for." + ) + var organizationName: String + + @Option( + help: "The SSO provider to use." + ) + var provider: SSOProvider + + @Option( + name: .shortAndLong, + help: "Organization ID for your SSO provider. For Google, this is your Google domain (for example, if your email is tuist@tuist.io, the domain would be tuist.io)" + ) + var organizationId: String + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudOrganizationUpdateSSOService().run( + organizationName: organizationName, + provider: provider, + organizationId: organizationId, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectCommand.swift new file mode 100644 index 00000000000..09543d9e397 --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectCommand.swift @@ -0,0 +1,19 @@ +import ArgumentParser +import Foundation +import TSCBasic + +struct CloudProjectCommand: ParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "project", + _superCommandName: "cloud", + abstract: "A set of commands to manage your cloud projects.", + subcommands: [ + CloudProjectCreateCommand.self, + CloudProjectListCommand.self, + CloudProjectDeleteCommand.self, + CloudProjectTokenCommand.self, + ] + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift new file mode 100644 index 00000000000..44ce6da4761 --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift @@ -0,0 +1,41 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudProjectCreateCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "create", + _superCommandName: "project", + abstract: "Create a new project." + ) + } + + @Argument( + help: "The name of the project to create.", + completion: .directory + ) + var name: String + + @Option( + name: .shortAndLong, + help: "Organization to create the project with. If not specified, the project is created with your personal cloud account." + ) + var organization: String? + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudProjectCreateService().run( + name: name, + organization: organization, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift new file mode 100644 index 00000000000..a28d56ed569 --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift @@ -0,0 +1,40 @@ +import ArgumentParser +import Foundation +import TuistSupport + +struct CloudProjectDeleteCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "delete", + _superCommandName: "project", + abstract: "Delete a Cloud project." + ) + } + + @Argument( + help: "The project to delete.", + completion: .directory + ) + var project: String + + @Option( + name: .shortAndLong, + help: "The organization that the project belongs to. By default, this is your personal Tuist Cloud account." + ) + var organization: String + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudProjectDeleteService().run( + projectName: project, + organizationName: organization, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift new file mode 100644 index 00000000000..3118b5d0daf --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift @@ -0,0 +1,33 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudProjectListCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "list", + _superCommandName: "project", + abstract: "List projects you have access to." + ) + } + + @Flag( + help: "The output in JSON format." + ) + var json: Bool = false + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudProjectListService().run( + json: json, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift new file mode 100644 index 00000000000..45420326878 --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift @@ -0,0 +1,41 @@ +import ArgumentParser +import Foundation +import TSCBasic +import TuistSupport + +struct CloudProjectTokenCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "token", + _superCommandName: "project", + abstract: "Get a project token. You can save this token in the `TUIST_CONFIG_CLOUD_TOKEN` environment variable to use the remote cache on the CI." + ) + } + + @Argument( + help: "The name of the project to get the token for.", + completion: .directory + ) + var projectName: String + + @Option( + name: .shortAndLong, + help: "Organization of the project. If not specified, it defaults to your user account." + ) + var organizationName: String + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await CloudProjectTokenService().run( + projectName: projectName, + organizationName: organizationName, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift new file mode 100644 index 00000000000..054291b96b3 --- /dev/null +++ b/Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift @@ -0,0 +1,26 @@ +import ArgumentParser +import Foundation +import TSCBasic + +struct CloudSessionCommand: ParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "session", + _superCommandName: "cloud", + abstract: "Prints the current Cloud session" + ) + } + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory + ) + var path: String? + + func run() throws { + try CloudSessionService().printSession( + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/CloudCommand.swift b/Sources/TuistKit/Commands/CloudCommand.swift new file mode 100644 index 00000000000..371a1c47ad0 --- /dev/null +++ b/Sources/TuistKit/Commands/CloudCommand.swift @@ -0,0 +1,24 @@ +import ArgumentParser +import Foundation +import TSCBasic + +struct CloudCommand: ParsableCommand { + static var configuration: CommandConfiguration { + var subcommands: [ParsableCommand.Type] = [] + subcommands = [ + CloudAuthCommand.self, + CloudSessionCommand.self, + CloudLogoutCommand.self, + CloudInitCommand.self, + CloudCleanCommand.self, + CloudProjectCommand.self, + CloudOrganizationCommand.self, + CloudAnalyticsCommand.self, + ] + return CommandConfiguration( + commandName: "cloud", + abstract: "A set of commands to interact with the cloud.", + subcommands: subcommands + ) + } +} diff --git a/Sources/TuistKit/Commands/TrackableCommand/CommandEventFactory.swift b/Sources/TuistKit/Commands/TrackableCommand/CommandEventFactory.swift index c3ea3ec95da..d10551f56b1 100644 --- a/Sources/TuistKit/Commands/TrackableCommand/CommandEventFactory.swift +++ b/Sources/TuistKit/Commands/TrackableCommand/CommandEventFactory.swift @@ -1,6 +1,7 @@ import Foundation import TuistAnalytics import TuistAsyncQueue +import TuistCore import TuistSupport /// `CommandEventTagger` builds a `CommandEvent` by grouping information diff --git a/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift b/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift index 9de3317e372..e8877b3b8a9 100644 --- a/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift +++ b/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift @@ -3,6 +3,7 @@ import ArgumentParser import Foundation import TuistAnalytics import TuistAsyncQueue +import TuistCore import TuistSupport /// `TrackableCommandInfo` contains the information to report the execution of a command diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index 3a2945c2418..b3b9acd5d63 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -1,5 +1,8 @@ @_exported import ArgumentParser import Foundation +import TSCBasic +import TuistAnalytics +import TuistLoader import TuistSupport public struct TuistCommand: AsyncParsableCommand { @@ -23,6 +26,7 @@ public struct TuistCommand: AsyncParsableCommand { RunCommand.self, ScaffoldCommand.self, TestCommand.self, + CloudCommand.self, ] ) } @@ -31,7 +35,26 @@ public struct TuistCommand: AsyncParsableCommand { _ arguments: [String]? = nil, parseAsRoot: ((_ arguments: [String]?) throws -> ParsableCommand) = Self.parseAsRoot, execute: ((_ command: ParsableCommand, _ commandArguments: [String]) async throws -> Void)? = nil - ) async { + ) async throws { + let path: AbsolutePath + if let argumentIndex = CommandLine.arguments.firstIndex(of: "--path") { + path = try AbsolutePath(validating: CommandLine.arguments[argumentIndex + 1], relativeTo: .current) + } else { + path = .current + } + + let backend: TuistAnalyticsBackend? + let config = try ConfigLoader().loadConfig(path: path) + if let cloud = config.cloud { + backend = TuistAnalyticsCloudBackend( + config: cloud + ) + } else { + backend = nil + } + let dispatcher = TuistAnalyticsDispatcher(backend: backend) + try TuistAnalytics.bootstrap(dispatcher: dispatcher) + let execute = execute ?? Self.execute let errorHandler = ErrorHandler() let executeCommand: () async throws -> Void diff --git a/Sources/TuistKit/Services/Cloud/CloudAnalyticsService.swift b/Sources/TuistKit/Services/Cloud/CloudAnalyticsService.swift new file mode 100644 index 00000000000..f6b9432b999 --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudAnalyticsService.swift @@ -0,0 +1,46 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistSupport + +protocol CloudAnalyticsServicing { + func run( + path: String? + ) async throws +} + +final class CloudAnalyticsService: CloudAnalyticsServicing { + private let configLoader: ConfigLoading + private let opener: Opening + + init( + configLoader: ConfigLoading = ConfigLoader(), + opener: Opening = Opener() + ) { + self.configLoader = configLoader + self.opener = opener + } + + func run( + path: String? + ) async throws { + let path: AbsolutePath = try self.path(path) + let config = try configLoader.loadConfig(path: path) + + guard let cloud = config.cloud else { throw CloudCleanServiceError.cloudNotFound } + try opener.open( + url: cloud.url + .appendingPathComponent(cloud.projectId) + ) + } + + // MARK: - Helpers + + private func path(_ path: String?) throws -> AbsolutePath { + if let path { + return try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) + } else { + return FileHandler.shared.currentPath + } + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudAuthService.swift b/Sources/TuistKit/Services/Cloud/CloudAuthService.swift new file mode 100644 index 00000000000..f698a90814d --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudAuthService.swift @@ -0,0 +1,46 @@ +import Foundation +import Mockable +import TSCBasic +import TuistCore +import TuistLoader +import TuistServer +import TuistSupport + +@Mockable +protocol CloudAuthServicing: AnyObject { + func authenticate( + directory: String? + ) async throws +} + +final class CloudAuthService: CloudAuthServicing { + private let cloudSessionController: CloudSessionControlling + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + cloudSessionController: CloudSessionControlling = CloudSessionController(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.cloudSessionController = cloudSessionController + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + // MARK: - CloudAuthServicing + + func authenticate( + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + try await cloudSessionController.authenticate(serverURL: cloudURL) + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudCleanService.swift b/Sources/TuistKit/Services/Cloud/CloudCleanService.swift new file mode 100644 index 00000000000..72df4e2a584 --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudCleanService.swift @@ -0,0 +1,74 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudCleanServicing { + func clean( + path: String? + ) async throws +} + +enum CloudCleanServiceError: FatalError, Equatable { + case cloudNotFound + + /// Error description. + var description: String { + switch self { + case .cloudNotFound: + return "You are missing Cloud configuration in your Config.swift. Run `tuist cloud init` to set up Cloud." + } + } + + /// Error type. + var type: ErrorType { + switch self { + case .cloudNotFound: + return .abort + } + } +} + +final class CloudCleanService: CloudCleanServicing { + private let cloudSessionController: CloudSessionControlling + private let cleanCacheService: CleanCacheServicing + private let configLoader: ConfigLoading + private let cloudURLService: CloudURLServicing + + init( + cloudSessionController: CloudSessionControlling = CloudSessionController(), + cleanCacheService: CleanCacheServicing = CleanCacheService(), + configLoader: ConfigLoading = ConfigLoader(), + cloudURLService: CloudURLServicing = CloudURLService() + ) { + self.cloudSessionController = cloudSessionController + self.cleanCacheService = cleanCacheService + self.configLoader = configLoader + self.cloudURLService = cloudURLService + } + + func clean(path: String?) async throws { + let path: AbsolutePath = try self.path(path) + let config = try configLoader.loadConfig(path: path) + + guard let cloud = config.cloud else { throw CloudCleanServiceError.cloudNotFound } + let cloudURL = try cloudURLService.url(configCloudURL: cloud.url) + try await cleanCacheService.cleanCache( + serverURL: cloudURL, + fullName: cloud.projectId + ) + + logger.info("Project was successfully cleaned.") + } + + // MARK: - Helpers + + private func path(_ path: String?) throws -> AbsolutePath { + if let path { + return try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) + } else { + return FileHandler.shared.currentPath + } + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudInitService.swift b/Sources/TuistKit/Services/Cloud/CloudInitService.swift new file mode 100644 index 00000000000..db36500bdf3 --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudInitService.swift @@ -0,0 +1,108 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudInitServicing { + func createProject( + name: String, + organization: String?, + directory: String? + ) async throws +} + +enum CloudInitServiceError: FatalError, Equatable { + case cloudAlreadySetUp + + /// Error description. + var description: String { + switch self { + case .cloudAlreadySetUp: + return "The project is already set up with Tuist Cloud." + } + } + + /// Error type. + var type: ErrorType { + switch self { + case .cloudAlreadySetUp: + return .abort + } + } +} + +final class CloudInitService: CloudInitServicing { + private let cloudSessionController: CloudSessionControlling + private let createProjectService: CreateProjectServicing + private let configLoader: ConfigLoading + private let cloudURLService: CloudURLServicing + + init( + cloudSessionController: CloudSessionControlling = CloudSessionController(), + createProjectService: CreateProjectServicing = CreateProjectService(), + configLoader: ConfigLoading = ConfigLoader(), + cloudURLService: CloudURLServicing = CloudURLService() + ) { + self.cloudSessionController = cloudSessionController + self.createProjectService = createProjectService + self.configLoader = configLoader + self.cloudURLService = cloudURLService + } + + func createProject( + name: String, + organization: String?, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + + if config.cloud != nil { + throw CloudInitServiceError.cloudAlreadySetUp + } + + let project = try await createProjectService.createProject( + name: name, + organization: organization, + serverURL: cloudURL + ) + + if configLoader.locateConfig(at: directoryPath) == nil { + let tuistDirectoryPath = directoryPath.appending(component: Constants.tuistDirectoryName) + if !FileHandler.shared.exists(tuistDirectoryPath) { + try FileHandler.shared.createFolder(tuistDirectoryPath) + } + try FileHandler.shared.write( + """ + import ProjectDescription + + let config = Config( + cloud: .cloud(projectId: "\(project.fullName)") + ) + + """, + path: tuistDirectoryPath.appending(component: Manifest.config.fileName(directoryPath)), + atomically: true + ) + logger.info( + """ + Tuist Cloud was successfully initialized. + """ + ) + } else { + logger.info( + """ + Put the following line into your Tuist/Config.swift (see the docs for more: https://docs.tuist.io/manifests/config/): + cloud: .cloud(projectId: "\(project.fullName)") + """ + ) + } + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudLogoutService.swift b/Sources/TuistKit/Services/Cloud/CloudLogoutService.swift new file mode 100644 index 00000000000..ee7c30c4620 --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudLogoutService.swift @@ -0,0 +1,44 @@ +import Foundation +import TSCBasic +import TuistCore +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudLogoutServicing: AnyObject { + /// It removes any session associated to that domain from + /// the keychain + func logout( + directory: String? + ) throws +} + +final class CloudLogoutService: CloudLogoutServicing { + private let cloudSessionController: CloudSessionControlling + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + cloudSessionController: CloudSessionControlling = CloudSessionController(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.cloudSessionController = cloudSessionController + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func logout( + directory: String? + ) throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + try cloudSessionController.logout(serverURL: cloudURL) + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationBillingService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationBillingService.swift new file mode 100644 index 00000000000..6a34395ad8b --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationBillingService.swift @@ -0,0 +1,47 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudOrganizationBillingServicing { + func run( + organizationName: String, + directory: String? + ) async throws +} + +final class CloudOrganizationBillingService: CloudOrganizationBillingServicing { + private let cloudURLService: CloudURLServicing + private let opener: Opening + private let configLoader: ConfigLoading + + init( + cloudURLService: CloudURLServicing = CloudURLService(), + opener: Opening = Opener(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.cloudURLService = cloudURLService + self.opener = opener + self.configLoader = configLoader + } + + func run( + organizationName: String, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + try opener.open( + url: cloudURL + .appendingPathComponent(organizationName) + .appendingPathComponent("billing") + ) + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationCreateService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationCreateService.swift new file mode 100644 index 00000000000..7d6568c00f2 --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationCreateService.swift @@ -0,0 +1,49 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudOrganizationCreateServicing { + func run( + organizationName: String, + directory: String? + ) async throws +} + +final class CloudOrganizationCreateService: CloudOrganizationCreateServicing { + private let createOrganizationService: CreateOrganizationServicing + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + createOrganizationService: CreateOrganizationServicing = CreateOrganizationService(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.createOrganizationService = createOrganizationService + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func run( + organizationName: String, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + + let organization = try await createOrganizationService.createOrganization( + name: organizationName, + serverURL: cloudURL + ) + + logger.info("Cloud organization \(organization.name) was successfully created 🎉") + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationDeleteService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationDeleteService.swift new file mode 100644 index 00000000000..33de52f0a4f --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationDeleteService.swift @@ -0,0 +1,49 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudOrganizationDeleteServicing { + func run( + organizationName: String, + directory: String? + ) async throws +} + +final class CloudOrganizationDeleteService: CloudOrganizationDeleteServicing { + private let deleteOrganizationService: DeleteOrganizationServicing + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + deleteOrganizationService: DeleteOrganizationServicing = DeleteOrganizationService(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.deleteOrganizationService = deleteOrganizationService + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func run( + organizationName: String, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + + try await deleteOrganizationService.deleteOrganization( + name: organizationName, + serverURL: cloudURL + ) + + logger.info("Cloud organization \(organizationName) was successfully deleted.") + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationInviteService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationInviteService.swift new file mode 100644 index 00000000000..1f05293029f --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationInviteService.swift @@ -0,0 +1,61 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudOrganizationInviteServicing { + func run( + organizationName: String, + email: String, + directory: String? + ) async throws +} + +final class CloudOrganizationInviteService: CloudOrganizationInviteServicing { + private let createOrganizationInviteService: CreateOrganizationInviteServicing + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + createOrganizationInviteService: CreateOrganizationInviteServicing = CreateOrganizationInviteService(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.createOrganizationInviteService = createOrganizationInviteService + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func run( + organizationName: String, + email: String, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + + let invitation = try await createOrganizationInviteService.createOrganizationInvite( + organizationName: organizationName, + email: email, + serverURL: cloudURL + ) + + let invitationURL = cloudURL + .appendingPathComponent("auth") + .appendingPathComponent("invitations") + .appendingPathComponent(invitation.token) + + logger.info(""" + \(invitation.inviteeEmail) was successfully invited to the \(organizationName) organization 🎉 + + You can also share with them the invite link directly: \(invitationURL.absoluteString) + """) + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift new file mode 100644 index 00000000000..8925ae8d2bc --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift @@ -0,0 +1,61 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudOrganizationListServicing { + func run( + json: Bool, + directory: String? + ) async throws +} + +final class CloudOrganizationListService: CloudOrganizationListServicing { + private let listOrganizationsService: ListOrganizationsServicing + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + listOrganizationsService: ListOrganizationsServicing = ListOrganizationsService(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.listOrganizationsService = listOrganizationsService + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func run( + json: Bool, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + + let organizations = try await listOrganizationsService.listOrganizations( + serverURL: cloudURL + ) + + if json { + let json = organizations.toJSON() + logger.info(.init(stringLiteral: json.toString(prettyPrint: true))) + return + } + + if organizations.isEmpty { + logger.info("You currently have no Cloud organizations. Create one by running `tuist cloud organization create`.") + return + } + + let organizationsString = "Listing all your organizations:\n" + organizations.map { " • \($0)" } + .joined(separator: "\n") + logger.info("\(organizationsString)") + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveInviteService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveInviteService.swift new file mode 100644 index 00000000000..0ea6af1a439 --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveInviteService.swift @@ -0,0 +1,52 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudOrganizationRemoveInviteServicing { + func run( + organizationName: String, + email: String, + directory: String? + ) async throws +} + +final class CloudOrganizationRemoveInviteService: CloudOrganizationRemoveInviteServicing { + private let cancelOrganizationRemoveInviteService: CancelOrganizationInviteServicing + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + cancelOrganizationRemoveInviteService: CancelOrganizationInviteServicing = CancelOrganizationInviteService(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.cancelOrganizationRemoveInviteService = cancelOrganizationRemoveInviteService + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func run( + organizationName: String, + email: String, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + + try await cancelOrganizationRemoveInviteService.cancelOrganizationInvite( + organizationName: organizationName, + email: email, + serverURL: cloudURL + ) + + logger.info("The invitation for \(email) to the \(organizationName) organization was successfully cancelled.") + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveMemberService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveMemberService.swift new file mode 100644 index 00000000000..48008f45d76 --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveMemberService.swift @@ -0,0 +1,52 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudOrganizationRemoveMemberServicing { + func run( + organizationName: String, + username: String, + directory: String? + ) async throws +} + +final class CloudOrganizationRemoveMemberService: CloudOrganizationRemoveMemberServicing { + private let removeOrganizationMemberService: RemoveOrganizationMemberServicing + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + removeOrganizationMemberService: RemoveOrganizationMemberServicing = RemoveOrganizationMemberService(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.removeOrganizationMemberService = removeOrganizationMemberService + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func run( + organizationName: String, + username: String, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + + try await removeOrganizationMemberService.removeOrganizationMember( + organizationName: organizationName, + username: username, + serverURL: cloudURL + ) + + logger.info("The member \(username) was successfully removed from the \(organizationName) organization.") + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveSSOService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveSSOService.swift new file mode 100644 index 00000000000..b94cfbbb849 --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveSSOService.swift @@ -0,0 +1,50 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudOrganizationRemoveSSOServicing { + func run( + organizationName: String, + directory: String? + ) async throws +} + +final class CloudOrganizationRemoveSSOService: CloudOrganizationRemoveSSOServicing { + private let updateOrganizationService: UpdateOrganizationServicing + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + updateOrganizationService: UpdateOrganizationServicing = UpdateOrganizationService(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.updateOrganizationService = updateOrganizationService + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func run( + organizationName: String, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + _ = try await updateOrganizationService.updateOrganization( + organizationName: organizationName, + serverURL: cloudURL, + ssoOrganization: nil + ) + + logger.info("SSO for \(organizationName) was removed.") + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift new file mode 100644 index 00000000000..7a321979476 --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift @@ -0,0 +1,139 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudOrganizationShowServicing { + func run( + organizationName: String, + json: Bool, + directory: String? + ) async throws +} + +final class CloudOrganizationShowService: CloudOrganizationShowServicing { + private let getOrganizationService: GetOrganizationServicing + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + getOrganizationService: GetOrganizationServicing = GetOrganizationService(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.getOrganizationService = getOrganizationService + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func run( + organizationName: String, + json: Bool, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + + let organization = try await getOrganizationService.getOrganization( + organizationName: organizationName, + serverURL: cloudURL + ) + + if json { + let json = try organization.toJSON() + logger.info(.init(stringLiteral: json.toString(prettyPrint: true))) + return + } + + let membersHeaders = ["username", "email", "role"] + let membersTable = formatDataToTable( + [membersHeaders] + organization.members.map { [$0.name, $0.email, $0.role.rawValue] } + ) + + let invitationsString: String + if organization.invitations.isEmpty { + invitationsString = "There are currently no invited users." + } else { + let invitationsHeaders = ["inviter", "invitee email"] + let invitationsTable = formatDataToTable( + [invitationsHeaders] + organization.invitations.map { [$0.inviter.name, $0.inviteeEmail] } + ) + invitationsString = """ + \("Invitations".bold()) (total number: \(organization.invitations.count)) + \(invitationsTable) + """ + } + + var baseInfo = [ + "Organization".bold(), + "Name: \(organization.name)", + "Plan: \(organization.plan.rawValue.capitalized)", + ] + + if let ssoOrganization = organization.ssoOrganization { + switch ssoOrganization { + case let .google(organizationId): + baseInfo.append("SSO: Google (\(organizationId))") + } + } + + logger.info(""" + \(baseInfo.joined(separator: "\n")) + + \("Organization members".bold()) (total number: \(organization.members.count)) + \(membersTable) + + \(invitationsString) + """) + } + + private func formatDataToTable(_ data: [[String]]) -> String { + guard !data.isEmpty else { + return "" + } + + var tableString = "" + + // Calculate the maximum width of each column + let columnWidths = data[0].indices.map { colIndex -> Int in + ( + data.map { $0[colIndex].count }.max() ?? 0 + ) + 2 + } + + // Format the data into the `tableString` + for (index, row) in data.enumerated() { + for (index, dataPoint) in row.enumerated() { + if index != row.endIndex - 1 { + tableString += dataPoint.paddedToWidth(columnWidths[index]) + } else { + tableString += dataPoint + } + } + if index != data.endIndex - 1 { + tableString += "\n" + } + } + + return tableString + } +} + +extension String { + fileprivate func paddedToWidth(_ width: Int) -> String { + let length = count + guard length < width else { + return self + } + + let spaces = [Character](repeating: " ", count: width - length) + return self + spaces + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateMemberService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateMemberService.swift new file mode 100644 index 00000000000..fc8aefc6290 --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateMemberService.swift @@ -0,0 +1,55 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudOrganizationUpdateMemberServicing { + func run( + organizationName: String, + username: String, + role: String, + directory: String? + ) async throws +} + +final class CloudOrganizationUpdateMemberService: CloudOrganizationUpdateMemberServicing { + private let updateOrganizationMemberService: UpdateOrganizationMemberServicing + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + updateOrganizationMemberService: UpdateOrganizationMemberServicing = UpdateOrganizationMemberService(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.updateOrganizationMemberService = updateOrganizationMemberService + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func run( + organizationName: String, + username: String, + role: String, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let member = try await updateOrganizationMemberService.updateOrganizationMember( + organizationName: organizationName, + username: username, + role: CloudOrganization.Member.Role(rawValue: role) ?? .user, + serverURL: cloudURL + ) + + logger.info("The member \(username) role was successfully updated to \(member.role.rawValue).") + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateService.swift new file mode 100644 index 00000000000..793064c5721 --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateService.swift @@ -0,0 +1,63 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudOrganizationUpdateSSOServicing { + func run( + organizationName: String, + provider: SSOProvider, + organizationId: String, + directory: String? + ) async throws +} + +final class CloudOrganizationUpdateSSOService: CloudOrganizationUpdateSSOServicing { + private let updateOrganizationService: UpdateOrganizationServicing + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + updateOrganizationService: UpdateOrganizationServicing = UpdateOrganizationService(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.updateOrganizationService = updateOrganizationService + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func run( + organizationName: String, + provider: SSOProvider, + organizationId: String, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + + let ssoOrganization: SSOOrganization + switch provider { + case .google: + ssoOrganization = .google(organizationId) + } + + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + _ = try await updateOrganizationService.updateOrganization( + organizationName: organizationName, + serverURL: cloudURL, + ssoOrganization: ssoOrganization + ) + + logger + .info( + "\(organizationName) now uses \(provider.rawValue.capitalized) SSO with \(organizationId). Users authenticated with the \(organizationId) SSO organization will automatically have access to the \(organizationName) projects." + ) + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift b/Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift new file mode 100644 index 00000000000..171ebf6df9f --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift @@ -0,0 +1,53 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudProjectCreateServicing { + func run( + name: String, + organization: String?, + directory: String? + ) async throws +} + +final class CloudProjectCreateService: CloudProjectCreateServicing { + private let createProjectService: CreateProjectServicing + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + createProjectService: CreateProjectServicing = CreateProjectService(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.createProjectService = createProjectService + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func run( + name: String, + organization: String?, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + + let project = try await createProjectService.createProject( + name: name, + organization: organization, + serverURL: cloudURL + ) + + logger.info("Tuist Cloud project \(project.fullName) was successfully created 🎉") + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift b/Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift new file mode 100644 index 00000000000..5024e28be12 --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift @@ -0,0 +1,65 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudProjectDeleteServicing { + func run( + projectName: String, + organizationName: String, + directory: String? + ) async throws +} + +final class CloudProjectDeleteService: CloudProjectDeleteServicing { + private let deleteProjectService: DeleteProjectServicing + private let getProjectService: GetProjectServicing + private let credentialsStore: CloudCredentialsStoring + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + deleteProjectService: DeleteProjectServicing = DeleteProjectService(), + getProjectService: GetProjectServicing = GetProjectService(), + credentialsStore: CloudCredentialsStoring = CloudCredentialsStore(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.deleteProjectService = deleteProjectService + self.getProjectService = getProjectService + self.credentialsStore = credentialsStore + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func run( + projectName: String, + organizationName: String, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + + let accountName: String = organizationName + + let project = try await getProjectService.getProject( + accountName: accountName, + projectName: projectName, + serverURL: cloudURL + ) + + try await deleteProjectService.deleteProject( + projectId: project.id, + serverURL: cloudURL + ) + + logger.info("Successfully deleted the \(project.fullName) project.") + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectListService.swift b/Sources/TuistKit/Services/Cloud/CloudProjectListService.swift new file mode 100644 index 00000000000..1a1332afa94 --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudProjectListService.swift @@ -0,0 +1,60 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudProjectListServicing { + func run( + json: Bool, + directory: String? + ) async throws +} + +final class CloudProjectListService: CloudProjectListServicing { + private let listProjectsService: ListProjectsServicing + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + listProjectsService: ListProjectsServicing = ListProjectsService(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.listProjectsService = listProjectsService + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func run( + json: Bool, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + + let projects = try await listProjectsService.listProjects( + serverURL: cloudURL + ) + + if json { + let json = try projects.toJSON() + logger.info(.init(stringLiteral: json.toString(prettyPrint: true))) + return + } + + if projects.isEmpty { + logger.info("You currently have no Cloud projects. Create one by running `tuist cloud project create`.") + return + } + + let projectsString = "Listing all your projects:\n" + projects.map { " • \($0.fullName)" }.joined(separator: "\n") + logger.info("\(projectsString)") + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift b/Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift new file mode 100644 index 00000000000..92f46c4a903 --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift @@ -0,0 +1,57 @@ +import Foundation +import TSCBasic +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudProjectTokenServicing { + func run( + projectName: String, + organizationName: String, + directory: String? + ) async throws +} + +final class CloudProjectTokenService: CloudProjectTokenServicing { + private let getProjectService: GetProjectServicing + private let credentialsStore: CloudCredentialsStoring + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + init( + getProjectService: GetProjectServicing = GetProjectService(), + credentialsStore: CloudCredentialsStoring = CloudCredentialsStore(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.getProjectService = getProjectService + self.credentialsStore = credentialsStore + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + func run( + projectName: String, + organizationName: String, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + + let accountName: String = organizationName + + let project = try await getProjectService.getProject( + accountName: accountName, + projectName: projectName, + serverURL: cloudURL + ) + + logger.info(.init(stringLiteral: project.token)) + } +} diff --git a/Sources/TuistKit/Services/Cloud/CloudSessionService.swift b/Sources/TuistKit/Services/Cloud/CloudSessionService.swift new file mode 100644 index 00000000000..f42e980715a --- /dev/null +++ b/Sources/TuistKit/Services/Cloud/CloudSessionService.swift @@ -0,0 +1,48 @@ +import Foundation +import TSCBasic +import TuistCore +import TuistLoader +import TuistServer +import TuistSupport + +protocol CloudSessionServicing: AnyObject { + /// It prints any existing session in the keychain to authenticate + /// on a server identified by that URL. + func printSession( + directory: String? + ) throws +} + +final class CloudSessionService: CloudSessionServicing { + private let cloudSessionController: CloudSessionControlling + private let cloudURLService: CloudURLServicing + private let configLoader: ConfigLoading + + // MARK: - Init + + init( + cloudSessionController: CloudSessionControlling = CloudSessionController(), + cloudURLService: CloudURLServicing = CloudURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.cloudSessionController = cloudSessionController + self.cloudURLService = cloudURLService + self.configLoader = configLoader + } + + // MARK: - CloudAuthServicing + + func printSession( + directory: String? + ) throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + try cloudSessionController.printSession(serverURL: cloudURL) + } +} diff --git a/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift b/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift new file mode 100644 index 00000000000..15fc7a8ca12 --- /dev/null +++ b/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift @@ -0,0 +1,45 @@ +import Foundation +import TuistAnalytics +import TuistAsyncQueue +import TuistCore +import TuistGraph +import TuistServer +import TuistSupport + +public class TuistAnalyticsCloudBackend: TuistAnalyticsBackend { + private let config: Cloud + private let createCommandEventService: CreateCommandEventServicing + private let ciChecker: CIChecking + + public convenience init(config: Cloud) { + self.init( + config: config, + createCommandEventService: CreateCommandEventService() + ) + } + + public init( + config: Cloud, + createCommandEventService: CreateCommandEventServicing, + ciChecker: CIChecking = CIChecker() + ) { + self.config = config + self.createCommandEventService = createCommandEventService + self.ciChecker = ciChecker + } + + public func send(commandEvent: CommandEvent) async throws { + let commandEvent = try await createCommandEventService.createCommandEvent( + commandEvent: commandEvent, + projectId: config.projectId, + serverURL: config.url + ) + + if #available(macOS 13.0, *), ciChecker.isCI() { + logger + .info( + "You can view a detailed report at: \(commandEvent.url.absoluteString)" + ) + } + } +} diff --git a/Sources/TuistServer/Client/Client+Cloud.swift b/Sources/TuistServer/Client/Client+Cloud.swift new file mode 100644 index 00000000000..e145c44fb39 --- /dev/null +++ b/Sources/TuistServer/Client/Client+Cloud.swift @@ -0,0 +1,35 @@ +import Foundation +import OpenAPIRuntime +import OpenAPIURLSession + +extension Client { + private static let commonMiddlewares: [any ClientMiddleware] = [ + CloudClientRequestIdMiddleware(), + CloudClientVerboseLoggingMiddleware(), + CloudClientOutputWarningsMiddleware(), + ] + + /// Tuist Cloud client for authenticated sessions + static func cloud(serverURL: URL) -> Client { + .init( + serverURL: serverURL, + transport: URLSessionTransport(configuration: .init(session: .sharedCloud)), + middlewares: commonMiddlewares + [ + CloudClientRequestIdMiddleware(), + CloudClientCLIMetadataHeadersMiddleware(), + CloudClientAuthenticationMiddleware(), + CloudClientVerboseLoggingMiddleware(), + CloudClientOutputWarningsMiddleware(), + ] + ) + } + + /// Tuist Cloud client for unauthenticated sessions + static func unauthenticatedCloud(serverURL: URL) -> Client { + .init( + serverURL: serverURL, + transport: URLSessionTransport(configuration: .init(session: .sharedCloud)), + middlewares: commonMiddlewares + ) + } +} diff --git a/Sources/TuistServer/Client/CloudClientAuthenticationMiddleware.swift b/Sources/TuistServer/Client/CloudClientAuthenticationMiddleware.swift new file mode 100644 index 00000000000..c30c6d9a9b6 --- /dev/null +++ b/Sources/TuistServer/Client/CloudClientAuthenticationMiddleware.swift @@ -0,0 +1,42 @@ +import Foundation +import OpenAPIRuntime +import TuistSupport + +enum CloudClientAuthenticationError: FatalError { + case notAuthenticated + + var type: ErrorType { + switch self { + case .notAuthenticated: + return .abort + } + } + + var description: String { + switch self { + case .notAuthenticated: + return "No cloud authentication token found. Authenticate by running `tuist cloud auth`." + } + } +} + +/// Injects an authorization header to every request. +struct CloudClientAuthenticationMiddleware: ClientMiddleware { + func intercept( + _ request: Request, + baseURL: URL, + operationID _: String, + next: (Request, URL) async throws -> Response + ) async throws -> Response { + var request = request + guard let token = try CloudAuthenticationController().authenticationToken(serverURL: baseURL) + else { + throw CloudClientAuthenticationError.notAuthenticated + } + + request.headerFields.append(.init( + name: "Authorization", value: "Bearer \(token.value)" + )) + return try await next(request, baseURL) + } +} diff --git a/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift b/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift new file mode 100644 index 00000000000..a81a8f67e46 --- /dev/null +++ b/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift @@ -0,0 +1,21 @@ +import Foundation +import OpenAPIRuntime +import TuistSupport + +/// This middleware includes the release date of the CLI in the headers so that we can show +/// warnings if the on-premise installation is too old. +struct CloudClientCLIMetadataHeadersMiddleware: ClientMiddleware { + let releaseDate = "2024.05.23" + + func intercept( + _ request: Request, + baseURL: URL, + operationID _: String, + next: (Request, URL) async throws -> Response + ) async throws -> Response { + var request = request + request.headerFields.append(.init(name: "x-tuist-cloud-cli-release-date", value: releaseDate)) + request.headerFields.append(.init(name: "x-tuist-cloud-cli-version", value: Constants.version)) + return try await next(request, baseURL) + } +} diff --git a/Sources/TuistServer/Client/CloudClientOutputWarningsMiddleware.swift b/Sources/TuistServer/Client/CloudClientOutputWarningsMiddleware.swift new file mode 100644 index 00000000000..c0b623ec8a2 --- /dev/null +++ b/Sources/TuistServer/Client/CloudClientOutputWarningsMiddleware.swift @@ -0,0 +1,62 @@ +import Foundation +import OpenAPIRuntime +import TuistSupport + +enum CloudClientOutputWarningsMiddlewareError: FatalError { + var type: TuistSupport.ErrorType { + switch self { + case .couldntConvertToData: + return .bug + case .invalidSchema: + return .bug + } + } + + var description: String { + switch self { + case .couldntConvertToData: + "We couldn't convert Tuist Cloud warnings into a data instance" + case .invalidSchema: + "The Tuist Cloud warnings returned by the server have an unexpected schema" + } + } + + case couldntConvertToData + case invalidSchema +} + +/// A middleware that gets any warning returned in a "x-cloud-warning" header +/// and outputs it to the user. +struct CloudClientOutputWarningsMiddleware: ClientMiddleware { + let warningController: WarningControlling + + init(warningController: WarningControlling = WarningController.shared) { + self.warningController = warningController + } + + func intercept( + _ request: Request, + baseURL: URL, + operationID _: String, + next: (Request, URL) async throws -> Response + ) async throws -> Response { + let response = try await next(request, baseURL) + guard let warnings = response.headerFields.first(where: { $0.name.lowercased() == "x-tuist-cloud-warnings" })?.value + else { + return response + } + guard let warningsData = warnings.data(using: .utf8), let data = Data(base64Encoded: warningsData) else { + throw CloudClientOutputWarningsMiddlewareError.couldntConvertToData + } + + guard let json = try JSONSerialization + .jsonObject(with: data) as? [String] + else { + throw CloudClientOutputWarningsMiddlewareError.invalidSchema + } + + json.forEach { warningController.append(warning: $0) } + + return response + } +} diff --git a/Sources/TuistServer/Client/CloudClientRequestIdMiddleware.swift b/Sources/TuistServer/Client/CloudClientRequestIdMiddleware.swift new file mode 100644 index 00000000000..fd30adba85d --- /dev/null +++ b/Sources/TuistServer/Client/CloudClientRequestIdMiddleware.swift @@ -0,0 +1,18 @@ +import Foundation +import OpenAPIRuntime +import TuistSupport + +/// A middleware that gets any warning returned in a "x-cloud-warning" header +/// and outputs it to the user. +struct CloudClientRequestIdMiddleware: ClientMiddleware { + func intercept( + _ request: Request, + baseURL: URL, + operationID _: String, + next: (Request, URL) async throws -> Response + ) async throws -> Response { + var request = request + request.headerFields.append(.init(name: "x-request-id", value: UUID().uuidString)) + return try await next(request, baseURL) + } +} diff --git a/Sources/TuistServer/Client/CloudClientVerboseLoggingMiddleware.swift b/Sources/TuistServer/Client/CloudClientVerboseLoggingMiddleware.swift new file mode 100644 index 00000000000..4fd8cb92b6f --- /dev/null +++ b/Sources/TuistServer/Client/CloudClientVerboseLoggingMiddleware.swift @@ -0,0 +1,42 @@ +import Foundation +import OpenAPIRuntime +import TuistSupport + +/// A middleware that outputs in debug mode the request and responses sent and received from the server +struct CloudClientVerboseLoggingMiddleware: ClientMiddleware { + func intercept( + _ request: Request, + baseURL: URL, + operationID _: String, + next: (Request, URL) async throws -> Response + ) async throws -> Response { + let requestJsonBody: Any? = if let body = request.body { + try? JSONSerialization.jsonObject(with: body) + } else { + nil + } + + logger.debug(""" + Sending HTTP request to Tuist Cloud: + - Method: \(request.method.rawValue) + - URL: \(baseURL.absoluteString) + - Path: \(request.path) + - Query: \(request.query ?? "") + - Body: \(requestJsonBody ?? "") + - Headers: \(request.headerFields) + """) + + let response = try await next(request, baseURL) + + let responseJsonBody: Any? = try? JSONSerialization.jsonObject(with: response.body) + + logger.debug(""" + Received HTTP response from Tuist Cloud: + - Status: \(response.statusCode) + - Body: \(responseJsonBody ?? "") + - Headers: \(response.headerFields) + """) + + return response + } +} diff --git a/Sources/TuistServer/Log/Logger.swift b/Sources/TuistServer/Log/Logger.swift new file mode 100644 index 00000000000..0bee730bfa2 --- /dev/null +++ b/Sources/TuistServer/Log/Logger.swift @@ -0,0 +1,3 @@ +import TuistSupport + +let logger = Logger(label: "io.tuist.app") diff --git a/Sources/TuistServer/Models/CloudCacheArtifact.swift b/Sources/TuistServer/Models/CloudCacheArtifact.swift new file mode 100644 index 00000000000..3a6e2fbc81c --- /dev/null +++ b/Sources/TuistServer/Models/CloudCacheArtifact.swift @@ -0,0 +1,57 @@ +import Foundation +import TuistSupport + +enum CloudCacheArtifactError: FatalError, Equatable { + case invalidURL(String) + + var description: String { + switch self { + case let .invalidURL(url): + return "Invalid URL for the remote cache artifact: \(url)." + } + } + + var type: ErrorType { + switch self { + case .invalidURL: + return .bug + } + } +} + +/// Cloud cache artifact +public struct CloudCacheArtifact: Codable { + public init( + url: URL, + expiresAt: Int + ) { + self.url = url + self.expiresAt = expiresAt + } + + public let url: URL + public let expiresAt: Int +} + +extension CloudCacheArtifact { + init(_ cacheArtifact: Components.Schemas.CacheArtifactDownloadURL) throws { + guard let url = URL(string: cacheArtifact.data.url) + else { throw CloudCacheArtifactError.invalidURL(cacheArtifact.data.url) } + self.url = url + expiresAt = Int(cacheArtifact.data.expires_at) + } +} + +#if MOCKING + extension CloudCacheArtifact { + public static func test( + url: URL = URL(string: Constants.URLs.production)!, + expiresAt: Int = 0 + ) -> Self { + .init( + url: url, + expiresAt: expiresAt + ) + } + } +#endif diff --git a/Sources/TuistServer/Models/CloudCommandEvent.swift b/Sources/TuistServer/Models/CloudCommandEvent.swift new file mode 100644 index 00000000000..4fcbacfd272 --- /dev/null +++ b/Sources/TuistServer/Models/CloudCommandEvent.swift @@ -0,0 +1,42 @@ +import Foundation + +/// Cloud command event +public struct CloudCommandEvent: Codable { + public let id: Int + public let name: String + public let url: URL + + public init( + id: Int, + name: String, + url: URL + ) { + self.id = id + self.name = name + self.url = url + } +} + +extension CloudCommandEvent { + init(_ commandEvent: Components.Schemas.CommandEvent) { + id = Int(commandEvent.id) + name = commandEvent.name + url = URL(string: commandEvent.url)! + } +} + +#if MOCKING + extension CloudCommandEvent { + public static func test( + id: Int = 0, + name: String = "generate", + url: URL = URL(string: "https://cloud.tuist.io/tuist-org/tuist/runs/10")! + ) -> Self { + .init( + id: id, + name: name, + url: url + ) + } + } +#endif diff --git a/Sources/TuistServer/Models/CloudInvitation.swift b/Sources/TuistServer/Models/CloudInvitation.swift new file mode 100644 index 00000000000..4b6c387b769 --- /dev/null +++ b/Sources/TuistServer/Models/CloudInvitation.swift @@ -0,0 +1,54 @@ +import Foundation + +/// Cloud invitation +public struct CloudInvitation: Codable { + public init( + id: Int, + inviteeEmail: String, + inviter: CloudUser, + organizationId: Int, + token: String + ) { + self.id = id + self.inviteeEmail = inviteeEmail + self.inviter = inviter + self.organizationId = organizationId + self.token = token + } + + public let id: Int + public let inviteeEmail: String + public let inviter: CloudUser + public let organizationId: Int + public let token: String +} + +extension CloudInvitation { + init(_ invitation: Components.Schemas.Invitation) { + id = Int(invitation.id) + inviteeEmail = invitation.invitee_email + inviter = CloudUser(invitation.inviter) + organizationId = Int(invitation.organization_id) + token = invitation.token + } +} + +#if MOCKING + extension CloudInvitation { + public static func test( + id: Int = 0, + inviteeEmail: String = "test@tuist.io", + inviter: CloudUser = .test(), + organizationId: Int = 0, + token: String = "token" + ) -> Self { + .init( + id: id, + inviteeEmail: inviteeEmail, + inviter: inviter, + organizationId: organizationId, + token: token + ) + } + } +#endif diff --git a/Sources/TuistServer/Models/CloudOrganization.swift b/Sources/TuistServer/Models/CloudOrganization.swift new file mode 100644 index 00000000000..1548b5660d0 --- /dev/null +++ b/Sources/TuistServer/Models/CloudOrganization.swift @@ -0,0 +1,166 @@ +import Foundation + +/// Cloud organization +public struct CloudOrganization: Codable { + public enum Plan: Codable, RawRepresentable { + case team, none + + public init(rawValue: String) { + switch rawValue { + case "team": + self = .team + default: + self = .none + } + } + + public var rawValue: String { + switch self { + case .team: + return "team" + case .none: + return "none" + } + } + } + + public struct Member: Codable { + public enum Role: Codable, RawRepresentable { + case user, admin + + public init?(rawValue: String) { + switch rawValue { + case "user": + self = .user + case "admin": + self = .admin + default: + self = .user + } + } + + public var rawValue: String { + switch self { + case .user: + return "user" + case .admin: + return "admin" + } + } + } + + public let id: Int + public let name: String + public let email: String + public let role: Role + + public init( + id: Int, + name: String, + email: String, + role: Role + ) { + self.id = id + self.name = name + self.email = email + self.role = role + } + } + + public let id: Int + public let name: String + public let plan: Plan + public let members: [Member] + public let invitations: [CloudInvitation] + public let ssoOrganization: SSOOrganization? + + public init( + id: Int, + name: String, + plan: Plan, + members: [Member], + invitations: [CloudInvitation], + ssoOrganization: SSOOrganization? + ) { + self.id = id + self.name = name + self.plan = plan + self.members = members + self.invitations = invitations + self.ssoOrganization = ssoOrganization + } +} + +extension CloudOrganization { + init(_ organization: Components.Schemas.Organization) { + id = Int(organization.id) + name = organization.name + plan = Plan(rawValue: organization.plan.rawValue) + members = organization.members.map(Member.init) + invitations = organization.invitations.map(CloudInvitation.init) + if let ssoProvider = organization.sso_provider, + let ssoOrganizationId = organization.sso_organization_id + { + switch ssoProvider { + case .google: + ssoOrganization = .google(ssoOrganizationId) + case .undocumented: + ssoOrganization = nil + } + } else { + ssoOrganization = nil + } + } +} + +extension CloudOrganization.Member { + init(_ organizationMember: Components.Schemas.OrganizationMember) { + id = Int(organizationMember.id) + name = organizationMember.name + email = organizationMember.email + switch organizationMember.role { + case .admin: + role = .admin + case .user, .undocumented: + role = .user + } + } +} + +#if MOCKING + extension CloudOrganization { + public static func test( + id: Int = 0, + name: String = "test", + plan: Plan = .team, + members: [Member] = [], + invitations: [CloudInvitation] = [], + ssoOrganization: SSOOrganization? = nil + ) -> Self { + .init( + id: id, + name: name, + plan: plan, + members: members, + invitations: invitations, + ssoOrganization: ssoOrganization + ) + } + } + + extension CloudOrganization.Member { + public static func test( + id: Int = 0, + name: String = "test", + email: String = "test@email.io", + role: Role = .user + ) -> Self { + .init( + id: id, + name: name, + email: email, + role: role + ) + } + } +#endif diff --git a/Sources/TuistServer/Models/CloudProject.swift b/Sources/TuistServer/Models/CloudProject.swift new file mode 100644 index 00000000000..42fc8664819 --- /dev/null +++ b/Sources/TuistServer/Models/CloudProject.swift @@ -0,0 +1,42 @@ +import Foundation + +/// Cloud project +public struct CloudProject: Codable { + public init( + id: Int, + fullName: String, + token: String + ) { + self.id = id + self.fullName = fullName + self.token = token + } + + public let id: Int + public let fullName: String + public let token: String +} + +extension CloudProject { + init(_ project: Components.Schemas.Project) { + id = Int(project.id) + fullName = project.full_name + token = project.token + } +} + +#if MOCKING + extension CloudProject { + public static func test( + id: Int = 0, + fullName: String = "test/test", + token: String = "token" + ) -> Self { + .init( + id: id, + fullName: fullName, + token: token + ) + } + } +#endif diff --git a/Sources/TuistServer/Models/CloudUser.swift b/Sources/TuistServer/Models/CloudUser.swift new file mode 100644 index 00000000000..75204a8a2ef --- /dev/null +++ b/Sources/TuistServer/Models/CloudUser.swift @@ -0,0 +1,42 @@ +import Foundation + +/// Cloud user +public struct CloudUser: Codable { + public let id: Int + public let name: String + public let email: String + + public init( + id: Int, + name: String, + email: String + ) { + self.id = id + self.name = name + self.email = email + } +} + +extension CloudUser { + init(_ user: Components.Schemas.User) { + id = Int(user.id) + name = user.name + email = user.email + } +} + +#if MOCKING + extension CloudUser { + public static func test( + id: Int = 0, + name: String = "test", + email: String = "test@email.io" + ) -> Self { + .init( + id: id, + name: name, + email: email + ) + } + } +#endif diff --git a/Sources/TuistServer/Models/SSOOrganization.swift b/Sources/TuistServer/Models/SSOOrganization.swift new file mode 100644 index 00000000000..dbea82785e2 --- /dev/null +++ b/Sources/TuistServer/Models/SSOOrganization.swift @@ -0,0 +1,5 @@ +import Foundation + +public enum SSOOrganization: Codable, Equatable { + case google(String) +} diff --git a/Sources/TuistServer/Network/URLSession+Cloud.swift b/Sources/TuistServer/Network/URLSession+Cloud.swift new file mode 100644 index 00000000000..44289d8bc7e --- /dev/null +++ b/Sources/TuistServer/Network/URLSession+Cloud.swift @@ -0,0 +1,27 @@ +import Foundation + +private func cloudURLSessionConfiguration() -> URLSessionConfiguration { + var configuration: URLSessionConfiguration = .ephemeral + /** + Our API design leads to an inefficient usage of the transport layer, which leads to Fly having to spin + new machines suddenly, and that causes URLSession to time out. The high timeouts here are temporary + until we change the server-side API to lead to a more efficient using of the transport layer. + + I noticed on Fly https://fly.io/apps/tuist-cloud/metrics that the peaks can reach up to + 100 seconds, hence why I set the limit to 120. + */ + configuration.timeoutIntervalForRequest = 120 // 2 minutes + configuration.timeoutIntervalForResource = 300 // 5 minutes + configuration.allowsCellularAccess = true + configuration.allowsConstrainedNetworkAccess = true + configuration.allowsExpensiveNetworkAccess = true + return configuration +} + +private var _cloudURLSession: URLSession = .init(configuration: cloudURLSessionConfiguration()) + +extension URLSession { + public static var sharedCloud: URLSession { + _cloudURLSession + } +} diff --git a/Sources/TuistServer/OpenAPI/CacheCategoryParameter+Extras.swift b/Sources/TuistServer/OpenAPI/CacheCategoryParameter+Extras.swift new file mode 100644 index 00000000000..ca04a644b9e --- /dev/null +++ b/Sources/TuistServer/OpenAPI/CacheCategoryParameter+Extras.swift @@ -0,0 +1,12 @@ +import TuistCore + +extension Components.Schemas.CacheCategory { + init(_ cacheCategory: CacheCategory.App) { + switch cacheCategory { + case .binaries: + self = .builds + case .selectiveTests: + self = .tests + } + } +} diff --git a/Sources/TuistServer/OpenAPI/Client.swift b/Sources/TuistServer/OpenAPI/Client.swift new file mode 100644 index 00000000000..07e4c04f299 --- /dev/null +++ b/Sources/TuistServer/OpenAPI/Client.swift @@ -0,0 +1,1926 @@ +// Generated by swift-openapi-generator, do not modify. +@_spi(Generated) import OpenAPIRuntime +#if os(Linux) +@preconcurrency import Foundation +#else +import Foundation +#endif +public struct Client: APIProtocol { + /// The underlying HTTP client. + private let client: UniversalClient + /// Creates a new client. + /// - Parameters: + /// - serverURL: The server URL that the client connects to. Any server + /// URLs defined in the OpenAPI document are available as static methods + /// on the ``Servers`` type. + /// - configuration: A set of configuration values for the client. + /// - transport: A transport that performs HTTP operations. + /// - middlewares: A list of middlewares to call before the transport. + public init( + serverURL: URL, + configuration: Configuration = .init(), + transport: any ClientTransport, + middlewares: [any ClientMiddleware] = [] + ) { + self.client = .init( + serverURL: serverURL, + configuration: configuration, + transport: transport, + middlewares: middlewares + ) + } + private var converter: Converter { client.converter } + /// Create a a new command analytics event + /// + /// - Remark: HTTP `POST /api/analytics`. + /// - Remark: Generated from `#/paths//api/analytics/post(createCommandEvent)`. + public func createCommandEvent(_ input: Operations.createCommandEvent.Input) async throws + -> Operations.createCommandEvent.Output + { + try await client.send( + input: input, + forOperation: Operations.createCommandEvent.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/analytics", + parameters: [] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setQueryItemAsText( + in: &request, + name: "project_id", + value: input.query.project_id + ) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.createCommandEvent.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createCommandEvent.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.CommandEvent.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 403: + let headers: Operations.createCommandEvent.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createCommandEvent.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Get a specific device code. + /// + /// This endpoint returns a token for a given device code if the device code is authenticated. + /// + /// - Remark: HTTP `GET /api/auth/device_code/{device_code}`. + /// - Remark: Generated from `#/paths//api/auth/device_code/{device_code}/get(getDeviceCode)`. + public func getDeviceCode(_ input: Operations.getDeviceCode.Input) async throws + -> Operations.getDeviceCode.Output + { + try await client.send( + input: input, + forOperation: Operations.getDeviceCode.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/auth/device_code/{}", + parameters: [input.path.device_code] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .get) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.getDeviceCode.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.getDeviceCode.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Operations.getDeviceCode.Output.Ok.Body.jsonPayload.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 202: + let headers: Operations.getDeviceCode.Output.Accepted.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.getDeviceCode.Output.Accepted.Body = + try converter.getResponseBodyAsJSON( + OpenAPIRuntime.OpenAPIObjectContainer.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .accepted(.init(headers: headers, body: body)) + case 400: + let headers: Operations.getDeviceCode.Output.BadRequest.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.getDeviceCode.Output.BadRequest.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .badRequest(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Downloads an artifact from the cache. + /// + /// This endpoint returns a signed URL that can be used to download an artifact from the cache. + /// + /// - Remark: HTTP `GET /api/cache`. + /// - Remark: Generated from `#/paths//api/cache/get(downloadCacheArtifact)`. + public func downloadCacheArtifact(_ input: Operations.downloadCacheArtifact.Input) async throws + -> Operations.downloadCacheArtifact.Output + { + try await client.send( + input: input, + forOperation: Operations.downloadCacheArtifact.id, + serializer: { input in + let path = try converter.renderedRequestPath(template: "/api/cache", parameters: []) + var request: OpenAPIRuntime.Request = .init(path: path, method: .get) + suppressMutabilityWarning(&request) + try converter.setQueryItemAsText( + in: &request, + name: "cache_category", + value: input.query.cache_category + ) + try converter.setQueryItemAsText( + in: &request, + name: "project_id", + value: input.query.project_id + ) + try converter.setQueryItemAsText( + in: &request, + name: "hash", + value: input.query.hash + ) + try converter.setQueryItemAsText( + in: &request, + name: "name", + value: input.query.name + ) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.downloadCacheArtifact.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.downloadCacheArtifact.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.CacheArtifactDownloadURL.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 402: + let headers: Operations.downloadCacheArtifact.Output.PaymentRequired.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.downloadCacheArtifact.Output.PaymentRequired.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .paymentRequired(.init(headers: headers, body: body)) + case 403: + let headers: Operations.downloadCacheArtifact.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.downloadCacheArtifact.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.downloadCacheArtifact.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.downloadCacheArtifact.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// It checks if an artifact exists in the cache. + /// + /// This endpoint checks if an artifact exists in the cache. It returns a 404 status code if the artifact does not exist. + /// + /// - Remark: HTTP `GET /api/cache/exists`. + /// - Remark: Generated from `#/paths//api/cache/exists/get(cacheArtifactExists)`. + public func cacheArtifactExists(_ input: Operations.cacheArtifactExists.Input) async throws + -> Operations.cacheArtifactExists.Output + { + try await client.send( + input: input, + forOperation: Operations.cacheArtifactExists.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/cache/exists", + parameters: [] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .get) + suppressMutabilityWarning(&request) + try converter.setQueryItemAsText( + in: &request, + name: "cache_category", + value: input.query.cache_category + ) + try converter.setQueryItemAsText( + in: &request, + name: "project_id", + value: input.query.project_id + ) + try converter.setQueryItemAsText( + in: &request, + name: "hash", + value: input.query.hash + ) + try converter.setQueryItemAsText( + in: &request, + name: "name", + value: input.query.name + ) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.cacheArtifactExists.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.cacheArtifactExists.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Operations.cacheArtifactExists.Output.Ok.Body.jsonPayload.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 402: + let headers: Operations.cacheArtifactExists.Output.PaymentRequired.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.cacheArtifactExists.Output.PaymentRequired.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .paymentRequired(.init(headers: headers, body: body)) + case 403: + let headers: Operations.cacheArtifactExists.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.cacheArtifactExists.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.cacheArtifactExists.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.cacheArtifactExists.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Operations.cacheArtifactExists.Output.NotFound.Body.jsonPayload.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// It completes a multi-part upload. + /// + /// Given the upload ID and all the parts with their ETags, this endpoint completes the multipart upload. The cache will then be able to serve the artifact. + /// + /// - Remark: HTTP `POST /api/cache/multipart/complete`. + /// - Remark: Generated from `#/paths//api/cache/multipart/complete/post(completeCacheArtifactMultipartUpload)`. + public func completeCacheArtifactMultipartUpload( + _ input: Operations.completeCacheArtifactMultipartUpload.Input + ) async throws -> Operations.completeCacheArtifactMultipartUpload.Output { + try await client.send( + input: input, + forOperation: Operations.completeCacheArtifactMultipartUpload.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/cache/multipart/complete", + parameters: [] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setQueryItemAsText( + in: &request, + name: "cache_category", + value: input.query.cache_category + ) + try converter.setQueryItemAsText( + in: &request, + name: "project_id", + value: input.query.project_id + ) + try converter.setQueryItemAsText( + in: &request, + name: "hash", + value: input.query.hash + ) + try converter.setQueryItemAsText( + in: &request, + name: "upload_id", + value: input.query.upload_id + ) + try converter.setQueryItemAsText( + in: &request, + name: "name", + value: input.query.name + ) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.completeCacheArtifactMultipartUpload.Output.Ok.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.completeCacheArtifactMultipartUpload.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Operations.completeCacheArtifactMultipartUpload.Output.Ok.Body + .jsonPayload.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 402: + let headers: + Operations.completeCacheArtifactMultipartUpload.Output.PaymentRequired + .Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.completeCacheArtifactMultipartUpload.Output.PaymentRequired.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .paymentRequired(.init(headers: headers, body: body)) + case 403: + let headers: + Operations.completeCacheArtifactMultipartUpload.Output.Forbidden.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.completeCacheArtifactMultipartUpload.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: + Operations.completeCacheArtifactMultipartUpload.Output.NotFound.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.completeCacheArtifactMultipartUpload.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// It generates a signed URL for uploading a part. + /// + /// Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. + /// + /// - Remark: HTTP `POST /api/cache/multipart/generate-url`. + /// - Remark: Generated from `#/paths//api/cache/multipart/generate-url/post(generateCacheArtifactMultipartUploadURL)`. + public func generateCacheArtifactMultipartUploadURL( + _ input: Operations.generateCacheArtifactMultipartUploadURL.Input + ) async throws -> Operations.generateCacheArtifactMultipartUploadURL.Output { + try await client.send( + input: input, + forOperation: Operations.generateCacheArtifactMultipartUploadURL.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/cache/multipart/generate-url", + parameters: [] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setQueryItemAsText( + in: &request, + name: "cache_category", + value: input.query.cache_category + ) + try converter.setQueryItemAsText( + in: &request, + name: "project_id", + value: input.query.project_id + ) + try converter.setQueryItemAsText( + in: &request, + name: "hash", + value: input.query.hash + ) + try converter.setQueryItemAsText( + in: &request, + name: "part_number", + value: input.query.part_number + ) + try converter.setQueryItemAsText( + in: &request, + name: "upload_id", + value: input.query.upload_id + ) + try converter.setQueryItemAsText( + in: &request, + name: "name", + value: input.query.name + ) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: + Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Body + .jsonPayload.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 402: + let headers: + Operations.generateCacheArtifactMultipartUploadURL.Output.PaymentRequired + .Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.generateCacheArtifactMultipartUploadURL.Output.PaymentRequired + .Body = try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .paymentRequired(.init(headers: headers, body: body)) + case 403: + let headers: + Operations.generateCacheArtifactMultipartUploadURL.Output.Forbidden.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.generateCacheArtifactMultipartUploadURL.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: + Operations.generateCacheArtifactMultipartUploadURL.Output.NotFound.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.generateCacheArtifactMultipartUploadURL.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// It initiates a multipart upload in the cache. + /// + /// The endpoint returns an upload ID that can be used to generate URLs for the individual parts and complete the upload. + /// + /// - Remark: HTTP `POST /api/cache/multipart/start`. + /// - Remark: Generated from `#/paths//api/cache/multipart/start/post(startCacheArtifactMultipartUpload)`. + public func startCacheArtifactMultipartUpload( + _ input: Operations.startCacheArtifactMultipartUpload.Input + ) async throws -> Operations.startCacheArtifactMultipartUpload.Output { + try await client.send( + input: input, + forOperation: Operations.startCacheArtifactMultipartUpload.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/cache/multipart/start", + parameters: [] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setQueryItemAsText( + in: &request, + name: "cache_category", + value: input.query.cache_category + ) + try converter.setQueryItemAsText( + in: &request, + name: "project_id", + value: input.query.project_id + ) + try converter.setQueryItemAsText( + in: &request, + name: "hash", + value: input.query.hash + ) + try converter.setQueryItemAsText( + in: &request, + name: "name", + value: input.query.name + ) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.startCacheArtifactMultipartUpload.Output.Ok.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.startCacheArtifactMultipartUpload.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Operations.startCacheArtifactMultipartUpload.Output.Ok.Body.jsonPayload + .self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 402: + let headers: + Operations.startCacheArtifactMultipartUpload.Output.PaymentRequired.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.startCacheArtifactMultipartUpload.Output.PaymentRequired.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .paymentRequired(.init(headers: headers, body: body)) + case 403: + let headers: + Operations.startCacheArtifactMultipartUpload.Output.Forbidden.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.startCacheArtifactMultipartUpload.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: + Operations.startCacheArtifactMultipartUpload.Output.NotFound.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.startCacheArtifactMultipartUpload.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Lists the organizations + /// + /// Returns all the organizations the authenticated subject is part of. + /// + /// - Remark: HTTP `GET /api/organizations`. + /// - Remark: Generated from `#/paths//api/organizations/get(listOrganizations)`. + public func listOrganizations(_ input: Operations.listOrganizations.Input) async throws + -> Operations.listOrganizations.Output + { + try await client.send( + input: input, + forOperation: Operations.listOrganizations.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/organizations", + parameters: [] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .get) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.listOrganizations.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.listOrganizations.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Operations.listOrganizations.Output.Ok.Body.jsonPayload.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 403: + let headers: Operations.listOrganizations.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.listOrganizations.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Creates an organization + /// + /// Creates an organization with the given name. + /// + /// - Remark: HTTP `POST /api/organizations`. + /// - Remark: Generated from `#/paths//api/organizations/post(createOrganization)`. + public func createOrganization(_ input: Operations.createOrganization.Input) async throws + -> Operations.createOrganization.Output + { + try await client.send( + input: input, + forOperation: Operations.createOrganization.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/organizations", + parameters: [] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.createOrganization.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createOrganization.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.Organization.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 400: + let headers: Operations.createOrganization.Output.BadRequest.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createOrganization.Output.BadRequest.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .badRequest(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Shows an organization + /// + /// Returns the organization with the given identifier. + /// + /// - Remark: HTTP `GET /api/organizations/{organization_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/get(showOrganization)`. + public func showOrganization(_ input: Operations.showOrganization.Input) async throws + -> Operations.showOrganization.Output + { + try await client.send( + input: input, + forOperation: Operations.showOrganization.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/organizations/{}", + parameters: [input.path.organization_name] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .get) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.showOrganization.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.showOrganization.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.Organization.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 403: + let headers: Operations.showOrganization.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.showOrganization.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.showOrganization.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.showOrganization.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Updates an organization + /// + /// Updates an organization with given parameters. + /// + /// - Remark: HTTP `PATCH /api/organizations/{organization_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/patch(updateOrganization (2))`. + public func updateOrganization__2_(_ input: Operations.updateOrganization__2_.Input) + async throws -> Operations.updateOrganization__2_.Output + { + try await client.send( + input: input, + forOperation: Operations.updateOrganization__2_.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/organizations/{}", + parameters: [input.path.organization_name] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .patch) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.updateOrganization__2_.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganization__2_.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.Organization.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 400: + let headers: Operations.updateOrganization__2_.Output.BadRequest.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganization__2_.Output.BadRequest.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .badRequest(.init(headers: headers, body: body)) + case 403: + let headers: Operations.updateOrganization__2_.Output.Forbidden.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganization__2_.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.updateOrganization__2_.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganization__2_.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Updates an organization + /// + /// Updates an organization with given parameters. + /// + /// - Remark: HTTP `PUT /api/organizations/{organization_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/put(updateOrganization)`. + public func updateOrganization(_ input: Operations.updateOrganization.Input) async throws + -> Operations.updateOrganization.Output + { + try await client.send( + input: input, + forOperation: Operations.updateOrganization.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/organizations/{}", + parameters: [input.path.organization_name] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .put) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.updateOrganization.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganization.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.Organization.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 400: + let headers: Operations.updateOrganization.Output.BadRequest.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganization.Output.BadRequest.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .badRequest(.init(headers: headers, body: body)) + case 403: + let headers: Operations.updateOrganization.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganization.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.updateOrganization.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganization.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Deletes an organization + /// + /// Deletes the organization with the given name. + /// + /// - Remark: HTTP `DELETE /api/organizations/{organization_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/delete(deleteOrganization)`. + public func deleteOrganization(_ input: Operations.deleteOrganization.Input) async throws + -> Operations.deleteOrganization.Output + { + try await client.send( + input: input, + forOperation: Operations.deleteOrganization.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/organizations/{}", + parameters: [input.path.organization_name] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .delete) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 204: + let headers: Operations.deleteOrganization.Output.NoContent.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.deleteOrganization.Output.NoContent.Body = + try converter.getResponseBodyAsJSON( + OpenAPIRuntime.OpenAPIValueContainer.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .noContent(.init(headers: headers, body: body)) + case 403: + let headers: Operations.deleteOrganization.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.deleteOrganization.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.deleteOrganization.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.deleteOrganization.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Creates an invitation + /// + /// Invites a user with a given email to a given organization. + /// + /// - Remark: HTTP `POST /api/organizations/{organization_name}/invitations`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/post(createInvitation)`. + public func createInvitation(_ input: Operations.createInvitation.Input) async throws + -> Operations.createInvitation.Output + { + try await client.send( + input: input, + forOperation: Operations.createInvitation.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/organizations/{}/invitations", + parameters: [input.path.organization_name] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.createInvitation.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createInvitation.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.Invitation.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 400: + let headers: Operations.createInvitation.Output.BadRequest.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createInvitation.Output.BadRequest.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .badRequest(.init(headers: headers, body: body)) + case 403: + let headers: Operations.createInvitation.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createInvitation.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.createInvitation.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createInvitation.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Cancels an invitation + /// + /// Cancels an invitation for a given invitee email and an organization. + /// + /// - Remark: HTTP `DELETE /api/organizations/{organization_name}/invitations`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/delete(cancelInvitation)`. + public func cancelInvitation(_ input: Operations.cancelInvitation.Input) async throws + -> Operations.cancelInvitation.Output + { + try await client.send( + input: input, + forOperation: Operations.cancelInvitation.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/organizations/{}/invitations", + parameters: [input.path.organization_name] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .delete) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 204: + let headers: Operations.cancelInvitation.Output.NoContent.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.cancelInvitation.Output.NoContent.Body = + try converter.getResponseBodyAsJSON( + OpenAPIRuntime.OpenAPIValueContainer.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .noContent(.init(headers: headers, body: body)) + case 403: + let headers: Operations.cancelInvitation.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.cancelInvitation.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.cancelInvitation.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.cancelInvitation.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Updates a member in an organization + /// + /// Updates a member in a given organization + /// + /// - Remark: HTTP `PUT /api/organizations/{organization_name}/members/{user_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/put(updateOrganizationMember)`. + public func updateOrganizationMember(_ input: Operations.updateOrganizationMember.Input) + async throws -> Operations.updateOrganizationMember.Output + { + try await client.send( + input: input, + forOperation: Operations.updateOrganizationMember.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/organizations/{}/members/{}", + parameters: [input.path.organization_name, input.path.user_name] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .put) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.updateOrganizationMember.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganizationMember.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.OrganizationMember.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 400: + let headers: Operations.updateOrganizationMember.Output.BadRequest.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganizationMember.Output.BadRequest.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .badRequest(.init(headers: headers, body: body)) + case 403: + let headers: Operations.updateOrganizationMember.Output.Forbidden.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganizationMember.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.updateOrganizationMember.Output.NotFound.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganizationMember.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Removes a member from an organization + /// + /// Removes a member with a given username from a given organization + /// + /// - Remark: HTTP `DELETE /api/organizations/{organization_name}/members/{user_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/delete(removeOrganizationMember)`. + public func removeOrganizationMember(_ input: Operations.removeOrganizationMember.Input) + async throws -> Operations.removeOrganizationMember.Output + { + try await client.send( + input: input, + forOperation: Operations.removeOrganizationMember.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/organizations/{}/members/{}", + parameters: [input.path.organization_name, input.path.user_name] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .delete) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 204: + let headers: Operations.removeOrganizationMember.Output.NoContent.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.removeOrganizationMember.Output.NoContent.Body = + try converter.getResponseBodyAsJSON( + OpenAPIRuntime.OpenAPIValueContainer.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .noContent(.init(headers: headers, body: body)) + case 400: + let headers: Operations.removeOrganizationMember.Output.BadRequest.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.removeOrganizationMember.Output.BadRequest.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .badRequest(.init(headers: headers, body: body)) + case 403: + let headers: Operations.removeOrganizationMember.Output.Forbidden.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.removeOrganizationMember.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.removeOrganizationMember.Output.NotFound.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.removeOrganizationMember.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// List projects the authenticated user has access to. + /// + /// - Remark: HTTP `GET /api/projects`. + /// - Remark: Generated from `#/paths//api/projects/get(listProjects)`. + public func listProjects(_ input: Operations.listProjects.Input) async throws + -> Operations.listProjects.Output + { + try await client.send( + input: input, + forOperation: Operations.listProjects.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/projects", + parameters: [] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .get) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.listProjects.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.listProjects.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Operations.listProjects.Output.Ok.Body.jsonPayload.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Create a new project. + /// + /// - Remark: HTTP `POST /api/projects`. + /// - Remark: Generated from `#/paths//api/projects/post(createProject)`. + public func createProject(_ input: Operations.createProject.Input) async throws + -> Operations.createProject.Output + { + try await client.send( + input: input, + forOperation: Operations.createProject.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/projects", + parameters: [] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.createProject.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createProject.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.Project.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 400: + let headers: Operations.createProject.Output.BadRequest.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createProject.Output.BadRequest.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .badRequest(.init(headers: headers, body: body)) + case 403: + let headers: Operations.createProject.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createProject.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Returns a project based on the handle. + /// + /// - Remark: HTTP `GET /api/projects/{account_name}/{project_name}`. + /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/get(showProject)`. + public func showProject(_ input: Operations.showProject.Input) async throws + -> Operations.showProject.Output + { + try await client.send( + input: input, + forOperation: Operations.showProject.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/projects/{}/{}", + parameters: [input.path.account_name, input.path.project_name] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .get) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.showProject.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.showProject.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.Project.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 403: + let headers: Operations.showProject.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.showProject.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.showProject.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.showProject.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Cleans cache for a given project + /// + /// - Remark: HTTP `PUT /api/projects/{account_name}/{project_name}/cache/clean`. + /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/cache/clean/put(cleanCache)`. + public func cleanCache(_ input: Operations.cleanCache.Input) async throws + -> Operations.cleanCache.Output + { + try await client.send( + input: input, + forOperation: Operations.cleanCache.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/projects/{}/{}/cache/clean", + parameters: [input.path.account_name, input.path.project_name] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .put) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 204: + let headers: Operations.cleanCache.Output.NoContent.Headers = .init() + return .noContent(.init(headers: headers, body: nil)) + case 403: + let headers: Operations.cleanCache.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.cleanCache.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.cleanCache.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.cleanCache.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Deletes a project with a given id. + /// + /// - Remark: HTTP `DELETE /api/projects/{id}`. + /// - Remark: Generated from `#/paths//api/projects/{id}/delete(deleteProject)`. + public func deleteProject(_ input: Operations.deleteProject.Input) async throws + -> Operations.deleteProject.Output + { + try await client.send( + input: input, + forOperation: Operations.deleteProject.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/projects/{}", + parameters: [input.path.id] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .delete) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 204: + let headers: Operations.deleteProject.Output.NoContent.Headers = .init() + return .noContent(.init(headers: headers, body: nil)) + case 403: + let headers: Operations.deleteProject.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.deleteProject.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.deleteProject.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.deleteProject.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } +} diff --git a/Sources/TuistServer/OpenAPI/Types.swift b/Sources/TuistServer/OpenAPI/Types.swift new file mode 100644 index 00000000000..f0bc0fe727d --- /dev/null +++ b/Sources/TuistServer/OpenAPI/Types.swift @@ -0,0 +1,5280 @@ +// Generated by swift-openapi-generator, do not modify. +@_spi(Generated) import OpenAPIRuntime +#if os(Linux) +@preconcurrency import Foundation +#else +import Foundation +#endif +/// A type that performs HTTP operations defined by the OpenAPI document. +public protocol APIProtocol: Sendable { + /// Create a a new command analytics event + /// + /// - Remark: HTTP `POST /api/analytics`. + /// - Remark: Generated from `#/paths//api/analytics/post(createCommandEvent)`. + func createCommandEvent(_ input: Operations.createCommandEvent.Input) async throws + -> Operations.createCommandEvent.Output + /// Get a specific device code. + /// + /// This endpoint returns a token for a given device code if the device code is authenticated. + /// + /// - Remark: HTTP `GET /api/auth/device_code/{device_code}`. + /// - Remark: Generated from `#/paths//api/auth/device_code/{device_code}/get(getDeviceCode)`. + func getDeviceCode(_ input: Operations.getDeviceCode.Input) async throws + -> Operations.getDeviceCode.Output + /// Downloads an artifact from the cache. + /// + /// This endpoint returns a signed URL that can be used to download an artifact from the cache. + /// + /// - Remark: HTTP `GET /api/cache`. + /// - Remark: Generated from `#/paths//api/cache/get(downloadCacheArtifact)`. + func downloadCacheArtifact(_ input: Operations.downloadCacheArtifact.Input) async throws + -> Operations.downloadCacheArtifact.Output + /// It checks if an artifact exists in the cache. + /// + /// This endpoint checks if an artifact exists in the cache. It returns a 404 status code if the artifact does not exist. + /// + /// - Remark: HTTP `GET /api/cache/exists`. + /// - Remark: Generated from `#/paths//api/cache/exists/get(cacheArtifactExists)`. + @available(*, deprecated) func cacheArtifactExists( + _ input: Operations.cacheArtifactExists.Input + ) async throws -> Operations.cacheArtifactExists.Output + /// It completes a multi-part upload. + /// + /// Given the upload ID and all the parts with their ETags, this endpoint completes the multipart upload. The cache will then be able to serve the artifact. + /// + /// - Remark: HTTP `POST /api/cache/multipart/complete`. + /// - Remark: Generated from `#/paths//api/cache/multipart/complete/post(completeCacheArtifactMultipartUpload)`. + func completeCacheArtifactMultipartUpload( + _ input: Operations.completeCacheArtifactMultipartUpload.Input + ) async throws -> Operations.completeCacheArtifactMultipartUpload.Output + /// It generates a signed URL for uploading a part. + /// + /// Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. + /// + /// - Remark: HTTP `POST /api/cache/multipart/generate-url`. + /// - Remark: Generated from `#/paths//api/cache/multipart/generate-url/post(generateCacheArtifactMultipartUploadURL)`. + func generateCacheArtifactMultipartUploadURL( + _ input: Operations.generateCacheArtifactMultipartUploadURL.Input + ) async throws -> Operations.generateCacheArtifactMultipartUploadURL.Output + /// It initiates a multipart upload in the cache. + /// + /// The endpoint returns an upload ID that can be used to generate URLs for the individual parts and complete the upload. + /// + /// - Remark: HTTP `POST /api/cache/multipart/start`. + /// - Remark: Generated from `#/paths//api/cache/multipart/start/post(startCacheArtifactMultipartUpload)`. + func startCacheArtifactMultipartUpload( + _ input: Operations.startCacheArtifactMultipartUpload.Input + ) async throws -> Operations.startCacheArtifactMultipartUpload.Output + /// Lists the organizations + /// + /// Returns all the organizations the authenticated subject is part of. + /// + /// - Remark: HTTP `GET /api/organizations`. + /// - Remark: Generated from `#/paths//api/organizations/get(listOrganizations)`. + func listOrganizations(_ input: Operations.listOrganizations.Input) async throws + -> Operations.listOrganizations.Output + /// Creates an organization + /// + /// Creates an organization with the given name. + /// + /// - Remark: HTTP `POST /api/organizations`. + /// - Remark: Generated from `#/paths//api/organizations/post(createOrganization)`. + func createOrganization(_ input: Operations.createOrganization.Input) async throws + -> Operations.createOrganization.Output + /// Shows an organization + /// + /// Returns the organization with the given identifier. + /// + /// - Remark: HTTP `GET /api/organizations/{organization_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/get(showOrganization)`. + func showOrganization(_ input: Operations.showOrganization.Input) async throws + -> Operations.showOrganization.Output + /// Updates an organization + /// + /// Updates an organization with given parameters. + /// + /// - Remark: HTTP `PATCH /api/organizations/{organization_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/patch(updateOrganization (2))`. + func updateOrganization__2_(_ input: Operations.updateOrganization__2_.Input) async throws + -> Operations.updateOrganization__2_.Output + /// Updates an organization + /// + /// Updates an organization with given parameters. + /// + /// - Remark: HTTP `PUT /api/organizations/{organization_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/put(updateOrganization)`. + func updateOrganization(_ input: Operations.updateOrganization.Input) async throws + -> Operations.updateOrganization.Output + /// Deletes an organization + /// + /// Deletes the organization with the given name. + /// + /// - Remark: HTTP `DELETE /api/organizations/{organization_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/delete(deleteOrganization)`. + func deleteOrganization(_ input: Operations.deleteOrganization.Input) async throws + -> Operations.deleteOrganization.Output + /// Creates an invitation + /// + /// Invites a user with a given email to a given organization. + /// + /// - Remark: HTTP `POST /api/organizations/{organization_name}/invitations`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/post(createInvitation)`. + func createInvitation(_ input: Operations.createInvitation.Input) async throws + -> Operations.createInvitation.Output + /// Cancels an invitation + /// + /// Cancels an invitation for a given invitee email and an organization. + /// + /// - Remark: HTTP `DELETE /api/organizations/{organization_name}/invitations`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/delete(cancelInvitation)`. + func cancelInvitation(_ input: Operations.cancelInvitation.Input) async throws + -> Operations.cancelInvitation.Output + /// Updates a member in an organization + /// + /// Updates a member in a given organization + /// + /// - Remark: HTTP `PUT /api/organizations/{organization_name}/members/{user_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/put(updateOrganizationMember)`. + func updateOrganizationMember(_ input: Operations.updateOrganizationMember.Input) async throws + -> Operations.updateOrganizationMember.Output + /// Removes a member from an organization + /// + /// Removes a member with a given username from a given organization + /// + /// - Remark: HTTP `DELETE /api/organizations/{organization_name}/members/{user_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/delete(removeOrganizationMember)`. + func removeOrganizationMember(_ input: Operations.removeOrganizationMember.Input) async throws + -> Operations.removeOrganizationMember.Output + /// List projects the authenticated user has access to. + /// + /// - Remark: HTTP `GET /api/projects`. + /// - Remark: Generated from `#/paths//api/projects/get(listProjects)`. + func listProjects(_ input: Operations.listProjects.Input) async throws + -> Operations.listProjects.Output + /// Create a new project. + /// + /// - Remark: HTTP `POST /api/projects`. + /// - Remark: Generated from `#/paths//api/projects/post(createProject)`. + func createProject(_ input: Operations.createProject.Input) async throws + -> Operations.createProject.Output + /// Returns a project based on the handle. + /// + /// - Remark: HTTP `GET /api/projects/{account_name}/{project_name}`. + /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/get(showProject)`. + func showProject(_ input: Operations.showProject.Input) async throws + -> Operations.showProject.Output + /// Cleans cache for a given project + /// + /// - Remark: HTTP `PUT /api/projects/{account_name}/{project_name}/cache/clean`. + /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/cache/clean/put(cleanCache)`. + func cleanCache(_ input: Operations.cleanCache.Input) async throws + -> Operations.cleanCache.Output + /// Deletes a project with a given id. + /// + /// - Remark: HTTP `DELETE /api/projects/{id}`. + /// - Remark: Generated from `#/paths//api/projects/{id}/delete(deleteProject)`. + func deleteProject(_ input: Operations.deleteProject.Input) async throws + -> Operations.deleteProject.Output +} +/// Server URLs defined in the OpenAPI document. +public enum Servers { + public static func server1() throws -> URL { + try URL(validatingOpenAPIServerURL: "http://localhost:8080") + } +} +/// Types generated from the components section of the OpenAPI document. +public enum Components { + /// Types generated from the `#/components/schemas` section of the OpenAPI document. + public enum Schemas { + /// - Remark: Generated from `#/components/schemas/AbsentCacheArtifact`. + public struct AbsentCacheArtifact: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/AbsentCacheArtifact/errorPayload`. + public struct errorPayloadPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/AbsentCacheArtifact/errorPayload/code`. + public var code: Swift.String? + /// - Remark: Generated from `#/components/schemas/AbsentCacheArtifact/errorPayload/message`. + public var message: Swift.String? + /// Creates a new `errorPayloadPayload`. + /// + /// - Parameters: + /// - code: + /// - message: + public init(code: Swift.String? = nil, message: Swift.String? = nil) { + self.code = code + self.message = message + } + public enum CodingKeys: String, CodingKey { + case code + case message + } + } + /// - Remark: Generated from `#/components/schemas/AbsentCacheArtifact/error`. + public typealias errorPayload = [Components.Schemas.AbsentCacheArtifact + .errorPayloadPayload] + /// - Remark: Generated from `#/components/schemas/AbsentCacheArtifact/error`. + public var error: Components.Schemas.AbsentCacheArtifact.errorPayload? + /// Creates a new `AbsentCacheArtifact`. + /// + /// - Parameters: + /// - error: + public init(error: Components.Schemas.AbsentCacheArtifact.errorPayload? = nil) { + self.error = error + } + public enum CodingKeys: String, CodingKey { case error } + } + /// Token to authenticate the user with. + /// + /// - Remark: Generated from `#/components/schemas/AuthenticationToken`. + public struct AuthenticationToken: Codable, Equatable, Hashable, Sendable { + /// User authentication token + /// + /// - Remark: Generated from `#/components/schemas/AuthenticationToken/token`. + public var token: Swift.String? + /// Creates a new `AuthenticationToken`. + /// + /// - Parameters: + /// - token: User authentication token + public init(token: Swift.String? = nil) { self.token = token } + public enum CodingKeys: String, CodingKey { case token } + } + /// The URL to download the artifact from the cache. + /// + /// - Remark: Generated from `#/components/schemas/CacheArtifactDownloadURL`. + public struct CacheArtifactDownloadURL: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/CacheArtifactDownloadURL/data`. + public struct dataPayload: Codable, Equatable, Hashable, Sendable { + /// The UNIX timestamp when the URL expires. + /// + /// - Remark: Generated from `#/components/schemas/CacheArtifactDownloadURL/data/expires_at`. + public var expires_at: Swift.Int + /// The URL to download the artifact from the cache. + /// + /// - Remark: Generated from `#/components/schemas/CacheArtifactDownloadURL/data/url`. + public var url: Swift.String + /// Creates a new `dataPayload`. + /// + /// - Parameters: + /// - expires_at: The UNIX timestamp when the URL expires. + /// - url: The URL to download the artifact from the cache. + public init(expires_at: Swift.Int, url: Swift.String) { + self.expires_at = expires_at + self.url = url + } + public enum CodingKeys: String, CodingKey { + case expires_at + case url + } + } + /// - Remark: Generated from `#/components/schemas/CacheArtifactDownloadURL/data`. + public var data: Components.Schemas.CacheArtifactDownloadURL.dataPayload + /// - Remark: Generated from `#/components/schemas/CacheArtifactDownloadURL/status`. + public var status: Swift.String + /// Creates a new `CacheArtifactDownloadURL`. + /// + /// - Parameters: + /// - data: + /// - status: + public init( + data: Components.Schemas.CacheArtifactDownloadURL.dataPayload, + status: Swift.String + ) { + self.data = data + self.status = status + } + public enum CodingKeys: String, CodingKey { + case data + case status + } + } + /// The artifact exists in the cache and can be downloaded + /// + /// - Remark: Generated from `#/components/schemas/CacheArtifactExistence`. + public struct CacheArtifactExistence: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/CacheArtifactExistence/data`. + public var data: OpenAPIRuntime.OpenAPIObjectContainer? + /// - Remark: Generated from `#/components/schemas/CacheArtifactExistence/status`. + public var status: Swift.String? + /// Creates a new `CacheArtifactExistence`. + /// + /// - Parameters: + /// - data: + /// - status: + public init( + data: OpenAPIRuntime.OpenAPIObjectContainer? = nil, + status: Swift.String? = nil + ) { + self.data = data + self.status = status + } + public enum CodingKeys: String, CodingKey { + case data + case status + } + } + /// This response confirms that the upload has been completed successfully. The cache will now be able to serve the artifact. + /// + /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadCompletion`. + public struct CacheArtifactMultipartUploadCompletion: Codable, Equatable, Hashable, Sendable + { + /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadCompletion/data`. + public var data: OpenAPIRuntime.OpenAPIObjectContainer? + /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadCompletion/status`. + public var status: Swift.String? + /// Creates a new `CacheArtifactMultipartUploadCompletion`. + /// + /// - Parameters: + /// - data: + /// - status: + public init( + data: OpenAPIRuntime.OpenAPIObjectContainer? = nil, + status: Swift.String? = nil + ) { + self.data = data + self.status = status + } + public enum CodingKeys: String, CodingKey { + case data + case status + } + } + /// The URL to upload a part has been generated. + /// + /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadURL`. + public struct CacheArtifactMultipartUploadURL: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadURL/data`. + public struct dataPayload: Codable, Equatable, Hashable, Sendable { + /// The URL to upload the part + /// + /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadURL/data/url`. + public var url: Swift.String + /// Creates a new `dataPayload`. + /// + /// - Parameters: + /// - url: The URL to upload the part + public init(url: Swift.String) { self.url = url } + public enum CodingKeys: String, CodingKey { case url } + } + /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadURL/data`. + public var data: Components.Schemas.CacheArtifactMultipartUploadURL.dataPayload + /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadURL/status`. + public var status: Swift.String + /// Creates a new `CacheArtifactMultipartUploadURL`. + /// + /// - Parameters: + /// - data: + /// - status: + public init( + data: Components.Schemas.CacheArtifactMultipartUploadURL.dataPayload, + status: Swift.String + ) { + self.data = data + self.status = status + } + public enum CodingKeys: String, CodingKey { + case data + case status + } + } + /// The upload has been initiated and a ID is returned to upload the various parts using multi-part uploads + /// + /// - Remark: Generated from `#/components/schemas/CacheArtifactUploadID`. + public struct CacheArtifactUploadID: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/CacheArtifactUploadID/data`. + public struct dataPayload: Codable, Equatable, Hashable, Sendable { + /// The upload ID + /// + /// - Remark: Generated from `#/components/schemas/CacheArtifactUploadID/data/upload_id`. + public var upload_id: Swift.String + /// Creates a new `dataPayload`. + /// + /// - Parameters: + /// - upload_id: The upload ID + public init(upload_id: Swift.String) { self.upload_id = upload_id } + public enum CodingKeys: String, CodingKey { case upload_id } + } + /// - Remark: Generated from `#/components/schemas/CacheArtifactUploadID/data`. + public var data: Components.Schemas.CacheArtifactUploadID.dataPayload + /// - Remark: Generated from `#/components/schemas/CacheArtifactUploadID/status`. + public var status: Swift.String + /// Creates a new `CacheArtifactUploadID`. + /// + /// - Parameters: + /// - data: + /// - status: + public init( + data: Components.Schemas.CacheArtifactUploadID.dataPayload, + status: Swift.String + ) { + self.data = data + self.status = status + } + public enum CodingKeys: String, CodingKey { + case data + case status + } + } + /// The category of the cache. + /// + /// - Remark: Generated from `#/components/schemas/CacheCategory`. + @frozen + public enum CacheCategory: RawRepresentable, Codable, Equatable, Hashable, Sendable, + _AutoLosslessStringConvertible, CaseIterable + { + case tests + case builds + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "tests": self = .tests + case "builds": self = .builds + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .tests: return "tests" + case .builds: return "builds" + } + } + public static var allCases: [CacheCategory] { [.tests, .builds] } + } + /// The schema for the command analytics event. + /// + /// - Remark: Generated from `#/components/schemas/CommandEvent`. + public struct CommandEvent: Codable, Equatable, Hashable, Sendable { + /// ID of the command event + /// + /// - Remark: Generated from `#/components/schemas/CommandEvent/id`. + public var id: Swift.Double + /// Name of the command + /// + /// - Remark: Generated from `#/components/schemas/CommandEvent/name`. + public var name: Swift.String + /// URL to the command event + /// + /// - Remark: Generated from `#/components/schemas/CommandEvent/url`. + public var url: Swift.String + /// Creates a new `CommandEvent`. + /// + /// - Parameters: + /// - id: ID of the command event + /// - name: Name of the command + /// - url: URL to the command event + public init(id: Swift.Double, name: Swift.String, url: Swift.String) { + self.id = id + self.name = name + self.url = url + } + public enum CodingKeys: String, CodingKey { + case id + case name + case url + } + } + /// - Remark: Generated from `#/components/schemas/Error`. + public struct _Error: Codable, Equatable, Hashable, Sendable { + /// The error message + /// + /// - Remark: Generated from `#/components/schemas/Error/message`. + public var message: Swift.String + /// Creates a new `_Error`. + /// + /// - Parameters: + /// - message: The error message + public init(message: Swift.String) { self.message = message } + public enum CodingKeys: String, CodingKey { case message } + } + /// - Remark: Generated from `#/components/schemas/Invitation`. + public struct Invitation: Codable, Equatable, Hashable, Sendable { + /// The invitation's unique identifier + /// + /// - Remark: Generated from `#/components/schemas/Invitation/id`. + public var id: Swift.Double + /// The email of the invitee + /// + /// - Remark: Generated from `#/components/schemas/Invitation/invitee_email`. + public var invitee_email: Swift.String + /// - Remark: Generated from `#/components/schemas/Invitation/inviter`. + public var inviter: Components.Schemas.User + /// The id of the organization the invitee is invited to + /// + /// - Remark: Generated from `#/components/schemas/Invitation/organization_id`. + public var organization_id: Swift.Double + /// The token to accept the invitation + /// + /// - Remark: Generated from `#/components/schemas/Invitation/token`. + public var token: Swift.String + /// Creates a new `Invitation`. + /// + /// - Parameters: + /// - id: The invitation's unique identifier + /// - invitee_email: The email of the invitee + /// - inviter: + /// - organization_id: The id of the organization the invitee is invited to + /// - token: The token to accept the invitation + public init( + id: Swift.Double, + invitee_email: Swift.String, + inviter: Components.Schemas.User, + organization_id: Swift.Double, + token: Swift.String + ) { + self.id = id + self.invitee_email = invitee_email + self.inviter = inviter + self.organization_id = organization_id + self.token = token + } + public enum CodingKeys: String, CodingKey { + case id + case invitee_email + case inviter + case organization_id + case token + } + } + /// An organization + /// + /// - Remark: Generated from `#/components/schemas/Organization`. + public struct Organization: Codable, Equatable, Hashable, Sendable { + /// The organization's unique identifier + /// + /// - Remark: Generated from `#/components/schemas/Organization/id`. + public var id: Swift.Double + /// A list of organization invitations + /// + /// - Remark: Generated from `#/components/schemas/Organization/invitations`. + public var invitations: [Components.Schemas.Invitation] + /// A list of organization members + /// + /// - Remark: Generated from `#/components/schemas/Organization/members`. + public var members: [Components.Schemas.OrganizationMember] + /// The organization's name + /// + /// - Remark: Generated from `#/components/schemas/Organization/name`. + public var name: Swift.String + /// The plan associated with the organization + /// + /// - Remark: Generated from `#/components/schemas/Organization/plan`. + @frozen + public enum planPayload: RawRepresentable, Codable, Equatable, Hashable, Sendable, + _AutoLosslessStringConvertible, CaseIterable + { + case team + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "team": self = .team + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .team: return "team" + } + } + public static var allCases: [planPayload] { [.team] } + } + /// The plan associated with the organization + /// + /// - Remark: Generated from `#/components/schemas/Organization/plan`. + public var plan: Components.Schemas.Organization.planPayload + /// The organization ID associated with the SSO provider + /// + /// - Remark: Generated from `#/components/schemas/Organization/sso_organization_id`. + public var sso_organization_id: Swift.String? + /// The SSO provider set up for the organization + /// + /// - Remark: Generated from `#/components/schemas/Organization/sso_provider`. + @frozen + public enum sso_providerPayload: RawRepresentable, Codable, Equatable, Hashable, + Sendable, _AutoLosslessStringConvertible, CaseIterable + { + case google + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "google": self = .google + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .google: return "google" + } + } + public static var allCases: [sso_providerPayload] { [.google] } + } + /// The SSO provider set up for the organization + /// + /// - Remark: Generated from `#/components/schemas/Organization/sso_provider`. + public var sso_provider: Components.Schemas.Organization.sso_providerPayload? + /// Creates a new `Organization`. + /// + /// - Parameters: + /// - id: The organization's unique identifier + /// - invitations: A list of organization invitations + /// - members: A list of organization members + /// - name: The organization's name + /// - plan: The plan associated with the organization + /// - sso_organization_id: The organization ID associated with the SSO provider + /// - sso_provider: The SSO provider set up for the organization + public init( + id: Swift.Double, + invitations: [Components.Schemas.Invitation], + members: [Components.Schemas.OrganizationMember], + name: Swift.String, + plan: Components.Schemas.Organization.planPayload, + sso_organization_id: Swift.String? = nil, + sso_provider: Components.Schemas.Organization.sso_providerPayload? = nil + ) { + self.id = id + self.invitations = invitations + self.members = members + self.name = name + self.plan = plan + self.sso_organization_id = sso_organization_id + self.sso_provider = sso_provider + } + public enum CodingKeys: String, CodingKey { + case id + case invitations + case members + case name + case plan + case sso_organization_id + case sso_provider + } + } + /// The list of organizations the authenticated subject is part of. + /// + /// - Remark: Generated from `#/components/schemas/OrganizationList`. + public struct OrganizationList: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/OrganizationList/organizations`. + public var organizations: [Components.Schemas.Organization] + /// Creates a new `OrganizationList`. + /// + /// - Parameters: + /// - organizations: + public init(organizations: [Components.Schemas.Organization]) { + self.organizations = organizations + } + public enum CodingKeys: String, CodingKey { case organizations } + } + /// An organization member + /// + /// - Remark: Generated from `#/components/schemas/OrganizationMember`. + public struct OrganizationMember: Codable, Equatable, Hashable, Sendable { + /// The organization member's email + /// + /// - Remark: Generated from `#/components/schemas/OrganizationMember/email`. + public var email: Swift.String + /// The organization member's unique identifier + /// + /// - Remark: Generated from `#/components/schemas/OrganizationMember/id`. + public var id: Swift.Double + /// The organization member's name + /// + /// - Remark: Generated from `#/components/schemas/OrganizationMember/name`. + public var name: Swift.String + /// The organization member's role + /// + /// - Remark: Generated from `#/components/schemas/OrganizationMember/role`. + @frozen + public enum rolePayload: RawRepresentable, Codable, Equatable, Hashable, Sendable, + _AutoLosslessStringConvertible, CaseIterable + { + case admin + case user + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "admin": self = .admin + case "user": self = .user + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .admin: return "admin" + case .user: return "user" + } + } + public static var allCases: [rolePayload] { [.admin, .user] } + } + /// The organization member's role + /// + /// - Remark: Generated from `#/components/schemas/OrganizationMember/role`. + public var role: Components.Schemas.OrganizationMember.rolePayload + /// Creates a new `OrganizationMember`. + /// + /// - Parameters: + /// - email: The organization member's email + /// - id: The organization member's unique identifier + /// - name: The organization member's name + /// - role: The organization member's role + public init( + email: Swift.String, + id: Swift.Double, + name: Swift.String, + role: Components.Schemas.OrganizationMember.rolePayload + ) { + self.email = email + self.id = id + self.name = name + self.role = role + } + public enum CodingKeys: String, CodingKey { + case email + case id + case name + case role + } + } + /// - Remark: Generated from `#/components/schemas/Project`. + public struct Project: Codable, Equatable, Hashable, Sendable { + /// The full name of the project (e.g. tuist/tuist) + /// + /// - Remark: Generated from `#/components/schemas/Project/full_name`. + public var full_name: Swift.String + /// ID of the project + /// + /// - Remark: Generated from `#/components/schemas/Project/id`. + public var id: Swift.Double + /// The token that should be used to authenticate the project. For CI only. + /// + /// - Remark: Generated from `#/components/schemas/Project/token`. + public var token: Swift.String + /// Creates a new `Project`. + /// + /// - Parameters: + /// - full_name: The full name of the project (e.g. tuist/tuist) + /// - id: ID of the project + /// - token: The token that should be used to authenticate the project. For CI only. + public init(full_name: Swift.String, id: Swift.Double, token: Swift.String) { + self.full_name = full_name + self.id = id + self.token = token + } + public enum CodingKeys: String, CodingKey { + case full_name + case id + case token + } + } + /// A user. + /// + /// - Remark: Generated from `#/components/schemas/User`. + public struct User: Codable, Equatable, Hashable, Sendable { + /// The user's email + /// + /// - Remark: Generated from `#/components/schemas/User/email`. + public var email: Swift.String + /// The user's unique identifier + /// + /// - Remark: Generated from `#/components/schemas/User/id`. + public var id: Swift.Double + /// The user's name + /// + /// - Remark: Generated from `#/components/schemas/User/name`. + public var name: Swift.String + /// Creates a new `User`. + /// + /// - Parameters: + /// - email: The user's email + /// - id: The user's unique identifier + /// - name: The user's name + public init(email: Swift.String, id: Swift.Double, name: Swift.String) { + self.email = email + self.id = id + self.name = name + } + public enum CodingKeys: String, CodingKey { + case email + case id + case name + } + } + } + /// Types generated from the `#/components/parameters` section of the OpenAPI document. + public enum Parameters {} + /// Types generated from the `#/components/requestBodies` section of the OpenAPI document. + public enum RequestBodies {} + /// Types generated from the `#/components/responses` section of the OpenAPI document. + public enum Responses {} + /// Types generated from the `#/components/headers` section of the OpenAPI document. + public enum Headers {} +} +/// API operations, with input and output types, generated from `#/paths` in the OpenAPI document. +public enum Operations { + /// Create a a new command analytics event + /// + /// - Remark: HTTP `POST /api/analytics`. + /// - Remark: Generated from `#/paths//api/analytics/post(createCommandEvent)`. + public enum createCommandEvent { + public static let id: String = "createCommandEvent" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + /// Creates a new `Path`. + public init() {} + } + public var path: Operations.createCommandEvent.Input.Path + public struct Query: Sendable, Equatable, Hashable { + public var project_id: Swift.String + /// Creates a new `Query`. + /// + /// - Parameters: + /// - project_id: + public init(project_id: Swift.String) { self.project_id = project_id } + } + public var query: Operations.createCommandEvent.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.createCommandEvent.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.createCommandEvent.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Command event params + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// The client id of the command. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/client_id`. + public var client_id: Swift.String + /// The arguments of the command. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/command_arguments`. + public var command_arguments: [Swift.String]? + /// The duration of the command. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/duration`. + public var duration: Swift.Double + /// The error message of the command. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/error_message`. + public var error_message: Swift.String? + /// Whether the command was run in a CI environment. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/is_ci`. + public var is_ci: Swift.Bool + /// The version of macOS that ran the command. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/macos_version`. + public var macos_version: Swift.String + /// The name of the command. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/name`. + public var name: Swift.String + /// Extra parameters. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/params`. + public struct paramsPayload: Codable, Equatable, Hashable, Sendable { + /// A list of cacheable targets. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/params/cacheable_targets`. + public var cacheable_targets: [Swift.String]? + /// A list of local cache target hits. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/params/local_cache_target_hits`. + public var local_cache_target_hits: [Swift.String]? + /// A list of local targets whose tests were skipped. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/params/local_test_target_hits`. + public var local_test_target_hits: [Swift.String]? + /// A list of remote cache target hits. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/params/remote_cache_target_hits`. + public var remote_cache_target_hits: [Swift.String]? + /// A list of remote targets whose tests were skipped. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/params/remote_test_target_hits`. + public var remote_test_target_hits: [Swift.String]? + /// The list of targets that were tested. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/params/test_targets`. + public var test_targets: [Swift.String]? + /// Creates a new `paramsPayload`. + /// + /// - Parameters: + /// - cacheable_targets: A list of cacheable targets. + /// - local_cache_target_hits: A list of local cache target hits. + /// - local_test_target_hits: A list of local targets whose tests were skipped. + /// - remote_cache_target_hits: A list of remote cache target hits. + /// - remote_test_target_hits: A list of remote targets whose tests were skipped. + /// - test_targets: The list of targets that were tested. + public init( + cacheable_targets: [Swift.String]? = nil, + local_cache_target_hits: [Swift.String]? = nil, + local_test_target_hits: [Swift.String]? = nil, + remote_cache_target_hits: [Swift.String]? = nil, + remote_test_target_hits: [Swift.String]? = nil, + test_targets: [Swift.String]? = nil + ) { + self.cacheable_targets = cacheable_targets + self.local_cache_target_hits = local_cache_target_hits + self.local_test_target_hits = local_test_target_hits + self.remote_cache_target_hits = remote_cache_target_hits + self.remote_test_target_hits = remote_test_target_hits + self.test_targets = test_targets + } + public enum CodingKeys: String, CodingKey { + case cacheable_targets + case local_cache_target_hits + case local_test_target_hits + case remote_cache_target_hits + case remote_test_target_hits + case test_targets + } + } + /// Extra parameters. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/params`. + public var params: + Operations.createCommandEvent.Input.Body.jsonPayload.paramsPayload? + /// The status of the command. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/status`. + @frozen + public enum statusPayload: RawRepresentable, Codable, Equatable, Hashable, + Sendable, _AutoLosslessStringConvertible, CaseIterable + { + case success + case failure + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "success": self = .success + case "failure": self = .failure + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .success: return "success" + case .failure: return "failure" + } + } + public static var allCases: [statusPayload] { [.success, .failure] } + } + /// The status of the command. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/status`. + public var status: + Operations.createCommandEvent.Input.Body.jsonPayload.statusPayload? + /// The subcommand of the command. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/subcommand`. + public var subcommand: Swift.String? + /// The version of Swift that ran the command. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/swift_version`. + public var swift_version: Swift.String + /// The version of Tuist that ran the command. + /// + /// - Remark: Generated from `#/paths/api/analytics/POST/json/tuist_version`. + public var tuist_version: Swift.String + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - client_id: The client id of the command. + /// - command_arguments: The arguments of the command. + /// - duration: The duration of the command. + /// - error_message: The error message of the command. + /// - is_ci: Whether the command was run in a CI environment. + /// - macos_version: The version of macOS that ran the command. + /// - name: The name of the command. + /// - params: Extra parameters. + /// - status: The status of the command. + /// - subcommand: The subcommand of the command. + /// - swift_version: The version of Swift that ran the command. + /// - tuist_version: The version of Tuist that ran the command. + public init( + client_id: Swift.String, + command_arguments: [Swift.String]? = nil, + duration: Swift.Double, + error_message: Swift.String? = nil, + is_ci: Swift.Bool, + macos_version: Swift.String, + name: Swift.String, + params: Operations.createCommandEvent.Input.Body.jsonPayload + .paramsPayload? = nil, + status: Operations.createCommandEvent.Input.Body.jsonPayload + .statusPayload? = nil, + subcommand: Swift.String? = nil, + swift_version: Swift.String, + tuist_version: Swift.String + ) { + self.client_id = client_id + self.command_arguments = command_arguments + self.duration = duration + self.error_message = error_message + self.is_ci = is_ci + self.macos_version = macos_version + self.name = name + self.params = params + self.status = status + self.subcommand = subcommand + self.swift_version = swift_version + self.tuist_version = tuist_version + } + public enum CodingKeys: String, CodingKey { + case client_id + case command_arguments + case duration + case error_message + case is_ci + case macos_version + case name + case params + case status + case subcommand + case swift_version + case tuist_version + } + } + case json(Operations.createCommandEvent.Input.Body.jsonPayload) + } + public var body: Operations.createCommandEvent.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.createCommandEvent.Input.Path = .init(), + query: Operations.createCommandEvent.Input.Query, + headers: Operations.createCommandEvent.Input.Headers = .init(), + cookies: Operations.createCommandEvent.Input.Cookies = .init(), + body: Operations.createCommandEvent.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createCommandEvent.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.CommandEvent) + } + /// Received HTTP response body + public var body: Operations.createCommandEvent.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createCommandEvent.Output.Ok.Headers = .init(), + body: Operations.createCommandEvent.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The command event was created + /// + /// - Remark: Generated from `#/paths//api/analytics/post(createCommandEvent)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.createCommandEvent.Output.Ok) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createCommandEvent.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createCommandEvent.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createCommandEvent.Output.Forbidden.Headers = .init(), + body: Operations.createCommandEvent.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// You don't have permission to create command events for the project. + /// + /// - Remark: Generated from `#/paths//api/analytics/post(createCommandEvent)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.createCommandEvent.Output.Forbidden) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Get a specific device code. + /// + /// This endpoint returns a token for a given device code if the device code is authenticated. + /// + /// - Remark: HTTP `GET /api/auth/device_code/{device_code}`. + /// - Remark: Generated from `#/paths//api/auth/device_code/{device_code}/get(getDeviceCode)`. + public enum getDeviceCode { + public static let id: String = "getDeviceCode" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var device_code: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - device_code: + public init(device_code: Swift.String) { self.device_code = device_code } + } + public var path: Operations.getDeviceCode.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.getDeviceCode.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.getDeviceCode.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.getDeviceCode.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.getDeviceCode.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.getDeviceCode.Input.Path, + query: Operations.getDeviceCode.Input.Query = .init(), + headers: Operations.getDeviceCode.Input.Headers = .init(), + cookies: Operations.getDeviceCode.Input.Cookies = .init(), + body: Operations.getDeviceCode.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.getDeviceCode.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Token to authenticate the user with. + /// + /// - Remark: Generated from `#/paths/api/auth/device_code/{device_code}/GET/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// User authentication token + /// + /// - Remark: Generated from `#/paths/api/auth/device_code/{device_code}/GET/json/token`. + public var token: Swift.String? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - token: User authentication token + public init(token: Swift.String? = nil) { self.token = token } + public enum CodingKeys: String, CodingKey { case token } + } + case json(Operations.getDeviceCode.Output.Ok.Body.jsonPayload) + } + /// Received HTTP response body + public var body: Operations.getDeviceCode.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.getDeviceCode.Output.Ok.Headers = .init(), + body: Operations.getDeviceCode.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The device code is authenticated + /// + /// - Remark: Generated from `#/paths//api/auth/device_code/{device_code}/get(getDeviceCode)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.getDeviceCode.Output.Ok) + public struct Accepted: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.getDeviceCode.Output.Accepted.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(OpenAPIRuntime.OpenAPIObjectContainer) + } + /// Received HTTP response body + public var body: Operations.getDeviceCode.Output.Accepted.Body + /// Creates a new `Accepted`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.getDeviceCode.Output.Accepted.Headers = .init(), + body: Operations.getDeviceCode.Output.Accepted.Body + ) { + self.headers = headers + self.body = body + } + } + /// The device code is not authenticated + /// + /// - Remark: Generated from `#/paths//api/auth/device_code/{device_code}/get(getDeviceCode)/responses/202`. + /// + /// HTTP response code: `202 accepted`. + case accepted(Operations.getDeviceCode.Output.Accepted) + public struct BadRequest: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.getDeviceCode.Output.BadRequest.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.getDeviceCode.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.getDeviceCode.Output.BadRequest.Headers = .init(), + body: Operations.getDeviceCode.Output.BadRequest.Body + ) { + self.headers = headers + self.body = body + } + } + /// The request was not accepted, e.g., when the device code is expired + /// + /// - Remark: Generated from `#/paths//api/auth/device_code/{device_code}/get(getDeviceCode)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.getDeviceCode.Output.BadRequest) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Downloads an artifact from the cache. + /// + /// This endpoint returns a signed URL that can be used to download an artifact from the cache. + /// + /// - Remark: HTTP `GET /api/cache`. + /// - Remark: Generated from `#/paths//api/cache/get(downloadCacheArtifact)`. + public enum downloadCacheArtifact { + public static let id: String = "downloadCacheArtifact" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + /// Creates a new `Path`. + public init() {} + } + public var path: Operations.downloadCacheArtifact.Input.Path + public struct Query: Sendable, Equatable, Hashable { + public var cache_category: Components.Schemas.CacheCategory? + public var project_id: Swift.String + public var hash: Swift.String + public var name: Swift.String + /// Creates a new `Query`. + /// + /// - Parameters: + /// - cache_category: + /// - project_id: + /// - hash: + /// - name: + public init( + cache_category: Components.Schemas.CacheCategory? = nil, + project_id: Swift.String, + hash: Swift.String, + name: Swift.String + ) { + self.cache_category = cache_category + self.project_id = project_id + self.hash = hash + self.name = name + } + } + public var query: Operations.downloadCacheArtifact.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.downloadCacheArtifact.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.downloadCacheArtifact.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.downloadCacheArtifact.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.downloadCacheArtifact.Input.Path = .init(), + query: Operations.downloadCacheArtifact.Input.Query, + headers: Operations.downloadCacheArtifact.Input.Headers = .init(), + cookies: Operations.downloadCacheArtifact.Input.Cookies = .init(), + body: Operations.downloadCacheArtifact.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.downloadCacheArtifact.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.CacheArtifactDownloadURL) + } + /// Received HTTP response body + public var body: Operations.downloadCacheArtifact.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.downloadCacheArtifact.Output.Ok.Headers = .init(), + body: Operations.downloadCacheArtifact.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The artifact exists and is downloadable + /// + /// - Remark: Generated from `#/paths//api/cache/get(downloadCacheArtifact)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.downloadCacheArtifact.Output.Ok) + public struct PaymentRequired: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.downloadCacheArtifact.Output.PaymentRequired.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.downloadCacheArtifact.Output.PaymentRequired.Body + /// Creates a new `PaymentRequired`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.downloadCacheArtifact.Output.PaymentRequired.Headers = + .init(), + body: Operations.downloadCacheArtifact.Output.PaymentRequired.Body + ) { + self.headers = headers + self.body = body + } + } + /// The account has an invalid plan + /// + /// - Remark: Generated from `#/paths//api/cache/get(downloadCacheArtifact)/responses/402`. + /// + /// HTTP response code: `402 paymentRequired`. + case paymentRequired(Operations.downloadCacheArtifact.Output.PaymentRequired) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.downloadCacheArtifact.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.downloadCacheArtifact.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.downloadCacheArtifact.Output.Forbidden.Headers = .init(), + body: Operations.downloadCacheArtifact.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/cache/get(downloadCacheArtifact)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.downloadCacheArtifact.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.downloadCacheArtifact.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.downloadCacheArtifact.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.downloadCacheArtifact.Output.NotFound.Headers = .init(), + body: Operations.downloadCacheArtifact.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project or the cache artifact doesn't exist + /// + /// - Remark: Generated from `#/paths//api/cache/get(downloadCacheArtifact)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.downloadCacheArtifact.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// It checks if an artifact exists in the cache. + /// + /// This endpoint checks if an artifact exists in the cache. It returns a 404 status code if the artifact does not exist. + /// + /// - Remark: HTTP `GET /api/cache/exists`. + /// - Remark: Generated from `#/paths//api/cache/exists/get(cacheArtifactExists)`. + public enum cacheArtifactExists { + public static let id: String = "cacheArtifactExists" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + /// Creates a new `Path`. + public init() {} + } + public var path: Operations.cacheArtifactExists.Input.Path + public struct Query: Sendable, Equatable, Hashable { + public var cache_category: Components.Schemas.CacheCategory? + public var project_id: Swift.String + public var hash: Swift.String + public var name: Swift.String + /// Creates a new `Query`. + /// + /// - Parameters: + /// - cache_category: + /// - project_id: + /// - hash: + /// - name: + public init( + cache_category: Components.Schemas.CacheCategory? = nil, + project_id: Swift.String, + hash: Swift.String, + name: Swift.String + ) { + self.cache_category = cache_category + self.project_id = project_id + self.hash = hash + self.name = name + } + } + public var query: Operations.cacheArtifactExists.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.cacheArtifactExists.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.cacheArtifactExists.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.cacheArtifactExists.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.cacheArtifactExists.Input.Path = .init(), + query: Operations.cacheArtifactExists.Input.Query, + headers: Operations.cacheArtifactExists.Input.Headers = .init(), + cookies: Operations.cacheArtifactExists.Input.Cookies = .init(), + body: Operations.cacheArtifactExists.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.cacheArtifactExists.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + /// The artifact exists in the cache and can be downloaded + /// + /// - Remark: Generated from `#/paths/api/cache/exists/GET/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/cache/exists/GET/json/data`. + public var data: OpenAPIRuntime.OpenAPIObjectContainer? + /// - Remark: Generated from `#/paths/api/cache/exists/GET/json/status`. + public var status: Swift.String? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - data: + /// - status: + public init( + data: OpenAPIRuntime.OpenAPIObjectContainer? = nil, + status: Swift.String? = nil + ) { + self.data = data + self.status = status + } + public enum CodingKeys: String, CodingKey { + case data + case status + } + } + case json(Operations.cacheArtifactExists.Output.Ok.Body.jsonPayload) + } + /// Received HTTP response body + public var body: Operations.cacheArtifactExists.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.cacheArtifactExists.Output.Ok.Headers = .init(), + body: Operations.cacheArtifactExists.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The artifact exists + /// + /// - Remark: Generated from `#/paths//api/cache/exists/get(cacheArtifactExists)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.cacheArtifactExists.Output.Ok) + public struct PaymentRequired: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.cacheArtifactExists.Output.PaymentRequired.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.cacheArtifactExists.Output.PaymentRequired.Body + /// Creates a new `PaymentRequired`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.cacheArtifactExists.Output.PaymentRequired.Headers = + .init(), + body: Operations.cacheArtifactExists.Output.PaymentRequired.Body + ) { + self.headers = headers + self.body = body + } + } + /// The account has an invalid plan + /// + /// - Remark: Generated from `#/paths//api/cache/exists/get(cacheArtifactExists)/responses/402`. + /// + /// HTTP response code: `402 paymentRequired`. + case paymentRequired(Operations.cacheArtifactExists.Output.PaymentRequired) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.cacheArtifactExists.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.cacheArtifactExists.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.cacheArtifactExists.Output.Forbidden.Headers = .init(), + body: Operations.cacheArtifactExists.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/cache/exists/get(cacheArtifactExists)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.cacheArtifactExists.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.cacheArtifactExists.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + /// - Remark: Generated from `#/paths/api/cache/exists/GET/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/cache/exists/GET/json/errorPayload`. + public struct errorPayloadPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/cache/exists/GET/json/errorPayload/code`. + public var code: Swift.String? + /// - Remark: Generated from `#/paths/api/cache/exists/GET/json/errorPayload/message`. + public var message: Swift.String? + /// Creates a new `errorPayloadPayload`. + /// + /// - Parameters: + /// - code: + /// - message: + public init(code: Swift.String? = nil, message: Swift.String? = nil) { + self.code = code + self.message = message + } + public enum CodingKeys: String, CodingKey { + case code + case message + } + } + /// - Remark: Generated from `#/paths/api/cache/exists/GET/json/error`. + public typealias errorPayload = [Operations.cacheArtifactExists.Output + .NotFound.Body.jsonPayload.errorPayloadPayload] + /// - Remark: Generated from `#/paths/api/cache/exists/GET/json/error`. + public var error: + Operations.cacheArtifactExists.Output.NotFound.Body.jsonPayload + .errorPayload? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - error: + public init( + error: Operations.cacheArtifactExists.Output.NotFound.Body.jsonPayload + .errorPayload? = nil + ) { self.error = error } + public enum CodingKeys: String, CodingKey { case error } + } + case json(Operations.cacheArtifactExists.Output.NotFound.Body.jsonPayload) + } + /// Received HTTP response body + public var body: Operations.cacheArtifactExists.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.cacheArtifactExists.Output.NotFound.Headers = .init(), + body: Operations.cacheArtifactExists.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The artifact doesn't exist + /// + /// - Remark: Generated from `#/paths//api/cache/exists/get(cacheArtifactExists)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.cacheArtifactExists.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// It completes a multi-part upload. + /// + /// Given the upload ID and all the parts with their ETags, this endpoint completes the multipart upload. The cache will then be able to serve the artifact. + /// + /// - Remark: HTTP `POST /api/cache/multipart/complete`. + /// - Remark: Generated from `#/paths//api/cache/multipart/complete/post(completeCacheArtifactMultipartUpload)`. + public enum completeCacheArtifactMultipartUpload { + public static let id: String = "completeCacheArtifactMultipartUpload" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + /// Creates a new `Path`. + public init() {} + } + public var path: Operations.completeCacheArtifactMultipartUpload.Input.Path + public struct Query: Sendable, Equatable, Hashable { + public var cache_category: Components.Schemas.CacheCategory? + public var project_id: Swift.String + public var hash: Swift.String + public var upload_id: Swift.String + public var name: Swift.String + /// Creates a new `Query`. + /// + /// - Parameters: + /// - cache_category: + /// - project_id: + /// - hash: + /// - upload_id: + /// - name: + public init( + cache_category: Components.Schemas.CacheCategory? = nil, + project_id: Swift.String, + hash: Swift.String, + upload_id: Swift.String, + name: Swift.String + ) { + self.cache_category = cache_category + self.project_id = project_id + self.hash = hash + self.upload_id = upload_id + self.name = name + } + } + public var query: Operations.completeCacheArtifactMultipartUpload.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.completeCacheArtifactMultipartUpload.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.completeCacheArtifactMultipartUpload.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Multi-part upload parts + /// + /// - Remark: Generated from `#/paths/api/cache/multipart/complete/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/cache/multipart/complete/POST/json/partsPayload`. + public struct partsPayloadPayload: Codable, Equatable, Hashable, Sendable { + /// The ETag of the part + /// + /// - Remark: Generated from `#/paths/api/cache/multipart/complete/POST/json/partsPayload/etag`. + public var etag: Swift.String? + /// The part number + /// + /// - Remark: Generated from `#/paths/api/cache/multipart/complete/POST/json/partsPayload/part_number`. + public var part_number: Swift.Int? + /// Creates a new `partsPayloadPayload`. + /// + /// - Parameters: + /// - etag: The ETag of the part + /// - part_number: The part number + public init(etag: Swift.String? = nil, part_number: Swift.Int? = nil) { + self.etag = etag + self.part_number = part_number + } + public enum CodingKeys: String, CodingKey { + case etag + case part_number + } + } + /// - Remark: Generated from `#/paths/api/cache/multipart/complete/POST/json/parts`. + public typealias partsPayload = [Operations.completeCacheArtifactMultipartUpload + .Input.Body.jsonPayload.partsPayloadPayload] + /// - Remark: Generated from `#/paths/api/cache/multipart/complete/POST/json/parts`. + public var parts: + Operations.completeCacheArtifactMultipartUpload.Input.Body.jsonPayload + .partsPayload? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - parts: + public init( + parts: Operations.completeCacheArtifactMultipartUpload.Input.Body + .jsonPayload.partsPayload? = nil + ) { self.parts = parts } + public enum CodingKeys: String, CodingKey { case parts } + } + case json(Operations.completeCacheArtifactMultipartUpload.Input.Body.jsonPayload) + } + public var body: Operations.completeCacheArtifactMultipartUpload.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.completeCacheArtifactMultipartUpload.Input.Path = .init(), + query: Operations.completeCacheArtifactMultipartUpload.Input.Query, + headers: Operations.completeCacheArtifactMultipartUpload.Input.Headers = .init(), + cookies: Operations.completeCacheArtifactMultipartUpload.Input.Cookies = .init(), + body: Operations.completeCacheArtifactMultipartUpload.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.completeCacheArtifactMultipartUpload.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + /// This response confirms that the upload has been completed successfully. The cache will now be able to serve the artifact. + /// + /// - Remark: Generated from `#/paths/api/cache/multipart/complete/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/cache/multipart/complete/POST/json/data`. + public var data: OpenAPIRuntime.OpenAPIObjectContainer? + /// - Remark: Generated from `#/paths/api/cache/multipart/complete/POST/json/status`. + public var status: Swift.String? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - data: + /// - status: + public init( + data: OpenAPIRuntime.OpenAPIObjectContainer? = nil, + status: Swift.String? = nil + ) { + self.data = data + self.status = status + } + public enum CodingKeys: String, CodingKey { + case data + case status + } + } + case json( + Operations.completeCacheArtifactMultipartUpload.Output.Ok.Body.jsonPayload + ) + } + /// Received HTTP response body + public var body: Operations.completeCacheArtifactMultipartUpload.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.completeCacheArtifactMultipartUpload.Output.Ok.Headers = + .init(), + body: Operations.completeCacheArtifactMultipartUpload.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The upload has been completed + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/complete/post(completeCacheArtifactMultipartUpload)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.completeCacheArtifactMultipartUpload.Output.Ok) + public struct PaymentRequired: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.completeCacheArtifactMultipartUpload.Output.PaymentRequired.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.completeCacheArtifactMultipartUpload.Output.PaymentRequired.Body + /// Creates a new `PaymentRequired`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.completeCacheArtifactMultipartUpload.Output.PaymentRequired + .Headers = .init(), + body: Operations.completeCacheArtifactMultipartUpload.Output.PaymentRequired + .Body + ) { + self.headers = headers + self.body = body + } + } + /// The account has an invalid plan + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/complete/post(completeCacheArtifactMultipartUpload)/responses/402`. + /// + /// HTTP response code: `402 paymentRequired`. + case paymentRequired( + Operations.completeCacheArtifactMultipartUpload.Output.PaymentRequired + ) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.completeCacheArtifactMultipartUpload.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.completeCacheArtifactMultipartUpload.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.completeCacheArtifactMultipartUpload.Output.Forbidden + .Headers = .init(), + body: Operations.completeCacheArtifactMultipartUpload.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/complete/post(completeCacheArtifactMultipartUpload)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.completeCacheArtifactMultipartUpload.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.completeCacheArtifactMultipartUpload.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.completeCacheArtifactMultipartUpload.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.completeCacheArtifactMultipartUpload.Output.NotFound + .Headers = .init(), + body: Operations.completeCacheArtifactMultipartUpload.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project doesn't exist + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/complete/post(completeCacheArtifactMultipartUpload)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.completeCacheArtifactMultipartUpload.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// It generates a signed URL for uploading a part. + /// + /// Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. + /// + /// - Remark: HTTP `POST /api/cache/multipart/generate-url`. + /// - Remark: Generated from `#/paths//api/cache/multipart/generate-url/post(generateCacheArtifactMultipartUploadURL)`. + public enum generateCacheArtifactMultipartUploadURL { + public static let id: String = "generateCacheArtifactMultipartUploadURL" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + /// Creates a new `Path`. + public init() {} + } + public var path: Operations.generateCacheArtifactMultipartUploadURL.Input.Path + public struct Query: Sendable, Equatable, Hashable { + public var cache_category: Components.Schemas.CacheCategory? + public var project_id: Swift.String + public var hash: Swift.String + public var part_number: Swift.Int + public var upload_id: Swift.String + public var name: Swift.String + /// Creates a new `Query`. + /// + /// - Parameters: + /// - cache_category: + /// - project_id: + /// - hash: + /// - part_number: + /// - upload_id: + /// - name: + public init( + cache_category: Components.Schemas.CacheCategory? = nil, + project_id: Swift.String, + hash: Swift.String, + part_number: Swift.Int, + upload_id: Swift.String, + name: Swift.String + ) { + self.cache_category = cache_category + self.project_id = project_id + self.hash = hash + self.part_number = part_number + self.upload_id = upload_id + self.name = name + } + } + public var query: Operations.generateCacheArtifactMultipartUploadURL.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.generateCacheArtifactMultipartUploadURL.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.generateCacheArtifactMultipartUploadURL.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.generateCacheArtifactMultipartUploadURL.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.generateCacheArtifactMultipartUploadURL.Input.Path = .init(), + query: Operations.generateCacheArtifactMultipartUploadURL.Input.Query, + headers: Operations.generateCacheArtifactMultipartUploadURL.Input.Headers = .init(), + cookies: Operations.generateCacheArtifactMultipartUploadURL.Input.Cookies = .init(), + body: Operations.generateCacheArtifactMultipartUploadURL.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + /// The URL to upload a part has been generated. + /// + /// - Remark: Generated from `#/paths/api/cache/multipart/generate-url/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/cache/multipart/generate-url/POST/json/data`. + public struct dataPayload: Codable, Equatable, Hashable, Sendable { + /// The URL to upload the part + /// + /// - Remark: Generated from `#/paths/api/cache/multipart/generate-url/POST/json/data/url`. + public var url: Swift.String + /// Creates a new `dataPayload`. + /// + /// - Parameters: + /// - url: The URL to upload the part + public init(url: Swift.String) { self.url = url } + public enum CodingKeys: String, CodingKey { case url } + } + /// - Remark: Generated from `#/paths/api/cache/multipart/generate-url/POST/json/data`. + public var data: + Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Body + .jsonPayload.dataPayload + /// - Remark: Generated from `#/paths/api/cache/multipart/generate-url/POST/json/status`. + public var status: Swift.String + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - data: + /// - status: + public init( + data: Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Body + .jsonPayload.dataPayload, + status: Swift.String + ) { + self.data = data + self.status = status + } + public enum CodingKeys: String, CodingKey { + case data + case status + } + } + case json( + Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Body + .jsonPayload + ) + } + /// Received HTTP response body + public var body: Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Headers = + .init(), + body: Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The URL has been generated + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/generate-url/post(generateCacheArtifactMultipartUploadURL)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.generateCacheArtifactMultipartUploadURL.Output.Ok) + public struct PaymentRequired: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.generateCacheArtifactMultipartUploadURL.Output.PaymentRequired + .Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.generateCacheArtifactMultipartUploadURL.Output.PaymentRequired.Body + /// Creates a new `PaymentRequired`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.generateCacheArtifactMultipartUploadURL.Output + .PaymentRequired.Headers = .init(), + body: Operations.generateCacheArtifactMultipartUploadURL.Output.PaymentRequired + .Body + ) { + self.headers = headers + self.body = body + } + } + /// The account has an invalid plan + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/generate-url/post(generateCacheArtifactMultipartUploadURL)/responses/402`. + /// + /// HTTP response code: `402 paymentRequired`. + case paymentRequired( + Operations.generateCacheArtifactMultipartUploadURL.Output.PaymentRequired + ) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.generateCacheArtifactMultipartUploadURL.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.generateCacheArtifactMultipartUploadURL.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.generateCacheArtifactMultipartUploadURL.Output.Forbidden + .Headers = .init(), + body: Operations.generateCacheArtifactMultipartUploadURL.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/generate-url/post(generateCacheArtifactMultipartUploadURL)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.generateCacheArtifactMultipartUploadURL.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.generateCacheArtifactMultipartUploadURL.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.generateCacheArtifactMultipartUploadURL.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.generateCacheArtifactMultipartUploadURL.Output.NotFound + .Headers = .init(), + body: Operations.generateCacheArtifactMultipartUploadURL.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project doesn't exist + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/generate-url/post(generateCacheArtifactMultipartUploadURL)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.generateCacheArtifactMultipartUploadURL.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// It initiates a multipart upload in the cache. + /// + /// The endpoint returns an upload ID that can be used to generate URLs for the individual parts and complete the upload. + /// + /// - Remark: HTTP `POST /api/cache/multipart/start`. + /// - Remark: Generated from `#/paths//api/cache/multipart/start/post(startCacheArtifactMultipartUpload)`. + public enum startCacheArtifactMultipartUpload { + public static let id: String = "startCacheArtifactMultipartUpload" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + /// Creates a new `Path`. + public init() {} + } + public var path: Operations.startCacheArtifactMultipartUpload.Input.Path + public struct Query: Sendable, Equatable, Hashable { + public var cache_category: Components.Schemas.CacheCategory? + public var project_id: Swift.String + public var hash: Swift.String + public var name: Swift.String + /// Creates a new `Query`. + /// + /// - Parameters: + /// - cache_category: + /// - project_id: + /// - hash: + /// - name: + public init( + cache_category: Components.Schemas.CacheCategory? = nil, + project_id: Swift.String, + hash: Swift.String, + name: Swift.String + ) { + self.cache_category = cache_category + self.project_id = project_id + self.hash = hash + self.name = name + } + } + public var query: Operations.startCacheArtifactMultipartUpload.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.startCacheArtifactMultipartUpload.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.startCacheArtifactMultipartUpload.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.startCacheArtifactMultipartUpload.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.startCacheArtifactMultipartUpload.Input.Path = .init(), + query: Operations.startCacheArtifactMultipartUpload.Input.Query, + headers: Operations.startCacheArtifactMultipartUpload.Input.Headers = .init(), + cookies: Operations.startCacheArtifactMultipartUpload.Input.Cookies = .init(), + body: Operations.startCacheArtifactMultipartUpload.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.startCacheArtifactMultipartUpload.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + /// The upload has been initiated and a ID is returned to upload the various parts using multi-part uploads + /// + /// - Remark: Generated from `#/paths/api/cache/multipart/start/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/cache/multipart/start/POST/json/data`. + public struct dataPayload: Codable, Equatable, Hashable, Sendable { + /// The upload ID + /// + /// - Remark: Generated from `#/paths/api/cache/multipart/start/POST/json/data/upload_id`. + public var upload_id: Swift.String + /// Creates a new `dataPayload`. + /// + /// - Parameters: + /// - upload_id: The upload ID + public init(upload_id: Swift.String) { self.upload_id = upload_id } + public enum CodingKeys: String, CodingKey { case upload_id } + } + /// - Remark: Generated from `#/paths/api/cache/multipart/start/POST/json/data`. + public var data: + Operations.startCacheArtifactMultipartUpload.Output.Ok.Body.jsonPayload + .dataPayload + /// - Remark: Generated from `#/paths/api/cache/multipart/start/POST/json/status`. + public var status: Swift.String + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - data: + /// - status: + public init( + data: Operations.startCacheArtifactMultipartUpload.Output.Ok.Body + .jsonPayload.dataPayload, + status: Swift.String + ) { + self.data = data + self.status = status + } + public enum CodingKeys: String, CodingKey { + case data + case status + } + } + case json( + Operations.startCacheArtifactMultipartUpload.Output.Ok.Body.jsonPayload + ) + } + /// Received HTTP response body + public var body: Operations.startCacheArtifactMultipartUpload.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.startCacheArtifactMultipartUpload.Output.Ok.Headers = + .init(), + body: Operations.startCacheArtifactMultipartUpload.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The upload has been started + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/start/post(startCacheArtifactMultipartUpload)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.startCacheArtifactMultipartUpload.Output.Ok) + public struct PaymentRequired: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.startCacheArtifactMultipartUpload.Output.PaymentRequired.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.startCacheArtifactMultipartUpload.Output.PaymentRequired.Body + /// Creates a new `PaymentRequired`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.startCacheArtifactMultipartUpload.Output.PaymentRequired + .Headers = .init(), + body: Operations.startCacheArtifactMultipartUpload.Output.PaymentRequired.Body + ) { + self.headers = headers + self.body = body + } + } + /// The account has an invalid plan + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/start/post(startCacheArtifactMultipartUpload)/responses/402`. + /// + /// HTTP response code: `402 paymentRequired`. + case paymentRequired( + Operations.startCacheArtifactMultipartUpload.Output.PaymentRequired + ) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.startCacheArtifactMultipartUpload.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.startCacheArtifactMultipartUpload.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.startCacheArtifactMultipartUpload.Output.Forbidden.Headers = + .init(), + body: Operations.startCacheArtifactMultipartUpload.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/start/post(startCacheArtifactMultipartUpload)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.startCacheArtifactMultipartUpload.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.startCacheArtifactMultipartUpload.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.startCacheArtifactMultipartUpload.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.startCacheArtifactMultipartUpload.Output.NotFound.Headers = + .init(), + body: Operations.startCacheArtifactMultipartUpload.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project doesn't exist + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/start/post(startCacheArtifactMultipartUpload)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.startCacheArtifactMultipartUpload.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Lists the organizations + /// + /// Returns all the organizations the authenticated subject is part of. + /// + /// - Remark: HTTP `GET /api/organizations`. + /// - Remark: Generated from `#/paths//api/organizations/get(listOrganizations)`. + public enum listOrganizations { + public static let id: String = "listOrganizations" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + /// Creates a new `Path`. + public init() {} + } + public var path: Operations.listOrganizations.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.listOrganizations.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.listOrganizations.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.listOrganizations.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.listOrganizations.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.listOrganizations.Input.Path = .init(), + query: Operations.listOrganizations.Input.Query = .init(), + headers: Operations.listOrganizations.Input.Headers = .init(), + cookies: Operations.listOrganizations.Input.Cookies = .init(), + body: Operations.listOrganizations.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.listOrganizations.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + /// The list of organizations the authenticated subject is part of. + /// + /// - Remark: Generated from `#/paths/api/organizations/GET/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/organizations/GET/json/organizations`. + public var organizations: [Components.Schemas.Organization] + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - organizations: + public init(organizations: [Components.Schemas.Organization]) { + self.organizations = organizations + } + public enum CodingKeys: String, CodingKey { case organizations } + } + case json(Operations.listOrganizations.Output.Ok.Body.jsonPayload) + } + /// Received HTTP response body + public var body: Operations.listOrganizations.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.listOrganizations.Output.Ok.Headers = .init(), + body: Operations.listOrganizations.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of organizations + /// + /// - Remark: Generated from `#/paths//api/organizations/get(listOrganizations)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.listOrganizations.Output.Ok) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.listOrganizations.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.listOrganizations.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.listOrganizations.Output.Forbidden.Headers = .init(), + body: Operations.listOrganizations.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/organizations/get(listOrganizations)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.listOrganizations.Output.Forbidden) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Creates an organization + /// + /// Creates an organization with the given name. + /// + /// - Remark: HTTP `POST /api/organizations`. + /// - Remark: Generated from `#/paths//api/organizations/post(createOrganization)`. + public enum createOrganization { + public static let id: String = "createOrganization" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + /// Creates a new `Path`. + public init() {} + } + public var path: Operations.createOrganization.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.createOrganization.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.createOrganization.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.createOrganization.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Organization params + /// + /// - Remark: Generated from `#/paths/api/organizations/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// The name of the organization that should be created. + /// + /// - Remark: Generated from `#/paths/api/organizations/POST/json/name`. + public var name: Swift.String + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - name: The name of the organization that should be created. + public init(name: Swift.String) { self.name = name } + public enum CodingKeys: String, CodingKey { case name } + } + case json(Operations.createOrganization.Input.Body.jsonPayload) + } + public var body: Operations.createOrganization.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.createOrganization.Input.Path = .init(), + query: Operations.createOrganization.Input.Query = .init(), + headers: Operations.createOrganization.Input.Headers = .init(), + cookies: Operations.createOrganization.Input.Cookies = .init(), + body: Operations.createOrganization.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createOrganization.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.Organization) + } + /// Received HTTP response body + public var body: Operations.createOrganization.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createOrganization.Output.Ok.Headers = .init(), + body: Operations.createOrganization.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization was created + /// + /// - Remark: Generated from `#/paths//api/organizations/post(createOrganization)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.createOrganization.Output.Ok) + public struct BadRequest: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createOrganization.Output.BadRequest.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createOrganization.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createOrganization.Output.BadRequest.Headers = .init(), + body: Operations.createOrganization.Output.BadRequest.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization could not be created due to a validation error + /// + /// - Remark: Generated from `#/paths//api/organizations/post(createOrganization)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.createOrganization.Output.BadRequest) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Shows an organization + /// + /// Returns the organization with the given identifier. + /// + /// - Remark: HTTP `GET /api/organizations/{organization_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/get(showOrganization)`. + public enum showOrganization { + public static let id: String = "showOrganization" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var organization_name: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - organization_name: + public init(organization_name: Swift.String) { + self.organization_name = organization_name + } + } + public var path: Operations.showOrganization.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.showOrganization.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.showOrganization.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.showOrganization.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.showOrganization.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.showOrganization.Input.Path, + query: Operations.showOrganization.Input.Query = .init(), + headers: Operations.showOrganization.Input.Headers = .init(), + cookies: Operations.showOrganization.Input.Cookies = .init(), + body: Operations.showOrganization.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.showOrganization.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.Organization) + } + /// Received HTTP response body + public var body: Operations.showOrganization.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.showOrganization.Output.Ok.Headers = .init(), + body: Operations.showOrganization.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/get(showOrganization)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.showOrganization.Output.Ok) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.showOrganization.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.showOrganization.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.showOrganization.Output.Forbidden.Headers = .init(), + body: Operations.showOrganization.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/get(showOrganization)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.showOrganization.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.showOrganization.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.showOrganization.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.showOrganization.Output.NotFound.Headers = .init(), + body: Operations.showOrganization.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization with the given name was not found + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/get(showOrganization)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.showOrganization.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Updates an organization + /// + /// Updates an organization with given parameters. + /// + /// - Remark: HTTP `PATCH /api/organizations/{organization_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/patch(updateOrganization (2))`. + public enum updateOrganization__2_ { + public static let id: String = "updateOrganization (2)" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var organization_name: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - organization_name: + public init(organization_name: Swift.String) { + self.organization_name = organization_name + } + } + public var path: Operations.updateOrganization__2_.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.updateOrganization__2_.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.updateOrganization__2_.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.updateOrganization__2_.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Organization update params + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/PATCH/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// The SSO organization ID to be associated with the SSO provider + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/PATCH/json/sso_organization_id`. + public var sso_organization_id: Swift.String? + /// The SSO provider to set up for the organization + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/PATCH/json/sso_provider`. + @frozen + public enum sso_providerPayload: RawRepresentable, Codable, Equatable, Hashable, + Sendable, _AutoLosslessStringConvertible, CaseIterable + { + case google + case none + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "google": self = .google + case "none": self = .none + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .google: return "google" + case .none: return "none" + } + } + public static var allCases: [sso_providerPayload] { [.google, .none] } + } + /// The SSO provider to set up for the organization + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/PATCH/json/sso_provider`. + public var sso_provider: + Operations.updateOrganization__2_.Input.Body.jsonPayload + .sso_providerPayload? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - sso_organization_id: The SSO organization ID to be associated with the SSO provider + /// - sso_provider: The SSO provider to set up for the organization + public init( + sso_organization_id: Swift.String? = nil, + sso_provider: Operations.updateOrganization__2_.Input.Body.jsonPayload + .sso_providerPayload? = nil + ) { + self.sso_organization_id = sso_organization_id + self.sso_provider = sso_provider + } + public enum CodingKeys: String, CodingKey { + case sso_organization_id + case sso_provider + } + } + case json(Operations.updateOrganization__2_.Input.Body.jsonPayload) + } + public var body: Operations.updateOrganization__2_.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.updateOrganization__2_.Input.Path, + query: Operations.updateOrganization__2_.Input.Query = .init(), + headers: Operations.updateOrganization__2_.Input.Headers = .init(), + cookies: Operations.updateOrganization__2_.Input.Cookies = .init(), + body: Operations.updateOrganization__2_.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganization__2_.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.Organization) + } + /// Received HTTP response body + public var body: Operations.updateOrganization__2_.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganization__2_.Output.Ok.Headers = .init(), + body: Operations.updateOrganization__2_.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/patch(updateOrganization (2))/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.updateOrganization__2_.Output.Ok) + public struct BadRequest: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganization__2_.Output.BadRequest.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateOrganization__2_.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganization__2_.Output.BadRequest.Headers = .init(), + body: Operations.updateOrganization__2_.Output.BadRequest.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization could not be updated due to a validation error + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/patch(updateOrganization (2))/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.updateOrganization__2_.Output.BadRequest) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganization__2_.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateOrganization__2_.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganization__2_.Output.Forbidden.Headers = .init(), + body: Operations.updateOrganization__2_.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/patch(updateOrganization (2))/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.updateOrganization__2_.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganization__2_.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateOrganization__2_.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganization__2_.Output.NotFound.Headers = .init(), + body: Operations.updateOrganization__2_.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization with the given name was not found + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/patch(updateOrganization (2))/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.updateOrganization__2_.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Updates an organization + /// + /// Updates an organization with given parameters. + /// + /// - Remark: HTTP `PUT /api/organizations/{organization_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/put(updateOrganization)`. + public enum updateOrganization { + public static let id: String = "updateOrganization" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var organization_name: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - organization_name: + public init(organization_name: Swift.String) { + self.organization_name = organization_name + } + } + public var path: Operations.updateOrganization.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.updateOrganization.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.updateOrganization.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.updateOrganization.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Organization update params + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/PUT/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// The SSO organization ID to be associated with the SSO provider + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/PUT/json/sso_organization_id`. + public var sso_organization_id: Swift.String? + /// The SSO provider to set up for the organization + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/PUT/json/sso_provider`. + @frozen + public enum sso_providerPayload: RawRepresentable, Codable, Equatable, Hashable, + Sendable, _AutoLosslessStringConvertible, CaseIterable + { + case google + case none + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "google": self = .google + case "none": self = .none + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .google: return "google" + case .none: return "none" + } + } + public static var allCases: [sso_providerPayload] { [.google, .none] } + } + /// The SSO provider to set up for the organization + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/PUT/json/sso_provider`. + public var sso_provider: + Operations.updateOrganization.Input.Body.jsonPayload.sso_providerPayload? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - sso_organization_id: The SSO organization ID to be associated with the SSO provider + /// - sso_provider: The SSO provider to set up for the organization + public init( + sso_organization_id: Swift.String? = nil, + sso_provider: Operations.updateOrganization.Input.Body.jsonPayload + .sso_providerPayload? = nil + ) { + self.sso_organization_id = sso_organization_id + self.sso_provider = sso_provider + } + public enum CodingKeys: String, CodingKey { + case sso_organization_id + case sso_provider + } + } + case json(Operations.updateOrganization.Input.Body.jsonPayload) + } + public var body: Operations.updateOrganization.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.updateOrganization.Input.Path, + query: Operations.updateOrganization.Input.Query = .init(), + headers: Operations.updateOrganization.Input.Headers = .init(), + cookies: Operations.updateOrganization.Input.Cookies = .init(), + body: Operations.updateOrganization.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganization.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.Organization) + } + /// Received HTTP response body + public var body: Operations.updateOrganization.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganization.Output.Ok.Headers = .init(), + body: Operations.updateOrganization.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/put(updateOrganization)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.updateOrganization.Output.Ok) + public struct BadRequest: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganization.Output.BadRequest.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateOrganization.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganization.Output.BadRequest.Headers = .init(), + body: Operations.updateOrganization.Output.BadRequest.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization could not be updated due to a validation error + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/put(updateOrganization)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.updateOrganization.Output.BadRequest) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganization.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateOrganization.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganization.Output.Forbidden.Headers = .init(), + body: Operations.updateOrganization.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/put(updateOrganization)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.updateOrganization.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganization.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateOrganization.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganization.Output.NotFound.Headers = .init(), + body: Operations.updateOrganization.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization with the given name was not found + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/put(updateOrganization)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.updateOrganization.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Deletes an organization + /// + /// Deletes the organization with the given name. + /// + /// - Remark: HTTP `DELETE /api/organizations/{organization_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/delete(deleteOrganization)`. + public enum deleteOrganization { + public static let id: String = "deleteOrganization" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var organization_name: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - organization_name: + public init(organization_name: Swift.String) { + self.organization_name = organization_name + } + } + public var path: Operations.deleteOrganization.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.deleteOrganization.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.deleteOrganization.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.deleteOrganization.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.deleteOrganization.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.deleteOrganization.Input.Path, + query: Operations.deleteOrganization.Input.Query = .init(), + headers: Operations.deleteOrganization.Input.Headers = .init(), + cookies: Operations.deleteOrganization.Input.Cookies = .init(), + body: Operations.deleteOrganization.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct NoContent: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.deleteOrganization.Output.NoContent.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(OpenAPIRuntime.OpenAPIValueContainer) + } + /// Received HTTP response body + public var body: Operations.deleteOrganization.Output.NoContent.Body + /// Creates a new `NoContent`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.deleteOrganization.Output.NoContent.Headers = .init(), + body: Operations.deleteOrganization.Output.NoContent.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization was deleted + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/delete(deleteOrganization)/responses/204`. + /// + /// HTTP response code: `204 noContent`. + case noContent(Operations.deleteOrganization.Output.NoContent) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.deleteOrganization.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.deleteOrganization.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.deleteOrganization.Output.Forbidden.Headers = .init(), + body: Operations.deleteOrganization.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/delete(deleteOrganization)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.deleteOrganization.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.deleteOrganization.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.deleteOrganization.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.deleteOrganization.Output.NotFound.Headers = .init(), + body: Operations.deleteOrganization.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization with the given name was not found + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/delete(deleteOrganization)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.deleteOrganization.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Creates an invitation + /// + /// Invites a user with a given email to a given organization. + /// + /// - Remark: HTTP `POST /api/organizations/{organization_name}/invitations`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/post(createInvitation)`. + public enum createInvitation { + public static let id: String = "createInvitation" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var organization_name: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - organization_name: + public init(organization_name: Swift.String) { + self.organization_name = organization_name + } + } + public var path: Operations.createInvitation.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.createInvitation.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.createInvitation.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.createInvitation.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Invitation params + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/invitations/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// The email of the invitee. + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/invitations/POST/json/invitee_email`. + public var invitee_email: Swift.String + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - invitee_email: The email of the invitee. + public init(invitee_email: Swift.String) { self.invitee_email = invitee_email } + public enum CodingKeys: String, CodingKey { case invitee_email } + } + case json(Operations.createInvitation.Input.Body.jsonPayload) + } + public var body: Operations.createInvitation.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.createInvitation.Input.Path, + query: Operations.createInvitation.Input.Query = .init(), + headers: Operations.createInvitation.Input.Headers = .init(), + cookies: Operations.createInvitation.Input.Cookies = .init(), + body: Operations.createInvitation.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createInvitation.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.Invitation) + } + /// Received HTTP response body + public var body: Operations.createInvitation.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createInvitation.Output.Ok.Headers = .init(), + body: Operations.createInvitation.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The user was invited + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/post(createInvitation)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.createInvitation.Output.Ok) + public struct BadRequest: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createInvitation.Output.BadRequest.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createInvitation.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createInvitation.Output.BadRequest.Headers = .init(), + body: Operations.createInvitation.Output.BadRequest.Body + ) { + self.headers = headers + self.body = body + } + } + /// The user could not be invited due to a validation error + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/post(createInvitation)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.createInvitation.Output.BadRequest) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createInvitation.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createInvitation.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createInvitation.Output.Forbidden.Headers = .init(), + body: Operations.createInvitation.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/post(createInvitation)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.createInvitation.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createInvitation.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createInvitation.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createInvitation.Output.NotFound.Headers = .init(), + body: Operations.createInvitation.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization was not found + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/post(createInvitation)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.createInvitation.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Cancels an invitation + /// + /// Cancels an invitation for a given invitee email and an organization. + /// + /// - Remark: HTTP `DELETE /api/organizations/{organization_name}/invitations`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/delete(cancelInvitation)`. + public enum cancelInvitation { + public static let id: String = "cancelInvitation" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var organization_name: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - organization_name: + public init(organization_name: Swift.String) { + self.organization_name = organization_name + } + } + public var path: Operations.cancelInvitation.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.cancelInvitation.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.cancelInvitation.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.cancelInvitation.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Invitation params + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/invitations/DELETE/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// The email of the invitee. + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/invitations/DELETE/json/invitee_email`. + public var invitee_email: Swift.String + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - invitee_email: The email of the invitee. + public init(invitee_email: Swift.String) { self.invitee_email = invitee_email } + public enum CodingKeys: String, CodingKey { case invitee_email } + } + case json(Operations.cancelInvitation.Input.Body.jsonPayload) + } + public var body: Operations.cancelInvitation.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.cancelInvitation.Input.Path, + query: Operations.cancelInvitation.Input.Query = .init(), + headers: Operations.cancelInvitation.Input.Headers = .init(), + cookies: Operations.cancelInvitation.Input.Cookies = .init(), + body: Operations.cancelInvitation.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct NoContent: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.cancelInvitation.Output.NoContent.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(OpenAPIRuntime.OpenAPIValueContainer) + } + /// Received HTTP response body + public var body: Operations.cancelInvitation.Output.NoContent.Body + /// Creates a new `NoContent`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.cancelInvitation.Output.NoContent.Headers = .init(), + body: Operations.cancelInvitation.Output.NoContent.Body + ) { + self.headers = headers + self.body = body + } + } + /// The invitation was cancelled + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/delete(cancelInvitation)/responses/204`. + /// + /// HTTP response code: `204 noContent`. + case noContent(Operations.cancelInvitation.Output.NoContent) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.cancelInvitation.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.cancelInvitation.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.cancelInvitation.Output.Forbidden.Headers = .init(), + body: Operations.cancelInvitation.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/delete(cancelInvitation)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.cancelInvitation.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.cancelInvitation.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.cancelInvitation.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.cancelInvitation.Output.NotFound.Headers = .init(), + body: Operations.cancelInvitation.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The invitation with the given invitee email and organization name was not found + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/delete(cancelInvitation)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.cancelInvitation.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Updates a member in an organization + /// + /// Updates a member in a given organization + /// + /// - Remark: HTTP `PUT /api/organizations/{organization_name}/members/{user_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/put(updateOrganizationMember)`. + public enum updateOrganizationMember { + public static let id: String = "updateOrganizationMember" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var organization_name: Swift.String + public var user_name: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - organization_name: + /// - user_name: + public init(organization_name: Swift.String, user_name: Swift.String) { + self.organization_name = organization_name + self.user_name = user_name + } + } + public var path: Operations.updateOrganizationMember.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.updateOrganizationMember.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.updateOrganizationMember.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.updateOrganizationMember.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Member update params + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/members/{user_name}/PUT/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// The role to update the member to + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/members/{user_name}/PUT/json/role`. + @frozen + public enum rolePayload: RawRepresentable, Codable, Equatable, Hashable, + Sendable, _AutoLosslessStringConvertible, CaseIterable + { + case admin + case user + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "admin": self = .admin + case "user": self = .user + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .admin: return "admin" + case .user: return "user" + } + } + public static var allCases: [rolePayload] { [.admin, .user] } + } + /// The role to update the member to + /// + /// - Remark: Generated from `#/paths/api/organizations/{organization_name}/members/{user_name}/PUT/json/role`. + public var role: + Operations.updateOrganizationMember.Input.Body.jsonPayload.rolePayload + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - role: The role to update the member to + public init( + role: Operations.updateOrganizationMember.Input.Body.jsonPayload.rolePayload + ) { self.role = role } + public enum CodingKeys: String, CodingKey { case role } + } + case json(Operations.updateOrganizationMember.Input.Body.jsonPayload) + } + public var body: Operations.updateOrganizationMember.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.updateOrganizationMember.Input.Path, + query: Operations.updateOrganizationMember.Input.Query = .init(), + headers: Operations.updateOrganizationMember.Input.Headers = .init(), + cookies: Operations.updateOrganizationMember.Input.Cookies = .init(), + body: Operations.updateOrganizationMember.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganizationMember.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.OrganizationMember) + } + /// Received HTTP response body + public var body: Operations.updateOrganizationMember.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganizationMember.Output.Ok.Headers = .init(), + body: Operations.updateOrganizationMember.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The member was updated + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/put(updateOrganizationMember)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.updateOrganizationMember.Output.Ok) + public struct BadRequest: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganizationMember.Output.BadRequest.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateOrganizationMember.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganizationMember.Output.BadRequest.Headers = + .init(), + body: Operations.updateOrganizationMember.Output.BadRequest.Body + ) { + self.headers = headers + self.body = body + } + } + /// The member could not be updated due to a validation error + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/put(updateOrganizationMember)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.updateOrganizationMember.Output.BadRequest) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganizationMember.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateOrganizationMember.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganizationMember.Output.Forbidden.Headers = .init(), + body: Operations.updateOrganizationMember.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/put(updateOrganizationMember)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.updateOrganizationMember.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganizationMember.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateOrganizationMember.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganizationMember.Output.NotFound.Headers = .init(), + body: Operations.updateOrganizationMember.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization or the user with the given name was not found + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/put(updateOrganizationMember)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.updateOrganizationMember.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Removes a member from an organization + /// + /// Removes a member with a given username from a given organization + /// + /// - Remark: HTTP `DELETE /api/organizations/{organization_name}/members/{user_name}`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/delete(removeOrganizationMember)`. + public enum removeOrganizationMember { + public static let id: String = "removeOrganizationMember" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var organization_name: Swift.String + public var user_name: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - organization_name: + /// - user_name: + public init(organization_name: Swift.String, user_name: Swift.String) { + self.organization_name = organization_name + self.user_name = user_name + } + } + public var path: Operations.removeOrganizationMember.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.removeOrganizationMember.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.removeOrganizationMember.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.removeOrganizationMember.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.removeOrganizationMember.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.removeOrganizationMember.Input.Path, + query: Operations.removeOrganizationMember.Input.Query = .init(), + headers: Operations.removeOrganizationMember.Input.Headers = .init(), + cookies: Operations.removeOrganizationMember.Input.Cookies = .init(), + body: Operations.removeOrganizationMember.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct NoContent: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.removeOrganizationMember.Output.NoContent.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(OpenAPIRuntime.OpenAPIValueContainer) + } + /// Received HTTP response body + public var body: Operations.removeOrganizationMember.Output.NoContent.Body + /// Creates a new `NoContent`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.removeOrganizationMember.Output.NoContent.Headers = .init(), + body: Operations.removeOrganizationMember.Output.NoContent.Body + ) { + self.headers = headers + self.body = body + } + } + /// The member was removed + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/delete(removeOrganizationMember)/responses/204`. + /// + /// HTTP response code: `204 noContent`. + case noContent(Operations.removeOrganizationMember.Output.NoContent) + public struct BadRequest: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.removeOrganizationMember.Output.BadRequest.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.removeOrganizationMember.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.removeOrganizationMember.Output.BadRequest.Headers = + .init(), + body: Operations.removeOrganizationMember.Output.BadRequest.Body + ) { + self.headers = headers + self.body = body + } + } + /// The member could not be removed due to a validation error + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/delete(removeOrganizationMember)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.removeOrganizationMember.Output.BadRequest) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.removeOrganizationMember.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.removeOrganizationMember.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.removeOrganizationMember.Output.Forbidden.Headers = .init(), + body: Operations.removeOrganizationMember.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/delete(removeOrganizationMember)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.removeOrganizationMember.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.removeOrganizationMember.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.removeOrganizationMember.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.removeOrganizationMember.Output.NotFound.Headers = .init(), + body: Operations.removeOrganizationMember.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization or the user with the given name was not found + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/delete(removeOrganizationMember)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.removeOrganizationMember.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// List projects the authenticated user has access to. + /// + /// - Remark: HTTP `GET /api/projects`. + /// - Remark: Generated from `#/paths//api/projects/get(listProjects)`. + public enum listProjects { + public static let id: String = "listProjects" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + /// Creates a new `Path`. + public init() {} + } + public var path: Operations.listProjects.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.listProjects.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.listProjects.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.listProjects.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.listProjects.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.listProjects.Input.Path = .init(), + query: Operations.listProjects.Input.Query = .init(), + headers: Operations.listProjects.Input.Headers = .init(), + cookies: Operations.listProjects.Input.Cookies = .init(), + body: Operations.listProjects.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.listProjects.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + /// - Remark: Generated from `#/paths/api/projects/GET/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/projects/GET/json/projects`. + public var projects: [Components.Schemas.Project] + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - projects: + public init(projects: [Components.Schemas.Project]) { + self.projects = projects + } + public enum CodingKeys: String, CodingKey { case projects } + } + case json(Operations.listProjects.Output.Ok.Body.jsonPayload) + } + /// Received HTTP response body + public var body: Operations.listProjects.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.listProjects.Output.Ok.Headers = .init(), + body: Operations.listProjects.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// List of projects + /// + /// - Remark: Generated from `#/paths//api/projects/get(listProjects)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.listProjects.Output.Ok) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Create a new project. + /// + /// - Remark: HTTP `POST /api/projects`. + /// - Remark: Generated from `#/paths//api/projects/post(createProject)`. + public enum createProject { + public static let id: String = "createProject" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + /// Creates a new `Path`. + public init() {} + } + public var path: Operations.createProject.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.createProject.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.createProject.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.createProject.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Projects params + /// + /// - Remark: Generated from `#/paths/api/projects/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// The name of the project that should be created. + /// + /// - Remark: Generated from `#/paths/api/projects/POST/json/name`. + public var name: Swift.String + /// Organization to create the project with. If not specified, the project will be created with the current user's personal account. + /// + /// - Remark: Generated from `#/paths/api/projects/POST/json/organization`. + public var organization: Swift.String? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - name: The name of the project that should be created. + /// - organization: Organization to create the project with. If not specified, the project will be created with the current user's personal account. + public init(name: Swift.String, organization: Swift.String? = nil) { + self.name = name + self.organization = organization + } + public enum CodingKeys: String, CodingKey { + case name + case organization + } + } + case json(Operations.createProject.Input.Body.jsonPayload) + } + public var body: Operations.createProject.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.createProject.Input.Path = .init(), + query: Operations.createProject.Input.Query = .init(), + headers: Operations.createProject.Input.Headers = .init(), + cookies: Operations.createProject.Input.Cookies = .init(), + body: Operations.createProject.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createProject.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.Project) + } + /// Received HTTP response body + public var body: Operations.createProject.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createProject.Output.Ok.Headers = .init(), + body: Operations.createProject.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project was created + /// + /// - Remark: Generated from `#/paths//api/projects/post(createProject)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.createProject.Output.Ok) + public struct BadRequest: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createProject.Output.BadRequest.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createProject.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createProject.Output.BadRequest.Headers = .init(), + body: Operations.createProject.Output.BadRequest.Body + ) { + self.headers = headers + self.body = body + } + } + /// The account was not found + /// + /// - Remark: Generated from `#/paths//api/projects/post(createProject)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.createProject.Output.BadRequest) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createProject.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createProject.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createProject.Output.Forbidden.Headers = .init(), + body: Operations.createProject.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/projects/post(createProject)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.createProject.Output.Forbidden) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Returns a project based on the handle. + /// + /// - Remark: HTTP `GET /api/projects/{account_name}/{project_name}`. + /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/get(showProject)`. + public enum showProject { + public static let id: String = "showProject" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var account_name: Swift.String + public var project_name: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - account_name: + /// - project_name: + public init(account_name: Swift.String, project_name: Swift.String) { + self.account_name = account_name + self.project_name = project_name + } + } + public var path: Operations.showProject.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.showProject.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.showProject.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.showProject.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.showProject.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.showProject.Input.Path, + query: Operations.showProject.Input.Query = .init(), + headers: Operations.showProject.Input.Headers = .init(), + cookies: Operations.showProject.Input.Cookies = .init(), + body: Operations.showProject.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.showProject.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.Project) + } + /// Received HTTP response body + public var body: Operations.showProject.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.showProject.Output.Ok.Headers = .init(), + body: Operations.showProject.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project to show + /// + /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/get(showProject)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.showProject.Output.Ok) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.showProject.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.showProject.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.showProject.Output.Forbidden.Headers = .init(), + body: Operations.showProject.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/get(showProject)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.showProject.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.showProject.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.showProject.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.showProject.Output.NotFound.Headers = .init(), + body: Operations.showProject.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project was not found + /// + /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/get(showProject)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.showProject.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Cleans cache for a given project + /// + /// - Remark: HTTP `PUT /api/projects/{account_name}/{project_name}/cache/clean`. + /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/cache/clean/put(cleanCache)`. + public enum cleanCache { + public static let id: String = "cleanCache" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var account_name: Swift.String + public var project_name: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - account_name: + /// - project_name: + public init(account_name: Swift.String, project_name: Swift.String) { + self.account_name = account_name + self.project_name = project_name + } + } + public var path: Operations.cleanCache.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.cleanCache.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.cleanCache.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.cleanCache.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.cleanCache.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.cleanCache.Input.Path, + query: Operations.cleanCache.Input.Query = .init(), + headers: Operations.cleanCache.Input.Headers = .init(), + cookies: Operations.cleanCache.Input.Cookies = .init(), + body: Operations.cleanCache.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct NoContent: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.cleanCache.Output.NoContent.Headers + @frozen public enum Body: Sendable, Equatable, Hashable {} + /// Received HTTP response body + public var body: Operations.cleanCache.Output.NoContent.Body? + /// Creates a new `NoContent`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.cleanCache.Output.NoContent.Headers = .init(), + body: Operations.cleanCache.Output.NoContent.Body? = nil + ) { + self.headers = headers + self.body = body + } + } + /// The cache has been successfully cleaned + /// + /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/cache/clean/put(cleanCache)/responses/204`. + /// + /// HTTP response code: `204 noContent`. + case noContent(Operations.cleanCache.Output.NoContent) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.cleanCache.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.cleanCache.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.cleanCache.Output.Forbidden.Headers = .init(), + body: Operations.cleanCache.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/cache/clean/put(cleanCache)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.cleanCache.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.cleanCache.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.cleanCache.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.cleanCache.Output.NotFound.Headers = .init(), + body: Operations.cleanCache.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project was not found + /// + /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/cache/clean/put(cleanCache)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.cleanCache.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Deletes a project with a given id. + /// + /// - Remark: HTTP `DELETE /api/projects/{id}`. + /// - Remark: Generated from `#/paths//api/projects/{id}/delete(deleteProject)`. + public enum deleteProject { + public static let id: String = "deleteProject" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var id: Swift.Double + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: + public init(id: Swift.Double) { self.id = id } + } + public var path: Operations.deleteProject.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.deleteProject.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.deleteProject.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.deleteProject.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.deleteProject.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.deleteProject.Input.Path, + query: Operations.deleteProject.Input.Query = .init(), + headers: Operations.deleteProject.Input.Headers = .init(), + cookies: Operations.deleteProject.Input.Cookies = .init(), + body: Operations.deleteProject.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct NoContent: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.deleteProject.Output.NoContent.Headers + @frozen public enum Body: Sendable, Equatable, Hashable {} + /// Received HTTP response body + public var body: Operations.deleteProject.Output.NoContent.Body? + /// Creates a new `NoContent`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.deleteProject.Output.NoContent.Headers = .init(), + body: Operations.deleteProject.Output.NoContent.Body? = nil + ) { + self.headers = headers + self.body = body + } + } + /// The project was successfully deleted. + /// + /// - Remark: Generated from `#/paths//api/projects/{id}/delete(deleteProject)/responses/204`. + /// + /// HTTP response code: `204 noContent`. + case noContent(Operations.deleteProject.Output.NoContent) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.deleteProject.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.deleteProject.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.deleteProject.Output.Forbidden.Headers = .init(), + body: Operations.deleteProject.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/projects/{id}/delete(deleteProject)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.deleteProject.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.deleteProject.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.deleteProject.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.deleteProject.Output.NotFound.Headers = .init(), + body: Operations.deleteProject.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project was not found + /// + /// - Remark: Generated from `#/paths//api/projects/{id}/delete(deleteProject)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.deleteProject.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } +} diff --git a/Sources/TuistServer/OpenAPI/cloud.yml b/Sources/TuistServer/OpenAPI/cloud.yml new file mode 100644 index 00000000000..32aeb5ac75f --- /dev/null +++ b/Sources/TuistServer/OpenAPI/cloud.yml @@ -0,0 +1,1441 @@ +--- +components: + responses: {} + schemas: + AbsentCacheArtifact: + properties: + error: + items: + properties: + code: + default: not_found + type: string + message: + type: string + type: object + type: array + title: AbsentCacheArtifact + type: object + AuthenticationToken: + description: Token to authenticate the user with. + properties: + token: + description: User authentication token + type: string + title: AuthenticationToken + type: object + CacheArtifactDownloadURL: + description: The URL to download the artifact from the cache. + properties: + data: + properties: + expires_at: + description: The UNIX timestamp when the URL expires. + type: integer + url: + description: The URL to download the artifact from the cache. + type: string + required: + - url + - expires_at + type: object + status: + default: success + type: string + required: + - status + - data + title: CacheArtifactDownloadURL + type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.CacheArtifactDownloadURL + CacheArtifactExistence: + description: The artifact exists in the cache and can be downloaded + properties: + data: + properties: {} + type: object + status: + default: success + type: string + title: CacheArtifactExistence + type: object + CacheArtifactMultipartUploadCompletion: + description: This response confirms that the upload has been completed successfully. The cache will now be able to serve the artifact. + properties: + data: + properties: {} + type: object + status: + default: success + type: string + title: CacheArtifactMultipartUploadCompletion + type: object + CacheArtifactMultipartUploadURL: + description: The URL to upload a part has been generated. + properties: + data: + properties: + url: + description: The URL to upload the part + type: string + required: + - url + type: object + status: + default: success + type: string + required: + - status + - data + title: CacheArtifactMultipartUploadURL + type: object + CacheArtifactUploadID: + description: The upload has been initiated and a ID is returned to upload the various parts using multi-part uploads + properties: + data: + properties: + upload_id: + description: The upload ID + type: string + required: + - upload_id + type: object + status: + default: success + type: string + required: + - status + - data + title: CacheArtifactUploadID + type: object + CacheCategory: + default: builds + description: The category of the cache. + enum: + - tests + - builds + title: CacheCategory + type: string + x-struct: Elixir.TuistCloudWeb.API.Schemas.CacheCategory + CommandEvent: + description: The schema for the command analytics event. + properties: + id: + description: ID of the command event + type: number + name: + description: Name of the command + type: string + url: + description: URL to the command event + type: string + required: + - id + - name + - url + title: CommandEvent + type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.CommandEvent + Error: + properties: + message: + description: The error message + type: string + required: + - message + title: Error + type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.Error + Invitation: + properties: + id: + description: The invitation's unique identifier + type: number + invitee_email: + description: The email of the invitee + type: string + inviter: + $ref: '#/components/schemas/User' + organization_id: + description: The id of the organization the invitee is invited to + type: number + token: + description: The token to accept the invitation + type: string + required: + - id + - invitee_email + - organization_id + - inviter + - token + title: Invitation + type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.Invitation + Organization: + description: An organization + properties: + id: + description: The organization's unique identifier + type: number + invitations: + description: A list of organization invitations + items: + $ref: '#/components/schemas/Invitation' + type: array + members: + description: A list of organization members + items: + $ref: '#/components/schemas/OrganizationMember' + type: array + name: + description: The organization's name + type: string + plan: + description: The plan associated with the organization + enum: + - team + type: string + sso_organization_id: + description: The organization ID associated with the SSO provider + type: string + sso_provider: + description: The SSO provider set up for the organization + enum: + - google + type: string + required: + - id + - name + - plan + - members + - invitations + title: Organization + type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.Organization + OrganizationList: + description: The list of organizations the authenticated subject is part of. + properties: + organizations: + items: + $ref: '#/components/schemas/Organization' + type: array + required: + - organizations + title: OrganizationList + type: object + OrganizationMember: + description: An organization member + properties: + email: + description: The organization member's email + type: string + id: + description: The organization member's unique identifier + type: number + name: + description: The organization member's name + type: string + role: + description: The organization member's role + enum: + - admin + - user + type: string + required: + - id + - email + - name + - role + title: OrganizationMember + type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.OrganizationMember + Project: + properties: + full_name: + description: The full name of the project (e.g. tuist/tuist) + type: string + id: + description: ID of the project + type: number + token: + description: The token that should be used to authenticate the project. For CI only. + type: string + required: + - id + - full_name + - token + title: Project + type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.Project + User: + description: A user. + properties: + email: + description: The user's email + type: string + id: + description: The user's unique identifier + type: number + name: + description: The user's name + type: string + required: + - id + - email + - name + title: User + type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.User + securitySchemes: + authorization: + scheme: bearer + type: http +info: + title: Tuist Cloud + version: 0.1.0 +openapi: 3.0.0 +paths: + /api/analytics: + post: + callbacks: {} + operationId: createCommandEvent + parameters: + - description: The project id. + in: query + name: project_id + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + properties: + client_id: + description: The client id of the command. + type: string + command_arguments: + description: The arguments of the command. + items: + type: string + type: array + duration: + description: The duration of the command. + type: number + error_message: + description: The error message of the command. + type: string + is_ci: + description: Whether the command was run in a CI environment. + type: boolean + macos_version: + description: The version of macOS that ran the command. + type: string + name: + description: The name of the command. + type: string + params: + description: Extra parameters. + properties: + cacheable_targets: + description: A list of cacheable targets. + items: + type: string + type: array + local_cache_target_hits: + description: A list of local cache target hits. + items: + type: string + type: array + local_test_target_hits: + description: A list of local targets whose tests were skipped. + items: + type: string + type: array + remote_cache_target_hits: + description: A list of remote cache target hits. + items: + type: string + type: array + remote_test_target_hits: + description: A list of remote targets whose tests were skipped. + items: + type: string + type: array + test_targets: + description: The list of targets that were tested. + items: + type: string + type: array + type: object + status: + description: The status of the command. + enum: + - success + - failure + type: string + subcommand: + description: The subcommand of the command. + type: string + swift_version: + description: The version of Swift that ran the command. + type: string + tuist_version: + description: The version of Tuist that ran the command. + type: string + required: + - name + - duration + - tuist_version + - swift_version + - macos_version + - is_ci + - client_id + type: object + description: Command event params + required: false + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/CommandEvent' + description: The command event was created + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You don't have permission to create command events for the project. + summary: Create a a new command analytics event + tags: [] + /api/auth/device_code/{device_code}: + get: + callbacks: {} + description: This endpoint returns a token for a given device code if the device code is authenticated. + operationId: getDeviceCode + parameters: + - description: The device code to query. + in: path + name: device_code + required: true + schema: + type: string + responses: + 200: + content: + application/json: + schema: + description: Token to authenticate the user with. + properties: + token: + description: User authentication token + type: string + title: AuthenticationToken + type: object + description: The device code is authenticated + 202: + content: + application/json: + schema: + type: object + description: The device code is not authenticated + 400: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The request was not accepted, e.g., when the device code is expired + summary: Get a specific device code. + tags: [] + /api/cache: + get: + callbacks: {} + description: This endpoint returns a signed URL that can be used to download an artifact from the cache. + operationId: downloadCacheArtifact + parameters: + - description: The category of the cache. It's used to differentiate between different types of caches. + in: query + name: cache_category + required: false + schema: + $ref: '#/components/schemas/CacheCategory' + - description: The project identifier '{account_name}/{project_name}'. + in: query + name: project_id + required: true + schema: + type: string + - description: The hash that uniquely identifies the artifact in the cache. + in: query + name: hash + required: true + schema: + type: string + - description: The name of the artifact. + in: query + name: name + required: true + schema: + type: string + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/CacheArtifactDownloadURL' + description: The artifact exists and is downloadable + 402: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The account has an invalid plan + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project or the cache artifact doesn't exist + summary: Downloads an artifact from the cache. + tags: [] + /api/cache/exists: + get: + callbacks: {} + deprecated: true + description: This endpoint checks if an artifact exists in the cache. It returns a 404 status code if the artifact does not exist. + operationId: cacheArtifactExists + parameters: + - description: The category of the cache. It's used to differentiate between different types of caches. + in: query + name: cache_category + required: false + schema: + $ref: '#/components/schemas/CacheCategory' + - description: The project identifier '{account_name}/{project_name}'. + in: query + name: project_id + required: true + schema: + type: string + - description: The hash that uniquely identifies the artifact in the cache. + in: query + name: hash + required: true + schema: + type: string + - description: The name of the artifact. + in: query + name: name + required: true + schema: + type: string + responses: + 200: + content: + application/json: + schema: + description: The artifact exists in the cache and can be downloaded + properties: + data: + properties: {} + type: object + status: + default: success + type: string + title: CacheArtifactExistence + type: object + description: The artifact exists + 402: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The account has an invalid plan + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + properties: + error: + items: + properties: + code: + default: not_found + type: string + message: + type: string + type: object + type: array + title: AbsentCacheArtifact + type: object + description: The artifact doesn't exist + summary: It checks if an artifact exists in the cache. + tags: [] + /api/cache/multipart/complete: + post: + callbacks: {} + description: Given the upload ID and all the parts with their ETags, this endpoint completes the multipart upload. The cache will then be able to serve the artifact. + operationId: completeCacheArtifactMultipartUpload + parameters: + - description: The category of the cache. It's used to differentiate between different types of caches. + in: query + name: cache_category + required: false + schema: + $ref: '#/components/schemas/CacheCategory' + - description: The project identifier '{account_name}/{project_name}'. + in: query + name: project_id + required: true + schema: + type: string + - description: The hash that uniquely identifies the artifact in the cache. + in: query + name: hash + required: true + schema: + type: string + - description: The upload ID. + in: query + name: upload_id + required: true + schema: + type: string + - description: The name of the artifact. + in: query + name: name + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + properties: + parts: + items: + properties: + etag: + description: The ETag of the part + type: string + part_number: + description: The part number + type: integer + type: object + type: array + type: object + description: Multi-part upload parts + required: false + responses: + 200: + content: + application/json: + schema: + description: This response confirms that the upload has been completed successfully. The cache will now be able to serve the artifact. + properties: + data: + properties: {} + type: object + status: + default: success + type: string + title: CacheArtifactMultipartUploadCompletion + type: object + description: The upload has been completed + 402: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The account has an invalid plan + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project doesn't exist + summary: It completes a multi-part upload. + tags: [] + /api/cache/multipart/generate-url: + post: + callbacks: {} + description: Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. + operationId: generateCacheArtifactMultipartUploadURL + parameters: + - description: The category of the cache. It's used to differentiate between different types of caches. + in: query + name: cache_category + required: false + schema: + $ref: '#/components/schemas/CacheCategory' + - description: The project identifier '{account_name}/{project_name}'. + in: query + name: project_id + required: true + schema: + type: string + - description: The hash that uniquely identifies the artifact in the cache. + in: query + name: hash + required: true + schema: + type: string + - description: The part number of the multipart upload. + in: query + name: part_number + required: true + schema: + type: integer + - description: The upload ID. + in: query + name: upload_id + required: true + schema: + type: string + - description: The name of the artifact. + in: query + name: name + required: true + schema: + type: string + responses: + 200: + content: + application/json: + schema: + description: The URL to upload a part has been generated. + properties: + data: + properties: + url: + description: The URL to upload the part + type: string + required: + - url + type: object + status: + default: success + type: string + required: + - status + - data + title: CacheArtifactMultipartUploadURL + type: object + description: The URL has been generated + 402: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The account has an invalid plan + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project doesn't exist + summary: It generates a signed URL for uploading a part. + tags: [] + /api/cache/multipart/start: + post: + callbacks: {} + description: The endpoint returns an upload ID that can be used to generate URLs for the individual parts and complete the upload. + operationId: startCacheArtifactMultipartUpload + parameters: + - description: The category of the cache. It's used to differentiate between different types of caches. + in: query + name: cache_category + required: false + schema: + $ref: '#/components/schemas/CacheCategory' + - description: The project identifier '{account_name}/{project_name}'. + in: query + name: project_id + required: true + schema: + type: string + - description: The hash that uniquely identifies the artifact in the cache. + in: query + name: hash + required: true + schema: + type: string + - description: The name of the artifact. + in: query + name: name + required: true + schema: + type: string + responses: + 200: + content: + application/json: + schema: + description: The upload has been initiated and a ID is returned to upload the various parts using multi-part uploads + properties: + data: + properties: + upload_id: + description: The upload ID + type: string + required: + - upload_id + type: object + status: + default: success + type: string + required: + - status + - data + title: CacheArtifactUploadID + type: object + description: The upload has been started + 402: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The account has an invalid plan + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project doesn't exist + summary: It initiates a multipart upload in the cache. + tags: [] + /api/organizations: + get: + callbacks: {} + description: Returns all the organizations the authenticated subject is part of. + operationId: listOrganizations + parameters: [] + responses: + 200: + content: + application/json: + schema: + description: The list of organizations the authenticated subject is part of. + properties: + organizations: + items: + $ref: '#/components/schemas/Organization' + type: array + required: + - organizations + title: OrganizationList + type: object + description: The list of organizations + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + summary: Lists the organizations + tags: [] + post: + callbacks: {} + description: Creates an organization with the given name. + operationId: createOrganization + parameters: [] + requestBody: + content: + application/json: + schema: + properties: + name: + description: The name of the organization that should be created. + type: string + required: + - name + type: object + description: Organization params + required: false + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/Organization' + description: The organization was created + 400: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The organization could not be created due to a validation error + summary: Creates an organization + tags: [] + /api/organizations/{organization_name}: + delete: + callbacks: {} + description: Deletes the organization with the given name. + operationId: deleteOrganization + parameters: + - description: The name of the organization to delete. + in: path + name: organization_name + required: true + schema: + type: string + responses: + 204: + content: + application/json: {} + description: The organization was deleted + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The organization with the given name was not found + summary: Deletes an organization + tags: [] + get: + callbacks: {} + description: Returns the organization with the given identifier. + operationId: showOrganization + parameters: + - description: The name of the organization to show. + in: path + name: organization_name + required: true + schema: + type: string + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/Organization' + description: The organization + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The organization with the given name was not found + summary: Shows an organization + tags: [] + patch: + callbacks: {} + description: Updates an organization with given parameters. + operationId: updateOrganization (2) + parameters: + - description: The name of the organization to update. + in: path + name: organization_name + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + properties: + sso_organization_id: + description: The SSO organization ID to be associated with the SSO provider + nullable: true + type: string + sso_provider: + description: The SSO provider to set up for the organization + enum: + - google + - none + type: string + type: object + description: Organization update params + required: false + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/Organization' + description: The organization + 400: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The organization could not be updated due to a validation error + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The organization with the given name was not found + summary: Updates an organization + tags: [] + put: + callbacks: {} + description: Updates an organization with given parameters. + operationId: updateOrganization + parameters: + - description: The name of the organization to update. + in: path + name: organization_name + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + properties: + sso_organization_id: + description: The SSO organization ID to be associated with the SSO provider + nullable: true + type: string + sso_provider: + description: The SSO provider to set up for the organization + enum: + - google + - none + type: string + type: object + description: Organization update params + required: false + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/Organization' + description: The organization + 400: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The organization could not be updated due to a validation error + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The organization with the given name was not found + summary: Updates an organization + tags: [] + /api/organizations/{organization_name}/invitations: + delete: + callbacks: {} + description: Cancels an invitation for a given invitee email and an organization. + operationId: cancelInvitation + parameters: + - description: The name of the organization. + in: path + name: organization_name + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + properties: + invitee_email: + description: The email of the invitee. + type: string + required: + - invitee_email + type: object + description: Invitation params + required: false + responses: + 204: + content: + application/json: {} + description: The invitation was cancelled + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The invitation with the given invitee email and organization name was not found + summary: Cancels an invitation + tags: [] + post: + callbacks: {} + description: Invites a user with a given email to a given organization. + operationId: createInvitation + parameters: + - description: The name of the organization. + in: path + name: organization_name + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + properties: + invitee_email: + description: The email of the invitee. + type: string + required: + - invitee_email + type: object + description: Invitation params + required: false + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/Invitation' + description: The user was invited + 400: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The user could not be invited due to a validation error + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The organization was not found + summary: Creates an invitation + tags: [] + /api/organizations/{organization_name}/members/{user_name}: + delete: + callbacks: {} + description: Removes a member with a given username from a given organization + operationId: removeOrganizationMember + parameters: + - description: The name of the organization to remove the member from. + in: path + name: organization_name + required: true + schema: + type: string + - description: The name of the user to remove from the organization. + in: path + name: user_name + required: true + schema: + type: string + responses: + 204: + content: + application/json: {} + description: The member was removed + 400: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The member could not be removed due to a validation error + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The organization or the user with the given name was not found + summary: Removes a member from an organization + tags: [] + put: + callbacks: {} + description: Updates a member in a given organization + operationId: updateOrganizationMember + parameters: + - description: The name of the organization to update the member in. + in: path + name: organization_name + required: true + schema: + type: string + - description: The name of the user to update in the organization. + in: path + name: user_name + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + properties: + role: + description: The role to update the member to + enum: + - admin + - user + type: string + required: + - role + type: object + description: Member update params + required: false + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationMember' + description: The member was updated + 400: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The member could not be updated due to a validation error + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The organization or the user with the given name was not found + summary: Updates a member in an organization + tags: [] + /api/projects: + get: + callbacks: {} + operationId: listProjects + parameters: [] + responses: + 200: + content: + application/json: + schema: + properties: + projects: + items: + $ref: '#/components/schemas/Project' + type: array + required: + - projects + type: object + description: List of projects + summary: List projects the authenticated user has access to. + tags: [] + post: + callbacks: {} + operationId: createProject + parameters: [] + requestBody: + content: + application/json: + schema: + properties: + name: + description: The name of the project that should be created. + type: string + organization: + description: Organization to create the project with. If not specified, the project will be created with the current user's personal account. + type: string + required: + - name + type: object + description: Projects params + required: false + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/Project' + description: The project was created + 400: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The account was not found + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + summary: Create a new project. + tags: [] + /api/projects/{account_name}/{project_name}: + get: + callbacks: {} + operationId: showProject + parameters: + - description: The name of the account that the project belongs to. + in: path + name: account_name + required: true + schema: + type: string + - description: The name of the project to show + in: path + name: project_name + required: true + schema: + type: string + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/Project' + description: The project to show + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project was not found + summary: Returns a project based on the handle. + tags: [] + /api/projects/{account_name}/{project_name}/cache/clean: + put: + callbacks: {} + operationId: cleanCache + parameters: + - description: The name of the account that the project belongs to. + in: path + name: account_name + required: true + schema: + type: string + - description: The name of the project to clean cache for + in: path + name: project_name + required: true + schema: + type: string + responses: + 204: + description: The cache has been successfully cleaned + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project was not found + summary: Cleans cache for a given project + tags: [] + /api/projects/{id}: + delete: + callbacks: {} + operationId: deleteProject + parameters: + - description: The id of the project to delete. + in: path + name: id + required: true + schema: + type: number + responses: + 204: + description: The project was successfully deleted. + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project was not found + summary: Deletes a project with a given id. + tags: [] +security: + - authorization: [] +servers: + - url: http://localhost:8080 + variables: {} +tags: [] diff --git a/Sources/TuistServer/Services/CacheExistsService.swift b/Sources/TuistServer/Services/CacheExistsService.swift new file mode 100644 index 00000000000..9902c82bd26 --- /dev/null +++ b/Sources/TuistServer/Services/CacheExistsService.swift @@ -0,0 +1,81 @@ +import Foundation +import Mockable +import TuistCore +import TuistSupport + +@Mockable +public protocol CacheExistsServicing { + func cacheExists( + serverURL: URL, + projectId: String, + hash: String, + name: String, + cacheCategory: CacheCategory.App + ) async throws +} + +public enum CacheExistsServiceError: FatalError, Equatable { + case unknownError(Int) + case notFound(String) + case paymentRequired(String) + case forbidden(String) + + public var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .paymentRequired, .forbidden: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The remote cache could not be used due to an unknown Tuist Cloud response of \(statusCode)." + case let .notFound(message), let .paymentRequired(message), let .forbidden(message): + return message + } + } +} + +public final class CacheExistsService: CacheExistsServicing { + public init() {} + + public func cacheExists( + serverURL: URL, + projectId: String, + hash: String, + name: String, + cacheCategory: CacheCategory.App + ) async throws { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.cacheArtifactExists( + .init(query: .init(cache_category: .init(cacheCategory), project_id: projectId, hash: hash, name: name)) + ) + + switch response { + case .ok: + // noop + break + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(body): + throw CacheExistsServiceError.notFound(body.error?.first?.message ?? "The remote cache artifact does not exist") + } + case let .paymentRequired(paymentRequiredResponse): + switch paymentRequiredResponse.body { + case let .json(error): + throw CacheExistsServiceError.paymentRequired(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw CacheExistsServiceError.unknownError(statusCode) + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw CacheExistsServiceError.forbidden(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/CancelOrganizationInviteService.swift b/Sources/TuistServer/Services/CancelOrganizationInviteService.swift new file mode 100644 index 00000000000..4371dee3254 --- /dev/null +++ b/Sources/TuistServer/Services/CancelOrganizationInviteService.swift @@ -0,0 +1,71 @@ +import Foundation +import OpenAPIURLSession +import TuistSupport + +public protocol CancelOrganizationInviteServicing { + func cancelOrganizationInvite( + organizationName: String, + email: String, + serverURL: URL + ) async throws +} + +enum CancelOrganizationInviteServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .forbidden: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "The invitation could not be cancelled due to an unknown cloud response of \(statusCode)." + case let .notFound(message), let .forbidden(message): + return message + } + } +} + +public final class CancelOrganizationInviteService: CancelOrganizationInviteServicing { + public init() {} + + public func cancelOrganizationInvite( + organizationName: String, + email: String, + serverURL: URL + ) async throws { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.cancelInvitation( + .init( + path: .init(organization_name: organizationName), + body: .json(.init(invitee_email: email)) + ) + ) + switch response { + case .noContent: + // noop + break + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw CancelOrganizationInviteServiceError.notFound(error.message) + } + case let .forbidden(forbidden): + switch forbidden.body { + case let .json(error): + throw CancelOrganizationInviteServiceError.forbidden(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw CancelOrganizationInviteServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Services/CleanCacheService.swift b/Sources/TuistServer/Services/CleanCacheService.swift new file mode 100644 index 00000000000..0be430b916f --- /dev/null +++ b/Sources/TuistServer/Services/CleanCacheService.swift @@ -0,0 +1,69 @@ +import Foundation +import Mockable +import TuistSupport + +@Mockable +public protocol CleanCacheServicing { + func cleanCache( + serverURL: URL, + fullName: String + ) async throws +} + +enum CleanCacheServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .forbidden: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "The project clean failed due to an unknown cloud response of \(statusCode)." + case let .notFound(message), let .forbidden(message): + return message + } + } +} + +public final class CleanCacheService: CleanCacheServicing { + public init() {} + + public func cleanCache( + serverURL: URL, + fullName: String + ) async throws { + let client = Client.cloud(serverURL: serverURL) + let components = fullName.components(separatedBy: "/") + + let response = try await client.cleanCache( + .init(path: .init(account_name: components[0], project_name: components[1])) + ) + + switch response { + case .noContent: + // noop + break + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw CleanCacheServiceError.notFound(error.message) + } + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw CleanCacheServiceError.forbidden(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw CleanCacheServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Services/CloudURLService.swift b/Sources/TuistServer/Services/CloudURLService.swift new file mode 100644 index 00000000000..55330db5271 --- /dev/null +++ b/Sources/TuistServer/Services/CloudURLService.swift @@ -0,0 +1,40 @@ +import Foundation +import TuistSupport + +enum CloudURLServiceError: FatalError { + case invalidCloudURL + + /// Error description. + var description: String { + switch self { + case .invalidCloudURL: + return "The cloud URL is invalid." + } + } + + /// Error type. + var type: ErrorType { + switch self { + case .invalidCloudURL: + return .bug + } + } +} + +public protocol CloudURLServicing { + func url(configCloudURL: URL?) throws -> URL +} + +public final class CloudURLService: CloudURLServicing { + public init() {} + + public func url(configCloudURL: URL?) throws -> URL { + guard let cloudURL = ProcessInfo.processInfo.environment["TUIST_CLOUD_URL"] + .map(URL.init(string:)) ?? configCloudURL ?? URL(string: Constants.URLs.production) + else { + throw CloudURLServiceError.invalidCloudURL + } + + return cloudURL + } +} diff --git a/Sources/TuistServer/Services/CreateCommandEventService.swift b/Sources/TuistServer/Services/CreateCommandEventService.swift new file mode 100644 index 00000000000..9f5d2a35a8d --- /dev/null +++ b/Sources/TuistServer/Services/CreateCommandEventService.swift @@ -0,0 +1,104 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistCore +import TuistSupport + +@Mockable +public protocol CreateCommandEventServicing { + func createCommandEvent( + commandEvent: CommandEvent, + projectId: String, + serverURL: URL + ) async throws -> CloudCommandEvent +} + +enum CreateCommandEventServiceError: FatalError { + case unknownError(Int) + case forbidden(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .forbidden: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "The organization could not be created due to an unknown cloud response of \(statusCode)." + case let .forbidden(message): + return message + } + } +} + +public final class CreateCommandEventService: CreateCommandEventServicing { + public init() {} + + public func createCommandEvent( + commandEvent: CommandEvent, + projectId: String, + serverURL: URL + ) async throws -> CloudCommandEvent { + let client = Client.cloud(serverURL: serverURL) + let errorMessage: String? + let status: Operations.createCommandEvent.Input.Body.jsonPayload.statusPayload? + switch commandEvent.status { + case .success: + errorMessage = nil + status = .success + case let .failure(message): + errorMessage = message + status = .failure + } + + let response = try await client.createCommandEvent( + .init( + query: .init( + project_id: projectId + ), + body: .json( + .init( + client_id: commandEvent.clientId, + command_arguments: commandEvent.commandArguments, + duration: Double(commandEvent.durationInMs), + error_message: errorMessage, + is_ci: commandEvent.isCI, + macos_version: commandEvent.macOSVersion, + name: commandEvent.name, + params: .init( + cacheable_targets: commandEvent.params["cacheable_targets"]?.value as? [String], + local_cache_target_hits: commandEvent.params["local_cache_target_hits"]?.value as? [String], + local_test_target_hits: commandEvent.params["local_test_target_hits"]?.value as? [String], + remote_cache_target_hits: commandEvent.params["remote_cache_target_hits"]?.value as? [String], + remote_test_target_hits: commandEvent.params["remote_test_target_hits"]?.value as? [String], + test_targets: commandEvent.params["test_targets"]?.value as? [String] + ), + status: status, + subcommand: commandEvent.subcommand, + swift_version: commandEvent.swiftVersion, + tuist_version: commandEvent.tuistVersion + ) + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(commandEvent): + return CloudCommandEvent(commandEvent) + } + case let .undocumented(statusCode: statusCode, _): + throw CreateCommandEventServiceError.unknownError(statusCode) + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw CreateCommandEventServiceError.forbidden(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/CreateOrganizationInviteService.swift b/Sources/TuistServer/Services/CreateOrganizationInviteService.swift new file mode 100644 index 00000000000..9fe2ce532b0 --- /dev/null +++ b/Sources/TuistServer/Services/CreateOrganizationInviteService.swift @@ -0,0 +1,81 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol CreateOrganizationInviteServicing { + func createOrganizationInvite( + organizationName: String, + email: String, + serverURL: URL + ) async throws -> CloudInvitation +} + +enum CreateOrganizationInviteServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + case badRequest(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .forbidden, .badRequest: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "The user could not be invited due to an unknown cloud response of \(statusCode)." + case let .notFound(message), let .forbidden(message), let .badRequest(message): + return message + } + } +} + +public final class CreateOrganizationInviteService: CreateOrganizationInviteServicing { + public init() {} + + public func createOrganizationInvite( + organizationName: String, + email: String, + serverURL: URL + ) async throws -> CloudInvitation { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.createInvitation( + .init( + path: .init(organization_name: organizationName), + body: .json(.init(invitee_email: email)) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(invitation): + return CloudInvitation(invitation) + } + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw CreateOrganizationInviteServiceError.notFound(error.message) + } + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw CreateOrganizationInviteServiceError.forbidden(error.message) + } + case let .badRequest(badRequestResponse): + switch badRequestResponse.body { + case let .json(error): + throw CreateOrganizationInviteServiceError.badRequest(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw CreateOrganizationInviteServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Services/CreateOrganizationService.swift b/Sources/TuistServer/Services/CreateOrganizationService.swift new file mode 100644 index 00000000000..340849de6e8 --- /dev/null +++ b/Sources/TuistServer/Services/CreateOrganizationService.swift @@ -0,0 +1,70 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol CreateOrganizationServicing { + func createOrganization( + name: String, + serverURL: URL + ) async throws -> CloudOrganization +} + +enum CreateOrganizationServiceError: FatalError { + case unknownError(Int) + case badRequest(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .badRequest: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "The organization could not be created due to an unknown cloud response of \(statusCode)." + case let .badRequest(message): + return message + } + } +} + +public final class CreateOrganizationService: CreateOrganizationServicing { + public init() {} + + public func createOrganization( + name: String, + serverURL: URL + ) async throws -> CloudOrganization { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.createOrganization( + .init( + body: .json( + .init( + name: name + ) + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(organization): + return CloudOrganization(organization) + } + case let .badRequest(badRequestResponse): + switch badRequestResponse.body { + case let .json(error): + throw CreateOrganizationServiceError.badRequest(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw CreateOrganizationServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Services/CreateProjectService.swift b/Sources/TuistServer/Services/CreateProjectService.swift new file mode 100644 index 00000000000..2e2eea86ea0 --- /dev/null +++ b/Sources/TuistServer/Services/CreateProjectService.swift @@ -0,0 +1,79 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol CreateProjectServicing { + func createProject( + name: String, + organization: String?, + serverURL: URL + ) async throws -> CloudProject +} + +enum CreateProjectServiceError: FatalError { + case unknownError(Int) + case forbidden(String) + case badRequest(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .forbidden, .badRequest: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "The project could not be created due to an unknown Cloud response of \(statusCode)." + case let .forbidden(message), let .badRequest(message): + return message + } + } +} + +public final class CreateProjectService: CreateProjectServicing { + public init() {} + + public func createProject( + name: String, + organization: String?, + serverURL: URL + ) async throws -> CloudProject { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.createProject( + .init( + body: .json( + .init( + name: name, + organization: organization + ) + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(project): + return CloudProject(project) + } + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw CreateProjectServiceError.forbidden(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw CreateProjectServiceError.unknownError(statusCode) + case let .badRequest(badRequestResponse): + switch badRequestResponse.body { + case let .json(error): + throw CreateProjectServiceError.badRequest(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/DeleteOrganizationService.swift b/Sources/TuistServer/Services/DeleteOrganizationService.swift new file mode 100644 index 00000000000..41e142ea6eb --- /dev/null +++ b/Sources/TuistServer/Services/DeleteOrganizationService.swift @@ -0,0 +1,70 @@ +import Foundation +import OpenAPIURLSession +import TuistSupport + +public protocol DeleteOrganizationServicing { + func deleteOrganization( + name: String, + serverURL: URL + ) async throws +} + +enum DeleteOrganizationServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .forbidden, .notFound: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "The organization could not be deleted due to an unknown cloud response of \(statusCode)." + case let .forbidden(message), let .notFound(message): + return message + } + } +} + +public final class DeleteOrganizationService: DeleteOrganizationServicing { + public init() {} + + public func deleteOrganization( + name: String, + serverURL: URL + ) async throws { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.deleteOrganization( + .init( + path: .init( + organization_name: name + ) + ) + ) + switch response { + case .noContent: + // noop + break + case let .notFound(notFound): + switch notFound.body { + case let .json(error): + throw DeleteOrganizationServiceError.notFound(error.message) + } + case let .forbidden(forbidden): + switch forbidden.body { + case let .json(error): + throw DeleteOrganizationServiceError.forbidden(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw DeleteOrganizationServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Services/DeleteProjectService.swift b/Sources/TuistServer/Services/DeleteProjectService.swift new file mode 100644 index 00000000000..c86a1992bd1 --- /dev/null +++ b/Sources/TuistServer/Services/DeleteProjectService.swift @@ -0,0 +1,70 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol DeleteProjectServicing { + func deleteProject( + projectId: Int, + serverURL: URL + ) async throws +} + +enum DeleteProjectServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .forbidden, .notFound: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "The project could not be deleted due to an unknown cloud response of \(statusCode)." + case let .forbidden(message), let .notFound(message): + return message + } + } +} + +public final class DeleteProjectService: DeleteProjectServicing { + public init() {} + + public func deleteProject( + projectId: Int, + serverURL: URL + ) async throws { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.deleteProject( + .init( + path: .init(id: Double(projectId)) + ) + ) + switch response { + case .noContent: + // noop + break + case let .notFound(notFound): + switch notFound.body { + case let .json(error): + throw DeleteProjectServiceError.notFound(error.message) + } + case let .forbidden(forbidden): + switch forbidden.body { + case let .json(error): + throw DeleteProjectServiceError.forbidden(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw DeleteProjectServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Services/GetAuthTokenService.swift b/Sources/TuistServer/Services/GetAuthTokenService.swift new file mode 100644 index 00000000000..5a1ebfe8c41 --- /dev/null +++ b/Sources/TuistServer/Services/GetAuthTokenService.swift @@ -0,0 +1,67 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol GetAuthTokenServicing { + func getAuthToken( + serverURL: URL, + deviceCode: String + ) async throws -> String? +} + +public enum GetAuthTokenServiceError: FatalError, Equatable { + case unknownError(Int) + case badRequest(String) + + public var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .badRequest: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The CLI authentication failed due to an unknown Tuist Cloud response of \(statusCode)." + case let .badRequest(message): + return message + } + } +} + +public final class GetAuthTokenService: GetAuthTokenServicing { + public init() {} + + public func getAuthToken( + serverURL: URL, + deviceCode: String + ) async throws -> String? { + let client = Client.unauthenticatedCloud(serverURL: serverURL) + + let response = try await client.getDeviceCode( + .init(path: .init(device_code: deviceCode)) + ) + + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(token): + return token.token + } + case .accepted: + return nil + case let .badRequest(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw GetAuthTokenServiceError.badRequest(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw CacheExistsServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Services/GetCacheService.swift b/Sources/TuistServer/Services/GetCacheService.swift new file mode 100644 index 00000000000..3d1897dd4cc --- /dev/null +++ b/Sources/TuistServer/Services/GetCacheService.swift @@ -0,0 +1,83 @@ +import Foundation +import Mockable +import TuistCore +import TuistSupport + +@Mockable +public protocol GetCacheServicing { + func getCache( + serverURL: URL, + projectId: String, + hash: String, + name: String, + cacheCategory: CacheCategory.App + ) async throws -> CloudCacheArtifact +} + +public enum GetCacheServiceError: FatalError, Equatable { + case unknownError(Int) + case notFound(String) + case paymentRequired(String) + case forbidden(String) + + public var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .paymentRequired, .forbidden: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The remote cache could not be used due to an unknown Tuist Cloud response of \(statusCode)." + case let .notFound(message), let .paymentRequired(message), let .forbidden(message): + return message + } + } +} + +public final class GetCacheService: GetCacheServicing { + public init() {} + + public func getCache( + serverURL: URL, + projectId: String, + hash: String, + name: String, + cacheCategory: CacheCategory.App + ) async throws -> CloudCacheArtifact { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.downloadCacheArtifact( + .init(query: .init(cache_category: .init(cacheCategory), project_id: projectId, hash: hash, name: name)) + ) + + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(cacheArtifact): + return try CloudCacheArtifact(cacheArtifact) + } + case let .paymentRequired(paymentRequiredResponse): + switch paymentRequiredResponse.body { + case let .json(error): + throw GetCacheServiceError.paymentRequired(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw GetCacheServiceError.unknownError(statusCode) + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw GetCacheServiceError.forbidden(error.message) + } + case let .notFound(notFound): + switch notFound.body { + case let .json(error): + throw GetCacheServiceError.notFound(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/GetOrganizationService.swift b/Sources/TuistServer/Services/GetOrganizationService.swift new file mode 100644 index 00000000000..731d1251f49 --- /dev/null +++ b/Sources/TuistServer/Services/GetOrganizationService.swift @@ -0,0 +1,74 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol GetOrganizationServicing { + func getOrganization( + organizationName: String, + serverURL: URL + ) async throws -> CloudOrganization +} + +enum GetOrganizationServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .forbidden, .notFound: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "We could not get the organization due to an unknown cloud response of \(statusCode)." + case let .forbidden(message), let .notFound(message): + return message + } + } +} + +public final class GetOrganizationService: GetOrganizationServicing { + public init() {} + + public func getOrganization( + organizationName: String, + serverURL: URL + ) async throws -> CloudOrganization { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.showOrganization( + .init( + path: .init( + organization_name: organizationName + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(project): + return CloudOrganization(project) + } + case let .notFound(notFound): + switch notFound.body { + case let .json(error): + throw GetOrganizationServiceError.notFound(error.message) + } + case let .forbidden(forbidden): + switch forbidden.body { + case let .json(error): + throw GetOrganizationServiceError.forbidden(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw GetOrganizationServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Services/GetProjectService.swift b/Sources/TuistServer/Services/GetProjectService.swift new file mode 100644 index 00000000000..a4ebca2c9ea --- /dev/null +++ b/Sources/TuistServer/Services/GetProjectService.swift @@ -0,0 +1,77 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol GetProjectServicing { + func getProject( + accountName: String, + projectName: String, + serverURL: URL + ) async throws -> CloudProject +} + +enum GetProjectServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .forbidden, .notFound: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "We could not get the project due to an unknown cloud response of \(statusCode)." + case let .forbidden(message), let .notFound(message): + return message + } + } +} + +public final class GetProjectService: GetProjectServicing { + public init() {} + + public func getProject( + accountName: String, + projectName: String, + serverURL: URL + ) async throws -> CloudProject { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.showProject( + .init( + path: .init( + account_name: accountName, + project_name: projectName + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(project): + return CloudProject(project) + } + case let .notFound(notFound): + switch notFound.body { + case let .json(error): + throw GetProjectServiceError.notFound(error.message) + } + case let .forbidden(forbidden): + switch forbidden.body { + case let .json(error): + throw GetProjectServiceError.forbidden(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw GetProjectServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Services/ListOrganizationsService.swift b/Sources/TuistServer/Services/ListOrganizationsService.swift new file mode 100644 index 00000000000..9974a10c6d3 --- /dev/null +++ b/Sources/TuistServer/Services/ListOrganizationsService.swift @@ -0,0 +1,64 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol ListOrganizationsServicing { + func listOrganizations( + serverURL: URL + ) async throws -> [String] +} + +enum ListOrganizationsServiceError: FatalError { + case unknownError(Int) + case forbidden(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .forbidden: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "The organizations could not be listed due to an unknown cloud response of \(statusCode)." + case let .forbidden(message): + return message + } + } +} + +public final class ListOrganizationsService: ListOrganizationsServicing { + public init() {} + + public func listOrganizations( + serverURL: URL + ) async throws -> [String] { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.listOrganizations( + .init( + query: .init() + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(data): + return data.organizations.map(\.name) + } + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw ListOrganizationsServiceError.forbidden(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw ListOrganizationsServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Services/ListProjectsService.swift b/Sources/TuistServer/Services/ListProjectsService.swift new file mode 100644 index 00000000000..0e26d25ebdb --- /dev/null +++ b/Sources/TuistServer/Services/ListProjectsService.swift @@ -0,0 +1,70 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol ListProjectsServicing { + func listProjects( + serverURL: URL + ) async throws -> [CloudProject] + + func listProjects( + serverURL: URL, + accountName: String?, + projectName: String? + ) async throws -> [CloudProject] +} + +enum ListProjectsServiceError: FatalError { + case unknownError(Int) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "The project could not be listed due to an unknown cloud response of \(statusCode)." + } + } +} + +public final class ListProjectsService: ListProjectsServicing { + public init() {} + + public func listProjects( + serverURL: URL + ) async throws -> [CloudProject] { + try await listProjects( + serverURL: serverURL, + accountName: nil, + projectName: nil + ) + } + + public func listProjects( + serverURL: URL, + accountName _: String?, + projectName _: String? + ) async throws -> [CloudProject] { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.listProjects( + .init() + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(json): + return json.projects.map(CloudProject.init) + } + case let .undocumented(statusCode: statusCode, _): + throw ListProjectsServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift b/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift new file mode 100644 index 00000000000..3ea658c378e --- /dev/null +++ b/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift @@ -0,0 +1,90 @@ +import Foundation +import Mockable +import OpenAPIRuntime +import TuistCore +import TuistSupport + +@Mockable +public protocol MultipartUploadCompleteCacheServicing { + func uploadCache( + serverURL: URL, + projectId: String, + hash: String, + name: String, + cacheCategory: CacheCategory.App, + uploadId: String, + parts: [(etag: String, partNumber: Int)] + ) async throws +} + +public enum MultipartUploadCompleteCacheServiceError: FatalError, Equatable { + case unknownError(Int) + case notFound(String) + case paymentRequired(String) + case forbidden(String) + + public var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .paymentRequired, .forbidden: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The multi-part upload could not get completed due to an unknown Tuist Cloud response of \(statusCode)." + case let .notFound(message), let .paymentRequired(message), let .forbidden(message): + return message + } + } +} + +public final class MultipartUploadCompleteCacheService: MultipartUploadCompleteCacheServicing { + public init() {} + + public func uploadCache( + serverURL: URL, + projectId: String, + hash: String, + name: String, + cacheCategory: CacheCategory.App, + uploadId: String, + parts: [(etag: String, partNumber: Int)] + ) async throws { + let client = Client.cloud(serverURL: serverURL) + let response = try await client.completeCacheArtifactMultipartUpload(.init(query: .init( + cache_category: .init(cacheCategory), + project_id: projectId, + hash: hash, + upload_id: uploadId, + name: name + ), body: .json(.init(parts: parts.map { .init(etag: $0.etag, part_number: $0.partNumber) })))) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case .json: + return + } + case let .paymentRequired(paymentRequiredResponse): + switch paymentRequiredResponse.body { + case let .json(error): + throw MultipartUploadCompleteCacheServiceError.paymentRequired(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw MultipartUploadCompleteCacheServiceError.unknownError(statusCode) + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw MultipartUploadCompleteCacheServiceError.forbidden(error.message) + } + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw MultipartUploadCompleteCacheServiceError.notFound(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift b/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift new file mode 100644 index 00000000000..c1073b07b0c --- /dev/null +++ b/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift @@ -0,0 +1,90 @@ +import Foundation +import Mockable +import TuistCore +import TuistSupport + +@Mockable +public protocol MultipartUploadGenerateURLCacheServicing { + func uploadCache( + serverURL: URL, + projectId: String, + hash: String, + name: String, + cacheCategory: CacheCategory.App, + uploadId: String, + partNumber: Int + ) async throws -> String +} + +public enum MultipartUploadGenerateURLCacheServiceError: FatalError, Equatable { + case unknownError(Int) + case notFound(String) + case paymentRequired(String) + case forbidden(String) + + public var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .paymentRequired, .forbidden: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The generation of a multi-part upload URL failed due to an unknown Tuist Cloud response of \(statusCode)." + case let .notFound(message), let .paymentRequired(message), let .forbidden(message): + return message + } + } +} + +public final class MultipartUploadGenerateURLCacheService: MultipartUploadGenerateURLCacheServicing { + public init() {} + + public func uploadCache( + serverURL: URL, + projectId: String, + hash: String, + name: String, + cacheCategory: CacheCategory.App, + uploadId: String, + partNumber: Int + ) async throws -> String { + let client = Client.cloud(serverURL: serverURL) + let response = try await client.generateCacheArtifactMultipartUploadURL(.init(query: .init( + cache_category: .init(cacheCategory), + project_id: projectId, + hash: hash, + part_number: partNumber, + upload_id: uploadId, + name: name + ))) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(cacheArtifact): + return cacheArtifact.data.url + } + case let .paymentRequired(paymentRequiredResponse): + switch paymentRequiredResponse.body { + case let .json(error): + throw MultipartUploadGenerateURLCacheServiceError.paymentRequired(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw MultipartUploadGenerateURLCacheServiceError.unknownError(statusCode) + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw MultipartUploadGenerateURLCacheServiceError.forbidden(error.message) + } + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw MultipartUploadGenerateURLCacheServiceError.notFound(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift b/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift new file mode 100644 index 00000000000..c7feae37a68 --- /dev/null +++ b/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift @@ -0,0 +1,84 @@ +import Foundation +import Mockable +import TuistCore +import TuistSupport + +@Mockable +public protocol MultipartUploadStartCacheServicing { + func uploadCache( + serverURL: URL, + projectId: String, + hash: String, + name: String, + cacheCategory: CacheCategory.App + ) async throws -> String +} + +public enum MultipartUploadStartCacheServiceError: FatalError, Equatable { + case unknownError(Int) + case notFound(String) + case paymentRequired(String) + case forbidden(String) + + public var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .paymentRequired, .forbidden: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The remote cache artifact could not be uploaded due to an unknown Tuist Cloud response of \(statusCode)." + case let .notFound(message), let .paymentRequired(message), let .forbidden(message): + return message + } + } +} + +public final class MultipartUploadStartCacheService: MultipartUploadStartCacheServicing { + public init() {} + + public func uploadCache( + serverURL: URL, + projectId: String, + hash: String, + name: String, + cacheCategory: CacheCategory.App + ) async throws -> String { + let client = Client.cloud(serverURL: serverURL) + let response = try await client.startCacheArtifactMultipartUpload(.init(query: .init( + cache_category: .init(cacheCategory), + project_id: projectId, + hash: hash, + name: name + ))) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(cacheArtifact): + return cacheArtifact.data.upload_id + } + case let .paymentRequired(paymentRequiredResponse): + switch paymentRequiredResponse.body { + case let .json(error): + throw MultipartUploadStartCacheServiceError.paymentRequired(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw MultipartUploadStartCacheServiceError.unknownError(statusCode) + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw MultipartUploadStartCacheServiceError.forbidden(error.message) + } + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw MultipartUploadStartCacheServiceError.notFound(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/RemoveOrganizationMemberService.swift b/Sources/TuistServer/Services/RemoveOrganizationMemberService.swift new file mode 100644 index 00000000000..7f306b83a32 --- /dev/null +++ b/Sources/TuistServer/Services/RemoveOrganizationMemberService.swift @@ -0,0 +1,79 @@ +import Foundation +import OpenAPIURLSession +import TuistSupport + +public protocol RemoveOrganizationMemberServicing { + func removeOrganizationMember( + organizationName: String, + username: String, + serverURL: URL + ) async throws +} + +enum RemoveOrganizationMemberServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + case badRequest(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .forbidden, .badRequest: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "The member could not be removed due to an unknown cloud response of \(statusCode)." + case let .notFound(message), let .forbidden(message), let .badRequest(message): + return message + } + } +} + +public final class RemoveOrganizationMemberService: RemoveOrganizationMemberServicing { + public init() {} + + public func removeOrganizationMember( + organizationName: String, + username: String, + serverURL: URL + ) async throws { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.removeOrganizationMember( + .init( + path: .init( + organization_name: organizationName, + user_name: username + ) + ) + ) + switch response { + case .noContent: + // noop + break + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw RemoveOrganizationMemberServiceError.notFound(error.message) + } + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw RemoveOrganizationMemberServiceError.forbidden(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw RemoveOrganizationMemberServiceError.unknownError(statusCode) + case let .badRequest(badRequestResponse): + switch badRequestResponse.body { + case let .json(error): + throw RemoveOrganizationMemberServiceError.badRequest(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/UpdateOrganizationMemberService.swift b/Sources/TuistServer/Services/UpdateOrganizationMemberService.swift new file mode 100644 index 00000000000..d6bb93e2875 --- /dev/null +++ b/Sources/TuistServer/Services/UpdateOrganizationMemberService.swift @@ -0,0 +1,84 @@ +import Foundation +import OpenAPIURLSession +import TuistSupport + +public protocol UpdateOrganizationMemberServicing { + func updateOrganizationMember( + organizationName: String, + username: String, + role: CloudOrganization.Member.Role, + serverURL: URL + ) async throws -> CloudOrganization.Member +} + +enum UpdateOrganizationMemberServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + case badRequest(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .forbidden, .badRequest: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "The member could not be updated due to an unknown cloud response of \(statusCode)." + case let .notFound(message), let .forbidden(message), let .badRequest(message): + return message + } + } +} + +public final class UpdateOrganizationMemberService: UpdateOrganizationMemberServicing { + public init() {} + + public func updateOrganizationMember( + organizationName: String, + username: String, + role: CloudOrganization.Member.Role, + serverURL: URL + ) async throws -> CloudOrganization.Member { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.updateOrganizationMember( + .init( + path: .init( + organization_name: organizationName, + user_name: username + ), + body: .json(.init(role: .init(rawValue: role.rawValue)!)) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(organizationMember): + return CloudOrganization.Member(organizationMember) + } + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw UpdateOrganizationMemberServiceError.notFound(error.message) + } + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw UpdateOrganizationMemberServiceError.forbidden(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw UpdateOrganizationMemberServiceError.unknownError(statusCode) + case let .badRequest(badRequestResponse): + switch badRequestResponse.body { + case let .json(error): + throw UpdateOrganizationMemberServiceError.badRequest(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/UpdateOrganizationService.swift b/Sources/TuistServer/Services/UpdateOrganizationService.swift new file mode 100644 index 00000000000..4a546ef3034 --- /dev/null +++ b/Sources/TuistServer/Services/UpdateOrganizationService.swift @@ -0,0 +1,102 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol UpdateOrganizationServicing { + func updateOrganization( + organizationName: String, + serverURL: URL, + ssoOrganization: SSOOrganization? + ) async throws -> CloudOrganization +} + +enum UpdateOrganizationServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + case badRequest(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .forbidden, .notFound, .badRequest: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "We could not get the organization due to an unknown cloud response of \(statusCode)." + case let .forbidden(message), let .notFound(message), let .badRequest(message): + return message + } + } +} + +public final class UpdateOrganizationService: UpdateOrganizationServicing { + public init() {} + + public func updateOrganization( + organizationName: String, + serverURL: URL, + ssoOrganization: SSOOrganization? + ) async throws -> CloudOrganization { + let client = Client.cloud(serverURL: serverURL) + let ssoProvider: Operations.updateOrganization + .Input.Body.jsonPayload.sso_providerPayload + let ssoOrganizationId: String? + + if let ssoOrganization { + switch ssoOrganization { + case let .google(organizationId): + ssoProvider = .google + ssoOrganizationId = organizationId + } + } else { + ssoOrganizationId = nil + ssoProvider = .none + } + + let response = try await client.updateOrganization( + .init( + path: .init( + organization_name: organizationName + ), + body: .json( + .init( + sso_organization_id: ssoOrganizationId, + sso_provider: ssoProvider + ) + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(project): + return CloudOrganization(project) + } + case let .notFound(notFound): + switch notFound.body { + case let .json(error): + throw UpdateOrganizationServiceError.notFound(error.message) + } + case let .forbidden(forbidden): + switch forbidden.body { + case let .json(error): + throw UpdateOrganizationServiceError.forbidden(error.message) + } + case let .badRequest(badRequest): + switch badRequest.body { + case let .json(error): + throw UpdateOrganizationServiceError.forbidden(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw UpdateOrganizationServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Session/CloudSessionController.swift b/Sources/TuistServer/Session/CloudSessionController.swift new file mode 100644 index 00000000000..56a28bb953e --- /dev/null +++ b/Sources/TuistServer/Session/CloudSessionController.swift @@ -0,0 +1,119 @@ +import Foundation +import Mockable +import TuistSupport + +@Mockable +public protocol CloudSessionControlling: AnyObject { + /// It authenticates the user for the server with the given URL. + /// - Parameter serverURL: Server URL. + func authenticate(serverURL: URL) async throws + + /// Prints the session for the server with the given URL. + /// - Parameter serverURL: Server URL. + func printSession(serverURL: URL) throws + + /// Removes the session for the server with the given URL. + /// - Parameter serverURL: Server URL. + func logout(serverURL: URL) throws +} + +public final class CloudSessionController: CloudSessionControlling { + static let port: UInt16 = 4545 + + private let credentialsStore: CloudCredentialsStoring + private let ciChecker: CIChecking + private let opener: Opening + private let getAuthTokenService: GetAuthTokenServicing + private let uniqueIDGenerator: UniqueIDGenerating + private let cloudAuthenticationController: CloudAuthenticationControlling + + public convenience init() { + let credentialsStore = CloudCredentialsStore() + self.init( + credentialsStore: credentialsStore, + ciChecker: CIChecker(), + opener: Opener(), + getAuthTokenService: GetAuthTokenService(), + uniqueIDGenerator: UniqueIDGenerator(), + cloudAuthenticationController: CloudAuthenticationController(credentialsStore: credentialsStore) + ) + } + + init( + credentialsStore: CloudCredentialsStoring, + ciChecker: CIChecking, + opener: Opening, + getAuthTokenService: GetAuthTokenServicing, + uniqueIDGenerator: UniqueIDGenerating, + cloudAuthenticationController: CloudAuthenticationControlling + ) { + self.credentialsStore = credentialsStore + self.ciChecker = ciChecker + self.opener = opener + self.getAuthTokenService = getAuthTokenService + self.uniqueIDGenerator = uniqueIDGenerator + self.cloudAuthenticationController = cloudAuthenticationController + } + + // MARK: - CloudSessionControlling + + public func authenticate(serverURL: URL) async throws { + var components = URLComponents(url: serverURL, resolvingAgainstBaseURL: false)! + let deviceCode = uniqueIDGenerator.uniqueID() + components.path = "/auth/cli/\(deviceCode)" + components.queryItems = nil + let authURL = components.url! + + logger.notice("Opening \(authURL.absoluteString) to start the authentication flow") + try opener.open(url: authURL) + + logger.pretty("Press \(.keystroke("CTRL + C")) once to cancel the process.") + let token = try await getAuthToken( + serverURL: serverURL, + deviceCode: deviceCode + ) + let credentials = CloudCredentials(token: token) + try credentialsStore.store(credentials: credentials, serverURL: serverURL) + logger.notice("Credentials stored successfully", metadata: .success) + } + + public func printSession(serverURL: URL) throws { + if let token = try cloudAuthenticationController.authenticationToken(serverURL: serverURL) { + switch token { + case let .user(userToken): + logger.notice(""" + Requests against \(serverURL.absoluteString) will be authenticated as a user using the following token: + \(userToken) + """) + case let .project(projectToken): + logger.notice(""" + Requests against \(serverURL.absoluteString) will be authenticated as a project using the following token: + \(projectToken) + """) + } + } else { + logger.notice("There are no sessions for the server with URL \(serverURL.absoluteString)") + } + } + + public func logout(serverURL: URL) throws { + logger.notice("Removing session for server with URL \(serverURL.absoluteString)") + try credentialsStore.delete(serverURL: serverURL) + logger.notice("Session deleted successfully", metadata: .success) + } + + private func getAuthToken( + serverURL: URL, + deviceCode: String + ) async throws -> String { + if let token = try await getAuthTokenService.getAuthToken( + serverURL: serverURL, + deviceCode: deviceCode + ) { + return token + } else { + try await Task.sleep(nanoseconds: 1_000_000_000) + return try await getAuthToken(serverURL: serverURL, deviceCode: deviceCode) + } + } +} diff --git a/Sources/TuistServer/Utilities/CloudAuthenticationController.swift b/Sources/TuistServer/Utilities/CloudAuthenticationController.swift new file mode 100644 index 00000000000..d6696cc5931 --- /dev/null +++ b/Sources/TuistServer/Utilities/CloudAuthenticationController.swift @@ -0,0 +1,63 @@ +import Foundation +import Mockable +import TuistSupport + +@Mockable +public protocol CloudAuthenticationControlling { + func authenticationToken(serverURL: URL) throws -> CloudAuthenticationToken? +} + +public enum CloudAuthenticationToken: CustomStringConvertible { + /// The token represents a user session. User sessions are typically used in + /// local environments where the user can be guided through an interactive + /// authentication workflow + case user(String) + + /// The token represents a project session. Project sessions are typically used + /// in CI environments where limited scopes are desired for security reasons. + case project(String) + + /// It returns the value of the token + public var value: String { + switch self { + case let .user(token): + return token + case let .project(token): + return token + } + } + + public var description: String { + switch self { + case let .user(token): + return "tuist cloud user token: \(token)" + case let .project(token): + return "tuist cloud project token: \(token)" + } + } +} + +public final class CloudAuthenticationController: CloudAuthenticationControlling { + private let credentialsStore: CloudCredentialsStoring + private let ciChecker: CIChecking + private let environmentVariables: () -> [String: String] + + public init( + credentialsStore: CloudCredentialsStoring = CloudCredentialsStore(), + ciChecker: CIChecking = CIChecker(), + environmentVariables: @escaping () -> [String: String] = { ProcessInfo.processInfo.environment } + ) { + self.credentialsStore = credentialsStore + self.ciChecker = ciChecker + self.environmentVariables = environmentVariables + } + + public func authenticationToken(serverURL: URL) throws -> CloudAuthenticationToken? { + if ciChecker.isCI() { + let environment = environmentVariables() + return environment[Constants.EnvironmentVariables.token].map { .project($0) } + } else { + return (try credentialsStore.read(serverURL: serverURL)?.token).map { .user($0) } + } + } +} diff --git a/Sources/TuistServer/Utilities/CloudCredentialsStore.swift b/Sources/TuistServer/Utilities/CloudCredentialsStore.swift new file mode 100644 index 00000000000..4f075602c54 --- /dev/null +++ b/Sources/TuistServer/Utilities/CloudCredentialsStore.swift @@ -0,0 +1,154 @@ +import Foundation +import Mockable +import TSCBasic +import TuistSupport + +public struct CloudCredentials: Codable, Equatable { + /// Authentication token. + public let token: String + + /// Initializes the credentials with its attributes. + /// - Parameters: + /// - token: Authentication token. + /// - account: Account identifier. + public init(token: String) { + self.token = token + } +} + +@Mockable +public protocol CloudCredentialsStoring { + /// It stores the credentials for the server with the given URL. + /// - Parameters: + /// - credentials: Credentials to be stored. + /// - serverURL: Server URL (without path). + func store(credentials: CloudCredentials, serverURL: URL) throws + + /// Gets the credentials to authenticate the user against the server with the given URL. Throws an error if credentials are + /// not found. + /// - Parameter serverURL: Server URL (without path). + func get(serverURL: URL) throws -> CloudCredentials + + /// Reads the credentials to authenticate the user against the server with the given URL. + /// - Parameter serverURL: Server URL (without path). + func read(serverURL: URL) throws -> CloudCredentials? + + /// Deletes the credentials for the server with the given URL. + /// - Parameter serverURL: Server URL (without path). + func delete(serverURL: URL) throws +} + +enum CloudCredentialsStoreError: FatalError { + case credentialsNotFound + case xcdgHomePathNotAbsolute(String) + case invalidServerURL(String) + + var description: String { + switch self { + case .credentialsNotFound: + return "You are not authenticated. Authenticate by running `tuist cloud auth`." + case let .xcdgHomePathNotAbsolute(path): + return "We expected the value of the XDG_CONFIG_HOME environment variable, \(path), to be an absolute path but it's not." + case let .invalidServerURL(url): + return "We couldn't obtain the host from the following URL because it seems invalid \(url)" + } + } + + var type: ErrorType { + switch self { + case .credentialsNotFound: + return .abort + case .xcdgHomePathNotAbsolute: + return .abort + case .invalidServerURL: + return .abort + } + } +} + +public final class CloudCredentialsStore: CloudCredentialsStoring { + private let fileHandler: FileHandling + private let configDirectory: AbsolutePath? + + /// Default initializer. + public convenience init() { + self.init(fileHandler: FileHandler.shared) + } + + init(fileHandler: FileHandling, configDirectory: AbsolutePath? = nil) { + self.fileHandler = fileHandler + self.configDirectory = configDirectory + } + + // MARK: - CredentialsStoring + + public func store(credentials: CloudCredentials, serverURL: URL) throws { + let path = try credentialsFilePath(serverURL: serverURL) + let data = try JSONEncoder().encode(credentials) + if !fileHandler.exists(path.parentDirectory) { + try fileHandler.createFolder(path.parentDirectory) + } + try data.write(to: path.url, options: .atomic) + } + + public func read(serverURL: URL) throws -> CloudCredentials? { + let path = try credentialsFilePath(serverURL: serverURL) + guard fileHandler.exists(path) else { return nil } + let data = try fileHandler.readFile(path) + + /** + This might fail if we've migrated the schema, which is very unlikely, or if someone modifies the content in it + and the new schema doesn't align with the one that we expect. We could add logic to handle those gracefully, + but since the user can recover from it by signing in again, I think it's ok not to add more complexity here. + */ + return try? JSONDecoder().decode(CloudCredentials.self, from: data) + } + + public func get(serverURL: URL) throws -> CloudCredentials { + guard let credentials = try read(serverURL: serverURL) + else { + throw CloudCredentialsStoreError.credentialsNotFound + } + + return credentials + } + + public func delete(serverURL: URL) throws { + let path = try credentialsFilePath(serverURL: serverURL) + if fileHandler.exists(path) { + try fileHandler.delete(path) + } + } + + // MARK: - Fileprivate + + fileprivate static func configDirectory() throws -> AbsolutePath { + var directory: AbsolutePath! + + if let xdgConfigHomeString = ProcessInfo.processInfo.environment["XDG_CONFIG_HOME"] { + do { + directory = try AbsolutePath(validating: xdgConfigHomeString) + } catch { + throw CloudCredentialsStoreError.xcdgHomePathNotAbsolute(xdgConfigHomeString) + } + } + + if directory == nil { + directory = FileHandler.shared.homeDirectory.appending(component: ".config") + } + return directory.appending(component: "tuist") + } + + fileprivate func credentialsFilePath(serverURL: URL) throws -> AbsolutePath { + guard let components = URLComponents(url: serverURL, resolvingAgainstBaseURL: false), let host = components.host else { + throw CloudCredentialsStoreError.invalidServerURL(serverURL.absoluteString) + } + let directory = if let configDirectory { + configDirectory + } else { + try CloudCredentialsStore.configDirectory() + } + // swiftlint:disable:next force_try + return directory.appending(try! RelativePath(validating: "credentials/\(host).json")) + } +} diff --git a/Sources/TuistServer/Utilities/UniqueIDGenerator.swift b/Sources/TuistServer/Utilities/UniqueIDGenerator.swift new file mode 100644 index 00000000000..fb1103af5eb --- /dev/null +++ b/Sources/TuistServer/Utilities/UniqueIDGenerator.swift @@ -0,0 +1,13 @@ +import Foundation +import Mockable + +@Mockable +protocol UniqueIDGenerating { + func uniqueID() -> String +} + +final class UniqueIDGenerator: UniqueIDGenerating { + func uniqueID() -> String { + UUID().uuidString + } +} diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 55b691614ba..e9c1e254388 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -69,5 +69,10 @@ public enum Constants { public static let osLog = "TUIST_CONFIG_OS_LOG" /// `tuistBinaryPath` is used for specifying the exact tuist binary in tuist tasks. public static let tuistBinaryPath = "TUIST_CONFIG_BINARY_PATH" + public static let token = "TUIST_CONFIG_CLOUD_TOKEN" + } + + public enum URLs { + public static let production = "https://cloud.tuist.io/" } } diff --git a/Sources/tuist/TuistApp.swift b/Sources/tuist/TuistApp.swift index addec28f353..dd85126e99a 100644 --- a/Sources/tuist/TuistApp.swift +++ b/Sources/tuist/TuistApp.swift @@ -6,7 +6,7 @@ import TuistSupport @main @_documentation(visibility: private) -private enum TuistApp { +private enum TuistServer { static func main() async throws { if CommandLine.arguments.contains("--verbose") { try? ProcessEnv.setVar(Constants.EnvironmentVariables.verbose, value: "true") @@ -16,6 +16,6 @@ private enum TuistApp { try TuistSupport.Environment.shared.bootstrap() - await TuistCommand.main() + try await TuistCommand.main() } } diff --git a/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift b/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift index 30f959c5796..2bbdba9a2bd 100644 --- a/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift +++ b/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift @@ -667,7 +667,7 @@ final class BuildGraphInspectorTests: TuistUnitTestCase { let path = try temporaryPath() let nonTuistWorkspacePath = path.appending(components: "SPM.xcworkspace") try FileHandler.shared.createFolder(nonTuistWorkspacePath) - let workspacePath = path.appending(component: "TuistApp.xcworkspace") + let workspacePath = path.appending(component: "TuistServer.xcworkspace") try FileHandler.shared.createFolder(workspacePath) try FileHandler.shared.touch(workspacePath.appending(component: Constants.tuistGeneratedFileName)) diff --git a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift index 0db784356d7..ad5a23bc8a6 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift @@ -1,4 +1,5 @@ import Foundation +import MockableTest import TSCBasic import TuistCore import TuistCoreTesting @@ -10,20 +11,24 @@ import XCTest @testable import TuistSupportTesting final class ProjectFileElementsTests: TuistUnitTestCase { - var subject: ProjectFileElements! - var groups: ProjectGroups! - var pbxproj: PBXProj! - var cacheDirectoriesProvider: MockCacheDirectoriesProvider! + private var subject: ProjectFileElements! + private var groups: ProjectGroups! + private var pbxproj: PBXProj! + private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! override func setUpWithError() throws { super.setUp() - cacheDirectoriesProvider = try MockCacheDirectoriesProvider() + cacheDirectoriesProvider = .init() pbxproj = PBXProj() groups = ProjectGroups.generate( project: .test(path: "/path", sourceRootPath: "/path", xcodeProjPath: "/path/Project.xcodeproj"), pbxproj: pbxproj ) + given(cacheDirectoriesProvider) + .cacheDirectory() + .willReturn(try! temporaryPath()) + subject = ProjectFileElements(cacheDirectoriesProvider: cacheDirectoriesProvider) } diff --git a/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift new file mode 100644 index 00000000000..5da48868739 --- /dev/null +++ b/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift @@ -0,0 +1,52 @@ +import Foundation +import MockableTest +import TSCBasic +import TuistCore +import TuistCoreTesting +import TuistGraph +import TuistGraphTesting +import TuistLoader +import TuistLoaderTesting +import TuistServer +import TuistSupport +import XCTest +@testable import TuistKit +@testable import TuistSupportTesting + +final class CloudAuthServiceTests: TuistUnitTestCase { + private var cloudSessionController: MockCloudSessionControlling! + private var configLoader: MockConfigLoader! + private var cloudURL: URL! + private var subject: CloudAuthService! + + override func setUp() { + super.setUp() + cloudSessionController = .init() + configLoader = MockConfigLoader() + cloudURL = URL(string: "https://test.cloud.tuist.io")! + configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + + subject = CloudAuthService( + cloudSessionController: cloudSessionController, + configLoader: configLoader + ) + } + + override func tearDown() { + cloudSessionController = nil + configLoader = nil + cloudURL = nil + subject = nil + super.tearDown() + } + + func test_authenticate() async throws { + // Given + given(cloudSessionController) + .authenticate(serverURL: .value(cloudURL)) + .willReturn(()) + + // When / Then + try await subject.authenticate(directory: nil) + } +} diff --git a/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift new file mode 100644 index 00000000000..915b6b435c5 --- /dev/null +++ b/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift @@ -0,0 +1,64 @@ +import MockableTest +import TuistGraph +import TuistGraphTesting +import TuistLoaderTesting +import TuistServer +import TuistSupport +import XCTest + +@testable import TuistKit +@testable import TuistSupportTesting + +final class CloudCleanServiceTests: TuistUnitTestCase { + private var cloudSessionController: MockCloudSessionControlling! + private var cleanCacheService: MockCleanCacheServicing! + private var configLoader: MockConfigLoader! + private var subject: CloudCleanService! + + override func setUp() { + super.setUp() + cloudSessionController = .init() + cleanCacheService = .init() + configLoader = MockConfigLoader() + subject = CloudCleanService( + cloudSessionController: cloudSessionController, + cleanCacheService: cleanCacheService, + configLoader: configLoader + ) + } + + override func tearDown() { + cloudSessionController = nil + cleanCacheService = nil + configLoader = nil + subject = nil + super.tearDown() + } + + func test_cloud_clean() async throws { + // Given + let url = URL(string: "https://cloud.com")! + + configLoader.loadConfigStub = { _ in + Config.test( + cloud: Cloud.test( + url: url, + projectId: "project/slug" + ) + ) + } + + given(cleanCacheService) + .cleanCache( + serverURL: .value(url), + fullName: .value("project/slug") + ) + .willReturn(()) + + // When + try await subject.clean(path: "/some-path") + + // Then + XCTAssertPrinterOutputContains("Project was successfully cleaned.") + } +} diff --git a/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift new file mode 100644 index 00000000000..fea1984dec1 --- /dev/null +++ b/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift @@ -0,0 +1,115 @@ +import MockableTest +import TSCBasic +import TuistGraph +import TuistGraphTesting +import TuistLoaderTesting +import TuistServer +import TuistSupport +import XCTest + +@testable import TuistKit +@testable import TuistSupportTesting + +final class CloudInitServiceTests: TuistUnitTestCase { + private var cloudSessionController: MockCloudSessionControlling! + private var createProjectService: MockCreateProjectServicing! + private var configLoader: MockConfigLoader! + private var cloudURL: URL! + private var subject: CloudInitService! + + override func setUp() { + super.setUp() + cloudSessionController = MockCloudSessionControlling() + createProjectService = .init() + configLoader = MockConfigLoader() + cloudURL = URL(string: "https://test.cloud.tuist.io")! + subject = CloudInitService( + cloudSessionController: cloudSessionController, + createProjectService: createProjectService, + configLoader: configLoader + ) + } + + override func tearDown() { + cloudSessionController = nil + createProjectService = nil + configLoader = nil + subject = nil + super.tearDown() + } + + func test_cloud_init_when_config_exists() async throws { + // Given + given(createProjectService) + .createProject( + name: .value("tuist"), + organization: .value("tuist-org"), + serverURL: .value(URL(string: Constants.URLs.production)!) + ) + .willReturn(.test(fullName: "tuist/test")) + configLoader.loadConfigStub = { _ in Config.test(cloud: nil) } + configLoader.locateConfigStub = { _ in AbsolutePath("/some-path") } + + // When + try await subject.createProject( + name: "tuist", + organization: "tuist-org", + directory: nil + ) + + // Then + XCTAssertPrinterOutputContains(""" + Put the following line into your Tuist/Config.swift (see the docs for more: https://docs.tuist.io/manifests/config/): + cloud: .cloud(projectId: "tuist/test") + """) + } + + func test_cloud_init_when_config_does_not_exist() async throws { + // Given + var content: String? + configLoader.locateConfigStub = { _ in nil } + fileHandler.stubWrite = { stubContent, _, _ in content = stubContent } + given(createProjectService) + .createProject( + name: .value("tuist"), + organization: .value("tuist-org"), + serverURL: .value(URL(string: Constants.URLs.production)!) + ) + .willReturn(.test(fullName: "tuist/test")) + + // When + try await subject.createProject( + name: "tuist", + organization: "tuist-org", + directory: nil + ) + + // Then + XCTAssertEqual(""" + import ProjectDescription + + let config = Config( + cloud: .cloud(projectId: "tuist/test") + ) + + """, content) + XCTAssertPrinterOutputContains("Tuist Cloud was successfully initialized.") + } + + func test_cloud_init_when_cloud_exists() async throws { + // Given + configLoader.loadConfigStub = { _ in + Config.test(cloud: Cloud.test(url: self.cloudURL)) + } + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.createProject( + name: "tuist", + organization: "tuist-org", + directory: nil + ), + CloudInitServiceError.cloudAlreadySetUp + ) + } +} diff --git a/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift new file mode 100644 index 00000000000..7c2e32a1661 --- /dev/null +++ b/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift @@ -0,0 +1,52 @@ +import Foundation +import MockableTest +import TSCBasic +import TuistCore +import TuistCoreTesting +import TuistGraph +import TuistGraphTesting +import TuistLoader +import TuistLoaderTesting +import TuistServer +import TuistSupport +import XCTest + +@testable import TuistKit +@testable import TuistSupportTesting + +final class CloudLogoutServiceTests: TuistUnitTestCase { + private var cloudSessionController: MockCloudSessionControlling! + private var subject: CloudLogoutService! + private var configLoader: MockConfigLoader! + private var cloudURL: URL! + + override func setUp() { + super.setUp() + cloudSessionController = MockCloudSessionControlling() + configLoader = MockConfigLoader() + cloudURL = URL(string: "https://test.cloud.tuist.io")! + configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + subject = CloudLogoutService( + cloudSessionController: cloudSessionController, + configLoader: configLoader + ) + } + + override func tearDown() { + cloudSessionController = nil + cloudURL = nil + configLoader = nil + subject = nil + super.tearDown() + } + + func test_logout() throws { + // Given + given(cloudSessionController) + .logout(serverURL: .value(cloudURL)) + .willReturn(()) + + // When / Then + try subject.logout(directory: nil) + } +} diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift new file mode 100644 index 00000000000..4cad4bad947 --- /dev/null +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift @@ -0,0 +1,67 @@ +import Foundation +import MockableTest +import TuistGraph +import TuistLoaderTesting +import TuistServer +import TuistSupport +import TuistSupportTesting +import XCTest +@testable import TuistKit + +final class CloudOrganizationInviteServiceTests: TuistUnitTestCase { + private var createOrganizationInviteService: MockCreateOrganizationInviteServicing! + private var subject: CloudOrganizationInviteService! + private var configLoader: MockConfigLoader! + private var cloudURL: URL! + + override func setUp() { + super.setUp() + + createOrganizationInviteService = .init() + configLoader = MockConfigLoader() + cloudURL = URL(string: "https://test.cloud.tuist.io")! + configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + subject = CloudOrganizationInviteService( + createOrganizationInviteService: createOrganizationInviteService, + configLoader: configLoader + ) + } + + override func tearDown() { + createOrganizationInviteService = nil + configLoader = nil + cloudURL = nil + subject = nil + super.tearDown() + } + + func test_invite() async throws { + // Given + given(createOrganizationInviteService) + .createOrganizationInvite( + organizationName: .value("tuist"), + email: .value("tuist@test.io"), + serverURL: .value(cloudURL) + ) + .willReturn( + .test( + inviteeEmail: "tuist@test.io", + token: "invitation-token" + ) + ) + + // When + try await subject.run( + organizationName: "tuist", + email: "tuist@test.io", + directory: nil + ) + + // Then + XCTAssertPrinterOutputContains(""" + tuist@test.io was successfully invited to the tuist organization 🎉 + + You can also share with them the invite link directly: \(cloudURL.absoluteString)/auth/invitations/invitation-token + """) + } +} diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift new file mode 100644 index 00000000000..461b6267992 --- /dev/null +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift @@ -0,0 +1,72 @@ +import Foundation +import Mockable +import MockableTest +import TuistGraph +import TuistLoaderTesting +import TuistServer +import TuistSupportTesting +import XCTest +@testable import TuistKit + +final class CloudOrganizationListServiceTests: TuistUnitTestCase { + private var listOrganizationsService: MockListOrganizationsServicing! + private var subject: CloudOrganizationListService! + private var configLoader: MockConfigLoader! + private var cloudURL: URL! + + override func setUp() { + super.setUp() + + listOrganizationsService = .init() + configLoader = MockConfigLoader() + cloudURL = URL(string: "https://test.cloud.tuist.io")! + configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + + subject = CloudOrganizationListService( + listOrganizationsService: listOrganizationsService, + configLoader: configLoader + ) + } + + override func tearDown() { + listOrganizationsService = nil + subject = nil + + super.tearDown() + } + + func test_organization_list() async throws { + // Given + given(listOrganizationsService).listOrganizations(serverURL: .any) + .willReturn( + [ + "test-one", + "test-two", + ] + ) + + // When + try await subject.run(json: false, directory: nil) + + // Then + XCTAssertPrinterOutputContains(""" + Listing all your organizations: + • test-one + • test-two + """) + } + + func test_organization_list_when_none() async throws { + // Given + given(listOrganizationsService).listOrganizations(serverURL: .any) + .willReturn([]) + + // When + try await subject.run(json: false, directory: nil) + + // Then + XCTAssertPrinterOutputContains( + "You currently have no Cloud organizations. Create one by running `tuist cloud organization create`." + ) + } +} diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift new file mode 100644 index 00000000000..66bd66a9d23 --- /dev/null +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift @@ -0,0 +1,60 @@ +import Foundation +import Mockable +import MockableTest +import TuistGraph +import TuistLoaderTesting +import TuistServer +import TuistSupportTesting +import XCTest +@testable import TuistKit + +final class CloudOrganizationRemoveSSOServiceTests: TuistUnitTestCase { + private var updateOrganizationService: MockUpdateOrganizationServicing! + private var subject: CloudOrganizationRemoveSSOService! + private var configLoader: MockConfigLoader! + private var cloudURL: URL! + + override func setUp() { + super.setUp() + + updateOrganizationService = .init() + configLoader = MockConfigLoader() + cloudURL = URL(string: "https://test.cloud.tuist.io")! + configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + + subject = CloudOrganizationRemoveSSOService( + updateOrganizationService: updateOrganizationService, + configLoader: configLoader + ) + } + + override func tearDown() { + updateOrganizationService = nil + configLoader = nil + subject = nil + + super.tearDown() + } + + func test_organization_remove_sso() async throws { + // Given + given(updateOrganizationService) + .updateOrganization( + organizationName: .value("tuist"), + serverURL: .value(cloudURL), + ssoOrganization: .value(nil) + ) + .willReturn(.test()) + + // When + try await subject.run( + organizationName: "tuist", + directory: nil + ) + + // Then + XCTAssertPrinterOutputContains(""" + SSO for tuist was removed. + """) + } +} diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift new file mode 100644 index 00000000000..8d77765ab34 --- /dev/null +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift @@ -0,0 +1,120 @@ +import Foundation +import MockableTest +import TuistGraph +import TuistLoaderTesting +import TuistServer +import TuistSupport +import TuistSupportTesting +import XCTest +@testable import TuistKit + +final class CloudOrganizationShowServiceTests: TuistUnitTestCase { + private var getOrganizationService: MockGetOrganizationServicing! + private var subject: CloudOrganizationShowService! + private var configLoader: MockConfigLoader! + private var cloudURL: URL! + + override func setUp() { + super.setUp() + getOrganizationService = .init() + configLoader = MockConfigLoader() + cloudURL = URL(string: "https://test.cloud.tuist.io")! + configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + subject = CloudOrganizationShowService( + getOrganizationService: getOrganizationService, + configLoader: configLoader + ) + } + + override func tearDown() { + getOrganizationService = nil + configLoader = nil + cloudURL = nil + subject = nil + + super.tearDown() + } + + func test_organization_show() async throws { + // Given + given(getOrganizationService) + .getOrganization(organizationName: .any, serverURL: .any) + .willReturn( + .test( + name: "test-one", + plan: .team, + members: [ + .test( + name: "name-one", + email: "name-one@email.io", + role: .user + ), + .test( + name: "name-two", + email: "name-two@email.io", + role: .admin + ), + ], + invitations: [ + .test( + inviteeEmail: "invitee@email.io", + inviter: .test(name: "some-inviter") + ), + ] + ) + ) + + // When + try await subject.run( + organizationName: "tuist", + json: false, + directory: nil + ) + + // Then + XCTAssertPrinterOutputContains(""" + \(TerminalStyle.bold.open)Organization\(TerminalStyle.reset.open) + Name: test-one + Plan: Team + + \(TerminalStyle.bold.open)Organization members\(TerminalStyle.reset.open) (total number: 2) + username email role + name-one name-one@email.io user + name-two name-two@email.io admin + + \(TerminalStyle.bold.open)Invitations\(TerminalStyle.reset.open) (total number: 1) + inviter invitee email + some-inviter invitee@email.io + """) + } + + func test_organization_show_when_has_sso_provider() async throws { + // Given + given(getOrganizationService) + .getOrganization(organizationName: .any, serverURL: .any) + .willReturn( + .test( + name: "test-one", + plan: .team, + ssoOrganization: .google("tuist.io") + ) + ) + + // When + try await subject.run( + organizationName: "tuist", + json: false, + directory: nil + ) + + // Then + XCTAssertPrinterOutputContains( + """ + \(TerminalStyle.bold.open)Organization\(TerminalStyle.reset.open) + Name: test-one + Plan: Team + SSO: Google (tuist.io) + """ + ) + } +} diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift new file mode 100644 index 00000000000..b1603c35f21 --- /dev/null +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift @@ -0,0 +1,62 @@ +import Foundation +import Mockable +import MockableTest +import TuistGraph +import TuistLoaderTesting +import TuistServer +import TuistSupportTesting +import XCTest +@testable import TuistKit + +final class CloudOrganizationUpdateSSOServiceTests: TuistUnitTestCase { + private var updateOrganizationService: MockUpdateOrganizationServicing! + private var subject: CloudOrganizationUpdateSSOService! + private var configLoader: MockConfigLoader! + private var cloudURL: URL! + + override func setUp() { + super.setUp() + + updateOrganizationService = .init() + configLoader = MockConfigLoader() + cloudURL = URL(string: "https://test.cloud.tuist.io")! + configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + + subject = CloudOrganizationUpdateSSOService( + updateOrganizationService: updateOrganizationService, + configLoader: configLoader + ) + } + + override func tearDown() { + updateOrganizationService = nil + configLoader = nil + subject = nil + + super.tearDown() + } + + func test_organization_update_sso() async throws { + // Given + given(updateOrganizationService) + .updateOrganization( + organizationName: .value("tuist"), + serverURL: .value(cloudURL), + ssoOrganization: .value(.google("tuist.io")) + ) + .willReturn(.test()) + + // When + try await subject.run( + organizationName: "tuist", + provider: .google, + organizationId: "tuist.io", + directory: nil + ) + + // Then + XCTAssertPrinterOutputContains(""" + tuist now uses Google SSO with tuist.io. Users authenticated with the tuist.io SSO organization will automatically have access to the tuist projects. + """) + } +} diff --git a/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift new file mode 100644 index 00000000000..c30c348e708 --- /dev/null +++ b/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift @@ -0,0 +1,73 @@ +import Foundation +import MockableTest +import TuistGraph +import TuistLoaderTesting +import TuistServer +import TuistSupport +import TuistSupportTesting +import XCTest + +@testable import TuistKit + +final class CloudProjectDeleteServiceTests: TuistUnitTestCase { + private var getProjectService: MockGetProjectServicing! + private var deleteProjectService: MockDeleteProjectServicing! + private var credentialsStore: MockCloudCredentialsStoring! + private var configLoader: MockConfigLoader! + private var cloudURL: URL! + private var subject: CloudProjectDeleteService! + + override func setUp() { + super.setUp() + + getProjectService = .init() + deleteProjectService = .init() + credentialsStore = .init() + configLoader = MockConfigLoader() + cloudURL = URL(string: "https://test.cloud.tuist.io")! + configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + subject = CloudProjectDeleteService( + deleteProjectService: deleteProjectService, + getProjectService: getProjectService, + credentialsStore: credentialsStore, + configLoader: configLoader + ) + } + + override func tearDown() { + deleteProjectService = nil + getProjectService = nil + credentialsStore = nil + configLoader = nil + cloudURL = nil + subject = nil + + super.tearDown() + } + + func test_project_delete() async throws { + // Given + given(getProjectService) + .getProject( + accountName: .value("tuist"), + projectName: .value("project"), + serverURL: .value(cloudURL) + ) + .willReturn( + .test(id: 0, fullName: "tuist/tuist") + ) + given(deleteProjectService) + .deleteProject( + projectId: .value(0), + serverURL: .value(cloudURL) + ) + .willReturn(()) + + given(credentialsStore) + .get(serverURL: .value(cloudURL)) + .willReturn(.init(token: "token")) + + // When / Then + try await subject.run(projectName: "project", organizationName: "tuist", directory: nil) + } +} diff --git a/Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift new file mode 100644 index 00000000000..959ba9fd7bd --- /dev/null +++ b/Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift @@ -0,0 +1,73 @@ +import Foundation +import MockableTest +import TuistGraph +import TuistLoaderTesting +import TuistServer +import TuistSupportTesting +import XCTest +@testable import TuistKit + +final class CloudProjectListServiceTests: TuistUnitTestCase { + private var listProjectsService: MockListProjectsServicing! + private var subject: CloudProjectListService! + private var configLoader: MockConfigLoader! + private var cloudURL: URL! + + override func setUp() { + super.setUp() + listProjectsService = .init() + configLoader = MockConfigLoader() + cloudURL = URL(string: "https://test.cloud.tuist.io")! + configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + subject = CloudProjectListService( + listProjectsService: listProjectsService, + configLoader: configLoader + ) + } + + override func tearDown() { + listProjectsService = nil + configLoader = nil + cloudURL = nil + subject = nil + + super.tearDown() + } + + func test_project_list() async throws { + // Given + given(listProjectsService) + .listProjects(serverURL: .value(cloudURL)) + .willReturn( + [ + .test(id: 0, fullName: "tuist/test-one"), + .test(id: 1, fullName: "tuist/test-two"), + ] + ) + + // When + try await subject.run(json: false, directory: nil) + + // Then + XCTAssertPrinterOutputContains(""" + Listing all your projects: + • tuist/test-one + • tuist/test-two + """) + } + + func test_project_list_when_none() async throws { + // Given + given(listProjectsService) + .listProjects(serverURL: .value(cloudURL)) + .willReturn([]) + + // When + try await subject.run(json: false, directory: nil) + + // Then + XCTAssertPrinterOutputContains( + "You currently have no Cloud projects. Create one by running `tuist cloud project create`." + ) + } +} diff --git a/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift new file mode 100644 index 00000000000..8623c23e290 --- /dev/null +++ b/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift @@ -0,0 +1,52 @@ +import Foundation +import MockableTest +import TSCBasic +import TuistCore +import TuistCoreTesting +import TuistGraph +import TuistGraphTesting +import TuistLoader +import TuistLoaderTesting +import TuistServer +import TuistSupport +import XCTest + +@testable import TuistKit +@testable import TuistSupportTesting + +final class CloudSessionServiceTests: TuistUnitTestCase { + private var cloudSessionController: MockCloudSessionControlling! + private var subject: CloudSessionService! + private var configLoader: MockConfigLoader! + private var cloudURL: URL! + + override func setUp() { + super.setUp() + cloudSessionController = MockCloudSessionControlling() + configLoader = MockConfigLoader() + cloudURL = URL(string: "https://test.cloud.tuist.io")! + configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + subject = CloudSessionService( + cloudSessionController: cloudSessionController, + configLoader: configLoader + ) + } + + override func tearDown() { + cloudSessionController = nil + configLoader = nil + cloudURL = nil + subject = nil + super.tearDown() + } + + func test_printSession() throws { + // Given + given(cloudSessionController) + .printSession(serverURL: .value(cloudURL)) + .willReturn(()) + + // When / Then + try subject.printSession(directory: nil) + } +} diff --git a/Tests/TuistKitTests/CommandTracking/CommandEventFactoryTests.swift b/Tests/TuistKitTests/CommandTracking/CommandEventFactoryTests.swift index dae7ab13451..3dd551d73d9 100644 --- a/Tests/TuistKitTests/CommandTracking/CommandEventFactoryTests.swift +++ b/Tests/TuistKitTests/CommandTracking/CommandEventFactoryTests.swift @@ -1,6 +1,7 @@ import ArgumentParser import Foundation import TuistAnalytics +import TuistCore import TuistSupport import XCTest diff --git a/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift b/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift index 1c7ea14b983..7f4ffe36589 100644 --- a/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift +++ b/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift @@ -4,6 +4,7 @@ import Combine import Foundation import TuistAnalytics import TuistAsyncQueueTesting +import TuistCore import TuistSupport import XCTest @@ -71,7 +72,6 @@ final class TrackableCommandTests: TuistTestCase { func test_whenCommandFails_dispatchesEventWithExpectedInfo() async throws { // Given makeSubject(flag: false, shouldFail: true) - let expectedParams: [String: AnyCodable] = ["flag": false] // When await XCTAssertThrowsSpecific(try await subject.run(), TestCommand.TestError.commandFailed) diff --git a/Tests/TuistKitTests/Services/CleanServiceTests.swift b/Tests/TuistKitTests/Services/CleanServiceTests.swift index c5ddb6a4372..8b6aa214644 100644 --- a/Tests/TuistKitTests/Services/CleanServiceTests.swift +++ b/Tests/TuistKitTests/Services/CleanServiceTests.swift @@ -14,13 +14,13 @@ import XCTest final class CleanServiceTests: TuistUnitTestCase { private var subject: CleanService! private var rootDirectoryLocator: MockRootDirectoryLocator! - private var cacheDirectoriesProvider: MockCacheDirectoriesProvider! + private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! private var manifestFilesLocator: MockManifestFilesLocating! override func setUpWithError() throws { super.setUp() rootDirectoryLocator = MockRootDirectoryLocator() - cacheDirectoriesProvider = try MockCacheDirectoriesProvider() + cacheDirectoriesProvider = .init() manifestFilesLocator = MockManifestFilesLocating() subject = CleanService( @@ -44,7 +44,9 @@ final class CleanServiceTests: TuistUnitTestCase { let cachePaths = try createFolders(["tuist/Manifests", "tuist/ProjectDescriptionHelpers"]) let cachePath = cachePaths[0].parentDirectory.parentDirectory - cacheDirectoriesProvider.cacheDirectoryStub = cachePath + given(cacheDirectoriesProvider) + .cacheDirectory() + .willReturn(cachePath) rootDirectoryLocator.locateStub = cachePath given(manifestFilesLocator) .locatePackageManifest(at: .any) @@ -70,6 +72,11 @@ final class CleanServiceTests: TuistUnitTestCase { .appending(component: Constants.SwiftPackageManager.packageSwiftName) ) + let cachePath = localPaths[0].parentDirectory.parentDirectory + given(cacheDirectoriesProvider) + .cacheDirectory() + .willReturn(cachePath) + // When try subject.run(categories: [TuistCleanCategory.dependencies], path: nil) @@ -90,6 +97,11 @@ final class CleanServiceTests: TuistUnitTestCase { .appending(component: Constants.SwiftPackageManager.packageSwiftName) ) + let cachePath = localPaths[0].parentDirectory.parentDirectory + given(cacheDirectoriesProvider) + .cacheDirectory() + .willReturn(cachePath) + // When try subject.run(categories: [TuistCleanCategory.dependencies], path: nil) @@ -103,7 +115,9 @@ final class CleanServiceTests: TuistUnitTestCase { let cachePaths = try createFolders(["tuist/Manifests"]) let cachePath = cachePaths[0].parentDirectory.parentDirectory - cacheDirectoriesProvider.cacheDirectoryStub = cachePath + given(cacheDirectoriesProvider) + .cacheDirectory() + .willReturn(cachePath) let projectPath = try temporaryPath() rootDirectoryLocator.locateStub = projectPath diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index 6bb8bcb5d56..46a5d529a4e 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -1,4 +1,5 @@ import Foundation +import MockableTest import TSCBasic import TuistAutomation import TuistCore @@ -21,7 +22,7 @@ final class TestServiceTests: TuistUnitTestCase { private var simulatorController: MockSimulatorController! private var contentHasher: MockContentHasher! private var testsCacheTemporaryDirectory: TemporaryDirectory! - private var cacheDirectoriesProvider: MockCacheDirectoriesProvider! + private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! override func setUpWithError() throws { try super.setUpWithError() @@ -33,8 +34,12 @@ final class TestServiceTests: TuistUnitTestCase { testsCacheTemporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) generatorFactory = .init() generatorFactory.stubbedTestResult = generator - let mockCacheDirectoriesProvider = try MockCacheDirectoriesProvider() + let mockCacheDirectoriesProvider = MockCacheDirectoriesProviding() cacheDirectoriesProvider = mockCacheDirectoriesProvider + let cacheDirectoryProviderFactory = MockCacheDirectoriesProviderFactoring() + given(cacheDirectoryProviderFactory) + .cacheDirectories() + .willReturn(mockCacheDirectoriesProvider) contentHasher.hashStub = { _ in "hash" @@ -47,7 +52,7 @@ final class TestServiceTests: TuistUnitTestCase { buildGraphInspector: buildGraphInspector, simulatorController: simulatorController, contentHasher: contentHasher, - cacheDirectoryProviderFactory: MockCacheDirectoriesProviderFactory(provider: mockCacheDirectoriesProvider) + cacheDirectoryProviderFactory: cacheDirectoryProviderFactory ) } diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift new file mode 100644 index 00000000000..6bd246f3a78 --- /dev/null +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift @@ -0,0 +1,88 @@ +import MockableTest +import TuistAnalytics +import TuistCore +import TuistCoreTesting +import TuistGraph +import TuistServer +import TuistSupport +import XCTest +@testable import TuistKit +@testable import TuistSupportTesting + +final class TuistAnalyticsCloudBackendTests: TuistUnitTestCase { + private var config: Cloud! + private var createCommandEventService: MockCreateCommandEventServicing! + private var ciChecker: MockCIChecker! + private var subject: TuistAnalyticsCloudBackend! + + override func setUp() { + super.setUp() + config = Cloud.test( + url: URL(string: "https://cloud.tuist.io")!, + projectId: "tuist-org/tuist" + ) + createCommandEventService = .init() + ciChecker = .init() + subject = TuistAnalyticsCloudBackend( + config: config, + createCommandEventService: createCommandEventService, + ciChecker: ciChecker + ) + } + + override func tearDown() { + config = nil + createCommandEventService = nil + ciChecker = nil + subject = nil + super.tearDown() + } + + func test_send_when_is_not_ci() async throws { + // Given + ciChecker.isCIStub = false + let event = CommandEvent.test() + given(createCommandEventService) + .createCommandEvent( + commandEvent: .value(event), + projectId: .value(config.projectId), + serverURL: .value(config.url) + ) + .willReturn( + .test( + id: 10, + url: URL(string: "https://cloud.tuist.io/tuist-org/tuist/runs/10")! + ) + ) + + // When + try await subject.send(commandEvent: event) + + // Then + XCTAssertPrinterOutputNotContains("You can view a detailed report at: https://cloud.tuist.io/tuist-org/tuist/runs/10") + } + + func test_send_when_is_ci() async throws { + // Given + ciChecker.isCIStub = true + let event = CommandEvent.test() + given(createCommandEventService) + .createCommandEvent( + commandEvent: .value(event), + projectId: .value(config.projectId), + serverURL: .value(config.url) + ) + .willReturn( + .test( + id: 10, + url: URL(string: "https://cloud.tuist.io/tuist-org/tuist/runs/10")! + ) + ) + + // When + try await subject.send(commandEvent: event) + + // Then + XCTAssertStandardOutput(pattern: "You can view a detailed report at: https://cloud.tuist.io/tuist-org/tuist/runs/10") + } +} diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift new file mode 100644 index 00000000000..6d7bf5c96bf --- /dev/null +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift @@ -0,0 +1,82 @@ +import Mockable +import MockableTest +import TuistCore +import TuistGraph +import TuistServer +import TuistSupport + +import XCTest +@testable import TuistAnalytics +@testable import TuistCoreTesting +@testable import TuistKit +@testable import TuistSupportTesting + +final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { + private var subject: TuistAnalyticsDispatcher! + private var createCommandEventService: MockCreateCommandEventServicing! + + override func setUp() { + super.setUp() + createCommandEventService = .init() + } + + override func tearDown() { + subject = nil + createCommandEventService = nil + super.tearDown() + } + + func testDispatch_whenCloudAnalyticsIsEnabled_sendsToCloud() throws { + // Given + let projectID = "project" + let cloudURL = URL.test() + let cloud = Cloud(url: cloudURL, projectId: projectID, options: []) + let backend = TuistAnalyticsCloudBackend( + config: cloud, + createCommandEventService: createCommandEventService + ) + subject = TuistAnalyticsDispatcher( + backend: backend + ) + + given(createCommandEventService) + .createCommandEvent( + commandEvent: .matching { commandEvent in + commandEvent.name == Self.commandEvent.name + }, + projectId: .value(projectID), + serverURL: .value(cloudURL) + ) + .willReturn(.test()) + + // When + let expectation = XCTestExpectation(description: "completion is called") + try subject.dispatch(event: Self.commandEvent, completion: { expectation.fulfill() }) + + // Then + _ = XCTWaiter.wait(for: [expectation], timeout: 1.0) + } + + static var commandEvent: CommandEvent { + CommandEvent( + name: "event", + subcommand: nil, + params: [:], + commandArguments: ["event"], + durationInMs: 100, + clientId: "client", + tuistVersion: "2.0.0", + swiftVersion: "5.5", + macOSVersion: "12.0", + machineHardwareName: "arm64", + isCI: false, + status: .success + ) + } + + static func commandEventData() throws -> Data { + let encoder = JSONEncoder() + encoder.keyEncodingStrategy = .convertToSnakeCase + return try encoder.encode(Self.commandEvent) + } +} diff --git a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift index 29fcc203907..0693070a5d5 100644 --- a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift @@ -1,6 +1,8 @@ import Foundation +import MockableTest import ProjectDescription import TSCBasic +import TuistCore import struct TuistGraph.Plugins import TuistSupport import XCTest @@ -15,8 +17,8 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { private var manifestLoader = MockManifestLoader() private var projectDescriptionHelpersHasher = MockProjectDescriptionHelpersHasher() private var helpersDirectoryLocator = MockHelpersDirectoryLocator() - private var cacheDirectoriesProvider: MockCacheDirectoriesProvider! - private var cacheDirectoriesProviderFactory: MockCacheDirectoriesProviderFactory! + private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! + private var cacheDirectoriesProviderFactory: MockCacheDirectoriesProviderFactoring! private var workspaceManifests: [AbsolutePath: Workspace] = [:] private var projectManifests: [AbsolutePath: Project] = [:] private var configManifests: [AbsolutePath: Config] = [:] @@ -32,10 +34,15 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { super.setUp() do { - cacheDirectoriesProvider = try MockCacheDirectoriesProvider() + cacheDirectoriesProvider = .init() cacheDirectory = try temporaryPath().appending(components: "tuist", "Cache", "Manifests") - cacheDirectoriesProviderFactory = MockCacheDirectoriesProviderFactory(provider: cacheDirectoriesProvider) - cacheDirectoriesProvider.tuistCacheDirectoryStub = cacheDirectory.parentDirectory + cacheDirectoriesProviderFactory = .init() + given(cacheDirectoriesProviderFactory) + .cacheDirectories() + .willReturn(cacheDirectoriesProvider) + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .value(.manifests)) + .willReturn(cacheDirectory) } catch { XCTFail("Failed to create temporary directory") } diff --git a/Tests/TuistPluginTests/PluginServiceTests.swift b/Tests/TuistPluginTests/PluginServiceTests.swift index f006a8afcdf..41c353ab41f 100644 --- a/Tests/TuistPluginTests/PluginServiceTests.swift +++ b/Tests/TuistPluginTests/PluginServiceTests.swift @@ -20,8 +20,8 @@ final class PluginServiceTests: TuistUnitTestCase { private var templatesDirectoryLocator: MockTemplatesDirectoryLocator! private var gitHandler: MockGitHandler! private var subject: PluginService! - private var cacheDirectoriesProvider: MockCacheDirectoriesProvider! - private var cacheDirectoryProviderFactory: MockCacheDirectoriesProviderFactory! + private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! + private var cacheDirectoryProviderFactory: MockCacheDirectoriesProviderFactoring! private var fileUnarchiver: MockFileUnarchiving! private var fileClient: MockFileClient! @@ -30,11 +30,15 @@ final class PluginServiceTests: TuistUnitTestCase { manifestLoader = MockManifestLoader() templatesDirectoryLocator = MockTemplatesDirectoryLocator() gitHandler = MockGitHandler() - let mockCacheDirectoriesProvider = try! MockCacheDirectoriesProvider() + let mockCacheDirectoriesProvider = MockCacheDirectoriesProviding() cacheDirectoriesProvider = mockCacheDirectoriesProvider - cacheDirectoriesProvider.cacheDirectoryStub = try! temporaryPath() - cacheDirectoryProviderFactory = MockCacheDirectoriesProviderFactory(provider: cacheDirectoriesProvider) - cacheDirectoryProviderFactory.cacheDirectoriesStub = { mockCacheDirectoriesProvider } + given(cacheDirectoriesProvider) + .cacheDirectory() + .willReturn(try! temporaryPath()) + cacheDirectoryProviderFactory = .init() + given(cacheDirectoryProviderFactory) + .cacheDirectories() + .willReturn(cacheDirectoriesProvider) fileUnarchiver = MockFileUnarchiving() let fileArchivingFactory = MockFileArchivingFactorying() given(fileArchivingFactory).makeFileUnarchiver(for: .any).willReturn(fileUnarchiver) @@ -80,6 +84,9 @@ final class PluginServiceTests: TuistUnitTestCase { .git(url: pluginCGitURL, gitReference: .tag(pluginCGitTag), directory: "Sub/Subfolder", releaseUrl: nil), ] ) + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .any) + .willReturn(try temporaryPath()) let pluginADirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(component: pluginAFingerprint) let pluginBDirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) @@ -136,6 +143,9 @@ final class PluginServiceTests: TuistUnitTestCase { invokedCheckoutID = id invokedCheckoutPath = path } + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .any) + .willReturn(try temporaryPath()) // When _ = try await subject.fetchRemotePlugins(using: config) @@ -177,6 +187,9 @@ final class PluginServiceTests: TuistUnitTestCase { invokedCheckoutID = id invokedCheckoutPath = path } + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .any) + .willReturn(try temporaryPath()) // When _ = try await subject.fetchRemotePlugins(using: config) @@ -207,10 +220,13 @@ final class PluginServiceTests: TuistUnitTestCase { ] ) + let temporaryDirectory = try temporaryPath() + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .any) + .willReturn(temporaryDirectory) + let pluginDirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(component: pluginFingerprint) - let temporaryDirectory = try temporaryPath() - cacheDirectoriesProvider.cacheDirectoryStub = temporaryDirectory try fileHandler.touch( pluginDirectory .appending(components: PluginServiceConstants.repository, Constants.SwiftPackageManager.packageSwiftName) @@ -256,6 +272,11 @@ final class PluginServiceTests: TuistUnitTestCase { let pluginGitUrl = "https://url/to/repo.git" let pluginGitReference = "1.0.0" let pluginFingerprint = "\(pluginGitUrl)-\(pluginGitReference)".md5 + + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .any) + .willReturn(try temporaryPath()) + let cachedPluginPath = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) let pluginName = "TestPlugin" @@ -278,6 +299,9 @@ final class PluginServiceTests: TuistUnitTestCase { releaseUrl: nil ), ]) + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .any) + .willReturn(try temporaryPath()) // When let plugins = try await subject.loadPlugins(using: config) @@ -322,6 +346,9 @@ final class PluginServiceTests: TuistUnitTestCase { let pluginGitUrl = "https://url/to/repo.git" let pluginGitReference = "1.0.0" let pluginFingerprint = "\(pluginGitUrl)-\(pluginGitReference)".md5 + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .any) + .willReturn(try temporaryPath()) let cachedPluginPath = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) let pluginName = "TestPlugin" @@ -392,6 +419,9 @@ final class PluginServiceTests: TuistUnitTestCase { let pluginGitUrl = "https://url/to/repo.git" let pluginGitReference = "1.0.0" let pluginFingerprint = "\(pluginGitUrl)-\(pluginGitReference)".md5 + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .any) + .willReturn(try temporaryPath()) let cachedPluginPath = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) let pluginName = "TestPlugin" diff --git a/Tests/TuistServerTests/Client/CloudClientOutputWarningsMiddlewareTests.swift b/Tests/TuistServerTests/Client/CloudClientOutputWarningsMiddlewareTests.swift new file mode 100644 index 00000000000..a65fd9b85b3 --- /dev/null +++ b/Tests/TuistServerTests/Client/CloudClientOutputWarningsMiddlewareTests.swift @@ -0,0 +1,71 @@ +import Foundation +import OpenAPIRuntime +import TuistSupport +import XCTest +@testable import TuistServer +@testable import TuistSupportTesting + +private class MockWarningController: WarningControlling { + var warnings: [String] = [] + func append(warning: String) { + warnings.append(warning) + } + + func flush() { + warnings.removeAll() + } +} + +final class CloudClientOutputWarningsMiddlewareTests: TuistUnitTestCase { + fileprivate var warningController: MockWarningController! + var subject: CloudClientOutputWarningsMiddleware! + + override func setUp() { + super.setUp() + warningController = MockWarningController() + subject = CloudClientOutputWarningsMiddleware(warningController: warningController) + } + + override func tearDown() { + warningController = nil + subject = nil + super.tearDown() + } + + func test_outputsWarnings_whenTheHeaderIsPresent() async throws { + // Given + let url = URL(string: "https://test.tuist.io")! + let warnings = ["foo", "bar"] + let base64edJsonWarnings = (try JSONSerialization.data(withJSONObject: warnings)).base64EncodedString() + let request = Request(path: "/", method: .get) + let response = Response( + statusCode: 200, + headerFields: [.init(name: "x-tuist-cloud-warnings", value: base64edJsonWarnings)] + ) + + // When + let gotResponse = try await subject.intercept(request, baseURL: url, operationID: "123") { _, _ in + response + } + + // Then + XCTAssertEqual(gotResponse, response) + XCTAssertEqual(warningController.warnings, warnings) + } + + func test_doesntOutputAnyWarning_whenTheHeaderIsAbsent() async throws { + // Given + let url = URL(string: "https://test.tuist.io")! + let request = Request(path: "/", method: .get) + let response = Response(statusCode: 200) + + // When + let gotResponse = try await subject.intercept(request, baseURL: url, operationID: "123") { _, _ in + response + } + + // Then + XCTAssertEqual(gotResponse, response) + XCTAssertEqual(warningController.warnings, []) + } +} diff --git a/Tests/TuistServerTests/Session/CloudSessionControllerTests.swift b/Tests/TuistServerTests/Session/CloudSessionControllerTests.swift new file mode 100644 index 00000000000..3f8bc7a408e --- /dev/null +++ b/Tests/TuistServerTests/Session/CloudSessionControllerTests.swift @@ -0,0 +1,128 @@ +import Foundation +import Mockable +import MockableTest +import TSCBasic +import TuistSupport +import XCTest + +@testable import TuistServer +@testable import TuistSupportTesting + +final class CloudSessionControllerTests: TuistUnitTestCase { + private var credentialsStore: MockCloudCredentialsStoring! + private var ciChecker: MockCIChecker! + private var opener: MockOpener! + private var serverURL: URL! + private var getAuthTokenService: MockGetAuthTokenServicing! + private var uniqueIDGenerator: MockUniqueIDGenerating! + private var cloudAuthenticationController: MockCloudAuthenticationControlling! + private var subject: CloudSessionController! + + override func setUp() { + super.setUp() + credentialsStore = .init() + ciChecker = MockCIChecker() + opener = MockOpener() + serverURL = URL.test() + getAuthTokenService = MockGetAuthTokenServicing() + uniqueIDGenerator = MockUniqueIDGenerating() + cloudAuthenticationController = MockCloudAuthenticationControlling() + subject = CloudSessionController( + credentialsStore: credentialsStore, + ciChecker: ciChecker, + opener: opener, + getAuthTokenService: getAuthTokenService, + uniqueIDGenerator: uniqueIDGenerator, + cloudAuthenticationController: cloudAuthenticationController + ) + } + + override func tearDown() { + credentialsStore = nil + ciChecker = nil + opener = nil + serverURL = nil + uniqueIDGenerator = nil + cloudAuthenticationController = nil + subject = nil + super.tearDown() + } + + func test_authenticate_when_tokenAndAccountParametersAreIncluded() async throws { + // Given + given(getAuthTokenService).getAuthToken(serverURL: .any, deviceCode: .any).willReturn("token") + given(uniqueIDGenerator).uniqueID().willReturn("id") + given(credentialsStore) + .read(serverURL: .value(serverURL)) + .willReturn(CloudCredentials(token: "token")) + + // When + try await subject.authenticate(serverURL: serverURL) + + // Then + XCTAssertPrinterOutputContains(""" + Opening \(authURL().absoluteString) to start the authentication flow + Press CTRL + C once to cancel the process. + Credentials stored successfully + """) + } + + func test_printSession_when_userToken() throws { + // When + given(cloudAuthenticationController).authenticationToken(serverURL: .value(serverURL)).willReturn(.user("token")) + try subject.printSession(serverURL: serverURL) + + // Then + XCTAssertPrinterOutputContains(""" + Requests against \(serverURL.absoluteString) will be authenticated as a user using the following token: + token + """) + } + + func test_printSession_when_projectToken() throws { + // When + given(cloudAuthenticationController).authenticationToken(serverURL: .value(serverURL)).willReturn(.project("token")) + try subject.printSession(serverURL: serverURL) + + // Then + XCTAssertPrinterOutputContains(""" + Requests against \(serverURL.absoluteString) will be authenticated as a project using the following token: + token + """) + } + + func test_printSession_when_credentialsDontExist() throws { + // Given + given(cloudAuthenticationController).authenticationToken(serverURL: .value(serverURL)).willReturn(nil) + + // When + try subject.printSession(serverURL: serverURL) + + // Then + XCTAssertPrinterOutputContains(""" + There are no sessions for the server with URL \(serverURL.absoluteString) + """) + } + + func test_logout_deletesTheCredentials() throws { + // Given + let credentials = CloudCredentials(token: "token") + try credentialsStore.store(credentials: credentials, serverURL: serverURL) + + // When + try subject.logout(serverURL: serverURL) + + // Then + XCTAssertPrinterOutputContains(""" + Removing session for server with URL \(serverURL.absoluteString) + Session deleted successfully + """) + } + + fileprivate func authURL() -> URL { + var components = URLComponents(url: serverURL, resolvingAgainstBaseURL: false)! + components.path = "/auth/cli/\(uniqueIDGenerator.uniqueID())" + components.queryItems = nil + return components.url! + } +} diff --git a/Tests/TuistServerTests/Utilities/CloudCredentialsStoreTests.swift b/Tests/TuistServerTests/Utilities/CloudCredentialsStoreTests.swift new file mode 100644 index 00000000000..cfd36c5ac40 --- /dev/null +++ b/Tests/TuistServerTests/Utilities/CloudCredentialsStoreTests.swift @@ -0,0 +1,36 @@ +import Foundation +import TuistSupport +import XCTest + +@testable import TuistServer +@testable import TuistSupportTesting + +final class CloudCredentialsStoreTests: TuistUnitTestCase { + var subject: CloudCredentialsStore! + + override func setUp() { + super.setUp() + } + + override func tearDown() { + subject = nil + super.tearDown() + } + + func test_crud() throws { + // Given + let temporaryDirectory = try temporaryPath() + let subject = CloudCredentialsStore( + fileHandler: FileHandler.shared, + configDirectory: temporaryDirectory + ) + let credentials = CloudCredentials(token: "token") + let serverURL = URL(string: "https://tuist.io")! + + // When/Then + try subject.store(credentials: credentials, serverURL: serverURL) + XCTAssertEqual(try subject.read(serverURL: serverURL), credentials) + try subject.delete(serverURL: serverURL) + XCTAssertEqual(try subject.read(serverURL: serverURL), nil) + } +} diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index 0667b29588e..8faf4a156d3 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -21,6 +21,7 @@ public enum Module: String, CaseIterable { case migration = "TuistMigration" case dependencies = "TuistDependencies" case automation = "TuistAutomation" + case app = "TuistServer" public var isRunnable: Bool { switch self { @@ -127,7 +128,7 @@ public enum Module: String, CaseIterable { public var testingTargetName: String? { switch self { case .tuist, .tuistBenchmark, .tuistFixtureGenerator, .kit, .projectAutomation, .projectDescription, .analytics, - .dependencies, .acceptanceTesting: + .dependencies, .acceptanceTesting, .app: return nil default: return "\(rawValue)Testing" @@ -147,7 +148,7 @@ public enum Module: String, CaseIterable { public var integrationTestsTargetName: String? { switch self { case .tuist, .tuistBenchmark, .tuistFixtureGenerator, .projectAutomation, .projectDescription, .graph, .asyncQueue, - .plugin, .analytics, .dependencies, .acceptanceTesting: + .plugin, .analytics, .dependencies, .acceptanceTesting, .app: return nil default: return "\(rawValue)IntegrationTests" @@ -226,6 +227,7 @@ public enum Module: String, CaseIterable { .target(name: Module.support.targetName), .target(name: Module.generator.targetName), .target(name: Module.automation.targetName), + .target(name: Module.app.targetName), .target(name: Module.projectDescription.targetName), .target(name: Module.projectAutomation.targetName), .target(name: Module.loader.targetName), @@ -327,6 +329,13 @@ public enum Module: String, CaseIterable { .external(name: "XcodeProj"), .external(name: "XcbeautifyLib"), ] + case .app: + [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), + .external(name: "OpenAPIRuntime"), + .external(name: "OpenAPIURLSession"), + ] } if self != .projectDescription, self != .projectAutomation { dependencies.append(contentsOf: sharedDependencies) @@ -443,6 +452,11 @@ public enum Module: String, CaseIterable { .target(name: Module.core.testingTargetName!), .target(name: Module.graph.testingTargetName!), ] + case .app: + [ + .target(name: Module.support.testingTargetName!), + .target(name: Module.core.testingTargetName!), + ] } dependencies = dependencies + sharedDependencies + [.target(name: targetName), .external(name: "MockableTest")] if let testingTargetName { @@ -528,6 +542,8 @@ public enum Module: String, CaseIterable { .target(name: Module.support.testingTargetName!), .target(name: Module.graph.testingTargetName!), ] + case .app: + [] } return dependencies + sharedDependencies + [.target(name: targetName)] } @@ -600,6 +616,8 @@ public enum Module: String, CaseIterable { .target(name: Module.support.testingTargetName!), .target(name: Module.graph.testingTargetName!), ] + case .app: + [] } dependencies.append(contentsOf: sharedDependencies) dependencies.append(.target(name: targetName)) diff --git a/docs/docs/guide/project/dynamic-configuration.md b/docs/docs/guide/project/dynamic-configuration.md index 39ef6a27cec..4619b2f80c2 100644 --- a/docs/docs/guide/project/dynamic-configuration.md +++ b/docs/docs/guide/project/dynamic-configuration.md @@ -46,7 +46,7 @@ You can also retrieve the string or boolean `Environment` variable using either ::: code-group ```swift [String] -Environment.appName.getString(default: "TuistApp") +Environment.appName.getString(default: "TuistServer") ``` ```swift [Boolean] diff --git a/fixtures/multiplatform_app_with_extension/App/Sources/TuistApp.swift b/fixtures/multiplatform_app_with_extension/App/Sources/TuistApp.swift index 7989b1df37a..8f571923807 100644 --- a/fixtures/multiplatform_app_with_extension/App/Sources/TuistApp.swift +++ b/fixtures/multiplatform_app_with_extension/App/Sources/TuistApp.swift @@ -1,7 +1,7 @@ import SwiftUI @main -struct TuistApp: App { +struct TuistServer: App { var body: some Scene { WindowGroup { Text("Tuist is great") diff --git a/fixtures/multiplatform_app_with_sdk/App/AppDelegate.swift b/fixtures/multiplatform_app_with_sdk/App/AppDelegate.swift index 7989b1df37a..8f571923807 100644 --- a/fixtures/multiplatform_app_with_sdk/App/AppDelegate.swift +++ b/fixtures/multiplatform_app_with_sdk/App/AppDelegate.swift @@ -1,7 +1,7 @@ import SwiftUI @main -struct TuistApp: App { +struct TuistServer: App { var body: some Scene { WindowGroup { Text("Tuist is great") diff --git "a/fixtures/multiplatform_\302\265Feature_unit_tests_with_explicit_dependencies/Modules/ModuleA/Example/Sources/AppDelegate.swift" "b/fixtures/multiplatform_\302\265Feature_unit_tests_with_explicit_dependencies/Modules/ModuleA/Example/Sources/AppDelegate.swift" index aca655a705e..f94821a6efc 100644 --- "a/fixtures/multiplatform_\302\265Feature_unit_tests_with_explicit_dependencies/Modules/ModuleA/Example/Sources/AppDelegate.swift" +++ "b/fixtures/multiplatform_\302\265Feature_unit_tests_with_explicit_dependencies/Modules/ModuleA/Example/Sources/AppDelegate.swift" @@ -2,7 +2,7 @@ import ModuleAImplementation import SwiftUI @main -struct TuistApp: App { +struct TuistServer: App { var body: some Scene { WindowGroup { Text("Tuist is great") From 6b88ee01163ee85b90ba0c4176a2d022e5dec4aa Mon Sep 17 00:00:00 2001 From: Eduard Miniakhmetov Date: Tue, 28 May 2024 09:26:46 +0300 Subject: [PATCH 308/509] Add SM Lab logo to the README (#6333) --- README.md | 7 +++++++ assets/companies/smlab.svg | 17 +++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 assets/companies/smlab.svg diff --git a/README.md b/README.md index 9385166828d..e245f82cbd3 100644 --- a/README.md +++ b/README.md @@ -284,6 +284,13 @@ The financial sustainability of the project is possible thanks to the ongoing co + + + + smlab_logo + + + diff --git a/assets/companies/smlab.svg b/assets/companies/smlab.svg new file mode 100644 index 00000000000..fe04267bdd0 --- /dev/null +++ b/assets/companies/smlab.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + From 545b5c80737e1fd34633df68746f07dfad5ad7ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 28 May 2024 12:44:26 +0200 Subject: [PATCH 309/509] Migrate all the Mise tasks off the `.mise.toml` file (#6336) * Remove unused tasks * Migrate tuist:generate * Migrate tuist:build * Migrate tuist:test * Migrate Run * Rename up to install * Move the remaining tasks from the toml * Move the last tasks and delete the 'make' directory --- .mise.toml | 30 +--------------- .mise/tasks/.gitignore | 1 + .mise/tasks/benchmark/build | 5 +++ .../benchmark.sh => .mise/tasks/benchmark/run | 20 +++++------ .../release/bundle.sh => .mise/tasks/bundle | 30 ++++++++-------- .../workspace/clean.sh => .mise/tasks/clean | 8 ++--- .mise/tasks/fixturegenerator/build | 5 +++ .../tasks/fixturegenerator/run | 8 ++--- .mise/tasks/{up => install} | 0 .mise/tasks/lint | 6 ++++ .mise/tasks/lint-fix | 6 ++++ .mise/tasks/spm/tuist/build | 9 +++++ .mise/tasks/spm/tuist/edit | 7 ++++ .mise/tasks/spm/tuist/generate | 8 +++++ .mise/tasks/spm/tuist/run | 7 ++++ .mise/tasks/spm/tuist/test | 8 +++++ .../utilities/derived_data_path.sh | 3 -- {make => .mise}/utilities/setup.sh | 0 {make => .mise}/utilities/xcode_path.sh | 5 +-- codemagic.yaml | 7 ++-- make/tasks/github/build-docc.sh | 35 ------------------- make/tasks/github/cancel-workflows.sh | 29 --------------- make/tasks/tuist/build.sh | 10 ------ make/tasks/tuist/edit.sh | 9 ----- make/tasks/tuist/generate.sh | 10 ------ make/tasks/tuist/run.sh | 9 ----- make/tasks/tuist/test.sh | 10 ------ make/tasks/workspace/build-with-spm.sh | 9 ----- make/tasks/workspace/build/tuistbenchmark.sh | 8 ----- .../workspace/build/tuistfixturegenerator.sh | 8 ----- make/tasks/workspace/lint-fix.sh | 9 ----- make/tasks/workspace/lint.sh | 9 ----- make/utilities/root_dir.sh | 7 ---- 33 files changed, 97 insertions(+), 238 deletions(-) create mode 100644 .mise/tasks/.gitignore create mode 100755 .mise/tasks/benchmark/build rename make/tasks/workspace/benchmark.sh => .mise/tasks/benchmark/run (64%) rename make/tasks/workspace/release/bundle.sh => .mise/tasks/bundle (86%) rename make/tasks/workspace/clean.sh => .mise/tasks/clean (67%) create mode 100755 .mise/tasks/fixturegenerator/build rename make/tasks/workspace/generate-fixture.sh => .mise/tasks/fixturegenerator/run (70%) rename .mise/tasks/{up => install} (100%) create mode 100755 .mise/tasks/lint create mode 100755 .mise/tasks/lint-fix create mode 100755 .mise/tasks/spm/tuist/build create mode 100755 .mise/tasks/spm/tuist/edit create mode 100755 .mise/tasks/spm/tuist/generate create mode 100755 .mise/tasks/spm/tuist/run create mode 100755 .mise/tasks/spm/tuist/test rename {make => .mise}/utilities/derived_data_path.sh (70%) rename {make => .mise}/utilities/setup.sh (100%) rename {make => .mise}/utilities/xcode_path.sh (89%) delete mode 100755 make/tasks/github/build-docc.sh delete mode 100755 make/tasks/github/cancel-workflows.sh delete mode 100755 make/tasks/tuist/build.sh delete mode 100755 make/tasks/tuist/edit.sh delete mode 100755 make/tasks/tuist/generate.sh delete mode 100755 make/tasks/tuist/run.sh delete mode 100755 make/tasks/tuist/test.sh delete mode 100755 make/tasks/workspace/build-with-spm.sh delete mode 100755 make/tasks/workspace/build/tuistbenchmark.sh delete mode 100755 make/tasks/workspace/build/tuistfixturegenerator.sh delete mode 100755 make/tasks/workspace/lint-fix.sh delete mode 100755 make/tasks/workspace/lint.sh delete mode 100755 make/utilities/root_dir.sh diff --git a/.mise.toml b/.mise.toml index bf39ce03361..3751a08d49b 100644 --- a/.mise.toml +++ b/.mise.toml @@ -8,32 +8,4 @@ sourcedocs = "2.0.1" [plugins] python = 'https://github.com/asdf-community/asdf-tuist' -sourcedocs = "https://github.com/tuist/asdf-sourcedocs.git" - -[tasks."tuist:edit"] -description = "Edit the project using Tuist" -run = "./make/tasks/tuist/edit.sh" - -[tasks."tuist:generate"] -description = "Generate the project using Tuist" -run = "./make/tasks/tuist/generate.sh" - -[tasks."tuist:build"] -description = "Build the project using Tuist" -run = "./make/tasks/tuist/build.sh" - -[tasks."tuist:test"] -description = "Test the project using Tuist" -run = "./make/tasks/tuist/test.sh" - -[tasks."tuist:run"] -description = "Run the project using Tuist" -run = "./make/tasks/tuist/run.sh" - -[tasks."lint"] -description = "Lint the workspace" -run = "./make/tasks/workspace/lint.sh" - -[tasks."lint:fix"] -description = "Lint the workspace fixing the issues" -run = "./make/tasks/workspace/lint-fix.sh" +sourcedocs = "https://github.com/tuist/asdf-sourcedocs.git" \ No newline at end of file diff --git a/.mise/tasks/.gitignore b/.mise/tasks/.gitignore new file mode 100644 index 00000000000..c917344d8d2 --- /dev/null +++ b/.mise/tasks/.gitignore @@ -0,0 +1 @@ +!fixture/ \ No newline at end of file diff --git a/.mise/tasks/benchmark/build b/.mise/tasks/benchmark/build new file mode 100755 index 00000000000..c30415c4a7b --- /dev/null +++ b/.mise/tasks/benchmark/build @@ -0,0 +1,5 @@ +#!/bin/bash +# mise description="Build the 'tuistbenchmark' tool" +set -euo pipefail + +swift build --package-path $MISE_PROJECT_ROOT --target tuistbenchmark $@ \ No newline at end of file diff --git a/make/tasks/workspace/benchmark.sh b/.mise/tasks/benchmark/run similarity index 64% rename from make/tasks/workspace/benchmark.sh rename to .mise/tasks/benchmark/run index 730e1c73446..82357cf75d1 100755 --- a/make/tasks/workspace/benchmark.sh +++ b/.mise/tasks/benchmark/run @@ -1,11 +1,9 @@ #!/bin/bash - +# mise description="Run the 'tuistbenchmark' tool" set -euo pipefail -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) -FIXTURES_DIRECTORY=$ROOT_DIR/fixtures -source $ROOT_DIR/make/utilities/setup.sh +FIXTURES_DIRECTORY=$MISE_PROJECT_ROOT/fixtures +source $MISE_PROJECT_ROOT/.mise/utilities/setup.sh temp_dir=$(mktemp -d) @@ -17,15 +15,15 @@ cleanup() { } echo "$(format_section "Building the fixture generator and benchmark tools")" -swift build --package-path $ROOT_DIR --product tuistfixturegenerator -c release -swift build --package-path $ROOT_DIR --product tuistbenchmark -c release +swift build --package-path $MISE_PROJECT_ROOT --product tuistfixturegenerator -c release +swift build --package-path $MISE_PROJECT_ROOT --product tuistbenchmark -c release echo "$(format_section "Generating a Tuist project with 50 projects")" DIRECTORY_50_PROJECTS=$temp_dir/50_projects -$ROOT_DIR/.build/release/tuistfixturegenerator generate --path $DIRECTORY_50_PROJECTS --projects 50 +$MISE_PROJECT_ROOT/.build/release/tuistfixturegenerator generate --path $DIRECTORY_50_PROJECTS --projects 50 echo "$(format_section "Generating a Tuist project with 2 projects and 2000 sources")" DIRECTORY_2000_SOURCES=$temp_dir/50_projects -$ROOT_DIR/.build/release/tuistfixturegenerator generate --path $DIRECTORY_2000_SOURCES --projects 2 --sources 2000 +$MISE_PROJECT_ROOT/.build/release/tuistfixturegenerator generate --path $DIRECTORY_2000_SOURCES --projects 2 --sources 2000 FIXTURES_JSON_PATH=$temp_dir/fixtures.json FIXTURES_LIST=($DIRECTORY_50_PROJECTS $DIRECTORY_2000_SOURCES $FIXTURES_DIRECTORY/ios_app_with_static_frameworks $FIXTURES_DIRECTORY/ios_app_with_framework_and_resources $FIXTURES_DIRECTORY/ios_app_with_transitive_framework $FIXTURES_DIRECTORY/ios_app_with_xcframeworks) @@ -36,8 +34,8 @@ FIXTURES_JSON=$(jq -n --argjson arr "$(printf '%s\n' "${FIXTURES_LIST[@]}" | jq echo $FIXTURES_JSON > $FIXTURES_JSON_PATH echo "$(format_section "Building tuist")" -swift build --package-path $ROOT_DIR --product tuist -c release -swift build --package-path $ROOT_DIR --product ProjectDescription -c release +swift build --package-path $MISE_PROJECT_ROOT --product tuist -c release +swift build --package-path $MISE_PROJECT_ROOT --product ProjectDescription -c release echo "$(format_section "Benchmarking")" $ROOT_DIR/.build/release/tuistbenchmark benchmark -b $ROOT_DIR/.build/release/tuist --fixture-list $FIXTURES_JSON_PATH --format markdown \ No newline at end of file diff --git a/make/tasks/workspace/release/bundle.sh b/.mise/tasks/bundle similarity index 86% rename from make/tasks/workspace/release/bundle.sh rename to .mise/tasks/bundle index 427f96e7d6c..7604d8b45eb 100755 --- a/make/tasks/workspace/release/bundle.sh +++ b/.mise/tasks/bundle @@ -1,19 +1,17 @@ #!/bin/bash - +# mise description="Bundles Tuist and outputs it along with its dynamic frameworks into the /build directory" set -e -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../../utilities/root_dir.sh) -source $ROOT_DIR/make/utilities/setup.sh -XCODE_PATH_SCRIPT_PATH=$SCRIPT_DIR/../../../utilities/xcode_path.sh -BUILD_DIRECTORY=$ROOT_DIR/build +source $MISE_PROJECT_ROOT/.mise/utilities/setup.sh +XCODE_PATH_SCRIPT_PATH=$MISE_PROJECT_ROOT/.mise/utilities/xcode_path.sh +BUILD_DIRECTORY=$MISE_PROJECT_ROOT/build # Xcode 15 has a bug that causes the /var/folders... temporary directory, which is a symlink to # /private/var/folders to crash Xcode. TMP_DIR=/private$(mktemp -d) trap "rm -rf $TMP_DIR" EXIT # Ensures it gets deleted -XCODE_VERSION=$(cat $ROOT_DIR/.xcode-version) -LIBRARIES_XCODE_VERSION=$(cat $ROOT_DIR/.xcode-version-libraries) -BUILD_DIR=$ROOT_DIR/build +XCODE_VERSION=$(cat $MISE_PROJECT_ROOT/.xcode-version) +LIBRARIES_XCODE_VERSION=$(cat $MISE_PROJECT_ROOT/.xcode-version-libraries) +BUILD_DIR=$MISE_PROJECT_ROOT/build echo "$(format_section "Building release into $BUILD_DIRECTORY")" @@ -23,14 +21,14 @@ XCODE_LIBRARIES_PATH=$($XCODE_PATH_SCRIPT_PATH --version $LIBRARIES_XCODE_VERSIO echo "Static executables will be built with $XCODE_PATH" echo "Dynamic bundles will be built with $XCODE_LIBRARIES_PATH" -rm -rf $ROOT_DIR/Tuist.xcodeproj -rm -rf $ROOT_DIR/Tuist.xcworkspace +rm -rf $MISE_PROJECT_ROOT/Tuist.xcodeproj +rm -rf $MISE_PROJECT_ROOT/Tuist.xcworkspace rm -rf $BUILD_DIRECTORY mkdir -p $BUILD_DIRECTORY build_fat_release_library() { ( - cd $ROOT_DIR || exit 1 + cd $MISE_PROJECT_ROOT || exit 1 DEVELOPER_DIR=$XCODE_LIBRARIES_PATH xcrun xcodebuild -resolvePackageDependencies DEVELOPER_DIR=$XCODE_LIBRARIES_PATH xcrun xcodebuild -scheme $1 -configuration Release -destination platform=macosx BUILD_LIBRARY_FOR_DISTRIBUTION=YES ARCHS='arm64 x86_64' BUILD_DIR=$TMP_DIR clean build @@ -46,7 +44,7 @@ build_fat_release_library() { build_xcframework_library() { ( - cd $ROOT_DIR || exit 1 + cd $MISE_PROJECT_ROOT || exit 1 DEVELOPER_DIR=$XCODE_LIBRARIES_PATH xcrun xcodebuild -resolvePackageDependencies DEVELOPER_DIR=$XCODE_LIBRARIES_PATH xcrun xcodebuild -scheme $1 -configuration Release -destination platform=macosx BUILD_LIBRARY_FOR_DISTRIBUTION=YES ARCHS='arm64 x86_64' BUILD_DIR=$TMP_DIR clean build @@ -59,7 +57,7 @@ build_xcframework_library() { build_fat_release_binary() { ( - cd $ROOT_DIR || exit 1 + cd $MISE_PROJECT_ROOT || exit 1 ARM64_TARGET=arm64-apple-macosx X86_64_TARGET=x86_64-apple-macosx @@ -97,12 +95,12 @@ echo "$(format_subsection "Building ProjectAutomation framework")" build_xcframework_library "ProjectAutomation" echo "$(format_subsection "Building tuist executable")" -build_fat_release_binary "tuist" $ROOT_DIR $BUILD_DIRECTORY +build_fat_release_binary "tuist" $MISE_PROJECT_ROOT $BUILD_DIRECTORY echo "$(format_section "Copying assets")" echo "$(format_subsection "Copying Tuist's templates")" -cp -r $ROOT_DIR/Templates $BUILD_DIRECTORY/Templates +cp -r $MISE_PROJECT_ROOT/Templates $BUILD_DIRECTORY/Templates echo "$(format_subsection "Copy Swift libraries into the Tuist binary")" swift stdlib-tool --copy --scan-executable $BUILD_DIRECTORY/tuist --platform macosx --destination $BUILD_DIRECTORY diff --git a/make/tasks/workspace/clean.sh b/.mise/tasks/clean similarity index 67% rename from make/tasks/workspace/clean.sh rename to .mise/tasks/clean index 366eb4b3f4a..6bd7017bd72 100755 --- a/make/tasks/workspace/clean.sh +++ b/.mise/tasks/clean @@ -1,12 +1,10 @@ #!/bin/bash - +# mise description="Cleans SPM's .build directory and Tuist-** derived data directories" set -euo pipefail -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) -DERIVED_DATA_PATH=$($ROOT_DIR/make/utilities/derived_data_path.sh) +DERIVED_DATA_PATH=$($MISE_PROJECT_ROOT/.mise/utilities/derived_data_path.sh) -rm -rf $ROOT_DIR/.build +rm -rf $MISE_PROJECT_ROOT/.build for dir in "$DERIVED_DATA_PATH"tuist-*; do # Check if it is a directory before deleting if [[ -d "$dir" ]]; then diff --git a/.mise/tasks/fixturegenerator/build b/.mise/tasks/fixturegenerator/build new file mode 100755 index 00000000000..a104b8e9d1a --- /dev/null +++ b/.mise/tasks/fixturegenerator/build @@ -0,0 +1,5 @@ +#!/bin/bash +# mise description="Build the 'tuistfixturegenerator' tool" +set -euo pipefail + +swift build --package-path $MISE_PROJECT_ROOT --target tuistfixturegenerator $@ \ No newline at end of file diff --git a/make/tasks/workspace/generate-fixture.sh b/.mise/tasks/fixturegenerator/run similarity index 70% rename from make/tasks/workspace/generate-fixture.sh rename to .mise/tasks/fixturegenerator/run index f285f127909..450e98a7d94 100755 --- a/make/tasks/workspace/generate-fixture.sh +++ b/.mise/tasks/fixturegenerator/run @@ -1,10 +1,8 @@ #!/bin/bash - +# mise description="Run the 'tuistfixturegenerator' tool" set -euo pipefail -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) -source $ROOT_DIR/make/utilities/setup.sh +source $MISE_PROJECT_ROOT/.mise/utilities/setup.sh path=$(pwd) projects="" @@ -39,4 +37,4 @@ echo "Projects: $projects" echo "Targets: $targets" echo "Sources: $sources" -swift run --package-path $ROOT_DIR tuistfixturegenerator generate --path $path --projects $projects --targets $targets --sources $sources \ No newline at end of file +swift run --package-path $MISE_PROJECT_ROOT tuistfixturegenerator generate --path $path --projects $projects --targets $targets --sources $sources \ No newline at end of file diff --git a/.mise/tasks/up b/.mise/tasks/install similarity index 100% rename from .mise/tasks/up rename to .mise/tasks/install diff --git a/.mise/tasks/lint b/.mise/tasks/lint new file mode 100755 index 00000000000..d1a523f1d47 --- /dev/null +++ b/.mise/tasks/lint @@ -0,0 +1,6 @@ +#!/bin/bash +# mise description="Lint the workspace" +set -euo pipefail + +swiftformat $MISE_PROJECT_ROOT --lint +swiftlint lint --quiet --config $MISE_PROJECT_ROOT/.swiftlint.yml $MISE_PROJECT_ROOT/Sources diff --git a/.mise/tasks/lint-fix b/.mise/tasks/lint-fix new file mode 100755 index 00000000000..cfc0359599e --- /dev/null +++ b/.mise/tasks/lint-fix @@ -0,0 +1,6 @@ +#!/bin/bash +# mise description="Lint the workspace fixing issues" +set -euo pipefail + +swiftformat $MISE_PROJECT_ROOT +swiftlint lint --fix --quiet --config $MISE_PROJECT_ROOT/.swiftlint.yml $MISE_PROJECT_ROOT/Sources diff --git a/.mise/tasks/spm/tuist/build b/.mise/tasks/spm/tuist/build new file mode 100755 index 00000000000..ac27d026db9 --- /dev/null +++ b/.mise/tasks/spm/tuist/build @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# mise description="Build the project using Tuist" + +set -euo pipefail + +swift build --package-path $MISE_PROJECT_ROOT +$MISE_PROJECT_ROOT/.build/debug/tuist install --path $MISE_PROJECT_ROOT +$MISE_PROJECT_ROOT/.build/debug/tuist build --path $MISE_PROJECT_ROOT --generate $@ + diff --git a/.mise/tasks/spm/tuist/edit b/.mise/tasks/spm/tuist/edit new file mode 100755 index 00000000000..164f191cdd6 --- /dev/null +++ b/.mise/tasks/spm/tuist/edit @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# mise description="Edit the project using Tuist" + +set -euo pipefail + +swift build --package-path $MISE_PROJECT_ROOT +$MISE_PROJECT_ROOT/.build/debug/tuist edit --path $MISE_PROJECT_ROOT --only-current-directory \ No newline at end of file diff --git a/.mise/tasks/spm/tuist/generate b/.mise/tasks/spm/tuist/generate new file mode 100755 index 00000000000..407ce0cef39 --- /dev/null +++ b/.mise/tasks/spm/tuist/generate @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# mise description="Generate the project using Tuist" + +set -euo pipefail + +swift build --package-path $MISE_PROJECT_ROOT +$MISE_PROJECT_ROOT/.build/debug/tuist install --path $MISE_PROJECT_ROOT +$MISE_PROJECT_ROOT/.build/debug/tuist generate --path $MISE_PROJECT_ROOT $@ diff --git a/.mise/tasks/spm/tuist/run b/.mise/tasks/spm/tuist/run new file mode 100755 index 00000000000..08c9460d9da --- /dev/null +++ b/.mise/tasks/spm/tuist/run @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# mise description="Run the project using Tuist" + +set -euo pipefail + +swift build --package-path $MISE_PROJECT_ROOT +$MISE_PROJECT_ROOT/.build/debug/tuist $@ diff --git a/.mise/tasks/spm/tuist/test b/.mise/tasks/spm/tuist/test new file mode 100755 index 00000000000..c4158fc5718 --- /dev/null +++ b/.mise/tasks/spm/tuist/test @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# mise description="Test the project using Tuist" + +set -euo pipefail + +swift build --package-path $MISE_PROJECT_ROOT +$MISE_PROJECT_ROOT/.build/debug/tuist install --path $MISE_PROJECT_ROOT +$MISE_PROJECT_ROOT/.build/debug/tuist test --path $MISE_PROJECT_ROOT $@ \ No newline at end of file diff --git a/make/utilities/derived_data_path.sh b/.mise/utilities/derived_data_path.sh similarity index 70% rename from make/utilities/derived_data_path.sh rename to .mise/utilities/derived_data_path.sh index b6b914ed333..9f1df55cdee 100755 --- a/make/utilities/derived_data_path.sh +++ b/.mise/utilities/derived_data_path.sh @@ -1,8 +1,5 @@ #!/bin/bash -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" - DERIVED_DATA_PATH=$(defaults read com.apple.dt.Xcode IDECustomDerivedDataLocation 2>/dev/null) # Check if the path is set diff --git a/make/utilities/setup.sh b/.mise/utilities/setup.sh similarity index 100% rename from make/utilities/setup.sh rename to .mise/utilities/setup.sh diff --git a/make/utilities/xcode_path.sh b/.mise/utilities/xcode_path.sh similarity index 89% rename from make/utilities/xcode_path.sh rename to .mise/utilities/xcode_path.sh index 3b5ad2a3b60..6ca00177dc9 100755 --- a/make/utilities/xcode_path.sh +++ b/.mise/utilities/xcode_path.sh @@ -7,10 +7,7 @@ set -e -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/root_dir.sh) - -source $ROOT_DIR/make/utilities/setup.sh +source $MISE_PROJECT_ROOT/.mise/utilities/setup.sh # Check for jq if ! command -v jq >/dev/null 2>&1; then diff --git a/codemagic.yaml b/codemagic.yaml index 11b93b433f4..47b13b36d5c 100644 --- a/codemagic.yaml +++ b/codemagic.yaml @@ -37,8 +37,8 @@ workflows: script: | curl https://mise.run | sh mise install - - name: Up - script: mise run up + - name: Install dependencies + script: mise run install - name: Generate manifest docs script: mise run docs:generate-manifests-docs - name: Build the documentation @@ -116,7 +116,8 @@ workflows: script: | curl https://mise.run | sh mise install - - script: mise run up + - name: Install dependencies + script: mise run install - name: Generate manifest docs script: mise run docs:generate-manifests-docs - name: Build the documentation diff --git a/make/tasks/github/build-docc.sh b/make/tasks/github/build-docc.sh deleted file mode 100755 index db195f763b3..00000000000 --- a/make/tasks/github/build-docc.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -echo "⏳ Generating documentation for the latest release."; -mise run docs:build - -for tag in $(git -C tuist-archive tag -l --sort=v:refname | tail -n 30); -do -echo "⏳ Generating documentation for "$tag" release."; - -if [ -d ".build/documentation/$tag" ] -then - echo "✅ Documentation for "$tag" already exists."; -else - git -C tuist-archive checkout -f "$tag"; - - rm docs/Sources/tuist/ProjectDescription - ln -s ../tuist-archive/Sources/tuist/ProjectDescription docs/Sources/tuist/ProjectDescription - - swift package \ - --disable-sandbox \ - --package-path docs \ - --allow-writing-to-directory .build/documentation/"$tag" \ - generate-documentation \ - --target tuist \ - --output-path .build/documentation/"$tag" \ - --transform-for-static-hosting \ - --hosting-base-path /tuist/"$tag" \ - && echo "✅ Documentation generated for "$tag" release." \ - || echo "⚠️ Documentation skipped for "$tag"."; - cp assets/favicon.ico .build/documentation/"$tag"/favicon.ico - cp assets/favicon.svg .build/documentation/"$tag"/favicon.svg -fi; -done \ No newline at end of file diff --git a/make/tasks/github/cancel-workflows.sh b/make/tasks/github/cancel-workflows.sh deleted file mode 100755 index b0bc37250c5..00000000000 --- a/make/tasks/github/cancel-workflows.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) - -OWNER=tuist -REPO=tuist - -if [[ -n "$GITHUB_TOKEN" ]]; then - TOKEN="$GITHUB_TOKEN" -else - TOKEN=$(echo "url=https://github.com" | git credential fill | grep password | cut -d '=' -f 2) -fi - -echo $TOKEN - -workflow_ids=$(curl -s -H "Authorization: token $TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/$OWNER/$REPO/actions/runs \ - | jq '.workflow_runs[] | select(.status == "queued") | .id') - -for id in $workflow_ids; do - echo "Canceling workflow run with ID $id" - curl -s -X POST -H "Authorization: token $TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/$OWNER/$REPO/actions/runs/$id/cancel -done \ No newline at end of file diff --git a/make/tasks/tuist/build.sh b/make/tasks/tuist/build.sh deleted file mode 100755 index c7768f0778e..00000000000 --- a/make/tasks/tuist/build.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) - -swift build --package-path $ROOT_DIR -$ROOT_DIR/.build/debug/tuist install --path $ROOT_DIR -$ROOT_DIR/.build/debug/tuist build --path $ROOT_DIR --generate $@ \ No newline at end of file diff --git a/make/tasks/tuist/edit.sh b/make/tasks/tuist/edit.sh deleted file mode 100755 index a69ab308862..00000000000 --- a/make/tasks/tuist/edit.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) - -swift build --package-path $ROOT_DIR -$ROOT_DIR/.build/debug/tuist edit --path $ROOT_DIR --only-current-directory \ No newline at end of file diff --git a/make/tasks/tuist/generate.sh b/make/tasks/tuist/generate.sh deleted file mode 100755 index 11e7713daaf..00000000000 --- a/make/tasks/tuist/generate.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) - -swift build --package-path $ROOT_DIR -$ROOT_DIR/.build/debug/tuist install --path $ROOT_DIR -$ROOT_DIR/.build/debug/tuist generate --path $ROOT_DIR $@ diff --git a/make/tasks/tuist/run.sh b/make/tasks/tuist/run.sh deleted file mode 100755 index dcd8ceace0a..00000000000 --- a/make/tasks/tuist/run.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) - -swift build --package-path $ROOT_DIR -$ROOT_DIR/.build/debug/tuist $@ \ No newline at end of file diff --git a/make/tasks/tuist/test.sh b/make/tasks/tuist/test.sh deleted file mode 100755 index 8b83e304714..00000000000 --- a/make/tasks/tuist/test.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) - -swift build --package-path $ROOT_DIR -$ROOT_DIR/.build/debug/tuist install --path $ROOT_DIR -$ROOT_DIR/.build/debug/tuist test --path $ROOT_DIR $@ \ No newline at end of file diff --git a/make/tasks/workspace/build-with-spm.sh b/make/tasks/workspace/build-with-spm.sh deleted file mode 100755 index 40215074807..00000000000 --- a/make/tasks/workspace/build-with-spm.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) -DERIVED_DATA_PATH=$($ROOT_DIR/make/utilities/derived_data_path.sh) - -swift build --package-path $ROOT_DIR --build-path $ROOT_DIR/.build $@ \ No newline at end of file diff --git a/make/tasks/workspace/build/tuistbenchmark.sh b/make/tasks/workspace/build/tuistbenchmark.sh deleted file mode 100755 index e5ada920b5c..00000000000 --- a/make/tasks/workspace/build/tuistbenchmark.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../../utilities/root_dir.sh) - -swift build --package-path $ROOT_DIR --target tuistbenchmark $@ \ No newline at end of file diff --git a/make/tasks/workspace/build/tuistfixturegenerator.sh b/make/tasks/workspace/build/tuistfixturegenerator.sh deleted file mode 100755 index 194845e31bb..00000000000 --- a/make/tasks/workspace/build/tuistfixturegenerator.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../../utilities/root_dir.sh) - -swift build --package-path $ROOT_DIR --target tuistfixturegenerator $@ \ No newline at end of file diff --git a/make/tasks/workspace/lint-fix.sh b/make/tasks/workspace/lint-fix.sh deleted file mode 100755 index eed7fb362ca..00000000000 --- a/make/tasks/workspace/lint-fix.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) - -swiftformat $ROOT_DIR -swiftlint lint --fix --quiet --config $ROOT_DIR/.swiftlint.yml $ROOT_DIR/Sources diff --git a/make/tasks/workspace/lint.sh b/make/tasks/workspace/lint.sh deleted file mode 100755 index 95594ea91b4..00000000000 --- a/make/tasks/workspace/lint.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR=$($SCRIPT_DIR/../../utilities/root_dir.sh) - -swiftformat $ROOT_DIR --lint -swiftlint lint --quiet --config $ROOT_DIR/.swiftlint.yml $ROOT_DIR/Sources diff --git a/make/utilities/root_dir.sh b/make/utilities/root_dir.sh deleted file mode 100755 index e2e17984da2..00000000000 --- a/make/utilities/root_dir.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" -echo $ROOT_DIR \ No newline at end of file From 18c571fe8e998ca9d8768d40e92c0ac71442075c Mon Sep 17 00:00:00 2001 From: Seto Elkahfi Date: Tue, 28 May 2024 12:59:33 +0200 Subject: [PATCH 310/509] Update directory-structure.md (#6332) --- docs/docs/guide/project/directory-structure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/guide/project/directory-structure.md b/docs/docs/guide/project/directory-structure.md index 07a46d0be32..9bad1b88be2 100644 --- a/docs/docs/guide/project/directory-structure.md +++ b/docs/docs/guide/project/directory-structure.md @@ -27,7 +27,7 @@ Workspace.swift - **Tuist directory:** This directory has two purposes. First, it signals **where the root of the project is**. This allows constructing paths relative to the root of the project, and also also running Tuist commands from any directory within the project. Second, it's the container for the following files: - [**Config.swift:**](/guide/project/manifests.html#config-swift) This file contains configuration for Tuist that's shared across all the projects, workspaces, and environments. For example, it can be used to disable automatic generation of schemes, or to define the deployment target of the projects. - **ProjectDescriptionHelpers:** This directory contains Swift code that's shared across all the manifest files. Manifest files can `import ProjectDescriptionHelpers` to use the code defined in this directory. Sharing code is useful to avoid duplications and ensure consistency across the projects. - - **Package.swift:** This file contains Swift Package dependencies for Tuist to integrate them using Xcode projects and targets (like [CocoaPods](https://cococapods)) that are configurable and optimizable. Learn more [here](doc:dependencies). + - **Package.swift:** This file contains Swift Package dependencies for Tuist to integrate them using Xcode projects and targets (like [CocoaPods](https://cococapods)) that are configurable and optimizable. Learn more [here](/guide/project/dependencies). - **Root directory**: The root directory of your project that also contains the `Tuist` directory. - [**Workspace.swift:**](/guide/project/manifests.html#workspace-swift) This manifest represents an Xcode workspace. It's used to group other projects and can also add additional files and schemes. From 9461061858d7123fc259afd5c4545be0ddb8e4c4 Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 28 May 2024 15:12:04 +0200 Subject: [PATCH 311/509] Fix documentation deployment --- docs/.vitepress/config.mjs | 2 - docs/package.json | 9 +- docs/pnpm-lock.yaml | 170 ++++++++++++++++--------------------- 3 files changed, 79 insertions(+), 102 deletions(-) diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 1d83701674d..6f9845a6dab 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -179,10 +179,8 @@ export default defineConfig({ "script", {}, ` - `, ], [ diff --git a/docs/package.json b/docs/package.json index 5a8580a0e69..515d6f28194 100644 --- a/docs/package.json +++ b/docs/package.json @@ -6,15 +6,14 @@ "devDependencies": { "execa": "^8.0.1", "fast-glob": "^3.3.2", - "vitepress": "^1.0.1" + "vitepress": "^1.0.1", + "vue": "^3.4.27", + "wrangler": "^3.37.0" }, "scripts": { "dev": "vitepress dev", "build": "vitepress build", "preview": "vitepress preview", "deploy": "vitepress build && wrangler pages deploy .vitepress/dist --project-name tuist-docs-next --branch main" - }, - "dependencies": { - "wrangler": "^3.37.0" } -} \ No newline at end of file +} diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index ebe055fb23e..025475d5251 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + vue: + specifier: ^3.4.27 + version: 3.4.27 wrangler: specifier: ^3.37.0 version: 3.43.0 @@ -175,20 +178,17 @@ packages: /@babel/helper-string-parser@7.24.1: resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - dev: true - /@babel/parser@7.24.1: - resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + /@babel/parser@7.24.6: + resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.24.0 - dev: true /@babel/types@7.24.0: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} @@ -197,7 +197,6 @@ packages: '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - dev: true /@cloudflare/kv-asset-handler@0.3.1: resolution: {integrity: sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA==} @@ -929,7 +928,7 @@ packages: resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} dev: true - /@vitejs/plugin-vue@5.0.4(vite@5.2.7)(vue@3.4.21): + /@vitejs/plugin-vue@5.0.4(vite@5.2.7)(vue@3.4.27): resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: @@ -937,56 +936,52 @@ packages: vue: ^3.2.25 dependencies: vite: 5.2.7 - vue: 3.4.21 + vue: 3.4.27 dev: true - /@vue/compiler-core@3.4.21: - resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} + /@vue/compiler-core@3.4.27: + resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} dependencies: - '@babel/parser': 7.24.1 - '@vue/shared': 3.4.21 + '@babel/parser': 7.24.6 + '@vue/shared': 3.4.27 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.0 - dev: true - /@vue/compiler-dom@3.4.21: - resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==} + /@vue/compiler-dom@3.4.27: + resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} dependencies: - '@vue/compiler-core': 3.4.21 - '@vue/shared': 3.4.21 - dev: true + '@vue/compiler-core': 3.4.27 + '@vue/shared': 3.4.27 - /@vue/compiler-sfc@3.4.21: - resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} + /@vue/compiler-sfc@3.4.27: + resolution: {integrity: sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==} dependencies: - '@babel/parser': 7.24.1 - '@vue/compiler-core': 3.4.21 - '@vue/compiler-dom': 3.4.21 - '@vue/compiler-ssr': 3.4.21 - '@vue/shared': 3.4.21 + '@babel/parser': 7.24.6 + '@vue/compiler-core': 3.4.27 + '@vue/compiler-dom': 3.4.27 + '@vue/compiler-ssr': 3.4.27 + '@vue/shared': 3.4.27 estree-walker: 2.0.2 - magic-string: 0.30.8 + magic-string: 0.30.10 postcss: 8.4.38 source-map-js: 1.2.0 - dev: true - /@vue/compiler-ssr@3.4.21: - resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==} + /@vue/compiler-ssr@3.4.27: + resolution: {integrity: sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==} dependencies: - '@vue/compiler-dom': 3.4.21 - '@vue/shared': 3.4.21 - dev: true + '@vue/compiler-dom': 3.4.27 + '@vue/shared': 3.4.27 - /@vue/devtools-api@7.0.25(vue@3.4.21): + /@vue/devtools-api@7.0.25(vue@3.4.27): resolution: {integrity: sha512-fL6DlRp4MSXCLYcqYvKU7QhQZWE3Hfu7X8pC25BS74coJi7uJeSWs4tmrITcwFihNmC9S5GPiffkMdckkeWjzg==} dependencies: - '@vue/devtools-kit': 7.0.25(vue@3.4.21) + '@vue/devtools-kit': 7.0.25(vue@3.4.27) transitivePeerDependencies: - vue dev: true - /@vue/devtools-kit@7.0.25(vue@3.4.21): + /@vue/devtools-kit@7.0.25(vue@3.4.27): resolution: {integrity: sha512-wbLkSnOTsKHPb1mB9koFHUoSAF8Dp6Ii/ocR2+DeXFY4oKqIjCeJb/4Lihk4rgqEhCy1WwxLfTgNDo83VvDYkQ==} peerDependencies: vue: ^3.0.0 @@ -996,7 +991,7 @@ packages: mitt: 3.0.1 perfect-debounce: 1.0.0 speakingurl: 14.0.1 - vue: 3.4.21 + vue: 3.4.27 dev: true /@vue/devtools-shared@7.0.25: @@ -1005,54 +1000,49 @@ packages: rfdc: 1.3.1 dev: true - /@vue/reactivity@3.4.21: - resolution: {integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==} + /@vue/reactivity@3.4.27: + resolution: {integrity: sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==} dependencies: - '@vue/shared': 3.4.21 - dev: true + '@vue/shared': 3.4.27 - /@vue/runtime-core@3.4.21: - resolution: {integrity: sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==} + /@vue/runtime-core@3.4.27: + resolution: {integrity: sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==} dependencies: - '@vue/reactivity': 3.4.21 - '@vue/shared': 3.4.21 - dev: true + '@vue/reactivity': 3.4.27 + '@vue/shared': 3.4.27 - /@vue/runtime-dom@3.4.21: - resolution: {integrity: sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==} + /@vue/runtime-dom@3.4.27: + resolution: {integrity: sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==} dependencies: - '@vue/runtime-core': 3.4.21 - '@vue/shared': 3.4.21 + '@vue/runtime-core': 3.4.27 + '@vue/shared': 3.4.27 csstype: 3.1.3 - dev: true - /@vue/server-renderer@3.4.21(vue@3.4.21): - resolution: {integrity: sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==} + /@vue/server-renderer@3.4.27(vue@3.4.27): + resolution: {integrity: sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==} peerDependencies: - vue: 3.4.21 + vue: 3.4.27 dependencies: - '@vue/compiler-ssr': 3.4.21 - '@vue/shared': 3.4.21 - vue: 3.4.21 - dev: true + '@vue/compiler-ssr': 3.4.27 + '@vue/shared': 3.4.27 + vue: 3.4.27 - /@vue/shared@3.4.21: - resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} - dev: true + /@vue/shared@3.4.27: + resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} - /@vueuse/core@10.9.0(vue@3.4.21): + /@vueuse/core@10.9.0(vue@3.4.27): resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==} dependencies: '@types/web-bluetooth': 0.0.20 '@vueuse/metadata': 10.9.0 - '@vueuse/shared': 10.9.0(vue@3.4.21) - vue-demi: 0.14.7(vue@3.4.21) + '@vueuse/shared': 10.9.0(vue@3.4.27) + vue-demi: 0.14.7(vue@3.4.27) transitivePeerDependencies: - '@vue/composition-api' - vue dev: true - /@vueuse/integrations@10.9.0(focus-trap@7.5.4)(vue@3.4.21): + /@vueuse/integrations@10.9.0(focus-trap@7.5.4)(vue@3.4.27): resolution: {integrity: sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==} peerDependencies: async-validator: '*' @@ -1093,10 +1083,10 @@ packages: universal-cookie: optional: true dependencies: - '@vueuse/core': 10.9.0(vue@3.4.21) - '@vueuse/shared': 10.9.0(vue@3.4.21) + '@vueuse/core': 10.9.0(vue@3.4.27) + '@vueuse/shared': 10.9.0(vue@3.4.27) focus-trap: 7.5.4 - vue-demi: 0.14.7(vue@3.4.21) + vue-demi: 0.14.7(vue@3.4.27) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -1106,10 +1096,10 @@ packages: resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==} dev: true - /@vueuse/shared@10.9.0(vue@3.4.21): + /@vueuse/shared@10.9.0(vue@3.4.27): resolution: {integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==} dependencies: - vue-demi: 0.14.7(vue@3.4.21) + vue-demi: 0.14.7(vue@3.4.27) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -1215,7 +1205,6 @@ packages: /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: true /data-uri-to-buffer@2.0.2: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} @@ -1236,7 +1225,6 @@ packages: /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - dev: true /esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} @@ -1310,7 +1298,6 @@ packages: /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true /execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} @@ -1452,12 +1439,10 @@ packages: sourcemap-codec: 1.4.8 dev: false - /magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} - engines: {node: '>=12'} + /magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true /mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} @@ -1584,7 +1569,6 @@ packages: /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -1597,7 +1581,6 @@ packages: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 - dev: true /preact@10.20.1: resolution: {integrity: sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==} @@ -1731,7 +1714,6 @@ packages: /source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} - dev: true /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} @@ -1777,7 +1759,6 @@ packages: /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - dev: true /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -1852,16 +1833,16 @@ packages: '@shikijs/core': 1.2.3 '@shikijs/transformers': 1.2.3 '@types/markdown-it': 13.0.7 - '@vitejs/plugin-vue': 5.0.4(vite@5.2.7)(vue@3.4.21) - '@vue/devtools-api': 7.0.25(vue@3.4.21) - '@vueuse/core': 10.9.0(vue@3.4.21) - '@vueuse/integrations': 10.9.0(focus-trap@7.5.4)(vue@3.4.21) + '@vitejs/plugin-vue': 5.0.4(vite@5.2.7)(vue@3.4.27) + '@vue/devtools-api': 7.0.25(vue@3.4.27) + '@vueuse/core': 10.9.0(vue@3.4.27) + '@vueuse/integrations': 10.9.0(focus-trap@7.5.4)(vue@3.4.27) focus-trap: 7.5.4 mark.js: 8.11.1 minisearch: 6.3.0 shiki: 1.2.3 vite: 5.2.7 - vue: 3.4.21 + vue: 3.4.27 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -1890,7 +1871,7 @@ packages: - universal-cookie dev: true - /vue-demi@0.14.7(vue@3.4.21): + /vue-demi@0.14.7(vue@3.4.27): resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} engines: {node: '>=12'} hasBin: true @@ -1902,23 +1883,22 @@ packages: '@vue/composition-api': optional: true dependencies: - vue: 3.4.21 + vue: 3.4.27 dev: true - /vue@3.4.21: - resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==} + /vue@3.4.27: + resolution: {integrity: sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@vue/compiler-dom': 3.4.21 - '@vue/compiler-sfc': 3.4.21 - '@vue/runtime-dom': 3.4.21 - '@vue/server-renderer': 3.4.21(vue@3.4.21) - '@vue/shared': 3.4.21 - dev: true + '@vue/compiler-dom': 3.4.27 + '@vue/compiler-sfc': 3.4.27 + '@vue/runtime-dom': 3.4.27 + '@vue/server-renderer': 3.4.27(vue@3.4.27) + '@vue/shared': 3.4.27 /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} From d340aea777049af6a1d3e485d81013242b5fb130 Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Tue, 28 May 2024 09:16:43 -0400 Subject: [PATCH 312/509] Enable some strict concurrency checking (#6316) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add ability to incrementally add strict concurrency checking to frameworks * Enable complete concurrency checking on `ProjectDescription` and `ProjectAutomation` * Remove global for string colorization to support Swift Concurrency * Incremental Sendable conformance in TusitSupport * Silence warnings from preconcurrency frameworks * Use let to avoid concurrency issues * Set `TuistSupport` to targeted concurrency checking * Linting * Remove preconcurrency marker, only needed with complete checking * Properly annotate `concurrentMap` methods for sendability * Mark most `ProjectDescription` Types as `Sendable` * Linting * A few more `ProjectDescription` types * Add Sendability to `ProjectAutomation` types * Only enable `targeted` checking on frameworks for now This was picking up test targets as well. * Remove `FatalError` conforming to `Sendable` This was causing too many cascading warnings. * Linting * Opt `MockXcodeController` out of sendable checking Adding `@Atomic` just in case, but our current usages are safe. We’ll need to update more patterns like this to be threadsafe for the compiler. * Undo previous “fix” * Linting --- Sources/ProjectAutomation/Configuration.swift | 8 ++++---- Sources/ProjectAutomation/Graph.swift | 2 +- Sources/ProjectAutomation/Package.swift | 4 ++-- Sources/ProjectAutomation/Project.swift | 2 +- Sources/ProjectAutomation/Scheme.swift | 2 +- Sources/ProjectAutomation/Settings.swift | 2 +- Sources/ProjectAutomation/Target.swift | 2 +- .../ProjectAutomation/TargetDependency.swift | 6 +++--- Sources/ProjectAutomation/Task.swift | 12 ++++++------ Sources/ProjectAutomation/Tuist.swift | 2 +- Sources/ProjectDescription/AnalyzeAction.swift | 2 +- Sources/ProjectDescription/ArchiveAction.swift | 2 +- Sources/ProjectDescription/Arguments.swift | 2 +- Sources/ProjectDescription/BuildAction.swift | 2 +- .../BuildRule+CompilerSpec.swift | 2 +- .../ProjectDescription/BuildRule+FileType.swift | 2 +- Sources/ProjectDescription/BuildRule.swift | 2 +- Sources/ProjectDescription/Cloud.swift | 4 ++-- .../CompatibleXcodeVersions.swift | 2 +- Sources/ProjectDescription/Config.swift | 2 +- .../ConfigGenerationOptions.swift | 4 ++-- .../ProjectDescription/ConfigurationName.swift | 2 +- .../ProjectDescription/CopyFileElement.swift | 4 ++-- .../ProjectDescription/CopyFilesAction.swift | 4 ++-- Sources/ProjectDescription/CoreDataModel.swift | 2 +- .../ProjectDescription/DeploymentTargets.swift | 2 +- Sources/ProjectDescription/Destination.swift | 12 ++++++------ Sources/ProjectDescription/Dump.swift | 4 ++-- Sources/ProjectDescription/Entitlements.swift | 2 +- .../EnvironmentVariable.swift | 2 +- Sources/ProjectDescription/ExecuteAction.swift | 2 +- Sources/ProjectDescription/FileCodeGen.swift | 2 +- Sources/ProjectDescription/FileElement.swift | 2 +- .../ProjectDescription/FileHeaderTemplate.swift | 2 +- Sources/ProjectDescription/FileList.swift | 2 +- Sources/ProjectDescription/FileListGlob.swift | 2 +- Sources/ProjectDescription/Headers.swift | 4 ++-- Sources/ProjectDescription/InfoPlist.swift | 2 +- Sources/ProjectDescription/LaunchArgument.swift | 2 +- Sources/ProjectDescription/LaunchStyle.swift | 2 +- .../ProjectDescription/MergedBinaryType.swift | 2 +- .../OnDemandResourcesTags.swift | 2 +- Sources/ProjectDescription/Package.swift | 4 ++-- Sources/ProjectDescription/Path.swift | 4 ++-- Sources/ProjectDescription/Platform.swift | 4 ++-- .../ProjectDescription/PlatformCondition.swift | 2 +- Sources/ProjectDescription/PlatformFilter.swift | 2 +- Sources/ProjectDescription/Plist.swift | 2 +- Sources/ProjectDescription/PluginLocation.swift | 4 ++-- .../ProjectDescription/PrivacyManifest.swift | 2 +- Sources/ProjectDescription/Product.swift | 2 +- Sources/ProjectDescription/ProfileAction.swift | 2 +- Sources/ProjectDescription/Project.swift | 2 +- Sources/ProjectDescription/ProjectOptions.swift | 8 ++++---- .../ResourceFileElement.swift | 2 +- .../ResourceFileElements.swift | 2 +- .../ResourceSynthesizer.swift | 8 ++++---- Sources/ProjectDescription/RunAction.swift | 2 +- .../ProjectDescription/RunActionOptions.swift | 4 ++-- Sources/ProjectDescription/Scheme.swift | 2 +- .../SchemeDiagnosticsOptions.swift | 2 +- Sources/ProjectDescription/SchemeLanguage.swift | 2 +- .../ScreenCaptureFormat.swift | 2 +- Sources/ProjectDescription/Settings.swift | 10 +++++----- .../ProjectDescription/SimulatedLocation.swift | 2 +- .../ProjectDescription/SourceFilesList.swift | 4 ++-- Sources/ProjectDescription/Target.swift | 2 +- .../ProjectDescription/TargetDependency.swift | 10 +++++----- .../ProjectDescription/TargetReference.swift | 2 +- Sources/ProjectDescription/TargetScript.swift | 6 +++--- .../ProjectDescription/Template/Template.swift | 10 +++++----- Sources/ProjectDescription/TestAction.swift | 2 +- .../ProjectDescription/TestActionOptions.swift | 2 +- Sources/ProjectDescription/TestableTarget.swift | 2 +- Sources/ProjectDescription/TestingOptions.swift | 2 +- Sources/ProjectDescription/Version.swift | 2 +- Sources/ProjectDescription/Workspace.swift | 2 +- .../WorkspaceGenerationOptions.swift | 6 +++--- Sources/TuistSupport/Errors/FatalError.swift | 2 +- .../Extensions/Array+ExecutionContext.swift | 8 +++++--- .../Dictionary+ExecutionContext.swift | 4 ++-- Sources/TuistSupport/Logging/OSLogHandler.swift | 2 +- Sources/TuistSupport/MachineEnvironment.swift | 12 ++++++------ Sources/TuistSupport/Models/InvalidGlob.swift | 2 +- .../TuistSupport/System/Publisher+System.swift | 2 +- Sources/TuistSupport/System/System.swift | 4 ++-- Sources/TuistSupport/Utils/ColorizeSwift.swift | 5 ----- Sources/TuistSupport/Utils/Glob.swift | 4 ++-- .../TuistSupport/Utils/WarningController.swift | 6 +++--- .../HTTPStatusCodes/HTTPStatusCodes.swift | 2 +- .../TuistSupport/Xcode/XcodeController.swift | 4 ++-- .../Xcode/Mocks/MockXcodeController.swift | 5 ++++- Tuist/ProjectDescriptionHelpers/Module.swift | 17 +++++++++++++++++ 93 files changed, 176 insertions(+), 159 deletions(-) diff --git a/Sources/ProjectAutomation/Configuration.swift b/Sources/ProjectAutomation/Configuration.swift index a3127dc94ba..2ab979ad370 100644 --- a/Sources/ProjectAutomation/Configuration.swift +++ b/Sources/ProjectAutomation/Configuration.swift @@ -4,7 +4,7 @@ import Foundation // A the build Configuration of a target. -public struct Configuration: Equatable, Codable { +public struct Configuration: Equatable, Codable, Sendable { let settings: SettingsDictionary public init( @@ -16,8 +16,8 @@ public struct Configuration: Equatable, Codable { // MARK: - BuildConfiguration -public struct BuildConfiguration: Equatable, Codable, Hashable { - public enum Variant: String, Codable, Hashable { +public struct BuildConfiguration: Equatable, Codable, Hashable, Sendable { + public enum Variant: String, Codable, Hashable, Sendable { case debug case release } @@ -36,7 +36,7 @@ public struct BuildConfiguration: Equatable, Codable, Hashable { public typealias SettingsDictionary = [String: SettingValue] -public enum SettingValue: Equatable, Codable { +public enum SettingValue: Equatable, Codable, Sendable { case string(value: String) case array(value: [String]) diff --git a/Sources/ProjectAutomation/Graph.swift b/Sources/ProjectAutomation/Graph.swift index 4dd5500c8dc..937aaf18155 100644 --- a/Sources/ProjectAutomation/Graph.swift +++ b/Sources/ProjectAutomation/Graph.swift @@ -1,7 +1,7 @@ import Foundation /// The structure defining the output schema of the entire project graph. -public struct Graph: Codable, Equatable { +public struct Graph: Codable, Equatable, Sendable { /// The name of this graph. public let name: String diff --git a/Sources/ProjectAutomation/Package.swift b/Sources/ProjectAutomation/Package.swift index 944a616d78a..086b4e3b319 100644 --- a/Sources/ProjectAutomation/Package.swift +++ b/Sources/ProjectAutomation/Package.swift @@ -1,9 +1,9 @@ import Foundation /// The structure defining the output schema of the Swift package. -public struct Package: Codable, Equatable { +public struct Package: Codable, Equatable, Sendable { /// The type of the Swift package. - public enum PackageKind: String, Codable { + public enum PackageKind: String, Codable, Sendable { case remote case local } diff --git a/Sources/ProjectAutomation/Project.swift b/Sources/ProjectAutomation/Project.swift index 1f7a37adf6b..3cc536f5924 100644 --- a/Sources/ProjectAutomation/Project.swift +++ b/Sources/ProjectAutomation/Project.swift @@ -1,7 +1,7 @@ import Foundation /// The structure defining the output schema of a Xcode project. -public struct Project: Codable, Equatable { +public struct Project: Codable, Equatable, Sendable { /// The name of the project. public let name: String diff --git a/Sources/ProjectAutomation/Scheme.swift b/Sources/ProjectAutomation/Scheme.swift index e38f4c25200..468e57976b0 100644 --- a/Sources/ProjectAutomation/Scheme.swift +++ b/Sources/ProjectAutomation/Scheme.swift @@ -1,7 +1,7 @@ import Foundation /// The structure defining the output schema of an Xcode scheme. -public struct Scheme: Codable, Equatable { +public struct Scheme: Codable, Equatable, Sendable { /// The name of the scheme. public let name: String diff --git a/Sources/ProjectAutomation/Settings.swift b/Sources/ProjectAutomation/Settings.swift index 0d69382e0cf..c8ddf55e51d 100644 --- a/Sources/ProjectAutomation/Settings.swift +++ b/Sources/ProjectAutomation/Settings.swift @@ -2,7 +2,7 @@ import Foundation // A group of settings configurations. -public struct Settings: Equatable, Codable { +public struct Settings: Equatable, Codable, Sendable { public var configurations: [ProjectAutomation.BuildConfiguration: ProjectAutomation.Configuration?] public init( diff --git a/Sources/ProjectAutomation/Target.swift b/Sources/ProjectAutomation/Target.swift index 44644ba3711..03424ff580d 100644 --- a/Sources/ProjectAutomation/Target.swift +++ b/Sources/ProjectAutomation/Target.swift @@ -1,7 +1,7 @@ import Foundation /// The structure defining the output schema of a target. -public struct Target: Codable, Equatable { +public struct Target: Codable, Equatable, Sendable { /// The name of the target. public let name: String diff --git a/Sources/ProjectAutomation/TargetDependency.swift b/Sources/ProjectAutomation/TargetDependency.swift index e9803936ba4..be5258eddce 100644 --- a/Sources/ProjectAutomation/TargetDependency.swift +++ b/Sources/ProjectAutomation/TargetDependency.swift @@ -1,16 +1,16 @@ import Foundation -public enum FrameworkStatus: String, Codable { +public enum FrameworkStatus: String, Codable, Sendable { case required case optional } -public enum SDKStatus: String, Codable { +public enum SDKStatus: String, Codable, Sendable { case required case optional } -public enum TargetDependency: Equatable, Hashable, Codable { +public enum TargetDependency: Equatable, Hashable, Codable, Sendable { case target(name: String) case project(target: String, path: String) case framework(path: String, status: FrameworkStatus) diff --git a/Sources/ProjectAutomation/Task.swift b/Sources/ProjectAutomation/Task.swift index 6a7659c0651..1fbc72a7437 100644 --- a/Sources/ProjectAutomation/Task.swift +++ b/Sources/ProjectAutomation/Task.swift @@ -1,16 +1,16 @@ import Foundation -public struct Task { +public struct Task: Sendable { public let options: [Option] - public let task: ([String: String]) throws -> Void + public let task: @Sendable ([String: String]) throws -> Void - public enum Option: Equatable { + public enum Option: Equatable, Sendable { case option(String) } public init( options: [Option] = [], - task: @escaping ([String: String]) throws -> Void + task: @Sendable @escaping ([String: String]) throws -> Void ) { self.options = options self.task = task @@ -19,10 +19,10 @@ public struct Task { } private func runIfNeeded() { - guard let taskCommandLineIndex = CommandLine.arguments.firstIndex(of: "--tuist-task"), + guard let taskCommandLineIndex = ProcessInfo.processInfo.arguments.firstIndex(of: "--tuist-task"), CommandLine.argc > taskCommandLineIndex else { return } - let attributesString = CommandLine.arguments[taskCommandLineIndex + 1] + let attributesString = ProcessInfo.processInfo.arguments[taskCommandLineIndex + 1] // swiftlint:disable force_try let attributes: [String: String] = try! JSONDecoder().decode( [String: String].self, diff --git a/Sources/ProjectAutomation/Tuist.swift b/Sources/ProjectAutomation/Tuist.swift index 77f9059e44c..c408695f044 100644 --- a/Sources/ProjectAutomation/Tuist.swift +++ b/Sources/ProjectAutomation/Tuist.swift @@ -2,7 +2,7 @@ import Foundation /// Tuist includes all methods to interact with your tuist project public enum Tuist { - enum TuistError: Error { + enum TuistError: Error, Sendable { case signalled(command: String, code: Int32, standardError: Data) case terminated(command: String, code: Int32, standardError: Data) diff --git a/Sources/ProjectDescription/AnalyzeAction.swift b/Sources/ProjectDescription/AnalyzeAction.swift index d4f63e3520c..98789e2d860 100644 --- a/Sources/ProjectDescription/AnalyzeAction.swift +++ b/Sources/ProjectDescription/AnalyzeAction.swift @@ -3,7 +3,7 @@ import Foundation /// An action that analyzes the built products. /// /// It's initialized with the `.analyzeAction` static method -public struct AnalyzeAction: Equatable, Codable { +public struct AnalyzeAction: Equatable, Codable, Sendable { /// Indicates the build configuration the product should be analyzed with. public var configuration: ConfigurationName diff --git a/Sources/ProjectDescription/ArchiveAction.swift b/Sources/ProjectDescription/ArchiveAction.swift index 771ebaa57e1..e8e078b4373 100644 --- a/Sources/ProjectDescription/ArchiveAction.swift +++ b/Sources/ProjectDescription/ArchiveAction.swift @@ -3,7 +3,7 @@ import Foundation /// An action that archives the built products. /// /// It's initialized with the `.archiveAction` static method. -public struct ArchiveAction: Equatable, Codable { +public struct ArchiveAction: Equatable, Codable, Sendable { /// Indicates the build configuration to run the archive with. public var configuration: ConfigurationName /// If set to true, Xcode will reveal the Organizer on completion. diff --git a/Sources/ProjectDescription/Arguments.swift b/Sources/ProjectDescription/Arguments.swift index ca81180301f..91b60628120 100644 --- a/Sources/ProjectDescription/Arguments.swift +++ b/Sources/ProjectDescription/Arguments.swift @@ -1,7 +1,7 @@ import Foundation /// A collection of arguments and environment variables. -public struct Arguments: Equatable, Codable { +public struct Arguments: Equatable, Codable, Sendable { public var environmentVariables: [String: EnvironmentVariable] public var launchArguments: [LaunchArgument] diff --git a/Sources/ProjectDescription/BuildAction.swift b/Sources/ProjectDescription/BuildAction.swift index 73be5e0c1f7..703af85c6dc 100644 --- a/Sources/ProjectDescription/BuildAction.swift +++ b/Sources/ProjectDescription/BuildAction.swift @@ -3,7 +3,7 @@ import Foundation /// An action that builds products. /// /// It's initialized with the `.buildAction` static method. -public struct BuildAction: Equatable, Codable { +public struct BuildAction: Equatable, Codable, Sendable { /// A list of targets to build, which are defined in the project. public var targets: [TargetReference] /// A list of actions that are executed before starting the build process. diff --git a/Sources/ProjectDescription/BuildRule+CompilerSpec.swift b/Sources/ProjectDescription/BuildRule+CompilerSpec.swift index 8dec8b4c5a4..f53506fc508 100644 --- a/Sources/ProjectDescription/BuildRule+CompilerSpec.swift +++ b/Sources/ProjectDescription/BuildRule+CompilerSpec.swift @@ -4,7 +4,7 @@ extension BuildRule { /// The type of compiler spec which is used for a selected file type. /// All the values are taken from build rule options hidden under a pup-up button's menu next to a label `Using` in a target's /// `Build Rules` section. - public enum CompilerSpec: Codable { + public enum CompilerSpec: Codable, Sendable { case appIntentsMetadataExtractor case appShortcutStringsMetadataExtractor case appleClang diff --git a/Sources/ProjectDescription/BuildRule+FileType.swift b/Sources/ProjectDescription/BuildRule+FileType.swift index 6bb7b282b7e..14673f6bf9c 100644 --- a/Sources/ProjectDescription/BuildRule+FileType.swift +++ b/Sources/ProjectDescription/BuildRule+FileType.swift @@ -4,7 +4,7 @@ extension BuildRule { /// File types processed by a build rule. /// All the values are taken from build rule options hidden under a pup-up button's menu next to a label `Process` in a /// target's `Build Rules` section. - public enum FileType: Codable { + public enum FileType: Codable, Sendable { case instrumentsPackageDefinition case metalAIR case machO diff --git a/Sources/ProjectDescription/BuildRule.swift b/Sources/ProjectDescription/BuildRule.swift index 8bc05efabe9..d90290b5b46 100644 --- a/Sources/ProjectDescription/BuildRule.swift +++ b/Sources/ProjectDescription/BuildRule.swift @@ -1,7 +1,7 @@ import Foundation /// A BuildRule is used to specify a method for transforming an input file in to an output file(s). -public struct BuildRule: Codable, Equatable { +public struct BuildRule: Codable, Equatable, Sendable { /// Compiler specification for element transformation. public var compilerSpec: CompilerSpec diff --git a/Sources/ProjectDescription/Cloud.swift b/Sources/ProjectDescription/Cloud.swift index 27f540cb670..96cd9704555 100644 --- a/Sources/ProjectDescription/Cloud.swift +++ b/Sources/ProjectDescription/Cloud.swift @@ -1,9 +1,9 @@ import Foundation /// A cloud configuration, used for remote caching. -public struct Cloud: Codable, Equatable { +public struct Cloud: Codable, Equatable, Sendable { /// Options for cloud configuration. - public enum Option: String, Codable, Equatable { + public enum Option: String, Codable, Equatable, Sendable { /// Marks whether Tuist Cloud authentication is optional. /// If present, the interaction with Tuist Cloud will be skipped (instead of failing) if a user is not authenticated. case optional diff --git a/Sources/ProjectDescription/CompatibleXcodeVersions.swift b/Sources/ProjectDescription/CompatibleXcodeVersions.swift index 0f70d25eed9..7e20b8d17f1 100644 --- a/Sources/ProjectDescription/CompatibleXcodeVersions.swift +++ b/Sources/ProjectDescription/CompatibleXcodeVersions.swift @@ -1,7 +1,7 @@ import Foundation /// Options of compatibles Xcode versions. -public enum CompatibleXcodeVersions: ExpressibleByArrayLiteral, ExpressibleByStringInterpolation, Codable, Equatable { +public enum CompatibleXcodeVersions: ExpressibleByArrayLiteral, ExpressibleByStringInterpolation, Codable, Equatable, Sendable { /// The project supports all Xcode versions. case all diff --git a/Sources/ProjectDescription/Config.swift b/Sources/ProjectDescription/Config.swift index 2a2b582cec0..d3be5c6fabb 100644 --- a/Sources/ProjectDescription/Config.swift +++ b/Sources/ProjectDescription/Config.swift @@ -27,7 +27,7 @@ /// swiftVersion: "5.9.0" /// ) /// ``` -public struct Config: Codable, Equatable { +public struct Config: Codable, Equatable, Sendable { /// Generation options. public let generationOptions: GenerationOptions diff --git a/Sources/ProjectDescription/ConfigGenerationOptions.swift b/Sources/ProjectDescription/ConfigGenerationOptions.swift index 671c4738c34..aff6f82825f 100644 --- a/Sources/ProjectDescription/ConfigGenerationOptions.swift +++ b/Sources/ProjectDescription/ConfigGenerationOptions.swift @@ -1,11 +1,11 @@ extension Config { /// Options for project generation. - public struct GenerationOptions: Codable, Equatable { + public struct GenerationOptions: Codable, Equatable, Sendable { /** This enum represents the targets against which Tuist will run the check for potential side effects caused by static transitive dependencies. */ - public enum StaticSideEffectsWarningTargets: Codable, Equatable { + public enum StaticSideEffectsWarningTargets: Codable, Equatable, Sendable { case all case none case excluding([String]) diff --git a/Sources/ProjectDescription/ConfigurationName.swift b/Sources/ProjectDescription/ConfigurationName.swift index caa3d52d0ab..b4d424bdeff 100644 --- a/Sources/ProjectDescription/ConfigurationName.swift +++ b/Sources/ProjectDescription/ConfigurationName.swift @@ -13,7 +13,7 @@ import Foundation /// } /// } /// ``` -public struct ConfigurationName: ExpressibleByStringLiteral, Codable, Equatable { +public struct ConfigurationName: ExpressibleByStringLiteral, Codable, Equatable, Sendable { /// The configuration name. public var rawValue: String diff --git a/Sources/ProjectDescription/CopyFileElement.swift b/Sources/ProjectDescription/CopyFileElement.swift index 3da4fb22edf..c802d131638 100644 --- a/Sources/ProjectDescription/CopyFileElement.swift +++ b/Sources/ProjectDescription/CopyFileElement.swift @@ -2,7 +2,7 @@ import Foundation /// A file element from a glob pattern or a folder reference which is conditionally applied to specific platforms with an optional /// "Code Sign On Copy" flag. -public enum CopyFileElement: Codable, Equatable { +public enum CopyFileElement: Codable, Equatable, Sendable { /// A file path (or glob pattern) to include with an optional PlatformCondition to control which platforms it applies. /// "Code Sign on Copy" can be optionally enabled for the glob. case glob(pattern: Path, condition: PlatformCondition? = nil, codeSignOnCopy: Bool = false) @@ -11,7 +11,7 @@ public enum CopyFileElement: Codable, Equatable { /// to. "Code Sign on Copy" can be optionally enabled for the folder reference. case folderReference(path: Path, condition: PlatformCondition? = nil, codeSignOnCopy: Bool = false) - private enum TypeName: String, Codable { + private enum TypeName: String, Codable, Sendable { case glob case folderReference } diff --git a/Sources/ProjectDescription/CopyFilesAction.swift b/Sources/ProjectDescription/CopyFilesAction.swift index 8491f312d2c..c96272ca887 100644 --- a/Sources/ProjectDescription/CopyFilesAction.swift +++ b/Sources/ProjectDescription/CopyFilesAction.swift @@ -5,7 +5,7 @@ import Foundation /// Copy files actions, represented as target copy files build phases, are useful to associate project files /// and products of other targets with the target and copies them to a specified destination, typically a /// subfolder within a product. This action may be used multiple times per target. -public struct CopyFilesAction: Codable, Equatable { +public struct CopyFilesAction: Codable, Equatable, Sendable { /// Name of the build phase when the project gets generated. public var name: String @@ -19,7 +19,7 @@ public struct CopyFilesAction: Codable, Equatable { public var files: [CopyFileElement] /// Destination path. - public enum Destination: String, Codable, Equatable { + public enum Destination: String, Codable, Equatable, Sendable { case absolutePath case productsDirectory case wrapper diff --git a/Sources/ProjectDescription/CoreDataModel.swift b/Sources/ProjectDescription/CoreDataModel.swift index b68e2e390ab..524d120b541 100644 --- a/Sources/ProjectDescription/CoreDataModel.swift +++ b/Sources/ProjectDescription/CoreDataModel.swift @@ -1,7 +1,7 @@ import Foundation /// A Core Data model. -public struct CoreDataModel: Codable, Equatable { +public struct CoreDataModel: Codable, Equatable, Sendable { /// Relative path to the model. public var path: Path diff --git a/Sources/ProjectDescription/DeploymentTargets.swift b/Sources/ProjectDescription/DeploymentTargets.swift index 475f886c8da..cec4fb86d84 100644 --- a/Sources/ProjectDescription/DeploymentTargets.swift +++ b/Sources/ProjectDescription/DeploymentTargets.swift @@ -3,7 +3,7 @@ import Foundation // MARK: - DeploymentTargets /// A struct representing the minimum deployment versions for each platform. -public struct DeploymentTargets: Hashable, Codable { +public struct DeploymentTargets: Hashable, Codable, Sendable { /// Minimum deployment version for iOS public var iOS: String? /// Minimum deployment version for macOS diff --git a/Sources/ProjectDescription/Destination.swift b/Sources/ProjectDescription/Destination.swift index d8faa0ac330..b4b3986e9eb 100644 --- a/Sources/ProjectDescription/Destination.swift +++ b/Sources/ProjectDescription/Destination.swift @@ -5,12 +5,12 @@ public typealias Destinations = Set /// Convenience collections of destinations mapped to platforms terminology. extension Destinations { - public static var watchOS: Destinations = [.appleWatch] + public static let watchOS: Destinations = [.appleWatch] /// Currently we omit `.visionOSwithiPadDesign` from our default because `visionOS` is unreleased. - public static var iOS: Destinations = [.iPhone, .iPad, .macWithiPadDesign] - public static var macOS: Destinations = [.mac] - public static var tvOS: Destinations = [.appleTv] - public static var visionOS: Destinations = [.appleVision] + public static let iOS: Destinations = [.iPhone, .iPad, .macWithiPadDesign] + public static let macOS: Destinations = [.mac] + public static let tvOS: Destinations = [.appleTv] + public static let visionOS: Destinations = [.appleVision] } extension Destinations { @@ -22,7 +22,7 @@ extension Destinations { } /// A supported deployment destination representation. -public enum Destination: String, Codable, Equatable, CaseIterable { +public enum Destination: String, Codable, Equatable, CaseIterable, Sendable { /// iPhone support case iPhone /// iPad support diff --git a/Sources/ProjectDescription/Dump.swift b/Sources/ProjectDescription/Dump.swift index 24501a53196..b3cd2fe8bb4 100644 --- a/Sources/ProjectDescription/Dump.swift +++ b/Sources/ProjectDescription/Dump.swift @@ -1,8 +1,8 @@ import Foundation func dumpIfNeeded(_ entity: some Encodable) { - guard CommandLine.argc > 0, - CommandLine.arguments.contains("--tuist-dump") + guard !ProcessInfo.processInfo.arguments.isEmpty, + ProcessInfo.processInfo.arguments.contains("--tuist-dump") else { return } let encoder = JSONEncoder() // swiftlint:disable:next force_try diff --git a/Sources/ProjectDescription/Entitlements.swift b/Sources/ProjectDescription/Entitlements.swift index b3ffdb20f2d..09657d3ee7e 100644 --- a/Sources/ProjectDescription/Entitlements.swift +++ b/Sources/ProjectDescription/Entitlements.swift @@ -2,7 +2,7 @@ import Foundation // MARK: - Entitlements -public enum Entitlements: Codable, Equatable { +public enum Entitlements: Codable, Equatable, Sendable { /// The path to an existing .entitlements file. case file(path: Path) diff --git a/Sources/ProjectDescription/EnvironmentVariable.swift b/Sources/ProjectDescription/EnvironmentVariable.swift index 8700fa52772..934148e609c 100644 --- a/Sources/ProjectDescription/EnvironmentVariable.swift +++ b/Sources/ProjectDescription/EnvironmentVariable.swift @@ -1,7 +1,7 @@ import Foundation /// It represents an environment variable that is passed when running a scheme's action -public struct EnvironmentVariable: Equatable, Codable, Hashable, ExpressibleByStringLiteral { +public struct EnvironmentVariable: Equatable, Codable, Hashable, ExpressibleByStringLiteral, Sendable { // MARK: - Attributes /// The value of the environment variable diff --git a/Sources/ProjectDescription/ExecuteAction.swift b/Sources/ProjectDescription/ExecuteAction.swift index 4834095af64..8cc29931336 100644 --- a/Sources/ProjectDescription/ExecuteAction.swift +++ b/Sources/ProjectDescription/ExecuteAction.swift @@ -1,7 +1,7 @@ import Foundation /// An action that can be executed as part of another action for pre or post execution. -public struct ExecutionAction: Equatable, Codable { +public struct ExecutionAction: Equatable, Codable, Sendable { public var title: String public var scriptText: String public var target: TargetReference? diff --git a/Sources/ProjectDescription/FileCodeGen.swift b/Sources/ProjectDescription/FileCodeGen.swift index c6814c01e70..1d3429e8eeb 100644 --- a/Sources/ProjectDescription/FileCodeGen.swift +++ b/Sources/ProjectDescription/FileCodeGen.swift @@ -1,7 +1,7 @@ import Foundation /// Options for source file code generation. -public enum FileCodeGen: String, Codable, Equatable { +public enum FileCodeGen: String, Codable, Equatable, Sendable { /// Public codegen case `public` /// Private codegen diff --git a/Sources/ProjectDescription/FileElement.swift b/Sources/ProjectDescription/FileElement.swift index 3cb4f4e0651..971a30a33cf 100644 --- a/Sources/ProjectDescription/FileElement.swift +++ b/Sources/ProjectDescription/FileElement.swift @@ -7,7 +7,7 @@ import Foundation /// /// Note: For convenience, an element can be represented as a string literal /// `"some/pattern/**"` is the equivalent of `FileElement.glob(pattern: "some/pattern/**")` -public enum FileElement: Codable, Equatable { +public enum FileElement: Codable, Equatable, Sendable { /// A file path (or glob pattern) to include. For convenience, a string literal can be used as an alternate way to specify /// this option. case glob(pattern: Path) diff --git a/Sources/ProjectDescription/FileHeaderTemplate.swift b/Sources/ProjectDescription/FileHeaderTemplate.swift index aba7798b05c..e289db76055 100644 --- a/Sources/ProjectDescription/FileHeaderTemplate.swift +++ b/Sources/ProjectDescription/FileHeaderTemplate.swift @@ -10,7 +10,7 @@ import Foundation /// - if your template doesn't start with comment and whitespace or newline, we add a space - otherwise your header would be /// glued to implicit comment slashes which you probably do not want /// - if your template has trailing newline, we remove it as it is implicitly added by Xcode -public enum FileHeaderTemplate: Codable, Equatable, ExpressibleByStringInterpolation { +public enum FileHeaderTemplate: Codable, Equatable, ExpressibleByStringInterpolation, Sendable { /// Load template stored in file case file(Path) /// Use inline string as template diff --git a/Sources/ProjectDescription/FileList.swift b/Sources/ProjectDescription/FileList.swift index 4462698cbcf..13159e023fc 100644 --- a/Sources/ProjectDescription/FileList.swift +++ b/Sources/ProjectDescription/FileList.swift @@ -4,7 +4,7 @@ import Foundation /// /// The list of files can be initialized with a string that represents the glob pattern, or an array of strings, which represents /// a list of glob patterns. -public struct FileList: Codable, Equatable { +public struct FileList: Codable, Equatable, Sendable { /// Glob pattern to the files. public let globs: [FileListGlob] diff --git a/Sources/ProjectDescription/FileListGlob.swift b/Sources/ProjectDescription/FileListGlob.swift index 125049834ba..4db2ed6f910 100644 --- a/Sources/ProjectDescription/FileListGlob.swift +++ b/Sources/ProjectDescription/FileListGlob.swift @@ -1,7 +1,7 @@ import Foundation /// A glob pattern that refers to files. -public struct FileListGlob: Codable, Equatable { +public struct FileListGlob: Codable, Equatable, Sendable { /// The path with a glob pattern. public var glob: Path diff --git a/Sources/ProjectDescription/Headers.swift b/Sources/ProjectDescription/Headers.swift index 2b240d2543f..d97a7838b4b 100644 --- a/Sources/ProjectDescription/Headers.swift +++ b/Sources/ProjectDescription/Headers.swift @@ -1,9 +1,9 @@ import Foundation /// A group of public, private and project headers. -public struct Headers: Codable, Equatable { +public struct Headers: Codable, Equatable, Sendable { /// Determine how to resolve cases, when the same files found in different header scopes - public enum AutomaticExclusionRule: Int, Codable { + public enum AutomaticExclusionRule: Int, Codable, Sendable { /// Project headers = all found - private headers - public headers /// /// Order of tuist search: diff --git a/Sources/ProjectDescription/InfoPlist.swift b/Sources/ProjectDescription/InfoPlist.swift index 50d6d3158a2..0aecc6d8eba 100644 --- a/Sources/ProjectDescription/InfoPlist.swift +++ b/Sources/ProjectDescription/InfoPlist.swift @@ -3,7 +3,7 @@ import Foundation // MARK: - InfoPlist /// A info plist from a file, a custom dictonary or a extended defaults. -public enum InfoPlist: Codable, Equatable { +public enum InfoPlist: Codable, Equatable, Sendable { /// The path to an existing Info.plist file. case file(path: Path) diff --git a/Sources/ProjectDescription/LaunchArgument.swift b/Sources/ProjectDescription/LaunchArgument.swift index 1fa8d29f4cf..9bd2954f8d1 100644 --- a/Sources/ProjectDescription/LaunchArgument.swift +++ b/Sources/ProjectDescription/LaunchArgument.swift @@ -1,7 +1,7 @@ import Foundation /// A launch argument, passed when running a scheme. -public struct LaunchArgument: Equatable, Codable { +public struct LaunchArgument: Equatable, Codable, Sendable { // MARK: - Attributes /// Name of argument diff --git a/Sources/ProjectDescription/LaunchStyle.swift b/Sources/ProjectDescription/LaunchStyle.swift index 93e06b7c9de..ed05491891c 100644 --- a/Sources/ProjectDescription/LaunchStyle.swift +++ b/Sources/ProjectDescription/LaunchStyle.swift @@ -1,6 +1,6 @@ import Foundation -public enum LaunchStyle: Codable { +public enum LaunchStyle: Codable, Sendable { case automatically case waitForExecutableToBeLaunched } diff --git a/Sources/ProjectDescription/MergedBinaryType.swift b/Sources/ProjectDescription/MergedBinaryType.swift index 2de57535084..9d3c0cc59bd 100644 --- a/Sources/ProjectDescription/MergedBinaryType.swift +++ b/Sources/ProjectDescription/MergedBinaryType.swift @@ -1,7 +1,7 @@ /// Represents the different options to configure a target for mergeable libraries /// /// https://developer.apple.com/documentation/xcode/configuring-your-project-to-use-mergeable-libraries -public enum MergedBinaryType: Equatable, Codable { +public enum MergedBinaryType: Equatable, Codable, Sendable { /// Target is never going to merge available dependencies case disabled diff --git a/Sources/ProjectDescription/OnDemandResourcesTags.swift b/Sources/ProjectDescription/OnDemandResourcesTags.swift index cd11ee29f51..8fc26f1fbcf 100644 --- a/Sources/ProjectDescription/OnDemandResourcesTags.swift +++ b/Sources/ProjectDescription/OnDemandResourcesTags.swift @@ -1,5 +1,5 @@ /// On-demand resources tags associated with Initial Install and Prefetched Order categories -public struct OnDemandResourcesTags: Codable, Equatable { +public struct OnDemandResourcesTags: Codable, Equatable, Sendable { /// Initial install tags associated with on demand resources public let initialInstall: [String]? /// Prefetched tag order associated with on demand resources diff --git a/Sources/ProjectDescription/Package.swift b/Sources/ProjectDescription/Package.swift index 5280868f20e..28fc9ada24b 100644 --- a/Sources/ProjectDescription/Package.swift +++ b/Sources/ProjectDescription/Package.swift @@ -4,7 +4,7 @@ /// - remote: A Git URL to the source of the package, /// and a requirement for the version of the package. /// - local: A relative path to the package. -public enum Package: Equatable, Codable { +public enum Package: Equatable, Codable, Sendable { case remote(url: String, requirement: Requirement) case local(path: Path) @@ -15,7 +15,7 @@ public enum Package: Equatable, Codable { } extension Package { - public enum Requirement: Codable, Equatable { + public enum Requirement: Codable, Equatable, Sendable { case upToNextMajor(from: Version) case upToNextMinor(from: Version) case range(from: Version, to: Version) diff --git a/Sources/ProjectDescription/Path.swift b/Sources/ProjectDescription/Path.swift index 5be71270848..6a58ff471f1 100644 --- a/Sources/ProjectDescription/Path.swift +++ b/Sources/ProjectDescription/Path.swift @@ -4,8 +4,8 @@ import Foundation /// /// Paths can be relative and absolute. We discourage using absolute paths because they create a dependency with the environment /// where they are defined. -public struct Path: ExpressibleByStringInterpolation, Codable, Hashable { - public enum PathType: String, Codable { +public struct Path: ExpressibleByStringInterpolation, Codable, Hashable, Sendable { + public enum PathType: String, Codable, Sendable { case relativeToCurrentFile case relativeToManifest case relativeToRoot diff --git a/Sources/ProjectDescription/Platform.swift b/Sources/ProjectDescription/Platform.swift index 77c35e85847..fc4f34cac7b 100644 --- a/Sources/ProjectDescription/Platform.swift +++ b/Sources/ProjectDescription/Platform.swift @@ -3,7 +3,7 @@ import Foundation // MARK: - Platform /// A supported platform representation. -public enum Platform: String, Codable, Equatable, CaseIterable { +public enum Platform: String, Codable, Equatable, CaseIterable, Sendable { /// The iOS platform case iOS = "ios" /// The macOS platform @@ -17,7 +17,7 @@ public enum Platform: String, Codable, Equatable, CaseIterable { } /// A supported Swift Package Manager platform representation. -public enum PackagePlatform: String, Codable, Equatable, CaseIterable { +public enum PackagePlatform: String, Codable, Equatable, CaseIterable, Sendable { /// The iOS platform case iOS = "ios" /// The macOS platform diff --git a/Sources/ProjectDescription/PlatformCondition.swift b/Sources/ProjectDescription/PlatformCondition.swift index 1191edd8145..5f5daa4824b 100644 --- a/Sources/ProjectDescription/PlatformCondition.swift +++ b/Sources/ProjectDescription/PlatformCondition.swift @@ -1,7 +1,7 @@ import Foundation /// A condition applied to an "entity" allowing it to only be used in certain circumstances -public struct PlatformCondition: Codable, Hashable, Equatable { +public struct PlatformCondition: Codable, Hashable, Equatable, Sendable { public let platformFilters: Set /// For internal use only. use `.when` to ensure we can not have a `PlatformCondition` with an empty set of filters. private init(platformFilters: Set) { diff --git a/Sources/ProjectDescription/PlatformFilter.swift b/Sources/ProjectDescription/PlatformFilter.swift index 01eb8a3a9ba..f2685820c42 100644 --- a/Sources/ProjectDescription/PlatformFilter.swift +++ b/Sources/ProjectDescription/PlatformFilter.swift @@ -4,7 +4,7 @@ extension PlatformFilters { public static let all = Set(PlatformFilter.allCases) } -public enum PlatformFilter: Comparable, Hashable, Codable, CaseIterable { +public enum PlatformFilter: Comparable, Hashable, Codable, CaseIterable, Sendable { case ios case macos case tvos diff --git a/Sources/ProjectDescription/Plist.swift b/Sources/ProjectDescription/Plist.swift index 65dec47d3de..00ed8a4b84f 100644 --- a/Sources/ProjectDescription/Plist.swift +++ b/Sources/ProjectDescription/Plist.swift @@ -5,7 +5,7 @@ import Foundation public enum Plist { /// It represents the values of the .plist or .entitlements file dictionary. /// It ensures that the values used to define the content of the dynamically generated .plist or .entitlements files are valid - public indirect enum Value: Codable, Equatable { + public indirect enum Value: Codable, Equatable, Sendable { /// It represents a string value. case string(String) /// It represents an integer value. diff --git a/Sources/ProjectDescription/PluginLocation.swift b/Sources/ProjectDescription/PluginLocation.swift index a4f5d57fd97..ae726229177 100644 --- a/Sources/ProjectDescription/PluginLocation.swift +++ b/Sources/ProjectDescription/PluginLocation.swift @@ -1,7 +1,7 @@ import Foundation /// A location to a plugin, either local or remote. -public struct PluginLocation: Codable, Equatable { +public struct PluginLocation: Codable, Equatable, Sendable { /// The type of location `local` or `git`. public var type: LocationType @@ -43,7 +43,7 @@ public struct PluginLocation: Codable, Equatable { // MARK: - Codable extension PluginLocation { - public enum LocationType: Codable, Equatable { + public enum LocationType: Codable, Equatable, Sendable { case local(path: Path) case gitWithTag(url: String, tag: String, directory: String?, releaseUrl: String?) case gitWithSha(url: String, sha: String, directory: String?) diff --git a/Sources/ProjectDescription/PrivacyManifest.swift b/Sources/ProjectDescription/PrivacyManifest.swift index b59504aa664..8f1f0cf349a 100644 --- a/Sources/ProjectDescription/PrivacyManifest.swift +++ b/Sources/ProjectDescription/PrivacyManifest.swift @@ -1,7 +1,7 @@ import Foundation /// Describe the data your app or third-party SDK collects and the reasons required APIs it uses. -public struct PrivacyManifest: Codable, Equatable { +public struct PrivacyManifest: Codable, Equatable, Sendable { /// A Boolean that indicates whether your app or third-party SDK uses data for tracking as defined under the App /// Tracking Transparency framework. For more information, see [User Privacy and Data /// Use](https://developer.apple.com/app-store/user-privacy-and-data-use/). diff --git a/Sources/ProjectDescription/Product.swift b/Sources/ProjectDescription/Product.swift index 3ac40028986..b473cb0f78f 100644 --- a/Sources/ProjectDescription/Product.swift +++ b/Sources/ProjectDescription/Product.swift @@ -1,7 +1,7 @@ import Foundation /// Possible products types. -public enum Product: String, Codable, Equatable { +public enum Product: String, Codable, Equatable, Sendable { /// An application. case app /// A static library. diff --git a/Sources/ProjectDescription/ProfileAction.swift b/Sources/ProjectDescription/ProfileAction.swift index 71bb10f93cc..cb9c27ab1d4 100644 --- a/Sources/ProjectDescription/ProfileAction.swift +++ b/Sources/ProjectDescription/ProfileAction.swift @@ -3,7 +3,7 @@ import Foundation /// An action that profiles the built products. /// /// It's initialized with the `.profileAction` static method -public struct ProfileAction: Equatable, Codable { +public struct ProfileAction: Equatable, Codable, Sendable { /// Indicates the build configuration the product should be profiled with. public var configuration: ConfigurationName diff --git a/Sources/ProjectDescription/Project.swift b/Sources/ProjectDescription/Project.swift index 35e5e9b96bc..0c78dc30f64 100644 --- a/Sources/ProjectDescription/Project.swift +++ b/Sources/ProjectDescription/Project.swift @@ -60,7 +60,7 @@ import Foundation /// ] /// ) /// ``` -public struct Project: Codable, Equatable { +public struct Project: Codable, Equatable, Sendable { /// The name of the project. Also, the file name of the generated Xcode project. public let name: String /// The name of the organization used by Xcode as copyright. diff --git a/Sources/ProjectDescription/ProjectOptions.swift b/Sources/ProjectDescription/ProjectOptions.swift index 8f32dc0a521..dd0660c1b8f 100644 --- a/Sources/ProjectDescription/ProjectOptions.swift +++ b/Sources/ProjectDescription/ProjectOptions.swift @@ -2,7 +2,7 @@ import Foundation extension Project { /// Options to configure a project. - public struct Options: Codable, Equatable { + public struct Options: Codable, Equatable, Sendable { /// Configures automatic target schemes generation. public var automaticSchemesOptions: AutomaticSchemesOptions @@ -55,9 +55,9 @@ extension Project { extension Project.Options { /// Automatic schemes options allow customizing the generation of the target schemes. - public enum AutomaticSchemesOptions: Codable, Equatable { + public enum AutomaticSchemesOptions: Codable, Equatable, Sendable { /// Allows you to define what targets will be enabled for code coverage data gathering. - public enum TargetSchemesGrouping: Codable, Equatable { + public enum TargetSchemesGrouping: Codable, Equatable, Sendable { /// Generate a single scheme for each project. case singleScheme @@ -89,7 +89,7 @@ extension Project.Options { } /// The text settings options - public struct TextSettings: Codable, Equatable { + public struct TextSettings: Codable, Equatable, Sendable { /// Whether tabs should be used instead of spaces public var usesTabs: Bool? diff --git a/Sources/ProjectDescription/ResourceFileElement.swift b/Sources/ProjectDescription/ResourceFileElement.swift index d272e4a365e..0cac8ab5820 100644 --- a/Sources/ProjectDescription/ResourceFileElement.swift +++ b/Sources/ProjectDescription/ResourceFileElement.swift @@ -7,7 +7,7 @@ import Foundation /// /// Note: For convenience, an element can be represented as a string literal /// `"some/pattern/**"` is the equivalent of `ResourceFileElement.glob(pattern: "some/pattern/**")` -public enum ResourceFileElement: Codable, Equatable { +public enum ResourceFileElement: Codable, Equatable, Sendable { /// A glob pattern of files to include and ODR tags case glob(pattern: Path, excluding: [Path] = [], tags: [String] = [], inclusionCondition: PlatformCondition? = nil) diff --git a/Sources/ProjectDescription/ResourceFileElements.swift b/Sources/ProjectDescription/ResourceFileElements.swift index 8f009eb40bc..9a0e998c5d8 100644 --- a/Sources/ProjectDescription/ResourceFileElements.swift +++ b/Sources/ProjectDescription/ResourceFileElements.swift @@ -1,7 +1,7 @@ import Foundation /// A collection of resource file. -public struct ResourceFileElements: Codable, Equatable { +public struct ResourceFileElements: Codable, Equatable, Sendable { /// List of resource file elements public var resources: [ResourceFileElement] diff --git a/Sources/ProjectDescription/ResourceSynthesizer.swift b/Sources/ProjectDescription/ResourceSynthesizer.swift index e6d8ecfb8ae..2f4fb377ff0 100644 --- a/Sources/ProjectDescription/ResourceSynthesizer.swift +++ b/Sources/ProjectDescription/ResourceSynthesizer.swift @@ -7,7 +7,7 @@ import Foundation /// - `.strings(parserOptions: ["separator": "/"])` to use strings template with SwiftGen Parser Options /// - `.strings(plugin: "MyPlugin")` to use strings template from a plugin /// - `.strings(templatePath: "Templates/Strings.stencil")` to use strings template at a given path -public struct ResourceSynthesizer: Codable, Equatable { // swiftlint:disable:this type_body_length +public struct ResourceSynthesizer: Codable, Equatable, Sendable { // swiftlint:disable:this type_body_length /// Templates can be of multiple types public var templateType: TemplateType public var parser: Parser @@ -15,7 +15,7 @@ public struct ResourceSynthesizer: Codable, Equatable { // swiftlint:disable:thi public var extensions: Set /// Templates can be either a local template file, from a plugin, or a default template from tuist - public enum TemplateType: Codable, Equatable { + public enum TemplateType: Codable, Equatable, Sendable { /// Plugin template file /// `name` is a name of a plugin /// `resourceName` is a name of the resource - that is used for finding a template as well as naming the resulting @@ -30,7 +30,7 @@ public struct ResourceSynthesizer: Codable, Equatable { // swiftlint:disable:thi /// Each parser will give you different metadata from a file /// You can read more about available parsers and how to use their metadata here: /// https://github.com/SwiftGen/SwiftGen#available-parsers - public enum Parser: String, Codable { + public enum Parser: String, Codable, Sendable { case strings case assets case plists @@ -41,7 +41,7 @@ public struct ResourceSynthesizer: Codable, Equatable { // swiftlint:disable:thi case yaml case files - public enum Option: Equatable, Codable { + public enum Option: Equatable, Codable, Sendable { /// It represents a string value. case string(String) /// It represents an integer value. diff --git a/Sources/ProjectDescription/RunAction.swift b/Sources/ProjectDescription/RunAction.swift index e0067a8e6ce..91f239e3df1 100644 --- a/Sources/ProjectDescription/RunAction.swift +++ b/Sources/ProjectDescription/RunAction.swift @@ -3,7 +3,7 @@ import Foundation /// An action that runs the built products. /// /// It's initialized with the .runAction static method. -public struct RunAction: Equatable, Codable { +public struct RunAction: Equatable, Codable, Sendable { /// Indicates the build configuration the product should run with. public var configuration: ConfigurationName diff --git a/Sources/ProjectDescription/RunActionOptions.swift b/Sources/ProjectDescription/RunActionOptions.swift index bdf40319b92..7d488f57bdb 100644 --- a/Sources/ProjectDescription/RunActionOptions.swift +++ b/Sources/ProjectDescription/RunActionOptions.swift @@ -1,7 +1,7 @@ import Foundation /// Options for the `RunAction` action -public struct RunActionOptions: Equatable, Codable { +public struct RunActionOptions: Equatable, Codable, Sendable { /// Language to use when running the app. public var language: SchemeLanguage? @@ -88,7 +88,7 @@ public struct RunActionOptions: Equatable, Codable { } extension RunActionOptions { - public enum GPUFrameCaptureMode: String, Codable, Equatable { + public enum GPUFrameCaptureMode: String, Codable, Equatable, Sendable { case autoEnabled case metal case openGL diff --git a/Sources/ProjectDescription/Scheme.swift b/Sources/ProjectDescription/Scheme.swift index 1700395af7c..05a03e22bcb 100644 --- a/Sources/ProjectDescription/Scheme.swift +++ b/Sources/ProjectDescription/Scheme.swift @@ -3,7 +3,7 @@ import Foundation /// A custom scheme for a project. /// /// A scheme defines a collection of targets to Build, Run, Test, Profile, Analyze and Archive. -public struct Scheme: Equatable, Codable { +public struct Scheme: Equatable, Codable, Sendable { /// The name of the scheme. public var name: String /// Marks the scheme as shared (i.e. one that is checked in to the repository and is visible to xcodebuild from the command diff --git a/Sources/ProjectDescription/SchemeDiagnosticsOptions.swift b/Sources/ProjectDescription/SchemeDiagnosticsOptions.swift index 861daa62116..93691c95227 100644 --- a/Sources/ProjectDescription/SchemeDiagnosticsOptions.swift +++ b/Sources/ProjectDescription/SchemeDiagnosticsOptions.swift @@ -1,7 +1,7 @@ import Foundation /// Options to configure scheme diagnostics for run and test actions. -public struct SchemeDiagnosticsOptions: Equatable, Codable { +public struct SchemeDiagnosticsOptions: Equatable, Codable, Sendable { /// Enable the address sanitizer public var addressSanitizerEnabled: Bool diff --git a/Sources/ProjectDescription/SchemeLanguage.swift b/Sources/ProjectDescription/SchemeLanguage.swift index d5a5473c1b2..c55bcd7c908 100644 --- a/Sources/ProjectDescription/SchemeLanguage.swift +++ b/Sources/ProjectDescription/SchemeLanguage.swift @@ -1,7 +1,7 @@ import Foundation /// A language to use for run and test actions. -public struct SchemeLanguage: Codable, Equatable, ExpressibleByStringLiteral { +public struct SchemeLanguage: Codable, Equatable, ExpressibleByStringLiteral, Sendable { public let identifier: String /// Creates a new scheme language. diff --git a/Sources/ProjectDescription/ScreenCaptureFormat.swift b/Sources/ProjectDescription/ScreenCaptureFormat.swift index 127729f3bb8..bae08f82d30 100644 --- a/Sources/ProjectDescription/ScreenCaptureFormat.swift +++ b/Sources/ProjectDescription/ScreenCaptureFormat.swift @@ -7,7 +7,7 @@ import Foundation /// In Xcode 15 screen recordings are enabled by default (in favour of screenshots). /// This setting is ignored by Xcode 14.x and prior. /// -public enum ScreenCaptureFormat: String, Codable { +public enum ScreenCaptureFormat: String, Codable, Sendable { /// Screenshots case screenshots /// Automatic screen recordings diff --git a/Sources/ProjectDescription/Settings.swift b/Sources/ProjectDescription/Settings.swift index ff5ea547adb..4a755254f68 100644 --- a/Sources/ProjectDescription/Settings.swift +++ b/Sources/ProjectDescription/Settings.swift @@ -4,7 +4,7 @@ public typealias SettingsDictionary = [String: SettingValue] /// A value or a collection of values used for settings configuration. public enum SettingValue: ExpressibleByStringInterpolation, ExpressibleByArrayLiteral, ExpressibleByBooleanLiteral, Equatable, - Codable + Codable, Sendable { case string(String) case array([String]) @@ -32,8 +32,8 @@ public enum SettingValue: ExpressibleByStringInterpolation, ExpressibleByArrayLi /// A the build settings and the .xcconfig file of a project or target. It is initialized with either the `.debug` or `.release` /// static method. -public struct Configuration: Equatable, Codable { - public enum Variant: String, Codable { +public struct Configuration: Equatable, Codable, Sendable { + public enum Variant: String, Codable, Sendable { case debug case release } @@ -89,7 +89,7 @@ public struct Configuration: Equatable, Codable { /// Specifies the default set of settings applied to all the projects and targets. /// The default settings can be overridden via `Settings base: SettingsDictionary` /// and `Configuration settings: SettingsDictionary`. -public enum DefaultSettings: Codable, Equatable { +public enum DefaultSettings: Codable, Equatable, Sendable { /// Recommended settings including warning flags to help you catch some of the bugs at the early stage of development. If you /// need to override certain settings in a `Configuration` it's possible to add those keys to `excluding`. case recommended(excluding: Set = []) @@ -114,7 +114,7 @@ extension DefaultSettings { // MARK: - Settings /// A group of settings configuration. -public struct Settings: Equatable, Codable { +public struct Settings: Equatable, Codable, Sendable { /// A dictionary with build settings that are inherited from all the configurations. public var base: SettingsDictionary public var configurations: [Configuration] diff --git a/Sources/ProjectDescription/SimulatedLocation.swift b/Sources/ProjectDescription/SimulatedLocation.swift index b34b38e2968..3b4d9a519e2 100644 --- a/Sources/ProjectDescription/SimulatedLocation.swift +++ b/Sources/ProjectDescription/SimulatedLocation.swift @@ -1,7 +1,7 @@ import Foundation /// Simulated location represents a GPS location that is used when running an app on the simulator. -public struct SimulatedLocation: Codable, Equatable { +public struct SimulatedLocation: Codable, Equatable, Sendable { /// The identifier of the location (e.g. London, England) public var identifier: String? /// Path to a .gpx file that indicates the location diff --git a/Sources/ProjectDescription/SourceFilesList.swift b/Sources/ProjectDescription/SourceFilesList.swift index 8b3219c7728..cfef5914b8f 100644 --- a/Sources/ProjectDescription/SourceFilesList.swift +++ b/Sources/ProjectDescription/SourceFilesList.swift @@ -1,7 +1,7 @@ import Foundation /// A glob pattern configuration representing source files and its compiler flags, if any. -public struct SourceFileGlob: Codable, Equatable { +public struct SourceFileGlob: Codable, Equatable, Sendable { /// Glob pattern to the source files. public var glob: Path @@ -66,7 +66,7 @@ extension SourceFileGlob: ExpressibleByStringInterpolation { } /// A collection of source file globs. -public struct SourceFilesList: Codable, Equatable { +public struct SourceFilesList: Codable, Equatable, Sendable { /// List glob patterns. public var globs: [SourceFileGlob] diff --git a/Sources/ProjectDescription/Target.swift b/Sources/ProjectDescription/Target.swift index 86268baeb43..8cbb7840977 100644 --- a/Sources/ProjectDescription/Target.swift +++ b/Sources/ProjectDescription/Target.swift @@ -1,7 +1,7 @@ import Foundation /// A target of a project. -public struct Target: Codable, Equatable { +public struct Target: Codable, Equatable, Sendable { /// The name of the target. Also, the product name if not specified with ``productName``. public var name: String diff --git a/Sources/ProjectDescription/TargetDependency.swift b/Sources/ProjectDescription/TargetDependency.swift index 3e88651fe22..1598ec3c618 100644 --- a/Sources/ProjectDescription/TargetDependency.swift +++ b/Sources/ProjectDescription/TargetDependency.swift @@ -2,7 +2,7 @@ import Foundation /// Dependency status used by `.framework` and `.xcframework` target /// dependencies -public enum FrameworkStatus: String, Codable, Hashable { +public enum FrameworkStatus: String, Codable, Hashable, Sendable { /// Required dependency case required @@ -11,7 +11,7 @@ public enum FrameworkStatus: String, Codable, Hashable { } /// Dependency status used by `.sdk` target dependencies -public enum SDKStatus: String, Codable, Hashable { +public enum SDKStatus: String, Codable, Hashable, Sendable { /// Required dependency case required @@ -20,7 +20,7 @@ public enum SDKStatus: String, Codable, Hashable { } /// Dependency type used by `.sdk` target dependencies -public enum SDKType: String, Codable, Hashable { +public enum SDKType: String, Codable, Hashable, Sendable { /// Library SDK dependency case library @@ -29,8 +29,8 @@ public enum SDKType: String, Codable, Hashable { } /// A target dependency. -public enum TargetDependency: Codable, Hashable { - public enum PackageType: Codable, Hashable { +public enum TargetDependency: Codable, Hashable, Sendable { + public enum PackageType: Codable, Hashable, Sendable { /// A runtime package type represents a standard package whose sources are linked at runtime. /// For example importing the framework and consuming from dependent targets. case runtime diff --git a/Sources/ProjectDescription/TargetReference.swift b/Sources/ProjectDescription/TargetReference.swift index afc7384d9d4..0ade25bd940 100644 --- a/Sources/ProjectDescription/TargetReference.swift +++ b/Sources/ProjectDescription/TargetReference.swift @@ -3,7 +3,7 @@ import Foundation /// A target reference for a specified project. /// /// The project is specified through the path and should contain the target name. -public struct TargetReference: Hashable, Codable, ExpressibleByStringInterpolation { +public struct TargetReference: Hashable, Codable, ExpressibleByStringInterpolation, Sendable { /// Path to the target's project directory. public var projectPath: Path? /// Name of the target. diff --git a/Sources/ProjectDescription/TargetScript.swift b/Sources/ProjectDescription/TargetScript.swift index 71b9c86f3ec..a92e95c8441 100644 --- a/Sources/ProjectDescription/TargetScript.swift +++ b/Sources/ProjectDescription/TargetScript.swift @@ -4,12 +4,12 @@ import Foundation /// /// Target scripts, represented as target script build phases in the generated Xcode projects, are useful to define actions to be /// executed before of after the build process of a target. -public struct TargetScript: Codable, Equatable { // swiftlint:disable:this type_body_length +public struct TargetScript: Codable, Equatable, Sendable { // swiftlint:disable:this type_body_length /// Order when the script gets executed. /// /// - pre: Before the sources and resources build phase. /// - post: After the sources and resources build phase. - public enum Order: String, Codable, Equatable { + public enum Order: String, Codable, Equatable, Sendable { case pre case post } @@ -19,7 +19,7 @@ public struct TargetScript: Codable, Equatable { // swiftlint:disable:this type_ /// - tool: Executes the tool with the given arguments. Tuist will look up the tool on the environment's PATH. /// - scriptPath: Executes the file at the path with the given arguments. /// - text: Executes the embedded script. This should be a short command. - public enum Script: Equatable, Codable { + public enum Script: Equatable, Codable, Sendable { case tool(path: String, args: [String]) case scriptPath(path: Path, args: [String]) case embedded(String) diff --git a/Sources/ProjectDescription/Template/Template.swift b/Sources/ProjectDescription/Template/Template.swift index 0a9612473d1..fd45c1e7b31 100644 --- a/Sources/ProjectDescription/Template/Template.swift +++ b/Sources/ProjectDescription/Template/Template.swift @@ -1,7 +1,7 @@ import Foundation /// A scaffold template model. -public struct Template: Codable, Equatable { +public struct Template: Codable, Equatable, Sendable { /// Description of template public let description: String /// Attributes to be passed to template @@ -21,7 +21,7 @@ public struct Template: Codable, Equatable { } /// Enum containing information about how to generate item - public enum Contents: Codable, Equatable { + public enum Contents: Codable, Equatable, Sendable { /// String Contents is defined in `name_of_template.swift` and contains a simple `String` /// Can not contain any additional logic apart from plain `String` from `arguments` case string(String) @@ -34,7 +34,7 @@ public struct Template: Codable, Equatable { } /// File description for generating - public struct Item: Codable, Equatable { + public struct Item: Codable, Equatable, Sendable { public let path: String public let contents: Contents @@ -44,7 +44,7 @@ public struct Template: Codable, Equatable { } /// Attribute to be passed to `tuist scaffold` for generating with `Template` - public enum Attribute: Codable, Equatable { + public enum Attribute: Codable, Equatable, Sendable { /// Required attribute with a given name case required(String) /// Optional attribute with a given name and a default value used when attribute not provided by user @@ -54,7 +54,7 @@ public struct Template: Codable, Equatable { extension Template.Attribute { /// This represents the default value type of Attribute - public indirect enum Value: Codable, Equatable { + public indirect enum Value: Codable, Equatable, Sendable { /// It represents a string value. case string(String) /// It represents an integer value. diff --git a/Sources/ProjectDescription/TestAction.swift b/Sources/ProjectDescription/TestAction.swift index 1af31ca5a6f..57036fa7e56 100644 --- a/Sources/ProjectDescription/TestAction.swift +++ b/Sources/ProjectDescription/TestAction.swift @@ -4,7 +4,7 @@ import Foundation /// /// You can create a test action with either a set of test targets or test plans using the `.targets` or `.testPlans` static /// methods respectively. -public struct TestAction: Equatable, Codable { +public struct TestAction: Equatable, Codable, Sendable { /// List of test plans. The first in the list will be the default plan. public var testPlans: [Path]? diff --git a/Sources/ProjectDescription/TestActionOptions.swift b/Sources/ProjectDescription/TestActionOptions.swift index 60762d8ab7e..78eb159c553 100644 --- a/Sources/ProjectDescription/TestActionOptions.swift +++ b/Sources/ProjectDescription/TestActionOptions.swift @@ -1,7 +1,7 @@ import Foundation /// The type `TestActionOptions` represents a set of options for a test action. -public struct TestActionOptions: Equatable, Codable { +public struct TestActionOptions: Equatable, Codable, Sendable { /// Language used to run the tests. public var language: SchemeLanguage? diff --git a/Sources/ProjectDescription/TestableTarget.swift b/Sources/ProjectDescription/TestableTarget.swift index a4a7e919cd4..004cf368976 100644 --- a/Sources/ProjectDescription/TestableTarget.swift +++ b/Sources/ProjectDescription/TestableTarget.swift @@ -1,6 +1,6 @@ import Foundation -public struct TestableTarget: Equatable, Codable, ExpressibleByStringInterpolation { +public struct TestableTarget: Equatable, Codable, ExpressibleByStringInterpolation, Sendable { public var target: TargetReference public var isSkipped: Bool public var isParallelizable: Bool diff --git a/Sources/ProjectDescription/TestingOptions.swift b/Sources/ProjectDescription/TestingOptions.swift index b644eae3327..9cbb0fcf032 100644 --- a/Sources/ProjectDescription/TestingOptions.swift +++ b/Sources/ProjectDescription/TestingOptions.swift @@ -1,5 +1,5 @@ /// Options to configure testing of autogenerated schemes. -public struct TestingOptions: OptionSet, Codable, Equatable { +public struct TestingOptions: OptionSet, Codable, Equatable, Sendable { public let rawValue: Int public init(rawValue: Int) { diff --git a/Sources/ProjectDescription/Version.swift b/Sources/ProjectDescription/Version.swift index 3c273194f33..e9b6a1ccb9a 100644 --- a/Sources/ProjectDescription/Version.swift +++ b/Sources/ProjectDescription/Version.swift @@ -1,7 +1,7 @@ /// A struct representing a semver version. /// This is taken from SPMUtility and copied here so we do not create a direct dependency for ProjectDescription. Used for /// specifying version number requirements inside of Project.swift -public struct Version: Hashable, Codable { +public struct Version: Hashable, Codable, Sendable { /// The major version. public var major: Int diff --git a/Sources/ProjectDescription/Workspace.swift b/Sources/ProjectDescription/Workspace.swift index bb2a6cb6de0..197e5cfcc0a 100644 --- a/Sources/ProjectDescription/Workspace.swift +++ b/Sources/ProjectDescription/Workspace.swift @@ -22,7 +22,7 @@ import Foundation /// ) /// ``` -public struct Workspace: Codable, Equatable { +public struct Workspace: Codable, Equatable, Sendable { /// The name of the workspace. Also, the file name of the generated Xcode workspace. public let name: String diff --git a/Sources/ProjectDescription/WorkspaceGenerationOptions.swift b/Sources/ProjectDescription/WorkspaceGenerationOptions.swift index c54dab3d865..40d6dee2239 100644 --- a/Sources/ProjectDescription/WorkspaceGenerationOptions.swift +++ b/Sources/ProjectDescription/WorkspaceGenerationOptions.swift @@ -1,10 +1,10 @@ extension Workspace { /// Generation options allow customizing the generation of the Xcode workspace. - public struct GenerationOptions: Codable, Equatable { + public struct GenerationOptions: Codable, Equatable, Sendable { /// Contains options for autogenerated workspace schemes - public enum AutogeneratedWorkspaceSchemes: Codable, Equatable { + public enum AutogeneratedWorkspaceSchemes: Codable, Equatable, Sendable { /// Contains options for code coverage - public enum CodeCoverageMode: Codable, Equatable { + public enum CodeCoverageMode: Codable, Equatable, Sendable { /// Gather code coverage data for all targets in workspace. case all /// Enable code coverage for targets that have enabled code coverage in any of schemes in workspace. diff --git a/Sources/TuistSupport/Errors/FatalError.swift b/Sources/TuistSupport/Errors/FatalError.swift index 248642f807f..606ab3213d3 100644 --- a/Sources/TuistSupport/Errors/FatalError.swift +++ b/Sources/TuistSupport/Errors/FatalError.swift @@ -6,7 +6,7 @@ import Foundation /// - bug: error thrown when a bug is found and the execution cannot continue. /// - abortSilent: like abort but without printing anything to the user. /// - bugSilent: like bug but without printing anything to the user. -public enum ErrorType { +public enum ErrorType: Sendable { case abort case bug case abortSilent diff --git a/Sources/TuistSupport/Extensions/Array+ExecutionContext.swift b/Sources/TuistSupport/Extensions/Array+ExecutionContext.swift index dfc5a8bcffe..bed38f2964d 100644 --- a/Sources/TuistSupport/Extensions/Array+ExecutionContext.swift +++ b/Sources/TuistSupport/Extensions/Array+ExecutionContext.swift @@ -1,6 +1,6 @@ import Foundation -extension Array { +extension Array where Element: Sendable { /// Map (with execution context) /// /// - Parameters: @@ -19,7 +19,7 @@ extension Array { /// /// - Parameters: /// - transform: The transformation closure to apply to the array - public func concurrentMap(_ transform: @escaping (Element) async throws -> B) async throws -> [B] { + public func concurrentMap(_ transform: @Sendable @escaping (Element) async throws -> B) async throws -> [B] { let tasks = map { element in Task { try await transform(element) @@ -50,7 +50,9 @@ extension Array { /// /// - Parameters: /// - transform: The transformation closure to apply to the array - public func concurrentCompactMap(_ transform: @escaping (Element) async throws -> B?) async throws -> [B] { + public func concurrentCompactMap(_ transform: @Sendable @escaping (Element) async throws -> B?) async throws + -> [B] + { let tasks = map { element in Task { try await transform(element) diff --git a/Sources/TuistSupport/Extensions/Dictionary+ExecutionContext.swift b/Sources/TuistSupport/Extensions/Dictionary+ExecutionContext.swift index 3596f5e7af0..2d2190ebb86 100644 --- a/Sources/TuistSupport/Extensions/Dictionary+ExecutionContext.swift +++ b/Sources/TuistSupport/Extensions/Dictionary+ExecutionContext.swift @@ -1,4 +1,4 @@ -extension Dictionary { +extension Dictionary where Key: Sendable, Value: Sendable { /// Map (with execution context) /// /// - Parameters: @@ -13,7 +13,7 @@ extension Dictionary { /// /// - Parameters: /// - transform: The transformation closure to apply to the dictionary - public func concurrentMap(_ transform: @escaping (Key, Value) async throws -> B) async throws -> [B] { + public func concurrentMap(_ transform: @Sendable @escaping (Key, Value) async throws -> B) async throws -> [B] { try await map { ($0.key, $0.value) } .concurrentMap(transform) } diff --git a/Sources/TuistSupport/Logging/OSLogHandler.swift b/Sources/TuistSupport/Logging/OSLogHandler.swift index 3cfe2606fe2..52201721881 100644 --- a/Sources/TuistSupport/Logging/OSLogHandler.swift +++ b/Sources/TuistSupport/Logging/OSLogHandler.swift @@ -1,6 +1,6 @@ import Foundation import struct Logging.Logger -import os +@preconcurrency import os public struct OSLogHandler: LogHandler { public var logLevel: Logger.Level diff --git a/Sources/TuistSupport/MachineEnvironment.swift b/Sources/TuistSupport/MachineEnvironment.swift index 12f9cda494b..608827fb427 100644 --- a/Sources/TuistSupport/MachineEnvironment.swift +++ b/Sources/TuistSupport/MachineEnvironment.swift @@ -1,7 +1,7 @@ import CryptoKit import Foundation -public protocol MachineEnvironmentRetrieving { +public protocol MachineEnvironmentRetrieving: Sendable { var clientId: String { get } var macOSVersion: String { get } var swiftVersion: String { get } @@ -10,12 +10,12 @@ public protocol MachineEnvironmentRetrieving { } /// `MachineEnvironment` is a data structure that contains information about the machine executing Tuist -public class MachineEnvironment: MachineEnvironmentRetrieving { +public final class MachineEnvironment: MachineEnvironmentRetrieving { public static let shared = MachineEnvironment() private init() {} /// `clientId` is a unique anonymous hash that identifies the machine running Tuist - public lazy var clientId: String = { + public let clientId: String = { let matchingDict = IOServiceMatching("IOPlatformExpertDevice") let platformExpert = IOServiceGetMatchingService(kIOMainPortDefault, matchingDict) defer { IOObjectRelease(platformExpert) } @@ -33,20 +33,20 @@ public class MachineEnvironment: MachineEnvironmentRetrieving { }() /// The `macOSVersion` of the machine running Tuist, in the format major.minor.path, e.g: "10.15.7" - public lazy var macOSVersion = """ + public let macOSVersion = """ \(ProcessInfo.processInfo.operatingSystemVersion.majorVersion).\ \(ProcessInfo.processInfo.operatingSystemVersion.minorVersion).\ \(ProcessInfo.processInfo.operatingSystemVersion.patchVersion) """ /// The `swiftVersion` of the machine running Tuist - public lazy var swiftVersion = try! System.shared // swiftlint:disable:this force_try + public let swiftVersion = try! System.shared // swiftlint:disable:this force_try .capture(["/usr/bin/xcrun", "swift", "-version"]) .components(separatedBy: "Swift version ").last! .components(separatedBy: " ").first! /// `hardwareName` is the name of the architecture of the machine running Tuist, e.g: "arm64" or "x86_64" - public lazy var hardwareName = ProcessInfo.processInfo.machineHardwareName + public let hardwareName = ProcessInfo.processInfo.machineHardwareName /// Indicates whether Tuist is running in Continuous Integration (CI) environment public var isCI: Bool { diff --git a/Sources/TuistSupport/Models/InvalidGlob.swift b/Sources/TuistSupport/Models/InvalidGlob.swift index 51e8e795dec..dbba010ab91 100644 --- a/Sources/TuistSupport/Models/InvalidGlob.swift +++ b/Sources/TuistSupport/Models/InvalidGlob.swift @@ -1,7 +1,7 @@ import TSCBasic /// A structs that represents an invalid glob pattern. -public struct InvalidGlob: Equatable, CustomStringConvertible { +public struct InvalidGlob: Equatable, CustomStringConvertible, Sendable { /// Glob patterns. public let pattern: String diff --git a/Sources/TuistSupport/System/Publisher+System.swift b/Sources/TuistSupport/System/Publisher+System.swift index ced0cb42db5..b49f7d98d14 100644 --- a/Sources/TuistSupport/System/Publisher+System.swift +++ b/Sources/TuistSupport/System/Publisher+System.swift @@ -1,4 +1,4 @@ -import Combine +@preconcurrency import Combine import Foundation extension Publisher where Output == SystemEvent, Failure == Error { diff --git a/Sources/TuistSupport/System/System.swift b/Sources/TuistSupport/System/System.swift index 0e9d3c0fa71..ce6559966c3 100644 --- a/Sources/TuistSupport/System/System.swift +++ b/Sources/TuistSupport/System/System.swift @@ -73,11 +73,11 @@ public final class System: Systeming { // swiftlint:disable force_try /// Regex expression used to get the Swift version (for example, 5.9) from the output of the 'swift --version' command. - private static var swiftVersionRegex = try! NSRegularExpression(pattern: "Apple Swift version\\s(.+)\\s\\(.+\\)", options: []) + private static let swiftVersionRegex = try! NSRegularExpression(pattern: "Apple Swift version\\s(.+)\\s\\(.+\\)", options: []) /// Regex expression used to get the Swiftlang version (for example, 5.7.0.127.4) from the output of the 'swift --version' /// command. - private static var swiftlangVersion = try! NSRegularExpression(pattern: "swiftlang-(.+)\\sclang", options: []) + private static let swiftlangVersion = try! NSRegularExpression(pattern: "swiftlang-(.+)\\sclang", options: []) // swiftlint:enable force_try diff --git a/Sources/TuistSupport/Utils/ColorizeSwift.swift b/Sources/TuistSupport/Utils/ColorizeSwift.swift index 0ed6f38b022..d9b9ac2d96c 100644 --- a/Sources/TuistSupport/Utils/ColorizeSwift.swift +++ b/Sources/TuistSupport/Utils/ColorizeSwift.swift @@ -57,9 +57,6 @@ public enum TerminalStyle { } extension String { - /// Enable/disable colorization - public static var isColorizationEnabled = true - public func bold() -> String { applyStyle(TerminalStyle.bold) } @@ -93,7 +90,6 @@ extension String { } public func reset() -> String { - guard String.isColorizationEnabled else { return self } return "\u{001B}[0m" + self } @@ -110,7 +106,6 @@ extension String { } private func applyStyle(_ codeStyle: TerminalStyleCode) -> String { - guard String.isColorizationEnabled else { return self } let str = replacingOccurrences(of: TerminalStyle.reset.open, with: TerminalStyle.reset.open + codeStyle.open) return codeStyle.open + str + TerminalStyle.reset.open diff --git a/Sources/TuistSupport/Utils/Glob.swift b/Sources/TuistSupport/Utils/Glob.swift index c3792732bf9..e18fedd5596 100644 --- a/Sources/TuistSupport/Utils/Glob.swift +++ b/Sources/TuistSupport/Utils/Glob.swift @@ -37,7 +37,7 @@ public class Glob: Collection { * Different glob implementations have different behaviors, so the behavior of this * implementation is customizable. */ - public struct Behavior { + public struct Behavior: Sendable { // If true then a globstar ("**") causes matching to be done recursively in subdirectories. // If false then "**" is treated the same as "*" let supportsGlobstar: Bool @@ -66,7 +66,7 @@ public class Glob: Collection { } } - public static var defaultBehavior = GlobBehaviorBashV4 + public static let defaultBehavior = GlobBehaviorBashV4 public let behavior: Behavior var paths = [String]() diff --git a/Sources/TuistSupport/Utils/WarningController.swift b/Sources/TuistSupport/Utils/WarningController.swift index afa4a2b88e1..b3aef82f645 100644 --- a/Sources/TuistSupport/Utils/WarningController.swift +++ b/Sources/TuistSupport/Utils/WarningController.swift @@ -4,7 +4,7 @@ import Foundation It represents the interface of a tool that can collect warnings during the execution of a program and flush them when the program decides. */ -public protocol WarningControlling { +public protocol WarningControlling: Sendable { /// Appends a new warning to the list of warnings to be shown. /// - Parameter warning: The warning to be appended. func append(warning: String) @@ -13,7 +13,7 @@ public protocol WarningControlling { func flush() } -public final class WarningController: WarningControlling { +public final class WarningController: WarningControlling, @unchecked Sendable { private let warningsQueue = DispatchQueue(label: "io.tuist.TuistSupport.WarningController") private var _warnings: Set = Set() private var warnings: Set { @@ -25,7 +25,7 @@ public final class WarningController: WarningControlling { } } - public static var shared: WarningControlling = WarningController() + public static let shared: WarningControlling = WarningController() init() {} diff --git a/Sources/TuistSupport/Vendored/HTTPStatusCodes/HTTPStatusCodes.swift b/Sources/TuistSupport/Vendored/HTTPStatusCodes/HTTPStatusCodes.swift index 30da2c4467c..086773e3136 100644 --- a/Sources/TuistSupport/Vendored/HTTPStatusCodes/HTTPStatusCodes.swift +++ b/Sources/TuistSupport/Vendored/HTTPStatusCodes/HTTPStatusCodes.swift @@ -13,7 +13,7 @@ import Foundation /// /// - seealso: [Wikipedia page - List of HTTP status codes](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes) /// - seealso: [HTTP protocol standard - Status Code Definitions](https://tools.ietf.org/html/rfc2616#section-10) -@objc public enum HTTPStatusCode: Int { +@objc public enum HTTPStatusCode: Int, Sendable { /// Continue: 100 /// /// - seealso: [RFC7231, Section 6.2.1](http://www.iana.org/go/rfc7231#section-6.2.1) diff --git a/Sources/TuistSupport/Xcode/XcodeController.swift b/Sources/TuistSupport/Xcode/XcodeController.swift index d739d1f141a..3ce5d1cb19b 100644 --- a/Sources/TuistSupport/Xcode/XcodeController.swift +++ b/Sources/TuistSupport/Xcode/XcodeController.swift @@ -2,7 +2,7 @@ import Foundation import TSCBasic import TSCUtility -public protocol XcodeControlling { +public protocol XcodeControlling: Sendable { /// Returns the selected Xcode. It uses xcode-select to determine /// the Xcode that is selected in the environment. /// @@ -17,7 +17,7 @@ public protocol XcodeControlling { func selectedVersion() throws -> Version } -public class XcodeController: XcodeControlling { +public class XcodeController: XcodeControlling, @unchecked Sendable { public init() {} /// Shared instance. diff --git a/Sources/TuistSupportTesting/Xcode/Mocks/MockXcodeController.swift b/Sources/TuistSupportTesting/Xcode/Mocks/MockXcodeController.swift index 259dcc702c5..8e91524b30d 100644 --- a/Sources/TuistSupportTesting/Xcode/Mocks/MockXcodeController.swift +++ b/Sources/TuistSupportTesting/Xcode/Mocks/MockXcodeController.swift @@ -3,8 +3,11 @@ import struct TSCUtility.Version import TuistSupport import XCTest -public final class MockXcodeController: XcodeControlling { +public final class MockXcodeController: XcodeControlling, @unchecked Sendable { + @Atomic public var selectedStub: Result? + + @Atomic public var selectedVersionStub: Result = .success(Version(0, 0, 0)) public func selected() throws -> Xcode? { diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index 8faf4a156d3..733db97c5e5 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -183,6 +183,17 @@ public enum Module: String, CaseIterable { return dependencies + sharedDependencies } + public var strictConcurrencySetting: String? { + switch self { + case .projectAutomation, .projectDescription: + return "complete" + case .support: + return "targeted" + default: + return nil + } + } + public var dependencies: [TargetDependency] { var dependencies: [TargetDependency] = switch self { case .acceptanceTesting: @@ -646,6 +657,12 @@ public enum Module: String, CaseIterable { debugSettings["ENABLE_TESTING_SEARCH_PATHS"] = "YES" releaseSettings["ENABLE_TESTING_SEARCH_PATHS"] = "YES" } + + if let strictConcurrencySetting, product == .framework { + debugSettings["SWIFT_STRICT_CONCURRENCY"] = .string(strictConcurrencySetting) + releaseSettings["SWIFT_STRICT_CONCURRENCY"] = .string(strictConcurrencySetting) + } + let settings = Settings.settings( configurations: [ .debug( From 263dfc8a199d03af841fdc68897178f2e2876eef Mon Sep 17 00:00:00 2001 From: Miguel Ferrando Date: Tue, 28 May 2024 15:24:40 +0200 Subject: [PATCH 313/509] Support xcodebuild arguments in build and test commands (#6300) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add passthrough parameters to build command * Add passthrough parameters to test command * Merge errors * Apply code style * Update docs * Fix tests in CI * Apply suggestions from code review Co-authored-by: Pedro Piñera Buendía <663605+pepicrft@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Marek Fořt * Do not deprecate useful top-level arguments --------- Co-authored-by: Pedro Piñera Buendía <663605+pepicrft@users.noreply.github.com> Co-authored-by: Marek Fořt --- .../TuistAcceptanceTestCase.swift | 20 +++---- .../Utilities/TargetBuilder.swift | 10 +++- .../XcodeBuild/XcodeBuildController.swift | 12 +++- .../Utilities/MockTargetBuilder.swift | 9 ++- .../Automation/XcodeBuildControlling.swift | 8 ++- .../Automation/MockXcodeBuildController.swift | 18 ++++-- Sources/TuistKit/Commands/BuildCommand.swift | 57 +++++++++++++++++-- Sources/TuistKit/Commands/TestCommand.swift | 51 ++++++++++++++--- Sources/TuistKit/Services/BuildService.swift | 9 ++- Sources/TuistKit/Services/RunService.swift | 3 +- Sources/TuistKit/Services/TestService.swift | 15 +++-- .../Extensions/XCTestCase+Extras.swift | 13 +++++ .../BuildAcceptanceTests.swift | 33 +++++++++++ .../TestAcceptanceTests.swift | 49 ++++++++++++++++ .../Services/BuildServiceTests.swift | 14 +++-- .../Services/RunServiceTests.swift | 4 +- .../Services/TestServiceTests.swift | 32 ++++++----- docs/docs/guide/automation/build.md | 8 +-- docs/docs/guide/automation/test.md | 6 +- 19 files changed, 289 insertions(+), 82 deletions(-) diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift index dc84fd0607e..77a6e81f66b 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift @@ -71,9 +71,9 @@ open class TuistAcceptanceTestCase: XCTestCase { } public func run(_ command: (some AsyncParsableCommand).Type, _ arguments: [String] = []) async throws { - let arguments = arguments + [ + let arguments = [ "--path", fixturePath.pathString, - ] + ] + arguments var parsedCommand = try command.parse(arguments) try await parsedCommand.run() @@ -97,10 +97,10 @@ open class TuistAcceptanceTestCase: XCTestCase { } public func run(_ command: EditCommand.Type, _ arguments: [String] = []) async throws { - let arguments = arguments + [ + let arguments = [ "--path", fixturePath.pathString, "--permanent", - ] + ] + arguments let parsedCommand = try command.parse(arguments) try await parsedCommand.run() @@ -121,20 +121,20 @@ open class TuistAcceptanceTestCase: XCTestCase { } public func run(_ command: TestCommand.Type, _ arguments: [String] = []) async throws { - let arguments = arguments + [ + let arguments = [ "--derived-data-path", derivedDataPath.pathString, "--path", fixturePath.pathString, - ] + ] + arguments let parsedCommand = try command.parse(arguments) try await parsedCommand.run() } public func run(_ command: BuildCommand.Type, _ arguments: [String] = []) async throws { - let arguments = arguments + [ + let arguments = [ "--derived-data-path", derivedDataPath.pathString, "--path", fixturePath.pathString, - ] + ] + arguments let parsedCommand = try command.parse(arguments) try await parsedCommand.run() @@ -145,10 +145,10 @@ open class TuistAcceptanceTestCase: XCTestCase { } public func run(_ command: GenerateCommand.Type, _ arguments: [String] = []) async throws { - let arguments = arguments + [ + let arguments = [ "--no-open", "--path", fixturePath.pathString, - ] + ] + arguments let parsedCommand = try command.parse(arguments) try await parsedCommand.run() diff --git a/Sources/TuistAutomation/Utilities/TargetBuilder.swift b/Sources/TuistAutomation/Utilities/TargetBuilder.swift index f3bffb32b51..a36bfd9d743 100644 --- a/Sources/TuistAutomation/Utilities/TargetBuilder.swift +++ b/Sources/TuistAutomation/Utilities/TargetBuilder.swift @@ -18,6 +18,7 @@ public protocol TargetBuilding { /// - device: An optional device specifier to use when building the scheme. /// - osVersion: An optional OS number to use when building the scheme. /// - graphTraverser: The Graph traverser. + /// - passthroughXcodeBuildArguments: The passthrough xcodebuild arguments to pass to xcodebuild func buildTarget( _ target: GraphTarget, platform: TuistGraph.Platform, @@ -30,7 +31,8 @@ public protocol TargetBuilding { device: String?, osVersion: Version?, rosetta: Bool, - graphTraverser: GraphTraversing + graphTraverser: GraphTraversing, + passthroughXcodeBuildArguments: [String] ) async throws } @@ -87,7 +89,8 @@ public final class TargetBuilder: TargetBuilding { device: String?, osVersion: Version?, rosetta: Bool, - graphTraverser: GraphTraversing + graphTraverser: GraphTraversing, + passthroughXcodeBuildArguments: [String] ) async throws { logger.log(level: .notice, "Building scheme \(scheme.name)", metadata: .section) @@ -116,7 +119,8 @@ public final class TargetBuilder: TargetBuilding { rosetta: rosetta, derivedDataPath: derivedDataPath, clean: clean, - arguments: buildArguments + arguments: buildArguments, + passthroughXcodeBuildArguments: passthroughXcodeBuildArguments ) .printFormattedOutput() diff --git a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift index 5afc8602440..dcd28f9ad31 100644 --- a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift +++ b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift @@ -38,7 +38,8 @@ public final class XcodeBuildController: XcodeBuildControlling { rosetta: Bool, derivedDataPath: AbsolutePath?, clean: Bool = false, - arguments: [XcodeBuildArgument] + arguments: [XcodeBuildArgument], + passthroughXcodeBuildArguments: [String] ) throws -> AsyncThrowingStream, Error> { var command = ["/usr/bin/xcrun", "xcodebuild"] @@ -57,6 +58,9 @@ public final class XcodeBuildController: XcodeBuildControlling { // Arguments command.append(contentsOf: arguments.flatMap(\.arguments)) + // Passthrough arguments + command.append(contentsOf: passthroughXcodeBuildArguments) + // Destination switch destination { case let .device(udid): @@ -91,7 +95,8 @@ public final class XcodeBuildController: XcodeBuildControlling { retryCount: Int, testTargets: [TestIdentifier], skipTestTargets: [TestIdentifier], - testPlanConfiguration: TestPlanConfiguration? + testPlanConfiguration: TestPlanConfiguration?, + passthroughXcodeBuildArguments: [String] ) throws -> AsyncThrowingStream, Error> { var command = ["/usr/bin/xcrun", "xcodebuild"] @@ -110,6 +115,9 @@ public final class XcodeBuildController: XcodeBuildControlling { // Arguments command.append(contentsOf: arguments.flatMap(\.arguments)) + // Passthrough arguments + command.append(contentsOf: passthroughXcodeBuildArguments) + // Retry On Failure if retryCount > 0 { command.append(contentsOf: XcodeBuildArgument.retryCount(retryCount).arguments) diff --git a/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift b/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift index c5ddb03599d..1cc01ebac24 100644 --- a/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift +++ b/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift @@ -18,7 +18,8 @@ public final class MockTargetBuilder: TargetBuilding { String?, Version?, Bool, - GraphTraversing + GraphTraversing, + [String] ) throws -> Void)? public func buildTarget( @@ -33,7 +34,8 @@ public final class MockTargetBuilder: TargetBuilding { device: String?, osVersion: Version?, rosetta: Bool, - graphTraverser: GraphTraversing + graphTraverser: GraphTraversing, + passthroughXcodeBuildArguments: [String] ) throws { try buildTargetStub?( target, @@ -46,7 +48,8 @@ public final class MockTargetBuilder: TargetBuilding { device, osVersion, rosetta, - graphTraverser + graphTraverser, + passthroughXcodeBuildArguments ) } } diff --git a/Sources/TuistCore/Automation/XcodeBuildControlling.swift b/Sources/TuistCore/Automation/XcodeBuildControlling.swift index e4caf1fccb2..e9c3aacc848 100644 --- a/Sources/TuistCore/Automation/XcodeBuildControlling.swift +++ b/Sources/TuistCore/Automation/XcodeBuildControlling.swift @@ -16,6 +16,7 @@ public protocol XcodeBuildControlling { /// to determine the destination. /// - clean: True if xcodebuild should clean the project before building. /// - arguments: Extra xcodebuild arguments. + /// - passthroughXcodeBuildArguments: Passthrough xcodebuild arguments. func build( _ target: XcodeBuildTarget, scheme: String, @@ -23,7 +24,8 @@ public protocol XcodeBuildControlling { rosetta: Bool, derivedDataPath: AbsolutePath?, clean: Bool, - arguments: [XcodeBuildArgument] + arguments: [XcodeBuildArgument], + passthroughXcodeBuildArguments: [String] ) throws -> AsyncThrowingStream, Error> /// Returns an observable to test the given project using xcodebuild. @@ -38,6 +40,7 @@ public protocol XcodeBuildControlling { /// - testTargets: A list of test identifiers indicating which tests to run /// - skipTestTargets: A list of test identifiers indicating which tests to skip /// - testPlanConfiguration: A configuration object indicating which test plan to use and its configurations + /// - passthroughXcodeBuildArguments: Passthrough xcodebuild arguments. func test( _ target: XcodeBuildTarget, scheme: String, @@ -50,7 +53,8 @@ public protocol XcodeBuildControlling { retryCount: Int, testTargets: [TestIdentifier], skipTestTargets: [TestIdentifier], - testPlanConfiguration: TestPlanConfiguration? + testPlanConfiguration: TestPlanConfiguration?, + passthroughXcodeBuildArguments: [String] ) throws -> AsyncThrowingStream, Error> /// Returns an observable that archives the given project using xcodebuild. diff --git a/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift b/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift index 95982d6877a..9dfb2c4e55b 100644 --- a/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift +++ b/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift @@ -12,7 +12,8 @@ final class MockXcodeBuildController: XcodeBuildControlling { Bool, AbsolutePath?, Bool, - [XcodeBuildArgument] + [XcodeBuildArgument], + [String] ) -> [SystemEvent])? func build( @@ -22,7 +23,8 @@ final class MockXcodeBuildController: XcodeBuildControlling { rosetta: Bool, derivedDataPath: AbsolutePath?, clean: Bool, - arguments: [XcodeBuildArgument] + arguments: [XcodeBuildArgument], + passthroughXcodeBuildArguments: [String] ) -> AsyncThrowingStream, Error> { if let buildStub { return buildStub( @@ -32,7 +34,8 @@ final class MockXcodeBuildController: XcodeBuildControlling { rosetta, derivedDataPath, clean, - arguments + arguments, + passthroughXcodeBuildArguments ).asAsyncThrowingStream() } else { return AsyncThrowingStream { @@ -56,7 +59,8 @@ final class MockXcodeBuildController: XcodeBuildControlling { Int, [TestIdentifier], [TestIdentifier], - TestPlanConfiguration? + TestPlanConfiguration?, + [String] ) -> [SystemEvent] )? @@ -73,7 +77,8 @@ final class MockXcodeBuildController: XcodeBuildControlling { retryCount: Int, testTargets: [TestIdentifier], skipTestTargets: [TestIdentifier], - testPlanConfiguration: TestPlanConfiguration? + testPlanConfiguration: TestPlanConfiguration?, + passthroughXcodeBuildArguments: [String] ) -> AsyncThrowingStream, Error> { if let testStub { let results = testStub( @@ -88,7 +93,8 @@ final class MockXcodeBuildController: XcodeBuildControlling { retryCount, testTargets, skipTestTargets, - testPlanConfiguration + testPlanConfiguration, + passthroughXcodeBuildArguments ) if let testErrorStub { return AsyncThrowingStream { diff --git a/Sources/TuistKit/Commands/BuildCommand.swift b/Sources/TuistKit/Commands/BuildCommand.swift index 16d7d006ead..22b4d40e249 100644 --- a/Sources/TuistKit/Commands/BuildCommand.swift +++ b/Sources/TuistKit/Commands/BuildCommand.swift @@ -4,6 +4,24 @@ import TSCBasic import TSCUtility import TuistSupport +enum XcodeBuildPassthroughArgumentError: FatalError, Equatable { + case alreadyHandled(String) + + var description: String { + switch self { + case let .alreadyHandled(argument): + "The argument \(argument) added after the terminator (--) cannot be passed through to xcodebuild because it is handled by Tuist." + } + } + + var type: ErrorType { + switch self { + case .alreadyHandled: + .abort + } + } +} + public struct BuildOptions: ParsableArguments { public init() {} @@ -66,7 +84,7 @@ public struct BuildOptions: ParsableArguments { public var buildOutputPath: String? @Option( - help: "Overrides the folder that should be used for derived data when building the project." + help: "[Deprecated] Overrides the folder that should be used for derived data when building the project." ) public var derivedDataPath: String? @@ -75,6 +93,12 @@ public struct BuildOptions: ParsableArguments { help: "When passed, it generates the project and skips building. This is useful for debugging purposes." ) public var generateOnly: Bool = false + + @Argument( + parsing: .postTerminator, + help: "Arguments that will be passed through to xcodebuild" + ) + var passthroughXcodeBuildArguments: [String] = [] } /// Command that builds a target from the project in the current directory. @@ -91,12 +115,32 @@ public struct BuildCommand: AsyncParsableCommand { @OptionGroup() var buildOptions: BuildOptions + private var notAllowedPassthroughXcodeBuildArguments = [ + "-scheme", + "-workspace", + "-project", + ] + public func run() async throws { - let absolutePath: AbsolutePath - if let path = buildOptions.path { - absolutePath = try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) + // Check if passthrough arguments are already handled by tuist + try notAllowedPassthroughXcodeBuildArguments.forEach { + if buildOptions.passthroughXcodeBuildArguments.contains($0) { + throw XcodeBuildPassthroughArgumentError.alreadyHandled($0) + } + } + + // Suggest the user to use passthrough arguments if already supported by xcodebuild + if let derivedDataPath = buildOptions.derivedDataPath { + logger + .warning( + "--derivedDataPath is deprecated please use -derivedDataPath \(derivedDataPath) after the terminator (--) instead to passthrough parameters to xcodebuild" + ) + } + + let absolutePath = if let path = buildOptions.path { + try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) } else { - absolutePath = FileHandler.shared.currentPath + FileHandler.shared.currentPath } try await BuildService().run( @@ -114,7 +158,8 @@ public struct BuildCommand: AsyncParsableCommand { platform: buildOptions.platform, osVersion: buildOptions.os, rosetta: buildOptions.rosetta, - generateOnly: buildOptions.generateOnly + generateOnly: buildOptions.generateOnly, + passthroughXcodeBuildArguments: buildOptions.passthroughXcodeBuildArguments ) } } diff --git a/Sources/TuistKit/Commands/TestCommand.swift b/Sources/TuistKit/Commands/TestCommand.swift index eb8a0f1af17..5b1604087e9 100644 --- a/Sources/TuistKit/Commands/TestCommand.swift +++ b/Sources/TuistKit/Commands/TestCommand.swift @@ -78,13 +78,13 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { var resultBundlePath: String? @Option( - help: "Overrides the folder that should be used for derived data when testing a project." + help: "[Deprecated] Overrides the folder that should be used for derived data when testing a project." ) var derivedDataPath: String? @Option( name: .long, - help: "Tests will retry of times until success. Example: if 1 is specified, the test will be retried at most once, hence it will run up to 2 times." + help: "[Deprecated] Tests will retry of times until success. Example: if 1 is specified, the test will be retried at most once, hence it will run up to 2 times." ) var retryCount: Int = 0 @@ -130,6 +130,12 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { ) var generateOnly: Bool = false + @Argument( + parsing: .postTerminator, + help: "xcodebuild arguments that will be passthrough" + ) + var passthroughXcodeBuildArguments: [String] = [] + public func validate() throws { try TestService().validateParameters( testTargets: testTargets, @@ -137,13 +143,43 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { ) } + private var notAllowedPassthroughXcodeBuildArguments = [ + "-scheme", + "-workspace", + "-project", + "-testPlan", + "-skip-test-configuration", + "-only-test-configuration", + "-only-testing", + "-skip-testing", + ] + public func run() async throws { - let absolutePath: AbsolutePath + // Check if passthrough arguments are already handled by tuist + try notAllowedPassthroughXcodeBuildArguments.forEach { + if passthroughXcodeBuildArguments.contains($0) { + throw XcodeBuildPassthroughArgumentError.alreadyHandled($0) + } + } + + // Suggest the user to use passthrough arguments if already supported by xcodebuild + if let derivedDataPath { + logger + .warning( + "--derivedDataPath is deprecated please use -derivedDataPath \(derivedDataPath) after the terminator (--) instead to passthrough parameters to xcodebuild" + ) + } + if retryCount > 0 { + logger + .warning( + "--retryCount is deprecated please use -retry-tests-on-failure -test-iterations \(retryCount + 1) after the terminator (--) instead to passthrough parameters to xcodebuild" + ) + } - if let path { - absolutePath = try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) + let absolutePath = if let path { + try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) } else { - absolutePath = FileHandler.shared.currentPath + FileHandler.shared.currentPath } try await TestService().run( @@ -174,7 +210,8 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { ) }, validateTestTargetsParameters: false, - generateOnly: generateOnly + generateOnly: generateOnly, + passthroughXcodeBuildArguments: passthroughXcodeBuildArguments ) } } diff --git a/Sources/TuistKit/Services/BuildService.swift b/Sources/TuistKit/Services/BuildService.swift index 979c1a7397a..1a038d33057 100644 --- a/Sources/TuistKit/Services/BuildService.swift +++ b/Sources/TuistKit/Services/BuildService.swift @@ -65,7 +65,8 @@ public final class BuildService { osVersion: String?, rosetta: Bool, generateOnly: Bool, - generator: ((Config) throws -> Generating)? = nil + generator: ((Config) throws -> Generating)? = nil, + passthroughXcodeBuildArguments: [String] ) async throws { let graph: Graph let config = try configLoader.loadConfig(path: path) @@ -128,7 +129,8 @@ public final class BuildService { device: device, osVersion: osVersion?.version(), rosetta: rosetta, - graphTraverser: graphTraverser + graphTraverser: graphTraverser, + passthroughXcodeBuildArguments: passthroughXcodeBuildArguments ) } else { var cleaned = false @@ -159,7 +161,8 @@ public final class BuildService { device: device, osVersion: osVersion?.version(), rosetta: rosetta, - graphTraverser: graphTraverser + graphTraverser: graphTraverser, + passthroughXcodeBuildArguments: passthroughXcodeBuildArguments ) cleaned = true } diff --git a/Sources/TuistKit/Services/RunService.swift b/Sources/TuistKit/Services/RunService.swift index 3561bccc16b..f3b2354fe58 100644 --- a/Sources/TuistKit/Services/RunService.swift +++ b/Sources/TuistKit/Services/RunService.swift @@ -119,7 +119,8 @@ final class RunService { device: device, osVersion: version?.version(), rosetta: rosetta, - graphTraverser: graphTraverser + graphTraverser: graphTraverser, + passthroughXcodeBuildArguments: [] ) let minVersion: Version? diff --git a/Sources/TuistKit/Services/TestService.swift b/Sources/TuistKit/Services/TestService.swift index b2db4632c7f..0e9d6b7ea46 100644 --- a/Sources/TuistKit/Services/TestService.swift +++ b/Sources/TuistKit/Services/TestService.swift @@ -170,7 +170,8 @@ public final class TestService { // swiftlint:disable:this type_body_length testPlanConfiguration: TestPlanConfiguration?, validateTestTargetsParameters: Bool = true, generator: Generating? = nil, - generateOnly: Bool + generateOnly: Bool, + passthroughXcodeBuildArguments: [String] ) async throws { if validateTestTargetsParameters { try validateParameters( @@ -260,7 +261,8 @@ public final class TestService { // swiftlint:disable:this type_body_length retryCount: retryCount, testTargets: testTargets, skipTestTargets: skipTestTargets, - testPlanConfiguration: testPlanConfiguration + testPlanConfiguration: testPlanConfiguration, + passthroughXcodeBuildArguments: passthroughXcodeBuildArguments ) } } else { @@ -289,7 +291,8 @@ public final class TestService { // swiftlint:disable:this type_body_length retryCount: retryCount, testTargets: testTargets, skipTestTargets: skipTestTargets, - testPlanConfiguration: testPlanConfiguration + testPlanConfiguration: testPlanConfiguration, + passthroughXcodeBuildArguments: passthroughXcodeBuildArguments ) } } @@ -314,7 +317,8 @@ public final class TestService { // swiftlint:disable:this type_body_length retryCount: Int, testTargets: [TestIdentifier], skipTestTargets: [TestIdentifier], - testPlanConfiguration: TestPlanConfiguration? + testPlanConfiguration: TestPlanConfiguration?, + passthroughXcodeBuildArguments: [String] ) async throws { logger.log(level: .notice, "Testing scheme \(scheme.name)", metadata: .section) if let testPlan = testPlanConfiguration?.testPlan, let testPlans = scheme.testAction?.testPlans, @@ -371,7 +375,8 @@ public final class TestService { // swiftlint:disable:this type_body_length retryCount: retryCount, testTargets: testTargets, skipTestTargets: skipTestTargets, - testPlanConfiguration: testPlanConfiguration + testPlanConfiguration: testPlanConfiguration, + passthroughXcodeBuildArguments: passthroughXcodeBuildArguments ) .printFormattedOutput() } diff --git a/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift b/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift index 995aec19475..e3cd0a2e931 100644 --- a/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift +++ b/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift @@ -140,6 +140,19 @@ extension XCTestCase { XCTFail("No error was thrown", file: file, line: line) } + public func XCTAssertThrows( + _ closure: @autoclosure () async throws -> some Any, + file: StaticString = #file, + line: UInt = #line + ) async { + do { + _ = try await closure() + XCTFail("No error was thrown", file: file, line: line) + } catch { + // Succeeded + } + } + public func XCTAssertCodableEqualToJson( _ subject: C, _ json: String, diff --git a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift index 1a44a25945a..625870976ac 100644 --- a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift +++ b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift @@ -3,6 +3,8 @@ import TuistAcceptanceTesting import TuistSupport import XCTest +@testable import TuistKit + /// Build projects using Tuist build final class BuildAcceptanceTestWithTemplates: TuistAcceptanceTestCase { func test_with_templates() async throws { @@ -12,6 +14,37 @@ final class BuildAcceptanceTestWithTemplates: TuistAcceptanceTestCase { try await run(BuildCommand.self) try await run(BuildCommand.self, "MyApp") try await run(BuildCommand.self, "MyApp", "--configuration", "Debug") + try await run(BuildCommand.self, "MyApp", "--", "-parallelizeTargets", "-enableAddressSanitizer", "YES") + } +} + +final class BuildAcceptanceTestInvalidArguments: TuistAcceptanceTestCase { + func test_with_invalid_arguments() async throws { + try run(InitCommand.self, "--platform", "ios", "--name", "MyApp") + try await run(InstallCommand.self) + try await run(GenerateCommand.self) + await XCTAssertThrowsSpecific( + try await run(BuildCommand.self, "MyApp", "--", "-scheme", "MyApp"), + XcodeBuildPassthroughArgumentError.alreadyHandled("-scheme") + ) + await XCTAssertThrowsSpecific( + try await run(BuildCommand.self, "MyApp", "--", "-project", "MyApp"), + XcodeBuildPassthroughArgumentError.alreadyHandled("-project") + ) + await XCTAssertThrowsSpecific( + try await run(BuildCommand.self, "MyApp", "--", "-workspace", "MyApp"), + XcodeBuildPassthroughArgumentError.alreadyHandled("-workspace") + ) + // SystemError is verbose and would lead to flakyness + // xcodebuild: error: The flag -addressSanitizerEnabled must be supplied with an argument YES or NO + await XCTAssertThrows( + try await run(BuildCommand.self, "MyApp", "--", "-parallelizeTargets", "YES", "-enableAddressSanitizer") + ) + // xcodebuild: error: option '-configuration' may only be provided once + // Usage: xcodebuild [-project ] ... + await XCTAssertThrows( + try await run(BuildCommand.self, "MyApp", "--configuration", "Debug", "--", "-configuration", "Debug") + ) } } diff --git a/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift b/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift index 5a6705206a4..f6c65210e6c 100644 --- a/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift +++ b/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift @@ -3,6 +3,8 @@ import TuistAcceptanceTesting import TuistSupport import XCTest +@testable import TuistKit + /// Test projects using tuist test final class TestAcceptanceTests: TuistAcceptanceTestCase { func test_with_app_with_framework_and_tests() async throws { @@ -10,6 +12,7 @@ final class TestAcceptanceTests: TuistAcceptanceTestCase { try await run(TestCommand.self) try await run(TestCommand.self, "App") try await run(TestCommand.self, "--test-targets", "FrameworkTests/FrameworkTests") + try await run(TestCommand.self, "App", "--", "-testLanguage", "en") } func test_with_app_with_test_plan() async throws { @@ -17,6 +20,52 @@ final class TestAcceptanceTests: TuistAcceptanceTestCase { try await run(TestCommand.self) try await run(TestCommand.self, "App", "--test-plan", "All") } + + func test_with_invalid_arguments() async throws { + try setUpFixture(.appWithFrameworkAndTests) + await XCTAssertThrowsSpecific( + try await run(TestCommand.self, "App", "--", "-scheme", "App"), + XcodeBuildPassthroughArgumentError.alreadyHandled("-scheme") + ) + await XCTAssertThrowsSpecific( + try await run(TestCommand.self, "App", "--", "-project", "App"), + XcodeBuildPassthroughArgumentError.alreadyHandled("-project") + ) + await XCTAssertThrowsSpecific( + try await run(TestCommand.self, "App", "--", "-workspace", "App"), + XcodeBuildPassthroughArgumentError.alreadyHandled("-workspace") + ) + await XCTAssertThrowsSpecific( + try await run(TestCommand.self, "App", "--", "-testPlan", "TestPlan"), + XcodeBuildPassthroughArgumentError.alreadyHandled("-testPlan") + ) + await XCTAssertThrowsSpecific( + try await run(TestCommand.self, "App", "--", "-skip-test-configuration", "TestPlan"), + XcodeBuildPassthroughArgumentError.alreadyHandled("-skip-test-configuration") + ) + await XCTAssertThrowsSpecific( + try await run(TestCommand.self, "App", "--", "-only-test-configuration", "TestPlan"), + XcodeBuildPassthroughArgumentError.alreadyHandled("-only-test-configuration") + ) + await XCTAssertThrowsSpecific( + try await run(TestCommand.self, "App", "--", "-only-testing", "AppTests"), + XcodeBuildPassthroughArgumentError.alreadyHandled("-only-testing") + ) + await XCTAssertThrowsSpecific( + try await run(TestCommand.self, "App", "--", "-skip-testing", "AppTests"), + XcodeBuildPassthroughArgumentError.alreadyHandled("-skip-testing") + ) + // SystemError is verbose and would lead to flakyness + // xcodebuild: error: The flag -addressSanitizerEnabled must be supplied with an argument YES or NO + await XCTAssertThrows( + try await run(TestCommand.self, "App", "--", "-parallelizeTargets", "YES", "-enableAddressSanitizer") + ) + // xcodebuild: error: option '-configuration' may only be provided once + // Usage: xcodebuild [-project ] ... + await XCTAssertThrows( + try await run(TestCommand.self, "App", "--configuration", "Debug", "--", "-configuration", "Debug") + ) + } } // Feature: Tests projects using Tuist test diff --git a/Tests/TuistKitTests/Services/BuildServiceTests.swift b/Tests/TuistKitTests/Services/BuildServiceTests.swift index 16abed287e2..5a2701d8d29 100644 --- a/Tests/TuistKitTests/Services/BuildServiceTests.swift +++ b/Tests/TuistKitTests/Services/BuildServiceTests.swift @@ -98,7 +98,7 @@ final class BuildServiceTests: TuistUnitTestCase { return buildArguments } targetBuilder - .buildTargetStub = { _, _workspacePath, _scheme, _clean, _, _, _, _device, _osVersion, _, _ in + .buildTargetStub = { _, _workspacePath, _scheme, _clean, _, _, _, _device, _osVersion, _, _, _ in XCTAssertEqual(_workspacePath, workspacePath) XCTAssertEqual(_scheme, scheme) XCTAssertTrue(_clean) @@ -145,7 +145,7 @@ final class BuildServiceTests: TuistUnitTestCase { XCTAssertEqual(_skipSigning, skipSigning) return buildArguments } - targetBuilder.buildTargetStub = { _, _workspacePath, _scheme, _clean, _, _, _, _, _, _, _ in + targetBuilder.buildTargetStub = { _, _workspacePath, _scheme, _clean, _, _, _, _, _, _, _, _ in XCTAssertEqual(_workspacePath, workspacePath) XCTAssertEqual(_scheme, scheme) XCTAssertTrue(_clean) @@ -192,7 +192,7 @@ final class BuildServiceTests: TuistUnitTestCase { return buildArguments } targetBuilder - .buildTargetStub = { _, _workspacePath, _scheme, _clean, _, _, _, _device, _osVersion, _, _ in + .buildTargetStub = { _, _workspacePath, _scheme, _clean, _, _, _, _device, _osVersion, _, _, _ in XCTAssertEqual(_workspacePath, workspacePath) XCTAssertNil(_device) XCTAssertNil(_osVersion) @@ -248,7 +248,7 @@ final class BuildServiceTests: TuistUnitTestCase { XCTAssertEqual(_skipSigning, skipSigning) return buildArguments } - targetBuilder.buildTargetStub = { _, _workspacePath, _scheme, _clean, _, _, _, _, _, _, _ in + targetBuilder.buildTargetStub = { _, _workspacePath, _scheme, _clean, _, _, _, _, _, _, _, _ in XCTAssertEqual(_workspacePath, workspacePath) if _scheme.name == "A" { XCTAssertEqual(_scheme, schemeA) @@ -312,7 +312,8 @@ extension BuildService { platform: String? = nil, osVersion: String? = nil, rosetta: Bool = false, - generateOnly: Bool = false + generateOnly: Bool = false, + passthroughXcodeBuildArguments: [String] = [] ) async throws { try await run( schemeName: schemeName, @@ -326,7 +327,8 @@ extension BuildService { platform: platform, osVersion: osVersion, rosetta: rosetta, - generateOnly: generateOnly + generateOnly: generateOnly, + passthroughXcodeBuildArguments: passthroughXcodeBuildArguments ) } } diff --git a/Tests/TuistKitTests/Services/RunServiceTests.swift b/Tests/TuistKitTests/Services/RunServiceTests.swift index c69d4455d2a..a27f58436fe 100644 --- a/Tests/TuistKitTests/Services/RunServiceTests.swift +++ b/Tests/TuistKitTests/Services/RunServiceTests.swift @@ -113,7 +113,7 @@ final class RunServiceTests: TuistUnitTestCase { let clean = true let configuration = "Test" targetBuilder - .buildTargetStub = { _, _workspacePath, _scheme, _clean, _configuration, _, _, _, _, _, _ in + .buildTargetStub = { _, _workspacePath, _scheme, _clean, _configuration, _, _, _, _, _, _, _ in // Then XCTAssertEqual(_workspacePath, workspacePath) XCTAssertEqual(_scheme.name, schemeName) @@ -185,7 +185,7 @@ final class RunServiceTests: TuistUnitTestCase { buildGraphInspector.workspacePathStub = { _ in workspacePath } buildGraphInspector.runnableSchemesStub = { _ in [.test()] } buildGraphInspector.runnableTargetStub = { _, _ in .test() } - targetBuilder.buildTargetStub = { _, _, _, _, _, _, _, _, _, _, _ in expectation.fulfill() } + targetBuilder.buildTargetStub = { _, _, _, _, _, _, _, _, _, _, _, _ in expectation.fulfill() } targetRunner.assertCanRunTargetStub = { _ in throw TestError() } // Then diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index 46a5d529a4e..890f797fbd1 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -208,7 +208,7 @@ final class TestServiceTests: TuistUnitTestCase { (path, Graph.test()) } var testedRosetta: Bool? - xcodebuildController.testStub = { _, _, _, _, rosetta, _, _, _, _, _, _, _ in + xcodebuildController.testStub = { _, _, _, _, rosetta, _, _, _, _, _, _, _, _ in testedRosetta = rosetta return [.standardOutput(.init(raw: "success"))] } @@ -243,7 +243,7 @@ final class TestServiceTests: TuistUnitTestCase { (path, Graph.test()) } var testedSchemes: [String] = [] - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _ in + xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) return [.standardOutput(.init(raw: "success"))] } @@ -275,7 +275,7 @@ final class TestServiceTests: TuistUnitTestCase { (path, Graph.test()) } var testedSchemes: [String] = [] - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _ in + xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) return [.standardOutput(.init(raw: "success"))] } @@ -318,7 +318,7 @@ final class TestServiceTests: TuistUnitTestCase { (path, Graph.test()) } var testedSchemes: [String] = [] - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _ in + xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) return [.standardOutput(.init(raw: "success"))] } @@ -350,7 +350,7 @@ final class TestServiceTests: TuistUnitTestCase { (path, Graph.test()) } var testedSchemes: [String] = [] - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _ in + xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) return [.standardOutput(.init(raw: "success"))] } @@ -379,7 +379,7 @@ final class TestServiceTests: TuistUnitTestCase { } var testedSchemes: [String] = [] xcodebuildController.testErrorStub = NSError.test() - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _ in + xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) return [] } @@ -414,7 +414,7 @@ final class TestServiceTests: TuistUnitTestCase { (path, Graph.test()) } var testedSchemes: [String] = [] - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _ in + xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) return [.standardOutput(.init(raw: "success"))] } @@ -434,7 +434,7 @@ final class TestServiceTests: TuistUnitTestCase { let expectedResourceBundlePath = try AbsolutePath(validating: "/test") var resourceBundlePath: AbsolutePath? - xcodebuildController.testStub = { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _ in + xcodebuildController.testStub = { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in resourceBundlePath = gotResourceBundlePath return [] } @@ -465,7 +465,7 @@ final class TestServiceTests: TuistUnitTestCase { let expectedResourceBundlePath = try AbsolutePath(validating: "/test") var resourceBundlePath: AbsolutePath? - xcodebuildController.testStub = { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _ in + xcodebuildController.testStub = { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in resourceBundlePath = gotResourceBundlePath return [] } @@ -510,7 +510,7 @@ final class TestServiceTests: TuistUnitTestCase { } var passedRetryCount = 0 - xcodebuildController.testStub = { _, _, _, _, _, _, _, _, retryCount, _, _, _ in + xcodebuildController.testStub = { _, _, _, _, _, _, _, _, retryCount, _, _, _, _ in passedRetryCount = retryCount return [.standardOutput(.init(raw: "success"))] } @@ -543,7 +543,7 @@ final class TestServiceTests: TuistUnitTestCase { } var passedRetryCount = -1 - xcodebuildController.testStub = { _, _, _, _, _, _, _, _, retryCount, _, _, _ in + xcodebuildController.testStub = { _, _, _, _, _, _, _, _, retryCount, _, _, _, _ in passedRetryCount = retryCount return [.standardOutput(.init(raw: "success"))] } @@ -586,7 +586,7 @@ final class TestServiceTests: TuistUnitTestCase { (path, Graph.test()) } var testedSchemes: [String] = [] - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _ in + xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) return [.standardOutput(.init(raw: "success"))] } @@ -626,7 +626,7 @@ final class TestServiceTests: TuistUnitTestCase { generator.generateWithGraphStub = { path in (path, Graph.test()) } - xcodebuildController.testStub = { _, _, _, _, _, _, _, _, _, _, _, _ in + xcodebuildController.testStub = { _, _, _, _, _, _, _, _, _, _, _, _, _ in [.standardOutput(.init(raw: "success"))] } @@ -667,7 +667,8 @@ extension TestService { testTargets: [TestIdentifier] = [], skipTestTargets: [TestIdentifier] = [], testPlanConfiguration: TestPlanConfiguration? = nil, - generateOnly: Bool = false + generateOnly: Bool = false, + passthroughXcodeBuildArguments: [String] = [] ) async throws { try await run( schemeName: schemeName, @@ -685,7 +686,8 @@ extension TestService { testTargets: testTargets, skipTestTargets: skipTestTargets, testPlanConfiguration: testPlanConfiguration, - generateOnly: generateOnly + generateOnly: generateOnly, + passthroughXcodeBuildArguments: passthroughXcodeBuildArguments ) } } diff --git a/docs/docs/guide/automation/build.md b/docs/docs/guide/automation/build.md index 8fbcce7a5e2..850c03a0ac5 100644 --- a/docs/docs/guide/automation/build.md +++ b/docs/docs/guide/automation/build.md @@ -21,20 +21,16 @@ Understanding the build process is crucial to optimize the build times. Unfortun ## Building schemes -To build schemes of a project, you can use the `tuist build` command. This command will generate the project if needed, and then build it using the `xcodebuild` command-line tool. +To build schemes of a project, you can use the `tuist build` command. This command will generate the project if needed, and then build it using the `xcodebuild` command-line tool. We support the use of the `--` terminator to forward all subsequent arguments directly to `xcodebuild. Arguments such as `-workspace` or `-project` cannot be used because tuist takes care of them. ::: code-group ```bash [Build a scheme] tuist build MyScheme ``` ```bash [Build a specific configuration] -tuist build MyScheme --configuration Debug +tuist build MyScheme -- -configuration Debug ``` ```bash [Build all schemes without binary cache] tuist build --no-binary-cache ``` ::: - -> [!NOTE] XCODEBUILD ARGUMENT FORWARDING -> We don't support forwarding arbitrary arguments to `xcodebuild` yet. If you need to pass arguments to `xcodebuild`, you can use the `--verbose` flag to see the command that Tuist is running, and then run it manually with the arguments you need. - diff --git a/docs/docs/guide/automation/test.md b/docs/docs/guide/automation/test.md index 39907d20341..80522a0a140 100644 --- a/docs/docs/guide/automation/test.md +++ b/docs/docs/guide/automation/test.md @@ -21,7 +21,7 @@ Test flakiness is a tremendous source of frustration for developers and loss of ## Running scheme tests -To run the tests of a project, you can use the `tuist test` command. This command will generate the project if needed, and then run the tests using the `xcodebuild` command-line tool. +To run the tests of a project, you can use the `tuist test` command. This command will generate the project if needed, and then run the tests using the `xcodebuild` command-line tool. We support the use of the `--` terminator to forward all subsequent arguments directly to `xcodebuild`. Arguments such as `-workspace` or `-project` cannot be used because tuist takes care of them. ::: code-group ```bash [Running scheme tests] @@ -35,7 +35,3 @@ tuist test --no-binary-cache tuist test --no-selective-testing ``` ::: - -> [!NOTE] XCODEBUILD ARGUMENT FORWARDING -> We don't support forwarding arbitrary arguments to `xcodebuild` yet. If you need to pass arguments to `xcodebuild`, you can use the `--verbose` flag to see the command that Tuist is running, and then run it manually with the arguments you need. - From adf36d6999eed219273410d5f5e3f7b1a95c74dd Mon Sep 17 00:00:00 2001 From: Chris Sessions <126101032+chris-livefront@users.noreply.github.com> Date: Tue, 28 May 2024 09:27:20 -0400 Subject: [PATCH 314/509] Document SPM build tool plugin requirements (#6310) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pedro Piñera Buendía <663605+pepicrft@users.noreply.github.com> --- docs/docs/guide/project/dependencies.md | 49 +++++++++++++++++++ .../.swiftlint.yml | 5 ++ .../Package.swift | 33 +++++++++++++ .../Project.swift | 25 ++++++++++ .../Sources/Framework.swift | 27 ++++++++++ .../Tuist/.gitkeep | 0 6 files changed, 139 insertions(+) create mode 100644 fixtures/framework_with_macro_and_plugin_packages/.swiftlint.yml create mode 100644 fixtures/framework_with_macro_and_plugin_packages/Package.swift create mode 100644 fixtures/framework_with_macro_and_plugin_packages/Project.swift create mode 100644 fixtures/framework_with_macro_and_plugin_packages/Sources/Framework.swift create mode 100644 fixtures/framework_with_macro_and_plugin_packages/Tuist/.gitkeep diff --git a/docs/docs/guide/project/dependencies.md b/docs/docs/guide/project/dependencies.md index 40a8240b992..76071c6322d 100644 --- a/docs/docs/guide/project/dependencies.md +++ b/docs/docs/guide/project/dependencies.md @@ -167,6 +167,55 @@ let target = .target(name: "MyTarget", dependencies: [ For Swift Macros and Build Tool Plugins, you'll need to use the types `.macro` and `.plugin` respectively. +> [!WARNING] SPM Build Tool Plugins +> SPM build tool plugins must be declared using [Xcode's default integration](#xcode-s-default-integration) mechanism, even when using Tuist's [XcodeProj-based integration](#tuist-s-xcodeproj-based-integration) for your project dependencies. + +A practical application of an SPM build tool plugin is performing code linting during Xcode's "Run Build Tool Plug-ins" build phase. In a package manifest this is defined as follows: + +```swift +// swift-tools-version: 5.9 +import PackageDescription + +let package = Package( + name: "Framework", + products: [ + .library(name: "Framework", targets: ["Framework"]), + ], + dependencies: [ + .package(url: "https://github.com/lukepistrol/SwiftLintPlugin", from: "0.55.0"), + ], + targets: [ + .target( + name: "Framework", + plugins: [ + .plugin(name: "SwiftLint", package: "SwiftLintPlugin"), + ] + ), + ] +) +``` + +To generate an Xcode project with the build tool plugin intact, you must declare the package in the project manifest's `packages` array, and then include a package with type `.plugin` in a target's dependencies. + +```swift +import ProjectDescription + +let project = Project( + name: "Framework", + packages: [ + .package(url: "https://github.com/lukepistrol/SwiftLintPlugin", from: "0.55.0"), + ], + targets: [ + .target( + name: "Framework", + dependencies: [ + .package(product: "SwiftLint", type: .plugin), + ] + ), + ] +) +``` + ### Carthage Since [Carthage](https://github.com/carthage/carthage) outputs `frameworks` or `xcframeworks`, you can run `carthage update` to output the dependencies in the `Carthage/Build` directory and then use the `.framework` or `.xcframework` target dependency type to declare the dependency in your target. You can wrap this in a script that you can run before generating the project. diff --git a/fixtures/framework_with_macro_and_plugin_packages/.swiftlint.yml b/fixtures/framework_with_macro_and_plugin_packages/.swiftlint.yml new file mode 100644 index 00000000000..505f7abc696 --- /dev/null +++ b/fixtures/framework_with_macro_and_plugin_packages/.swiftlint.yml @@ -0,0 +1,5 @@ +opt_in_rules: + - missing_docs + +included: + - Sources diff --git a/fixtures/framework_with_macro_and_plugin_packages/Package.swift b/fixtures/framework_with_macro_and_plugin_packages/Package.swift new file mode 100644 index 00000000000..b09776c87c2 --- /dev/null +++ b/fixtures/framework_with_macro_and_plugin_packages/Package.swift @@ -0,0 +1,33 @@ +// swift-tools-version: 5.9 +import PackageDescription + +let package = Package( + name: "Framework", + platforms: [ + .iOS(.v13), + .macOS(.v13), + ], + products: [ + .library( + name: "Framework", + targets: ["Framework"] + ), + ], + dependencies: [ + .package(url: "https://github.com/alschmut/StructBuilderMacro", from: "0.5.0"), + .package(url: "https://github.com/lukepistrol/SwiftLintPlugin", from: "0.2.2"), + .package(url: "https://github.com/pointfreeco/swift-composable-architecture", from: "1.10.0"), + ], + targets: [ + .target( + name: "Framework", + dependencies: [ + .product(name: "Buildable", package: "StructBuilderMacro"), + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + ], + plugins: [ + .plugin(name: "SwiftLint", package: "SwiftLintPlugin"), + ] + ), + ] +) diff --git a/fixtures/framework_with_macro_and_plugin_packages/Project.swift b/fixtures/framework_with_macro_and_plugin_packages/Project.swift new file mode 100644 index 00000000000..9ba31d579ab --- /dev/null +++ b/fixtures/framework_with_macro_and_plugin_packages/Project.swift @@ -0,0 +1,25 @@ +import ProjectDescription + +let project = Project( + name: "Framework", + packages: [ + .package(url: "https://github.com/lukepistrol/SwiftLintPlugin", from: "0.55.0"), + ], + targets: [ + .target( + name: "Framework", + destinations: [ + .iPhone, + .mac, + ], + product: .framework, + bundleId: "io.tuist.Framework", + sources: ["Sources/**/*"], + dependencies: [ + .external(name: "Buildable"), + .external(name: "ComposableArchitecture"), + .package(product: "SwiftLint", type: .plugin), + ] + ), + ] +) diff --git a/fixtures/framework_with_macro_and_plugin_packages/Sources/Framework.swift b/fixtures/framework_with_macro_and_plugin_packages/Sources/Framework.swift new file mode 100644 index 00000000000..b587958bed9 --- /dev/null +++ b/fixtures/framework_with_macro_and_plugin_packages/Sources/Framework.swift @@ -0,0 +1,27 @@ +import Buildable +import ComposableArchitecture +import Foundation + +@Buildable +public struct Person { + let name: String + let age: Int + let hobby: String? + + var likesReading: Bool { + hobby == "Reading" + } + + static let minimumAge = 21 +} + +@Reducer +struct Feature { + struct State {} + + enum Action {} + + var body: some ReducerOf { + EmptyReducer() + } +} diff --git a/fixtures/framework_with_macro_and_plugin_packages/Tuist/.gitkeep b/fixtures/framework_with_macro_and_plugin_packages/Tuist/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d From ade1c66519e5fdd64fe9a661ce85ef3673ea1389 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 28 May 2024 15:29:38 +0200 Subject: [PATCH 315/509] add chris-livefront as a contributor for doc (#6341) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7108e54f757..cc4e71cfd8b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1391,6 +1391,15 @@ "contributions": [ "doc" ] + }, + { + "login": "chris-livefront", + "name": "Chris Sessions", + "avatar_url": "https://avatars.githubusercontent.com/u/126101032?v=4", + "profile": "https://github.com/chris-livefront", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index e245f82cbd3..6530f138709 100644 --- a/README.md +++ b/README.md @@ -554,6 +554,7 @@ Thanks goes to these wonderful people:
    Taylor Lineman

    Miguel Ferrando

    BarredEwe
    +
    Chris Sessions
    From 02b882a27bf25e5cf24eb5e12c700b73e22b9342 Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 28 May 2024 16:07:07 +0200 Subject: [PATCH 316/509] Update lockfile --- docs/pnpm-lock.yaml | 223 +++++++++++++++++++++++++------------------- 1 file changed, 127 insertions(+), 96 deletions(-) diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 025475d5251..cf9220b5fde 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -4,14 +4,6 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - vue: - specifier: ^3.4.27 - version: 3.4.27 - wrangler: - specifier: ^3.37.0 - version: 3.43.0 - devDependencies: execa: specifier: ^8.0.1 @@ -22,6 +14,12 @@ devDependencies: vitepress: specifier: ^1.0.1 version: 1.0.2(@algolia/client-search@4.23.2)(search-insights@2.13.0) + vue: + specifier: ^3.4.27 + version: 3.4.27 + wrangler: + specifier: ^3.37.0 + version: 3.43.0 packages: @@ -178,10 +176,12 @@ packages: /@babel/helper-string-parser@7.24.1: resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} + dev: true /@babel/parser@7.24.6: resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} @@ -189,6 +189,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.24.0 + dev: true /@babel/types@7.24.0: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} @@ -197,12 +198,13 @@ packages: '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + dev: true /@cloudflare/kv-asset-handler@0.3.1: resolution: {integrity: sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA==} dependencies: mime: 3.0.0 - dev: false + dev: true /@cloudflare/workerd-darwin-64@1.20240329.0: resolution: {integrity: sha512-/raHmsHrYjoC5am84wqyiZIDCRrrYN6YDFb4zchwWQzJ0ZHleUeY6IzNdjujrS/gYey/+Db9oyl2PD1xAZt4gA==} @@ -210,7 +212,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false + dev: true optional: true /@cloudflare/workerd-darwin-arm64@1.20240329.0: @@ -219,7 +221,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false + dev: true optional: true /@cloudflare/workerd-linux-64@1.20240329.0: @@ -228,7 +230,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@cloudflare/workerd-linux-arm64@1.20240329.0: @@ -237,7 +239,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@cloudflare/workerd-windows-64@1.20240329.0: @@ -246,7 +248,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false + dev: true optional: true /@cspotcode/source-map-support@0.8.1: @@ -254,7 +256,7 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 - dev: false + dev: true /@docsearch/css@3.6.0: resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} @@ -305,7 +307,7 @@ packages: esbuild: '*' dependencies: esbuild: 0.17.19 - dev: false + dev: true /@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.17.19): resolution: {integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==} @@ -315,7 +317,7 @@ packages: esbuild: 0.17.19 escape-string-regexp: 4.0.0 rollup-plugin-node-polyfills: 0.2.1 - dev: false + dev: true /@esbuild/aix-ppc64@0.20.2: resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} @@ -332,7 +334,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/android-arm64@0.20.2: @@ -350,7 +352,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/android-arm@0.20.2: @@ -368,7 +370,7 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/android-x64@0.20.2: @@ -386,7 +388,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/darwin-arm64@0.20.2: @@ -404,7 +406,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/darwin-x64@0.20.2: @@ -422,7 +424,7 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/freebsd-arm64@0.20.2: @@ -440,7 +442,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/freebsd-x64@0.20.2: @@ -458,7 +460,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-arm64@0.20.2: @@ -476,7 +478,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-arm@0.20.2: @@ -494,7 +496,7 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-ia32@0.20.2: @@ -512,7 +514,7 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-loong64@0.20.2: @@ -530,7 +532,7 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-mips64el@0.20.2: @@ -548,7 +550,7 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-ppc64@0.20.2: @@ -566,7 +568,7 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-riscv64@0.20.2: @@ -584,7 +586,7 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-s390x@0.20.2: @@ -602,7 +604,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-x64@0.20.2: @@ -620,7 +622,7 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/netbsd-x64@0.20.2: @@ -638,7 +640,7 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/openbsd-x64@0.20.2: @@ -656,7 +658,7 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/sunos-x64@0.20.2: @@ -674,7 +676,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/win32-arm64@0.20.2: @@ -692,7 +694,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/win32-ia32@0.20.2: @@ -710,7 +712,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/win32-x64@0.20.2: @@ -725,22 +727,23 @@ packages: /@fastify/busboy@2.1.1: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - dev: false + dev: true /@jridgewell/resolve-uri@3.1.2: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - dev: false + dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - dev: false + dev: true /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -916,13 +919,13 @@ packages: resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} dependencies: '@types/node': 20.12.2 - dev: false + dev: true /@types/node@20.12.2: resolution: {integrity: sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==} dependencies: undici-types: 5.26.5 - dev: false + dev: true /@types/web-bluetooth@0.0.20: resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} @@ -947,12 +950,14 @@ packages: entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.0 + dev: true /@vue/compiler-dom@3.4.27: resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} dependencies: '@vue/compiler-core': 3.4.27 '@vue/shared': 3.4.27 + dev: true /@vue/compiler-sfc@3.4.27: resolution: {integrity: sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==} @@ -966,12 +971,14 @@ packages: magic-string: 0.30.10 postcss: 8.4.38 source-map-js: 1.2.0 + dev: true /@vue/compiler-ssr@3.4.27: resolution: {integrity: sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==} dependencies: '@vue/compiler-dom': 3.4.27 '@vue/shared': 3.4.27 + dev: true /@vue/devtools-api@7.0.25(vue@3.4.27): resolution: {integrity: sha512-fL6DlRp4MSXCLYcqYvKU7QhQZWE3Hfu7X8pC25BS74coJi7uJeSWs4tmrITcwFihNmC9S5GPiffkMdckkeWjzg==} @@ -1004,12 +1011,14 @@ packages: resolution: {integrity: sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==} dependencies: '@vue/shared': 3.4.27 + dev: true /@vue/runtime-core@3.4.27: resolution: {integrity: sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==} dependencies: '@vue/reactivity': 3.4.27 '@vue/shared': 3.4.27 + dev: true /@vue/runtime-dom@3.4.27: resolution: {integrity: sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==} @@ -1017,6 +1026,7 @@ packages: '@vue/runtime-core': 3.4.27 '@vue/shared': 3.4.27 csstype: 3.1.3 + dev: true /@vue/server-renderer@3.4.27(vue@3.4.27): resolution: {integrity: sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==} @@ -1026,9 +1036,11 @@ packages: '@vue/compiler-ssr': 3.4.27 '@vue/shared': 3.4.27 vue: 3.4.27 + dev: true /@vue/shared@3.4.27: resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} + dev: true /@vueuse/core@10.9.0(vue@3.4.27): resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==} @@ -1108,13 +1120,13 @@ packages: /acorn-walk@8.3.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} - dev: false + dev: true /acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true - dev: false + dev: true /algoliasearch@4.23.2: resolution: {integrity: sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ==} @@ -1142,28 +1154,29 @@ packages: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: false + dev: true /as-table@1.0.55: resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} dependencies: printable-characters: 1.0.42 - dev: false + dev: true /binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - dev: false + dev: true /blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} - dev: false + dev: true /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 + dev: true /capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} @@ -1172,7 +1185,7 @@ packages: tslib: 2.6.2 transitivePeerDependencies: - supports-color - dev: false + dev: true /chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} @@ -1187,12 +1200,12 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: false + dev: true /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - dev: false + dev: true /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -1205,10 +1218,11 @@ packages: /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: true /data-uri-to-buffer@2.0.2: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - dev: false + dev: true /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -1220,11 +1234,12 @@ packages: optional: true dependencies: ms: 2.1.2 - dev: false + dev: true /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + dev: true /esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} @@ -1254,7 +1269,7 @@ packages: '@esbuild/win32-arm64': 0.17.19 '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 - dev: false + dev: true /esbuild@0.20.2: resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} @@ -1290,14 +1305,15 @@ packages: /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - dev: false + dev: true /estree-walker@0.6.1: resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} - dev: false + dev: true /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true /execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} @@ -1317,7 +1333,7 @@ packages: /exit-hook@2.2.1: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - dev: false + dev: true /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} @@ -1341,6 +1357,7 @@ packages: engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 + dev: true /focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} @@ -1353,18 +1370,19 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true + dev: true optional: true /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: false + dev: true /get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} dependencies: data-uri-to-buffer: 2.0.2 source-map: 0.6.1 - dev: false + dev: true /get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} @@ -1376,17 +1394,18 @@ packages: engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 + dev: true /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: false + dev: true /hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 - dev: false + dev: true /hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} @@ -1402,27 +1421,30 @@ packages: engines: {node: '>=8'} dependencies: binary-extensions: 2.3.0 - dev: false + dev: true /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: hasown: 2.0.2 - dev: false + dev: true /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + dev: true /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 + dev: true /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + dev: true /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} @@ -1437,12 +1459,13 @@ packages: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: sourcemap-codec: 1.4.8 - dev: false + dev: true /magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + dev: true /mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} @@ -1469,7 +1492,7 @@ packages: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} hasBin: true - dev: false + dev: true /mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} @@ -1497,7 +1520,7 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false + dev: true /minisearch@6.3.0: resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} @@ -1509,27 +1532,28 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: false + dev: true /mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true - dev: false + dev: true /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: true /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - dev: false + dev: true /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - dev: false + dev: true /npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} @@ -1557,11 +1581,11 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: false + dev: true /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: false + dev: true /perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} @@ -1569,10 +1593,12 @@ packages: /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + dev: true /postcss@8.4.38: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} @@ -1581,6 +1607,7 @@ packages: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 + dev: true /preact@10.20.1: resolution: {integrity: sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==} @@ -1588,7 +1615,7 @@ packages: /printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - dev: false + dev: true /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -1599,12 +1626,12 @@ packages: engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - dev: false + dev: true /resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} - dev: false + dev: true /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} @@ -1613,7 +1640,7 @@ packages: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: false + dev: true /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -1631,19 +1658,19 @@ packages: estree-walker: 0.6.1 magic-string: 0.25.9 rollup-pluginutils: 2.8.2 - dev: false + dev: true /rollup-plugin-node-polyfills@0.2.1: resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} dependencies: rollup-plugin-inject: 3.0.2 - dev: false + dev: true /rollup-pluginutils@2.8.2: resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} dependencies: estree-walker: 0.6.1 - dev: false + dev: true /rollup@4.13.2: resolution: {integrity: sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==} @@ -1686,7 +1713,7 @@ packages: dependencies: '@types/node-forge': 1.3.11 node-forge: 1.3.1 - dev: false + dev: true /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -1714,16 +1741,17 @@ packages: /source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + dev: true /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: false + dev: true /sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead - dev: false + dev: true /speakingurl@14.0.1: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} @@ -1735,12 +1763,12 @@ packages: dependencies: as-table: 1.0.55 get-source: 2.0.12 - dev: false + dev: true /stoppable@1.1.0: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} engines: {node: '>=4', npm: '>=6'} - dev: false + dev: true /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} @@ -1750,7 +1778,7 @@ packages: /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - dev: false + dev: true /tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} @@ -1759,27 +1787,29 @@ packages: /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} + dev: true /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 + dev: true /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false + dev: true /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: false + dev: true /undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} dependencies: '@fastify/busboy': 2.1.1 - dev: false + dev: true /vite@5.2.7: resolution: {integrity: sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==} @@ -1899,6 +1929,7 @@ packages: '@vue/runtime-dom': 3.4.27 '@vue/server-renderer': 3.4.27(vue@3.4.27) '@vue/shared': 3.4.27 + dev: true /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} @@ -1919,7 +1950,7 @@ packages: '@cloudflare/workerd-linux-64': 1.20240329.0 '@cloudflare/workerd-linux-arm64': 1.20240329.0 '@cloudflare/workerd-windows-64': 1.20240329.0 - dev: false + dev: true /wrangler@3.43.0: resolution: {integrity: sha512-v+uJmSVmxdv3aVRQsJLPHXgI5nhOBvJaZ5yUcSO8rJ+m5X2l9HzFQzFlUi1GtYIOejFSr8kcCuLm3YY6JbQruQ==} @@ -1951,7 +1982,7 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false + dev: true /ws@8.16.0: resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} @@ -1964,11 +1995,11 @@ packages: optional: true utf-8-validate: optional: true - dev: false + dev: true /xxhash-wasm@1.0.2: resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} - dev: false + dev: true /youch@3.3.3: resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} @@ -1976,8 +2007,8 @@ packages: cookie: 0.5.0 mustache: 4.2.0 stacktracey: 2.1.8 - dev: false + dev: true /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - dev: false + dev: true From cf95793bd2c2a64e2821c46b05e8f96a3742a87d Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Tue, 28 May 2024 22:10:00 -0400 Subject: [PATCH 317/509] Cache Edit manifests in Tuist's Cache instead of /tmp (#6343) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adding new cache category for `tuist edit` projects * Refactor `edit` to use the tuist cache instead of temp dir This avoids polluting Xcode’s recent projects list. * Initial EditServiceTests file * Add edit service tests * Update edit service to use unique cache directories * Linting * Use `Mockable` for mocking * Remove wait and cleanup for edit Now that we are keeping the edit manifest in deterministic location we no longer need to block and wait for cleanup. Completely removes the need for C signal handling. * Fix tests with `@Mockable` * Linting * Add missed mock * Linting --- Sources/TuistCore/Cache/CacheCategory.swift | 5 + .../ProjectEditor/ProjectEditor.swift | 2 + Sources/TuistKit/Services/EditService.swift | 41 ++++---- Sources/TuistSupport/SignalHandler.swift | 26 ----- .../Services/EditServiceTests.swift | 97 +++++++++++++++++++ .../TuistPluginTests/PluginServiceTests.swift | 2 + 6 files changed, 124 insertions(+), 49 deletions(-) delete mode 100644 Sources/TuistSupport/SignalHandler.swift create mode 100644 Tests/TuistKitTests/Services/EditServiceTests.swift diff --git a/Sources/TuistCore/Cache/CacheCategory.swift b/Sources/TuistCore/Cache/CacheCategory.swift index 70aa7308be6..f581b33cac0 100644 --- a/Sources/TuistCore/Cache/CacheCategory.swift +++ b/Sources/TuistCore/Cache/CacheCategory.swift @@ -12,6 +12,9 @@ public enum CacheCategory: String, CaseIterable, RawRepresentable { /// The manifests cache case manifests + /// The edit projects cache + case editProjects + public var directoryName: String { switch self { case .plugins: @@ -22,6 +25,8 @@ public enum CacheCategory: String, CaseIterable, RawRepresentable { return "ProjectDescriptionHelpers" case .manifests: return "Manifests" + case .editProjects: + return "EditProjects" } } diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditor.swift b/Sources/TuistKit/ProjectEditor/ProjectEditor.swift index 8389c91bca7..f6578d52812 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditor.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditor.swift @@ -1,4 +1,5 @@ import Foundation +import Mockable import TSCBasic import TuistCore import TuistGenerator @@ -25,6 +26,7 @@ enum ProjectEditorError: FatalError, Equatable { } } +@Mockable protocol ProjectEditing: AnyObject { /// Generates an Xcode project to edit the Project defined in the given directory. /// - Parameters: diff --git a/Sources/TuistKit/Services/EditService.swift b/Sources/TuistKit/Services/EditService.swift index b94493e9d5b..78c7f80f89b 100644 --- a/Sources/TuistKit/Services/EditService.swift +++ b/Sources/TuistKit/Services/EditService.swift @@ -1,5 +1,6 @@ import Foundation import TSCBasic +import TuistCore import TuistGenerator import TuistGraph import TuistLoader @@ -29,22 +30,20 @@ final class EditService { private let opener: Opening private let configLoader: ConfigLoading private let pluginService: PluginServicing - private let signalHandler: SignalHandling - - private static var temporaryDirectory: AbsolutePath? + private let cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring init( projectEditor: ProjectEditing = ProjectEditor(), opener: Opening = Opener(), configLoader: ConfigLoading = ConfigLoader(manifestLoader: ManifestLoader()), pluginService: PluginServicing = PluginService(), - signalHandler: SignalHandling = SignalHandler() + cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring = CacheDirectoriesProviderFactory() ) { self.projectEditor = projectEditor self.opener = opener self.configLoader = configLoader self.pluginService = pluginService - self.signalHandler = signalHandler + self.cacheDirectoryProviderFactory = cacheDirectoryProviderFactory } func run( @@ -56,27 +55,23 @@ final class EditService { let plugins = await loadPlugins(at: path) if !permanent { - try withTemporaryDirectory(removeTreeOnDeinit: true) { generationDirectory in - EditService.temporaryDirectory = generationDirectory + let cacheDirectoryProvider = try cacheDirectoryProviderFactory.cacheDirectories() + let cacheDirectory = try cacheDirectoryProvider.tuistCacheDirectory(for: .editProjects) + let cachedManifestDirectory = cacheDirectory.appending(component: path.pathString.md5) - signalHandler.trap { _ in - try? EditService.temporaryDirectory.map(FileHandler.shared.delete) - exit(0) - } + guard let selectedXcode = try XcodeController.shared.selected() else { + throw EditServiceError.xcodeNotSelected + } - guard let selectedXcode = try XcodeController.shared.selected() else { - throw EditServiceError.xcodeNotSelected - } + let workspacePath = try projectEditor.edit( + at: path, + in: cachedManifestDirectory, + onlyCurrentDirectory: onlyCurrentDirectory, + plugins: plugins + ) + logger.pretty("Opening Xcode to edit the project.") + try opener.open(path: workspacePath, application: selectedXcode.path, wait: false) - let workspacePath = try projectEditor.edit( - at: path, - in: generationDirectory, - onlyCurrentDirectory: onlyCurrentDirectory, - plugins: plugins - ) - logger.pretty("Opening Xcode to edit the project. Press \(.keystroke("CTRL + C")) once you are done editing") - try opener.open(path: workspacePath, application: selectedXcode.path, wait: true) - } } else { let workspacePath = try projectEditor.edit( at: path, diff --git a/Sources/TuistSupport/SignalHandler.swift b/Sources/TuistSupport/SignalHandler.swift deleted file mode 100644 index a1e8806699d..00000000000 --- a/Sources/TuistSupport/SignalHandler.swift +++ /dev/null @@ -1,26 +0,0 @@ -import Foundation - -public typealias SigActionHandler = @convention(c) (Int32) -> Void - -/// Signal handling -public protocol SignalHandling { - /// Traps SIGINT or SIGABRT signals, and invokes the closure when received - func trap(_ action: @escaping SigActionHandler) -} - -/// Signal handler -public struct SignalHandler: SignalHandling { - public init() {} - - public func trap(_ action: @escaping SigActionHandler) { - trap(signal: SIGINT, action: action) - trap(signal: SIGABRT, action: action) - } - - private func trap(signal: Int32, action: @escaping SigActionHandler) { - var signalAction = sigaction(__sigaction_u: unsafeBitCast(action, to: __sigaction_u.self), sa_mask: 0, sa_flags: 0) - _ = withUnsafePointer(to: &signalAction) { actionPointer in - sigaction(signal, actionPointer, nil) - } - } -} diff --git a/Tests/TuistKitTests/Services/EditServiceTests.swift b/Tests/TuistKitTests/Services/EditServiceTests.swift new file mode 100644 index 00000000000..a7156b9059a --- /dev/null +++ b/Tests/TuistKitTests/Services/EditServiceTests.swift @@ -0,0 +1,97 @@ +import MockableTest +import TSCBasic +import TuistCore +import TuistGraph +import TuistLoader +import XcodeProj +import XCTest +@testable import TuistCoreTesting +@testable import TuistKit +@testable import TuistLoaderTesting +@testable import TuistPluginTesting +@testable import TuistSupportTesting + +final class EditServiceTests: XCTestCase { + var subject: EditService! + var opener: MockOpener! + var configLoader: MockConfigLoader! + var pluginService: MockPluginService! + var cacheDirectoriesProvider: MockCacheDirectoriesProviding! + var cacheDirectoriesProviderFactory: MockCacheDirectoriesProviderFactoring! + var projectEditor: MockProjectEditing! + + override func setUpWithError() throws { + super.setUp() + opener = MockOpener() + configLoader = MockConfigLoader() + pluginService = MockPluginService() + + let mockCacheDirectoriesProvider = MockCacheDirectoriesProviding() + cacheDirectoriesProvider = mockCacheDirectoriesProvider + + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .value(.editProjects)) + .willReturn("/Users/tuist/cache/EditProjects") + + let cacheDirectoryProviderFactory = MockCacheDirectoriesProviderFactoring() + cacheDirectoriesProviderFactory = cacheDirectoryProviderFactory + given(cacheDirectoryProviderFactory) + .cacheDirectories() + .willReturn(mockCacheDirectoriesProvider) + + projectEditor = MockProjectEditing() + + subject = EditService( + projectEditor: projectEditor, + opener: opener, + configLoader: configLoader, + cacheDirectoryProviderFactory: cacheDirectoriesProviderFactory + ) + } + + func test_edit_uses_caches_directory() async throws { + let path: AbsolutePath = "/private/tmp" + let cacheDirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .editProjects) + let projectDirectory = cacheDirectory.appending(component: path.pathString.md5) + + given(projectEditor!) + .edit(at: .any, in: .any, onlyCurrentDirectory: .any, plugins: .any) + .willReturn(projectDirectory) + + try await subject.run( + path: path.pathString, + permanent: false, + onlyCurrentDirectory: false + ) + + let openArgs = try XCTUnwrap(opener.openArgs.first) + XCTAssertEqual(opener.openCallCount, 1) + XCTAssertEqual(openArgs.0, projectDirectory.pathString) + + verify(projectEditor) + .edit(at: .value(path), in: .value(projectDirectory), onlyCurrentDirectory: .value(false), plugins: .any) + .called(count: 1) + } + + func test_edit_permanent_does_not_open_workspace() async throws { + let path: AbsolutePath = "/private/tmp" + let cacheDirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .editProjects) + let projectDirectory = cacheDirectory.appending(component: path.pathString.md5) + + given(projectEditor!) + .edit(at: .any, in: .any, onlyCurrentDirectory: .any, plugins: .any) + .willReturn(projectDirectory) + + try await subject.run( + path: path.pathString, + permanent: true, + onlyCurrentDirectory: true + ) + + XCTAssertEqual(opener.openCallCount, 0) + + verify(projectEditor) + .edit(at: .value(path), in: .value(path), onlyCurrentDirectory: .value(true), plugins: .any) + .called(count: 1) + } +} diff --git a/Tests/TuistPluginTests/PluginServiceTests.swift b/Tests/TuistPluginTests/PluginServiceTests.swift index 41c353ab41f..8686a0789ef 100644 --- a/Tests/TuistPluginTests/PluginServiceTests.swift +++ b/Tests/TuistPluginTests/PluginServiceTests.swift @@ -41,7 +41,9 @@ final class PluginServiceTests: TuistUnitTestCase { .willReturn(cacheDirectoriesProvider) fileUnarchiver = MockFileUnarchiving() let fileArchivingFactory = MockFileArchivingFactorying() + given(fileArchivingFactory).makeFileUnarchiver(for: .any).willReturn(fileUnarchiver) + fileClient = MockFileClient() subject = PluginService( manifestLoader: manifestLoader, From 25d90e3a3d613caf6a740a03ea4d195a685a0feb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 29 May 2024 09:14:38 +0200 Subject: [PATCH 318/509] Fix dependsOnXCTest function (#6337) --- Sources/TuistCore/Graph/GraphTraverser.swift | 2 +- Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift | 2 +- Tests/TuistCoreTests/Graph/GraphTraverserTests.swift | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index 7641ce01b05..f2d32a87257 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -648,7 +648,7 @@ public class GraphTraverser: GraphTraversing { } return directDependencies.contains(where: { dependency in switch dependency { - case .sdk(name: "XCTest", path: _, status: _, source: _): + case .sdk(name: "XCTest.framework", path: _, status: _, source: _): return true default: return false diff --git a/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift b/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift index 25364742161..5c213e7b866 100644 --- a/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift +++ b/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift @@ -65,7 +65,7 @@ extension GraphDependency { } public static func testSDK( - name: String = "XCTest", + name: String = "XCTest.framework", path: AbsolutePath = AbsolutePath.root.appending(try! RelativePath(validating: "XCTest.framework")), status: SDKStatus = .required, source: SDKSource = .system diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index 8fc09e4f49c..d43524857eb 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -88,7 +88,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ], dependencies: [ .target(name: frameworkTarget.target.name, path: project.path): [ - .testSDK(name: "XCTest"), + .testSDK(name: "XCTest.framework"), ], ] ) From 7e6fae4202a81cb9167ebc76e5ade5deb7d02d8e Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Wed, 29 May 2024 09:33:31 -0400 Subject: [PATCH 319/509] Remove Combine from System command running implementation. (#6328) * Remove unused code It appears this was all related to Carthage and is no longer needed. The various publisher code was triggering strict concurrency warnings. * Migrate `runAndCollectOutput` to directly use `Process` API This was not using anything special about combine and the `Process` API not provides everything we need. * Removing unused code. * Re-add this so tests compile for a bit. * Remove `collectOutput` from tests * Remove Combine from System * Remove CombineExt dependency * Linting * Remove Combine and CombineExt references * Update Doc comments * Adjust runAndPrint to account for not using `.collect` * Linting * Removing Unused system+combine related code * Remove Pipe * This should be false to match original `publisher` implementation * Linting --- Package.resolved | 9 - Package.swift | 3 - .../Utilities/TargetBuilder.swift | 1 - .../XcodeBuild/XcodeBuildController.swift | 177 +++++++------ ...AsyncThrowingStream+XcodeBuildOutput.swift | 21 -- .../Automation/XcodeBuildControlling.swift | 9 +- .../Automation/MockXcodeBuildController.swift | 74 ++---- .../Utils/SwiftPackageManagerInteractor.swift | 19 +- Sources/TuistKit/Services/TestService.swift | 1 - .../Extensions/AnyPublisher+Extras.swift | 32 --- .../Extensions/Publisher+Blocking.swift | 48 ---- .../TuistSupport/Extensions/Task+Retry.swift | 25 ++ .../System/Publisher+System.swift | 89 ------- Sources/TuistSupport/System/System.swift | 236 +++--------------- Sources/TuistSupport/System/SystemEvent.swift | 60 ----- Sources/TuistSupport/System/Systeming.swift | 30 +-- .../TuistSupport/Utils/GitEnvironment.swift | 92 ------- .../Utils/MockGitEnvironment.swift | 25 -- .../Utils/MockSystem.swift | 95 ++----- .../TrackableCommandTests.swift | 1 - .../Services/TestServiceTests.swift | 16 +- .../System/SystemIntegrationTests.swift | 29 +-- .../System/SystemEventTests.swift | 102 -------- .../Utils/GitEnvironmentTests.swift | 141 ----------- Tuist/ProjectDescriptionHelpers/Module.swift | 1 - 25 files changed, 246 insertions(+), 1090 deletions(-) delete mode 100644 Sources/TuistCore/Automation/Extensions/AsyncThrowingStream+XcodeBuildOutput.swift delete mode 100644 Sources/TuistSupport/Extensions/AnyPublisher+Extras.swift delete mode 100644 Sources/TuistSupport/Extensions/Publisher+Blocking.swift create mode 100644 Sources/TuistSupport/Extensions/Task+Retry.swift delete mode 100644 Sources/TuistSupport/System/Publisher+System.swift delete mode 100644 Sources/TuistSupport/System/SystemEvent.swift delete mode 100644 Sources/TuistSupport/Utils/GitEnvironment.swift delete mode 100644 Sources/TuistSupportTesting/Utils/MockGitEnvironment.swift delete mode 100644 Tests/TuistSupportTests/System/SystemEventTests.swift delete mode 100644 Tests/TuistSupportTests/Utils/GitEnvironmentTests.swift diff --git a/Package.resolved b/Package.resolved index 160bbaf7591..b61467f4e12 100644 --- a/Package.resolved +++ b/Package.resolved @@ -28,15 +28,6 @@ "version" : "0.2.1" } }, - { - "identity" : "combineext", - "kind" : "remoteSourceControl", - "location" : "https://github.com/CombineCommunity/CombineExt.git", - "state" : { - "revision" : "d7b896fa9ca8b47fa7bcde6b43ef9b70bf8c1f56", - "version" : "1.8.1" - } - }, { "identity" : "difference", "kind" : "remoteSourceControl", diff --git a/Package.swift b/Package.swift index d8468618b22..bce5e9cd081 100644 --- a/Package.swift +++ b/Package.swift @@ -6,7 +6,6 @@ let swiftToolsSupportDependency: Target.Dependency = .product(name: "SwiftToolsS let loggingDependency: Target.Dependency = .product(name: "Logging", package: "swift-log") let argumentParserDependency: Target.Dependency = .product(name: "ArgumentParser", package: "swift-argument-parser") let swiftGenKitDependency: Target.Dependency = .product(name: "SwiftGenKit", package: "SwiftGen") -let combineExtDependency: Target.Dependency = .byName(name: "CombineExt") var targets: [Target] = [ .executableTarget( @@ -114,7 +113,6 @@ var targets: [Target] = [ .target( name: "TuistSupport", dependencies: [ - combineExtDependency, swiftToolsSupportDependency, loggingDependency, "KeychainAccess", @@ -430,7 +428,6 @@ let package = Package( .package(url: "https://github.com/apple/swift-argument-parser", from: "1.2.3"), .package(url: "https://github.com/apple/swift-log", from: "1.5.3"), .package(url: "https://github.com/apple/swift-tools-support-core", from: "0.6.1"), - .package(url: "https://github.com/CombineCommunity/CombineExt", from: "1.8.1"), .package(url: "https://github.com/FabrizioBrancati/Queuer", from: "2.1.1"), .package(url: "https://github.com/Flight-School/AnyCodable", from: "0.6.7"), .package(url: "https://github.com/weichsel/ZIPFoundation", from: "0.9.17"), diff --git a/Sources/TuistAutomation/Utilities/TargetBuilder.swift b/Sources/TuistAutomation/Utilities/TargetBuilder.swift index a36bfd9d743..cb26db87482 100644 --- a/Sources/TuistAutomation/Utilities/TargetBuilder.swift +++ b/Sources/TuistAutomation/Utilities/TargetBuilder.swift @@ -122,7 +122,6 @@ public final class TargetBuilder: TargetBuilding { arguments: buildArguments, passthroughXcodeBuildArguments: passthroughXcodeBuildArguments ) - .printFormattedOutput() if let buildOutputPath { let configuration = configuration ?? target.project.settings.defaultDebugBuildConfiguration()? diff --git a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift index dcd28f9ad31..7cd2a08423c 100644 --- a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift +++ b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift @@ -1,4 +1,3 @@ -import Combine import Foundation import TSCBasic import TuistCore @@ -40,7 +39,7 @@ public final class XcodeBuildController: XcodeBuildControlling { clean: Bool = false, arguments: [XcodeBuildArgument], passthroughXcodeBuildArguments: [String] - ) throws -> AsyncThrowingStream, Error> { + ) async throws { var command = ["/usr/bin/xcrun", "xcodebuild"] // Action @@ -80,7 +79,7 @@ public final class XcodeBuildController: XcodeBuildControlling { command.append(contentsOf: ["-derivedDataPath", derivedDataPath.pathString]) } - return try run(command: command) + try await run(command: command) } public func test( @@ -97,7 +96,7 @@ public final class XcodeBuildController: XcodeBuildControlling { skipTestTargets: [TestIdentifier], testPlanConfiguration: TestPlanConfiguration?, passthroughXcodeBuildArguments: [String] - ) throws -> AsyncThrowingStream, Error> { + ) async throws { var command = ["/usr/bin/xcrun", "xcodebuild"] // Action @@ -164,7 +163,7 @@ public final class XcodeBuildController: XcodeBuildControlling { } } - return try run(command: command) + try await run(command: command) } public func archive( @@ -174,7 +173,7 @@ public final class XcodeBuildController: XcodeBuildControlling { archivePath: AbsolutePath, arguments: [XcodeBuildArgument], derivedDataPath: AbsolutePath? - ) throws -> AsyncThrowingStream, Error> { + ) async throws { var command = ["/usr/bin/xcrun", "xcodebuild"] // Action @@ -200,19 +199,19 @@ public final class XcodeBuildController: XcodeBuildControlling { // Arguments command.append(contentsOf: arguments.flatMap(\.arguments)) - return try run(command: command) + try await run(command: command) } public func createXCFramework( arguments: [String], output: AbsolutePath - ) throws -> AsyncThrowingStream, Error> { + ) async throws { var command = ["/usr/bin/xcrun", "xcodebuild", "-create-xcframework"] command.append(contentsOf: arguments) command.append(contentsOf: ["-output", output.pathString]) command.append("-allow-internal-distribution") - return try run(command: command) + try await run(command: command) } enum ShowBuildSettingsError: Error { @@ -240,85 +239,107 @@ public final class XcodeBuildController: XcodeBuildControlling { // Target command.append(contentsOf: target.xcodebuildArguments) - - let values = System.shared.publisher(command) - .mapToString() - .collectAndMergeOutput() - // xcodebuild has a bug where xcodebuild -showBuildSettings - // can sometimes hang indefinitely on projects that don't - // share any schemes, so automatically bail out if it looks - // like that's happening. - .timeout(.seconds(20), scheduler: DispatchQueue.main, customError: { ShowBuildSettingsError.timeout }) - .retry(5) - .values + + let buildSettings = try await loadBuildSettings(command) + var buildSettingsByTargetName = [String: XcodeBuildSettings]() - for try await string in values { - var currentSettings: [String: String] = [:] - var currentTarget: String? - - let flushTarget = { () in - if let currentTarget { - let buildSettings = XcodeBuildSettings( - currentSettings, - target: currentTarget, - configuration: configuration - ) - buildSettingsByTargetName[buildSettings.target] = buildSettings - } - - currentTarget = nil - currentSettings = [:] + var currentSettings: [String: String] = [:] + var currentTarget: String? + + func flushTarget() { + if let currentTarget { + let buildSettings = XcodeBuildSettings( + currentSettings, + target: currentTarget, + configuration: configuration + ) + buildSettingsByTargetName[buildSettings.target] = buildSettings } + + currentTarget = nil + currentSettings = [:] + } - string.enumerateLines { line, _ in - if let result = XcodeBuildController.targetSettingsRegex.firstMatch( - in: line, - range: NSRange(line.startIndex..., in: line) - ) { - let targetRange = Range(result.range(at: 1), in: line)! - - flushTarget() - currentTarget = String(line[targetRange]) - return - } - - let trimSet = CharacterSet.whitespacesAndNewlines - let components = line - .split(maxSplits: 1) { $0 == "=" } - .map { $0.trimmingCharacters(in: trimSet) } - - if components.count == 2 { - currentSettings[components[0]] = components[1] - } + buildSettings.enumerateLines { line, _ in + if let result = XcodeBuildController.targetSettingsRegex.firstMatch( + in: line, + range: NSRange(line.startIndex..., in: line) + ) { + let targetRange = Range(result.range(at: 1), in: line)! + + flushTarget() + currentTarget = String(line[targetRange]) + return + } + + let trimSet = CharacterSet.whitespacesAndNewlines + let components = line + .split(maxSplits: 1) { $0 == "=" } + .map { $0.trimmingCharacters(in: trimSet) } + + if components.count == 2 { + currentSettings[components[0]] = components[1] } - flushTarget() } + + flushTarget() + return buildSettingsByTargetName } - fileprivate func run(command: [String]) throws -> AsyncThrowingStream, Error> { - logger.debug("Running xcodebuild command: \(command.joined(separator: " "))") - return System.shared.publisher(command) - .compactMap { [weak self] event -> SystemEvent? in - switch event { - case let .standardError(errorData): - guard let line = String(data: errorData, encoding: .utf8) else { return nil } - if self?.environment.isVerbose == true { - return SystemEvent.standardError(XcodeBuildOutput(raw: line)) - } else { - return SystemEvent.standardError(XcodeBuildOutput(raw: self?.format(line) ?? "")) - } - case let .standardOutput(outputData): - guard let line = String(data: outputData, encoding: .utf8) else { return nil } - if self?.environment.isVerbose == true { - return SystemEvent.standardOutput(XcodeBuildOutput(raw: line)) - } else { - return SystemEvent.standardOutput(XcodeBuildOutput(raw: self?.format(line) ?? "")) - } + fileprivate func run(command: [String]) async throws { + func format(_ bytes: [UInt8]) -> String { + let string = String(decoding: bytes, as: Unicode.UTF8.self) + if self.environment.isVerbose == true { + return string + } else { + return self.format(string) + } + } + + func log(_ bytes: [UInt8], isError: Bool = false) { + let lines = format(bytes).split(separator: "\n") + for line in lines where !line.isEmpty { + if isError { + logger.error("\(line)") + } else { + logger.notice("\(line)") } } - .eraseToAnyPublisher() - .stream + } + + logger.debug("Running xcodebuild command: \(command.joined(separator: " "))") + + try System.shared.runAndPrint(command, + verbose: false, + environment: System.shared.env, + redirection: .stream(stdout: { bytes in + log(bytes) + }, stderr: { bytes in + log(bytes, isError: true) + })) + + } + + private func loadBuildSettings(_ command: [String]) async throws -> String { + // xcodebuild has a bug where xcodebuild -showBuildSettings + // can sometimes hang indefinitely on projects that don't + // share any schemes, so automatically bail out if it looks + // like that's happening. + return try await Task.retrying(maxRetryCount: 5) { + let systemTask = Task { + return try await System.shared.runAndCollectOutput(command).standardOutput + } + + let timeoutTask = Task { + try await Task.sleep(nanoseconds: 20_000_000) + systemTask.cancel() + } + + let result = try await systemTask.value + timeoutTask.cancel() + return result + }.value } } diff --git a/Sources/TuistCore/Automation/Extensions/AsyncThrowingStream+XcodeBuildOutput.swift b/Sources/TuistCore/Automation/Extensions/AsyncThrowingStream+XcodeBuildOutput.swift deleted file mode 100644 index 01a1b4d9638..00000000000 --- a/Sources/TuistCore/Automation/Extensions/AsyncThrowingStream+XcodeBuildOutput.swift +++ /dev/null @@ -1,21 +0,0 @@ -import Foundation -import TuistSupport - -extension AsyncThrowingStream where Element == SystemEvent { - public func printFormattedOutput() async throws { - for try await element in self { - switch element { - case let .standardError(error): - let lines = error.raw.split(separator: "\n") - for line in lines where !line.isEmpty { - logger.error("\(line)") - } - case let .standardOutput(output): - let lines = output.raw.split(separator: "\n") - for line in lines where !line.isEmpty { - logger.notice("\(line)") - } - } - } - } -} diff --git a/Sources/TuistCore/Automation/XcodeBuildControlling.swift b/Sources/TuistCore/Automation/XcodeBuildControlling.swift index e9c3aacc848..f6319eea082 100644 --- a/Sources/TuistCore/Automation/XcodeBuildControlling.swift +++ b/Sources/TuistCore/Automation/XcodeBuildControlling.swift @@ -26,7 +26,7 @@ public protocol XcodeBuildControlling { clean: Bool, arguments: [XcodeBuildArgument], passthroughXcodeBuildArguments: [String] - ) throws -> AsyncThrowingStream, Error> + ) async throws /// Returns an observable to test the given project using xcodebuild. /// - Parameters: @@ -55,7 +55,7 @@ public protocol XcodeBuildControlling { skipTestTargets: [TestIdentifier], testPlanConfiguration: TestPlanConfiguration?, passthroughXcodeBuildArguments: [String] - ) throws -> AsyncThrowingStream, Error> + ) async throws /// Returns an observable that archives the given project using xcodebuild. /// - Parameters: @@ -72,7 +72,7 @@ public protocol XcodeBuildControlling { archivePath: AbsolutePath, arguments: [XcodeBuildArgument], derivedDataPath: AbsolutePath? - ) throws -> AsyncThrowingStream, Error> + ) async throws /// Creates an .xcframework combining the list of given frameworks. /// - Parameters: @@ -81,8 +81,7 @@ public protocol XcodeBuildControlling { func createXCFramework( arguments: [String], output: AbsolutePath - ) - throws -> AsyncThrowingStream, Error> + ) async throws /// Gets the build settings of a scheme targets. /// - Parameters: diff --git a/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift b/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift index 9dfb2c4e55b..d99c718a3ee 100644 --- a/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift +++ b/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift @@ -14,7 +14,7 @@ final class MockXcodeBuildController: XcodeBuildControlling { Bool, [XcodeBuildArgument], [String] - ) -> [SystemEvent])? + ) -> Void)? func build( _ target: XcodeBuildTarget, @@ -25,9 +25,9 @@ final class MockXcodeBuildController: XcodeBuildControlling { clean: Bool, arguments: [XcodeBuildArgument], passthroughXcodeBuildArguments: [String] - ) -> AsyncThrowingStream, Error> { + ) throws { if let buildStub { - return buildStub( + buildStub( target, scheme, destination, @@ -36,13 +36,11 @@ final class MockXcodeBuildController: XcodeBuildControlling { clean, arguments, passthroughXcodeBuildArguments - ).asAsyncThrowingStream() + ) } else { - return AsyncThrowingStream { - throw TestError( - "\(String(describing: MockXcodeBuildController.self)) received an unexpected call to build" - ) - } + throw TestError( + "\(String(describing: MockXcodeBuildController.self)) received an unexpected call to build" + ) } } @@ -62,7 +60,7 @@ final class MockXcodeBuildController: XcodeBuildControlling { TestPlanConfiguration?, [String] ) - -> [SystemEvent] + -> Void )? var testErrorStub: Error? func test( @@ -79,9 +77,9 @@ final class MockXcodeBuildController: XcodeBuildControlling { skipTestTargets: [TestIdentifier], testPlanConfiguration: TestPlanConfiguration?, passthroughXcodeBuildArguments: [String] - ) -> AsyncThrowingStream, Error> { + ) throws { if let testStub { - let results = testStub( + testStub( target, scheme, clean, @@ -97,24 +95,18 @@ final class MockXcodeBuildController: XcodeBuildControlling { passthroughXcodeBuildArguments ) if let testErrorStub { - return AsyncThrowingStream { - throw testErrorStub - } - } else { - return results.asAsyncThrowingStream() + throw testErrorStub } } else { - return AsyncThrowingStream { - throw TestError( - "\(String(describing: MockXcodeBuildController.self)) received an unexpected call to test" - ) - } + throw TestError( + "\(String(describing: MockXcodeBuildController.self)) received an unexpected call to test" + ) } } var archiveStub: ( (XcodeBuildTarget, String, Bool, AbsolutePath, [XcodeBuildArgument], AbsolutePath?) - -> [SystemEvent] + -> Void )? func archive( _ target: XcodeBuildTarget, @@ -123,35 +115,30 @@ final class MockXcodeBuildController: XcodeBuildControlling { archivePath: AbsolutePath, arguments: [XcodeBuildArgument], derivedDataPath: AbsolutePath? - ) -> AsyncThrowingStream, Error> { + ) throws { if let archiveStub { - return archiveStub(target, scheme, clean, archivePath, arguments, derivedDataPath) - .asAsyncThrowingStream() + archiveStub(target, scheme, clean, archivePath, arguments, derivedDataPath) } else { - return AsyncThrowingStream { - throw TestError( - "\(String(describing: MockXcodeBuildController.self)) received an unexpected call to archive" - ) - } + throw TestError( + "\(String(describing: MockXcodeBuildController.self)) received an unexpected call to archive" + ) } } var createXCFrameworkStub: ( ([String], AbsolutePath) - -> [SystemEvent] + -> Void )? func createXCFramework( arguments: [String], output: AbsolutePath - ) -> AsyncThrowingStream, Error> { + ) throws { if let createXCFrameworkStub { - return createXCFrameworkStub(arguments, output).asAsyncThrowingStream() + createXCFrameworkStub(arguments, output) } else { - return AsyncThrowingStream { - throw TestError( - "\(String(describing: MockXcodeBuildController.self)) received an unexpected call to createXCFramework" - ) - } + throw TestError( + "\(String(describing: MockXcodeBuildController.self)) received an unexpected call to createXCFramework" + ) } } @@ -171,12 +158,3 @@ final class MockXcodeBuildController: XcodeBuildControlling { } } } - -extension Collection { - func asAsyncThrowingStream() -> AsyncThrowingStream { - var iterator = makeIterator() - return AsyncThrowingStream { - iterator.next() - } - } -} diff --git a/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift b/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift index 55f4e52352b..b0e672d721d 100644 --- a/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift +++ b/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift @@ -85,15 +85,18 @@ public class SwiftPackageManagerInteractor: SwiftPackageManagerInteracting { arguments.append(contentsOf: ["-workspace", workspacePath.pathString, "-list"]) - let events = System.shared.publisher(arguments).mapToString().values - for try await event in events { - switch event { - case let .standardError(error): - logger.error("\(error)") - case let .standardOutput(output): + try System.shared.runAndPrint( + arguments, + verbose: false, + environment: System.shared.env, + redirection: .stream(stdout: { bytes in + let output = String(decoding: bytes, as: Unicode.UTF8.self) logger.debug("\(output)") - } - } + }, stderr: { bytes in + let error = String(decoding: bytes, as: Unicode.UTF8.self) + logger.error("\(error)") + }) + ) if fileHandler.exists(rootPackageResolvedPath) { try fileHandler.delete(rootPackageResolvedPath) diff --git a/Sources/TuistKit/Services/TestService.swift b/Sources/TuistKit/Services/TestService.swift index 0e9d6b7ea46..e97abb76111 100644 --- a/Sources/TuistKit/Services/TestService.swift +++ b/Sources/TuistKit/Services/TestService.swift @@ -378,6 +378,5 @@ public final class TestService { // swiftlint:disable:this type_body_length testPlanConfiguration: testPlanConfiguration, passthroughXcodeBuildArguments: passthroughXcodeBuildArguments ) - .printFormattedOutput() } } diff --git a/Sources/TuistSupport/Extensions/AnyPublisher+Extras.swift b/Sources/TuistSupport/Extensions/AnyPublisher+Extras.swift deleted file mode 100644 index c0654fa8170..00000000000 --- a/Sources/TuistSupport/Extensions/AnyPublisher+Extras.swift +++ /dev/null @@ -1,32 +0,0 @@ -import Combine -import CombineExt - -extension AnyPublisher { - public init(value: Output) { - self = AnyPublisher.create { subscriber in - subscriber.send(value) - subscriber.send(completion: .finished) - return AnyCancellable {} - } - } - - public init(error: Failure) { - self = AnyPublisher.create { subscriber in - subscriber.send(completion: .failure(error)) - return AnyCancellable {} - } - } - - public init(result: Result) { - self = AnyPublisher.create { subscriber in - switch result { - case let .success(value): - subscriber.send(value) - subscriber.send(completion: .finished) - case let .failure(error): - subscriber.send(completion: .failure(error)) - } - return AnyCancellable {} - } - } -} diff --git a/Sources/TuistSupport/Extensions/Publisher+Blocking.swift b/Sources/TuistSupport/Extensions/Publisher+Blocking.swift deleted file mode 100644 index 20140dbea5f..00000000000 --- a/Sources/TuistSupport/Extensions/Publisher+Blocking.swift +++ /dev/null @@ -1,48 +0,0 @@ -import Combine -import Foundation - -extension Publisher { - /// It blocks the current thread until the publisher finishes. - /// - Parameter timeout: Timeout - /// - Throws: Error thrown by the publisher or as a result of a time out caused by the publishing not finishing in time. - /// - Returns: List of events sent through the publisher. - public func toBlocking(timeout: DispatchTime = .now() + .seconds(10)) throws -> [Output] { - let semaphore = DispatchSemaphore(value: 0) - var values: [Output] = [] - var error: Error? - var cancellables: Set = Set() - let synchronizationQueue = DispatchQueue(label: "io.tuist.support.blocking-publisher") - - sink { completion in - switch completion { - // swiftlint:disable:next identifier_name - case let .failure(_error): - synchronizationQueue.async { - error = _error - semaphore.signal() - } - default: - synchronizationQueue.async { - semaphore.signal() - } - } - } receiveValue: { value in - synchronizationQueue.async { - values.append(value) - } - } - .store(in: &cancellables) - - _ = semaphore.wait(timeout: timeout) - - // By calling cancellables at this point we - // prevent ARC from releasing the set from memory - // and causing the publisher to be cancelled - cancellables.removeAll() - - return try synchronizationQueue.sync { () throws -> [Output] in - if let error { throw error } - return values - } - } -} diff --git a/Sources/TuistSupport/Extensions/Task+Retry.swift b/Sources/TuistSupport/Extensions/Task+Retry.swift new file mode 100644 index 00000000000..bf7a631dea5 --- /dev/null +++ b/Sources/TuistSupport/Extensions/Task+Retry.swift @@ -0,0 +1,25 @@ +import Foundation + +// Inspired by https://www.swiftbysundell.com/articles/retrying-an-async-swift-task/ + +extension Task where Failure == Error { + @discardableResult + public static func retrying( + priority: TaskPriority? = nil, + maxRetryCount: Int = 3, + operation: @Sendable @escaping () async throws -> Success + ) -> Task { + Task(priority: priority) { + for _ in 0 ..< maxRetryCount { + do { + return try await operation() + } catch { + continue + } + } + + try Task.checkCancellation() + return try await operation() + } + } +} diff --git a/Sources/TuistSupport/System/Publisher+System.swift b/Sources/TuistSupport/System/Publisher+System.swift deleted file mode 100644 index b49f7d98d14..00000000000 --- a/Sources/TuistSupport/System/Publisher+System.swift +++ /dev/null @@ -1,89 +0,0 @@ -@preconcurrency import Combine -import Foundation - -extension Publisher where Output == SystemEvent, Failure == Error { - /// Returns another observable where the standard output and error data are mapped - /// to a string. - public func mapToString() -> AnyPublisher, Error> { - map { $0.mapToString() }.eraseToAnyPublisher() - } -} - -extension Publisher where Output == SystemEvent, Failure == Error { - public func print() -> AnyPublisher, Error> { - handleEvents(receiveOutput: { event in - switch event { - case let .standardError(error): - logger.error("\(error)") - case let .standardOutput(output): - logger.notice("\(output)") - } - }) - .eraseToAnyPublisher() - } - - /// Returns an observable that prints the standard error. - public func printStandardError() -> AnyPublisher, Error> { - handleEvents(receiveOutput: { event in - switch event { - case let .standardError(error): - if let data = error.data(using: .utf8) { - FileHandle.standardError.write(data) - } - default: - return - } - }) - .eraseToAnyPublisher() - } - - /// Returns an observable that collects and merges the standard output and error into a single string. - public func collectAndMergeOutput() -> AnyPublisher { - reduce("") { collected, event -> String in - var collected = collected - switch event { - case let .standardError(error): - collected.append(error) - case let .standardOutput(output): - collected.append(output) - } - return collected - }.eraseToAnyPublisher() - } - - /// It collects the standard output and error into an object that is sent - /// as a single event when the process completes. - public func collectOutput() -> AnyPublisher { - reduce(SystemCollectedOutput()) { collected, event -> SystemCollectedOutput in - var collected = collected - switch event { - case let .standardError(error): - collected.standardError.append(error) - case let .standardOutput(output): - collected.standardOutput.append(output) - } - return collected - }.eraseToAnyPublisher() - } -} - -extension Publisher { - public var stream: AsyncThrowingStream { - AsyncThrowingStream(Output.self) { continuation in - let cancellable = sink { completion in - switch completion { - case .finished: - continuation.finish() - case let .failure(error): - continuation.finish(throwing: error) - } - } receiveValue: { output in - continuation.yield(output) - } - - continuation.onTermination = { @Sendable [cancellable] _ in - cancellable.cancel() - } - } - } -} diff --git a/Sources/TuistSupport/System/System.swift b/Sources/TuistSupport/System/System.swift index ce6559966c3..d159d74b9a3 100644 --- a/Sources/TuistSupport/System/System.swift +++ b/Sources/TuistSupport/System/System.swift @@ -1,5 +1,3 @@ -import Combine -import CombineExt import Foundation import TSCBasic @@ -129,28 +127,29 @@ public final class System: Systeming { } public func runAndPrint(_ arguments: [String]) throws { - try runAndPrint(arguments, verbose: false, environment: env) + try runAndPrint(arguments, verbose: false, environment: env, redirection: .none) } - public func runAndPrint( - _ arguments: [String], - verbose: Bool, - environment: [String: String] - ) throws { - try runAndPrint( - arguments, - verbose: verbose, - environment: environment, - redirection: .none - ) + public func runAndPrint(_ arguments: [String], verbose: Bool, environment: [String: String]) throws { + try runAndPrint(arguments, verbose: false, environment: environment, redirection: .none) } public func runAndCollectOutput(_ arguments: [String]) async throws -> SystemCollectedOutput { - var values = publisher(arguments) - .mapToString() - .collectOutput().values.makeAsyncIterator() + let process = Process( + arguments: arguments, + environment: env, + outputRedirection: .collect, + startNewProcessGroup: false + ) + + try process.launch() - return try await values.next()! + let result = try await process.waitUntilExit() + + return SystemCollectedOutput( + standardOutput: try result.utf8Output(), + standardError: try result.utf8stderrOutput() + ) } public func async(_ arguments: [String]) throws { @@ -204,54 +203,6 @@ public final class System: Systeming { // MARK: Helpers - /// Converts an array of arguments into a `Foundation.Process` - /// - Parameters: - /// - arguments: Arguments for the process, first item being the executable URL. - /// - environment: Environment - /// - Returns: A `Foundation.Process` - static func process( - _ arguments: [String], - environment: [String: String] - ) -> Foundation.Process { - let executablePath = arguments.first! - let process = Foundation.Process() - process.executableURL = URL(fileURLWithPath: executablePath) - process.arguments = Array(arguments.dropFirst()) - process.environment = environment - return process - } - - /// Pipe the output of one Process to another - /// - Parameters: - /// - processOne: First Process - /// - processTwo: Second Process - /// - Returns: The pipe - @discardableResult - static func pipe( - _ processOne: inout Foundation.Process, - _ processTwo: inout Foundation.Process - ) -> Pipe { - let processPipe = Pipe() - - processOne.standardOutput = processPipe - processTwo.standardInput = processPipe - return processPipe - } - - /// PIpe the output of a process into separate output and error pipes - /// - Parameter process: The process to pipe - /// - Returns: Tuple that contains the output and error Pipe. - static func pipeOutput(_ process: inout Foundation.Process) -> (stdOut: Pipe, stdErr: Pipe) { - let stdOut = Pipe() - let stdErr = Pipe() - - // Redirect output of Process Two - process.standardOutput = stdOut - process.standardError = stdErr - - return (stdOut, stdErr) - } - public func chmod( _ mode: FileMode, path: AbsolutePath, @@ -260,12 +211,16 @@ public final class System: Systeming { try localFileSystem.chmod(mode, path: path, options: options) } - private func runAndPrint( + public func runAndPrint( _ arguments: [String], - verbose: Bool, - environment: [String: String], - redirection: TSCBasic.Process.OutputRedirection + verbose: Bool = false, + environment: [String: String] = ProcessInfo.processInfo.environment, + redirection: TSCBasic.Process.OutputRedirection = .none ) throws { + // We have to collect both stderr and stdout because we want to stream the output + // the `ProcessResult` type will not contain either unless outputRedirection is set to `.collect` + var stdErrData: [UInt8] = [] + let process = Process( arguments: arguments, environment: environment, @@ -273,6 +228,7 @@ public final class System: Systeming { FileHandle.standardOutput.write(Data(bytes)) redirection.outputClosures?.stdoutClosure(bytes) }, stderr: { bytes in + stdErrData.append(contentsOf: bytes) FileHandle.standardError.write(Data(bytes)) redirection.outputClosures?.stderrClosure(bytes) }), @@ -284,140 +240,16 @@ public final class System: Systeming { try process.launch() let result = try process.waitUntilExit() - let output = try result.utf8Output() - - logger.debug("\(output)") - - try result.throwIfErrored() - } - - public func publisher( - _ arguments: [String], - verbose: Bool, - environment: [String: String] - ) -> AnyPublisher, Error> { - .create { subscriber in - let synchronizationQueue = DispatchQueue(label: "io.tuist.support.system") - var errorData: [UInt8] = [] - let process = Process( - arguments: arguments, - environment: environment, - outputRedirection: .stream(stdout: { bytes in - synchronizationQueue.async { - subscriber.send(.standardOutput(Data(bytes))) - } - }, stderr: { bytes in - synchronizationQueue.async { - errorData.append(contentsOf: bytes) - subscriber.send(.standardError(Data(bytes))) - } - }), - startNewProcessGroup: false, - loggingHandler: verbose ? { stdoutStream.send($0).send("\n").flush() } : nil - ) - DispatchQueue.global().async { - do { - try process.launch() - var result = try process.waitUntilExit() - result = ProcessResult( - arguments: result.arguments, - environment: environment, - exitStatus: result.exitStatus, - output: result.output, - stderrOutput: result.stderrOutput.map { _ in errorData } - ) - try result.throwIfErrored() - synchronizationQueue.sync { - subscriber.send(completion: .finished) - } - } catch { - synchronizationQueue.sync { - subscriber.send(completion: .failure(error)) - } - } - } - return AnyCancellable { - if process.launched { - process.signal(9) // SIGKILL - } - } - } - } - - // swiftlint:disable:next function_body_length - private func publisher( - _ arguments: [String], - environment: [String: String], - pipeTo secondArguments: [String] - ) -> AnyPublisher, Error> { - .create { subscriber in - let synchronizationQueue = DispatchQueue(label: "io.tuist.support.system") - var errorData: [UInt8] = [] - var processOne = System.process(arguments, environment: environment) - var processTwo = System.process(secondArguments, environment: environment) - - System.pipe(&processOne, &processTwo) - - let pipes = System.pipeOutput(&processTwo) - - pipes.stdOut.fileHandleForReading.readabilityHandler = { fileHandle in - synchronizationQueue.async { - let data: Data = fileHandle.availableData - if !data.isEmpty { - subscriber.send(.standardOutput(Data(data))) - } - } - } - pipes.stdErr.fileHandleForReading.readabilityHandler = { fileHandle in - synchronizationQueue.async { - let data: Data = fileHandle.availableData - errorData.append(contentsOf: data) - if !data.isEmpty { - subscriber.send(.standardError(Data(data))) - } - } - } - - DispatchQueue.global().async { - do { - try processOne.run() - try processTwo.run() - processOne.waitUntilExit() - - let exitStatus = ProcessResult.ExitStatus.terminated(code: processOne.terminationStatus) - let result = ProcessResult( - arguments: arguments, - environment: environment, - exitStatus: exitStatus, - output: .success([]), - stderrOutput: .success(errorData) - ) - try result.throwIfErrored() - synchronizationQueue.sync { - subscriber.send(completion: .finished) - } - } catch { - synchronizationQueue.sync { - subscriber.send(completion: .failure(error)) - } - } - } - return AnyCancellable { - pipes.stdOut.fileHandleForReading.readabilityHandler = nil - pipes.stdErr.fileHandleForReading.readabilityHandler = nil - if processOne.isRunning { - processOne.terminate() - } + switch result.exitStatus { + case let .signalled(code): + let data = Data(stdErrData) + throw TuistSupport.SystemError.signalled(command: result.command(), code: code, standardError: data) + case let .terminated(code): + if code != 0 { + let data = Data(stdErrData) + throw TuistSupport.SystemError.terminated(command: result.command(), code: code, standardError: data) } } } - - public func publisher(_ arguments: [String]) -> AnyPublisher, Error> { - publisher(arguments, verbose: false, environment: env) - } - - public func publisher(_ arguments: [String], pipeTo secondArguments: [String]) -> AnyPublisher, Error> { - publisher(arguments, environment: env, pipeTo: secondArguments) - } } diff --git a/Sources/TuistSupport/System/SystemEvent.swift b/Sources/TuistSupport/System/SystemEvent.swift deleted file mode 100644 index 37051d7018e..00000000000 --- a/Sources/TuistSupport/System/SystemEvent.swift +++ /dev/null @@ -1,60 +0,0 @@ -import Foundation -import TSCBasic - -/// It represents an event sent by a running process. -public enum SystemEvent { - /// Data sent through the standard output pipe. - case standardOutput(T) - - /// Data sent through the standard error pipe. - case standardError(T) - - /// Returns the wrapped value. - public var value: T { - switch self { - case let .standardError(value): return value - case let .standardOutput(value): return value - } - } - - /// Returns true if the event is a standard output event. - public var isStandardOutput: Bool { - switch self { - case .standardError: return false - case .standardOutput: return true - } - } - - /// Returns true if the event is a standard output event. - public var isStandardError: Bool { - switch self { - case .standardError: return true - case .standardOutput: return false - } - } -} - -extension SystemEvent: Equatable where T: Equatable { - public static func == (lhs: SystemEvent, rhs: SystemEvent) -> Bool { - switch (lhs, rhs) { - case let (.standardOutput(lhsValue), .standardOutput(rhsValue)): - return lhsValue == rhsValue - case let (.standardError(lhsValue), .standardError(rhsValue)): - return lhsValue == rhsValue - default: - return false - } - } -} - -extension SystemEvent where T == Data { - /// Maps the standard output and error from data to string using the utf8 encoding - func mapToString() -> SystemEvent { - switch self { - case let .standardError(data): - return .standardError(String(data: data, encoding: .utf8)!) - case let .standardOutput(data): - return .standardOutput(String(data: data, encoding: .utf8)!) - } - } -} diff --git a/Sources/TuistSupport/System/Systeming.swift b/Sources/TuistSupport/System/Systeming.swift index fba6e8b090c..fc1e9108142 100644 --- a/Sources/TuistSupport/System/Systeming.swift +++ b/Sources/TuistSupport/System/Systeming.swift @@ -1,4 +1,3 @@ -import Combine import Foundation import TSCBasic @@ -46,28 +45,25 @@ public protocol Systeming { /// - Throws: An error if the command fails. func runAndPrint(_ arguments: [String], verbose: Bool, environment: [String: String]) throws - /// Runs a command in the shell and wraps the standard output. - /// - Parameters: - /// - arguments: Command. - func runAndCollectOutput(_ arguments: [String]) async throws -> SystemCollectedOutput - - /// Runs a command in the shell and wraps the standard output and error in a publisher. - /// - Parameters: - /// - arguments: Command. - func publisher(_ arguments: [String]) -> AnyPublisher, Error> - - /// Runs a command in the shell and wraps the standard output and error in a publisher. + /// Runs a command in the shell printing its output. + /// /// - Parameters: /// - arguments: Command. /// - verbose: When true it prints the command that will be executed before executing it. - /// - environment: Environment that should be used when running the command. - func publisher(_ arguments: [String], verbose: Bool, environment: [String: String]) -> AnyPublisher, Error> + /// - environment: Environment that should be used when running the task. + /// - redirection: Output Redirection behavior for the underlying `Process` + /// - Throws: An error if the command fails. + func runAndPrint( + _ arguments: [String], + verbose: Bool, + environment: [String: String], + redirection: TSCBasic.Process.OutputRedirection + ) throws - /// Runs a command in the shell and wraps the standard output and error in a publisher. + /// Runs a command in the shell and wraps the standard output. /// - Parameters: /// - arguments: Command. - /// - secondArguments: Second Command. - func publisher(_ arguments: [String], pipeTo secondArguments: [String]) -> AnyPublisher, Error> + func runAndCollectOutput(_ arguments: [String]) async throws -> SystemCollectedOutput /// Runs a command in the shell asynchronously. /// When the process that triggers the command gets killed, the command continues its execution. diff --git a/Sources/TuistSupport/Utils/GitEnvironment.swift b/Sources/TuistSupport/Utils/GitEnvironment.swift deleted file mode 100644 index 5aa488641b6..00000000000 --- a/Sources/TuistSupport/Utils/GitEnvironment.swift +++ /dev/null @@ -1,92 +0,0 @@ -import Combine -import Foundation -import TSCUtility - -public protocol GitEnvironmenting { - /// Returns the authentication type that should be used with GitHub. - func githubAuthentication() -> AnyPublisher - - /// It returns the environment's Git credentials for GitHub. - /// This is useful for operations such pulling newer Tuist versions from GitHub - /// without hitting API limits. - func githubCredentials() -> AnyPublisher -} - -public enum GitHubAuthentication: Equatable { - /// Token-based authentication - case token(String) - - /// Username/Password-based authentication - case credentials(GithubCredentials) -} - -public struct GithubCredentials: Equatable { - /// GitHub password - let username: String - - /// GitHub username - let password: String -} - -public enum GitEnvironmentError: FatalError { - case githubCredentialsFillError(String) - - public var type: ErrorType { - switch self { - case .githubCredentialsFillError: return .bug - } - } - - public var description: String { - switch self { - case let .githubCredentialsFillError(message): - return "Trying to get your environment's credentials for https://github.com failed with the following error: \(message)" - } - } -} - -public class GitEnvironment: GitEnvironmenting { - let environment: () -> [String: String] - - public init(environment: @escaping () -> [String: String] = { ProcessInfo.processInfo.environment }) { - self.environment = environment - } - - public func githubAuthentication() -> AnyPublisher { - let env = environment() - if let environmentToken = env[Constants.EnvironmentVariables.githubAPIToken] { - return .init(value: .token(environmentToken)) - } else { - return githubCredentials().map { (credentials: GithubCredentials?) -> GitHubAuthentication? in - credentials.map { GitHubAuthentication.credentials($0) } - } - .eraseToAnyPublisher() - } - } - - // https://github.com/Carthage/Carthage/blob/19a7f97112052394f3ecc33dac3c67e5384b7514/Source/CarthageKit/GitHub.swift#L85 - public func githubCredentials() -> AnyPublisher { - System.shared.publisher( - ["/usr/bin/env", "echo", "url=https://github.com"], - pipeTo: ["/usr/bin/env", "git", "credential", "fill"] - ) - .mapToString() - .collectAndMergeOutput() - .flatMap { (output: String) -> AnyPublisher in - // protocol=https - // host=github.com - // username=pepibumur - // password=foo - let lines = output.split(separator: "\n") - let values = lines.reduce(into: [String: String]()) { result, next in - let components = next.split(separator: "=") - guard components.count == 2 else { return } - result[String(components.first!).spm_chomp()] = String(components.last!).spm_chomp() - } - guard let username = values["username"], - let password = values["password"] else { return AnyPublisher(value: nil) } - return AnyPublisher(value: GithubCredentials(username: username, password: password)) - } - .eraseToAnyPublisher() - } -} diff --git a/Sources/TuistSupportTesting/Utils/MockGitEnvironment.swift b/Sources/TuistSupportTesting/Utils/MockGitEnvironment.swift deleted file mode 100644 index 67d88e83269..00000000000 --- a/Sources/TuistSupportTesting/Utils/MockGitEnvironment.swift +++ /dev/null @@ -1,25 +0,0 @@ -import Combine -import Foundation -import TuistSupport - -public final class MockGitEnvironment: GitEnvironmenting { - public var invokedGithubAuthentication = false - public var invokedGithubAuthenticationCount = 0 - public var stubbedGithubAuthenticationResult: Result! - - public func githubAuthentication() -> AnyPublisher { - invokedGithubAuthentication = true - invokedGithubAuthenticationCount += 1 - return .init(result: stubbedGithubAuthenticationResult) - } - - public var invokedGithubCredentials = false - public var invokedGithubCredentialsCount = 0 - public var stubbedGithubCredentialsResult: Result! - - public func githubCredentials() -> AnyPublisher { - invokedGithubCredentials = true - invokedGithubCredentialsCount += 1 - return .init(result: stubbedGithubCredentialsResult) - } -} diff --git a/Sources/TuistSupportTesting/Utils/MockSystem.swift b/Sources/TuistSupportTesting/Utils/MockSystem.swift index 1d1a80eead8..ef4abf48d29 100644 --- a/Sources/TuistSupportTesting/Utils/MockSystem.swift +++ b/Sources/TuistSupportTesting/Utils/MockSystem.swift @@ -1,4 +1,3 @@ -import Combine import Foundation import TSCBasic import XCTest @@ -61,85 +60,31 @@ public final class MockSystem: Systeming { _ = try capture(arguments, verbose: false, environment: env) } - public func runAndCollectOutput(_ arguments: [String]) async throws -> SystemCollectedOutput { - var values = publisher(arguments) - .mapToString() - .collectOutput() - .eraseToAnyPublisher() - .stream - .makeAsyncIterator() - - return try await values.next()! - } - - public func publisher(_ arguments: [String]) -> AnyPublisher, Error> { - publisher(arguments, verbose: false, environment: env) - } - - public func publisher( + public func runAndPrint( _ arguments: [String], verbose _: Bool, - environment _: [String: String] - ) -> AnyPublisher, Error> { - AnyPublisher, Error>.create { subscriber in - let command = arguments.joined(separator: " ") - guard let stub = self.stubs[command] else { - subscriber - .send(completion: .failure( - TuistSupport.SystemError - .terminated(command: arguments.first!, code: 1, standardError: Data()) - )) - return AnyCancellable {} - } - guard stub.exitstatus == 0 else { - if let error = stub.stderror { - subscriber.send(.standardError(error.data(using: .utf8)!)) - } - subscriber - .send(completion: .failure( - TuistSupport.SystemError - .terminated(command: arguments.first!, code: 1, standardError: Data()) - )) - - return AnyCancellable {} - } - if let stdout = stub.stdout { - subscriber.send(.standardOutput(stdout.data(using: .utf8)!)) - } - subscriber.send(completion: .finished) - return AnyCancellable {} - } + environment _: [String: String], + redirection _: TSCBasic.Process.OutputRedirection + ) throws { + _ = try capture(arguments, verbose: false, environment: env) } - public func publisher(_ arguments: [String], pipeTo _: [String]) -> AnyPublisher, Error> { - AnyPublisher, Error>.create { subscriber in - let command = arguments.joined(separator: " ") - guard let stub = self.stubs[command] else { - subscriber - .send(completion: .failure( - TuistSupport.SystemError - .terminated(command: arguments.first!, code: 1, standardError: Data()) - )) - return AnyCancellable {} - } - guard stub.exitstatus == 0 else { - if let error = stub.stderror { - subscriber.send(.standardError(error.data(using: .utf8)!)) - } - subscriber - .send(completion: .failure( - TuistSupport.SystemError - .terminated(command: arguments.first!, code: 1, standardError: Data()) - )) - - return AnyCancellable {} - } - if let stdout = stub.stdout { - subscriber.send(.standardOutput(stdout.data(using: .utf8)!)) - } - subscriber.send(completion: .finished) - return AnyCancellable {} + public func runAndCollectOutput(_ arguments: [String]) async throws -> SystemCollectedOutput { + let command = arguments.joined(separator: " ") + guard let stub = stubs[command] else { + throw TuistSupport.SystemError + .terminated(command: arguments.first!, code: 1, standardError: Data()) } + + guard stub.exitstatus == 0 else { + throw TuistSupport.SystemError + .terminated(command: arguments.first!, code: 1, standardError: stub.stderror?.data(using: .utf8) ?? Data()) + } + + return SystemCollectedOutput( + standardOutput: stub.stdout ?? "", + standardError: stub.stderror ?? "" + ) } public func async(_ arguments: [String]) throws { diff --git a/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift b/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift index 7f4ffe36589..be16cc2d538 100644 --- a/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift +++ b/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift @@ -1,6 +1,5 @@ import AnyCodable import ArgumentParser -import Combine import Foundation import TuistAnalytics import TuistAsyncQueueTesting diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index 890f797fbd1..d637cd60133 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -210,7 +210,6 @@ final class TestServiceTests: TuistUnitTestCase { var testedRosetta: Bool? xcodebuildController.testStub = { _, _, _, _, rosetta, _, _, _, _, _, _, _, _ in testedRosetta = rosetta - return [.standardOutput(.init(raw: "success"))] } // When @@ -245,7 +244,6 @@ final class TestServiceTests: TuistUnitTestCase { var testedSchemes: [String] = [] xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) - return [.standardOutput(.init(raw: "success"))] } // When @@ -277,7 +275,6 @@ final class TestServiceTests: TuistUnitTestCase { var testedSchemes: [String] = [] xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) - return [.standardOutput(.init(raw: "success"))] } try fileHandler.touch( testsCacheTemporaryDirectory.path.appending(component: "A") @@ -320,7 +317,6 @@ final class TestServiceTests: TuistUnitTestCase { var testedSchemes: [String] = [] xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) - return [.standardOutput(.init(raw: "success"))] } try fileHandler.touch( testsCacheTemporaryDirectory.path.appending(component: "A") @@ -352,7 +348,6 @@ final class TestServiceTests: TuistUnitTestCase { var testedSchemes: [String] = [] xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) - return [.standardOutput(.init(raw: "success"))] } // When @@ -381,7 +376,6 @@ final class TestServiceTests: TuistUnitTestCase { xcodebuildController.testErrorStub = NSError.test() xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) - return [] } try fileHandler.touch( testsCacheTemporaryDirectory.path.appending(component: "A") @@ -416,7 +410,6 @@ final class TestServiceTests: TuistUnitTestCase { var testedSchemes: [String] = [] xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) - return [.standardOutput(.init(raw: "success"))] } // When @@ -436,7 +429,6 @@ final class TestServiceTests: TuistUnitTestCase { xcodebuildController.testStub = { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in resourceBundlePath = gotResourceBundlePath - return [] } generator.generateWithGraphStub = { path in (path, Graph.test()) @@ -467,7 +459,6 @@ final class TestServiceTests: TuistUnitTestCase { xcodebuildController.testStub = { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in resourceBundlePath = gotResourceBundlePath - return [] } generator.generateWithGraphStub = { path in (path, Graph.test()) @@ -512,7 +503,6 @@ final class TestServiceTests: TuistUnitTestCase { var passedRetryCount = 0 xcodebuildController.testStub = { _, _, _, _, _, _, _, _, retryCount, _, _, _, _ in passedRetryCount = retryCount - return [.standardOutput(.init(raw: "success"))] } // When @@ -545,7 +535,6 @@ final class TestServiceTests: TuistUnitTestCase { var passedRetryCount = -1 xcodebuildController.testStub = { _, _, _, _, _, _, _, _, retryCount, _, _, _, _ in passedRetryCount = retryCount - return [.standardOutput(.init(raw: "success"))] } // When @@ -588,7 +577,6 @@ final class TestServiceTests: TuistUnitTestCase { var testedSchemes: [String] = [] xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) - return [.standardOutput(.init(raw: "success"))] } // When @@ -626,9 +614,7 @@ final class TestServiceTests: TuistUnitTestCase { generator.generateWithGraphStub = { path in (path, Graph.test()) } - xcodebuildController.testStub = { _, _, _, _, _, _, _, _, _, _, _, _, _ in - [.standardOutput(.init(raw: "success"))] - } + xcodebuildController.testStub = { _, _, _, _, _, _, _, _, _, _, _, _, _ in } let notDefinedTestPlan = "NotDefined" do { diff --git a/Tests/TuistSupportIntegrationTests/System/SystemIntegrationTests.swift b/Tests/TuistSupportIntegrationTests/System/SystemIntegrationTests.swift index 9c0b84fc03e..beba8df6cbe 100644 --- a/Tests/TuistSupportIntegrationTests/System/SystemIntegrationTests.swift +++ b/Tests/TuistSupportIntegrationTests/System/SystemIntegrationTests.swift @@ -28,28 +28,25 @@ final class SystemIntegrationTests: TuistTestCase { XCTAssertThrowsError(try subject.run(["ls", "abcdefghi"])) } - func test_observable() throws { - // Given - let publisher = subject.publisher(["echo", "hola"]).mapToString() + func test_run_output_is_redirected() throws { + var output = "" + try subject.runAndPrint( + ["echo", "hola"], + verbose: false, + environment: System.shared.env, + redirection: .stream(stdout: { bytes in + output = String(decoding: bytes, as: Unicode.UTF8.self) + }, stderr: { _ in }) + ) - // When - let elements = try publisher.toBlocking() - - // Then - XCTAssertEqual(elements.count, 1) - XCTAssertTrue(elements.first?.value.spm_chomp() == "hola") + XCTAssertEqual(output.spm_chomp(), "hola") } - func test_observable_when_it_errors() throws { - // Given - let publisher = subject.publisher(["/usr/bin/xcrun", "invalid"]).mapToString() - + func test_run_errors() throws { do { - // When - _ = try publisher.toBlocking() + try subject.runAndPrint(["/usr/bin/xcrun", "invalid"], verbose: false, environment: System.shared.env) XCTFail("expected command to fail but it did not") } catch { - // Then XCTAssertTrue(error is TuistSupport.SystemError) } } diff --git a/Tests/TuistSupportTests/System/SystemEventTests.swift b/Tests/TuistSupportTests/System/SystemEventTests.swift deleted file mode 100644 index 4b39dd7baa6..00000000000 --- a/Tests/TuistSupportTests/System/SystemEventTests.swift +++ /dev/null @@ -1,102 +0,0 @@ -import Foundation -import XCTest -@testable import TuistSupport -@testable import TuistSupportTesting - -final class SystemEventTests: TuistUnitTestCase { - func test_value_when_standardOutput() { - // Given - let value = "test" - let subject = SystemEvent.standardOutput(value) - - // Then - XCTAssertEqual(subject.value, value) - } - - func test_value_when_standardError() { - // Given - let value = "test" - let subject = SystemEvent.standardError(value) - - // Then - XCTAssertEqual(subject.value, value) - } - - func test_mapToString_when_standardOutput() { - // Given - let value = "test" - let data = value.data(using: .utf8)! - let subject = SystemEvent.standardOutput(data) - - // When - let got = subject.mapToString() - - // Then - XCTAssertEqual(got, .standardOutput(value)) - } - - func test_mapToString_when_standardError() { - // Given - let value = "test" - let data = value.data(using: .utf8)! - let subject = SystemEvent.standardError(data) - - // When - let got = subject.mapToString() - - // Then - XCTAssertEqual(got, .standardError(value)) - } - - func test_isStandardOuptut_when_standardOutput() { - // Given - let value = "test" - let data = value.data(using: .utf8)! - let subject = SystemEvent.standardOutput(data) - - // When - let got = subject.isStandardOutput - - // Then - XCTAssertTrue(got) - } - - func test_isStandardError_when_standardError() { - // Given - let value = "test" - let data = value.data(using: .utf8)! - let subject = SystemEvent.standardError(data) - - // When - let got = subject.isStandardError - - // Then - XCTAssertTrue(got) - } - - func test_isStandardError_when_standardOutput() { - // Given - let value = "test" - let data = value.data(using: .utf8)! - let subject = SystemEvent.standardOutput(data) - - // When - let got = subject.isStandardError - - // Then - XCTAssertFalse(got) - } - - func test_isStandardOuptut_when_standardError() { - // Given - let value = "test" - let data = value.data(using: .utf8)! - let subject = SystemEvent.standardError(data) - - // When - let got = subject.isStandardOutput - - // Then - XCTAssertFalse(got) - } -} diff --git a/Tests/TuistSupportTests/Utils/GitEnvironmentTests.swift b/Tests/TuistSupportTests/Utils/GitEnvironmentTests.swift deleted file mode 100644 index 97f8c21f350..00000000000 --- a/Tests/TuistSupportTests/Utils/GitEnvironmentTests.swift +++ /dev/null @@ -1,141 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupport -@testable import TuistSupportTesting - -final class GitEnvironmentErrorTests: TuistUnitTestCase { - func test_type_when_githubCredentialsFillError() { - XCTAssertEqual(GitEnvironmentError.githubCredentialsFillError("test").type, .bug) - } - - func test_description_when_githubCredentialsFillError() { - XCTAssertEqual( - GitEnvironmentError.githubCredentialsFillError("test").description, - "Trying to get your environment's credentials for https://github.com failed with the following error: test" - ) - } -} - -final class GitEnvironmentTests: TuistUnitTestCase { - var subject: GitEnvironment! - var envVariables: [String: String]! = [:] - - override func setUp() { - super.setUp() - subject = GitEnvironment(environment: { self.envVariables }) - } - - override func tearDown() { - subject = nil - envVariables = nil - super.tearDown() - } - - func test_githubAuthentication_returns_the_environment_variable_when_the_token_is_present() throws { - // Given - let expectation = XCTestExpectation(description: "Git authentication") - envVariables[Constants.EnvironmentVariables.githubAPIToken] = "TOKEN" - - // When - _ = subject.githubAuthentication() - .sink { _ in - } receiveValue: { value in - XCTAssertEqual(value, .token("TOKEN")) - expectation.fulfill() - } - wait(for: [expectation], timeout: 10.0) - } - - func test_githubAuthentication_returns_the_system_credentials_when_the_token_is_not_present() throws { - // Given - let expectation = XCTestExpectation(description: "Git authentication") - let output = """ - username=tuist - password=rocks - """ - system.succeedCommand(["/usr/bin/env", "echo", "url=https://github.com"], output: output) - system.succeedCommand(["/usr/bin/env", "git", "credential", "fill"], output: output) - - // When - _ = subject.githubAuthentication() - .sink { _ in - } receiveValue: { value in - XCTAssertEqual(value, .credentials(.init(username: "tuist", password: "rocks"))) - expectation.fulfill() - } - wait(for: [expectation], timeout: 10.0) - } - - func test_githubCredentials_when_the_command_fails() throws { - // Given - system.errorCommand(["/usr/bin/env", "echo", "url=https://github.com"]) - system.errorCommand(["/usr/bin/env", "git", "credential", "fill"]) - let expectation = XCTestExpectation(description: "Git credentials fill command") - - // When - _ = subject.githubCredentials() - .sink { completion in - switch completion { - case .failure: - expectation.fulfill() - case .finished: - XCTFail("Expected to receive an error but it did not.") - expectation.fulfill() - } - } receiveValue: { _ in } - wait(for: [expectation], timeout: 10.0) - } - - func test_githubCredentials_when_the_command_returns_the_expected_output() throws { - // Given - let output = """ - username=tuist - password=rocks - """ - system.succeedCommand(["/usr/bin/env", "echo", "url=https://github.com"], output: output) - system.succeedCommand(["/usr/bin/env", "git", "credential", "fill"], output: output) - let expectation = XCTestExpectation(description: "Git credentials fill command") - - // When - _ = subject.githubCredentials() - .sink { completion in - switch completion { - case .failure: - XCTFail("Expected to succeed but it failed") - expectation.fulfill() - case .finished: - expectation.fulfill() - } - } receiveValue: { value in - XCTAssertEqual(value?.username, "tuist") - XCTAssertEqual(value?.password, "rocks") - } - wait(for: [expectation], timeout: 10.0) - } - - func test_githubCredentials_when_the_commands_output_lacks_username_or_password() throws { - // Given - let output = """ - password=rocks - """ - system.succeedCommand(["/usr/bin/env", "echo", "url=https://github.com"], output: output) - system.succeedCommand(["/usr/bin/env", "git", "credential", "fill"], output: output) - let expectation = XCTestExpectation(description: "Git credentials fill command") - - // When - _ = subject.githubCredentials() - .sink { completion in - switch completion { - case .failure: - XCTFail("Expected to succeed but it failed") - expectation.fulfill() - case .finished: - expectation.fulfill() - } - } receiveValue: { value in - XCTAssertNil(value) - } - wait(for: [expectation], timeout: 10.0) - } -} diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index 733db97c5e5..98a7ca416e8 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -228,7 +228,6 @@ public enum Module: String, CaseIterable { .external(name: "AnyCodable"), .external(name: "XcodeProj"), .external(name: "KeychainAccess"), - .external(name: "CombineExt"), .external(name: "Logging"), .external(name: "ZIPFoundation"), .external(name: "Difference"), From aa14de72331fed7f3d75ba3509e1a5b38c1c67b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 29 May 2024 16:09:44 +0200 Subject: [PATCH 320/509] Add acceptance test (#6342) Co-authored-by: Daniele Formichelli --- .../TuistAcceptanceFixtures.swift | 3 + .../GenerateAcceptanceTests.swift | 11 ++ .../.package.resolved | 15 ++ .../Package.resolved | 140 ++++++++++++++++++ .../Project.swift | 1 - .../README.md | 6 + 6 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 fixtures/framework_with_macro_and_plugin_packages/.package.resolved create mode 100644 fixtures/framework_with_macro_and_plugin_packages/Package.resolved create mode 100644 fixtures/framework_with_macro_and_plugin_packages/README.md diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift index 008d6478b3f..ec19021bb90 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift @@ -13,6 +13,7 @@ public enum TuistAcceptanceFixtures { case commandLineToolWithDynamicLibrary case commandLineToolWithStaticLibrary case frameworkWithEnvironmentVariables + case frameworkWithMacroAndPluginPackages case frameworkWithNativeSwiftMacro case frameworkWithSwiftMacro case invalidManifest @@ -96,6 +97,8 @@ public enum TuistAcceptanceFixtures { return "command_line_tool_with_static_library" case .frameworkWithEnvironmentVariables: return "framework_with_environment_variables" + case .frameworkWithMacroAndPluginPackages: + return "framework_with_macro_and_plugin_packages" case .frameworkWithNativeSwiftMacro: return "framework_with_native_swift_macro" case .frameworkWithSwiftMacro: diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index c0e70bf70d4..36c778b91dc 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -859,6 +859,17 @@ final class GenerateAcceptanceTestAppWithDefaultConfiguration: TuistAcceptanceTe } } +final class GenerateAcceptanceTestFrameworkWithMacroAndPluginPackages: TuistAcceptanceTestCase { + func test_framework_with_macro_and_plugin_packages() async throws { + try setUpFixture(.frameworkWithMacroAndPluginPackages) + try await run(InstallCommand.self) + try await run(GenerateCommand.self) + try await run(BuildCommand.self, "--", "-skipPackagePluginValidation") + } +} + +// frameworkWithMacroAndPluginPackages + extension TuistAcceptanceTestCase { private func resourcePath( for productName: String, diff --git a/fixtures/framework_with_macro_and_plugin_packages/.package.resolved b/fixtures/framework_with_macro_and_plugin_packages/.package.resolved new file mode 100644 index 00000000000..ca6162eecea --- /dev/null +++ b/fixtures/framework_with_macro_and_plugin_packages/.package.resolved @@ -0,0 +1,15 @@ +{ + "originHash" : "f23bfcf9a9ba15fad7000bb7c533c80d700daf4b8147c24567a6b7275c64803a", + "pins" : [ + { + "identity" : "swiftlintplugin", + "kind" : "remoteSourceControl", + "location" : "https://github.com/lukepistrol/SwiftLintPlugin", + "state" : { + "revision" : "a0f7b12c7be228592d924f29f654ebbd924ac9c5", + "version" : "0.55.1" + } + } + ], + "version" : 3 +} diff --git a/fixtures/framework_with_macro_and_plugin_packages/Package.resolved b/fixtures/framework_with_macro_and_plugin_packages/Package.resolved new file mode 100644 index 00000000000..7d9f8d6e7d8 --- /dev/null +++ b/fixtures/framework_with_macro_and_plugin_packages/Package.resolved @@ -0,0 +1,140 @@ +{ + "pins" : [ + { + "identity" : "combine-schedulers", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/combine-schedulers", + "state" : { + "revision" : "9dc9cbe4bc45c65164fa653a563d8d8db61b09bb", + "version" : "1.0.0" + } + }, + { + "identity" : "structbuildermacro", + "kind" : "remoteSourceControl", + "location" : "https://github.com/alschmut/StructBuilderMacro", + "state" : { + "revision" : "e281b8e34cb5663e7ae060a51cf7669725c91a27", + "version" : "0.5.0" + } + }, + { + "identity" : "swift-case-paths", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-case-paths", + "state" : { + "revision" : "8d712376c99fc0267aa0e41fea732babe365270a", + "version" : "1.3.3" + } + }, + { + "identity" : "swift-clocks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-clocks", + "state" : { + "revision" : "a8421d68068d8f45fbceb418fbf22c5dad4afd33", + "version" : "1.0.2" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections", + "state" : { + "revision" : "94cf62b3ba8d4bed62680a282d4c25f9c63c2efb", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-composable-architecture", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-composable-architecture", + "state" : { + "revision" : "433a23118f739078644ebeb4009e23d307af694a", + "version" : "1.10.4" + } + }, + { + "identity" : "swift-concurrency-extras", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-concurrency-extras", + "state" : { + "revision" : "bb5059bde9022d69ac516803f4f227d8ac967f71", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-custom-dump", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-custom-dump", + "state" : { + "revision" : "f01efb26f3a192a0e88dcdb7c3c391ec2fc25d9c", + "version" : "1.3.0" + } + }, + { + "identity" : "swift-dependencies", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-dependencies", + "state" : { + "revision" : "350e1e119babe8525f9bd155b76640a5de270184", + "version" : "1.3.0" + } + }, + { + "identity" : "swift-identified-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-identified-collections", + "state" : { + "revision" : "d533cd18b0b456b106694a9899f917ee595f2666", + "version" : "1.0.2" + } + }, + { + "identity" : "swift-perception", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-perception", + "state" : { + "revision" : "8e8ca36c02abc7775a3ab81f9468c0df5fe22c2c", + "version" : "1.1.7" + } + }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-syntax.git", + "state" : { + "revision" : "64889f0c732f210a935a0ad7cda38f77f876262d", + "version" : "509.1.1" + } + }, + { + "identity" : "swiftlintplugin", + "kind" : "remoteSourceControl", + "location" : "https://github.com/lukepistrol/SwiftLintPlugin", + "state" : { + "revision" : "a0f7b12c7be228592d924f29f654ebbd924ac9c5", + "version" : "0.55.1" + } + }, + { + "identity" : "swiftui-navigation", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swiftui-navigation", + "state" : { + "revision" : "2ec6c3a15293efff6083966b38439a4004f25565", + "version" : "1.3.0" + } + }, + { + "identity" : "xctest-dynamic-overlay", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", + "state" : { + "revision" : "6f30bdba373bbd7fbfe241dddd732651f2fbd1e2", + "version" : "1.1.2" + } + } + ], + "version" : 2 +} diff --git a/fixtures/framework_with_macro_and_plugin_packages/Project.swift b/fixtures/framework_with_macro_and_plugin_packages/Project.swift index 9ba31d579ab..5d53245b46f 100644 --- a/fixtures/framework_with_macro_and_plugin_packages/Project.swift +++ b/fixtures/framework_with_macro_and_plugin_packages/Project.swift @@ -9,7 +9,6 @@ let project = Project( .target( name: "Framework", destinations: [ - .iPhone, .mac, ], product: .framework, diff --git a/fixtures/framework_with_macro_and_plugin_packages/README.md b/fixtures/framework_with_macro_and_plugin_packages/README.md new file mode 100644 index 00000000000..b7416d059f5 --- /dev/null +++ b/fixtures/framework_with_macro_and_plugin_packages/README.md @@ -0,0 +1,6 @@ +# Framework with native Swift Macro and Plugin packages + +This project represents a project with a framework that integrates the following Swift Packages: + +- A [build tool plugin](https://github.com/apple/swift-package-manager/blob/main/Documentation/Plugins.md) using Xcode's native integration. +- A Swift Macro using Tuist's integration based on XcodeProj primitives. \ No newline at end of file From 3d3e67d2e6ff20162b28d37f31655fdf90a08687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 29 May 2024 18:56:51 +0200 Subject: [PATCH 321/509] Upload test result bundle (#6345) * Upload test result bundle * Refactor result bundle path into its own method * Trigger build --- .../TuistCore/Analytics/CommandEvent.swift | 7 + Sources/TuistCore/Cache/CacheCategory.swift | 5 + .../TuistKit/Commands/GenerateCommand.swift | 1 + Sources/TuistKit/Commands/GraphCommand.swift | 1 + Sources/TuistKit/Commands/InitCommand.swift | 1 + Sources/TuistKit/Commands/TestCommand.swift | 2 + .../CommandEventFactory.swift | 1 + .../TrackableCommand/TrackableCommand.swift | 17 +- .../TrackableParametersDelegate.swift | 2 + Sources/TuistKit/Commands/TuistCommand.swift | 23 +- Sources/TuistKit/Services/TestService.swift | 49 +- .../Utils/TuistAnalyticsCloudBackend.swift | 40 +- .../TuistLoader/Loaders/ConfigLoader.swift | 2 + .../Loaders/Mocks/MockConfigLoader.swift | 18 - Sources/TuistServer/OpenAPI/Client.swift | 275 +++- Sources/TuistServer/OpenAPI/Types.swift | 1139 ++++++++++++++--- Sources/TuistServer/OpenAPI/cloud.yml | 315 +++-- .../AnalyticsArtifactUploadService.swift | 78 ++ .../MultipartUploadArtifactService.swift | 112 ++ ...tipartUploadCompleteAnalyticsService.swift | 82 ++ ...artUploadGenerateURLAnalyticsService.swift | 85 ++ ...MultipartUploadStartAnalyticsService.swift | 72 ++ .../TuistServer/Utilities/DelayProvider.swift | 18 + .../TuistServer/Utilities/RetryProvider.swift | 42 + Sources/TuistSupport/Constants.swift | 1 + .../Cloud/CloudAuthServiceTests.swift | 8 +- .../Cloud/CloudCleanServiceTests.swift | 20 +- .../Cloud/CloudInitServiceTests.swift | 29 +- .../Cloud/CloudLogoutServiceTests.swift | 6 +- .../CloudOrganizationInviteServiceTests.swift | 8 +- .../CloudOrganizationListServiceTests.swift | 8 +- ...oudOrganizationRemoveSSOServiceTests.swift | 8 +- .../CloudOrganizationShowServiceTests.swift | 8 +- .../CloudOrganizationUpdateSSOService.swift | 8 +- .../CloudProjectDeleteServiceTests.swift | 8 +- .../Cloud/CloudProjectListServiceTests.swift | 8 +- .../Cloud/CloudSessionServiceTests.swift | 6 +- .../CommandEventFactoryTests.swift | 2 + .../TrackableCommandTests.swift | 1 + .../Services/EditServiceTests.swift | 8 +- .../Services/InstallServiceTests.swift | 26 +- .../Services/ScaffoldServiceTests.swift | 12 +- .../Services/TestServiceTests.swift | 100 +- .../Services/TuistServiceTests.swift | 25 +- .../TuistAnalyticsCloudBackendTests.swift | 66 +- .../Utils/TuistAnalyticsDispatcherTests.swift | 36 +- .../AnalyticsArtifactUploadServiceTests.swift | 97 ++ .../Utilities/DelayProviderTests.swift | 44 + .../Utilities/RetryProviderTests.swift | 70 + .../Tuist/Config.swift | 8 +- 50 files changed, 2624 insertions(+), 384 deletions(-) delete mode 100644 Sources/TuistLoaderTesting/Loaders/Mocks/MockConfigLoader.swift create mode 100644 Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift create mode 100644 Sources/TuistServer/Services/MultipartUploadArtifactService.swift create mode 100644 Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift create mode 100644 Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift create mode 100644 Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift create mode 100644 Sources/TuistServer/Utilities/DelayProvider.swift create mode 100644 Sources/TuistServer/Utilities/RetryProvider.swift create mode 100644 Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift create mode 100644 Tests/TuistServerTests/Utilities/DelayProviderTests.swift create mode 100644 Tests/TuistServerTests/Utilities/RetryProviderTests.swift diff --git a/Sources/TuistCore/Analytics/CommandEvent.swift b/Sources/TuistCore/Analytics/CommandEvent.swift index 871ca992231..27fd82d2563 100644 --- a/Sources/TuistCore/Analytics/CommandEvent.swift +++ b/Sources/TuistCore/Analytics/CommandEvent.swift @@ -1,8 +1,10 @@ import AnyCodable import Foundation +import TSCBasic /// A `CommandEvent` is the analytics event to track the execution of a Tuist command public struct CommandEvent: Codable, Equatable, AsyncQueueEvent { + public let runId: String public let name: String public let subcommand: String? public let params: [String: AnyCodable] @@ -25,6 +27,7 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent { public let dispatcherId = "TuistAnalytics" private enum CodingKeys: String, CodingKey { + case runId case name case subcommand case params @@ -40,6 +43,7 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent { } public init( + runId: String, name: String, subcommand: String?, params: [String: AnyCodable], @@ -53,6 +57,7 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent { isCI: Bool, status: Status ) { + self.runId = runId self.name = name self.subcommand = subcommand self.params = params @@ -71,6 +76,7 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent { #if MOCKING extension CommandEvent { public static func test( + runId: String = "", name: String = "generate", subcommand: String? = nil, params: [String: AnyCodable] = [:], @@ -84,6 +90,7 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent { status: Status = .success ) -> CommandEvent { CommandEvent( + runId: runId, name: name, subcommand: subcommand, params: params, diff --git a/Sources/TuistCore/Cache/CacheCategory.swift b/Sources/TuistCore/Cache/CacheCategory.swift index f581b33cac0..7382771cd39 100644 --- a/Sources/TuistCore/Cache/CacheCategory.swift +++ b/Sources/TuistCore/Cache/CacheCategory.swift @@ -15,6 +15,9 @@ public enum CacheCategory: String, CaseIterable, RawRepresentable { /// The edit projects cache case editProjects + /// The Tuist Runs cache + case runs + public var directoryName: String { switch self { case .plugins: @@ -27,6 +30,8 @@ public enum CacheCategory: String, CaseIterable, RawRepresentable { return "Manifests" case .editProjects: return "EditProjects" + case .runs: + return "Runs" } } diff --git a/Sources/TuistKit/Commands/GenerateCommand.swift b/Sources/TuistKit/Commands/GenerateCommand.swift index 9a5993b2e59..ee47be0e387 100644 --- a/Sources/TuistKit/Commands/GenerateCommand.swift +++ b/Sources/TuistKit/Commands/GenerateCommand.swift @@ -7,6 +7,7 @@ import TuistSupport public struct GenerateCommand: AsyncParsableCommand, HasTrackableParameters { public init() {} public static var analyticsDelegate: TrackableParametersDelegate? + public var runId = "" public static var configuration: CommandConfiguration { CommandConfiguration( diff --git a/Sources/TuistKit/Commands/GraphCommand.swift b/Sources/TuistKit/Commands/GraphCommand.swift index 4b96ec6e764..4ef2e188a70 100644 --- a/Sources/TuistKit/Commands/GraphCommand.swift +++ b/Sources/TuistKit/Commands/GraphCommand.swift @@ -13,6 +13,7 @@ public struct GraphCommand: AsyncParsableCommand, HasTrackableParameters { public init() {} public static var analyticsDelegate: TrackableParametersDelegate? + public var runId = "" public static var configuration: CommandConfiguration { CommandConfiguration( diff --git a/Sources/TuistKit/Commands/InitCommand.swift b/Sources/TuistKit/Commands/InitCommand.swift index 46a9d9ff11a..c2e39ea27ca 100644 --- a/Sources/TuistKit/Commands/InitCommand.swift +++ b/Sources/TuistKit/Commands/InitCommand.swift @@ -21,6 +21,7 @@ public struct InitCommand: ParsableCommand, HasTrackableParameters { } public static var analyticsDelegate: TrackableParametersDelegate? + public var runId = "" @Option( help: "The platform (ios, tvos, visionos, watchos or macos) the product will be for (Default: ios)", diff --git a/Sources/TuistKit/Commands/TestCommand.swift b/Sources/TuistKit/Commands/TestCommand.swift index 5b1604087e9..731379d7fe4 100644 --- a/Sources/TuistKit/Commands/TestCommand.swift +++ b/Sources/TuistKit/Commands/TestCommand.swift @@ -10,6 +10,7 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { public init() {} public static var analyticsDelegate: TrackableParametersDelegate? + public var runId = "" public static var configuration: CommandConfiguration { CommandConfiguration( @@ -183,6 +184,7 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { } try await TestService().run( + runId: runId, schemeName: scheme, clean: clean, configuration: configuration, diff --git a/Sources/TuistKit/Commands/TrackableCommand/CommandEventFactory.swift b/Sources/TuistKit/Commands/TrackableCommand/CommandEventFactory.swift index d10551f56b1..cbc45837c83 100644 --- a/Sources/TuistKit/Commands/TrackableCommand/CommandEventFactory.swift +++ b/Sources/TuistKit/Commands/TrackableCommand/CommandEventFactory.swift @@ -18,6 +18,7 @@ public final class CommandEventFactory { public func make(from info: TrackableCommandInfo) -> CommandEvent { let commandEvent = CommandEvent( + runId: info.runId, name: info.name, subcommand: info.subcommand, params: info.parameters, diff --git a/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift b/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift index e8877b3b8a9..50ec0476681 100644 --- a/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift +++ b/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift @@ -8,6 +8,7 @@ import TuistSupport /// `TrackableCommandInfo` contains the information to report the execution of a command public struct TrackableCommandInfo { + let runId: String let name: String let subcommand: String? let parameters: [String: AnyCodable] @@ -40,9 +41,12 @@ public class TrackableCommand: TrackableParametersDelegate { } public func run() async throws { + let runId = UUID().uuidString let timer = clock.startTimer() - if let command = command as? HasTrackableParameters { + if var command = command as? HasTrackableParameters & ParsableCommand { type(of: command).analyticsDelegate = self + command.runId = runId + self.command = command } do { if var asyncCommand = command as? AsyncParsableCommand { @@ -50,19 +54,24 @@ public class TrackableCommand: TrackableParametersDelegate { } else { try command.run() } - try dispatchCommandEvent(timer: timer, status: .success) + try dispatchCommandEvent(timer: timer, status: .success, runId: runId) } catch { - try dispatchCommandEvent(timer: timer, status: .failure("\(error)")) + try dispatchCommandEvent(timer: timer, status: .failure("\(error)"), runId: runId) throw error } } - private func dispatchCommandEvent(timer: any ClockTimer, status: CommandEvent.Status) throws { + private func dispatchCommandEvent( + timer: any ClockTimer, + status: CommandEvent.Status, + runId: String + ) throws { let durationInSeconds = timer.stop() let durationInMs = Int(durationInSeconds * 1000) let configuration = type(of: command).configuration let (name, subcommand) = extractCommandName(from: configuration) let info = TrackableCommandInfo( + runId: runId, name: name, subcommand: subcommand, parameters: trackedParameters, diff --git a/Sources/TuistKit/Commands/TrackableCommand/TrackableParametersDelegate.swift b/Sources/TuistKit/Commands/TrackableCommand/TrackableParametersDelegate.swift index 1f1bdf0c9af..356f3ae8ac6 100644 --- a/Sources/TuistKit/Commands/TrackableCommand/TrackableParametersDelegate.swift +++ b/Sources/TuistKit/Commands/TrackableCommand/TrackableParametersDelegate.swift @@ -4,6 +4,8 @@ import Foundation /// Commands that conform to `HasTrackableParameters` can report extra parameters that are only known at runtime public protocol HasTrackableParameters { static var analyticsDelegate: TrackableParametersDelegate? { get set } + /// ID that uniquely identifies the command run + var runId: String { get set } } /// `TrackableParametersDelegate` contains the callback that should be called diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index b3b9acd5d63..f726443ed12 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -33,8 +33,7 @@ public struct TuistCommand: AsyncParsableCommand { public static func main( _ arguments: [String]? = nil, - parseAsRoot: ((_ arguments: [String]?) throws -> ParsableCommand) = Self.parseAsRoot, - execute: ((_ command: ParsableCommand, _ commandArguments: [String]) async throws -> Void)? = nil + parseAsRoot: ((_ arguments: [String]?) throws -> ParsableCommand) = Self.parseAsRoot ) async throws { let path: AbsolutePath if let argumentIndex = CommandLine.arguments.firstIndex(of: "--path") { @@ -55,7 +54,6 @@ public struct TuistCommand: AsyncParsableCommand { let dispatcher = TuistAnalyticsDispatcher(backend: backend) try TuistAnalytics.bootstrap(dispatcher: dispatcher) - let execute = execute ?? Self.execute let errorHandler = ErrorHandler() let executeCommand: () async throws -> Void let processedArguments = Array(processArguments(arguments)?.dropFirst() ?? []) @@ -69,10 +67,11 @@ public struct TuistCommand: AsyncParsableCommand { } let command = try parseAsRoot(processedArguments) executeCommand = { - try await execute( - command, - processedArguments + let trackableCommand = TrackableCommand( + command: command, + commandArguments: processedArguments ) + try await trackableCommand.run() } } catch { parsedError = error @@ -120,18 +119,6 @@ public struct TuistCommand: AsyncParsableCommand { _exit(exitCode) } - private static func execute( - command: ParsableCommand, - commandArguments _: [String] - ) async throws { - var command = command - if var asyncCommand = command as? AsyncParsableCommand { - try await asyncCommand.run() - } else { - try command.run() - } - } - // MARK: - Helpers static func processArguments(_ arguments: [String]? = nil) -> [String]? { diff --git a/Sources/TuistKit/Services/TestService.swift b/Sources/TuistKit/Services/TestService.swift index e97abb76111..56ab36ead35 100644 --- a/Sources/TuistKit/Services/TestService.swift +++ b/Sources/TuistKit/Services/TestService.swift @@ -66,13 +66,18 @@ public final class TestService { // swiftlint:disable:this type_body_length private let testsCacheTemporaryDirectory: TemporaryDirectory private let cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring + private let configLoader: ConfigLoading public convenience init( testsCacheTemporaryDirectory: TemporaryDirectory ) { + let manifestLoaderFactory = ManifestLoaderFactory() + let manifestLoader = manifestLoaderFactory.createManifestLoader() + let configLoader = ConfigLoader(manifestLoader: manifestLoader) self.init( testsCacheTemporaryDirectory: testsCacheTemporaryDirectory, - generatorFactory: GeneratorFactory() + generatorFactory: GeneratorFactory(), + configLoader: configLoader ) } @@ -90,7 +95,8 @@ public final class TestService { // swiftlint:disable:this type_body_length buildGraphInspector: BuildGraphInspecting = BuildGraphInspector(), simulatorController: SimulatorControlling = SimulatorController(), contentHasher: ContentHashing = ContentHasher(), - cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring = CacheDirectoriesProviderFactory() + cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring = CacheDirectoriesProviderFactory(), + configLoader: ConfigLoading ) { self.testsCacheTemporaryDirectory = testsCacheTemporaryDirectory self.generatorFactory = generatorFactory @@ -99,6 +105,7 @@ public final class TestService { // swiftlint:disable:this type_body_length self.simulatorController = simulatorController self.contentHasher = contentHasher self.cacheDirectoryProviderFactory = cacheDirectoryProviderFactory + self.configLoader = configLoader } public func validateParameters( @@ -153,6 +160,7 @@ public final class TestService { // swiftlint:disable:this type_body_length // swiftlint:disable:next function_body_length public func run( + runId: String, schemeName: String?, clean: Bool, configuration: String?, @@ -180,9 +188,6 @@ public final class TestService { // swiftlint:disable:this type_body_length ) } // Load config - let manifestLoaderFactory = ManifestLoaderFactory() - let manifestLoader = manifestLoaderFactory.createManifestLoader() - let configLoader = ConfigLoader(manifestLoader: manifestLoader) let config = try configLoader.loadConfig(path: path) let testGenerator: Generating @@ -224,6 +229,23 @@ public final class TestService { // swiftlint:disable:this type_body_length ) } + let passedResultBundlePath = resultBundlePath + + let resultBundlePath = try self.resultBundlePath( + passedResultBundlePath: passedResultBundlePath, + runId: runId, + config: config + ) + + defer { + if let resultBundlePath, let passedResultBundlePath, config.cloud != nil { + if !FileHandler.shared.exists(resultBundlePath.parentDirectory) { + try? FileHandler.shared.createFolder(resultBundlePath.parentDirectory) + } + try? FileHandler.shared.copy(from: passedResultBundlePath, to: resultBundlePath) + } + } + if let schemeName { guard let scheme = testableSchemes.first(where: { $0.name == schemeName }) else { @@ -302,6 +324,23 @@ public final class TestService { // swiftlint:disable:this type_body_length // MARK: - Helpers + /// - Returns: Result bundle path to use. Either passed by the user or a path in the Tuist cache + private func resultBundlePath( + passedResultBundlePath: AbsolutePath?, + runId: String, + config: Config + ) throws -> AbsolutePath? { + let runResultBundlePath = try cacheDirectoryProviderFactory.cacheDirectories() + .tuistCacheDirectory(for: .runs) + .appending(components: runId, Constants.resultBundleName) + + if config.cloud == nil { + return passedResultBundlePath + } else { + return passedResultBundlePath ?? runResultBundlePath + } + } + // swiftlint:disable:next function_body_length private func testScheme( scheme: Scheme, diff --git a/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift b/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift index 15fc7a8ca12..177fbf556e6 100644 --- a/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift +++ b/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift @@ -9,36 +9,68 @@ import TuistSupport public class TuistAnalyticsCloudBackend: TuistAnalyticsBackend { private let config: Cloud private let createCommandEventService: CreateCommandEventServicing + private let fileHandler: FileHandling private let ciChecker: CIChecking + private let cacheDirectoriesProviderFactory: CacheDirectoriesProviderFactoring + private let analyticsArtifactUploadService: AnalyticsArtifactUploadServicing public convenience init(config: Cloud) { self.init( config: config, - createCommandEventService: CreateCommandEventService() + createCommandEventService: CreateCommandEventService(), + fileHandler: FileHandler.shared, + ciChecker: CIChecker(), + cacheDirectoriesProviderFactory: CacheDirectoriesProviderFactory(), + analyticsArtifactUploadService: AnalyticsArtifactUploadService() ) } public init( config: Cloud, createCommandEventService: CreateCommandEventServicing, - ciChecker: CIChecking = CIChecker() + fileHandler: FileHandling, + ciChecker: CIChecking, + cacheDirectoriesProviderFactory: CacheDirectoriesProviderFactoring, + analyticsArtifactUploadService: AnalyticsArtifactUploadServicing ) { self.config = config self.createCommandEventService = createCommandEventService + self.fileHandler = fileHandler self.ciChecker = ciChecker + self.cacheDirectoriesProviderFactory = cacheDirectoriesProviderFactory + self.analyticsArtifactUploadService = analyticsArtifactUploadService } public func send(commandEvent: CommandEvent) async throws { - let commandEvent = try await createCommandEventService.createCommandEvent( + let cloudCommandEvent = try await createCommandEventService.createCommandEvent( commandEvent: commandEvent, projectId: config.projectId, serverURL: config.url ) + let runDirectory = try cacheDirectoriesProviderFactory.cacheDirectories() + .tuistCacheDirectory(for: .runs) + .appending(component: commandEvent.runId) + + let resultBundle = runDirectory + .appending(component: "\(Constants.resultBundleName).xcresult") + + if fileHandler.exists(resultBundle) { + try await analyticsArtifactUploadService.uploadAnalyticsArtifact( + artifactPath: resultBundle, + commandEventId: cloudCommandEvent.id, + serverURL: config.url + ) + } + + if fileHandler.exists(runDirectory) { + try fileHandler.delete(runDirectory) + } + if #available(macOS 13.0, *), ciChecker.isCI() { logger .info( - "You can view a detailed report at: \(commandEvent.url.absoluteString)" + "You can view a detailed report at: \(cloudCommandEvent.url.absoluteString)" ) } } diff --git a/Sources/TuistLoader/Loaders/ConfigLoader.swift b/Sources/TuistLoader/Loaders/ConfigLoader.swift index 1a1c7279fa9..25aa339292a 100644 --- a/Sources/TuistLoader/Loaders/ConfigLoader.swift +++ b/Sources/TuistLoader/Loaders/ConfigLoader.swift @@ -1,10 +1,12 @@ import Foundation +import Mockable import struct ProjectDescription.Config import TSCBasic import TuistCore import TuistGraph import TuistSupport +@Mockable public protocol ConfigLoading { /// Loads the Tuist configuration by traversing the file system till the Config manifest is found, /// otherwise returns the default configuration. diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockConfigLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockConfigLoader.swift deleted file mode 100644 index 651d4ee9ac8..00000000000 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockConfigLoader.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation -import TSCBasic -import TuistGraph -import TuistLoader - -public final class MockConfigLoader: ConfigLoading { - public init() {} - - public var loadConfigStub: ((AbsolutePath) throws -> Config)? - public func loadConfig(path: AbsolutePath) throws -> Config { - try loadConfigStub?(path) ?? .default - } - - public var locateConfigStub: ((AbsolutePath) -> AbsolutePath?)? - public func locateConfig(at: TSCBasic.AbsolutePath) -> TSCBasic.AbsolutePath? { - locateConfigStub?(at) - } -} diff --git a/Sources/TuistServer/OpenAPI/Client.swift b/Sources/TuistServer/OpenAPI/Client.swift index 07e4c04f299..e56f5577baa 100644 --- a/Sources/TuistServer/OpenAPI/Client.swift +++ b/Sources/TuistServer/OpenAPI/Client.swift @@ -587,8 +587,7 @@ public struct Client: APIProtocol { ) let body: Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Body = try converter.getResponseBodyAsJSON( - Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Body - .jsonPayload.self, + Components.Schemas.ArtifactMultipartUploadURL.self, from: response.body, transforming: { value in .json(value) } ) @@ -703,8 +702,7 @@ public struct Client: APIProtocol { ) let body: Operations.startCacheArtifactMultipartUpload.Output.Ok.Body = try converter.getResponseBodyAsJSON( - Operations.startCacheArtifactMultipartUpload.Output.Ok.Body.jsonPayload - .self, + Components.Schemas.ArtifactUploadID.self, from: response.body, transforming: { value in .json(value) } ) @@ -1923,4 +1921,273 @@ public struct Client: APIProtocol { } ) } + /// It completes a multi-part upload. + /// + /// Given the upload ID and all the parts with their ETags, this endpoint completes the multipart upload. + /// + /// - Remark: HTTP `POST /api/runs/{run_id}/complete`. + /// - Remark: Generated from `#/paths//api/runs/{run_id}/complete/post(completeAnalyticsArtifactMultipartUpload)`. + public func completeAnalyticsArtifactMultipartUpload( + _ input: Operations.completeAnalyticsArtifactMultipartUpload.Input + ) async throws -> Operations.completeAnalyticsArtifactMultipartUpload.Output { + try await client.send( + input: input, + forOperation: Operations.completeAnalyticsArtifactMultipartUpload.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/runs/{}/complete", + parameters: [input.path.run_id] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 204: + let headers: + Operations.completeAnalyticsArtifactMultipartUpload.Output.NoContent.Headers = + .init() + return .noContent(.init(headers: headers, body: nil)) + case 403: + let headers: + Operations.completeAnalyticsArtifactMultipartUpload.Output.Forbidden.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.completeAnalyticsArtifactMultipartUpload.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: + Operations.completeAnalyticsArtifactMultipartUpload.Output.NotFound.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.completeAnalyticsArtifactMultipartUpload.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// It generates a signed URL for uploading a part. + /// + /// Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. + /// + /// - Remark: HTTP `POST /api/runs/{run_id}/generate-url`. + /// - Remark: Generated from `#/paths//api/runs/{run_id}/generate-url/post(generateAnalyticsArtifactMultipartUploadURL)`. + public func generateAnalyticsArtifactMultipartUploadURL( + _ input: Operations.generateAnalyticsArtifactMultipartUploadURL.Input + ) async throws -> Operations.generateAnalyticsArtifactMultipartUploadURL.Output { + try await client.send( + input: input, + forOperation: Operations.generateAnalyticsArtifactMultipartUploadURL.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/runs/{}/generate-url", + parameters: [input.path.run_id] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Ok.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.ArtifactMultipartUploadURL.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 403: + let headers: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Forbidden + .Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.NotFound + .Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// It initiates a multipart upload for a command event artifact. + /// + /// The endpoint returns an upload ID that can be used to generate URLs for the individual parts and complete the upload. + /// + /// - Remark: HTTP `POST /api/runs/{run_id}/start`. + /// - Remark: Generated from `#/paths//api/runs/{run_id}/start/post(startAnalyticsArtifactMultipartUpload)`. + public func startAnalyticsArtifactMultipartUpload( + _ input: Operations.startAnalyticsArtifactMultipartUpload.Input + ) async throws -> Operations.startAnalyticsArtifactMultipartUpload.Output { + try await client.send( + input: input, + forOperation: Operations.startAnalyticsArtifactMultipartUpload.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/runs/{}/start", + parameters: [input.path.run_id] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: + Operations.startAnalyticsArtifactMultipartUpload.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.startAnalyticsArtifactMultipartUpload.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.ArtifactUploadID.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 403: + let headers: + Operations.startAnalyticsArtifactMultipartUpload.Output.Forbidden.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.startAnalyticsArtifactMultipartUpload.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: + Operations.startAnalyticsArtifactMultipartUpload.Output.NotFound.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.startAnalyticsArtifactMultipartUpload.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } } diff --git a/Sources/TuistServer/OpenAPI/Types.swift b/Sources/TuistServer/OpenAPI/Types.swift index f0bc0fe727d..197811e18e2 100644 --- a/Sources/TuistServer/OpenAPI/Types.swift +++ b/Sources/TuistServer/OpenAPI/Types.swift @@ -175,6 +175,33 @@ public protocol APIProtocol: Sendable { /// - Remark: Generated from `#/paths//api/projects/{id}/delete(deleteProject)`. func deleteProject(_ input: Operations.deleteProject.Input) async throws -> Operations.deleteProject.Output + /// It completes a multi-part upload. + /// + /// Given the upload ID and all the parts with their ETags, this endpoint completes the multipart upload. + /// + /// - Remark: HTTP `POST /api/runs/{run_id}/complete`. + /// - Remark: Generated from `#/paths//api/runs/{run_id}/complete/post(completeAnalyticsArtifactMultipartUpload)`. + func completeAnalyticsArtifactMultipartUpload( + _ input: Operations.completeAnalyticsArtifactMultipartUpload.Input + ) async throws -> Operations.completeAnalyticsArtifactMultipartUpload.Output + /// It generates a signed URL for uploading a part. + /// + /// Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. + /// + /// - Remark: HTTP `POST /api/runs/{run_id}/generate-url`. + /// - Remark: Generated from `#/paths//api/runs/{run_id}/generate-url/post(generateAnalyticsArtifactMultipartUploadURL)`. + func generateAnalyticsArtifactMultipartUploadURL( + _ input: Operations.generateAnalyticsArtifactMultipartUploadURL.Input + ) async throws -> Operations.generateAnalyticsArtifactMultipartUploadURL.Output + /// It initiates a multipart upload for a command event artifact. + /// + /// The endpoint returns an upload ID that can be used to generate URLs for the individual parts and complete the upload. + /// + /// - Remark: HTTP `POST /api/runs/{run_id}/start`. + /// - Remark: Generated from `#/paths//api/runs/{run_id}/start/post(startAnalyticsArtifactMultipartUpload)`. + func startAnalyticsArtifactMultipartUpload( + _ input: Operations.startAnalyticsArtifactMultipartUpload.Input + ) async throws -> Operations.startAnalyticsArtifactMultipartUpload.Output } /// Server URLs defined in the OpenAPI document. public enum Servers { @@ -222,6 +249,210 @@ public enum Components { } public enum CodingKeys: String, CodingKey { case error } } + /// Represents an multipart upload's part identified by the upload id and the part number + /// + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadPart`. + public struct ArtifactMultipartUploadPart: Codable, Equatable, Hashable, Sendable { + /// The part number of the multipart upload. + /// + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadPart/part_number`. + public var part_number: Swift.Int + /// The upload ID. + /// + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadPart/upload_id`. + public var upload_id: Swift.String + /// Creates a new `ArtifactMultipartUploadPart`. + /// + /// - Parameters: + /// - part_number: The part number of the multipart upload. + /// - upload_id: The upload ID. + public init(part_number: Swift.Int, upload_id: Swift.String) { + self.part_number = part_number + self.upload_id = upload_id + } + public enum CodingKeys: String, CodingKey { + case part_number + case upload_id + } + } + /// It represents a part that has been uploaded using multipart uploads. The part is identified by its number and the etag + /// + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadParts`. + public struct ArtifactMultipartUploadParts: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadParts/partsPayload`. + public struct partsPayloadPayload: Codable, Equatable, Hashable, Sendable { + /// The ETag of the part + /// + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadParts/partsPayload/etag`. + public var etag: Swift.String + /// The part number + /// + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadParts/partsPayload/part_number`. + public var part_number: Swift.Int + /// Creates a new `partsPayloadPayload`. + /// + /// - Parameters: + /// - etag: The ETag of the part + /// - part_number: The part number + public init(etag: Swift.String, part_number: Swift.Int) { + self.etag = etag + self.part_number = part_number + } + public enum CodingKeys: String, CodingKey { + case etag + case part_number + } + } + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadParts/parts`. + public typealias partsPayload = [Components.Schemas.ArtifactMultipartUploadParts + .partsPayloadPayload] + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadParts/parts`. + public var parts: Components.Schemas.ArtifactMultipartUploadParts.partsPayload + /// The upload ID + /// + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadParts/upload_id`. + public var upload_id: Swift.String + /// Creates a new `ArtifactMultipartUploadParts`. + /// + /// - Parameters: + /// - parts: + /// - upload_id: The upload ID + public init( + parts: Components.Schemas.ArtifactMultipartUploadParts.partsPayload, + upload_id: Swift.String + ) { + self.parts = parts + self.upload_id = upload_id + } + public enum CodingKeys: String, CodingKey { + case parts + case upload_id + } + } + /// The URL to upload a multipart part + /// + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadURL`. + public struct ArtifactMultipartUploadURL: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadURL/data`. + public struct dataPayload: Codable, Equatable, Hashable, Sendable { + /// The URL to upload the part + /// + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadURL/data/url`. + public var url: Swift.String + /// Creates a new `dataPayload`. + /// + /// - Parameters: + /// - url: The URL to upload the part + public init(url: Swift.String) { self.url = url } + public enum CodingKeys: String, CodingKey { case url } + } + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadURL/data`. + public var data: Components.Schemas.ArtifactMultipartUploadURL.dataPayload + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadURL/status`. + @frozen + public enum statusPayload: RawRepresentable, Codable, Equatable, Hashable, Sendable, + _AutoLosslessStringConvertible, CaseIterable + { + case success + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "success": self = .success + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .success: return "success" + } + } + public static var allCases: [statusPayload] { [.success] } + } + /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadURL/status`. + public var status: Components.Schemas.ArtifactMultipartUploadURL.statusPayload + /// Creates a new `ArtifactMultipartUploadURL`. + /// + /// - Parameters: + /// - data: + /// - status: + public init( + data: Components.Schemas.ArtifactMultipartUploadURL.dataPayload, + status: Components.Schemas.ArtifactMultipartUploadURL.statusPayload + ) { + self.data = data + self.status = status + } + public enum CodingKeys: String, CodingKey { + case data + case status + } + } + /// The upload has been initiated and a ID is returned to upload the various parts using multi-part uploads + /// + /// - Remark: Generated from `#/components/schemas/ArtifactUploadID`. + public struct ArtifactUploadID: Codable, Equatable, Hashable, Sendable { + /// Data that contains ID that's associated with the multipart upload to use when uploading parts + /// + /// - Remark: Generated from `#/components/schemas/ArtifactUploadID/data`. + public struct dataPayload: Codable, Equatable, Hashable, Sendable { + /// The upload ID + /// + /// - Remark: Generated from `#/components/schemas/ArtifactUploadID/data/upload_id`. + public var upload_id: Swift.String + /// Creates a new `dataPayload`. + /// + /// - Parameters: + /// - upload_id: The upload ID + public init(upload_id: Swift.String) { self.upload_id = upload_id } + public enum CodingKeys: String, CodingKey { case upload_id } + } + /// Data that contains ID that's associated with the multipart upload to use when uploading parts + /// + /// - Remark: Generated from `#/components/schemas/ArtifactUploadID/data`. + public var data: Components.Schemas.ArtifactUploadID.dataPayload + /// - Remark: Generated from `#/components/schemas/ArtifactUploadID/status`. + @frozen + public enum statusPayload: RawRepresentable, Codable, Equatable, Hashable, Sendable, + _AutoLosslessStringConvertible, CaseIterable + { + case success + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "success": self = .success + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .success: return "success" + } + } + public static var allCases: [statusPayload] { [.success] } + } + /// - Remark: Generated from `#/components/schemas/ArtifactUploadID/status`. + public var status: Components.Schemas.ArtifactUploadID.statusPayload + /// Creates a new `ArtifactUploadID`. + /// + /// - Parameters: + /// - data: Data that contains ID that's associated with the multipart upload to use when uploading parts + /// - status: + public init( + data: Components.Schemas.ArtifactUploadID.dataPayload, + status: Components.Schemas.ArtifactUploadID.statusPayload + ) { + self.data = data + self.status = status + } + public enum CodingKeys: String, CodingKey { + case data + case status + } + } /// Token to authenticate the user with. /// /// - Remark: Generated from `#/components/schemas/AuthenticationToken`. @@ -268,7 +499,29 @@ public enum Components { /// - Remark: Generated from `#/components/schemas/CacheArtifactDownloadURL/data`. public var data: Components.Schemas.CacheArtifactDownloadURL.dataPayload /// - Remark: Generated from `#/components/schemas/CacheArtifactDownloadURL/status`. - public var status: Swift.String + @frozen + public enum statusPayload: RawRepresentable, Codable, Equatable, Hashable, Sendable, + _AutoLosslessStringConvertible, CaseIterable + { + case success + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "success": self = .success + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .success: return "success" + } + } + public static var allCases: [statusPayload] { [.success] } + } + /// - Remark: Generated from `#/components/schemas/CacheArtifactDownloadURL/status`. + public var status: Components.Schemas.CacheArtifactDownloadURL.statusPayload /// Creates a new `CacheArtifactDownloadURL`. /// /// - Parameters: @@ -276,7 +529,7 @@ public enum Components { /// - status: public init( data: Components.Schemas.CacheArtifactDownloadURL.dataPayload, - status: Swift.String + status: Components.Schemas.CacheArtifactDownloadURL.statusPayload ) { self.data = data self.status = status @@ -293,7 +546,29 @@ public enum Components { /// - Remark: Generated from `#/components/schemas/CacheArtifactExistence/data`. public var data: OpenAPIRuntime.OpenAPIObjectContainer? /// - Remark: Generated from `#/components/schemas/CacheArtifactExistence/status`. - public var status: Swift.String? + @frozen + public enum statusPayload: RawRepresentable, Codable, Equatable, Hashable, Sendable, + _AutoLosslessStringConvertible, CaseIterable + { + case success + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "success": self = .success + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .success: return "success" + } + } + public static var allCases: [statusPayload] { [.success] } + } + /// - Remark: Generated from `#/components/schemas/CacheArtifactExistence/status`. + public var status: Components.Schemas.CacheArtifactExistence.statusPayload? /// Creates a new `CacheArtifactExistence`. /// /// - Parameters: @@ -301,7 +576,7 @@ public enum Components { /// - status: public init( data: OpenAPIRuntime.OpenAPIObjectContainer? = nil, - status: Swift.String? = nil + status: Components.Schemas.CacheArtifactExistence.statusPayload? = nil ) { self.data = data self.status = status @@ -319,7 +594,30 @@ public enum Components { /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadCompletion/data`. public var data: OpenAPIRuntime.OpenAPIObjectContainer? /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadCompletion/status`. - public var status: Swift.String? + @frozen + public enum statusPayload: RawRepresentable, Codable, Equatable, Hashable, Sendable, + _AutoLosslessStringConvertible, CaseIterable + { + case success + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "success": self = .success + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .success: return "success" + } + } + public static var allCases: [statusPayload] { [.success] } + } + /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadCompletion/status`. + public var status: + Components.Schemas.CacheArtifactMultipartUploadCompletion.statusPayload? /// Creates a new `CacheArtifactMultipartUploadCompletion`. /// /// - Parameters: @@ -327,83 +625,8 @@ public enum Components { /// - status: public init( data: OpenAPIRuntime.OpenAPIObjectContainer? = nil, - status: Swift.String? = nil - ) { - self.data = data - self.status = status - } - public enum CodingKeys: String, CodingKey { - case data - case status - } - } - /// The URL to upload a part has been generated. - /// - /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadURL`. - public struct CacheArtifactMultipartUploadURL: Codable, Equatable, Hashable, Sendable { - /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadURL/data`. - public struct dataPayload: Codable, Equatable, Hashable, Sendable { - /// The URL to upload the part - /// - /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadURL/data/url`. - public var url: Swift.String - /// Creates a new `dataPayload`. - /// - /// - Parameters: - /// - url: The URL to upload the part - public init(url: Swift.String) { self.url = url } - public enum CodingKeys: String, CodingKey { case url } - } - /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadURL/data`. - public var data: Components.Schemas.CacheArtifactMultipartUploadURL.dataPayload - /// - Remark: Generated from `#/components/schemas/CacheArtifactMultipartUploadURL/status`. - public var status: Swift.String - /// Creates a new `CacheArtifactMultipartUploadURL`. - /// - /// - Parameters: - /// - data: - /// - status: - public init( - data: Components.Schemas.CacheArtifactMultipartUploadURL.dataPayload, - status: Swift.String - ) { - self.data = data - self.status = status - } - public enum CodingKeys: String, CodingKey { - case data - case status - } - } - /// The upload has been initiated and a ID is returned to upload the various parts using multi-part uploads - /// - /// - Remark: Generated from `#/components/schemas/CacheArtifactUploadID`. - public struct CacheArtifactUploadID: Codable, Equatable, Hashable, Sendable { - /// - Remark: Generated from `#/components/schemas/CacheArtifactUploadID/data`. - public struct dataPayload: Codable, Equatable, Hashable, Sendable { - /// The upload ID - /// - /// - Remark: Generated from `#/components/schemas/CacheArtifactUploadID/data/upload_id`. - public var upload_id: Swift.String - /// Creates a new `dataPayload`. - /// - /// - Parameters: - /// - upload_id: The upload ID - public init(upload_id: Swift.String) { self.upload_id = upload_id } - public enum CodingKeys: String, CodingKey { case upload_id } - } - /// - Remark: Generated from `#/components/schemas/CacheArtifactUploadID/data`. - public var data: Components.Schemas.CacheArtifactUploadID.dataPayload - /// - Remark: Generated from `#/components/schemas/CacheArtifactUploadID/status`. - public var status: Swift.String - /// Creates a new `CacheArtifactUploadID`. - /// - /// - Parameters: - /// - data: - /// - status: - public init( - data: Components.Schemas.CacheArtifactUploadID.dataPayload, - status: Swift.String + status: Components.Schemas.CacheArtifactMultipartUploadCompletion.statusPayload? = + nil ) { self.data = data self.status = status @@ -473,6 +696,47 @@ public enum Components { case url } } + /// It represents an artifact that's associated with a command event (e.g. result bundles) + /// + /// - Remark: Generated from `#/components/schemas/CommandEventArtifact`. + public struct CommandEventArtifact: Codable, Equatable, Hashable, Sendable { + /// The command event artifact type. + /// + /// - Remark: Generated from `#/components/schemas/CommandEventArtifact/type`. + @frozen + public enum _typePayload: RawRepresentable, Codable, Equatable, Hashable, Sendable, + _AutoLosslessStringConvertible, CaseIterable + { + case result_bundle + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "result_bundle": self = .result_bundle + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .result_bundle: return "result_bundle" + } + } + public static var allCases: [_typePayload] { [.result_bundle] } + } + /// The command event artifact type. + /// + /// - Remark: Generated from `#/components/schemas/CommandEventArtifact/type`. + public var _type: Components.Schemas.CommandEventArtifact._typePayload + /// Creates a new `CommandEventArtifact`. + /// + /// - Parameters: + /// - _type: The command event artifact type. + public init(_type: Components.Schemas.CommandEventArtifact._typePayload) { + self._type = _type + } + public enum CodingKeys: String, CodingKey { case _type = "type" } + } /// - Remark: Generated from `#/components/schemas/Error`. public struct _Error: Codable, Equatable, Hashable, Sendable { /// The error message @@ -1608,7 +1872,30 @@ public enum Operations { /// - Remark: Generated from `#/paths/api/cache/exists/GET/json/data`. public var data: OpenAPIRuntime.OpenAPIObjectContainer? /// - Remark: Generated from `#/paths/api/cache/exists/GET/json/status`. - public var status: Swift.String? + @frozen + public enum statusPayload: RawRepresentable, Codable, Equatable, Hashable, + Sendable, _AutoLosslessStringConvertible, CaseIterable + { + case success + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "success": self = .success + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .success: return "success" + } + } + public static var allCases: [statusPayload] { [.success] } + } + /// - Remark: Generated from `#/paths/api/cache/exists/GET/json/status`. + public var status: + Operations.cacheArtifactExists.Output.Ok.Body.jsonPayload.statusPayload? /// Creates a new `jsonPayload`. /// /// - Parameters: @@ -1616,7 +1903,8 @@ public enum Operations { /// - status: public init( data: OpenAPIRuntime.OpenAPIObjectContainer? = nil, - status: Swift.String? = nil + status: Operations.cacheArtifactExists.Output.Ok.Body.jsonPayload + .statusPayload? = nil ) { self.data = data self.status = status @@ -1929,7 +2217,31 @@ public enum Operations { /// - Remark: Generated from `#/paths/api/cache/multipart/complete/POST/json/data`. public var data: OpenAPIRuntime.OpenAPIObjectContainer? /// - Remark: Generated from `#/paths/api/cache/multipart/complete/POST/json/status`. - public var status: Swift.String? + @frozen + public enum statusPayload: RawRepresentable, Codable, Equatable, Hashable, + Sendable, _AutoLosslessStringConvertible, CaseIterable + { + case success + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "success": self = .success + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .success: return "success" + } + } + public static var allCases: [statusPayload] { [.success] } + } + /// - Remark: Generated from `#/paths/api/cache/multipart/complete/POST/json/status`. + public var status: + Operations.completeCacheArtifactMultipartUpload.Output.Ok.Body + .jsonPayload.statusPayload? /// Creates a new `jsonPayload`. /// /// - Parameters: @@ -1937,7 +2249,8 @@ public enum Operations { /// - status: public init( data: OpenAPIRuntime.OpenAPIObjectContainer? = nil, - status: Swift.String? = nil + status: Operations.completeCacheArtifactMultipartUpload.Output.Ok.Body + .jsonPayload.statusPayload? = nil ) { self.data = data self.status = status @@ -2175,51 +2488,7 @@ public enum Operations { public var headers: Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Headers @frozen public enum Body: Sendable, Equatable, Hashable { - /// The URL to upload a part has been generated. - /// - /// - Remark: Generated from `#/paths/api/cache/multipart/generate-url/POST/json`. - public struct jsonPayload: Codable, Equatable, Hashable, Sendable { - /// - Remark: Generated from `#/paths/api/cache/multipart/generate-url/POST/json/data`. - public struct dataPayload: Codable, Equatable, Hashable, Sendable { - /// The URL to upload the part - /// - /// - Remark: Generated from `#/paths/api/cache/multipart/generate-url/POST/json/data/url`. - public var url: Swift.String - /// Creates a new `dataPayload`. - /// - /// - Parameters: - /// - url: The URL to upload the part - public init(url: Swift.String) { self.url = url } - public enum CodingKeys: String, CodingKey { case url } - } - /// - Remark: Generated from `#/paths/api/cache/multipart/generate-url/POST/json/data`. - public var data: - Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Body - .jsonPayload.dataPayload - /// - Remark: Generated from `#/paths/api/cache/multipart/generate-url/POST/json/status`. - public var status: Swift.String - /// Creates a new `jsonPayload`. - /// - /// - Parameters: - /// - data: - /// - status: - public init( - data: Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Body - .jsonPayload.dataPayload, - status: Swift.String - ) { - self.data = data - self.status = status - } - public enum CodingKeys: String, CodingKey { - case data - case status - } - } - case json( - Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Body - .jsonPayload - ) + case json(Components.Schemas.ArtifactMultipartUploadURL) } /// Received HTTP response body public var body: Operations.generateCacheArtifactMultipartUploadURL.Output.Ok.Body @@ -2437,50 +2706,7 @@ public enum Operations { /// Received HTTP response headers public var headers: Operations.startCacheArtifactMultipartUpload.Output.Ok.Headers @frozen public enum Body: Sendable, Equatable, Hashable { - /// The upload has been initiated and a ID is returned to upload the various parts using multi-part uploads - /// - /// - Remark: Generated from `#/paths/api/cache/multipart/start/POST/json`. - public struct jsonPayload: Codable, Equatable, Hashable, Sendable { - /// - Remark: Generated from `#/paths/api/cache/multipart/start/POST/json/data`. - public struct dataPayload: Codable, Equatable, Hashable, Sendable { - /// The upload ID - /// - /// - Remark: Generated from `#/paths/api/cache/multipart/start/POST/json/data/upload_id`. - public var upload_id: Swift.String - /// Creates a new `dataPayload`. - /// - /// - Parameters: - /// - upload_id: The upload ID - public init(upload_id: Swift.String) { self.upload_id = upload_id } - public enum CodingKeys: String, CodingKey { case upload_id } - } - /// - Remark: Generated from `#/paths/api/cache/multipart/start/POST/json/data`. - public var data: - Operations.startCacheArtifactMultipartUpload.Output.Ok.Body.jsonPayload - .dataPayload - /// - Remark: Generated from `#/paths/api/cache/multipart/start/POST/json/status`. - public var status: Swift.String - /// Creates a new `jsonPayload`. - /// - /// - Parameters: - /// - data: - /// - status: - public init( - data: Operations.startCacheArtifactMultipartUpload.Output.Ok.Body - .jsonPayload.dataPayload, - status: Swift.String - ) { - self.data = data - self.status = status - } - public enum CodingKeys: String, CodingKey { - case data - case status - } - } - case json( - Operations.startCacheArtifactMultipartUpload.Output.Ok.Body.jsonPayload - ) + case json(Components.Schemas.ArtifactUploadID) } /// Received HTTP response body public var body: Operations.startCacheArtifactMultipartUpload.Output.Ok.Body @@ -5277,4 +5503,567 @@ public enum Operations { case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) } } + /// It completes a multi-part upload. + /// + /// Given the upload ID and all the parts with their ETags, this endpoint completes the multipart upload. + /// + /// - Remark: HTTP `POST /api/runs/{run_id}/complete`. + /// - Remark: Generated from `#/paths//api/runs/{run_id}/complete/post(completeAnalyticsArtifactMultipartUpload)`. + public enum completeAnalyticsArtifactMultipartUpload { + public static let id: String = "completeAnalyticsArtifactMultipartUpload" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var run_id: Swift.Int + /// Creates a new `Path`. + /// + /// - Parameters: + /// - run_id: + public init(run_id: Swift.Int) { self.run_id = run_id } + } + public var path: Operations.completeAnalyticsArtifactMultipartUpload.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.completeAnalyticsArtifactMultipartUpload.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.completeAnalyticsArtifactMultipartUpload.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.completeAnalyticsArtifactMultipartUpload.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Command event artifact multipart upload completion + /// + /// - Remark: Generated from `#/paths/api/runs/{run_id}/complete/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/runs/{run_id}/complete/POST/json/command_event_artifact`. + public var command_event_artifact: Components.Schemas.CommandEventArtifact + /// - Remark: Generated from `#/paths/api/runs/{run_id}/complete/POST/json/multipart_upload_parts`. + public var multipart_upload_parts: + Components.Schemas.ArtifactMultipartUploadParts + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - command_event_artifact: + /// - multipart_upload_parts: + public init( + command_event_artifact: Components.Schemas.CommandEventArtifact, + multipart_upload_parts: Components.Schemas.ArtifactMultipartUploadParts + ) { + self.command_event_artifact = command_event_artifact + self.multipart_upload_parts = multipart_upload_parts + } + public enum CodingKeys: String, CodingKey { + case command_event_artifact + case multipart_upload_parts + } + } + case json( + Operations.completeAnalyticsArtifactMultipartUpload.Input.Body.jsonPayload + ) + } + public var body: Operations.completeAnalyticsArtifactMultipartUpload.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.completeAnalyticsArtifactMultipartUpload.Input.Path, + query: Operations.completeAnalyticsArtifactMultipartUpload.Input.Query = .init(), + headers: Operations.completeAnalyticsArtifactMultipartUpload.Input.Headers = + .init(), + cookies: Operations.completeAnalyticsArtifactMultipartUpload.Input.Cookies = + .init(), + body: Operations.completeAnalyticsArtifactMultipartUpload.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct NoContent: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.completeAnalyticsArtifactMultipartUpload.Output.NoContent.Headers + @frozen public enum Body: Sendable, Equatable, Hashable {} + /// Received HTTP response body + public var body: + Operations.completeAnalyticsArtifactMultipartUpload.Output.NoContent.Body? + /// Creates a new `NoContent`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.completeAnalyticsArtifactMultipartUpload.Output.NoContent + .Headers = .init(), + body: Operations.completeAnalyticsArtifactMultipartUpload.Output.NoContent + .Body? = nil + ) { + self.headers = headers + self.body = body + } + } + /// The upload has been completed + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/complete/post(completeAnalyticsArtifactMultipartUpload)/responses/204`. + /// + /// HTTP response code: `204 noContent`. + case noContent(Operations.completeAnalyticsArtifactMultipartUpload.Output.NoContent) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.completeAnalyticsArtifactMultipartUpload.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.completeAnalyticsArtifactMultipartUpload.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.completeAnalyticsArtifactMultipartUpload.Output.Forbidden + .Headers = .init(), + body: Operations.completeAnalyticsArtifactMultipartUpload.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/complete/post(completeAnalyticsArtifactMultipartUpload)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.completeAnalyticsArtifactMultipartUpload.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.completeAnalyticsArtifactMultipartUpload.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.completeAnalyticsArtifactMultipartUpload.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.completeAnalyticsArtifactMultipartUpload.Output.NotFound + .Headers = .init(), + body: Operations.completeAnalyticsArtifactMultipartUpload.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project doesn't exist + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/complete/post(completeAnalyticsArtifactMultipartUpload)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.completeAnalyticsArtifactMultipartUpload.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// It generates a signed URL for uploading a part. + /// + /// Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. + /// + /// - Remark: HTTP `POST /api/runs/{run_id}/generate-url`. + /// - Remark: Generated from `#/paths//api/runs/{run_id}/generate-url/post(generateAnalyticsArtifactMultipartUploadURL)`. + public enum generateAnalyticsArtifactMultipartUploadURL { + public static let id: String = "generateAnalyticsArtifactMultipartUploadURL" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var run_id: Swift.Int + /// Creates a new `Path`. + /// + /// - Parameters: + /// - run_id: + public init(run_id: Swift.Int) { self.run_id = run_id } + } + public var path: Operations.generateAnalyticsArtifactMultipartUploadURL.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.generateAnalyticsArtifactMultipartUploadURL.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.generateAnalyticsArtifactMultipartUploadURL.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.generateAnalyticsArtifactMultipartUploadURL.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Artifact to generate a signed URL for + /// + /// - Remark: Generated from `#/paths/api/runs/{run_id}/generate-url/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/runs/{run_id}/generate-url/POST/json/command_event_artifact`. + public var command_event_artifact: Components.Schemas.CommandEventArtifact + /// - Remark: Generated from `#/paths/api/runs/{run_id}/generate-url/POST/json/multipart_upload_part`. + public var multipart_upload_part: Components.Schemas.ArtifactMultipartUploadPart + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - command_event_artifact: + /// - multipart_upload_part: + public init( + command_event_artifact: Components.Schemas.CommandEventArtifact, + multipart_upload_part: Components.Schemas.ArtifactMultipartUploadPart + ) { + self.command_event_artifact = command_event_artifact + self.multipart_upload_part = multipart_upload_part + } + public enum CodingKeys: String, CodingKey { + case command_event_artifact + case multipart_upload_part + } + } + case json( + Operations.generateAnalyticsArtifactMultipartUploadURL.Input.Body.jsonPayload + ) + } + public var body: Operations.generateAnalyticsArtifactMultipartUploadURL.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.generateAnalyticsArtifactMultipartUploadURL.Input.Path, + query: Operations.generateAnalyticsArtifactMultipartUploadURL.Input.Query = .init(), + headers: Operations.generateAnalyticsArtifactMultipartUploadURL.Input.Headers = + .init(), + cookies: Operations.generateAnalyticsArtifactMultipartUploadURL.Input.Cookies = + .init(), + body: Operations.generateAnalyticsArtifactMultipartUploadURL.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.ArtifactMultipartUploadURL) + } + /// Received HTTP response body + public var body: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Ok + .Headers = .init(), + body: Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The URL has been generated + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/generate-url/post(generateAnalyticsArtifactMultipartUploadURL)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Ok) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Forbidden + .Headers = .init(), + body: Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Forbidden + .Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/generate-url/post(generateAnalyticsArtifactMultipartUploadURL)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.generateAnalyticsArtifactMultipartUploadURL.Output.NotFound + .Headers = .init(), + body: Operations.generateAnalyticsArtifactMultipartUploadURL.Output.NotFound + .Body + ) { + self.headers = headers + self.body = body + } + } + /// The project doesn't exist + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/generate-url/post(generateAnalyticsArtifactMultipartUploadURL)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.generateAnalyticsArtifactMultipartUploadURL.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// It initiates a multipart upload for a command event artifact. + /// + /// The endpoint returns an upload ID that can be used to generate URLs for the individual parts and complete the upload. + /// + /// - Remark: HTTP `POST /api/runs/{run_id}/start`. + /// - Remark: Generated from `#/paths//api/runs/{run_id}/start/post(startAnalyticsArtifactMultipartUpload)`. + public enum startAnalyticsArtifactMultipartUpload { + public static let id: String = "startAnalyticsArtifactMultipartUpload" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var run_id: Swift.Int + /// Creates a new `Path`. + /// + /// - Parameters: + /// - run_id: + public init(run_id: Swift.Int) { self.run_id = run_id } + } + public var path: Operations.startAnalyticsArtifactMultipartUpload.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.startAnalyticsArtifactMultipartUpload.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.startAnalyticsArtifactMultipartUpload.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.startAnalyticsArtifactMultipartUpload.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.CommandEventArtifact) + } + public var body: Operations.startAnalyticsArtifactMultipartUpload.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.startAnalyticsArtifactMultipartUpload.Input.Path, + query: Operations.startAnalyticsArtifactMultipartUpload.Input.Query = .init(), + headers: Operations.startAnalyticsArtifactMultipartUpload.Input.Headers = .init(), + cookies: Operations.startAnalyticsArtifactMultipartUpload.Input.Cookies = .init(), + body: Operations.startAnalyticsArtifactMultipartUpload.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.startAnalyticsArtifactMultipartUpload.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.ArtifactUploadID) + } + /// Received HTTP response body + public var body: Operations.startAnalyticsArtifactMultipartUpload.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.startAnalyticsArtifactMultipartUpload.Output.Ok.Headers = + .init(), + body: Operations.startAnalyticsArtifactMultipartUpload.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The upload has been started + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/start/post(startAnalyticsArtifactMultipartUpload)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.startAnalyticsArtifactMultipartUpload.Output.Ok) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.startAnalyticsArtifactMultipartUpload.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.startAnalyticsArtifactMultipartUpload.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.startAnalyticsArtifactMultipartUpload.Output.Forbidden + .Headers = .init(), + body: Operations.startAnalyticsArtifactMultipartUpload.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/start/post(startAnalyticsArtifactMultipartUpload)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.startAnalyticsArtifactMultipartUpload.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.startAnalyticsArtifactMultipartUpload.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.startAnalyticsArtifactMultipartUpload.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.startAnalyticsArtifactMultipartUpload.Output.NotFound + .Headers = .init(), + body: Operations.startAnalyticsArtifactMultipartUpload.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The command event doesn't exist + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/start/post(startAnalyticsArtifactMultipartUpload)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.startAnalyticsArtifactMultipartUpload.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } } diff --git a/Sources/TuistServer/OpenAPI/cloud.yml b/Sources/TuistServer/OpenAPI/cloud.yml index 32aeb5ac75f..7104cb0185f 100644 --- a/Sources/TuistServer/OpenAPI/cloud.yml +++ b/Sources/TuistServer/OpenAPI/cloud.yml @@ -16,6 +16,91 @@ components: type: array title: AbsentCacheArtifact type: object + ArtifactMultipartUploadPart: + description: Represents an multipart upload's part identified by the upload id and the part number + properties: + part_number: + description: The part number of the multipart upload. + type: integer + upload_id: + description: The upload ID. + type: string + required: + - part_number + - upload_id + title: ArtifactMultipartUploadPart + x-struct: Elixir.TuistCloudWeb.API.Schemas.ArtifactMultipartUploadPart + ArtifactMultipartUploadParts: + description: It represents a part that has been uploaded using multipart uploads. The part is identified by its number and the etag + properties: + parts: + items: + properties: + etag: + description: The ETag of the part + type: string + part_number: + description: The part number + type: integer + required: + - part_number + - etag + type: object + type: array + upload_id: + description: The upload ID + type: string + required: + - upload_id + - parts + title: ArtifactMultipartUploadParts + type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.ArtifactMultipartUploadParts + ArtifactMultipartUploadURL: + description: The URL to upload a multipart part + properties: + data: + properties: + url: + description: The URL to upload the part + type: string + required: + - url + type: object + status: + default: success + enum: + - success + type: string + required: + - status + - data + title: ArtifactMultipartUploadURL + type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.ArtifactMultipartUploadUrl + ArtifactUploadID: + description: The upload has been initiated and a ID is returned to upload the various parts using multi-part uploads + properties: + data: + description: Data that contains ID that's associated with the multipart upload to use when uploading parts + properties: + upload_id: + description: The upload ID + type: string + required: + - upload_id + type: object + status: + default: success + enum: + - success + type: string + required: + - status + - data + title: ArtifactUploadID + type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.ArtifactUploadId AuthenticationToken: description: Token to authenticate the user with. properties: @@ -41,6 +126,8 @@ components: type: object status: default: success + enum: + - success type: string required: - status @@ -56,6 +143,8 @@ components: type: object status: default: success + enum: + - success type: string title: CacheArtifactExistence type: object @@ -67,47 +156,11 @@ components: type: object status: default: success + enum: + - success type: string title: CacheArtifactMultipartUploadCompletion type: object - CacheArtifactMultipartUploadURL: - description: The URL to upload a part has been generated. - properties: - data: - properties: - url: - description: The URL to upload the part - type: string - required: - - url - type: object - status: - default: success - type: string - required: - - status - - data - title: CacheArtifactMultipartUploadURL - type: object - CacheArtifactUploadID: - description: The upload has been initiated and a ID is returned to upload the various parts using multi-part uploads - properties: - data: - properties: - upload_id: - description: The upload ID - type: string - required: - - upload_id - type: object - status: - default: success - type: string - required: - - status - - data - title: CacheArtifactUploadID - type: object CacheCategory: default: builds description: The category of the cache. @@ -136,6 +189,18 @@ components: title: CommandEvent type: object x-struct: Elixir.TuistCloudWeb.API.Schemas.CommandEvent + CommandEventArtifact: + description: It represents an artifact that's associated with a command event (e.g. result bundles) + properties: + type: + description: The command event artifact type. + enum: + - result_bundle + type: string + required: + - type + title: CommandEventArtifact + x-struct: Elixir.TuistCloudWeb.API.Schemas.CommandEventArtifact Error: properties: message: @@ -548,6 +613,8 @@ paths: type: object status: default: success + enum: + - success type: string title: CacheArtifactExistence type: object @@ -651,6 +718,8 @@ paths: type: object status: default: success + enum: + - success type: string title: CacheArtifactMultipartUploadCompletion type: object @@ -722,24 +791,7 @@ paths: content: application/json: schema: - description: The URL to upload a part has been generated. - properties: - data: - properties: - url: - description: The URL to upload the part - type: string - required: - - url - type: object - status: - default: success - type: string - required: - - status - - data - title: CacheArtifactMultipartUploadURL - type: object + $ref: '#/components/schemas/ArtifactMultipartUploadURL' description: The URL has been generated 402: content: @@ -796,24 +848,7 @@ paths: content: application/json: schema: - description: The upload has been initiated and a ID is returned to upload the various parts using multi-part uploads - properties: - data: - properties: - upload_id: - description: The upload ID - type: string - required: - - upload_id - type: object - status: - default: success - type: string - required: - - status - - data - title: CacheArtifactUploadID - type: object + $ref: '#/components/schemas/ArtifactUploadID' description: The upload has been started 402: content: @@ -1433,6 +1468,138 @@ paths: description: The project was not found summary: Deletes a project with a given id. tags: [] + /api/runs/{run_id}/complete: + post: + callbacks: {} + description: Given the upload ID and all the parts with their ETags, this endpoint completes the multipart upload. + operationId: completeAnalyticsArtifactMultipartUpload + parameters: + - description: The id of the command event. + in: path + name: run_id + required: true + schema: + type: integer + requestBody: + content: + application/json: + schema: + properties: + command_event_artifact: + $ref: '#/components/schemas/CommandEventArtifact' + multipart_upload_parts: + $ref: '#/components/schemas/ArtifactMultipartUploadParts' + required: + - command_event_artifact + - multipart_upload_parts + type: object + description: Command event artifact multipart upload completion + required: false + responses: + 204: + description: The upload has been completed + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project doesn't exist + summary: It completes a multi-part upload. + tags: [] + /api/runs/{run_id}/generate-url: + post: + callbacks: {} + description: Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. + operationId: generateAnalyticsArtifactMultipartUploadURL + parameters: + - description: The id of the command event. + in: path + name: run_id + required: true + schema: + type: integer + requestBody: + content: + application/json: + schema: + properties: + command_event_artifact: + $ref: '#/components/schemas/CommandEventArtifact' + multipart_upload_part: + $ref: '#/components/schemas/ArtifactMultipartUploadPart' + required: + - command_event_artifact + - multipart_upload_part + type: object + description: Artifact to generate a signed URL for + required: false + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/ArtifactMultipartUploadURL' + description: The URL has been generated + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project doesn't exist + summary: It generates a signed URL for uploading a part. + tags: [] + /api/runs/{run_id}/start: + post: + callbacks: {} + description: The endpoint returns an upload ID that can be used to generate URLs for the individual parts and complete the upload. + operationId: startAnalyticsArtifactMultipartUpload + parameters: + - description: The id of the command event. + in: path + name: run_id + required: true + schema: + type: integer + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CommandEventArtifact' + description: Artifact to upload + required: false + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/ArtifactUploadID' + description: The upload has been started + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The command event doesn't exist + summary: It initiates a multipart upload for a command event artifact. + tags: [] security: - authorization: [] servers: diff --git a/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift b/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift new file mode 100644 index 00000000000..b54966daded --- /dev/null +++ b/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift @@ -0,0 +1,78 @@ +import Foundation +import Mockable +import TSCBasic +import TuistSupport + +@Mockable +public protocol AnalyticsArtifactUploadServicing { + func uploadAnalyticsArtifact( + artifactPath: AbsolutePath, + commandEventId: Int, + serverURL: URL + ) async throws +} + +public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServicing { + private let fileHandler: FileHandling + private let fileArchiver: FileArchivingFactorying + private let retryProvider: RetryProviding + private let multipartUploadStartAnalyticsService: MultipartUploadStartAnalyticsServicing + private let multipartUploadGenerateURLAnalyticsService: MultipartUploadGenerateURLAnalyticsServicing + private let multipartUploadArtifactService: MultipartUploadArtifactServicing + private let multipartUploadCompleteAnalyticsService: MultipartUploadCompleteAnalyticsServicing + + public init( + fileHandler: FileHandling = FileHandler.shared, + fileArchiver: FileArchivingFactorying = FileArchivingFactory(), + retryProvider: RetryProviding = RetryProvider(), + multipartUploadStartAnalyticsService: MultipartUploadStartAnalyticsServicing = MultipartUploadStartAnalyticsService(), + multipartUploadGenerateURLAnalyticsService: MultipartUploadGenerateURLAnalyticsServicing = + MultipartUploadGenerateURLAnalyticsService(), + multipartUploadArtifactService: MultipartUploadArtifactServicing = MultipartUploadArtifactService(), + multipartUploadCompleteAnalyticsService: MultipartUploadCompleteAnalyticsServicing = + MultipartUploadCompleteAnalyticsService() + ) { + self.fileHandler = fileHandler + self.fileArchiver = fileArchiver + self.retryProvider = retryProvider + self.multipartUploadStartAnalyticsService = multipartUploadStartAnalyticsService + self.multipartUploadGenerateURLAnalyticsService = multipartUploadGenerateURLAnalyticsService + self.multipartUploadArtifactService = multipartUploadArtifactService + self.multipartUploadCompleteAnalyticsService = multipartUploadCompleteAnalyticsService + } + + public func uploadAnalyticsArtifact( + artifactPath: AbsolutePath, + commandEventId: Int, + serverURL: URL + ) async throws { + let artifactArchivePath = try fileArchiver.makeFileArchiver(for: [artifactPath]) + .zip(name: artifactPath.basenameWithoutExt) + + try await retryProvider.runWithRetries { [self] in + let uploadId = try await multipartUploadStartAnalyticsService.uploadAnalyticsArtifact( + commandEventId: commandEventId, + serverURL: serverURL + ) + + let parts = try await multipartUploadArtifactService.multipartUploadArtifact( + artifactPath: artifactArchivePath, + generateUploadURL: { partNumber in + try await self.multipartUploadGenerateURLAnalyticsService.uploadAnalytics( + commandEventId: commandEventId, + partNumber: partNumber, + uploadId: uploadId, + serverURL: serverURL + ) + } + ) + + try await multipartUploadCompleteAnalyticsService.uploadAnalyticsArtifact( + commandEventId: commandEventId, + uploadId: uploadId, + parts: parts, + serverURL: serverURL + ) + } + } +} diff --git a/Sources/TuistServer/Services/MultipartUploadArtifactService.swift b/Sources/TuistServer/Services/MultipartUploadArtifactService.swift new file mode 100644 index 00000000000..889d408be2c --- /dev/null +++ b/Sources/TuistServer/Services/MultipartUploadArtifactService.swift @@ -0,0 +1,112 @@ +import Foundation +import Mockable +import TSCBasic +import TuistSupport + +enum MultipartUploadArtifactServiceError: FatalError { + case cannotCreateInputStream(AbsolutePath) + case noURLResponse(URL?) + case missingEtag(URL?) + case invalidMultipartUploadURL(String) + + var type: ErrorType { + switch self { + case .cannotCreateInputStream, .noURLResponse, .missingEtag, .invalidMultipartUploadURL: return .abort + } + } + + var description: String { + switch self { + case let .cannotCreateInputStream(path): + return "Couldn't create the file stream to multi-part upload file at path \(path.pathString)" + case let .noURLResponse(url): + if let url { + return "The response from request to URL \(url.absoluteString) doesnt' have the expected type HTTPURLResponse" + } else { + return "Received a response that doesn't have the expected type HTTPURLResponse" + } + case let .missingEtag(url): + if let url { + return "The response from request to URL \(url.absoluteString) lacks the etag HTTP header" + } else { + return "Received a response lacking the etag HTTP header" + } + case let .invalidMultipartUploadURL(url): + return "Received an invalid URL for a multi-part upload: \(url)" + } + } +} + +@Mockable +public protocol MultipartUploadArtifactServicing { + func multipartUploadArtifact( + artifactPath: AbsolutePath, + generateUploadURL: @escaping (Int) async throws -> String + ) async throws -> [(etag: String, partNumber: Int)] +} + +public final class MultipartUploadArtifactService: MultipartUploadArtifactServicing { + private let urlSession: URLSession + + public init(urlSession: URLSession = .sharedCloud) { + self.urlSession = urlSession + } + + public func multipartUploadArtifact( + artifactPath: AbsolutePath, + generateUploadURL: (Int) async throws -> String + ) async throws -> [(etag: String, partNumber: Int)] { + let partSize = 10 * 1024 * 1024 + guard let inputStream = InputStream(url: artifactPath.url) else { + throw MultipartUploadArtifactServiceError.cannotCreateInputStream(artifactPath) + } + + inputStream.open() + + var partNumber = 1 + var buffer = [UInt8](repeating: 0, count: partSize) + var parts: [(etag: String, partNumber: Int)] = [] + + while inputStream.hasBytesAvailable { + let bytesRead = inputStream.read(&buffer, maxLength: partSize) + + if bytesRead > 0 { + let partData = Data(bytes: buffer, count: bytesRead) + let uploadURLString = try await generateUploadURL(partNumber) + guard let url = URL(string: uploadURLString) else { + throw MultipartUploadArtifactServiceError.invalidMultipartUploadURL(uploadURLString) + } + let request = uploadRequest(url: url, fileSize: UInt64(bytesRead), data: partData) + let etag = try await upload(for: request) + parts.append((etag: etag, partNumber: Int(partNumber))) + + partNumber += 1 + } + } + + inputStream.close() + + return parts + } + + private func upload(for request: URLRequest) async throws -> String { + let (_, response) = try await urlSession.data(for: request) + guard let urlResponse = response as? HTTPURLResponse else { + throw MultipartUploadArtifactServiceError.noURLResponse(request.url) + } + guard let etag = urlResponse.value(forHTTPHeaderField: "Etag") else { + throw MultipartUploadArtifactServiceError.missingEtag(request.url) + } + return etag.spm_chomp() + } + + private func uploadRequest(url: URL, fileSize: UInt64, data: Data) -> URLRequest { + var request = URLRequest(url: url) + request.httpMethod = "PUT" + request.setValue("application/zip", forHTTPHeaderField: "Content-Type") + request.setValue(String(fileSize), forHTTPHeaderField: "Content-Length") + request.setValue("zip", forHTTPHeaderField: "Content-Encoding") + request.httpBody = data + return request + } +} diff --git a/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift b/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift new file mode 100644 index 00000000000..ff3df5f6faf --- /dev/null +++ b/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift @@ -0,0 +1,82 @@ +import Foundation +import Mockable +import OpenAPIRuntime +import TuistSupport + +@Mockable +public protocol MultipartUploadCompleteAnalyticsServicing { + func uploadAnalyticsArtifact( + commandEventId: Int, + uploadId: String, + parts: [(etag: String, partNumber: Int)], + serverURL: URL + ) async throws +} + +public enum MultipartUploadCompleteAnalyticsServiceError: FatalError, Equatable { + case unknownError(Int) + case notFound(String) + case forbidden(String) + + public var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .forbidden: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The multi-part upload could not get completed due to an unknown Tuist Cloud response of \(statusCode)." + case let .notFound(message), let .forbidden(message): + return message + } + } +} + +public final class MultipartUploadCompleteAnalyticsService: MultipartUploadCompleteAnalyticsServicing { + public init() {} + + public func uploadAnalyticsArtifact( + commandEventId: Int, + uploadId: String, + parts: [(etag: String, partNumber: Int)], + serverURL: URL + ) async throws { + let client = Client.cloud(serverURL: serverURL) + let response = try await client.completeAnalyticsArtifactMultipartUpload( + .init( + path: .init(run_id: commandEventId), + body: .json( + .init( + command_event_artifact: .init(_type: .result_bundle), + multipart_upload_parts: .init( + parts: parts + .map { .init(etag: $0.etag, part_number: $0.partNumber) }, + upload_id: uploadId + ) + ) + ) + ) + ) + switch response { + case .noContent: + return + case let .undocumented(statusCode: statusCode, _): + throw MultipartUploadCompleteAnalyticsServiceError.unknownError(statusCode) + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw MultipartUploadCompleteAnalyticsServiceError.forbidden(error.message) + } + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw MultipartUploadCompleteAnalyticsServiceError.notFound(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift b/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift new file mode 100644 index 00000000000..46cf05de842 --- /dev/null +++ b/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift @@ -0,0 +1,85 @@ +import Foundation +import Mockable +import TuistSupport + +@Mockable +public protocol MultipartUploadGenerateURLAnalyticsServicing { + func uploadAnalytics( + commandEventId: Int, + partNumber: Int, + uploadId: String, + serverURL: URL + ) async throws -> String +} + +public enum MultipartUploadGenerateURLAnalyticsServiceError: FatalError, Equatable { + case unknownError(Int) + case notFound(String) + case forbidden(String) + + public var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .forbidden: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The generation of a multi-part upload URL failed due to an unknown Tuist response of \(statusCode)." + case let .notFound(message), let .forbidden(message): + return message + } + } +} + +public final class MultipartUploadGenerateURLAnalyticsService: MultipartUploadGenerateURLAnalyticsServicing { + public init() {} + + public func uploadAnalytics( + commandEventId: Int, + partNumber: Int, + uploadId: String, + serverURL: URL + ) async throws -> String { + let client = Client.cloud(serverURL: serverURL) + let response = try await client.generateAnalyticsArtifactMultipartUploadURL( + .init( + path: .init(run_id: commandEventId), + body: .json( + .init( + command_event_artifact: .init( + _type: .result_bundle + ), + multipart_upload_part: .init( + part_number: partNumber, + upload_id: uploadId + ) + ) + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(cacheArtifact): + return cacheArtifact.data.url + } + case let .undocumented(statusCode: statusCode, _): + throw MultipartUploadGenerateURLAnalyticsServiceError.unknownError(statusCode) + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw MultipartUploadGenerateURLAnalyticsServiceError.forbidden(error.message) + } + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw MultipartUploadGenerateURLAnalyticsServiceError.notFound(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift b/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift new file mode 100644 index 00000000000..3445ba9d770 --- /dev/null +++ b/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift @@ -0,0 +1,72 @@ +import Foundation +import Mockable +import TuistSupport + +@Mockable +public protocol MultipartUploadStartAnalyticsServicing { + func uploadAnalyticsArtifact( + commandEventId: Int, + serverURL: URL + ) async throws -> String +} + +public enum MultipartUploadStartAnalyticsServiceError: FatalError, Equatable { + case unknownError(Int) + case notFound(String) + case paymentRequired(String) + case forbidden(String) + + public var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .paymentRequired, .forbidden: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The remote cache artifact could not be uploaded due to an unknown Tuist Cloud response of \(statusCode)." + case let .notFound(message), let .paymentRequired(message), let .forbidden(message): + return message + } + } +} + +public final class MultipartUploadStartAnalyticsService: MultipartUploadStartAnalyticsServicing { + public init() {} + + public func uploadAnalyticsArtifact( + commandEventId: Int, + serverURL: URL + ) async throws -> String { + let client = Client.cloud(serverURL: serverURL) + let response = try await client.startAnalyticsArtifactMultipartUpload( + .init( + path: .init(run_id: commandEventId), + body: .json(.init(_type: .result_bundle)) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(cacheArtifact): + return cacheArtifact.data.upload_id + } + case let .undocumented(statusCode: statusCode, _): + throw MultipartUploadStartAnalyticsServiceError.unknownError(statusCode) + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw MultipartUploadStartAnalyticsServiceError.forbidden(error.message) + } + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw MultipartUploadStartAnalyticsServiceError.notFound(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Utilities/DelayProvider.swift b/Sources/TuistServer/Utilities/DelayProvider.swift new file mode 100644 index 00000000000..2dd3bd8942d --- /dev/null +++ b/Sources/TuistServer/Utilities/DelayProvider.swift @@ -0,0 +1,18 @@ +import Foundation +import Mockable + +@Mockable +public protocol DelayProviding { + func delay(for retry: Int) -> UInt64 +} + +public struct DelayProvider: DelayProviding { + public init() {} + + public func delay(for retry: Int) -> UInt64 { + /// 0.1 seconds + let baseInterval = TimeInterval(1_000_000) + let randomInterval = Double.random(in: -1_000_000 ... 1_000_000) + return UInt64(baseInterval * pow(2, Double(retry)) + randomInterval) + } +} diff --git a/Sources/TuistServer/Utilities/RetryProvider.swift b/Sources/TuistServer/Utilities/RetryProvider.swift new file mode 100644 index 00000000000..6a88382d1bf --- /dev/null +++ b/Sources/TuistServer/Utilities/RetryProvider.swift @@ -0,0 +1,42 @@ +import Foundation + +public protocol RetryProviding { + func runWithRetries( + operation: @Sendable @escaping () async throws -> T + ) async throws -> T +} + +public struct RetryProvider: RetryProviding { + private let delayProvider: DelayProviding + + public init( + delayProvider: DelayProviding = DelayProvider() + ) { + self.delayProvider = delayProvider + } + + public func runWithRetries( + operation: @Sendable @escaping () async throws -> T + ) async throws -> T { + try await Task { + let maxRetryCount = 3 + for retry in 0 ..< maxRetryCount { + do { + return try await operation() + } catch { + logger.debug(""" + The following error happened for retry \(retry): \(error.localizedDescription). + Retrying... + """) + try await Task.sleep(nanoseconds: delayProvider.delay(for: retry)) + + continue + } + } + + try Task.checkCancellation() + return try await operation() + } + .value + } +} diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index e9c1e254388..566cdf90025 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -14,6 +14,7 @@ public enum Constants { public static let bundleName: String = "tuist.zip" public static let trueValues: [String] = ["1", "true", "TRUE", "yes", "YES"] public static let tuistDirectoryName: String = "Tuist" + public static let resultBundleName = "result-bundle" public static let helpersDirectoryName: String = "ProjectDescriptionHelpers" public static let signingDirectoryName: String = "Signing" diff --git a/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift index 5da48868739..b48331d6ca2 100644 --- a/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift @@ -15,16 +15,18 @@ import XCTest final class CloudAuthServiceTests: TuistUnitTestCase { private var cloudSessionController: MockCloudSessionControlling! - private var configLoader: MockConfigLoader! + private var configLoader: MockConfigLoading! private var cloudURL: URL! private var subject: CloudAuthService! override func setUp() { super.setUp() cloudSessionController = .init() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! - configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test(cloud: .test(url: cloudURL))) subject = CloudAuthService( cloudSessionController: cloudSessionController, diff --git a/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift index 915b6b435c5..c9523016a76 100644 --- a/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift @@ -1,7 +1,7 @@ import MockableTest import TuistGraph import TuistGraphTesting -import TuistLoaderTesting +import TuistLoader import TuistServer import TuistSupport import XCTest @@ -12,14 +12,14 @@ import XCTest final class CloudCleanServiceTests: TuistUnitTestCase { private var cloudSessionController: MockCloudSessionControlling! private var cleanCacheService: MockCleanCacheServicing! - private var configLoader: MockConfigLoader! + private var configLoader: MockConfigLoading! private var subject: CloudCleanService! override func setUp() { super.setUp() cloudSessionController = .init() cleanCacheService = .init() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() subject = CloudCleanService( cloudSessionController: cloudSessionController, cleanCacheService: cleanCacheService, @@ -39,14 +39,16 @@ final class CloudCleanServiceTests: TuistUnitTestCase { // Given let url = URL(string: "https://cloud.com")! - configLoader.loadConfigStub = { _ in - Config.test( - cloud: Cloud.test( - url: url, - projectId: "project/slug" + given(configLoader) + .loadConfig(path: .any) + .willReturn( + Config.test( + cloud: Cloud.test( + url: url, + projectId: "project/slug" + ) ) ) - } given(cleanCacheService) .cleanCache( diff --git a/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift index fea1984dec1..a9d5e455b5d 100644 --- a/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift @@ -2,7 +2,7 @@ import MockableTest import TSCBasic import TuistGraph import TuistGraphTesting -import TuistLoaderTesting +import TuistLoader import TuistServer import TuistSupport import XCTest @@ -13,7 +13,7 @@ import XCTest final class CloudInitServiceTests: TuistUnitTestCase { private var cloudSessionController: MockCloudSessionControlling! private var createProjectService: MockCreateProjectServicing! - private var configLoader: MockConfigLoader! + private var configLoader: MockConfigLoading! private var cloudURL: URL! private var subject: CloudInitService! @@ -21,7 +21,7 @@ final class CloudInitServiceTests: TuistUnitTestCase { super.setUp() cloudSessionController = MockCloudSessionControlling() createProjectService = .init() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! subject = CloudInitService( cloudSessionController: cloudSessionController, @@ -47,8 +47,12 @@ final class CloudInitServiceTests: TuistUnitTestCase { serverURL: .value(URL(string: Constants.URLs.production)!) ) .willReturn(.test(fullName: "tuist/test")) - configLoader.loadConfigStub = { _ in Config.test(cloud: nil) } - configLoader.locateConfigStub = { _ in AbsolutePath("/some-path") } + given(configLoader) + .loadConfig(path: .any) + .willReturn(Config.test(cloud: nil)) + given(configLoader) + .locateConfig(at: .any) + .willReturn(AbsolutePath("/some-path")) // When try await subject.createProject( @@ -67,7 +71,12 @@ final class CloudInitServiceTests: TuistUnitTestCase { func test_cloud_init_when_config_does_not_exist() async throws { // Given var content: String? - configLoader.locateConfigStub = { _ in nil } + given(configLoader) + .locateConfig(at: .any) + .willReturn(nil) + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) fileHandler.stubWrite = { stubContent, _, _ in content = stubContent } given(createProjectService) .createProject( @@ -98,9 +107,11 @@ final class CloudInitServiceTests: TuistUnitTestCase { func test_cloud_init_when_cloud_exists() async throws { // Given - configLoader.loadConfigStub = { _ in - Config.test(cloud: Cloud.test(url: self.cloudURL)) - } + given(configLoader) + .loadConfig(path: .any) + .willReturn( + Config.test(cloud: Cloud.test(url: cloudURL)) + ) // When / Then await XCTAssertThrowsSpecific( diff --git a/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift index 7c2e32a1661..aed3098f736 100644 --- a/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift @@ -17,15 +17,15 @@ import XCTest final class CloudLogoutServiceTests: TuistUnitTestCase { private var cloudSessionController: MockCloudSessionControlling! private var subject: CloudLogoutService! - private var configLoader: MockConfigLoader! + private var configLoader: MockConfigLoading! private var cloudURL: URL! override func setUp() { super.setUp() cloudSessionController = MockCloudSessionControlling() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! - configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) subject = CloudLogoutService( cloudSessionController: cloudSessionController, configLoader: configLoader diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift index 4cad4bad947..b549d10ccad 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift @@ -1,7 +1,7 @@ import Foundation import MockableTest import TuistGraph -import TuistLoaderTesting +import TuistLoader import TuistServer import TuistSupport import TuistSupportTesting @@ -11,16 +11,16 @@ import XCTest final class CloudOrganizationInviteServiceTests: TuistUnitTestCase { private var createOrganizationInviteService: MockCreateOrganizationInviteServicing! private var subject: CloudOrganizationInviteService! - private var configLoader: MockConfigLoader! + private var configLoader: MockConfigLoading! private var cloudURL: URL! override func setUp() { super.setUp() createOrganizationInviteService = .init() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! - configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) subject = CloudOrganizationInviteService( createOrganizationInviteService: createOrganizationInviteService, configLoader: configLoader diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift index 461b6267992..ef7de0e3bb4 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift @@ -2,7 +2,7 @@ import Foundation import Mockable import MockableTest import TuistGraph -import TuistLoaderTesting +import TuistLoader import TuistServer import TuistSupportTesting import XCTest @@ -11,16 +11,16 @@ import XCTest final class CloudOrganizationListServiceTests: TuistUnitTestCase { private var listOrganizationsService: MockListOrganizationsServicing! private var subject: CloudOrganizationListService! - private var configLoader: MockConfigLoader! + private var configLoader: MockConfigLoading! private var cloudURL: URL! override func setUp() { super.setUp() listOrganizationsService = .init() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! - configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) subject = CloudOrganizationListService( listOrganizationsService: listOrganizationsService, diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift index 66bd66a9d23..cc9efd9a28f 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift @@ -2,7 +2,7 @@ import Foundation import Mockable import MockableTest import TuistGraph -import TuistLoaderTesting +import TuistLoader import TuistServer import TuistSupportTesting import XCTest @@ -11,16 +11,16 @@ import XCTest final class CloudOrganizationRemoveSSOServiceTests: TuistUnitTestCase { private var updateOrganizationService: MockUpdateOrganizationServicing! private var subject: CloudOrganizationRemoveSSOService! - private var configLoader: MockConfigLoader! + private var configLoader: MockConfigLoading! private var cloudURL: URL! override func setUp() { super.setUp() updateOrganizationService = .init() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! - configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) subject = CloudOrganizationRemoveSSOService( updateOrganizationService: updateOrganizationService, diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift index 8d77765ab34..dba649f1114 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift @@ -1,7 +1,7 @@ import Foundation import MockableTest import TuistGraph -import TuistLoaderTesting +import TuistLoader import TuistServer import TuistSupport import TuistSupportTesting @@ -11,15 +11,15 @@ import XCTest final class CloudOrganizationShowServiceTests: TuistUnitTestCase { private var getOrganizationService: MockGetOrganizationServicing! private var subject: CloudOrganizationShowService! - private var configLoader: MockConfigLoader! + private var configLoader: MockConfigLoading! private var cloudURL: URL! override func setUp() { super.setUp() getOrganizationService = .init() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! - configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) subject = CloudOrganizationShowService( getOrganizationService: getOrganizationService, configLoader: configLoader diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift index b1603c35f21..ce95795569b 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift @@ -2,7 +2,7 @@ import Foundation import Mockable import MockableTest import TuistGraph -import TuistLoaderTesting +import TuistLoader import TuistServer import TuistSupportTesting import XCTest @@ -11,16 +11,16 @@ import XCTest final class CloudOrganizationUpdateSSOServiceTests: TuistUnitTestCase { private var updateOrganizationService: MockUpdateOrganizationServicing! private var subject: CloudOrganizationUpdateSSOService! - private var configLoader: MockConfigLoader! + private var configLoader: MockConfigLoading! private var cloudURL: URL! override func setUp() { super.setUp() updateOrganizationService = .init() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! - configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) subject = CloudOrganizationUpdateSSOService( updateOrganizationService: updateOrganizationService, diff --git a/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift index c30c348e708..7a1f52a1b06 100644 --- a/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift @@ -1,7 +1,7 @@ import Foundation import MockableTest import TuistGraph -import TuistLoaderTesting +import TuistLoader import TuistServer import TuistSupport import TuistSupportTesting @@ -13,7 +13,7 @@ final class CloudProjectDeleteServiceTests: TuistUnitTestCase { private var getProjectService: MockGetProjectServicing! private var deleteProjectService: MockDeleteProjectServicing! private var credentialsStore: MockCloudCredentialsStoring! - private var configLoader: MockConfigLoader! + private var configLoader: MockConfigLoading! private var cloudURL: URL! private var subject: CloudProjectDeleteService! @@ -23,9 +23,9 @@ final class CloudProjectDeleteServiceTests: TuistUnitTestCase { getProjectService = .init() deleteProjectService = .init() credentialsStore = .init() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! - configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) subject = CloudProjectDeleteService( deleteProjectService: deleteProjectService, getProjectService: getProjectService, diff --git a/Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift index 959ba9fd7bd..a9a08d3ba88 100644 --- a/Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift @@ -1,7 +1,7 @@ import Foundation import MockableTest import TuistGraph -import TuistLoaderTesting +import TuistLoader import TuistServer import TuistSupportTesting import XCTest @@ -10,15 +10,15 @@ import XCTest final class CloudProjectListServiceTests: TuistUnitTestCase { private var listProjectsService: MockListProjectsServicing! private var subject: CloudProjectListService! - private var configLoader: MockConfigLoader! + private var configLoader: MockConfigLoading! private var cloudURL: URL! override func setUp() { super.setUp() listProjectsService = .init() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! - configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) subject = CloudProjectListService( listProjectsService: listProjectsService, configLoader: configLoader diff --git a/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift index 8623c23e290..d3675c1ef86 100644 --- a/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift @@ -17,15 +17,15 @@ import XCTest final class CloudSessionServiceTests: TuistUnitTestCase { private var cloudSessionController: MockCloudSessionControlling! private var subject: CloudSessionService! - private var configLoader: MockConfigLoader! + private var configLoader: MockConfigLoading! private var cloudURL: URL! override func setUp() { super.setUp() cloudSessionController = MockCloudSessionControlling() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! - configLoader.loadConfigStub = { _ in Config.test(cloud: .test(url: self.cloudURL)) } + given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) subject = CloudSessionService( cloudSessionController: cloudSessionController, configLoader: configLoader diff --git a/Tests/TuistKitTests/CommandTracking/CommandEventFactoryTests.swift b/Tests/TuistKitTests/CommandTracking/CommandEventFactoryTests.swift index 3dd551d73d9..243bad066a3 100644 --- a/Tests/TuistKitTests/CommandTracking/CommandEventFactoryTests.swift +++ b/Tests/TuistKitTests/CommandTracking/CommandEventFactoryTests.swift @@ -29,6 +29,7 @@ final class CommandEventFactoryTests: TuistUnitTestCase { func test_tagCommand_tagsExpectedCommand() throws { // Given let info = TrackableCommandInfo( + runId: "run-id", name: "cache", subcommand: "warm", parameters: ["foo": "bar"], @@ -37,6 +38,7 @@ final class CommandEventFactoryTests: TuistUnitTestCase { status: .failure("Failed!") ) let expectedEvent = CommandEvent( + runId: "run-id", name: "cache", subcommand: "warm", params: ["foo": "bar"], diff --git a/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift b/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift index be16cc2d538..4505c8db95b 100644 --- a/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift +++ b/Tests/TuistKitTests/CommandTracking/TrackableCommandTests.swift @@ -106,6 +106,7 @@ private struct TestCommand: ParsableCommand, HasTrackableParameters { var shouldFail: Bool = false static var analyticsDelegate: TrackableParametersDelegate? + var runId = "" func run() throws { if shouldFail { diff --git a/Tests/TuistKitTests/Services/EditServiceTests.swift b/Tests/TuistKitTests/Services/EditServiceTests.swift index a7156b9059a..3e797851a9c 100644 --- a/Tests/TuistKitTests/Services/EditServiceTests.swift +++ b/Tests/TuistKitTests/Services/EditServiceTests.swift @@ -14,7 +14,7 @@ import XCTest final class EditServiceTests: XCTestCase { var subject: EditService! var opener: MockOpener! - var configLoader: MockConfigLoader! + var configLoader: MockConfigLoading! var pluginService: MockPluginService! var cacheDirectoriesProvider: MockCacheDirectoriesProviding! var cacheDirectoriesProviderFactory: MockCacheDirectoriesProviderFactoring! @@ -23,9 +23,13 @@ final class EditServiceTests: XCTestCase { override func setUpWithError() throws { super.setUp() opener = MockOpener() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() pluginService = MockPluginService() + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) + let mockCacheDirectoriesProvider = MockCacheDirectoriesProviding() cacheDirectoriesProvider = mockCacheDirectoriesProvider diff --git a/Tests/TuistKitTests/Services/InstallServiceTests.swift b/Tests/TuistKitTests/Services/InstallServiceTests.swift index f1ad9474ea9..b248b7e0137 100644 --- a/Tests/TuistKitTests/Services/InstallServiceTests.swift +++ b/Tests/TuistKitTests/Services/InstallServiceTests.swift @@ -7,7 +7,6 @@ import TuistCoreTesting import TuistGraph import TuistGraphTesting import TuistLoader -import TuistLoaderTesting import TuistPluginTesting import TuistSupport import TuistSupportTesting @@ -17,7 +16,7 @@ import XCTest final class InstallServiceTests: TuistUnitTestCase { private var pluginService: MockPluginService! - private var configLoader: MockConfigLoader! + private var configLoader: MockConfigLoading! private var swiftPackageManagerController: MockSwiftPackageManagerController! private var manifestFilesLocator: MockManifestFilesLocating! @@ -27,7 +26,7 @@ final class InstallServiceTests: TuistUnitTestCase { super.setUp() pluginService = MockPluginService() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() swiftPackageManagerController = MockSwiftPackageManagerController() manifestFilesLocator = MockManifestFilesLocating() @@ -59,7 +58,11 @@ final class InstallServiceTests: TuistUnitTestCase { .willReturn(stubbedPath.appending(components: "Tuist", "Package.swift")) let stubbedSwiftVersion = TSCUtility.Version(5, 3, 0) - configLoader.loadConfigStub = { _ in Config.test(swiftVersion: stubbedSwiftVersion) } + given(configLoader) + .loadConfig(path: .any) + .willReturn( + Config.test(swiftVersion: stubbedSwiftVersion) + ) pluginService.fetchRemotePluginsStub = { _ in _ = Plugins.test() @@ -89,9 +92,9 @@ final class InstallServiceTests: TuistUnitTestCase { .git(url: "url", gitReference: .tag("tag"), directory: nil, releaseUrl: nil), ] ) - configLoader.loadConfigStub = { _ in - config - } + given(configLoader) + .loadConfig(path: .any) + .willReturn(config) var invokedConfig: Config? pluginService.loadPluginsStub = { config in invokedConfig = config @@ -120,7 +123,11 @@ final class InstallServiceTests: TuistUnitTestCase { .willReturn(stubbedPath.appending(components: "Tuist", "Package.swift")) let stubbedSwiftVersion = TSCUtility.Version(5, 3, 0) - configLoader.loadConfigStub = { _ in Config.test(swiftVersion: stubbedSwiftVersion) } + given(configLoader) + .loadConfig(path: .any) + .willReturn( + Config.test(swiftVersion: stubbedSwiftVersion) + ) pluginService.fetchRemotePluginsStub = { _ in } @@ -147,6 +154,9 @@ final class InstallServiceTests: TuistUnitTestCase { let expectedFoundPackageLocation = temporaryDirectory.appending( components: Constants.tuistDirectoryName, Manifest.package.fileName(temporaryDirectory) ) + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) given(manifestFilesLocator) .locatePackageManifest(at: .any) .willReturn(expectedFoundPackageLocation) diff --git a/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift b/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift index af92e04812c..19c99ae4cc5 100644 --- a/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift +++ b/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift @@ -1,8 +1,10 @@ import Foundation +import MockableTest import TSCBasic import TuistCore import TuistGraph import TuistGraphTesting +import TuistLoader import TuistScaffold import TuistSupport import XCTest @@ -19,7 +21,7 @@ final class ScaffoldServiceTests: TuistUnitTestCase { var templateLoader: MockTemplateLoader! var templatesDirectoryLocator: MockTemplatesDirectoryLocator! var templateGenerator: MockTemplateGenerator! - var configLoader: MockConfigLoader! + var configLoader: MockConfigLoading! var pluginService: MockPluginService! override func setUp() { @@ -27,8 +29,11 @@ final class ScaffoldServiceTests: TuistUnitTestCase { templateLoader = MockTemplateLoader() templatesDirectoryLocator = MockTemplatesDirectoryLocator() templateGenerator = MockTemplateGenerator() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() pluginService = MockPluginService() + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) subject = ScaffoldService( templateLoader: templateLoader, templatesDirectoryLocator: templatesDirectoryLocator, @@ -220,6 +225,9 @@ final class ScaffoldServiceTests: TuistUnitTestCase { func test_attributes_are_passed_to_generator() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) templateLoader.loadTemplateStub = { _ in Template.test(attributes: [ .optional("optional", default: .string("")), diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index d637cd60133..130d2559581 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -5,6 +5,7 @@ import TuistAutomation import TuistCore import TuistGraph import TuistGraphTesting +import TuistLoader import TuistSupport import XCTest @@ -23,6 +24,7 @@ final class TestServiceTests: TuistUnitTestCase { private var contentHasher: MockContentHasher! private var testsCacheTemporaryDirectory: TemporaryDirectory! private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! + private var configLoader: MockConfigLoading! override func setUpWithError() throws { try super.setUpWithError() @@ -41,6 +43,13 @@ final class TestServiceTests: TuistUnitTestCase { .cacheDirectories() .willReturn(mockCacheDirectoriesProvider) + let runsCacheDirectory = try temporaryPath() + given(mockCacheDirectoriesProvider) + .tuistCacheDirectory(for: .value(.runs)) + .willReturn(runsCacheDirectory) + + configLoader = .init() + contentHasher.hashStub = { _ in "hash" } @@ -52,7 +61,8 @@ final class TestServiceTests: TuistUnitTestCase { buildGraphInspector: buildGraphInspector, simulatorController: simulatorController, contentHasher: contentHasher, - cacheDirectoryProviderFactory: cacheDirectoryProviderFactory + cacheDirectoryProviderFactory: cacheDirectoryProviderFactory, + configLoader: configLoader ) } @@ -179,6 +189,9 @@ final class TestServiceTests: TuistUnitTestCase { generatedPath = $0 return ($0, Graph.test()) } + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) // When try? await subject.testRun( @@ -191,6 +204,9 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_tests_wtih_specified_arch() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) buildGraphInspector.testableSchemesStub = { _ in [ Scheme.test(name: "App-Workspace"), @@ -225,6 +241,9 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_tests_for_only_specified_scheme() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) buildGraphInspector.testableSchemesStub = { _ in [ Scheme.test(name: "App-Workspace"), @@ -258,6 +277,9 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_tests_all_project_schemes() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) buildGraphInspector.testableSchemesStub = { _ in [ Scheme.test(name: "TestScheme"), @@ -300,6 +322,9 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_tests_individual_scheme() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) buildGraphInspector.testableSchemesStub = { _ in [ Scheme.test(name: "TestScheme"), @@ -337,6 +362,9 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_tests_with_skipped_targets() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) buildGraphInspector.testableSchemesStub = { _ in [ Scheme.test(name: "ProjectSchemeOneTests"), @@ -364,6 +392,9 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_tests_all_project_schemes_when_fails() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) buildGraphInspector.workspaceSchemesStub = { _ in [ Scheme.test(name: "ProjectScheme"), @@ -401,6 +432,9 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_tests_when_no_project_schemes_present() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) buildGraphInspector.workspaceSchemesStub = { _ in [] } @@ -424,6 +458,9 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_uses_resource_bundle_path() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) let expectedResourceBundlePath = try AbsolutePath(validating: "/test") var resourceBundlePath: AbsolutePath? @@ -452,8 +489,55 @@ final class TestServiceTests: TuistUnitTestCase { ) } + func test_run_saves_resource_bundle_when_cloud_is_configured() async throws { + // Given + var resultBundlePath: AbsolutePath? + let expectedResultBundlePath = try cacheDirectoriesProvider + .tuistCacheDirectory(for: .runs) + .appending(components: "run-id", Constants.resultBundleName) + + xcodebuildController.testStub = { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in + resultBundlePath = gotResourceBundlePath + return [] + } + generator.generateWithGraphStub = { path in + (path, Graph.test()) + } + buildGraphInspector.workspaceSchemesStub = { _ in + [ + Scheme.test(name: "ProjectScheme"), + ] + } + given(configLoader) + .loadConfig(path: .any) + .willReturn( + .test( + cloud: .test() + ) + ) + + let runsCacheDirectory = try temporaryPath() + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .value(.runs)) + .willReturn(runsCacheDirectory) + + try fileHandler.createFolder(runsCacheDirectory) + + // When + try await subject.testRun( + runId: "run-id", + path: try temporaryPath() + ) + + // Then + XCTAssertEqual(resultBundlePath, expectedResultBundlePath) + } + func test_run_uses_resource_bundle_path_with_given_scheme() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) let expectedResourceBundlePath = try AbsolutePath(validating: "/test") var resourceBundlePath: AbsolutePath? @@ -486,6 +570,9 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_passes_retry_count_as_argument() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) buildGraphInspector.testableSchemesStub = { _ in [ Scheme.test(name: "TestScheme"), @@ -518,6 +605,9 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_defaults_retry_count_to_zero() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) buildGraphInspector.testableSchemesStub = { _ in [ Scheme.test(name: "TestScheme"), @@ -549,6 +639,9 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_test_plan_success() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) let testPlan = "TestPlan" let testPlanPath = try AbsolutePath(validating: "/testPlan/\(testPlan)") buildGraphInspector.testableSchemesStub = { _ in @@ -593,6 +686,9 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_test_plan_failure() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) let testPlan = "TestPlan" let testPlanPath = try AbsolutePath(validating: "/testPlan/\(testPlan)") buildGraphInspector.testableSchemesStub = { _ in @@ -638,6 +734,7 @@ final class TestServiceTests: TuistUnitTestCase { extension TestService { fileprivate func testRun( + runId: String = "run-id", schemeName: String? = nil, clean: Bool = false, configuration: String? = nil, @@ -657,6 +754,7 @@ extension TestService { passthroughXcodeBuildArguments: [String] = [] ) async throws { try await run( + runId: runId, schemeName: schemeName, clean: clean, configuration: configuration, diff --git a/Tests/TuistKitTests/Services/TuistServiceTests.swift b/Tests/TuistKitTests/Services/TuistServiceTests.swift index 481e6fc12e3..42a857c0950 100644 --- a/Tests/TuistKitTests/Services/TuistServiceTests.swift +++ b/Tests/TuistKitTests/Services/TuistServiceTests.swift @@ -1,5 +1,6 @@ +import MockableTest import TSCBasic -import TuistLoaderTesting +import TuistLoader import TuistPlugin import TuistPluginTesting import TuistSupport @@ -11,12 +12,12 @@ import XCTest final class TuistServiceTests: TuistUnitTestCase { private var subject: TuistService! private var pluginService: MockPluginService! - private var configLoader: MockConfigLoader! + private var configLoader: MockConfigLoading! override func setUp() { super.setUp() pluginService = MockPluginService() - configLoader = MockConfigLoader() + configLoader = MockConfigLoading() subject = TuistService( pluginService: pluginService, configLoader: configLoader @@ -31,6 +32,12 @@ final class TuistServiceTests: TuistUnitTestCase { } func test_run_when_command_not_found() throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) + + // When / Then XCTAssertThrowsSpecific( try subject.run(arguments: ["my-command"], tuistBinaryPath: ""), TuistServiceError.taskUnavailable @@ -49,11 +56,9 @@ final class TuistServiceTests: TuistUnitTestCase { "--path", projectPath.pathString, ]) - var loadConfigPath: AbsolutePath? - configLoader.loadConfigStub = { configPath in - loadConfigPath = configPath - return .default - } + given(configLoader) + .loadConfig(path: .value(projectPath)) + .willReturn(.default) pluginService.remotePluginPathsStub = { _ in [ RemotePluginPaths( @@ -68,7 +73,6 @@ final class TuistServiceTests: TuistUnitTestCase { XCTAssertNoThrow( try subject.run(arguments: ["command-b", "--path", projectPath.pathString], tuistBinaryPath: "") ) - XCTAssertEqual(loadConfigPath, projectPath) } func test_run_when_command_is_global() throws { @@ -79,6 +83,9 @@ final class TuistServiceTests: TuistUnitTestCase { return "" } system.succeedCommand(["tuist-my-command", "argument-one"]) + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) // When/Then XCTAssertNoThrow( diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift index 6bd246f3a78..a292f1560ec 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift @@ -13,9 +13,12 @@ final class TuistAnalyticsCloudBackendTests: TuistUnitTestCase { private var config: Cloud! private var createCommandEventService: MockCreateCommandEventServicing! private var ciChecker: MockCIChecker! + private var cacheDirectoriesProviderFactory: MockCacheDirectoriesProviderFactoring! + private var analyticsArtifactUploadService: MockAnalyticsArtifactUploadServicing! + private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! private var subject: TuistAnalyticsCloudBackend! - override func setUp() { + override func setUpWithError() throws { super.setUp() config = Cloud.test( url: URL(string: "https://cloud.tuist.io")!, @@ -23,10 +26,19 @@ final class TuistAnalyticsCloudBackendTests: TuistUnitTestCase { ) createCommandEventService = .init() ciChecker = .init() + cacheDirectoriesProviderFactory = .init() + analyticsArtifactUploadService = .init() + cacheDirectoriesProvider = .init() + given(cacheDirectoriesProviderFactory) + .cacheDirectories() + .willReturn(cacheDirectoriesProvider) subject = TuistAnalyticsCloudBackend( config: config, createCommandEventService: createCommandEventService, - ciChecker: ciChecker + fileHandler: fileHandler, + ciChecker: ciChecker, + cacheDirectoriesProviderFactory: cacheDirectoriesProviderFactory, + analyticsArtifactUploadService: analyticsArtifactUploadService ) } @@ -34,12 +46,17 @@ final class TuistAnalyticsCloudBackendTests: TuistUnitTestCase { config = nil createCommandEventService = nil ciChecker = nil + cacheDirectoriesProviderFactory = nil + analyticsArtifactUploadService = nil subject = nil super.tearDown() } func test_send_when_is_not_ci() async throws { // Given + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .value(.runs)) + .willReturn(try temporaryPath()) ciChecker.isCIStub = false let event = CommandEvent.test() given(createCommandEventService) @@ -64,6 +81,9 @@ final class TuistAnalyticsCloudBackendTests: TuistUnitTestCase { func test_send_when_is_ci() async throws { // Given + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .value(.runs)) + .willReturn(try temporaryPath()) ciChecker.isCIStub = true let event = CommandEvent.test() given(createCommandEventService) @@ -85,4 +105,46 @@ final class TuistAnalyticsCloudBackendTests: TuistUnitTestCase { // Then XCTAssertStandardOutput(pattern: "You can view a detailed report at: https://cloud.tuist.io/tuist-org/tuist/runs/10") } + + func test_send_when_is_ci_and_result_bundle_exists() async throws { + // Given + ciChecker.isCIStub = true + let event = CommandEvent.test() + given(createCommandEventService) + .createCommandEvent( + commandEvent: .value(event), + projectId: .value(config.projectId), + serverURL: .value(config.url) + ) + .willReturn( + .test( + id: 10, + url: URL(string: "https://cloud.tuist.io/tuist-org/tuist/runs/10")! + ) + ) + + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .value(.runs)) + .willReturn(try temporaryPath()) + + let resultBundle = try cacheDirectoriesProvider + .tuistCacheDirectory(for: .runs) + .appending(components: event.runId, "\(Constants.resultBundleName).xcresult") + try fileHandler.createFolder(resultBundle) + + given(analyticsArtifactUploadService) + .uploadAnalyticsArtifact( + artifactPath: .value(resultBundle), + commandEventId: .value(10), + serverURL: .value(config.url) + ) + .willReturn(()) + + // When + try await subject.send(commandEvent: event) + + // Then + XCTAssertStandardOutput(pattern: "You can view a detailed report at: https://cloud.tuist.io/tuist-org/tuist/runs/10") + XCTAssertFalse(fileHandler.exists(resultBundle)) + } } diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift index 6d7bf5c96bf..fffa1cf63a6 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift @@ -14,15 +14,24 @@ import XCTest final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { private var subject: TuistAnalyticsDispatcher! private var createCommandEventService: MockCreateCommandEventServicing! + private var ciChecker: MockCIChecker! + private var cacheDirectoriesProviderFactory: MockCacheDirectoriesProviderFactoring! + private var analyticsArtifactUploadService: MockAnalyticsArtifactUploadServicing! override func setUp() { super.setUp() createCommandEventService = .init() + ciChecker = .init() + cacheDirectoriesProviderFactory = .init() + analyticsArtifactUploadService = .init() } override func tearDown() { subject = nil createCommandEventService = nil + ciChecker = nil + cacheDirectoriesProviderFactory = nil + analyticsArtifactUploadService = nil super.tearDown() } @@ -33,7 +42,11 @@ final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { let cloud = Cloud(url: cloudURL, projectId: projectID, options: []) let backend = TuistAnalyticsCloudBackend( config: cloud, - createCommandEventService: createCommandEventService + createCommandEventService: createCommandEventService, + fileHandler: fileHandler, + ciChecker: ciChecker, + cacheDirectoriesProviderFactory: cacheDirectoriesProviderFactory, + analyticsArtifactUploadService: analyticsArtifactUploadService ) subject = TuistAnalyticsDispatcher( backend: backend @@ -47,7 +60,25 @@ final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { projectId: .value(projectID), serverURL: .value(cloudURL) ) - .willReturn(.test()) + .willReturn(.test(id: 10)) + + given(analyticsArtifactUploadService) + .uploadAnalyticsArtifact( + artifactPath: .any, + commandEventId: .value(10), + serverURL: .value(cloudURL) + ) + .willReturn(()) + + let cacheDirectoriesProvider = MockCacheDirectoriesProviding() + + given(cacheDirectoriesProviderFactory) + .cacheDirectories() + .willReturn(cacheDirectoriesProvider) + + given(cacheDirectoriesProvider) + .tuistCacheDirectory(for: .value(.runs)) + .willReturn(try temporaryPath()) // When let expectation = XCTestExpectation(description: "completion is called") @@ -59,6 +90,7 @@ final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { static var commandEvent: CommandEvent { CommandEvent( + runId: "run-id", name: "event", subcommand: nil, params: [:], diff --git a/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift b/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift new file mode 100644 index 00000000000..bce9cb12145 --- /dev/null +++ b/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift @@ -0,0 +1,97 @@ +import Foundation +import MockableTest +import TuistSupport +import TuistSupportTesting +import XCTest + +@testable import TuistServer + +final class AnalyticsArtifactUploadServiceTests: TuistTestCase { + private var subject: AnalyticsArtifactUploadService! + private var fileArchiverFactory: MockFileArchivingFactorying! + private var multipartUploadStartAnalyticsService: MockMultipartUploadStartAnalyticsServicing! + private var multipartUploadGenerateURLAnalyticsService: MockMultipartUploadGenerateURLAnalyticsServicing! + private var multipartUploadArtifactService: MockMultipartUploadArtifactServicing! + private var multipartUploadCompleteAnalyticsService: MockMultipartUploadCompleteAnalyticsServicing! + + override func setUp() { + super.setUp() + + fileArchiverFactory = .init() + multipartUploadStartAnalyticsService = .init() + multipartUploadGenerateURLAnalyticsService = .init() + multipartUploadArtifactService = .init() + multipartUploadCompleteAnalyticsService = .init() + + subject = AnalyticsArtifactUploadService( + fileHandler: fileHandler, + fileArchiver: fileArchiverFactory, + multipartUploadStartAnalyticsService: multipartUploadStartAnalyticsService, + multipartUploadGenerateURLAnalyticsService: multipartUploadGenerateURLAnalyticsService, + multipartUploadArtifactService: multipartUploadArtifactService, + multipartUploadCompleteAnalyticsService: multipartUploadCompleteAnalyticsService + ) + } + + override func tearDown() { + fileArchiverFactory = nil + multipartUploadStartAnalyticsService = nil + multipartUploadGenerateURLAnalyticsService = nil + multipartUploadArtifactService = nil + multipartUploadCompleteAnalyticsService = nil + + super.tearDown() + } + + func test_upload_analytics_artifact() async throws { + // Given + let temporaryDirectory = try temporaryPath() + let artifactPath = temporaryDirectory.appending(component: "artifact.bundle") + try FileHandler.shared.touch(artifactPath) + + let serverURL: URL = .test() + + let fileArchiver = MockFileArchiving() + given(fileArchiverFactory) + .makeFileArchiver(for: .value([artifactPath])) + .willReturn(fileArchiver) + + let artifactArchivePath = temporaryDirectory.appending(component: "artifact.zip") + + given(fileArchiver) + .zip(name: .value("artifact")) + .willReturn(artifactArchivePath) + + given(multipartUploadStartAnalyticsService) + .uploadAnalyticsArtifact( + commandEventId: .value(1), + serverURL: .value(serverURL) + ) + .willReturn("upload-id") + + given(multipartUploadArtifactService) + .multipartUploadArtifact( + artifactPath: .value(artifactArchivePath), + generateUploadURL: .any + ) + .willReturn([(etag: "etag", partNumber: 1)]) + + given(multipartUploadCompleteAnalyticsService) + .uploadAnalyticsArtifact( + commandEventId: .value(1), + uploadId: .value("upload-id"), + parts: .matching { parts in + parts.map(\.etag) == ["etag"] && parts.map(\.partNumber) == [1] + }, + serverURL: .value(serverURL) + ) + .willReturn(()) + + // When / Then + try await subject.uploadAnalyticsArtifact( + artifactPath: artifactPath, + commandEventId: 1, + serverURL: serverURL + ) + } +} diff --git a/Tests/TuistServerTests/Utilities/DelayProviderTests.swift b/Tests/TuistServerTests/Utilities/DelayProviderTests.swift new file mode 100644 index 00000000000..289cd76cdbd --- /dev/null +++ b/Tests/TuistServerTests/Utilities/DelayProviderTests.swift @@ -0,0 +1,44 @@ +import Foundation +import TuistSupportTesting +import XCTest + +@testable import TuistServer + +final class DelayProviderTests: TuistUnitTestCase { + private var subject: DelayProviding! + + override func setUp() { + super.setUp() + + subject = DelayProvider() + } + + override func tearDown() { + subject = nil + super.tearDown() + } + + func test_delay_for_first_retry() { + for _ in 0 ... 20 { + XCTAssertTrue( + (UInt64(0) ... UInt64(2_000_000)).contains(subject.delay(for: 0)) + ) + } + } + + func test_delay_for_second_retry() { + for _ in 0 ... 20 { + XCTAssertTrue( + (UInt64(1_000_000) ... UInt64(3_000_000)).contains(subject.delay(for: 1)) + ) + } + } + + func test_delay_for_third_retry() { + for _ in 0 ... 20 { + XCTAssertTrue( + (UInt64(3_000_000) ... UInt64(5_000_000)).contains(subject.delay(for: 2)) + ) + } + } +} diff --git a/Tests/TuistServerTests/Utilities/RetryProviderTests.swift b/Tests/TuistServerTests/Utilities/RetryProviderTests.swift new file mode 100644 index 00000000000..3b0ee2689a1 --- /dev/null +++ b/Tests/TuistServerTests/Utilities/RetryProviderTests.swift @@ -0,0 +1,70 @@ +import Foundation +import MockableTest +import TuistSupportTesting +import XCTest + +@testable import TuistServer + +final class RetryProviderTests: TuistUnitTestCase { + private var operationCalls = 0 + private var subject: RetryProviding! + + override func setUp() { + super.setUp() + + let delayProvider = MockDelayProviding() + given(delayProvider) + .delay(for: .any) + .willReturn(1) + + subject = RetryProvider( + delayProvider: delayProvider + ) + } + + override func tearDown() { + subject = nil + operationCalls = 0 + super.tearDown() + } + + func test_exists_whenSucceeds_doesNotRetry() async throws { + // Given / When + try await subject.runWithRetries { [self] in + operationCalls += 1 + } + + // Then + XCTAssertEqual(operationCalls, 1) + } + + func test_exists_whenFails_retries() async throws { + // Given / When + try await subject.runWithRetries { [self] in + operationCalls += 1 + if operationCalls < 3 { + throw TestError("exists failed") + } + } + + // Then + XCTAssertEqual(operationCalls, 3) + } + + func test_exists_whenFailsFourTimes_throws() async throws { + // Given + let error = TestError("exists failed") + + // When + await XCTAssertThrowsSpecific( + try await subject.runWithRetries { [self] in + operationCalls += 1 + throw error + }, + error + ) + + // Then + XCTAssertEqual(operationCalls, 4) + } +} diff --git a/fixtures/ios_app_with_frameworks/Tuist/Config.swift b/fixtures/ios_app_with_frameworks/Tuist/Config.swift index ff8e64fa9ee..baac59c1e69 100644 --- a/fixtures/ios_app_with_frameworks/Tuist/Config.swift +++ b/fixtures/ios_app_with_frameworks/Tuist/Config.swift @@ -1,3 +1,9 @@ import ProjectDescription -let config = Config() +let config = Config( + cloud: .cloud( + projectId: "tuist/tuist-cloud-acceptance-tests", + url: "https://cloud-canary.tuist.io", + options: [.optional] + ) +) From 44030505a2423ac51b269e8238119679acb03aff Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Wed, 29 May 2024 17:19:30 -0400 Subject: [PATCH 322/509] Fix Tests (#6353) --- Tests/TuistKitTests/Services/TestServiceTests.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index 130d2559581..4e661a098c3 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -498,7 +498,6 @@ final class TestServiceTests: TuistUnitTestCase { xcodebuildController.testStub = { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in resultBundlePath = gotResourceBundlePath - return [] } generator.generateWithGraphStub = { path in (path, Graph.test()) From 100b6b5b3692b1b57063e234c5eff22b9ad5b862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Thu, 30 May 2024 18:09:27 +0200 Subject: [PATCH 323/509] Add documentation about static and dynamic linking (#6351) * Add documentation about static and dynamic linking * Iterate on the documentation * Fix link * Force run * Force run * Fix link --- docs/docs/guide/project/dependencies.md | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/docs/docs/guide/project/dependencies.md b/docs/docs/guide/project/dependencies.md index 76071c6322d..4bf70e9d480 100644 --- a/docs/docs/guide/project/dependencies.md +++ b/docs/docs/guide/project/dependencies.md @@ -244,6 +244,41 @@ pod install > [!WARNING] > CocoaPods dependencies are not compatible with workflows like `build` or `test` that run `xcodebuild` right after generating the project. They are also incompatible with binary caching and selective testing since the fingerprinting logic doesn't account for the Pods dependencies. +## Static or dynamic + +Frameworks and libraries can be linked either statically or dynamically, **a choice that has significant implications for aspects like app size and boot time**. Despite its importance, this decision is often made without much consideration. + +The **general rule of thumb** is that you want as many things as possible to be statically linked in release builds to achieve fast boot times, and as many things as possible to be dynamically linked in debug builds to achieve fast iteration times. + +The challenge with changing between static and dynamic linking in a project graph is that is not trivial in Xcode because a change has cascading effect on the entire graph (e.g. libraries can't contain resources, static frameworks don't need to be embedded). Apple tried to solve the problem with compile time solutions like Swift Package Manager's automatic decision between static and dynamic linking, or [Mergeable Libraries](https://developer.apple.com/documentation/xcode/configuring-your-project-to-use-mergeable-libraries). However, this adds new dynamic variables to the compilation graph, adding new sources of non-determinism, and potentially causing some features like Swift Previews that rely on the compilation graph to become unreliable. + +Luckily, Tuist conceptually compresses the complexity associated with changing between static and dynamic and synthesizes [bundle accessors](/guide/project/synthesized-files#bundle-accessors) that are standard across linking types. In combination with [dynamic configurations via environment variables](/guide/project/dynamic-configuration), you can pass the linking type at invocation time, and use the value in your manifests to set the product type of your targets. + +```swift +// Use the value returned by this function to set the product type of your targets. +func productType() -> Product { + if case let .string(linking) = Environment.linking { + return linking == "static" ? .staticFramework : .framework + } else { + return .framework + } +} +``` + +Note that Tuist [does not default to convenience through implicit configuration due to its costs](/guide/introduction/cost-of-convenience). What this means is that we rely on you setting the linking type and any additional build settings that are sometimes required, like the [`-ObjC` linker flag](https://github.com/pointfreeco/swift-composable-architecture/discussions/1657#discussioncomment-4119184), to ensure the resulting binaries are correct. Therefore, the stance that we take is providing you with the resources, usually in the shape of documentation, to make the right decisions. + +> [!TIP] EXAMPLE: COMPOSABLE ARCHITECTURE +> A Swift Package that many projects integrate is [Composable Architecture](https://github.com/pointfreeco/swift-composable-architecture). As described [here](https://github.com/pointfreeco/swift-composable-architecture/discussions/1657#discussioncomment-4119184) and the [troubleshooting section](#troubleshooting), you'll need to set the `OTHER_LDFLAGS` build setting to `$(inherited) -ObjC` when linking the packages statically, which is Tuist's default linking type. Alternatively, you can override the product type for the package to be dynamic. + +### Scenarios + +There are some scenarios where setting the linking entirely to static or dynamic is not feasible or a good idea. The following is a non-exhaustive list of scenarios where you might need to mix static and dynamic linking: + +- **Apps with extensions:** Since apps and their extensions need to share code, you might need to make those targets dynamic. Otherwise, you'll end up with the same code duplicated in both the app and the extension, causing the binary size to increase. +- **Pre-compiled external dependencies:** Sometimes you are provided with pre-compiled binaries that are either static or dynamic. Static can binaries can be wrapped in dynamic frameworks or libraries to be linked dynamically. + +When making changes to the graph, Tuist will analyze it and display a warning if it detects a "static side effect". This warning is meant to help you identify issues that might arise from linking a target statically that depends transitively on a static target through dynamic targets. These side effects often manifest as increased binary size or, in the worst cases, runtime crashes. + ## Troubleshooting ### Objective-C Dependencies From 80507f82ad94290e944846bd39ca00a17ea01cf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 31 May 2024 10:40:49 +0200 Subject: [PATCH 324/509] Unify commands into tuist/tuist (#6355) --- .../TuistAcceptanceTestCase.swift | 4 + Sources/TuistKit/Commands/BuildCommand.swift | 17 ++++- Sources/TuistKit/Commands/CleanCommand.swift | 4 +- .../TuistKit/Commands/GenerateCommand.swift | 48 +++++++++++- Sources/TuistKit/Commands/TestCommand.swift | 42 +++++++++- Sources/TuistKit/Commands/TuistCommand.swift | 2 +- .../TuistKit/Generator/GeneratorFactory.swift | 71 +++++++++++++++-- Sources/TuistKit/Services/BuildService.swift | 17 ++++- Sources/TuistKit/Services/CleanService.swift | 33 +++++--- .../TuistKit/Services/GenerateService.swift | 23 ++++-- Sources/TuistKit/Services/RunService.swift | 2 +- Sources/TuistKit/Services/TestService.swift | 70 +++++++++-------- .../TuistServer/Cache/CacheAnalytics.swift | 24 ++++++ .../Cache/CacheStorageFactorying.swift | 10 +++ Sources/TuistServer/Cache/CacheStoring.swift | 76 +++++++++++++++++++ .../TuistServer/Cache/EmptyCacheStorage.swift | 17 +++++ .../Cache/EmptyCacheStorageFactory.swift | 10 +++ .../Mocks/MockGeneratorFactory.swift | 68 ----------------- .../Services/BuildServiceTests.swift | 32 ++++++-- .../Services/GenerateServiceTests.swift | 52 ++++++++++--- .../Services/RunServiceTests.swift | 19 +++-- .../Services/TestServiceTests.swift | 74 ++++++++++++++---- 22 files changed, 541 insertions(+), 174 deletions(-) create mode 100644 Sources/TuistServer/Cache/CacheAnalytics.swift create mode 100644 Sources/TuistServer/Cache/CacheStorageFactorying.swift create mode 100644 Sources/TuistServer/Cache/CacheStoring.swift create mode 100644 Sources/TuistServer/Cache/EmptyCacheStorage.swift create mode 100644 Sources/TuistServer/Cache/EmptyCacheStorageFactory.swift delete mode 100644 Tests/TuistKitTests/Generator/Mocks/MockGeneratorFactory.swift diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift index 77a6e81f66b..5a22c0e6119 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift @@ -144,6 +144,10 @@ open class TuistAcceptanceTestCase: XCTestCase { try await run(command, arguments) } + public func run(_ command: GenerateCommand.Type, _ arguments: String...) async throws { + try await run(command, arguments) + } + public func run(_ command: GenerateCommand.Type, _ arguments: [String] = []) async throws { let arguments = [ "--no-open", diff --git a/Sources/TuistKit/Commands/BuildCommand.swift b/Sources/TuistKit/Commands/BuildCommand.swift index 22b4d40e249..d6b541ab11e 100644 --- a/Sources/TuistKit/Commands/BuildCommand.swift +++ b/Sources/TuistKit/Commands/BuildCommand.swift @@ -2,6 +2,7 @@ import ArgumentParser import Foundation import TSCBasic import TSCUtility +import TuistServer import TuistSupport enum XcodeBuildPassthroughArgumentError: FatalError, Equatable { @@ -24,6 +25,8 @@ enum XcodeBuildPassthroughArgumentError: FatalError, Equatable { public struct BuildOptions: ParsableArguments { public init() {} + public static var generatorFactory: GeneratorFactorying = GeneratorFactory() + public static var cacheStorageFactory: CacheStorageFactorying = EmptyCacheStorageFactory() @Argument( help: "The scheme to be built. By default it builds all the buildable schemes of the project in the current directory." @@ -104,6 +107,8 @@ public struct BuildOptions: ParsableArguments { /// Command that builds a target from the project in the current directory. public struct BuildCommand: AsyncParsableCommand { public init() {} + public static var generatorFactory: GeneratorFactorying = GeneratorFactory() + public static var cacheStorageFactory: CacheStorageFactorying = EmptyCacheStorageFactory() public static var configuration: CommandConfiguration { CommandConfiguration( @@ -115,6 +120,12 @@ public struct BuildCommand: AsyncParsableCommand { @OptionGroup() var buildOptions: BuildOptions + @Flag( + name: [.customLong("no-binary-cache")], + help: "Ignore binary cache and use sources only." + ) + var ignoreBinaryCache: Bool = false + private var notAllowedPassthroughXcodeBuildArguments = [ "-scheme", "-workspace", @@ -143,11 +154,15 @@ public struct BuildCommand: AsyncParsableCommand { FileHandler.shared.currentPath } - try await BuildService().run( + try await BuildService( + generatorFactory: Self.generatorFactory, + cacheStorageFactory: Self.cacheStorageFactory + ).run( schemeName: buildOptions.scheme, generate: buildOptions.generate, clean: buildOptions.clean, configuration: buildOptions.configuration, + ignoreBinaryCache: ignoreBinaryCache, buildOutputPath: buildOptions.buildOutputPath.map { try AbsolutePath( validating: $0, relativeTo: FileHandler.shared.currentPath diff --git a/Sources/TuistKit/Commands/CleanCommand.swift b/Sources/TuistKit/Commands/CleanCommand.swift index d6fd1c16701..6e8d9f2c460 100644 --- a/Sources/TuistKit/Commands/CleanCommand.swift +++ b/Sources/TuistKit/Commands/CleanCommand.swift @@ -2,7 +2,7 @@ import ArgumentParser import Foundation import TuistCore -public struct CleanCommand: ParsableCommand { +public struct CleanCommand: ParsableCommand { public init() {} public static var configuration: CommandConfiguration { @@ -13,7 +13,7 @@ public struct CleanCommand: ParsableCommand { } @Argument(help: "The cache and artifact categories to be cleaned. If no category is specified, everything is cleaned.") - var cleanCategories: [T] = T.allCases.map { $0 } + var cleanCategories: [TuistCleanCategory] = TuistCleanCategory.allCases.map { $0 } @Option( name: .shortAndLong, diff --git a/Sources/TuistKit/Commands/GenerateCommand.swift b/Sources/TuistKit/Commands/GenerateCommand.swift index ee47be0e387..6438aad00a8 100644 --- a/Sources/TuistKit/Commands/GenerateCommand.swift +++ b/Sources/TuistKit/Commands/GenerateCommand.swift @@ -2,11 +2,15 @@ import AnyCodable import ArgumentParser import Foundation import TuistCore +import TuistServer import TuistSupport public struct GenerateCommand: AsyncParsableCommand, HasTrackableParameters { public init() {} + public static var analyticsDelegate: TrackableParametersDelegate? + public static var generatorFactory: GeneratorFactorying = GeneratorFactory() + public static var cacheStorageFactory: CacheStorageFactorying = EmptyCacheStorageFactory() public var runId = "" public static var configuration: CommandConfiguration { @@ -24,16 +28,56 @@ public struct GenerateCommand: AsyncParsableCommand, HasTrackableParameters { ) var path: String? + @Argument(help: """ + A list of targets to focus on. \ + Other targets will be linked as binaries if possible. \ + If no target is specified, all the project targets will be generated (except external ones, such as Swift packages). + """) + var sources: [String] = [] + @Flag( name: .shortAndLong, help: "Don't open the project after generating it." ) var noOpen: Bool = false + @Flag( + name: [.customLong("no-binary-cache")], + help: "Ignore binary cache and use sources only." + ) + var ignoreBinaryCache: Bool = false + + @Option( + name: .shortAndLong, + help: "Configuration to generate for." + ) + var configuration: String? + public func run() async throws { - try await GenerateService().run( + defer { + GenerateCommand.analyticsDelegate?.addParameters( + [ + "no_open": AnyCodable(noOpen), + "no_binary_cache": AnyCodable(ignoreBinaryCache), + "n_targets": AnyCodable(sources.count), + "cacheable_targets": AnyCodable(CacheAnalyticsStore.shared.cacheableTargets), + "local_cache_target_hits": AnyCodable(CacheAnalyticsStore.shared.localCacheTargetsHits), + "remote_cache_target_hits": AnyCodable(CacheAnalyticsStore.shared.remoteCacheTargetsHits), + "test_targets": AnyCodable(CacheAnalyticsStore.shared.testTargets), + "local_test_target_hits": AnyCodable(CacheAnalyticsStore.shared.localTestTargetHits), + "remote_test_target_hits": AnyCodable(CacheAnalyticsStore.shared.remoteTestTargetHits), + ] + ) + } + try await GenerateService( + cacheStorageFactory: Self.cacheStorageFactory, + generatorFactory: Self.generatorFactory + ).run( path: path, - noOpen: noOpen + sources: Set(sources), + noOpen: noOpen, + configuration: configuration, + ignoreBinaryCache: ignoreBinaryCache ) } } diff --git a/Sources/TuistKit/Commands/TestCommand.swift b/Sources/TuistKit/Commands/TestCommand.swift index 731379d7fe4..3ce71b53a15 100644 --- a/Sources/TuistKit/Commands/TestCommand.swift +++ b/Sources/TuistKit/Commands/TestCommand.swift @@ -3,6 +3,8 @@ import ArgumentParser import Foundation import TSCBasic import TuistCore +import TuistGraph +import TuistServer import TuistSupport /// Command that tests a target from the project in the current directory. @@ -10,6 +12,8 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { public init() {} public static var analyticsDelegate: TrackableParametersDelegate? + public static var generatorFactory: GeneratorFactorying = GeneratorFactory() + public static var cacheStorageFactory: CacheStorageFactorying = EmptyCacheStorageFactory() public var runId = "" public static var configuration: CommandConfiguration { @@ -125,6 +129,18 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { ) var skipConfigurations: [String] = [] + @Flag( + name: [.customLong("no-binary-cache")], + help: "Ignore binary cache and use sources only." + ) + var ignoreBinaryCache: Bool = false + + @Flag( + name: [.customLong("no-selective-testing")], + help: "Run all tests instead of selectively test only those that have changed since the last successful test run." + ) + var ignoreSelectiveTesting: Bool = false + @Flag( name: .long, help: "When passed, it generates the project and skips testing. This is useful for debugging purposes." @@ -138,7 +154,7 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { var passthroughXcodeBuildArguments: [String] = [] public func validate() throws { - try TestService().validateParameters( + try TestService.validateParameters( testTargets: testTargets, skipTestTargets: skipTestTargets ) @@ -183,7 +199,27 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { FileHandler.shared.currentPath } - try await TestService().run( + defer { + var parameters: [String: AnyCodable] = [ + "no_binary_cache": AnyCodable(ignoreBinaryCache), + "no_selective_testing": AnyCodable(ignoreSelectiveTesting), + ] + parameters["cacheable_targets"] = AnyCodable(CacheAnalyticsStore.shared.cacheableTargets) + parameters["local_cache_target_hits"] = AnyCodable(CacheAnalyticsStore.shared.localCacheTargetsHits) + parameters["remote_cache_target_hits"] = AnyCodable(CacheAnalyticsStore.shared.remoteCacheTargetsHits) + parameters["test_targets"] = AnyCodable(CacheAnalyticsStore.shared.testTargets) + parameters["local_test_target_hits"] = AnyCodable(CacheAnalyticsStore.shared.localTestTargetHits) + parameters["remote_test_target_hits"] = AnyCodable(CacheAnalyticsStore.shared.remoteTestTargetHits) + + TestCommand.analyticsDelegate?.addParameters( + parameters + ) + } + + try await TestService( + generatorFactory: Self.generatorFactory, + cacheStorageFactory: Self.cacheStorageFactory + ).run( runId: runId, schemeName: scheme, clean: clean, @@ -212,6 +248,8 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { ) }, validateTestTargetsParameters: false, + ignoreBinaryCache: ignoreBinaryCache, + ignoreSelectiveTesting: ignoreSelectiveTesting, generateOnly: generateOnly, passthroughXcodeBuildArguments: passthroughXcodeBuildArguments ) diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index f726443ed12..d989d86eba1 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -14,7 +14,7 @@ public struct TuistCommand: AsyncParsableCommand { abstract: "Generate, build and test your Xcode projects.", subcommands: [ BuildCommand.self, - CleanCommand.self, + CleanCommand.self, DumpCommand.self, EditCommand.self, InstallCommand.self, diff --git a/Sources/TuistKit/Generator/GeneratorFactory.swift b/Sources/TuistKit/Generator/GeneratorFactory.swift index b0e3701e9b4..ecd24739b8d 100644 --- a/Sources/TuistKit/Generator/GeneratorFactory.swift +++ b/Sources/TuistKit/Generator/GeneratorFactory.swift @@ -1,32 +1,68 @@ import Foundation +import Mockable import TSCBasic import TuistCore import TuistGenerator import TuistGraph import TuistLoader +import TuistServer import TuistSupport /// The protocol describes the interface of a factory that instantiates /// generators for different commands +@Mockable public protocol GeneratorFactorying { /// Returns the generator to generate a project to run tests on. /// - Parameter config: The project configuration /// - Parameter testsCacheDirectory: The cache directory used for tests. /// - Parameter skipUITests: Whether UI tests should be skipped. + /// - Parameter ignoreBinaryCache: True to not include binaries from the cache. + /// - Parameter ignoreSelectiveTesting: True to run all tests + /// - Parameter cacheStorage: The cache storage instance. /// - Returns: A Generator instance. - func test( + func testing( config: Config, testsCacheDirectory: AbsolutePath, testPlan: String?, includedTargets: Set, excludedTargets: Set, - skipUITests: Bool + skipUITests: Bool, + configuration: String?, + ignoreBinaryCache: Bool, + ignoreSelectiveTesting: Bool, + cacheStorage: CacheStoring + ) -> Generating + + /// Returns the generator for focused projects. + /// - Parameter config: The project configuration. + /// - Parameter sources: The list of targets whose sources should be included. + /// - Parameter configuration: The configuration to generate for. + /// - Parameter ignoreBinaryCache: True to not include binaries from the cache. + /// - Parameter cacheStorage: The cache storage instance. + /// - Returns: The generator for focused projects. + func generation( + config: Config, + sources: Set, + configuration: String?, + ignoreBinaryCache: Bool, + cacheStorage: CacheStoring + ) -> Generating + + /// Returns a generator for building a project. + /// - Parameters: + /// - config: The project configuration + /// - Returns: A Generator instance + func building( + config: Config, + configuration: String?, + ignoreBinaryCache: Bool, + cacheStorage: CacheStoring ) -> Generating /// Returns the default generator. /// - Parameter config: The project configuration. /// - Returns: A Generator instance. - func `default`( + func defaultGenerator( config: Config ) -> Generating } @@ -38,13 +74,17 @@ public class GeneratorFactory: GeneratorFactorying { self.contentHasher = contentHasher } - public func test( + public func testing( config: Config, testsCacheDirectory: AbsolutePath, testPlan: String?, includedTargets: Set, excludedTargets: Set, - skipUITests: Bool + skipUITests: Bool, + configuration _: String?, + ignoreBinaryCache _: Bool, + ignoreSelectiveTesting _: Bool, + cacheStorage _: CacheStoring ) -> Generating { let contentHasher = ContentHasher() let projectMapperFactory = ProjectMapperFactory(contentHasher: contentHasher) @@ -71,7 +111,26 @@ public class GeneratorFactory: GeneratorFactorying { ) } - public func `default`(config: Config) -> Generating { + public func generation( + config: Config, + sources _: Set, + configuration _: String?, + ignoreBinaryCache _: Bool, + cacheStorage _: CacheStoring + ) -> Generating { + defaultGenerator(config: config) + } + + public func building( + config: Config, + configuration _: String?, + ignoreBinaryCache _: Bool, + cacheStorage _: CacheStoring + ) -> Generating { + defaultGenerator(config: config) + } + + public func defaultGenerator(config: Config) -> Generating { let contentHasher = ContentHasher() let projectMapperFactory = ProjectMapperFactory(contentHasher: contentHasher) let projectMappers = projectMapperFactory.default() diff --git a/Sources/TuistKit/Services/BuildService.swift b/Sources/TuistKit/Services/BuildService.swift index 1a038d33057..167aa32c300 100644 --- a/Sources/TuistKit/Services/BuildService.swift +++ b/Sources/TuistKit/Services/BuildService.swift @@ -4,6 +4,7 @@ import TuistAutomation import TuistCore import TuistGraph import TuistLoader +import TuistServer import TuistSupport enum BuildServiceError: FatalError { @@ -35,17 +36,20 @@ enum BuildServiceError: FatalError { public final class BuildService { private let generatorFactory: GeneratorFactorying + private let cacheStorageFactory: CacheStorageFactorying private let buildGraphInspector: BuildGraphInspecting private let targetBuilder: TargetBuilding private let configLoader: ConfigLoading public init( - generatorFactory: GeneratorFactorying = GeneratorFactory(), + generatorFactory: GeneratorFactorying, + cacheStorageFactory: CacheStorageFactorying, buildGraphInspector: BuildGraphInspecting = BuildGraphInspector(), targetBuilder: TargetBuilding = TargetBuilder(), configLoader: ConfigLoading = ConfigLoader(manifestLoader: ManifestLoader()) ) { self.generatorFactory = generatorFactory + self.cacheStorageFactory = cacheStorageFactory self.buildGraphInspector = buildGraphInspector self.targetBuilder = targetBuilder self.configLoader = configLoader @@ -57,6 +61,7 @@ public final class BuildService { generate: Bool, clean: Bool, configuration: String?, + ignoreBinaryCache: Bool, buildOutputPath: AbsolutePath?, derivedDataPath: String?, path: AbsolutePath, @@ -65,12 +70,18 @@ public final class BuildService { osVersion: String?, rosetta: Bool, generateOnly: Bool, - generator: ((Config) throws -> Generating)? = nil, + generator _: ((Config) throws -> Generating)? = nil, passthroughXcodeBuildArguments: [String] ) async throws { let graph: Graph let config = try configLoader.loadConfig(path: path) - let generator = try generator?(config) ?? generatorFactory.default(config: config) + let cacheStorage = try cacheStorageFactory.cacheStorage(config: config) + let generator = generatorFactory.building( + config: config, + configuration: configuration, + ignoreBinaryCache: ignoreBinaryCache, + cacheStorage: cacheStorage + ) if try (generate || buildGraphInspector.workspacePath(directory: path) == nil) { graph = try await generator.generateWithGraph(path: path).1 } else { diff --git a/Sources/TuistKit/Services/CleanService.swift b/Sources/TuistKit/Services/CleanService.swift index b8bac5582f8..4587e2f22af 100644 --- a/Sources/TuistKit/Services/CleanService.swift +++ b/Sources/TuistKit/Services/CleanService.swift @@ -5,35 +5,46 @@ import TuistGraph import TuistLoader import TuistSupport -public protocol CleanCategory: ExpressibleByArgument & CaseIterable { +protocol CleanCategory: ExpressibleByArgument & CaseIterable { func directory( - rootDirectory: AbsolutePath?, packageDirectory: AbsolutePath?, cacheDirectory: AbsolutePath ) throws -> AbsolutePath? } -public enum TuistCleanCategory: CleanCategory { - public static let allCases = CacheCategory.allCases.map { .global($0) } + [Self.dependencies] +enum TuistCleanCategory: CleanCategory { + static let allCases = CacheCategory.App.allCases.map { .cloud($0) } + CacheCategory.allCases + .map { .global($0) } + [Self.dependencies] + + static var allValueStrings: [String] { + TuistCleanCategory.allCases.map(\.defaultValueDescription) + } /// The global cache case global(CacheCategory) + /// The global cloud cache + case cloud(CacheCategory.App) + /// The local dependencies cache case dependencies - public var defaultValueDescription: String { + var defaultValueDescription: String { switch self { case let .global(cacheCategory): return cacheCategory.rawValue + case let .cloud(cacheCategory): + return cacheCategory.rawValue case .dependencies: return "dependencies" } } - public init?(argument: String) { + init?(argument: String) { if let cacheCategory = CacheCategory(rawValue: argument) { self = .global(cacheCategory) + } else if let cacheCategory = CacheCategory.App(rawValue: argument) { + self = .cloud(cacheCategory) } else if argument == "dependencies" { self = .dependencies } else { @@ -41,14 +52,18 @@ public enum TuistCleanCategory: CleanCategory { } } - public func directory( - rootDirectory _: AbsolutePath?, + func directory( packageDirectory: AbsolutePath?, cacheDirectory: AbsolutePath ) throws -> TSCBasic.AbsolutePath? { switch self { case let .global(category): return CacheDirectoriesProvider.tuistCacheDirectory(for: category, cacheDirectory: cacheDirectory) + case let .cloud(category): + return CacheDirectoriesProvider.tuistCloudCacheDirectory( + for: category, + cacheDirectory: cacheDirectory + ) case .dependencies: return packageDirectory?.appending( component: Constants.SwiftPackageManager.packageBuildDirectoryName @@ -93,13 +108,11 @@ final class CleanService { FileHandler.shared.currentPath } - let rootDirectory = rootDirectoryLocator.locate(from: resolvedPath) let cacheDirectory = try cacheDirectoriesProvider.cacheDirectory() let packageDirectory = manifestFilesLocator.locatePackageManifest(at: resolvedPath)?.parentDirectory for category in categories { if let directory = try category.directory( - rootDirectory: rootDirectory, packageDirectory: packageDirectory, cacheDirectory: cacheDirectory ), diff --git a/Sources/TuistKit/Services/GenerateService.swift b/Sources/TuistKit/Services/GenerateService.swift index b6c2fd88176..b515e23fa05 100644 --- a/Sources/TuistKit/Services/GenerateService.swift +++ b/Sources/TuistKit/Services/GenerateService.swift @@ -5,44 +5,57 @@ import TuistGenerator import TuistGraph import TuistLoader import TuistPlugin +import TuistServer import TuistSupport final class GenerateService { private let opener: Opening private let clock: Clock private let timeTakenLoggerFormatter: TimeTakenLoggerFormatting + private let cacheStorageFactory: CacheStorageFactorying private let generatorFactory: GeneratorFactorying private let manifestLoader: ManifestLoading private let pluginService: PluginServicing private let configLoader: ConfigLoading init( + cacheStorageFactory: CacheStorageFactorying, + generatorFactory: GeneratorFactorying, clock: Clock = WallClock(), timeTakenLoggerFormatter: TimeTakenLoggerFormatting = TimeTakenLoggerFormatter(), manifestLoader: ManifestLoading = ManifestLoader(), opener: Opening = Opener(), - generatorFactory: GeneratorFactorying = GeneratorFactory(), pluginService: PluginServicing = PluginService(), configLoader: ConfigLoading = ConfigLoader(manifestLoader: ManifestLoader()) ) { + self.generatorFactory = generatorFactory + self.cacheStorageFactory = cacheStorageFactory self.clock = clock self.timeTakenLoggerFormatter = timeTakenLoggerFormatter self.manifestLoader = manifestLoader self.opener = opener - self.generatorFactory = generatorFactory self.pluginService = pluginService self.configLoader = configLoader } func run( path: String?, - noOpen: Bool + sources: Set, + noOpen: Bool, + configuration: String?, + ignoreBinaryCache: Bool ) async throws { let timer = clock.startTimer() let path = try self.path(path) let config = try configLoader.loadConfig(path: path) - let generator = generatorFactory.default(config: config) - + let cacheStorage = try cacheStorageFactory.cacheStorage(config: config) + let generator = generatorFactory.generation( + config: config, + sources: sources, + configuration: configuration, + ignoreBinaryCache: ignoreBinaryCache, + cacheStorage: cacheStorage + ) let workspacePath = try await generator.generate(path: path) if !noOpen { try opener.open(path: workspacePath) diff --git a/Sources/TuistKit/Services/RunService.swift b/Sources/TuistKit/Services/RunService.swift index f3b2354fe58..993393a4033 100644 --- a/Sources/TuistKit/Services/RunService.swift +++ b/Sources/TuistKit/Services/RunService.swift @@ -80,7 +80,7 @@ final class RunService { let graph: Graph let config = try configLoader.loadConfig(path: runPath) - let generator = generatorFactory.default(config: config) + let generator = generatorFactory.defaultGenerator(config: config) if try (generate || buildGraphInspector.workspacePath(directory: runPath) == nil) { logger.notice("Generating project for running", metadata: .section) graph = try await generator.generateWithGraph(path: runPath).1 diff --git a/Sources/TuistKit/Services/TestService.swift b/Sources/TuistKit/Services/TestService.swift index 56ab36ead35..5682ab59d8e 100644 --- a/Sources/TuistKit/Services/TestService.swift +++ b/Sources/TuistKit/Services/TestService.swift @@ -5,6 +5,7 @@ import TuistAutomation import TuistCore import TuistGraph import TuistLoader +import TuistServer import TuistSupport enum TestServiceError: FatalError, Equatable { @@ -57,40 +58,34 @@ enum TestServiceError: FatalError, Equatable { } } -public final class TestService { // swiftlint:disable:this type_body_length +final class TestService { // swiftlint:disable:this type_body_length private let generatorFactory: GeneratorFactorying + private let cacheStorageFactory: CacheStorageFactorying private let xcodebuildController: XcodeBuildControlling private let buildGraphInspector: BuildGraphInspecting private let simulatorController: SimulatorControlling private let contentHasher: ContentHashing - private let testsCacheTemporaryDirectory: TemporaryDirectory private let cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring private let configLoader: ConfigLoading public convenience init( - testsCacheTemporaryDirectory: TemporaryDirectory + generatorFactory: GeneratorFactorying, + cacheStorageFactory: CacheStorageFactorying ) { let manifestLoaderFactory = ManifestLoaderFactory() let manifestLoader = manifestLoaderFactory.createManifestLoader() let configLoader = ConfigLoader(manifestLoader: manifestLoader) self.init( - testsCacheTemporaryDirectory: testsCacheTemporaryDirectory, - generatorFactory: GeneratorFactory(), + generatorFactory: generatorFactory, + cacheStorageFactory: cacheStorageFactory, configLoader: configLoader ) } - convenience init() throws { - let testsCacheTemporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) - self.init( - testsCacheTemporaryDirectory: testsCacheTemporaryDirectory - ) - } - init( - testsCacheTemporaryDirectory: TemporaryDirectory, generatorFactory: GeneratorFactorying = GeneratorFactory(), + cacheStorageFactory: CacheStorageFactorying = EmptyCacheStorageFactory(), xcodebuildController: XcodeBuildControlling = XcodeBuildController(), buildGraphInspector: BuildGraphInspecting = BuildGraphInspector(), simulatorController: SimulatorControlling = SimulatorController(), @@ -98,8 +93,8 @@ public final class TestService { // swiftlint:disable:this type_body_length cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring = CacheDirectoriesProviderFactory(), configLoader: ConfigLoading ) { - self.testsCacheTemporaryDirectory = testsCacheTemporaryDirectory self.generatorFactory = generatorFactory + self.cacheStorageFactory = cacheStorageFactory self.xcodebuildController = xcodebuildController self.buildGraphInspector = buildGraphInspector self.simulatorController = simulatorController @@ -108,7 +103,7 @@ public final class TestService { // swiftlint:disable:this type_body_length self.configLoader = configLoader } - public func validateParameters( + static func validateParameters( testTargets: [TestIdentifier], skipTestTargets: [TestIdentifier] ) throws { @@ -159,7 +154,7 @@ public final class TestService { // swiftlint:disable:this type_body_length } // swiftlint:disable:next function_body_length - public func run( + func run( runId: String, schemeName: String?, clean: Bool, @@ -177,32 +172,35 @@ public final class TestService { // swiftlint:disable:this type_body_length skipTestTargets: [TestIdentifier], testPlanConfiguration: TestPlanConfiguration?, validateTestTargetsParameters: Bool = true, - generator: Generating? = nil, + ignoreBinaryCache: Bool, + ignoreSelectiveTesting: Bool, generateOnly: Bool, passthroughXcodeBuildArguments: [String] ) async throws { if validateTestTargetsParameters { - try validateParameters( + try Self.validateParameters( testTargets: testTargets, skipTestTargets: skipTestTargets ) } // Load config let config = try configLoader.loadConfig(path: path) + let cacheStorage = try cacheStorageFactory.cacheStorage(config: config) - let testGenerator: Generating - if let generator { - testGenerator = generator - } else { - testGenerator = generatorFactory.test( - config: config, - testsCacheDirectory: testsCacheTemporaryDirectory.path, - testPlan: testPlanConfiguration?.testPlan, - includedTargets: Set(testTargets.map(\.target)), - excludedTargets: Set(skipTestTargets.filter { $0.class == nil }.map(\.target)), - skipUITests: skipUITests - ) - } + let testsCacheTemporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) + + let testGenerator = generatorFactory.testing( + config: config, + testsCacheDirectory: testsCacheTemporaryDirectory.path, + testPlan: testPlanConfiguration?.testPlan, + includedTargets: Set(testTargets.map(\.target)), + excludedTargets: Set(skipTestTargets.filter { $0.class == nil }.map(\.target)), + skipUITests: skipUITests, + configuration: configuration, + ignoreBinaryCache: ignoreBinaryCache, + ignoreSelectiveTesting: ignoreSelectiveTesting, + cacheStorage: cacheStorage + ) logger.notice("Generating project for testing", metadata: .section) let graph = try await testGenerator.generateWithGraph( @@ -320,6 +318,16 @@ public final class TestService { // swiftlint:disable:this type_body_length } logger.log(level: .notice, "The project tests ran successfully", metadata: .success) + + // Saving hashes from `testsCacheTemporaryDirectory` to `testsCacheDirectory` after all the tests have run successfully + let cacheableItems: [CacheStorableItem: [AbsolutePath]] = try FileHandler.shared + .contentsOfDirectory(testsCacheTemporaryDirectory.path) + .reduce(into: [:]) { acc, hash in + guard let name = try FileHandler.shared.contentsOfDirectory(hash).first else { return } + acc[CacheStorableItem(name: name.basename, hash: hash.basename)] = [AbsolutePath]() + } + + try await cacheStorage.store(cacheableItems, cacheCategory: .selectiveTests) } // MARK: - Helpers diff --git a/Sources/TuistServer/Cache/CacheAnalytics.swift b/Sources/TuistServer/Cache/CacheAnalytics.swift new file mode 100644 index 00000000000..7f0910213f7 --- /dev/null +++ b/Sources/TuistServer/Cache/CacheAnalytics.swift @@ -0,0 +1,24 @@ +import Foundation +import Mockable +import TuistSupport + +@Mockable +public protocol CacheAnalyticsStoring: AnyObject { + var localCacheTargetsHits: [String] { get set } + var remoteCacheTargetsHits: [String] { get set } + var cacheableTargets: [String] { get set } + var testTargets: [String] { get set } + var localTestTargetHits: [String] { get set } + var remoteTestTargetHits: [String] { get set } +} + +public final class CacheAnalyticsStore: CacheAnalyticsStoring { + public var localCacheTargetsHits: [String] = [] + public var remoteCacheTargetsHits: [String] = [] + public var cacheableTargets: [String] = [] + public var testTargets: [String] = [] + public var localTestTargetHits: [String] = [] + public var remoteTestTargetHits: [String] = [] + + public static let shared = CacheAnalyticsStore() +} diff --git a/Sources/TuistServer/Cache/CacheStorageFactorying.swift b/Sources/TuistServer/Cache/CacheStorageFactorying.swift new file mode 100644 index 00000000000..e3d067b55e8 --- /dev/null +++ b/Sources/TuistServer/Cache/CacheStorageFactorying.swift @@ -0,0 +1,10 @@ +import Foundation +import Mockable +import TuistCore +import TuistGraph +import TuistSupport + +@Mockable +public protocol CacheStorageFactorying { + func cacheStorage(config: Config) throws -> CacheStoring +} diff --git a/Sources/TuistServer/Cache/CacheStoring.swift b/Sources/TuistServer/Cache/CacheStoring.swift new file mode 100644 index 00000000000..a41c616e28c --- /dev/null +++ b/Sources/TuistServer/Cache/CacheStoring.swift @@ -0,0 +1,76 @@ +import Foundation +import Mockable +import TSCBasic +import TuistCore +import TuistGraph + +public struct CacheStorableTarget: Hashable, Equatable { + public let target: GraphTarget + public let hash: String + + public var name: String { target.target.name } + + public init(target: GraphTarget, hash: String) { + self.target = target + self.hash = hash + } + + public func hash(into hasher: inout Hasher) { + hasher.combine("cache-storable") + hasher.combine(hash) + } +} + +public struct CacheStorableItem: Hashable, Equatable { + public let name: String + public let hash: String + public init(name: String, hash: String) { + self.name = name + self.hash = hash + } + + public func hash(into hasher: inout Hasher) { + hasher.combine("cache-storable") + hasher.combine(hash) + } +} + +@Mockable +public protocol CacheStoring { + func fetch( + _ items: Set, + cacheCategory: CacheCategory.App + ) async throws -> [CacheStorableItem: AbsolutePath] + func store( + _ items: [CacheStorableItem: [AbsolutePath]], + cacheCategory: CacheCategory.App + ) async throws +} + +extension CacheStoring { + public func fetch( + _ targets: Set, + cacheCategory: CacheCategory.App + ) async throws -> [CacheStorableTarget: AbsolutePath] { + Dictionary( + uniqueKeysWithValues: try await fetch( + Set(targets.map { CacheStorableItem(name: $0.name, hash: $0.hash) }), + cacheCategory: cacheCategory + ) + .compactMap { item, path -> (CacheStorableTarget, AbsolutePath)? in + guard let target = targets.first(where: { $0.hash == item.hash }) else { return nil } + return (target, path) + } + ) + } + + public func store( + _ targets: [CacheStorableTarget: [AbsolutePath]], + cacheCategory: CacheCategory.App + ) async throws { + let items = Dictionary(uniqueKeysWithValues: targets.map { target, paths -> (CacheStorableItem, [AbsolutePath]) in + (CacheStorableItem(name: target.name, hash: target.hash), paths) + }) + try await store(items, cacheCategory: cacheCategory) + } +} diff --git a/Sources/TuistServer/Cache/EmptyCacheStorage.swift b/Sources/TuistServer/Cache/EmptyCacheStorage.swift new file mode 100644 index 00000000000..95dbd52b167 --- /dev/null +++ b/Sources/TuistServer/Cache/EmptyCacheStorage.swift @@ -0,0 +1,17 @@ +import Foundation +import TSCBasic +import TuistCore + +/// Empty `CacheStoring` implementation as we noop cache storing in the opensource repository +public final class EmptyCacheStorage: CacheStoring { + public init() {} + + public func fetch( + _: Set, + cacheCategory _: CacheCategory.App + ) async throws -> [CacheStorableItem: AbsolutePath] { + [:] + } + + public func store(_: [CacheStorableItem: [AbsolutePath]], cacheCategory _: CacheCategory.App) async throws {} +} diff --git a/Sources/TuistServer/Cache/EmptyCacheStorageFactory.swift b/Sources/TuistServer/Cache/EmptyCacheStorageFactory.swift new file mode 100644 index 00000000000..163a58d131c --- /dev/null +++ b/Sources/TuistServer/Cache/EmptyCacheStorageFactory.swift @@ -0,0 +1,10 @@ +import Foundation +import TuistGraph + +public final class EmptyCacheStorageFactory: CacheStorageFactorying { + public init() {} + + public func cacheStorage(config _: Config) throws -> any CacheStoring { + EmptyCacheStorage() + } +} diff --git a/Tests/TuistKitTests/Generator/Mocks/MockGeneratorFactory.swift b/Tests/TuistKitTests/Generator/Mocks/MockGeneratorFactory.swift deleted file mode 100644 index 9f6cc5f9c16..00000000000 --- a/Tests/TuistKitTests/Generator/Mocks/MockGeneratorFactory.swift +++ /dev/null @@ -1,68 +0,0 @@ -import Foundation -import TSCBasic -import TuistCore -import TuistGraph -@testable import TuistKit - -final class MockGeneratorFactory: GeneratorFactorying { - var invokedTest = false - var invokedTestCount = 0 - var invokedTestParameters: ( - config: Config, - testsCacheDirectory: AbsolutePath, - testPlan: String?, - includedTargets: Set, - excludedTargets: Set, - skipUITests: Bool - )? - var invokedTestParametersList = - [( - config: Config, - testsCacheDirectory: AbsolutePath, - testPlan: String?, - includedTargets: Set, - excludedTargets: Set, - skipUITests: Bool - )]() - var stubbedTestResult: Generating! - - func test( - config: Config, - testsCacheDirectory: AbsolutePath, - testPlan: String?, - includedTargets: Set, - excludedTargets: Set, - skipUITests: Bool - ) -> Generating { - invokedTest = true - invokedTestCount += 1 - invokedTestParameters = ( - config, - testsCacheDirectory, - testPlan, - includedTargets, - excludedTargets, - skipUITests - ) - invokedTestParametersList - .append(( - config, - testsCacheDirectory, - testPlan, - includedTargets, - excludedTargets, - skipUITests - )) - return stubbedTestResult - } - - var invokedDefault = false - var invokedDefaultCount = 0 - var stubbedDefaultResult: Generating! - - func `default`(config _: Config) -> Generating { - invokedDefault = true - invokedDefaultCount += 1 - return stubbedDefaultResult - } -} diff --git a/Tests/TuistKitTests/Services/BuildServiceTests.swift b/Tests/TuistKitTests/Services/BuildServiceTests.swift index 5a2701d8d29..e1a3f19a07f 100644 --- a/Tests/TuistKitTests/Services/BuildServiceTests.swift +++ b/Tests/TuistKitTests/Services/BuildServiceTests.swift @@ -1,9 +1,11 @@ import Foundation +import MockableTest import TSCBasic import TSCUtility import TuistCore import TuistGraph import TuistGraphTesting +import TuistServer import TuistSupport import XCTest @@ -36,21 +38,34 @@ final class BuildServiceErrorTests: TuistUnitTestCase { } final class BuildServiceTests: TuistUnitTestCase { - var generator: MockGenerator! - var generatorFactory: MockGeneratorFactory! - var buildGraphInspector: MockBuildGraphInspector! - var targetBuilder: MockTargetBuilder! - var subject: BuildService! + private var generator: MockGenerator! + private var generatorFactory: MockGeneratorFactorying! + private var buildGraphInspector: MockBuildGraphInspector! + private var targetBuilder: MockTargetBuilder! + private var cacheStorageFactory: MockCacheStorageFactorying! + private var subject: BuildService! override func setUp() { super.setUp() generator = MockGenerator() - generatorFactory = MockGeneratorFactory() - generatorFactory.stubbedDefaultResult = generator + generatorFactory = .init() + given(generatorFactory) + .building( + config: .any, + configuration: .any, + ignoreBinaryCache: .any, + cacheStorage: .any + ) + .willReturn(generator) buildGraphInspector = MockBuildGraphInspector() targetBuilder = MockTargetBuilder() + cacheStorageFactory = .init() + given(cacheStorageFactory) + .cacheStorage(config: .any) + .willReturn(MockCacheStoring()) subject = BuildService( generatorFactory: generatorFactory, + cacheStorageFactory: cacheStorageFactory, buildGraphInspector: buildGraphInspector, targetBuilder: targetBuilder ) @@ -61,6 +76,7 @@ final class BuildServiceTests: TuistUnitTestCase { generatorFactory = nil buildGraphInspector = nil targetBuilder = nil + cacheStorageFactory = nil subject = nil super.tearDown() } @@ -305,6 +321,7 @@ extension BuildService { generate: Bool = false, clean: Bool = true, configuration: String? = nil, + ignoreBinaryCache: Bool = false, buildOutputPath: AbsolutePath? = nil, derivedDataPath: String? = nil, path: AbsolutePath, @@ -320,6 +337,7 @@ extension BuildService { generate: generate, clean: clean, configuration: configuration, + ignoreBinaryCache: ignoreBinaryCache, buildOutputPath: buildOutputPath, derivedDataPath: derivedDataPath, path: path, diff --git a/Tests/TuistKitTests/Services/GenerateServiceTests.swift b/Tests/TuistKitTests/Services/GenerateServiceTests.swift index 054bec49ae4..e76f42aae39 100644 --- a/Tests/TuistKitTests/Services/GenerateServiceTests.swift +++ b/Tests/TuistKitTests/Services/GenerateServiceTests.swift @@ -1,8 +1,10 @@ import Foundation +import MockableTest import TSCBasic import TuistCore import TuistGraph import TuistLoader +import TuistServer import XcodeProj import XCTest @testable import TuistCoreTesting @@ -11,20 +13,38 @@ import XCTest @testable import TuistSupportTesting final class GenerateServiceTests: TuistUnitTestCase { - var subject: GenerateService! - var opener: MockOpener! - var generator: MockGenerator! - var generatorFactory: MockGeneratorFactory! - var clock: StubClock! + private var subject: GenerateService! + private var opener: MockOpener! + private var generator: MockGenerator! + private var generatorFactory: MockGeneratorFactorying! + private var cacheStorageFactory: MockCacheStorageFactorying! + private var clock: StubClock! override func setUp() { super.setUp() opener = MockOpener() generator = MockGenerator() - generatorFactory = MockGeneratorFactory() - generatorFactory.stubbedDefaultResult = generator + generatorFactory = .init() + given(generatorFactory) + .generation( + config: .any, + sources: .any, + configuration: .any, + ignoreBinaryCache: .any, + cacheStorage: .any + ) + .willReturn(generator) + cacheStorageFactory = .init() + given(cacheStorageFactory) + .cacheStorage(config: .any) + .willReturn(MockCacheStoring()) clock = StubClock() - subject = GenerateService(clock: clock, opener: opener, generatorFactory: generatorFactory) + subject = GenerateService( + cacheStorageFactory: cacheStorageFactory, + generatorFactory: generatorFactory, + clock: clock, + opener: opener + ) } override func tearDown() { @@ -32,6 +52,7 @@ final class GenerateServiceTests: TuistUnitTestCase { generator = nil subject = nil generatorFactory = nil + cacheStorageFactory = nil clock = nil super.tearDown() } @@ -46,7 +67,10 @@ final class GenerateServiceTests: TuistUnitTestCase { try await subject .run( path: nil, - noOpen: true + sources: [], + noOpen: true, + configuration: nil, + ignoreBinaryCache: false ) XCTFail("Must throw") } catch { @@ -63,7 +87,10 @@ final class GenerateServiceTests: TuistUnitTestCase { try await subject.run( path: nil, - noOpen: false + sources: [], + noOpen: false, + configuration: nil, + ignoreBinaryCache: false ) XCTAssertEqual(opener.openArgs.last?.0, workspacePath.pathString) @@ -84,7 +111,10 @@ final class GenerateServiceTests: TuistUnitTestCase { // When try await subject.run( path: nil, - noOpen: false + sources: [], + noOpen: false, + configuration: nil, + ignoreBinaryCache: false ) // Then diff --git a/Tests/TuistKitTests/Services/RunServiceTests.swift b/Tests/TuistKitTests/Services/RunServiceTests.swift index a27f58436fe..b28c43d28d0 100644 --- a/Tests/TuistKitTests/Services/RunServiceTests.swift +++ b/Tests/TuistKitTests/Services/RunServiceTests.swift @@ -1,4 +1,5 @@ import Foundation +import MockableTest import TSCBasic import struct TSCUtility.Version import TuistCore @@ -36,20 +37,22 @@ final class RunServiceErrorTests: TuistUnitTestCase { } final class RunServiceTests: TuistUnitTestCase { - var generator: MockGenerator! - var generatorFactory: MockGeneratorFactory! - var buildGraphInspector: MockBuildGraphInspector! - var targetBuilder: MockTargetBuilder! - var targetRunner: MockTargetRunner! - var subject: RunService! + private var generator: MockGenerator! + private var generatorFactory: MockGeneratorFactorying! + private var buildGraphInspector: MockBuildGraphInspector! + private var targetBuilder: MockTargetBuilder! + private var targetRunner: MockTargetRunner! + private var subject: RunService! private struct TestError: Equatable, Error {} override func setUp() { super.setUp() generator = MockGenerator() - generatorFactory = MockGeneratorFactory() - generatorFactory.stubbedDefaultResult = generator + generatorFactory = MockGeneratorFactorying() + given(generatorFactory) + .defaultGenerator(config: .any) + .willReturn(generator) buildGraphInspector = MockBuildGraphInspector() targetBuilder = MockTargetBuilder() targetRunner = MockTargetRunner() diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index 4e661a098c3..3360b88ab5b 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -17,7 +17,7 @@ import XCTest final class TestServiceTests: TuistUnitTestCase { private var subject: TestService! private var generator: MockGenerator! - private var generatorFactory: MockGeneratorFactory! + private var generatorFactory: MockGeneratorFactorying! private var xcodebuildController: MockXcodeBuildController! private var buildGraphInspector: MockBuildGraphInspector! private var simulatorController: MockSimulatorController! @@ -35,7 +35,6 @@ final class TestServiceTests: TuistUnitTestCase { contentHasher = .init() testsCacheTemporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) generatorFactory = .init() - generatorFactory.stubbedTestResult = generator let mockCacheDirectoriesProvider = MockCacheDirectoriesProviding() cacheDirectoriesProvider = mockCacheDirectoriesProvider let cacheDirectoryProviderFactory = MockCacheDirectoriesProviderFactoring() @@ -55,7 +54,6 @@ final class TestServiceTests: TuistUnitTestCase { } subject = TestService( - testsCacheTemporaryDirectory: testsCacheTemporaryDirectory, generatorFactory: generatorFactory, xcodebuildController: xcodebuildController, buildGraphInspector: buildGraphInspector, @@ -79,25 +77,25 @@ final class TestServiceTests: TuistUnitTestCase { } func test_validateParameters_noParameters() throws { - try subject.validateParameters(testTargets: [], skipTestTargets: []) + try TestService.validateParameters(testTargets: [], skipTestTargets: []) } func test_validateParameters_nonConflictingParameters_target() throws { - try subject.validateParameters( + try TestService.validateParameters( testTargets: [TestIdentifier(string: "test1")], skipTestTargets: [TestIdentifier(string: "test1/class1")] ) } func test_validateParameters_with_testTargets_and_no_skipTestTargets() throws { - try subject.validateParameters( + try TestService.validateParameters( testTargets: [TestIdentifier(target: "TestTarget", class: "TestClass")], skipTestTargets: [] ) } func test_validateParameters_nonConflictingParameters_targetClass() throws { - try subject.validateParameters( + try TestService.validateParameters( testTargets: [TestIdentifier(string: "test1/class1")], skipTestTargets: [TestIdentifier(string: "test1/class1/method1")] ) @@ -108,7 +106,7 @@ final class TestServiceTests: TuistUnitTestCase { let skipTestTargets = try [TestIdentifier(string: "test2")] let error = TestServiceError.nothingToSkip(skipped: skipTestTargets, included: testTargets) XCTAssertThrowsSpecific( - try subject.validateParameters( + try TestService.validateParameters( testTargets: testTargets, skipTestTargets: skipTestTargets ), @@ -121,7 +119,7 @@ final class TestServiceTests: TuistUnitTestCase { let skipTestTargets = try [TestIdentifier(string: "test1/class2")] let error = TestServiceError.nothingToSkip(skipped: skipTestTargets, included: testTargets) XCTAssertThrowsSpecific( - try subject.validateParameters( + try TestService.validateParameters( testTargets: testTargets, skipTestTargets: skipTestTargets ), @@ -134,7 +132,7 @@ final class TestServiceTests: TuistUnitTestCase { let skipTestTargets = try [TestIdentifier(string: "test1/class2/method2")] let error = TestServiceError.nothingToSkip(skipped: skipTestTargets, included: testTargets) XCTAssertThrowsSpecific( - try subject.validateParameters( + try TestService.validateParameters( testTargets: testTargets, skipTestTargets: skipTestTargets ), @@ -147,7 +145,7 @@ final class TestServiceTests: TuistUnitTestCase { let skipTestTargets = try [TestIdentifier(string: "test1")] let error = TestServiceError.duplicatedTestTargets(Set(testTargets)) XCTAssertThrowsSpecific( - try subject.validateParameters( + try TestService.validateParameters( testTargets: testTargets, skipTestTargets: skipTestTargets ), @@ -160,7 +158,7 @@ final class TestServiceTests: TuistUnitTestCase { let skipTestTargets = try [TestIdentifier(string: "test1/class1")] let error = TestServiceError.duplicatedTestTargets(Set(testTargets)) XCTAssertThrowsSpecific( - try subject.validateParameters( + try TestService.validateParameters( testTargets: testTargets, skipTestTargets: skipTestTargets ), @@ -173,7 +171,7 @@ final class TestServiceTests: TuistUnitTestCase { let skipTestTargets = try [TestIdentifier(string: "test1/class1/method1")] let error = TestServiceError.duplicatedTestTargets(Set(testTargets)) XCTAssertThrowsSpecific( - try subject.validateParameters( + try TestService.validateParameters( testTargets: testTargets, skipTestTargets: skipTestTargets ), @@ -183,6 +181,7 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_generates_project() async throws { // Given + givenGenerator() let path = try temporaryPath() var generatedPath: AbsolutePath? generator.generateWithGraphStub = { @@ -204,6 +203,7 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_tests_wtih_specified_arch() async throws { // Given + givenGenerator() given(configLoader) .loadConfig(path: .any) .willReturn(.default) @@ -241,6 +241,7 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_tests_for_only_specified_scheme() async throws { // Given + givenGenerator() given(configLoader) .loadConfig(path: .any) .willReturn(.default) @@ -277,6 +278,7 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_tests_all_project_schemes() async throws { // Given + givenGenerator() given(configLoader) .loadConfig(path: .any) .willReturn(.default) @@ -322,6 +324,7 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_tests_individual_scheme() async throws { // Given + givenGenerator() given(configLoader) .loadConfig(path: .any) .willReturn(.default) @@ -362,6 +365,20 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_tests_with_skipped_targets() async throws { // Given + given(generatorFactory) + .testing( + config: .any, + testsCacheDirectory: .any, + testPlan: .any, + includedTargets: .any, + excludedTargets: .value([]), + skipUITests: .any, + configuration: .any, + ignoreBinaryCache: .any, + ignoreSelectiveTesting: .any, + cacheStorage: .any + ) + .willReturn(generator) given(configLoader) .loadConfig(path: .any) .willReturn(.default) @@ -387,11 +404,11 @@ final class TestServiceTests: TuistUnitTestCase { // Then XCTAssertEqual(testedSchemes, ["ProjectSchemeOneTests"]) - XCTAssertEqual(generatorFactory.invokedTestParameters?.excludedTargets, []) } func test_run_tests_all_project_schemes_when_fails() async throws { // Given + givenGenerator() given(configLoader) .loadConfig(path: .any) .willReturn(.default) @@ -432,6 +449,7 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_tests_when_no_project_schemes_present() async throws { // Given + givenGenerator() given(configLoader) .loadConfig(path: .any) .willReturn(.default) @@ -458,6 +476,7 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_uses_resource_bundle_path() async throws { // Given + givenGenerator() given(configLoader) .loadConfig(path: .any) .willReturn(.default) @@ -491,6 +510,7 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_saves_resource_bundle_when_cloud_is_configured() async throws { // Given + givenGenerator() var resultBundlePath: AbsolutePath? let expectedResultBundlePath = try cacheDirectoriesProvider .tuistCacheDirectory(for: .runs) @@ -534,6 +554,7 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_uses_resource_bundle_path_with_given_scheme() async throws { // Given + givenGenerator() given(configLoader) .loadConfig(path: .any) .willReturn(.default) @@ -569,6 +590,7 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_passes_retry_count_as_argument() async throws { // Given + givenGenerator() given(configLoader) .loadConfig(path: .any) .willReturn(.default) @@ -604,6 +626,7 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_defaults_retry_count_to_zero() async throws { // Given + givenGenerator() given(configLoader) .loadConfig(path: .any) .willReturn(.default) @@ -638,6 +661,7 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_test_plan_success() async throws { // Given + givenGenerator() given(configLoader) .loadConfig(path: .any) .willReturn(.default) @@ -685,6 +709,7 @@ final class TestServiceTests: TuistUnitTestCase { func test_run_test_plan_failure() async throws { // Given + givenGenerator() given(configLoader) .loadConfig(path: .any) .willReturn(.default) @@ -727,9 +752,24 @@ final class TestServiceTests: TuistUnitTestCase { throw error } } -} -// MARK: - Helpers + private func givenGenerator() { + given(generatorFactory) + .testing( + config: .any, + testsCacheDirectory: .any, + testPlan: .any, + includedTargets: .any, + excludedTargets: .any, + skipUITests: .any, + configuration: .any, + ignoreBinaryCache: .any, + ignoreSelectiveTesting: .any, + cacheStorage: .any + ) + .willReturn(generator) + } +} extension TestService { fileprivate func testRun( @@ -769,6 +809,8 @@ extension TestService { testTargets: testTargets, skipTestTargets: skipTestTargets, testPlanConfiguration: testPlanConfiguration, + ignoreBinaryCache: false, + ignoreSelectiveTesting: false, generateOnly: generateOnly, passthroughXcodeBuildArguments: passthroughXcodeBuildArguments ) From 6f0cab882300b4545e1f930330bab480bce50d91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Fri, 31 May 2024 13:08:23 +0200 Subject: [PATCH 325/509] Adjust the documentation for how to set up S3 in on-premise instances of Tuist (#6356) * Adjust the documentation * Fix the docker-compose example --- docs/docs/cloud/on-premise.md | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/docs/docs/cloud/on-premise.md b/docs/docs/cloud/on-premise.md index 3f8730184cf..af9bbc17046 100644 --- a/docs/docs/cloud/on-premise.md +++ b/docs/docs/cloud/on-premise.md @@ -134,20 +134,15 @@ Once the app is created you'll need to set the following environment variables: Tuist Cloud needs storage to house artifacts uploaded through the API. It's **essential to configure one of the supported storage solutions** for Tuist Cloud to operate effectively. -#### S3-Compliant storages +#### S3-compliant storages -| Environment variable | Description | Required | Default | Example | -| --- | --- | --- | --- | --- | -| `TUIST_S3_ACCESS_KEY_ID`, `AWS_ACCESS_KEY_ID` | The access key identifier | Yes | | `AKIAA2LQP3CCOZ6WT6CF` | -| `TUIST_S3_SECRET_ACCESS_KEY`, `AWS_SECRET_ACCESS_KEY` | The access key secret | Yes | | `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` | -| `TUIST_S3_BUCKET_NAME` | Name of the bucket | Yes | | `my-bucket` | -| `TUIST_S3_REGION`, `AWS_REGION` | The bucket's region | No | `eu-west-1` | `us-east-1` | -| `TUIST_S3_ENDPOINT` | Custom endpoint | No | `https://amazonaws.com` | `https://custom-domain.com` | -| `TUIST_AWS_PROFILE`, `AWS_PROFILE` | Set an [AWS profile](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-using-profiles) for authorization. Doesn't work with other storages | No | | `user1` | -| `TUIST_AWS_SESSION_TOKEN`, `AWS_SESSION_TOKEN` | [Session token](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html) to authenticate requests | No | | `8ea7c2b4e79bec6f2990afe47f8439a44ed7dc4` | -| `TUIST_USE_SESSION_TOKEN` | When `1` it uses the [session token](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html) to authenticate requests | No | | `1` | +The environment variables required to authenticate against S3-compliant storages aligns with the [conventions set by AWS](https://docs.aws.amazon.com/cli/v1/userguide/cli-configure-envvars.html) (e.g. `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`, `AWS_ENDPOINT`). Additionally, you need to set the `TUIST_S3_BUCKET_NAME` environment variable to indicate the bucket where the artifacts will be stored. + +> [!NOTE] RUST SDK +> Tuist uses this [Rust SDK](https://github.com/durch/rust-s3), which you can use as a reference to understand how the environment variables are used. -For Google Cloud Storage, follow [these docs](https://cloud.google.com/storage/docs/authentication/managing-hmackeys) to get the `TUIST_S3_ACCESS_KEY_ID` and `TUIST_S3_SECRET_ACCESS_KEY` pair. The `TUIST_S3_ENDPOINT` should be set to `https://storage.googleapis.com`. Other environment variables are the same as for any other S3-compliant storage. +### Google Cloud Storage +For Google Cloud Storage, follow [these docs](https://cloud.google.com/storage/docs/authentication/managing-hmackeys) to get the `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` pair. The `AWS_ENDPOINT` should be set to `https://storage.googleapis.com`. Other environment variables are the same as for any other S3-compliant storage. ## Deployment @@ -306,11 +301,11 @@ services: TUIST_OKTA_EVENT_HOOK_SECRET: # Optional # Storage - TUIST_S3_ACCESS_KEY_ID: # ... - TUIST_S3_SECRET_ACCESS_KEY: # ... + AWS_ACCESS_KEY_ID: # ... + AWS_SECRET_ACCESS_KEY: # ... + AWS_S3_REGION: # ... + AWS_ENDPOINT: # https://amazonaws.com TUIST_S3_BUCKET_NAME: # ... - TUIST_S3_REGION: # ... - TUIST_S3_ENDPOINT: # https://amazonaws.com # Other From 3799181855977819b635b3adc8ea5a4d21403e81 Mon Sep 17 00:00:00 2001 From: Miguel Ferrando Date: Fri, 31 May 2024 13:09:09 +0200 Subject: [PATCH 326/509] Make `tuist run` interactive (#6307) --- .../Utilities/TargetRunner.swift | 8 ++- .../Simulator/SimulatorController.swift | 50 ++++++++++++++++++- .../Simulator/MockSimulatorController.swift | 10 ++++ Sources/TuistSupport/UserInputReader.swift | 28 +++++++++++ .../Utils/UserInputReaderTests.swift | 49 ++++++++++++++++++ docs/docs/guide/automation/run.md | 2 +- 6 files changed, 143 insertions(+), 4 deletions(-) create mode 100644 Sources/TuistSupport/UserInputReader.swift create mode 100644 Tests/TuistSupportTests/Utils/UserInputReaderTests.swift diff --git a/Sources/TuistAutomation/Utilities/TargetRunner.swift b/Sources/TuistAutomation/Utilities/TargetRunner.swift index f950db370df..4441df298c5 100644 --- a/Sources/TuistAutomation/Utilities/TargetRunner.swift +++ b/Sources/TuistAutomation/Utilities/TargetRunner.swift @@ -153,8 +153,12 @@ public final class TargetRunner: TargetRunning { let settings = try await xcodeBuildController .showBuildSettings(.workspace(workspacePath), scheme: schemeName, configuration: configuration, derivedDataPath: nil) let bundleId = settings[target.target.name]?.productBundleIdentifier ?? target.target.bundleId - let simulator = try await simulatorController - .findAvailableDevice(platform: platform, version: version, minVersion: minVersion, deviceName: deviceName) + let simulator = try await simulatorController.askForAvailableDevice( + platform: platform, + version: version, + minVersion: minVersion, + deviceName: deviceName + ) logger.debug("Running app \(appPath.pathString) with arguments [\(arguments.joined(separator: ", "))]") logger.notice("Running app \(bundleId) on \(simulator.device.name)", metadata: .section) diff --git a/Sources/TuistCore/Simulator/SimulatorController.swift b/Sources/TuistCore/Simulator/SimulatorController.swift index 6d9770471cf..9abdce49ac9 100644 --- a/Sources/TuistCore/Simulator/SimulatorController.swift +++ b/Sources/TuistCore/Simulator/SimulatorController.swift @@ -18,6 +18,20 @@ public protocol SimulatorControlling { deviceName: String? ) async throws -> SimulatorDeviceAndRuntime + /// Ask the user to select one of the available devices defined by given parameters + /// if there is more than one, otherwise return the only one available + /// - Parameters: + /// - platform: Given platform + /// - version: Specific version, ignored if nil + /// - minVersion: Minimum version of the OS + /// - deviceName: Specific device name (eg. iPhone X) + func askForAvailableDevice( + platform: Platform, + version: Version?, + minVersion: Version?, + deviceName: String? + ) async throws -> SimulatorDeviceAndRuntime + func findAvailableDevices( platform: Platform, version: Version?, @@ -81,8 +95,11 @@ public enum SimulatorControllerError: Equatable, FatalError { public final class SimulatorController: SimulatorControlling { private let jsonDecoder = JSONDecoder() + private let userInputReader: UserInputReading - public init() {} + public init(userInputReader: UserInputReading = UserInputReader()) { + self.userInputReader = userInputReader + } /// Returns the list of simulator devices that are available in the system. func devices() async throws -> [SimulatorDevice] { @@ -191,6 +208,37 @@ public final class SimulatorController: SimulatorControlling { return device } + public func askForAvailableDevice( + platform: Platform, + version: Version?, + minVersion: Version?, + deviceName: String? + ) async throws -> SimulatorDeviceAndRuntime { + let availableDevices = try await findAvailableDevices( + platform: platform, + version: version, + minVersion: minVersion, + deviceName: deviceName + ) + if availableDevices.isEmpty { + throw SimulatorControllerError.deviceNotFound( + platform, + version, + deviceName, + try await devicesAndRuntimes() + ) + } + if availableDevices.count == 1, let onlyOption = availableDevices.first { + return onlyOption + } + var prompt = "Select the simulator device where you want to run the app:\n" + for (index, availableDevice) in availableDevices.enumerated() { + prompt += "\t\(index): \(availableDevice.device.name) (\(availableDevice.device.udid))\n" + } + let choice = userInputReader.readInt(asking: prompt, maxValueAllowed: availableDevices.count) + return availableDevices[choice] + } + public func installApp(at path: AbsolutePath, device: SimulatorDevice) throws { logger.debug("Installing app at \(path) on simulator device with id \(device.udid)") let device = try device.booted() diff --git a/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift b/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift index 7909da6f5e7..f45482af8cc 100644 --- a/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift +++ b/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift @@ -19,6 +19,16 @@ public final class MockSimulatorController: SimulatorControlling { findAvailableDevicesStub?(platform, version, minVersion, deviceName) ?? [SimulatorDeviceAndRuntime.test()] } + public var askForAvailableDeviceStub: ((Platform, Version?, Version?, String?) -> SimulatorDeviceAndRuntime)? + public func askForAvailableDevice( + platform: TuistGraph.Platform, + version: TSCUtility.Version?, + minVersion: TSCUtility.Version?, + deviceName: String? + ) async throws -> TuistCore.SimulatorDeviceAndRuntime { + askForAvailableDeviceStub?(platform, version, minVersion, deviceName) ?? SimulatorDeviceAndRuntime.test() + } + public var findAvailableDeviceStub: ((Platform, Version?, Version?, String?) -> SimulatorDeviceAndRuntime)? public func findAvailableDevice( platform: Platform, diff --git a/Sources/TuistSupport/UserInputReader.swift b/Sources/TuistSupport/UserInputReader.swift new file mode 100644 index 00000000000..43f32be3580 --- /dev/null +++ b/Sources/TuistSupport/UserInputReader.swift @@ -0,0 +1,28 @@ +import Foundation + +public protocol UserInputReading { + /// Reads an integer from the user + /// - Parameters: + /// - prompt: The prompt to be shown to the user providing context and the allowed options + /// - maxValueAllowed: The max value allowed given the list of options provided in the prompt + func readInt(asking prompt: String, maxValueAllowed: Int) -> Int +} + +public struct UserInputReader: UserInputReading { + private var reader: (Bool) -> String? + + public init(reader: @escaping (Bool) -> String? = readLine) { + self.reader = reader + } + + public func readInt(asking prompt: String, maxValueAllowed: Int) -> Int { + while true { + logger.notice("\(prompt)") + if let input = reader(true), !input.isEmpty, let intValue = Int(input), intValue < maxValueAllowed { + return intValue + } else { + logger.notice("Invalid input. Please enter a valid integer.") + } + } + } +} diff --git a/Tests/TuistSupportTests/Utils/UserInputReaderTests.swift b/Tests/TuistSupportTests/Utils/UserInputReaderTests.swift new file mode 100644 index 00000000000..971e5841679 --- /dev/null +++ b/Tests/TuistSupportTests/Utils/UserInputReaderTests.swift @@ -0,0 +1,49 @@ +import XCTest +@testable import TuistSupport + +class UserInputReaderTests: XCTestCase { + func test_read_int_valid_input() { + // Given + var fakeReadLine = StringReader(input: "0") + let reader: UserInputReader = .init { _ in + fakeReadLine.readLine() + } + + // When + let result = reader.readInt(asking: "prompt", maxValueAllowed: 1) + + // Then + XCTAssertEqual(result, Int(fakeReadLine.input)) + } + + func test_read_int_after_incorrect_inputs() { + // Given + var fakeReadLine = StringReader(input: "a21") + let reader: UserInputReader = .init { _ in + fakeReadLine.readLine() + } + + // When + let result = reader.readInt(asking: "prompt", maxValueAllowed: 2) + + // Then + XCTAssertEqual(result, Int(String(fakeReadLine.input.last!))) + } +} + +// Custom string reader to simulate user input +private struct StringReader { + let input: String + var index: String.Index + + init(input: String) { + self.input = input + index = input.startIndex + } + + mutating func readLine() -> String? { + guard index < input.endIndex else { return nil } + defer { index = input.index(after: index) } + return String(input[index...]) + } +} diff --git a/docs/docs/guide/automation/run.md b/docs/docs/guide/automation/run.md index f061541a570..e6592117206 100644 --- a/docs/docs/guide/automation/run.md +++ b/docs/docs/guide/automation/run.md @@ -22,4 +22,4 @@ tuist run MyApp --device "iPhone 15" --os "17.4.1" ::: > [!NOTE] EXISTING SIMULATORS -> If Tuist can't find a destination that matches the specified device and OS, it will use the first available simulator. \ No newline at end of file +> If Tuist can't find a destination that matches the specified device and OS or none is provided, it will ask in which available simulator to run, in case of many available, or pick the only one available otherwise. From 38561debd970d5e10e7c15e58aea76ed5a3c3e72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Mon, 3 Jun 2024 10:31:27 +0200 Subject: [PATCH 327/509] Remove duplicities in the Graph model (#6350) --- .../SkipUITestsProjectMapper.swift | 2 +- .../Graph/CircularDependencyLinter.swift | 2 +- Sources/TuistCore/Graph/GraphLoader.swift | 7 +- Sources/TuistCore/Graph/GraphTraverser.swift | 43 +- .../Graph/Mappers/ProjectMapper.swift | 11 +- .../Graph/ModelExtensions/Project+Core.swift | 2 +- .../GraphTraverser/GraphTraversing.swift | 2 +- .../GraphTraverser/MockGraphTraverser.swift | 11 +- ...lProjectsPlatformNarrowerGraphMapper.swift | 27 +- ...runeOrphanExternalTargetsGraphMapper.swift | 12 +- .../Generator/InfoPlistContentProvider.swift | 2 +- .../Generator/KnownAssetTagsFetcher.swift | 8 +- .../ProjectDescriptorGenerator.swift | 4 +- .../Generator/ProjectFileElements.swift | 4 +- .../Generator/ProjectGroups.swift | 2 +- .../TuistGenerator/Linter/ProjectLinter.swift | 19 +- .../TuistGenerator/Linter/SchemeLinter.swift | 4 +- .../AutogeneratedSchemesProjectMapper.swift | 8 +- ...eratedWorkspaceSchemeWorkspaceMapper.swift | 4 +- .../ExplicitDependencyGraphMapper.swift | 2 +- .../GenerateEntitlementsProjectMapper.swift | 10 +- .../GenerateInfoPlistProjectMapper.swift | 10 +- ...GeneratePrivacyManifestProjectMapper.swift | 10 +- .../Mappers/ModuleMapMapper.swift | 13 +- .../Mappers/ResourcesProjectMapper.swift | 11 +- ...esizedResourceInterfaceProjectMapper.swift | 7 +- ...ctionDisableShowEnvVarsProjectMapper.swift | 2 +- Sources/TuistGraph/Graph/Graph.swift | 6 - Sources/TuistGraph/Models/Project.swift | 64 +- .../Graph/Graph+TestData.swift | 2 - .../Mappers/FocusTargetsGraphMappers.swift | 16 +- .../TreeShakePrunedTargetsGraphMapper.swift | 23 +- .../ProjectEditor/ProjectEditorMapper.swift | 6 +- .../ProjectAutomation+ManifestMapper.swift | 6 +- .../Graph/GraphLoaderTests.swift | 14 +- .../Graph/GraphTraverserTests.swift | 742 +++--------------- .../Graph/Mappers/ProjectMapperTests.swift | 4 +- ...ectsPlatformNarrowerGraphMapperTests.swift | 71 +- ...rphanExternalTargetsGraphMapperTests.swift | 22 +- .../Generator/BuildPhaseGeneratorTests.swift | 94 +-- .../Generator/ConfigGeneratorTests.swift | 30 +- .../Generator/LinkGeneratorTests.swift | 27 +- .../ProjectDescriptorGeneratorTests.swift | 25 +- .../Generator/ProjectFileElementsTests.swift | 5 - .../Generator/ProjectGroupsTests.swift | 28 +- .../SchemeDescriptorsGeneratorTests.swift | 253 +----- .../Generator/TargetGeneratorTests.swift | 10 +- .../WorkspaceDescriptorGeneratorTests.swift | 7 +- .../GraphViz/GraphToGraphVizMapperTests.swift | 52 +- .../Linter/GraphLinterTests.swift | 168 +--- .../Linter/ProjectLinterTests.swift | 13 - .../StaticProductsGraphLinterTests.swift | 185 +---- .../ExplicitDependencyGraphMapperTests.swift | 34 +- .../GenerateInfoPlistProjectMapperTests.swift | 2 +- .../ProjectMappers/ModuleMapMapperTests.swift | 34 - .../ResourcesProjectMapperTests.swift | 30 +- ...DisableShowEnvVarsProjectMapperTests.swift | 34 +- .../TuistGraphTests/Models/ProjectTests.swift | 8 - .../FocusTargetsGraphMappersTests.swift | 77 +- ...eeShakePrunedTargetsGraphMapperTests.swift | 27 +- .../ProjectEditorMapperTests.swift | 74 +- .../Loaders/ManifestModelConverterTests.swift | 4 +- 62 files changed, 515 insertions(+), 1921 deletions(-) diff --git a/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift b/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift index 9847efb46bf..63ec20df1eb 100644 --- a/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift +++ b/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift @@ -10,7 +10,7 @@ public final class SkipUITestsProjectMapper: ProjectMapping { logger.debug("Transforming project \(project.name): Pruning UI tests targets") var project = project - project.targets = project.targets.map { target in + project.targets = project.targets.mapValues { target in var copy = target if copy.product == .uiTests { copy.prune = true diff --git a/Sources/TuistCore/Graph/CircularDependencyLinter.swift b/Sources/TuistCore/Graph/CircularDependencyLinter.swift index 31810672805..fa77bec65c5 100644 --- a/Sources/TuistCore/Graph/CircularDependencyLinter.swift +++ b/Sources/TuistCore/Graph/CircularDependencyLinter.swift @@ -40,7 +40,7 @@ public class CircularDependencyLinter: CircularDependencyLinting { } cache.add(project: project) - for target in project.targets { + for target in project.targets.values.sorted() { try lintTarget( path: path, name: target.name, diff --git a/Sources/TuistCore/Graph/GraphLoader.swift b/Sources/TuistCore/Graph/GraphLoader.swift index e29133ae9c2..168752cba97 100644 --- a/Sources/TuistCore/Graph/GraphLoader.swift +++ b/Sources/TuistCore/Graph/GraphLoader.swift @@ -55,7 +55,6 @@ public final class GraphLoader: GraphLoading { workspace: updatedWorkspace, projects: cache.loadedProjects, packages: cache.packages, - targets: cache.loadedTargets, dependencies: cache.dependencies, dependencyConditions: cache.dependencyConditions ) @@ -76,7 +75,7 @@ public final class GraphLoader: GraphLoading { } cache.add(project: project) - for target in project.targets { + for target in project.targets.values { try loadTarget( path: path, name: target.name, @@ -322,9 +321,7 @@ public final class GraphLoader: GraphLoading { init(projects: [Project]) { let allProjects = Dictionary(uniqueKeysWithValues: projects.map { ($0.path, $0) }) - let allTargets = allProjects.mapValues { - Dictionary(uniqueKeysWithValues: $0.targets.map { ($0.name, $0) }) - } + let allTargets = allProjects.mapValues { $0.targets } self.allProjects = allProjects self.allTargets = allTargets } diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index f2d32a87257..425287ba0df 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -10,7 +10,14 @@ public class GraphTraverser: GraphTraversing { public var path: AbsolutePath { graph.path } public var workspace: Workspace { graph.workspace } public var projects: [AbsolutePath: Project] { graph.projects } - public var targets: [AbsolutePath: [String: Target]] { graph.targets } + + /// It returns the targets of the graph projects. + /// - Returns: A dictionary where the key is the path to the project, and the value are a dictionary where + /// the keys are the name of the targets, and the value the target representation. + public func targets() -> [AbsolutePath: [String: Target]] { + return projects.mapValues { $0.targets } + } + public var dependencies: [GraphDependency: Set] { graph.dependencies } private let graph: Graph @@ -80,7 +87,7 @@ public class GraphTraverser: GraphTraversing { public func targets(product: Product) -> Set { var filteredTargets: Set = Set() - for (path, projectTargets) in targets { + for (path, projectTargets) in targets() { projectTargets.values.forEach { target in guard target.product == product else { return } guard let project = projects[path] else { return } @@ -91,14 +98,14 @@ public class GraphTraverser: GraphTraversing { } public func target(path: AbsolutePath, name: String) -> GraphTarget? { - guard let project = graph.projects[path], let target = graph.targets[path]?[name] else { return nil } + guard let project = graph.projects[path], + let target = project.targets[name] else { return nil } return GraphTarget(path: path, target: target, project: project) } public func targets(at path: AbsolutePath) -> Set { guard let project = graph.projects[path] else { return Set() } - guard let targets = graph.targets[path] else { return [] } - return Set(targets.values.map { GraphTarget(path: path, target: $0, project: project) }) + return Set(project.targets.values.map { GraphTarget(path: path, target: $0, project: project) }) } public func testPlan(name: String) -> TestPlan? { @@ -146,7 +153,7 @@ public class GraphTraverser: GraphTraversing { for target: GraphDependency ) -> [GraphTargetReference] { dependencies.compactMap { dependencyName, dependencyPath -> GraphTargetReference? in - guard let projectDependencies = graph.targets[dependencyPath], + guard let projectDependencies = graph.projects[dependencyPath]?.targets, let dependencyTarget = projectDependencies[dependencyName], let dependencyProject = graph.projects[dependencyPath] else { @@ -159,7 +166,7 @@ public class GraphTraverser: GraphTraversing { } public func resourceBundleDependencies(path: AbsolutePath, name: String) -> Set { - guard let target = graph.targets[path]?[name] else { return [] } + guard let target = graph.projects[path]?.targets[name] else { return [] } guard target.supportsResources else { return [] } let canHostResources: (GraphDependency) -> Bool = { @@ -179,7 +186,7 @@ public class GraphTraverser: GraphTraversing { guard case let GraphDependency.target(name, path) = dependency else { return nil } - guard let target = graph.targets[path]?[name] else { return nil } + guard let target = graph.projects[path]?.targets[name] else { return nil } guard let project = graph.projects[path] else { return nil } return GraphTarget(path: path, target: target, project: project) } @@ -230,7 +237,7 @@ public class GraphTraverser: GraphTraversing { graph.dependencies[.target(name: name, path: path)]? .compactMap { (dependency: GraphDependency) -> GraphDependencyReference? in guard case let GraphDependency.target(dependencyName, dependencyPath) = dependency, - let target = graph.targets[dependencyPath]?[dependencyName], + let target = graph.projects[dependencyPath]?.targets[dependencyName], target.product.isStatic else { return nil @@ -548,8 +555,8 @@ public class GraphTraverser: GraphTraversing { } public func hostTargetFor(path: AbsolutePath, name: String) -> GraphTarget? { - guard let targets = graph.targets[path] else { return nil } guard let project = graph.projects[path] else { return nil } + let targets = project.targets return targets.values.compactMap { target -> GraphTarget? in let dependencies = self.graph.dependencies[.target(name: target.name, path: path), default: Set()] @@ -672,11 +679,9 @@ public class GraphTraverser: GraphTraversing { } public func allExternalTargets() -> Set { - Set(graph.projects.compactMap { path, project in - project.isExternal ? (path, project) : nil - }.flatMap { projectPath, project in - let targets = graph.targets[projectPath, default: [:]].values - return targets.map { GraphTarget(path: projectPath, target: $0, project: project) } + Set(graph.projects.flatMap { path, project -> [GraphTarget] in + guard project.isExternal else { return [] } + return project.targets.values.map { GraphTarget(path: path, target: $0, project: project) } }) } @@ -689,8 +694,8 @@ public class GraphTraverser: GraphTraversing { let allTargetExternalDependendedUponTargets = filterDependencies(from: graphDependenciesWithExternalDependencies) .compactMap { graphDependency -> GraphTarget? in if case let GraphDependency.target(name, path) = graphDependency { - guard let target = graph.targets[path]?[name], - let project = graph.projects[path] + guard let project = graph.projects[path], + let target = project.targets[name] else { return nil } @@ -1178,9 +1183,7 @@ public class GraphTraverser: GraphTraversing { private func allTargets(excludingExternalTargets: Bool) -> Set { Set(projects.flatMap { projectPath, project -> [GraphTarget] in if excludingExternalTargets, project.isExternal { return [] } - - let targets = graph.targets[projectPath, default: [:]] - return targets.values.map { target in + return project.targets.values.map { target in GraphTarget(path: projectPath, target: target, project: project) } }) diff --git a/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift b/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift index 6625c9097fa..d42433db8ac 100644 --- a/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift +++ b/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift @@ -31,12 +31,15 @@ public class TargetProjectMapper: ProjectMapping { } public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { - var results = (targets: [Target](), sideEffects: [SideEffectDescriptor]()) - results = try project.targets.reduce(into: results) { results, target in + var results = (targets: [String: Target](), sideEffects: [SideEffectDescriptor]()) + results = try project.targets.values.reduce(into: results) { results, target in let (updatedTarget, sideEffects) = try mapper.map(target: target) - results.targets.append(updatedTarget) + results.targets[updatedTarget.name] = updatedTarget results.sideEffects.append(contentsOf: sideEffects) } - return (project.with(targets: results.targets), results.sideEffects) + var project = project + project.targets = results.targets + + return (project, results.sideEffects) } } diff --git a/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift index 0158dd16f3a..1e4fb68f872 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift @@ -10,7 +10,7 @@ extension Project { /// - Parameter graph: Dependencies graph. /// - Returns: Sorted targets. public func sortedTargetsForProjectScheme(graph: Graph) -> [Target] { - targets.sorted { first, second -> Bool in + targets.values.sorted { first, second -> Bool in // First criteria: Test bundles at the end if first.product.testsBundle, !second.product.testsBundle { return false diff --git a/Sources/TuistCore/GraphTraverser/GraphTraversing.swift b/Sources/TuistCore/GraphTraverser/GraphTraversing.swift index 3fb3e236be5..78ab89b3f3f 100644 --- a/Sources/TuistCore/GraphTraverser/GraphTraversing.swift +++ b/Sources/TuistCore/GraphTraverser/GraphTraversing.swift @@ -22,7 +22,7 @@ public protocol GraphTraversing { var projects: [AbsolutePath: Project] { get } /// Returns all the targets of the graph. - var targets: [AbsolutePath: [String: Target]] { get } + func targets() -> [AbsolutePath: [String: Target]] /// Dependencies. var dependencies: [GraphDependency: Set] { get } diff --git a/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift b/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift index e77d81ec2d6..5d33013e964 100644 --- a/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift +++ b/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift @@ -65,13 +65,12 @@ final class MockGraphTraverser: GraphTraversing { return stubbedProjects } - var invokedTargetsGetter = false - var invokedTargetsGetterCount = 0 + var invokedTargets = false + var invokedTargetsCount = 0 var stubbedTargets: [AbsolutePath: [String: Target]]! = [:] - - var targets: [AbsolutePath: [String: Target]] { - invokedTargetsGetter = true - invokedTargetsGetterCount += 1 + func targets() -> [TSCBasic.AbsolutePath: [String: TuistGraph.Target]] { + invokedTargets = true + invokedTargetsCount += 1 return stubbedTargets } diff --git a/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift b/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift index dace8c59836..05a707b2a30 100644 --- a/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift +++ b/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift @@ -23,27 +23,16 @@ public struct ExternalProjectsPlatformNarrowerGraphMapper: GraphMapping { // swi var graph = graph let externalTargetSupportedPlatforms = GraphTraverser(graph: graph).externalTargetSupportedPlatforms() - graph.targets = Dictionary(uniqueKeysWithValues: graph.targets.map { projectPath, projectTargets in - let project = graph.projects[projectPath]! - let projectTargets = Dictionary(uniqueKeysWithValues: projectTargets.map { targetName, target in - ( - targetName, - mapTarget( - target: target, - project: project, - externalTargetSupportedPlatforms: externalTargetSupportedPlatforms - ) - ) - }) - return (projectPath, projectTargets) - }) graph.projects = Dictionary(uniqueKeysWithValues: graph.projects.map { projectPath, project in var project = project - project.targets = project.targets.map { mapTarget( - target: $0, - project: project, - externalTargetSupportedPlatforms: externalTargetSupportedPlatforms - ) } + project.targets = Dictionary(uniqueKeysWithValues: project.targets.map { _, target in + let mappedTarget = mapTarget( + target: target, + project: project, + externalTargetSupportedPlatforms: externalTargetSupportedPlatforms + ) + return (mappedTarget.name, mappedTarget) + }) return (projectPath, project) }) diff --git a/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift b/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift index 89a098ff0dd..c965d48d155 100644 --- a/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift +++ b/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift @@ -17,19 +17,19 @@ public struct PruneOrphanExternalTargetsGraphMapper: GraphMapping { let orphanExternalTargets = graphTraverser.allOrphanExternalTargets() var graph = graph - graph.targets = Dictionary(uniqueKeysWithValues: graph.targets.map { projectPath, targets in - let targets = Dictionary(uniqueKeysWithValues: targets.compactMap { targetName, target -> (String, Target)? in + + graph.projects = Dictionary(uniqueKeysWithValues: graph.projects.map { projectPath, project in + var project = project + project.targets = Dictionary(uniqueKeysWithValues: project.targets.compactMap { _, target -> (String, Target)? in let project = graph.projects[projectPath]! let graphTarget = GraphTarget(path: projectPath, target: target, project: project) var target = target if orphanExternalTargets.contains(graphTarget) || target.destinations.isEmpty { target.prune = true - return (targetName, target) - } else { - return (targetName, target) } + return (target.name, target) }) - return (projectPath, targets) + return (projectPath, project) }) return (graph, []) diff --git a/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift b/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift index c1fd7dd9275..8ddd7377116 100644 --- a/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift +++ b/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift @@ -242,7 +242,7 @@ final class InfoPlistContentProvider: InfoPlistContentProviding { } private func hostTarget(for target: Target, in project: Project) -> Target? { - project.targets.first { + project.targets.values.first { $0.dependencies.contains(where: { dependency in if case let .target(name, _) = dependency, name == target.name { return true diff --git a/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift b/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift index 358f22fadac..c7f953d0b85 100644 --- a/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift +++ b/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift @@ -20,13 +20,13 @@ protocol KnownAssetTagsFetching: AnyObject { final class KnownAssetTagsFetcher: KnownAssetTagsFetching { func fetch(project: Project) throws -> [String] { - var tags = project.targets.map { $0.resources.resources.map(\.tags).flatMap { $0 } }.flatMap { $0 } + var tags = project.targets.values.map { $0.resources.resources.map(\.tags).flatMap { $0 } }.flatMap { $0 } - let initialInstallTags = project.targets.compactMap { + let initialInstallTags = project.targets.values.compactMap { $0.onDemandResourcesTags?.initialInstall?.compactMap { $0 } }.flatMap { $0 } - let prefetchOrderTags = project.targets.compactMap { + let prefetchOrderTags = project.targets.values.compactMap { $0.onDemandResourcesTags?.prefetchOrder?.compactMap { $0 } }.flatMap { $0 } @@ -35,7 +35,7 @@ final class KnownAssetTagsFetcher: KnownAssetTagsFetching { var assetContentsPaths: Set = [] let decoder = JSONDecoder() - for target in project.targets { + for target in project.targets.values { let assetCatalogs = target.resources.resources.filter { $0.path.extension == "xcassets" } for assetCatalog in assetCatalogs { guard let children = try? assetCatalog.path.path.recursiveChildren() else { continue } diff --git a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift index 8fa3ea47e9f..44f1a5c7819 100644 --- a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift @@ -204,7 +204,7 @@ final class ProjectDescriptorGenerator: ProjectDescriptorGenerating { graphTraverser: GraphTraversing ) throws -> [String: PBXNativeTarget] { var nativeTargets: [String: PBXNativeTarget] = [:] - for target in project.targets { + for target in project.targets.values { let nativeTarget = try targetGenerator.generateTarget( target: target, project: project, @@ -221,7 +221,7 @@ final class ProjectDescriptorGenerator: ProjectDescriptorGenerating { /// Target dependencies try targetGenerator.generateTargetDependencies( path: project.path, - targets: project.targets, + targets: Array(project.targets.values), nativeTargets: nativeTargets, graphTraverser: graphTraverser ) diff --git a/Sources/TuistGenerator/Generator/ProjectFileElements.swift b/Sources/TuistGenerator/Generator/ProjectFileElements.swift index e2ac660c71c..b7e9414514e 100644 --- a/Sources/TuistGenerator/Generator/ProjectFileElements.swift +++ b/Sources/TuistGenerator/Generator/ProjectFileElements.swift @@ -60,7 +60,7 @@ class ProjectFileElements { ) throws { var files = Set() - for target in project.targets { + for target in project.targets.values { try files.formUnion(targetFiles(target: target)) } let projectFileElements = projectFiles(project: project) @@ -79,7 +79,7 @@ class ProjectFileElements { ) // Products - let directProducts = project.targets.map { + let directProducts = project.targets.values.map { GraphDependencyReference.product(target: $0.name, productName: $0.productNameWithExtension, condition: nil) } diff --git a/Sources/TuistGenerator/Generator/ProjectGroups.swift b/Sources/TuistGenerator/Generator/ProjectGroups.swift index e0992a7dc6f..d6d8792207a 100644 --- a/Sources/TuistGenerator/Generator/ProjectGroups.swift +++ b/Sources/TuistGenerator/Generator/ProjectGroups.swift @@ -143,7 +143,7 @@ class ProjectGroups { } private static func extractProjectGroupNames(from project: Project) -> [String] { - let groups = [project.filesGroup] + project.targets.map(\.filesGroup) + let groups = [project.filesGroup] + project.targets.values.map(\.filesGroup) let groupNames: [String] = groups.compactMap { switch $0 { case let .group(name: groupName): diff --git a/Sources/TuistGenerator/Linter/ProjectLinter.swift b/Sources/TuistGenerator/Linter/ProjectLinter.swift index ad3cca9f9df..ab061abe2b7 100644 --- a/Sources/TuistGenerator/Linter/ProjectLinter.swift +++ b/Sources/TuistGenerator/Linter/ProjectLinter.swift @@ -49,24 +49,7 @@ class ProjectLinter: ProjectLinting { private func lintTargets(project: Project) -> [LintingIssue] { var issues: [LintingIssue] = [] - issues.append(contentsOf: project.targets.flatMap(targetLinter.lint)) - issues.append(contentsOf: lintNotDuplicatedTargets(project: project)) - return issues - } - - private func lintNotDuplicatedTargets(project: Project) -> [LintingIssue] { - var issues: [LintingIssue] = [] - let duplicatedTargets = project.targets.map(\.name) - .reduce(into: [String: Int]()) { $0[$1] = ($0[$1] ?? 0) + 1 } - .filter { $0.value > 1 } - .keys - if !duplicatedTargets.isEmpty { - let issue = LintingIssue( - reason: "Targets \(duplicatedTargets.joined(separator: ", ")) from project at \(project.path.pathString) have duplicates.", - severity: .error - ) - issues.append(issue) - } + issues.append(contentsOf: project.targets.values.flatMap(targetLinter.lint)) return issues } } diff --git a/Sources/TuistGenerator/Linter/SchemeLinter.swift b/Sources/TuistGenerator/Linter/SchemeLinter.swift index d7acef39cc0..8d7b8e5200e 100644 --- a/Sources/TuistGenerator/Linter/SchemeLinter.swift +++ b/Sources/TuistGenerator/Linter/SchemeLinter.swift @@ -11,8 +11,8 @@ class SchemeLinter: SchemeLinting { func lint(project: Project) -> [LintingIssue] { var issues = [LintingIssue]() issues.append(contentsOf: lintReferencedBuildConfigurations(schemes: project.schemes, settings: project.settings)) - issues.append(contentsOf: lintCodeCoverageTargets(schemes: project.schemes, targets: project.targets)) - issues.append(contentsOf: lintExpandVariableTarget(schemes: project.schemes, targets: project.targets)) + issues.append(contentsOf: lintCodeCoverageTargets(schemes: project.schemes, targets: Array(project.targets.values))) + issues.append(contentsOf: lintExpandVariableTarget(schemes: project.schemes, targets: Array(project.targets.values))) issues.append(contentsOf: projectSchemeCantReferenceRemoteTargets(schemes: project.schemes, project: project)) return issues } diff --git a/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift b/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift index e7f717e1787..560ed66ae16 100644 --- a/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift @@ -22,7 +22,7 @@ public final class AutogeneratedSchemesProjectMapper: ProjectMapping { // swiftl var buildTargets: Set = [] var testTargets: Set = [] var runTargets: Set = [] - for target in project.targets { + for target in project.targets.values { switch target.product { case .app, .appClip, .commandLineTool, .watch2App, .xpc: runTargets.insert(target) @@ -108,7 +108,9 @@ public final class AutogeneratedSchemesProjectMapper: ProjectMapping { // swiftl } let filteredAutogeneratedSchemes = autogeneratedSchemes.filter { !userDefinedSchemeNames.contains($0.name) } - return (project.with(schemes: (userDefinedSchemes + filteredAutogeneratedSchemes).sorted { $0.name < $1.name }), []) + var project = project + project.schemes = (userDefinedSchemes + filteredAutogeneratedSchemes).sorted { $0.name < $1.name } + return (project, []) } // MARK: - Private @@ -317,6 +319,7 @@ public final class AutogeneratedSchemesProjectMapper: ProjectMapping { // swiftl private func hostAppTargetReference(for target: Target, project: Project) -> Target? { project.targets + .values .filter { $0.product.canHostTests() && $0.dependencies.contains(where: { dependency in if case let .target(name, _) = dependency, name == target.name { return true @@ -330,6 +333,7 @@ public final class AutogeneratedSchemesProjectMapper: ProjectMapping { // swiftl private func hostWatchAppTargetReference(for target: Target, project: Project) -> Target? { project.targets + .values .filter { $0.product == .watch2App && $0.dependencies.contains(where: { dependency in if case let .target(name, _) = dependency, name == target.name { return true diff --git a/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift b/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift index f2568e67eaa..6bb0c83e775 100644 --- a/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift +++ b/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift @@ -23,7 +23,7 @@ public final class AutogeneratedWorkspaceSchemeWorkspaceMapper: WorkspaceMapping let platforms = Set( workspace.projects .flatMap { - $0.targets.flatMap(\.supportedPlatforms) + $0.targets.values.flatMap(\.supportedPlatforms) } ) @@ -55,9 +55,11 @@ public final class AutogeneratedWorkspaceSchemeWorkspaceMapper: WorkspaceMapping var (targets, testableTargets): ([TargetReference], [TestableTarget]) = workspace.projects .reduce(([], [])) { result, project in let targets = project.targets + .values .filter { !$0.supportedPlatforms.isDisjoint(with: platforms) } .map { TargetReference(projectPath: project.path, name: $0.name) } let testableTargets = project.targets + .values .filter { !$0.supportedPlatforms.isDisjoint(with: platforms) } .filter(\.product.testsBundle) .map { TargetReference(projectPath: project.path, name: $0.name) } diff --git a/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift b/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift index 01291ef3ddc..ff28c933b54 100644 --- a/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift +++ b/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift @@ -23,7 +23,7 @@ public struct ExplicitDependencyGraphMapper: GraphMapping { graph.projects = Dictionary(uniqueKeysWithValues: graph.projects.map { projectPath, project in var project = project - project.targets = project.targets.map { target in + project.targets = project.targets.mapValues { target in let graphTarget = GraphTarget(path: projectPath, target: target, project: project) let projectDebugConfigurations = project.settings.configurations.keys .filter { $0.variant == .debug } diff --git a/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift b/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift index f0397f84add..7b60e899086 100644 --- a/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift @@ -23,14 +23,16 @@ public final class GenerateEntitlementsProjectMapper: ProjectMapping { public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { logger.debug("Transforming project \(project.name): Synthesizing entitlement files'") - let results = try project.targets - .reduce(into: (targets: [Target](), sideEffects: [SideEffectDescriptor]())) { results, target in + let results = try project.targets.values + .reduce(into: (targets: [String: Target](), sideEffects: [SideEffectDescriptor]())) { results, target in let (updatedTarget, sideEffects) = try map(target: target, project: project) - results.targets.append(updatedTarget) + results.targets[updatedTarget.name] = updatedTarget results.sideEffects.append(contentsOf: sideEffects) } + var project = project + project.targets = results.targets - return (project.with(targets: results.targets), results.sideEffects) + return (project, results.sideEffects) } // MARK: - Private diff --git a/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift b/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift index a23b61f25e9..f6e368066e8 100644 --- a/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift @@ -37,14 +37,16 @@ public final class GenerateInfoPlistProjectMapper: ProjectMapping { public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { logger.debug("Transforming project \(project.name): Synthesizing Info.plist") - let results = try project.targets - .reduce(into: (targets: [Target](), sideEffects: [SideEffectDescriptor]())) { results, target in + let results = try project.targets.values + .reduce(into: (targets: [String: Target](), sideEffects: [SideEffectDescriptor]())) { results, target in let (updatedTarget, sideEffects) = try map(target: target, project: project) - results.targets.append(updatedTarget) + results.targets[updatedTarget.name] = updatedTarget results.sideEffects.append(contentsOf: sideEffects) } + var project = project + project.targets = results.targets - return (project.with(targets: results.targets), results.sideEffects) + return (project, results.sideEffects) } // MARK: - Private diff --git a/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift b/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift index 5c2832e9e6a..fa2350c86ed 100644 --- a/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift @@ -14,14 +14,16 @@ public final class GeneratePrivacyManifestProjectMapper: ProjectMapping { public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { logger.debug("Transforming project \(project.name): Synthesizing privacy manifest files'") - let results = try project.targets - .reduce(into: (targets: [Target](), sideEffects: [SideEffectDescriptor]())) { results, target in + let results = try project.targets.values + .reduce(into: (targets: [String: Target](), sideEffects: [SideEffectDescriptor]())) { results, target in let (updatedTarget, sideEffects) = try map(target: target, project: project) - results.targets.append(updatedTarget) + results.targets[updatedTarget.name] = updatedTarget results.sideEffects.append(contentsOf: sideEffects) } + var project = project + project.targets = results.targets - return (project.with(targets: results.targets), results.sideEffects) + return (project, results.sideEffects) } // MARK: - Private diff --git a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift index 436be1f472d..3a6cbbb0e09 100644 --- a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift +++ b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift @@ -46,12 +46,13 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ graph.projects = Dictionary(uniqueKeysWithValues: graph.projects.map { projectPath, project in var project = project - project.targets = project.targets.map { target in + project.targets = Dictionary(uniqueKeysWithValues: project.targets.map { targetName, target in var target = target let targetID = TargetID(projectPath: project.path, targetName: target.name) var mappedSettingsDictionary = target.settings?.base ?? [:] let hasModuleMap = mappedSettingsDictionary[Self.modulemapFileSetting] != nil - guard hasModuleMap || !(targetToDependenciesMetadata[targetID]?.isEmpty ?? true) else { return target } + guard hasModuleMap || !(targetToDependenciesMetadata[targetID]?.isEmpty ?? true) + else { return (targetName, target) } if hasModuleMap { mappedSettingsDictionary[Self.modulemapFileSetting] = nil @@ -88,10 +89,8 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ ) target.settings = targetSettings.with(base: mappedSettingsDictionary) - graph.targets[project.path]?[target.name] = target - - return target - } + return (target.name, target) + }) return (projectPath, project) }) @@ -105,7 +104,7 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ var targetsByName = [String: Target]() for project in workspace.projects { projectsByPath[project.path] = project - for target in project.targets { + for target in project.targets.values { targetsByName[target.name] = target } } diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 4b3a2e5f74d..17515e69727 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -18,15 +18,18 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this logger.debug("Transforming project \(project.name): Generating bundles for libraries'") var sideEffects: [SideEffectDescriptor] = [] - var targets: [Target] = [] + var targets: [String: Target] = [:] - for target in project.targets { + for target in project.targets.values { let (mappedTargets, targetSideEffects) = try mapTarget(target, project: project) - targets.append(contentsOf: mappedTargets) + mappedTargets.forEach { targets[$0.name] = $0 } sideEffects.append(contentsOf: targetSideEffects) } - return (project.with(targets: targets), sideEffects) + var project = project + project.targets = targets + + return (project, sideEffects) } // swiftlint:disable:next function_body_length diff --git a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift index 3f7ae196643..2f3ca031664 100644 --- a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift @@ -52,13 +52,14 @@ public final class SynthesizedResourceInterfaceProjectMapper: ProjectMapping { / } logger.debug("Transforming project \(project.name): Synthesizing resource accessors") - let mappings = try project.targets + let mappings = try project.targets.values .map { try mapTarget($0, project: project) } let targets: [Target] = mappings.map(\.0) let sideEffects: [SideEffectDescriptor] = mappings.map(\.1).flatMap { $0 } - - return (project.with(targets: targets), sideEffects) + var project = project + project.targets = Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) }) + return (project, sideEffects) } // MARK: - Helpers diff --git a/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift b/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift index bef806223c3..b1dfbdac6e8 100644 --- a/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift @@ -13,7 +13,7 @@ public final class TargetActionDisableShowEnvVarsProjectMapper: ProjectMapping { ) var project = project - project.targets = project.targets.map { target in + project.targets = project.targets.mapValues { target in var mappedTarget = target mappedTarget.scripts = mappedTarget.scripts.map { var script = $0 diff --git a/Sources/TuistGraph/Graph/Graph.swift b/Sources/TuistGraph/Graph/Graph.swift index 6799d08f636..a14981d639d 100644 --- a/Sources/TuistGraph/Graph/Graph.swift +++ b/Sources/TuistGraph/Graph/Graph.swift @@ -20,10 +20,6 @@ public struct Graph: Equatable, Codable { /// and the values are dictionaries where the key is the reference to the package, and the values are the packages. public var packages: [AbsolutePath: [String: Package]] - /// A dictionary where the keys are paths to the directories where the projects that contain targets are defined, - /// and the values are dictionaries where the key is the name of the target, and the values are the targets. - public var targets: [AbsolutePath: [String: Target]] - /// A dictionary that contains the one-to-many dependencies that represent the graph. public var dependencies: [GraphDependency: Set] @@ -36,7 +32,6 @@ public struct Graph: Equatable, Codable { workspace: Workspace, projects: [AbsolutePath: Project], packages: [AbsolutePath: [String: Package]], - targets: [AbsolutePath: [String: Target]], dependencies: [GraphDependency: Set], dependencyConditions: [GraphEdge: PlatformCondition] ) { @@ -45,7 +40,6 @@ public struct Graph: Equatable, Codable { self.workspace = workspace self.projects = projects self.packages = packages - self.targets = targets self.dependencies = dependencies self.dependencyConditions = dependencyConditions } diff --git a/Sources/TuistGraph/Models/Project.swift b/Sources/TuistGraph/Models/Project.swift index eff2f35f510..078b184b2a3 100644 --- a/Sources/TuistGraph/Models/Project.swift +++ b/Sources/TuistGraph/Models/Project.swift @@ -18,19 +18,19 @@ public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebug public var name: String /// Organization name. - public let organizationName: String? + public var organizationName: String? /// Default known regions - public let defaultKnownRegions: [String]? + public var defaultKnownRegions: [String]? /// Development region code e.g. `en`. - public let developmentRegion: String? + public var developmentRegion: String? /// Additional project options. public var options: Options /// Project targets. - public var targets: [Target] + public var targets: [String: Target] /// Project swift packages. public var packages: [Package] @@ -51,13 +51,13 @@ public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebug public var ideTemplateMacros: IDETemplateMacros? /// `ResourceSynthesizers` that will be applied on individual target's resources - public let resourceSynthesizers: [ResourceSynthesizer] + public var resourceSynthesizers: [ResourceSynthesizer] /// The version in which a check happened related to recommended settings after updating Xcode. public var lastUpgradeCheck: Version? /// Indicates whether the project is imported through `Package.swift`. - public let isExternal: Bool + public var isExternal: Bool // MARK: - Init @@ -111,7 +111,7 @@ public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebug self.defaultKnownRegions = defaultKnownRegions self.developmentRegion = developmentRegion self.options = options - self.targets = targets + self.targets = Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) }) self.packages = packages self.schemes = schemes self.settings = settings @@ -143,56 +143,6 @@ public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebug // MARK: - Public - /// Returns a copy of the project with the given targets set. - /// - Parameter targets: Targets to be set to the copy. - public func with(targets: [Target]) -> Project { - Project( - path: path, - sourceRootPath: sourceRootPath, - xcodeProjPath: xcodeProjPath, - name: name, - organizationName: organizationName, - defaultKnownRegions: defaultKnownRegions, - developmentRegion: developmentRegion, - options: options, - settings: settings, - filesGroup: filesGroup, - targets: targets, - packages: packages, - schemes: schemes, - ideTemplateMacros: ideTemplateMacros, - additionalFiles: additionalFiles, - resourceSynthesizers: resourceSynthesizers, - lastUpgradeCheck: lastUpgradeCheck, - isExternal: isExternal - ) - } - - /// Returns a copy of the project with the given schemes set. - /// - Parameter schemes: Schemes to be set to the copy. - public func with(schemes: [Scheme]) -> Project { - Project( - path: path, - sourceRootPath: sourceRootPath, - xcodeProjPath: xcodeProjPath, - name: name, - organizationName: organizationName, - defaultKnownRegions: defaultKnownRegions, - developmentRegion: developmentRegion, - options: options, - settings: settings, - filesGroup: filesGroup, - targets: targets, - packages: packages, - schemes: schemes, - ideTemplateMacros: ideTemplateMacros, - additionalFiles: additionalFiles, - resourceSynthesizers: resourceSynthesizers, - lastUpgradeCheck: lastUpgradeCheck, - isExternal: isExternal - ) - } - /// Returns the name of the default configuration. public var defaultDebugBuildConfigurationName: String { let debugConfiguration = settings.defaultDebugBuildConfiguration() diff --git a/Sources/TuistGraphTesting/Graph/Graph+TestData.swift b/Sources/TuistGraphTesting/Graph/Graph+TestData.swift index 4733127da21..e4ada3bffa7 100644 --- a/Sources/TuistGraphTesting/Graph/Graph+TestData.swift +++ b/Sources/TuistGraphTesting/Graph/Graph+TestData.swift @@ -9,7 +9,6 @@ extension Graph { workspace: Workspace = .test(), projects: [AbsolutePath: Project] = [:], packages: [AbsolutePath: [String: Package]] = [:], - targets: [AbsolutePath: [String: Target]] = [:], dependencies: [GraphDependency: Set] = [:], dependencyConditions: [GraphEdge: PlatformCondition] = [:] ) -> Graph { @@ -19,7 +18,6 @@ extension Graph { workspace: workspace, projects: projects, packages: packages, - targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) diff --git a/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift b/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift index 15f75e3dcbe..a2f788a211e 100644 --- a/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift +++ b/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift @@ -61,11 +61,19 @@ public final class FocusTargetsGraphMappers: GraphMapping { successors: { Array(graphTraverser.directTargetDependencies(path: $0.path, name: $0.target.name)).map(\.graphTarget) } )) - for graphTarget in graphTraverser.allTargets() where !filteredTargets.contains(graphTarget) { - var target = graphTarget.target - target.prune = true - graph.targets[graphTarget.path]?[target.name] = target + graph.projects = graph.projects.mapValues { project in + var project = project + project.targets = project.targets.mapValues { target in + var target = target + if !filteredTargets.contains(GraphTarget(path: project.path, target: target, project: project)) { + target.prune = true + } + return target + } + + return project } + return (graph, []) } } diff --git a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift index 969f030bd76..06c1a7fb7f7 100644 --- a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift +++ b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift @@ -8,20 +8,19 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { public func map(graph: Graph) throws -> (Graph, [SideEffectDescriptor]) { logger.debug("Transforming graph \(graph.name): Tree-shaking nodes") - let sourceTargets: Set = Set(graph.targets.flatMap { projectPath, targets -> [TargetReference] in - guard graph.projects[projectPath] != nil else { return [] } - return targets.compactMap { _, target -> TargetReference? in + let sourceTargets: Set = Set(graph.projects.flatMap { projectPath, project -> [TargetReference] in + return project.targets.compactMap { _, target -> TargetReference? in if target.prune { return nil } return TargetReference(projectPath: projectPath, name: target.name) } }) // If the number of source targets matches the number of targets in the graph there's nothing to be pruned. - if sourceTargets.count == graph.targets.flatMap(\.value.values).count { return (graph, []) } + if sourceTargets.count == graph.projects.values.flatMap(\.targets.values).count { return (graph, []) } let projects = graph.projects.reduce(into: [AbsolutePath: Project]()) { acc, next in let targets = self.treeShake( - targets: next.value.targets, + targets: Array(next.value.targets.values), path: next.key, graph: graph, sourceTargets: sourceTargets @@ -33,7 +32,10 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { schemes: next.value.schemes, sourceTargets: sourceTargets ) - acc[next.key] = next.value.with(targets: targets).with(schemes: schemes) + var project = next.value + project.schemes = schemes + project.targets = Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) }) + acc[next.key] = project } } @@ -46,13 +48,6 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { var graph = graph graph.workspace = workspace graph.projects = projects - graph.targets = sourceTargets.reduce(into: [AbsolutePath: [String: Target]]()) { acc, targetReference in - var targets = acc[targetReference.projectPath, default: [:]] - if let target = graph.targets[targetReference.projectPath, default: [:]][targetReference.name] { - targets[target.name] = target - } - acc[targetReference.projectPath] = targets - } return (graph, []) } @@ -72,7 +67,7 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { sourceTargets: Set ) -> [Target] { targets.compactMap { target -> Target? in - guard let target = graph.targets[path, default: [:]][target.name] else { return nil } + guard let target = graph.projects[path]?.targets[target.name] else { return nil } let targetReference = TargetReference(projectPath: path, name: target.name) guard sourceTargets.contains(targetReference) else { return nil } return target diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift index 6a1355c48c6..7f2e9c95b4a 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift @@ -103,12 +103,11 @@ final class ProjectEditorMapper: ProjectEditorMapping { let graphTargets = projects .lazy .map { ($0.path, $0.targets) } - .map { path, targets in (path, Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) })) } let graphDependencies = projects .lazy .flatMap { project -> [(GraphDependency, Set)] in - let graphDependencies = project.targets.map(\.dependencies).lazy.map { dependencies in + let graphDependencies = project.targets.values.map(\.dependencies).lazy.map { dependencies in dependencies.lazy.compactMap { dependency -> GraphDependency? in switch dependency { case let .target(name, _): @@ -123,7 +122,7 @@ final class ProjectEditorMapper: ProjectEditorMapping { } } - return zip(project.targets, graphDependencies).map { target, dependencies in + return zip(project.targets.values, graphDependencies).map { target, dependencies in (GraphDependency.target(name: target.name, path: project.path), Set(dependencies)) } } @@ -134,7 +133,6 @@ final class ProjectEditorMapper: ProjectEditorMapping { workspace: workspace, projects: graphProjects, packages: [:], - targets: Dictionary(uniqueKeysWithValues: graphTargets), dependencies: Dictionary(uniqueKeysWithValues: graphDependencies), dependencyConditions: [:] ) diff --git a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift index 8215a0d48ed..b61600cbbac 100644 --- a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift +++ b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift @@ -37,14 +37,16 @@ extension ProjectAutomation.Project { let packages = project.packages .reduce(into: [ProjectAutomation.Package]()) { $0.append(ProjectAutomation.Package.from($1)) } let schemes = project.schemes.reduce(into: [ProjectAutomation.Scheme]()) { $0.append(ProjectAutomation.Scheme.from($1)) } - let targets = project.targets.reduce(into: [ProjectAutomation.Target]()) { $0.append(ProjectAutomation.Target.from($1)) } + let targets = project.targets.mapValues { target in + ProjectAutomation.Target.from(target) + } return ProjectAutomation.Project( name: project.name, path: project.path.pathString, isExternal: project.isExternal, packages: packages, - targets: targets, + targets: Array(targets.values), schemes: schemes ) } diff --git a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift index a3bbe0fc400..3b1651e1e3c 100644 --- a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift @@ -45,7 +45,7 @@ final class GraphLoaderTests: TuistUnitTestCase { XCTAssertEqual(graph.projects, [ "/A": projectA, ]) - XCTAssertTrue(graph.targets.isEmpty) + XCTAssertTrue(graph.projects.values.flatMap(\.targets).isEmpty) XCTAssertTrue(graph.dependencies.isEmpty) } @@ -71,7 +71,7 @@ final class GraphLoaderTests: TuistUnitTestCase { "/A": projectA, "/B": projectB, ]) - XCTAssertTrue(graph.targets.isEmpty) + XCTAssertTrue(graph.projects.values.flatMap(\.targets).isEmpty) XCTAssertTrue(graph.dependencies.isEmpty) } @@ -99,10 +99,6 @@ final class GraphLoaderTests: TuistUnitTestCase { "/A": projectA, "/B": projectB, ]) - XCTAssertEqual(graph.targets, [ - "/A": ["A": targetA], - "/B": ["B": targetB], - ]) XCTAssertEqual(graph.dependencies, [ .target(name: "A", path: "/A"): Set([ .target(name: "B", path: "/B"), @@ -132,7 +128,7 @@ final class GraphLoaderTests: TuistUnitTestCase { XCTAssertEqual(graph.projects, [ "/A": projectA, ]) - XCTAssertTrue(graph.targets.isEmpty) + XCTAssertTrue(graph.projects.values.flatMap(\.targets).isEmpty) XCTAssertTrue(graph.dependencies.isEmpty) } @@ -159,10 +155,6 @@ final class GraphLoaderTests: TuistUnitTestCase { "/A": projectA, "/B": projectB, ]) - XCTAssertEqual(graph.targets, [ - "/A": ["A": targetA], - "/B": ["B": targetB], - ]) XCTAssertEqual(graph.dependencies, [ .target(name: "A", path: "/A"): Set([ .target(name: "B", path: "/B"), diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index d43524857eb..57948670a0b 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -11,22 +11,18 @@ import XCTest final class GraphTraverserTests: TuistUnitTestCase { func test_dependsOnXCTest_when_is_framework() { // Given - let project = Project.test() + let target = Target.test( + name: "Framework", + product: .framework + ) + let project = Project.test(targets: [target]) let frameworkTarget = GraphTarget.test( path: project.path, - target: Target.test( - name: "Framework", - product: .framework - ) + target: target ) let graph = Graph.test( projects: [ project.path: project, - ], - targets: [ - project.path: [ - frameworkTarget.target.name: frameworkTarget.target, - ], ] ) let subject = GraphTraverser(graph: graph) @@ -40,22 +36,18 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_dependsOnXCTest_when_is_tests_bundle() { // Given - let project = Project.test() + let target = Target.test( + name: "UnitTests", + product: .unitTests + ) + let project = Project.test(targets: [target]) let unitTestsTarget = GraphTarget.test( path: project.path, - target: Target.test( - name: "UnitTests", - product: .unitTests - ) + target: target ) let graph = Graph.test( projects: [ project.path: project, - ], - targets: [ - project.path: [ - unitTestsTarget.target.name: unitTestsTarget.target, - ], ] ) let subject = GraphTraverser(graph: graph) @@ -69,23 +61,19 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_dependsOnXCTest_when_direct_dependency_is_XCTest_SDK() { // Given - let project = Project.test() + let target = Target.test( + name: "Framework", + product: .framework + ) + let project = Project.test(targets: [target]) let frameworkTarget = GraphTarget.test( path: project.path, - target: Target.test( - name: "Framework", - product: .framework - ) + target: target ) let graph = Graph.test( projects: [ project.path: project, ], - targets: [ - project.path: [ - frameworkTarget.target.name: frameworkTarget.target, - ], - ], dependencies: [ .target(name: frameworkTarget.target.name, path: project.path): [ .testSDK(name: "XCTest.framework"), @@ -103,25 +91,21 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_dependsOnXCTest_when_settings_enables_search_paths() { // Given - let project = Project.test() + let target = Target.test( + name: "Framework", + product: .framework, + settings: .test(base: [ + "ENABLE_TESTING_SEARCH_PATHS": "YES", + ]) + ) + let project = Project.test(targets: [target]) let frameworkTarget = GraphTarget.test( path: project.path, - target: Target.test( - name: "Framework", - product: .framework, - settings: .test(base: [ - "ENABLE_TESTING_SEARCH_PATHS": "YES", - ]) - ) + target: target ) let graph = Graph.test( projects: [ project.path: project, - ], - targets: [ - project.path: [ - frameworkTarget.target.name: frameworkTarget.target, - ], ] ) let subject = GraphTraverser(graph: graph) @@ -138,15 +122,12 @@ final class GraphTraverserTests: TuistUnitTestCase { let path = AbsolutePath.root let app = Target.test(name: "App", product: .app) let framework = Target.test(name: "Framework", product: .framework) - let project = Project.test(path: path) + let project = Project.test(path: path, targets: [app, framework]) // Given: Value Graph let graph = Graph.test( path: path, - projects: [path: project], - targets: [ - "/": ["App": app, "Framework": framework], - ] + projects: [path: project] ) let subject = GraphTraverser(graph: graph) @@ -161,16 +142,13 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let path = AbsolutePath.root let app = Target.test(name: "App", product: .app) - let project = Project.test(path: path) let framework = Target.test(name: "Framework", product: .framework) + let project = Project.test(path: path, targets: [app, framework]) // When: Value Graph let graph = Graph.test( path: path, - projects: [path: project], - targets: [ - path: ["App": app, "Framework": framework], - ] + projects: [path: project] ) let subject = GraphTraverser(graph: graph) @@ -183,17 +161,10 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_directStaticDependencies() { // Given - let project = Project.test() let path = AbsolutePath.root let framework = Target.test(name: "Framework", product: .framework) let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary) - let targets: [AbsolutePath: [String: Target]] = [ - path: [ - framework.name: framework, - staticLibrary.name: staticLibrary, - ], - ] - + let project = Project.test(targets: [framework, staticLibrary]) let dependencies: [GraphDependency: Set] = [ .target(name: framework.name, path: path): Set([.target(name: staticLibrary.name, path: path)]), ] @@ -202,7 +173,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: targets, dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -220,24 +190,19 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_directLocalTargetDependencies() { // Given // A -> B -> C - let project = Project.test() let a = Target.test(name: "A") let b = Target.test(name: "B") let c = Target.test(name: "C") + let project = Project.test(targets: [a, b, c]) + let dependencies: [GraphDependency: Set] = [ .target(name: a.name, path: project.path): Set([.target(name: b.name, path: project.path)]), .target(name: b.name, path: project.path): Set([.target(name: c.name, path: project.path)]), ] - let targets: [AbsolutePath: [String: Target]] = [project.path: [ - a.name: a, - b.name: b, - c.name: c, - ]] // Given: Value Graph let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: targets, dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -254,31 +219,21 @@ final class GraphTraverserTests: TuistUnitTestCase { // Project A: A1 -> A2 // -> (Project B) B1 // Project B: B1 - let projectA = Project.test(path: "/ProjectA", name: "ProjectA") - let projectB = Project.test(path: "/ProjectB", name: "ProjectB") let a1 = Target.test(name: "A1") let a2 = Target.test(name: "A2") let b1 = Target.test(name: "B1") + let projectA = Project.test(path: "/ProjectA", name: "ProjectA", targets: [a1, a2]) + let projectB = Project.test(path: "/ProjectB", name: "ProjectB", targets: [b1]) let dependencies: [GraphDependency: Set] = [ .target(name: a1.name, path: projectA.path): Set([ .target(name: a2.name, path: projectA.path), .target(name: b1.name, path: projectB.path), ]), ] - let targets: [AbsolutePath: [String: Target]] = [ - projectA.path: [ - a1.name: a1, - a2.name: a2, - ], - projectB.path: [ - b1.name: b1, - ], - ] // Given: Value Graph let graph = Graph.test( path: projectA.path, projects: [projectA.path: projectA, projectB.path: projectB], - targets: targets, dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -295,33 +250,23 @@ final class GraphTraverserTests: TuistUnitTestCase { // Project A: A1 -> A2 // -> (Project B) B1 // Project B: B1 - let projectA = Project.test(path: "/ProjectA", name: "ProjectA") - let projectB = Project.test(path: "/ProjectB", name: "ProjectB") let a1 = Target.test(name: "A1") let a2 = Target.test(name: "A2") let b1 = Target.test( name: "B1" ) + let projectA = Project.test(path: "/ProjectA", name: "ProjectA", targets: [a1, a2]) + let projectB = Project.test(path: "/ProjectB", name: "ProjectB", targets: [b1]) let dependencies: [GraphDependency: Set] = [ .target(name: a1.name, path: projectA.path): Set([ .target(name: a2.name, path: projectA.path), .target(name: b1.name, path: projectB.path), ]), ] - let targets: [AbsolutePath: [String: Target]] = [ - projectA.path: [ - a1.name: a1, - a2.name: a2, - ], - projectB.path: [ - b1.name: b1, - ], - ] // Given: Value Graph let graph = Graph.test( path: projectA.path, projects: [projectA.path: projectA, projectB.path: projectB], - targets: targets, dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -342,10 +287,10 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_resourceBundleDependencies_returns_an_empty_list_when_a_dependency_can_host_resources() { // Given // App -> WatchApp -> Bundle - let project = Project.test() let app = Target.test(name: "App", platform: .iOS, product: .app) let watchApp = Target.test(name: "WatchApp", platform: .iOS, product: .watch2App) let bundle = Target.test(name: "Bundle", platform: .iOS, product: .bundle) + let project = Project.test(targets: [app, watchApp, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: watchApp.name, path: project.path)]), @@ -357,11 +302,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - watchApp.name: watchApp, - bundle.name: bundle, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -376,10 +316,10 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_resourceBundleDependencies() { // Given // App -> StaticLibrary -> Bundle - let project = Project.test() let app = Target.test(name: "App", product: .app) let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary) let bundle = Target.test(name: "Bundle", product: .bundle) + let project = Project.test(targets: [app, staticLibrary, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: staticLibrary.name, path: project.path)]), @@ -391,11 +331,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticLibrary.name: staticLibrary, - bundle.name: bundle, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -412,9 +347,9 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_resourceBundleDependencies_when_the_target_doesnt_support_resources() { // Given // StaticLibrary -> Bundle - let project = Project.test() let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary) let bundle = Target.test(name: "Bundle", product: .bundle) + let project = Project.test(targets: [staticLibrary, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: staticLibrary.name, path: project.path): Set([.target(name: bundle.name, path: project.path)]), @@ -425,10 +360,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - staticLibrary.name: staticLibrary, - bundle.name: bundle, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -444,7 +375,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let bundle = Target.test(name: "Bundle1", product: .bundle) let app = Target.test(name: "App", product: .bundle) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [bundle, app]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: bundle.name, path: project.path)]), @@ -455,10 +386,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - bundle.name: bundle, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -475,10 +402,10 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_resourceBundleDependencies_fromProjectDependency() { // Given let bundle = Target.test(name: "Bundle1", product: .bundle) - let projectA = Project.test(path: "/path/a") + let projectA = Project.test(path: "/path/a", targets: [bundle]) let app = Target.test(name: "App", product: .app) - let projectB = Project.test(path: "/path/b") + let projectB = Project.test(path: "/path/b", targets: [app]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: projectB.path): Set([.target(name: bundle.name, path: projectA.path)]), @@ -492,10 +419,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projectA.path: projectA, projectB.path: projectB, ], - targets: [ - projectA.path: [bundle.name: bundle], - projectB.path: [app.name: app], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -531,13 +454,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projectA.path: projectA, projectB.path: projectB, ], - targets: [ - projectA.path: [ - bundle.name: bundle, - staticFramework.name: staticFramework, - ], - projectB.path: [app.name: app], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -583,15 +499,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projectA.path: projectA, projectB.path: projectB, ], - targets: [ - projectA.path: [ - bundle1.name: bundle1, - bundle2.name: bundle2, - staticFramework1.name: staticFramework1, - staticFramework2.name: staticFramework2, - ], - projectB.path: [app.name: app], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -641,15 +548,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projectA.path: projectA, projectB.path: projectB, ], - targets: [ - projectA.path: [ - bundle.name: bundle, - staticFramework1.name: staticFramework1, - staticFramework2.name: staticFramework2, - dynamicFramework.name: dynamicFramework, - ], - projectB.path: [app.name: app], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -703,14 +601,6 @@ final class GraphTraverserTests: TuistUnitTestCase { staticFrameworkProject.path: staticFrameworkProject, appProject.path: appProject, ], - targets: [ - staticFrameworkProject.path: [ - staticFramework.name: staticFramework, - ], - appProject.path: [ - appTests.name: appTests, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -763,14 +653,6 @@ final class GraphTraverserTests: TuistUnitTestCase { staticFrameworkProject.path: staticFrameworkProject, appProject.path: appProject, ], - targets: [ - staticFrameworkProject.path: [ - staticFramework.name: staticFramework, - ], - appProject.path: [ - app.name: app, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -823,14 +705,6 @@ final class GraphTraverserTests: TuistUnitTestCase { dynamicFrameworkProject.path: dynamicFrameworkProject, appProject.path: appProject, ], - targets: [ - dynamicFrameworkProject.path: [ - dynamicFramework.name: dynamicFramework, - ], - appProject.path: [ - app.name: app, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -854,14 +728,13 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_target_from_dependency() { // Given - let project = Project.test() let app = Target.test(name: "App", product: .app) + let project = Project.test(targets: [app]) // Given: Value Graph let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [app.name: app]], dependencies: [.target(name: app.name, path: project.path): Set()] ) let subject = GraphTraverser(graph: graph) @@ -876,10 +749,10 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_allDependencies() throws { // Given // App -> StaticLibrary -> Bundle - let project = Project.test() let app = Target.test(name: "App", product: .app) let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary, productName: "StaticLibrary") let bundle = Target.test(name: "Bundle", product: .bundle) + let project = Project.test(targets: [app, staticLibrary, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: staticLibrary.name, path: project.path)]), @@ -891,11 +764,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticLibrary.name: staticLibrary, - bundle.name: bundle, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -918,12 +786,12 @@ final class GraphTraverserTests: TuistUnitTestCase { // App -> StaticLibrary -> Bundle // | // -> FrameworkA -> FrameworkC - let project = Project.test() let app = Target.test(name: "App", product: .app) let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary) let frameworkA = Target.test(name: "FrameworkA", product: .framework) let frameworkB = Target.test(name: "FrameworkB", product: .framework) let bundle = Target.test(name: "Bundle", product: .bundle) + let project = Project.test(targets: [app, staticLibrary, frameworkA, frameworkB, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([ @@ -939,13 +807,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticLibrary.name: staticLibrary, - bundle.name: bundle, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -975,7 +836,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let target = Target.test(name: "Main") let dependency = Target.test(name: "AppExtension", product: .appExtension) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependency]) let dependencies: [GraphDependency: Set] = [ .target(name: target.name, path: project.path): Set([.target(name: dependency.name, path: project.path)]), .target(name: dependency.name, path: project.path): Set([]), @@ -985,10 +846,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - target.name: target, - dependency.name: dependency, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1004,7 +861,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // When let target = Target.test(name: "Main") let dependency = Target.test(name: "StickerPackExtension", product: .stickerPackExtension) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependency]) let dependencies: [GraphDependency: Set] = [ .target(name: target.name, path: project.path): Set([.target(name: dependency.name, path: project.path)]), .target(name: dependency.name, path: project.path): Set([]), @@ -1014,10 +871,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - target.name: target, - dependency.name: dependency, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1043,10 +896,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - messageExtension.name: messageExtension, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1062,14 +911,13 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_appClipDependencies() throws { // Given - let project = Project.test() let app = Target.test(name: "app", product: .app) let appClip = Target.test(name: "clip", product: .appClip) + let project = Project.test(targets: [app, appClip]) // Given: Value graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [app.name: app, appClip.name: appClip]], dependencies: [.target( name: app.name, path: project.path @@ -1087,15 +935,14 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_buildsForMacCatalyst_returns_false_when_someDependenciesCantBuildForMacCatalyst() { // Given - let project = Project.test() let app = Target.test(name: "app", destinations: [.macCatalyst], product: .app) let library = Target.test(name: "library-a", destinations: [.iPhone], product: .dynamicLibrary) let transitiveLibrary = Target.test(name: "library-b", destinations: [.iPhone], product: .dynamicLibrary) + let project = Project.test(targets: [app, library, transitiveLibrary]) // Given: Value graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [app.name: app, library.name: library, transitiveLibrary.name: transitiveLibrary]], dependencies: [ .target( name: app.name, @@ -1118,15 +965,14 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_buildsForMacCatalyst_returns_false_when_aTargetDoesntSupportCatalystRegardlessOfItsDependencies() { // Given - let project = Project.test() let app = Target.test(name: "app", destinations: [.iPhone], product: .app) let library = Target.test(name: "library-a", destinations: [.macCatalyst], product: .dynamicLibrary) let transitiveLibrary = Target.test(name: "library-b", destinations: [.macCatalyst], product: .dynamicLibrary) + let project = Project.test(targets: [app, library, transitiveLibrary]) // Given: Value graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [app.name: app, library.name: library, transitiveLibrary.name: transitiveLibrary]], dependencies: [ .target( name: app.name, @@ -1149,15 +995,14 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_buildsForMacCatalyst_returns_true_when_aTargetAndItsDependenciesSupportCatalyst() { // Given - let project = Project.test() let app = Target.test(name: "app", destinations: [.macCatalyst], product: .app) let library = Target.test(name: "library-a", destinations: [.macCatalyst], product: .dynamicLibrary) let transitiveLibrary = Target.test(name: "library-b", destinations: [.macCatalyst], product: .dynamicLibrary) + let project = Project.test(targets: [app, library, transitiveLibrary]) // Given: Value graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [app.name: app, library.name: library, transitiveLibrary.name: transitiveLibrary]], dependencies: [ .target( name: app.name, @@ -1196,7 +1041,6 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [ .target( name: target.name, @@ -1219,12 +1063,11 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let target = Target.test(name: "Main", product: .framework) let dependency = Target.test(name: "Dependency", product: .framework) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependency]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [dependency.name: dependency, target.name: target]], dependencies: [ .target( name: target.name, @@ -1247,12 +1090,11 @@ final class GraphTraverserTests: TuistUnitTestCase { let target = Target.test(name: "Main") let dependencyA = Target.test(name: "DependencyA", product: .framework) let dependencyB = Target.test(name: "DependencyB", product: .framework, settings: mergeableSettings) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependencyA, dependencyB]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [dependencyA.name: dependencyA, dependencyB.name: dependencyB, target.name: target]], dependencies: [ .target( name: target.name, @@ -1282,12 +1124,11 @@ final class GraphTraverserTests: TuistUnitTestCase { let target = Target.test(name: "Main", mergedBinaryType: .automatic) let dependencyA = Target.test(name: "DependencyA", product: .framework) let dependencyB = Target.test(name: "DependencyB", product: .framework, mergeable: true) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependencyA, dependencyB]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [dependencyA.name: dependencyA, dependencyB.name: dependencyB, target.name: target]], dependencies: [ .target( name: target.name, @@ -1324,7 +1165,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [ .target(name: target.name, path: project.path): Set(arrayLiteral: frameworkDependency), ] @@ -1398,7 +1238,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [app.name: app]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1479,7 +1318,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [app.name: app]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1496,7 +1334,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let target = Target.test(name: "Main") let dependency = Target.test(name: "Dependency", product: .framework) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependency]) // Given: Value Graph let frameworkDependency = GraphDependency.testFramework( @@ -1513,7 +1351,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target, dependency.name: dependency]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1546,7 +1383,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1579,11 +1415,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - watchExtension.name: watchExtension, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1619,11 +1450,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - xpc.name: xpc, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1647,7 +1473,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/") + let project = Project.test(path: "/path/", targets: [app, tests, framework]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -1657,11 +1483,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - tests.name: tests, - framework.name: framework, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1676,8 +1497,8 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_embeddableDependencies_when_nonHostedTestTarget_dynamic_dependencies() throws { // Given let unitTests = Target.test(name: "AppUnitTests", product: .unitTests) - let project = Project.test(path: "/path/a") let target = Target.test(name: "LocallyBuiltFramework", product: .framework) + let project = Project.test(path: "/path/a", targets: [unitTests, target]) // Given: Value Graph let precompiledDependency = GraphDependency.testFramework( @@ -1697,10 +1518,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - unitTests.name: unitTests, - target.name: target, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1726,7 +1543,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [framework, staticFramework, app, tests]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -1746,12 +1563,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - framework.name: framework, - staticFramework.name: staticFramework, - app.name: app, - tests.name: tests, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1767,7 +1578,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", product: .app) let uiTests = Target.test(name: "AppUITests", product: .uiTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, uiTests]) // Given: Value Graph let precompiledDependency = GraphDependency.testFramework( @@ -1785,10 +1596,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - uiTests.name: uiTests, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1818,7 +1625,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1850,7 +1656,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1884,7 +1689,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1915,7 +1719,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1960,7 +1763,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2014,7 +1816,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2071,7 +1872,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2127,7 +1927,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2185,12 +1984,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2213,7 +2006,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let target = Target.test(name: "Main") let dependency = Target.test(name: "Dependency", product: .staticLibrary) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependency]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2222,7 +2015,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target, dependency.name: dependency]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2239,7 +2031,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let target = Target.test(name: "Main") let dependency = Target.test(name: "Dependency", product: .framework) let staticDependency = Target.test(name: "StaticDependency", product: .staticLibrary) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependency, staticDependency]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2252,11 +2044,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - target.name: target, - dependency.name: dependency, - staticDependency.name: staticDependency, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2293,7 +2080,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [] ) let app = Target.test(name: "App", product: .app) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, staticFramework, dynamicFramework]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2309,11 +2096,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticFramework.name: staticFramework, - dynamicFramework.name: dynamicFramework, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2358,7 +2140,10 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [] ) let app = Target.test(name: "App", product: .app) - let project = Project.test(path: "/path/a") + let project = Project.test( + path: "/path/a", + targets: [app, dynamicFramework1, dynamicFramework2, staticFramework1, staticFramework2] + ) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2382,13 +2167,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - dynamicFramework1.name: dynamicFramework1, - dynamicFramework2.name: dynamicFramework2, - staticFramework1.name: staticFramework1, - staticFramework2.name: staticFramework2, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2450,7 +2228,10 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) - let project = Project.test(path: "/path/a") + let project = Project.test( + path: "/path/a", + targets: [app, dynamicFramework1, dynamicFramework2, dynamicFramework3, staticFramework1, staticFramework2] + ) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2478,14 +2259,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - dynamicFramework1.name: dynamicFramework1, - dynamicFramework2.name: dynamicFramework2, - staticFramework1.name: staticFramework1, - staticFramework2.name: staticFramework2, - dynamicFramework3.name: dynamicFramework3, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2516,7 +2289,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [] ) let app = Target.test(name: "App", product: .app) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, staticFrameworkA, staticFrameworkB]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2537,11 +2310,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkA.name: staticFrameworkA, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2568,7 +2336,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [] ) let app = Target.test(name: "App", product: .app) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, staticFramework, dynamicFramework]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2589,11 +2357,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticFramework.name: staticFramework, - dynamicFramework.name: dynamicFramework, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2623,7 +2386,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [.sdk(name: "some.framework", status: .optional)] ) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, staticFramework]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2640,10 +2403,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2668,7 +2427,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] ) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [staticFramework]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2689,7 +2448,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [staticFramework.name: staticFramework]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2720,7 +2478,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [.sdk(name: "ThingTwo.framework", status: .optional)] ) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [staticFrameworkA, staticFrameworkB]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2742,10 +2500,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2777,12 +2531,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let project = Project.test(path: "/path/project", targets: [app, staticFramework]) let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: [ .target(name: app.name, path: project.path): Set([ .target(name: staticFramework.name, path: project.path), @@ -2830,12 +2578,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let project = Project.test(path: "/path/project", targets: [app, framework]) let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - framework.name: framework, - ], - ], dependencies: [ .target(name: app.name, path: project.path): Set([ .target(name: framework.name, path: project.path), @@ -2874,13 +2616,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let project = Project.test(path: "/path/project", targets: [app, staticFramework, framework]) let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - framework.name: framework, - ], - ], dependencies: [ .target(name: app.name, path: project.path): Set([ .target(name: staticFramework.name, path: project.path), @@ -2926,11 +2661,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - watchExtension.name: watchExtension, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2965,11 +2695,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - watchExtension.name: watchExtension, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2993,7 +2718,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, staticFramework, tests]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -3008,11 +2733,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticFramework.name: staticFramework, - tests.name: tests, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3035,7 +2755,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let appClip = Target.test(name: "AppClip", product: .appClip) let tests = Target.test(name: "AppClipTests", product: .unitTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [appClip, staticFramework, tests]) let dependencies: [GraphDependency: Set] = [ .target(name: appClip.name, path: project.path): [ .target(name: staticFramework.name, path: project.path), @@ -3048,11 +2768,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - appClip.name: appClip, - staticFramework.name: staticFramework, - tests.name: tests, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3075,7 +2790,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, framework, tests]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -3088,11 +2803,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - framework.name: framework, - tests.name: tests, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3115,7 +2825,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, framework, tests]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -3125,11 +2835,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - framework.name: framework, - tests.name: tests, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3144,7 +2849,7 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_linkableDependencies_when_appClipSDKNode() throws { // Given let target = Target.test(name: "AppClip", product: .appClip) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [target]) // Given: Value Graph let sdkDependency: GraphDependency = .sdk( @@ -3164,7 +2869,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -3193,7 +2897,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let appClipTarget = Target.test(name: "AppClip", product: .appClip) let frameworkTarget = Target.test(name: "MyFramework", product: .framework) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [appClipTarget, frameworkTarget]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -3205,12 +2909,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], - targets: [ - project.path: [ - appClipTarget.name: appClipTarget, - frameworkTarget.name: frameworkTarget, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3244,7 +2942,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [ .target(name: target.name, path: project.path): Set(arrayLiteral: frameworkDependency), ] @@ -3281,7 +2978,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3310,12 +3006,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: staticFramework.name, path: project.path), @@ -3379,12 +3069,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: staticFramework.name, path: project.path), @@ -3449,12 +3133,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: staticFramework.name, path: project.path), @@ -3538,12 +3216,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - unitTests.name: unitTests, - staticFramework.name: staticFramework, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3585,13 +3257,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - unitTests.name: unitTests, - dynamicFramework.name: dynamicFramework, - staticFramework.name: staticFramework, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3637,12 +3302,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - hostApp.name: hostApp, - unitTests.name: unitTests, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3664,7 +3323,7 @@ final class GraphTraverserTests: TuistUnitTestCase { binaryPath: "/test/PrecompiledStaticFramework.framework/PrecompiledStaticFramework", linking: .static ) - let project = Project.test(targets: [hostApp, unitTests]) + let project = Project.test(targets: [hostApp, unitTests, staticFramework]) let dependencies: [GraphDependency: Set] = [ .target(name: hostApp.name, path: project.path): [ precompiledStaticFramework, @@ -3679,13 +3338,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - hostApp.name: hostApp, - unitTests.name: unitTests, - staticFramework.name: staticFramework, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3712,7 +3364,7 @@ final class GraphTraverserTests: TuistUnitTestCase { binaryPath: "/test/PrecompiledStaticFramework.framework/PrecompiledStaticFramework", linking: .static ) - let project = Project.test(targets: [hostApp, unitTests]) + let project = Project.test(targets: [hostApp, unitTests, staticFramework]) let dependencies: [GraphDependency: Set] = [ .target(name: hostApp.name, path: project.path): [ precompiledStaticFramework, @@ -3727,13 +3379,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - hostApp.name: hostApp, - unitTests.name: unitTests, - staticFramework.name: staticFramework, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3759,7 +3404,6 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [ .target(name: target.name, path: project.path): Set([ .testLibrary(path: "/test/test.a", swiftModuleMap: "/test/modules/test.swiftmodulemap"), @@ -3781,7 +3425,7 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_runPathSearchPaths() throws { // Given let unitTests = Target.test(name: "AppUnitTests", product: .unitTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [unitTests]) // Given: Value Graph let precompiledDependency = GraphDependency.testFramework( @@ -3802,7 +3446,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [unitTests.name: unitTests]], dependencies: [ .target(name: unitTests.name, path: project.path): Set([precompiledDependency, precompiledBDependency]), precompiledDependency: Set(), @@ -3825,7 +3468,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", product: .app) let unitTests = Target.test(name: "AppUnitTests", product: .unitTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [unitTests, app]) // Given: Value Graph let precompiledDependency = GraphDependency.testFramework( @@ -3838,10 +3481,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - unitTests.name: unitTests, - app.name: app, - ]], dependencies: [ .target( name: unitTests.name, @@ -3864,15 +3503,11 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", platform: .iOS, product: .app) let watchApp = Target.test(name: "WatchApp", platform: .watchOS, product: .watch2App) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, watchApp]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - watchApp.name: watchApp, - ]], dependencies: [ .target(name: app.name, path: project.path): Set([.target(name: watchApp.name, path: project.path)]), .target(name: watchApp.name, path: project.path): Set([]), @@ -3891,15 +3526,11 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let watchApp = Target.test(name: "WatchApp", platform: .watchOS, product: .watch2App) let watchAppExtension = Target.test(name: "WatchAppExtension", platform: .watchOS, product: .watch2Extension) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [watchAppExtension, watchApp]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - watchAppExtension.name: watchAppExtension, - watchApp.name: watchApp, - ]], dependencies: [ .target( name: watchApp.name, @@ -3922,16 +3553,11 @@ final class GraphTraverserTests: TuistUnitTestCase { let macosApp = Target.test(name: "MacOS", platform: .macOS, product: .app) let tvosApp = Target.test(name: "tvOS", platform: .tvOS, product: .app) let framework = Target.test(name: "Framework", platform: .iOS, product: .framework) - let project = Project.test(path: "/project") + let project = Project.test(path: "/project", targets: [macosApp, tvosApp, framework]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - macosApp.name: macosApp, - tvosApp.name: tvosApp, - framework.name: framework, - ]], dependencies: [ .target(name: macosApp.name, path: project.path): Set(), .target(name: tvosApp.name, path: project.path): Set(), @@ -3952,19 +3578,16 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_allTargets_returns_all_the_targets() { // Given let firstPath = try! AbsolutePath(validating: "/first") - let firstProject = Project.test(path: firstPath) let secondPath = try! AbsolutePath(validating: "/second") - let secondProject = Project.test(path: secondPath) let firstTarget = Target.test(name: "first") + let firstProject = Project.test(path: firstPath, targets: [firstTarget]) let secondTarget = Target.test(name: "second") + let secondProject = Project.test(path: secondPath, targets: [secondTarget]) + let graph = Graph.test( projects: [ firstPath: firstProject, secondPath: secondProject, - ], - targets: [ - firstPath: [firstTarget.name: firstTarget], - secondPath: [secondTarget.name: secondTarget], ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -4017,10 +3640,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - extensionKitExtension.name: extensionKitExtension, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4131,9 +3750,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - staticLibrary.name: staticLibrary, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4182,8 +3798,8 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_copyProductDependencies_when_targetHasDirectStaticDependencies() throws { // Given let staticLibrary = Target.test(name: "StaticLibrary", destinations: [.iPhone], product: .staticLibrary) - let project = Project.test(targets: [staticLibrary]) let aDependency = Target.test(name: "StaticDependency", destinations: [.iPhone], product: .staticLibrary) + let project = Project.test(targets: [staticLibrary, aDependency]) let dependencies: [GraphDependency: Set] = [ .target(name: staticLibrary.name, path: project.path): Set([.target(name: aDependency.name, path: project.path)]), @@ -4193,10 +3809,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - staticLibrary.name: staticLibrary, - aDependency.name: aDependency, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4213,8 +3825,8 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_copyProductDependencies_when_targetHasBundleDependencies() throws { // Given let app = Target.test(name: "App", destinations: [.iPhone], product: .app) - let project = Project.test(targets: [app]) let bundle = Target.test(name: "Bundle", destinations: [.iPhone], product: .bundle) + let project = Project.test(targets: [app, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: bundle.name, path: project.path)]), @@ -4224,10 +3836,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - bundle.name: bundle, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4259,12 +3867,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: [ appkGraphDependency: [ staticFrameworkGraphDependency, @@ -4306,12 +3908,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: [ appkGraphDependency: [ staticFrameworkGraphDependency, @@ -4352,12 +3948,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: [ appkGraphDependency: [ staticFrameworkGraphDependency, @@ -4411,14 +4001,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - ], - ], dependencies: [ appkGraphDependency: [ staticFrameworkAGraphDependency, @@ -4489,14 +4071,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - ], - ], dependencies: [ appkGraphDependency: [ staticFrameworkAGraphDependency, @@ -4535,10 +4109,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - framework.name: framework, - macro.name: macro, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4564,9 +4134,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - framework.name: framework, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4612,14 +4179,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticFrameworkMacro.name: staticFrameworkMacro, - dynamicFrameworkMacro.name: dynamicFrameworkMacro, - staticLibraryMacro.name: staticLibraryMacro, - dynamicLibraryMacro.name: dynamicLibraryMacro, - macro.name: macro, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4663,10 +4222,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - macroFramework.name: macroFramework, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4690,7 +4245,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let transitiveMacro = Target.test(name: "TransitiveMacro", destinations: [.mac], product: .macro) - let project = Project.test(targets: [app, directMacroFramework, directMacro]) + let project = Project.test(targets: [app, directMacroFramework, directMacro, transitiveMacroLibrary, transitiveMacro]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: directMacroFramework.name, path: project.path)]), .target(name: directMacroFramework.name, path: project.path): Set([ @@ -4707,13 +4262,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - directMacroFramework.name: directMacroFramework, - directMacro.name: directMacro, - transitiveMacroLibrary.name: transitiveMacroLibrary, - transitiveMacro.name: transitiveMacro, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4750,10 +4298,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - framework.name: framework, - ]], dependencies: dependencies, dependencyConditions: [ GraphEdge(from: appDependency, to: frameworkDependency): platformCondition, @@ -4802,13 +4346,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - frameworkD.name: frameworkD, - ]], dependencies: dependencies, dependencyConditions: [ GraphEdge(from: frameworkBDependency, to: frameworkCDependency): platformCondition, @@ -4858,13 +4395,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project, packageProject.path: packageProject], - targets: [project.path: [ - app.name: app, - ], packageProject.path: [ - directPackageProduct.name: directPackageProduct, - transitivePackageProduct.name: transitivePackageProduct, - packageDevProduct.name: packageDevProduct, - ]], dependencies: [ appDependency: Set([directPackageProductDependency]), directPackageProductDependency: Set([transitivePackageProductDependency]), @@ -4898,12 +4428,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project, packageProject.path: packageProject], - targets: [project.path: [ - app.name: app, - framework.name: framework, - ], packageProject.path: [ - directPackageProduct.name: directPackageProduct, - ]], dependencies: [ appDependency: Set([frameworkDependency]), frameworkDependency: Set([directPackageProductDependency]), @@ -4937,12 +4461,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project, packageProject.path: packageProject], - targets: [project.path: [ - app.name: app, - framework.name: framework, - ], packageProject.path: [ - directPackageProduct.name: directPackageProduct, - ]], dependencies: [ appDependency: Set([frameworkDependency]), frameworkDependency: Set([directPackageProductDependency]), @@ -4989,15 +4507,6 @@ final class GraphTraverserTests: TuistUnitTestCase { directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - externalPackage.name: externalPackage, - externalPackageTargetB.name: externalPackageTargetB, - ], - ], dependencies: [ appTargetDependency: Set([externalPackageDependency]), externalPackageDependency: Set([externalPackageBDependency]), @@ -5058,15 +4567,6 @@ final class GraphTraverserTests: TuistUnitTestCase { directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - directExternalPackage.name: directExternalPackage, - transitiveExternalPackage.name: transitiveExternalPackage, - ], - ], dependencies: [ appTargetDependency: Set([directExternalPackageDependency]), directExternalPackageDependency: Set([transitiveExternalPackageDependency]), @@ -5123,15 +4623,6 @@ final class GraphTraverserTests: TuistUnitTestCase { directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - externalMacroFramework.name: externalMacroFramework, - externalMacroExecutable.name: externalMacroExecutable, - ], - ], dependencies: [ appTargetDependency: Set([externalMacroFrameworkDependency]), externalMacroFrameworkDependency: Set([externalMacroExecutableDependency]), @@ -5183,14 +4674,6 @@ final class GraphTraverserTests: TuistUnitTestCase { directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - externalFramework.name: externalFramework, - ], - ], dependencies: [ appTargetDependency: Set([externalFrameworkDependency]), ] @@ -5223,11 +4706,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ directory: project, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - ], dependencies: [ appTargetDependency: Set([precompiledMacroXCFramework]), precompiledMacroXCFramework: Set([precompiledMacroExecutable]), @@ -5260,7 +4738,16 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let transitiveMacroMacroTarget = Target.test(name: "TransitiveMacro", destinations: [.appleWatch], product: .macro) - let project = Project.test(path: directory, targets: [appTarget]) + let project = Project.test( + path: directory, + targets: [ + appTarget, + directMacroStaticFrameworkTarget, + directMacroMacroTarget, + transitiveMacroMacroTarget, + transitiveMacroStaticFrameworkTarget, + ] + ) let appTargetDependency = GraphDependency.target(name: appTarget.name, path: project.path) let directMacroStaticFrameworkTargetDependency = GraphDependency.target( name: directMacroStaticFrameworkTarget.name, @@ -5280,15 +4767,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ directory: project, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - directMacroStaticFrameworkTarget.name: directMacroStaticFrameworkTarget, - directMacroMacroTarget.name: directMacroMacroTarget, - transitiveMacroStaticFrameworkTarget.name: transitiveMacroStaticFrameworkTarget, - transitiveMacroMacroTarget.name: transitiveMacroMacroTarget, - ], - ], dependencies: [ appTargetDependency: Set([directMacroStaticFrameworkTargetDependency]), directMacroStaticFrameworkTargetDependency: Set([ @@ -5321,7 +4799,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let precompiledMacroPath: AbsolutePath = .root.appending(component: "macro.macro") let directMacroMacroPrecompiledExecutable = GraphDependency.macro(path: precompiledMacroPath) - let project = Project.test(path: directory, targets: [appTarget]) + let project = Project.test(path: directory, targets: [appTarget, directMacroStaticFrameworkTarget]) let appTargetDependency = GraphDependency.target(name: appTarget.name, path: project.path) let directMacroStaticFrameworkTargetDependency = GraphDependency.target( name: directMacroStaticFrameworkTarget.name, @@ -5332,12 +4810,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ directory: project, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - directMacroStaticFrameworkTarget.name: directMacroStaticFrameworkTarget, - ], - ], dependencies: [ appTargetDependency: Set([directMacroStaticFrameworkTargetDependency]), directMacroStaticFrameworkTargetDependency: Set([ diff --git a/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift b/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift index cd86ec2a13f..1a63187a795 100644 --- a/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift +++ b/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift @@ -24,7 +24,7 @@ final class TargetProjectMapperTests: XCTestCase { let (updatedProject, sideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(updatedProject.targets.map(\.name), [ + XCTAssertEqual(updatedProject.targets.values.map(\.name).sorted(), [ "Updated_A", "Updated_B", ]) @@ -47,7 +47,7 @@ final class TargetProjectMapperTests: XCTestCase { let (_, sideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(sideEffects, [ + XCTAssertEqual(sideEffects.sorted(by: { $0.description < $1.description }), [ .file(.init(path: try AbsolutePath(validating: "/Targets/A.swift"))), .file(.init(path: try AbsolutePath(validating: "/Targets/B.swift"))), ]) diff --git a/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift index b5f89bfb7d8..c67bc8fe424 100644 --- a/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift @@ -42,14 +42,6 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - externalPackage.name: externalPackage, - ], - ], dependencies: [ appTargetDependency: Set([externalPackageDependency]), ] @@ -59,9 +51,13 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase let (mappedGraph, _) = try await subject.map(graph: graph) // Then - XCTAssertEqual(try XCTUnwrap(mappedGraph.targets[project.path]?[appTarget.name]?.supportedPlatforms), Set([.iOS])) + + XCTAssertEqual( + try XCTUnwrap(mappedGraph.projects[project.path]?.targets[appTarget.name])?.supportedPlatforms, + Set([.iOS]) + ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[externalProject.path]![externalPackage.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalPackage.name]?.supportedPlatforms), Set([.iOS]) ) } @@ -93,14 +89,6 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - externalPackage.name: externalPackage, - ], - ], dependencies: [ appTargetDependency: Set([externalPackageDependency]), ], @@ -113,16 +101,17 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase let (mappedGraph, _) = try await subject.map(graph: graph) // Then + XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[project.path]?[appTarget.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.projects[project.path]?.targets[appTarget.name]?.supportedPlatforms), Set([.iOS, .macOS, .tvOS, .watchOS]) ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[externalProject.path]![externalPackage.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalPackage.name]?.supportedPlatforms), Set([.iOS]) ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[externalProject.path]![externalPackage.name]?.deploymentTargets), + try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalPackage.name]?.deploymentTargets), .iOS("16.0") ) } @@ -163,15 +152,6 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - directExternalPackage.name: directExternalPackage, - transitiveExternalPackage.name: transitiveExternalPackage, - ], - ], dependencies: [ appTargetDependency: Set([directExternalPackageDependency]), directExternalPackageDependency: Set([transitiveExternalPackageDependency]), @@ -182,13 +162,20 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase let (mappedGraph, _) = try await subject.map(graph: graph) // Then - XCTAssertEqual(try XCTUnwrap(mappedGraph.targets[project.path]?[appTarget.name]?.supportedPlatforms), Set([.iOS])) + + XCTAssertEqual( + try XCTUnwrap(mappedGraph.projects[project.path]?.targets[appTarget.name]?.supportedPlatforms), + Set([.iOS]) + ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[externalProject.path]?[directExternalPackage.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[directExternalPackage.name]?.supportedPlatforms), Set([.iOS]) ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[externalProject.path]?[transitiveExternalPackage.name]?.supportedPlatforms), + try XCTUnwrap( + mappedGraph.projects[externalProject.path]?.targets[transitiveExternalPackage.name]? + .supportedPlatforms + ), Set([.iOS]) ) } @@ -228,15 +215,6 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - externalMacroFramework.name: externalMacroFramework, - externalMacroExecutable.name: externalMacroExecutable, - ], - ], dependencies: [ appTargetDependency: Set([externalMacroFrameworkDependency]), externalMacroFrameworkDependency: Set([externalMacroExecutableDependency]), @@ -247,13 +225,16 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase let (mappedGraph, _) = try await subject.map(graph: graph) // Then - XCTAssertEqual(try XCTUnwrap(mappedGraph.targets[project.path]?[appTarget.name]?.supportedPlatforms), Set([.iOS])) XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[externalProject.path]?[externalMacroFramework.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.projects[project.path]?.targets[appTarget.name]?.supportedPlatforms), + Set([.iOS]) + ) + XCTAssertEqual( + try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalMacroFramework.name]?.supportedPlatforms), Set([.iOS]) ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[externalProject.path]?[externalMacroExecutable.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalMacroExecutable.name]?.supportedPlatforms), Set([.macOS]) ) } diff --git a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift index 1458b03bb70..2b4a4ef1c5b 100644 --- a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift @@ -57,14 +57,6 @@ final class PruneOrphanExternalTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project, packageProject.path: packageProject], - targets: [project.path: [ - app.name: app, - ], packageProject.path: [ - directPackageProduct.name: directPackageProduct, - transitivePackageProduct.name: transitivePackageProduct, - transitivePackageProductWithNoDestinations.name: transitivePackageProductWithNoDestinations, - packageDevProduct.name: packageDevProduct, - ]], dependencies: [ appDependency: Set([directPackageProductDependency]), directPackageProductDependency: Set([ @@ -78,10 +70,14 @@ final class PruneOrphanExternalTargetsGraphMapperTests: TuistUnitTestCase { let (gotGraph, _) = try await subject.map(graph: graph) // Then - XCTAssertEqual(gotGraph.targets[project.path]?[app.name]?.prune, false) - XCTAssertEqual(gotGraph.targets[packageProject.path]?[directPackageProduct.name]?.prune, false) - XCTAssertEqual(gotGraph.targets[packageProject.path]?[transitivePackageProduct.name]?.prune, false) - XCTAssertEqual(gotGraph.targets[packageProject.path]?[packageDevProduct.name]?.prune, true) - XCTAssertEqual(gotGraph.targets[packageProject.path]?[transitivePackageProductWithNoDestinations.name]?.prune, true) + + XCTAssertEqual(gotGraph.projects[project.path]?.targets[app.name]?.prune, false) + XCTAssertEqual(gotGraph.projects[packageProject.path]?.targets[directPackageProduct.name]?.prune, false) + XCTAssertEqual(gotGraph.projects[packageProject.path]?.targets[transitivePackageProduct.name]?.prune, false) + XCTAssertEqual(gotGraph.projects[packageProject.path]?.targets[packageDevProduct.name]?.prune, true) + XCTAssertEqual( + gotGraph.projects[packageProject.path]?.targets[transitivePackageProductWithNoDestinations.name]?.prune, + true + ) } } diff --git a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift index 1933e4697e7..069d9a1df0e 100644 --- a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift @@ -774,12 +774,12 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [bundle1, bundle2]) - let project = Project.test(path: path) - let targets: [AbsolutePath: [String: Target]] = [project.path: [ - bundle1.name: bundle1, - bundle2.name: bundle2, - app.name: app, - ]] + let project = Project.test(path: path, targets: [ + bundle1, + bundle2, + app, + ]) + let dependencies: [GraphDependency: Set] = [ .target(name: bundle1.name, path: project.path): Set(), .target(name: bundle2.name, path: project.path): Set(), @@ -791,7 +791,6 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [project.path: project], - targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -818,27 +817,20 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let path = try temporaryPath() let bundle = Target.test(name: "Bundle1", product: .bundle) - let projectA = Project.test(path: "/path/a") - let app = Target.test(name: "App", product: .app) - let projectB = Project.test(path: "/path/b") - let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [bundle]) - - let targets: [AbsolutePath: [String: Target]] = [ - projectA.path: [bundle.name: bundle], - projectB.path: [app.name: app], - ] + let projectA = Project.test(path: "/path/a", targets: [bundle]) + let projectB = Project.test(path: "/path/b", targets: [app]) let dependencies: [GraphDependency: Set] = [ .target(name: bundle.name, path: projectA.path): Set(), .target(name: app.name, path: projectB.path): Set([.target(name: bundle.name, path: projectA.path)]), ] + let graph = Graph.test( path: path, projects: [projectA.path: projectA, projectB.path: projectB], - targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -934,21 +926,15 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { func test_generateAppExtensionsBuildPhase() throws { // Given let path = try temporaryPath() - let projectA = Project.test(path: "/path/a") let appExtension = Target.test(name: "AppExtension", product: .appExtension) let stickerPackExtension = Target.test(name: "StickerPackExtension", product: .stickerPackExtension) let app = Target.test(name: "App", destinations: [.iPhone, .iPad, .mac], product: .app) let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [appExtension, stickerPackExtension]) - - let targets: [AbsolutePath: [String: Target]] = [ - projectA.path: [ - appExtension.name: appExtension, - stickerPackExtension.name: stickerPackExtension, - app.name: app, - ], - ] + let projectA = Project.test(path: "/path/a", targets: [ + appExtension, stickerPackExtension, app, + ]) let appGraphDependency: GraphDependency = .target(name: app.name, path: projectA.path) let stickerPackGraphDependency: GraphDependency = .target(name: stickerPackExtension.name, path: projectA.path) let appExtensionGraphDependency: GraphDependency = .target(name: appExtension.name, path: projectA.path) @@ -968,7 +954,6 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [projectA.path: projectA], - targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -1008,21 +993,16 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { func test_generateAppExtensionsBuildPhase_noBuildPhase_when_appDoesntHaveAppExtensions() throws { // Given let app = Target.test(name: "App", product: .app) - let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = ProjectFileElements() - - let targets: [AbsolutePath: [String: Target]] = [ - project.path: [app.name: app], - ] + let project = Project.test(targets: [app]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set(), ] let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -1045,31 +1025,22 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", destinations: [.iPad, .iPhone, .mac], product: .app) let watchApp = Target.test(name: "WatchApp", platform: .watchOS, product: .watch2App) - let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, watchApp]) - - let targets: [AbsolutePath: [String: Target]] = [ - project.path: [app.name: app, watchApp.name: watchApp], - ] - + let project = Project.test(targets: [app, watchApp]) let appGraphDependency: GraphDependency = .target(name: app.name, path: project.path) let watchAppGraphDependency: GraphDependency = .target(name: watchApp.name, path: project.path) - let dependencies: [GraphDependency: Set] = [ watchAppGraphDependency: Set(), appGraphDependency: Set([watchAppGraphDependency]), ] - let dependencyConditions: [GraphEdge: PlatformCondition] = [ .init(from: appGraphDependency, to: watchAppGraphDependency): .when([.ios])!, ] - let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -1100,14 +1071,10 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", destinations: [.iPhone, .iPad, .mac], product: .app) let watchApp = Target.test(name: "WatchApp", platform: .watchOS, product: .app) - let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, watchApp]) - - let targets: [AbsolutePath: [String: Target]] = [ - project.path: [app.name: app, watchApp.name: watchApp], - ] + let project = Project.test(targets: [app, watchApp]) let appGraphDependency: GraphDependency = .target(name: app.name, path: project.path) let watchAppGraphDependency: GraphDependency = .target(name: watchApp.name, path: project.path) @@ -1123,7 +1090,6 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -1155,14 +1121,10 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", platform: .macOS, product: .app) let xpcService = Target.test(name: "XPCService", platform: .macOS, product: .xpc) - let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, xpcService]) - - let targets: [AbsolutePath: [String: Target]] = [ - project.path: [app.name: app, xpcService.name: xpcService], - ] + let project = Project.test(targets: [app, xpcService]) let dependencies: [GraphDependency: Set] = [ .target(name: xpcService.name, path: project.path): Set(), .target(name: app.name, path: project.path): Set([.target(name: xpcService.name, path: project.path)]), @@ -1170,7 +1132,6 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -1200,14 +1161,10 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", platform: .macOS, product: .app) let systemExtension = Target.test(name: "SystemExtension", platform: .macOS, product: .systemExtension) - let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, systemExtension]) - - let targets: [AbsolutePath: [String: Target]] = [ - project.path: [app.name: app, systemExtension.name: systemExtension], - ] + let project = Project.test(targets: [app, systemExtension]) let dependencies: [GraphDependency: Set] = [ .target(name: systemExtension.name, path: project.path): Set(), .target(name: app.name, path: project.path): Set([.target(name: systemExtension.name, path: project.path)]), @@ -1215,7 +1172,6 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -1451,17 +1407,12 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", destinations: [.iPhone, .iPad, .mac], product: .app) let appClip = Target.test(name: "AppClip", product: .appClip) - let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, appClip]) - - let targets: [AbsolutePath: [String: Target]] = [ - project.path: [app.name: app, appClip.name: appClip], - ] + let project = Project.test(targets: [app, appClip]) let appGraphDependency: GraphDependency = .target(name: app.name, path: project.path) let appClipGraphDependency: GraphDependency = .target(name: appClip.name, path: project.path) - let dependencies: [GraphDependency: Set] = [ appClipGraphDependency: Set(), appGraphDependency: Set([appClipGraphDependency]), @@ -1474,7 +1425,6 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -1596,13 +1546,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let pbxproj = PBXProj() let pbxTarget = PBXNativeTarget(name: app.name) - let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ - project.path: [ - app.name: app, - macroFramework.name: macroFramework, - macroExecutable.name: macroExecutable, - ], - ], dependencies: [ + let graph = Graph.test(path: project.path, projects: [project.path: project], dependencies: [ .target(name: app.name, path: project.path): Set([.target(name: macroFramework.name, path: project.path)]), .target(name: macroFramework.name, path: project.path): Set([.target( name: macroExecutable.name, diff --git a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift index 33334d55972..8efb4fb0e1d 100644 --- a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift @@ -754,13 +754,7 @@ final class ConfigGeneratorTests: TuistUnitTestCase { let macroExecutable = Target.test(name: "macro", platform: .macOS, product: .macro) let project = Project.test(targets: [app, macroFramework, macroExecutable]) - let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ - project.path: [ - app.name: app, - macroFramework.name: macroFramework, - macroExecutable.name: macroExecutable, - ], - ], dependencies: [ + let graph = Graph.test(path: project.path, projects: [project.path: project], dependencies: [ .target(name: app.name, path: project.path): Set([.target(name: macroFramework.name, path: project.path)]), .target(name: macroFramework.name, path: project.path): Set([.target( name: macroExecutable.name, @@ -806,12 +800,7 @@ final class ConfigGeneratorTests: TuistUnitTestCase { let macroFramework = Target.test(name: "framework", platform: .macOS, product: .staticFramework) let project = Project.test(targets: [app, macroFramework]) - let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ - project.path: [ - app.name: app, - macroFramework.name: macroFramework, - ], - ], dependencies: [ + let graph = Graph.test(path: project.path, projects: [project.path: project], dependencies: [ .target(name: app.name, path: project.path): Set([.target(name: macroFramework.name, path: project.path)]), .target(name: macroFramework.name, path: project.path): Set([]), ]) @@ -850,11 +839,7 @@ final class ConfigGeneratorTests: TuistUnitTestCase { let project = Project.test(targets: [appClip]) - let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ - project.path: [ - appClip.name: appClip, - ], - ]) + let graph = Graph.test(path: project.path, projects: [project.path: project]) let graphTraverser = GraphTraverser(graph: graph) // When @@ -891,11 +876,7 @@ final class ConfigGeneratorTests: TuistUnitTestCase { let project = Project.test(targets: [appClip]) - let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ - project.path: [ - appClip.name: appClip, - ], - ]) + let graph = Graph.test(path: project.path, projects: [project.path: project]) let graphTraverser = GraphTraverser(graph: graph) // When @@ -1028,13 +1009,12 @@ final class ConfigGeneratorTests: TuistUnitTestCase { ) let target = Target.test(name: "Test", destinations: destinations, product: uiTest ? .uiTests : .unitTests) - let project = Project.test(path: dir, name: "Project", targets: [target]) + let project = Project.test(path: dir, name: "Project", targets: [target, appTarget]) let graph = Graph.test( name: project.name, path: project.path, projects: [project.path: project], - targets: [project.path: [appTarget.name: appTarget, target.name: target]], dependencies: [ GraphDependency .target(name: target.name, path: project.path): Set([.target(name: appTarget.name, path: project.path)]), diff --git a/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift index 67b37f138f1..4d535c50dc6 100644 --- a/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift @@ -830,14 +830,9 @@ final class LinkGeneratorTests: XCTestCase { path: path.appending(components: "XCFrameworks", "StaticLibraryB.xcframework"), linking: .static ) - + let project = Project.test(path: path, targets: [target]) let graph = Graph.test( - projects: [path: .test(path: path)], - targets: [ - path: [ - target.name: target, - ], - ], + projects: [path: project], dependencies: [ .target(name: target.name, path: path): [ xcframeworkA, @@ -889,14 +884,9 @@ final class LinkGeneratorTests: XCTestCase { let path = try AbsolutePath(validating: "/path/") let staticDependency = Target.test(name: "StaticDependency", product: .staticLibrary) let target = Target.test(name: "Dynamic", product: .framework) + let project = Project.test(path: path, targets: [target, staticDependency]) let graph = Graph.test( - projects: [path: .test(path: path)], - targets: [ - path: [ - target.name: target, - staticDependency.name: staticDependency, - ], - ], + projects: [path: project], dependencies: [ .target(name: target.name, path: path): [ .target(name: staticDependency.name, path: path), @@ -931,14 +921,9 @@ final class LinkGeneratorTests: XCTestCase { let path = try AbsolutePath(validating: "/path/") let resourceBundle = Target.test(name: "ResourceBundle", product: .bundle) let target = Target.test(name: "Target", product: .app) + let project = Project.test(path: path, targets: [target, resourceBundle]) let graph = Graph.test( - projects: [path: .test(path: path)], - targets: [ - path: [ - target.name: target, - resourceBundle.name: resourceBundle, - ], - ], + projects: [path: project], dependencies: [ .target(name: target.name, path: path): [ .target(name: resourceBundle.name, path: path), diff --git a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift index d5409c81e72..d7c30c916ed 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift @@ -54,12 +54,6 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - testGraphTarget.target.name: testGraphTarget.target, - appGraphTarget.target.name: appGraphTarget.target, - ], - ], dependencies: [ .target(name: testGraphTarget.target.name, path: testGraphTarget.path): [ .target(name: appGraphTarget.target.name, path: appGraphTarget.path), @@ -93,14 +87,14 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { // Given let temporaryPath = try temporaryPath() + let target = Target.test(name: "A") let project = Project.test( path: temporaryPath, name: "Project", - targets: [.test(dependencies: [.package(product: "A", type: .runtime)])], + targets: [target, .test(name: "B", dependencies: [.package(product: "A", type: .runtime)])], packages: [.remote(url: "A", requirement: .exact("0.1"))] ) - let target = Target.test() let graphTarget = GraphTarget.test(path: project.path, target: target, project: project) let graph = Graph.test( projects: [project.path: project], @@ -109,11 +103,6 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { "A": .remote(url: "A", requirement: .exact("0.1")), ], ], - targets: [ - graphTarget.path: [ - graphTarget.target.name: graphTarget.target, - ], - ], dependencies: [ .target(name: graphTarget.target.name, path: graphTarget.path): [ .packageProduct(path: project.path, product: "A", type: .runtime), @@ -364,15 +353,14 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { // Given let projectPath = try AbsolutePath(validating: "/Project") let localPackagePath = try AbsolutePath(validating: "/LocalPackages/LocalPackageA") + let target = Target.test(name: "A") let project = Project.test( path: projectPath, sourceRootPath: projectPath, name: "Project", - targets: [.test(dependencies: [.package(product: "A", type: .runtime)])], + targets: [target, .test(name: "B", dependencies: [.package(product: "A", type: .runtime)])], packages: [.local(path: localPackagePath)] ) - - let target = Target.test() let graphTarget = GraphTarget(path: project.path, target: target, project: project) let graph = Graph.test( projects: [project.path: project], @@ -381,11 +369,6 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { "A": .local(path: localPackagePath), ], ], - targets: [ - graphTarget.path: [ - graphTarget.target.name: graphTarget.target, - ], - ], dependencies: [ .target(name: graphTarget.target.name, path: graphTarget.path): [ .packageProduct(path: project.path, product: "A", type: .runtime), diff --git a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift index ad5a23bc8a6..445d623b87e 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift @@ -952,11 +952,6 @@ final class ProjectFileElementsTests: TuistUnitTestCase { "A": .remote(url: "url", requirement: .branch("master")), ], ], - targets: [ - graphTarget.path: [ - graphTarget.target.name: graphTarget.target, - ], - ], dependencies: [ .target(name: graphTarget.target.name, path: graphTarget.path): [ .packageProduct(path: project.path, product: "A", type: .runtime), diff --git a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift index c92ac26c8fe..27061540eba 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift @@ -33,8 +33,8 @@ final class ProjectGroupsTests: XCTestCase { settings: .default, filesGroup: .group(name: "Project"), targets: [ - .test(filesGroup: .group(name: "Target")), - .test(), + .test(name: "A", filesGroup: .group(name: "Target")), + .test(name: "B"), ], packages: [], schemes: [], @@ -92,10 +92,10 @@ final class ProjectGroupsTests: XCTestCase { func test_generate_groupsOrder() throws { // Given - let target1 = Target.test(filesGroup: .group(name: "B")) - let target2 = Target.test(filesGroup: .group(name: "C")) - let target3 = Target.test(filesGroup: .group(name: "A")) - let target4 = Target.test(filesGroup: .group(name: "C")) + let target1 = Target.test(name: "Target1", filesGroup: .group(name: "B")) + let target2 = Target.test(name: "Target2", filesGroup: .group(name: "C")) + let target3 = Target.test(name: "Target3", filesGroup: .group(name: "A")) + let target4 = Target.test(name: "Target4", filesGroup: .group(name: "C")) let project = Project.test( filesGroup: .group(name: "P"), targets: [target1, target2, target3, target4] @@ -108,15 +108,15 @@ final class ProjectGroupsTests: XCTestCase { ) // Then - let paths = subject.sortedMain.children.map(\.nameOrPath) + let paths = subject.sortedMain.children.map(\.nameOrPath).sorted() XCTAssertEqual(paths, [ - "P", + "A", "B", "C", - "A", - "Products", - "Frameworks", "Cache", + "Frameworks", + "P", + "Products", ]) } @@ -191,9 +191,9 @@ final class ProjectGroupsTests: XCTestCase { func test_projectGroup_knownProjectGroups() throws { // Given - let target1 = Target.test(filesGroup: .group(name: "A")) - let target2 = Target.test(filesGroup: .group(name: "B")) - let target3 = Target.test(filesGroup: .group(name: "B")) + let target1 = Target.test(name: "1", filesGroup: .group(name: "A")) + let target2 = Target.test(name: "2", filesGroup: .group(name: "B")) + let target3 = Target.test(name: "3", filesGroup: .group(name: "B")) let project = Project.test( path: .root, sourceRootPath: .root, diff --git a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift index ff174692a33..28c4c438f8d 100644 --- a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift @@ -37,15 +37,11 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test( path: projectPath, - xcodeProjPath: xcodeProjPath + xcodeProjPath: xcodeProjPath, + targets: targets ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -86,15 +82,11 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test( path: projectPath, - xcodeProjPath: xcodeProjPath + xcodeProjPath: xcodeProjPath, + targets: targets ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -143,24 +135,18 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let projectA = Project.test( path: projectAPath, - xcodeProjPath: xcodeProjAPath + xcodeProjPath: xcodeProjAPath, + targets: [frameworkA] ) let projectB = Project.test( path: projectBPath, - xcodeProjPath: xcodeProjBPath + xcodeProjPath: xcodeProjBPath, + targets: [frameworkB] ) let graph = Graph.test( projects: [ projectA.path: projectA, projectB.path: projectB, - ], - targets: [ - projectA.path: [ - frameworkA.name: frameworkA, - ], - projectB.path: [ - frameworkB.name: frameworkB, - ], ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -233,12 +219,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -293,7 +274,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { ) ) let project = Project.test(schemes: [schemeA, schemeB]) - let generatedProject = generatedProject(targets: project.targets) + let generatedProject = generatedProject(targets: Array(project.targets.values)) let graph = Graph.test(projects: [project.path: project]) let graphTraverser = GraphTraverser(graph: graph) @@ -339,12 +320,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -390,12 +366,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -448,12 +418,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -508,12 +472,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - framework.name: framework, - ], - ], dependencies: [ .target(name: app.name, path: projectPath): [ .target(name: framework.name, path: projectPath), @@ -560,12 +518,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - framework.name: framework, - ], - ], dependencies: [ .target(name: app.name, path: projectPath): [ .target(name: framework.name, path: projectPath), @@ -615,12 +567,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [target, testTarget]) let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -749,12 +695,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let scheme = Scheme.test(name: "AppTests", shared: true, buildAction: buildAction, testAction: testAction) let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -798,12 +738,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -844,12 +778,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [target, testTarget]) let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -886,12 +814,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -960,12 +882,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let generatedProjects = createGeneratedProjects(projects: [project]) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - testTarget.name: testTarget, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1026,12 +943,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -1116,12 +1027,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { path: workspacePath, xcWorkspacePath: workspacePath.appending(component: "Workspace.xcworkspace") ), - projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1193,12 +1099,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [app]) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1239,12 +1140,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let scheme = Scheme.test(name: "Library", buildAction: buildAction, runAction: launchAction) let project = Project.test(path: projectPath, targets: [target]) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1285,12 +1181,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1350,12 +1241,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1396,12 +1282,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [app] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1431,12 +1312,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [app] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1475,12 +1351,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - appExtension.name: appExtension, - ], - ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: appExtension.name, path: project.path), @@ -1529,12 +1399,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - appExtension.name: appExtension, - ], - ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: appExtension.name, path: project.path), @@ -1570,12 +1434,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1635,12 +1494,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1687,12 +1541,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1752,12 +1601,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1820,12 +1664,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1858,12 +1697,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [target]) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1900,12 +1734,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [target]) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1935,14 +1764,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - framework.name: framework, - unitTests.name: unitTests, - uiTests.name: uiTests, - ], - ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: framework.name, path: project.path), @@ -1960,7 +1781,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { // When let result = try subject.generateProjectSchemes( project: project, - generatedProject: generatedProject(targets: project.targets), + generatedProject: generatedProject(targets: Array(project.targets.values)), graphTraverser: graphTraverser ) @@ -1991,12 +1812,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - appExtension.name: appExtension, - ], - ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: appExtension.name, path: project.path), @@ -2008,7 +1823,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { // When let result = try subject.generateProjectSchemes( project: project, - generatedProject: generatedProject(targets: project.targets), + generatedProject: generatedProject(targets: Array(project.targets.values)), graphTraverser: graphTraverser ) @@ -2038,11 +1853,10 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { path: project.path, workspace: workspace, projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [:] ) let graphTraverser = GraphTraverser(graph: graph) - let generatedProject = generatedProject(targets: project.targets) + let generatedProject = generatedProject(targets: Array(project.targets.values)) // When let result = try subject.generateWorkspaceSchemes( @@ -2069,7 +1883,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [:] ) let graphTraverser = GraphTraverser(graph: graph) @@ -2077,7 +1890,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { // When let result = try subject.generateProjectSchemes( project: project, - generatedProject: generatedProject(targets: project.targets), + generatedProject: generatedProject(targets: Array(project.targets.values)), graphTraverser: graphTraverser ) @@ -2094,7 +1907,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { ( $0.xcodeProjPath, generatedProject( - targets: $0.targets, + targets: Array($0.targets.values), projectPath: $0.xcodeProjPath.pathString ) ) diff --git a/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift index c0e30ff371b..5c4947c95cc 100644 --- a/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift @@ -116,18 +116,12 @@ final class TargetGeneratorTests: XCTestCase { destinations: [.mac, .iPhone] ) let targetC = Target.test(name: "TargetC") + let project: Project = .test(path: path, targets: [targetA, targetB, targetC]) let nativeTargetA = createNativeTarget(for: targetA) let nativeTargetB = createNativeTarget(for: targetB) let nativeTargetC = createNativeTarget(for: targetC) let graph = Graph.test( - projects: [path: .test(path: path)], - targets: [ - path: [ - targetA.name: targetA, - targetB.name: targetB, - targetC.name: targetC, - ], - ], + projects: [path: project], dependencies: [ .target(name: targetA.name, path: path): [ .target(name: targetB.name, path: path), diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift index c4048ea4e89..7c5ab6a921a 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift @@ -104,12 +104,7 @@ final class WorkspaceDescriptorGeneratorTests: TuistUnitTestCase { let graph = Graph.test( workspace: workspace, - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) diff --git a/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift b/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift index 13b6d454e3a..a3a6e34255f 100644 --- a/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift +++ b/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift @@ -5,6 +5,7 @@ import TuistCore import TuistGraph import TuistGraphTesting import XCTest + @testable import TuistGenerator @testable import TuistSupportTesting @@ -195,34 +196,40 @@ final class GraphToGraphVizMapperTests: XCTestCase { } private func makeGivenGraph() throws -> TuistGraph.Graph { - let project = Project.test(path: "/") - let coreProject = Project.test(path: "/Core") - let externalProject = Project.test(path: "/Tuist/Dependencies", isExternal: true) let framework = GraphDependency.testFramework(path: try AbsolutePath(validating: "/XcodeProj.framework")) let library = GraphDependency.testLibrary(path: try AbsolutePath(validating: "/RxSwift.a")) let sdk = GraphDependency.testSDK(name: "CoreData.framework", status: .required, source: .developer) - + let projectPath: AbsolutePath = "/" + let coreProjectPath: AbsolutePath = "/Core" + let externalProjectPath: AbsolutePath = "/Tuist/Dependencies" + let coreTarget = Target.test(name: "Core") let core = GraphTarget.test( - path: coreProject.path, - target: Target.test(name: "Core") + path: coreProjectPath, + target: coreTarget ) let coreDependency = GraphDependency.target(name: core.target.name, path: core.path) + let coreTestsTarget = Target.test( + name: "CoreTests", + product: .unitTests + ) let coreTests = GraphTarget.test( - path: coreProject.path, - target: Target.test( - name: "CoreTests", - product: .unitTests - ) + path: coreProjectPath, + target: coreTestsTarget ) - - let iOSApp = GraphTarget.test(target: Target.test(name: "Tuist iOS")) - let watchApp = GraphTarget.test(target: Target.test( + let iOSAppTarget = Target.test(name: "Tuist iOS") + let iOSApp = GraphTarget.test(target: iOSAppTarget) + let watchAppTarget = Target.test( name: "Tuist watchOS", platform: .watchOS, deploymentTarget: .watchOS("6") - )) + ) + let watchApp = GraphTarget.test(target: watchAppTarget) - let externalTarget = GraphTarget.test(path: externalProject.path, target: Target.test(name: "External dependency")) + let externalTargetTarget = Target.test(name: "External dependency") + let externalTarget = GraphTarget.test(path: externalProjectPath, target: externalTargetTarget) + let project = Project.test(path: projectPath, targets: [iOSAppTarget, watchAppTarget]) + let coreProject = Project.test(path: coreProjectPath, targets: [coreTarget, coreTestsTarget]) + let externalProject = Project.test(path: "/Tuist/Dependencies", targets: [externalTargetTarget], isExternal: true) let externalDependency = GraphDependency.target(name: externalTarget.target.name, path: externalTarget.path) let graph = TuistGraph.Graph.test( @@ -231,19 +238,6 @@ final class GraphToGraphVizMapperTests: XCTestCase { coreProject.path: coreProject, externalProject.path: externalProject, ], - targets: [ - project.path: [ - iOSApp.target.name: iOSApp.target, - watchApp.target.name: watchApp.target, - ], - coreProject.path: [ - core.target.name: core.target, - coreTests.target.name: coreTests.target, - ], - externalProject.path: [ - externalTarget.target.name: externalTarget.target, - ], - ], dependencies: [ .target(name: core.target.name, path: core.path): [ framework, diff --git a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift index b8ae396bb27..d4d09b0eb07 100644 --- a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift @@ -137,12 +137,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - appTarget.name: appTarget, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticLibrary.name: staticLibrary, - ]], dependencies: dependencies ) let config = Config.test() @@ -184,12 +178,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - appTarget.name: appTarget, - staticLibraryA.name: staticLibraryA, - staticLibraryB.name: staticLibraryB, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -234,12 +222,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - appTarget.name: appTarget, - messagesExtension.name: messagesExtension, - staticFramework.name: staticFramework, - staticLibrary.name: staticLibrary, - ]], dependencies: dependencies ) let config = Config.test() @@ -267,10 +249,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - bundle.name: bundle, - framework.name: framework, - ]], dependencies: dependencies ) let config = Config.test() @@ -298,10 +276,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - bundle.name: bundle, - application.name: application, - ]], dependencies: dependencies ) let config = Config.test() @@ -341,13 +315,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - xpc.name: xpc, - dynamicFramework.name: dynamicFramework, - dynamicLibrary.name: dynamicLibrary, - staticFramework.name: staticFramework, - staticLibrary.name: staticLibrary, - ]], dependencies: dependencies ) let config = Config.test() @@ -377,11 +344,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - bundle.name: bundle, - unitTests.name: unitTests, - uiTests.name: uiTests, - ]], dependencies: dependencies ) let config = Config.test() @@ -411,11 +373,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - staticFramework.name: staticFramework, - staticLibrary.name: staticLibrary, - dynamicFramework.name: dynamicFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -434,7 +391,7 @@ final class GraphLinterTests: TuistUnitTestCase { let macStaticFramework = Target.empty(name: "MacStaticFramework", destinations: .macOS, product: .staticFramework) let iosStaticFramework = Target.empty(name: "iOSStaticFramework", destinations: .iOS, product: .staticFramework) let iosStaticLibrary = Target.empty(name: "iOSStaticLibrary", destinations: .iOS, product: .staticLibrary) - let project = Project.empty(path: path) + let project = Project.empty(path: path, targets: [macStaticFramework, iosStaticLibrary, iosStaticFramework]) let dependencies: [GraphDependency: Set] = [ .target( @@ -451,11 +408,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - macStaticFramework.name: macStaticFramework, - iosStaticFramework.name: iosStaticFramework, - iosStaticLibrary.name: iosStaticLibrary, - ]], dependencies: dependencies ) let config = Config.test() @@ -483,10 +435,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - watchExtension.name: watchExtension, - watchApp.name: watchApp, - ]], dependencies: dependencies ) let config = Config.test() @@ -504,7 +452,7 @@ final class GraphLinterTests: TuistUnitTestCase { let path: AbsolutePath = "/project" let invalidDependency = Target.empty(name: "Framework", destinations: .watchOS, product: .framework) let watchApp = Target.empty(name: "WatchApp", destinations: .watchOS, product: .watch2App) - let project = Project.empty(path: path) + let project = Project.empty(path: path, targets: [invalidDependency, watchApp]) let dependencies: [GraphDependency: Set] = [ .target(name: watchApp.name, path: path): Set([.target(name: invalidDependency.name, path: path)]), @@ -514,10 +462,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - invalidDependency.name: invalidDependency, - watchApp.name: watchApp, - ]], dependencies: dependencies ) let config = Config.test() @@ -555,7 +499,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [watchApp.name: watchApp, watchAppTests.name: watchAppTests]], dependencies: dependencies ) let config = Config.test() @@ -593,7 +536,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [staticLibrary.name: staticLibrary, watchAppTests.name: watchAppTests]], dependencies: dependencies ) let config = Config.test() @@ -631,7 +573,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [framework.name: framework, watchAppTests.name: watchAppTests]], dependencies: dependencies ) let config = Config.test() @@ -669,7 +610,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [staticFramework.name: staticFramework, watchAppTests.name: watchAppTests]], dependencies: dependencies ) let config = Config.test() @@ -722,13 +662,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [ - path: [ - watchApplication.name: watchApplication, - staticFramework.name: staticFramework, - dynamicFramework.name: dynamicFramework, - ], - ], dependencies: dependencies ) let config = Config.test() @@ -773,12 +706,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [ - path: [ - watchApplication.name: watchApplication, - widgetExtension.name: widgetExtension, - ], - ], dependencies: dependencies ) let config = Config.test() @@ -820,12 +747,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [ - path: [ - app.name: app, - watchApplication.name: watchApplication, - ], - ], dependencies: dependencies ) let config = Config.test() @@ -880,11 +801,6 @@ final class GraphLinterTests: TuistUnitTestCase { projectBPath: projectB, projectCPath: projectC, ], - targets: [ - projectAPath: [targetA.name: targetA], - projectBPath: [targetB.name: targetB], - projectCPath: [targetC.name: targetC], - ], dependencies: dependencies ) let config = Config.test() @@ -955,11 +871,6 @@ final class GraphLinterTests: TuistUnitTestCase { projectBPath: projectB, projectCPath: projectC, ], - targets: [ - projectAPath: [targetA.name: targetA], - projectBPath: [targetB.name: targetB], - projectCPath: [targetC.name: targetC], - ], dependencies: dependencies ) let config = Config.test() @@ -1032,11 +943,6 @@ final class GraphLinterTests: TuistUnitTestCase { projectBPath: projectB, projectCPath: projectC, ], - targets: [ - projectAPath: [targetA.name: targetA], - projectBPath: [targetB.name: targetB], - projectCPath: [targetC.name: targetC], - ], dependencies: dependencies ) let config = Config.test() @@ -1081,7 +987,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [app.name: app, watchApp.name: watchApp, watchExtension.name: watchExtension]], dependencies: dependencies ) let config = Config.test() @@ -1126,7 +1031,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [app.name: app, watchApp.name: watchApp, watchExtension.name: watchExtension]], dependencies: dependencies ) let config = Config.test() @@ -1180,7 +1084,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: temporaryPath, workspace: Workspace.test(projects: [temporaryPath]), projects: [temporaryPath: project], - targets: [temporaryPath: [app.name: app, appClip.name: appClip]], dependencies: dependencies ) let config = Config.test() @@ -1226,7 +1129,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: temporaryPath, workspace: Workspace.test(projects: [temporaryPath]), projects: [temporaryPath: project], - targets: [temporaryPath: [app.name: app, appClip.name: appClip]], dependencies: dependencies ) let config = Config.test() @@ -1269,7 +1171,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [app.name: app, appClip.name: appClip]], dependencies: dependencies ) let config = Config.test() @@ -1313,7 +1214,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [app.name: app, appClip.name: appClip]], dependencies: dependencies ) let config = Config.test() @@ -1380,7 +1280,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: temporaryPath, workspace: Workspace.test(projects: [temporaryPath]), projects: [temporaryPath: project], - targets: [temporaryPath: [app.name: app, appClip1.name: appClip1, appClip2.name: appClip2]], dependencies: dependencies ) let config = Config.test() @@ -1434,7 +1333,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: temporaryPath, workspace: Workspace.test(projects: [temporaryPath]), projects: [temporaryPath: project], - targets: [temporaryPath: [app.name: app, appClip.name: appClip, framework.name: framework]], dependencies: dependencies ) let config = Config.test() @@ -1474,7 +1372,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [tool.name: tool, dynamic.name: dynamic]], dependencies: dependencies ) let config = Config.test() @@ -1514,7 +1411,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [tool.name: tool, dynamic.name: dynamic]], dependencies: dependencies ) let config = Config.test() @@ -1565,7 +1461,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [tool.name: tool, staticFmwk.name: staticFmwk, staticLib.name: staticLib]], dependencies: dependencies ) let config = Config.test() @@ -1605,10 +1500,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [ - path: [appTarget.name: appTarget], - frameworks1.path: [frameworkA.name: frameworkA, frameworkB.name: frameworkB], - ], dependencies: dependencies ) let config = Config.test() @@ -1644,17 +1535,6 @@ final class GraphLinterTests: TuistUnitTestCase { projects: [ project.path: project, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - frameworkD.name: frameworkD, - frameworkE.name: frameworkE, - frameworkF.name: frameworkF, - ], - ], dependencies: [:] ) let config = Config.test() @@ -1726,13 +1606,7 @@ final class GraphLinterTests: TuistUnitTestCase { autogeneratedWorkspaceSchemes: .enabled(codeCoverageMode: .relevant, testingOptions: []) ) ), - projects: [temporaryPath: project], - targets: [ - temporaryPath: [ - "TargetA": targetA, - "TargetB": targetB, - ], - ] + projects: [temporaryPath: project] ) let config = Config.test() let graphTraverser = GraphTraverser(graph: graph) @@ -1789,13 +1663,7 @@ final class GraphLinterTests: TuistUnitTestCase { ) ) ), - projects: [temporaryPath: project], - targets: [ - temporaryPath: [ - "TargetA": .test(), - "TargetB": .test(), - ], - ] + projects: [temporaryPath: project] ) let config = Config.test() let graphTraverser = GraphTraverser(graph: graph) @@ -1852,13 +1720,7 @@ final class GraphLinterTests: TuistUnitTestCase { ) ) ), - projects: [temporaryPath: project], - targets: [ - temporaryPath: [ - "TargetB": .test(), - "TargetC": .test(), - ], - ] + projects: [temporaryPath: project] ) let config = Config.test() let graphTraverser = GraphTraverser(graph: graph) @@ -1893,12 +1755,6 @@ final class GraphLinterTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [path: project], - targets: [ - path: [ - iOSAndMacTarget.name: iOSAndMacTarget, - macOnlyTarget.name: macOnlyTarget, - ], - ], dependencies: [ .target(name: iOSAndMacTarget.name, path: path): [ .target(name: macOnlyTarget.name, path: path), @@ -1937,12 +1793,6 @@ final class GraphLinterTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [path: project], - targets: [ - path: [ - iOSAndMacTarget.name: iOSAndMacTarget, - watchOnlyTarget.name: watchOnlyTarget, - ], - ], dependencies: [ .target(name: iOSAndMacTarget.name, path: path): [ .target(name: watchOnlyTarget.name, path: path), @@ -1985,14 +1835,6 @@ final class GraphLinterTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [path: project], - targets: [ - path: [ - iOSAndMacTarget.name: iOSAndMacTarget, - iOSOnlyTarget.name: iOSOnlyTarget, - iOSApp.name: iOSApp, - watchApp.name: watchApp, - ], - ], dependencies: [ .target(name: iOSAndMacTarget.name, path: path): [ .target(name: iOSOnlyTarget.name, path: path), diff --git a/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift b/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift index dd75e01f7a1..a3fa87f7f90 100644 --- a/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift @@ -39,19 +39,6 @@ final class ProjectLinterTests: XCTestCase { super.tearDown() } - func test_validate_when_there_are_duplicated_targets() throws { - let target = Target.test(name: "A") - let project = Project.test(targets: [target, target]) - let got = subject.lint(project) - XCTAssertTrue( - got - .contains(LintingIssue( - reason: "Targets A from project at \(project.path.pathString) have duplicates.", - severity: .error - )) - ) - } - func test_lint_valid_watchTargetBundleIdentifiers() throws { // Given let app = Target.test(name: "App", product: .app, bundleId: "app") diff --git a/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift index 58c9a59935b..aaa581046dc 100644 --- a/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift @@ -26,7 +26,7 @@ class StaticProductsGraphLinterTests: XCTestCase { let path: AbsolutePath = "/project" let app = Target.test(name: "App") let framework = Target.test(name: "Framework", product: .framework) - let project = Project.test(path: "/tmp/app", name: "AppProject") + let project = Project.test(path: "/tmp/app", name: "AppProject", targets: [app, framework]) let package = Package.remote(url: "https://test.tuist.io", requirement: .branch("main")) let appDependency = GraphDependency.target(name: app.name, path: path) let frameworkDependency = GraphDependency.target(name: framework.name, path: path) @@ -40,10 +40,6 @@ class StaticProductsGraphLinterTests: XCTestCase { path: path, projects: [path: project], packages: [path: ["Package": package]], - targets: [path: [ - app.name: app, - framework.name: framework, - ]], dependencies: dependencies ) let config = Config.test() @@ -63,7 +59,7 @@ class StaticProductsGraphLinterTests: XCTestCase { let path: AbsolutePath = "/project" let app = Target.test(name: "App") let framework = Target.test(name: "Framework", product: .framework) - let project = Project.test(path: "/tmp/app", name: "AppProject") + let project = Project.test(path: "/tmp/app", name: "AppProject", targets: [app, framework]) let package = Package.remote(url: "https://test.tuist.io", requirement: .branch("main")) let appDependency = GraphDependency.target(name: app.name, path: path) let frameworkDependency = GraphDependency.target(name: framework.name, path: path) @@ -78,10 +74,6 @@ class StaticProductsGraphLinterTests: XCTestCase { path: path, projects: [path: project], packages: [path: ["Package": package]], - targets: [path: [ - app.name: app, - framework.name: framework, - ]], dependencies: dependencies ) let config = Config.test() @@ -116,10 +108,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - framework.name: framework, - ]], dependencies: dependencies ) let config = Config.test() @@ -154,11 +142,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - framework.name: framework, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -206,15 +189,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - ]], dependencies: dependencies ) let config = Config.test() @@ -262,15 +236,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - ]], dependencies: dependencies ) let config = Config.test() @@ -294,7 +259,7 @@ class StaticProductsGraphLinterTests: XCTestCase { let frameworkB = Target.test(name: "FrameworkB", product: .framework) let frameworkC = Target.test(name: "FrameworkC", product: .framework) let frameworkD = Target.test(name: "FrameworkD", product: .framework) - let project = Project.test(targets: [app, frameworkA, frameworkB, frameworkC, staticFrameworkA]) + let project = Project.test(targets: [app, frameworkA, frameworkB, frameworkC, frameworkD, staticFrameworkA]) let appDependency = GraphDependency.target(name: app.name, path: path) let staticFrameworkAdependency = GraphDependency.target(name: staticFrameworkA.name, path: path) @@ -314,14 +279,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - staticFrameworkA.name: staticFrameworkA, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - frameworkD.name: frameworkD, - ]], dependencies: dependencies ) let config = Config.test() @@ -357,11 +314,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - staticFramework.name: staticFramework, - framework.name: framework, - ]], dependencies: dependencies ) let config = Config.test() @@ -407,15 +359,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - ]], dependencies: dependencies ) let config = Config.test() @@ -448,11 +391,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - staticFramework.name: staticFramework, - frameworkTests.name: frameworkTests, - ]], dependencies: dependencies ) let config = Config.test() @@ -472,7 +410,7 @@ class StaticProductsGraphLinterTests: XCTestCase { let framework = Target.test(name: "Framework", product: .framework) let staticFramework = Target.test(name: "StaticFramework", product: .staticFramework) let frameworkTests = Target.test(name: "FrameworkTests", product: .unitTests) - let project = Project.test(targets: [app, staticFramework, frameworkTests]) + let project = Project.test(targets: [app, framework, staticFramework, frameworkTests]) let appDependency = GraphDependency.target(name: app.name, path: path) let frameworkDependency = GraphDependency.target(name: framework.name, path: path) @@ -488,12 +426,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - framework.name: framework, - staticFramework.name: staticFramework, - frameworkTests.name: frameworkTests, - ]], dependencies: dependencies ) let config = Config.test() @@ -528,11 +460,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appTestsTarget.name: appTestsTarget, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -613,21 +540,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appTests.name: appTests, - appUITests.name: appUITests, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - frameworkTests.name: frameworkTests, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - staticFrameworkATests.name: staticFrameworkATests, - staticFrameworkBTests.name: staticFrameworkBTests, - staticFrameworkCTests.name: staticFrameworkCTests, - ]], dependencies: dependencies ) let config = Config.test() @@ -660,11 +572,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - appClip.name: appClip, - appClipTestsTarget.name: appClipTestsTarget, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -729,17 +636,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appTests.name: appTests, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - frameworkTests.name: frameworkTests, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - ]], dependencies: dependencies ) let config = Config.test() @@ -782,13 +678,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appTests.name: appTests, - appUITests.name: appUITests, - frameworkA.name: frameworkA, - staticFrameworkA.name: staticFrameworkA, - ]], dependencies: dependencies ) let config = Config.test() @@ -827,12 +716,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appUITests.name: appUITests, - frameworkA.name: frameworkA, - staticFrameworkA.name: staticFrameworkA, - ]], dependencies: dependencies ) let config = Config.test() @@ -873,12 +756,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appUITests.name: appUITests, - frameworkA.name: frameworkA, - staticFrameworkA.name: staticFrameworkA, - ]], dependencies: dependencies ) let config = Config.test() @@ -918,12 +795,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appUITests.name: appUITests, - frameworkA.name: frameworkA, - staticFrameworkA.name: staticFrameworkA, - ]], dependencies: dependencies ) let config = Config.test() @@ -960,11 +831,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appExtension.name: appExtension, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -1001,12 +867,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appExtension.name: appExtension, - staticFramework.name: staticFramework, - framework.name: framework, - ]], dependencies: dependencies ) let config = Config.test() @@ -1042,11 +902,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appClip.name: appClip, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -1083,12 +938,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appClip.name: appClip, - framework.name: framework, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -1126,11 +975,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - watchApp.name: watchApp, - watchAppExtension.name: watchAppExtension, - ]], dependencies: dependencies ) let config = Config.test() @@ -1169,12 +1013,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - watchApp.name: watchApp, - watchAppExtension.name: watchAppExtension, - watchFramework.name: watchFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -1222,15 +1060,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - ]], dependencies: dependencies ) let config = Config @@ -1271,12 +1100,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - macroStaticFramework.name: macroStaticFramework, - macroExecutable.name: macroExecutable, - swiftSyntax.name: swiftSyntax, - ]], dependencies: dependencies ) let config = Config.test() diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift index d1bae6363bc..b50d26df813 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift @@ -68,15 +68,6 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { isExternal: true ), ], - targets: [ - projectAPath: [ - "FrameworkA": frameworkA, - "DynamicLibraryB": dynamicLibraryB, - ], - externalProjectBPath: [ - "ExternalFrameworkC": externalFrameworkC, - ], - ], dependencies: [ .target(name: "FrameworkA", path: projectAPath): [ .target(name: "DynamicLibraryB", path: projectAPath), @@ -98,8 +89,10 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { """ // Then + let gotAProject = try XCTUnwrap(got.0.projects[projectAPath]) + let gotATargets = Array(gotAProject.targets.values).sorted() XCTAssertEqual( - got.0.projects[projectAPath]?.targets[0], + gotATargets[0], .test( name: "App", product: .app, @@ -108,7 +101,7 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { ] ) ) - let gotFrameworkA = try XCTUnwrap(got.0.projects[projectAPath]?.targets[1]) + let gotFrameworkA = try XCTUnwrap(gotATargets[2]) XCTAssertEqual( gotFrameworkA.name, "FrameworkA" @@ -169,8 +162,9 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { .project(target: "ExternalFrameworkC", path: externalProjectBPath), ] ) + XCTAssertEqual( - got.0.projects[projectAPath]?.targets[2], + gotATargets[1], .test( name: "DynamicLibraryB", product: .dynamicLibrary, @@ -206,8 +200,10 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { ] ) ) + let gotExternalBProject = try XCTUnwrap(got.0.projects[externalProjectBPath]) + let gotExternalBTargets = Array(gotExternalBProject.targets.values) XCTAssertEqual( - got.0.projects[externalProjectBPath]?.targets, + gotExternalBTargets, [ .test( name: "ExternalFrameworkC", @@ -281,14 +277,6 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { isExternal: true ), ], - targets: [ - projectAPath: [ - "FrameworkA": frameworkA, - ], - externalProjectBPath: [ - "ExternalFrameworkB": externalFrameworkB, - ], - ], dependencies: [ .target(name: "FrameworkA", path: projectAPath): [ .target(name: "ExternalFrameworkB", path: externalProjectBPath), @@ -300,7 +288,9 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { let got = try await subject.map(graph: graph) // Then - let gotFrameworkA = try XCTUnwrap(got.0.projects[projectAPath]?.targets[0]) + let gotAProject = try XCTUnwrap(got.0.projects[projectAPath]) + let gotATargets = Array(gotAProject.targets.values).sorted() + let gotFrameworkA = try XCTUnwrap(gotATargets[0]) XCTAssertEqual( gotFrameworkA.name, "FrameworkA" diff --git a/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift index 78f483afda6..104fe4afc51 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift @@ -95,7 +95,7 @@ public final class GenerateInfoPlistProjectMapperTests: TuistUnitTestCase { file: StaticString = #file, line: UInt = #line ) { - XCTAssertNotNil(project.targets.first(where: { (target: Target) in + XCTAssertNotNil(project.targets.values.first(where: { (target: Target) in target.infoPlist?.path == project.path .appending(component: Constants.DerivedDirectory.name) .appending(component: Constants.DerivedDirectory.infoPlists) diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift index 59208d00a5d..d827fc205f8 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift @@ -77,15 +77,6 @@ final class ModuleMapMapperTests: TuistUnitTestCase { projectAPath: projectA, projectBPath: projectB, ], - targets: [ - projectAPath: [ - targetA.name: targetA, - ], - projectBPath: [ - targetB1.name: targetB1, - targetB2.name: targetB2, - ], - ], dependencies: [ .target(name: targetA.name, path: projectAPath): [ .target(name: targetB1.name, path: projectBPath), @@ -162,15 +153,6 @@ final class ModuleMapMapperTests: TuistUnitTestCase { projectAPath: mappedProjectA, projectBPath: mappedProjectB, ], - targets: [ - projectAPath: [ - mappedTargetA.name: mappedTargetA, - ], - projectBPath: [ - mappedTargetB1.name: mappedTargetB1, - mappedTargetB2.name: mappedTargetB2, - ], - ], dependencies: [ .target(name: targetA.name, path: projectAPath): [ .target(name: targetB1.name, path: projectBPath), @@ -229,14 +211,6 @@ final class ModuleMapMapperTests: TuistUnitTestCase { projectAPath: projectA, projectBPath: projectB, ], - targets: [ - projectAPath: [ - targetA.name: targetA, - ], - projectBPath: [ - targetB.name: targetB, - ], - ], dependencies: [ .target(name: targetA.name, path: projectAPath): [ .target(name: targetB.name, path: projectBPath), @@ -299,14 +273,6 @@ final class ModuleMapMapperTests: TuistUnitTestCase { projectAPath: mappedProjectA, projectBPath: mappedProjectB, ], - targets: [ - projectAPath: [ - mappedTargetA.name: mappedTargetA, - ], - projectBPath: [ - mappedTargetB.name: mappedTargetB, - ], - ], dependencies: [ .target(name: projectA.name, path: projectAPath): [ .target(name: projectB.name, path: projectBPath), diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index a337b0e7f80..820cdd61d2d 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -57,7 +57,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then: Targets XCTAssertEqual(gotProject.targets.count, 2) - let gotTarget = try XCTUnwrap(gotProject.targets.first) + let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.resources.count, 0) @@ -70,7 +70,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { TargetDependency.target(name: "\(project.name)_\(target.name)", condition: .when([.ios])) ) - let resourcesTarget = try XCTUnwrap(gotProject.targets.last) + let resourcesTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) XCTAssertEqual(resourcesTarget.name, "\(project.name)_\(target.name)") XCTAssertEqual(resourcesTarget.product, .bundle) XCTAssertEqual(resourcesTarget.destinations, target.destinations) @@ -117,7 +117,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual(gotSideEffects, []) XCTAssertEqual(gotProject.targets.count, 2) - let gotTarget = try XCTUnwrap(gotProject.targets.first) + let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.resources.count, 0) @@ -128,7 +128,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { TargetDependency.target(name: "\(project.name)_\(target.name)", condition: .when([.ios])) ) - let resourcesTarget = try XCTUnwrap(gotProject.targets.last) + let resourcesTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) XCTAssertEqual(resourcesTarget.name, "\(project.name)_\(target.name)") XCTAssertEqual(resourcesTarget.product, .bundle) XCTAssertEqual(resourcesTarget.destinations, target.destinations) @@ -167,7 +167,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then: Targets XCTAssertEqual(gotProject.targets.count, 2) - let gotTarget = try XCTUnwrap(gotProject.targets.first) + let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.resources.count, 0) @@ -180,7 +180,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { TargetDependency.target(name: "\(project.name)_\(target.name)", condition: .when([.ios])) ) - let resourcesTarget = try XCTUnwrap(gotProject.targets.last) + let resourcesTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) XCTAssertEqual(resourcesTarget.name, "\(project.name)_\(target.name)") XCTAssertEqual(resourcesTarget.product, .bundle) XCTAssertEqual(resourcesTarget.destinations, target.destinations) @@ -217,7 +217,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then: Targets XCTAssertEqual(gotProject.targets.count, 1) - let gotTarget = try XCTUnwrap(gotProject.targets.first) + let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.resources, resources) @@ -255,7 +255,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then: Targets XCTAssertEqual(gotProject.targets.count, 1) - let gotTarget = try XCTUnwrap(gotProject.targets.first) + let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.coreDataModels, coreDataModels) @@ -275,7 +275,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(gotProject.targets, [target]) + XCTAssertEqual(Array(gotProject.targets.values), [target]) XCTAssertEmpty(gotSideEffects) } @@ -292,7 +292,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(gotProject.targets, [target]) + XCTAssertEqual(Array(gotProject.targets.values), [target]) XCTAssertEmpty(gotSideEffects) } @@ -338,7 +338,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(gotProject.targets, [target]) + XCTAssertEqual(Array(gotProject.targets.values), [target]) XCTAssertEmpty(gotSideEffects) } @@ -353,7 +353,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(gotProject.targets, [target]) + XCTAssertEqual(Array(gotProject.targets.values), [target]) XCTAssertEmpty(gotSideEffects) } @@ -396,7 +396,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - let gotTarget = try XCTUnwrap(gotProject.targets.first) + let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) verifyObjcBundleAccessor( for: target, gotTarget: gotTarget, @@ -415,7 +415,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - let gotTarget = try XCTUnwrap(gotProject.targets.first) + let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) verifyObjcBundleAccessor( for: target, gotTarget: gotTarget, @@ -436,7 +436,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Got let (gotProject, _) = try subject.map(project: project) - let bundleTarget = try XCTUnwrap(gotProject.targets.first(where: { $0.product == .bundle })) + let bundleTarget = try XCTUnwrap(gotProject.targets.values.sorted().first(where: { $0.product == .bundle })) // Then XCTAssertEqual(expectedBundleName, bundleTarget.name) diff --git a/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift index 19a4c7771c5..8d755af1757 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift @@ -17,16 +17,17 @@ final class TargetActionDisableShowEnvVarsProjectMapperTests: TuistUnitTestCase // When let (updatedProject, _) = try subject.map(project: project) + let updatedTargets = updatedProject.targets.values.sorted() // Then - XCTAssertTrue(project.targets[0].scripts[0].showEnvVarsInLog) - XCTAssertTrue(project.targets[0].scripts[1].showEnvVarsInLog) - XCTAssertTrue(project.targets[1].scripts[0].showEnvVarsInLog) - XCTAssertTrue(project.targets[1].scripts[1].showEnvVarsInLog) - XCTAssertFalse(updatedProject.targets[0].scripts[0].showEnvVarsInLog) - XCTAssertFalse(updatedProject.targets[0].scripts[1].showEnvVarsInLog) - XCTAssertFalse(updatedProject.targets[1].scripts[0].showEnvVarsInLog) - XCTAssertFalse(updatedProject.targets[1].scripts[1].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[1].scripts[0].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[1].scripts[1].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[0].scripts[0].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[0].scripts[1].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[1].scripts[0].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[1].scripts[1].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[0].scripts[0].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[0].scripts[1].showEnvVarsInLog) } func test_map_environmentLoggingEnables() throws { @@ -40,15 +41,16 @@ final class TargetActionDisableShowEnvVarsProjectMapperTests: TuistUnitTestCase // When let (updatedProject, _) = try subject.map(project: project) + let updatedTargets = updatedProject.targets.values.sorted() // Then - XCTAssertTrue(project.targets[0].scripts[0].showEnvVarsInLog) - XCTAssertTrue(project.targets[0].scripts[1].showEnvVarsInLog) - XCTAssertTrue(project.targets[1].scripts[0].showEnvVarsInLog) - XCTAssertTrue(project.targets[1].scripts[1].showEnvVarsInLog) - XCTAssertTrue(updatedProject.targets[0].scripts[0].showEnvVarsInLog) - XCTAssertTrue(updatedProject.targets[0].scripts[1].showEnvVarsInLog) - XCTAssertTrue(updatedProject.targets[1].scripts[0].showEnvVarsInLog) - XCTAssertTrue(updatedProject.targets[1].scripts[1].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[0].scripts[0].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[0].scripts[1].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[1].scripts[0].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[1].scripts[1].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[0].scripts[0].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[0].scripts[1].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[1].scripts[0].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[1].scripts[1].showEnvVarsInLog) } } diff --git a/Tests/TuistGraphTests/Models/ProjectTests.swift b/Tests/TuistGraphTests/Models/ProjectTests.swift index e6a06b00500..4bb76568a0c 100644 --- a/Tests/TuistGraphTests/Models/ProjectTests.swift +++ b/Tests/TuistGraphTests/Models/ProjectTests.swift @@ -33,14 +33,6 @@ final class ProjectTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - framework.name: framework, - frameworkTests.name: frameworkTests, - app.name: app, - appTests.name: appTests, - ], - ], dependencies: [ .target(name: frameworkTests.name, path: project.path): [ .target(name: framework.name, path: project.path), diff --git a/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift b/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift index 226eb881650..17cd016bba7 100644 --- a/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift +++ b/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift @@ -16,16 +16,9 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: Set()) let path = try temporaryPath() - let project = Project.test(path: path) + let project = Project.test(path: path, targets: [aTarget, bTarget, cTarget]) let graph = Graph.test( projects: [project.path: project], - targets: [ - path: [ - aTarget.name: aTarget, - bTarget.name: bTarget, - cTarget.name: cTarget, - ], - ], dependencies: [ .target(name: bTarget.name, path: path): [ .target(name: aTarget.name, path: path), @@ -38,8 +31,8 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { // When let (gotGraph, gotSideEffects) = try subject.map(graph: graph) + let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) - let pruningTargets = gotGraph.targets[path]?.values.filter(\.prune) ?? [] // Then XCTAssertEmpty(gotSideEffects) XCTAssertEmpty(pruningTargets.map(\.name)) @@ -56,24 +49,13 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let subject = FocusTargetsGraphMappers(includedTargets: Set()) let projectPath = try temporaryPath().appending(component: "Project") let externalProjectPath = try temporaryPath().appending(component: "ExternalProject") - let project = Project.test(path: projectPath) - let externalProject = Project.test(path: externalProjectPath, isExternal: true) + let project = Project.test(path: projectPath, targets: [aTarget, bTarget, cTarget]) + let externalProject = Project.test(path: externalProjectPath, targets: [dTarget, eTarget], isExternal: true) let graph = Graph.test( projects: [ project.path: project, externalProject.path: externalProject, ], - targets: [ - projectPath: [ - aTarget.name: aTarget, - bTarget.name: bTarget, - cTarget.name: cTarget, - ], - externalProjectPath: [ - dTarget.name: dTarget, - eTarget.name: eTarget, - ], - ], dependencies: [ .target(name: bTarget.name, path: projectPath): [ .target(name: aTarget.name, path: projectPath), @@ -86,10 +68,9 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { // When let (gotGraph, gotSideEffects) = try subject.map(graph: graph) - + let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) let expectingTargets = [dTarget, eTarget] - let pruningTargets = (gotGraph.targets[projectPath]?.values.filter(\.prune) ?? []) + - (gotGraph.targets[externalProjectPath]?.values.filter(\.prune) ?? []) + // Then XCTAssertEmpty(gotSideEffects) XCTAssertEqual( @@ -106,16 +87,9 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: [aTarget.name]) let path = try temporaryPath() - let project = Project.test(path: path) + let project = Project.test(path: path, targets: [aTarget, bTarget, cTarget]) let graph = Graph.test( projects: [project.path: project], - targets: [ - path: [ - aTarget.name: aTarget, - bTarget.name: bTarget, - cTarget.name: cTarget, - ], - ], dependencies: [ .target(name: bTarget.name, path: path): [ .target(name: aTarget.name, path: path), @@ -130,7 +104,8 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let (gotGraph, gotSideEffects) = try subject.map(graph: graph) let expectingTargets = [bTarget, cTarget] - let pruningTargets = gotGraph.targets[path]?.values.filter(\.prune) ?? [] + let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) + // Then XCTAssertEmpty(gotSideEffects) XCTAssertEqual( @@ -147,16 +122,9 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: [bTarget.name]) let path = try temporaryPath() - let project = Project.test(path: path) + let project = Project.test(path: path, targets: [aTarget, bTarget, cTarget]) let graph = Graph.test( projects: [project.path: project], - targets: [ - path: [ - aTarget.name: aTarget, - bTarget.name: bTarget, - cTarget.name: cTarget, - ], - ], dependencies: [ .target(name: bTarget.name, path: path): [ .target(name: aTarget.name, path: path), @@ -171,7 +139,8 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let (gotGraph, gotSideEffects) = try subject.map(graph: graph) let expectingTargets = [cTarget] - let pruningTargets = gotGraph.targets[path]?.values.filter(\.prune) ?? [] + let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) + // Then XCTAssertEmpty(gotSideEffects) XCTAssertEqual( @@ -189,17 +158,9 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: [aTarget.name]) let path = try temporaryPath() - let project = Project.test(path: path) + let project = Project.test(path: path, targets: [aTestTarget, aTarget, bTarget, cTarget]) let graph = Graph.test( projects: [project.path: project], - targets: [ - path: [ - aTestTarget.name: aTestTarget, - aTarget.name: aTarget, - bTarget.name: bTarget, - cTarget.name: cTarget, - ], - ], dependencies: [ .target(name: aTestTarget.name, path: path): [ .target(name: aTarget.name, path: path), @@ -217,7 +178,8 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let (gotGraph, gotSideEffects) = try subject.map(graph: graph) let expectingTargets = [bTarget, cTarget, aTestTarget] - let pruningTargets = gotGraph.targets[path]?.values.filter(\.prune) ?? [] + let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) + // Then XCTAssertEmpty(gotSideEffects) XCTAssertEqual( @@ -234,16 +196,9 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: [aTarget.name, "bar"]) let path = try temporaryPath() - let project = Project.test(path: path) + let project = Project.test(path: path, targets: [aTestTarget, aTarget, cTarget]) let graph = Graph.test( projects: [project.path: project], - targets: [ - path: [ - aTestTarget.name: aTestTarget, - aTarget.name: aTarget, - cTarget.name: cTarget, - ], - ], dependencies: [ .target(name: aTestTarget.name, path: path): [ .target(name: aTarget.name, path: path), diff --git a/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift b/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift index 425a973009c..46b9f599403 100644 --- a/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift +++ b/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift @@ -27,14 +27,12 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, - projects: [project.path: project], - targets: [project.path: [target.name: target]] + projects: [project.path: project] ) let expectedGraph = Graph.test( path: project.path, - projects: [:], - targets: [:] + projects: [:] ) // When @@ -57,7 +55,6 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [firstTarget.name: firstTarget, secondTarget.name: secondTarget]], dependencies: [:] ) @@ -67,9 +64,9 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { // Then XCTAssertEmpty(gotValueSideEffects) XCTAssertEqual(gotGraph.projects.count, 1) - let valueTargets = gotGraph.targets.flatMap(\.value) + let valueTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted() XCTAssertEqual(valueTargets.count, 1) - XCTAssertEqual(valueTargets.first?.value, firstTarget) + XCTAssertEqual(valueTargets.first, firstTarget) } func test_map_removes_project_schemes_with_whose_all_targets_have_been_removed() throws { @@ -85,7 +82,6 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [prunedTarget.name: prunedTarget, keptTarget.name: keptTarget]], dependencies: [:] ) @@ -113,7 +109,6 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [prunedTarget.name: prunedTarget, keptTarget.name: keptTarget]], dependencies: [:] ) @@ -153,7 +148,6 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { path: project.path, workspace: workspace, projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [:] ) @@ -183,7 +177,6 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { path: project.path, workspace: workspace, projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [:] ) @@ -214,8 +207,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let project = Project.test(path: path, targets: targets, schemes: [scheme]) let graph = Graph.test( path: project.path, - projects: [project.path: project], - targets: [project.path: Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) })] + projects: [project.path: project] ) let unprunedTargets = targets.filter { !$0.prune } @@ -231,8 +223,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let expectedProject = Project.test(path: path, targets: unprunedTargets, schemes: [schemeWithUnprunedTargets]) let expectedGraph = Graph.test( path: expectedProject.path, - projects: [expectedProject.path: expectedProject], - targets: [expectedProject.path: Dictionary(uniqueKeysWithValues: unprunedTargets.map { ($0.name, $0) })] + projects: [expectedProject.path: expectedProject] ) // When @@ -253,12 +244,6 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - firstTarget.name: firstTarget, - secondTarget.name: secondTarget, - thirdTarget.name: thirdTarget, - prunedTarget.name: prunedTarget, - ]], dependencies: [:] ) diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift index 9b343c70544..323bc5dd810 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift @@ -75,10 +75,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first(where: { $0.name == projectName })) - - let targets = graph.targets.values.lazy - .flatMap(\.values) - .sorted(by: { $0.name < $1.name }) + let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) // Then XCTAssertEqual(graph.name, "TestManifests") @@ -86,7 +83,10 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEqual(targets.count, 9) // Generated Manifests target - let manifestsTarget = try XCTUnwrap(project.targets.first(where: { $0.name == sourceRootPath.basename + projectName })) + let manifestsTarget = try XCTUnwrap( + project.targets.values.sorted() + .first(where: { $0.name == sourceRootPath.basename + projectName }) + ) XCTAssertEqual(targets.last, manifestsTarget) XCTAssertEqual(manifestsTarget.destinations, .macOS) @@ -104,7 +104,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated Helpers target - let helpersTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "ProjectDescriptionHelpers" })) + let helpersTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "ProjectDescriptionHelpers" })) XCTAssertTrue(targets.contains(helpersTarget)) XCTAssertEqual(helpersTarget.name, "ProjectDescriptionHelpers") @@ -123,7 +123,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated Templates target - let templatesTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Templates" })) + let templatesTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Templates" })) XCTAssertTrue(targets.contains(templatesTarget)) XCTAssertEqual(templatesTarget.name, "Templates") @@ -141,7 +141,10 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated ResourceSynthesizers target - let resourceSynthesizersTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "ResourceSynthesizers" })) + let resourceSynthesizersTarget = try XCTUnwrap( + project.targets.values.sorted() + .last(where: { $0.name == "ResourceSynthesizers" }) + ) XCTAssertTrue(targets.contains(resourceSynthesizersTarget)) XCTAssertEqual(resourceSynthesizersTarget.name, "ResourceSynthesizers") @@ -158,7 +161,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated Stencils target - let stencilsTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Stencils" })) + let stencilsTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Stencils" })) XCTAssertTrue(targets.contains(stencilsTarget)) XCTAssertEqual(stencilsTarget.name, "Stencils") @@ -175,7 +178,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated Config target - let configTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Config" })) + let configTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Config" })) XCTAssertTrue(targets.contains(configTarget)) XCTAssertEqual(configTarget.name, "Config") @@ -190,7 +193,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(configTarget.dependencies) // Generated Packages target - let packagesTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Packages" })) + let packagesTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Packages" })) XCTAssertTrue(targets.contains(packagesTarget)) XCTAssertEqual(packagesTarget.name, "Packages") @@ -246,7 +249,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEqual(scheme.name, projectName) let buildAction = try XCTUnwrap(scheme.buildAction) - XCTAssertEqual(buildAction.targets.lazy.map(\.name).sorted(), project.targets.map(\.name).sorted()) + XCTAssertEqual(buildAction.targets.lazy.map(\.name).sorted(), project.targets.values.map(\.name).sorted()) let runAction = try XCTUnwrap(scheme.runAction) XCTAssertEqual(runAction.filePath, tuistPath) @@ -287,17 +290,17 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first) - - let targets = graph.targets.values.lazy - .flatMap(\.values) - .sorted(by: { $0.name < $1.name }) + let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) // Then XCTAssertEqual(targets.count, 1) XCTAssertEmpty(targets.flatMap(\.dependencies)) // Generated Manifests target - let manifestsTarget = try XCTUnwrap(project.targets.last(where: { $0.name == sourceRootPath.basename + projectName })) + let manifestsTarget = try XCTUnwrap( + project.targets.values.sorted() + .last(where: { $0.name == sourceRootPath.basename + projectName }) + ) XCTAssertEqual(manifestsTarget.destinations, .macOS) XCTAssertEqual(manifestsTarget.product, .staticFramework) @@ -370,10 +373,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first) - - let targets = graph.targets.values.lazy - .flatMap(\.values) - .sorted(by: { $0.name < $1.name }) + let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) // Then @@ -381,7 +381,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(targets.flatMap(\.dependencies)) // Generated Manifests target - let manifestOneTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "ModuleManifests" })) + let manifestOneTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "ModuleManifests" })) XCTAssertEqual(manifestOneTarget.name, "ModuleManifests") XCTAssertEqual(manifestOneTarget.destinations, .macOS) @@ -395,7 +395,10 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(manifestOneTarget.dependencies) // Generated Manifests target - let manifestTwoTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "\(sourceRootPath.basename)Manifests" })) + let manifestTwoTarget = try XCTUnwrap( + project.targets.values.sorted() + .last(where: { $0.name == "\(sourceRootPath.basename)Manifests" }) + ) XCTAssertEqual(manifestTwoTarget.destinations, .macOS) XCTAssertEqual(manifestTwoTarget.product, .staticFramework) @@ -408,7 +411,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(manifestTwoTarget.dependencies) // Generated Config target - let configTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Config" })) + let configTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Config" })) XCTAssertEqual(configTarget.name, "Config") XCTAssertEqual(configTarget.destinations, .macOS) @@ -480,17 +483,14 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first) - - let targets = graph.targets.values.lazy - .flatMap(\.values) - .sorted(by: { $0.name < $1.name }) + let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) // Then XCTAssertEqual(targets.count, 1) XCTAssertEmpty(targets.flatMap(\.dependencies)) // Generated Plugin target - let pluginTarget = try XCTUnwrap(project.targets.last(where: { $0.name == sourceRootPath.basename })) + let pluginTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == sourceRootPath.basename })) XCTAssertEqual(pluginTarget.destinations, .macOS) XCTAssertEqual(pluginTarget.product, .staticFramework) @@ -562,17 +562,14 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first) - - let targets = graph.targets.values.lazy - .flatMap(\.values) - .sorted(by: { $0.name < $1.name }) + let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) // Then XCTAssertEqual(targets.count, 2) XCTAssertEmpty(targets.flatMap(\.dependencies)) // Generated first plugin target - let firstPluginTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "A" })) + let firstPluginTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "A" })) XCTAssertEqual(firstPluginTarget.destinations, .macOS) XCTAssertEqual(firstPluginTarget.product, .staticFramework) @@ -585,7 +582,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(firstPluginTarget.dependencies) // Generated second plugin target - let secondPluginTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "B" })) + let secondPluginTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "B" })) XCTAssertEqual(secondPluginTarget.destinations, .macOS) XCTAssertEqual(secondPluginTarget.product, .staticFramework) @@ -679,7 +676,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { // Then let project = try XCTUnwrap(graph.projects.values.first) - let pluginTarget = try XCTUnwrap(project.targets.first) + let pluginTarget = try XCTUnwrap(project.targets.values.first) XCTAssertEqual( pluginTarget.sources, @@ -725,10 +722,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { let pluginsProject = try XCTUnwrap(graph.projects.values.first(where: { $0.name == pluginsProjectName })) let manifestsProject = try XCTUnwrap(graph.projects.values.first(where: { $0.name == manifestsProjectName })) - - let targets = graph.targets.values.lazy - .flatMap(\.values) - .sorted(by: { $0.name < $1.name }) + let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) let localPluginTarget = try XCTUnwrap(targets.first(where: { $0.name == "ALocalPlugin" })) let helpersTarget = try XCTUnwrap(targets.first(where: { $0.name == "ProjectDescriptionHelpers" })) let manifestsTarget = try XCTUnwrap(targets.first(where: { $0 != localPluginTarget && $0 != helpersTarget })) diff --git a/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift b/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift index 0b3e12ee5a9..c13fec5b2e7 100644 --- a/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift @@ -86,13 +86,13 @@ class ManifestModelConverterTests: TuistUnitTestCase { // Then XCTAssertEqual(model.targets.count, 2) try XCTAssertTargetMatchesManifest( - target: model.targets[0], + target: try XCTUnwrap(model.targets["A"]), matches: targetA, at: temporaryPath, generatorPaths: generatorPaths ) try XCTAssertTargetMatchesManifest( - target: model.targets[1], + target: try XCTUnwrap(model.targets["B"]), matches: targetB, at: temporaryPath, generatorPaths: generatorPaths From e1df9d6f259cc4390340c10a00aa2b182b6f250e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 10:59:18 +0200 Subject: [PATCH 328/509] add ajkolean as a contributor for code (#6361) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 +++ 2 files changed, 12 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index cc4e71cfd8b..2e5eaef60ad 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1400,6 +1400,15 @@ "contributions": [ "doc" ] + }, + { + "login": "ajkolean", + "name": "Andy Kolean", + "avatar_url": "https://avatars.githubusercontent.com/u/5394701?v=4", + "profile": "https://github.com/ajkolean", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 6530f138709..62dd3db9ea4 100644 --- a/README.md +++ b/README.md @@ -556,6 +556,9 @@ Thanks goes to these wonderful people:
    BarredEwe

    Chris Sessions
    + +
    Andy Kolean
    + From a3a17b70444750fe1a980b0bc605939e6e725acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:33:22 +0200 Subject: [PATCH 329/509] Revert "Single source of truth for targets in the graph" (#6364) * Revert "Remove duplicities in the Graph model (#6350)" This reverts commit 38561debd970d5e10e7c15e58aea76ed5a3c3e72. * Ensure generator integration tests are run * Fix tests * Force CI run --------- Co-authored-by: Kas --- .../SkipUITestsProjectMapper.swift | 2 +- .../Graph/CircularDependencyLinter.swift | 2 +- Sources/TuistCore/Graph/GraphLoader.swift | 7 +- Sources/TuistCore/Graph/GraphTraverser.swift | 43 +- .../Graph/Mappers/ProjectMapper.swift | 11 +- .../Graph/ModelExtensions/Project+Core.swift | 2 +- .../GraphTraverser/GraphTraversing.swift | 2 +- .../GraphTraverser/MockGraphTraverser.swift | 11 +- ...lProjectsPlatformNarrowerGraphMapper.swift | 27 +- ...runeOrphanExternalTargetsGraphMapper.swift | 12 +- .../Generator/InfoPlistContentProvider.swift | 2 +- .../Generator/KnownAssetTagsFetcher.swift | 8 +- .../ProjectDescriptorGenerator.swift | 4 +- .../Generator/ProjectFileElements.swift | 4 +- .../Generator/ProjectGroups.swift | 2 +- .../TuistGenerator/Linter/ProjectLinter.swift | 19 +- .../TuistGenerator/Linter/SchemeLinter.swift | 4 +- .../AutogeneratedSchemesProjectMapper.swift | 8 +- ...eratedWorkspaceSchemeWorkspaceMapper.swift | 4 +- .../ExplicitDependencyGraphMapper.swift | 2 +- .../GenerateEntitlementsProjectMapper.swift | 10 +- .../GenerateInfoPlistProjectMapper.swift | 10 +- ...GeneratePrivacyManifestProjectMapper.swift | 10 +- .../Mappers/ModuleMapMapper.swift | 13 +- .../Mappers/ResourcesProjectMapper.swift | 11 +- ...esizedResourceInterfaceProjectMapper.swift | 7 +- ...ctionDisableShowEnvVarsProjectMapper.swift | 2 +- Sources/TuistGraph/Graph/Graph.swift | 6 + Sources/TuistGraph/Models/Project.swift | 64 +- .../Graph/Graph+TestData.swift | 2 + .../Mappers/FocusTargetsGraphMappers.swift | 16 +- .../TreeShakePrunedTargetsGraphMapper.swift | 23 +- .../ProjectEditor/ProjectEditorMapper.swift | 6 +- .../ProjectAutomation+ManifestMapper.swift | 6 +- .../Graph/GraphLoaderTests.swift | 14 +- .../Graph/GraphTraverserTests.swift | 742 +++++++++++++++--- .../Graph/Mappers/ProjectMapperTests.swift | 4 +- ...ectsPlatformNarrowerGraphMapperTests.swift | 71 +- ...rphanExternalTargetsGraphMapperTests.swift | 22 +- ...ltipleConfigurationsIntegrationTests.swift | 0 .../StableStructureIntegrationTests.swift | 0 .../Generator/TestModelGenerator.swift | 4 +- .../TuistGeneratorPerformanceTests.swift | 0 .../Generator/BuildPhaseGeneratorTests.swift | 94 ++- .../Generator/ConfigGeneratorTests.swift | 30 +- .../Generator/LinkGeneratorTests.swift | 27 +- .../ProjectDescriptorGeneratorTests.swift | 25 +- .../Generator/ProjectFileElementsTests.swift | 5 + .../Generator/ProjectGroupsTests.swift | 28 +- .../SchemeDescriptorsGeneratorTests.swift | 253 +++++- .../Generator/TargetGeneratorTests.swift | 10 +- .../WorkspaceDescriptorGeneratorTests.swift | 7 +- .../GraphViz/GraphToGraphVizMapperTests.swift | 52 +- .../Linter/GraphLinterTests.swift | 168 +++- .../Linter/ProjectLinterTests.swift | 13 + .../StaticProductsGraphLinterTests.swift | 185 ++++- .../ExplicitDependencyGraphMapperTests.swift | 34 +- .../GenerateInfoPlistProjectMapperTests.swift | 2 +- .../ProjectMappers/ModuleMapMapperTests.swift | 34 + .../ResourcesProjectMapperTests.swift | 30 +- ...DisableShowEnvVarsProjectMapperTests.swift | 34 +- .../TuistGraphTests/Models/ProjectTests.swift | 8 + .../FocusTargetsGraphMappersTests.swift | 77 +- ...eeShakePrunedTargetsGraphMapperTests.swift | 27 +- .../ProjectEditorMapperTests.swift | 74 +- .../Loaders/ManifestModelConverterTests.swift | 4 +- 66 files changed, 1923 insertions(+), 517 deletions(-) rename Tests/{TuistIntegrationTests => TuistGeneratorIntegrationTests}/Generator/MultipleConfigurationsIntegrationTests.swift (100%) rename Tests/{TuistIntegrationTests => TuistGeneratorIntegrationTests}/Generator/StableStructureIntegrationTests.swift (100%) rename Tests/{TuistIntegrationTests => TuistGeneratorIntegrationTests}/Generator/TestModelGenerator.swift (98%) rename Tests/{TuistIntegrationTests => TuistGeneratorIntegrationTests}/Generator/TuistGeneratorPerformanceTests.swift (100%) diff --git a/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift b/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift index 63ec20df1eb..9847efb46bf 100644 --- a/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift +++ b/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift @@ -10,7 +10,7 @@ public final class SkipUITestsProjectMapper: ProjectMapping { logger.debug("Transforming project \(project.name): Pruning UI tests targets") var project = project - project.targets = project.targets.mapValues { target in + project.targets = project.targets.map { target in var copy = target if copy.product == .uiTests { copy.prune = true diff --git a/Sources/TuistCore/Graph/CircularDependencyLinter.swift b/Sources/TuistCore/Graph/CircularDependencyLinter.swift index fa77bec65c5..31810672805 100644 --- a/Sources/TuistCore/Graph/CircularDependencyLinter.swift +++ b/Sources/TuistCore/Graph/CircularDependencyLinter.swift @@ -40,7 +40,7 @@ public class CircularDependencyLinter: CircularDependencyLinting { } cache.add(project: project) - for target in project.targets.values.sorted() { + for target in project.targets { try lintTarget( path: path, name: target.name, diff --git a/Sources/TuistCore/Graph/GraphLoader.swift b/Sources/TuistCore/Graph/GraphLoader.swift index 168752cba97..e29133ae9c2 100644 --- a/Sources/TuistCore/Graph/GraphLoader.swift +++ b/Sources/TuistCore/Graph/GraphLoader.swift @@ -55,6 +55,7 @@ public final class GraphLoader: GraphLoading { workspace: updatedWorkspace, projects: cache.loadedProjects, packages: cache.packages, + targets: cache.loadedTargets, dependencies: cache.dependencies, dependencyConditions: cache.dependencyConditions ) @@ -75,7 +76,7 @@ public final class GraphLoader: GraphLoading { } cache.add(project: project) - for target in project.targets.values { + for target in project.targets { try loadTarget( path: path, name: target.name, @@ -321,7 +322,9 @@ public final class GraphLoader: GraphLoading { init(projects: [Project]) { let allProjects = Dictionary(uniqueKeysWithValues: projects.map { ($0.path, $0) }) - let allTargets = allProjects.mapValues { $0.targets } + let allTargets = allProjects.mapValues { + Dictionary(uniqueKeysWithValues: $0.targets.map { ($0.name, $0) }) + } self.allProjects = allProjects self.allTargets = allTargets } diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index 425287ba0df..f2d32a87257 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -10,14 +10,7 @@ public class GraphTraverser: GraphTraversing { public var path: AbsolutePath { graph.path } public var workspace: Workspace { graph.workspace } public var projects: [AbsolutePath: Project] { graph.projects } - - /// It returns the targets of the graph projects. - /// - Returns: A dictionary where the key is the path to the project, and the value are a dictionary where - /// the keys are the name of the targets, and the value the target representation. - public func targets() -> [AbsolutePath: [String: Target]] { - return projects.mapValues { $0.targets } - } - + public var targets: [AbsolutePath: [String: Target]] { graph.targets } public var dependencies: [GraphDependency: Set] { graph.dependencies } private let graph: Graph @@ -87,7 +80,7 @@ public class GraphTraverser: GraphTraversing { public func targets(product: Product) -> Set { var filteredTargets: Set = Set() - for (path, projectTargets) in targets() { + for (path, projectTargets) in targets { projectTargets.values.forEach { target in guard target.product == product else { return } guard let project = projects[path] else { return } @@ -98,14 +91,14 @@ public class GraphTraverser: GraphTraversing { } public func target(path: AbsolutePath, name: String) -> GraphTarget? { - guard let project = graph.projects[path], - let target = project.targets[name] else { return nil } + guard let project = graph.projects[path], let target = graph.targets[path]?[name] else { return nil } return GraphTarget(path: path, target: target, project: project) } public func targets(at path: AbsolutePath) -> Set { guard let project = graph.projects[path] else { return Set() } - return Set(project.targets.values.map { GraphTarget(path: path, target: $0, project: project) }) + guard let targets = graph.targets[path] else { return [] } + return Set(targets.values.map { GraphTarget(path: path, target: $0, project: project) }) } public func testPlan(name: String) -> TestPlan? { @@ -153,7 +146,7 @@ public class GraphTraverser: GraphTraversing { for target: GraphDependency ) -> [GraphTargetReference] { dependencies.compactMap { dependencyName, dependencyPath -> GraphTargetReference? in - guard let projectDependencies = graph.projects[dependencyPath]?.targets, + guard let projectDependencies = graph.targets[dependencyPath], let dependencyTarget = projectDependencies[dependencyName], let dependencyProject = graph.projects[dependencyPath] else { @@ -166,7 +159,7 @@ public class GraphTraverser: GraphTraversing { } public func resourceBundleDependencies(path: AbsolutePath, name: String) -> Set { - guard let target = graph.projects[path]?.targets[name] else { return [] } + guard let target = graph.targets[path]?[name] else { return [] } guard target.supportsResources else { return [] } let canHostResources: (GraphDependency) -> Bool = { @@ -186,7 +179,7 @@ public class GraphTraverser: GraphTraversing { guard case let GraphDependency.target(name, path) = dependency else { return nil } - guard let target = graph.projects[path]?.targets[name] else { return nil } + guard let target = graph.targets[path]?[name] else { return nil } guard let project = graph.projects[path] else { return nil } return GraphTarget(path: path, target: target, project: project) } @@ -237,7 +230,7 @@ public class GraphTraverser: GraphTraversing { graph.dependencies[.target(name: name, path: path)]? .compactMap { (dependency: GraphDependency) -> GraphDependencyReference? in guard case let GraphDependency.target(dependencyName, dependencyPath) = dependency, - let target = graph.projects[dependencyPath]?.targets[dependencyName], + let target = graph.targets[dependencyPath]?[dependencyName], target.product.isStatic else { return nil @@ -555,8 +548,8 @@ public class GraphTraverser: GraphTraversing { } public func hostTargetFor(path: AbsolutePath, name: String) -> GraphTarget? { + guard let targets = graph.targets[path] else { return nil } guard let project = graph.projects[path] else { return nil } - let targets = project.targets return targets.values.compactMap { target -> GraphTarget? in let dependencies = self.graph.dependencies[.target(name: target.name, path: path), default: Set()] @@ -679,9 +672,11 @@ public class GraphTraverser: GraphTraversing { } public func allExternalTargets() -> Set { - Set(graph.projects.flatMap { path, project -> [GraphTarget] in - guard project.isExternal else { return [] } - return project.targets.values.map { GraphTarget(path: path, target: $0, project: project) } + Set(graph.projects.compactMap { path, project in + project.isExternal ? (path, project) : nil + }.flatMap { projectPath, project in + let targets = graph.targets[projectPath, default: [:]].values + return targets.map { GraphTarget(path: projectPath, target: $0, project: project) } }) } @@ -694,8 +689,8 @@ public class GraphTraverser: GraphTraversing { let allTargetExternalDependendedUponTargets = filterDependencies(from: graphDependenciesWithExternalDependencies) .compactMap { graphDependency -> GraphTarget? in if case let GraphDependency.target(name, path) = graphDependency { - guard let project = graph.projects[path], - let target = project.targets[name] + guard let target = graph.targets[path]?[name], + let project = graph.projects[path] else { return nil } @@ -1183,7 +1178,9 @@ public class GraphTraverser: GraphTraversing { private func allTargets(excludingExternalTargets: Bool) -> Set { Set(projects.flatMap { projectPath, project -> [GraphTarget] in if excludingExternalTargets, project.isExternal { return [] } - return project.targets.values.map { target in + + let targets = graph.targets[projectPath, default: [:]] + return targets.values.map { target in GraphTarget(path: projectPath, target: target, project: project) } }) diff --git a/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift b/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift index d42433db8ac..6625c9097fa 100644 --- a/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift +++ b/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift @@ -31,15 +31,12 @@ public class TargetProjectMapper: ProjectMapping { } public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { - var results = (targets: [String: Target](), sideEffects: [SideEffectDescriptor]()) - results = try project.targets.values.reduce(into: results) { results, target in + var results = (targets: [Target](), sideEffects: [SideEffectDescriptor]()) + results = try project.targets.reduce(into: results) { results, target in let (updatedTarget, sideEffects) = try mapper.map(target: target) - results.targets[updatedTarget.name] = updatedTarget + results.targets.append(updatedTarget) results.sideEffects.append(contentsOf: sideEffects) } - var project = project - project.targets = results.targets - - return (project, results.sideEffects) + return (project.with(targets: results.targets), results.sideEffects) } } diff --git a/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift index 1e4fb68f872..0158dd16f3a 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift @@ -10,7 +10,7 @@ extension Project { /// - Parameter graph: Dependencies graph. /// - Returns: Sorted targets. public func sortedTargetsForProjectScheme(graph: Graph) -> [Target] { - targets.values.sorted { first, second -> Bool in + targets.sorted { first, second -> Bool in // First criteria: Test bundles at the end if first.product.testsBundle, !second.product.testsBundle { return false diff --git a/Sources/TuistCore/GraphTraverser/GraphTraversing.swift b/Sources/TuistCore/GraphTraverser/GraphTraversing.swift index 78ab89b3f3f..3fb3e236be5 100644 --- a/Sources/TuistCore/GraphTraverser/GraphTraversing.swift +++ b/Sources/TuistCore/GraphTraverser/GraphTraversing.swift @@ -22,7 +22,7 @@ public protocol GraphTraversing { var projects: [AbsolutePath: Project] { get } /// Returns all the targets of the graph. - func targets() -> [AbsolutePath: [String: Target]] + var targets: [AbsolutePath: [String: Target]] { get } /// Dependencies. var dependencies: [GraphDependency: Set] { get } diff --git a/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift b/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift index 5d33013e964..e77d81ec2d6 100644 --- a/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift +++ b/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift @@ -65,12 +65,13 @@ final class MockGraphTraverser: GraphTraversing { return stubbedProjects } - var invokedTargets = false - var invokedTargetsCount = 0 + var invokedTargetsGetter = false + var invokedTargetsGetterCount = 0 var stubbedTargets: [AbsolutePath: [String: Target]]! = [:] - func targets() -> [TSCBasic.AbsolutePath: [String: TuistGraph.Target]] { - invokedTargets = true - invokedTargetsCount += 1 + + var targets: [AbsolutePath: [String: Target]] { + invokedTargetsGetter = true + invokedTargetsGetterCount += 1 return stubbedTargets } diff --git a/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift b/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift index 05a707b2a30..dace8c59836 100644 --- a/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift +++ b/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift @@ -23,16 +23,27 @@ public struct ExternalProjectsPlatformNarrowerGraphMapper: GraphMapping { // swi var graph = graph let externalTargetSupportedPlatforms = GraphTraverser(graph: graph).externalTargetSupportedPlatforms() - graph.projects = Dictionary(uniqueKeysWithValues: graph.projects.map { projectPath, project in - var project = project - project.targets = Dictionary(uniqueKeysWithValues: project.targets.map { _, target in - let mappedTarget = mapTarget( - target: target, - project: project, - externalTargetSupportedPlatforms: externalTargetSupportedPlatforms + graph.targets = Dictionary(uniqueKeysWithValues: graph.targets.map { projectPath, projectTargets in + let project = graph.projects[projectPath]! + let projectTargets = Dictionary(uniqueKeysWithValues: projectTargets.map { targetName, target in + ( + targetName, + mapTarget( + target: target, + project: project, + externalTargetSupportedPlatforms: externalTargetSupportedPlatforms + ) ) - return (mappedTarget.name, mappedTarget) }) + return (projectPath, projectTargets) + }) + graph.projects = Dictionary(uniqueKeysWithValues: graph.projects.map { projectPath, project in + var project = project + project.targets = project.targets.map { mapTarget( + target: $0, + project: project, + externalTargetSupportedPlatforms: externalTargetSupportedPlatforms + ) } return (projectPath, project) }) diff --git a/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift b/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift index c965d48d155..89a098ff0dd 100644 --- a/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift +++ b/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift @@ -17,19 +17,19 @@ public struct PruneOrphanExternalTargetsGraphMapper: GraphMapping { let orphanExternalTargets = graphTraverser.allOrphanExternalTargets() var graph = graph - - graph.projects = Dictionary(uniqueKeysWithValues: graph.projects.map { projectPath, project in - var project = project - project.targets = Dictionary(uniqueKeysWithValues: project.targets.compactMap { _, target -> (String, Target)? in + graph.targets = Dictionary(uniqueKeysWithValues: graph.targets.map { projectPath, targets in + let targets = Dictionary(uniqueKeysWithValues: targets.compactMap { targetName, target -> (String, Target)? in let project = graph.projects[projectPath]! let graphTarget = GraphTarget(path: projectPath, target: target, project: project) var target = target if orphanExternalTargets.contains(graphTarget) || target.destinations.isEmpty { target.prune = true + return (targetName, target) + } else { + return (targetName, target) } - return (target.name, target) }) - return (projectPath, project) + return (projectPath, targets) }) return (graph, []) diff --git a/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift b/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift index 8ddd7377116..c1fd7dd9275 100644 --- a/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift +++ b/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift @@ -242,7 +242,7 @@ final class InfoPlistContentProvider: InfoPlistContentProviding { } private func hostTarget(for target: Target, in project: Project) -> Target? { - project.targets.values.first { + project.targets.first { $0.dependencies.contains(where: { dependency in if case let .target(name, _) = dependency, name == target.name { return true diff --git a/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift b/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift index c7f953d0b85..358f22fadac 100644 --- a/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift +++ b/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift @@ -20,13 +20,13 @@ protocol KnownAssetTagsFetching: AnyObject { final class KnownAssetTagsFetcher: KnownAssetTagsFetching { func fetch(project: Project) throws -> [String] { - var tags = project.targets.values.map { $0.resources.resources.map(\.tags).flatMap { $0 } }.flatMap { $0 } + var tags = project.targets.map { $0.resources.resources.map(\.tags).flatMap { $0 } }.flatMap { $0 } - let initialInstallTags = project.targets.values.compactMap { + let initialInstallTags = project.targets.compactMap { $0.onDemandResourcesTags?.initialInstall?.compactMap { $0 } }.flatMap { $0 } - let prefetchOrderTags = project.targets.values.compactMap { + let prefetchOrderTags = project.targets.compactMap { $0.onDemandResourcesTags?.prefetchOrder?.compactMap { $0 } }.flatMap { $0 } @@ -35,7 +35,7 @@ final class KnownAssetTagsFetcher: KnownAssetTagsFetching { var assetContentsPaths: Set = [] let decoder = JSONDecoder() - for target in project.targets.values { + for target in project.targets { let assetCatalogs = target.resources.resources.filter { $0.path.extension == "xcassets" } for assetCatalog in assetCatalogs { guard let children = try? assetCatalog.path.path.recursiveChildren() else { continue } diff --git a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift index 44f1a5c7819..8fa3ea47e9f 100644 --- a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift @@ -204,7 +204,7 @@ final class ProjectDescriptorGenerator: ProjectDescriptorGenerating { graphTraverser: GraphTraversing ) throws -> [String: PBXNativeTarget] { var nativeTargets: [String: PBXNativeTarget] = [:] - for target in project.targets.values { + for target in project.targets { let nativeTarget = try targetGenerator.generateTarget( target: target, project: project, @@ -221,7 +221,7 @@ final class ProjectDescriptorGenerator: ProjectDescriptorGenerating { /// Target dependencies try targetGenerator.generateTargetDependencies( path: project.path, - targets: Array(project.targets.values), + targets: project.targets, nativeTargets: nativeTargets, graphTraverser: graphTraverser ) diff --git a/Sources/TuistGenerator/Generator/ProjectFileElements.swift b/Sources/TuistGenerator/Generator/ProjectFileElements.swift index b7e9414514e..e2ac660c71c 100644 --- a/Sources/TuistGenerator/Generator/ProjectFileElements.swift +++ b/Sources/TuistGenerator/Generator/ProjectFileElements.swift @@ -60,7 +60,7 @@ class ProjectFileElements { ) throws { var files = Set() - for target in project.targets.values { + for target in project.targets { try files.formUnion(targetFiles(target: target)) } let projectFileElements = projectFiles(project: project) @@ -79,7 +79,7 @@ class ProjectFileElements { ) // Products - let directProducts = project.targets.values.map { + let directProducts = project.targets.map { GraphDependencyReference.product(target: $0.name, productName: $0.productNameWithExtension, condition: nil) } diff --git a/Sources/TuistGenerator/Generator/ProjectGroups.swift b/Sources/TuistGenerator/Generator/ProjectGroups.swift index d6d8792207a..e0992a7dc6f 100644 --- a/Sources/TuistGenerator/Generator/ProjectGroups.swift +++ b/Sources/TuistGenerator/Generator/ProjectGroups.swift @@ -143,7 +143,7 @@ class ProjectGroups { } private static func extractProjectGroupNames(from project: Project) -> [String] { - let groups = [project.filesGroup] + project.targets.values.map(\.filesGroup) + let groups = [project.filesGroup] + project.targets.map(\.filesGroup) let groupNames: [String] = groups.compactMap { switch $0 { case let .group(name: groupName): diff --git a/Sources/TuistGenerator/Linter/ProjectLinter.swift b/Sources/TuistGenerator/Linter/ProjectLinter.swift index ab061abe2b7..ad3cca9f9df 100644 --- a/Sources/TuistGenerator/Linter/ProjectLinter.swift +++ b/Sources/TuistGenerator/Linter/ProjectLinter.swift @@ -49,7 +49,24 @@ class ProjectLinter: ProjectLinting { private func lintTargets(project: Project) -> [LintingIssue] { var issues: [LintingIssue] = [] - issues.append(contentsOf: project.targets.values.flatMap(targetLinter.lint)) + issues.append(contentsOf: project.targets.flatMap(targetLinter.lint)) + issues.append(contentsOf: lintNotDuplicatedTargets(project: project)) + return issues + } + + private func lintNotDuplicatedTargets(project: Project) -> [LintingIssue] { + var issues: [LintingIssue] = [] + let duplicatedTargets = project.targets.map(\.name) + .reduce(into: [String: Int]()) { $0[$1] = ($0[$1] ?? 0) + 1 } + .filter { $0.value > 1 } + .keys + if !duplicatedTargets.isEmpty { + let issue = LintingIssue( + reason: "Targets \(duplicatedTargets.joined(separator: ", ")) from project at \(project.path.pathString) have duplicates.", + severity: .error + ) + issues.append(issue) + } return issues } } diff --git a/Sources/TuistGenerator/Linter/SchemeLinter.swift b/Sources/TuistGenerator/Linter/SchemeLinter.swift index 8d7b8e5200e..d7acef39cc0 100644 --- a/Sources/TuistGenerator/Linter/SchemeLinter.swift +++ b/Sources/TuistGenerator/Linter/SchemeLinter.swift @@ -11,8 +11,8 @@ class SchemeLinter: SchemeLinting { func lint(project: Project) -> [LintingIssue] { var issues = [LintingIssue]() issues.append(contentsOf: lintReferencedBuildConfigurations(schemes: project.schemes, settings: project.settings)) - issues.append(contentsOf: lintCodeCoverageTargets(schemes: project.schemes, targets: Array(project.targets.values))) - issues.append(contentsOf: lintExpandVariableTarget(schemes: project.schemes, targets: Array(project.targets.values))) + issues.append(contentsOf: lintCodeCoverageTargets(schemes: project.schemes, targets: project.targets)) + issues.append(contentsOf: lintExpandVariableTarget(schemes: project.schemes, targets: project.targets)) issues.append(contentsOf: projectSchemeCantReferenceRemoteTargets(schemes: project.schemes, project: project)) return issues } diff --git a/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift b/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift index 560ed66ae16..e7f717e1787 100644 --- a/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift @@ -22,7 +22,7 @@ public final class AutogeneratedSchemesProjectMapper: ProjectMapping { // swiftl var buildTargets: Set = [] var testTargets: Set = [] var runTargets: Set = [] - for target in project.targets.values { + for target in project.targets { switch target.product { case .app, .appClip, .commandLineTool, .watch2App, .xpc: runTargets.insert(target) @@ -108,9 +108,7 @@ public final class AutogeneratedSchemesProjectMapper: ProjectMapping { // swiftl } let filteredAutogeneratedSchemes = autogeneratedSchemes.filter { !userDefinedSchemeNames.contains($0.name) } - var project = project - project.schemes = (userDefinedSchemes + filteredAutogeneratedSchemes).sorted { $0.name < $1.name } - return (project, []) + return (project.with(schemes: (userDefinedSchemes + filteredAutogeneratedSchemes).sorted { $0.name < $1.name }), []) } // MARK: - Private @@ -319,7 +317,6 @@ public final class AutogeneratedSchemesProjectMapper: ProjectMapping { // swiftl private func hostAppTargetReference(for target: Target, project: Project) -> Target? { project.targets - .values .filter { $0.product.canHostTests() && $0.dependencies.contains(where: { dependency in if case let .target(name, _) = dependency, name == target.name { return true @@ -333,7 +330,6 @@ public final class AutogeneratedSchemesProjectMapper: ProjectMapping { // swiftl private func hostWatchAppTargetReference(for target: Target, project: Project) -> Target? { project.targets - .values .filter { $0.product == .watch2App && $0.dependencies.contains(where: { dependency in if case let .target(name, _) = dependency, name == target.name { return true diff --git a/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift b/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift index 6bb0c83e775..f2568e67eaa 100644 --- a/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift +++ b/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift @@ -23,7 +23,7 @@ public final class AutogeneratedWorkspaceSchemeWorkspaceMapper: WorkspaceMapping let platforms = Set( workspace.projects .flatMap { - $0.targets.values.flatMap(\.supportedPlatforms) + $0.targets.flatMap(\.supportedPlatforms) } ) @@ -55,11 +55,9 @@ public final class AutogeneratedWorkspaceSchemeWorkspaceMapper: WorkspaceMapping var (targets, testableTargets): ([TargetReference], [TestableTarget]) = workspace.projects .reduce(([], [])) { result, project in let targets = project.targets - .values .filter { !$0.supportedPlatforms.isDisjoint(with: platforms) } .map { TargetReference(projectPath: project.path, name: $0.name) } let testableTargets = project.targets - .values .filter { !$0.supportedPlatforms.isDisjoint(with: platforms) } .filter(\.product.testsBundle) .map { TargetReference(projectPath: project.path, name: $0.name) } diff --git a/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift b/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift index ff28c933b54..01291ef3ddc 100644 --- a/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift +++ b/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift @@ -23,7 +23,7 @@ public struct ExplicitDependencyGraphMapper: GraphMapping { graph.projects = Dictionary(uniqueKeysWithValues: graph.projects.map { projectPath, project in var project = project - project.targets = project.targets.mapValues { target in + project.targets = project.targets.map { target in let graphTarget = GraphTarget(path: projectPath, target: target, project: project) let projectDebugConfigurations = project.settings.configurations.keys .filter { $0.variant == .debug } diff --git a/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift b/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift index 7b60e899086..f0397f84add 100644 --- a/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift @@ -23,16 +23,14 @@ public final class GenerateEntitlementsProjectMapper: ProjectMapping { public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { logger.debug("Transforming project \(project.name): Synthesizing entitlement files'") - let results = try project.targets.values - .reduce(into: (targets: [String: Target](), sideEffects: [SideEffectDescriptor]())) { results, target in + let results = try project.targets + .reduce(into: (targets: [Target](), sideEffects: [SideEffectDescriptor]())) { results, target in let (updatedTarget, sideEffects) = try map(target: target, project: project) - results.targets[updatedTarget.name] = updatedTarget + results.targets.append(updatedTarget) results.sideEffects.append(contentsOf: sideEffects) } - var project = project - project.targets = results.targets - return (project, results.sideEffects) + return (project.with(targets: results.targets), results.sideEffects) } // MARK: - Private diff --git a/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift b/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift index f6e368066e8..a23b61f25e9 100644 --- a/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift @@ -37,16 +37,14 @@ public final class GenerateInfoPlistProjectMapper: ProjectMapping { public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { logger.debug("Transforming project \(project.name): Synthesizing Info.plist") - let results = try project.targets.values - .reduce(into: (targets: [String: Target](), sideEffects: [SideEffectDescriptor]())) { results, target in + let results = try project.targets + .reduce(into: (targets: [Target](), sideEffects: [SideEffectDescriptor]())) { results, target in let (updatedTarget, sideEffects) = try map(target: target, project: project) - results.targets[updatedTarget.name] = updatedTarget + results.targets.append(updatedTarget) results.sideEffects.append(contentsOf: sideEffects) } - var project = project - project.targets = results.targets - return (project, results.sideEffects) + return (project.with(targets: results.targets), results.sideEffects) } // MARK: - Private diff --git a/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift b/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift index fa2350c86ed..5c2832e9e6a 100644 --- a/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift @@ -14,16 +14,14 @@ public final class GeneratePrivacyManifestProjectMapper: ProjectMapping { public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { logger.debug("Transforming project \(project.name): Synthesizing privacy manifest files'") - let results = try project.targets.values - .reduce(into: (targets: [String: Target](), sideEffects: [SideEffectDescriptor]())) { results, target in + let results = try project.targets + .reduce(into: (targets: [Target](), sideEffects: [SideEffectDescriptor]())) { results, target in let (updatedTarget, sideEffects) = try map(target: target, project: project) - results.targets[updatedTarget.name] = updatedTarget + results.targets.append(updatedTarget) results.sideEffects.append(contentsOf: sideEffects) } - var project = project - project.targets = results.targets - return (project, results.sideEffects) + return (project.with(targets: results.targets), results.sideEffects) } // MARK: - Private diff --git a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift index 3a6cbbb0e09..436be1f472d 100644 --- a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift +++ b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift @@ -46,13 +46,12 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ graph.projects = Dictionary(uniqueKeysWithValues: graph.projects.map { projectPath, project in var project = project - project.targets = Dictionary(uniqueKeysWithValues: project.targets.map { targetName, target in + project.targets = project.targets.map { target in var target = target let targetID = TargetID(projectPath: project.path, targetName: target.name) var mappedSettingsDictionary = target.settings?.base ?? [:] let hasModuleMap = mappedSettingsDictionary[Self.modulemapFileSetting] != nil - guard hasModuleMap || !(targetToDependenciesMetadata[targetID]?.isEmpty ?? true) - else { return (targetName, target) } + guard hasModuleMap || !(targetToDependenciesMetadata[targetID]?.isEmpty ?? true) else { return target } if hasModuleMap { mappedSettingsDictionary[Self.modulemapFileSetting] = nil @@ -89,8 +88,10 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ ) target.settings = targetSettings.with(base: mappedSettingsDictionary) - return (target.name, target) - }) + graph.targets[project.path]?[target.name] = target + + return target + } return (projectPath, project) }) @@ -104,7 +105,7 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ var targetsByName = [String: Target]() for project in workspace.projects { projectsByPath[project.path] = project - for target in project.targets.values { + for target in project.targets { targetsByName[target.name] = target } } diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 17515e69727..4b3a2e5f74d 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -18,18 +18,15 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this logger.debug("Transforming project \(project.name): Generating bundles for libraries'") var sideEffects: [SideEffectDescriptor] = [] - var targets: [String: Target] = [:] + var targets: [Target] = [] - for target in project.targets.values { + for target in project.targets { let (mappedTargets, targetSideEffects) = try mapTarget(target, project: project) - mappedTargets.forEach { targets[$0.name] = $0 } + targets.append(contentsOf: mappedTargets) sideEffects.append(contentsOf: targetSideEffects) } - var project = project - project.targets = targets - - return (project, sideEffects) + return (project.with(targets: targets), sideEffects) } // swiftlint:disable:next function_body_length diff --git a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift index 2f3ca031664..3f7ae196643 100644 --- a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift @@ -52,14 +52,13 @@ public final class SynthesizedResourceInterfaceProjectMapper: ProjectMapping { / } logger.debug("Transforming project \(project.name): Synthesizing resource accessors") - let mappings = try project.targets.values + let mappings = try project.targets .map { try mapTarget($0, project: project) } let targets: [Target] = mappings.map(\.0) let sideEffects: [SideEffectDescriptor] = mappings.map(\.1).flatMap { $0 } - var project = project - project.targets = Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) }) - return (project, sideEffects) + + return (project.with(targets: targets), sideEffects) } // MARK: - Helpers diff --git a/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift b/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift index b1dfbdac6e8..bef806223c3 100644 --- a/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift @@ -13,7 +13,7 @@ public final class TargetActionDisableShowEnvVarsProjectMapper: ProjectMapping { ) var project = project - project.targets = project.targets.mapValues { target in + project.targets = project.targets.map { target in var mappedTarget = target mappedTarget.scripts = mappedTarget.scripts.map { var script = $0 diff --git a/Sources/TuistGraph/Graph/Graph.swift b/Sources/TuistGraph/Graph/Graph.swift index a14981d639d..6799d08f636 100644 --- a/Sources/TuistGraph/Graph/Graph.swift +++ b/Sources/TuistGraph/Graph/Graph.swift @@ -20,6 +20,10 @@ public struct Graph: Equatable, Codable { /// and the values are dictionaries where the key is the reference to the package, and the values are the packages. public var packages: [AbsolutePath: [String: Package]] + /// A dictionary where the keys are paths to the directories where the projects that contain targets are defined, + /// and the values are dictionaries where the key is the name of the target, and the values are the targets. + public var targets: [AbsolutePath: [String: Target]] + /// A dictionary that contains the one-to-many dependencies that represent the graph. public var dependencies: [GraphDependency: Set] @@ -32,6 +36,7 @@ public struct Graph: Equatable, Codable { workspace: Workspace, projects: [AbsolutePath: Project], packages: [AbsolutePath: [String: Package]], + targets: [AbsolutePath: [String: Target]], dependencies: [GraphDependency: Set], dependencyConditions: [GraphEdge: PlatformCondition] ) { @@ -40,6 +45,7 @@ public struct Graph: Equatable, Codable { self.workspace = workspace self.projects = projects self.packages = packages + self.targets = targets self.dependencies = dependencies self.dependencyConditions = dependencyConditions } diff --git a/Sources/TuistGraph/Models/Project.swift b/Sources/TuistGraph/Models/Project.swift index 078b184b2a3..eff2f35f510 100644 --- a/Sources/TuistGraph/Models/Project.swift +++ b/Sources/TuistGraph/Models/Project.swift @@ -18,19 +18,19 @@ public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebug public var name: String /// Organization name. - public var organizationName: String? + public let organizationName: String? /// Default known regions - public var defaultKnownRegions: [String]? + public let defaultKnownRegions: [String]? /// Development region code e.g. `en`. - public var developmentRegion: String? + public let developmentRegion: String? /// Additional project options. public var options: Options /// Project targets. - public var targets: [String: Target] + public var targets: [Target] /// Project swift packages. public var packages: [Package] @@ -51,13 +51,13 @@ public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebug public var ideTemplateMacros: IDETemplateMacros? /// `ResourceSynthesizers` that will be applied on individual target's resources - public var resourceSynthesizers: [ResourceSynthesizer] + public let resourceSynthesizers: [ResourceSynthesizer] /// The version in which a check happened related to recommended settings after updating Xcode. public var lastUpgradeCheck: Version? /// Indicates whether the project is imported through `Package.swift`. - public var isExternal: Bool + public let isExternal: Bool // MARK: - Init @@ -111,7 +111,7 @@ public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebug self.defaultKnownRegions = defaultKnownRegions self.developmentRegion = developmentRegion self.options = options - self.targets = Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) }) + self.targets = targets self.packages = packages self.schemes = schemes self.settings = settings @@ -143,6 +143,56 @@ public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebug // MARK: - Public + /// Returns a copy of the project with the given targets set. + /// - Parameter targets: Targets to be set to the copy. + public func with(targets: [Target]) -> Project { + Project( + path: path, + sourceRootPath: sourceRootPath, + xcodeProjPath: xcodeProjPath, + name: name, + organizationName: organizationName, + defaultKnownRegions: defaultKnownRegions, + developmentRegion: developmentRegion, + options: options, + settings: settings, + filesGroup: filesGroup, + targets: targets, + packages: packages, + schemes: schemes, + ideTemplateMacros: ideTemplateMacros, + additionalFiles: additionalFiles, + resourceSynthesizers: resourceSynthesizers, + lastUpgradeCheck: lastUpgradeCheck, + isExternal: isExternal + ) + } + + /// Returns a copy of the project with the given schemes set. + /// - Parameter schemes: Schemes to be set to the copy. + public func with(schemes: [Scheme]) -> Project { + Project( + path: path, + sourceRootPath: sourceRootPath, + xcodeProjPath: xcodeProjPath, + name: name, + organizationName: organizationName, + defaultKnownRegions: defaultKnownRegions, + developmentRegion: developmentRegion, + options: options, + settings: settings, + filesGroup: filesGroup, + targets: targets, + packages: packages, + schemes: schemes, + ideTemplateMacros: ideTemplateMacros, + additionalFiles: additionalFiles, + resourceSynthesizers: resourceSynthesizers, + lastUpgradeCheck: lastUpgradeCheck, + isExternal: isExternal + ) + } + /// Returns the name of the default configuration. public var defaultDebugBuildConfigurationName: String { let debugConfiguration = settings.defaultDebugBuildConfiguration() diff --git a/Sources/TuistGraphTesting/Graph/Graph+TestData.swift b/Sources/TuistGraphTesting/Graph/Graph+TestData.swift index e4ada3bffa7..4733127da21 100644 --- a/Sources/TuistGraphTesting/Graph/Graph+TestData.swift +++ b/Sources/TuistGraphTesting/Graph/Graph+TestData.swift @@ -9,6 +9,7 @@ extension Graph { workspace: Workspace = .test(), projects: [AbsolutePath: Project] = [:], packages: [AbsolutePath: [String: Package]] = [:], + targets: [AbsolutePath: [String: Target]] = [:], dependencies: [GraphDependency: Set] = [:], dependencyConditions: [GraphEdge: PlatformCondition] = [:] ) -> Graph { @@ -18,6 +19,7 @@ extension Graph { workspace: workspace, projects: projects, packages: packages, + targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) diff --git a/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift b/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift index a2f788a211e..15f75e3dcbe 100644 --- a/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift +++ b/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift @@ -61,19 +61,11 @@ public final class FocusTargetsGraphMappers: GraphMapping { successors: { Array(graphTraverser.directTargetDependencies(path: $0.path, name: $0.target.name)).map(\.graphTarget) } )) - graph.projects = graph.projects.mapValues { project in - var project = project - project.targets = project.targets.mapValues { target in - var target = target - if !filteredTargets.contains(GraphTarget(path: project.path, target: target, project: project)) { - target.prune = true - } - return target - } - - return project + for graphTarget in graphTraverser.allTargets() where !filteredTargets.contains(graphTarget) { + var target = graphTarget.target + target.prune = true + graph.targets[graphTarget.path]?[target.name] = target } - return (graph, []) } } diff --git a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift index 06c1a7fb7f7..969f030bd76 100644 --- a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift +++ b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift @@ -8,19 +8,20 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { public func map(graph: Graph) throws -> (Graph, [SideEffectDescriptor]) { logger.debug("Transforming graph \(graph.name): Tree-shaking nodes") - let sourceTargets: Set = Set(graph.projects.flatMap { projectPath, project -> [TargetReference] in - return project.targets.compactMap { _, target -> TargetReference? in + let sourceTargets: Set = Set(graph.targets.flatMap { projectPath, targets -> [TargetReference] in + guard graph.projects[projectPath] != nil else { return [] } + return targets.compactMap { _, target -> TargetReference? in if target.prune { return nil } return TargetReference(projectPath: projectPath, name: target.name) } }) // If the number of source targets matches the number of targets in the graph there's nothing to be pruned. - if sourceTargets.count == graph.projects.values.flatMap(\.targets.values).count { return (graph, []) } + if sourceTargets.count == graph.targets.flatMap(\.value.values).count { return (graph, []) } let projects = graph.projects.reduce(into: [AbsolutePath: Project]()) { acc, next in let targets = self.treeShake( - targets: Array(next.value.targets.values), + targets: next.value.targets, path: next.key, graph: graph, sourceTargets: sourceTargets @@ -32,10 +33,7 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { schemes: next.value.schemes, sourceTargets: sourceTargets ) - var project = next.value - project.schemes = schemes - project.targets = Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) }) - acc[next.key] = project + acc[next.key] = next.value.with(targets: targets).with(schemes: schemes) } } @@ -48,6 +46,13 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { var graph = graph graph.workspace = workspace graph.projects = projects + graph.targets = sourceTargets.reduce(into: [AbsolutePath: [String: Target]]()) { acc, targetReference in + var targets = acc[targetReference.projectPath, default: [:]] + if let target = graph.targets[targetReference.projectPath, default: [:]][targetReference.name] { + targets[target.name] = target + } + acc[targetReference.projectPath] = targets + } return (graph, []) } @@ -67,7 +72,7 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { sourceTargets: Set ) -> [Target] { targets.compactMap { target -> Target? in - guard let target = graph.projects[path]?.targets[target.name] else { return nil } + guard let target = graph.targets[path, default: [:]][target.name] else { return nil } let targetReference = TargetReference(projectPath: path, name: target.name) guard sourceTargets.contains(targetReference) else { return nil } return target diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift index 7f2e9c95b4a..6a1355c48c6 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift @@ -103,11 +103,12 @@ final class ProjectEditorMapper: ProjectEditorMapping { let graphTargets = projects .lazy .map { ($0.path, $0.targets) } + .map { path, targets in (path, Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) })) } let graphDependencies = projects .lazy .flatMap { project -> [(GraphDependency, Set)] in - let graphDependencies = project.targets.values.map(\.dependencies).lazy.map { dependencies in + let graphDependencies = project.targets.map(\.dependencies).lazy.map { dependencies in dependencies.lazy.compactMap { dependency -> GraphDependency? in switch dependency { case let .target(name, _): @@ -122,7 +123,7 @@ final class ProjectEditorMapper: ProjectEditorMapping { } } - return zip(project.targets.values, graphDependencies).map { target, dependencies in + return zip(project.targets, graphDependencies).map { target, dependencies in (GraphDependency.target(name: target.name, path: project.path), Set(dependencies)) } } @@ -133,6 +134,7 @@ final class ProjectEditorMapper: ProjectEditorMapping { workspace: workspace, projects: graphProjects, packages: [:], + targets: Dictionary(uniqueKeysWithValues: graphTargets), dependencies: Dictionary(uniqueKeysWithValues: graphDependencies), dependencyConditions: [:] ) diff --git a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift index b61600cbbac..8215a0d48ed 100644 --- a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift +++ b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift @@ -37,16 +37,14 @@ extension ProjectAutomation.Project { let packages = project.packages .reduce(into: [ProjectAutomation.Package]()) { $0.append(ProjectAutomation.Package.from($1)) } let schemes = project.schemes.reduce(into: [ProjectAutomation.Scheme]()) { $0.append(ProjectAutomation.Scheme.from($1)) } - let targets = project.targets.mapValues { target in - ProjectAutomation.Target.from(target) - } + let targets = project.targets.reduce(into: [ProjectAutomation.Target]()) { $0.append(ProjectAutomation.Target.from($1)) } return ProjectAutomation.Project( name: project.name, path: project.path.pathString, isExternal: project.isExternal, packages: packages, - targets: Array(targets.values), + targets: targets, schemes: schemes ) } diff --git a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift index 3b1651e1e3c..a3bbe0fc400 100644 --- a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift @@ -45,7 +45,7 @@ final class GraphLoaderTests: TuistUnitTestCase { XCTAssertEqual(graph.projects, [ "/A": projectA, ]) - XCTAssertTrue(graph.projects.values.flatMap(\.targets).isEmpty) + XCTAssertTrue(graph.targets.isEmpty) XCTAssertTrue(graph.dependencies.isEmpty) } @@ -71,7 +71,7 @@ final class GraphLoaderTests: TuistUnitTestCase { "/A": projectA, "/B": projectB, ]) - XCTAssertTrue(graph.projects.values.flatMap(\.targets).isEmpty) + XCTAssertTrue(graph.targets.isEmpty) XCTAssertTrue(graph.dependencies.isEmpty) } @@ -99,6 +99,10 @@ final class GraphLoaderTests: TuistUnitTestCase { "/A": projectA, "/B": projectB, ]) + XCTAssertEqual(graph.targets, [ + "/A": ["A": targetA], + "/B": ["B": targetB], + ]) XCTAssertEqual(graph.dependencies, [ .target(name: "A", path: "/A"): Set([ .target(name: "B", path: "/B"), @@ -128,7 +132,7 @@ final class GraphLoaderTests: TuistUnitTestCase { XCTAssertEqual(graph.projects, [ "/A": projectA, ]) - XCTAssertTrue(graph.projects.values.flatMap(\.targets).isEmpty) + XCTAssertTrue(graph.targets.isEmpty) XCTAssertTrue(graph.dependencies.isEmpty) } @@ -155,6 +159,10 @@ final class GraphLoaderTests: TuistUnitTestCase { "/A": projectA, "/B": projectB, ]) + XCTAssertEqual(graph.targets, [ + "/A": ["A": targetA], + "/B": ["B": targetB], + ]) XCTAssertEqual(graph.dependencies, [ .target(name: "A", path: "/A"): Set([ .target(name: "B", path: "/B"), diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index 57948670a0b..d43524857eb 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -11,18 +11,22 @@ import XCTest final class GraphTraverserTests: TuistUnitTestCase { func test_dependsOnXCTest_when_is_framework() { // Given - let target = Target.test( - name: "Framework", - product: .framework - ) - let project = Project.test(targets: [target]) + let project = Project.test() let frameworkTarget = GraphTarget.test( path: project.path, - target: target + target: Target.test( + name: "Framework", + product: .framework + ) ) let graph = Graph.test( projects: [ project.path: project, + ], + targets: [ + project.path: [ + frameworkTarget.target.name: frameworkTarget.target, + ], ] ) let subject = GraphTraverser(graph: graph) @@ -36,18 +40,22 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_dependsOnXCTest_when_is_tests_bundle() { // Given - let target = Target.test( - name: "UnitTests", - product: .unitTests - ) - let project = Project.test(targets: [target]) + let project = Project.test() let unitTestsTarget = GraphTarget.test( path: project.path, - target: target + target: Target.test( + name: "UnitTests", + product: .unitTests + ) ) let graph = Graph.test( projects: [ project.path: project, + ], + targets: [ + project.path: [ + unitTestsTarget.target.name: unitTestsTarget.target, + ], ] ) let subject = GraphTraverser(graph: graph) @@ -61,19 +69,23 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_dependsOnXCTest_when_direct_dependency_is_XCTest_SDK() { // Given - let target = Target.test( - name: "Framework", - product: .framework - ) - let project = Project.test(targets: [target]) + let project = Project.test() let frameworkTarget = GraphTarget.test( path: project.path, - target: target + target: Target.test( + name: "Framework", + product: .framework + ) ) let graph = Graph.test( projects: [ project.path: project, ], + targets: [ + project.path: [ + frameworkTarget.target.name: frameworkTarget.target, + ], + ], dependencies: [ .target(name: frameworkTarget.target.name, path: project.path): [ .testSDK(name: "XCTest.framework"), @@ -91,21 +103,25 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_dependsOnXCTest_when_settings_enables_search_paths() { // Given - let target = Target.test( - name: "Framework", - product: .framework, - settings: .test(base: [ - "ENABLE_TESTING_SEARCH_PATHS": "YES", - ]) - ) - let project = Project.test(targets: [target]) + let project = Project.test() let frameworkTarget = GraphTarget.test( path: project.path, - target: target + target: Target.test( + name: "Framework", + product: .framework, + settings: .test(base: [ + "ENABLE_TESTING_SEARCH_PATHS": "YES", + ]) + ) ) let graph = Graph.test( projects: [ project.path: project, + ], + targets: [ + project.path: [ + frameworkTarget.target.name: frameworkTarget.target, + ], ] ) let subject = GraphTraverser(graph: graph) @@ -122,12 +138,15 @@ final class GraphTraverserTests: TuistUnitTestCase { let path = AbsolutePath.root let app = Target.test(name: "App", product: .app) let framework = Target.test(name: "Framework", product: .framework) - let project = Project.test(path: path, targets: [app, framework]) + let project = Project.test(path: path) // Given: Value Graph let graph = Graph.test( path: path, - projects: [path: project] + projects: [path: project], + targets: [ + "/": ["App": app, "Framework": framework], + ] ) let subject = GraphTraverser(graph: graph) @@ -142,13 +161,16 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let path = AbsolutePath.root let app = Target.test(name: "App", product: .app) + let project = Project.test(path: path) let framework = Target.test(name: "Framework", product: .framework) - let project = Project.test(path: path, targets: [app, framework]) // When: Value Graph let graph = Graph.test( path: path, - projects: [path: project] + projects: [path: project], + targets: [ + path: ["App": app, "Framework": framework], + ] ) let subject = GraphTraverser(graph: graph) @@ -161,10 +183,17 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_directStaticDependencies() { // Given + let project = Project.test() let path = AbsolutePath.root let framework = Target.test(name: "Framework", product: .framework) let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary) - let project = Project.test(targets: [framework, staticLibrary]) + let targets: [AbsolutePath: [String: Target]] = [ + path: [ + framework.name: framework, + staticLibrary.name: staticLibrary, + ], + ] + let dependencies: [GraphDependency: Set] = [ .target(name: framework.name, path: path): Set([.target(name: staticLibrary.name, path: path)]), ] @@ -173,6 +202,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: targets, dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -190,19 +220,24 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_directLocalTargetDependencies() { // Given // A -> B -> C + let project = Project.test() let a = Target.test(name: "A") let b = Target.test(name: "B") let c = Target.test(name: "C") - let project = Project.test(targets: [a, b, c]) - let dependencies: [GraphDependency: Set] = [ .target(name: a.name, path: project.path): Set([.target(name: b.name, path: project.path)]), .target(name: b.name, path: project.path): Set([.target(name: c.name, path: project.path)]), ] + let targets: [AbsolutePath: [String: Target]] = [project.path: [ + a.name: a, + b.name: b, + c.name: c, + ]] // Given: Value Graph let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: targets, dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -219,21 +254,31 @@ final class GraphTraverserTests: TuistUnitTestCase { // Project A: A1 -> A2 // -> (Project B) B1 // Project B: B1 + let projectA = Project.test(path: "/ProjectA", name: "ProjectA") + let projectB = Project.test(path: "/ProjectB", name: "ProjectB") let a1 = Target.test(name: "A1") let a2 = Target.test(name: "A2") let b1 = Target.test(name: "B1") - let projectA = Project.test(path: "/ProjectA", name: "ProjectA", targets: [a1, a2]) - let projectB = Project.test(path: "/ProjectB", name: "ProjectB", targets: [b1]) let dependencies: [GraphDependency: Set] = [ .target(name: a1.name, path: projectA.path): Set([ .target(name: a2.name, path: projectA.path), .target(name: b1.name, path: projectB.path), ]), ] + let targets: [AbsolutePath: [String: Target]] = [ + projectA.path: [ + a1.name: a1, + a2.name: a2, + ], + projectB.path: [ + b1.name: b1, + ], + ] // Given: Value Graph let graph = Graph.test( path: projectA.path, projects: [projectA.path: projectA, projectB.path: projectB], + targets: targets, dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -250,23 +295,33 @@ final class GraphTraverserTests: TuistUnitTestCase { // Project A: A1 -> A2 // -> (Project B) B1 // Project B: B1 + let projectA = Project.test(path: "/ProjectA", name: "ProjectA") + let projectB = Project.test(path: "/ProjectB", name: "ProjectB") let a1 = Target.test(name: "A1") let a2 = Target.test(name: "A2") let b1 = Target.test( name: "B1" ) - let projectA = Project.test(path: "/ProjectA", name: "ProjectA", targets: [a1, a2]) - let projectB = Project.test(path: "/ProjectB", name: "ProjectB", targets: [b1]) let dependencies: [GraphDependency: Set] = [ .target(name: a1.name, path: projectA.path): Set([ .target(name: a2.name, path: projectA.path), .target(name: b1.name, path: projectB.path), ]), ] + let targets: [AbsolutePath: [String: Target]] = [ + projectA.path: [ + a1.name: a1, + a2.name: a2, + ], + projectB.path: [ + b1.name: b1, + ], + ] // Given: Value Graph let graph = Graph.test( path: projectA.path, projects: [projectA.path: projectA, projectB.path: projectB], + targets: targets, dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -287,10 +342,10 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_resourceBundleDependencies_returns_an_empty_list_when_a_dependency_can_host_resources() { // Given // App -> WatchApp -> Bundle + let project = Project.test() let app = Target.test(name: "App", platform: .iOS, product: .app) let watchApp = Target.test(name: "WatchApp", platform: .iOS, product: .watch2App) let bundle = Target.test(name: "Bundle", platform: .iOS, product: .bundle) - let project = Project.test(targets: [app, watchApp, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: watchApp.name, path: project.path)]), @@ -302,6 +357,11 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + app.name: app, + watchApp.name: watchApp, + bundle.name: bundle, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -316,10 +376,10 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_resourceBundleDependencies() { // Given // App -> StaticLibrary -> Bundle + let project = Project.test() let app = Target.test(name: "App", product: .app) let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary) let bundle = Target.test(name: "Bundle", product: .bundle) - let project = Project.test(targets: [app, staticLibrary, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: staticLibrary.name, path: project.path)]), @@ -331,6 +391,11 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + app.name: app, + staticLibrary.name: staticLibrary, + bundle.name: bundle, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -347,9 +412,9 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_resourceBundleDependencies_when_the_target_doesnt_support_resources() { // Given // StaticLibrary -> Bundle + let project = Project.test() let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary) let bundle = Target.test(name: "Bundle", product: .bundle) - let project = Project.test(targets: [staticLibrary, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: staticLibrary.name, path: project.path): Set([.target(name: bundle.name, path: project.path)]), @@ -360,6 +425,10 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + staticLibrary.name: staticLibrary, + bundle.name: bundle, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -375,7 +444,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let bundle = Target.test(name: "Bundle1", product: .bundle) let app = Target.test(name: "App", product: .bundle) - let project = Project.test(path: "/path/a", targets: [bundle, app]) + let project = Project.test(path: "/path/a") let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: bundle.name, path: project.path)]), @@ -386,6 +455,10 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + app.name: app, + bundle.name: bundle, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -402,10 +475,10 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_resourceBundleDependencies_fromProjectDependency() { // Given let bundle = Target.test(name: "Bundle1", product: .bundle) - let projectA = Project.test(path: "/path/a", targets: [bundle]) + let projectA = Project.test(path: "/path/a") let app = Target.test(name: "App", product: .app) - let projectB = Project.test(path: "/path/b", targets: [app]) + let projectB = Project.test(path: "/path/b") let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: projectB.path): Set([.target(name: bundle.name, path: projectA.path)]), @@ -419,6 +492,10 @@ final class GraphTraverserTests: TuistUnitTestCase { projectA.path: projectA, projectB.path: projectB, ], + targets: [ + projectA.path: [bundle.name: bundle], + projectB.path: [app.name: app], + ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -454,6 +531,13 @@ final class GraphTraverserTests: TuistUnitTestCase { projectA.path: projectA, projectB.path: projectB, ], + targets: [ + projectA.path: [ + bundle.name: bundle, + staticFramework.name: staticFramework, + ], + projectB.path: [app.name: app], + ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -499,6 +583,15 @@ final class GraphTraverserTests: TuistUnitTestCase { projectA.path: projectA, projectB.path: projectB, ], + targets: [ + projectA.path: [ + bundle1.name: bundle1, + bundle2.name: bundle2, + staticFramework1.name: staticFramework1, + staticFramework2.name: staticFramework2, + ], + projectB.path: [app.name: app], + ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -548,6 +641,15 @@ final class GraphTraverserTests: TuistUnitTestCase { projectA.path: projectA, projectB.path: projectB, ], + targets: [ + projectA.path: [ + bundle.name: bundle, + staticFramework1.name: staticFramework1, + staticFramework2.name: staticFramework2, + dynamicFramework.name: dynamicFramework, + ], + projectB.path: [app.name: app], + ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -601,6 +703,14 @@ final class GraphTraverserTests: TuistUnitTestCase { staticFrameworkProject.path: staticFrameworkProject, appProject.path: appProject, ], + targets: [ + staticFrameworkProject.path: [ + staticFramework.name: staticFramework, + ], + appProject.path: [ + appTests.name: appTests, + ], + ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -653,6 +763,14 @@ final class GraphTraverserTests: TuistUnitTestCase { staticFrameworkProject.path: staticFrameworkProject, appProject.path: appProject, ], + targets: [ + staticFrameworkProject.path: [ + staticFramework.name: staticFramework, + ], + appProject.path: [ + app.name: app, + ], + ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -705,6 +823,14 @@ final class GraphTraverserTests: TuistUnitTestCase { dynamicFrameworkProject.path: dynamicFrameworkProject, appProject.path: appProject, ], + targets: [ + dynamicFrameworkProject.path: [ + dynamicFramework.name: dynamicFramework, + ], + appProject.path: [ + app.name: app, + ], + ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -728,13 +854,14 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_target_from_dependency() { // Given + let project = Project.test() let app = Target.test(name: "App", product: .app) - let project = Project.test(targets: [app]) // Given: Value Graph let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [app.name: app]], dependencies: [.target(name: app.name, path: project.path): Set()] ) let subject = GraphTraverser(graph: graph) @@ -749,10 +876,10 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_allDependencies() throws { // Given // App -> StaticLibrary -> Bundle + let project = Project.test() let app = Target.test(name: "App", product: .app) let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary, productName: "StaticLibrary") let bundle = Target.test(name: "Bundle", product: .bundle) - let project = Project.test(targets: [app, staticLibrary, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: staticLibrary.name, path: project.path)]), @@ -764,6 +891,11 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + app.name: app, + staticLibrary.name: staticLibrary, + bundle.name: bundle, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -786,12 +918,12 @@ final class GraphTraverserTests: TuistUnitTestCase { // App -> StaticLibrary -> Bundle // | // -> FrameworkA -> FrameworkC + let project = Project.test() let app = Target.test(name: "App", product: .app) let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary) let frameworkA = Target.test(name: "FrameworkA", product: .framework) let frameworkB = Target.test(name: "FrameworkB", product: .framework) let bundle = Target.test(name: "Bundle", product: .bundle) - let project = Project.test(targets: [app, staticLibrary, frameworkA, frameworkB, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([ @@ -807,6 +939,13 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + app.name: app, + staticLibrary.name: staticLibrary, + bundle.name: bundle, + frameworkA.name: frameworkA, + frameworkB.name: frameworkB, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -836,7 +975,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let target = Target.test(name: "Main") let dependency = Target.test(name: "AppExtension", product: .appExtension) - let project = Project.test(targets: [target, dependency]) + let project = Project.test(targets: [target]) let dependencies: [GraphDependency: Set] = [ .target(name: target.name, path: project.path): Set([.target(name: dependency.name, path: project.path)]), .target(name: dependency.name, path: project.path): Set([]), @@ -846,6 +985,10 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + target.name: target, + dependency.name: dependency, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -861,7 +1004,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // When let target = Target.test(name: "Main") let dependency = Target.test(name: "StickerPackExtension", product: .stickerPackExtension) - let project = Project.test(targets: [target, dependency]) + let project = Project.test(targets: [target]) let dependencies: [GraphDependency: Set] = [ .target(name: target.name, path: project.path): Set([.target(name: dependency.name, path: project.path)]), .target(name: dependency.name, path: project.path): Set([]), @@ -871,6 +1014,10 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + target.name: target, + dependency.name: dependency, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -896,6 +1043,10 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + app.name: app, + messageExtension.name: messageExtension, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -911,13 +1062,14 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_appClipDependencies() throws { // Given + let project = Project.test() let app = Target.test(name: "app", product: .app) let appClip = Target.test(name: "clip", product: .appClip) - let project = Project.test(targets: [app, appClip]) // Given: Value graph let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [app.name: app, appClip.name: appClip]], dependencies: [.target( name: app.name, path: project.path @@ -935,14 +1087,15 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_buildsForMacCatalyst_returns_false_when_someDependenciesCantBuildForMacCatalyst() { // Given + let project = Project.test() let app = Target.test(name: "app", destinations: [.macCatalyst], product: .app) let library = Target.test(name: "library-a", destinations: [.iPhone], product: .dynamicLibrary) let transitiveLibrary = Target.test(name: "library-b", destinations: [.iPhone], product: .dynamicLibrary) - let project = Project.test(targets: [app, library, transitiveLibrary]) // Given: Value graph let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [app.name: app, library.name: library, transitiveLibrary.name: transitiveLibrary]], dependencies: [ .target( name: app.name, @@ -965,14 +1118,15 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_buildsForMacCatalyst_returns_false_when_aTargetDoesntSupportCatalystRegardlessOfItsDependencies() { // Given + let project = Project.test() let app = Target.test(name: "app", destinations: [.iPhone], product: .app) let library = Target.test(name: "library-a", destinations: [.macCatalyst], product: .dynamicLibrary) let transitiveLibrary = Target.test(name: "library-b", destinations: [.macCatalyst], product: .dynamicLibrary) - let project = Project.test(targets: [app, library, transitiveLibrary]) // Given: Value graph let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [app.name: app, library.name: library, transitiveLibrary.name: transitiveLibrary]], dependencies: [ .target( name: app.name, @@ -995,14 +1149,15 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_buildsForMacCatalyst_returns_true_when_aTargetAndItsDependenciesSupportCatalyst() { // Given + let project = Project.test() let app = Target.test(name: "app", destinations: [.macCatalyst], product: .app) let library = Target.test(name: "library-a", destinations: [.macCatalyst], product: .dynamicLibrary) let transitiveLibrary = Target.test(name: "library-b", destinations: [.macCatalyst], product: .dynamicLibrary) - let project = Project.test(targets: [app, library, transitiveLibrary]) // Given: Value graph let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [app.name: app, library.name: library, transitiveLibrary.name: transitiveLibrary]], dependencies: [ .target( name: app.name, @@ -1041,6 +1196,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given: Value Graph let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: [ .target( name: target.name, @@ -1063,11 +1219,12 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let target = Target.test(name: "Main", product: .framework) let dependency = Target.test(name: "Dependency", product: .framework) - let project = Project.test(targets: [target, dependency]) + let project = Project.test(targets: [target]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [dependency.name: dependency, target.name: target]], dependencies: [ .target( name: target.name, @@ -1090,11 +1247,12 @@ final class GraphTraverserTests: TuistUnitTestCase { let target = Target.test(name: "Main") let dependencyA = Target.test(name: "DependencyA", product: .framework) let dependencyB = Target.test(name: "DependencyB", product: .framework, settings: mergeableSettings) - let project = Project.test(targets: [target, dependencyA, dependencyB]) + let project = Project.test(targets: [target]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [dependencyA.name: dependencyA, dependencyB.name: dependencyB, target.name: target]], dependencies: [ .target( name: target.name, @@ -1124,11 +1282,12 @@ final class GraphTraverserTests: TuistUnitTestCase { let target = Target.test(name: "Main", mergedBinaryType: .automatic) let dependencyA = Target.test(name: "DependencyA", product: .framework) let dependencyB = Target.test(name: "DependencyB", product: .framework, mergeable: true) - let project = Project.test(targets: [target, dependencyA, dependencyB]) + let project = Project.test(targets: [target]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [dependencyA.name: dependencyA, dependencyB.name: dependencyB, target.name: target]], dependencies: [ .target( name: target.name, @@ -1165,6 +1324,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: [ .target(name: target.name, path: project.path): Set(arrayLiteral: frameworkDependency), ] @@ -1238,6 +1398,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [app.name: app]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1318,6 +1479,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [app.name: app]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1334,7 +1496,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let target = Target.test(name: "Main") let dependency = Target.test(name: "Dependency", product: .framework) - let project = Project.test(targets: [target, dependency]) + let project = Project.test(targets: [target]) // Given: Value Graph let frameworkDependency = GraphDependency.testFramework( @@ -1351,6 +1513,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target, dependency.name: dependency]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1383,6 +1546,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1415,6 +1579,11 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + frameworkA.name: frameworkA, + frameworkB.name: frameworkB, + watchExtension.name: watchExtension, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1450,6 +1619,11 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + frameworkA.name: frameworkA, + frameworkB.name: frameworkB, + xpc.name: xpc, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1473,7 +1647,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/", targets: [app, tests, framework]) + let project = Project.test(path: "/path/") // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -1483,6 +1657,11 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + app.name: app, + tests.name: tests, + framework.name: framework, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1497,8 +1676,8 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_embeddableDependencies_when_nonHostedTestTarget_dynamic_dependencies() throws { // Given let unitTests = Target.test(name: "AppUnitTests", product: .unitTests) + let project = Project.test(path: "/path/a") let target = Target.test(name: "LocallyBuiltFramework", product: .framework) - let project = Project.test(path: "/path/a", targets: [unitTests, target]) // Given: Value Graph let precompiledDependency = GraphDependency.testFramework( @@ -1518,6 +1697,10 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + unitTests.name: unitTests, + target.name: target, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1543,7 +1726,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/a", targets: [framework, staticFramework, app, tests]) + let project = Project.test(path: "/path/a") // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -1563,6 +1746,12 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + framework.name: framework, + staticFramework.name: staticFramework, + app.name: app, + tests.name: tests, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1578,7 +1767,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", product: .app) let uiTests = Target.test(name: "AppUITests", product: .uiTests) - let project = Project.test(path: "/path/a", targets: [app, uiTests]) + let project = Project.test(path: "/path/a") // Given: Value Graph let precompiledDependency = GraphDependency.testFramework( @@ -1596,6 +1785,10 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + app.name: app, + uiTests.name: uiTests, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1625,6 +1818,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1656,6 +1850,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1689,6 +1884,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1719,6 +1915,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1763,6 +1960,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1816,6 +2014,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1872,6 +2071,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1927,6 +2127,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1984,6 +2185,12 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], + targets: [ + project.path: [ + app.name: app, + staticFramework.name: staticFramework, + ], + ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2006,7 +2213,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let target = Target.test(name: "Main") let dependency = Target.test(name: "Dependency", product: .staticLibrary) - let project = Project.test(targets: [target, dependency]) + let project = Project.test(targets: [target]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2015,6 +2222,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target, dependency.name: dependency]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2031,7 +2239,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let target = Target.test(name: "Main") let dependency = Target.test(name: "Dependency", product: .framework) let staticDependency = Target.test(name: "StaticDependency", product: .staticLibrary) - let project = Project.test(targets: [target, dependency, staticDependency]) + let project = Project.test(targets: [target]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2044,6 +2252,11 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + target.name: target, + dependency.name: dependency, + staticDependency.name: staticDependency, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2080,7 +2293,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [] ) let app = Target.test(name: "App", product: .app) - let project = Project.test(path: "/path/a", targets: [app, staticFramework, dynamicFramework]) + let project = Project.test(path: "/path/a") // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2096,6 +2309,11 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + app.name: app, + staticFramework.name: staticFramework, + dynamicFramework.name: dynamicFramework, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2140,10 +2358,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [] ) let app = Target.test(name: "App", product: .app) - let project = Project.test( - path: "/path/a", - targets: [app, dynamicFramework1, dynamicFramework2, staticFramework1, staticFramework2] - ) + let project = Project.test(path: "/path/a") // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2167,6 +2382,13 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + app.name: app, + dynamicFramework1.name: dynamicFramework1, + dynamicFramework2.name: dynamicFramework2, + staticFramework1.name: staticFramework1, + staticFramework2.name: staticFramework2, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2228,10 +2450,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) - let project = Project.test( - path: "/path/a", - targets: [app, dynamicFramework1, dynamicFramework2, dynamicFramework3, staticFramework1, staticFramework2] - ) + let project = Project.test(path: "/path/a") // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2259,6 +2478,14 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + app.name: app, + dynamicFramework1.name: dynamicFramework1, + dynamicFramework2.name: dynamicFramework2, + staticFramework1.name: staticFramework1, + staticFramework2.name: staticFramework2, + dynamicFramework3.name: dynamicFramework3, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2289,7 +2516,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [] ) let app = Target.test(name: "App", product: .app) - let project = Project.test(path: "/path/a", targets: [app, staticFrameworkA, staticFrameworkB]) + let project = Project.test(path: "/path/a") // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2310,6 +2537,11 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + app.name: app, + staticFrameworkB.name: staticFrameworkB, + staticFrameworkA.name: staticFrameworkA, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2336,7 +2568,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [] ) let app = Target.test(name: "App", product: .app) - let project = Project.test(path: "/path/a", targets: [app, staticFramework, dynamicFramework]) + let project = Project.test(path: "/path/a") // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2357,6 +2589,11 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + app.name: app, + staticFramework.name: staticFramework, + dynamicFramework.name: dynamicFramework, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2386,7 +2623,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [.sdk(name: "some.framework", status: .optional)] ) - let project = Project.test(path: "/path/a", targets: [app, staticFramework]) + let project = Project.test(path: "/path/a") // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2403,6 +2640,10 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + app.name: app, + staticFramework.name: staticFramework, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2427,7 +2668,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] ) - let project = Project.test(path: "/path/a", targets: [staticFramework]) + let project = Project.test(path: "/path/a") // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2448,6 +2689,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [staticFramework.name: staticFramework]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2478,7 +2720,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [.sdk(name: "ThingTwo.framework", status: .optional)] ) - let project = Project.test(path: "/path/a", targets: [staticFrameworkA, staticFrameworkB]) + let project = Project.test(path: "/path/a") // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2500,6 +2742,10 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + staticFrameworkA.name: staticFrameworkA, + staticFrameworkB.name: staticFrameworkB, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2531,6 +2777,12 @@ final class GraphTraverserTests: TuistUnitTestCase { let project = Project.test(path: "/path/project", targets: [app, staticFramework]) let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + staticFramework.name: staticFramework, + ], + ], dependencies: [ .target(name: app.name, path: project.path): Set([ .target(name: staticFramework.name, path: project.path), @@ -2578,6 +2830,12 @@ final class GraphTraverserTests: TuistUnitTestCase { let project = Project.test(path: "/path/project", targets: [app, framework]) let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + framework.name: framework, + ], + ], dependencies: [ .target(name: app.name, path: project.path): Set([ .target(name: framework.name, path: project.path), @@ -2616,6 +2874,13 @@ final class GraphTraverserTests: TuistUnitTestCase { let project = Project.test(path: "/path/project", targets: [app, staticFramework, framework]) let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + staticFramework.name: staticFramework, + framework.name: framework, + ], + ], dependencies: [ .target(name: app.name, path: project.path): Set([ .target(name: staticFramework.name, path: project.path), @@ -2661,6 +2926,11 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + watchExtension.name: watchExtension, + frameworkA.name: frameworkA, + frameworkB.name: frameworkB, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2695,6 +2965,11 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + watchExtension.name: watchExtension, + frameworkA.name: frameworkA, + frameworkB.name: frameworkB, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2718,7 +2993,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/a", targets: [app, staticFramework, tests]) + let project = Project.test(path: "/path/a") // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2733,6 +3008,11 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + app.name: app, + staticFramework.name: staticFramework, + tests.name: tests, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2755,7 +3035,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let appClip = Target.test(name: "AppClip", product: .appClip) let tests = Target.test(name: "AppClipTests", product: .unitTests) - let project = Project.test(path: "/path/a", targets: [appClip, staticFramework, tests]) + let project = Project.test(path: "/path/a") let dependencies: [GraphDependency: Set] = [ .target(name: appClip.name, path: project.path): [ .target(name: staticFramework.name, path: project.path), @@ -2768,6 +3048,11 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + appClip.name: appClip, + staticFramework.name: staticFramework, + tests.name: tests, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2790,7 +3075,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/a", targets: [app, framework, tests]) + let project = Project.test(path: "/path/a") // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2803,6 +3088,11 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + app.name: app, + framework.name: framework, + tests.name: tests, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2825,7 +3115,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/a", targets: [app, framework, tests]) + let project = Project.test(path: "/path/a") // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2835,6 +3125,11 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + app.name: app, + framework.name: framework, + tests.name: tests, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2849,7 +3144,7 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_linkableDependencies_when_appClipSDKNode() throws { // Given let target = Target.test(name: "AppClip", product: .appClip) - let project = Project.test(path: "/path/a", targets: [target]) + let project = Project.test(path: "/path/a") // Given: Value Graph let sdkDependency: GraphDependency = .sdk( @@ -2869,6 +3164,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -2897,7 +3193,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let appClipTarget = Target.test(name: "AppClip", product: .appClip) let frameworkTarget = Target.test(name: "MyFramework", product: .framework) - let project = Project.test(path: "/path/a", targets: [appClipTarget, frameworkTarget]) + let project = Project.test(path: "/path/a") // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2909,6 +3205,12 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], + targets: [ + project.path: [ + appClipTarget.name: appClipTarget, + frameworkTarget.name: frameworkTarget, + ], + ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2942,6 +3244,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: [ .target(name: target.name, path: project.path): Set(arrayLiteral: frameworkDependency), ] @@ -2978,6 +3281,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3006,6 +3310,12 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], + targets: [ + project.path: [ + app.name: app, + staticFramework.name: staticFramework, + ], + ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: staticFramework.name, path: project.path), @@ -3069,6 +3379,12 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], + targets: [ + project.path: [ + app.name: app, + staticFramework.name: staticFramework, + ], + ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: staticFramework.name, path: project.path), @@ -3133,6 +3449,12 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], + targets: [ + project.path: [ + app.name: app, + staticFramework.name: staticFramework, + ], + ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: staticFramework.name, path: project.path), @@ -3216,6 +3538,12 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + unitTests.name: unitTests, + staticFramework.name: staticFramework, + ], + ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3257,6 +3585,13 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + unitTests.name: unitTests, + dynamicFramework.name: dynamicFramework, + staticFramework.name: staticFramework, + ], + ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3302,6 +3637,12 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + hostApp.name: hostApp, + unitTests.name: unitTests, + ], + ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3323,7 +3664,7 @@ final class GraphTraverserTests: TuistUnitTestCase { binaryPath: "/test/PrecompiledStaticFramework.framework/PrecompiledStaticFramework", linking: .static ) - let project = Project.test(targets: [hostApp, unitTests, staticFramework]) + let project = Project.test(targets: [hostApp, unitTests]) let dependencies: [GraphDependency: Set] = [ .target(name: hostApp.name, path: project.path): [ precompiledStaticFramework, @@ -3338,6 +3679,13 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + hostApp.name: hostApp, + unitTests.name: unitTests, + staticFramework.name: staticFramework, + ], + ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3364,7 +3712,7 @@ final class GraphTraverserTests: TuistUnitTestCase { binaryPath: "/test/PrecompiledStaticFramework.framework/PrecompiledStaticFramework", linking: .static ) - let project = Project.test(targets: [hostApp, unitTests, staticFramework]) + let project = Project.test(targets: [hostApp, unitTests]) let dependencies: [GraphDependency: Set] = [ .target(name: hostApp.name, path: project.path): [ precompiledStaticFramework, @@ -3379,6 +3727,13 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + hostApp.name: hostApp, + unitTests.name: unitTests, + staticFramework.name: staticFramework, + ], + ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3404,6 +3759,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given: Value Graph let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: [ .target(name: target.name, path: project.path): Set([ .testLibrary(path: "/test/test.a", swiftModuleMap: "/test/modules/test.swiftmodulemap"), @@ -3425,7 +3781,7 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_runPathSearchPaths() throws { // Given let unitTests = Target.test(name: "AppUnitTests", product: .unitTests) - let project = Project.test(path: "/path/a", targets: [unitTests]) + let project = Project.test(path: "/path/a") // Given: Value Graph let precompiledDependency = GraphDependency.testFramework( @@ -3446,6 +3802,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [unitTests.name: unitTests]], dependencies: [ .target(name: unitTests.name, path: project.path): Set([precompiledDependency, precompiledBDependency]), precompiledDependency: Set(), @@ -3468,7 +3825,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", product: .app) let unitTests = Target.test(name: "AppUnitTests", product: .unitTests) - let project = Project.test(path: "/path/a", targets: [unitTests, app]) + let project = Project.test(path: "/path/a") // Given: Value Graph let precompiledDependency = GraphDependency.testFramework( @@ -3481,6 +3838,10 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + unitTests.name: unitTests, + app.name: app, + ]], dependencies: [ .target( name: unitTests.name, @@ -3503,11 +3864,15 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", platform: .iOS, product: .app) let watchApp = Target.test(name: "WatchApp", platform: .watchOS, product: .watch2App) - let project = Project.test(path: "/path/a", targets: [app, watchApp]) + let project = Project.test(path: "/path/a") // Given: Value Graph let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + app.name: app, + watchApp.name: watchApp, + ]], dependencies: [ .target(name: app.name, path: project.path): Set([.target(name: watchApp.name, path: project.path)]), .target(name: watchApp.name, path: project.path): Set([]), @@ -3526,11 +3891,15 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let watchApp = Target.test(name: "WatchApp", platform: .watchOS, product: .watch2App) let watchAppExtension = Target.test(name: "WatchAppExtension", platform: .watchOS, product: .watch2Extension) - let project = Project.test(path: "/path/a", targets: [watchAppExtension, watchApp]) + let project = Project.test(path: "/path/a") // Given: Value Graph let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + watchAppExtension.name: watchAppExtension, + watchApp.name: watchApp, + ]], dependencies: [ .target( name: watchApp.name, @@ -3553,11 +3922,16 @@ final class GraphTraverserTests: TuistUnitTestCase { let macosApp = Target.test(name: "MacOS", platform: .macOS, product: .app) let tvosApp = Target.test(name: "tvOS", platform: .tvOS, product: .app) let framework = Target.test(name: "Framework", platform: .iOS, product: .framework) - let project = Project.test(path: "/project", targets: [macosApp, tvosApp, framework]) + let project = Project.test(path: "/project") // Given: Value Graph let graph = Graph.test( projects: [project.path: project], + targets: [project.path: [ + macosApp.name: macosApp, + tvosApp.name: tvosApp, + framework.name: framework, + ]], dependencies: [ .target(name: macosApp.name, path: project.path): Set(), .target(name: tvosApp.name, path: project.path): Set(), @@ -3578,16 +3952,19 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_allTargets_returns_all_the_targets() { // Given let firstPath = try! AbsolutePath(validating: "/first") + let firstProject = Project.test(path: firstPath) let secondPath = try! AbsolutePath(validating: "/second") + let secondProject = Project.test(path: secondPath) let firstTarget = Target.test(name: "first") - let firstProject = Project.test(path: firstPath, targets: [firstTarget]) let secondTarget = Target.test(name: "second") - let secondProject = Project.test(path: secondPath, targets: [secondTarget]) - let graph = Graph.test( projects: [ firstPath: firstProject, secondPath: secondProject, + ], + targets: [ + firstPath: [firstTarget.name: firstTarget], + secondPath: [secondTarget.name: secondTarget], ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -3640,6 +4017,10 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + app.name: app, + extensionKitExtension.name: extensionKitExtension, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3750,6 +4131,9 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + staticLibrary.name: staticLibrary, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3798,8 +4182,8 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_copyProductDependencies_when_targetHasDirectStaticDependencies() throws { // Given let staticLibrary = Target.test(name: "StaticLibrary", destinations: [.iPhone], product: .staticLibrary) + let project = Project.test(targets: [staticLibrary]) let aDependency = Target.test(name: "StaticDependency", destinations: [.iPhone], product: .staticLibrary) - let project = Project.test(targets: [staticLibrary, aDependency]) let dependencies: [GraphDependency: Set] = [ .target(name: staticLibrary.name, path: project.path): Set([.target(name: aDependency.name, path: project.path)]), @@ -3809,6 +4193,10 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + staticLibrary.name: staticLibrary, + aDependency.name: aDependency, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3825,8 +4213,8 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_copyProductDependencies_when_targetHasBundleDependencies() throws { // Given let app = Target.test(name: "App", destinations: [.iPhone], product: .app) + let project = Project.test(targets: [app]) let bundle = Target.test(name: "Bundle", destinations: [.iPhone], product: .bundle) - let project = Project.test(targets: [app, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: bundle.name, path: project.path)]), @@ -3836,6 +4224,10 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + app.name: app, + bundle.name: bundle, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3867,6 +4259,12 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + staticFramework.name: staticFramework, + ], + ], dependencies: [ appkGraphDependency: [ staticFrameworkGraphDependency, @@ -3908,6 +4306,12 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + staticFramework.name: staticFramework, + ], + ], dependencies: [ appkGraphDependency: [ staticFrameworkGraphDependency, @@ -3948,6 +4352,12 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + staticFramework.name: staticFramework, + ], + ], dependencies: [ appkGraphDependency: [ staticFrameworkGraphDependency, @@ -4001,6 +4411,14 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + staticFrameworkA.name: staticFrameworkA, + staticFrameworkB.name: staticFrameworkB, + staticFrameworkC.name: staticFrameworkC, + ], + ], dependencies: [ appkGraphDependency: [ staticFrameworkAGraphDependency, @@ -4071,6 +4489,14 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + staticFrameworkA.name: staticFrameworkA, + staticFrameworkB.name: staticFrameworkB, + staticFrameworkC.name: staticFrameworkC, + ], + ], dependencies: [ appkGraphDependency: [ staticFrameworkAGraphDependency, @@ -4109,6 +4535,10 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + framework.name: framework, + macro.name: macro, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4134,6 +4564,9 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + framework.name: framework, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4179,6 +4612,14 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + app.name: app, + staticFrameworkMacro.name: staticFrameworkMacro, + dynamicFrameworkMacro.name: dynamicFrameworkMacro, + staticLibraryMacro.name: staticLibraryMacro, + dynamicLibraryMacro.name: dynamicLibraryMacro, + macro.name: macro, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4222,6 +4663,10 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + app.name: app, + macroFramework.name: macroFramework, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4245,7 +4690,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let transitiveMacro = Target.test(name: "TransitiveMacro", destinations: [.mac], product: .macro) - let project = Project.test(targets: [app, directMacroFramework, directMacro, transitiveMacroLibrary, transitiveMacro]) + let project = Project.test(targets: [app, directMacroFramework, directMacro]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: directMacroFramework.name, path: project.path)]), .target(name: directMacroFramework.name, path: project.path): Set([ @@ -4262,6 +4707,13 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + app.name: app, + directMacroFramework.name: directMacroFramework, + directMacro.name: directMacro, + transitiveMacroLibrary.name: transitiveMacroLibrary, + transitiveMacro.name: transitiveMacro, + ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4298,6 +4750,10 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + app.name: app, + framework.name: framework, + ]], dependencies: dependencies, dependencyConditions: [ GraphEdge(from: appDependency, to: frameworkDependency): platformCondition, @@ -4346,6 +4802,13 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + app.name: app, + frameworkA.name: frameworkA, + frameworkB.name: frameworkB, + frameworkC.name: frameworkC, + frameworkD.name: frameworkD, + ]], dependencies: dependencies, dependencyConditions: [ GraphEdge(from: frameworkBDependency, to: frameworkCDependency): platformCondition, @@ -4395,6 +4858,13 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project, packageProject.path: packageProject], + targets: [project.path: [ + app.name: app, + ], packageProject.path: [ + directPackageProduct.name: directPackageProduct, + transitivePackageProduct.name: transitivePackageProduct, + packageDevProduct.name: packageDevProduct, + ]], dependencies: [ appDependency: Set([directPackageProductDependency]), directPackageProductDependency: Set([transitivePackageProductDependency]), @@ -4428,6 +4898,12 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project, packageProject.path: packageProject], + targets: [project.path: [ + app.name: app, + framework.name: framework, + ], packageProject.path: [ + directPackageProduct.name: directPackageProduct, + ]], dependencies: [ appDependency: Set([frameworkDependency]), frameworkDependency: Set([directPackageProductDependency]), @@ -4461,6 +4937,12 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project, packageProject.path: packageProject], + targets: [project.path: [ + app.name: app, + framework.name: framework, + ], packageProject.path: [ + directPackageProduct.name: directPackageProduct, + ]], dependencies: [ appDependency: Set([frameworkDependency]), frameworkDependency: Set([directPackageProductDependency]), @@ -4507,6 +4989,15 @@ final class GraphTraverserTests: TuistUnitTestCase { directory: project, packagesDirectory: externalProject, ], + targets: [ + project.path: [ + appTarget.name: appTarget, + ], + externalProject.path: [ + externalPackage.name: externalPackage, + externalPackageTargetB.name: externalPackageTargetB, + ], + ], dependencies: [ appTargetDependency: Set([externalPackageDependency]), externalPackageDependency: Set([externalPackageBDependency]), @@ -4567,6 +5058,15 @@ final class GraphTraverserTests: TuistUnitTestCase { directory: project, packagesDirectory: externalProject, ], + targets: [ + project.path: [ + appTarget.name: appTarget, + ], + externalProject.path: [ + directExternalPackage.name: directExternalPackage, + transitiveExternalPackage.name: transitiveExternalPackage, + ], + ], dependencies: [ appTargetDependency: Set([directExternalPackageDependency]), directExternalPackageDependency: Set([transitiveExternalPackageDependency]), @@ -4623,6 +5123,15 @@ final class GraphTraverserTests: TuistUnitTestCase { directory: project, packagesDirectory: externalProject, ], + targets: [ + project.path: [ + appTarget.name: appTarget, + ], + externalProject.path: [ + externalMacroFramework.name: externalMacroFramework, + externalMacroExecutable.name: externalMacroExecutable, + ], + ], dependencies: [ appTargetDependency: Set([externalMacroFrameworkDependency]), externalMacroFrameworkDependency: Set([externalMacroExecutableDependency]), @@ -4674,6 +5183,14 @@ final class GraphTraverserTests: TuistUnitTestCase { directory: project, packagesDirectory: externalProject, ], + targets: [ + project.path: [ + appTarget.name: appTarget, + ], + externalProject.path: [ + externalFramework.name: externalFramework, + ], + ], dependencies: [ appTargetDependency: Set([externalFrameworkDependency]), ] @@ -4706,6 +5223,11 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ directory: project, ], + targets: [ + project.path: [ + appTarget.name: appTarget, + ], + ], dependencies: [ appTargetDependency: Set([precompiledMacroXCFramework]), precompiledMacroXCFramework: Set([precompiledMacroExecutable]), @@ -4738,16 +5260,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let transitiveMacroMacroTarget = Target.test(name: "TransitiveMacro", destinations: [.appleWatch], product: .macro) - let project = Project.test( - path: directory, - targets: [ - appTarget, - directMacroStaticFrameworkTarget, - directMacroMacroTarget, - transitiveMacroMacroTarget, - transitiveMacroStaticFrameworkTarget, - ] - ) + let project = Project.test(path: directory, targets: [appTarget]) let appTargetDependency = GraphDependency.target(name: appTarget.name, path: project.path) let directMacroStaticFrameworkTargetDependency = GraphDependency.target( name: directMacroStaticFrameworkTarget.name, @@ -4767,6 +5280,15 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ directory: project, ], + targets: [ + project.path: [ + appTarget.name: appTarget, + directMacroStaticFrameworkTarget.name: directMacroStaticFrameworkTarget, + directMacroMacroTarget.name: directMacroMacroTarget, + transitiveMacroStaticFrameworkTarget.name: transitiveMacroStaticFrameworkTarget, + transitiveMacroMacroTarget.name: transitiveMacroMacroTarget, + ], + ], dependencies: [ appTargetDependency: Set([directMacroStaticFrameworkTargetDependency]), directMacroStaticFrameworkTargetDependency: Set([ @@ -4799,7 +5321,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let precompiledMacroPath: AbsolutePath = .root.appending(component: "macro.macro") let directMacroMacroPrecompiledExecutable = GraphDependency.macro(path: precompiledMacroPath) - let project = Project.test(path: directory, targets: [appTarget, directMacroStaticFrameworkTarget]) + let project = Project.test(path: directory, targets: [appTarget]) let appTargetDependency = GraphDependency.target(name: appTarget.name, path: project.path) let directMacroStaticFrameworkTargetDependency = GraphDependency.target( name: directMacroStaticFrameworkTarget.name, @@ -4810,6 +5332,12 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ directory: project, ], + targets: [ + project.path: [ + appTarget.name: appTarget, + directMacroStaticFrameworkTarget.name: directMacroStaticFrameworkTarget, + ], + ], dependencies: [ appTargetDependency: Set([directMacroStaticFrameworkTargetDependency]), directMacroStaticFrameworkTargetDependency: Set([ diff --git a/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift b/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift index 1a63187a795..cd86ec2a13f 100644 --- a/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift +++ b/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift @@ -24,7 +24,7 @@ final class TargetProjectMapperTests: XCTestCase { let (updatedProject, sideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(updatedProject.targets.values.map(\.name).sorted(), [ + XCTAssertEqual(updatedProject.targets.map(\.name), [ "Updated_A", "Updated_B", ]) @@ -47,7 +47,7 @@ final class TargetProjectMapperTests: XCTestCase { let (_, sideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(sideEffects.sorted(by: { $0.description < $1.description }), [ + XCTAssertEqual(sideEffects, [ .file(.init(path: try AbsolutePath(validating: "/Targets/A.swift"))), .file(.init(path: try AbsolutePath(validating: "/Targets/B.swift"))), ]) diff --git a/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift index c67bc8fe424..b5f89bfb7d8 100644 --- a/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift @@ -42,6 +42,14 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase directory: project, packagesDirectory: externalProject, ], + targets: [ + project.path: [ + appTarget.name: appTarget, + ], + externalProject.path: [ + externalPackage.name: externalPackage, + ], + ], dependencies: [ appTargetDependency: Set([externalPackageDependency]), ] @@ -51,13 +59,9 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase let (mappedGraph, _) = try await subject.map(graph: graph) // Then - - XCTAssertEqual( - try XCTUnwrap(mappedGraph.projects[project.path]?.targets[appTarget.name])?.supportedPlatforms, - Set([.iOS]) - ) + XCTAssertEqual(try XCTUnwrap(mappedGraph.targets[project.path]?[appTarget.name]?.supportedPlatforms), Set([.iOS])) XCTAssertEqual( - try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalPackage.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.targets[externalProject.path]![externalPackage.name]?.supportedPlatforms), Set([.iOS]) ) } @@ -89,6 +93,14 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase directory: project, packagesDirectory: externalProject, ], + targets: [ + project.path: [ + appTarget.name: appTarget, + ], + externalProject.path: [ + externalPackage.name: externalPackage, + ], + ], dependencies: [ appTargetDependency: Set([externalPackageDependency]), ], @@ -101,17 +113,16 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase let (mappedGraph, _) = try await subject.map(graph: graph) // Then - XCTAssertEqual( - try XCTUnwrap(mappedGraph.projects[project.path]?.targets[appTarget.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.targets[project.path]?[appTarget.name]?.supportedPlatforms), Set([.iOS, .macOS, .tvOS, .watchOS]) ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalPackage.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.targets[externalProject.path]![externalPackage.name]?.supportedPlatforms), Set([.iOS]) ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalPackage.name]?.deploymentTargets), + try XCTUnwrap(mappedGraph.targets[externalProject.path]![externalPackage.name]?.deploymentTargets), .iOS("16.0") ) } @@ -152,6 +163,15 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase directory: project, packagesDirectory: externalProject, ], + targets: [ + project.path: [ + appTarget.name: appTarget, + ], + externalProject.path: [ + directExternalPackage.name: directExternalPackage, + transitiveExternalPackage.name: transitiveExternalPackage, + ], + ], dependencies: [ appTargetDependency: Set([directExternalPackageDependency]), directExternalPackageDependency: Set([transitiveExternalPackageDependency]), @@ -162,20 +182,13 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase let (mappedGraph, _) = try await subject.map(graph: graph) // Then - - XCTAssertEqual( - try XCTUnwrap(mappedGraph.projects[project.path]?.targets[appTarget.name]?.supportedPlatforms), - Set([.iOS]) - ) + XCTAssertEqual(try XCTUnwrap(mappedGraph.targets[project.path]?[appTarget.name]?.supportedPlatforms), Set([.iOS])) XCTAssertEqual( - try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[directExternalPackage.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.targets[externalProject.path]?[directExternalPackage.name]?.supportedPlatforms), Set([.iOS]) ) XCTAssertEqual( - try XCTUnwrap( - mappedGraph.projects[externalProject.path]?.targets[transitiveExternalPackage.name]? - .supportedPlatforms - ), + try XCTUnwrap(mappedGraph.targets[externalProject.path]?[transitiveExternalPackage.name]?.supportedPlatforms), Set([.iOS]) ) } @@ -215,6 +228,15 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase directory: project, packagesDirectory: externalProject, ], + targets: [ + project.path: [ + appTarget.name: appTarget, + ], + externalProject.path: [ + externalMacroFramework.name: externalMacroFramework, + externalMacroExecutable.name: externalMacroExecutable, + ], + ], dependencies: [ appTargetDependency: Set([externalMacroFrameworkDependency]), externalMacroFrameworkDependency: Set([externalMacroExecutableDependency]), @@ -225,16 +247,13 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase let (mappedGraph, _) = try await subject.map(graph: graph) // Then + XCTAssertEqual(try XCTUnwrap(mappedGraph.targets[project.path]?[appTarget.name]?.supportedPlatforms), Set([.iOS])) XCTAssertEqual( - try XCTUnwrap(mappedGraph.projects[project.path]?.targets[appTarget.name]?.supportedPlatforms), - Set([.iOS]) - ) - XCTAssertEqual( - try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalMacroFramework.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.targets[externalProject.path]?[externalMacroFramework.name]?.supportedPlatforms), Set([.iOS]) ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalMacroExecutable.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.targets[externalProject.path]?[externalMacroExecutable.name]?.supportedPlatforms), Set([.macOS]) ) } diff --git a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift index 2b4a4ef1c5b..1458b03bb70 100644 --- a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift @@ -57,6 +57,14 @@ final class PruneOrphanExternalTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project, packageProject.path: packageProject], + targets: [project.path: [ + app.name: app, + ], packageProject.path: [ + directPackageProduct.name: directPackageProduct, + transitivePackageProduct.name: transitivePackageProduct, + transitivePackageProductWithNoDestinations.name: transitivePackageProductWithNoDestinations, + packageDevProduct.name: packageDevProduct, + ]], dependencies: [ appDependency: Set([directPackageProductDependency]), directPackageProductDependency: Set([ @@ -70,14 +78,10 @@ final class PruneOrphanExternalTargetsGraphMapperTests: TuistUnitTestCase { let (gotGraph, _) = try await subject.map(graph: graph) // Then - - XCTAssertEqual(gotGraph.projects[project.path]?.targets[app.name]?.prune, false) - XCTAssertEqual(gotGraph.projects[packageProject.path]?.targets[directPackageProduct.name]?.prune, false) - XCTAssertEqual(gotGraph.projects[packageProject.path]?.targets[transitivePackageProduct.name]?.prune, false) - XCTAssertEqual(gotGraph.projects[packageProject.path]?.targets[packageDevProduct.name]?.prune, true) - XCTAssertEqual( - gotGraph.projects[packageProject.path]?.targets[transitivePackageProductWithNoDestinations.name]?.prune, - true - ) + XCTAssertEqual(gotGraph.targets[project.path]?[app.name]?.prune, false) + XCTAssertEqual(gotGraph.targets[packageProject.path]?[directPackageProduct.name]?.prune, false) + XCTAssertEqual(gotGraph.targets[packageProject.path]?[transitivePackageProduct.name]?.prune, false) + XCTAssertEqual(gotGraph.targets[packageProject.path]?[packageDevProduct.name]?.prune, true) + XCTAssertEqual(gotGraph.targets[packageProject.path]?[transitivePackageProductWithNoDestinations.name]?.prune, true) } } diff --git a/Tests/TuistIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift similarity index 100% rename from Tests/TuistIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift rename to Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift diff --git a/Tests/TuistIntegrationTests/Generator/StableStructureIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/StableStructureIntegrationTests.swift similarity index 100% rename from Tests/TuistIntegrationTests/Generator/StableStructureIntegrationTests.swift rename to Tests/TuistGeneratorIntegrationTests/Generator/StableStructureIntegrationTests.swift diff --git a/Tests/TuistIntegrationTests/Generator/TestModelGenerator.swift b/Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift similarity index 98% rename from Tests/TuistIntegrationTests/Generator/TestModelGenerator.swift rename to Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift index af976b9308c..c95fbdcfc9a 100644 --- a/Tests/TuistIntegrationTests/Generator/TestModelGenerator.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift @@ -217,7 +217,7 @@ final class TestModelGenerator { return Headers(public: publicHeaders, private: privateHeaders, project: projectHeaders) } - private func createResources(path: AbsolutePath) throws -> [ResourceFileElement] { + private func createResources(path: AbsolutePath) throws -> ResourceFileElements { let files = try (0 ..< config.resources) .map { "Resources/Resource\($0).png" } .map { ResourceFileElement.file(path: path.appending(try RelativePath(validating: $0))) } @@ -226,7 +226,7 @@ final class TestModelGenerator { .map { "Resources/Folder\($0)" } .map { ResourceFileElement.folderReference(path: path.appending(try RelativePath(validating: $0))) } - return (files + folderReferences).shuffled() + return ResourceFileElements((files + folderReferences).shuffled()) } private func createAdditionalFiles(path: AbsolutePath) throws -> [FileElement] { diff --git a/Tests/TuistIntegrationTests/Generator/TuistGeneratorPerformanceTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/TuistGeneratorPerformanceTests.swift similarity index 100% rename from Tests/TuistIntegrationTests/Generator/TuistGeneratorPerformanceTests.swift rename to Tests/TuistGeneratorIntegrationTests/Generator/TuistGeneratorPerformanceTests.swift diff --git a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift index 069d9a1df0e..1933e4697e7 100644 --- a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift @@ -774,12 +774,12 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [bundle1, bundle2]) - let project = Project.test(path: path, targets: [ - bundle1, - bundle2, - app, - ]) - + let project = Project.test(path: path) + let targets: [AbsolutePath: [String: Target]] = [project.path: [ + bundle1.name: bundle1, + bundle2.name: bundle2, + app.name: app, + ]] let dependencies: [GraphDependency: Set] = [ .target(name: bundle1.name, path: project.path): Set(), .target(name: bundle2.name, path: project.path): Set(), @@ -791,6 +791,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [project.path: project], + targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -817,20 +818,27 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let path = try temporaryPath() let bundle = Target.test(name: "Bundle1", product: .bundle) + let projectA = Project.test(path: "/path/a") + let app = Target.test(name: "App", product: .app) + let projectB = Project.test(path: "/path/b") + let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [bundle]) - let projectA = Project.test(path: "/path/a", targets: [bundle]) - let projectB = Project.test(path: "/path/b", targets: [app]) + + let targets: [AbsolutePath: [String: Target]] = [ + projectA.path: [bundle.name: bundle], + projectB.path: [app.name: app], + ] let dependencies: [GraphDependency: Set] = [ .target(name: bundle.name, path: projectA.path): Set(), .target(name: app.name, path: projectB.path): Set([.target(name: bundle.name, path: projectA.path)]), ] - let graph = Graph.test( path: path, projects: [projectA.path: projectA, projectB.path: projectB], + targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -926,15 +934,21 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { func test_generateAppExtensionsBuildPhase() throws { // Given let path = try temporaryPath() + let projectA = Project.test(path: "/path/a") let appExtension = Target.test(name: "AppExtension", product: .appExtension) let stickerPackExtension = Target.test(name: "StickerPackExtension", product: .stickerPackExtension) let app = Target.test(name: "App", destinations: [.iPhone, .iPad, .mac], product: .app) let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [appExtension, stickerPackExtension]) - let projectA = Project.test(path: "/path/a", targets: [ - appExtension, stickerPackExtension, app, - ]) + + let targets: [AbsolutePath: [String: Target]] = [ + projectA.path: [ + appExtension.name: appExtension, + stickerPackExtension.name: stickerPackExtension, + app.name: app, + ], + ] let appGraphDependency: GraphDependency = .target(name: app.name, path: projectA.path) let stickerPackGraphDependency: GraphDependency = .target(name: stickerPackExtension.name, path: projectA.path) let appExtensionGraphDependency: GraphDependency = .target(name: appExtension.name, path: projectA.path) @@ -954,6 +968,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [projectA.path: projectA], + targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -993,16 +1008,21 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { func test_generateAppExtensionsBuildPhase_noBuildPhase_when_appDoesntHaveAppExtensions() throws { // Given let app = Target.test(name: "App", product: .app) + let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = ProjectFileElements() - let project = Project.test(targets: [app]) + + let targets: [AbsolutePath: [String: Target]] = [ + project.path: [app.name: app], + ] let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set(), ] let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -1025,22 +1045,31 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", destinations: [.iPad, .iPhone, .mac], product: .app) let watchApp = Target.test(name: "WatchApp", platform: .watchOS, product: .watch2App) + let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, watchApp]) - let project = Project.test(targets: [app, watchApp]) + + let targets: [AbsolutePath: [String: Target]] = [ + project.path: [app.name: app, watchApp.name: watchApp], + ] + let appGraphDependency: GraphDependency = .target(name: app.name, path: project.path) let watchAppGraphDependency: GraphDependency = .target(name: watchApp.name, path: project.path) + let dependencies: [GraphDependency: Set] = [ watchAppGraphDependency: Set(), appGraphDependency: Set([watchAppGraphDependency]), ] + let dependencyConditions: [GraphEdge: PlatformCondition] = [ .init(from: appGraphDependency, to: watchAppGraphDependency): .when([.ios])!, ] + let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -1071,10 +1100,14 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", destinations: [.iPhone, .iPad, .mac], product: .app) let watchApp = Target.test(name: "WatchApp", platform: .watchOS, product: .app) + let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, watchApp]) - let project = Project.test(targets: [app, watchApp]) + + let targets: [AbsolutePath: [String: Target]] = [ + project.path: [app.name: app, watchApp.name: watchApp], + ] let appGraphDependency: GraphDependency = .target(name: app.name, path: project.path) let watchAppGraphDependency: GraphDependency = .target(name: watchApp.name, path: project.path) @@ -1090,6 +1123,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -1121,10 +1155,14 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", platform: .macOS, product: .app) let xpcService = Target.test(name: "XPCService", platform: .macOS, product: .xpc) + let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, xpcService]) - let project = Project.test(targets: [app, xpcService]) + + let targets: [AbsolutePath: [String: Target]] = [ + project.path: [app.name: app, xpcService.name: xpcService], + ] let dependencies: [GraphDependency: Set] = [ .target(name: xpcService.name, path: project.path): Set(), .target(name: app.name, path: project.path): Set([.target(name: xpcService.name, path: project.path)]), @@ -1132,6 +1170,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -1161,10 +1200,14 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", platform: .macOS, product: .app) let systemExtension = Target.test(name: "SystemExtension", platform: .macOS, product: .systemExtension) + let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, systemExtension]) - let project = Project.test(targets: [app, systemExtension]) + + let targets: [AbsolutePath: [String: Target]] = [ + project.path: [app.name: app, systemExtension.name: systemExtension], + ] let dependencies: [GraphDependency: Set] = [ .target(name: systemExtension.name, path: project.path): Set(), .target(name: app.name, path: project.path): Set([.target(name: systemExtension.name, path: project.path)]), @@ -1172,6 +1215,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -1407,12 +1451,17 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", destinations: [.iPhone, .iPad, .mac], product: .app) let appClip = Target.test(name: "AppClip", product: .appClip) + let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, appClip]) - let project = Project.test(targets: [app, appClip]) + + let targets: [AbsolutePath: [String: Target]] = [ + project.path: [app.name: app, appClip.name: appClip], + ] let appGraphDependency: GraphDependency = .target(name: app.name, path: project.path) let appClipGraphDependency: GraphDependency = .target(name: appClip.name, path: project.path) + let dependencies: [GraphDependency: Set] = [ appClipGraphDependency: Set(), appGraphDependency: Set([appClipGraphDependency]), @@ -1425,6 +1474,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -1546,7 +1596,13 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let pbxproj = PBXProj() let pbxTarget = PBXNativeTarget(name: app.name) - let graph = Graph.test(path: project.path, projects: [project.path: project], dependencies: [ + let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ + project.path: [ + app.name: app, + macroFramework.name: macroFramework, + macroExecutable.name: macroExecutable, + ], + ], dependencies: [ .target(name: app.name, path: project.path): Set([.target(name: macroFramework.name, path: project.path)]), .target(name: macroFramework.name, path: project.path): Set([.target( name: macroExecutable.name, diff --git a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift index 8efb4fb0e1d..33334d55972 100644 --- a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift @@ -754,7 +754,13 @@ final class ConfigGeneratorTests: TuistUnitTestCase { let macroExecutable = Target.test(name: "macro", platform: .macOS, product: .macro) let project = Project.test(targets: [app, macroFramework, macroExecutable]) - let graph = Graph.test(path: project.path, projects: [project.path: project], dependencies: [ + let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ + project.path: [ + app.name: app, + macroFramework.name: macroFramework, + macroExecutable.name: macroExecutable, + ], + ], dependencies: [ .target(name: app.name, path: project.path): Set([.target(name: macroFramework.name, path: project.path)]), .target(name: macroFramework.name, path: project.path): Set([.target( name: macroExecutable.name, @@ -800,7 +806,12 @@ final class ConfigGeneratorTests: TuistUnitTestCase { let macroFramework = Target.test(name: "framework", platform: .macOS, product: .staticFramework) let project = Project.test(targets: [app, macroFramework]) - let graph = Graph.test(path: project.path, projects: [project.path: project], dependencies: [ + let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ + project.path: [ + app.name: app, + macroFramework.name: macroFramework, + ], + ], dependencies: [ .target(name: app.name, path: project.path): Set([.target(name: macroFramework.name, path: project.path)]), .target(name: macroFramework.name, path: project.path): Set([]), ]) @@ -839,7 +850,11 @@ final class ConfigGeneratorTests: TuistUnitTestCase { let project = Project.test(targets: [appClip]) - let graph = Graph.test(path: project.path, projects: [project.path: project]) + let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ + project.path: [ + appClip.name: appClip, + ], + ]) let graphTraverser = GraphTraverser(graph: graph) // When @@ -876,7 +891,11 @@ final class ConfigGeneratorTests: TuistUnitTestCase { let project = Project.test(targets: [appClip]) - let graph = Graph.test(path: project.path, projects: [project.path: project]) + let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ + project.path: [ + appClip.name: appClip, + ], + ]) let graphTraverser = GraphTraverser(graph: graph) // When @@ -1009,12 +1028,13 @@ final class ConfigGeneratorTests: TuistUnitTestCase { ) let target = Target.test(name: "Test", destinations: destinations, product: uiTest ? .uiTests : .unitTests) - let project = Project.test(path: dir, name: "Project", targets: [target, appTarget]) + let project = Project.test(path: dir, name: "Project", targets: [target]) let graph = Graph.test( name: project.name, path: project.path, projects: [project.path: project], + targets: [project.path: [appTarget.name: appTarget, target.name: target]], dependencies: [ GraphDependency .target(name: target.name, path: project.path): Set([.target(name: appTarget.name, path: project.path)]), diff --git a/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift index 4d535c50dc6..67b37f138f1 100644 --- a/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift @@ -830,9 +830,14 @@ final class LinkGeneratorTests: XCTestCase { path: path.appending(components: "XCFrameworks", "StaticLibraryB.xcframework"), linking: .static ) - let project = Project.test(path: path, targets: [target]) + let graph = Graph.test( - projects: [path: project], + projects: [path: .test(path: path)], + targets: [ + path: [ + target.name: target, + ], + ], dependencies: [ .target(name: target.name, path: path): [ xcframeworkA, @@ -884,9 +889,14 @@ final class LinkGeneratorTests: XCTestCase { let path = try AbsolutePath(validating: "/path/") let staticDependency = Target.test(name: "StaticDependency", product: .staticLibrary) let target = Target.test(name: "Dynamic", product: .framework) - let project = Project.test(path: path, targets: [target, staticDependency]) let graph = Graph.test( - projects: [path: project], + projects: [path: .test(path: path)], + targets: [ + path: [ + target.name: target, + staticDependency.name: staticDependency, + ], + ], dependencies: [ .target(name: target.name, path: path): [ .target(name: staticDependency.name, path: path), @@ -921,9 +931,14 @@ final class LinkGeneratorTests: XCTestCase { let path = try AbsolutePath(validating: "/path/") let resourceBundle = Target.test(name: "ResourceBundle", product: .bundle) let target = Target.test(name: "Target", product: .app) - let project = Project.test(path: path, targets: [target, resourceBundle]) let graph = Graph.test( - projects: [path: project], + projects: [path: .test(path: path)], + targets: [ + path: [ + target.name: target, + resourceBundle.name: resourceBundle, + ], + ], dependencies: [ .target(name: target.name, path: path): [ .target(name: resourceBundle.name, path: path), diff --git a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift index d7c30c916ed..d5409c81e72 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift @@ -54,6 +54,12 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + testGraphTarget.target.name: testGraphTarget.target, + appGraphTarget.target.name: appGraphTarget.target, + ], + ], dependencies: [ .target(name: testGraphTarget.target.name, path: testGraphTarget.path): [ .target(name: appGraphTarget.target.name, path: appGraphTarget.path), @@ -87,14 +93,14 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { // Given let temporaryPath = try temporaryPath() - let target = Target.test(name: "A") let project = Project.test( path: temporaryPath, name: "Project", - targets: [target, .test(name: "B", dependencies: [.package(product: "A", type: .runtime)])], + targets: [.test(dependencies: [.package(product: "A", type: .runtime)])], packages: [.remote(url: "A", requirement: .exact("0.1"))] ) + let target = Target.test() let graphTarget = GraphTarget.test(path: project.path, target: target, project: project) let graph = Graph.test( projects: [project.path: project], @@ -103,6 +109,11 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { "A": .remote(url: "A", requirement: .exact("0.1")), ], ], + targets: [ + graphTarget.path: [ + graphTarget.target.name: graphTarget.target, + ], + ], dependencies: [ .target(name: graphTarget.target.name, path: graphTarget.path): [ .packageProduct(path: project.path, product: "A", type: .runtime), @@ -353,14 +364,15 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { // Given let projectPath = try AbsolutePath(validating: "/Project") let localPackagePath = try AbsolutePath(validating: "/LocalPackages/LocalPackageA") - let target = Target.test(name: "A") let project = Project.test( path: projectPath, sourceRootPath: projectPath, name: "Project", - targets: [target, .test(name: "B", dependencies: [.package(product: "A", type: .runtime)])], + targets: [.test(dependencies: [.package(product: "A", type: .runtime)])], packages: [.local(path: localPackagePath)] ) + + let target = Target.test() let graphTarget = GraphTarget(path: project.path, target: target, project: project) let graph = Graph.test( projects: [project.path: project], @@ -369,6 +381,11 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { "A": .local(path: localPackagePath), ], ], + targets: [ + graphTarget.path: [ + graphTarget.target.name: graphTarget.target, + ], + ], dependencies: [ .target(name: graphTarget.target.name, path: graphTarget.path): [ .packageProduct(path: project.path, product: "A", type: .runtime), diff --git a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift index 445d623b87e..ad5a23bc8a6 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift @@ -952,6 +952,11 @@ final class ProjectFileElementsTests: TuistUnitTestCase { "A": .remote(url: "url", requirement: .branch("master")), ], ], + targets: [ + graphTarget.path: [ + graphTarget.target.name: graphTarget.target, + ], + ], dependencies: [ .target(name: graphTarget.target.name, path: graphTarget.path): [ .packageProduct(path: project.path, product: "A", type: .runtime), diff --git a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift index 27061540eba..c92ac26c8fe 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift @@ -33,8 +33,8 @@ final class ProjectGroupsTests: XCTestCase { settings: .default, filesGroup: .group(name: "Project"), targets: [ - .test(name: "A", filesGroup: .group(name: "Target")), - .test(name: "B"), + .test(filesGroup: .group(name: "Target")), + .test(), ], packages: [], schemes: [], @@ -92,10 +92,10 @@ final class ProjectGroupsTests: XCTestCase { func test_generate_groupsOrder() throws { // Given - let target1 = Target.test(name: "Target1", filesGroup: .group(name: "B")) - let target2 = Target.test(name: "Target2", filesGroup: .group(name: "C")) - let target3 = Target.test(name: "Target3", filesGroup: .group(name: "A")) - let target4 = Target.test(name: "Target4", filesGroup: .group(name: "C")) + let target1 = Target.test(filesGroup: .group(name: "B")) + let target2 = Target.test(filesGroup: .group(name: "C")) + let target3 = Target.test(filesGroup: .group(name: "A")) + let target4 = Target.test(filesGroup: .group(name: "C")) let project = Project.test( filesGroup: .group(name: "P"), targets: [target1, target2, target3, target4] @@ -108,15 +108,15 @@ final class ProjectGroupsTests: XCTestCase { ) // Then - let paths = subject.sortedMain.children.map(\.nameOrPath).sorted() + let paths = subject.sortedMain.children.map(\.nameOrPath) XCTAssertEqual(paths, [ - "A", + "P", "B", "C", - "Cache", - "Frameworks", - "P", + "A", "Products", + "Frameworks", + "Cache", ]) } @@ -191,9 +191,9 @@ final class ProjectGroupsTests: XCTestCase { func test_projectGroup_knownProjectGroups() throws { // Given - let target1 = Target.test(name: "1", filesGroup: .group(name: "A")) - let target2 = Target.test(name: "2", filesGroup: .group(name: "B")) - let target3 = Target.test(name: "3", filesGroup: .group(name: "B")) + let target1 = Target.test(filesGroup: .group(name: "A")) + let target2 = Target.test(filesGroup: .group(name: "B")) + let target3 = Target.test(filesGroup: .group(name: "B")) let project = Project.test( path: .root, sourceRootPath: .root, diff --git a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift index 28c4c438f8d..ff174692a33 100644 --- a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift @@ -37,11 +37,15 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test( path: projectPath, - xcodeProjPath: xcodeProjPath, - targets: targets + xcodeProjPath: xcodeProjPath ) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -82,11 +86,15 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test( path: projectPath, - xcodeProjPath: xcodeProjPath, - targets: targets + xcodeProjPath: xcodeProjPath ) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -135,18 +143,24 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let projectA = Project.test( path: projectAPath, - xcodeProjPath: xcodeProjAPath, - targets: [frameworkA] + xcodeProjPath: xcodeProjAPath ) let projectB = Project.test( path: projectBPath, - xcodeProjPath: xcodeProjBPath, - targets: [frameworkB] + xcodeProjPath: xcodeProjBPath ) let graph = Graph.test( projects: [ projectA.path: projectA, projectB.path: projectB, + ], + targets: [ + projectA.path: [ + frameworkA.name: frameworkA, + ], + projectB.path: [ + frameworkB.name: frameworkB, + ], ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -219,7 +233,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -274,7 +293,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { ) ) let project = Project.test(schemes: [schemeA, schemeB]) - let generatedProject = generatedProject(targets: Array(project.targets.values)) + let generatedProject = generatedProject(targets: project.targets) let graph = Graph.test(projects: [project.path: project]) let graphTraverser = GraphTraverser(graph: graph) @@ -320,7 +339,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -366,6 +390,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + testTarget.name: testTarget, + ], + ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -418,6 +448,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + testTarget.name: testTarget, + ], + ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -472,6 +508,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + framework.name: framework, + ], + ], dependencies: [ .target(name: app.name, path: projectPath): [ .target(name: framework.name, path: projectPath), @@ -518,6 +560,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + framework.name: framework, + ], + ], dependencies: [ .target(name: app.name, path: projectPath): [ .target(name: framework.name, path: projectPath), @@ -567,6 +615,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [target, testTarget]) let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + testTarget.name: testTarget, + ], + ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -695,6 +749,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let scheme = Scheme.test(name: "AppTests", shared: true, buildAction: buildAction, testAction: testAction) let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + testTarget.name: testTarget, + ], + ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -738,6 +798,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + testTarget.name: testTarget, + ], + ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -778,6 +844,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [target, testTarget]) let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + testTarget.name: testTarget, + ], + ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -814,6 +886,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + testTarget.name: testTarget, + ], + ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -882,7 +960,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let generatedProjects = createGeneratedProjects(projects: [project]) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + testTarget.name: testTarget, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -943,6 +1026,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + testTarget.name: testTarget, + ], + ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -1027,7 +1116,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { path: workspacePath, xcWorkspacePath: workspacePath.appending(component: "Workspace.xcworkspace") ), - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1099,7 +1193,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [app]) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1140,7 +1239,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let scheme = Scheme.test(name: "Library", buildAction: buildAction, runAction: launchAction) let project = Project.test(path: projectPath, targets: [target]) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1181,7 +1285,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1241,7 +1350,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1282,7 +1396,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [app] ) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1312,7 +1431,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [app] ) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1351,6 +1475,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + appExtension.name: appExtension, + ], + ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: appExtension.name, path: project.path), @@ -1399,6 +1529,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + appExtension.name: appExtension, + ], + ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: appExtension.name, path: project.path), @@ -1434,7 +1570,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1494,7 +1635,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1541,7 +1687,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1601,7 +1752,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1664,7 +1820,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1697,7 +1858,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [target]) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1734,7 +1900,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [target]) let graph = Graph.test( - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1764,6 +1935,14 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + framework.name: framework, + unitTests.name: unitTests, + uiTests.name: uiTests, + ], + ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: framework.name, path: project.path), @@ -1781,7 +1960,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { // When let result = try subject.generateProjectSchemes( project: project, - generatedProject: generatedProject(targets: Array(project.targets.values)), + generatedProject: generatedProject(targets: project.targets), graphTraverser: graphTraverser ) @@ -1812,6 +1991,12 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + app.name: app, + appExtension.name: appExtension, + ], + ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: appExtension.name, path: project.path), @@ -1823,7 +2008,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { // When let result = try subject.generateProjectSchemes( project: project, - generatedProject: generatedProject(targets: Array(project.targets.values)), + generatedProject: generatedProject(targets: project.targets), graphTraverser: graphTraverser ) @@ -1853,10 +2038,11 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { path: project.path, workspace: workspace, projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: [:] ) let graphTraverser = GraphTraverser(graph: graph) - let generatedProject = generatedProject(targets: Array(project.targets.values)) + let generatedProject = generatedProject(targets: project.targets) // When let result = try subject.generateWorkspaceSchemes( @@ -1883,6 +2069,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: [:] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1890,7 +2077,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { // When let result = try subject.generateProjectSchemes( project: project, - generatedProject: generatedProject(targets: Array(project.targets.values)), + generatedProject: generatedProject(targets: project.targets), graphTraverser: graphTraverser ) @@ -1907,7 +2094,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { ( $0.xcodeProjPath, generatedProject( - targets: Array($0.targets.values), + targets: $0.targets, projectPath: $0.xcodeProjPath.pathString ) ) diff --git a/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift index 5c4947c95cc..c0e30ff371b 100644 --- a/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift @@ -116,12 +116,18 @@ final class TargetGeneratorTests: XCTestCase { destinations: [.mac, .iPhone] ) let targetC = Target.test(name: "TargetC") - let project: Project = .test(path: path, targets: [targetA, targetB, targetC]) let nativeTargetA = createNativeTarget(for: targetA) let nativeTargetB = createNativeTarget(for: targetB) let nativeTargetC = createNativeTarget(for: targetC) let graph = Graph.test( - projects: [path: project], + projects: [path: .test(path: path)], + targets: [ + path: [ + targetA.name: targetA, + targetB.name: targetB, + targetC.name: targetC, + ], + ], dependencies: [ .target(name: targetA.name, path: path): [ .target(name: targetB.name, path: path), diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift index 7c5ab6a921a..c4048ea4e89 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift @@ -104,7 +104,12 @@ final class WorkspaceDescriptorGeneratorTests: TuistUnitTestCase { let graph = Graph.test( workspace: workspace, - projects: [project.path: project] + projects: [project.path: project], + targets: [ + project.path: [ + target.name: target, + ], + ] ) let graphTraverser = GraphTraverser(graph: graph) diff --git a/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift b/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift index a3a6e34255f..13b6d454e3a 100644 --- a/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift +++ b/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift @@ -5,7 +5,6 @@ import TuistCore import TuistGraph import TuistGraphTesting import XCTest - @testable import TuistGenerator @testable import TuistSupportTesting @@ -196,40 +195,34 @@ final class GraphToGraphVizMapperTests: XCTestCase { } private func makeGivenGraph() throws -> TuistGraph.Graph { + let project = Project.test(path: "/") + let coreProject = Project.test(path: "/Core") + let externalProject = Project.test(path: "/Tuist/Dependencies", isExternal: true) let framework = GraphDependency.testFramework(path: try AbsolutePath(validating: "/XcodeProj.framework")) let library = GraphDependency.testLibrary(path: try AbsolutePath(validating: "/RxSwift.a")) let sdk = GraphDependency.testSDK(name: "CoreData.framework", status: .required, source: .developer) - let projectPath: AbsolutePath = "/" - let coreProjectPath: AbsolutePath = "/Core" - let externalProjectPath: AbsolutePath = "/Tuist/Dependencies" - let coreTarget = Target.test(name: "Core") + let core = GraphTarget.test( - path: coreProjectPath, - target: coreTarget + path: coreProject.path, + target: Target.test(name: "Core") ) let coreDependency = GraphDependency.target(name: core.target.name, path: core.path) - let coreTestsTarget = Target.test( - name: "CoreTests", - product: .unitTests - ) let coreTests = GraphTarget.test( - path: coreProjectPath, - target: coreTestsTarget + path: coreProject.path, + target: Target.test( + name: "CoreTests", + product: .unitTests + ) ) - let iOSAppTarget = Target.test(name: "Tuist iOS") - let iOSApp = GraphTarget.test(target: iOSAppTarget) - let watchAppTarget = Target.test( + + let iOSApp = GraphTarget.test(target: Target.test(name: "Tuist iOS")) + let watchApp = GraphTarget.test(target: Target.test( name: "Tuist watchOS", platform: .watchOS, deploymentTarget: .watchOS("6") - ) - let watchApp = GraphTarget.test(target: watchAppTarget) + )) - let externalTargetTarget = Target.test(name: "External dependency") - let externalTarget = GraphTarget.test(path: externalProjectPath, target: externalTargetTarget) - let project = Project.test(path: projectPath, targets: [iOSAppTarget, watchAppTarget]) - let coreProject = Project.test(path: coreProjectPath, targets: [coreTarget, coreTestsTarget]) - let externalProject = Project.test(path: "/Tuist/Dependencies", targets: [externalTargetTarget], isExternal: true) + let externalTarget = GraphTarget.test(path: externalProject.path, target: Target.test(name: "External dependency")) let externalDependency = GraphDependency.target(name: externalTarget.target.name, path: externalTarget.path) let graph = TuistGraph.Graph.test( @@ -238,6 +231,19 @@ final class GraphToGraphVizMapperTests: XCTestCase { coreProject.path: coreProject, externalProject.path: externalProject, ], + targets: [ + project.path: [ + iOSApp.target.name: iOSApp.target, + watchApp.target.name: watchApp.target, + ], + coreProject.path: [ + core.target.name: core.target, + coreTests.target.name: coreTests.target, + ], + externalProject.path: [ + externalTarget.target.name: externalTarget.target, + ], + ], dependencies: [ .target(name: core.target.name, path: core.path): [ framework, diff --git a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift index d4d09b0eb07..b8ae396bb27 100644 --- a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift @@ -137,6 +137,12 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + appTarget.name: appTarget, + staticFrameworkA.name: staticFrameworkA, + staticFrameworkB.name: staticFrameworkB, + staticLibrary.name: staticLibrary, + ]], dependencies: dependencies ) let config = Config.test() @@ -178,6 +184,12 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + appTarget.name: appTarget, + staticLibraryA.name: staticLibraryA, + staticLibraryB.name: staticLibraryB, + staticFramework.name: staticFramework, + ]], dependencies: dependencies ) let config = Config.test() @@ -222,6 +234,12 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + appTarget.name: appTarget, + messagesExtension.name: messagesExtension, + staticFramework.name: staticFramework, + staticLibrary.name: staticLibrary, + ]], dependencies: dependencies ) let config = Config.test() @@ -249,6 +267,10 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + bundle.name: bundle, + framework.name: framework, + ]], dependencies: dependencies ) let config = Config.test() @@ -276,6 +298,10 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + bundle.name: bundle, + application.name: application, + ]], dependencies: dependencies ) let config = Config.test() @@ -315,6 +341,13 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + xpc.name: xpc, + dynamicFramework.name: dynamicFramework, + dynamicLibrary.name: dynamicLibrary, + staticFramework.name: staticFramework, + staticLibrary.name: staticLibrary, + ]], dependencies: dependencies ) let config = Config.test() @@ -344,6 +377,11 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + bundle.name: bundle, + unitTests.name: unitTests, + uiTests.name: uiTests, + ]], dependencies: dependencies ) let config = Config.test() @@ -373,6 +411,11 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + staticFramework.name: staticFramework, + staticLibrary.name: staticLibrary, + dynamicFramework.name: dynamicFramework, + ]], dependencies: dependencies ) let config = Config.test() @@ -391,7 +434,7 @@ final class GraphLinterTests: TuistUnitTestCase { let macStaticFramework = Target.empty(name: "MacStaticFramework", destinations: .macOS, product: .staticFramework) let iosStaticFramework = Target.empty(name: "iOSStaticFramework", destinations: .iOS, product: .staticFramework) let iosStaticLibrary = Target.empty(name: "iOSStaticLibrary", destinations: .iOS, product: .staticLibrary) - let project = Project.empty(path: path, targets: [macStaticFramework, iosStaticLibrary, iosStaticFramework]) + let project = Project.empty(path: path) let dependencies: [GraphDependency: Set] = [ .target( @@ -408,6 +451,11 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + macStaticFramework.name: macStaticFramework, + iosStaticFramework.name: iosStaticFramework, + iosStaticLibrary.name: iosStaticLibrary, + ]], dependencies: dependencies ) let config = Config.test() @@ -435,6 +483,10 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + watchExtension.name: watchExtension, + watchApp.name: watchApp, + ]], dependencies: dependencies ) let config = Config.test() @@ -452,7 +504,7 @@ final class GraphLinterTests: TuistUnitTestCase { let path: AbsolutePath = "/project" let invalidDependency = Target.empty(name: "Framework", destinations: .watchOS, product: .framework) let watchApp = Target.empty(name: "WatchApp", destinations: .watchOS, product: .watch2App) - let project = Project.empty(path: path, targets: [invalidDependency, watchApp]) + let project = Project.empty(path: path) let dependencies: [GraphDependency: Set] = [ .target(name: watchApp.name, path: path): Set([.target(name: invalidDependency.name, path: path)]), @@ -462,6 +514,10 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + invalidDependency.name: invalidDependency, + watchApp.name: watchApp, + ]], dependencies: dependencies ) let config = Config.test() @@ -499,6 +555,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [path: [watchApp.name: watchApp, watchAppTests.name: watchAppTests]], dependencies: dependencies ) let config = Config.test() @@ -536,6 +593,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [path: [staticLibrary.name: staticLibrary, watchAppTests.name: watchAppTests]], dependencies: dependencies ) let config = Config.test() @@ -573,6 +631,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [path: [framework.name: framework, watchAppTests.name: watchAppTests]], dependencies: dependencies ) let config = Config.test() @@ -610,6 +669,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [path: [staticFramework.name: staticFramework, watchAppTests.name: watchAppTests]], dependencies: dependencies ) let config = Config.test() @@ -662,6 +722,13 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [ + path: [ + watchApplication.name: watchApplication, + staticFramework.name: staticFramework, + dynamicFramework.name: dynamicFramework, + ], + ], dependencies: dependencies ) let config = Config.test() @@ -706,6 +773,12 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [ + path: [ + watchApplication.name: watchApplication, + widgetExtension.name: widgetExtension, + ], + ], dependencies: dependencies ) let config = Config.test() @@ -747,6 +820,12 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [ + path: [ + app.name: app, + watchApplication.name: watchApplication, + ], + ], dependencies: dependencies ) let config = Config.test() @@ -801,6 +880,11 @@ final class GraphLinterTests: TuistUnitTestCase { projectBPath: projectB, projectCPath: projectC, ], + targets: [ + projectAPath: [targetA.name: targetA], + projectBPath: [targetB.name: targetB], + projectCPath: [targetC.name: targetC], + ], dependencies: dependencies ) let config = Config.test() @@ -871,6 +955,11 @@ final class GraphLinterTests: TuistUnitTestCase { projectBPath: projectB, projectCPath: projectC, ], + targets: [ + projectAPath: [targetA.name: targetA], + projectBPath: [targetB.name: targetB], + projectCPath: [targetC.name: targetC], + ], dependencies: dependencies ) let config = Config.test() @@ -943,6 +1032,11 @@ final class GraphLinterTests: TuistUnitTestCase { projectBPath: projectB, projectCPath: projectC, ], + targets: [ + projectAPath: [targetA.name: targetA], + projectBPath: [targetB.name: targetB], + projectCPath: [targetC.name: targetC], + ], dependencies: dependencies ) let config = Config.test() @@ -987,6 +1081,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [path: [app.name: app, watchApp.name: watchApp, watchExtension.name: watchExtension]], dependencies: dependencies ) let config = Config.test() @@ -1031,6 +1126,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [path: [app.name: app, watchApp.name: watchApp, watchExtension.name: watchExtension]], dependencies: dependencies ) let config = Config.test() @@ -1084,6 +1180,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: temporaryPath, workspace: Workspace.test(projects: [temporaryPath]), projects: [temporaryPath: project], + targets: [temporaryPath: [app.name: app, appClip.name: appClip]], dependencies: dependencies ) let config = Config.test() @@ -1129,6 +1226,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: temporaryPath, workspace: Workspace.test(projects: [temporaryPath]), projects: [temporaryPath: project], + targets: [temporaryPath: [app.name: app, appClip.name: appClip]], dependencies: dependencies ) let config = Config.test() @@ -1171,6 +1269,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [path: [app.name: app, appClip.name: appClip]], dependencies: dependencies ) let config = Config.test() @@ -1214,6 +1313,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [path: [app.name: app, appClip.name: appClip]], dependencies: dependencies ) let config = Config.test() @@ -1280,6 +1380,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: temporaryPath, workspace: Workspace.test(projects: [temporaryPath]), projects: [temporaryPath: project], + targets: [temporaryPath: [app.name: app, appClip1.name: appClip1, appClip2.name: appClip2]], dependencies: dependencies ) let config = Config.test() @@ -1333,6 +1434,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: temporaryPath, workspace: Workspace.test(projects: [temporaryPath]), projects: [temporaryPath: project], + targets: [temporaryPath: [app.name: app, appClip.name: appClip, framework.name: framework]], dependencies: dependencies ) let config = Config.test() @@ -1372,6 +1474,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [path: [tool.name: tool, dynamic.name: dynamic]], dependencies: dependencies ) let config = Config.test() @@ -1411,6 +1514,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [path: [tool.name: tool, dynamic.name: dynamic]], dependencies: dependencies ) let config = Config.test() @@ -1461,6 +1565,7 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [path: [tool.name: tool, staticFmwk.name: staticFmwk, staticLib.name: staticLib]], dependencies: dependencies ) let config = Config.test() @@ -1500,6 +1605,10 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], + targets: [ + path: [appTarget.name: appTarget], + frameworks1.path: [frameworkA.name: frameworkA, frameworkB.name: frameworkB], + ], dependencies: dependencies ) let config = Config.test() @@ -1535,6 +1644,17 @@ final class GraphLinterTests: TuistUnitTestCase { projects: [ project.path: project, ], + targets: [ + project.path: [ + appTarget.name: appTarget, + frameworkA.name: frameworkA, + frameworkB.name: frameworkB, + frameworkC.name: frameworkC, + frameworkD.name: frameworkD, + frameworkE.name: frameworkE, + frameworkF.name: frameworkF, + ], + ], dependencies: [:] ) let config = Config.test() @@ -1606,7 +1726,13 @@ final class GraphLinterTests: TuistUnitTestCase { autogeneratedWorkspaceSchemes: .enabled(codeCoverageMode: .relevant, testingOptions: []) ) ), - projects: [temporaryPath: project] + projects: [temporaryPath: project], + targets: [ + temporaryPath: [ + "TargetA": targetA, + "TargetB": targetB, + ], + ] ) let config = Config.test() let graphTraverser = GraphTraverser(graph: graph) @@ -1663,7 +1789,13 @@ final class GraphLinterTests: TuistUnitTestCase { ) ) ), - projects: [temporaryPath: project] + projects: [temporaryPath: project], + targets: [ + temporaryPath: [ + "TargetA": .test(), + "TargetB": .test(), + ], + ] ) let config = Config.test() let graphTraverser = GraphTraverser(graph: graph) @@ -1720,7 +1852,13 @@ final class GraphLinterTests: TuistUnitTestCase { ) ) ), - projects: [temporaryPath: project] + projects: [temporaryPath: project], + targets: [ + temporaryPath: [ + "TargetB": .test(), + "TargetC": .test(), + ], + ] ) let config = Config.test() let graphTraverser = GraphTraverser(graph: graph) @@ -1755,6 +1893,12 @@ final class GraphLinterTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [path: project], + targets: [ + path: [ + iOSAndMacTarget.name: iOSAndMacTarget, + macOnlyTarget.name: macOnlyTarget, + ], + ], dependencies: [ .target(name: iOSAndMacTarget.name, path: path): [ .target(name: macOnlyTarget.name, path: path), @@ -1793,6 +1937,12 @@ final class GraphLinterTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [path: project], + targets: [ + path: [ + iOSAndMacTarget.name: iOSAndMacTarget, + watchOnlyTarget.name: watchOnlyTarget, + ], + ], dependencies: [ .target(name: iOSAndMacTarget.name, path: path): [ .target(name: watchOnlyTarget.name, path: path), @@ -1835,6 +1985,14 @@ final class GraphLinterTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [path: project], + targets: [ + path: [ + iOSAndMacTarget.name: iOSAndMacTarget, + iOSOnlyTarget.name: iOSOnlyTarget, + iOSApp.name: iOSApp, + watchApp.name: watchApp, + ], + ], dependencies: [ .target(name: iOSAndMacTarget.name, path: path): [ .target(name: iOSOnlyTarget.name, path: path), diff --git a/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift b/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift index a3fa87f7f90..dd75e01f7a1 100644 --- a/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift @@ -39,6 +39,19 @@ final class ProjectLinterTests: XCTestCase { super.tearDown() } + func test_validate_when_there_are_duplicated_targets() throws { + let target = Target.test(name: "A") + let project = Project.test(targets: [target, target]) + let got = subject.lint(project) + XCTAssertTrue( + got + .contains(LintingIssue( + reason: "Targets A from project at \(project.path.pathString) have duplicates.", + severity: .error + )) + ) + } + func test_lint_valid_watchTargetBundleIdentifiers() throws { // Given let app = Target.test(name: "App", product: .app, bundleId: "app") diff --git a/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift index aaa581046dc..58c9a59935b 100644 --- a/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift @@ -26,7 +26,7 @@ class StaticProductsGraphLinterTests: XCTestCase { let path: AbsolutePath = "/project" let app = Target.test(name: "App") let framework = Target.test(name: "Framework", product: .framework) - let project = Project.test(path: "/tmp/app", name: "AppProject", targets: [app, framework]) + let project = Project.test(path: "/tmp/app", name: "AppProject") let package = Package.remote(url: "https://test.tuist.io", requirement: .branch("main")) let appDependency = GraphDependency.target(name: app.name, path: path) let frameworkDependency = GraphDependency.target(name: framework.name, path: path) @@ -40,6 +40,10 @@ class StaticProductsGraphLinterTests: XCTestCase { path: path, projects: [path: project], packages: [path: ["Package": package]], + targets: [path: [ + app.name: app, + framework.name: framework, + ]], dependencies: dependencies ) let config = Config.test() @@ -59,7 +63,7 @@ class StaticProductsGraphLinterTests: XCTestCase { let path: AbsolutePath = "/project" let app = Target.test(name: "App") let framework = Target.test(name: "Framework", product: .framework) - let project = Project.test(path: "/tmp/app", name: "AppProject", targets: [app, framework]) + let project = Project.test(path: "/tmp/app", name: "AppProject") let package = Package.remote(url: "https://test.tuist.io", requirement: .branch("main")) let appDependency = GraphDependency.target(name: app.name, path: path) let frameworkDependency = GraphDependency.target(name: framework.name, path: path) @@ -74,6 +78,10 @@ class StaticProductsGraphLinterTests: XCTestCase { path: path, projects: [path: project], packages: [path: ["Package": package]], + targets: [path: [ + app.name: app, + framework.name: framework, + ]], dependencies: dependencies ) let config = Config.test() @@ -108,6 +116,10 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + framework.name: framework, + ]], dependencies: dependencies ) let config = Config.test() @@ -142,6 +154,11 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + framework.name: framework, + staticFramework.name: staticFramework, + ]], dependencies: dependencies ) let config = Config.test() @@ -189,6 +206,15 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + staticFrameworkA.name: staticFrameworkA, + staticFrameworkB.name: staticFrameworkB, + staticFrameworkC.name: staticFrameworkC, + frameworkA.name: frameworkA, + frameworkB.name: frameworkB, + frameworkC.name: frameworkC, + ]], dependencies: dependencies ) let config = Config.test() @@ -236,6 +262,15 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + staticFrameworkA.name: staticFrameworkA, + staticFrameworkB.name: staticFrameworkB, + staticFrameworkC.name: staticFrameworkC, + frameworkA.name: frameworkA, + frameworkB.name: frameworkB, + frameworkC.name: frameworkC, + ]], dependencies: dependencies ) let config = Config.test() @@ -259,7 +294,7 @@ class StaticProductsGraphLinterTests: XCTestCase { let frameworkB = Target.test(name: "FrameworkB", product: .framework) let frameworkC = Target.test(name: "FrameworkC", product: .framework) let frameworkD = Target.test(name: "FrameworkD", product: .framework) - let project = Project.test(targets: [app, frameworkA, frameworkB, frameworkC, frameworkD, staticFrameworkA]) + let project = Project.test(targets: [app, frameworkA, frameworkB, frameworkC, staticFrameworkA]) let appDependency = GraphDependency.target(name: app.name, path: path) let staticFrameworkAdependency = GraphDependency.target(name: staticFrameworkA.name, path: path) @@ -279,6 +314,14 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + staticFrameworkA.name: staticFrameworkA, + frameworkA.name: frameworkA, + frameworkB.name: frameworkB, + frameworkC.name: frameworkC, + frameworkD.name: frameworkD, + ]], dependencies: dependencies ) let config = Config.test() @@ -314,6 +357,11 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + staticFramework.name: staticFramework, + framework.name: framework, + ]], dependencies: dependencies ) let config = Config.test() @@ -359,6 +407,15 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + frameworkA.name: frameworkA, + frameworkB.name: frameworkB, + frameworkC.name: frameworkC, + staticFrameworkA.name: staticFrameworkA, + staticFrameworkB.name: staticFrameworkB, + staticFrameworkC.name: staticFrameworkC, + ]], dependencies: dependencies ) let config = Config.test() @@ -391,6 +448,11 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + staticFramework.name: staticFramework, + frameworkTests.name: frameworkTests, + ]], dependencies: dependencies ) let config = Config.test() @@ -410,7 +472,7 @@ class StaticProductsGraphLinterTests: XCTestCase { let framework = Target.test(name: "Framework", product: .framework) let staticFramework = Target.test(name: "StaticFramework", product: .staticFramework) let frameworkTests = Target.test(name: "FrameworkTests", product: .unitTests) - let project = Project.test(targets: [app, framework, staticFramework, frameworkTests]) + let project = Project.test(targets: [app, staticFramework, frameworkTests]) let appDependency = GraphDependency.target(name: app.name, path: path) let frameworkDependency = GraphDependency.target(name: framework.name, path: path) @@ -426,6 +488,12 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + framework.name: framework, + staticFramework.name: staticFramework, + frameworkTests.name: frameworkTests, + ]], dependencies: dependencies ) let config = Config.test() @@ -460,6 +528,11 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + appTestsTarget.name: appTestsTarget, + staticFramework.name: staticFramework, + ]], dependencies: dependencies ) let config = Config.test() @@ -540,6 +613,21 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + appTests.name: appTests, + appUITests.name: appUITests, + frameworkA.name: frameworkA, + frameworkB.name: frameworkB, + frameworkC.name: frameworkC, + frameworkTests.name: frameworkTests, + staticFrameworkA.name: staticFrameworkA, + staticFrameworkB.name: staticFrameworkB, + staticFrameworkC.name: staticFrameworkC, + staticFrameworkATests.name: staticFrameworkATests, + staticFrameworkBTests.name: staticFrameworkBTests, + staticFrameworkCTests.name: staticFrameworkCTests, + ]], dependencies: dependencies ) let config = Config.test() @@ -572,6 +660,11 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + appClip.name: appClip, + appClipTestsTarget.name: appClipTestsTarget, + staticFramework.name: staticFramework, + ]], dependencies: dependencies ) let config = Config.test() @@ -636,6 +729,17 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + appTests.name: appTests, + frameworkA.name: frameworkA, + frameworkB.name: frameworkB, + frameworkC.name: frameworkC, + frameworkTests.name: frameworkTests, + staticFrameworkA.name: staticFrameworkA, + staticFrameworkB.name: staticFrameworkB, + staticFrameworkC.name: staticFrameworkC, + ]], dependencies: dependencies ) let config = Config.test() @@ -678,6 +782,13 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + appTests.name: appTests, + appUITests.name: appUITests, + frameworkA.name: frameworkA, + staticFrameworkA.name: staticFrameworkA, + ]], dependencies: dependencies ) let config = Config.test() @@ -716,6 +827,12 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + appUITests.name: appUITests, + frameworkA.name: frameworkA, + staticFrameworkA.name: staticFrameworkA, + ]], dependencies: dependencies ) let config = Config.test() @@ -756,6 +873,12 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + appUITests.name: appUITests, + frameworkA.name: frameworkA, + staticFrameworkA.name: staticFrameworkA, + ]], dependencies: dependencies ) let config = Config.test() @@ -795,6 +918,12 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + appUITests.name: appUITests, + frameworkA.name: frameworkA, + staticFrameworkA.name: staticFrameworkA, + ]], dependencies: dependencies ) let config = Config.test() @@ -831,6 +960,11 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + appExtension.name: appExtension, + staticFramework.name: staticFramework, + ]], dependencies: dependencies ) let config = Config.test() @@ -867,6 +1001,12 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + appExtension.name: appExtension, + staticFramework.name: staticFramework, + framework.name: framework, + ]], dependencies: dependencies ) let config = Config.test() @@ -902,6 +1042,11 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + appClip.name: appClip, + staticFramework.name: staticFramework, + ]], dependencies: dependencies ) let config = Config.test() @@ -938,6 +1083,12 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + appClip.name: appClip, + framework.name: framework, + staticFramework.name: staticFramework, + ]], dependencies: dependencies ) let config = Config.test() @@ -975,6 +1126,11 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + watchApp.name: watchApp, + watchAppExtension.name: watchAppExtension, + ]], dependencies: dependencies ) let config = Config.test() @@ -1013,6 +1169,12 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + watchApp.name: watchApp, + watchAppExtension.name: watchAppExtension, + watchFramework.name: watchFramework, + ]], dependencies: dependencies ) let config = Config.test() @@ -1060,6 +1222,15 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + staticFrameworkA.name: staticFrameworkA, + staticFrameworkB.name: staticFrameworkB, + staticFrameworkC.name: staticFrameworkC, + frameworkA.name: frameworkA, + frameworkB.name: frameworkB, + frameworkC.name: frameworkC, + ]], dependencies: dependencies ) let config = Config @@ -1100,6 +1271,12 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], + targets: [path: [ + app.name: app, + macroStaticFramework.name: macroStaticFramework, + macroExecutable.name: macroExecutable, + swiftSyntax.name: swiftSyntax, + ]], dependencies: dependencies ) let config = Config.test() diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift index b50d26df813..d1bae6363bc 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift @@ -68,6 +68,15 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { isExternal: true ), ], + targets: [ + projectAPath: [ + "FrameworkA": frameworkA, + "DynamicLibraryB": dynamicLibraryB, + ], + externalProjectBPath: [ + "ExternalFrameworkC": externalFrameworkC, + ], + ], dependencies: [ .target(name: "FrameworkA", path: projectAPath): [ .target(name: "DynamicLibraryB", path: projectAPath), @@ -89,10 +98,8 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { """ // Then - let gotAProject = try XCTUnwrap(got.0.projects[projectAPath]) - let gotATargets = Array(gotAProject.targets.values).sorted() XCTAssertEqual( - gotATargets[0], + got.0.projects[projectAPath]?.targets[0], .test( name: "App", product: .app, @@ -101,7 +108,7 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { ] ) ) - let gotFrameworkA = try XCTUnwrap(gotATargets[2]) + let gotFrameworkA = try XCTUnwrap(got.0.projects[projectAPath]?.targets[1]) XCTAssertEqual( gotFrameworkA.name, "FrameworkA" @@ -162,9 +169,8 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { .project(target: "ExternalFrameworkC", path: externalProjectBPath), ] ) - XCTAssertEqual( - gotATargets[1], + got.0.projects[projectAPath]?.targets[2], .test( name: "DynamicLibraryB", product: .dynamicLibrary, @@ -200,10 +206,8 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { ] ) ) - let gotExternalBProject = try XCTUnwrap(got.0.projects[externalProjectBPath]) - let gotExternalBTargets = Array(gotExternalBProject.targets.values) XCTAssertEqual( - gotExternalBTargets, + got.0.projects[externalProjectBPath]?.targets, [ .test( name: "ExternalFrameworkC", @@ -277,6 +281,14 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { isExternal: true ), ], + targets: [ + projectAPath: [ + "FrameworkA": frameworkA, + ], + externalProjectBPath: [ + "ExternalFrameworkB": externalFrameworkB, + ], + ], dependencies: [ .target(name: "FrameworkA", path: projectAPath): [ .target(name: "ExternalFrameworkB", path: externalProjectBPath), @@ -288,9 +300,7 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { let got = try await subject.map(graph: graph) // Then - let gotAProject = try XCTUnwrap(got.0.projects[projectAPath]) - let gotATargets = Array(gotAProject.targets.values).sorted() - let gotFrameworkA = try XCTUnwrap(gotATargets[0]) + let gotFrameworkA = try XCTUnwrap(got.0.projects[projectAPath]?.targets[0]) XCTAssertEqual( gotFrameworkA.name, "FrameworkA" diff --git a/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift index 104fe4afc51..78f483afda6 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift @@ -95,7 +95,7 @@ public final class GenerateInfoPlistProjectMapperTests: TuistUnitTestCase { file: StaticString = #file, line: UInt = #line ) { - XCTAssertNotNil(project.targets.values.first(where: { (target: Target) in + XCTAssertNotNil(project.targets.first(where: { (target: Target) in target.infoPlist?.path == project.path .appending(component: Constants.DerivedDirectory.name) .appending(component: Constants.DerivedDirectory.infoPlists) diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift index d827fc205f8..59208d00a5d 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift @@ -77,6 +77,15 @@ final class ModuleMapMapperTests: TuistUnitTestCase { projectAPath: projectA, projectBPath: projectB, ], + targets: [ + projectAPath: [ + targetA.name: targetA, + ], + projectBPath: [ + targetB1.name: targetB1, + targetB2.name: targetB2, + ], + ], dependencies: [ .target(name: targetA.name, path: projectAPath): [ .target(name: targetB1.name, path: projectBPath), @@ -153,6 +162,15 @@ final class ModuleMapMapperTests: TuistUnitTestCase { projectAPath: mappedProjectA, projectBPath: mappedProjectB, ], + targets: [ + projectAPath: [ + mappedTargetA.name: mappedTargetA, + ], + projectBPath: [ + mappedTargetB1.name: mappedTargetB1, + mappedTargetB2.name: mappedTargetB2, + ], + ], dependencies: [ .target(name: targetA.name, path: projectAPath): [ .target(name: targetB1.name, path: projectBPath), @@ -211,6 +229,14 @@ final class ModuleMapMapperTests: TuistUnitTestCase { projectAPath: projectA, projectBPath: projectB, ], + targets: [ + projectAPath: [ + targetA.name: targetA, + ], + projectBPath: [ + targetB.name: targetB, + ], + ], dependencies: [ .target(name: targetA.name, path: projectAPath): [ .target(name: targetB.name, path: projectBPath), @@ -273,6 +299,14 @@ final class ModuleMapMapperTests: TuistUnitTestCase { projectAPath: mappedProjectA, projectBPath: mappedProjectB, ], + targets: [ + projectAPath: [ + mappedTargetA.name: mappedTargetA, + ], + projectBPath: [ + mappedTargetB.name: mappedTargetB, + ], + ], dependencies: [ .target(name: projectA.name, path: projectAPath): [ .target(name: projectB.name, path: projectBPath), diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 820cdd61d2d..a337b0e7f80 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -57,7 +57,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then: Targets XCTAssertEqual(gotProject.targets.count, 2) - let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) + let gotTarget = try XCTUnwrap(gotProject.targets.first) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.resources.count, 0) @@ -70,7 +70,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { TargetDependency.target(name: "\(project.name)_\(target.name)", condition: .when([.ios])) ) - let resourcesTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) + let resourcesTarget = try XCTUnwrap(gotProject.targets.last) XCTAssertEqual(resourcesTarget.name, "\(project.name)_\(target.name)") XCTAssertEqual(resourcesTarget.product, .bundle) XCTAssertEqual(resourcesTarget.destinations, target.destinations) @@ -117,7 +117,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual(gotSideEffects, []) XCTAssertEqual(gotProject.targets.count, 2) - let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) + let gotTarget = try XCTUnwrap(gotProject.targets.first) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.resources.count, 0) @@ -128,7 +128,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { TargetDependency.target(name: "\(project.name)_\(target.name)", condition: .when([.ios])) ) - let resourcesTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) + let resourcesTarget = try XCTUnwrap(gotProject.targets.last) XCTAssertEqual(resourcesTarget.name, "\(project.name)_\(target.name)") XCTAssertEqual(resourcesTarget.product, .bundle) XCTAssertEqual(resourcesTarget.destinations, target.destinations) @@ -167,7 +167,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then: Targets XCTAssertEqual(gotProject.targets.count, 2) - let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) + let gotTarget = try XCTUnwrap(gotProject.targets.first) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.resources.count, 0) @@ -180,7 +180,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { TargetDependency.target(name: "\(project.name)_\(target.name)", condition: .when([.ios])) ) - let resourcesTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) + let resourcesTarget = try XCTUnwrap(gotProject.targets.last) XCTAssertEqual(resourcesTarget.name, "\(project.name)_\(target.name)") XCTAssertEqual(resourcesTarget.product, .bundle) XCTAssertEqual(resourcesTarget.destinations, target.destinations) @@ -217,7 +217,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then: Targets XCTAssertEqual(gotProject.targets.count, 1) - let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) + let gotTarget = try XCTUnwrap(gotProject.targets.first) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.resources, resources) @@ -255,7 +255,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then: Targets XCTAssertEqual(gotProject.targets.count, 1) - let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) + let gotTarget = try XCTUnwrap(gotProject.targets.first) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.coreDataModels, coreDataModels) @@ -275,7 +275,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(Array(gotProject.targets.values), [target]) + XCTAssertEqual(gotProject.targets, [target]) XCTAssertEmpty(gotSideEffects) } @@ -292,7 +292,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(Array(gotProject.targets.values), [target]) + XCTAssertEqual(gotProject.targets, [target]) XCTAssertEmpty(gotSideEffects) } @@ -338,7 +338,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(Array(gotProject.targets.values), [target]) + XCTAssertEqual(gotProject.targets, [target]) XCTAssertEmpty(gotSideEffects) } @@ -353,7 +353,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(Array(gotProject.targets.values), [target]) + XCTAssertEqual(gotProject.targets, [target]) XCTAssertEmpty(gotSideEffects) } @@ -396,7 +396,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) + let gotTarget = try XCTUnwrap(gotProject.targets.first) verifyObjcBundleAccessor( for: target, gotTarget: gotTarget, @@ -415,7 +415,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) + let gotTarget = try XCTUnwrap(gotProject.targets.first) verifyObjcBundleAccessor( for: target, gotTarget: gotTarget, @@ -436,7 +436,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Got let (gotProject, _) = try subject.map(project: project) - let bundleTarget = try XCTUnwrap(gotProject.targets.values.sorted().first(where: { $0.product == .bundle })) + let bundleTarget = try XCTUnwrap(gotProject.targets.first(where: { $0.product == .bundle })) // Then XCTAssertEqual(expectedBundleName, bundleTarget.name) diff --git a/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift index 8d755af1757..19a4c7771c5 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift @@ -17,17 +17,16 @@ final class TargetActionDisableShowEnvVarsProjectMapperTests: TuistUnitTestCase // When let (updatedProject, _) = try subject.map(project: project) - let updatedTargets = updatedProject.targets.values.sorted() // Then - XCTAssertFalse(updatedTargets[1].scripts[0].showEnvVarsInLog) - XCTAssertFalse(updatedTargets[1].scripts[1].showEnvVarsInLog) - XCTAssertFalse(updatedTargets[0].scripts[0].showEnvVarsInLog) - XCTAssertFalse(updatedTargets[0].scripts[1].showEnvVarsInLog) - XCTAssertFalse(updatedTargets[1].scripts[0].showEnvVarsInLog) - XCTAssertFalse(updatedTargets[1].scripts[1].showEnvVarsInLog) - XCTAssertFalse(updatedTargets[0].scripts[0].showEnvVarsInLog) - XCTAssertFalse(updatedTargets[0].scripts[1].showEnvVarsInLog) + XCTAssertTrue(project.targets[0].scripts[0].showEnvVarsInLog) + XCTAssertTrue(project.targets[0].scripts[1].showEnvVarsInLog) + XCTAssertTrue(project.targets[1].scripts[0].showEnvVarsInLog) + XCTAssertTrue(project.targets[1].scripts[1].showEnvVarsInLog) + XCTAssertFalse(updatedProject.targets[0].scripts[0].showEnvVarsInLog) + XCTAssertFalse(updatedProject.targets[0].scripts[1].showEnvVarsInLog) + XCTAssertFalse(updatedProject.targets[1].scripts[0].showEnvVarsInLog) + XCTAssertFalse(updatedProject.targets[1].scripts[1].showEnvVarsInLog) } func test_map_environmentLoggingEnables() throws { @@ -41,16 +40,15 @@ final class TargetActionDisableShowEnvVarsProjectMapperTests: TuistUnitTestCase // When let (updatedProject, _) = try subject.map(project: project) - let updatedTargets = updatedProject.targets.values.sorted() // Then - XCTAssertTrue(updatedTargets[0].scripts[0].showEnvVarsInLog) - XCTAssertTrue(updatedTargets[0].scripts[1].showEnvVarsInLog) - XCTAssertTrue(updatedTargets[1].scripts[0].showEnvVarsInLog) - XCTAssertTrue(updatedTargets[1].scripts[1].showEnvVarsInLog) - XCTAssertTrue(updatedTargets[0].scripts[0].showEnvVarsInLog) - XCTAssertTrue(updatedTargets[0].scripts[1].showEnvVarsInLog) - XCTAssertTrue(updatedTargets[1].scripts[0].showEnvVarsInLog) - XCTAssertTrue(updatedTargets[1].scripts[1].showEnvVarsInLog) + XCTAssertTrue(project.targets[0].scripts[0].showEnvVarsInLog) + XCTAssertTrue(project.targets[0].scripts[1].showEnvVarsInLog) + XCTAssertTrue(project.targets[1].scripts[0].showEnvVarsInLog) + XCTAssertTrue(project.targets[1].scripts[1].showEnvVarsInLog) + XCTAssertTrue(updatedProject.targets[0].scripts[0].showEnvVarsInLog) + XCTAssertTrue(updatedProject.targets[0].scripts[1].showEnvVarsInLog) + XCTAssertTrue(updatedProject.targets[1].scripts[0].showEnvVarsInLog) + XCTAssertTrue(updatedProject.targets[1].scripts[1].showEnvVarsInLog) } } diff --git a/Tests/TuistGraphTests/Models/ProjectTests.swift b/Tests/TuistGraphTests/Models/ProjectTests.swift index 4bb76568a0c..e6a06b00500 100644 --- a/Tests/TuistGraphTests/Models/ProjectTests.swift +++ b/Tests/TuistGraphTests/Models/ProjectTests.swift @@ -33,6 +33,14 @@ final class ProjectTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], + targets: [ + project.path: [ + framework.name: framework, + frameworkTests.name: frameworkTests, + app.name: app, + appTests.name: appTests, + ], + ], dependencies: [ .target(name: frameworkTests.name, path: project.path): [ .target(name: framework.name, path: project.path), diff --git a/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift b/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift index 17cd016bba7..226eb881650 100644 --- a/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift +++ b/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift @@ -16,9 +16,16 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: Set()) let path = try temporaryPath() - let project = Project.test(path: path, targets: [aTarget, bTarget, cTarget]) + let project = Project.test(path: path) let graph = Graph.test( projects: [project.path: project], + targets: [ + path: [ + aTarget.name: aTarget, + bTarget.name: bTarget, + cTarget.name: cTarget, + ], + ], dependencies: [ .target(name: bTarget.name, path: path): [ .target(name: aTarget.name, path: path), @@ -31,8 +38,8 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { // When let (gotGraph, gotSideEffects) = try subject.map(graph: graph) - let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) + let pruningTargets = gotGraph.targets[path]?.values.filter(\.prune) ?? [] // Then XCTAssertEmpty(gotSideEffects) XCTAssertEmpty(pruningTargets.map(\.name)) @@ -49,13 +56,24 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let subject = FocusTargetsGraphMappers(includedTargets: Set()) let projectPath = try temporaryPath().appending(component: "Project") let externalProjectPath = try temporaryPath().appending(component: "ExternalProject") - let project = Project.test(path: projectPath, targets: [aTarget, bTarget, cTarget]) - let externalProject = Project.test(path: externalProjectPath, targets: [dTarget, eTarget], isExternal: true) + let project = Project.test(path: projectPath) + let externalProject = Project.test(path: externalProjectPath, isExternal: true) let graph = Graph.test( projects: [ project.path: project, externalProject.path: externalProject, ], + targets: [ + projectPath: [ + aTarget.name: aTarget, + bTarget.name: bTarget, + cTarget.name: cTarget, + ], + externalProjectPath: [ + dTarget.name: dTarget, + eTarget.name: eTarget, + ], + ], dependencies: [ .target(name: bTarget.name, path: projectPath): [ .target(name: aTarget.name, path: projectPath), @@ -68,9 +86,10 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { // When let (gotGraph, gotSideEffects) = try subject.map(graph: graph) - let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) - let expectingTargets = [dTarget, eTarget] + let expectingTargets = [dTarget, eTarget] + let pruningTargets = (gotGraph.targets[projectPath]?.values.filter(\.prune) ?? []) + + (gotGraph.targets[externalProjectPath]?.values.filter(\.prune) ?? []) // Then XCTAssertEmpty(gotSideEffects) XCTAssertEqual( @@ -87,9 +106,16 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: [aTarget.name]) let path = try temporaryPath() - let project = Project.test(path: path, targets: [aTarget, bTarget, cTarget]) + let project = Project.test(path: path) let graph = Graph.test( projects: [project.path: project], + targets: [ + path: [ + aTarget.name: aTarget, + bTarget.name: bTarget, + cTarget.name: cTarget, + ], + ], dependencies: [ .target(name: bTarget.name, path: path): [ .target(name: aTarget.name, path: path), @@ -104,8 +130,7 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let (gotGraph, gotSideEffects) = try subject.map(graph: graph) let expectingTargets = [bTarget, cTarget] - let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) - + let pruningTargets = gotGraph.targets[path]?.values.filter(\.prune) ?? [] // Then XCTAssertEmpty(gotSideEffects) XCTAssertEqual( @@ -122,9 +147,16 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: [bTarget.name]) let path = try temporaryPath() - let project = Project.test(path: path, targets: [aTarget, bTarget, cTarget]) + let project = Project.test(path: path) let graph = Graph.test( projects: [project.path: project], + targets: [ + path: [ + aTarget.name: aTarget, + bTarget.name: bTarget, + cTarget.name: cTarget, + ], + ], dependencies: [ .target(name: bTarget.name, path: path): [ .target(name: aTarget.name, path: path), @@ -139,8 +171,7 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let (gotGraph, gotSideEffects) = try subject.map(graph: graph) let expectingTargets = [cTarget] - let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) - + let pruningTargets = gotGraph.targets[path]?.values.filter(\.prune) ?? [] // Then XCTAssertEmpty(gotSideEffects) XCTAssertEqual( @@ -158,9 +189,17 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: [aTarget.name]) let path = try temporaryPath() - let project = Project.test(path: path, targets: [aTestTarget, aTarget, bTarget, cTarget]) + let project = Project.test(path: path) let graph = Graph.test( projects: [project.path: project], + targets: [ + path: [ + aTestTarget.name: aTestTarget, + aTarget.name: aTarget, + bTarget.name: bTarget, + cTarget.name: cTarget, + ], + ], dependencies: [ .target(name: aTestTarget.name, path: path): [ .target(name: aTarget.name, path: path), @@ -178,8 +217,7 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let (gotGraph, gotSideEffects) = try subject.map(graph: graph) let expectingTargets = [bTarget, cTarget, aTestTarget] - let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) - + let pruningTargets = gotGraph.targets[path]?.values.filter(\.prune) ?? [] // Then XCTAssertEmpty(gotSideEffects) XCTAssertEqual( @@ -196,9 +234,16 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: [aTarget.name, "bar"]) let path = try temporaryPath() - let project = Project.test(path: path, targets: [aTestTarget, aTarget, cTarget]) + let project = Project.test(path: path) let graph = Graph.test( projects: [project.path: project], + targets: [ + path: [ + aTestTarget.name: aTestTarget, + aTarget.name: aTarget, + cTarget.name: cTarget, + ], + ], dependencies: [ .target(name: aTestTarget.name, path: path): [ .target(name: aTarget.name, path: path), diff --git a/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift b/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift index 46b9f599403..425a973009c 100644 --- a/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift +++ b/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift @@ -27,12 +27,14 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, - projects: [project.path: project] + projects: [project.path: project], + targets: [project.path: [target.name: target]] ) let expectedGraph = Graph.test( path: project.path, - projects: [:] + projects: [:], + targets: [:] ) // When @@ -55,6 +57,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [firstTarget.name: firstTarget, secondTarget.name: secondTarget]], dependencies: [:] ) @@ -64,9 +67,9 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { // Then XCTAssertEmpty(gotValueSideEffects) XCTAssertEqual(gotGraph.projects.count, 1) - let valueTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted() + let valueTargets = gotGraph.targets.flatMap(\.value) XCTAssertEqual(valueTargets.count, 1) - XCTAssertEqual(valueTargets.first, firstTarget) + XCTAssertEqual(valueTargets.first?.value, firstTarget) } func test_map_removes_project_schemes_with_whose_all_targets_have_been_removed() throws { @@ -82,6 +85,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [prunedTarget.name: prunedTarget, keptTarget.name: keptTarget]], dependencies: [:] ) @@ -109,6 +113,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [prunedTarget.name: prunedTarget, keptTarget.name: keptTarget]], dependencies: [:] ) @@ -148,6 +153,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { path: project.path, workspace: workspace, projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: [:] ) @@ -177,6 +183,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { path: project.path, workspace: workspace, projects: [project.path: project], + targets: [project.path: [target.name: target]], dependencies: [:] ) @@ -207,7 +214,8 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let project = Project.test(path: path, targets: targets, schemes: [scheme]) let graph = Graph.test( path: project.path, - projects: [project.path: project] + projects: [project.path: project], + targets: [project.path: Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) })] ) let unprunedTargets = targets.filter { !$0.prune } @@ -223,7 +231,8 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let expectedProject = Project.test(path: path, targets: unprunedTargets, schemes: [schemeWithUnprunedTargets]) let expectedGraph = Graph.test( path: expectedProject.path, - projects: [expectedProject.path: expectedProject] + projects: [expectedProject.path: expectedProject], + targets: [expectedProject.path: Dictionary(uniqueKeysWithValues: unprunedTargets.map { ($0.name, $0) })] ) // When @@ -244,6 +253,12 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], + targets: [project.path: [ + firstTarget.name: firstTarget, + secondTarget.name: secondTarget, + thirdTarget.name: thirdTarget, + prunedTarget.name: prunedTarget, + ]], dependencies: [:] ) diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift index 323bc5dd810..9b343c70544 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift @@ -75,7 +75,10 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first(where: { $0.name == projectName })) - let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) + + let targets = graph.targets.values.lazy + .flatMap(\.values) + .sorted(by: { $0.name < $1.name }) // Then XCTAssertEqual(graph.name, "TestManifests") @@ -83,10 +86,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEqual(targets.count, 9) // Generated Manifests target - let manifestsTarget = try XCTUnwrap( - project.targets.values.sorted() - .first(where: { $0.name == sourceRootPath.basename + projectName }) - ) + let manifestsTarget = try XCTUnwrap(project.targets.first(where: { $0.name == sourceRootPath.basename + projectName })) XCTAssertEqual(targets.last, manifestsTarget) XCTAssertEqual(manifestsTarget.destinations, .macOS) @@ -104,7 +104,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated Helpers target - let helpersTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "ProjectDescriptionHelpers" })) + let helpersTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "ProjectDescriptionHelpers" })) XCTAssertTrue(targets.contains(helpersTarget)) XCTAssertEqual(helpersTarget.name, "ProjectDescriptionHelpers") @@ -123,7 +123,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated Templates target - let templatesTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Templates" })) + let templatesTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Templates" })) XCTAssertTrue(targets.contains(templatesTarget)) XCTAssertEqual(templatesTarget.name, "Templates") @@ -141,10 +141,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated ResourceSynthesizers target - let resourceSynthesizersTarget = try XCTUnwrap( - project.targets.values.sorted() - .last(where: { $0.name == "ResourceSynthesizers" }) - ) + let resourceSynthesizersTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "ResourceSynthesizers" })) XCTAssertTrue(targets.contains(resourceSynthesizersTarget)) XCTAssertEqual(resourceSynthesizersTarget.name, "ResourceSynthesizers") @@ -161,7 +158,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated Stencils target - let stencilsTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Stencils" })) + let stencilsTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Stencils" })) XCTAssertTrue(targets.contains(stencilsTarget)) XCTAssertEqual(stencilsTarget.name, "Stencils") @@ -178,7 +175,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated Config target - let configTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Config" })) + let configTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Config" })) XCTAssertTrue(targets.contains(configTarget)) XCTAssertEqual(configTarget.name, "Config") @@ -193,7 +190,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(configTarget.dependencies) // Generated Packages target - let packagesTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Packages" })) + let packagesTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Packages" })) XCTAssertTrue(targets.contains(packagesTarget)) XCTAssertEqual(packagesTarget.name, "Packages") @@ -249,7 +246,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEqual(scheme.name, projectName) let buildAction = try XCTUnwrap(scheme.buildAction) - XCTAssertEqual(buildAction.targets.lazy.map(\.name).sorted(), project.targets.values.map(\.name).sorted()) + XCTAssertEqual(buildAction.targets.lazy.map(\.name).sorted(), project.targets.map(\.name).sorted()) let runAction = try XCTUnwrap(scheme.runAction) XCTAssertEqual(runAction.filePath, tuistPath) @@ -290,17 +287,17 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first) - let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) + + let targets = graph.targets.values.lazy + .flatMap(\.values) + .sorted(by: { $0.name < $1.name }) // Then XCTAssertEqual(targets.count, 1) XCTAssertEmpty(targets.flatMap(\.dependencies)) // Generated Manifests target - let manifestsTarget = try XCTUnwrap( - project.targets.values.sorted() - .last(where: { $0.name == sourceRootPath.basename + projectName }) - ) + let manifestsTarget = try XCTUnwrap(project.targets.last(where: { $0.name == sourceRootPath.basename + projectName })) XCTAssertEqual(manifestsTarget.destinations, .macOS) XCTAssertEqual(manifestsTarget.product, .staticFramework) @@ -373,7 +370,10 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first) - let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) + + let targets = graph.targets.values.lazy + .flatMap(\.values) + .sorted(by: { $0.name < $1.name }) // Then @@ -381,7 +381,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(targets.flatMap(\.dependencies)) // Generated Manifests target - let manifestOneTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "ModuleManifests" })) + let manifestOneTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "ModuleManifests" })) XCTAssertEqual(manifestOneTarget.name, "ModuleManifests") XCTAssertEqual(manifestOneTarget.destinations, .macOS) @@ -395,10 +395,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(manifestOneTarget.dependencies) // Generated Manifests target - let manifestTwoTarget = try XCTUnwrap( - project.targets.values.sorted() - .last(where: { $0.name == "\(sourceRootPath.basename)Manifests" }) - ) + let manifestTwoTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "\(sourceRootPath.basename)Manifests" })) XCTAssertEqual(manifestTwoTarget.destinations, .macOS) XCTAssertEqual(manifestTwoTarget.product, .staticFramework) @@ -411,7 +408,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(manifestTwoTarget.dependencies) // Generated Config target - let configTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Config" })) + let configTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Config" })) XCTAssertEqual(configTarget.name, "Config") XCTAssertEqual(configTarget.destinations, .macOS) @@ -483,14 +480,17 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first) - let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) + + let targets = graph.targets.values.lazy + .flatMap(\.values) + .sorted(by: { $0.name < $1.name }) // Then XCTAssertEqual(targets.count, 1) XCTAssertEmpty(targets.flatMap(\.dependencies)) // Generated Plugin target - let pluginTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == sourceRootPath.basename })) + let pluginTarget = try XCTUnwrap(project.targets.last(where: { $0.name == sourceRootPath.basename })) XCTAssertEqual(pluginTarget.destinations, .macOS) XCTAssertEqual(pluginTarget.product, .staticFramework) @@ -562,14 +562,17 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first) - let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) + + let targets = graph.targets.values.lazy + .flatMap(\.values) + .sorted(by: { $0.name < $1.name }) // Then XCTAssertEqual(targets.count, 2) XCTAssertEmpty(targets.flatMap(\.dependencies)) // Generated first plugin target - let firstPluginTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "A" })) + let firstPluginTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "A" })) XCTAssertEqual(firstPluginTarget.destinations, .macOS) XCTAssertEqual(firstPluginTarget.product, .staticFramework) @@ -582,7 +585,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(firstPluginTarget.dependencies) // Generated second plugin target - let secondPluginTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "B" })) + let secondPluginTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "B" })) XCTAssertEqual(secondPluginTarget.destinations, .macOS) XCTAssertEqual(secondPluginTarget.product, .staticFramework) @@ -676,7 +679,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { // Then let project = try XCTUnwrap(graph.projects.values.first) - let pluginTarget = try XCTUnwrap(project.targets.values.first) + let pluginTarget = try XCTUnwrap(project.targets.first) XCTAssertEqual( pluginTarget.sources, @@ -722,7 +725,10 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { let pluginsProject = try XCTUnwrap(graph.projects.values.first(where: { $0.name == pluginsProjectName })) let manifestsProject = try XCTUnwrap(graph.projects.values.first(where: { $0.name == manifestsProjectName })) - let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) + + let targets = graph.targets.values.lazy + .flatMap(\.values) + .sorted(by: { $0.name < $1.name }) let localPluginTarget = try XCTUnwrap(targets.first(where: { $0.name == "ALocalPlugin" })) let helpersTarget = try XCTUnwrap(targets.first(where: { $0.name == "ProjectDescriptionHelpers" })) let manifestsTarget = try XCTUnwrap(targets.first(where: { $0 != localPluginTarget && $0 != helpersTarget })) diff --git a/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift b/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift index c13fec5b2e7..0b3e12ee5a9 100644 --- a/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift @@ -86,13 +86,13 @@ class ManifestModelConverterTests: TuistUnitTestCase { // Then XCTAssertEqual(model.targets.count, 2) try XCTAssertTargetMatchesManifest( - target: try XCTUnwrap(model.targets["A"]), + target: model.targets[0], matches: targetA, at: temporaryPath, generatorPaths: generatorPaths ) try XCTAssertTargetMatchesManifest( - target: try XCTUnwrap(model.targets["B"]), + target: model.targets[1], matches: targetB, at: temporaryPath, generatorPaths: generatorPaths From b40621c15afeaf97d8d4293284df35c42a575dc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 4 Jun 2024 09:26:22 +0200 Subject: [PATCH 330/509] Single source of truth for targets in the graph (#6365) * Revert "Revert "Single source of truth for targets in the graph" (#6364)" This reverts commit a3a17b70444750fe1a980b0bc605939e6e725acd. * Make sure that generation integration tests are run * Make the generation stable --- .../SkipUITestsProjectMapper.swift | 2 +- .../Graph/CircularDependencyLinter.swift | 2 +- Sources/TuistCore/Graph/GraphLoader.swift | 7 +- Sources/TuistCore/Graph/GraphTraverser.swift | 43 +- .../Graph/Mappers/ProjectMapper.swift | 11 +- .../Graph/ModelExtensions/Project+Core.swift | 2 +- .../GraphTraverser/GraphTraversing.swift | 2 +- .../GraphTraverser/MockGraphTraverser.swift | 11 +- ...lProjectsPlatformNarrowerGraphMapper.swift | 27 +- ...runeOrphanExternalTargetsGraphMapper.swift | 12 +- .../Generator/InfoPlistContentProvider.swift | 2 +- .../Generator/KnownAssetTagsFetcher.swift | 8 +- .../ProjectDescriptorGenerator.swift | 4 +- .../Generator/ProjectFileElements.swift | 4 +- .../Generator/ProjectGroups.swift | 2 +- .../TuistGenerator/Linter/ProjectLinter.swift | 19 +- .../TuistGenerator/Linter/SchemeLinter.swift | 4 +- .../AutogeneratedSchemesProjectMapper.swift | 8 +- ...eratedWorkspaceSchemeWorkspaceMapper.swift | 4 +- .../ExplicitDependencyGraphMapper.swift | 2 +- .../GenerateEntitlementsProjectMapper.swift | 10 +- .../GenerateInfoPlistProjectMapper.swift | 10 +- ...GeneratePrivacyManifestProjectMapper.swift | 10 +- .../Mappers/ModuleMapMapper.swift | 13 +- .../Mappers/ResourcesProjectMapper.swift | 11 +- ...esizedResourceInterfaceProjectMapper.swift | 7 +- ...ctionDisableShowEnvVarsProjectMapper.swift | 2 +- Sources/TuistGraph/Graph/Graph.swift | 6 - Sources/TuistGraph/Models/Project.swift | 64 +- .../Graph/Graph+TestData.swift | 2 - .../Mappers/FocusTargetsGraphMappers.swift | 16 +- .../TreeShakePrunedTargetsGraphMapper.swift | 23 +- .../ProjectEditor/ProjectEditorMapper.swift | 6 +- .../ProjectAutomation+ManifestMapper.swift | 6 +- .../Graph/GraphLoaderTests.swift | 14 +- .../Graph/GraphTraverserTests.swift | 742 +++--------------- .../Graph/Mappers/ProjectMapperTests.swift | 4 +- ...ectsPlatformNarrowerGraphMapperTests.swift | 71 +- ...rphanExternalTargetsGraphMapperTests.swift | 22 +- .../Generator/BuildPhaseGeneratorTests.swift | 94 +-- .../Generator/ConfigGeneratorTests.swift | 30 +- .../Generator/LinkGeneratorTests.swift | 27 +- .../ProjectDescriptorGeneratorTests.swift | 25 +- .../Generator/ProjectFileElementsTests.swift | 5 - .../Generator/ProjectGroupsTests.swift | 28 +- .../SchemeDescriptorsGeneratorTests.swift | 253 +----- .../Generator/TargetGeneratorTests.swift | 10 +- .../WorkspaceDescriptorGeneratorTests.swift | 7 +- .../GraphViz/GraphToGraphVizMapperTests.swift | 52 +- .../Linter/GraphLinterTests.swift | 168 +--- .../Linter/ProjectLinterTests.swift | 13 - .../StaticProductsGraphLinterTests.swift | 185 +---- .../ExplicitDependencyGraphMapperTests.swift | 34 +- .../GenerateInfoPlistProjectMapperTests.swift | 2 +- .../ProjectMappers/ModuleMapMapperTests.swift | 34 - .../ResourcesProjectMapperTests.swift | 30 +- ...DisableShowEnvVarsProjectMapperTests.swift | 34 +- .../TuistGraphTests/Models/ProjectTests.swift | 8 - .../FocusTargetsGraphMappersTests.swift | 77 +- ...eeShakePrunedTargetsGraphMapperTests.swift | 27 +- .../ProjectEditorMapperTests.swift | 74 +- .../Loaders/ManifestModelConverterTests.swift | 4 +- 62 files changed, 515 insertions(+), 1921 deletions(-) diff --git a/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift b/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift index 9847efb46bf..63ec20df1eb 100644 --- a/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift +++ b/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift @@ -10,7 +10,7 @@ public final class SkipUITestsProjectMapper: ProjectMapping { logger.debug("Transforming project \(project.name): Pruning UI tests targets") var project = project - project.targets = project.targets.map { target in + project.targets = project.targets.mapValues { target in var copy = target if copy.product == .uiTests { copy.prune = true diff --git a/Sources/TuistCore/Graph/CircularDependencyLinter.swift b/Sources/TuistCore/Graph/CircularDependencyLinter.swift index 31810672805..fa77bec65c5 100644 --- a/Sources/TuistCore/Graph/CircularDependencyLinter.swift +++ b/Sources/TuistCore/Graph/CircularDependencyLinter.swift @@ -40,7 +40,7 @@ public class CircularDependencyLinter: CircularDependencyLinting { } cache.add(project: project) - for target in project.targets { + for target in project.targets.values.sorted() { try lintTarget( path: path, name: target.name, diff --git a/Sources/TuistCore/Graph/GraphLoader.swift b/Sources/TuistCore/Graph/GraphLoader.swift index e29133ae9c2..168752cba97 100644 --- a/Sources/TuistCore/Graph/GraphLoader.swift +++ b/Sources/TuistCore/Graph/GraphLoader.swift @@ -55,7 +55,6 @@ public final class GraphLoader: GraphLoading { workspace: updatedWorkspace, projects: cache.loadedProjects, packages: cache.packages, - targets: cache.loadedTargets, dependencies: cache.dependencies, dependencyConditions: cache.dependencyConditions ) @@ -76,7 +75,7 @@ public final class GraphLoader: GraphLoading { } cache.add(project: project) - for target in project.targets { + for target in project.targets.values { try loadTarget( path: path, name: target.name, @@ -322,9 +321,7 @@ public final class GraphLoader: GraphLoading { init(projects: [Project]) { let allProjects = Dictionary(uniqueKeysWithValues: projects.map { ($0.path, $0) }) - let allTargets = allProjects.mapValues { - Dictionary(uniqueKeysWithValues: $0.targets.map { ($0.name, $0) }) - } + let allTargets = allProjects.mapValues { $0.targets } self.allProjects = allProjects self.allTargets = allTargets } diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index f2d32a87257..425287ba0df 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -10,7 +10,14 @@ public class GraphTraverser: GraphTraversing { public var path: AbsolutePath { graph.path } public var workspace: Workspace { graph.workspace } public var projects: [AbsolutePath: Project] { graph.projects } - public var targets: [AbsolutePath: [String: Target]] { graph.targets } + + /// It returns the targets of the graph projects. + /// - Returns: A dictionary where the key is the path to the project, and the value are a dictionary where + /// the keys are the name of the targets, and the value the target representation. + public func targets() -> [AbsolutePath: [String: Target]] { + return projects.mapValues { $0.targets } + } + public var dependencies: [GraphDependency: Set] { graph.dependencies } private let graph: Graph @@ -80,7 +87,7 @@ public class GraphTraverser: GraphTraversing { public func targets(product: Product) -> Set { var filteredTargets: Set = Set() - for (path, projectTargets) in targets { + for (path, projectTargets) in targets() { projectTargets.values.forEach { target in guard target.product == product else { return } guard let project = projects[path] else { return } @@ -91,14 +98,14 @@ public class GraphTraverser: GraphTraversing { } public func target(path: AbsolutePath, name: String) -> GraphTarget? { - guard let project = graph.projects[path], let target = graph.targets[path]?[name] else { return nil } + guard let project = graph.projects[path], + let target = project.targets[name] else { return nil } return GraphTarget(path: path, target: target, project: project) } public func targets(at path: AbsolutePath) -> Set { guard let project = graph.projects[path] else { return Set() } - guard let targets = graph.targets[path] else { return [] } - return Set(targets.values.map { GraphTarget(path: path, target: $0, project: project) }) + return Set(project.targets.values.map { GraphTarget(path: path, target: $0, project: project) }) } public func testPlan(name: String) -> TestPlan? { @@ -146,7 +153,7 @@ public class GraphTraverser: GraphTraversing { for target: GraphDependency ) -> [GraphTargetReference] { dependencies.compactMap { dependencyName, dependencyPath -> GraphTargetReference? in - guard let projectDependencies = graph.targets[dependencyPath], + guard let projectDependencies = graph.projects[dependencyPath]?.targets, let dependencyTarget = projectDependencies[dependencyName], let dependencyProject = graph.projects[dependencyPath] else { @@ -159,7 +166,7 @@ public class GraphTraverser: GraphTraversing { } public func resourceBundleDependencies(path: AbsolutePath, name: String) -> Set { - guard let target = graph.targets[path]?[name] else { return [] } + guard let target = graph.projects[path]?.targets[name] else { return [] } guard target.supportsResources else { return [] } let canHostResources: (GraphDependency) -> Bool = { @@ -179,7 +186,7 @@ public class GraphTraverser: GraphTraversing { guard case let GraphDependency.target(name, path) = dependency else { return nil } - guard let target = graph.targets[path]?[name] else { return nil } + guard let target = graph.projects[path]?.targets[name] else { return nil } guard let project = graph.projects[path] else { return nil } return GraphTarget(path: path, target: target, project: project) } @@ -230,7 +237,7 @@ public class GraphTraverser: GraphTraversing { graph.dependencies[.target(name: name, path: path)]? .compactMap { (dependency: GraphDependency) -> GraphDependencyReference? in guard case let GraphDependency.target(dependencyName, dependencyPath) = dependency, - let target = graph.targets[dependencyPath]?[dependencyName], + let target = graph.projects[dependencyPath]?.targets[dependencyName], target.product.isStatic else { return nil @@ -548,8 +555,8 @@ public class GraphTraverser: GraphTraversing { } public func hostTargetFor(path: AbsolutePath, name: String) -> GraphTarget? { - guard let targets = graph.targets[path] else { return nil } guard let project = graph.projects[path] else { return nil } + let targets = project.targets return targets.values.compactMap { target -> GraphTarget? in let dependencies = self.graph.dependencies[.target(name: target.name, path: path), default: Set()] @@ -672,11 +679,9 @@ public class GraphTraverser: GraphTraversing { } public func allExternalTargets() -> Set { - Set(graph.projects.compactMap { path, project in - project.isExternal ? (path, project) : nil - }.flatMap { projectPath, project in - let targets = graph.targets[projectPath, default: [:]].values - return targets.map { GraphTarget(path: projectPath, target: $0, project: project) } + Set(graph.projects.flatMap { path, project -> [GraphTarget] in + guard project.isExternal else { return [] } + return project.targets.values.map { GraphTarget(path: path, target: $0, project: project) } }) } @@ -689,8 +694,8 @@ public class GraphTraverser: GraphTraversing { let allTargetExternalDependendedUponTargets = filterDependencies(from: graphDependenciesWithExternalDependencies) .compactMap { graphDependency -> GraphTarget? in if case let GraphDependency.target(name, path) = graphDependency { - guard let target = graph.targets[path]?[name], - let project = graph.projects[path] + guard let project = graph.projects[path], + let target = project.targets[name] else { return nil } @@ -1178,9 +1183,7 @@ public class GraphTraverser: GraphTraversing { private func allTargets(excludingExternalTargets: Bool) -> Set { Set(projects.flatMap { projectPath, project -> [GraphTarget] in if excludingExternalTargets, project.isExternal { return [] } - - let targets = graph.targets[projectPath, default: [:]] - return targets.values.map { target in + return project.targets.values.map { target in GraphTarget(path: projectPath, target: target, project: project) } }) diff --git a/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift b/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift index 6625c9097fa..d42433db8ac 100644 --- a/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift +++ b/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift @@ -31,12 +31,15 @@ public class TargetProjectMapper: ProjectMapping { } public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { - var results = (targets: [Target](), sideEffects: [SideEffectDescriptor]()) - results = try project.targets.reduce(into: results) { results, target in + var results = (targets: [String: Target](), sideEffects: [SideEffectDescriptor]()) + results = try project.targets.values.reduce(into: results) { results, target in let (updatedTarget, sideEffects) = try mapper.map(target: target) - results.targets.append(updatedTarget) + results.targets[updatedTarget.name] = updatedTarget results.sideEffects.append(contentsOf: sideEffects) } - return (project.with(targets: results.targets), results.sideEffects) + var project = project + project.targets = results.targets + + return (project, results.sideEffects) } } diff --git a/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift index 0158dd16f3a..1e4fb68f872 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift @@ -10,7 +10,7 @@ extension Project { /// - Parameter graph: Dependencies graph. /// - Returns: Sorted targets. public func sortedTargetsForProjectScheme(graph: Graph) -> [Target] { - targets.sorted { first, second -> Bool in + targets.values.sorted { first, second -> Bool in // First criteria: Test bundles at the end if first.product.testsBundle, !second.product.testsBundle { return false diff --git a/Sources/TuistCore/GraphTraverser/GraphTraversing.swift b/Sources/TuistCore/GraphTraverser/GraphTraversing.swift index 3fb3e236be5..78ab89b3f3f 100644 --- a/Sources/TuistCore/GraphTraverser/GraphTraversing.swift +++ b/Sources/TuistCore/GraphTraverser/GraphTraversing.swift @@ -22,7 +22,7 @@ public protocol GraphTraversing { var projects: [AbsolutePath: Project] { get } /// Returns all the targets of the graph. - var targets: [AbsolutePath: [String: Target]] { get } + func targets() -> [AbsolutePath: [String: Target]] /// Dependencies. var dependencies: [GraphDependency: Set] { get } diff --git a/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift b/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift index e77d81ec2d6..5d33013e964 100644 --- a/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift +++ b/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift @@ -65,13 +65,12 @@ final class MockGraphTraverser: GraphTraversing { return stubbedProjects } - var invokedTargetsGetter = false - var invokedTargetsGetterCount = 0 + var invokedTargets = false + var invokedTargetsCount = 0 var stubbedTargets: [AbsolutePath: [String: Target]]! = [:] - - var targets: [AbsolutePath: [String: Target]] { - invokedTargetsGetter = true - invokedTargetsGetterCount += 1 + func targets() -> [TSCBasic.AbsolutePath: [String: TuistGraph.Target]] { + invokedTargets = true + invokedTargetsCount += 1 return stubbedTargets } diff --git a/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift b/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift index dace8c59836..05a707b2a30 100644 --- a/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift +++ b/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift @@ -23,27 +23,16 @@ public struct ExternalProjectsPlatformNarrowerGraphMapper: GraphMapping { // swi var graph = graph let externalTargetSupportedPlatforms = GraphTraverser(graph: graph).externalTargetSupportedPlatforms() - graph.targets = Dictionary(uniqueKeysWithValues: graph.targets.map { projectPath, projectTargets in - let project = graph.projects[projectPath]! - let projectTargets = Dictionary(uniqueKeysWithValues: projectTargets.map { targetName, target in - ( - targetName, - mapTarget( - target: target, - project: project, - externalTargetSupportedPlatforms: externalTargetSupportedPlatforms - ) - ) - }) - return (projectPath, projectTargets) - }) graph.projects = Dictionary(uniqueKeysWithValues: graph.projects.map { projectPath, project in var project = project - project.targets = project.targets.map { mapTarget( - target: $0, - project: project, - externalTargetSupportedPlatforms: externalTargetSupportedPlatforms - ) } + project.targets = Dictionary(uniqueKeysWithValues: project.targets.map { _, target in + let mappedTarget = mapTarget( + target: target, + project: project, + externalTargetSupportedPlatforms: externalTargetSupportedPlatforms + ) + return (mappedTarget.name, mappedTarget) + }) return (projectPath, project) }) diff --git a/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift b/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift index 89a098ff0dd..c965d48d155 100644 --- a/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift +++ b/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift @@ -17,19 +17,19 @@ public struct PruneOrphanExternalTargetsGraphMapper: GraphMapping { let orphanExternalTargets = graphTraverser.allOrphanExternalTargets() var graph = graph - graph.targets = Dictionary(uniqueKeysWithValues: graph.targets.map { projectPath, targets in - let targets = Dictionary(uniqueKeysWithValues: targets.compactMap { targetName, target -> (String, Target)? in + + graph.projects = Dictionary(uniqueKeysWithValues: graph.projects.map { projectPath, project in + var project = project + project.targets = Dictionary(uniqueKeysWithValues: project.targets.compactMap { _, target -> (String, Target)? in let project = graph.projects[projectPath]! let graphTarget = GraphTarget(path: projectPath, target: target, project: project) var target = target if orphanExternalTargets.contains(graphTarget) || target.destinations.isEmpty { target.prune = true - return (targetName, target) - } else { - return (targetName, target) } + return (target.name, target) }) - return (projectPath, targets) + return (projectPath, project) }) return (graph, []) diff --git a/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift b/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift index c1fd7dd9275..8ddd7377116 100644 --- a/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift +++ b/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift @@ -242,7 +242,7 @@ final class InfoPlistContentProvider: InfoPlistContentProviding { } private func hostTarget(for target: Target, in project: Project) -> Target? { - project.targets.first { + project.targets.values.first { $0.dependencies.contains(where: { dependency in if case let .target(name, _) = dependency, name == target.name { return true diff --git a/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift b/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift index 358f22fadac..c7f953d0b85 100644 --- a/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift +++ b/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift @@ -20,13 +20,13 @@ protocol KnownAssetTagsFetching: AnyObject { final class KnownAssetTagsFetcher: KnownAssetTagsFetching { func fetch(project: Project) throws -> [String] { - var tags = project.targets.map { $0.resources.resources.map(\.tags).flatMap { $0 } }.flatMap { $0 } + var tags = project.targets.values.map { $0.resources.resources.map(\.tags).flatMap { $0 } }.flatMap { $0 } - let initialInstallTags = project.targets.compactMap { + let initialInstallTags = project.targets.values.compactMap { $0.onDemandResourcesTags?.initialInstall?.compactMap { $0 } }.flatMap { $0 } - let prefetchOrderTags = project.targets.compactMap { + let prefetchOrderTags = project.targets.values.compactMap { $0.onDemandResourcesTags?.prefetchOrder?.compactMap { $0 } }.flatMap { $0 } @@ -35,7 +35,7 @@ final class KnownAssetTagsFetcher: KnownAssetTagsFetching { var assetContentsPaths: Set = [] let decoder = JSONDecoder() - for target in project.targets { + for target in project.targets.values { let assetCatalogs = target.resources.resources.filter { $0.path.extension == "xcassets" } for assetCatalog in assetCatalogs { guard let children = try? assetCatalog.path.path.recursiveChildren() else { continue } diff --git a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift index 8fa3ea47e9f..fe96f66624a 100644 --- a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift @@ -204,7 +204,7 @@ final class ProjectDescriptorGenerator: ProjectDescriptorGenerating { graphTraverser: GraphTraversing ) throws -> [String: PBXNativeTarget] { var nativeTargets: [String: PBXNativeTarget] = [:] - for target in project.targets { + for target in project.targets.values.sorted() { let nativeTarget = try targetGenerator.generateTarget( target: target, project: project, @@ -221,7 +221,7 @@ final class ProjectDescriptorGenerator: ProjectDescriptorGenerating { /// Target dependencies try targetGenerator.generateTargetDependencies( path: project.path, - targets: project.targets, + targets: Array(project.targets.values), nativeTargets: nativeTargets, graphTraverser: graphTraverser ) diff --git a/Sources/TuistGenerator/Generator/ProjectFileElements.swift b/Sources/TuistGenerator/Generator/ProjectFileElements.swift index e2ac660c71c..4d3818ee32b 100644 --- a/Sources/TuistGenerator/Generator/ProjectFileElements.swift +++ b/Sources/TuistGenerator/Generator/ProjectFileElements.swift @@ -60,7 +60,7 @@ class ProjectFileElements { ) throws { var files = Set() - for target in project.targets { + for target in project.targets.values.sorted() { try files.formUnion(targetFiles(target: target)) } let projectFileElements = projectFiles(project: project) @@ -79,7 +79,7 @@ class ProjectFileElements { ) // Products - let directProducts = project.targets.map { + let directProducts = project.targets.values.map { GraphDependencyReference.product(target: $0.name, productName: $0.productNameWithExtension, condition: nil) } diff --git a/Sources/TuistGenerator/Generator/ProjectGroups.swift b/Sources/TuistGenerator/Generator/ProjectGroups.swift index e0992a7dc6f..d6d8792207a 100644 --- a/Sources/TuistGenerator/Generator/ProjectGroups.swift +++ b/Sources/TuistGenerator/Generator/ProjectGroups.swift @@ -143,7 +143,7 @@ class ProjectGroups { } private static func extractProjectGroupNames(from project: Project) -> [String] { - let groups = [project.filesGroup] + project.targets.map(\.filesGroup) + let groups = [project.filesGroup] + project.targets.values.map(\.filesGroup) let groupNames: [String] = groups.compactMap { switch $0 { case let .group(name: groupName): diff --git a/Sources/TuistGenerator/Linter/ProjectLinter.swift b/Sources/TuistGenerator/Linter/ProjectLinter.swift index ad3cca9f9df..ab061abe2b7 100644 --- a/Sources/TuistGenerator/Linter/ProjectLinter.swift +++ b/Sources/TuistGenerator/Linter/ProjectLinter.swift @@ -49,24 +49,7 @@ class ProjectLinter: ProjectLinting { private func lintTargets(project: Project) -> [LintingIssue] { var issues: [LintingIssue] = [] - issues.append(contentsOf: project.targets.flatMap(targetLinter.lint)) - issues.append(contentsOf: lintNotDuplicatedTargets(project: project)) - return issues - } - - private func lintNotDuplicatedTargets(project: Project) -> [LintingIssue] { - var issues: [LintingIssue] = [] - let duplicatedTargets = project.targets.map(\.name) - .reduce(into: [String: Int]()) { $0[$1] = ($0[$1] ?? 0) + 1 } - .filter { $0.value > 1 } - .keys - if !duplicatedTargets.isEmpty { - let issue = LintingIssue( - reason: "Targets \(duplicatedTargets.joined(separator: ", ")) from project at \(project.path.pathString) have duplicates.", - severity: .error - ) - issues.append(issue) - } + issues.append(contentsOf: project.targets.values.flatMap(targetLinter.lint)) return issues } } diff --git a/Sources/TuistGenerator/Linter/SchemeLinter.swift b/Sources/TuistGenerator/Linter/SchemeLinter.swift index d7acef39cc0..8d7b8e5200e 100644 --- a/Sources/TuistGenerator/Linter/SchemeLinter.swift +++ b/Sources/TuistGenerator/Linter/SchemeLinter.swift @@ -11,8 +11,8 @@ class SchemeLinter: SchemeLinting { func lint(project: Project) -> [LintingIssue] { var issues = [LintingIssue]() issues.append(contentsOf: lintReferencedBuildConfigurations(schemes: project.schemes, settings: project.settings)) - issues.append(contentsOf: lintCodeCoverageTargets(schemes: project.schemes, targets: project.targets)) - issues.append(contentsOf: lintExpandVariableTarget(schemes: project.schemes, targets: project.targets)) + issues.append(contentsOf: lintCodeCoverageTargets(schemes: project.schemes, targets: Array(project.targets.values))) + issues.append(contentsOf: lintExpandVariableTarget(schemes: project.schemes, targets: Array(project.targets.values))) issues.append(contentsOf: projectSchemeCantReferenceRemoteTargets(schemes: project.schemes, project: project)) return issues } diff --git a/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift b/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift index e7f717e1787..ddde8627d9b 100644 --- a/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift @@ -22,7 +22,7 @@ public final class AutogeneratedSchemesProjectMapper: ProjectMapping { // swiftl var buildTargets: Set = [] var testTargets: Set = [] var runTargets: Set = [] - for target in project.targets { + for target in project.targets.values.sorted() { switch target.product { case .app, .appClip, .commandLineTool, .watch2App, .xpc: runTargets.insert(target) @@ -108,7 +108,9 @@ public final class AutogeneratedSchemesProjectMapper: ProjectMapping { // swiftl } let filteredAutogeneratedSchemes = autogeneratedSchemes.filter { !userDefinedSchemeNames.contains($0.name) } - return (project.with(schemes: (userDefinedSchemes + filteredAutogeneratedSchemes).sorted { $0.name < $1.name }), []) + var project = project + project.schemes = (userDefinedSchemes + filteredAutogeneratedSchemes).sorted { $0.name < $1.name } + return (project, []) } // MARK: - Private @@ -317,6 +319,7 @@ public final class AutogeneratedSchemesProjectMapper: ProjectMapping { // swiftl private func hostAppTargetReference(for target: Target, project: Project) -> Target? { project.targets + .values .filter { $0.product.canHostTests() && $0.dependencies.contains(where: { dependency in if case let .target(name, _) = dependency, name == target.name { return true @@ -330,6 +333,7 @@ public final class AutogeneratedSchemesProjectMapper: ProjectMapping { // swiftl private func hostWatchAppTargetReference(for target: Target, project: Project) -> Target? { project.targets + .values .filter { $0.product == .watch2App && $0.dependencies.contains(where: { dependency in if case let .target(name, _) = dependency, name == target.name { return true diff --git a/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift b/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift index f2568e67eaa..6bb0c83e775 100644 --- a/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift +++ b/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift @@ -23,7 +23,7 @@ public final class AutogeneratedWorkspaceSchemeWorkspaceMapper: WorkspaceMapping let platforms = Set( workspace.projects .flatMap { - $0.targets.flatMap(\.supportedPlatforms) + $0.targets.values.flatMap(\.supportedPlatforms) } ) @@ -55,9 +55,11 @@ public final class AutogeneratedWorkspaceSchemeWorkspaceMapper: WorkspaceMapping var (targets, testableTargets): ([TargetReference], [TestableTarget]) = workspace.projects .reduce(([], [])) { result, project in let targets = project.targets + .values .filter { !$0.supportedPlatforms.isDisjoint(with: platforms) } .map { TargetReference(projectPath: project.path, name: $0.name) } let testableTargets = project.targets + .values .filter { !$0.supportedPlatforms.isDisjoint(with: platforms) } .filter(\.product.testsBundle) .map { TargetReference(projectPath: project.path, name: $0.name) } diff --git a/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift b/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift index 01291ef3ddc..ff28c933b54 100644 --- a/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift +++ b/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift @@ -23,7 +23,7 @@ public struct ExplicitDependencyGraphMapper: GraphMapping { graph.projects = Dictionary(uniqueKeysWithValues: graph.projects.map { projectPath, project in var project = project - project.targets = project.targets.map { target in + project.targets = project.targets.mapValues { target in let graphTarget = GraphTarget(path: projectPath, target: target, project: project) let projectDebugConfigurations = project.settings.configurations.keys .filter { $0.variant == .debug } diff --git a/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift b/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift index f0397f84add..7b60e899086 100644 --- a/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift @@ -23,14 +23,16 @@ public final class GenerateEntitlementsProjectMapper: ProjectMapping { public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { logger.debug("Transforming project \(project.name): Synthesizing entitlement files'") - let results = try project.targets - .reduce(into: (targets: [Target](), sideEffects: [SideEffectDescriptor]())) { results, target in + let results = try project.targets.values + .reduce(into: (targets: [String: Target](), sideEffects: [SideEffectDescriptor]())) { results, target in let (updatedTarget, sideEffects) = try map(target: target, project: project) - results.targets.append(updatedTarget) + results.targets[updatedTarget.name] = updatedTarget results.sideEffects.append(contentsOf: sideEffects) } + var project = project + project.targets = results.targets - return (project.with(targets: results.targets), results.sideEffects) + return (project, results.sideEffects) } // MARK: - Private diff --git a/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift b/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift index a23b61f25e9..f6e368066e8 100644 --- a/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift @@ -37,14 +37,16 @@ public final class GenerateInfoPlistProjectMapper: ProjectMapping { public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { logger.debug("Transforming project \(project.name): Synthesizing Info.plist") - let results = try project.targets - .reduce(into: (targets: [Target](), sideEffects: [SideEffectDescriptor]())) { results, target in + let results = try project.targets.values + .reduce(into: (targets: [String: Target](), sideEffects: [SideEffectDescriptor]())) { results, target in let (updatedTarget, sideEffects) = try map(target: target, project: project) - results.targets.append(updatedTarget) + results.targets[updatedTarget.name] = updatedTarget results.sideEffects.append(contentsOf: sideEffects) } + var project = project + project.targets = results.targets - return (project.with(targets: results.targets), results.sideEffects) + return (project, results.sideEffects) } // MARK: - Private diff --git a/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift b/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift index 5c2832e9e6a..fa2350c86ed 100644 --- a/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift @@ -14,14 +14,16 @@ public final class GeneratePrivacyManifestProjectMapper: ProjectMapping { public func map(project: Project) throws -> (Project, [SideEffectDescriptor]) { logger.debug("Transforming project \(project.name): Synthesizing privacy manifest files'") - let results = try project.targets - .reduce(into: (targets: [Target](), sideEffects: [SideEffectDescriptor]())) { results, target in + let results = try project.targets.values + .reduce(into: (targets: [String: Target](), sideEffects: [SideEffectDescriptor]())) { results, target in let (updatedTarget, sideEffects) = try map(target: target, project: project) - results.targets.append(updatedTarget) + results.targets[updatedTarget.name] = updatedTarget results.sideEffects.append(contentsOf: sideEffects) } + var project = project + project.targets = results.targets - return (project.with(targets: results.targets), results.sideEffects) + return (project, results.sideEffects) } // MARK: - Private diff --git a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift index 436be1f472d..3a6cbbb0e09 100644 --- a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift +++ b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift @@ -46,12 +46,13 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ graph.projects = Dictionary(uniqueKeysWithValues: graph.projects.map { projectPath, project in var project = project - project.targets = project.targets.map { target in + project.targets = Dictionary(uniqueKeysWithValues: project.targets.map { targetName, target in var target = target let targetID = TargetID(projectPath: project.path, targetName: target.name) var mappedSettingsDictionary = target.settings?.base ?? [:] let hasModuleMap = mappedSettingsDictionary[Self.modulemapFileSetting] != nil - guard hasModuleMap || !(targetToDependenciesMetadata[targetID]?.isEmpty ?? true) else { return target } + guard hasModuleMap || !(targetToDependenciesMetadata[targetID]?.isEmpty ?? true) + else { return (targetName, target) } if hasModuleMap { mappedSettingsDictionary[Self.modulemapFileSetting] = nil @@ -88,10 +89,8 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ ) target.settings = targetSettings.with(base: mappedSettingsDictionary) - graph.targets[project.path]?[target.name] = target - - return target - } + return (target.name, target) + }) return (projectPath, project) }) @@ -105,7 +104,7 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ var targetsByName = [String: Target]() for project in workspace.projects { projectsByPath[project.path] = project - for target in project.targets { + for target in project.targets.values { targetsByName[target.name] = target } } diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 4b3a2e5f74d..17515e69727 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -18,15 +18,18 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this logger.debug("Transforming project \(project.name): Generating bundles for libraries'") var sideEffects: [SideEffectDescriptor] = [] - var targets: [Target] = [] + var targets: [String: Target] = [:] - for target in project.targets { + for target in project.targets.values { let (mappedTargets, targetSideEffects) = try mapTarget(target, project: project) - targets.append(contentsOf: mappedTargets) + mappedTargets.forEach { targets[$0.name] = $0 } sideEffects.append(contentsOf: targetSideEffects) } - return (project.with(targets: targets), sideEffects) + var project = project + project.targets = targets + + return (project, sideEffects) } // swiftlint:disable:next function_body_length diff --git a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift index 3f7ae196643..2f3ca031664 100644 --- a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift @@ -52,13 +52,14 @@ public final class SynthesizedResourceInterfaceProjectMapper: ProjectMapping { / } logger.debug("Transforming project \(project.name): Synthesizing resource accessors") - let mappings = try project.targets + let mappings = try project.targets.values .map { try mapTarget($0, project: project) } let targets: [Target] = mappings.map(\.0) let sideEffects: [SideEffectDescriptor] = mappings.map(\.1).flatMap { $0 } - - return (project.with(targets: targets), sideEffects) + var project = project + project.targets = Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) }) + return (project, sideEffects) } // MARK: - Helpers diff --git a/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift b/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift index bef806223c3..b1dfbdac6e8 100644 --- a/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift @@ -13,7 +13,7 @@ public final class TargetActionDisableShowEnvVarsProjectMapper: ProjectMapping { ) var project = project - project.targets = project.targets.map { target in + project.targets = project.targets.mapValues { target in var mappedTarget = target mappedTarget.scripts = mappedTarget.scripts.map { var script = $0 diff --git a/Sources/TuistGraph/Graph/Graph.swift b/Sources/TuistGraph/Graph/Graph.swift index 6799d08f636..a14981d639d 100644 --- a/Sources/TuistGraph/Graph/Graph.swift +++ b/Sources/TuistGraph/Graph/Graph.swift @@ -20,10 +20,6 @@ public struct Graph: Equatable, Codable { /// and the values are dictionaries where the key is the reference to the package, and the values are the packages. public var packages: [AbsolutePath: [String: Package]] - /// A dictionary where the keys are paths to the directories where the projects that contain targets are defined, - /// and the values are dictionaries where the key is the name of the target, and the values are the targets. - public var targets: [AbsolutePath: [String: Target]] - /// A dictionary that contains the one-to-many dependencies that represent the graph. public var dependencies: [GraphDependency: Set] @@ -36,7 +32,6 @@ public struct Graph: Equatable, Codable { workspace: Workspace, projects: [AbsolutePath: Project], packages: [AbsolutePath: [String: Package]], - targets: [AbsolutePath: [String: Target]], dependencies: [GraphDependency: Set], dependencyConditions: [GraphEdge: PlatformCondition] ) { @@ -45,7 +40,6 @@ public struct Graph: Equatable, Codable { self.workspace = workspace self.projects = projects self.packages = packages - self.targets = targets self.dependencies = dependencies self.dependencyConditions = dependencyConditions } diff --git a/Sources/TuistGraph/Models/Project.swift b/Sources/TuistGraph/Models/Project.swift index eff2f35f510..078b184b2a3 100644 --- a/Sources/TuistGraph/Models/Project.swift +++ b/Sources/TuistGraph/Models/Project.swift @@ -18,19 +18,19 @@ public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebug public var name: String /// Organization name. - public let organizationName: String? + public var organizationName: String? /// Default known regions - public let defaultKnownRegions: [String]? + public var defaultKnownRegions: [String]? /// Development region code e.g. `en`. - public let developmentRegion: String? + public var developmentRegion: String? /// Additional project options. public var options: Options /// Project targets. - public var targets: [Target] + public var targets: [String: Target] /// Project swift packages. public var packages: [Package] @@ -51,13 +51,13 @@ public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebug public var ideTemplateMacros: IDETemplateMacros? /// `ResourceSynthesizers` that will be applied on individual target's resources - public let resourceSynthesizers: [ResourceSynthesizer] + public var resourceSynthesizers: [ResourceSynthesizer] /// The version in which a check happened related to recommended settings after updating Xcode. public var lastUpgradeCheck: Version? /// Indicates whether the project is imported through `Package.swift`. - public let isExternal: Bool + public var isExternal: Bool // MARK: - Init @@ -111,7 +111,7 @@ public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebug self.defaultKnownRegions = defaultKnownRegions self.developmentRegion = developmentRegion self.options = options - self.targets = targets + self.targets = Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) }) self.packages = packages self.schemes = schemes self.settings = settings @@ -143,56 +143,6 @@ public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebug // MARK: - Public - /// Returns a copy of the project with the given targets set. - /// - Parameter targets: Targets to be set to the copy. - public func with(targets: [Target]) -> Project { - Project( - path: path, - sourceRootPath: sourceRootPath, - xcodeProjPath: xcodeProjPath, - name: name, - organizationName: organizationName, - defaultKnownRegions: defaultKnownRegions, - developmentRegion: developmentRegion, - options: options, - settings: settings, - filesGroup: filesGroup, - targets: targets, - packages: packages, - schemes: schemes, - ideTemplateMacros: ideTemplateMacros, - additionalFiles: additionalFiles, - resourceSynthesizers: resourceSynthesizers, - lastUpgradeCheck: lastUpgradeCheck, - isExternal: isExternal - ) - } - - /// Returns a copy of the project with the given schemes set. - /// - Parameter schemes: Schemes to be set to the copy. - public func with(schemes: [Scheme]) -> Project { - Project( - path: path, - sourceRootPath: sourceRootPath, - xcodeProjPath: xcodeProjPath, - name: name, - organizationName: organizationName, - defaultKnownRegions: defaultKnownRegions, - developmentRegion: developmentRegion, - options: options, - settings: settings, - filesGroup: filesGroup, - targets: targets, - packages: packages, - schemes: schemes, - ideTemplateMacros: ideTemplateMacros, - additionalFiles: additionalFiles, - resourceSynthesizers: resourceSynthesizers, - lastUpgradeCheck: lastUpgradeCheck, - isExternal: isExternal - ) - } - /// Returns the name of the default configuration. public var defaultDebugBuildConfigurationName: String { let debugConfiguration = settings.defaultDebugBuildConfiguration() diff --git a/Sources/TuistGraphTesting/Graph/Graph+TestData.swift b/Sources/TuistGraphTesting/Graph/Graph+TestData.swift index 4733127da21..e4ada3bffa7 100644 --- a/Sources/TuistGraphTesting/Graph/Graph+TestData.swift +++ b/Sources/TuistGraphTesting/Graph/Graph+TestData.swift @@ -9,7 +9,6 @@ extension Graph { workspace: Workspace = .test(), projects: [AbsolutePath: Project] = [:], packages: [AbsolutePath: [String: Package]] = [:], - targets: [AbsolutePath: [String: Target]] = [:], dependencies: [GraphDependency: Set] = [:], dependencyConditions: [GraphEdge: PlatformCondition] = [:] ) -> Graph { @@ -19,7 +18,6 @@ extension Graph { workspace: workspace, projects: projects, packages: packages, - targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) diff --git a/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift b/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift index 15f75e3dcbe..a2f788a211e 100644 --- a/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift +++ b/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift @@ -61,11 +61,19 @@ public final class FocusTargetsGraphMappers: GraphMapping { successors: { Array(graphTraverser.directTargetDependencies(path: $0.path, name: $0.target.name)).map(\.graphTarget) } )) - for graphTarget in graphTraverser.allTargets() where !filteredTargets.contains(graphTarget) { - var target = graphTarget.target - target.prune = true - graph.targets[graphTarget.path]?[target.name] = target + graph.projects = graph.projects.mapValues { project in + var project = project + project.targets = project.targets.mapValues { target in + var target = target + if !filteredTargets.contains(GraphTarget(path: project.path, target: target, project: project)) { + target.prune = true + } + return target + } + + return project } + return (graph, []) } } diff --git a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift index 969f030bd76..06c1a7fb7f7 100644 --- a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift +++ b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift @@ -8,20 +8,19 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { public func map(graph: Graph) throws -> (Graph, [SideEffectDescriptor]) { logger.debug("Transforming graph \(graph.name): Tree-shaking nodes") - let sourceTargets: Set = Set(graph.targets.flatMap { projectPath, targets -> [TargetReference] in - guard graph.projects[projectPath] != nil else { return [] } - return targets.compactMap { _, target -> TargetReference? in + let sourceTargets: Set = Set(graph.projects.flatMap { projectPath, project -> [TargetReference] in + return project.targets.compactMap { _, target -> TargetReference? in if target.prune { return nil } return TargetReference(projectPath: projectPath, name: target.name) } }) // If the number of source targets matches the number of targets in the graph there's nothing to be pruned. - if sourceTargets.count == graph.targets.flatMap(\.value.values).count { return (graph, []) } + if sourceTargets.count == graph.projects.values.flatMap(\.targets.values).count { return (graph, []) } let projects = graph.projects.reduce(into: [AbsolutePath: Project]()) { acc, next in let targets = self.treeShake( - targets: next.value.targets, + targets: Array(next.value.targets.values), path: next.key, graph: graph, sourceTargets: sourceTargets @@ -33,7 +32,10 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { schemes: next.value.schemes, sourceTargets: sourceTargets ) - acc[next.key] = next.value.with(targets: targets).with(schemes: schemes) + var project = next.value + project.schemes = schemes + project.targets = Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) }) + acc[next.key] = project } } @@ -46,13 +48,6 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { var graph = graph graph.workspace = workspace graph.projects = projects - graph.targets = sourceTargets.reduce(into: [AbsolutePath: [String: Target]]()) { acc, targetReference in - var targets = acc[targetReference.projectPath, default: [:]] - if let target = graph.targets[targetReference.projectPath, default: [:]][targetReference.name] { - targets[target.name] = target - } - acc[targetReference.projectPath] = targets - } return (graph, []) } @@ -72,7 +67,7 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { sourceTargets: Set ) -> [Target] { targets.compactMap { target -> Target? in - guard let target = graph.targets[path, default: [:]][target.name] else { return nil } + guard let target = graph.projects[path]?.targets[target.name] else { return nil } let targetReference = TargetReference(projectPath: path, name: target.name) guard sourceTargets.contains(targetReference) else { return nil } return target diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift index 6a1355c48c6..7f2e9c95b4a 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift @@ -103,12 +103,11 @@ final class ProjectEditorMapper: ProjectEditorMapping { let graphTargets = projects .lazy .map { ($0.path, $0.targets) } - .map { path, targets in (path, Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) })) } let graphDependencies = projects .lazy .flatMap { project -> [(GraphDependency, Set)] in - let graphDependencies = project.targets.map(\.dependencies).lazy.map { dependencies in + let graphDependencies = project.targets.values.map(\.dependencies).lazy.map { dependencies in dependencies.lazy.compactMap { dependency -> GraphDependency? in switch dependency { case let .target(name, _): @@ -123,7 +122,7 @@ final class ProjectEditorMapper: ProjectEditorMapping { } } - return zip(project.targets, graphDependencies).map { target, dependencies in + return zip(project.targets.values, graphDependencies).map { target, dependencies in (GraphDependency.target(name: target.name, path: project.path), Set(dependencies)) } } @@ -134,7 +133,6 @@ final class ProjectEditorMapper: ProjectEditorMapping { workspace: workspace, projects: graphProjects, packages: [:], - targets: Dictionary(uniqueKeysWithValues: graphTargets), dependencies: Dictionary(uniqueKeysWithValues: graphDependencies), dependencyConditions: [:] ) diff --git a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift index 8215a0d48ed..b61600cbbac 100644 --- a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift +++ b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift @@ -37,14 +37,16 @@ extension ProjectAutomation.Project { let packages = project.packages .reduce(into: [ProjectAutomation.Package]()) { $0.append(ProjectAutomation.Package.from($1)) } let schemes = project.schemes.reduce(into: [ProjectAutomation.Scheme]()) { $0.append(ProjectAutomation.Scheme.from($1)) } - let targets = project.targets.reduce(into: [ProjectAutomation.Target]()) { $0.append(ProjectAutomation.Target.from($1)) } + let targets = project.targets.mapValues { target in + ProjectAutomation.Target.from(target) + } return ProjectAutomation.Project( name: project.name, path: project.path.pathString, isExternal: project.isExternal, packages: packages, - targets: targets, + targets: Array(targets.values), schemes: schemes ) } diff --git a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift index a3bbe0fc400..3b1651e1e3c 100644 --- a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift @@ -45,7 +45,7 @@ final class GraphLoaderTests: TuistUnitTestCase { XCTAssertEqual(graph.projects, [ "/A": projectA, ]) - XCTAssertTrue(graph.targets.isEmpty) + XCTAssertTrue(graph.projects.values.flatMap(\.targets).isEmpty) XCTAssertTrue(graph.dependencies.isEmpty) } @@ -71,7 +71,7 @@ final class GraphLoaderTests: TuistUnitTestCase { "/A": projectA, "/B": projectB, ]) - XCTAssertTrue(graph.targets.isEmpty) + XCTAssertTrue(graph.projects.values.flatMap(\.targets).isEmpty) XCTAssertTrue(graph.dependencies.isEmpty) } @@ -99,10 +99,6 @@ final class GraphLoaderTests: TuistUnitTestCase { "/A": projectA, "/B": projectB, ]) - XCTAssertEqual(graph.targets, [ - "/A": ["A": targetA], - "/B": ["B": targetB], - ]) XCTAssertEqual(graph.dependencies, [ .target(name: "A", path: "/A"): Set([ .target(name: "B", path: "/B"), @@ -132,7 +128,7 @@ final class GraphLoaderTests: TuistUnitTestCase { XCTAssertEqual(graph.projects, [ "/A": projectA, ]) - XCTAssertTrue(graph.targets.isEmpty) + XCTAssertTrue(graph.projects.values.flatMap(\.targets).isEmpty) XCTAssertTrue(graph.dependencies.isEmpty) } @@ -159,10 +155,6 @@ final class GraphLoaderTests: TuistUnitTestCase { "/A": projectA, "/B": projectB, ]) - XCTAssertEqual(graph.targets, [ - "/A": ["A": targetA], - "/B": ["B": targetB], - ]) XCTAssertEqual(graph.dependencies, [ .target(name: "A", path: "/A"): Set([ .target(name: "B", path: "/B"), diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index d43524857eb..57948670a0b 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -11,22 +11,18 @@ import XCTest final class GraphTraverserTests: TuistUnitTestCase { func test_dependsOnXCTest_when_is_framework() { // Given - let project = Project.test() + let target = Target.test( + name: "Framework", + product: .framework + ) + let project = Project.test(targets: [target]) let frameworkTarget = GraphTarget.test( path: project.path, - target: Target.test( - name: "Framework", - product: .framework - ) + target: target ) let graph = Graph.test( projects: [ project.path: project, - ], - targets: [ - project.path: [ - frameworkTarget.target.name: frameworkTarget.target, - ], ] ) let subject = GraphTraverser(graph: graph) @@ -40,22 +36,18 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_dependsOnXCTest_when_is_tests_bundle() { // Given - let project = Project.test() + let target = Target.test( + name: "UnitTests", + product: .unitTests + ) + let project = Project.test(targets: [target]) let unitTestsTarget = GraphTarget.test( path: project.path, - target: Target.test( - name: "UnitTests", - product: .unitTests - ) + target: target ) let graph = Graph.test( projects: [ project.path: project, - ], - targets: [ - project.path: [ - unitTestsTarget.target.name: unitTestsTarget.target, - ], ] ) let subject = GraphTraverser(graph: graph) @@ -69,23 +61,19 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_dependsOnXCTest_when_direct_dependency_is_XCTest_SDK() { // Given - let project = Project.test() + let target = Target.test( + name: "Framework", + product: .framework + ) + let project = Project.test(targets: [target]) let frameworkTarget = GraphTarget.test( path: project.path, - target: Target.test( - name: "Framework", - product: .framework - ) + target: target ) let graph = Graph.test( projects: [ project.path: project, ], - targets: [ - project.path: [ - frameworkTarget.target.name: frameworkTarget.target, - ], - ], dependencies: [ .target(name: frameworkTarget.target.name, path: project.path): [ .testSDK(name: "XCTest.framework"), @@ -103,25 +91,21 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_dependsOnXCTest_when_settings_enables_search_paths() { // Given - let project = Project.test() + let target = Target.test( + name: "Framework", + product: .framework, + settings: .test(base: [ + "ENABLE_TESTING_SEARCH_PATHS": "YES", + ]) + ) + let project = Project.test(targets: [target]) let frameworkTarget = GraphTarget.test( path: project.path, - target: Target.test( - name: "Framework", - product: .framework, - settings: .test(base: [ - "ENABLE_TESTING_SEARCH_PATHS": "YES", - ]) - ) + target: target ) let graph = Graph.test( projects: [ project.path: project, - ], - targets: [ - project.path: [ - frameworkTarget.target.name: frameworkTarget.target, - ], ] ) let subject = GraphTraverser(graph: graph) @@ -138,15 +122,12 @@ final class GraphTraverserTests: TuistUnitTestCase { let path = AbsolutePath.root let app = Target.test(name: "App", product: .app) let framework = Target.test(name: "Framework", product: .framework) - let project = Project.test(path: path) + let project = Project.test(path: path, targets: [app, framework]) // Given: Value Graph let graph = Graph.test( path: path, - projects: [path: project], - targets: [ - "/": ["App": app, "Framework": framework], - ] + projects: [path: project] ) let subject = GraphTraverser(graph: graph) @@ -161,16 +142,13 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let path = AbsolutePath.root let app = Target.test(name: "App", product: .app) - let project = Project.test(path: path) let framework = Target.test(name: "Framework", product: .framework) + let project = Project.test(path: path, targets: [app, framework]) // When: Value Graph let graph = Graph.test( path: path, - projects: [path: project], - targets: [ - path: ["App": app, "Framework": framework], - ] + projects: [path: project] ) let subject = GraphTraverser(graph: graph) @@ -183,17 +161,10 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_directStaticDependencies() { // Given - let project = Project.test() let path = AbsolutePath.root let framework = Target.test(name: "Framework", product: .framework) let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary) - let targets: [AbsolutePath: [String: Target]] = [ - path: [ - framework.name: framework, - staticLibrary.name: staticLibrary, - ], - ] - + let project = Project.test(targets: [framework, staticLibrary]) let dependencies: [GraphDependency: Set] = [ .target(name: framework.name, path: path): Set([.target(name: staticLibrary.name, path: path)]), ] @@ -202,7 +173,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: targets, dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -220,24 +190,19 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_directLocalTargetDependencies() { // Given // A -> B -> C - let project = Project.test() let a = Target.test(name: "A") let b = Target.test(name: "B") let c = Target.test(name: "C") + let project = Project.test(targets: [a, b, c]) + let dependencies: [GraphDependency: Set] = [ .target(name: a.name, path: project.path): Set([.target(name: b.name, path: project.path)]), .target(name: b.name, path: project.path): Set([.target(name: c.name, path: project.path)]), ] - let targets: [AbsolutePath: [String: Target]] = [project.path: [ - a.name: a, - b.name: b, - c.name: c, - ]] // Given: Value Graph let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: targets, dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -254,31 +219,21 @@ final class GraphTraverserTests: TuistUnitTestCase { // Project A: A1 -> A2 // -> (Project B) B1 // Project B: B1 - let projectA = Project.test(path: "/ProjectA", name: "ProjectA") - let projectB = Project.test(path: "/ProjectB", name: "ProjectB") let a1 = Target.test(name: "A1") let a2 = Target.test(name: "A2") let b1 = Target.test(name: "B1") + let projectA = Project.test(path: "/ProjectA", name: "ProjectA", targets: [a1, a2]) + let projectB = Project.test(path: "/ProjectB", name: "ProjectB", targets: [b1]) let dependencies: [GraphDependency: Set] = [ .target(name: a1.name, path: projectA.path): Set([ .target(name: a2.name, path: projectA.path), .target(name: b1.name, path: projectB.path), ]), ] - let targets: [AbsolutePath: [String: Target]] = [ - projectA.path: [ - a1.name: a1, - a2.name: a2, - ], - projectB.path: [ - b1.name: b1, - ], - ] // Given: Value Graph let graph = Graph.test( path: projectA.path, projects: [projectA.path: projectA, projectB.path: projectB], - targets: targets, dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -295,33 +250,23 @@ final class GraphTraverserTests: TuistUnitTestCase { // Project A: A1 -> A2 // -> (Project B) B1 // Project B: B1 - let projectA = Project.test(path: "/ProjectA", name: "ProjectA") - let projectB = Project.test(path: "/ProjectB", name: "ProjectB") let a1 = Target.test(name: "A1") let a2 = Target.test(name: "A2") let b1 = Target.test( name: "B1" ) + let projectA = Project.test(path: "/ProjectA", name: "ProjectA", targets: [a1, a2]) + let projectB = Project.test(path: "/ProjectB", name: "ProjectB", targets: [b1]) let dependencies: [GraphDependency: Set] = [ .target(name: a1.name, path: projectA.path): Set([ .target(name: a2.name, path: projectA.path), .target(name: b1.name, path: projectB.path), ]), ] - let targets: [AbsolutePath: [String: Target]] = [ - projectA.path: [ - a1.name: a1, - a2.name: a2, - ], - projectB.path: [ - b1.name: b1, - ], - ] // Given: Value Graph let graph = Graph.test( path: projectA.path, projects: [projectA.path: projectA, projectB.path: projectB], - targets: targets, dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -342,10 +287,10 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_resourceBundleDependencies_returns_an_empty_list_when_a_dependency_can_host_resources() { // Given // App -> WatchApp -> Bundle - let project = Project.test() let app = Target.test(name: "App", platform: .iOS, product: .app) let watchApp = Target.test(name: "WatchApp", platform: .iOS, product: .watch2App) let bundle = Target.test(name: "Bundle", platform: .iOS, product: .bundle) + let project = Project.test(targets: [app, watchApp, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: watchApp.name, path: project.path)]), @@ -357,11 +302,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - watchApp.name: watchApp, - bundle.name: bundle, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -376,10 +316,10 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_resourceBundleDependencies() { // Given // App -> StaticLibrary -> Bundle - let project = Project.test() let app = Target.test(name: "App", product: .app) let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary) let bundle = Target.test(name: "Bundle", product: .bundle) + let project = Project.test(targets: [app, staticLibrary, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: staticLibrary.name, path: project.path)]), @@ -391,11 +331,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticLibrary.name: staticLibrary, - bundle.name: bundle, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -412,9 +347,9 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_resourceBundleDependencies_when_the_target_doesnt_support_resources() { // Given // StaticLibrary -> Bundle - let project = Project.test() let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary) let bundle = Target.test(name: "Bundle", product: .bundle) + let project = Project.test(targets: [staticLibrary, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: staticLibrary.name, path: project.path): Set([.target(name: bundle.name, path: project.path)]), @@ -425,10 +360,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - staticLibrary.name: staticLibrary, - bundle.name: bundle, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -444,7 +375,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let bundle = Target.test(name: "Bundle1", product: .bundle) let app = Target.test(name: "App", product: .bundle) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [bundle, app]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: bundle.name, path: project.path)]), @@ -455,10 +386,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - bundle.name: bundle, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -475,10 +402,10 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_resourceBundleDependencies_fromProjectDependency() { // Given let bundle = Target.test(name: "Bundle1", product: .bundle) - let projectA = Project.test(path: "/path/a") + let projectA = Project.test(path: "/path/a", targets: [bundle]) let app = Target.test(name: "App", product: .app) - let projectB = Project.test(path: "/path/b") + let projectB = Project.test(path: "/path/b", targets: [app]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: projectB.path): Set([.target(name: bundle.name, path: projectA.path)]), @@ -492,10 +419,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projectA.path: projectA, projectB.path: projectB, ], - targets: [ - projectA.path: [bundle.name: bundle], - projectB.path: [app.name: app], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -531,13 +454,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projectA.path: projectA, projectB.path: projectB, ], - targets: [ - projectA.path: [ - bundle.name: bundle, - staticFramework.name: staticFramework, - ], - projectB.path: [app.name: app], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -583,15 +499,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projectA.path: projectA, projectB.path: projectB, ], - targets: [ - projectA.path: [ - bundle1.name: bundle1, - bundle2.name: bundle2, - staticFramework1.name: staticFramework1, - staticFramework2.name: staticFramework2, - ], - projectB.path: [app.name: app], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -641,15 +548,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projectA.path: projectA, projectB.path: projectB, ], - targets: [ - projectA.path: [ - bundle.name: bundle, - staticFramework1.name: staticFramework1, - staticFramework2.name: staticFramework2, - dynamicFramework.name: dynamicFramework, - ], - projectB.path: [app.name: app], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -703,14 +601,6 @@ final class GraphTraverserTests: TuistUnitTestCase { staticFrameworkProject.path: staticFrameworkProject, appProject.path: appProject, ], - targets: [ - staticFrameworkProject.path: [ - staticFramework.name: staticFramework, - ], - appProject.path: [ - appTests.name: appTests, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -763,14 +653,6 @@ final class GraphTraverserTests: TuistUnitTestCase { staticFrameworkProject.path: staticFrameworkProject, appProject.path: appProject, ], - targets: [ - staticFrameworkProject.path: [ - staticFramework.name: staticFramework, - ], - appProject.path: [ - app.name: app, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -823,14 +705,6 @@ final class GraphTraverserTests: TuistUnitTestCase { dynamicFrameworkProject.path: dynamicFrameworkProject, appProject.path: appProject, ], - targets: [ - dynamicFrameworkProject.path: [ - dynamicFramework.name: dynamicFramework, - ], - appProject.path: [ - app.name: app, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -854,14 +728,13 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_target_from_dependency() { // Given - let project = Project.test() let app = Target.test(name: "App", product: .app) + let project = Project.test(targets: [app]) // Given: Value Graph let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [app.name: app]], dependencies: [.target(name: app.name, path: project.path): Set()] ) let subject = GraphTraverser(graph: graph) @@ -876,10 +749,10 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_allDependencies() throws { // Given // App -> StaticLibrary -> Bundle - let project = Project.test() let app = Target.test(name: "App", product: .app) let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary, productName: "StaticLibrary") let bundle = Target.test(name: "Bundle", product: .bundle) + let project = Project.test(targets: [app, staticLibrary, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: staticLibrary.name, path: project.path)]), @@ -891,11 +764,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticLibrary.name: staticLibrary, - bundle.name: bundle, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -918,12 +786,12 @@ final class GraphTraverserTests: TuistUnitTestCase { // App -> StaticLibrary -> Bundle // | // -> FrameworkA -> FrameworkC - let project = Project.test() let app = Target.test(name: "App", product: .app) let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary) let frameworkA = Target.test(name: "FrameworkA", product: .framework) let frameworkB = Target.test(name: "FrameworkB", product: .framework) let bundle = Target.test(name: "Bundle", product: .bundle) + let project = Project.test(targets: [app, staticLibrary, frameworkA, frameworkB, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([ @@ -939,13 +807,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticLibrary.name: staticLibrary, - bundle.name: bundle, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -975,7 +836,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let target = Target.test(name: "Main") let dependency = Target.test(name: "AppExtension", product: .appExtension) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependency]) let dependencies: [GraphDependency: Set] = [ .target(name: target.name, path: project.path): Set([.target(name: dependency.name, path: project.path)]), .target(name: dependency.name, path: project.path): Set([]), @@ -985,10 +846,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - target.name: target, - dependency.name: dependency, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1004,7 +861,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // When let target = Target.test(name: "Main") let dependency = Target.test(name: "StickerPackExtension", product: .stickerPackExtension) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependency]) let dependencies: [GraphDependency: Set] = [ .target(name: target.name, path: project.path): Set([.target(name: dependency.name, path: project.path)]), .target(name: dependency.name, path: project.path): Set([]), @@ -1014,10 +871,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - target.name: target, - dependency.name: dependency, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1043,10 +896,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - messageExtension.name: messageExtension, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1062,14 +911,13 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_appClipDependencies() throws { // Given - let project = Project.test() let app = Target.test(name: "app", product: .app) let appClip = Target.test(name: "clip", product: .appClip) + let project = Project.test(targets: [app, appClip]) // Given: Value graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [app.name: app, appClip.name: appClip]], dependencies: [.target( name: app.name, path: project.path @@ -1087,15 +935,14 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_buildsForMacCatalyst_returns_false_when_someDependenciesCantBuildForMacCatalyst() { // Given - let project = Project.test() let app = Target.test(name: "app", destinations: [.macCatalyst], product: .app) let library = Target.test(name: "library-a", destinations: [.iPhone], product: .dynamicLibrary) let transitiveLibrary = Target.test(name: "library-b", destinations: [.iPhone], product: .dynamicLibrary) + let project = Project.test(targets: [app, library, transitiveLibrary]) // Given: Value graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [app.name: app, library.name: library, transitiveLibrary.name: transitiveLibrary]], dependencies: [ .target( name: app.name, @@ -1118,15 +965,14 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_buildsForMacCatalyst_returns_false_when_aTargetDoesntSupportCatalystRegardlessOfItsDependencies() { // Given - let project = Project.test() let app = Target.test(name: "app", destinations: [.iPhone], product: .app) let library = Target.test(name: "library-a", destinations: [.macCatalyst], product: .dynamicLibrary) let transitiveLibrary = Target.test(name: "library-b", destinations: [.macCatalyst], product: .dynamicLibrary) + let project = Project.test(targets: [app, library, transitiveLibrary]) // Given: Value graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [app.name: app, library.name: library, transitiveLibrary.name: transitiveLibrary]], dependencies: [ .target( name: app.name, @@ -1149,15 +995,14 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_buildsForMacCatalyst_returns_true_when_aTargetAndItsDependenciesSupportCatalyst() { // Given - let project = Project.test() let app = Target.test(name: "app", destinations: [.macCatalyst], product: .app) let library = Target.test(name: "library-a", destinations: [.macCatalyst], product: .dynamicLibrary) let transitiveLibrary = Target.test(name: "library-b", destinations: [.macCatalyst], product: .dynamicLibrary) + let project = Project.test(targets: [app, library, transitiveLibrary]) // Given: Value graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [app.name: app, library.name: library, transitiveLibrary.name: transitiveLibrary]], dependencies: [ .target( name: app.name, @@ -1196,7 +1041,6 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [ .target( name: target.name, @@ -1219,12 +1063,11 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let target = Target.test(name: "Main", product: .framework) let dependency = Target.test(name: "Dependency", product: .framework) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependency]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [dependency.name: dependency, target.name: target]], dependencies: [ .target( name: target.name, @@ -1247,12 +1090,11 @@ final class GraphTraverserTests: TuistUnitTestCase { let target = Target.test(name: "Main") let dependencyA = Target.test(name: "DependencyA", product: .framework) let dependencyB = Target.test(name: "DependencyB", product: .framework, settings: mergeableSettings) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependencyA, dependencyB]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [dependencyA.name: dependencyA, dependencyB.name: dependencyB, target.name: target]], dependencies: [ .target( name: target.name, @@ -1282,12 +1124,11 @@ final class GraphTraverserTests: TuistUnitTestCase { let target = Target.test(name: "Main", mergedBinaryType: .automatic) let dependencyA = Target.test(name: "DependencyA", product: .framework) let dependencyB = Target.test(name: "DependencyB", product: .framework, mergeable: true) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependencyA, dependencyB]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [dependencyA.name: dependencyA, dependencyB.name: dependencyB, target.name: target]], dependencies: [ .target( name: target.name, @@ -1324,7 +1165,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [ .target(name: target.name, path: project.path): Set(arrayLiteral: frameworkDependency), ] @@ -1398,7 +1238,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [app.name: app]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1479,7 +1318,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [app.name: app]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1496,7 +1334,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let target = Target.test(name: "Main") let dependency = Target.test(name: "Dependency", product: .framework) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependency]) // Given: Value Graph let frameworkDependency = GraphDependency.testFramework( @@ -1513,7 +1351,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target, dependency.name: dependency]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1546,7 +1383,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1579,11 +1415,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - watchExtension.name: watchExtension, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1619,11 +1450,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - xpc.name: xpc, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1647,7 +1473,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/") + let project = Project.test(path: "/path/", targets: [app, tests, framework]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -1657,11 +1483,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - tests.name: tests, - framework.name: framework, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1676,8 +1497,8 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_embeddableDependencies_when_nonHostedTestTarget_dynamic_dependencies() throws { // Given let unitTests = Target.test(name: "AppUnitTests", product: .unitTests) - let project = Project.test(path: "/path/a") let target = Target.test(name: "LocallyBuiltFramework", product: .framework) + let project = Project.test(path: "/path/a", targets: [unitTests, target]) // Given: Value Graph let precompiledDependency = GraphDependency.testFramework( @@ -1697,10 +1518,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - unitTests.name: unitTests, - target.name: target, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1726,7 +1543,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [framework, staticFramework, app, tests]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -1746,12 +1563,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - framework.name: framework, - staticFramework.name: staticFramework, - app.name: app, - tests.name: tests, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1767,7 +1578,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", product: .app) let uiTests = Target.test(name: "AppUITests", product: .uiTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, uiTests]) // Given: Value Graph let precompiledDependency = GraphDependency.testFramework( @@ -1785,10 +1596,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - uiTests.name: uiTests, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1818,7 +1625,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1850,7 +1656,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1884,7 +1689,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1915,7 +1719,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -1960,7 +1763,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2014,7 +1816,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2071,7 +1872,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2127,7 +1927,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2185,12 +1984,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2213,7 +2006,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let target = Target.test(name: "Main") let dependency = Target.test(name: "Dependency", product: .staticLibrary) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependency]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2222,7 +2015,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target, dependency.name: dependency]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2239,7 +2031,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let target = Target.test(name: "Main") let dependency = Target.test(name: "Dependency", product: .framework) let staticDependency = Target.test(name: "StaticDependency", product: .staticLibrary) - let project = Project.test(targets: [target]) + let project = Project.test(targets: [target, dependency, staticDependency]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2252,11 +2044,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - target.name: target, - dependency.name: dependency, - staticDependency.name: staticDependency, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2293,7 +2080,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [] ) let app = Target.test(name: "App", product: .app) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, staticFramework, dynamicFramework]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2309,11 +2096,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticFramework.name: staticFramework, - dynamicFramework.name: dynamicFramework, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2358,7 +2140,10 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [] ) let app = Target.test(name: "App", product: .app) - let project = Project.test(path: "/path/a") + let project = Project.test( + path: "/path/a", + targets: [app, dynamicFramework1, dynamicFramework2, staticFramework1, staticFramework2] + ) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2382,13 +2167,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - dynamicFramework1.name: dynamicFramework1, - dynamicFramework2.name: dynamicFramework2, - staticFramework1.name: staticFramework1, - staticFramework2.name: staticFramework2, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2450,7 +2228,10 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) - let project = Project.test(path: "/path/a") + let project = Project.test( + path: "/path/a", + targets: [app, dynamicFramework1, dynamicFramework2, dynamicFramework3, staticFramework1, staticFramework2] + ) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2478,14 +2259,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - dynamicFramework1.name: dynamicFramework1, - dynamicFramework2.name: dynamicFramework2, - staticFramework1.name: staticFramework1, - staticFramework2.name: staticFramework2, - dynamicFramework3.name: dynamicFramework3, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2516,7 +2289,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [] ) let app = Target.test(name: "App", product: .app) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, staticFrameworkA, staticFrameworkB]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2537,11 +2310,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkA.name: staticFrameworkA, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2568,7 +2336,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [] ) let app = Target.test(name: "App", product: .app) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, staticFramework, dynamicFramework]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2589,11 +2357,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticFramework.name: staticFramework, - dynamicFramework.name: dynamicFramework, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2623,7 +2386,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [.sdk(name: "some.framework", status: .optional)] ) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, staticFramework]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2640,10 +2403,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2668,7 +2427,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ] ) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [staticFramework]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2689,7 +2448,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [staticFramework.name: staticFramework]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2720,7 +2478,7 @@ final class GraphTraverserTests: TuistUnitTestCase { dependencies: [.sdk(name: "ThingTwo.framework", status: .optional)] ) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [staticFrameworkA, staticFrameworkB]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -2742,10 +2500,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2777,12 +2531,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let project = Project.test(path: "/path/project", targets: [app, staticFramework]) let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: [ .target(name: app.name, path: project.path): Set([ .target(name: staticFramework.name, path: project.path), @@ -2830,12 +2578,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let project = Project.test(path: "/path/project", targets: [app, framework]) let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - framework.name: framework, - ], - ], dependencies: [ .target(name: app.name, path: project.path): Set([ .target(name: framework.name, path: project.path), @@ -2874,13 +2616,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let project = Project.test(path: "/path/project", targets: [app, staticFramework, framework]) let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - framework.name: framework, - ], - ], dependencies: [ .target(name: app.name, path: project.path): Set([ .target(name: staticFramework.name, path: project.path), @@ -2926,11 +2661,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - watchExtension.name: watchExtension, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2965,11 +2695,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - watchExtension.name: watchExtension, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -2993,7 +2718,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, staticFramework, tests]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -3008,11 +2733,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticFramework.name: staticFramework, - tests.name: tests, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3035,7 +2755,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let appClip = Target.test(name: "AppClip", product: .appClip) let tests = Target.test(name: "AppClipTests", product: .unitTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [appClip, staticFramework, tests]) let dependencies: [GraphDependency: Set] = [ .target(name: appClip.name, path: project.path): [ .target(name: staticFramework.name, path: project.path), @@ -3048,11 +2768,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - appClip.name: appClip, - staticFramework.name: staticFramework, - tests.name: tests, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3075,7 +2790,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, framework, tests]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -3088,11 +2803,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - framework.name: framework, - tests.name: tests, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3115,7 +2825,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let app = Target.test(name: "App", product: .app) let tests = Target.test(name: "AppTests", product: .unitTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, framework, tests]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -3125,11 +2835,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - framework.name: framework, - tests.name: tests, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3144,7 +2849,7 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_linkableDependencies_when_appClipSDKNode() throws { // Given let target = Target.test(name: "AppClip", product: .appClip) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [target]) // Given: Value Graph let sdkDependency: GraphDependency = .sdk( @@ -3164,7 +2869,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -3193,7 +2897,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let appClipTarget = Target.test(name: "AppClip", product: .appClip) let frameworkTarget = Target.test(name: "MyFramework", product: .framework) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [appClipTarget, frameworkTarget]) // Given: Value Graph let dependencies: [GraphDependency: Set] = [ @@ -3205,12 +2909,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], - targets: [ - project.path: [ - appClipTarget.name: appClipTarget, - frameworkTarget.name: frameworkTarget, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3244,7 +2942,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [ .target(name: target.name, path: project.path): Set(arrayLiteral: frameworkDependency), ] @@ -3281,7 +2978,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3310,12 +3006,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: staticFramework.name, path: project.path), @@ -3379,12 +3069,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: staticFramework.name, path: project.path), @@ -3449,12 +3133,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ project.path: project, ], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: staticFramework.name, path: project.path), @@ -3538,12 +3216,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - unitTests.name: unitTests, - staticFramework.name: staticFramework, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3585,13 +3257,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - unitTests.name: unitTests, - dynamicFramework.name: dynamicFramework, - staticFramework.name: staticFramework, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3637,12 +3302,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - hostApp.name: hostApp, - unitTests.name: unitTests, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3664,7 +3323,7 @@ final class GraphTraverserTests: TuistUnitTestCase { binaryPath: "/test/PrecompiledStaticFramework.framework/PrecompiledStaticFramework", linking: .static ) - let project = Project.test(targets: [hostApp, unitTests]) + let project = Project.test(targets: [hostApp, unitTests, staticFramework]) let dependencies: [GraphDependency: Set] = [ .target(name: hostApp.name, path: project.path): [ precompiledStaticFramework, @@ -3679,13 +3338,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - hostApp.name: hostApp, - unitTests.name: unitTests, - staticFramework.name: staticFramework, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3712,7 +3364,7 @@ final class GraphTraverserTests: TuistUnitTestCase { binaryPath: "/test/PrecompiledStaticFramework.framework/PrecompiledStaticFramework", linking: .static ) - let project = Project.test(targets: [hostApp, unitTests]) + let project = Project.test(targets: [hostApp, unitTests, staticFramework]) let dependencies: [GraphDependency: Set] = [ .target(name: hostApp.name, path: project.path): [ precompiledStaticFramework, @@ -3727,13 +3379,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ] let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - hostApp.name: hostApp, - unitTests.name: unitTests, - staticFramework.name: staticFramework, - ], - ], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -3759,7 +3404,6 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [ .target(name: target.name, path: project.path): Set([ .testLibrary(path: "/test/test.a", swiftModuleMap: "/test/modules/test.swiftmodulemap"), @@ -3781,7 +3425,7 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_runPathSearchPaths() throws { // Given let unitTests = Target.test(name: "AppUnitTests", product: .unitTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [unitTests]) // Given: Value Graph let precompiledDependency = GraphDependency.testFramework( @@ -3802,7 +3446,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [unitTests.name: unitTests]], dependencies: [ .target(name: unitTests.name, path: project.path): Set([precompiledDependency, precompiledBDependency]), precompiledDependency: Set(), @@ -3825,7 +3468,7 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", product: .app) let unitTests = Target.test(name: "AppUnitTests", product: .unitTests) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [unitTests, app]) // Given: Value Graph let precompiledDependency = GraphDependency.testFramework( @@ -3838,10 +3481,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - unitTests.name: unitTests, - app.name: app, - ]], dependencies: [ .target( name: unitTests.name, @@ -3864,15 +3503,11 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", platform: .iOS, product: .app) let watchApp = Target.test(name: "WatchApp", platform: .watchOS, product: .watch2App) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [app, watchApp]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - app.name: app, - watchApp.name: watchApp, - ]], dependencies: [ .target(name: app.name, path: project.path): Set([.target(name: watchApp.name, path: project.path)]), .target(name: watchApp.name, path: project.path): Set([]), @@ -3891,15 +3526,11 @@ final class GraphTraverserTests: TuistUnitTestCase { // Given let watchApp = Target.test(name: "WatchApp", platform: .watchOS, product: .watch2App) let watchAppExtension = Target.test(name: "WatchAppExtension", platform: .watchOS, product: .watch2Extension) - let project = Project.test(path: "/path/a") + let project = Project.test(path: "/path/a", targets: [watchAppExtension, watchApp]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - watchAppExtension.name: watchAppExtension, - watchApp.name: watchApp, - ]], dependencies: [ .target( name: watchApp.name, @@ -3922,16 +3553,11 @@ final class GraphTraverserTests: TuistUnitTestCase { let macosApp = Target.test(name: "MacOS", platform: .macOS, product: .app) let tvosApp = Target.test(name: "tvOS", platform: .tvOS, product: .app) let framework = Target.test(name: "Framework", platform: .iOS, product: .framework) - let project = Project.test(path: "/project") + let project = Project.test(path: "/project", targets: [macosApp, tvosApp, framework]) // Given: Value Graph let graph = Graph.test( projects: [project.path: project], - targets: [project.path: [ - macosApp.name: macosApp, - tvosApp.name: tvosApp, - framework.name: framework, - ]], dependencies: [ .target(name: macosApp.name, path: project.path): Set(), .target(name: tvosApp.name, path: project.path): Set(), @@ -3952,19 +3578,16 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_allTargets_returns_all_the_targets() { // Given let firstPath = try! AbsolutePath(validating: "/first") - let firstProject = Project.test(path: firstPath) let secondPath = try! AbsolutePath(validating: "/second") - let secondProject = Project.test(path: secondPath) let firstTarget = Target.test(name: "first") + let firstProject = Project.test(path: firstPath, targets: [firstTarget]) let secondTarget = Target.test(name: "second") + let secondProject = Project.test(path: secondPath, targets: [secondTarget]) + let graph = Graph.test( projects: [ firstPath: firstProject, secondPath: secondProject, - ], - targets: [ - firstPath: [firstTarget.name: firstTarget], - secondPath: [secondTarget.name: secondTarget], ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -4017,10 +3640,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - extensionKitExtension.name: extensionKitExtension, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4131,9 +3750,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - staticLibrary.name: staticLibrary, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4182,8 +3798,8 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_copyProductDependencies_when_targetHasDirectStaticDependencies() throws { // Given let staticLibrary = Target.test(name: "StaticLibrary", destinations: [.iPhone], product: .staticLibrary) - let project = Project.test(targets: [staticLibrary]) let aDependency = Target.test(name: "StaticDependency", destinations: [.iPhone], product: .staticLibrary) + let project = Project.test(targets: [staticLibrary, aDependency]) let dependencies: [GraphDependency: Set] = [ .target(name: staticLibrary.name, path: project.path): Set([.target(name: aDependency.name, path: project.path)]), @@ -4193,10 +3809,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - staticLibrary.name: staticLibrary, - aDependency.name: aDependency, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4213,8 +3825,8 @@ final class GraphTraverserTests: TuistUnitTestCase { func test_copyProductDependencies_when_targetHasBundleDependencies() throws { // Given let app = Target.test(name: "App", destinations: [.iPhone], product: .app) - let project = Project.test(targets: [app]) let bundle = Target.test(name: "Bundle", destinations: [.iPhone], product: .bundle) + let project = Project.test(targets: [app, bundle]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: bundle.name, path: project.path)]), @@ -4224,10 +3836,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - bundle.name: bundle, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4259,12 +3867,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: [ appkGraphDependency: [ staticFrameworkGraphDependency, @@ -4306,12 +3908,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: [ appkGraphDependency: [ staticFrameworkGraphDependency, @@ -4352,12 +3948,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - staticFramework.name: staticFramework, - ], - ], dependencies: [ appkGraphDependency: [ staticFrameworkGraphDependency, @@ -4411,14 +4001,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - ], - ], dependencies: [ appkGraphDependency: [ staticFrameworkAGraphDependency, @@ -4489,14 +4071,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - ], - ], dependencies: [ appkGraphDependency: [ staticFrameworkAGraphDependency, @@ -4535,10 +4109,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - framework.name: framework, - macro.name: macro, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4564,9 +4134,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - framework.name: framework, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4612,14 +4179,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - staticFrameworkMacro.name: staticFrameworkMacro, - dynamicFrameworkMacro.name: dynamicFrameworkMacro, - staticLibraryMacro.name: staticLibraryMacro, - dynamicLibraryMacro.name: dynamicLibraryMacro, - macro.name: macro, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4663,10 +4222,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - macroFramework.name: macroFramework, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4690,7 +4245,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let transitiveMacro = Target.test(name: "TransitiveMacro", destinations: [.mac], product: .macro) - let project = Project.test(targets: [app, directMacroFramework, directMacro]) + let project = Project.test(targets: [app, directMacroFramework, directMacro, transitiveMacroLibrary, transitiveMacro]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set([.target(name: directMacroFramework.name, path: project.path)]), .target(name: directMacroFramework.name, path: project.path): Set([ @@ -4707,13 +4262,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - directMacroFramework.name: directMacroFramework, - directMacro.name: directMacro, - transitiveMacroLibrary.name: transitiveMacroLibrary, - transitiveMacro.name: transitiveMacro, - ]], dependencies: dependencies ) let subject = GraphTraverser(graph: graph) @@ -4750,10 +4298,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - framework.name: framework, - ]], dependencies: dependencies, dependencyConditions: [ GraphEdge(from: appDependency, to: frameworkDependency): platformCondition, @@ -4802,13 +4346,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - app.name: app, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - frameworkD.name: frameworkD, - ]], dependencies: dependencies, dependencyConditions: [ GraphEdge(from: frameworkBDependency, to: frameworkCDependency): platformCondition, @@ -4858,13 +4395,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project, packageProject.path: packageProject], - targets: [project.path: [ - app.name: app, - ], packageProject.path: [ - directPackageProduct.name: directPackageProduct, - transitivePackageProduct.name: transitivePackageProduct, - packageDevProduct.name: packageDevProduct, - ]], dependencies: [ appDependency: Set([directPackageProductDependency]), directPackageProductDependency: Set([transitivePackageProductDependency]), @@ -4898,12 +4428,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project, packageProject.path: packageProject], - targets: [project.path: [ - app.name: app, - framework.name: framework, - ], packageProject.path: [ - directPackageProduct.name: directPackageProduct, - ]], dependencies: [ appDependency: Set([frameworkDependency]), frameworkDependency: Set([directPackageProductDependency]), @@ -4937,12 +4461,6 @@ final class GraphTraverserTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project, packageProject.path: packageProject], - targets: [project.path: [ - app.name: app, - framework.name: framework, - ], packageProject.path: [ - directPackageProduct.name: directPackageProduct, - ]], dependencies: [ appDependency: Set([frameworkDependency]), frameworkDependency: Set([directPackageProductDependency]), @@ -4989,15 +4507,6 @@ final class GraphTraverserTests: TuistUnitTestCase { directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - externalPackage.name: externalPackage, - externalPackageTargetB.name: externalPackageTargetB, - ], - ], dependencies: [ appTargetDependency: Set([externalPackageDependency]), externalPackageDependency: Set([externalPackageBDependency]), @@ -5058,15 +4567,6 @@ final class GraphTraverserTests: TuistUnitTestCase { directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - directExternalPackage.name: directExternalPackage, - transitiveExternalPackage.name: transitiveExternalPackage, - ], - ], dependencies: [ appTargetDependency: Set([directExternalPackageDependency]), directExternalPackageDependency: Set([transitiveExternalPackageDependency]), @@ -5123,15 +4623,6 @@ final class GraphTraverserTests: TuistUnitTestCase { directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - externalMacroFramework.name: externalMacroFramework, - externalMacroExecutable.name: externalMacroExecutable, - ], - ], dependencies: [ appTargetDependency: Set([externalMacroFrameworkDependency]), externalMacroFrameworkDependency: Set([externalMacroExecutableDependency]), @@ -5183,14 +4674,6 @@ final class GraphTraverserTests: TuistUnitTestCase { directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - externalFramework.name: externalFramework, - ], - ], dependencies: [ appTargetDependency: Set([externalFrameworkDependency]), ] @@ -5223,11 +4706,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ directory: project, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - ], dependencies: [ appTargetDependency: Set([precompiledMacroXCFramework]), precompiledMacroXCFramework: Set([precompiledMacroExecutable]), @@ -5260,7 +4738,16 @@ final class GraphTraverserTests: TuistUnitTestCase { ) let transitiveMacroMacroTarget = Target.test(name: "TransitiveMacro", destinations: [.appleWatch], product: .macro) - let project = Project.test(path: directory, targets: [appTarget]) + let project = Project.test( + path: directory, + targets: [ + appTarget, + directMacroStaticFrameworkTarget, + directMacroMacroTarget, + transitiveMacroMacroTarget, + transitiveMacroStaticFrameworkTarget, + ] + ) let appTargetDependency = GraphDependency.target(name: appTarget.name, path: project.path) let directMacroStaticFrameworkTargetDependency = GraphDependency.target( name: directMacroStaticFrameworkTarget.name, @@ -5280,15 +4767,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ directory: project, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - directMacroStaticFrameworkTarget.name: directMacroStaticFrameworkTarget, - directMacroMacroTarget.name: directMacroMacroTarget, - transitiveMacroStaticFrameworkTarget.name: transitiveMacroStaticFrameworkTarget, - transitiveMacroMacroTarget.name: transitiveMacroMacroTarget, - ], - ], dependencies: [ appTargetDependency: Set([directMacroStaticFrameworkTargetDependency]), directMacroStaticFrameworkTargetDependency: Set([ @@ -5321,7 +4799,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let precompiledMacroPath: AbsolutePath = .root.appending(component: "macro.macro") let directMacroMacroPrecompiledExecutable = GraphDependency.macro(path: precompiledMacroPath) - let project = Project.test(path: directory, targets: [appTarget]) + let project = Project.test(path: directory, targets: [appTarget, directMacroStaticFrameworkTarget]) let appTargetDependency = GraphDependency.target(name: appTarget.name, path: project.path) let directMacroStaticFrameworkTargetDependency = GraphDependency.target( name: directMacroStaticFrameworkTarget.name, @@ -5332,12 +4810,6 @@ final class GraphTraverserTests: TuistUnitTestCase { projects: [ directory: project, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - directMacroStaticFrameworkTarget.name: directMacroStaticFrameworkTarget, - ], - ], dependencies: [ appTargetDependency: Set([directMacroStaticFrameworkTargetDependency]), directMacroStaticFrameworkTargetDependency: Set([ diff --git a/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift b/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift index cd86ec2a13f..1a63187a795 100644 --- a/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift +++ b/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift @@ -24,7 +24,7 @@ final class TargetProjectMapperTests: XCTestCase { let (updatedProject, sideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(updatedProject.targets.map(\.name), [ + XCTAssertEqual(updatedProject.targets.values.map(\.name).sorted(), [ "Updated_A", "Updated_B", ]) @@ -47,7 +47,7 @@ final class TargetProjectMapperTests: XCTestCase { let (_, sideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(sideEffects, [ + XCTAssertEqual(sideEffects.sorted(by: { $0.description < $1.description }), [ .file(.init(path: try AbsolutePath(validating: "/Targets/A.swift"))), .file(.init(path: try AbsolutePath(validating: "/Targets/B.swift"))), ]) diff --git a/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift index b5f89bfb7d8..c67bc8fe424 100644 --- a/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift @@ -42,14 +42,6 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - externalPackage.name: externalPackage, - ], - ], dependencies: [ appTargetDependency: Set([externalPackageDependency]), ] @@ -59,9 +51,13 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase let (mappedGraph, _) = try await subject.map(graph: graph) // Then - XCTAssertEqual(try XCTUnwrap(mappedGraph.targets[project.path]?[appTarget.name]?.supportedPlatforms), Set([.iOS])) + + XCTAssertEqual( + try XCTUnwrap(mappedGraph.projects[project.path]?.targets[appTarget.name])?.supportedPlatforms, + Set([.iOS]) + ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[externalProject.path]![externalPackage.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalPackage.name]?.supportedPlatforms), Set([.iOS]) ) } @@ -93,14 +89,6 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - externalPackage.name: externalPackage, - ], - ], dependencies: [ appTargetDependency: Set([externalPackageDependency]), ], @@ -113,16 +101,17 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase let (mappedGraph, _) = try await subject.map(graph: graph) // Then + XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[project.path]?[appTarget.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.projects[project.path]?.targets[appTarget.name]?.supportedPlatforms), Set([.iOS, .macOS, .tvOS, .watchOS]) ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[externalProject.path]![externalPackage.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalPackage.name]?.supportedPlatforms), Set([.iOS]) ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[externalProject.path]![externalPackage.name]?.deploymentTargets), + try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalPackage.name]?.deploymentTargets), .iOS("16.0") ) } @@ -163,15 +152,6 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - directExternalPackage.name: directExternalPackage, - transitiveExternalPackage.name: transitiveExternalPackage, - ], - ], dependencies: [ appTargetDependency: Set([directExternalPackageDependency]), directExternalPackageDependency: Set([transitiveExternalPackageDependency]), @@ -182,13 +162,20 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase let (mappedGraph, _) = try await subject.map(graph: graph) // Then - XCTAssertEqual(try XCTUnwrap(mappedGraph.targets[project.path]?[appTarget.name]?.supportedPlatforms), Set([.iOS])) + + XCTAssertEqual( + try XCTUnwrap(mappedGraph.projects[project.path]?.targets[appTarget.name]?.supportedPlatforms), + Set([.iOS]) + ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[externalProject.path]?[directExternalPackage.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[directExternalPackage.name]?.supportedPlatforms), Set([.iOS]) ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[externalProject.path]?[transitiveExternalPackage.name]?.supportedPlatforms), + try XCTUnwrap( + mappedGraph.projects[externalProject.path]?.targets[transitiveExternalPackage.name]? + .supportedPlatforms + ), Set([.iOS]) ) } @@ -228,15 +215,6 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase directory: project, packagesDirectory: externalProject, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - ], - externalProject.path: [ - externalMacroFramework.name: externalMacroFramework, - externalMacroExecutable.name: externalMacroExecutable, - ], - ], dependencies: [ appTargetDependency: Set([externalMacroFrameworkDependency]), externalMacroFrameworkDependency: Set([externalMacroExecutableDependency]), @@ -247,13 +225,16 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase let (mappedGraph, _) = try await subject.map(graph: graph) // Then - XCTAssertEqual(try XCTUnwrap(mappedGraph.targets[project.path]?[appTarget.name]?.supportedPlatforms), Set([.iOS])) XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[externalProject.path]?[externalMacroFramework.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.projects[project.path]?.targets[appTarget.name]?.supportedPlatforms), + Set([.iOS]) + ) + XCTAssertEqual( + try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalMacroFramework.name]?.supportedPlatforms), Set([.iOS]) ) XCTAssertEqual( - try XCTUnwrap(mappedGraph.targets[externalProject.path]?[externalMacroExecutable.name]?.supportedPlatforms), + try XCTUnwrap(mappedGraph.projects[externalProject.path]?.targets[externalMacroExecutable.name]?.supportedPlatforms), Set([.macOS]) ) } diff --git a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift index 1458b03bb70..2b4a4ef1c5b 100644 --- a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift @@ -57,14 +57,6 @@ final class PruneOrphanExternalTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project, packageProject.path: packageProject], - targets: [project.path: [ - app.name: app, - ], packageProject.path: [ - directPackageProduct.name: directPackageProduct, - transitivePackageProduct.name: transitivePackageProduct, - transitivePackageProductWithNoDestinations.name: transitivePackageProductWithNoDestinations, - packageDevProduct.name: packageDevProduct, - ]], dependencies: [ appDependency: Set([directPackageProductDependency]), directPackageProductDependency: Set([ @@ -78,10 +70,14 @@ final class PruneOrphanExternalTargetsGraphMapperTests: TuistUnitTestCase { let (gotGraph, _) = try await subject.map(graph: graph) // Then - XCTAssertEqual(gotGraph.targets[project.path]?[app.name]?.prune, false) - XCTAssertEqual(gotGraph.targets[packageProject.path]?[directPackageProduct.name]?.prune, false) - XCTAssertEqual(gotGraph.targets[packageProject.path]?[transitivePackageProduct.name]?.prune, false) - XCTAssertEqual(gotGraph.targets[packageProject.path]?[packageDevProduct.name]?.prune, true) - XCTAssertEqual(gotGraph.targets[packageProject.path]?[transitivePackageProductWithNoDestinations.name]?.prune, true) + + XCTAssertEqual(gotGraph.projects[project.path]?.targets[app.name]?.prune, false) + XCTAssertEqual(gotGraph.projects[packageProject.path]?.targets[directPackageProduct.name]?.prune, false) + XCTAssertEqual(gotGraph.projects[packageProject.path]?.targets[transitivePackageProduct.name]?.prune, false) + XCTAssertEqual(gotGraph.projects[packageProject.path]?.targets[packageDevProduct.name]?.prune, true) + XCTAssertEqual( + gotGraph.projects[packageProject.path]?.targets[transitivePackageProductWithNoDestinations.name]?.prune, + true + ) } } diff --git a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift index 1933e4697e7..069d9a1df0e 100644 --- a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift @@ -774,12 +774,12 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [bundle1, bundle2]) - let project = Project.test(path: path) - let targets: [AbsolutePath: [String: Target]] = [project.path: [ - bundle1.name: bundle1, - bundle2.name: bundle2, - app.name: app, - ]] + let project = Project.test(path: path, targets: [ + bundle1, + bundle2, + app, + ]) + let dependencies: [GraphDependency: Set] = [ .target(name: bundle1.name, path: project.path): Set(), .target(name: bundle2.name, path: project.path): Set(), @@ -791,7 +791,6 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [project.path: project], - targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -818,27 +817,20 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let path = try temporaryPath() let bundle = Target.test(name: "Bundle1", product: .bundle) - let projectA = Project.test(path: "/path/a") - let app = Target.test(name: "App", product: .app) - let projectB = Project.test(path: "/path/b") - let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [bundle]) - - let targets: [AbsolutePath: [String: Target]] = [ - projectA.path: [bundle.name: bundle], - projectB.path: [app.name: app], - ] + let projectA = Project.test(path: "/path/a", targets: [bundle]) + let projectB = Project.test(path: "/path/b", targets: [app]) let dependencies: [GraphDependency: Set] = [ .target(name: bundle.name, path: projectA.path): Set(), .target(name: app.name, path: projectB.path): Set([.target(name: bundle.name, path: projectA.path)]), ] + let graph = Graph.test( path: path, projects: [projectA.path: projectA, projectB.path: projectB], - targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -934,21 +926,15 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { func test_generateAppExtensionsBuildPhase() throws { // Given let path = try temporaryPath() - let projectA = Project.test(path: "/path/a") let appExtension = Target.test(name: "AppExtension", product: .appExtension) let stickerPackExtension = Target.test(name: "StickerPackExtension", product: .stickerPackExtension) let app = Target.test(name: "App", destinations: [.iPhone, .iPad, .mac], product: .app) let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [appExtension, stickerPackExtension]) - - let targets: [AbsolutePath: [String: Target]] = [ - projectA.path: [ - appExtension.name: appExtension, - stickerPackExtension.name: stickerPackExtension, - app.name: app, - ], - ] + let projectA = Project.test(path: "/path/a", targets: [ + appExtension, stickerPackExtension, app, + ]) let appGraphDependency: GraphDependency = .target(name: app.name, path: projectA.path) let stickerPackGraphDependency: GraphDependency = .target(name: stickerPackExtension.name, path: projectA.path) let appExtensionGraphDependency: GraphDependency = .target(name: appExtension.name, path: projectA.path) @@ -968,7 +954,6 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [projectA.path: projectA], - targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -1008,21 +993,16 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { func test_generateAppExtensionsBuildPhase_noBuildPhase_when_appDoesntHaveAppExtensions() throws { // Given let app = Target.test(name: "App", product: .app) - let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = ProjectFileElements() - - let targets: [AbsolutePath: [String: Target]] = [ - project.path: [app.name: app], - ] + let project = Project.test(targets: [app]) let dependencies: [GraphDependency: Set] = [ .target(name: app.name, path: project.path): Set(), ] let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -1045,31 +1025,22 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", destinations: [.iPad, .iPhone, .mac], product: .app) let watchApp = Target.test(name: "WatchApp", platform: .watchOS, product: .watch2App) - let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, watchApp]) - - let targets: [AbsolutePath: [String: Target]] = [ - project.path: [app.name: app, watchApp.name: watchApp], - ] - + let project = Project.test(targets: [app, watchApp]) let appGraphDependency: GraphDependency = .target(name: app.name, path: project.path) let watchAppGraphDependency: GraphDependency = .target(name: watchApp.name, path: project.path) - let dependencies: [GraphDependency: Set] = [ watchAppGraphDependency: Set(), appGraphDependency: Set([watchAppGraphDependency]), ] - let dependencyConditions: [GraphEdge: PlatformCondition] = [ .init(from: appGraphDependency, to: watchAppGraphDependency): .when([.ios])!, ] - let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -1100,14 +1071,10 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", destinations: [.iPhone, .iPad, .mac], product: .app) let watchApp = Target.test(name: "WatchApp", platform: .watchOS, product: .app) - let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, watchApp]) - - let targets: [AbsolutePath: [String: Target]] = [ - project.path: [app.name: app, watchApp.name: watchApp], - ] + let project = Project.test(targets: [app, watchApp]) let appGraphDependency: GraphDependency = .target(name: app.name, path: project.path) let watchAppGraphDependency: GraphDependency = .target(name: watchApp.name, path: project.path) @@ -1123,7 +1090,6 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -1155,14 +1121,10 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", platform: .macOS, product: .app) let xpcService = Target.test(name: "XPCService", platform: .macOS, product: .xpc) - let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, xpcService]) - - let targets: [AbsolutePath: [String: Target]] = [ - project.path: [app.name: app, xpcService.name: xpcService], - ] + let project = Project.test(targets: [app, xpcService]) let dependencies: [GraphDependency: Set] = [ .target(name: xpcService.name, path: project.path): Set(), .target(name: app.name, path: project.path): Set([.target(name: xpcService.name, path: project.path)]), @@ -1170,7 +1132,6 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -1200,14 +1161,10 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", platform: .macOS, product: .app) let systemExtension = Target.test(name: "SystemExtension", platform: .macOS, product: .systemExtension) - let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, systemExtension]) - - let targets: [AbsolutePath: [String: Target]] = [ - project.path: [app.name: app, systemExtension.name: systemExtension], - ] + let project = Project.test(targets: [app, systemExtension]) let dependencies: [GraphDependency: Set] = [ .target(name: systemExtension.name, path: project.path): Set(), .target(name: app.name, path: project.path): Set([.target(name: systemExtension.name, path: project.path)]), @@ -1215,7 +1172,6 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: targets, dependencies: dependencies ) let graphTraverser = GraphTraverser(graph: graph) @@ -1451,17 +1407,12 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { // Given let app = Target.test(name: "App", destinations: [.iPhone, .iPad, .mac], product: .app) let appClip = Target.test(name: "AppClip", product: .appClip) - let project = Project.test() let pbxproj = PBXProj() let nativeTarget = PBXNativeTarget(name: "Test") let fileElements = createProductFileElements(for: [app, appClip]) - - let targets: [AbsolutePath: [String: Target]] = [ - project.path: [app.name: app, appClip.name: appClip], - ] + let project = Project.test(targets: [app, appClip]) let appGraphDependency: GraphDependency = .target(name: app.name, path: project.path) let appClipGraphDependency: GraphDependency = .target(name: appClip.name, path: project.path) - let dependencies: [GraphDependency: Set] = [ appClipGraphDependency: Set(), appGraphDependency: Set([appClipGraphDependency]), @@ -1474,7 +1425,6 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: targets, dependencies: dependencies, dependencyConditions: dependencyConditions ) @@ -1596,13 +1546,7 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { let pbxproj = PBXProj() let pbxTarget = PBXNativeTarget(name: app.name) - let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ - project.path: [ - app.name: app, - macroFramework.name: macroFramework, - macroExecutable.name: macroExecutable, - ], - ], dependencies: [ + let graph = Graph.test(path: project.path, projects: [project.path: project], dependencies: [ .target(name: app.name, path: project.path): Set([.target(name: macroFramework.name, path: project.path)]), .target(name: macroFramework.name, path: project.path): Set([.target( name: macroExecutable.name, diff --git a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift index 33334d55972..8efb4fb0e1d 100644 --- a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift @@ -754,13 +754,7 @@ final class ConfigGeneratorTests: TuistUnitTestCase { let macroExecutable = Target.test(name: "macro", platform: .macOS, product: .macro) let project = Project.test(targets: [app, macroFramework, macroExecutable]) - let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ - project.path: [ - app.name: app, - macroFramework.name: macroFramework, - macroExecutable.name: macroExecutable, - ], - ], dependencies: [ + let graph = Graph.test(path: project.path, projects: [project.path: project], dependencies: [ .target(name: app.name, path: project.path): Set([.target(name: macroFramework.name, path: project.path)]), .target(name: macroFramework.name, path: project.path): Set([.target( name: macroExecutable.name, @@ -806,12 +800,7 @@ final class ConfigGeneratorTests: TuistUnitTestCase { let macroFramework = Target.test(name: "framework", platform: .macOS, product: .staticFramework) let project = Project.test(targets: [app, macroFramework]) - let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ - project.path: [ - app.name: app, - macroFramework.name: macroFramework, - ], - ], dependencies: [ + let graph = Graph.test(path: project.path, projects: [project.path: project], dependencies: [ .target(name: app.name, path: project.path): Set([.target(name: macroFramework.name, path: project.path)]), .target(name: macroFramework.name, path: project.path): Set([]), ]) @@ -850,11 +839,7 @@ final class ConfigGeneratorTests: TuistUnitTestCase { let project = Project.test(targets: [appClip]) - let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ - project.path: [ - appClip.name: appClip, - ], - ]) + let graph = Graph.test(path: project.path, projects: [project.path: project]) let graphTraverser = GraphTraverser(graph: graph) // When @@ -891,11 +876,7 @@ final class ConfigGeneratorTests: TuistUnitTestCase { let project = Project.test(targets: [appClip]) - let graph = Graph.test(path: project.path, projects: [project.path: project], targets: [ - project.path: [ - appClip.name: appClip, - ], - ]) + let graph = Graph.test(path: project.path, projects: [project.path: project]) let graphTraverser = GraphTraverser(graph: graph) // When @@ -1028,13 +1009,12 @@ final class ConfigGeneratorTests: TuistUnitTestCase { ) let target = Target.test(name: "Test", destinations: destinations, product: uiTest ? .uiTests : .unitTests) - let project = Project.test(path: dir, name: "Project", targets: [target]) + let project = Project.test(path: dir, name: "Project", targets: [target, appTarget]) let graph = Graph.test( name: project.name, path: project.path, projects: [project.path: project], - targets: [project.path: [appTarget.name: appTarget, target.name: target]], dependencies: [ GraphDependency .target(name: target.name, path: project.path): Set([.target(name: appTarget.name, path: project.path)]), diff --git a/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift index 67b37f138f1..4d535c50dc6 100644 --- a/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift @@ -830,14 +830,9 @@ final class LinkGeneratorTests: XCTestCase { path: path.appending(components: "XCFrameworks", "StaticLibraryB.xcframework"), linking: .static ) - + let project = Project.test(path: path, targets: [target]) let graph = Graph.test( - projects: [path: .test(path: path)], - targets: [ - path: [ - target.name: target, - ], - ], + projects: [path: project], dependencies: [ .target(name: target.name, path: path): [ xcframeworkA, @@ -889,14 +884,9 @@ final class LinkGeneratorTests: XCTestCase { let path = try AbsolutePath(validating: "/path/") let staticDependency = Target.test(name: "StaticDependency", product: .staticLibrary) let target = Target.test(name: "Dynamic", product: .framework) + let project = Project.test(path: path, targets: [target, staticDependency]) let graph = Graph.test( - projects: [path: .test(path: path)], - targets: [ - path: [ - target.name: target, - staticDependency.name: staticDependency, - ], - ], + projects: [path: project], dependencies: [ .target(name: target.name, path: path): [ .target(name: staticDependency.name, path: path), @@ -931,14 +921,9 @@ final class LinkGeneratorTests: XCTestCase { let path = try AbsolutePath(validating: "/path/") let resourceBundle = Target.test(name: "ResourceBundle", product: .bundle) let target = Target.test(name: "Target", product: .app) + let project = Project.test(path: path, targets: [target, resourceBundle]) let graph = Graph.test( - projects: [path: .test(path: path)], - targets: [ - path: [ - target.name: target, - resourceBundle.name: resourceBundle, - ], - ], + projects: [path: project], dependencies: [ .target(name: target.name, path: path): [ .target(name: resourceBundle.name, path: path), diff --git a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift index d5409c81e72..d7c30c916ed 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift @@ -54,12 +54,6 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - testGraphTarget.target.name: testGraphTarget.target, - appGraphTarget.target.name: appGraphTarget.target, - ], - ], dependencies: [ .target(name: testGraphTarget.target.name, path: testGraphTarget.path): [ .target(name: appGraphTarget.target.name, path: appGraphTarget.path), @@ -93,14 +87,14 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { // Given let temporaryPath = try temporaryPath() + let target = Target.test(name: "A") let project = Project.test( path: temporaryPath, name: "Project", - targets: [.test(dependencies: [.package(product: "A", type: .runtime)])], + targets: [target, .test(name: "B", dependencies: [.package(product: "A", type: .runtime)])], packages: [.remote(url: "A", requirement: .exact("0.1"))] ) - let target = Target.test() let graphTarget = GraphTarget.test(path: project.path, target: target, project: project) let graph = Graph.test( projects: [project.path: project], @@ -109,11 +103,6 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { "A": .remote(url: "A", requirement: .exact("0.1")), ], ], - targets: [ - graphTarget.path: [ - graphTarget.target.name: graphTarget.target, - ], - ], dependencies: [ .target(name: graphTarget.target.name, path: graphTarget.path): [ .packageProduct(path: project.path, product: "A", type: .runtime), @@ -364,15 +353,14 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { // Given let projectPath = try AbsolutePath(validating: "/Project") let localPackagePath = try AbsolutePath(validating: "/LocalPackages/LocalPackageA") + let target = Target.test(name: "A") let project = Project.test( path: projectPath, sourceRootPath: projectPath, name: "Project", - targets: [.test(dependencies: [.package(product: "A", type: .runtime)])], + targets: [target, .test(name: "B", dependencies: [.package(product: "A", type: .runtime)])], packages: [.local(path: localPackagePath)] ) - - let target = Target.test() let graphTarget = GraphTarget(path: project.path, target: target, project: project) let graph = Graph.test( projects: [project.path: project], @@ -381,11 +369,6 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { "A": .local(path: localPackagePath), ], ], - targets: [ - graphTarget.path: [ - graphTarget.target.name: graphTarget.target, - ], - ], dependencies: [ .target(name: graphTarget.target.name, path: graphTarget.path): [ .packageProduct(path: project.path, product: "A", type: .runtime), diff --git a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift index ad5a23bc8a6..445d623b87e 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift @@ -952,11 +952,6 @@ final class ProjectFileElementsTests: TuistUnitTestCase { "A": .remote(url: "url", requirement: .branch("master")), ], ], - targets: [ - graphTarget.path: [ - graphTarget.target.name: graphTarget.target, - ], - ], dependencies: [ .target(name: graphTarget.target.name, path: graphTarget.path): [ .packageProduct(path: project.path, product: "A", type: .runtime), diff --git a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift index c92ac26c8fe..27061540eba 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift @@ -33,8 +33,8 @@ final class ProjectGroupsTests: XCTestCase { settings: .default, filesGroup: .group(name: "Project"), targets: [ - .test(filesGroup: .group(name: "Target")), - .test(), + .test(name: "A", filesGroup: .group(name: "Target")), + .test(name: "B"), ], packages: [], schemes: [], @@ -92,10 +92,10 @@ final class ProjectGroupsTests: XCTestCase { func test_generate_groupsOrder() throws { // Given - let target1 = Target.test(filesGroup: .group(name: "B")) - let target2 = Target.test(filesGroup: .group(name: "C")) - let target3 = Target.test(filesGroup: .group(name: "A")) - let target4 = Target.test(filesGroup: .group(name: "C")) + let target1 = Target.test(name: "Target1", filesGroup: .group(name: "B")) + let target2 = Target.test(name: "Target2", filesGroup: .group(name: "C")) + let target3 = Target.test(name: "Target3", filesGroup: .group(name: "A")) + let target4 = Target.test(name: "Target4", filesGroup: .group(name: "C")) let project = Project.test( filesGroup: .group(name: "P"), targets: [target1, target2, target3, target4] @@ -108,15 +108,15 @@ final class ProjectGroupsTests: XCTestCase { ) // Then - let paths = subject.sortedMain.children.map(\.nameOrPath) + let paths = subject.sortedMain.children.map(\.nameOrPath).sorted() XCTAssertEqual(paths, [ - "P", + "A", "B", "C", - "A", - "Products", - "Frameworks", "Cache", + "Frameworks", + "P", + "Products", ]) } @@ -191,9 +191,9 @@ final class ProjectGroupsTests: XCTestCase { func test_projectGroup_knownProjectGroups() throws { // Given - let target1 = Target.test(filesGroup: .group(name: "A")) - let target2 = Target.test(filesGroup: .group(name: "B")) - let target3 = Target.test(filesGroup: .group(name: "B")) + let target1 = Target.test(name: "1", filesGroup: .group(name: "A")) + let target2 = Target.test(name: "2", filesGroup: .group(name: "B")) + let target3 = Target.test(name: "3", filesGroup: .group(name: "B")) let project = Project.test( path: .root, sourceRootPath: .root, diff --git a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift index ff174692a33..28c4c438f8d 100644 --- a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift @@ -37,15 +37,11 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test( path: projectPath, - xcodeProjPath: xcodeProjPath + xcodeProjPath: xcodeProjPath, + targets: targets ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -86,15 +82,11 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test( path: projectPath, - xcodeProjPath: xcodeProjPath + xcodeProjPath: xcodeProjPath, + targets: targets ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -143,24 +135,18 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let projectA = Project.test( path: projectAPath, - xcodeProjPath: xcodeProjAPath + xcodeProjPath: xcodeProjAPath, + targets: [frameworkA] ) let projectB = Project.test( path: projectBPath, - xcodeProjPath: xcodeProjBPath + xcodeProjPath: xcodeProjBPath, + targets: [frameworkB] ) let graph = Graph.test( projects: [ projectA.path: projectA, projectB.path: projectB, - ], - targets: [ - projectA.path: [ - frameworkA.name: frameworkA, - ], - projectB.path: [ - frameworkB.name: frameworkB, - ], ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -233,12 +219,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -293,7 +274,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { ) ) let project = Project.test(schemes: [schemeA, schemeB]) - let generatedProject = generatedProject(targets: project.targets) + let generatedProject = generatedProject(targets: Array(project.targets.values)) let graph = Graph.test(projects: [project.path: project]) let graphTraverser = GraphTraverser(graph: graph) @@ -339,12 +320,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -390,12 +366,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -448,12 +418,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -508,12 +472,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - framework.name: framework, - ], - ], dependencies: [ .target(name: app.name, path: projectPath): [ .target(name: framework.name, path: projectPath), @@ -560,12 +518,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - framework.name: framework, - ], - ], dependencies: [ .target(name: app.name, path: projectPath): [ .target(name: framework.name, path: projectPath), @@ -615,12 +567,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [target, testTarget]) let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -749,12 +695,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let scheme = Scheme.test(name: "AppTests", shared: true, buildAction: buildAction, testAction: testAction) let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -798,12 +738,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -844,12 +778,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [target, testTarget]) let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -886,12 +814,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -960,12 +882,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let generatedProjects = createGeneratedProjects(projects: [project]) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - testTarget.name: testTarget, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1026,12 +943,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - testTarget.name: testTarget, - ], - ], dependencies: [ .target(name: testTarget.name, path: project.path): [ .target(name: target.name, path: project.path), @@ -1116,12 +1027,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { path: workspacePath, xcWorkspacePath: workspacePath.appending(component: "Workspace.xcworkspace") ), - projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1193,12 +1099,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [app]) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1239,12 +1140,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let scheme = Scheme.test(name: "Library", buildAction: buildAction, runAction: launchAction) let project = Project.test(path: projectPath, targets: [target]) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1285,12 +1181,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1350,12 +1241,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1396,12 +1282,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [app] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1431,12 +1312,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [app] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1475,12 +1351,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - appExtension.name: appExtension, - ], - ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: appExtension.name, path: project.path), @@ -1529,12 +1399,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - appExtension.name: appExtension, - ], - ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: appExtension.name, path: project.path), @@ -1570,12 +1434,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1635,12 +1494,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1687,12 +1541,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1752,12 +1601,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1820,12 +1664,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { targets: [target] ) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1858,12 +1697,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [target]) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1900,12 +1734,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let project = Project.test(path: projectPath, targets: [target]) let graph = Graph.test( - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -1935,14 +1764,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - framework.name: framework, - unitTests.name: unitTests, - uiTests.name: uiTests, - ], - ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: framework.name, path: project.path), @@ -1960,7 +1781,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { // When let result = try subject.generateProjectSchemes( project: project, - generatedProject: generatedProject(targets: project.targets), + generatedProject: generatedProject(targets: Array(project.targets.values)), graphTraverser: graphTraverser ) @@ -1991,12 +1812,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - app.name: app, - appExtension.name: appExtension, - ], - ], dependencies: [ .target(name: app.name, path: project.path): [ .target(name: appExtension.name, path: project.path), @@ -2008,7 +1823,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { // When let result = try subject.generateProjectSchemes( project: project, - generatedProject: generatedProject(targets: project.targets), + generatedProject: generatedProject(targets: Array(project.targets.values)), graphTraverser: graphTraverser ) @@ -2038,11 +1853,10 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { path: project.path, workspace: workspace, projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [:] ) let graphTraverser = GraphTraverser(graph: graph) - let generatedProject = generatedProject(targets: project.targets) + let generatedProject = generatedProject(targets: Array(project.targets.values)) // When let result = try subject.generateWorkspaceSchemes( @@ -2069,7 +1883,6 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [:] ) let graphTraverser = GraphTraverser(graph: graph) @@ -2077,7 +1890,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { // When let result = try subject.generateProjectSchemes( project: project, - generatedProject: generatedProject(targets: project.targets), + generatedProject: generatedProject(targets: Array(project.targets.values)), graphTraverser: graphTraverser ) @@ -2094,7 +1907,7 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { ( $0.xcodeProjPath, generatedProject( - targets: $0.targets, + targets: Array($0.targets.values), projectPath: $0.xcodeProjPath.pathString ) ) diff --git a/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift index c0e30ff371b..5c4947c95cc 100644 --- a/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift @@ -116,18 +116,12 @@ final class TargetGeneratorTests: XCTestCase { destinations: [.mac, .iPhone] ) let targetC = Target.test(name: "TargetC") + let project: Project = .test(path: path, targets: [targetA, targetB, targetC]) let nativeTargetA = createNativeTarget(for: targetA) let nativeTargetB = createNativeTarget(for: targetB) let nativeTargetC = createNativeTarget(for: targetC) let graph = Graph.test( - projects: [path: .test(path: path)], - targets: [ - path: [ - targetA.name: targetA, - targetB.name: targetB, - targetC.name: targetC, - ], - ], + projects: [path: project], dependencies: [ .target(name: targetA.name, path: path): [ .target(name: targetB.name, path: path), diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift index c4048ea4e89..7c5ab6a921a 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift @@ -104,12 +104,7 @@ final class WorkspaceDescriptorGeneratorTests: TuistUnitTestCase { let graph = Graph.test( workspace: workspace, - projects: [project.path: project], - targets: [ - project.path: [ - target.name: target, - ], - ] + projects: [project.path: project] ) let graphTraverser = GraphTraverser(graph: graph) diff --git a/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift b/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift index 13b6d454e3a..a3a6e34255f 100644 --- a/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift +++ b/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift @@ -5,6 +5,7 @@ import TuistCore import TuistGraph import TuistGraphTesting import XCTest + @testable import TuistGenerator @testable import TuistSupportTesting @@ -195,34 +196,40 @@ final class GraphToGraphVizMapperTests: XCTestCase { } private func makeGivenGraph() throws -> TuistGraph.Graph { - let project = Project.test(path: "/") - let coreProject = Project.test(path: "/Core") - let externalProject = Project.test(path: "/Tuist/Dependencies", isExternal: true) let framework = GraphDependency.testFramework(path: try AbsolutePath(validating: "/XcodeProj.framework")) let library = GraphDependency.testLibrary(path: try AbsolutePath(validating: "/RxSwift.a")) let sdk = GraphDependency.testSDK(name: "CoreData.framework", status: .required, source: .developer) - + let projectPath: AbsolutePath = "/" + let coreProjectPath: AbsolutePath = "/Core" + let externalProjectPath: AbsolutePath = "/Tuist/Dependencies" + let coreTarget = Target.test(name: "Core") let core = GraphTarget.test( - path: coreProject.path, - target: Target.test(name: "Core") + path: coreProjectPath, + target: coreTarget ) let coreDependency = GraphDependency.target(name: core.target.name, path: core.path) + let coreTestsTarget = Target.test( + name: "CoreTests", + product: .unitTests + ) let coreTests = GraphTarget.test( - path: coreProject.path, - target: Target.test( - name: "CoreTests", - product: .unitTests - ) + path: coreProjectPath, + target: coreTestsTarget ) - - let iOSApp = GraphTarget.test(target: Target.test(name: "Tuist iOS")) - let watchApp = GraphTarget.test(target: Target.test( + let iOSAppTarget = Target.test(name: "Tuist iOS") + let iOSApp = GraphTarget.test(target: iOSAppTarget) + let watchAppTarget = Target.test( name: "Tuist watchOS", platform: .watchOS, deploymentTarget: .watchOS("6") - )) + ) + let watchApp = GraphTarget.test(target: watchAppTarget) - let externalTarget = GraphTarget.test(path: externalProject.path, target: Target.test(name: "External dependency")) + let externalTargetTarget = Target.test(name: "External dependency") + let externalTarget = GraphTarget.test(path: externalProjectPath, target: externalTargetTarget) + let project = Project.test(path: projectPath, targets: [iOSAppTarget, watchAppTarget]) + let coreProject = Project.test(path: coreProjectPath, targets: [coreTarget, coreTestsTarget]) + let externalProject = Project.test(path: "/Tuist/Dependencies", targets: [externalTargetTarget], isExternal: true) let externalDependency = GraphDependency.target(name: externalTarget.target.name, path: externalTarget.path) let graph = TuistGraph.Graph.test( @@ -231,19 +238,6 @@ final class GraphToGraphVizMapperTests: XCTestCase { coreProject.path: coreProject, externalProject.path: externalProject, ], - targets: [ - project.path: [ - iOSApp.target.name: iOSApp.target, - watchApp.target.name: watchApp.target, - ], - coreProject.path: [ - core.target.name: core.target, - coreTests.target.name: coreTests.target, - ], - externalProject.path: [ - externalTarget.target.name: externalTarget.target, - ], - ], dependencies: [ .target(name: core.target.name, path: core.path): [ framework, diff --git a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift index b8ae396bb27..d4d09b0eb07 100644 --- a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift @@ -137,12 +137,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - appTarget.name: appTarget, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticLibrary.name: staticLibrary, - ]], dependencies: dependencies ) let config = Config.test() @@ -184,12 +178,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - appTarget.name: appTarget, - staticLibraryA.name: staticLibraryA, - staticLibraryB.name: staticLibraryB, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -234,12 +222,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - appTarget.name: appTarget, - messagesExtension.name: messagesExtension, - staticFramework.name: staticFramework, - staticLibrary.name: staticLibrary, - ]], dependencies: dependencies ) let config = Config.test() @@ -267,10 +249,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - bundle.name: bundle, - framework.name: framework, - ]], dependencies: dependencies ) let config = Config.test() @@ -298,10 +276,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - bundle.name: bundle, - application.name: application, - ]], dependencies: dependencies ) let config = Config.test() @@ -341,13 +315,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - xpc.name: xpc, - dynamicFramework.name: dynamicFramework, - dynamicLibrary.name: dynamicLibrary, - staticFramework.name: staticFramework, - staticLibrary.name: staticLibrary, - ]], dependencies: dependencies ) let config = Config.test() @@ -377,11 +344,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - bundle.name: bundle, - unitTests.name: unitTests, - uiTests.name: uiTests, - ]], dependencies: dependencies ) let config = Config.test() @@ -411,11 +373,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - staticFramework.name: staticFramework, - staticLibrary.name: staticLibrary, - dynamicFramework.name: dynamicFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -434,7 +391,7 @@ final class GraphLinterTests: TuistUnitTestCase { let macStaticFramework = Target.empty(name: "MacStaticFramework", destinations: .macOS, product: .staticFramework) let iosStaticFramework = Target.empty(name: "iOSStaticFramework", destinations: .iOS, product: .staticFramework) let iosStaticLibrary = Target.empty(name: "iOSStaticLibrary", destinations: .iOS, product: .staticLibrary) - let project = Project.empty(path: path) + let project = Project.empty(path: path, targets: [macStaticFramework, iosStaticLibrary, iosStaticFramework]) let dependencies: [GraphDependency: Set] = [ .target( @@ -451,11 +408,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - macStaticFramework.name: macStaticFramework, - iosStaticFramework.name: iosStaticFramework, - iosStaticLibrary.name: iosStaticLibrary, - ]], dependencies: dependencies ) let config = Config.test() @@ -483,10 +435,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - watchExtension.name: watchExtension, - watchApp.name: watchApp, - ]], dependencies: dependencies ) let config = Config.test() @@ -504,7 +452,7 @@ final class GraphLinterTests: TuistUnitTestCase { let path: AbsolutePath = "/project" let invalidDependency = Target.empty(name: "Framework", destinations: .watchOS, product: .framework) let watchApp = Target.empty(name: "WatchApp", destinations: .watchOS, product: .watch2App) - let project = Project.empty(path: path) + let project = Project.empty(path: path, targets: [invalidDependency, watchApp]) let dependencies: [GraphDependency: Set] = [ .target(name: watchApp.name, path: path): Set([.target(name: invalidDependency.name, path: path)]), @@ -514,10 +462,6 @@ final class GraphLinterTests: TuistUnitTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - invalidDependency.name: invalidDependency, - watchApp.name: watchApp, - ]], dependencies: dependencies ) let config = Config.test() @@ -555,7 +499,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [watchApp.name: watchApp, watchAppTests.name: watchAppTests]], dependencies: dependencies ) let config = Config.test() @@ -593,7 +536,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [staticLibrary.name: staticLibrary, watchAppTests.name: watchAppTests]], dependencies: dependencies ) let config = Config.test() @@ -631,7 +573,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [framework.name: framework, watchAppTests.name: watchAppTests]], dependencies: dependencies ) let config = Config.test() @@ -669,7 +610,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [staticFramework.name: staticFramework, watchAppTests.name: watchAppTests]], dependencies: dependencies ) let config = Config.test() @@ -722,13 +662,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [ - path: [ - watchApplication.name: watchApplication, - staticFramework.name: staticFramework, - dynamicFramework.name: dynamicFramework, - ], - ], dependencies: dependencies ) let config = Config.test() @@ -773,12 +706,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [ - path: [ - watchApplication.name: watchApplication, - widgetExtension.name: widgetExtension, - ], - ], dependencies: dependencies ) let config = Config.test() @@ -820,12 +747,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [ - path: [ - app.name: app, - watchApplication.name: watchApplication, - ], - ], dependencies: dependencies ) let config = Config.test() @@ -880,11 +801,6 @@ final class GraphLinterTests: TuistUnitTestCase { projectBPath: projectB, projectCPath: projectC, ], - targets: [ - projectAPath: [targetA.name: targetA], - projectBPath: [targetB.name: targetB], - projectCPath: [targetC.name: targetC], - ], dependencies: dependencies ) let config = Config.test() @@ -955,11 +871,6 @@ final class GraphLinterTests: TuistUnitTestCase { projectBPath: projectB, projectCPath: projectC, ], - targets: [ - projectAPath: [targetA.name: targetA], - projectBPath: [targetB.name: targetB], - projectCPath: [targetC.name: targetC], - ], dependencies: dependencies ) let config = Config.test() @@ -1032,11 +943,6 @@ final class GraphLinterTests: TuistUnitTestCase { projectBPath: projectB, projectCPath: projectC, ], - targets: [ - projectAPath: [targetA.name: targetA], - projectBPath: [targetB.name: targetB], - projectCPath: [targetC.name: targetC], - ], dependencies: dependencies ) let config = Config.test() @@ -1081,7 +987,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [app.name: app, watchApp.name: watchApp, watchExtension.name: watchExtension]], dependencies: dependencies ) let config = Config.test() @@ -1126,7 +1031,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [app.name: app, watchApp.name: watchApp, watchExtension.name: watchExtension]], dependencies: dependencies ) let config = Config.test() @@ -1180,7 +1084,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: temporaryPath, workspace: Workspace.test(projects: [temporaryPath]), projects: [temporaryPath: project], - targets: [temporaryPath: [app.name: app, appClip.name: appClip]], dependencies: dependencies ) let config = Config.test() @@ -1226,7 +1129,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: temporaryPath, workspace: Workspace.test(projects: [temporaryPath]), projects: [temporaryPath: project], - targets: [temporaryPath: [app.name: app, appClip.name: appClip]], dependencies: dependencies ) let config = Config.test() @@ -1269,7 +1171,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [app.name: app, appClip.name: appClip]], dependencies: dependencies ) let config = Config.test() @@ -1313,7 +1214,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [app.name: app, appClip.name: appClip]], dependencies: dependencies ) let config = Config.test() @@ -1380,7 +1280,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: temporaryPath, workspace: Workspace.test(projects: [temporaryPath]), projects: [temporaryPath: project], - targets: [temporaryPath: [app.name: app, appClip1.name: appClip1, appClip2.name: appClip2]], dependencies: dependencies ) let config = Config.test() @@ -1434,7 +1333,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: temporaryPath, workspace: Workspace.test(projects: [temporaryPath]), projects: [temporaryPath: project], - targets: [temporaryPath: [app.name: app, appClip.name: appClip, framework.name: framework]], dependencies: dependencies ) let config = Config.test() @@ -1474,7 +1372,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [tool.name: tool, dynamic.name: dynamic]], dependencies: dependencies ) let config = Config.test() @@ -1514,7 +1411,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [tool.name: tool, dynamic.name: dynamic]], dependencies: dependencies ) let config = Config.test() @@ -1565,7 +1461,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [path: [tool.name: tool, staticFmwk.name: staticFmwk, staticLib.name: staticLib]], dependencies: dependencies ) let config = Config.test() @@ -1605,10 +1500,6 @@ final class GraphLinterTests: TuistUnitTestCase { path: path, workspace: Workspace.test(projects: [path]), projects: [path: project], - targets: [ - path: [appTarget.name: appTarget], - frameworks1.path: [frameworkA.name: frameworkA, frameworkB.name: frameworkB], - ], dependencies: dependencies ) let config = Config.test() @@ -1644,17 +1535,6 @@ final class GraphLinterTests: TuistUnitTestCase { projects: [ project.path: project, ], - targets: [ - project.path: [ - appTarget.name: appTarget, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - frameworkD.name: frameworkD, - frameworkE.name: frameworkE, - frameworkF.name: frameworkF, - ], - ], dependencies: [:] ) let config = Config.test() @@ -1726,13 +1606,7 @@ final class GraphLinterTests: TuistUnitTestCase { autogeneratedWorkspaceSchemes: .enabled(codeCoverageMode: .relevant, testingOptions: []) ) ), - projects: [temporaryPath: project], - targets: [ - temporaryPath: [ - "TargetA": targetA, - "TargetB": targetB, - ], - ] + projects: [temporaryPath: project] ) let config = Config.test() let graphTraverser = GraphTraverser(graph: graph) @@ -1789,13 +1663,7 @@ final class GraphLinterTests: TuistUnitTestCase { ) ) ), - projects: [temporaryPath: project], - targets: [ - temporaryPath: [ - "TargetA": .test(), - "TargetB": .test(), - ], - ] + projects: [temporaryPath: project] ) let config = Config.test() let graphTraverser = GraphTraverser(graph: graph) @@ -1852,13 +1720,7 @@ final class GraphLinterTests: TuistUnitTestCase { ) ) ), - projects: [temporaryPath: project], - targets: [ - temporaryPath: [ - "TargetB": .test(), - "TargetC": .test(), - ], - ] + projects: [temporaryPath: project] ) let config = Config.test() let graphTraverser = GraphTraverser(graph: graph) @@ -1893,12 +1755,6 @@ final class GraphLinterTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [path: project], - targets: [ - path: [ - iOSAndMacTarget.name: iOSAndMacTarget, - macOnlyTarget.name: macOnlyTarget, - ], - ], dependencies: [ .target(name: iOSAndMacTarget.name, path: path): [ .target(name: macOnlyTarget.name, path: path), @@ -1937,12 +1793,6 @@ final class GraphLinterTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [path: project], - targets: [ - path: [ - iOSAndMacTarget.name: iOSAndMacTarget, - watchOnlyTarget.name: watchOnlyTarget, - ], - ], dependencies: [ .target(name: iOSAndMacTarget.name, path: path): [ .target(name: watchOnlyTarget.name, path: path), @@ -1985,14 +1835,6 @@ final class GraphLinterTests: TuistUnitTestCase { ) let graph = Graph.test( projects: [path: project], - targets: [ - path: [ - iOSAndMacTarget.name: iOSAndMacTarget, - iOSOnlyTarget.name: iOSOnlyTarget, - iOSApp.name: iOSApp, - watchApp.name: watchApp, - ], - ], dependencies: [ .target(name: iOSAndMacTarget.name, path: path): [ .target(name: iOSOnlyTarget.name, path: path), diff --git a/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift b/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift index dd75e01f7a1..a3fa87f7f90 100644 --- a/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift @@ -39,19 +39,6 @@ final class ProjectLinterTests: XCTestCase { super.tearDown() } - func test_validate_when_there_are_duplicated_targets() throws { - let target = Target.test(name: "A") - let project = Project.test(targets: [target, target]) - let got = subject.lint(project) - XCTAssertTrue( - got - .contains(LintingIssue( - reason: "Targets A from project at \(project.path.pathString) have duplicates.", - severity: .error - )) - ) - } - func test_lint_valid_watchTargetBundleIdentifiers() throws { // Given let app = Target.test(name: "App", product: .app, bundleId: "app") diff --git a/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift index 58c9a59935b..aaa581046dc 100644 --- a/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift @@ -26,7 +26,7 @@ class StaticProductsGraphLinterTests: XCTestCase { let path: AbsolutePath = "/project" let app = Target.test(name: "App") let framework = Target.test(name: "Framework", product: .framework) - let project = Project.test(path: "/tmp/app", name: "AppProject") + let project = Project.test(path: "/tmp/app", name: "AppProject", targets: [app, framework]) let package = Package.remote(url: "https://test.tuist.io", requirement: .branch("main")) let appDependency = GraphDependency.target(name: app.name, path: path) let frameworkDependency = GraphDependency.target(name: framework.name, path: path) @@ -40,10 +40,6 @@ class StaticProductsGraphLinterTests: XCTestCase { path: path, projects: [path: project], packages: [path: ["Package": package]], - targets: [path: [ - app.name: app, - framework.name: framework, - ]], dependencies: dependencies ) let config = Config.test() @@ -63,7 +59,7 @@ class StaticProductsGraphLinterTests: XCTestCase { let path: AbsolutePath = "/project" let app = Target.test(name: "App") let framework = Target.test(name: "Framework", product: .framework) - let project = Project.test(path: "/tmp/app", name: "AppProject") + let project = Project.test(path: "/tmp/app", name: "AppProject", targets: [app, framework]) let package = Package.remote(url: "https://test.tuist.io", requirement: .branch("main")) let appDependency = GraphDependency.target(name: app.name, path: path) let frameworkDependency = GraphDependency.target(name: framework.name, path: path) @@ -78,10 +74,6 @@ class StaticProductsGraphLinterTests: XCTestCase { path: path, projects: [path: project], packages: [path: ["Package": package]], - targets: [path: [ - app.name: app, - framework.name: framework, - ]], dependencies: dependencies ) let config = Config.test() @@ -116,10 +108,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - framework.name: framework, - ]], dependencies: dependencies ) let config = Config.test() @@ -154,11 +142,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - framework.name: framework, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -206,15 +189,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - ]], dependencies: dependencies ) let config = Config.test() @@ -262,15 +236,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - ]], dependencies: dependencies ) let config = Config.test() @@ -294,7 +259,7 @@ class StaticProductsGraphLinterTests: XCTestCase { let frameworkB = Target.test(name: "FrameworkB", product: .framework) let frameworkC = Target.test(name: "FrameworkC", product: .framework) let frameworkD = Target.test(name: "FrameworkD", product: .framework) - let project = Project.test(targets: [app, frameworkA, frameworkB, frameworkC, staticFrameworkA]) + let project = Project.test(targets: [app, frameworkA, frameworkB, frameworkC, frameworkD, staticFrameworkA]) let appDependency = GraphDependency.target(name: app.name, path: path) let staticFrameworkAdependency = GraphDependency.target(name: staticFrameworkA.name, path: path) @@ -314,14 +279,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - staticFrameworkA.name: staticFrameworkA, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - frameworkD.name: frameworkD, - ]], dependencies: dependencies ) let config = Config.test() @@ -357,11 +314,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - staticFramework.name: staticFramework, - framework.name: framework, - ]], dependencies: dependencies ) let config = Config.test() @@ -407,15 +359,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - ]], dependencies: dependencies ) let config = Config.test() @@ -448,11 +391,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - staticFramework.name: staticFramework, - frameworkTests.name: frameworkTests, - ]], dependencies: dependencies ) let config = Config.test() @@ -472,7 +410,7 @@ class StaticProductsGraphLinterTests: XCTestCase { let framework = Target.test(name: "Framework", product: .framework) let staticFramework = Target.test(name: "StaticFramework", product: .staticFramework) let frameworkTests = Target.test(name: "FrameworkTests", product: .unitTests) - let project = Project.test(targets: [app, staticFramework, frameworkTests]) + let project = Project.test(targets: [app, framework, staticFramework, frameworkTests]) let appDependency = GraphDependency.target(name: app.name, path: path) let frameworkDependency = GraphDependency.target(name: framework.name, path: path) @@ -488,12 +426,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - framework.name: framework, - staticFramework.name: staticFramework, - frameworkTests.name: frameworkTests, - ]], dependencies: dependencies ) let config = Config.test() @@ -528,11 +460,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appTestsTarget.name: appTestsTarget, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -613,21 +540,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appTests.name: appTests, - appUITests.name: appUITests, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - frameworkTests.name: frameworkTests, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - staticFrameworkATests.name: staticFrameworkATests, - staticFrameworkBTests.name: staticFrameworkBTests, - staticFrameworkCTests.name: staticFrameworkCTests, - ]], dependencies: dependencies ) let config = Config.test() @@ -660,11 +572,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - appClip.name: appClip, - appClipTestsTarget.name: appClipTestsTarget, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -729,17 +636,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appTests.name: appTests, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - frameworkTests.name: frameworkTests, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - ]], dependencies: dependencies ) let config = Config.test() @@ -782,13 +678,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appTests.name: appTests, - appUITests.name: appUITests, - frameworkA.name: frameworkA, - staticFrameworkA.name: staticFrameworkA, - ]], dependencies: dependencies ) let config = Config.test() @@ -827,12 +716,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appUITests.name: appUITests, - frameworkA.name: frameworkA, - staticFrameworkA.name: staticFrameworkA, - ]], dependencies: dependencies ) let config = Config.test() @@ -873,12 +756,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appUITests.name: appUITests, - frameworkA.name: frameworkA, - staticFrameworkA.name: staticFrameworkA, - ]], dependencies: dependencies ) let config = Config.test() @@ -918,12 +795,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appUITests.name: appUITests, - frameworkA.name: frameworkA, - staticFrameworkA.name: staticFrameworkA, - ]], dependencies: dependencies ) let config = Config.test() @@ -960,11 +831,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appExtension.name: appExtension, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -1001,12 +867,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appExtension.name: appExtension, - staticFramework.name: staticFramework, - framework.name: framework, - ]], dependencies: dependencies ) let config = Config.test() @@ -1042,11 +902,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appClip.name: appClip, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -1083,12 +938,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - appClip.name: appClip, - framework.name: framework, - staticFramework.name: staticFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -1126,11 +975,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - watchApp.name: watchApp, - watchAppExtension.name: watchAppExtension, - ]], dependencies: dependencies ) let config = Config.test() @@ -1169,12 +1013,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - watchApp.name: watchApp, - watchAppExtension.name: watchAppExtension, - watchFramework.name: watchFramework, - ]], dependencies: dependencies ) let config = Config.test() @@ -1222,15 +1060,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - staticFrameworkA.name: staticFrameworkA, - staticFrameworkB.name: staticFrameworkB, - staticFrameworkC.name: staticFrameworkC, - frameworkA.name: frameworkA, - frameworkB.name: frameworkB, - frameworkC.name: frameworkC, - ]], dependencies: dependencies ) let config = Config @@ -1271,12 +1100,6 @@ class StaticProductsGraphLinterTests: XCTestCase { let graph = Graph.test( path: path, projects: [path: project], - targets: [path: [ - app.name: app, - macroStaticFramework.name: macroStaticFramework, - macroExecutable.name: macroExecutable, - swiftSyntax.name: swiftSyntax, - ]], dependencies: dependencies ) let config = Config.test() diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift index d1bae6363bc..b50d26df813 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift @@ -68,15 +68,6 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { isExternal: true ), ], - targets: [ - projectAPath: [ - "FrameworkA": frameworkA, - "DynamicLibraryB": dynamicLibraryB, - ], - externalProjectBPath: [ - "ExternalFrameworkC": externalFrameworkC, - ], - ], dependencies: [ .target(name: "FrameworkA", path: projectAPath): [ .target(name: "DynamicLibraryB", path: projectAPath), @@ -98,8 +89,10 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { """ // Then + let gotAProject = try XCTUnwrap(got.0.projects[projectAPath]) + let gotATargets = Array(gotAProject.targets.values).sorted() XCTAssertEqual( - got.0.projects[projectAPath]?.targets[0], + gotATargets[0], .test( name: "App", product: .app, @@ -108,7 +101,7 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { ] ) ) - let gotFrameworkA = try XCTUnwrap(got.0.projects[projectAPath]?.targets[1]) + let gotFrameworkA = try XCTUnwrap(gotATargets[2]) XCTAssertEqual( gotFrameworkA.name, "FrameworkA" @@ -169,8 +162,9 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { .project(target: "ExternalFrameworkC", path: externalProjectBPath), ] ) + XCTAssertEqual( - got.0.projects[projectAPath]?.targets[2], + gotATargets[1], .test( name: "DynamicLibraryB", product: .dynamicLibrary, @@ -206,8 +200,10 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { ] ) ) + let gotExternalBProject = try XCTUnwrap(got.0.projects[externalProjectBPath]) + let gotExternalBTargets = Array(gotExternalBProject.targets.values) XCTAssertEqual( - got.0.projects[externalProjectBPath]?.targets, + gotExternalBTargets, [ .test( name: "ExternalFrameworkC", @@ -281,14 +277,6 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { isExternal: true ), ], - targets: [ - projectAPath: [ - "FrameworkA": frameworkA, - ], - externalProjectBPath: [ - "ExternalFrameworkB": externalFrameworkB, - ], - ], dependencies: [ .target(name: "FrameworkA", path: projectAPath): [ .target(name: "ExternalFrameworkB", path: externalProjectBPath), @@ -300,7 +288,9 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { let got = try await subject.map(graph: graph) // Then - let gotFrameworkA = try XCTUnwrap(got.0.projects[projectAPath]?.targets[0]) + let gotAProject = try XCTUnwrap(got.0.projects[projectAPath]) + let gotATargets = Array(gotAProject.targets.values).sorted() + let gotFrameworkA = try XCTUnwrap(gotATargets[0]) XCTAssertEqual( gotFrameworkA.name, "FrameworkA" diff --git a/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift index 78f483afda6..104fe4afc51 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift @@ -95,7 +95,7 @@ public final class GenerateInfoPlistProjectMapperTests: TuistUnitTestCase { file: StaticString = #file, line: UInt = #line ) { - XCTAssertNotNil(project.targets.first(where: { (target: Target) in + XCTAssertNotNil(project.targets.values.first(where: { (target: Target) in target.infoPlist?.path == project.path .appending(component: Constants.DerivedDirectory.name) .appending(component: Constants.DerivedDirectory.infoPlists) diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift index 59208d00a5d..d827fc205f8 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift @@ -77,15 +77,6 @@ final class ModuleMapMapperTests: TuistUnitTestCase { projectAPath: projectA, projectBPath: projectB, ], - targets: [ - projectAPath: [ - targetA.name: targetA, - ], - projectBPath: [ - targetB1.name: targetB1, - targetB2.name: targetB2, - ], - ], dependencies: [ .target(name: targetA.name, path: projectAPath): [ .target(name: targetB1.name, path: projectBPath), @@ -162,15 +153,6 @@ final class ModuleMapMapperTests: TuistUnitTestCase { projectAPath: mappedProjectA, projectBPath: mappedProjectB, ], - targets: [ - projectAPath: [ - mappedTargetA.name: mappedTargetA, - ], - projectBPath: [ - mappedTargetB1.name: mappedTargetB1, - mappedTargetB2.name: mappedTargetB2, - ], - ], dependencies: [ .target(name: targetA.name, path: projectAPath): [ .target(name: targetB1.name, path: projectBPath), @@ -229,14 +211,6 @@ final class ModuleMapMapperTests: TuistUnitTestCase { projectAPath: projectA, projectBPath: projectB, ], - targets: [ - projectAPath: [ - targetA.name: targetA, - ], - projectBPath: [ - targetB.name: targetB, - ], - ], dependencies: [ .target(name: targetA.name, path: projectAPath): [ .target(name: targetB.name, path: projectBPath), @@ -299,14 +273,6 @@ final class ModuleMapMapperTests: TuistUnitTestCase { projectAPath: mappedProjectA, projectBPath: mappedProjectB, ], - targets: [ - projectAPath: [ - mappedTargetA.name: mappedTargetA, - ], - projectBPath: [ - mappedTargetB.name: mappedTargetB, - ], - ], dependencies: [ .target(name: projectA.name, path: projectAPath): [ .target(name: projectB.name, path: projectBPath), diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index a337b0e7f80..820cdd61d2d 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -57,7 +57,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then: Targets XCTAssertEqual(gotProject.targets.count, 2) - let gotTarget = try XCTUnwrap(gotProject.targets.first) + let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.resources.count, 0) @@ -70,7 +70,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { TargetDependency.target(name: "\(project.name)_\(target.name)", condition: .when([.ios])) ) - let resourcesTarget = try XCTUnwrap(gotProject.targets.last) + let resourcesTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) XCTAssertEqual(resourcesTarget.name, "\(project.name)_\(target.name)") XCTAssertEqual(resourcesTarget.product, .bundle) XCTAssertEqual(resourcesTarget.destinations, target.destinations) @@ -117,7 +117,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { XCTAssertEqual(gotSideEffects, []) XCTAssertEqual(gotProject.targets.count, 2) - let gotTarget = try XCTUnwrap(gotProject.targets.first) + let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.resources.count, 0) @@ -128,7 +128,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { TargetDependency.target(name: "\(project.name)_\(target.name)", condition: .when([.ios])) ) - let resourcesTarget = try XCTUnwrap(gotProject.targets.last) + let resourcesTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) XCTAssertEqual(resourcesTarget.name, "\(project.name)_\(target.name)") XCTAssertEqual(resourcesTarget.product, .bundle) XCTAssertEqual(resourcesTarget.destinations, target.destinations) @@ -167,7 +167,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then: Targets XCTAssertEqual(gotProject.targets.count, 2) - let gotTarget = try XCTUnwrap(gotProject.targets.first) + let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.resources.count, 0) @@ -180,7 +180,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { TargetDependency.target(name: "\(project.name)_\(target.name)", condition: .when([.ios])) ) - let resourcesTarget = try XCTUnwrap(gotProject.targets.last) + let resourcesTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) XCTAssertEqual(resourcesTarget.name, "\(project.name)_\(target.name)") XCTAssertEqual(resourcesTarget.product, .bundle) XCTAssertEqual(resourcesTarget.destinations, target.destinations) @@ -217,7 +217,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then: Targets XCTAssertEqual(gotProject.targets.count, 1) - let gotTarget = try XCTUnwrap(gotProject.targets.first) + let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.resources.resources, resources) @@ -255,7 +255,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then: Targets XCTAssertEqual(gotProject.targets.count, 1) - let gotTarget = try XCTUnwrap(gotProject.targets.first) + let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().first) XCTAssertEqual(gotTarget.name, target.name) XCTAssertEqual(gotTarget.product, target.product) XCTAssertEqual(gotTarget.coreDataModels, coreDataModels) @@ -275,7 +275,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(gotProject.targets, [target]) + XCTAssertEqual(Array(gotProject.targets.values), [target]) XCTAssertEmpty(gotSideEffects) } @@ -292,7 +292,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(gotProject.targets, [target]) + XCTAssertEqual(Array(gotProject.targets.values), [target]) XCTAssertEmpty(gotSideEffects) } @@ -338,7 +338,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(gotProject.targets, [target]) + XCTAssertEqual(Array(gotProject.targets.values), [target]) XCTAssertEmpty(gotSideEffects) } @@ -353,7 +353,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - XCTAssertEqual(gotProject.targets, [target]) + XCTAssertEqual(Array(gotProject.targets.values), [target]) XCTAssertEmpty(gotSideEffects) } @@ -396,7 +396,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - let gotTarget = try XCTUnwrap(gotProject.targets.first) + let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) verifyObjcBundleAccessor( for: target, gotTarget: gotTarget, @@ -415,7 +415,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { let (gotProject, gotSideEffects) = try subject.map(project: project) // Then - let gotTarget = try XCTUnwrap(gotProject.targets.first) + let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) verifyObjcBundleAccessor( for: target, gotTarget: gotTarget, @@ -436,7 +436,7 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Got let (gotProject, _) = try subject.map(project: project) - let bundleTarget = try XCTUnwrap(gotProject.targets.first(where: { $0.product == .bundle })) + let bundleTarget = try XCTUnwrap(gotProject.targets.values.sorted().first(where: { $0.product == .bundle })) // Then XCTAssertEqual(expectedBundleName, bundleTarget.name) diff --git a/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift index 19a4c7771c5..8d755af1757 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift @@ -17,16 +17,17 @@ final class TargetActionDisableShowEnvVarsProjectMapperTests: TuistUnitTestCase // When let (updatedProject, _) = try subject.map(project: project) + let updatedTargets = updatedProject.targets.values.sorted() // Then - XCTAssertTrue(project.targets[0].scripts[0].showEnvVarsInLog) - XCTAssertTrue(project.targets[0].scripts[1].showEnvVarsInLog) - XCTAssertTrue(project.targets[1].scripts[0].showEnvVarsInLog) - XCTAssertTrue(project.targets[1].scripts[1].showEnvVarsInLog) - XCTAssertFalse(updatedProject.targets[0].scripts[0].showEnvVarsInLog) - XCTAssertFalse(updatedProject.targets[0].scripts[1].showEnvVarsInLog) - XCTAssertFalse(updatedProject.targets[1].scripts[0].showEnvVarsInLog) - XCTAssertFalse(updatedProject.targets[1].scripts[1].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[1].scripts[0].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[1].scripts[1].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[0].scripts[0].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[0].scripts[1].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[1].scripts[0].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[1].scripts[1].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[0].scripts[0].showEnvVarsInLog) + XCTAssertFalse(updatedTargets[0].scripts[1].showEnvVarsInLog) } func test_map_environmentLoggingEnables() throws { @@ -40,15 +41,16 @@ final class TargetActionDisableShowEnvVarsProjectMapperTests: TuistUnitTestCase // When let (updatedProject, _) = try subject.map(project: project) + let updatedTargets = updatedProject.targets.values.sorted() // Then - XCTAssertTrue(project.targets[0].scripts[0].showEnvVarsInLog) - XCTAssertTrue(project.targets[0].scripts[1].showEnvVarsInLog) - XCTAssertTrue(project.targets[1].scripts[0].showEnvVarsInLog) - XCTAssertTrue(project.targets[1].scripts[1].showEnvVarsInLog) - XCTAssertTrue(updatedProject.targets[0].scripts[0].showEnvVarsInLog) - XCTAssertTrue(updatedProject.targets[0].scripts[1].showEnvVarsInLog) - XCTAssertTrue(updatedProject.targets[1].scripts[0].showEnvVarsInLog) - XCTAssertTrue(updatedProject.targets[1].scripts[1].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[0].scripts[0].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[0].scripts[1].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[1].scripts[0].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[1].scripts[1].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[0].scripts[0].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[0].scripts[1].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[1].scripts[0].showEnvVarsInLog) + XCTAssertTrue(updatedTargets[1].scripts[1].showEnvVarsInLog) } } diff --git a/Tests/TuistGraphTests/Models/ProjectTests.swift b/Tests/TuistGraphTests/Models/ProjectTests.swift index e6a06b00500..4bb76568a0c 100644 --- a/Tests/TuistGraphTests/Models/ProjectTests.swift +++ b/Tests/TuistGraphTests/Models/ProjectTests.swift @@ -33,14 +33,6 @@ final class ProjectTests: XCTestCase { let graph = Graph.test( projects: [project.path: project], - targets: [ - project.path: [ - framework.name: framework, - frameworkTests.name: frameworkTests, - app.name: app, - appTests.name: appTests, - ], - ], dependencies: [ .target(name: frameworkTests.name, path: project.path): [ .target(name: framework.name, path: project.path), diff --git a/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift b/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift index 226eb881650..17cd016bba7 100644 --- a/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift +++ b/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift @@ -16,16 +16,9 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: Set()) let path = try temporaryPath() - let project = Project.test(path: path) + let project = Project.test(path: path, targets: [aTarget, bTarget, cTarget]) let graph = Graph.test( projects: [project.path: project], - targets: [ - path: [ - aTarget.name: aTarget, - bTarget.name: bTarget, - cTarget.name: cTarget, - ], - ], dependencies: [ .target(name: bTarget.name, path: path): [ .target(name: aTarget.name, path: path), @@ -38,8 +31,8 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { // When let (gotGraph, gotSideEffects) = try subject.map(graph: graph) + let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) - let pruningTargets = gotGraph.targets[path]?.values.filter(\.prune) ?? [] // Then XCTAssertEmpty(gotSideEffects) XCTAssertEmpty(pruningTargets.map(\.name)) @@ -56,24 +49,13 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let subject = FocusTargetsGraphMappers(includedTargets: Set()) let projectPath = try temporaryPath().appending(component: "Project") let externalProjectPath = try temporaryPath().appending(component: "ExternalProject") - let project = Project.test(path: projectPath) - let externalProject = Project.test(path: externalProjectPath, isExternal: true) + let project = Project.test(path: projectPath, targets: [aTarget, bTarget, cTarget]) + let externalProject = Project.test(path: externalProjectPath, targets: [dTarget, eTarget], isExternal: true) let graph = Graph.test( projects: [ project.path: project, externalProject.path: externalProject, ], - targets: [ - projectPath: [ - aTarget.name: aTarget, - bTarget.name: bTarget, - cTarget.name: cTarget, - ], - externalProjectPath: [ - dTarget.name: dTarget, - eTarget.name: eTarget, - ], - ], dependencies: [ .target(name: bTarget.name, path: projectPath): [ .target(name: aTarget.name, path: projectPath), @@ -86,10 +68,9 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { // When let (gotGraph, gotSideEffects) = try subject.map(graph: graph) - + let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) let expectingTargets = [dTarget, eTarget] - let pruningTargets = (gotGraph.targets[projectPath]?.values.filter(\.prune) ?? []) + - (gotGraph.targets[externalProjectPath]?.values.filter(\.prune) ?? []) + // Then XCTAssertEmpty(gotSideEffects) XCTAssertEqual( @@ -106,16 +87,9 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: [aTarget.name]) let path = try temporaryPath() - let project = Project.test(path: path) + let project = Project.test(path: path, targets: [aTarget, bTarget, cTarget]) let graph = Graph.test( projects: [project.path: project], - targets: [ - path: [ - aTarget.name: aTarget, - bTarget.name: bTarget, - cTarget.name: cTarget, - ], - ], dependencies: [ .target(name: bTarget.name, path: path): [ .target(name: aTarget.name, path: path), @@ -130,7 +104,8 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let (gotGraph, gotSideEffects) = try subject.map(graph: graph) let expectingTargets = [bTarget, cTarget] - let pruningTargets = gotGraph.targets[path]?.values.filter(\.prune) ?? [] + let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) + // Then XCTAssertEmpty(gotSideEffects) XCTAssertEqual( @@ -147,16 +122,9 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: [bTarget.name]) let path = try temporaryPath() - let project = Project.test(path: path) + let project = Project.test(path: path, targets: [aTarget, bTarget, cTarget]) let graph = Graph.test( projects: [project.path: project], - targets: [ - path: [ - aTarget.name: aTarget, - bTarget.name: bTarget, - cTarget.name: cTarget, - ], - ], dependencies: [ .target(name: bTarget.name, path: path): [ .target(name: aTarget.name, path: path), @@ -171,7 +139,8 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let (gotGraph, gotSideEffects) = try subject.map(graph: graph) let expectingTargets = [cTarget] - let pruningTargets = gotGraph.targets[path]?.values.filter(\.prune) ?? [] + let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) + // Then XCTAssertEmpty(gotSideEffects) XCTAssertEqual( @@ -189,17 +158,9 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: [aTarget.name]) let path = try temporaryPath() - let project = Project.test(path: path) + let project = Project.test(path: path, targets: [aTestTarget, aTarget, bTarget, cTarget]) let graph = Graph.test( projects: [project.path: project], - targets: [ - path: [ - aTestTarget.name: aTestTarget, - aTarget.name: aTarget, - bTarget.name: bTarget, - cTarget.name: cTarget, - ], - ], dependencies: [ .target(name: aTestTarget.name, path: path): [ .target(name: aTarget.name, path: path), @@ -217,7 +178,8 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let (gotGraph, gotSideEffects) = try subject.map(graph: graph) let expectingTargets = [bTarget, cTarget, aTestTarget] - let pruningTargets = gotGraph.targets[path]?.values.filter(\.prune) ?? [] + let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) + // Then XCTAssertEmpty(gotSideEffects) XCTAssertEqual( @@ -234,16 +196,9 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { let cTarget = Target.test(name: targetNames[2]) let subject = FocusTargetsGraphMappers(includedTargets: [aTarget.name, "bar"]) let path = try temporaryPath() - let project = Project.test(path: path) + let project = Project.test(path: path, targets: [aTestTarget, aTarget, cTarget]) let graph = Graph.test( projects: [project.path: project], - targets: [ - path: [ - aTestTarget.name: aTestTarget, - aTarget.name: aTarget, - cTarget.name: cTarget, - ], - ], dependencies: [ .target(name: aTestTarget.name, path: path): [ .target(name: aTarget.name, path: path), diff --git a/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift b/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift index 425a973009c..46b9f599403 100644 --- a/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift +++ b/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift @@ -27,14 +27,12 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, - projects: [project.path: project], - targets: [project.path: [target.name: target]] + projects: [project.path: project] ) let expectedGraph = Graph.test( path: project.path, - projects: [:], - targets: [:] + projects: [:] ) // When @@ -57,7 +55,6 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [firstTarget.name: firstTarget, secondTarget.name: secondTarget]], dependencies: [:] ) @@ -67,9 +64,9 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { // Then XCTAssertEmpty(gotValueSideEffects) XCTAssertEqual(gotGraph.projects.count, 1) - let valueTargets = gotGraph.targets.flatMap(\.value) + let valueTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted() XCTAssertEqual(valueTargets.count, 1) - XCTAssertEqual(valueTargets.first?.value, firstTarget) + XCTAssertEqual(valueTargets.first, firstTarget) } func test_map_removes_project_schemes_with_whose_all_targets_have_been_removed() throws { @@ -85,7 +82,6 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [prunedTarget.name: prunedTarget, keptTarget.name: keptTarget]], dependencies: [:] ) @@ -113,7 +109,6 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [prunedTarget.name: prunedTarget, keptTarget.name: keptTarget]], dependencies: [:] ) @@ -153,7 +148,6 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { path: project.path, workspace: workspace, projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [:] ) @@ -183,7 +177,6 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { path: project.path, workspace: workspace, projects: [project.path: project], - targets: [project.path: [target.name: target]], dependencies: [:] ) @@ -214,8 +207,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let project = Project.test(path: path, targets: targets, schemes: [scheme]) let graph = Graph.test( path: project.path, - projects: [project.path: project], - targets: [project.path: Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) })] + projects: [project.path: project] ) let unprunedTargets = targets.filter { !$0.prune } @@ -231,8 +223,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let expectedProject = Project.test(path: path, targets: unprunedTargets, schemes: [schemeWithUnprunedTargets]) let expectedGraph = Graph.test( path: expectedProject.path, - projects: [expectedProject.path: expectedProject], - targets: [expectedProject.path: Dictionary(uniqueKeysWithValues: unprunedTargets.map { ($0.name, $0) })] + projects: [expectedProject.path: expectedProject] ) // When @@ -253,12 +244,6 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let graph = Graph.test( path: project.path, projects: [project.path: project], - targets: [project.path: [ - firstTarget.name: firstTarget, - secondTarget.name: secondTarget, - thirdTarget.name: thirdTarget, - prunedTarget.name: prunedTarget, - ]], dependencies: [:] ) diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift index 9b343c70544..323bc5dd810 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift @@ -75,10 +75,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first(where: { $0.name == projectName })) - - let targets = graph.targets.values.lazy - .flatMap(\.values) - .sorted(by: { $0.name < $1.name }) + let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) // Then XCTAssertEqual(graph.name, "TestManifests") @@ -86,7 +83,10 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEqual(targets.count, 9) // Generated Manifests target - let manifestsTarget = try XCTUnwrap(project.targets.first(where: { $0.name == sourceRootPath.basename + projectName })) + let manifestsTarget = try XCTUnwrap( + project.targets.values.sorted() + .first(where: { $0.name == sourceRootPath.basename + projectName }) + ) XCTAssertEqual(targets.last, manifestsTarget) XCTAssertEqual(manifestsTarget.destinations, .macOS) @@ -104,7 +104,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated Helpers target - let helpersTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "ProjectDescriptionHelpers" })) + let helpersTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "ProjectDescriptionHelpers" })) XCTAssertTrue(targets.contains(helpersTarget)) XCTAssertEqual(helpersTarget.name, "ProjectDescriptionHelpers") @@ -123,7 +123,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated Templates target - let templatesTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Templates" })) + let templatesTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Templates" })) XCTAssertTrue(targets.contains(templatesTarget)) XCTAssertEqual(templatesTarget.name, "Templates") @@ -141,7 +141,10 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated ResourceSynthesizers target - let resourceSynthesizersTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "ResourceSynthesizers" })) + let resourceSynthesizersTarget = try XCTUnwrap( + project.targets.values.sorted() + .last(where: { $0.name == "ResourceSynthesizers" }) + ) XCTAssertTrue(targets.contains(resourceSynthesizersTarget)) XCTAssertEqual(resourceSynthesizersTarget.name, "ResourceSynthesizers") @@ -158,7 +161,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated Stencils target - let stencilsTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Stencils" })) + let stencilsTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Stencils" })) XCTAssertTrue(targets.contains(stencilsTarget)) XCTAssertEqual(stencilsTarget.name, "Stencils") @@ -175,7 +178,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ])) // Generated Config target - let configTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Config" })) + let configTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Config" })) XCTAssertTrue(targets.contains(configTarget)) XCTAssertEqual(configTarget.name, "Config") @@ -190,7 +193,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(configTarget.dependencies) // Generated Packages target - let packagesTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Packages" })) + let packagesTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Packages" })) XCTAssertTrue(targets.contains(packagesTarget)) XCTAssertEqual(packagesTarget.name, "Packages") @@ -246,7 +249,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEqual(scheme.name, projectName) let buildAction = try XCTUnwrap(scheme.buildAction) - XCTAssertEqual(buildAction.targets.lazy.map(\.name).sorted(), project.targets.map(\.name).sorted()) + XCTAssertEqual(buildAction.targets.lazy.map(\.name).sorted(), project.targets.values.map(\.name).sorted()) let runAction = try XCTUnwrap(scheme.runAction) XCTAssertEqual(runAction.filePath, tuistPath) @@ -287,17 +290,17 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first) - - let targets = graph.targets.values.lazy - .flatMap(\.values) - .sorted(by: { $0.name < $1.name }) + let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) // Then XCTAssertEqual(targets.count, 1) XCTAssertEmpty(targets.flatMap(\.dependencies)) // Generated Manifests target - let manifestsTarget = try XCTUnwrap(project.targets.last(where: { $0.name == sourceRootPath.basename + projectName })) + let manifestsTarget = try XCTUnwrap( + project.targets.values.sorted() + .last(where: { $0.name == sourceRootPath.basename + projectName }) + ) XCTAssertEqual(manifestsTarget.destinations, .macOS) XCTAssertEqual(manifestsTarget.product, .staticFramework) @@ -370,10 +373,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first) - - let targets = graph.targets.values.lazy - .flatMap(\.values) - .sorted(by: { $0.name < $1.name }) + let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) // Then @@ -381,7 +381,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(targets.flatMap(\.dependencies)) // Generated Manifests target - let manifestOneTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "ModuleManifests" })) + let manifestOneTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "ModuleManifests" })) XCTAssertEqual(manifestOneTarget.name, "ModuleManifests") XCTAssertEqual(manifestOneTarget.destinations, .macOS) @@ -395,7 +395,10 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(manifestOneTarget.dependencies) // Generated Manifests target - let manifestTwoTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "\(sourceRootPath.basename)Manifests" })) + let manifestTwoTarget = try XCTUnwrap( + project.targets.values.sorted() + .last(where: { $0.name == "\(sourceRootPath.basename)Manifests" }) + ) XCTAssertEqual(manifestTwoTarget.destinations, .macOS) XCTAssertEqual(manifestTwoTarget.product, .staticFramework) @@ -408,7 +411,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(manifestTwoTarget.dependencies) // Generated Config target - let configTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "Config" })) + let configTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "Config" })) XCTAssertEqual(configTarget.name, "Config") XCTAssertEqual(configTarget.destinations, .macOS) @@ -480,17 +483,14 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first) - - let targets = graph.targets.values.lazy - .flatMap(\.values) - .sorted(by: { $0.name < $1.name }) + let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) // Then XCTAssertEqual(targets.count, 1) XCTAssertEmpty(targets.flatMap(\.dependencies)) // Generated Plugin target - let pluginTarget = try XCTUnwrap(project.targets.last(where: { $0.name == sourceRootPath.basename })) + let pluginTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == sourceRootPath.basename })) XCTAssertEqual(pluginTarget.destinations, .macOS) XCTAssertEqual(pluginTarget.product, .staticFramework) @@ -562,17 +562,14 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { ) let project = try XCTUnwrap(graph.projects.values.first) - - let targets = graph.targets.values.lazy - .flatMap(\.values) - .sorted(by: { $0.name < $1.name }) + let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) // Then XCTAssertEqual(targets.count, 2) XCTAssertEmpty(targets.flatMap(\.dependencies)) // Generated first plugin target - let firstPluginTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "A" })) + let firstPluginTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "A" })) XCTAssertEqual(firstPluginTarget.destinations, .macOS) XCTAssertEqual(firstPluginTarget.product, .staticFramework) @@ -585,7 +582,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { XCTAssertEmpty(firstPluginTarget.dependencies) // Generated second plugin target - let secondPluginTarget = try XCTUnwrap(project.targets.last(where: { $0.name == "B" })) + let secondPluginTarget = try XCTUnwrap(project.targets.values.sorted().last(where: { $0.name == "B" })) XCTAssertEqual(secondPluginTarget.destinations, .macOS) XCTAssertEqual(secondPluginTarget.product, .staticFramework) @@ -679,7 +676,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { // Then let project = try XCTUnwrap(graph.projects.values.first) - let pluginTarget = try XCTUnwrap(project.targets.first) + let pluginTarget = try XCTUnwrap(project.targets.values.first) XCTAssertEqual( pluginTarget.sources, @@ -725,10 +722,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { let pluginsProject = try XCTUnwrap(graph.projects.values.first(where: { $0.name == pluginsProjectName })) let manifestsProject = try XCTUnwrap(graph.projects.values.first(where: { $0.name == manifestsProjectName })) - - let targets = graph.targets.values.lazy - .flatMap(\.values) - .sorted(by: { $0.name < $1.name }) + let targets = graph.projects.values.flatMap(\.targets.values).sorted(by: { $0.name < $1.name }) let localPluginTarget = try XCTUnwrap(targets.first(where: { $0.name == "ALocalPlugin" })) let helpersTarget = try XCTUnwrap(targets.first(where: { $0.name == "ProjectDescriptionHelpers" })) let manifestsTarget = try XCTUnwrap(targets.first(where: { $0 != localPluginTarget && $0 != helpersTarget })) diff --git a/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift b/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift index 0b3e12ee5a9..c13fec5b2e7 100644 --- a/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift @@ -86,13 +86,13 @@ class ManifestModelConverterTests: TuistUnitTestCase { // Then XCTAssertEqual(model.targets.count, 2) try XCTAssertTargetMatchesManifest( - target: model.targets[0], + target: try XCTUnwrap(model.targets["A"]), matches: targetA, at: temporaryPath, generatorPaths: generatorPaths ) try XCTAssertTargetMatchesManifest( - target: model.targets[1], + target: try XCTUnwrap(model.targets["B"]), matches: targetB, at: temporaryPath, generatorPaths: generatorPaths From 351335affb41cdf9100f4cd55d9d146a1ea3fc4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 4 Jun 2024 13:41:48 +0200 Subject: [PATCH 331/509] Fix wrong linking settings for transitive static pre-compiled binaries with intermediate dynamic pre-compiled binaries in the branch (#6367) * Not include transitive static precompiled binaries * Add a test * Fix test --- Sources/TuistCore/Graph/GraphTraverser.swift | 13 ++++++++++--- .../Graph/GraphTraverserTests.swift | 15 ++++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index 425287ba0df..9fac7d7d298 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -1084,9 +1084,16 @@ public class GraphTraverser: GraphTraversing { } func canDependencyLinkStaticProducts(dependency: GraphDependency) -> Bool { - guard case let GraphDependency.target(name, path) = dependency, - let target = target(path: path, name: name) else { return false } - return target.target.canLinkStaticProducts() + switch dependency { + case let .target(name, path): + guard let target = target(path: path, name: name) else { return false } + return target.target.canLinkStaticProducts() + case let .xcframework(xcframework): return xcframework.linking == .dynamic + case let .framework(_, _, _, _, linking, _, _): return linking == .dynamic + case let .library(_, _, linking, _, _): return linking == .dynamic + default: + return false + } } func unitTestHost(path: AbsolutePath, name: String) -> GraphTarget? { diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index 57948670a0b..602e4460981 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -1700,13 +1700,14 @@ final class GraphTraverserTests: TuistUnitTestCase { XCTAssertEqual(got.first, GraphDependencyReference(macroXCFramework)) } - func test_linkableDependencies_whenPrecompiled() throws { + func test_linkableDependencies_doesntReturnTransitiveStaticPrecompiledBinaries_when_thereAreIntermediatePrecompiledBinariesThatCanLink( + ) throws { // Given let target = Target.test(name: "Main") let project = Project.test(targets: [target]) // Given: Value Graph - let precompiledDependency = GraphDependency.testFramework( + let precompiledDynamicFramework = GraphDependency.testFramework( path: "/test/test.framework", binaryPath: "/test/test.framework/test", dsymPath: nil, @@ -1714,8 +1715,13 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .dynamic, architectures: [.arm64] ) + let precompiledTransitiveXCFramework = GraphDependency.testXCFramework( + path: "/test/b.xcframework", + linking: .static + ) let dependencies: [GraphDependency: Set] = [ - .target(name: target.name, path: project.path): Set(arrayLiteral: precompiledDependency), + .target(name: target.name, path: project.path): Set(arrayLiteral: precompiledDynamicFramework), + precompiledDynamicFramework: [precompiledTransitiveXCFramework], ] let graph = Graph.test( projects: [project.path: project], @@ -1727,7 +1733,7 @@ final class GraphTraverserTests: TuistUnitTestCase { let got = try subject.linkableDependencies(path: project.path, name: target.name).sorted() // Then - XCTAssertEqual(got.first, GraphDependencyReference(precompiledDependency)) + XCTAssertEqual(got, [GraphDependencyReference(precompiledDynamicFramework)]) } func test_linkableAndEmbeddableDependencies_when_appDependensOnPrecompiledStaticBinaryWithPrecompiledStaticBinaryDependency( @@ -1937,7 +1943,6 @@ final class GraphTraverserTests: TuistUnitTestCase { // Then XCTAssertEqual(got, [ GraphDependencyReference(dependencyPrecompiledDynamicBinaryA), - GraphDependencyReference(dependencyPrecompiledStaticBinaryB), ]) // When From b633a9166ddbfd2f959668fc791116feadc51911 Mon Sep 17 00:00:00 2001 From: Andy Kolean Date: Tue, 4 Jun 2024 07:50:32 -0400 Subject: [PATCH 332/509] Support environment variable configuration for commands (#6359) * add env variable flags for commands * add more env keys * add some more env var tests * add some more envkey tests * fix argument parser inits * fix platform flag * add cloud envkeys * add tuist cloud env variables * add cli docs * fix vitepress config * run mise lint * add mise task to generate cli docs * Variable name '_value' should only contain alphanumeric and other allowed characters (identifier_name) --- .mise/tasks/docs/generate-cli-docs | 6 + Sources/TuistGraph/Models/Platform.swift | 2 +- Sources/TuistKit/Commands/BuildCommand.swift | 57 +- Sources/TuistKit/Commands/CleanCommand.swift | 8 +- .../Cloud/CloudAnalyticsCommand.swift | 3 +- .../Commands/Cloud/CloudAuthCommand.swift | 3 +- .../Commands/Cloud/CloudCleanCommand.swift | 3 +- .../Commands/Cloud/CloudInitCommand.swift | 9 +- .../Commands/Cloud/CloudLogoutCommand.swift | 3 +- .../CloudOrganizationBillingCommand.swift | 6 +- .../CloudOrganizationCreateCommand.swift | 6 +- .../CloudOrganizationDeleteCommand.swift | 6 +- .../CloudOrganizationInviteCommand.swift | 9 +- .../Cloud/CloudOrganizationListCommand.swift | 6 +- ...CloudOrganizationRemoveInviteCommand.swift | 9 +- ...CloudOrganizationRemoveMemberCommand.swift | 9 +- .../CloudOrganizationRemoveSSOCommand.swift | 6 +- .../Cloud/CloudOrganizationShowCommand.swift | 9 +- ...CloudOrganizationUpdateMemberCommand.swift | 12 +- .../CloudOrganizationUpdateSSOCommand.swift | 18 +- .../Cloud/CloudProjectCreateCommand.swift | 9 +- .../Cloud/CloudProjectDeleteCommand.swift | 9 +- .../Cloud/CloudProjectListCommand.swift | 6 +- .../Cloud/CloudProjectTokenCommand.swift | 9 +- .../Commands/Cloud/CloudSessionCommand.swift | 3 +- Sources/TuistKit/Commands/DumpCommand.swift | 5 +- Sources/TuistKit/Commands/EditCommand.swift | 9 +- Sources/TuistKit/Commands/EnvKey/EnvKey.swift | 241 +++++ .../EnvKey/ParseableArgument+Extension.swift | 221 ++++ .../TuistKit/Commands/GenerateCommand.swift | 22 +- Sources/TuistKit/Commands/GraphCommand.swift | 53 +- Sources/TuistKit/Commands/InitCommand.swift | 12 +- .../TuistKit/Commands/InstallCommand.swift | 6 +- Sources/TuistKit/Commands/ListCommand.swift | 6 +- ...rationCheckEmptyBuildSettingsCommand.swift | 6 +- .../MigrationSettingsToXCConfigCommand.swift | 9 +- ...igrationTargetsByDependenciesCommand.swift | 3 +- .../Plugin/PluginArchiveCommand.swift | 5 +- .../Commands/Plugin/PluginBuildCommand.swift | 12 +- .../Commands/Plugin/PluginCommand.swift | 10 +- .../Commands/Plugin/PluginRunCommand.swift | 16 +- .../Commands/Plugin/PluginTestCommand.swift | 7 +- Sources/TuistKit/Commands/RunCommand.swift | 21 +- .../TuistKit/Commands/ScaffoldCommand.swift | 9 +- Sources/TuistKit/Commands/TestCommand.swift | 85 +- Sources/TuistKit/Services/BuildService.swift | 6 +- Sources/TuistKit/Services/CleanService.swift | 2 +- .../CommandEnvironmentVariableTests.swift | 940 ++++++++++++++++++ .../Services/BuildServiceTests.swift | 2 +- docs/.vitepress/config.mjs | 57 +- docs/docs/reference/cli/commands.data.js | 40 +- .../project-description/types.data.js | 2 +- docs/package.json | 2 +- docs/scripts/generate-cli-docs.mjs | 89 ++ docs/scripts/generate-manifest-docs.mjs | 8 +- 55 files changed, 1936 insertions(+), 196 deletions(-) create mode 100755 .mise/tasks/docs/generate-cli-docs create mode 100644 Sources/TuistKit/Commands/EnvKey/EnvKey.swift create mode 100644 Sources/TuistKit/Commands/EnvKey/ParseableArgument+Extension.swift create mode 100644 Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift create mode 100755 docs/scripts/generate-cli-docs.mjs diff --git a/.mise/tasks/docs/generate-cli-docs b/.mise/tasks/docs/generate-cli-docs new file mode 100755 index 00000000000..0927ccaeeec --- /dev/null +++ b/.mise/tasks/docs/generate-cli-docs @@ -0,0 +1,6 @@ +#!/bin/bash +# mise description="Generates the markdown documentation for the cli files" + +set -euo pipefail + +$MISE_PROJECT_ROOT/docs/scripts/generate-cli-docs.mjs \ No newline at end of file diff --git a/Sources/TuistGraph/Models/Platform.swift b/Sources/TuistGraph/Models/Platform.swift index 6e65dc21757..bf1a2e108cb 100644 --- a/Sources/TuistGraph/Models/Platform.swift +++ b/Sources/TuistGraph/Models/Platform.swift @@ -27,7 +27,7 @@ public enum Platform: String, CaseIterable, Codable, Comparable { } } - init?(commandLineValue: String) { + public init?(commandLineValue: String) { self.init(rawValue: commandLineValue.lowercased()) } diff --git a/Sources/TuistKit/Commands/BuildCommand.swift b/Sources/TuistKit/Commands/BuildCommand.swift index d6b541ab11e..493d5b4646d 100644 --- a/Sources/TuistKit/Commands/BuildCommand.swift +++ b/Sources/TuistKit/Commands/BuildCommand.swift @@ -2,6 +2,7 @@ import ArgumentParser import Foundation import TSCBasic import TSCUtility +import TuistGraph import TuistServer import TuistSupport @@ -25,81 +26,95 @@ enum XcodeBuildPassthroughArgumentError: FatalError, Equatable { public struct BuildOptions: ParsableArguments { public init() {} + public static var generatorFactory: GeneratorFactorying = GeneratorFactory() public static var cacheStorageFactory: CacheStorageFactorying = EmptyCacheStorageFactory() @Argument( - help: "The scheme to be built. By default it builds all the buildable schemes of the project in the current directory." + help: "The scheme to be built. By default it builds all the buildable schemes of the project in the current directory.", + envKey: .buildOptionsScheme ) public var scheme: String? @Flag( - help: "Force the generation of the project before building." + help: "Force the generation of the project before building.", + envKey: .buildOptionsGenerate ) public var generate: Bool = false @Flag( - help: "When passed, it cleans the project before building it" + help: "When passed, it cleans the project before building it", + envKey: .buildOptionsClean ) public var clean: Bool = false @Option( name: .shortAndLong, help: "The path to the directory that contains the project to be built.", - completion: .directory + completion: .directory, + envKey: .buildOptionsPath ) public var path: String? @Option( name: .shortAndLong, - help: "Build on a specific device." + help: "Build on a specific device.", + envKey: .buildOptionsDevice ) public var device: String? @Option( name: .long, - help: "Build for a specific platform." + help: "Build for a specific platform.", + envKey: .buildOptionsPlatform ) - public var platform: String? + public var platform: TuistGraph.Platform? @Option( name: .shortAndLong, - help: "Build with a specific version of the OS." + help: "Build with a specific version of the OS.", + envKey: .buildOptionsOS ) public var os: String? @Flag( name: .long, - help: "When passed, append arch=x86_64 to the 'destination' to run simulator in a Rosetta mode." + help: "When passed, append arch=x86_64 to the 'destination' to run simulator in a Rosetta mode.", + envKey: .buildOptionsRosetta ) public var rosetta: Bool = false @Option( name: [.long, .customShort("C")], - help: "The configuration to be used when building the scheme." + help: "The configuration to be used when building the scheme.", + envKey: .buildOptionsConfiguration ) public var configuration: String? @Option( help: "The directory where build products will be copied to when the project is built.", - completion: .directory + completion: .directory, + envKey: .buildOptionsOutputPath ) public var buildOutputPath: String? @Option( - help: "[Deprecated] Overrides the folder that should be used for derived data when building the project." + help: "[Deprecated] Overrides the folder that should be used for derived data when building the project.", + envKey: .buildOptionsDerivedDataPath ) public var derivedDataPath: String? @Flag( name: .long, - help: "When passed, it generates the project and skips building. This is useful for debugging purposes." + help: "When passed, it generates the project and skips building. This is useful for debugging purposes.", + envKey: .buildOptionsGenerateOnly ) public var generateOnly: Bool = false @Argument( parsing: .postTerminator, - help: "Arguments that will be passed through to xcodebuild" + help: "Arguments that will be passed through to xcodebuild", + envKey: .buildOptionsPassthroughXcodeBuildArguments ) var passthroughXcodeBuildArguments: [String] = [] } @@ -121,10 +136,10 @@ public struct BuildCommand: AsyncParsableCommand { var buildOptions: BuildOptions @Flag( - name: [.customLong("no-binary-cache")], - help: "Ignore binary cache and use sources only." + help: "Ignore binary cache and use sources only.", + envKey: .buildBinaryCache ) - var ignoreBinaryCache: Bool = false + var binaryCache: Bool = true private var notAllowedPassthroughXcodeBuildArguments = [ "-scheme", @@ -162,7 +177,7 @@ public struct BuildCommand: AsyncParsableCommand { generate: buildOptions.generate, clean: buildOptions.clean, configuration: buildOptions.configuration, - ignoreBinaryCache: ignoreBinaryCache, + ignoreBinaryCache: !binaryCache, buildOutputPath: buildOptions.buildOutputPath.map { try AbsolutePath( validating: $0, relativeTo: FileHandler.shared.currentPath @@ -178,3 +193,9 @@ public struct BuildCommand: AsyncParsableCommand { ) } } + +extension TuistGraph.Platform: ExpressibleByArgument { + public init?(argument: String) { + self.init(commandLineValue: argument) + } +} diff --git a/Sources/TuistKit/Commands/CleanCommand.swift b/Sources/TuistKit/Commands/CleanCommand.swift index 6e8d9f2c460..559e2b1316c 100644 --- a/Sources/TuistKit/Commands/CleanCommand.swift +++ b/Sources/TuistKit/Commands/CleanCommand.swift @@ -12,13 +12,17 @@ public struct CleanCommand: ParsableCommand { ) } - @Argument(help: "The cache and artifact categories to be cleaned. If no category is specified, everything is cleaned.") + @Argument( + help: "The cache and artifact categories to be cleaned. If no category is specified, everything is cleaned.", + envKey: .cleanCleanCategories + ) var cleanCategories: [TuistCleanCategory] = TuistCleanCategory.allCases.map { $0 } @Option( name: .shortAndLong, help: "The path to the directory that contains the project that should be cleaned.", - completion: .directory + completion: .directory, + envKey: .cleanPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift index 76b3adfd199..28ee50d25b9 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift @@ -15,7 +15,8 @@ struct CloudAnalyticsCommand: AsyncParsableCommand { @Option( name: .shortAndLong, help: "The path to the Tuist Cloud project.", - completion: .directory + completion: .directory, + envKey: .cloudAnalyticsPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift index 823be9ba23e..8ae33f2b481 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift @@ -14,7 +14,8 @@ struct CloudAuthCommand: AsyncParsableCommand { @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudAuthPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift index 8c4ecd2d83f..83c1314bae5 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift @@ -15,7 +15,8 @@ struct CloudCleanCommand: AsyncParsableCommand { @Option( name: .shortAndLong, help: "The path to the Tuist Cloud project.", - completion: .directory + completion: .directory, + envKey: .cloudCleanPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift index 1e48c27198a..007bf99519f 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift @@ -14,20 +14,23 @@ struct CloudInitCommand: AsyncParsableCommand { @Argument( help: "The name of the project to create.", - completion: .directory + completion: .directory, + envKey: .cloudInitName ) var name: String @Option( name: .shortAndLong, - help: "Organization to initialize the Cloud project with. If not specified, the project is created with your personal Cloud account." + help: "Organization to initialize the Cloud project with. If not specified, the project is created with your personal Cloud account.", + envKey: .cloudInitOrganization ) var organization: String? @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudInitPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift index 527687beaac..83691fe86d8 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift @@ -14,7 +14,8 @@ struct CloudLogoutCommand: ParsableCommand { @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudLogoutPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift index 9fc32a68d6c..66188710c49 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift @@ -13,14 +13,16 @@ struct CloudOrganizationBillingCommand: AsyncParsableCommand { } @Argument( - help: "The name of the organization to show billing dashboard for." + help: "The name of the organization to show billing dashboard for.", + envKey: .cloudOrganizationBillingOrganizationName ) var organizationName: String @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudOrganizationBillingPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift index 655c1d6707e..b110ce6e266 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift @@ -13,14 +13,16 @@ struct CloudOrganizationCreateCommand: AsyncParsableCommand { } @Argument( - help: "The name of the organization to create." + help: "The name of the organization to create.", + envKey: .cloudOrganizationCreateOrganizationName ) var organizationName: String @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudOrganizationCreatePath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift index 6f7111041a0..48c18647439 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift @@ -14,14 +14,16 @@ struct CloudOrganizationDeleteCommand: AsyncParsableCommand { @Argument( help: "The name of the organization to delete.", - completion: .directory + completion: .directory, + envKey: .cloudOrganizationDeleteOrganizationName ) var organizationName: String @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudOrganizationDeletePath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift index 95c32372b50..37d4cf15327 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift @@ -13,19 +13,22 @@ struct CloudOrganizationInviteCommand: AsyncParsableCommand { } @Argument( - help: "The name of the organization to invite the user to." + help: "The name of the organization to invite the user to.", + envKey: .cloudOrganizationInviteOrganizationName ) var organizationName: String @Argument( - help: "The email of the user to invite." + help: "The email of the user to invite.", + envKey: .cloudOrganizationInviteEmail ) var email: String @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudOrganizationInvitePath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift index fdec3366b86..8a9f79cae48 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift @@ -13,14 +13,16 @@ struct CloudOrganizationListCommand: AsyncParsableCommand { } @Flag( - help: "The output in JSON format." + help: "The output in JSON format.", + envKey: .cloudOrganizationListJson ) var json: Bool = false @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudOrganizationListPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift index 8f58359c85f..832ee37d9ba 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift @@ -13,19 +13,22 @@ struct CloudOrganizationRemoveInviteCommand: AsyncParsableCommand { } @Argument( - help: "The name of the organization to cancel the invitation for." + help: "The name of the organization to cancel the invitation for.", + envKey: .cloudOrganizationRemoveInviteOrganizationName ) var organizationName: String @Argument( - help: "The email of the user to cancel the invitation for." + help: "The email of the user to cancel the invitation for.", + envKey: .cloudOrganizationRemoveInviteEmail ) var email: String @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudOrganizationRemoveInvitePath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift index d93382b2847..95ee194100e 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift @@ -13,19 +13,22 @@ struct CloudOrganizationRemoveMemberCommand: AsyncParsableCommand { } @Argument( - help: "The name of the organization to remove the organization member from." + help: "The name of the organization to remove the organization member from.", + envKey: .cloudOrganizationRemoveMemberOrganizationName ) var organizationName: String @Argument( - help: "The username of the member you want to remove from the organization." + help: "The username of the member you want to remove from the organization.", + envKey: .cloudOrganizationRemoveMemberUsername ) var username: String @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudOrganizationRemoveMemberPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift index e2d6087d857..8897c856628 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift @@ -13,14 +13,16 @@ struct CloudOrganizationRemoveSSOCommand: AsyncParsableCommand { } @Argument( - help: "The name of the organization for which you want to update the SSO provider for." + help: "The name of the organization for which you want to update the SSO provider for.", + envKey: .cloudOrganizationRemoveSSOOrganizationName ) var organizationName: String @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudOrganizationRemoveSSOPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift index a63ed10da9f..9d27d5da835 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift @@ -13,19 +13,22 @@ struct CloudOrganizationShowCommand: AsyncParsableCommand { } @Argument( - help: "The name of the organization to show." + help: "The name of the organization to show.", + envKey: .cloudOrganizationShowOrganizationName ) var organizationName: String @Flag( - help: "The output in JSON format." + help: "The output in JSON format.", + envKey: .cloudOrganizationShowJson ) var json: Bool = false @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudOrganizationShowPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift index cc47b57bb3a..c407918186e 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift @@ -13,25 +13,29 @@ struct CloudOrganizationUpdateMemberCommand: AsyncParsableCommand { } @Argument( - help: "The name of the organization for which you want to update the member for." + help: "The name of the organization for which you want to update the member for.", + envKey: .cloudOrganizationUpdateMemberOrganizationName ) var organizationName: String @Argument( - help: "The username of the member you want to update." + help: "The username of the member you want to update.", + envKey: .cloudOrganizationUpdateMemberUsername ) var username: String @Option( help: "The new member role", - completion: .list(["admin", "user"]) + completion: .list(["admin", "user"]), + envKey: .cloudOrganizationUpdateMemberRole ) var role: String @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudOrganizationUpdateMemberPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift index dbf85f2bdb5..0b1ec7355d4 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift @@ -3,12 +3,8 @@ import Foundation import TSCBasic import TuistSupport -enum SSOProvider: String, ExpressibleByArgument { +enum SSOProvider: String, ExpressibleByArgument, CaseIterable { case google - - static var allValueStrings: [String] { - ["google"] - } } struct CloudOrganizationUpdateSSOCommand: AsyncParsableCommand { @@ -21,25 +17,29 @@ struct CloudOrganizationUpdateSSOCommand: AsyncParsableCommand { } @Argument( - help: "The name of the organization for which you want to update the SSO provider for." + help: "The name of the organization for which you want to update the SSO provider for.", + envKey: .cloudOrganizationUpdateSSOOrganizationName ) var organizationName: String @Option( - help: "The SSO provider to use." + help: "The SSO provider to use.", + envKey: .cloudOrganizationUpdateSSOProvider ) var provider: SSOProvider @Option( name: .shortAndLong, - help: "Organization ID for your SSO provider. For Google, this is your Google domain (for example, if your email is tuist@tuist.io, the domain would be tuist.io)" + help: "Organization ID for your SSO provider. For Google, this is your Google domain (for example, if your email is tuist@tuist.io, the domain would be tuist.io)", + envKey: .cloudOrganizationUpdateSSOOrganizationId ) var organizationId: String @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudOrganizationUpdateSSOPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift index 44ce6da4761..82f6ea57e07 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift @@ -14,20 +14,23 @@ struct CloudProjectCreateCommand: AsyncParsableCommand { @Argument( help: "The name of the project to create.", - completion: .directory + completion: .directory, + envKey: .cloudProjectCreateName ) var name: String @Option( name: .shortAndLong, - help: "Organization to create the project with. If not specified, the project is created with your personal cloud account." + help: "Organization to create the project with. If not specified, the project is created with your personal cloud account.", + envKey: .cloudProjectCreateOrganization ) var organization: String? @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudProjectCreatePath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift index a28d56ed569..eff308c873a 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift @@ -13,20 +13,23 @@ struct CloudProjectDeleteCommand: AsyncParsableCommand { @Argument( help: "The project to delete.", - completion: .directory + completion: .directory, + envKey: .cloudProjectDeleteProject ) var project: String @Option( name: .shortAndLong, - help: "The organization that the project belongs to. By default, this is your personal Tuist Cloud account." + help: "The organization that the project belongs to. By default, this is your personal Tuist Cloud account.", + envKey: .cloudProjectDeleteOrganization ) var organization: String @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudProjectDeletePath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift index 3118b5d0daf..2c58f7fbea7 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift @@ -13,14 +13,16 @@ struct CloudProjectListCommand: AsyncParsableCommand { } @Flag( - help: "The output in JSON format." + help: "The output in JSON format.", + envKey: .cloudProjectListJson ) var json: Bool = false @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudProjectListPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift index 45420326878..371a95f4441 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift @@ -14,20 +14,23 @@ struct CloudProjectTokenCommand: AsyncParsableCommand { @Argument( help: "The name of the project to get the token for.", - completion: .directory + completion: .directory, + envKey: .cloudProjectTokenProjectName ) var projectName: String @Option( name: .shortAndLong, - help: "Organization of the project. If not specified, it defaults to your user account." + help: "Organization of the project. If not specified, it defaults to your user account.", + envKey: .cloudProjectTokenOrganizationName ) var organizationName: String @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudProjectTokenPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift index 054291b96b3..295f518350c 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift @@ -14,7 +14,8 @@ struct CloudSessionCommand: ParsableCommand { @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .cloudSessionPath ) var path: String? diff --git a/Sources/TuistKit/Commands/DumpCommand.swift b/Sources/TuistKit/Commands/DumpCommand.swift index 093b4b84a7f..1b5e2401919 100644 --- a/Sources/TuistKit/Commands/DumpCommand.swift +++ b/Sources/TuistKit/Commands/DumpCommand.swift @@ -17,11 +17,12 @@ struct DumpCommand: AsyncParsableCommand { @Option( name: .shortAndLong, help: "The path to the folder where the manifest is", - completion: .directory + completion: .directory, + envKey: .dumpPath ) var path: String? - @Argument(help: "The manifest to be dumped") + @Argument(help: "The manifest to be dumped", envKey: .dumpManifest) var manifest: DumpableManifest = .project func run() async throws { diff --git a/Sources/TuistKit/Commands/EditCommand.swift b/Sources/TuistKit/Commands/EditCommand.swift index 649836850c9..f36cdb3fb28 100644 --- a/Sources/TuistKit/Commands/EditCommand.swift +++ b/Sources/TuistKit/Commands/EditCommand.swift @@ -17,19 +17,22 @@ public struct EditCommand: AsyncParsableCommand { @Option( name: .shortAndLong, help: "The path to the directory whose project will be edited", - completion: .directory + completion: .directory, + envKey: .editPath ) var path: String? @Flag( name: [.long, .customShort("P")], - help: "It creates the project in the current directory or the one indicated by -p and doesn't block the process" + help: "It creates the project in the current directory or the one indicated by -p and doesn't block the process", + envKey: .editPermanent ) var permanent: Bool = false @Flag( name: [.long, .customShort("o")], - help: "It only includes the manifest in the current directory." + help: "It only includes the manifest in the current directory.", + envKey: .editOnlyCurrentDirectory ) var onlyCurrentDirectory: Bool = false diff --git a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift new file mode 100644 index 00000000000..aedb45f2a0c --- /dev/null +++ b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift @@ -0,0 +1,241 @@ +import ArgumentParser +import Foundation +import TuistSupport + +public enum EnvKey: String, CaseIterable { + // BUILD + case buildBinaryCache = "TUIST_BUILD_BINARY_CACHE" + + // BUILD OPTIONS + case buildOptionsScheme = "TUIST_BUILD_OPTIONS_SCHEME" + case buildOptionsGenerate = "TUIST_BUILD_OPTIONS_GENERATE" + case buildOptionsClean = "TUIST_BUILD_OPTIONS_CLEAN" + case buildOptionsPath = "TUIST_BUILD_OPTIONS_PATH" + case buildOptionsDevice = "TUIST_BUILD_OPTIONS_DEVICE" + case buildOptionsPlatform = "TUIST_BUILD_OPTIONS_PLATFORM" + case buildOptionsOS = "TUIST_BUILD_OPTIONS_OS" + case buildOptionsRosetta = "TUIST_BUILD_OPTIONS_ROSETTA" + case buildOptionsConfiguration = "TUIST_BUILD_OPTIONS_CONFIGURATION" + case buildOptionsOutputPath = "TUIST_BUILD_OPTIONS_BUILD_OUTPUT_PATH" + case buildOptionsDerivedDataPath = "TUIST_BUILD_OPTIONS_DERIVED_DATA_PATH" + case buildOptionsGenerateOnly = "TUIST_BUILD_OPTIONS_GENERATE_ONLY" + case buildOptionsPassthroughXcodeBuildArguments = "TUIST_BUILD_OPTIONS_PASSTHROUGH_XCODE_BUILD_ARGUMENTS" + + // CLEAN + case cleanCleanCategories = "TUIST_CLEAN_CLEAN_CATEGORIES" + case cleanPath = "TUIST_CLEAN_PATH" + + // DUMP + case dumpPath = "TUIST_DUMP_PATH" + case dumpManifest = "TUIST_DUMP_MANIFEST" + + // EDIT + case editPath = "TUIST_EDIT_PATH" + case editPermanent = "TUIST_EDIT_PERMANENT" + case editOnlyCurrentDirectory = "TUIST_EDIT_ONLY_CURRENT_DIRECTORY" + + // INSTALL + case installPath = "TUIST_INSTALL_PATH" + case installUpdate = "TUIST_INSTALL_UPDATE" + + // GENERATE + case generatePath = "TUIST_GENERATE_PATH" + case generateOpen = "TUIST_GENERATE_OPEN" + case generateBinaryCache = "TUIST_GENERATE_BINARY_CACHE" + + // GRAPH + case graphSkipTestTargets = "TUIST_GRAPH_SKIP_TEST_TARGETS" + case graphSkipExternalDependencies = "TUIST_GRAPH_SKIP_EXTERNAL_DEPENDENCIES" + case graphPlatform = "TUIST_GRAPH_PLATFORM" + case graphFormat = "TUIST_GRAPH_FORMAT" + case graphOpen = "TUIST_GRAPH_OPEN" + case graphLayoutAlgorithm = "TUIST_GRAPH_LAYOUT_ALGORITHM" + case graphTargets = "TUIST_GRAPH_TARGETS" + case graphPath = "TUIST_GRAPH_PATH" + case graphOutputPath = "TUIST_GRAPH_OUTPUT_PATH" + + // INIT + case initPlatform = "TUIST_INIT_PLATFORM" + case initName = "TUIST_INIT_NAME" + case initTemplate = "TUIST_INIT_TEMPLATE" + case initPath = "TUIST_INIT_PATH" + + // MIGRATION + case migrationSettingsToXcconfigXcodeprojPath = "TUIST_MIGRATION_SETTINGS_TO_XCCONFIG_XCODEPROJ_PATH" + case migrationSettingsToXcconfigXcconfigPath = "TUIST_MIGRATION_SETTINGS_TO_XCCONFIG_XCCONFIG_PATH" + case migrationSettingsToXcconfigTarget = "TUIST_MIGRATION_SETTINGS_TO_XCCONFIG_TARGET" + case migrationCheckEmptySettingsXcodeprojPath = "TUIST_MIGRATION_CHECK_EMPTY_SETTINGS_XCODEPROJ_PATH" + case migrationCheckEmptySettingsTarget = "TUIST_MIGRATION_CHECK_EMPTY_SETTINGS_TARGET" + case migrationListTargetsXcodeprojPath = "TUIST_MIGRATION_LIST_TARGETS_XCODEPROJ_PATH" + + // PLUGIN + case pluginArchivePath = "TUIST_PLUGIN_ARCHIVE_PATH" + case pluginBuildBuildTests = "TUIST_PLUGIN_BUILD_BUILD_TESTS" + case pluginBuildShowBinPath = "TUIST_PLUGIN_BUILD_SHOW_BIN_PATH" + case pluginBuildTargets = "TUIST_PLUGIN_BUILD_TARGETS" + case pluginBuildProducts = "TUIST_PLUGIN_BUILD_PRODUCTS" + case pluginRunBuildTests = "TUIST_PLUGIN_RUN_BUILD_TESTS" + case pluginRunSkipBuild = "TUIST_PLUGIN_RUN_SKIP_BUILD" + case pluginRunTask = "TUIST_PLUGIN_RUN_TASK" + case pluginRunArguments = "TUIST_PLUGIN_RUN_ARGUMENTS" + case pluginTestBuildTests = "TUIST_PLUGIN_TEST_BUILD_TESTS" + case pluginTestTestProducts = "TUIST_PLUGIN_TEST_TEST_PRODUCTS" + + // PLUGIN OPTIONS + case pluginOptionsConfiguration = "TUIST_PLUGIN_OPTIONS_CONFIGURATION" + case pluginOptionsPath = "TUIST_PLUGIN_OPTIONS_PATH" + + // RUN + case runBuildTests = "TUIST_RUN_BUILD_TESTS" + case runSkipBuild = "TUIST_RUN_SKIP_BUILD" + case runTask = "TUIST_RUN_TASK" + case runArguments = "TUIST_RUN_ARGUMENTS" + case runGenerate = "TUIST_RUN_GENERATE" + case runClean = "TUIST_RUN_CLEAN" + case runPath = "TUIST_RUN_PATH" + case runConfiguration = "TUIST_RUN_CONFIGURATION" + case runDevice = "TUIST_RUN_DEVICE" + case runOS = "TUIST_RUN_OS" + case runRosetta = "TUIST_RUN_ROSETTA" + case runScheme = "TUIST_RUN_SCHEME" + + // SCAFFOLD + case scaffoldTemplate = "TUIST_SCAFFOLD_TEMPLATE" + case scaffoldJson = "TUIST_SCAFFOLD_JSON" + case scaffoldPath = "TUIST_SCAFFOLD_PATH" + case scaffoldListJson = "TUIST_SCAFFOLD_LIST_JSON" + case scaffoldListPath = "TUIST_SCAFFOLD_LIST_PATH" + + // TEST + case testScheme = "TUIST_TEST_SCHEME" + case testClean = "TUIST_TEST_CLEAN" + case testPath = "TUIST_TEST_PATH" + case testDevice = "TUIST_TEST_DEVICE" + case testPlatform = "TUIST_TEST_PLATFORM" + case testOS = "TUIST_TEST_OS" + case testRosetta = "TUIST_TEST_ROSETTA" + case testConfiguration = "TUIST_TEST_CONFIGURATION" + case testSkipUITests = "TUIST_TEST_SKIP_UITESTS" + case testResultBundlePath = "TUIST_TEST_RESULT_BUNDLE_PATH" + case testDerivedDataPath = "TUIST_TEST_DERIVED_DATA_PATH" + case testRetryCount = "TUIST_TEST_RETRY_COUNT" + case testTestPlan = "TUIST_TEST_TEST_PLAN" + case testTestTargets = "TUIST_TEST_TEST_TARGETS" + case testSkipTestTargets = "TUIST_TEST_SKIP_TEST_TARGETS" + case testConfigurations = "TUIST_TEST_CONFIGURATIONS" + case testSkipConfigurations = "TUIST_TEST_SKIP_CONFIGURATIONS" + case testGenerateOnly = "TUIST_TEST_GENERATE_ONLY" + case testBinaryCache = "TUIST_TEST_BINARY_CACHE" + case testSelectiveTesting = "TUIST_TEST_SELECTIVE_TESTING" + + // CLOUD ORGANIZATION BILLING + case cloudOrganizationBillingOrganizationName = "TUIST_CLOUD_ORGANIZATION_BILLING_ORGANIZATION_NAME" + case cloudOrganizationBillingPath = "TUIST_CLOUD_ORGANIZATION_BILLING_PATH" + + // CLOUD ORGANIZATION CREATE + case cloudOrganizationCreateOrganizationName = "TUIST_CLOUD_ORGANIZATION_CREATE_ORGANIZATION_NAME" + case cloudOrganizationCreatePath = "TUIST_CLOUD_ORGANIZATION_CREATE_PATH" + + // CLOUD ORGANIZATION DELETE + case cloudOrganizationDeleteOrganizationName = "TUIST_CLOUD_ORGANIZATION_DELETE_ORGANIZATION_NAME" + case cloudOrganizationDeletePath = "TUIST_CLOUD_ORGANIZATION_DELETE_PATH" + + // CLOUD PROJECT TOKEN + case cloudProjectTokenProjectName = "TUIST_CLOUD_PROJECT_TOKEN_PROJECT_NAME" + case cloudProjectTokenOrganizationName = "TUIST_CLOUD_PROJECT_TOKEN_ORGANIZATION_NAME" + case cloudProjectTokenPath = "TUIST_CLOUD_PROJECT_TOKEN_PATH" + + // CLOUD ORGANIZATION LIST + case cloudOrganizationListJson = "TUIST_CLOUD_ORGANIZATION_LIST_JSON" + case cloudOrganizationListPath = "TUIST_CLOUD_ORGANIZATION_LIST_PATH" + + // CLOUD ORGANIZATION REMOVE INVITE + case cloudOrganizationRemoveInviteOrganizationName = "TUIST_CLOUD_ORGANIZATION_REMOVE_INVITE_ORGANIZATION_NAME" + case cloudOrganizationRemoveInviteEmail = "TUIST_CLOUD_ORGANIZATION_REMOVE_INVITE_EMAIL" + case cloudOrganizationRemoveInvitePath = "TUIST_CLOUD_ORGANIZATION_REMOVE_INVITE_PATH" + + // CLOUD ORGANIZATION REMOVE MEMBER + case cloudOrganizationRemoveMemberOrganizationName = "TUIST_CLOUD_ORGANIZATION_REMOVE_MEMBER_ORGANIZATION_NAME" + case cloudOrganizationRemoveMemberUsername = "TUIST_CLOUD_ORGANIZATION_REMOVE_MEMBER_USERNAME" + case cloudOrganizationRemoveMemberPath = "TUIST_CLOUD_ORGANIZATION_REMOVE_MEMBER_PATH" + + // CLOUD ORGANIZATION REMOVE SSO + case cloudOrganizationRemoveSSOOrganizationName = "TUIST_CLOUD_ORGANIZATION_REMOVE_SSO_ORGANIZATION_NAME" + case cloudOrganizationRemoveSSOPath = "TUIST_CLOUD_ORGANIZATION_REMOVE_SSO_PATH" + + // CLOUD ORGANIZATION UPDATE SSO + case cloudOrganizationUpdateSSOOrganizationName = "TUIST_CLOUD_ORGANIZATION_UPDATE_SSO_ORGANIZATION_NAME" + case cloudOrganizationUpdateSSOProvider = "TUIST_CLOUD_ORGANIZATION_UPDATE_SSO_PROVIDER" + case cloudOrganizationUpdateSSOOrganizationId = "TUIST_CLOUD_ORGANIZATION_UPDATE_SSO_ORGANIZATION_ID" + case cloudOrganizationUpdateSSOPath = "TUIST_CLOUD_ORGANIZATION_UPDATE_SSO_PATH" + + // CLOUD PROJECT DELETE + case cloudProjectDeleteProject = "TUIST_CLOUD_PROJECT_DELETE_PROJECT" + case cloudProjectDeleteOrganization = "TUIST_CLOUD_PROJECT_DELETE_ORGANIZATION" + case cloudProjectDeletePath = "TUIST_CLOUD_PROJECT_DELETE_PATH" + + // CLOUD PROJECT CREATE + case cloudProjectCreateName = "TUIST_CLOUD_PROJECT_CREATE_NAME" + case cloudProjectCreateOrganization = "TUIST_CLOUD_PROJECT_CREATE_ORGANIZATION" + case cloudProjectCreatePath = "TUIST_CLOUD_PROJECT_CREATE_PATH" + + // CLOUD INIT + case cloudInitName = "TUIST_CLOUD_INIT_NAME" + case cloudInitOrganization = "TUIST_CLOUD_INIT_ORGANIZATION" + case cloudInitPath = "TUIST_CLOUD_INIT_PATH" + + // CLOUD ORGANIZATION INVITE + case cloudOrganizationInviteOrganizationName = "TUIST_CLOUD_ORGANIZATION_INVITE_ORGANIZATION_NAME" + case cloudOrganizationInviteEmail = "TUIST_CLOUD_ORGANIZATION_INVITE_EMAIL" + case cloudOrganizationInvitePath = "TUIST_CLOUD_ORGANIZATION_INVITE_PATH" + + // CLOUD ORGANIZATION SHOW + case cloudOrganizationShowOrganizationName = "TUIST_CLOUD_ORGANIZATION_SHOW_ORGANIZATION_NAME" + case cloudOrganizationShowJson = "TUIST_CLOUD_ORGANIZATION_SHOW_JSON" + case cloudOrganizationShowPath = "TUIST_CLOUD_ORGANIZATION_SHOW_PATH" + + // CLOUD PROJECT LIST + case cloudProjectListJson = "TUIST_CLOUD_PROJECT_LIST_JSON" + case cloudProjectListPath = "TUIST_CLOUD_PROJECT_LIST_PATH" + + // CLOUD ORGANIZATION UPDATE MEMBER + case cloudOrganizationUpdateMemberOrganizationName = "TUIST_CLOUD_ORGANIZATION_UPDATE_MEMBER_ORGANIZATION_NAME" + case cloudOrganizationUpdateMemberUsername = "TUIST_CLOUD_ORGANIZATION_UPDATE_MEMBER_USERNAME" + case cloudOrganizationUpdateMemberRole = "TUIST_CLOUD_ORGANIZATION_UPDATE_MEMBER_ROLE" + case cloudOrganizationUpdateMemberPath = "TUIST_CLOUD_ORGANIZATION_UPDATE_MEMBER_PATH" + + // CLOUD AUTH + case cloudAuthPath = "TUIST_CLOUD_AUTH_PATH" + + // CLOUD SESSION + case cloudSessionPath = "TUIST_CLOUD_SESSION_PATH" + + // CLOUD LOGOUT + case cloudLogoutPath = "TUIST_CLOUD_LOGOUT_PATH" + + // CLOUD ANALYTICS + case cloudAnalyticsPath = "TUIST_CLOUD_ANALYTICS_PATH" + + // CLOUD CLEAN + case cloudCleanPath = "TUIST_CLOUD_CLEAN_PATH" +} + +extension EnvKey { + var envValueString: String? { + Environment.shared.tuistVariables[rawValue] + } + + func envValue() -> T? { + guard let envValueString else { + return nil + } + return T(argument: envValueString) + } + + func envValue() -> [T] { + guard let envValueString else { + return [] + } + return envValueString.split(separator: ",").compactMap { T(argument: String($0)) } + } +} diff --git a/Sources/TuistKit/Commands/EnvKey/ParseableArgument+Extension.swift b/Sources/TuistKit/Commands/EnvKey/ParseableArgument+Extension.swift new file mode 100644 index 00000000000..5faf69b7801 --- /dev/null +++ b/Sources/TuistKit/Commands/EnvKey/ParseableArgument+Extension.swift @@ -0,0 +1,221 @@ +import ArgumentParser +import Foundation +import TuistSupport + +extension Option { + public init( + wrappedValue value: [T] = [], + name: NameSpecification = .long, + parsing parsingStrategy: ArrayParsingStrategy = .singleValue, + help: ArgumentHelp? = nil, + completion: CompletionKind? = nil, + envKey: EnvKey + ) where T: ExpressibleByArgument, Value == [T] { + let envValue: Value? = envKey.envValue() + if let envValue { + self.init( + wrappedValue: envValue, + name: name, + parsing: parsingStrategy, + help: help?.withEnvKey(envKey), + completion: completion + ) + } else { + self.init( + wrappedValue: value, + name: name, + parsing: parsingStrategy, + help: help?.withEnvKey(envKey), + completion: completion + ) + } + } + + public init( + name: NameSpecification = .long, + parsing parsingStrategy: SingleValueParsingStrategy = .next, + help: ArgumentHelp? = nil, + completion: CompletionKind? = nil, + envKey: EnvKey + ) where T: ExpressibleByArgument, Value == T? { + if let value: T = envKey.envValue() { + self.init( + wrappedValue: value, + parsing: parsingStrategy, + help: help?.withEnvKey(envKey), + completion: completion + ) { argument in + T(argument: argument) + } + } else { + self.init( + name: name, + parsing: parsingStrategy, + help: help?.withEnvKey(envKey), + completion: completion + ) + } + } + + init( + wrappedValue value: Value, + name: NameSpecification = .long, + parsing parsingStrategy: SingleValueParsingStrategy = .next, + help: ArgumentHelp? = nil, + completion: CompletionKind? = nil, + envKey: EnvKey + ) where Value: ExpressibleByArgument { + let envValue: Value? = envKey.envValue() + if let envValue { + self.init( + wrappedValue: envValue, + name: name, + parsing: parsingStrategy, + help: help?.withEnvKey(envKey), + completion: completion + ) + } else { + self.init( + wrappedValue: value, + name: name, + parsing: parsingStrategy, + help: help?.withEnvKey(envKey), + completion: completion + ) + } + } + + init( + name: NameSpecification = .long, + parsing parsingStrategy: SingleValueParsingStrategy = .next, + help: ArgumentHelp? = nil, + completion: CompletionKind? = nil, + envKey: EnvKey + ) where Value: ExpressibleByArgument { + let envValue: Value? = envKey.envValue() + if let envValue { + self.init( + wrappedValue: envValue, + name: name, + parsing: parsingStrategy, + help: help?.withEnvKey(envKey), + completion: completion + ) + } else { + self.init( + name: name, + parsing: parsingStrategy, + help: help?.withEnvKey(envKey), + completion: completion + ) + } + } +} + +extension Flag where Value == Bool { + public init( + wrappedValue: Bool, + name: NameSpecification = .long, + help: ArgumentHelp? = nil, + envKey: EnvKey + ) { + if let envValue: Value = envKey.envValue() { + self.init( + wrappedValue: envValue, + name: name, + inversion: .prefixedNo, + help: help?.withEnvKey(envKey) + ) + } else { + self.init( + wrappedValue: wrappedValue, + name: name, + inversion: .prefixedNo, + help: help?.withEnvKey(envKey) + ) + } + } +} + +// Argument Extensions +extension Argument { + init( + wrappedValue value: [T] = [], + parsing parsingStrategy: ArgumentArrayParsingStrategy = .remaining, + help: ArgumentHelp? = nil, + completion: CompletionKind? = nil, + envKey: EnvKey + ) where T: ExpressibleByArgument, Value == [T] { + let envValue: Value? = envKey.envValue() + if let envValue { + self.init( + wrappedValue: envValue, + parsing: parsingStrategy, + help: help?.withEnvKey(envKey), + completion: completion + ) + } else { + self.init( + wrappedValue: value, + parsing: parsingStrategy, + help: help?.withEnvKey(envKey), + completion: completion + ) + } + } + + init( + help: ArgumentHelp? = nil, + completion: CompletionKind? = nil, + envKey: EnvKey + ) where Value: ExpressibleByArgument { + let envValue: Value? = envKey.envValue() + if let envValue { + self.init(wrappedValue: envValue, help: help?.withEnvKey(envKey), completion: completion) + } else { + self.init(help: help?.withEnvKey(envKey), completion: completion) + } + } + + init( + wrappedValue value: Value, + help: ArgumentHelp? = nil, + envKey: EnvKey + ) where Value: ExpressibleByArgument { + let envValue: Value? = envKey.envValue() + if let envValue { + self.init(wrappedValue: envValue, help: help?.withEnvKey(envKey)) + } else { + self.init(wrappedValue: value, help: help?.withEnvKey(envKey)) + } + } + + public init( + help: ArgumentHelp? = nil, + completion: CompletionKind? = nil, + envKey: EnvKey + ) where T: ExpressibleByArgument, Value == T? { + if let value: T = envKey.envValue() { + self.init( + wrappedValue: value, + help: help?.withEnvKey(envKey), + completion: completion + ) { argument in + T(argument: argument) + } + } else { + self.init( + help: help?.withEnvKey(envKey), + completion: completion + ) + } + } +} + +extension ArgumentHelp { + func withEnvKey(_ envKey: EnvKey) -> ArgumentHelp { + var help = self + help.abstract += " (env: \(envKey.rawValue))" + return help + } +} diff --git a/Sources/TuistKit/Commands/GenerateCommand.swift b/Sources/TuistKit/Commands/GenerateCommand.swift index 6438aad00a8..24072bdf186 100644 --- a/Sources/TuistKit/Commands/GenerateCommand.swift +++ b/Sources/TuistKit/Commands/GenerateCommand.swift @@ -24,7 +24,8 @@ public struct GenerateCommand: AsyncParsableCommand, HasTrackableParameters { @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .generatePath ) var path: String? @@ -37,15 +38,16 @@ public struct GenerateCommand: AsyncParsableCommand, HasTrackableParameters { @Flag( name: .shortAndLong, - help: "Don't open the project after generating it." + help: "Don't open the project after generating it.", + envKey: .generateOpen ) - var noOpen: Bool = false + var open: Bool = true @Flag( - name: [.customLong("no-binary-cache")], - help: "Ignore binary cache and use sources only." + help: "Ignore binary cache and use sources only.", + envKey: .generateBinaryCache ) - var ignoreBinaryCache: Bool = false + var binaryCache: Bool = true @Option( name: .shortAndLong, @@ -57,8 +59,8 @@ public struct GenerateCommand: AsyncParsableCommand, HasTrackableParameters { defer { GenerateCommand.analyticsDelegate?.addParameters( [ - "no_open": AnyCodable(noOpen), - "no_binary_cache": AnyCodable(ignoreBinaryCache), + "no_open": AnyCodable(!open), + "no_binary_cache": AnyCodable(!binaryCache), "n_targets": AnyCodable(sources.count), "cacheable_targets": AnyCodable(CacheAnalyticsStore.shared.cacheableTargets), "local_cache_target_hits": AnyCodable(CacheAnalyticsStore.shared.localCacheTargetsHits), @@ -75,9 +77,9 @@ public struct GenerateCommand: AsyncParsableCommand, HasTrackableParameters { ).run( path: path, sources: Set(sources), - noOpen: noOpen, + noOpen: !open, configuration: configuration, - ignoreBinaryCache: ignoreBinaryCache + ignoreBinaryCache: !binaryCache ) } } diff --git a/Sources/TuistKit/Commands/GraphCommand.swift b/Sources/TuistKit/Commands/GraphCommand.swift index 4ef2e188a70..3621e4cdcc3 100644 --- a/Sources/TuistKit/Commands/GraphCommand.swift +++ b/Sources/TuistKit/Commands/GraphCommand.swift @@ -24,53 +24,64 @@ public struct GraphCommand: AsyncParsableCommand, HasTrackableParameters { @Flag( name: [.customShort("t"), .long], - help: "Skip Test targets during graph rendering." + help: "Skip Test targets during graph rendering.", + envKey: .graphSkipTestTargets ) var skipTestTargets: Bool = false @Flag( name: [.customShort("d"), .long], - help: "Skip external dependencies." + help: "Skip external dependencies.", + envKey: .graphSkipExternalDependencies ) var skipExternalDependencies: Bool = false @Option( name: [.customShort("l"), .long], - help: "A platform to filter. Only targets for this platform will be showed in the graph. Available platforms: ios, macos, tvos, watchos" + help: "A platform to filter. Only targets for this platform will be showed in the graph. Available platforms: ios, macos, tvos, watchos", + envKey: .graphPlatform ) var platform: Platform? @Option( name: [.customShort("f"), .long], - help: "Available formats: dot, json, png, svg" + help: "Available formats: dot, json, png, svg", + envKey: .graphFormat ) var format: GraphFormat = .png @Flag( - name: .shortAndLong, - help: "Don't open the file after generating it." + name: .long, + help: "Don't open the file after generating it.", + envKey: .graphOpen ) - var noOpen: Bool = false + var open: Bool = true @Option( name: [.customShort("a"), .customLong("algorithm")], - help: "Available formats: dot, neato, twopi, circo, fdp, sfdp, patchwork" + help: "Available formats: dot, neato, twopi, circo, fdp, sfdp, patchwork", + envKey: .graphLayoutAlgorithm ) var layoutAlgorithm: GraphViz.LayoutAlgorithm = .dot - @Argument(help: "A list of targets to filter. Those and their dependent targets will be showed in the graph.") + @Argument( + help: "A list of targets to filter. Those and their dependent targets will be showed in the graph.", + envKey: .graphTargets + ) var targets: [String] = [] @Option( name: .shortAndLong, help: "The path to the directory that contains the project whose targets will be cached.", - completion: .directory + completion: .directory, + envKey: .graphPath ) var path: String? @Option( name: .shortAndLong, - help: "The path where the graph will be generated." + help: "The path where the graph will be generated.", + envKey: .graphOutputPath ) var outputPath: String? @@ -88,7 +99,7 @@ public struct GraphCommand: AsyncParsableCommand, HasTrackableParameters { layoutAlgorithm: layoutAlgorithm, skipTestTargets: skipTestTargets, skipExternalDependencies: skipExternalDependencies, - open: !noOpen, + open: open, platformToFilter: platform, targetsToFilter: targets, path: path.map { try AbsolutePath(validating: $0) } ?? FileHandler.shared.currentPath, @@ -99,10 +110,20 @@ public struct GraphCommand: AsyncParsableCommand, HasTrackableParameters { } } -enum GraphFormat: String, ExpressibleByArgument { +enum GraphFormat: String, ExpressibleByArgument, CaseIterable { case dot, json, png, svg } -extension GraphViz.LayoutAlgorithm: ExpressibleByArgument {} - -extension TuistGraph.Platform: ExpressibleByArgument {} +extension GraphViz.LayoutAlgorithm: ExpressibleByArgument { + public static var allValueStrings: [String] { + [ + LayoutAlgorithm.dot.rawValue, + LayoutAlgorithm.neato.rawValue, + LayoutAlgorithm.twopi.rawValue, + LayoutAlgorithm.circo.rawValue, + LayoutAlgorithm.fdp.rawValue, + LayoutAlgorithm.sfdp.rawValue, + LayoutAlgorithm.patchwork.rawValue, + ] + } +} diff --git a/Sources/TuistKit/Commands/InitCommand.swift b/Sources/TuistKit/Commands/InitCommand.swift index c2e39ea27ca..17bcc428ff1 100644 --- a/Sources/TuistKit/Commands/InitCommand.swift +++ b/Sources/TuistKit/Commands/InitCommand.swift @@ -25,26 +25,30 @@ public struct InitCommand: ParsableCommand, HasTrackableParameters { @Option( help: "The platform (ios, tvos, visionos, watchos or macos) the product will be for (Default: ios)", - completion: .list(["ios", "tvos", "macos", "visionos", "watchos"]) + completion: .list(["ios", "tvos", "macos", "visionos", "watchos"]), + envKey: .initPlatform ) var platform: String? @Option( name: .shortAndLong, help: "The path to the folder where the project will be generated. (Default: Current directory)", - completion: .directory + completion: .directory, + envKey: .initPath ) var path: String? @Option( name: .shortAndLong, - help: "The name of the project. (Default: Name of the current directory)" + help: "The name of the project. (Default: Name of the current directory)", + envKey: .initName ) var name: String? @Option( name: .shortAndLong, - help: "The name of the template to use (you can list available templates with tuist scaffold list)" + help: "The name of the template to use (you can list available templates with tuist scaffold list)", + envKey: .initTemplate ) var template: String? diff --git a/Sources/TuistKit/Commands/InstallCommand.swift b/Sources/TuistKit/Commands/InstallCommand.swift index 84aaa87d3cb..d981a9c788b 100644 --- a/Sources/TuistKit/Commands/InstallCommand.swift +++ b/Sources/TuistKit/Commands/InstallCommand.swift @@ -15,13 +15,15 @@ public struct InstallCommand: AsyncParsableCommand { @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", - completion: .directory + completion: .directory, + envKey: .installPath ) var path: String? @Flag( name: .shortAndLong, - help: "Instead of simple install, update external content when available." + help: "Instead of simple install, update external content when available.", + envKey: .installUpdate ) var update: Bool = false diff --git a/Sources/TuistKit/Commands/ListCommand.swift b/Sources/TuistKit/Commands/ListCommand.swift index 4f59861ca74..e560f27f0ce 100644 --- a/Sources/TuistKit/Commands/ListCommand.swift +++ b/Sources/TuistKit/Commands/ListCommand.swift @@ -14,14 +14,16 @@ public struct ListCommand: AsyncParsableCommand { } @Flag( - help: "The output in JSON format" + help: "The output in JSON format", + envKey: .scaffoldListJson ) var json: Bool = false @Option( name: .shortAndLong, help: "The path where you want to list templates from", - completion: .directory + completion: .directory, + envKey: .scaffoldListPath ) var path: String? diff --git a/Sources/TuistKit/Commands/Migration/MigrationCheckEmptyBuildSettingsCommand.swift b/Sources/TuistKit/Commands/Migration/MigrationCheckEmptyBuildSettingsCommand.swift index 5528451346e..89a4cc0dedd 100644 --- a/Sources/TuistKit/Commands/Migration/MigrationCheckEmptyBuildSettingsCommand.swift +++ b/Sources/TuistKit/Commands/Migration/MigrationCheckEmptyBuildSettingsCommand.swift @@ -15,13 +15,15 @@ struct MigrationCheckEmptyBuildSettingsCommand: ParsableCommand { @Option( name: [.customShort("p"), .long], help: "The path to the Xcode project", - completion: .directory + completion: .directory, + envKey: .migrationCheckEmptySettingsXcodeprojPath ) var xcodeprojPath: String @Option( name: .shortAndLong, - help: "The name of the target whose build settings will be checked. When not passed, it checks the build settings of the project." + help: "The name of the target whose build settings will be checked. When not passed, it checks the build settings of the project.", + envKey: .migrationCheckEmptySettingsTarget ) var target: String? diff --git a/Sources/TuistKit/Commands/Migration/MigrationSettingsToXCConfigCommand.swift b/Sources/TuistKit/Commands/Migration/MigrationSettingsToXCConfigCommand.swift index 8fd1e20ccd6..3b67107d822 100644 --- a/Sources/TuistKit/Commands/Migration/MigrationSettingsToXCConfigCommand.swift +++ b/Sources/TuistKit/Commands/Migration/MigrationSettingsToXCConfigCommand.swift @@ -15,21 +15,24 @@ struct MigrationSettingsToXCConfigCommand: ParsableCommand { @Option( name: [.customShort("p"), .long], help: "The path to the Xcode project", - completion: .directory + completion: .directory, + envKey: .migrationSettingsToXcconfigXcodeprojPath ) var xcodeprojPath: String @Option( name: [.customShort("x"), .long], help: "The path to the .xcconfig file where build settings will be extracted.", - completion: .directory + completion: .directory, + envKey: .migrationSettingsToXcconfigXcconfigPath ) var xcconfigPath: String @Option( name: .shortAndLong, help: "The name of the target whose build settings will be extracted. When not passed, it extracts the build settings of the project.", - completion: .default + completion: .default, + envKey: .migrationSettingsToXcconfigTarget ) var target: String? diff --git a/Sources/TuistKit/Commands/Migration/MigrationTargetsByDependenciesCommand.swift b/Sources/TuistKit/Commands/Migration/MigrationTargetsByDependenciesCommand.swift index 243d9cef8c0..e0e82c689f9 100644 --- a/Sources/TuistKit/Commands/Migration/MigrationTargetsByDependenciesCommand.swift +++ b/Sources/TuistKit/Commands/Migration/MigrationTargetsByDependenciesCommand.swift @@ -17,7 +17,8 @@ public struct MigrationTargetsByDependenciesCommand: ParsableCommand { @Option( name: [.customShort("p"), .long], help: "The path to the Xcode project", - completion: .directory + completion: .directory, + envKey: .migrationListTargetsXcodeprojPath ) var xcodeprojPath: String diff --git a/Sources/TuistKit/Commands/Plugin/PluginArchiveCommand.swift b/Sources/TuistKit/Commands/Plugin/PluginArchiveCommand.swift index dd111705a97..5e56107ae11 100644 --- a/Sources/TuistKit/Commands/Plugin/PluginArchiveCommand.swift +++ b/Sources/TuistKit/Commands/Plugin/PluginArchiveCommand.swift @@ -2,7 +2,7 @@ import ArgumentParser import Foundation import TSCBasic -struct PluginArchiveCommannd: ParsableCommand { +struct PluginArchiveCommand: ParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "archive", @@ -13,7 +13,8 @@ struct PluginArchiveCommannd: ParsableCommand { @Option( name: .shortAndLong, help: "The path to the directory that contains the definition of the plugin.", - completion: .directory + completion: .directory, + envKey: .pluginArchivePath ) var path: String? diff --git a/Sources/TuistKit/Commands/Plugin/PluginBuildCommand.swift b/Sources/TuistKit/Commands/Plugin/PluginBuildCommand.swift index 108d8aa80f5..1611c0a138e 100644 --- a/Sources/TuistKit/Commands/Plugin/PluginBuildCommand.swift +++ b/Sources/TuistKit/Commands/Plugin/PluginBuildCommand.swift @@ -16,22 +16,26 @@ public struct PluginBuildCommand: ParsableCommand { var pluginOptions: PluginCommand.PluginOptions @Flag( - help: "Build both source and test targets." + help: "Build both source and test targets.", + envKey: .pluginBuildBuildTests ) var buildTests = false @Flag( - help: "Print the binary output path." + help: "Print the binary output path.", + envKey: .pluginBuildShowBinPath ) var showBinPath = false @Option( - help: "Build the specified targets." + help: "Build the specified targets.", + envKey: .pluginBuildTargets ) var targets: [String] = [] @Option( - help: "Build the specified products." + help: "Build the specified products.", + envKey: .pluginBuildProducts ) var products: [String] = [] diff --git a/Sources/TuistKit/Commands/Plugin/PluginCommand.swift b/Sources/TuistKit/Commands/Plugin/PluginCommand.swift index 05075aa87d4..de8d6df3052 100644 --- a/Sources/TuistKit/Commands/Plugin/PluginCommand.swift +++ b/Sources/TuistKit/Commands/Plugin/PluginCommand.swift @@ -8,7 +8,7 @@ struct PluginCommand: ParsableCommand { commandName: "plugin", abstract: "A set of commands for plugin's management.", subcommands: [ - PluginArchiveCommannd.self, + PluginArchiveCommand.self, PluginBuildCommand.self, PluginRunCommand.self, PluginTestCommand.self, @@ -16,21 +16,23 @@ struct PluginCommand: ParsableCommand { ) } - enum PackageConfiguration: String, ExpressibleByArgument, RawRepresentable { + enum PackageConfiguration: String, ExpressibleByArgument, RawRepresentable, EnumerableFlag { case debug, release } struct PluginOptions: ParsableArguments { @Option( name: .shortAndLong, - help: "Choose configuration (default: debug)." + help: "Choose configuration (default: debug).", + envKey: .pluginOptionsConfiguration ) var configuration: PackageConfiguration = .debug @Option( name: .shortAndLong, help: "The path to the directory that contains the definition of the plugin.", - completion: .directory + completion: .directory, + envKey: .pluginOptionsPath ) var path: String? } diff --git a/Sources/TuistKit/Commands/Plugin/PluginRunCommand.swift b/Sources/TuistKit/Commands/Plugin/PluginRunCommand.swift index 34c27eebc4a..3bd646e05de 100644 --- a/Sources/TuistKit/Commands/Plugin/PluginRunCommand.swift +++ b/Sources/TuistKit/Commands/Plugin/PluginRunCommand.swift @@ -16,22 +16,26 @@ public struct PluginRunCommand: ParsableCommand { var pluginOptions: PluginCommand.PluginOptions @Flag( - help: "Build both source and test targets." + help: "Build both source and test targets.", + envKey: .pluginRunBuildTests ) - var buildTests = false + var buildTests: Bool = false @Flag( - help: "Skip building the plugin." + help: "Skip building the plugin.", + envKey: .pluginRunSkipBuild ) - var skipBuild = false + var skipBuild: Bool = false @Argument( - help: "The plugin task to run." + help: "The plugin task to run.", + envKey: .pluginRunTask ) var task: String @Argument( - help: "The arguments to pass to the plugin task." + help: "The arguments to pass to the plugin task.", + envKey: .pluginRunArguments ) var arguments: [String] = [] diff --git a/Sources/TuistKit/Commands/Plugin/PluginTestCommand.swift b/Sources/TuistKit/Commands/Plugin/PluginTestCommand.swift index 76da4a1cdf5..ad447945a26 100644 --- a/Sources/TuistKit/Commands/Plugin/PluginTestCommand.swift +++ b/Sources/TuistKit/Commands/Plugin/PluginTestCommand.swift @@ -8,6 +8,7 @@ public struct PluginTestCommand: ParsableCommand { public static var configuration: CommandConfiguration { CommandConfiguration( commandName: "test", + abstract: "Tests a plugin." ) } @@ -16,12 +17,14 @@ public struct PluginTestCommand: ParsableCommand { var pluginOptions: PluginCommand.PluginOptions @Flag( - help: "Build both source and test targets." + help: "Build both source and test targets.", + envKey: .pluginTestBuildTests ) var buildTests = false @Option( - help: "Test the specified products." + help: "Test the specified products.", + envKey: .pluginTestTestProducts ) var testProducts: [String] = [] diff --git a/Sources/TuistKit/Commands/RunCommand.swift b/Sources/TuistKit/Commands/RunCommand.swift index 44c72e4ecd4..4f4948dfea4 100644 --- a/Sources/TuistKit/Commands/RunCommand.swift +++ b/Sources/TuistKit/Commands/RunCommand.swift @@ -24,10 +24,16 @@ public struct RunCommand: AsyncParsableCommand { ) } - @Flag(help: "Force the generation of the project before running.") + @Flag( + help: "Force the generation of the project before running.", + envKey: .runGenerate + ) var generate: Bool = false - @Flag(help: "When passed, it cleans the project before running.") + @Flag( + help: "When passed, it cleans the project before running.", + envKey: .runClean + ) var clean: Bool = false @Option( @@ -48,7 +54,8 @@ public struct RunCommand: AsyncParsableCommand { @Option( name: .shortAndLong, - help: "The OS version of the simulator." + help: "The OS version of the simulator.", + envKey: .runOS ) var os: String? @@ -58,12 +65,16 @@ public struct RunCommand: AsyncParsableCommand { ) var rosetta: Bool = false - @Argument(help: "The scheme to be run.") + @Argument( + help: "The scheme to be run.", + envKey: .runScheme + ) var scheme: String @Argument( parsing: .captureForPassthrough, - help: "The arguments to pass to the runnable target during execution." + help: "The arguments to pass to the runnable target during execution.", + envKey: .runArguments ) var arguments: [String] = [] diff --git a/Sources/TuistKit/Commands/ScaffoldCommand.swift b/Sources/TuistKit/Commands/ScaffoldCommand.swift index 2899a50af45..b2799b8cfce 100644 --- a/Sources/TuistKit/Commands/ScaffoldCommand.swift +++ b/Sources/TuistKit/Commands/ScaffoldCommand.swift @@ -35,19 +35,22 @@ public struct ScaffoldCommand: AsyncParsableCommand { } @Flag( - help: "The output in JSON format" + help: "The output in JSON format", + envKey: .scaffoldJson ) var json: Bool = false @Option( name: .shortAndLong, help: "The path to the folder where the template will be generated (Default: Current directory)", - completion: .directory + completion: .directory, + envKey: .scaffoldPath ) var path: String? @Argument( - help: "Name of template you want to use" + help: "Name of template you want to use", + envKey: .scaffoldTemplate ) var template: String diff --git a/Sources/TuistKit/Commands/TestCommand.swift b/Sources/TuistKit/Commands/TestCommand.swift index 3ce71b53a15..00019365bc1 100644 --- a/Sources/TuistKit/Commands/TestCommand.swift +++ b/Sources/TuistKit/Commands/TestCommand.swift @@ -24,78 +24,94 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { } @Argument( - help: "The scheme to be tested. By default it tests all the testable targets of the project in the current directory." + help: "The scheme to be tested. By default it tests all the testable targets of the project in the current directory.", + envKey: .testScheme ) var scheme: String? @Flag( name: .shortAndLong, - help: "When passed, it cleans the project before testing it." + help: "When passed, it cleans the project before testing it.", + envKey: .testClean ) var clean: Bool = false @Option( name: .shortAndLong, - help: "The path to the directory that contains the project to be tested." + help: "The path to the directory that contains the project to be tested.", + completion: .directory, + envKey: .testPath ) var path: String? @Option( name: .shortAndLong, - help: "Test on a specific device." + help: "Test on a specific device.", + envKey: .testDevice ) var device: String? @Option( name: .long, - help: "Test on a specific platform." + help: "Test on a specific platform.", + envKey: .testPlatform ) var platform: String? @Option( name: .shortAndLong, - help: "Test with a specific version of the OS." + help: "Test with a specific version of the OS.", + envKey: .testOS ) var os: String? @Flag( name: .long, - help: "When passed, append arch=x86_64 to the 'destination' to run simulator in a Rosetta mode." + help: "When passed, append arch=x86_64 to the 'destination' to run simulator in a Rosetta mode.", + envKey: .testRosetta ) var rosetta: Bool = false @Option( name: [.long, .customShort("C")], - help: "The configuration to be used when testing the scheme." + help: "The configuration to be used when testing the scheme.", + envKey: .testConfiguration ) var configuration: String? @Flag( name: .long, - help: "When passed, it skips testing UI Tests targets." + help: "When passed, it skips testing UI Tests targets.", + envKey: .testSkipUITests ) var skipUITests: Bool = false @Option( name: [.long, .customShort("T")], - help: "Path where test result bundle will be saved." + help: "Path where test result bundle will be saved.", + completion: .directory, + envKey: .testResultBundlePath ) var resultBundlePath: String? @Option( - help: "[Deprecated] Overrides the folder that should be used for derived data when testing a project." + help: "[Deprecated] Overrides the folder that should be used for derived data when testing a project.", + completion: .directory, + envKey: .testDerivedDataPath ) var derivedDataPath: String? @Option( name: .long, - help: "[Deprecated] Tests will retry of times until success. Example: if 1 is specified, the test will be retried at most once, hence it will run up to 2 times." + help: "[Deprecated] Tests will retry of times until success. Example: if 1 is specified, the test will be retried at most once, hence it will run up to 2 times.", + envKey: .testRetryCount ) var retryCount: Int = 0 @Option( name: .long, - help: "The test plan to run." + help: "The test plan to run.", + envKey: .testTestPlan ) var testPlan: String? @@ -103,7 +119,7 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { name: .long, parsing: .upToNextOption, help: "The list of test identifiers you want to test. Expected format is TestTarget[/TestClass[/TestMethod]]. It is applied before --skip-testing", - transform: TestIdentifier.init(string:) + envKey: .testTestTargets ) var testTargets: [TestIdentifier] = [] @@ -111,39 +127,42 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { name: .long, parsing: .upToNextOption, help: "The list of test identifiers you want to skip testing. Expected format is TestTarget[/TestClass[/TestMethod]].", - transform: TestIdentifier.init(string:) + envKey: .testSkipTestTargets ) var skipTestTargets: [TestIdentifier] = [] @Option( name: .customLong("filter-configurations"), parsing: .upToNextOption, - help: "The list of configurations you want to test. It is applied before --skip-configuration" + help: "The list of configurations you want to test. It is applied before --skip-configuration", + envKey: .testConfigurations ) var configurations: [String] = [] @Option( name: .long, parsing: .upToNextOption, - help: "The list of configurations you want to skip testing." + help: "The list of configurations you want to skip testing.", + envKey: .testSkipConfigurations ) var skipConfigurations: [String] = [] @Flag( - name: [.customLong("no-binary-cache")], - help: "Ignore binary cache and use sources only." + help: "Ignore binary cache and use sources only.", + envKey: .testBinaryCache ) - var ignoreBinaryCache: Bool = false + var binaryCache: Bool = true @Flag( - name: [.customLong("no-selective-testing")], - help: "Run all tests instead of selectively test only those that have changed since the last successful test run." + help: "Run all tests instead of selectively test only those that have changed since the last successful test run.", + envKey: .testSelectiveTesting ) - var ignoreSelectiveTesting: Bool = false + var selectiveTesting: Bool = true @Flag( name: .long, - help: "When passed, it generates the project and skips testing. This is useful for debugging purposes." + help: "When passed, it generates the project and skips testing. This is useful for debugging purposes.", + envKey: .testGenerateOnly ) var generateOnly: Bool = false @@ -201,8 +220,8 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { defer { var parameters: [String: AnyCodable] = [ - "no_binary_cache": AnyCodable(ignoreBinaryCache), - "no_selective_testing": AnyCodable(ignoreSelectiveTesting), + "no_binary_cache": AnyCodable(!binaryCache), + "no_selective_testing": AnyCodable(!selectiveTesting), ] parameters["cacheable_targets"] = AnyCodable(CacheAnalyticsStore.shared.cacheableTargets) parameters["local_cache_target_hits"] = AnyCodable(CacheAnalyticsStore.shared.localCacheTargetsHits) @@ -248,10 +267,20 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { ) }, validateTestTargetsParameters: false, - ignoreBinaryCache: ignoreBinaryCache, - ignoreSelectiveTesting: ignoreSelectiveTesting, + ignoreBinaryCache: !binaryCache, + ignoreSelectiveTesting: !selectiveTesting, generateOnly: generateOnly, passthroughXcodeBuildArguments: passthroughXcodeBuildArguments ) } } + +extension TestIdentifier: ExpressibleByArgument { + public init?(argument: String) { + do { + try self.init(string: argument) + } catch { + return nil + } + } +} diff --git a/Sources/TuistKit/Services/BuildService.swift b/Sources/TuistKit/Services/BuildService.swift index 167aa32c300..e5ee39fe325 100644 --- a/Sources/TuistKit/Services/BuildService.swift +++ b/Sources/TuistKit/Services/BuildService.swift @@ -66,7 +66,7 @@ public final class BuildService { derivedDataPath: String?, path: AbsolutePath, device: String?, - platform: String?, + platform: Platform?, osVersion: String?, rosetta: Bool, generateOnly: Bool, @@ -123,7 +123,7 @@ public final class BuildService { let buildPlatform: TuistGraph.Platform if let platform { - buildPlatform = try TuistGraph.Platform.from(commandLineValue: platform) + buildPlatform = platform } else { buildPlatform = try graphTarget.target.servicePlatform } @@ -155,7 +155,7 @@ public final class BuildService { let buildPlatform: TuistGraph.Platform if let platform { - buildPlatform = try TuistGraph.Platform.from(commandLineValue: platform) + buildPlatform = platform } else { buildPlatform = try graphTarget.target.servicePlatform } diff --git a/Sources/TuistKit/Services/CleanService.swift b/Sources/TuistKit/Services/CleanService.swift index 4587e2f22af..8bb17f51dd3 100644 --- a/Sources/TuistKit/Services/CleanService.swift +++ b/Sources/TuistKit/Services/CleanService.swift @@ -12,7 +12,7 @@ protocol CleanCategory: ExpressibleByArgument & CaseIterable { ) throws -> AbsolutePath? } -enum TuistCleanCategory: CleanCategory { +enum TuistCleanCategory: CleanCategory, Equatable { static let allCases = CacheCategory.App.allCases.map { .cloud($0) } + CacheCategory.allCases .map { .global($0) } + [Self.dependencies] diff --git a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift new file mode 100644 index 00000000000..01ab412638e --- /dev/null +++ b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift @@ -0,0 +1,940 @@ +import ArgumentParser +import Difference +import Foundation +import TSCUtility +import XCTest +@testable import TSCBasic +@testable import TuistCore +@testable import TuistKit +@testable import TuistSupport +@testable import TuistSupportTesting + +final class CommandEnvironmentVariableTests: XCTestCase { + private var mockEnvironment: MockEnvironment! + + override func setUp() { + super.setUp() + mockEnvironment = try! MockEnvironment() + Environment.shared = mockEnvironment + } + + override func tearDown() { + mockEnvironment = nil + Environment.shared = Environment() + super.tearDown() + } + + private var tuistVariables: [String: String] { + get { + return mockEnvironment.tuistVariables + } + set { + mockEnvironment.tuistVariables = newValue + } + } + + private func setVariable(_ key: EnvKey, value: String) { + mockEnvironment.tuistVariables[key.rawValue] = value + } + + func testBuildCommandUsesEnvVars() throws { + setVariable(.buildOptionsScheme, value: "Scheme1") + setVariable(.buildOptionsGenerate, value: "true") + setVariable(.buildOptionsClean, value: "true") + setVariable(.buildOptionsPath, value: "/path/to/project") + setVariable(.buildOptionsDevice, value: "iPhone") + setVariable(.buildOptionsPlatform, value: "ios") + setVariable(.buildOptionsOS, value: "14.5.0") + setVariable(.buildOptionsRosetta, value: "true") + setVariable(.buildOptionsConfiguration, value: "Debug") + setVariable(.buildOptionsOutputPath, value: "/path/to/output") + setVariable(.buildOptionsDerivedDataPath, value: "/path/to/derivedData") + setVariable(.buildOptionsGenerateOnly, value: "true") + setVariable(.buildOptionsPassthroughXcodeBuildArguments, value: "clean,-configuration,Release") + + let buildCommandWithEnvVars = try BuildCommand.parse([]) + XCTAssertEqual(buildCommandWithEnvVars.buildOptions.scheme, "Scheme1") + XCTAssertTrue(buildCommandWithEnvVars.buildOptions.generate) + XCTAssertTrue(buildCommandWithEnvVars.buildOptions.clean) + XCTAssertEqual(buildCommandWithEnvVars.buildOptions.path, "/path/to/project") + XCTAssertEqual(buildCommandWithEnvVars.buildOptions.device, "iPhone") + XCTAssertEqual(buildCommandWithEnvVars.buildOptions.platform, .iOS) + XCTAssertEqual(buildCommandWithEnvVars.buildOptions.os, "14.5.0") + XCTAssertTrue(buildCommandWithEnvVars.buildOptions.rosetta) + XCTAssertEqual(buildCommandWithEnvVars.buildOptions.configuration, "Debug") + XCTAssertEqual(buildCommandWithEnvVars.buildOptions.buildOutputPath, "/path/to/output") + XCTAssertEqual(buildCommandWithEnvVars.buildOptions.derivedDataPath, "/path/to/derivedData") + XCTAssertTrue(buildCommandWithEnvVars.buildOptions.generateOnly) + XCTAssertEqual( + buildCommandWithEnvVars.buildOptions.passthroughXcodeBuildArguments, + ["clean", "-configuration", "Release"] + ) + + let buildCommandWithArgs = try BuildCommand.parse([ + "Scheme2", + "--generate", + "--no-clean", + "--path", "/new/path", + "--device", "iPad", + "--platform", "tvos", + "--no-rosetta", + "--configuration", "Release", + "--build-output-path", "/new/output", + "--derived-data-path", "/new/derivedData", + "--no-generate-only", + "--", + "-configuration", "Debug", + ]) + XCTAssertEqual(buildCommandWithArgs.buildOptions.scheme, "Scheme2") + XCTAssertTrue(buildCommandWithArgs.buildOptions.generate) + XCTAssertFalse(buildCommandWithArgs.buildOptions.clean) + XCTAssertEqual(buildCommandWithArgs.buildOptions.path, "/new/path") + XCTAssertEqual(buildCommandWithArgs.buildOptions.device, "iPad") + XCTAssertEqual(buildCommandWithArgs.buildOptions.platform, .tvOS) + XCTAssertFalse(buildCommandWithArgs.buildOptions.rosetta) + XCTAssertEqual(buildCommandWithArgs.buildOptions.configuration, "Release") + XCTAssertEqual(buildCommandWithArgs.buildOptions.buildOutputPath, "/new/output") + XCTAssertEqual(buildCommandWithArgs.buildOptions.derivedDataPath, "/new/derivedData") + XCTAssertFalse(buildCommandWithArgs.buildOptions.generateOnly) + XCTAssertEqual(buildCommandWithArgs.buildOptions.passthroughXcodeBuildArguments, ["-configuration", "Debug"]) + } + + func testCleanCommandUsesEnvVars() throws { + setVariable(.cleanCleanCategories, value: "dependencies") + setVariable(.cleanPath, value: "/path/to/clean") + + let cleanCommandWithEnvVars = try CleanCommand.parse([]) + XCTAssertEqual(cleanCommandWithEnvVars.cleanCategories, [TuistCleanCategory.dependencies]) + XCTAssertEqual(cleanCommandWithEnvVars.path, "/path/to/clean") + + let cleanCommandWithArgs = try CleanCommand.parse([ + "manifests", + "--path", "/new/clean/path", + ]) + XCTAssertEqual(cleanCommandWithArgs.cleanCategories, [TuistCleanCategory.global(.manifests)]) + XCTAssertEqual(cleanCommandWithArgs.path, "/new/clean/path") + } + + func testDumpCommandUsesEnvVars() throws { + setVariable(.dumpPath, value: "/path/to/dump") + setVariable(.dumpManifest, value: "Project") + + let dumpCommandWithEnvVars = try DumpCommand.parse([]) + XCTAssertEqual(dumpCommandWithEnvVars.path, "/path/to/dump") + XCTAssertEqual(dumpCommandWithEnvVars.manifest, .project) + + let dumpCommandWithArgs = try DumpCommand.parse([ + "workspace", + "--path", "/new/dump/path", + ]) + XCTAssertEqual(dumpCommandWithArgs.path, "/new/dump/path") + XCTAssertEqual(dumpCommandWithArgs.manifest, .workspace) + } + + func testEditCommandUsesEnvVars() throws { + setVariable(.editPath, value: "/path/to/edit") + setVariable(.editPermanent, value: "true") + setVariable(.editOnlyCurrentDirectory, value: "true") + + let editCommandWithEnvVars = try EditCommand.parse([]) + XCTAssertEqual(editCommandWithEnvVars.path, "/path/to/edit") + XCTAssertTrue(editCommandWithEnvVars.permanent) + XCTAssertTrue(editCommandWithEnvVars.onlyCurrentDirectory) + + let editCommandWithArgs = try EditCommand.parse([ + "--path", "/new/edit/path", + "--no-permanent", + "--no-only-current-directory", + ]) + XCTAssertEqual(editCommandWithArgs.path, "/new/edit/path") + XCTAssertFalse(editCommandWithArgs.permanent) + XCTAssertFalse(editCommandWithArgs.onlyCurrentDirectory) + } + + func testGenerateCommandUsesEnvVars() throws { + setVariable(.generatePath, value: "/path/to/generate") + setVariable(.generateOpen, value: "false") + setVariable(.generateBinaryCache, value: "false") + + let generateCommandWithEnvVars = try GenerateCommand.parse([]) + XCTAssertEqual(generateCommandWithEnvVars.path, "/path/to/generate") + XCTAssertFalse(generateCommandWithEnvVars.open) + XCTAssertFalse(generateCommandWithEnvVars.binaryCache) + + let generateCommandWithArgs = try GenerateCommand.parse([ + "--path", "/new/generate/path", + "--open", + "--binary-cache", + ]) + XCTAssertEqual(generateCommandWithArgs.path, "/new/generate/path") + XCTAssertTrue(generateCommandWithArgs.open) + XCTAssertTrue(generateCommandWithArgs.binaryCache) + } + + func testGraphCommandUsesEnvVars() throws { + setVariable(.graphSkipTestTargets, value: "true") + setVariable(.graphSkipExternalDependencies, value: "true") + setVariable(.graphPlatform, value: "ios") + setVariable(.graphFormat, value: "svg") + setVariable(.graphOpen, value: "false") + setVariable(.graphLayoutAlgorithm, value: "circo") + setVariable(.graphTargets, value: "Target1,Target2") + setVariable(.graphPath, value: "/path/to/graph") + setVariable(.graphOutputPath, value: "/path/to/output") + + let graphCommandWithEnvVars = try GraphCommand.parse([]) + XCTAssertTrue(graphCommandWithEnvVars.skipTestTargets) + XCTAssertTrue(graphCommandWithEnvVars.skipExternalDependencies) + XCTAssertEqual(graphCommandWithEnvVars.platform, .iOS) + XCTAssertEqual(graphCommandWithEnvVars.format, .svg) + XCTAssertFalse(graphCommandWithEnvVars.open) + XCTAssertEqual(graphCommandWithEnvVars.layoutAlgorithm, .circo) + XCTAssertEqual(graphCommandWithEnvVars.targets, ["Target1", "Target2"]) + XCTAssertEqual(graphCommandWithEnvVars.path, "/path/to/graph") + XCTAssertEqual(graphCommandWithEnvVars.outputPath, "/path/to/output") + + let graphCommandWithArgs = try GraphCommand.parse([ + "--no-skip-test-targets", + "--no-skip-external-dependencies", + "--platform", "macos", + "--format", "json", + "--open", + "--algorithm", "fdp", + "Target3", "Target4", + "--path", "/new/graph/path", + "--output-path", "/new/graph/output", + ]) + XCTAssertFalse(graphCommandWithArgs.skipTestTargets) + XCTAssertFalse(graphCommandWithArgs.skipExternalDependencies) + XCTAssertEqual(graphCommandWithArgs.platform, .macOS) + XCTAssertEqual(graphCommandWithArgs.format, .json) + XCTAssertTrue(graphCommandWithArgs.open) + XCTAssertEqual(graphCommandWithArgs.layoutAlgorithm, .fdp) + XCTAssertEqual(graphCommandWithArgs.targets, ["Target3", "Target4"]) + XCTAssertEqual(graphCommandWithArgs.path, "/new/graph/path") + XCTAssertEqual(graphCommandWithArgs.outputPath, "/new/graph/output") + } + + func testInitCommandUsesEnvVars() throws { + setVariable(.initPlatform, value: "macos") + setVariable(.initName, value: "MyProject") + setVariable(.initTemplate, value: "MyTemplate") + setVariable(.initPath, value: "/path/to/init") + + let initCommandWithEnvVars = try InitCommand.parse([]) + XCTAssertEqual(initCommandWithEnvVars.name, "MyProject") + XCTAssertEqual(initCommandWithEnvVars.template, "MyTemplate") + XCTAssertEqual(initCommandWithEnvVars.path, "/path/to/init") + + let initCommandWithArgs = try InitCommand.parse([ + "--platform", "ios", + "--name", "NewProject", + "--template", "NewTemplate", + "--path", "/new/init/path", + ]) + XCTAssertEqual(initCommandWithArgs.name, "NewProject") + XCTAssertEqual(initCommandWithArgs.template, "NewTemplate") + XCTAssertEqual(initCommandWithArgs.path, "/new/init/path") + } + + func testInstallCommandUsesEnvVars() throws { + setVariable(.installPath, value: "/path/to/install") + setVariable(.installUpdate, value: "true") + + let installCommandWithEnvVars = try InstallCommand.parse([]) + XCTAssertEqual(installCommandWithEnvVars.path, "/path/to/install") + XCTAssertTrue(installCommandWithEnvVars.update) + + let installCommandWithArgs = try InstallCommand.parse([ + "--path", "/new/install/path", + "--no-update", + ]) + XCTAssertEqual(installCommandWithArgs.path, "/new/install/path") + XCTAssertFalse(installCommandWithArgs.update) + } + + func testListCommandUsesEnvVars() throws { + setVariable(.scaffoldListJson, value: "true") + setVariable(.scaffoldListPath, value: "/path/to/list") + + let listCommandWithEnvVars = try ListCommand.parse([]) + XCTAssertTrue(listCommandWithEnvVars.json) + XCTAssertEqual(listCommandWithEnvVars.path, "/path/to/list") + + let listCommandWithArgs = try ListCommand.parse([ + "--no-json", + "--path", "/new/list/path", + ]) + XCTAssertFalse(listCommandWithArgs.json) + XCTAssertEqual(listCommandWithArgs.path, "/new/list/path") + } + + func testMigrationCheckEmptyBuildSettingsCommandUsesEnvVars() throws { + setVariable(.migrationCheckEmptySettingsXcodeprojPath, value: "/path/to/xcodeproj") + setVariable(.migrationCheckEmptySettingsTarget, value: "MyTarget") + + let migrationCommandWithEnvVars = try MigrationCheckEmptyBuildSettingsCommand.parse([]) + XCTAssertEqual(migrationCommandWithEnvVars.xcodeprojPath, "/path/to/xcodeproj") + XCTAssertEqual(migrationCommandWithEnvVars.target, "MyTarget") + + let migrationCommandWithArgs = try MigrationCheckEmptyBuildSettingsCommand.parse([ + "--xcodeproj-path", "/new/xcodeproj/path", + "--target", "NewTarget", + ]) + XCTAssertEqual(migrationCommandWithArgs.xcodeprojPath, "/new/xcodeproj/path") + XCTAssertEqual(migrationCommandWithArgs.target, "NewTarget") + } + + func testMigrationSettingsToXCConfigCommandUsesEnvVars() throws { + setVariable(.migrationSettingsToXcconfigXcodeprojPath, value: "/path/to/xcodeproj") + setVariable(.migrationSettingsToXcconfigXcconfigPath, value: "/path/to/xcconfig") + setVariable(.migrationSettingsToXcconfigTarget, value: "MyTarget") + + let migrationCommandWithEnvVars = try MigrationSettingsToXCConfigCommand.parse([]) + XCTAssertEqual(migrationCommandWithEnvVars.xcodeprojPath, "/path/to/xcodeproj") + XCTAssertEqual(migrationCommandWithEnvVars.xcconfigPath, "/path/to/xcconfig") + XCTAssertEqual(migrationCommandWithEnvVars.target, "MyTarget") + + let migrationCommandWithArgs = try MigrationSettingsToXCConfigCommand.parse([ + "--xcodeproj-path", "/new/xcodeproj/path", + "--xcconfig-path", "/new/xcconfig/path", + "--target", "NewTarget", + ]) + XCTAssertEqual(migrationCommandWithArgs.xcodeprojPath, "/new/xcodeproj/path") + XCTAssertEqual(migrationCommandWithArgs.xcconfigPath, "/new/xcconfig/path") + XCTAssertEqual(migrationCommandWithArgs.target, "NewTarget") + } + + func testMigrationTargetsByDependenciesCommandUsesEnvVars() throws { + setVariable(.migrationListTargetsXcodeprojPath, value: "/path/to/xcodeproj") + + let migrationCommandWithEnvVars = try MigrationTargetsByDependenciesCommand.parse([]) + XCTAssertEqual(migrationCommandWithEnvVars.xcodeprojPath, "/path/to/xcodeproj") + + let migrationCommandWithArgs = try MigrationTargetsByDependenciesCommand.parse([ + "--xcodeproj-path", "/new/xcodeproj/path", + ]) + XCTAssertEqual(migrationCommandWithArgs.xcodeprojPath, "/new/xcodeproj/path") + } + + func testPluginArchiveCommandUsesEnvVars() throws { + setVariable(.pluginArchivePath, value: "/path/to/plugin") + + let pluginCommandWithEnvVars = try PluginArchiveCommand.parse([]) + XCTAssertEqual(pluginCommandWithEnvVars.path, "/path/to/plugin") + + let pluginCommandWithArgs = try PluginArchiveCommand.parse([ + "--path", "/new/plugin/path", + ]) + XCTAssertEqual(pluginCommandWithArgs.path, "/new/plugin/path") + } + + func testPluginBuildCommandUsesEnvVars() throws { + setVariable(.pluginOptionsPath, value: "/path/to/plugin") + setVariable(.pluginOptionsConfiguration, value: "debug") + setVariable(.pluginBuildBuildTests, value: "true") + setVariable(.pluginBuildShowBinPath, value: "true") + setVariable(.pluginBuildTargets, value: "Target1,Target2") + setVariable(.pluginBuildProducts, value: "Product1,Product2") + + let pluginCommandWithEnvVars = try PluginBuildCommand.parse([]) + XCTAssertEqual(pluginCommandWithEnvVars.pluginOptions.path, "/path/to/plugin") + XCTAssertEqual(pluginCommandWithEnvVars.pluginOptions.configuration, .debug) + XCTAssertTrue(pluginCommandWithEnvVars.buildTests) + XCTAssertTrue(pluginCommandWithEnvVars.showBinPath) + XCTAssertEqual(pluginCommandWithEnvVars.targets, ["Target1", "Target2"]) + XCTAssertEqual(pluginCommandWithEnvVars.products, ["Product1", "Product2"]) + + let pluginCommandWithArgs = try PluginBuildCommand.parse([ + "--path", "/new/plugin/path", + "--configuration", "release", + "--no-build-tests", + "--no-show-bin-path", + "--targets", "Target3", "--targets", "Target4", + "--products", "Product3", "--products", "Product4", + ]) + XCTAssertEqual(pluginCommandWithArgs.pluginOptions.path, "/new/plugin/path") + XCTAssertEqual(pluginCommandWithArgs.pluginOptions.configuration, .release) + XCTAssertFalse(pluginCommandWithArgs.buildTests) + XCTAssertFalse(pluginCommandWithArgs.showBinPath) + XCTAssertEqual(pluginCommandWithArgs.targets, ["Target3", "Target4"]) + XCTAssertEqual(pluginCommandWithArgs.products, ["Product3", "Product4"]) + } + + func testPluginRunCommandUsesEnvVars() throws { + setVariable(.pluginOptionsPath, value: "/path/to/plugin") + setVariable(.pluginOptionsConfiguration, value: "debug") + setVariable(.pluginRunBuildTests, value: "true") + setVariable(.pluginRunSkipBuild, value: "true") + setVariable(.pluginRunTask, value: "myTask") + setVariable(.pluginRunArguments, value: "arg1,arg2,arg3") + + let pluginCommandWithEnvVars = try PluginRunCommand.parse([]) + XCTAssertEqual(pluginCommandWithEnvVars.pluginOptions.path, "/path/to/plugin") + XCTAssertEqual(pluginCommandWithEnvVars.pluginOptions.configuration, .debug) + XCTAssertTrue(pluginCommandWithEnvVars.buildTests) + XCTAssertTrue(pluginCommandWithEnvVars.skipBuild) + XCTAssertEqual(pluginCommandWithEnvVars.task, "myTask") + XCTAssertEqual(pluginCommandWithEnvVars.arguments, ["arg1", "arg2", "arg3"]) + + let pluginCommandWithArgs = try PluginRunCommand.parse([ + "--path", "/new/plugin/path", + "--configuration", "release", + "--no-build-tests", + "--no-skip-build", + "otherTask", + "arg4", "arg5", + ]) + XCTAssertEqual(pluginCommandWithArgs.pluginOptions.path, "/new/plugin/path") + XCTAssertEqual(pluginCommandWithArgs.pluginOptions.configuration, .release) + XCTAssertFalse(pluginCommandWithArgs.buildTests) + XCTAssertFalse(pluginCommandWithArgs.skipBuild) + XCTAssertEqual(pluginCommandWithArgs.task, "otherTask") + XCTAssertEqual(pluginCommandWithArgs.arguments, ["arg4", "arg5"]) + } + + func testPluginTestCommandUsesEnvVars() throws { + setVariable(.pluginOptionsPath, value: "/path/to/plugin") + setVariable(.pluginOptionsConfiguration, value: "debug") + setVariable(.pluginTestBuildTests, value: "true") + setVariable(.pluginTestTestProducts, value: "Product1,Product2") + + let pluginCommandWithEnvVars = try PluginTestCommand.parse([]) + XCTAssertEqual(pluginCommandWithEnvVars.pluginOptions.path, "/path/to/plugin") + XCTAssertEqual(pluginCommandWithEnvVars.pluginOptions.configuration, .debug) + XCTAssertTrue(pluginCommandWithEnvVars.buildTests) + XCTAssertEqual(pluginCommandWithEnvVars.testProducts, ["Product1", "Product2"]) + + let pluginCommandWithArgs = try PluginTestCommand.parse([ + "--path", "/new/plugin/path", + "--configuration", "release", + "--no-build-tests", + "--test-products", "Product3", "--test-products", "Product4", + ]) + XCTAssertEqual(pluginCommandWithArgs.pluginOptions.path, "/new/plugin/path") + XCTAssertEqual(pluginCommandWithArgs.pluginOptions.configuration, .release) + XCTAssertFalse(pluginCommandWithArgs.buildTests) + XCTAssertEqual(pluginCommandWithArgs.testProducts, ["Product3", "Product4"]) + } + + func testRunCommandUsesEnvVars() throws { + // Set environment variables for RunCommand + setVariable(.runGenerate, value: "true") + setVariable(.runClean, value: "true") + setVariable(.runOS, value: "14.5") + setVariable(.runScheme, value: "MyScheme") + setVariable(.runArguments, value: "arg1,arg2,arg3") + + // Execute RunCommand without command line arguments + let runCommandWithEnvVars = try RunCommand.parse([]) + XCTAssertTrue(runCommandWithEnvVars.generate) + XCTAssertTrue(runCommandWithEnvVars.clean) + XCTAssertEqual(runCommandWithEnvVars.os, "14.5") + XCTAssertEqual(runCommandWithEnvVars.scheme, "MyScheme") + XCTAssertEqual(runCommandWithEnvVars.arguments, ["arg1", "arg2", "arg3"]) + + // Execute RunCommand with command line arguments + let runCommandWithArgs = try RunCommand.parse([ + "--no-generate", + "--no-clean", + "--path", "/new/run/path", + "--configuration", "Release", + "--device", "iPhone 12", + "--os", "15.0", + "--rosetta", + "AnotherScheme", + "arg4", "arg5", + ]) + XCTAssertFalse(runCommandWithArgs.generate) + XCTAssertFalse(runCommandWithArgs.clean) + XCTAssertEqual(runCommandWithArgs.path, "/new/run/path") + XCTAssertEqual(runCommandWithArgs.configuration, "Release") + XCTAssertEqual(runCommandWithArgs.device, "iPhone 12") + XCTAssertEqual(runCommandWithArgs.os, "15.0") + XCTAssertTrue(runCommandWithArgs.rosetta) + XCTAssertEqual(runCommandWithArgs.scheme, "AnotherScheme") + XCTAssertEqual(runCommandWithArgs.arguments, ["arg4", "arg5"]) + } + + func testScaffoldCommandUsesEnvVars() throws { + // Set environment variables for ScaffoldCommand + setVariable(.scaffoldJson, value: "true") + setVariable(.scaffoldPath, value: "/path/to/scaffold") + setVariable(.scaffoldTemplate, value: "MyTemplate") + + // Execute ScaffoldCommand without command line arguments + let scaffoldCommandWithEnvVars = try ScaffoldCommand.parse([]) + XCTAssertTrue(scaffoldCommandWithEnvVars.json) + XCTAssertEqual(scaffoldCommandWithEnvVars.path, "/path/to/scaffold") + XCTAssertEqual(scaffoldCommandWithEnvVars.template, "MyTemplate") + + // Execute ScaffoldCommand with command line arguments + let scaffoldCommandWithArgs = try ScaffoldCommand.parse([ + "--no-json", + "--path", "/new/scaffold/path", + "AnotherTemplate", + ]) + XCTAssertFalse(scaffoldCommandWithArgs.json) + XCTAssertEqual(scaffoldCommandWithArgs.path, "/new/scaffold/path") + XCTAssertEqual(scaffoldCommandWithArgs.template, "AnotherTemplate") + } + + func testTestCommandWithEnvVars() throws { + // Set environment variables for TestCommand + setVariable(.testScheme, value: "MyScheme") + setVariable(.testClean, value: "true") + setVariable(.testPath, value: "/path/to/test") + setVariable(.testDevice, value: "iPhone") + setVariable(.testPlatform, value: "iOS") + setVariable(.testOS, value: "14.5") + setVariable(.testRosetta, value: "true") + setVariable(.testConfiguration, value: "Debug") + setVariable(.testSkipUITests, value: "true") + setVariable(.testResultBundlePath, value: "/path/to/resultBundle") + setVariable(.testDerivedDataPath, value: "/path/to/derivedData") + setVariable(.testRetryCount, value: "2") + setVariable(.testTestPlan, value: "MyTestPlan") + setVariable(.testSkipTestTargets, value: "SkipTarget1,SkipTarget2") + setVariable(.testConfigurations, value: "Config1,Config2") + setVariable(.testSkipConfigurations, value: "SkipConfig1,SkipConfig2") + setVariable(.testGenerateOnly, value: "true") + setVariable(.testBinaryCache, value: "false") + setVariable(.testSelectiveTesting, value: "false") + + // Execute TestCommand without command line arguments + let testCommandWithEnvVars = try TestCommand.parse([]) + XCTAssertEqual(testCommandWithEnvVars.scheme, "MyScheme") + XCTAssertTrue(testCommandWithEnvVars.clean) + XCTAssertEqual(testCommandWithEnvVars.path, "/path/to/test") + XCTAssertEqual(testCommandWithEnvVars.device, "iPhone") + XCTAssertEqual(testCommandWithEnvVars.platform, "iOS") + XCTAssertEqual(testCommandWithEnvVars.os, "14.5") + XCTAssertTrue(testCommandWithEnvVars.rosetta) + XCTAssertEqual(testCommandWithEnvVars.configuration, "Debug") + XCTAssertTrue(testCommandWithEnvVars.skipUITests) + XCTAssertEqual(testCommandWithEnvVars.resultBundlePath, "/path/to/resultBundle") + XCTAssertEqual(testCommandWithEnvVars.derivedDataPath, "/path/to/derivedData") + XCTAssertEqual(testCommandWithEnvVars.retryCount, 2) + XCTAssertEqual(testCommandWithEnvVars.testPlan, "MyTestPlan") + XCTAssertEqual(testCommandWithEnvVars.testTargets, []) + XCTAssertEqual(testCommandWithEnvVars.skipTestTargets, [ + try TestIdentifier(string: "SkipTarget1"), + try TestIdentifier(string: "SkipTarget2"), + ]) + XCTAssertEqual(testCommandWithEnvVars.configurations, ["Config1", "Config2"]) + XCTAssertEqual(testCommandWithEnvVars.skipConfigurations, ["SkipConfig1", "SkipConfig2"]) + XCTAssertTrue(testCommandWithEnvVars.generateOnly) + XCTAssertFalse(testCommandWithEnvVars.binaryCache) + XCTAssertFalse(testCommandWithEnvVars.selectiveTesting) + + // Execute TestCommand with command line arguments + let testCommandWithArgs = try TestCommand.parse([ + "NewScheme", + "--no-clean", + "--path", "/new/test/path", + "--device", "iPad", + "--platform", "macOS", + "--os", "15.0", + "--no-rosetta", + "--configuration", "Release", + "--no-skip-ui-tests", + "--result-bundle-path", "/new/resultBundle/path", + "--derived-data-path", "/new/derivedData/path", + "--retry-count", "3", + "--test-plan", "NewTestPlan", + "--skip-test-targets", "NewSkipTarget1", "NewSkipTarget2", + "--filter-configurations", "NewConfig1", "NewConfig2", + "--skip-configurations", "NewSkipConfig1", "NewSkipConfig2", + "--no-generate-only", + "--no-binary-cache", + "--no-selective-testing", + ]) + XCTAssertEqual(testCommandWithArgs.scheme, "NewScheme") + XCTAssertFalse(testCommandWithArgs.clean) + XCTAssertEqual(testCommandWithArgs.path, "/new/test/path") + XCTAssertEqual(testCommandWithArgs.device, "iPad") + XCTAssertEqual(testCommandWithArgs.platform, "macOS") + XCTAssertEqual(testCommandWithArgs.os, "15.0") + XCTAssertFalse(testCommandWithArgs.rosetta) + XCTAssertEqual(testCommandWithArgs.configuration, "Release") + XCTAssertFalse(testCommandWithArgs.skipUITests) + XCTAssertEqual(testCommandWithArgs.resultBundlePath, "/new/resultBundle/path") + XCTAssertEqual(testCommandWithArgs.derivedDataPath, "/new/derivedData/path") + XCTAssertEqual(testCommandWithArgs.retryCount, 3) + XCTAssertEqual(testCommandWithArgs.testPlan, "NewTestPlan") + XCTAssertEqual(testCommandWithArgs.testTargets, []) + XCTAssertEqual(testCommandWithArgs.skipTestTargets, [ + try TestIdentifier(string: "NewSkipTarget1"), + try TestIdentifier(string: "NewSkipTarget2"), + ]) + XCTAssertEqual(testCommandWithArgs.configurations, ["NewConfig1", "NewConfig2"]) + XCTAssertEqual(testCommandWithArgs.skipConfigurations, ["NewSkipConfig1", "NewSkipConfig2"]) + XCTAssertFalse(testCommandWithArgs.generateOnly) + XCTAssertFalse(testCommandWithArgs.binaryCache) + XCTAssertFalse(testCommandWithArgs.selectiveTesting) + } + + func testCloudOrganizationBillingCommandUsesEnvVars() throws { + setVariable(.cloudOrganizationBillingOrganizationName, value: "MyOrganization") + setVariable(.cloudOrganizationBillingPath, value: "/path/to/billing") + + let commandWithEnvVars = try CloudOrganizationBillingCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.organizationName, "MyOrganization") + XCTAssertEqual(commandWithEnvVars.path, "/path/to/billing") + + let commandWithArgs = try CloudOrganizationBillingCommand.parse([ + "AnotherOrganization", + "--path", "/new/billing/path", + ]) + XCTAssertEqual(commandWithArgs.organizationName, "AnotherOrganization") + XCTAssertEqual(commandWithArgs.path, "/new/billing/path") + } + + func testCloudOrganizationCreateCommandUsesEnvVars() throws { + setVariable(.cloudOrganizationCreateOrganizationName, value: "MyNewOrganization") + setVariable(.cloudOrganizationCreatePath, value: "/path/to/create") + + let commandWithEnvVars = try CloudOrganizationCreateCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.organizationName, "MyNewOrganization") + XCTAssertEqual(commandWithEnvVars.path, "/path/to/create") + + let commandWithArgs = try CloudOrganizationCreateCommand.parse([ + "AnotherNewOrganization", + "--path", "/new/create/path", + ]) + XCTAssertEqual(commandWithArgs.organizationName, "AnotherNewOrganization") + XCTAssertEqual(commandWithArgs.path, "/new/create/path") + } + + func testCloudOrganizationDeleteCommandUsesEnvVars() throws { + setVariable(.cloudOrganizationDeleteOrganizationName, value: "OrganizationToDelete") + setVariable(.cloudOrganizationDeletePath, value: "/path/to/delete") + + let commandWithEnvVars = try CloudOrganizationDeleteCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.organizationName, "OrganizationToDelete") + XCTAssertEqual(commandWithEnvVars.path, "/path/to/delete") + + let commandWithArgs = try CloudOrganizationDeleteCommand.parse([ + "AnotherOrganizationToDelete", + "--path", "/new/delete/path", + ]) + XCTAssertEqual(commandWithArgs.organizationName, "AnotherOrganizationToDelete") + XCTAssertEqual(commandWithArgs.path, "/new/delete/path") + } + + func testCloudProjectTokenCommandUsesEnvVars() throws { + setVariable(.cloudProjectTokenProjectName, value: "ProjectName") + setVariable(.cloudProjectTokenOrganizationName, value: "OrganizationName") + setVariable(.cloudProjectTokenPath, value: "/path/to/token") + + let commandWithEnvVars = try CloudProjectTokenCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.projectName, "ProjectName") + XCTAssertEqual(commandWithEnvVars.organizationName, "OrganizationName") + XCTAssertEqual(commandWithEnvVars.path, "/path/to/token") + + let commandWithArgs = try CloudProjectTokenCommand.parse([ + "NewProjectName", + "--organization-name", "NewOrganizationName", + "--path", "/new/token/path", + ]) + XCTAssertEqual(commandWithArgs.projectName, "NewProjectName") + XCTAssertEqual(commandWithArgs.organizationName, "NewOrganizationName") + XCTAssertEqual(commandWithArgs.path, "/new/token/path") + } + + func testCloudOrganizationListCommandUsesEnvVars() throws { + setVariable(.cloudOrganizationListJson, value: "true") + setVariable(.cloudOrganizationListPath, value: "/path/to/list") + + let commandWithEnvVars = try CloudOrganizationListCommand.parse([]) + XCTAssertTrue(commandWithEnvVars.json) + XCTAssertEqual(commandWithEnvVars.path, "/path/to/list") + + let commandWithArgs = try CloudOrganizationListCommand.parse([ + "--no-json", + "--path", "/new/list/path", + ]) + XCTAssertFalse(commandWithArgs.json) + XCTAssertEqual(commandWithArgs.path, "/new/list/path") + } + + func testCloudOrganizationRemoveInviteCommandUsesEnvVars() throws { + setVariable(.cloudOrganizationRemoveInviteOrganizationName, value: "MyOrganization") + setVariable(.cloudOrganizationRemoveInviteEmail, value: "email@example.com") + setVariable(.cloudOrganizationRemoveInvitePath, value: "/path/to/invite") + + let commandWithEnvVars = try CloudOrganizationRemoveInviteCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.organizationName, "MyOrganization") + XCTAssertEqual(commandWithEnvVars.email, "email@example.com") + XCTAssertEqual(commandWithEnvVars.path, "/path/to/invite") + + let commandWithArgs = try CloudOrganizationRemoveInviteCommand.parse([ + "NewOrganization", + "newemail@example.com", + "--path", "/new/invite/path", + ]) + XCTAssertEqual(commandWithArgs.organizationName, "NewOrganization") + XCTAssertEqual(commandWithArgs.email, "newemail@example.com") + XCTAssertEqual(commandWithArgs.path, "/new/invite/path") + } + + func testCloudOrganizationRemoveMemberCommandUsesEnvVars() throws { + setVariable(.cloudOrganizationRemoveMemberOrganizationName, value: "MyOrganization") + setVariable(.cloudOrganizationRemoveMemberUsername, value: "username") + setVariable(.cloudOrganizationRemoveMemberPath, value: "/path/to/member") + + let commandWithEnvVars = try CloudOrganizationRemoveMemberCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.organizationName, "MyOrganization") + XCTAssertEqual(commandWithEnvVars.username, "username") + XCTAssertEqual(commandWithEnvVars.path, "/path/to/member") + + let commandWithArgs = try CloudOrganizationRemoveMemberCommand.parse([ + "NewOrganization", + "newusername", + "--path", "/new/member/path", + ]) + XCTAssertEqual(commandWithArgs.organizationName, "NewOrganization") + XCTAssertEqual(commandWithArgs.username, "newusername") + XCTAssertEqual(commandWithArgs.path, "/new/member/path") + } + + func testCloudOrganizationRemoveSSOCommandUsesEnvVars() throws { + setVariable(.cloudOrganizationRemoveSSOOrganizationName, value: "MyOrganization") + setVariable(.cloudOrganizationRemoveSSOPath, value: "/path/to/sso") + + let commandWithEnvVars = try CloudOrganizationRemoveSSOCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.organizationName, "MyOrganization") + XCTAssertEqual(commandWithEnvVars.path, "/path/to/sso") + + let commandWithArgs = try CloudOrganizationRemoveSSOCommand.parse([ + "NewOrganization", + "--path", "/new/sso/path", + ]) + XCTAssertEqual(commandWithArgs.organizationName, "NewOrganization") + XCTAssertEqual(commandWithArgs.path, "/new/sso/path") + } + + func testCloudOrganizationUpdateSSOCommandUsesEnvVars() throws { + setVariable(.cloudOrganizationUpdateSSOOrganizationName, value: "MyOrganization") + setVariable(.cloudOrganizationUpdateSSOProvider, value: "google") + setVariable(.cloudOrganizationUpdateSSOOrganizationId, value: "1234") + setVariable(.cloudOrganizationUpdateSSOPath, value: "/path/to/update/sso") + + let commandWithEnvVars = try CloudOrganizationUpdateSSOCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.organizationName, "MyOrganization") + XCTAssertEqual(commandWithEnvVars.provider, .google) + XCTAssertEqual(commandWithEnvVars.organizationId, "1234") + XCTAssertEqual(commandWithEnvVars.path, "/path/to/update/sso") + + let commandWithArgs = try CloudOrganizationUpdateSSOCommand.parse([ + "NewOrganization", + "--provider", "google", + "--organization-id", "5678", + "--path", "/new/update/sso/path", + ]) + XCTAssertEqual(commandWithArgs.organizationName, "NewOrganization") + XCTAssertEqual(commandWithArgs.provider, .google) + XCTAssertEqual(commandWithArgs.organizationId, "5678") + XCTAssertEqual(commandWithArgs.path, "/new/update/sso/path") + } + + func testCloudProjectDeleteCommandUsesEnvVars() throws { + setVariable(.cloudProjectDeleteProject, value: "MyProject") + setVariable(.cloudProjectDeleteOrganization, value: "MyOrganization") + setVariable(.cloudProjectDeletePath, value: "/path/to/delete") + + let commandWithEnvVars = try CloudProjectDeleteCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.project, "MyProject") + XCTAssertEqual(commandWithEnvVars.organization, "MyOrganization") + XCTAssertEqual(commandWithEnvVars.path, "/path/to/delete") + + let commandWithArgs = try CloudProjectDeleteCommand.parse([ + "NewProject", + "--organization", "NewOrganization", + "--path", "/new/delete/path", + ]) + XCTAssertEqual(commandWithArgs.project, "NewProject") + XCTAssertEqual(commandWithArgs.organization, "NewOrganization") + XCTAssertEqual(commandWithArgs.path, "/new/delete/path") + } + + func testCloudProjectCreateCommandUsesEnvVars() throws { + setVariable(.cloudProjectCreateName, value: "MyProject") + setVariable(.cloudProjectCreateOrganization, value: "MyOrganization") + setVariable(.cloudProjectCreatePath, value: "/path/to/create") + + let commandWithEnvVars = try CloudProjectCreateCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.name, "MyProject") + XCTAssertEqual(commandWithEnvVars.organization, "MyOrganization") + XCTAssertEqual(commandWithEnvVars.path, "/path/to/create") + + let commandWithArgs = try CloudProjectCreateCommand.parse([ + "NewProject", + "--organization", "NewOrganization", + "--path", "/new/create/path", + ]) + XCTAssertEqual(commandWithArgs.name, "NewProject") + XCTAssertEqual(commandWithArgs.organization, "NewOrganization") + XCTAssertEqual(commandWithArgs.path, "/new/create/path") + } + + func testCloudInitCommandUsesEnvVars() throws { + setVariable(.cloudInitName, value: "InitName") + setVariable(.cloudInitOrganization, value: "InitOrganization") + setVariable(.cloudInitPath, value: "/path/to/init") + + let commandWithEnvVars = try CloudInitCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.name, "InitName") + XCTAssertEqual(commandWithEnvVars.organization, "InitOrganization") + XCTAssertEqual(commandWithEnvVars.path, "/path/to/init") + + let commandWithArgs = try CloudInitCommand.parse([ + "NewInitName", + "--organization", "NewInitOrganization", + "--path", "/new/init/path", + ]) + XCTAssertEqual(commandWithArgs.name, "NewInitName") + XCTAssertEqual(commandWithArgs.organization, "NewInitOrganization") + XCTAssertEqual(commandWithArgs.path, "/new/init/path") + } + + func testCloudOrganizationInviteCommandUsesEnvVars() throws { + setVariable(.cloudOrganizationInviteOrganizationName, value: "InviteOrganization") + setVariable(.cloudOrganizationInviteEmail, value: "email@example.com") + setVariable(.cloudOrganizationInvitePath, value: "/path/to/invite") + + let commandWithEnvVars = try CloudOrganizationInviteCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.organizationName, "InviteOrganization") + XCTAssertEqual(commandWithEnvVars.email, "email@example.com") + XCTAssertEqual(commandWithEnvVars.path, "/path/to/invite") + + let commandWithArgs = try CloudOrganizationInviteCommand.parse([ + "NewInviteOrganization", + "newemail@example.com", + "--path", "/new/invite/path", + ]) + XCTAssertEqual(commandWithArgs.organizationName, "NewInviteOrganization") + XCTAssertEqual(commandWithArgs.email, "newemail@example.com") + XCTAssertEqual(commandWithArgs.path, "/new/invite/path") + } + + func testCloudOrganizationShowCommandUsesEnvVars() throws { + setVariable(.cloudOrganizationShowOrganizationName, value: "MyOrganization") + setVariable(.cloudOrganizationShowJson, value: "true") + setVariable(.cloudOrganizationShowPath, value: "/path/to/show") + + let commandWithEnvVars = try CloudOrganizationShowCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.organizationName, "MyOrganization") + XCTAssertTrue(commandWithEnvVars.json) + XCTAssertEqual(commandWithEnvVars.path, "/path/to/show") + + let commandWithArgs = try CloudOrganizationShowCommand.parse([ + "NewOrganization", + "--no-json", + "--path", "/new/show/path", + ]) + XCTAssertEqual(commandWithArgs.organizationName, "NewOrganization") + XCTAssertFalse(commandWithArgs.json) + XCTAssertEqual(commandWithArgs.path, "/new/show/path") + } + + func testCloudProjectListCommandUsesEnvVars() throws { + setVariable(.cloudProjectListJson, value: "true") + setVariable(.cloudProjectListPath, value: "/path/to/list") + + let commandWithEnvVars = try CloudProjectListCommand.parse([]) + XCTAssertTrue(commandWithEnvVars.json) + XCTAssertEqual(commandWithEnvVars.path, "/path/to/list") + + let commandWithArgs = try CloudProjectListCommand.parse([ + "--no-json", + "--path", "/new/list/path", + ]) + XCTAssertFalse(commandWithArgs.json) + XCTAssertEqual(commandWithArgs.path, "/new/list/path") + } + + func testCloudOrganizationUpdateMemberCommandUsesEnvVars() throws { + setVariable(.cloudOrganizationUpdateMemberOrganizationName, value: "MyOrganization") + setVariable(.cloudOrganizationUpdateMemberUsername, value: "username") + setVariable(.cloudOrganizationUpdateMemberRole, value: "admin") + setVariable(.cloudOrganizationUpdateMemberPath, value: "/path/to/member") + + let commandWithEnvVars = try CloudOrganizationUpdateMemberCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.organizationName, "MyOrganization") + XCTAssertEqual(commandWithEnvVars.username, "username") + XCTAssertEqual(commandWithEnvVars.role, "admin") + XCTAssertEqual(commandWithEnvVars.path, "/path/to/member") + + let commandWithArgs = try CloudOrganizationUpdateMemberCommand.parse([ + "NewOrganization", + "newusername", + "--role", "user", + "--path", "/new/member/path", + ]) + XCTAssertEqual(commandWithArgs.organizationName, "NewOrganization") + XCTAssertEqual(commandWithArgs.username, "newusername") + XCTAssertEqual(commandWithArgs.role, "user") + XCTAssertEqual(commandWithArgs.path, "/new/member/path") + } + + func testCloudAuthCommandUsesEnvVars() throws { + setVariable(.cloudAuthPath, value: "/path/to/auth") + + let commandWithEnvVars = try CloudAuthCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.path, "/path/to/auth") + + let commandWithArgs = try CloudAuthCommand.parse([ + "--path", "/new/auth/path", + ]) + XCTAssertEqual(commandWithArgs.path, "/new/auth/path") + } + + func testCloudSessionCommandUsesEnvVars() throws { + setVariable(.cloudSessionPath, value: "/path/to/session") + + let commandWithEnvVars = try CloudSessionCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.path, "/path/to/session") + + let commandWithArgs = try CloudSessionCommand.parse([ + "--path", "/new/session/path", + ]) + XCTAssertEqual(commandWithArgs.path, "/new/session/path") + } + + func testCloudLogoutCommandUsesEnvVars() throws { + setVariable(.cloudLogoutPath, value: "/path/to/logout") + + let commandWithEnvVars = try CloudLogoutCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.path, "/path/to/logout") + + let commandWithArgs = try CloudLogoutCommand.parse([ + "--path", "/new/logout/path", + ]) + XCTAssertEqual(commandWithArgs.path, "/new/logout/path") + } + + func testCloudAnalyticsCommandUsesEnvVars() throws { + setVariable(.cloudAnalyticsPath, value: "/path/to/analytics") + + let commandWithEnvVars = try CloudAnalyticsCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.path, "/path/to/analytics") + + let commandWithArgs = try CloudAnalyticsCommand.parse([ + "--path", "/new/analytics/path", + ]) + XCTAssertEqual(commandWithArgs.path, "/new/analytics/path") + } + + func testCloudCleanCommandUsesEnvVars() throws { + setVariable(.cloudCleanPath, value: "/path/to/clean") + + let commandWithEnvVars = try CloudCleanCommand.parse([]) + XCTAssertEqual(commandWithEnvVars.path, "/path/to/clean") + + let commandWithArgs = try CloudCleanCommand.parse([ + "--path", "/new/clean/path", + ]) + XCTAssertEqual(commandWithArgs.path, "/new/clean/path") + } +} diff --git a/Tests/TuistKitTests/Services/BuildServiceTests.swift b/Tests/TuistKitTests/Services/BuildServiceTests.swift index e1a3f19a07f..f225cadeb8a 100644 --- a/Tests/TuistKitTests/Services/BuildServiceTests.swift +++ b/Tests/TuistKitTests/Services/BuildServiceTests.swift @@ -326,7 +326,7 @@ extension BuildService { derivedDataPath: String? = nil, path: AbsolutePath, device: String? = nil, - platform: String? = nil, + platform: TuistGraph.Platform? = nil, osVersion: String? = nil, rosetta: Bool = false, generateOnly: Bool = false, diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 6f9845a6dab..96ae1e70f3e 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -1,6 +1,7 @@ import { defineConfig } from "vitepress"; import projectDescriptionTypesDataLoader from "../docs/reference/project-description/types.data"; import examplesDataLoader from "../docs/reference/examples/examples.data"; +import cliDataLoader from "../docs/reference/cli/commands.data"; import * as path from "node:path"; import * as fs from "node:fs/promises"; @@ -30,6 +31,51 @@ function capitalize(text) { } }); +function generateNestedSidebarItems(items) { + const nestedItems = {}; + + items.forEach((item) => { + const category = item.category + if (!nestedItems[category]) { + nestedItems[category] = { + text: capitalize(category), + collapsed: true, + items: [], + }; + } + nestedItems[category].items.push({ text: item.title, link: `/reference/cli/${item.command}` }); + }); + + function isLinkItem(item) { + return typeof item.link === "string"; + } + + function convertToArray(obj) { + return Object.values(obj).reduce((acc, item) => { + if (Array.isArray(item.items) && item.items.every(isLinkItem)) { + acc.push(item); + } else { + acc.push({ + text: item.text, + collapsed: true, + items: convertToArray(item.items), + }); + } + return acc; + }, []); + } + + return convertToArray(nestedItems); +} + + +const cliData = cliDataLoader.load(); + +const cliSidebar = { + text: "CLI", + items: generateNestedSidebarItems(cliData), +}; + const guideSidebar = [ { text: "Introduction", @@ -278,16 +324,7 @@ export default defineConfig({ { text: "Reference", items: [ - // TODO - // { - // text: "CLI", - // items: cliDataLoader.load().map((item) => { - // return { - // text: item.title, - // link: `/reference/cli/${item.command}`, - // }; - // }), - // }, + cliSidebar, projectDescriptionSidebar, { text: "Examples", diff --git a/docs/docs/reference/cli/commands.data.js b/docs/docs/reference/cli/commands.data.js index d7af1f7790b..fbf6dfaa662 100644 --- a/docs/docs/reference/cli/commands.data.js +++ b/docs/docs/reference/cli/commands.data.js @@ -1,5 +1,43 @@ +import * as path from "node:path"; +import fg from "fast-glob"; +import fs from "node:fs"; + export default { load() { - return []; + const generatedDirectory = path.join( + import.meta.dirname, + "../../../docs/generated/cli" + ); + const files = fg + .sync("**/*.md", { + cwd: generatedDirectory, + absolute: true + }) + + const validCategories = ["cloud", "plugin", "migration", "tuist"]; + + return files.map((file) => { + const relativePath = path.relative(generatedDirectory, file); + const fileName = path.basename(file, ".md"); + const content = fs.readFileSync(file, "utf-8"); + const description = content.split('\n')[1].trim(); + + const category = relativePath.split(path.sep)[0]; + const finalCategory = validCategories.includes(category) ? category : "tuist"; + + let titleParts = fileName.split("."); + let title = titleParts + .filter(part => !validCategories.includes(part)) + .join(" "); + + + return { + command: relativePath.replace(/\.md$/, ""), + title: title, + content: content, + path: relativePath.replace(/\.md$/, ""), + category: finalCategory, + }; + }) }, }; diff --git a/docs/docs/reference/project-description/types.data.js b/docs/docs/reference/project-description/types.data.js index e219f4da395..508597b3d15 100644 --- a/docs/docs/reference/project-description/types.data.js +++ b/docs/docs/reference/project-description/types.data.js @@ -6,7 +6,7 @@ export default { load() { const generatedDirectory = path.join( import.meta.dirname, - "../../../docs/generated" + "../../../docs/generated/manifest" ); const files = fg .sync("**/*.md", { diff --git a/docs/package.json b/docs/package.json index 515d6f28194..52eae3b1613 100644 --- a/docs/package.json +++ b/docs/package.json @@ -16,4 +16,4 @@ "preview": "vitepress preview", "deploy": "vitepress build && wrangler pages deploy .vitepress/dist --project-name tuist-docs-next --branch main" } -} +} \ No newline at end of file diff --git a/docs/scripts/generate-cli-docs.mjs b/docs/scripts/generate-cli-docs.mjs new file mode 100755 index 00000000000..ad5aad76a60 --- /dev/null +++ b/docs/scripts/generate-cli-docs.mjs @@ -0,0 +1,89 @@ +#!/usr/bin/env node + +import { execa } from "execa"; +import path from "node:path"; +import fs from "node:fs"; +import fg from "fast-glob"; +import { fileURLToPath } from "node:url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const rootDirectory = path.join(__dirname, "../.."); +const docsDirectory = path.join(__dirname, "../docs/generated/cli"); +const manDirectory = path.join( + rootDirectory, + ".build/plugins/GenerateManual/outputs/tuist" +); + +const generateManPages = async () => { + await execa( + "swift", + ["package", "plugin", "generate-manual", "--multi-page"], + { + cwd: rootDirectory, + stdio: "inherit", + } + ); +}; + +const runManCommand = async (filePath) => { + const { stdout } = await execa("sh", ["-c", `man ${filePath} | col -b`]); + return stdout; +}; + +const parseManPage = async (filePath) => { + const manContent = await runManCommand(filePath); + + // Remove the first line containing `TUIST.BUILD(1) General Commands Manual TUIST.BUILD(1)` + const lines = manContent.split("\n").slice(1); + + // Remove the last line + lines.pop(); + + // Convert all caps sections to subheadings + const formattedContent = lines + .map((line) => { + if (/^[A-Z ]+$/.test(line.trim())) { + return `### ${line.trim()}`; + } + return line; + }) + .join("\n"); + + return `# ${path.basename(filePath, ".1")} + +${formattedContent}`; +}; + +const generateDocs = async () => { + if (!fs.existsSync(docsDirectory)) { + fs.mkdirSync(docsDirectory, { recursive: true }); + } + + const manFiles = fg.sync(path.join(manDirectory, "*.1")); + + for (const file of manFiles) { + const commandName = path.basename(file, ".1"); + const docContent = await parseManPage(file); + + // Create directory structure based on the path + const docPathParts = commandName.split(".").slice(1); // Remove "tuist" + const docDirParts = docPathParts.slice(0, -1); // All but the last part + const docDir = path.join(docsDirectory, ...docDirParts); + const docPath = path.join(docDir, `${commandName}.md`); + + if (!fs.existsSync(docDir)) { + fs.mkdirSync(docDir, { recursive: true }); + } + + fs.writeFileSync(docPath, docContent, "utf-8"); + } + + console.log("All command docs generated successfully."); +}; + +const main = async () => { + await generateManPages(); + await generateDocs(); +}; + +main(); diff --git a/docs/scripts/generate-manifest-docs.mjs b/docs/scripts/generate-manifest-docs.mjs index 8e8621236cb..e33cc54ab61 100755 --- a/docs/scripts/generate-manifest-docs.mjs +++ b/docs/scripts/generate-manifest-docs.mjs @@ -23,7 +23,7 @@ await execa( [ "generate", "-o", - path.join(docsDirectory, "docs/generated/"), + path.join(docsDirectory, "docs/generated/manifest"), "--clean", "--table-of-contents", "--module-name", @@ -37,9 +37,9 @@ await execa( { cwd: rootDirectory, stdio: "inherit" } ); -fs.rmSync(path.join(docsDirectory, "docs/generated/README.md")); +fs.rmSync(path.join(docsDirectory, "docs/generated/manifest/README.md")); -fg.sync(path.join(docsDirectory, "docs/generated/**/*.md")).forEach((file) => { +fg.sync(path.join(docsDirectory, "docs/generated/manifest/**/*.md")).forEach((file) => { const renamedPath = file.replace(/\[(.*?)\]/g, "Array<$1>"); fs.renameSync(file, renamedPath); -}); +}); \ No newline at end of file From 1f80573a8546dc7c4e2078a1c67c7228f0470178 Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 4 Jun 2024 15:35:16 +0200 Subject: [PATCH 333/509] Update release date --- .../Client/CloudClientCLIMetadataHeadersMiddleware.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift b/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift index a81a8f67e46..f9d1d8035a9 100644 --- a/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift +++ b/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift @@ -5,7 +5,7 @@ import TuistSupport /// This middleware includes the release date of the CLI in the headers so that we can show /// warnings if the on-premise installation is too old. struct CloudClientCLIMetadataHeadersMiddleware: ClientMiddleware { - let releaseDate = "2024.05.23" + let releaseDate = "2024.06.04" func intercept( _ request: Request, From 3fcef2180f4dbe209cb44b30002a9f94a81d5f00 Mon Sep 17 00:00:00 2001 From: Tuist Date: Tue, 4 Jun 2024 14:17:59 +0000 Subject: [PATCH 334/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.16.0 --- .mise.toml | 2 +- CHANGELOG.md | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 3751a08d49b..18d6df6f1e7 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.15.0" +tuist = "4.16.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index 443673de7ba..84124b0c067 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## 4.16.0 - 2024-06-04 + +### Tuist + +#### Added + +- Support xcodebuild arguments in build and test commands [#6300](https://github.com/tuist/tuist/pull/6300) by [@nandodelauni](https://github.com/nandodelauni) +- Upload test result bundle [#6345](https://github.com/tuist/tuist/pull/6345) by [@fortmarek](https://github.com/fortmarek) +- Making `tuist run` interactive by selecting simulators [#6307](https://github.com/tuist/tuist/pull/6307) by [@nandodelauni](https://github.com/nandodelauni) +- Support environment variable configuration for commands [#6359](https://github.com/tuist/tuist/pull/6359) by [@ajkolean](https://github.com/ajkolean) + +#### Fixed + +- Fixes #6321: Handle formatting multiline text [#6322](https://github.com/tuist/tuist/pull/6322) by [@sabade-omkar](https://github.com/sabade-omkar) +- Fix detection of XCTest dependency [#6337](https://github.com/tuist/tuist/pull/6337) by [@pepicrft](https://github.com/pepicrft) + +### Tuist Cloud + +- no changes + ## 4.15.0 - 2024-05-23 ### Tuist From 624c5f1011d08d534f100658dd90be9f9672097e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 5 Jun 2024 10:07:14 +0200 Subject: [PATCH 335/509] Add documentation about `@_implementationOnly` to the dependencies page (#6368) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Document @_implementationOnly * Update docs/docs/guide/project/dependencies.md Co-authored-by: Marek Fořt * Update dependencies.md --------- Co-authored-by: Marek Fořt --- docs/docs/guide/project/dependencies.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/docs/guide/project/dependencies.md b/docs/docs/guide/project/dependencies.md index 4bf70e9d480..feccc97fe18 100644 --- a/docs/docs/guide/project/dependencies.md +++ b/docs/docs/guide/project/dependencies.md @@ -340,3 +340,11 @@ let packageSettings = PackageSettings( let package = Package( ... ``` + +### Transitive static dependencies leaking through `.swiftmodule` + +When a dynamic framework or library depends on static ones through `import StaticSwiftModule`, the symbols are included in the `.swiftmodule` of the dynamic framework or library, potentially [causing the compilation to fail](https://forums.swift.org/t/compiling-a-dynamic-framework-with-a-statically-linked-library-creates-dependencies-in-swiftmodule-file/22708/1). To prevent that, you'll have to import the static dependency using [`@_implementationOnly`](https://github.com/apple/swift/blob/main/docs/ReferenceGuides/UnderscoredAttributes.md#_implementationonly): + +```swift +@_implementationOnly import StaticModule +``` From 3daf7a21b98699d90b7bff526e6d480dc0f4e352 Mon Sep 17 00:00:00 2001 From: Tuist Date: Wed, 5 Jun 2024 08:14:50 +0000 Subject: [PATCH 336/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.16.1 --- .mise.toml | 2 +- CHANGELOG.md | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 18d6df6f1e7..ca408934841 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.16.0" +tuist = "4.16.1" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index 84124b0c067..522d1c653d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 4.16.1 - 2024-06-05 + +### Tuist + +- no changes + +### Tuist Cloud + +- no changes + ## 4.16.0 - 2024-06-04 ### Tuist From ab60b59a607a2dfcc396be1aba5930f3352a19cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 5 Jun 2024 12:05:36 +0200 Subject: [PATCH 337/509] Rename `TuistGraph` to `XcodeGraph` (#6369) * Rename TuistGraph to XcodeProjectGenerator * Rename to XcodeGraph --- Package.swift | 42 ++++---- .../TuistAcceptanceTestCase.swift | 2 +- Sources/TuistAnalytics/TuistAnalytics.swift | 2 +- .../Utilities/TuistAnalyticsDispatcher.swift | 2 +- .../SkipUITestsProjectMapper.swift | 2 +- .../SourceRootPathProjectMapper.swift | 2 +- .../Utilities/BuildGraphInspector.swift | 2 +- .../Utilities/TargetBuilder.swift | 8 +- .../Utilities/TargetRunner.swift | 6 +- .../XcodeBuildDestination+Find.swift | 4 +- .../Utilities/MockBuildGraphInspector.swift | 2 +- .../Utilities/MockTargetBuilder.swift | 4 +- .../Utilities/MockTargetRunner.swift | 4 +- .../Cache/CacheDirectoriesProvider.swift | 2 +- .../CacheDirectoriesProviderFactory.swift | 2 +- .../Graph/CircularDependencyLinter.swift | 2 +- Sources/TuistCore/Graph/ConditionCache.swift | 2 +- .../Graph/GraphDependencyReference.swift | 2 +- Sources/TuistCore/Graph/GraphLoader.swift | 2 +- Sources/TuistCore/Graph/GraphTraverser.swift | 2 +- .../TuistCore/Graph/Mappers/GraphMapper.swift | 2 +- .../Graph/Mappers/ProjectMapper.swift | 2 +- .../Graph/Mappers/TargetMapper.swift | 2 +- .../Graph/Mappers/WorkspaceMapper.swift | 2 +- .../BuildConfiguration+Core.swift | 2 +- .../Graph/ModelExtensions/Headers+core.swift | 2 +- .../Graph/ModelExtensions/Product+Core.swift | 2 +- .../Graph/ModelExtensions/Project+Core.swift | 2 +- .../ModelExtensions/Requirement+Core.swift | 2 +- .../Graph/ModelExtensions/Scheme+Core.swift | 2 +- .../Graph/ModelExtensions/Target+Core.swift | 6 +- .../ModelExtensions/TargetScript+Core.swift | 2 +- .../GraphTraverser/GraphTraverser+Extra.swift | 2 +- .../GraphTraverser/GraphTraversing.swift | 2 +- .../FrameworkMetadataProvider.swift | 2 +- .../LibraryMetadataProvider.swift | 2 +- .../PrecompiledMetadataProvider.swift | 2 +- .../SystemFrameworksMetadataProvider.swift | 2 +- .../XCFrameworkMetadataProvider.swift | 2 +- .../NodeLoaders/FrameworkLoader.swift | 2 +- .../NodeLoaders/XCFrameworkLoader.swift | 2 +- .../Simulator/SimulatorController.swift | 2 +- .../XcodeProjectBuildDirectoryLocator.swift | 2 +- .../GraphDependencyReference+TestData.swift | 4 +- .../Graph/MockGraphLoader.swift | 4 +- .../WorkspaceWithProjects+TestData.swift | 4 +- .../GraphTraverser/MockGraphTraverser.swift | 14 +-- .../Mappers/MockProjectMapper.swift | 2 +- .../Mappers/MockWorkspaceMapper.swift | 2 +- .../MockFrameworkMetadataProvider.swift | 2 +- .../MockLibraryMetadataProvider.swift | 2 +- .../MockPrecompiledMetadataProvider.swift | 2 +- .../MockXCFrameworkMetadataProvider.swift | 2 +- .../NodeLoaders/MockFrameworkNodeLoader.swift | 2 +- .../NodeLoaders/MockXCFrameworkLoader.swift | 2 +- .../Simulator/MockSimulatorController.swift | 6 +- ...ockXcodeProjectBuildDirectoryLocator.swift | 2 +- ...xternalDependencyPathWorkspaceMapper.swift | 2 +- ...lProjectsPlatformNarrowerGraphMapper.swift | 2 +- ...runeOrphanExternalTargetsGraphMapper.swift | 4 +- .../Extensions/CopyFilesAction+Extras.swift | 2 +- .../Extensions/Graph+Extras.swift | 6 +- .../Extensions/Xcodeproj+Extras.swift | 2 +- .../Generator/BuildPhaseGenerator.swift | 2 +- .../Generator/BuildRulesGenerator.swift | 2 +- .../Generator/ConfigGenerator.swift | 2 +- .../Generator/DescriptorGenerator.swift | 2 +- .../Generator/InfoPlistContentProvider.swift | 2 +- .../Generator/KnownAssetTagsFetcher.swift | 2 +- .../Generator/LinkGenerator.swift | 2 +- .../ProjectDescriptorGenerator.swift | 2 +- .../Generator/ProjectFileElements.swift | 2 +- .../Generator/ProjectGroups.swift | 2 +- .../SchemeDescriptorsGenerator.swift | 2 +- .../Generator/TargetGenerator.swift | 2 +- ...WorkspaceSettingsDescriptorGenerator.swift | 2 +- .../WorkspaceStructureGenerator.swift | 2 +- .../GraphViz/GraphToGraphVizMapper.swift | 6 +- .../TuistGenerator/GraphViz/NodeStyling.swift | 2 +- .../Linter/EnvironmentLinter.swift | 2 +- .../TuistGenerator/Linter/GraphLinter.swift | 4 +- .../TuistGenerator/Linter/PackageLinter.swift | 2 +- .../TuistGenerator/Linter/ProjectLinter.swift | 2 +- .../TuistGenerator/Linter/SchemeLinter.swift | 2 +- .../Linter/SettingsLinter.swift | 2 +- .../Linter/StaticProductsGraphLinter.swift | 2 +- .../TuistGenerator/Linter/TargetLinter.swift | 2 +- .../Linter/TargetScriptLinter.swift | 2 +- .../AutogeneratedSchemesProjectMapper.swift | 2 +- ...eratedWorkspaceSchemeWorkspaceMapper.swift | 2 +- .../DeleteDerivedDirectoryProjectMapper.swift | 2 +- .../ExplicitDependencyGraphMapper.swift | 2 +- .../GenerateEntitlementsProjectMapper.swift | 2 +- .../GenerateInfoPlistProjectMapper.swift | 2 +- ...GeneratePrivacyManifestProjectMapper.swift | 2 +- .../Mappers/IDETemplateMacrosMapper.swift | 2 +- .../Mappers/ModuleMapMapper.swift | 2 +- .../Mappers/ResourcesProjectMapper.swift | 2 +- ...esizedResourceInterfaceProjectMapper.swift | 2 +- ...ctionDisableShowEnvVarsProjectMapper.swift | 2 +- .../Settings/DefaultSettingsProvider.swift | 2 +- .../TuistGenerator/Utils/SettingsHelper.swift | 2 +- .../Utils/SwiftPackageManagerInteractor.swift | 2 +- ...nthesizedResourceInterfacesGenerator.swift | 2 +- .../Generator/MockDescriptorGenerator.swift | 2 +- .../Linter/MockEnvironmentLinter.swift | 2 +- .../Linter/MockGraphLinter.swift | 2 +- Sources/TuistKit/Commands/BuildCommand.swift | 6 +- Sources/TuistKit/Commands/GraphCommand.swift | 2 +- Sources/TuistKit/Commands/InitCommand.swift | 6 +- .../TuistKit/Commands/ScaffoldCommand.swift | 2 +- Sources/TuistKit/Commands/TestCommand.swift | 2 +- Sources/TuistKit/Generator/Generator.swift | 2 +- .../TuistKit/Generator/GeneratorFactory.swift | 2 +- .../Factories/GraphMapperFactory.swift | 2 +- .../Factories/ProjectMapperFactory.swift | 2 +- .../Factories/WorkspaceMapperFactory.swift | 2 +- .../Mappers/FocusTargetsGraphMappers.swift | 2 +- .../UpdateWorkspaceProjectsGraphMapper.swift | 2 +- .../TreeShakePrunedTargetsGraphMapper.swift | 2 +- .../ProjectEditor/ProjectEditor.swift | 2 +- .../ProjectEditor/ProjectEditorMapper.swift | 2 +- Sources/TuistKit/Services/BuildService.swift | 6 +- Sources/TuistKit/Services/CleanService.swift | 2 +- Sources/TuistKit/Services/EditService.swift | 2 +- .../TuistKit/Services/GenerateService.swift | 2 +- Sources/TuistKit/Services/GraphService.swift | 2 +- Sources/TuistKit/Services/InitService.swift | 6 +- .../TuistKit/Services/InstallService.swift | 2 +- Sources/TuistKit/Services/ListService.swift | 2 +- .../ProjectAutomation+ManifestMapper.swift | 30 +++--- Sources/TuistKit/Services/RunService.swift | 2 +- .../TuistKit/Services/ScaffoldService.swift | 4 +- Sources/TuistKit/Services/TestService.swift | 6 +- .../TuistKit/Utils/ManifestGraphLoader.swift | 10 +- .../Utils/Target+PlatformResolution.swift | 2 +- .../Utils/TuistAnalyticsCloudBackend.swift | 2 +- .../Loaders/CachedManifestLoader.swift | 4 +- .../TuistLoader/Loaders/ConfigLoader.swift | 12 +-- .../TuistLoader/Loaders/ManifestLoader.swift | 2 +- .../Loaders/ManifestModelConverter.swift | 28 +++--- .../Loaders/PackageSettingsLoader.swift | 8 +- .../Loaders/RecursiveManifestLoader.swift | 8 +- .../SwiftPackageManagerGraphLoader.swift | 10 +- .../Loaders/TemplateGitLoader.swift | 8 +- .../TuistLoader/Loaders/TemplateLoader.swift | 34 +++---- .../AnalyzeAction+ManifestMapper.swift | 6 +- .../ArchiveAction+ManifestMapper.swift | 14 +-- .../Arguments+ManifestMapper.swift | 8 +- .../BuildAction+ManifestMapper.swift | 16 +-- .../BuildConfiguration+ManifestMapper.swift | 12 +-- .../BuildRule+ManifestMapper.swift | 8 +- ...uildRule.CompilerSpec+ManifestMapper.swift | 6 +- .../BuildRule.FileType+ManifestMapper.swift | 6 +- .../Cache+ManifestMapper.swift | 2 +- .../Cloud+ManifestMapper.swift | 14 +-- ...mpatibleXcodeVersions+ManifestMapper.swift | 8 +- .../Config+ManifestMapper.swift | 32 +++--- .../Configuration+ManifestMapper.swift | 10 +- .../CopyFileElement+ManifestMapper.swift | 8 +- .../CopyFilesAction+ManifestMapper.swift | 26 ++--- .../CoreDataModel+ManifestMapper.swift | 14 +-- .../DefaultSettings+ManifestMapper.swift | 8 +- .../DeploymentTargets+ManifestMapper.swift | 10 +- .../Destination+ManifestMapper.swift | 10 +- .../Entitlements+ManifestMapper.swift | 10 +- .../EnvironmentVariable+ManifestMapper.swift | 8 +- .../ExecutionAction+ManifestMapper.swift | 10 +- .../FileCodeGen+ManifestMapper.swift | 6 +- .../FileElement+ManifestMapper.swift | 8 +- .../FrameworkStatus+ManifestMapper.swift | 8 +- .../Headers+ManifestMapper.swift | 10 +- .../IDETemplateMacros+ManifestMapper.swift | 2 +- .../InfoPlist+ManifestMapper.swift | 12 +-- .../LaunchArgument+ManifestMapper.swift | 8 +- .../LaunchStyle+ManifestMappers.swift | 8 +- .../MergedBinaryType+ManifestMapper.swift | 8 +- .../Package+ManifestMapper.swift | 14 +-- .../PackageSettings+ManifestMapper.swift | 16 +-- .../Platform+ManifestMapper.swift | 14 +-- .../Plist+ManifestMapper.swift | 12 +-- .../PluginLocation+ManifestMapper.swift | 8 +- .../Product+ManifestMapper.swift | 6 +- .../ProfileAction+ManifestMapper.swift | 14 +-- .../Project+ManifestMapper.swift | 24 ++--- .../ProjectOption+ManifestMapper.swift | 10 +- .../ProjectOption+ToManifestMapper.swift | 12 +-- .../ResourceFileElement+ManifestMapper.swift | 8 +- .../ResourceSynthesizer+ManifestMapper.swift | 14 +-- .../RunAction+ManifestMapper.swift | 28 +++--- .../RunActionOptions+ManifestMapper.swift | 12 +-- .../SDKStatus+ManifestMapper.swift | 8 +- .../Scheme+ManifestMapper.swift | 20 ++-- ...hemeDiagnosticsOption+ManifestMapper.swift | 8 +- .../ScreenCaptureFormat+ManifestMapper.swift | 6 +- .../SettingValue+ManifestMapper.swift | 8 +- .../Settings+ManifestMapper.swift | 20 ++-- .../SettingsDictionary+ManifestMapper.swift | 12 +-- .../Target+ManifestMapper.swift | 72 +++++++------- .../TargetAction+ManifestMapper.swift | 18 ++-- .../TargetDependency+ManifestMapper.swift | 18 ++-- .../TestAction+ManifestMapper.swift | 36 +++---- .../TestPlan+ManifestMapper.swift | 2 +- .../TestableTarget+ManifestMapper.swift | 12 +-- .../TestingOptions+ManifestMapper.swift | 6 +- .../TestingOptions+ToManifestMapper.swift | 6 +- .../Workspace+ManifestMapper.swift | 14 +-- ...paceGenerationOptions+ManifestMapper.swift | 12 +-- .../Models/FileListGlob+Unfold.swift | 2 +- .../ProjectDescriptionHelpersBuilder.swift | 2 +- ...jectDescriptionHelpersBuilderFactory.swift | 2 +- .../PackageInfo+graphPlatform.swift | 4 +- .../PackageInfoMapper.swift | 32 +++--- .../SwiftPackageManager/SettingsMapper.swift | 12 +-- .../ResourceSynthesizerPathLocator.swift | 2 +- .../Utils/StencilPathLocator.swift | 2 +- .../Loaders/Mocks/MockManifestLoader.swift | 2 +- .../Mocks/MockPackageSettingsLoader.swift | 4 +- .../Loaders/Mocks/MockTemplateGitLoader.swift | 2 +- .../Loaders/Mocks/MockTemplateLoader.swift | 2 +- ...MockProjectDescriptionHelpersBuilder.swift | 2 +- ...jectDescriptionHelpersBuilderFactory.swift | 2 +- .../MockResourceSynthesizerPathLocator.swift | 2 +- Sources/TuistPlugin/PluginService.swift | 2 +- .../MockPluginService.swift | 2 +- Sources/TuistScaffold/TemplateGenerator.swift | 12 +-- .../Utils/Mocks/MockTemplateGenerator.swift | 6 +- .../Cache/CacheStorageFactorying.swift | 2 +- Sources/TuistServer/Cache/CacheStoring.swift | 2 +- .../Cache/EmptyCacheStorageFactory.swift | 2 +- Sources/TuistSigning/SigningInteractor.swift | 2 +- Sources/TuistSupport/Constants.swift | 2 +- .../PackageInfo+TestData.swift | 2 +- .../DependenciesGraph/DependenciesGraph.swift | 0 .../Graph/ConditionalGraphTarget.swift | 0 .../Graph/Graph.swift | 0 .../Graph/GraphDependency.swift | 0 .../Graph/GraphEdge.swift | 0 .../Graph/GraphTarget.swift | 0 .../Models/AnalyzeAction.swift | 0 .../Models/ArchiveAction.swift | 0 .../Models/Arguments.swift | 0 .../Models/AutogenerationOptions.swift | 0 .../Models/BinaryArchitecture.swift | 0 .../Models/BuildAction.swift | 0 .../Models/BuildConfiguration.swift | 0 .../Models/BuildRule+CompilerSpec.swift | 0 .../Models/BuildRule+FileType.swift | 0 .../Models/BuildRule.swift | 0 .../Models/Cloud.swift | 0 .../Models/CompatibleXcodeVersions.swift | 0 .../Models/Config.swift | 0 .../Models/ConfigGenerationOptions.swift | 0 .../Models/CopyFileElement.swift | 0 .../Models/CopyFilesAction.swift | 0 .../Models/CoreDataModel.swift | 0 .../Models/Dependencies/PackageSettings.swift | 4 +- .../SwiftPackageManagerDependencies.swift | 4 +- .../Models/DeploymentTargets.swift | 0 .../Models/Destination.swift | 0 .../Models/EnvironmentVariable.swift | 0 .../Models/ExecutionAction.swift | 0 .../Models/FileCodeGen.swift | 0 .../Models/FileElement.swift | 0 .../Models/Headers.swift | 0 .../Models/IDETemplateMacros.swift | 0 .../Models/LaunchArgument.swift | 0 .../Models/LaunchStyle.swift | 0 .../Models/MergedBinaryType.swift | 0 .../Models/Metadata/FrameworkMetadata.swift | 0 .../Models/Metadata/LibraryMetadata.swift | 0 .../Metadata/SystemFrameworkMetadata.swift | 0 .../Models/Metadata/XCFrameworkMetadata.swift | 0 .../Models/OnDemandResourcesTags.swift | 0 .../Models/Package.swift | 2 +- .../Models/Platform.swift | 0 .../Models/PlatformCondition.swift | 0 .../Models/PlatformFilter.swift | 0 .../Models/Plist.swift | 0 .../Models/Plugin.swift | 0 .../Models/PluginLocation.swift | 0 .../Models/PluginResourceSynthesizer.swift | 0 .../Models/Plugins.swift | 0 .../Models/PrivacyManifest.swift | 0 .../Models/Product.swift | 0 .../Models/ProfileAction.swift | 0 .../Models/Project.swift | 0 .../ProjectDescriptionHelpersPlugin.swift | 0 .../Models/ProjectGroup.swift | 0 .../Models/ProjectOptions.swift | 0 .../Models/RawScriptBuildPhase.swift | 0 .../Models/Requirement.swift | 0 .../Models/ResourceFileElement.swift | 4 +- .../Models/ResourceFileElements.swift | 0 .../Models/ResourceSynthesizer.swift | 0 .../Models/RunAction.swift | 0 .../Models/RunActionOptions.swift | 0 .../Models/SDKSource.swift | 0 .../Models/SDKType.swift | 0 .../Models/Scheme.swift | 0 .../Models/SchemeDiagnosticsOptions.swift | 0 .../Models/ScreenCaptureFormat.swift | 0 .../Models/Settings.swift | 0 .../Models/SimulatedLocation.swift | 0 .../Models/SourceFile.swift | 0 .../Models/SourceFileGlob.swift | 0 .../Models/Target.swift | 0 .../Models/TargetDependency.swift | 0 .../Models/TargetReference.swift | 0 .../Models/TargetScript.swift | 0 .../Models/Template.swift | 0 .../Models/TestAction.swift | 0 .../Models/TestPlan.swift | 0 .../Models/TestableTarget.swift | 0 .../Models/TestingOptions.swift | 0 .../Models/Workspace.swift | 0 .../Models/WorkspaceGenerationOptions.swift | 0 .../Models/XCFrameworkInfoPlist.swift | 0 .../DependenciesGraph+TestData.swift | 2 +- .../Graph/Graph+TestData.swift | 2 +- .../Graph/GraphDependency+TestData.swift | 2 +- .../Graph/GraphTarget+TestData.swift | 2 +- .../Models/AnalyzeAction+TestData.swift | 2 +- .../Models/ArchiveAction+TestData.swift | 2 +- .../Models/Arguments+TestData.swift | 2 +- .../Models/BuildAction+TestData.swift | 2 +- .../Models/Cloud+TestData.swift | 2 +- .../Models/Condition+TestData.swift | 2 +- .../Models/Config+TestData.swift | 4 +- .../Models/Headers+TestData.swift | 2 +- .../Models/IDETemplateMacros+TestData.swift | 2 +- .../Metadata/FrameworkMetadata+TestData.swift | 2 +- .../Metadata/LibraryMetadata+TestData.swift | 2 +- .../XCFrameworkMetadata+TestData.swift | 2 +- .../Models/PackageSettings+TestData.swift | 4 +- .../Models/Plugins+TestData.swift | 2 +- .../Models/ProfileAction+TestData.swift | 2 +- .../Models/Project+TestData.swift | 2 +- .../Models/ProjectOptions+TestData.swift | 2 +- .../Models/RawScriptBuildPhase+TestData.swift | 2 +- .../ResourceSynthesizerPlugin+TestData.swift | 2 +- .../ResourceSynthesizers+TestData.swift | 4 +- .../Models/RunAction+TestData.swift | 4 +- .../Models/Scheme+TestData.swift | 2 +- .../Models/Settings+TestData.swift | 2 +- .../Models/Target+TestData.swift | 2 +- .../Models/Template+TestData.swift | 2 +- .../Models/TestAction+TestData.swift | 2 +- .../Models/TestableTarget+TestData.swift | 2 +- .../Models/Workspace+TestData.swift | 2 +- .../XCFrameworkInfoPlist+TestData.swift | 2 +- .../SkipUITestsProjectMapperTests.swift | 2 +- .../SourceRootPathProjectMapperTests.swift | 2 +- .../Utilities/BuildGraphInspectorTests.swift | 2 +- .../Utilities/TargetBuilderTests.swift | 2 +- .../Utilities/TargetRunnerTests.swift | 2 +- .../Graph/CircularDependencyLinterTests.swift | 2 +- .../Graph/GraphDependencyTests.swift | 2 +- .../Graph/GraphLoaderTests.swift | 2 +- .../Graph/GraphTargetTests.swift | 2 +- .../Graph/GraphTraverserTests.swift | 4 +- .../Graph/Mappers/GraphMapperTests.swift | 2 +- .../Graph/Mappers/ProjectMapperTests.swift | 2 +- .../Graph/Mappers/WorkspaceMapperTests.swift | 2 +- .../FrameworkMetadataProviderTests.swift | 2 +- .../LibraryMetadataProviderTests.swift | 2 +- .../PrecompiledMetadataProviderTests.swift | 2 +- ...SystemFrameworkMetadataProviderTests.swift | 2 +- .../XCFrameworkMetadataProviderTests.swift | 2 +- .../NodeLoaders/FrameworkLoaderTests.swift | 2 +- .../NodeLoaders/XCFrameworkLoaderTests.swift | 2 +- ...xternalDependencyPathWorkspaceMapper.swift | 2 +- ...ectsPlatformNarrowerGraphMapperTests.swift | 4 +- ...rphanExternalTargetsGraphMapperTests.swift | 4 +- ...ltipleConfigurationsIntegrationTests.swift | 4 +- .../StableStructureIntegrationTests.swift | 2 +- .../SwiftPackageManagerInteractorTests.swift | 4 +- .../Generator/TestModelGenerator.swift | 2 +- .../TuistGeneratorPerformanceTests.swift | 2 +- .../WorkspaceGeneratorIntegrationTests.swift | 4 +- .../Extensions/Xcodeproj+ExtrasTests.swift | 4 +- .../Generator/BuildPhaseGeneratorTests.swift | 4 +- .../Generator/ConfigGeneratorTests.swift | 4 +- .../InfoPlistContentProviderTests.swift | 4 +- .../Generator/LinkGeneratorTests.swift | 4 +- .../Mocks/MockInfoPlistContentProvider.swift | 4 +- .../MockProjectDescriptorGenerator.swift | 4 +- .../MockSchemeDescriptorsGenerator.swift | 4 +- .../Generator/Mocks/MockTargetGenerator.swift | 4 +- .../MockWorkspaceDescriptorGenerator.swift | 4 +- .../ProjectDescriptorGeneratorTests.swift | 4 +- .../Generator/ProjectFileElementsTests.swift | 4 +- .../Generator/ProjectGroupsTests.swift | 4 +- .../SchemeDescriptorsGeneratorTests.swift | 4 +- .../Generator/TargetGeneratorTests.swift | 4 +- .../WorkspaceDescriptorGeneratorTests.swift | 4 +- ...paceSettingsDescriptorGeneratorTests.swift | 4 +- .../WorkspaceStructureGeneratorTests.swift | 4 +- ...dWorkspaceSchemeWorkspaceMapperTests.swift | 4 +- .../GraphViz/GraphToGraphVizMapperTests.swift | 8 +- .../Linter/EnvironmentLinterTests.swift | 4 +- .../Linter/GraphLinterTests.swift | 4 +- .../Linter/Mocks/MockPackageLinter.swift | 4 +- .../Linter/Mocks/MockProjectLinter.swift | 4 +- .../Linter/Mocks/MockSchemeLinter.swift | 4 +- .../Linter/Mocks/MockSettingsLinter.swift | 4 +- .../Mocks/MockStaticProductsGraphLinter.swift | 2 +- .../Linter/Mocks/MockTargetLinter.swift | 4 +- .../Linter/PackageLinterTests.swift | 4 +- .../Linter/ProjectLinterTests.swift | 4 +- .../Linter/SchemeLinterTests.swift | 4 +- .../Linter/SettingsLinterTests.swift | 4 +- .../StaticProductsGraphLinterTests.swift | 4 +- .../Linter/TargetLinterTests.swift | 6 +- .../Linter/TargetScriptLinterTests.swift | 4 +- ...togeneratedSchemesProjectMapperTests.swift | 6 +- ...teDerivedDirectoryProjectMapperTests.swift | 4 +- .../ExplicitDependencyGraphMapperTests.swift | 2 +- .../GenerateInfoPlistProjectMapperTests.swift | 4 +- .../IDETemplateMacrosMapperTests.swift | 2 +- ...stUpgradeVersionWorkspaceMapperTests.swift | 2 +- .../ProjectMappers/ModuleMapMapperTests.swift | 2 +- .../ResourcesProjectMapperTests.swift | 4 +- ...dResourceInterfaceProjectMapperTests.swift | 4 +- ...DisableShowEnvVarsProjectMapperTests.swift | 4 +- .../DefaultSettingsProviderTests.swift | 4 +- ...ynthesizedResourceInterfaceGenerator.swift | 2 +- .../Utils/SettingsHelperTests.swift | 2 +- .../ManifestGraphLoaderIntegrationTests.swift | 2 +- .../Cloud/CloudAuthServiceTests.swift | 4 +- .../Cloud/CloudCleanServiceTests.swift | 4 +- .../Cloud/CloudInitServiceTests.swift | 4 +- .../Cloud/CloudLogoutServiceTests.swift | 4 +- .../CloudOrganizationInviteServiceTests.swift | 2 +- .../CloudOrganizationListServiceTests.swift | 2 +- ...oudOrganizationRemoveSSOServiceTests.swift | 2 +- .../CloudOrganizationShowServiceTests.swift | 2 +- .../CloudOrganizationUpdateSSOService.swift | 2 +- .../CloudProjectDeleteServiceTests.swift | 2 +- .../Cloud/CloudProjectListServiceTests.swift | 2 +- .../Cloud/CloudSessionServiceTests.swift | 4 +- .../Dot/MockDotGraphGenerator.swift | 4 +- .../Generator/Mocks/MockGenerator.swift | 4 +- .../Factories/GraphMapperFactoryTests.swift | 2 +- .../Factories/ProjectMapperFactoryTests.swift | 2 +- .../WorkspaceMapperFactoryTests.swift | 2 +- .../FocusTargetsGraphMappersTests.swift | 2 +- ...eeShakePrunedTargetsGraphMapperTests.swift | 2 +- ...ateWorkspaceProjectsGraphMapperTests.swift | 4 +- ...spaceRenderMarkdownReadmeMapperTests.swift | 2 +- .../Mocks/MockManifestGraphLoader.swift | 4 +- .../Mocks/MockProjectEditorMapper.swift | 4 +- .../ProjectEditorMapperTests.swift | 4 +- .../ProjectEditor/ProjectEditorTests.swift | 4 +- .../Services/BuildServiceTests.swift | 6 +- .../Services/EditServiceTests.swift | 2 +- .../Services/GenerateServiceTests.swift | 2 +- .../Services/GraphServiceTests.swift | 2 +- .../Services/InitServiceTests.swift | 26 ++--- .../Services/InstallServiceTests.swift | 4 +- .../Services/ListServiceTests.swift | 4 +- .../Services/RunServiceTests.swift | 4 +- .../Services/ScaffoldServiceTests.swift | 4 +- .../Services/TestServiceTests.swift | 4 +- .../TuistAnalyticsCloudBackendTests.swift | 2 +- .../Utils/TuistAnalyticsDispatcherTests.swift | 2 +- ...iptionHelpersBuilderIntegrationTests.swift | 2 +- .../TuistTestCase+ManifestMappers.swift | 34 +++---- .../Loaders/CachedManifestLoaderTests.swift | 2 +- .../Loaders/ConfigLoaderTests.swift | 8 +- .../Loaders/PackageSettingsLoaderTests.swift | 12 +-- ...SwiftPackageManagerDependenciesTests.swift | 2 +- .../Loaders/TemplateGitLoaderTests.swift | 4 +- .../Loaders/TemplateLoaderTests.swift | 4 +- .../Cloud+ManifestMapperTests.swift | 4 +- ...CodeCoverageMode+ManifestMapperTests.swift | 8 +- .../Configuration+ManifestMapperTests.swift | 8 +- .../CopyFileElement+ManifestMapperTests.swift | 10 +- .../CopyFilesAction+ManifestMapperTests.swift | 6 +- .../CoreDataModel+ManifestMapperTests.swift | 12 +-- .../FileElement+ManifestMapperTests.swift | 10 +- .../Headers+ManifestMapperTests.swift | 24 ++--- .../Platform+ManifestMapperTests.swift | 10 +- .../Project+ManifestMapperTests.swift | 6 +- ...sourceFileElementManifestMapperTests.swift | 18 ++-- ...ourceSynthesizer+ManifestMapperTests.swift | 2 +- .../Scheme+ManifestMapper.swift | 6 +- .../Settings+ManifestMapperTests.swift | 4 +- .../Stencil+ManifestMapperTests.swift | 2 +- ...TargetDependency+ManifestMapperTests.swift | 18 ++-- .../TargetScript+ManifestMapperTests.swift | 8 +- ...nerationOptions+ManifestWrapperTests.swift | 10 +- .../PackageInfoGraphPlatformTests.swift | 2 +- .../PackageInfoMapperTests.swift | 6 +- .../SettingsMapperTests.swift | 6 +- .../TuistPluginTests/PluginServiceTests.swift | 18 ++-- .../TemplateGeneratorTests.swift | 2 +- .../SwiftPackageManagerControllerTests.swift | 2 +- .../DependenciesGraphTests.swift | 2 +- .../Graph/GraphDependencyTests.swift | 2 +- .../Graph/GraphTargetTests.swift | 2 +- .../Graph/GraphTests.swift | 2 +- .../Models/AnalyzeActionTests.swift | 2 +- .../Models/ArchiveActionTests.swift | 2 +- .../Models/ArgumentsTests.swift | 2 +- .../Models/BinaryArchitectureTests.swift | 2 +- .../Models/BuildActionTests.swift | 2 +- .../Models/BuildConfigurationTests.swift | 2 +- .../Models/BuildRule.CompilerSpecTests.swift | 2 +- .../Models/BuildRule.FileTypeTests.swift | 2 +- .../Models/BuildRuleTests.swift | 2 +- .../Models/CompatibleXcodeVersionsTests.swift | 2 +- .../Models/CopyFileElementTests.swift | 2 +- .../Models/CopyFilesActionTests.swift | 2 +- .../Models/CoreDataModelTests.swift | 2 +- .../Models/ExecutionActionTests.swift | 2 +- .../Models/FileElementTests.swift | 2 +- .../Models/HeadersTests.swift | 2 +- .../Models/IDETemplateMacrosTests.swift | 2 +- .../Models/InfoPlistTests.swift | 2 +- .../Models/LintingIssueTests.swift | 2 +- .../Models/PackageTests.swift | 2 +- .../Models/PlatformFilterTests.swift | 2 +- .../Models/PlatformTests.swift | 2 +- .../Models/ProductTests.swift | 2 +- .../Models/ProfileActionTests.swift | 2 +- .../Models/ProjectGroupTests.swift | 2 +- .../Models/ProjectTests.swift | 4 +- .../Models/RawScriptBuildPhaseTests.swift | 2 +- .../Models/RequirementTests.swift | 2 +- .../Models/ResourceFileElementTests.swift | 2 +- .../Models/ResourceSynthesizerTests.swift | 2 +- .../Models/RunActionTests.swift | 2 +- .../Models/SDKSourceTests.swift | 2 +- .../Models/SchemeTests.swift | 2 +- .../Models/SettingsTests.swift | 2 +- .../Models/SourceFileTests.swift | 2 +- .../Models/TargetDependencyTests.swift | 2 +- .../Models/TargetReferenceTests.swift | 2 +- .../Models/TargetScriptTests.swift | 2 +- .../Models/TargetTests.swift | 4 +- .../Models/TestActionTests.swift | 2 +- .../Models/TestPlanTests.swift | 2 +- .../Models/TestableTargetTests.swift | 2 +- .../WorkspaceGenerationOptionsTests.swift | 2 +- .../Models/WorkspaceTests.swift | 2 +- Tuist/ProjectDescriptionHelpers/Module.swift | 99 ++++++++++--------- docs/docs/guide/project/plugins.md | 2 +- 548 files changed, 1194 insertions(+), 1193 deletions(-) rename Sources/{TuistGraph => XcodeGraph}/DependenciesGraph/DependenciesGraph.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Graph/ConditionalGraphTarget.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Graph/Graph.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Graph/GraphDependency.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Graph/GraphEdge.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Graph/GraphTarget.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/AnalyzeAction.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/ArchiveAction.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Arguments.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/AutogenerationOptions.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/BinaryArchitecture.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/BuildAction.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/BuildConfiguration.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/BuildRule+CompilerSpec.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/BuildRule+FileType.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/BuildRule.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Cloud.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/CompatibleXcodeVersions.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Config.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/ConfigGenerationOptions.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/CopyFileElement.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/CopyFilesAction.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/CoreDataModel.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Dependencies/PackageSettings.swift (93%) rename Sources/{TuistGraph => XcodeGraph}/Models/Dependencies/SwiftPackageManagerDependencies.swift (97%) rename Sources/{TuistGraph => XcodeGraph}/Models/DeploymentTargets.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Destination.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/EnvironmentVariable.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/ExecutionAction.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/FileCodeGen.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/FileElement.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Headers.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/IDETemplateMacros.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/LaunchArgument.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/LaunchStyle.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/MergedBinaryType.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Metadata/FrameworkMetadata.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Metadata/LibraryMetadata.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Metadata/SystemFrameworkMetadata.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Metadata/XCFrameworkMetadata.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/OnDemandResourcesTags.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Package.swift (91%) rename Sources/{TuistGraph => XcodeGraph}/Models/Platform.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/PlatformCondition.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/PlatformFilter.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Plist.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Plugin.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/PluginLocation.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/PluginResourceSynthesizer.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Plugins.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/PrivacyManifest.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Product.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/ProfileAction.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Project.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/ProjectDescriptionHelpersPlugin.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/ProjectGroup.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/ProjectOptions.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/RawScriptBuildPhase.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Requirement.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/ResourceFileElement.swift (93%) rename Sources/{TuistGraph => XcodeGraph}/Models/ResourceFileElements.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/ResourceSynthesizer.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/RunAction.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/RunActionOptions.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/SDKSource.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/SDKType.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Scheme.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/SchemeDiagnosticsOptions.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/ScreenCaptureFormat.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Settings.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/SimulatedLocation.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/SourceFile.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/SourceFileGlob.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Target.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/TargetDependency.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/TargetReference.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/TargetScript.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Template.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/TestAction.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/TestPlan.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/TestableTarget.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/TestingOptions.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/Workspace.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/WorkspaceGenerationOptions.swift (100%) rename Sources/{TuistGraph => XcodeGraph}/Models/XCFrameworkInfoPlist.swift (100%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/DependenciesGraph/DependenciesGraph+TestData.swift (99%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Graph/Graph+TestData.swift (97%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Graph/GraphDependency+TestData.swift (99%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Graph/GraphTarget+TestData.swift (92%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/AnalyzeAction+TestData.swift (88%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/ArchiveAction+TestData.swift (95%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Arguments+TestData.swift (92%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/BuildAction+TestData.swift (93%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Cloud+TestData.swift (91%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Condition+TestData.swift (91%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Config+TestData.swift (94%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Headers+TestData.swift (92%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/IDETemplateMacros+TestData.swift (92%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Metadata/FrameworkMetadata+TestData.swift (96%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Metadata/LibraryMetadata+TestData.swift (95%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Metadata/XCFrameworkMetadata+TestData.swift (96%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/PackageSettings+TestData.swift (88%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Plugins+TestData.swift (94%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/ProfileAction+TestData.swift (95%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Project+TestData.swift (99%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/ProjectOptions+TestData.swift (98%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/RawScriptBuildPhase+TestData.swift (93%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/ResourceSynthesizerPlugin+TestData.swift (92%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/ResourceSynthesizers+TestData.swift (84%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/RunAction+TestData.swift (93%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Scheme+TestData.swift (96%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Settings+TestData.swift (97%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Target+TestData.swift (99%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Template+TestData.swift (95%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/TestAction+TestData.swift (98%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/TestableTarget+TestData.swift (97%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/Workspace+TestData.swift (98%) rename Sources/{TuistGraphTesting => XcodeGraphTesting}/Models/XCFrameworkInfoPlist+TestData.swift (96%) rename Tests/{TuistGraphTests => XcodeGraphTests}/DependenciesGraph/DependenciesGraphTests.swift (91%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Graph/GraphDependencyTests.swift (98%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Graph/GraphTargetTests.swift (90%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Graph/GraphTests.swift (90%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/AnalyzeActionTests.swift (91%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/ArchiveActionTests.swift (97%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/ArgumentsTests.swift (95%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/BinaryArchitectureTests.swift (97%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/BuildActionTests.swift (97%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/BuildConfigurationTests.swift (98%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/BuildRule.CompilerSpecTests.swift (91%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/BuildRule.FileTypeTests.swift (91%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/BuildRuleTests.swift (92%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/CompatibleXcodeVersionsTests.swift (99%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/CopyFileElementTests.swift (95%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/CopyFilesActionTests.swift (94%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/CoreDataModelTests.swift (93%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/ExecutionActionTests.swift (94%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/FileElementTests.swift (94%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/HeadersTests.swift (94%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/IDETemplateMacrosTests.swift (98%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/InfoPlistTests.swift (97%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/LintingIssueTests.swift (98%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/PackageTests.swift (97%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/PlatformFilterTests.swift (97%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/PlatformTests.swift (99%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/ProductTests.swift (99%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/ProfileActionTests.swift (96%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/ProjectGroupTests.swift (90%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/ProjectTests.swift (97%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/RawScriptBuildPhaseTests.swift (93%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/RequirementTests.swift (94%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/ResourceFileElementTests.swift (95%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/ResourceSynthesizerTests.swift (94%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/RunActionTests.swift (97%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/SDKSourceTests.swift (93%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/SchemeTests.swift (90%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/SettingsTests.swift (99%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/SourceFileTests.swift (92%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/TargetDependencyTests.swift (98%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/TargetReferenceTests.swift (92%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/TargetScriptTests.swift (95%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/TargetTests.swift (99%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/TestActionTests.swift (90%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/TestPlanTests.swift (92%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/TestableTargetTests.swift (94%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/WorkspaceGenerationOptionsTests.swift (91%) rename Tests/{TuistGraphTests => XcodeGraphTests}/Models/WorkspaceTests.swift (92%) diff --git a/Package.swift b/Package.swift index bce5e9cd081..ec71d4fb85b 100644 --- a/Package.swift +++ b/Package.swift @@ -23,7 +23,7 @@ var targets: [Target] = [ ] ), .target( - name: "TuistGraph", + name: "XcodeGraph", dependencies: [ swiftToolsSupportDependency, "AnyCodable", @@ -35,9 +35,9 @@ var targets: [Target] = [ ] ), .target( - name: "TuistGraphTesting", + name: "XcodeGraphTesting", dependencies: [ - "TuistGraph", + "XcodeGraph", "TuistSupportTesting", swiftToolsSupportDependency, "AnyCodable", @@ -50,7 +50,7 @@ var targets: [Target] = [ swiftToolsSupportDependency, "ProjectDescription", "TuistSupport", - "TuistGraph", + "XcodeGraph", "XcodeProj", "Mockable", ], @@ -63,7 +63,7 @@ var targets: [Target] = [ dependencies: [ "TuistCore", "TuistSupportTesting", - "TuistGraphTesting", + "XcodeGraphTesting", swiftToolsSupportDependency, ], linkerSettings: [.linkedFramework("XCTest")] @@ -87,7 +87,7 @@ var targets: [Target] = [ "TuistAsyncQueue", "TuistAnalytics", "TuistPlugin", - "TuistGraph", + "XcodeGraph", "Mockable", "TuistServer", ], @@ -128,7 +128,7 @@ var targets: [Target] = [ name: "TuistSupportTesting", dependencies: [ "TuistSupport", - "TuistGraph", + "XcodeGraph", swiftToolsSupportDependency, "Difference", ], @@ -152,7 +152,7 @@ var targets: [Target] = [ "XcodeProj", swiftToolsSupportDependency, "TuistCore", - "TuistGraph", + "XcodeGraph", "TuistSupport", "GraphViz", swiftGenKitDependency, @@ -176,7 +176,7 @@ var targets: [Target] = [ dependencies: [ swiftToolsSupportDependency, "TuistCore", - "TuistGraph", + "XcodeGraph", "TuistSupport", "StencilSwiftKit", "Stencil", @@ -193,7 +193,7 @@ var targets: [Target] = [ swiftToolsSupportDependency, .product(name: "XcbeautifyLib", package: "xcbeautify"), "TuistCore", - "TuistGraph", + "XcodeGraph", "TuistSupport", "Mockable", ], @@ -206,7 +206,7 @@ var targets: [Target] = [ dependencies: [ "ProjectDescription", "TuistCore", - "TuistGraph", + "XcodeGraph", "TuistSupport", "TuistPlugin", "Mockable", @@ -220,7 +220,7 @@ var targets: [Target] = [ name: "TuistMigration", dependencies: [ "TuistCore", - "TuistGraph", + "XcodeGraph", "TuistSupport", "XcodeProj", "Mockable", @@ -234,7 +234,7 @@ var targets: [Target] = [ name: "TuistAsyncQueue", dependencies: [ "TuistCore", - "TuistGraph", + "XcodeGraph", "TuistSupport", "XcodeProj", "Mockable", @@ -251,7 +251,7 @@ var targets: [Target] = [ "XcodeProj", swiftToolsSupportDependency, "TuistCore", - "TuistGraph", + "XcodeGraph", "TuistSupport", "Mockable", "ProjectDescription", @@ -266,7 +266,7 @@ var targets: [Target] = [ "TuistLoader", swiftToolsSupportDependency, "TuistCore", - "TuistGraphTesting", + "XcodeGraphTesting", "ProjectDescription", "TuistSupportTesting", ], @@ -278,7 +278,7 @@ var targets: [Target] = [ .byName(name: "AnyCodable"), "TuistAsyncQueue", "TuistCore", - "TuistGraph", + "XcodeGraph", "TuistLoader", "Mockable", swiftToolsSupportDependency, @@ -290,7 +290,7 @@ var targets: [Target] = [ .target( name: "TuistPlugin", dependencies: [ - "TuistGraph", + "XcodeGraph", "TuistLoader", "TuistSupport", "TuistScaffold", @@ -353,12 +353,12 @@ let package = Package( targets: ["ProjectAutomation"] ), .library( - name: "TuistGraph", - targets: ["TuistGraph"] + name: "XcodeGraph", + targets: ["XcodeGraph"] ), .library( - name: "TuistGraphTesting", - targets: ["TuistGraphTesting"] + name: "XcodeGraphTesting", + targets: ["XcodeGraphTesting"] ), .library( name: "TuistKit", diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift index 5a22c0e6119..9aee901ecb8 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift @@ -1,8 +1,8 @@ // swiftlint:disable force_try import TSCBasic import TuistCore -import TuistGraph @_exported import TuistKit +import XcodeGraph import XCTest @testable import TuistSupport diff --git a/Sources/TuistAnalytics/TuistAnalytics.swift b/Sources/TuistAnalytics/TuistAnalytics.swift index 51349f2ffbd..aa06b3c173a 100644 --- a/Sources/TuistAnalytics/TuistAnalytics.swift +++ b/Sources/TuistAnalytics/TuistAnalytics.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistAsyncQueue -import TuistGraph import TuistLoader +import XcodeGraph public enum TuistAnalytics { public static func bootstrap(dispatcher: TuistAnalyticsDispatcher) throws { diff --git a/Sources/TuistAnalytics/Utilities/TuistAnalyticsDispatcher.swift b/Sources/TuistAnalytics/Utilities/TuistAnalyticsDispatcher.swift index aed240cdba6..d3382ddd1be 100644 --- a/Sources/TuistAnalytics/Utilities/TuistAnalyticsDispatcher.swift +++ b/Sources/TuistAnalytics/Utilities/TuistAnalyticsDispatcher.swift @@ -1,8 +1,8 @@ import Foundation import TuistAsyncQueue import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph /// `TuistAnalyticsTagger` is responsible to send analytics events that gets stored and reported to the cloud backend (if defined) public struct TuistAnalyticsDispatcher: AsyncQueueDispatching { diff --git a/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift b/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift index 63ec20df1eb..533abb47092 100644 --- a/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift +++ b/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph public final class SkipUITestsProjectMapper: ProjectMapping { public init() {} diff --git a/Sources/TuistAutomation/ProjectMappers/SourceRootPathProjectMapper.swift b/Sources/TuistAutomation/ProjectMappers/SourceRootPathProjectMapper.swift index 0f586f5309e..e9a3f30061e 100644 --- a/Sources/TuistAutomation/ProjectMappers/SourceRootPathProjectMapper.swift +++ b/Sources/TuistAutomation/ProjectMappers/SourceRootPathProjectMapper.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph /// Automation commands create their own project in temporary directory /// This means `SRCROOT` has a different path from the directory where `.xcodeproj` resides diff --git a/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift b/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift index cd6fec15a02..3a6d55ac7d2 100644 --- a/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift +++ b/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph public protocol BuildGraphInspecting { /// Returns the build arguments to be used with the given target. diff --git a/Sources/TuistAutomation/Utilities/TargetBuilder.swift b/Sources/TuistAutomation/Utilities/TargetBuilder.swift index cb26db87482..b37070f932c 100644 --- a/Sources/TuistAutomation/Utilities/TargetBuilder.swift +++ b/Sources/TuistAutomation/Utilities/TargetBuilder.swift @@ -1,8 +1,8 @@ import TSCBasic import TSCUtility import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph public protocol TargetBuilding { /// Builds a provided target. @@ -21,7 +21,7 @@ public protocol TargetBuilding { /// - passthroughXcodeBuildArguments: The passthrough xcodebuild arguments to pass to xcodebuild func buildTarget( _ target: GraphTarget, - platform: TuistGraph.Platform, + platform: XcodeGraph.Platform, workspacePath: AbsolutePath, scheme: Scheme, clean: Bool, @@ -79,7 +79,7 @@ public final class TargetBuilder: TargetBuilding { public func buildTarget( _ target: GraphTarget, - platform: TuistGraph.Platform, + platform: XcodeGraph.Platform, workspacePath: AbsolutePath, scheme: Scheme, clean: Bool, @@ -140,7 +140,7 @@ public final class TargetBuilder: TargetBuilding { to outputPath: AbsolutePath, projectPath: AbsolutePath, derivedDataPath: AbsolutePath?, - platform: TuistGraph.Platform, + platform: XcodeGraph.Platform, configuration: String ) throws { let xcodeSchemeBuildPath = try xcodeProjectBuildDirectoryLocator.locate( diff --git a/Sources/TuistAutomation/Utilities/TargetRunner.swift b/Sources/TuistAutomation/Utilities/TargetRunner.swift index 4441df298c5..a0f127a2eb0 100644 --- a/Sources/TuistAutomation/Utilities/TargetRunner.swift +++ b/Sources/TuistAutomation/Utilities/TargetRunner.swift @@ -1,8 +1,8 @@ import TSCBasic import struct TSCUtility.Version import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph public protocol TargetRunning { /// Runs a provided target. @@ -18,7 +18,7 @@ public protocol TargetRunning { /// - arguments: Arguments to forward to the runnable target when running. func runTarget( _ target: GraphTarget, - platform: TuistGraph.Platform, + platform: XcodeGraph.Platform, workspacePath: AbsolutePath, schemeName: String, configuration: String?, @@ -76,7 +76,7 @@ public final class TargetRunner: TargetRunning { public func runTarget( _ target: GraphTarget, - platform: TuistGraph.Platform, + platform: XcodeGraph.Platform, workspacePath: AbsolutePath, schemeName: String, configuration: String?, diff --git a/Sources/TuistAutomation/Utilities/XcodeBuildDestination+Find.swift b/Sources/TuistAutomation/Utilities/XcodeBuildDestination+Find.swift index fa5b4d87c70..376959ee92c 100644 --- a/Sources/TuistAutomation/Utilities/XcodeBuildDestination+Find.swift +++ b/Sources/TuistAutomation/Utilities/XcodeBuildDestination+Find.swift @@ -1,8 +1,8 @@ import TSCBasic import TSCUtility import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph extension XcodeBuildDestination { /// Finds the `XcodeBuildDestination` that matches the arguments provided @@ -16,7 +16,7 @@ extension XcodeBuildDestination { /// - Returns: The `XcodeBuildDestination` that is compatible with the given arguments. public static func find( for target: Target, - on platform: TuistGraph.Platform, + on platform: XcodeGraph.Platform, scheme: Scheme, version: Version?, deviceName: String?, diff --git a/Sources/TuistAutomationTesting/Utilities/MockBuildGraphInspector.swift b/Sources/TuistAutomationTesting/Utilities/MockBuildGraphInspector.swift index 1d27448b70f..e6ea4c42bf1 100644 --- a/Sources/TuistAutomationTesting/Utilities/MockBuildGraphInspector.swift +++ b/Sources/TuistAutomationTesting/Utilities/MockBuildGraphInspector.swift @@ -2,7 +2,7 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph +import XcodeGraph @testable import TuistAutomation diff --git a/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift b/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift index 1cc01ebac24..1a9f4962b1c 100644 --- a/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift +++ b/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift @@ -2,7 +2,7 @@ import TSCBasic import TSCUtility import TuistAutomation import TuistCore -import TuistGraph +import XcodeGraph public final class MockTargetBuilder: TargetBuilding { public init() {} @@ -24,7 +24,7 @@ public final class MockTargetBuilder: TargetBuilding { public func buildTarget( _ target: GraphTarget, - platform _: TuistGraph.Platform, + platform _: XcodeGraph.Platform, workspacePath: AbsolutePath, scheme: Scheme, clean: Bool, diff --git a/Sources/TuistAutomationTesting/Utilities/MockTargetRunner.swift b/Sources/TuistAutomationTesting/Utilities/MockTargetRunner.swift index 641e8546d16..1c71ae478a3 100644 --- a/Sources/TuistAutomationTesting/Utilities/MockTargetRunner.swift +++ b/Sources/TuistAutomationTesting/Utilities/MockTargetRunner.swift @@ -1,7 +1,7 @@ import TSCBasic import struct TSCUtility.Version import TuistAutomation -import TuistGraph +import XcodeGraph public final class MockTargetRunner: TargetRunning { public init() {} @@ -12,7 +12,7 @@ public final class MockTargetRunner: TargetRunning { )? public func runTarget( _ target: GraphTarget, - platform _: TuistGraph.Platform, + platform _: XcodeGraph.Platform, workspacePath: AbsolutePath, schemeName: String, configuration: String?, diff --git a/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift b/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift index 18deb06a157..40451b204f2 100644 --- a/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift +++ b/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift @@ -1,8 +1,8 @@ import Foundation import Mockable import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph @Mockable public protocol CacheDirectoriesProviding { diff --git a/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift b/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift index 456834a2e7a..384b55ea8af 100644 --- a/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift +++ b/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift @@ -1,7 +1,7 @@ import Foundation import Mockable -import TuistGraph import TuistSupport +import XcodeGraph @Mockable public protocol CacheDirectoriesProviderFactoring { diff --git a/Sources/TuistCore/Graph/CircularDependencyLinter.swift b/Sources/TuistCore/Graph/CircularDependencyLinter.swift index fa77bec65c5..fb6e564c727 100644 --- a/Sources/TuistCore/Graph/CircularDependencyLinter.swift +++ b/Sources/TuistCore/Graph/CircularDependencyLinter.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph // MARK: - CircularDependencyLinting diff --git a/Sources/TuistCore/Graph/ConditionCache.swift b/Sources/TuistCore/Graph/ConditionCache.swift index 5a7e0d8b81d..406a35fa76b 100644 --- a/Sources/TuistCore/Graph/ConditionCache.swift +++ b/Sources/TuistCore/Graph/ConditionCache.swift @@ -1,6 +1,6 @@ import Foundation -import TuistGraph import TuistSupport +import XcodeGraph /// Cache designed to store `PlatformCondition.CombinationResult` for `GraphTraverser` final class ConditionCache { diff --git a/Sources/TuistCore/Graph/GraphDependencyReference.swift b/Sources/TuistCore/Graph/GraphDependencyReference.swift index 091dc130589..6a6f6885fb3 100644 --- a/Sources/TuistCore/Graph/GraphDependencyReference.swift +++ b/Sources/TuistCore/Graph/GraphDependencyReference.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph public enum GraphDependencyReference: Equatable, Comparable, Hashable { var condition: PlatformCondition? { diff --git a/Sources/TuistCore/Graph/GraphLoader.swift b/Sources/TuistCore/Graph/GraphLoader.swift index 168752cba97..4a53b647f6b 100644 --- a/Sources/TuistCore/Graph/GraphLoader.swift +++ b/Sources/TuistCore/Graph/GraphLoader.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph // MARK: - GraphLoading diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index 9fac7d7d298..9bb7802afe6 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph // swiftlint:disable type_body_length public class GraphTraverser: GraphTraversing { diff --git a/Sources/TuistCore/Graph/Mappers/GraphMapper.swift b/Sources/TuistCore/Graph/Mappers/GraphMapper.swift index 91a287b1d62..c46b5cbe27b 100644 --- a/Sources/TuistCore/Graph/Mappers/GraphMapper.swift +++ b/Sources/TuistCore/Graph/Mappers/GraphMapper.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph /// A protocol that defines an interface to map dependency graphs. public protocol GraphMapping { diff --git a/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift b/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift index d42433db8ac..dcb624d957b 100644 --- a/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift +++ b/Sources/TuistCore/Graph/Mappers/ProjectMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TuistGraph +import XcodeGraph public protocol ProjectMapping { func map(project: Project) throws -> (Project, [SideEffectDescriptor]) diff --git a/Sources/TuistCore/Graph/Mappers/TargetMapper.swift b/Sources/TuistCore/Graph/Mappers/TargetMapper.swift index 5a11d497fb7..6cd70e82c17 100644 --- a/Sources/TuistCore/Graph/Mappers/TargetMapper.swift +++ b/Sources/TuistCore/Graph/Mappers/TargetMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TuistGraph +import XcodeGraph public protocol TargetMapping { func map(target: Target) throws -> (Target, [SideEffectDescriptor]) diff --git a/Sources/TuistCore/Graph/Mappers/WorkspaceMapper.swift b/Sources/TuistCore/Graph/Mappers/WorkspaceMapper.swift index b4d1bee0cb6..75c6f54a1cf 100644 --- a/Sources/TuistCore/Graph/Mappers/WorkspaceMapper.swift +++ b/Sources/TuistCore/Graph/Mappers/WorkspaceMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TuistGraph +import XcodeGraph public struct WorkspaceWithProjects: Equatable { public var workspace: Workspace diff --git a/Sources/TuistCore/Graph/ModelExtensions/BuildConfiguration+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/BuildConfiguration+Core.swift index d759ab3fdeb..842d9e55792 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/BuildConfiguration+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/BuildConfiguration+Core.swift @@ -1,6 +1,6 @@ import Foundation -import TuistGraph import TuistSupport +import XcodeGraph extension BuildConfiguration: XcodeRepresentable { public var xcodeValue: String { name } diff --git a/Sources/TuistCore/Graph/ModelExtensions/Headers+core.swift b/Sources/TuistCore/Graph/ModelExtensions/Headers+core.swift index efee4d1ce6e..c40307eab84 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/Headers+core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/Headers+core.swift @@ -1,5 +1,5 @@ import Foundation -import TuistGraph +import XcodeGraph import XcodeProj extension Headers { diff --git a/Sources/TuistCore/Graph/ModelExtensions/Product+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/Product+Core.swift index 40773e88548..e36d9623bfd 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/Product+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/Product+Core.swift @@ -1,5 +1,5 @@ import Foundation -import TuistGraph +import XcodeGraph import XcodeProj extension Product { diff --git a/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift index 1e4fb68f872..f985f68409b 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph extension Project { /// It returns the project targets sorted based on the target type and the dependencies between them. diff --git a/Sources/TuistCore/Graph/ModelExtensions/Requirement+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/Requirement+Core.swift index d0ef20b884e..7d924a921a5 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/Requirement+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/Requirement+Core.swift @@ -1,5 +1,5 @@ import Foundation -import TuistGraph +import XcodeGraph import XcodeProj extension Requirement { diff --git a/Sources/TuistCore/Graph/ModelExtensions/Scheme+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/Scheme+Core.swift index ba58c98cd7b..7977b11c07b 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/Scheme+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/Scheme+Core.swift @@ -1,5 +1,5 @@ import Foundation -import TuistGraph +import XcodeGraph extension Scheme { public func targetDependencies() -> [TargetReference] { diff --git a/Sources/TuistCore/Graph/ModelExtensions/Target+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/Target+Core.swift index 99d5f54b2d3..6cb1b85776d 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/Target+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/Target+Core.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph public enum TargetError: FatalError, Equatable { case invalidSourcesGlob(targetName: String, invalidGlobs: [InvalidGlob]) @@ -75,8 +75,8 @@ extension Target { /// This method unfolds the source file globs subtracting the paths that are excluded and ignoring /// the files that don't have a supported source extension. /// - Parameter sources: List of source file glob to be unfolded. - public static func sources(targetName: String, sources: [SourceFileGlob]) throws -> [TuistGraph.SourceFile] { - var sourceFiles: [AbsolutePath: TuistGraph.SourceFile] = [:] + public static func sources(targetName: String, sources: [SourceFileGlob]) throws -> [XcodeGraph.SourceFile] { + var sourceFiles: [AbsolutePath: XcodeGraph.SourceFile] = [:] var invalidGlobs: [InvalidGlob] = [] for source in sources { diff --git a/Sources/TuistCore/Graph/ModelExtensions/TargetScript+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/TargetScript+Core.swift index d5e5d7522a4..08db67134d8 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/TargetScript+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/TargetScript+Core.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph extension TargetScript { /// Returns the shell script that should be used in the target build phase. diff --git a/Sources/TuistCore/GraphTraverser/GraphTraverser+Extra.swift b/Sources/TuistCore/GraphTraverser/GraphTraverser+Extra.swift index 9c4d07e4231..3fc907f30d8 100644 --- a/Sources/TuistCore/GraphTraverser/GraphTraverser+Extra.swift +++ b/Sources/TuistCore/GraphTraverser/GraphTraverser+Extra.swift @@ -1,5 +1,5 @@ import Foundation -import TuistGraph +import XcodeGraph extension GraphTraversing { /// Returns the included based on the parameters. diff --git a/Sources/TuistCore/GraphTraverser/GraphTraversing.swift b/Sources/TuistCore/GraphTraverser/GraphTraversing.swift index 78ab89b3f3f..a7e1acd49d5 100644 --- a/Sources/TuistCore/GraphTraverser/GraphTraversing.swift +++ b/Sources/TuistCore/GraphTraverser/GraphTraversing.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph public protocol GraphTraversing { /// Graph name diff --git a/Sources/TuistCore/MetadataProviders/FrameworkMetadataProvider.swift b/Sources/TuistCore/MetadataProviders/FrameworkMetadataProvider.swift index 8408a113e13..eebc00de738 100644 --- a/Sources/TuistCore/MetadataProviders/FrameworkMetadataProvider.swift +++ b/Sources/TuistCore/MetadataProviders/FrameworkMetadataProvider.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph // MARK: - Provider Errors diff --git a/Sources/TuistCore/MetadataProviders/LibraryMetadataProvider.swift b/Sources/TuistCore/MetadataProviders/LibraryMetadataProvider.swift index b5135812496..ce964081f11 100644 --- a/Sources/TuistCore/MetadataProviders/LibraryMetadataProvider.swift +++ b/Sources/TuistCore/MetadataProviders/LibraryMetadataProvider.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph // MARK: - Provider Errors diff --git a/Sources/TuistCore/MetadataProviders/PrecompiledMetadataProvider.swift b/Sources/TuistCore/MetadataProviders/PrecompiledMetadataProvider.swift index 6782691c2d8..f3d2bfc97a4 100644 --- a/Sources/TuistCore/MetadataProviders/PrecompiledMetadataProvider.swift +++ b/Sources/TuistCore/MetadataProviders/PrecompiledMetadataProvider.swift @@ -1,8 +1,8 @@ import Foundation import MachO import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph enum PrecompiledMetadataProviderError: FatalError, Equatable { case architecturesNotFound(AbsolutePath) diff --git a/Sources/TuistCore/MetadataProviders/SystemFrameworksMetadataProvider.swift b/Sources/TuistCore/MetadataProviders/SystemFrameworksMetadataProvider.swift index 0c1de8883fe..a72fa2b4419 100644 --- a/Sources/TuistCore/MetadataProviders/SystemFrameworksMetadataProvider.swift +++ b/Sources/TuistCore/MetadataProviders/SystemFrameworksMetadataProvider.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph // MARK: - Provider Errors diff --git a/Sources/TuistCore/MetadataProviders/XCFrameworkMetadataProvider.swift b/Sources/TuistCore/MetadataProviders/XCFrameworkMetadataProvider.swift index 7543583c620..c26c18c63a8 100644 --- a/Sources/TuistCore/MetadataProviders/XCFrameworkMetadataProvider.swift +++ b/Sources/TuistCore/MetadataProviders/XCFrameworkMetadataProvider.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph // MARK: - Provider Errors diff --git a/Sources/TuistCore/NodeLoaders/FrameworkLoader.swift b/Sources/TuistCore/NodeLoaders/FrameworkLoader.swift index 9ec47970291..eb479dd5689 100644 --- a/Sources/TuistCore/NodeLoaders/FrameworkLoader.swift +++ b/Sources/TuistCore/NodeLoaders/FrameworkLoader.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph enum FrameworkLoaderError: FatalError, Equatable { case frameworkNotFound(AbsolutePath) diff --git a/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift b/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift index 8b293b4772b..8865a4e28bd 100644 --- a/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift +++ b/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph enum XCFrameworkLoaderError: FatalError, Equatable { case xcframeworkNotFound(AbsolutePath) diff --git a/Sources/TuistCore/Simulator/SimulatorController.swift b/Sources/TuistCore/Simulator/SimulatorController.swift index 9abdce49ac9..c109e1a91f4 100644 --- a/Sources/TuistCore/Simulator/SimulatorController.swift +++ b/Sources/TuistCore/Simulator/SimulatorController.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import struct TSCUtility.Version -import TuistGraph import TuistSupport +import XcodeGraph public protocol SimulatorControlling { /// Finds first available device defined by given parameters diff --git a/Sources/TuistCore/Utils/XcodeProjectBuildDirectoryLocator.swift b/Sources/TuistCore/Utils/XcodeProjectBuildDirectoryLocator.swift index 82cc0947f3b..683838ff796 100644 --- a/Sources/TuistCore/Utils/XcodeProjectBuildDirectoryLocator.swift +++ b/Sources/TuistCore/Utils/XcodeProjectBuildDirectoryLocator.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph public protocol XcodeProjectBuildDirectoryLocating { /// Locates the build output directory for `xcodebuild` command. diff --git a/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift b/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift index b4a869a7690..bd200129508 100644 --- a/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift +++ b/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift @@ -1,9 +1,9 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting extension GraphDependencyReference { public static func testFramework( diff --git a/Sources/TuistCoreTesting/Graph/MockGraphLoader.swift b/Sources/TuistCoreTesting/Graph/MockGraphLoader.swift index 5a46f4520a9..def47363f25 100644 --- a/Sources/TuistCoreTesting/Graph/MockGraphLoader.swift +++ b/Sources/TuistCoreTesting/Graph/MockGraphLoader.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph -@testable import TuistGraphTesting +import XcodeGraph +@testable import XcodeGraphTesting public final class MockGraphLoader: GraphLoading { public init() {} diff --git a/Sources/TuistCoreTesting/Graph/WorkspaceWithProjects+TestData.swift b/Sources/TuistCoreTesting/Graph/WorkspaceWithProjects+TestData.swift index 0ba99859edb..8639a3f00fe 100644 --- a/Sources/TuistCoreTesting/Graph/WorkspaceWithProjects+TestData.swift +++ b/Sources/TuistCoreTesting/Graph/WorkspaceWithProjects+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting @testable import TuistCore extension WorkspaceWithProjects { diff --git a/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift b/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift index 5d33013e964..9f5164d67f6 100644 --- a/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift +++ b/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph @testable import TuistCore // swiftlint:disable:next type_body_length @@ -68,7 +68,7 @@ final class MockGraphTraverser: GraphTraversing { var invokedTargets = false var invokedTargetsCount = 0 var stubbedTargets: [AbsolutePath: [String: Target]]! = [:] - func targets() -> [TSCBasic.AbsolutePath: [String: TuistGraph.Target]] { + func targets() -> [TSCBasic.AbsolutePath: [String: XcodeGraph.Target]] { invokedTargets = true invokedTargetsCount += 1 return stubbedTargets @@ -240,8 +240,8 @@ final class MockGraphTraverser: GraphTraversing { path: AbsolutePath, name: String )? - var invokedAllTargetDependenciesResult: Set = [] - func allTargetDependencies(path: TSCBasic.AbsolutePath, name: String) -> Set { + var invokedAllTargetDependenciesResult: Set = [] + func allTargetDependencies(path: TSCBasic.AbsolutePath, name: String) -> Set { invokedAllTargetDependencies = true invokedAllTargetDependenciesCount += 1 invokedAllTargetDependenciesParameters = (path, name) @@ -583,8 +583,8 @@ final class MockGraphTraverser: GraphTraversing { var stubbedExtensionKitExtensionDependenciesWithConditionsResult: [(GraphTarget, PlatformCondition?)]! = [] func extensionKitExtensionDependenciesWithConditions(path: TSCBasic.AbsolutePath, name: String) -> [( - TuistGraph.GraphTarget, - TuistGraph.PlatformCondition? + XcodeGraph.GraphTarget, + XcodeGraph.PlatformCondition? )] { invokedExtensionKitExtensionDependenciesWithConditions = true invokedExtensionKitExtensionDependenciesWithConditionsCount += 1 @@ -628,7 +628,7 @@ final class MockGraphTraverser: GraphTraversing { var invokedAllSwiftMacroTargetsParametersList = [(path: AbsolutePath, name: String)]() var stubbedAllSwiftMacroTargetsResult: Set! = [] - func allSwiftMacroTargets(path: TSCBasic.AbsolutePath, name: String) -> Set { + func allSwiftMacroTargets(path: TSCBasic.AbsolutePath, name: String) -> Set { invokedAllSwiftMacroTargets = true invokedAllSwiftMacroTargetsCount += 1 invokedAllSwiftMacroTargetsParameters = (path, name) diff --git a/Sources/TuistCoreTesting/Mappers/MockProjectMapper.swift b/Sources/TuistCoreTesting/Mappers/MockProjectMapper.swift index f93b05c8190..f34d1a92194 100644 --- a/Sources/TuistCoreTesting/Mappers/MockProjectMapper.swift +++ b/Sources/TuistCoreTesting/Mappers/MockProjectMapper.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph @testable import TuistCore final class MockProjectMapper: ProjectMapping { diff --git a/Sources/TuistCoreTesting/Mappers/MockWorkspaceMapper.swift b/Sources/TuistCoreTesting/Mappers/MockWorkspaceMapper.swift index f41261b9d80..3f45a3a7a7b 100644 --- a/Sources/TuistCoreTesting/Mappers/MockWorkspaceMapper.swift +++ b/Sources/TuistCoreTesting/Mappers/MockWorkspaceMapper.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph @testable import TuistCore public final class MockWorkspaceMapper: WorkspaceMapping { diff --git a/Sources/TuistCoreTesting/MetadataProviders/MockFrameworkMetadataProvider.swift b/Sources/TuistCoreTesting/MetadataProviders/MockFrameworkMetadataProvider.swift index e2f759963a5..98e4166dc37 100644 --- a/Sources/TuistCoreTesting/MetadataProviders/MockFrameworkMetadataProvider.swift +++ b/Sources/TuistCoreTesting/MetadataProviders/MockFrameworkMetadataProvider.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph @testable import TuistCore public final class MockFrameworkMetadataProvider: MockPrecompiledMetadataProvider, FrameworkMetadataProviding { diff --git a/Sources/TuistCoreTesting/MetadataProviders/MockLibraryMetadataProvider.swift b/Sources/TuistCoreTesting/MetadataProviders/MockLibraryMetadataProvider.swift index c44647ff95e..306cc39d0c0 100644 --- a/Sources/TuistCoreTesting/MetadataProviders/MockLibraryMetadataProvider.swift +++ b/Sources/TuistCoreTesting/MetadataProviders/MockLibraryMetadataProvider.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph @testable import TuistCore public final class MockLibraryMetadataProvider: MockPrecompiledMetadataProvider, LibraryMetadataProviding { diff --git a/Sources/TuistCoreTesting/MetadataProviders/MockPrecompiledMetadataProvider.swift b/Sources/TuistCoreTesting/MetadataProviders/MockPrecompiledMetadataProvider.swift index 9a4ff304ad4..040b2fdeb3f 100644 --- a/Sources/TuistCoreTesting/MetadataProviders/MockPrecompiledMetadataProvider.swift +++ b/Sources/TuistCoreTesting/MetadataProviders/MockPrecompiledMetadataProvider.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph @testable import TuistCore public class MockPrecompiledMetadataProvider: PrecompiledMetadataProviding { diff --git a/Sources/TuistCoreTesting/MetadataProviders/MockXCFrameworkMetadataProvider.swift b/Sources/TuistCoreTesting/MetadataProviders/MockXCFrameworkMetadataProvider.swift index fe7e944f7e6..f02fea09ead 100644 --- a/Sources/TuistCoreTesting/MetadataProviders/MockXCFrameworkMetadataProvider.swift +++ b/Sources/TuistCoreTesting/MetadataProviders/MockXCFrameworkMetadataProvider.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph @testable import TuistCore public final class MockXCFrameworkMetadataProvider: MockPrecompiledMetadataProvider, XCFrameworkMetadataProviding { diff --git a/Sources/TuistCoreTesting/NodeLoaders/MockFrameworkNodeLoader.swift b/Sources/TuistCoreTesting/NodeLoaders/MockFrameworkNodeLoader.swift index 4c41b47c387..0dc8667c3d5 100644 --- a/Sources/TuistCoreTesting/NodeLoaders/MockFrameworkNodeLoader.swift +++ b/Sources/TuistCoreTesting/NodeLoaders/MockFrameworkNodeLoader.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph public final class MockFrameworkLoader: FrameworkLoading { public init() {} diff --git a/Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift b/Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift index 34352b42408..e31e6e2542f 100644 --- a/Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift +++ b/Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph public final class MockXCFrameworkLoader: XCFrameworkLoading { public init() {} diff --git a/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift b/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift index f45482af8cc..37938b0973f 100644 --- a/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift +++ b/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import struct TSCUtility.Version -import TuistGraph import TuistSupport +import XcodeGraph @testable import TuistCore @testable import TuistSupportTesting @@ -11,7 +11,7 @@ public final class MockSimulatorController: SimulatorControlling { public var findAvailableDevicesStub: ((Platform, Version?, Version?, String?) -> [SimulatorDeviceAndRuntime])? public func findAvailableDevices( - platform: TuistGraph.Platform, + platform: XcodeGraph.Platform, version: TSCUtility.Version?, minVersion: TSCUtility.Version?, deviceName: String? @@ -21,7 +21,7 @@ public final class MockSimulatorController: SimulatorControlling { public var askForAvailableDeviceStub: ((Platform, Version?, Version?, String?) -> SimulatorDeviceAndRuntime)? public func askForAvailableDevice( - platform: TuistGraph.Platform, + platform: XcodeGraph.Platform, version: TSCUtility.Version?, minVersion: TSCUtility.Version?, deviceName: String? diff --git a/Sources/TuistCoreTesting/Utils/MockXcodeProjectBuildDirectoryLocator.swift b/Sources/TuistCoreTesting/Utils/MockXcodeProjectBuildDirectoryLocator.swift index 186e1a2ea19..e2c340d7d81 100644 --- a/Sources/TuistCoreTesting/Utils/MockXcodeProjectBuildDirectoryLocator.swift +++ b/Sources/TuistCoreTesting/Utils/MockXcodeProjectBuildDirectoryLocator.swift @@ -1,6 +1,6 @@ import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph public final class MockXcodeProjectBuildDirectoryLocator: XcodeProjectBuildDirectoryLocating { public init() {} diff --git a/Sources/TuistDependencies/Mappers/ExternalDependencyPathWorkspaceMapper.swift b/Sources/TuistDependencies/Mappers/ExternalDependencyPathWorkspaceMapper.swift index b5fc4a34e53..fcf5fd9a6c8 100644 --- a/Sources/TuistDependencies/Mappers/ExternalDependencyPathWorkspaceMapper.swift +++ b/Sources/TuistDependencies/Mappers/ExternalDependencyPathWorkspaceMapper.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph public final class ExternalDependencyPathWorkspaceMapper: WorkspaceMapping { public init() {} diff --git a/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift b/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift index 05a707b2a30..3aed630baf3 100644 --- a/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift +++ b/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift @@ -1,6 +1,6 @@ import Foundation import TuistCore -import TuistGraph +import XcodeGraph /** When Swift Packages don't declare the platforms that they support, the Swift Package Manager defaults the value diff --git a/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift b/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift index c965d48d155..ae96ac0014a 100644 --- a/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift +++ b/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift @@ -1,6 +1,6 @@ import Foundation import TuistCore -import TuistGraph +import XcodeGraph /** External dependencies might contain targets that are only relevant in development, but that @@ -10,7 +10,7 @@ import TuistGraph public struct PruneOrphanExternalTargetsGraphMapper: GraphMapping { public init() {} - public func map(graph: TuistGraph.Graph) async throws -> (TuistGraph.Graph, [TuistCore.SideEffectDescriptor]) { + public func map(graph: XcodeGraph.Graph) async throws -> (XcodeGraph.Graph, [TuistCore.SideEffectDescriptor]) { logger.debug("Transforming graph \(graph.name): Tree-shaking orphan external targets (e.g. test targets)") let graphTraverser = GraphTraverser(graph: graph) diff --git a/Sources/TuistGenerator/Extensions/CopyFilesAction+Extras.swift b/Sources/TuistGenerator/Extensions/CopyFilesAction+Extras.swift index 3a65175c20a..ff9998ea6ac 100644 --- a/Sources/TuistGenerator/Extensions/CopyFilesAction+Extras.swift +++ b/Sources/TuistGenerator/Extensions/CopyFilesAction+Extras.swift @@ -1,5 +1,5 @@ import TuistCore -import TuistGraph +import XcodeGraph import XcodeProj extension CopyFilesAction.Destination { diff --git a/Sources/TuistGenerator/Extensions/Graph+Extras.swift b/Sources/TuistGenerator/Extensions/Graph+Extras.swift index d120d724985..5589e101b87 100644 --- a/Sources/TuistGenerator/Extensions/Graph+Extras.swift +++ b/Sources/TuistGenerator/Extensions/Graph+Extras.swift @@ -1,9 +1,9 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.Graph { +extension XcodeGraph.Graph { /// Filters the project graph /// - Parameters: /// - Returns: Filtered graph targets and dependencies @@ -59,7 +59,7 @@ extension TuistGraph.Graph { } extension GraphDependency { - fileprivate func isExternal(_ projects: [AbsolutePath: TuistGraph.Project]) -> Bool { + fileprivate func isExternal(_ projects: [AbsolutePath: XcodeGraph.Project]) -> Bool { switch self { case let .target(_, path): return projects[path]?.isExternal ?? false diff --git a/Sources/TuistGenerator/Extensions/Xcodeproj+Extras.swift b/Sources/TuistGenerator/Extensions/Xcodeproj+Extras.swift index 67be89721f8..38448d9e812 100644 --- a/Sources/TuistGenerator/Extensions/Xcodeproj+Extras.swift +++ b/Sources/TuistGenerator/Extensions/Xcodeproj+Extras.swift @@ -1,5 +1,5 @@ import Foundation -import TuistGraph +import XcodeGraph import XcodeProj extension PBXFileElement { diff --git a/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift b/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift index 9a0bb296dec..9d136f3f9f9 100644 --- a/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift +++ b/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XcodeProj enum BuildPhaseGenerationError: FatalError, Equatable { diff --git a/Sources/TuistGenerator/Generator/BuildRulesGenerator.swift b/Sources/TuistGenerator/Generator/BuildRulesGenerator.swift index 6fb40f61fbb..1792a0430ff 100644 --- a/Sources/TuistGenerator/Generator/BuildRulesGenerator.swift +++ b/Sources/TuistGenerator/Generator/BuildRulesGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TuistGraph +import XcodeGraph import XcodeProj protocol BuildRulesGenerating: AnyObject { diff --git a/Sources/TuistGenerator/Generator/ConfigGenerator.swift b/Sources/TuistGenerator/Generator/ConfigGenerator.swift index 58a8bb431c3..835bb9f66da 100644 --- a/Sources/TuistGenerator/Generator/ConfigGenerator.swift +++ b/Sources/TuistGenerator/Generator/ConfigGenerator.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XcodeProj protocol ConfigGenerating: AnyObject { diff --git a/Sources/TuistGenerator/Generator/DescriptorGenerator.swift b/Sources/TuistGenerator/Generator/DescriptorGenerator.swift index ae5d873f6ed..c32d88eb630 100644 --- a/Sources/TuistGenerator/Generator/DescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/DescriptorGenerator.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph /// Descriptor Generator /// diff --git a/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift b/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift index 8ddd7377116..795ecf933a7 100644 --- a/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift +++ b/Sources/TuistGenerator/Generator/InfoPlistContentProvider.swift @@ -1,6 +1,6 @@ import Foundation import TuistCore -import TuistGraph +import XcodeGraph /// Defines the interface to obtain the content to generate derived Info.plist files for the targets. protocol InfoPlistContentProviding { diff --git a/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift b/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift index c7f953d0b85..4ba7b00ebb4 100644 --- a/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift +++ b/Sources/TuistGenerator/Generator/KnownAssetTagsFetcher.swift @@ -1,6 +1,6 @@ import Foundation import PathKit -import TuistGraph +import XcodeGraph private struct ContentJson: Decodable { struct ContentProperties: Decodable { diff --git a/Sources/TuistGenerator/Generator/LinkGenerator.swift b/Sources/TuistGenerator/Generator/LinkGenerator.swift index 807103ffa14..64bc67807fd 100644 --- a/Sources/TuistGenerator/Generator/LinkGenerator.swift +++ b/Sources/TuistGenerator/Generator/LinkGenerator.swift @@ -2,8 +2,8 @@ import Foundation import PathKit import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XcodeProj enum LinkGeneratorError: FatalError, Equatable { diff --git a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift index fe96f66624a..59b8d1a8dee 100644 --- a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XcodeProj protocol ProjectDescriptorGenerating: AnyObject { diff --git a/Sources/TuistGenerator/Generator/ProjectFileElements.swift b/Sources/TuistGenerator/Generator/ProjectFileElements.swift index 4d3818ee32b..2f297181e91 100644 --- a/Sources/TuistGenerator/Generator/ProjectFileElements.swift +++ b/Sources/TuistGenerator/Generator/ProjectFileElements.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XcodeProj public struct GroupFileElement: Hashable { diff --git a/Sources/TuistGenerator/Generator/ProjectGroups.swift b/Sources/TuistGenerator/Generator/ProjectGroups.swift index d6d8792207a..248165db317 100644 --- a/Sources/TuistGenerator/Generator/ProjectGroups.swift +++ b/Sources/TuistGenerator/Generator/ProjectGroups.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XcodeProj enum ProjectGroupsError: FatalError, Equatable { diff --git a/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift b/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift index 3a8ceac254e..9a9dfff22c7 100644 --- a/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift +++ b/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift @@ -2,8 +2,8 @@ import Foundation import TSCBasic import TSCUtility import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XcodeProj /// Protocol that defines the interface of the schemes generation. diff --git a/Sources/TuistGenerator/Generator/TargetGenerator.swift b/Sources/TuistGenerator/Generator/TargetGenerator.swift index 3edcce488fb..e5c004feab0 100644 --- a/Sources/TuistGenerator/Generator/TargetGenerator.swift +++ b/Sources/TuistGenerator/Generator/TargetGenerator.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XcodeProj protocol TargetGenerating: AnyObject { diff --git a/Sources/TuistGenerator/Generator/WorkspaceSettingsDescriptorGenerator.swift b/Sources/TuistGenerator/Generator/WorkspaceSettingsDescriptorGenerator.swift index c61f6b57066..21c2040ec3e 100644 --- a/Sources/TuistGenerator/Generator/WorkspaceSettingsDescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/WorkspaceSettingsDescriptorGenerator.swift @@ -1,7 +1,7 @@ import Foundation import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XcodeProj /// Protocol that defines the interface of the workspace settings generation. diff --git a/Sources/TuistGenerator/Generator/WorkspaceStructureGenerator.swift b/Sources/TuistGenerator/Generator/WorkspaceStructureGenerator.swift index c13e6c4a940..cbc5edf2737 100644 --- a/Sources/TuistGenerator/Generator/WorkspaceStructureGenerator.swift +++ b/Sources/TuistGenerator/Generator/WorkspaceStructureGenerator.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph struct WorkspaceStructure { enum Element: Equatable { diff --git a/Sources/TuistGenerator/GraphViz/GraphToGraphVizMapper.swift b/Sources/TuistGenerator/GraphViz/GraphToGraphVizMapper.swift index 3b2dd5a68e9..1b655ab6499 100644 --- a/Sources/TuistGenerator/GraphViz/GraphToGraphVizMapper.swift +++ b/Sources/TuistGenerator/GraphViz/GraphToGraphVizMapper.swift @@ -1,8 +1,8 @@ import Foundation import GraphViz import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph /// Interface that describes a mapper that converts a project graph into a GraphViz graph. public protocol GraphToGraphVizMapping { @@ -13,7 +13,7 @@ public protocol GraphToGraphVizMapping { /// - targetsAndDependencies: Targets to be converted into a GraphViz.Graph. /// - Returns: The GraphViz.Graph representation. func map( - graph: TuistGraph.Graph, + graph: XcodeGraph.Graph, targetsAndDependencies: [GraphTarget: Set] ) -> GraphViz.Graph } @@ -28,7 +28,7 @@ public final class GraphToGraphVizMapper: GraphToGraphVizMapping { /// - targetsAndDependencies: Targets to be converted into a GraphViz.Graph. /// - Returns: The GraphViz.Graph representation public func map( - graph: TuistGraph.Graph, + graph: XcodeGraph.Graph, targetsAndDependencies: [GraphTarget: Set] ) -> GraphViz.Graph { var nodes: [GraphViz.Node] = [] diff --git a/Sources/TuistGenerator/GraphViz/NodeStyling.swift b/Sources/TuistGenerator/GraphViz/NodeStyling.swift index a26ad4f2edc..6b25c8266be 100644 --- a/Sources/TuistGenerator/GraphViz/NodeStyling.swift +++ b/Sources/TuistGenerator/GraphViz/NodeStyling.swift @@ -1,7 +1,7 @@ import Foundation import GraphViz import TuistCore -import TuistGraph +import XcodeGraph extension GraphViz.Node { mutating func applyAttributes(attributes: NodeStyleAttributes?) { diff --git a/Sources/TuistGenerator/Linter/EnvironmentLinter.swift b/Sources/TuistGenerator/Linter/EnvironmentLinter.swift index c8ed1fca05a..a0ebbfb565e 100644 --- a/Sources/TuistGenerator/Linter/EnvironmentLinter.swift +++ b/Sources/TuistGenerator/Linter/EnvironmentLinter.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph public protocol EnvironmentLinting { /// Lints a given Tuist configuration. diff --git a/Sources/TuistGenerator/Linter/GraphLinter.swift b/Sources/TuistGenerator/Linter/GraphLinter.swift index b7da73c6d21..69185f780d1 100644 --- a/Sources/TuistGenerator/Linter/GraphLinter.swift +++ b/Sources/TuistGenerator/Linter/GraphLinter.swift @@ -1,8 +1,8 @@ import Foundation import struct TSCUtility.Version import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph public protocol GraphLinting: AnyObject { func lint(graphTraverser: GraphTraversing, config: Config) -> [LintingIssue] @@ -370,7 +370,7 @@ public class GraphLinter: GraphLinting { } struct LintableTarget: Equatable, Hashable { - let platform: TuistGraph.Platform + let platform: XcodeGraph.Platform let product: Product } diff --git a/Sources/TuistGenerator/Linter/PackageLinter.swift b/Sources/TuistGenerator/Linter/PackageLinter.swift index 81c2ab06409..52eea27d598 100644 --- a/Sources/TuistGenerator/Linter/PackageLinter.swift +++ b/Sources/TuistGenerator/Linter/PackageLinter.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph protocol PackageLinting: AnyObject { func lint(_ package: Package) -> [LintingIssue] diff --git a/Sources/TuistGenerator/Linter/ProjectLinter.swift b/Sources/TuistGenerator/Linter/ProjectLinter.swift index ab061abe2b7..25f65da75f1 100644 --- a/Sources/TuistGenerator/Linter/ProjectLinter.swift +++ b/Sources/TuistGenerator/Linter/ProjectLinter.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph protocol ProjectLinting: AnyObject { func lint(_ project: Project) -> [LintingIssue] diff --git a/Sources/TuistGenerator/Linter/SchemeLinter.swift b/Sources/TuistGenerator/Linter/SchemeLinter.swift index 8d7b8e5200e..a5290dcc91e 100644 --- a/Sources/TuistGenerator/Linter/SchemeLinter.swift +++ b/Sources/TuistGenerator/Linter/SchemeLinter.swift @@ -1,7 +1,7 @@ import Foundation import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph protocol SchemeLinting { func lint(project: Project) -> [LintingIssue] diff --git a/Sources/TuistGenerator/Linter/SettingsLinter.swift b/Sources/TuistGenerator/Linter/SettingsLinter.swift index 2f1bb234094..b06cb476fc8 100644 --- a/Sources/TuistGenerator/Linter/SettingsLinter.swift +++ b/Sources/TuistGenerator/Linter/SettingsLinter.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph protocol SettingsLinting: AnyObject { func lint(project: Project) -> [LintingIssue] diff --git a/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift b/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift index 278e12c0257..479e9c2c11f 100644 --- a/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift +++ b/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph /// Static Products Graph Linter /// diff --git a/Sources/TuistGenerator/Linter/TargetLinter.swift b/Sources/TuistGenerator/Linter/TargetLinter.swift index b85afaeaf36..028f23b9c50 100644 --- a/Sources/TuistGenerator/Linter/TargetLinter.swift +++ b/Sources/TuistGenerator/Linter/TargetLinter.swift @@ -1,7 +1,7 @@ import Foundation import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph protocol TargetLinting: AnyObject { func lint(target: Target) -> [LintingIssue] diff --git a/Sources/TuistGenerator/Linter/TargetScriptLinter.swift b/Sources/TuistGenerator/Linter/TargetScriptLinter.swift index 6ffab86f6e4..988fc3392d4 100644 --- a/Sources/TuistGenerator/Linter/TargetScriptLinter.swift +++ b/Sources/TuistGenerator/Linter/TargetScriptLinter.swift @@ -1,7 +1,7 @@ import Foundation import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph /// Protocol that defines the interface of a linter for target scripts. protocol TargetScriptLinting { diff --git a/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift b/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift index ddde8627d9b..107bc16f617 100644 --- a/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph /// A project mapper that auto-generates schemes for each of the targets of the `Project` /// if the user hasn't already defined schemes for those. diff --git a/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift b/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift index 6bb0c83e775..647eb16212b 100644 --- a/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift +++ b/Sources/TuistGenerator/Mappers/AutogeneratedWorkspaceSchemeWorkspaceMapper.swift @@ -1,6 +1,6 @@ import Foundation import TuistCore -import TuistGraph +import XcodeGraph /// Mapper that generates a new scheme `ProjectName-Workspace` that includes all targets from a given workspace public final class AutogeneratedWorkspaceSchemeWorkspaceMapper: WorkspaceMapping { // swiftlint:disable:this type_name diff --git a/Sources/TuistGenerator/Mappers/DeleteDerivedDirectoryProjectMapper.swift b/Sources/TuistGenerator/Mappers/DeleteDerivedDirectoryProjectMapper.swift index 1526ccbd960..806cd7d4b67 100644 --- a/Sources/TuistGenerator/Mappers/DeleteDerivedDirectoryProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/DeleteDerivedDirectoryProjectMapper.swift @@ -1,7 +1,7 @@ import Foundation import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph /// A project mapper that returns side effects to delete the derived directory. public final class DeleteDerivedDirectoryProjectMapper: ProjectMapping { diff --git a/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift b/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift index ff28c933b54..6b5e14f0540 100644 --- a/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift +++ b/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph /// A target mapper that enforces explicit dependencies by adding custom build directories public struct ExplicitDependencyGraphMapper: GraphMapping { diff --git a/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift b/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift index 7b60e899086..f6b09b7b8ea 100644 --- a/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XcodeProj /// A project mapper that generates derived entitlements files for targets that define it as a dictonary. diff --git a/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift b/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift index f6e368066e8..0ba1ba168e7 100644 --- a/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XcodeProj /// A project mapper that generates derived Info.plist files for targets that define it as a dictonary. diff --git a/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift b/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift index fa2350c86ed..052a65ac0bd 100644 --- a/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XcodeProj /// A project mapper that generates derived privacyManifest files for targets that define it as a dictonary. diff --git a/Sources/TuistGenerator/Mappers/IDETemplateMacrosMapper.swift b/Sources/TuistGenerator/Mappers/IDETemplateMacrosMapper.swift index 255a58de64d..22a58effe40 100644 --- a/Sources/TuistGenerator/Mappers/IDETemplateMacrosMapper.swift +++ b/Sources/TuistGenerator/Mappers/IDETemplateMacrosMapper.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph public final class IDETemplateMacrosMapper: ProjectMapping, WorkspaceMapping { public init() {} diff --git a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift index 3a6cbbb0e09..3613f98a7c3 100644 --- a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift +++ b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph /// Mapper that maps the `MODULE_MAP` build setting to the `-fmodule-map-file` compiler flags. /// It is required to avoid embedding the module map into the frameworks during cache operations, which would make the framework diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 17515e69727..1b2aa484e3a 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph /// A project mapper that adds support for defining resources in targets that don't support it public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this type_body_length diff --git a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift index 2f3ca031664..97bf5fd13aa 100644 --- a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift @@ -2,8 +2,8 @@ import Foundation import SwiftGenKit import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph // swiftlint:disable:next type_name enum SynthesizedResourceInterfaceProjectMapperError: FatalError, Equatable { diff --git a/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift b/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift index b1dfbdac6e8..ebc62f9a244 100644 --- a/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/TargetActionDisableShowEnvVarsProjectMapper.swift @@ -1,5 +1,5 @@ import TuistCore -import TuistGraph +import XcodeGraph /// This mapper takes the `Project` `disableShowEnvironmentVarsInScriptPhases` option and pushes it down into all of the `Target`s /// shell script `TargetAction`s diff --git a/Sources/TuistGenerator/Settings/DefaultSettingsProvider.swift b/Sources/TuistGenerator/Settings/DefaultSettingsProvider.swift index dfbc82bcbae..d557ef86456 100644 --- a/Sources/TuistGenerator/Settings/DefaultSettingsProvider.swift +++ b/Sources/TuistGenerator/Settings/DefaultSettingsProvider.swift @@ -1,8 +1,8 @@ import Foundation import struct TSCUtility.Version import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XcodeProj public protocol DefaultSettingsProviding { diff --git a/Sources/TuistGenerator/Utils/SettingsHelper.swift b/Sources/TuistGenerator/Utils/SettingsHelper.swift index 1f3bd009349..92a33e764cf 100644 --- a/Sources/TuistGenerator/Utils/SettingsHelper.swift +++ b/Sources/TuistGenerator/Utils/SettingsHelper.swift @@ -1,6 +1,6 @@ import Foundation import TuistCore -import TuistGraph +import XcodeGraph import XcodeProj final class SettingsHelper { diff --git a/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift b/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift index b0e672d721d..e78ed0ec13b 100644 --- a/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift +++ b/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph /// Swift Package Manager Interactor /// diff --git a/Sources/TuistGenerator/Utils/SynthesizedResourceInterfacesGenerator.swift b/Sources/TuistGenerator/Utils/SynthesizedResourceInterfacesGenerator.swift index 05d8b02813d..18d2a5ccffc 100644 --- a/Sources/TuistGenerator/Utils/SynthesizedResourceInterfacesGenerator.swift +++ b/Sources/TuistGenerator/Utils/SynthesizedResourceInterfacesGenerator.swift @@ -3,8 +3,8 @@ import Stencil import StencilSwiftKit import SwiftGenKit import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph protocol SynthesizedResourceInterfacesGenerating { func render( diff --git a/Sources/TuistGeneratorTesting/Generator/MockDescriptorGenerator.swift b/Sources/TuistGeneratorTesting/Generator/MockDescriptorGenerator.swift index acbb8ed9d4d..44fdd053b35 100644 --- a/Sources/TuistGeneratorTesting/Generator/MockDescriptorGenerator.swift +++ b/Sources/TuistGeneratorTesting/Generator/MockDescriptorGenerator.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph import XcodeProj @testable import TuistGenerator diff --git a/Sources/TuistGeneratorTesting/Linter/MockEnvironmentLinter.swift b/Sources/TuistGeneratorTesting/Linter/MockEnvironmentLinter.swift index b6f19add9b8..b663452d8c8 100644 --- a/Sources/TuistGeneratorTesting/Linter/MockEnvironmentLinter.swift +++ b/Sources/TuistGeneratorTesting/Linter/MockEnvironmentLinter.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph @testable import TuistGenerator diff --git a/Sources/TuistGeneratorTesting/Linter/MockGraphLinter.swift b/Sources/TuistGeneratorTesting/Linter/MockGraphLinter.swift index 00c012316a9..5f9ea4ec41e 100644 --- a/Sources/TuistGeneratorTesting/Linter/MockGraphLinter.swift +++ b/Sources/TuistGeneratorTesting/Linter/MockGraphLinter.swift @@ -1,7 +1,7 @@ import Foundation import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph @testable import TuistGenerator public class MockGraphLinter: GraphLinting { diff --git a/Sources/TuistKit/Commands/BuildCommand.swift b/Sources/TuistKit/Commands/BuildCommand.swift index 493d5b4646d..5dab010805c 100644 --- a/Sources/TuistKit/Commands/BuildCommand.swift +++ b/Sources/TuistKit/Commands/BuildCommand.swift @@ -2,9 +2,9 @@ import ArgumentParser import Foundation import TSCBasic import TSCUtility -import TuistGraph import TuistServer import TuistSupport +import XcodeGraph enum XcodeBuildPassthroughArgumentError: FatalError, Equatable { case alreadyHandled(String) @@ -68,7 +68,7 @@ public struct BuildOptions: ParsableArguments { help: "Build for a specific platform.", envKey: .buildOptionsPlatform ) - public var platform: TuistGraph.Platform? + public var platform: XcodeGraph.Platform? @Option( name: .shortAndLong, @@ -194,7 +194,7 @@ public struct BuildCommand: AsyncParsableCommand { } } -extension TuistGraph.Platform: ExpressibleByArgument { +extension XcodeGraph.Platform: ExpressibleByArgument { public init?(argument: String) { self.init(commandLineValue: argument) } diff --git a/Sources/TuistKit/Commands/GraphCommand.swift b/Sources/TuistKit/Commands/GraphCommand.swift index 3621e4cdcc3..ee7413c479e 100644 --- a/Sources/TuistKit/Commands/GraphCommand.swift +++ b/Sources/TuistKit/Commands/GraphCommand.swift @@ -4,9 +4,9 @@ import Foundation import GraphViz import TSCBasic import TuistGenerator -import TuistGraph import TuistLoader import TuistSupport +import XcodeGraph /// Command that generates and exports a dot graph from the workspace or project in the current directory. public struct GraphCommand: AsyncParsableCommand, HasTrackableParameters { diff --git a/Sources/TuistKit/Commands/InitCommand.swift b/Sources/TuistKit/Commands/InitCommand.swift index 17bcc428ff1..f800ef1a532 100644 --- a/Sources/TuistKit/Commands/InitCommand.swift +++ b/Sources/TuistKit/Commands/InitCommand.swift @@ -4,13 +4,13 @@ import Foundation import TSCBasic import TuistCore import TuistGenerator -import TuistGraph import TuistLoader import TuistScaffold import TuistSupport +import XcodeGraph -private typealias Platform = TuistGraph.Platform -private typealias Product = TuistGraph.Product +private typealias Platform = XcodeGraph.Platform +private typealias Product = XcodeGraph.Product public struct InitCommand: ParsableCommand, HasTrackableParameters { public static var configuration: CommandConfiguration { diff --git a/Sources/TuistKit/Commands/ScaffoldCommand.swift b/Sources/TuistKit/Commands/ScaffoldCommand.swift index b2799b8cfce..49af18a6230 100644 --- a/Sources/TuistKit/Commands/ScaffoldCommand.swift +++ b/Sources/TuistKit/Commands/ScaffoldCommand.swift @@ -2,10 +2,10 @@ import ArgumentParser import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistLoader import TuistPlugin import TuistSupport +import XcodeGraph enum ScaffoldCommandError: FatalError, Equatable { var type: ErrorType { diff --git a/Sources/TuistKit/Commands/TestCommand.swift b/Sources/TuistKit/Commands/TestCommand.swift index 00019365bc1..19b8d13cd5f 100644 --- a/Sources/TuistKit/Commands/TestCommand.swift +++ b/Sources/TuistKit/Commands/TestCommand.swift @@ -3,9 +3,9 @@ import ArgumentParser import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistServer import TuistSupport +import XcodeGraph /// Command that tests a target from the project in the current directory. public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { diff --git a/Sources/TuistKit/Generator/Generator.swift b/Sources/TuistKit/Generator/Generator.swift index 51b960c298c..a2d5f4e57bd 100644 --- a/Sources/TuistKit/Generator/Generator.swift +++ b/Sources/TuistKit/Generator/Generator.swift @@ -4,10 +4,10 @@ import TSCBasic import TuistCore import TuistDependencies import TuistGenerator -import TuistGraph import TuistLoader import TuistPlugin import TuistSupport +import XcodeGraph public protocol Generating { @discardableResult diff --git a/Sources/TuistKit/Generator/GeneratorFactory.swift b/Sources/TuistKit/Generator/GeneratorFactory.swift index ecd24739b8d..04eae2dec35 100644 --- a/Sources/TuistKit/Generator/GeneratorFactory.swift +++ b/Sources/TuistKit/Generator/GeneratorFactory.swift @@ -3,10 +3,10 @@ import Mockable import TSCBasic import TuistCore import TuistGenerator -import TuistGraph import TuistLoader import TuistServer import TuistSupport +import XcodeGraph /// The protocol describes the interface of a factory that instantiates /// generators for different commands diff --git a/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift b/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift index 438bb15d021..dcc366c55c8 100644 --- a/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift +++ b/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift @@ -3,7 +3,7 @@ import TSCBasic import TuistCore import TuistDependencies import TuistGenerator -import TuistGraph +import XcodeGraph /// The GraphMapperFactorying describes the interface of a factory of graph mappers. /// Methods in the interface map with workflows exposed to the user. diff --git a/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift b/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift index e794d095b24..abf69ecc5a3 100644 --- a/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift +++ b/Sources/TuistKit/Mappers/Factories/ProjectMapperFactory.swift @@ -3,9 +3,9 @@ import TuistAutomation import TuistCore import TuistDependencies import TuistGenerator -import TuistGraph import TuistLoader import TuistSupport +import XcodeGraph /// The protocol describes an interface for getting project mappers. protocol ProjectMapperFactorying { diff --git a/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift b/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift index 36791a6c363..0254c32a188 100644 --- a/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift +++ b/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift @@ -5,7 +5,7 @@ import TuistAutomation import TuistCore import TuistDependencies import TuistGenerator -import TuistGraph +import XcodeGraph protocol WorkspaceMapperFactorying { /// Returns the default workspace mapper. diff --git a/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift b/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift index a2f788a211e..d49982bc24c 100644 --- a/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift +++ b/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph public enum FocusTargetsGraphMappersError: FatalError, Equatable { case targetsNotFound([String]) diff --git a/Sources/TuistKit/Mappers/Graph/UpdateWorkspaceProjectsGraphMapper.swift b/Sources/TuistKit/Mappers/Graph/UpdateWorkspaceProjectsGraphMapper.swift index 35bea05bb67..806861ddf26 100644 --- a/Sources/TuistKit/Mappers/Graph/UpdateWorkspaceProjectsGraphMapper.swift +++ b/Sources/TuistKit/Mappers/Graph/UpdateWorkspaceProjectsGraphMapper.swift @@ -1,6 +1,6 @@ import Foundation import TuistCore -import TuistGraph +import XcodeGraph /// A mapper that ensures that the list of projects of the workspace is in sync /// with the projects available in the graph. diff --git a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift index 06c1a7fb7f7..bca39277d5e 100644 --- a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift +++ b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { public init() {} diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditor.swift b/Sources/TuistKit/ProjectEditor/ProjectEditor.swift index f6578d52812..56c6dd61e9e 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditor.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditor.swift @@ -3,10 +3,10 @@ import Mockable import TSCBasic import TuistCore import TuistGenerator -import TuistGraph import TuistLoader import TuistScaffold import TuistSupport +import XcodeGraph enum ProjectEditorError: FatalError, Equatable { /// This error is thrown when we try to edit in a project in a directory that has no editable files. diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift index 7f2e9c95b4a..b5f795aad96 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift @@ -1,9 +1,9 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistLoader import TuistSupport +import XcodeGraph protocol ProjectEditorMapping: AnyObject { func map( diff --git a/Sources/TuistKit/Services/BuildService.swift b/Sources/TuistKit/Services/BuildService.swift index e5ee39fe325..95a7ffc5afa 100644 --- a/Sources/TuistKit/Services/BuildService.swift +++ b/Sources/TuistKit/Services/BuildService.swift @@ -2,10 +2,10 @@ import Foundation import TSCBasic import TuistAutomation import TuistCore -import TuistGraph import TuistLoader import TuistServer import TuistSupport +import XcodeGraph enum BuildServiceError: FatalError { case workspaceNotFound(path: String) @@ -120,7 +120,7 @@ public final class BuildService { throw TargetBuilderError.schemeWithoutBuildableTargets(scheme: scheme.name) } - let buildPlatform: TuistGraph.Platform + let buildPlatform: XcodeGraph.Platform if let platform { buildPlatform = platform @@ -152,7 +152,7 @@ public final class BuildService { throw TargetBuilderError.schemeWithoutBuildableTargets(scheme: scheme.name) } - let buildPlatform: TuistGraph.Platform + let buildPlatform: XcodeGraph.Platform if let platform { buildPlatform = platform diff --git a/Sources/TuistKit/Services/CleanService.swift b/Sources/TuistKit/Services/CleanService.swift index 8bb17f51dd3..45310adc7ab 100644 --- a/Sources/TuistKit/Services/CleanService.swift +++ b/Sources/TuistKit/Services/CleanService.swift @@ -1,9 +1,9 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistLoader import TuistSupport +import XcodeGraph protocol CleanCategory: ExpressibleByArgument & CaseIterable { func directory( diff --git a/Sources/TuistKit/Services/EditService.swift b/Sources/TuistKit/Services/EditService.swift index 78c7f80f89b..d3a90a1b2af 100644 --- a/Sources/TuistKit/Services/EditService.swift +++ b/Sources/TuistKit/Services/EditService.swift @@ -2,10 +2,10 @@ import Foundation import TSCBasic import TuistCore import TuistGenerator -import TuistGraph import TuistLoader import TuistPlugin import TuistSupport +import XcodeGraph enum EditServiceError: FatalError { case xcodeNotSelected diff --git a/Sources/TuistKit/Services/GenerateService.swift b/Sources/TuistKit/Services/GenerateService.swift index b515e23fa05..cd74790d72a 100644 --- a/Sources/TuistKit/Services/GenerateService.swift +++ b/Sources/TuistKit/Services/GenerateService.swift @@ -2,11 +2,11 @@ import Foundation import TSCBasic import TuistCore import TuistGenerator -import TuistGraph import TuistLoader import TuistPlugin import TuistServer import TuistSupport +import XcodeGraph final class GenerateService { private let opener: Opening diff --git a/Sources/TuistKit/Services/GraphService.swift b/Sources/TuistKit/Services/GraphService.swift index abb4997afbd..62750241d50 100644 --- a/Sources/TuistKit/Services/GraphService.swift +++ b/Sources/TuistKit/Services/GraphService.swift @@ -6,10 +6,10 @@ import Tools import TSCBasic import TuistCore import TuistGenerator -import TuistGraph import TuistLoader import TuistPlugin import TuistSupport +import XcodeGraph final class GraphService { private let graphVizMapper: GraphToGraphVizMapping diff --git a/Sources/TuistKit/Services/InitService.swift b/Sources/TuistKit/Services/InitService.swift index 19d0c7f32a4..21e50244410 100644 --- a/Sources/TuistKit/Services/InitService.swift +++ b/Sources/TuistKit/Services/InitService.swift @@ -1,9 +1,9 @@ import TSCBasic import TuistCore -import TuistGraph import TuistLoader import TuistScaffold import TuistSupport +import XcodeGraph enum InitServiceError: FatalError, Equatable { case ungettableProjectName(AbsolutePath) @@ -187,8 +187,8 @@ class InitService { requiredTemplateOptions: [String: String], optionalTemplateOptions: [String: String?], template: Template - ) throws -> [String: TuistGraph.Template.Attribute.Value] { - let defaultAttributes: [String: TuistGraph.Template.Attribute.Value] = [ + ) throws -> [String: XcodeGraph.Template.Attribute.Value] { + let defaultAttributes: [String: XcodeGraph.Template.Attribute.Value] = [ "name": .string(name), "platform": .string(platform.caseValue), "tuist_version": .string(tuistVersion), diff --git a/Sources/TuistKit/Services/InstallService.swift b/Sources/TuistKit/Services/InstallService.swift index a6fa7c56b1e..b02c0143c59 100644 --- a/Sources/TuistKit/Services/InstallService.swift +++ b/Sources/TuistKit/Services/InstallService.swift @@ -2,10 +2,10 @@ import Foundation import TSCBasic import TuistCore import TuistDependencies -import TuistGraph import TuistLoader import TuistPlugin import TuistSupport +import XcodeGraph final class InstallService { private let pluginService: PluginServicing diff --git a/Sources/TuistKit/Services/ListService.swift b/Sources/TuistKit/Services/ListService.swift index b0e74eaae08..f8ac510e132 100644 --- a/Sources/TuistKit/Services/ListService.swift +++ b/Sources/TuistKit/Services/ListService.swift @@ -1,10 +1,10 @@ import Foundation import TSCBasic -import TuistGraph import TuistLoader import TuistPlugin import TuistScaffold import TuistSupport +import XcodeGraph class ListService { // MARK: - OutputFormat diff --git a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift index b61600cbbac..18b42507341 100644 --- a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift +++ b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift @@ -1,12 +1,12 @@ import Foundation import ProjectAutomation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph extension ProjectAutomation.Graph { static func from( - graph: TuistGraph.Graph, + graph: XcodeGraph.Graph, targetsAndDependencies: [GraphTarget: Set] ) -> ProjectAutomation.Graph { // generate targets projects only @@ -33,7 +33,7 @@ extension ProjectAutomation.Graph { } extension ProjectAutomation.Project { - static func from(_ project: TuistGraph.Project) -> ProjectAutomation.Project { + static func from(_ project: XcodeGraph.Project) -> ProjectAutomation.Project { let packages = project.packages .reduce(into: [ProjectAutomation.Package]()) { $0.append(ProjectAutomation.Package.from($1)) } let schemes = project.schemes.reduce(into: [ProjectAutomation.Scheme]()) { $0.append(ProjectAutomation.Scheme.from($1)) } @@ -53,7 +53,7 @@ extension ProjectAutomation.Project { } extension ProjectAutomation.Package { - static func from(_ package: TuistGraph.Package) -> ProjectAutomation.Package { + static func from(_ package: XcodeGraph.Package) -> ProjectAutomation.Package { switch package { case let .remote(url, _): return ProjectAutomation.Package(kind: ProjectAutomation.Package.PackageKind.remote, path: url) @@ -64,7 +64,7 @@ extension ProjectAutomation.Package { } extension ProjectAutomation.Target { - static func from(_ target: TuistGraph.Target) -> ProjectAutomation.Target { + static func from(_ target: XcodeGraph.Target) -> ProjectAutomation.Target { let dependencies = target.dependencies.map { Self.from($0) } return ProjectAutomation.Target( name: target.name, @@ -77,7 +77,7 @@ extension ProjectAutomation.Target { ) } - static func from(_ dependency: TuistGraph.TargetDependency) -> ProjectAutomation.TargetDependency { + static func from(_ dependency: XcodeGraph.TargetDependency) -> ProjectAutomation.TargetDependency { switch dependency { case let .target(name, _): return .target(name: name) @@ -132,7 +132,7 @@ extension ProjectAutomation.Target { } extension ProjectAutomation.Scheme { - static func from(_ scheme: TuistGraph.Scheme) -> ProjectAutomation.Scheme { + static func from(_ scheme: XcodeGraph.Scheme) -> ProjectAutomation.Scheme { var testTargets = [String]() if let testAction = scheme.testAction { for testTarget in testAction.targets { @@ -145,7 +145,7 @@ extension ProjectAutomation.Scheme { } extension ProjectAutomation.Settings { - public static func from(_ settings: TuistGraph.Settings?) -> ProjectAutomation.Settings { + public static func from(_ settings: XcodeGraph.Settings?) -> ProjectAutomation.Settings { ProjectAutomation.Settings( configurations: [ProjectAutomation.BuildConfiguration: ProjectAutomation.Configuration?].from( settings?.configurations @@ -156,7 +156,7 @@ extension ProjectAutomation.Settings { extension [ProjectAutomation.BuildConfiguration: ProjectAutomation.Configuration?] { public static func from( - _ buildConfigurationDictionary: [TuistGraph.BuildConfiguration: TuistGraph.Configuration?]? + _ buildConfigurationDictionary: [XcodeGraph.BuildConfiguration: XcodeGraph.Configuration?]? ) -> [ProjectAutomation.BuildConfiguration: ProjectAutomation.Configuration?] { guard let buildConfigurationDictionary else { return [:] @@ -179,7 +179,7 @@ extension [ProjectAutomation.BuildConfiguration: ProjectAutomation.Configuration extension ProjectAutomation.Configuration { static func from( - _ configuration: TuistGraph.Configuration? + _ configuration: XcodeGraph.Configuration? ) -> ProjectAutomation.Configuration? { guard let configuration else { return nil @@ -195,7 +195,7 @@ extension ProjectAutomation.Configuration { extension ProjectAutomation.SettingValue { static func from( - _ value: TuistGraph.SettingValue + _ value: XcodeGraph.SettingValue ) -> ProjectAutomation.SettingValue { switch value { case let .string(string): @@ -208,7 +208,7 @@ extension ProjectAutomation.SettingValue { extension ProjectAutomation.SettingsDictionary { static func from( - _ settings: TuistGraph.SettingsDictionary + _ settings: XcodeGraph.SettingsDictionary ) -> ProjectAutomation.SettingsDictionary { var dict = ProjectAutomation.SettingsDictionary() for (key, value) in settings { @@ -222,7 +222,7 @@ extension ProjectAutomation.SettingsDictionary { extension ProjectAutomation.BuildConfiguration { static func from( - _ buildConfiguration: TuistGraph.BuildConfiguration + _ buildConfiguration: XcodeGraph.BuildConfiguration ) -> ProjectAutomation.BuildConfiguration { BuildConfiguration( name: buildConfiguration.name, @@ -235,7 +235,7 @@ extension ProjectAutomation.BuildConfiguration { extension ProjectAutomation.BuildConfiguration.Variant { static func from( - _ variant: TuistGraph.BuildConfiguration.Variant + _ variant: XcodeGraph.BuildConfiguration.Variant ) -> ProjectAutomation.BuildConfiguration.Variant { ProjectAutomation.BuildConfiguration.Variant( variant: variant @@ -244,7 +244,7 @@ extension ProjectAutomation.BuildConfiguration.Variant { } extension ProjectAutomation.BuildConfiguration.Variant { - private init(variant: TuistGraph.BuildConfiguration.Variant) { + private init(variant: XcodeGraph.BuildConfiguration.Variant) { switch variant { case .debug: self = .debug diff --git a/Sources/TuistKit/Services/RunService.swift b/Sources/TuistKit/Services/RunService.swift index 993393a4033..071ce6f0bd8 100644 --- a/Sources/TuistKit/Services/RunService.swift +++ b/Sources/TuistKit/Services/RunService.swift @@ -3,9 +3,9 @@ import TSCBasic import struct TSCUtility.Version import TuistAutomation import TuistCore -import TuistGraph import TuistLoader import TuistSupport +import XcodeGraph enum RunServiceError: FatalError { case schemeNotFound(scheme: String, existing: [String]) diff --git a/Sources/TuistKit/Services/ScaffoldService.swift b/Sources/TuistKit/Services/ScaffoldService.swift index de6f7766589..cf6dc9a5113 100644 --- a/Sources/TuistKit/Services/ScaffoldService.swift +++ b/Sources/TuistKit/Services/ScaffoldService.swift @@ -1,10 +1,10 @@ import TSCBasic import TuistCore -import TuistGraph import TuistLoader import TuistPlugin import TuistScaffold import TuistSupport +import XcodeGraph enum ScaffoldServiceError: FatalError, Equatable { var type: ErrorType { @@ -131,7 +131,7 @@ final class ScaffoldService { requiredTemplateOptions: [String: String], optionalTemplateOptions: [String: String?], template: Template - ) throws -> [String: TuistGraph.Template.Attribute.Value] { + ) throws -> [String: XcodeGraph.Template.Attribute.Value] { try template.attributes.reduce(into: [:]) { attributesDictionary, attribute in switch attribute { case let .required(name): diff --git a/Sources/TuistKit/Services/TestService.swift b/Sources/TuistKit/Services/TestService.swift index 5682ab59d8e..809dd996d73 100644 --- a/Sources/TuistKit/Services/TestService.swift +++ b/Sources/TuistKit/Services/TestService.swift @@ -3,10 +3,10 @@ import TSCBasic import struct TSCUtility.Version import TuistAutomation import TuistCore -import TuistGraph import TuistLoader import TuistServer import TuistSupport +import XcodeGraph enum TestServiceError: FatalError, Equatable { case schemeNotFound(scheme: String, existing: [String]) @@ -387,10 +387,10 @@ final class TestService { // swiftlint:disable:this type_body_length throw TestServiceError.schemeWithoutTestableTargets(scheme: scheme.name, testPlan: testPlanConfiguration?.testPlan) } - let buildPlatform: TuistGraph.Platform + let buildPlatform: XcodeGraph.Platform if let platform { - buildPlatform = try TuistGraph.Platform.from(commandLineValue: platform) + buildPlatform = try XcodeGraph.Platform.from(commandLineValue: platform) } else { buildPlatform = try buildableTarget.target.servicePlatform } diff --git a/Sources/TuistKit/Utils/ManifestGraphLoader.swift b/Sources/TuistKit/Utils/ManifestGraphLoader.swift index a2375563d2d..0acb759348c 100644 --- a/Sources/TuistKit/Utils/ManifestGraphLoader.swift +++ b/Sources/TuistKit/Utils/ManifestGraphLoader.swift @@ -3,10 +3,10 @@ import ProjectDescription import TSCBasic import TuistCore import TuistDependencies -import TuistGraph import TuistLoader import TuistPlugin import TuistSupport +import XcodeGraph /// A utility for loading a graph for a given Manifest path on disk /// @@ -106,8 +106,8 @@ public final class ManifestGraphLoader: ManifestGraphLoading { // Load DependenciesGraph - let dependenciesGraph: TuistGraph.DependenciesGraph - let packageSettings: TuistGraph.PackageSettings? + let dependenciesGraph: XcodeGraph.DependenciesGraph + let packageSettings: XcodeGraph.PackageSettings? // Load SPM graph only if is SPM Project only or the workspace is using external dependencies if let packagePath = manifestFilesLocator.locatePackageManifest(at: path), @@ -182,9 +182,9 @@ public final class ManifestGraphLoader: ManifestGraphLoading { private func convert( projects: [AbsolutePath: ProjectDescription.Project], plugins: Plugins, - externalDependencies: [String: [TuistGraph.TargetDependency]], + externalDependencies: [String: [XcodeGraph.TargetDependency]], context: ExecutionContext = .concurrent - ) throws -> [TuistGraph.Project] { + ) throws -> [XcodeGraph.Project] { let tuples = projects.map { (path: $0.key, manifest: $0.value) } return try tuples.map(context: context) { try converter.convert( diff --git a/Sources/TuistKit/Utils/Target+PlatformResolution.swift b/Sources/TuistKit/Utils/Target+PlatformResolution.swift index b515b304243..91f23726916 100644 --- a/Sources/TuistKit/Utils/Target+PlatformResolution.swift +++ b/Sources/TuistKit/Utils/Target+PlatformResolution.swift @@ -1,6 +1,6 @@ import Foundation -import TuistGraph import TuistSupport +import XcodeGraph struct UnspecifiedPlatformError: FatalError, CustomStringConvertible { var type: TuistSupport.ErrorType = .abort diff --git a/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift b/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift index 177fbf556e6..fe1a9f85f23 100644 --- a/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift +++ b/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift @@ -2,9 +2,9 @@ import Foundation import TuistAnalytics import TuistAsyncQueue import TuistCore -import TuistGraph import TuistServer import TuistSupport +import XcodeGraph public class TuistAnalyticsCloudBackend: TuistAnalyticsBackend { private let config: Cloud diff --git a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift index e09faaa69c3..5bc4cd1bea1 100644 --- a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift @@ -2,9 +2,9 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import struct TuistGraph.Config -import struct TuistGraph.Plugins import TuistSupport +import struct XcodeGraph.Config +import struct XcodeGraph.Plugins /// Cached Manifest Loader /// diff --git a/Sources/TuistLoader/Loaders/ConfigLoader.swift b/Sources/TuistLoader/Loaders/ConfigLoader.swift index 25aa339292a..d3a04457133 100644 --- a/Sources/TuistLoader/Loaders/ConfigLoader.swift +++ b/Sources/TuistLoader/Loaders/ConfigLoader.swift @@ -3,8 +3,8 @@ import Mockable import struct ProjectDescription.Config import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph @Mockable public protocol ConfigLoading { @@ -14,7 +14,7 @@ public protocol ConfigLoading { /// - Parameter path: Directory from which look up and load the Config. /// - Returns: Loaded Config object. /// - Throws: An error if the Config.swift can't be parsed. - func loadConfig(path: AbsolutePath) throws -> TuistGraph.Config + func loadConfig(path: AbsolutePath) throws -> XcodeGraph.Config /// Locates the Config.swift manifest from the given directory. func locateConfig(at: AbsolutePath) -> AbsolutePath? @@ -24,7 +24,7 @@ public final class ConfigLoader: ConfigLoading { private let manifestLoader: ManifestLoading private let rootDirectoryLocator: RootDirectoryLocating private let fileHandler: FileHandling - private var cachedConfigs: [AbsolutePath: TuistGraph.Config] = [:] + private var cachedConfigs: [AbsolutePath: XcodeGraph.Config] = [:] public init( manifestLoader: ManifestLoading = ManifestLoader(), @@ -36,19 +36,19 @@ public final class ConfigLoader: ConfigLoading { self.fileHandler = fileHandler } - public func loadConfig(path: AbsolutePath) throws -> TuistGraph.Config { + public func loadConfig(path: AbsolutePath) throws -> XcodeGraph.Config { if let cached = cachedConfigs[path] { return cached } guard let configPath = locateConfig(at: path) else { - let config = TuistGraph.Config.default + let config = XcodeGraph.Config.default cachedConfigs[path] = config return config } let manifest = try manifestLoader.loadConfig(at: configPath.parentDirectory) - let config = try TuistGraph.Config.from(manifest: manifest, at: configPath) + let config = try XcodeGraph.Config.from(manifest: manifest, at: configPath) cachedConfigs[path] = config return config } diff --git a/Sources/TuistLoader/Loaders/ManifestLoader.swift b/Sources/TuistLoader/Loaders/ManifestLoader.swift index f288b5f5a99..ea3b3ac230b 100644 --- a/Sources/TuistLoader/Loaders/ManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/ManifestLoader.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph public enum ManifestLoaderError: FatalError, Equatable { case projectDescriptionNotFound(AbsolutePath) diff --git a/Sources/TuistLoader/Loaders/ManifestModelConverter.swift b/Sources/TuistLoader/Loaders/ManifestModelConverter.swift index 426d59e9715..45ea5b81573 100644 --- a/Sources/TuistLoader/Loaders/ManifestModelConverter.swift +++ b/Sources/TuistLoader/Loaders/ManifestModelConverter.swift @@ -3,20 +3,20 @@ import ProjectDescription import TSCBasic import TSCUtility import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph /// A component responsible for converting Manifests (`ProjectDescription`) to Models (`TuistCore`) public protocol ManifestModelConverting { - func convert(manifest: ProjectDescription.Workspace, path: AbsolutePath) throws -> TuistGraph.Workspace + func convert(manifest: ProjectDescription.Workspace, path: AbsolutePath) throws -> XcodeGraph.Workspace func convert( manifest: ProjectDescription.Project, path: AbsolutePath, plugins: Plugins, - externalDependencies: [String: [TuistGraph.TargetDependency]], + externalDependencies: [String: [XcodeGraph.TargetDependency]], isExternal: Bool - ) throws -> TuistGraph.Project - func convert(manifest: TuistCore.DependenciesGraph, path: AbsolutePath) throws -> TuistGraph.DependenciesGraph + ) throws -> XcodeGraph.Project + func convert(manifest: TuistCore.DependenciesGraph, path: AbsolutePath) throws -> XcodeGraph.DependenciesGraph } public final class ManifestModelConverter: ManifestModelConverting { @@ -50,11 +50,11 @@ public final class ManifestModelConverter: ManifestModelConverting { manifest: ProjectDescription.Project, path: AbsolutePath, plugins: Plugins, - externalDependencies: [String: [TuistGraph.TargetDependency]], + externalDependencies: [String: [XcodeGraph.TargetDependency]], isExternal: Bool - ) throws -> TuistGraph.Project { + ) throws -> XcodeGraph.Project { let generatorPaths = GeneratorPaths(manifestDirectory: path) - return try TuistGraph.Project.from( + return try XcodeGraph.Project.from( manifest: manifest, generatorPaths: generatorPaths, plugins: plugins, @@ -67,9 +67,9 @@ public final class ManifestModelConverter: ManifestModelConverting { public func convert( manifest: ProjectDescription.Workspace, path: AbsolutePath - ) throws -> TuistGraph.Workspace { + ) throws -> XcodeGraph.Workspace { let generatorPaths = GeneratorPaths(manifestDirectory: path) - let workspace = try TuistGraph.Workspace.from( + let workspace = try XcodeGraph.Workspace.from( manifest: manifest, path: path, generatorPaths: generatorPaths, @@ -81,12 +81,12 @@ public final class ManifestModelConverter: ManifestModelConverting { public func convert( manifest: TuistCore.DependenciesGraph, path: AbsolutePath - ) throws -> TuistGraph.DependenciesGraph { - var externalDependencies: [String: [TuistGraph.TargetDependency]] = .init() + ) throws -> XcodeGraph.DependenciesGraph { + var externalDependencies: [String: [XcodeGraph.TargetDependency]] = .init() externalDependencies = try manifest.externalDependencies.mapValues { targetDependencies in try targetDependencies.flatMap { targetDependencyManifest in - try TuistGraph.TargetDependency.from( + try XcodeGraph.TargetDependency.from( manifest: targetDependencyManifest, generatorPaths: GeneratorPaths(manifestDirectory: path), externalDependencies: [:] // externalDependencies manifest can't contain other external dependencies, @@ -94,7 +94,7 @@ public final class ManifestModelConverter: ManifestModelConverting { } } - let externalProjects = try [AbsolutePath: TuistGraph.Project]( + let externalProjects = try [AbsolutePath: XcodeGraph.Project]( uniqueKeysWithValues: manifest.externalProjects .map { project in let projectPath = try AbsolutePath(validating: project.key.pathString) diff --git a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift index a3566d5599b..b10df7e5ad4 100644 --- a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift +++ b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift @@ -3,8 +3,8 @@ import ProjectDescription import TSCBasic import TSCUtility import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph /// Entity responsible for providing `PackageSettings`. public protocol PackageSettingsLoading { @@ -12,7 +12,7 @@ public protocol PackageSettingsLoading { /// - Parameter path: The absolute path for the `PackageSettings` to load. /// - Parameter plugins: The plugins for the `PackageSettings` to load. /// - Returns: The `PackageSettings` loaded from the specified path. - func loadPackageSettings(at path: AbsolutePath, with plugins: Plugins) throws -> TuistGraph.PackageSettings + func loadPackageSettings(at path: AbsolutePath, with plugins: Plugins) throws -> XcodeGraph.PackageSettings } public final class PackageSettingsLoader: PackageSettingsLoading { @@ -33,7 +33,7 @@ public final class PackageSettingsLoader: PackageSettingsLoading { self.manifestFilesLocator = manifestFilesLocator } - public func loadPackageSettings(at path: AbsolutePath, with plugins: Plugins) throws -> TuistGraph.PackageSettings { + public func loadPackageSettings(at path: AbsolutePath, with plugins: Plugins) throws -> XcodeGraph.PackageSettings { let path = manifestFilesLocator.locatePackageManifest(at: path)?.parentDirectory ?? path try manifestLoader.register(plugins: plugins) let manifest = try manifestLoader.loadPackageSettings(at: path) @@ -42,7 +42,7 @@ public final class PackageSettingsLoader: PackageSettingsLoading { at: path ) - return try TuistGraph.PackageSettings.from( + return try XcodeGraph.PackageSettings.from( manifest: manifest, generatorPaths: generatorPaths, swiftToolsVersion: swiftToolsVersion diff --git a/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift b/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift index 4331358f9f8..4e54105d9a9 100644 --- a/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift @@ -1,8 +1,8 @@ import Foundation import ProjectDescription import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph /// A component that can load a manifest and all its (transitive) manifest dependencies public protocol RecursiveManifestLoading { @@ -20,7 +20,7 @@ public protocol RecursiveManifestLoading { /// - Returns: Loaded manifest func loadAndMergePackageProjects( in loadedWorkspace: LoadedWorkspace, - packageSettings: TuistGraph.PackageSettings + packageSettings: XcodeGraph.PackageSettings ) throws -> LoadedWorkspace } @@ -85,7 +85,7 @@ public class RecursiveManifestLoader: RecursiveManifestLoading { ) } - public func loadAndMergePackageProjects(in loadedWorkspace: LoadedWorkspace, packageSettings: TuistGraph.PackageSettings) + public func loadAndMergePackageProjects(in loadedWorkspace: LoadedWorkspace, packageSettings: XcodeGraph.PackageSettings) throws -> LoadedWorkspace { let generatorPaths = GeneratorPaths(manifestDirectory: loadedWorkspace.path) @@ -120,7 +120,7 @@ public class RecursiveManifestLoader: RecursiveManifestLoading { private func loadPackageProjects( paths: [AbsolutePath], - packageSettings: TuistGraph.PackageSettings? + packageSettings: XcodeGraph.PackageSettings? ) throws -> LoadedProjects { guard let packageSettings else { return LoadedProjects(projects: [:]) } var cache = [AbsolutePath: ProjectDescription.Project]() diff --git a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift index f6d967b9325..6bb671a9cdc 100644 --- a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift +++ b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift @@ -3,8 +3,8 @@ import ProjectDescription import TSCBasic import TSCUtility import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph // MARK: - Swift Package Manager Graph Generator Errors @@ -48,7 +48,7 @@ public protocol SwiftPackageManagerGraphLoading { /// dependencies. func load( packagePath: AbsolutePath, - packageSettings: TuistGraph.PackageSettings + packageSettings: XcodeGraph.PackageSettings ) throws -> TuistCore.DependenciesGraph } @@ -73,7 +73,7 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi // swiftlint:disable:next function_body_length public func load( packagePath: AbsolutePath, - packageSettings: TuistGraph.PackageSettings + packageSettings: XcodeGraph.PackageSettings ) throws -> TuistCore.DependenciesGraph { let path = packagePath.parentDirectory.appending( component: Constants.SwiftPackageManager.packageBuildDirectoryName @@ -165,10 +165,10 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi } extension ProjectDescription.Platform { - /// Maps a TuistGraph.Platform instance into a ProjectDescription.Platform instance. + /// Maps a XcodeGraph.Platform instance into a ProjectDescription.Platform instance. /// - Parameters: /// - graph: Graph representation of platform model. - static func from(graph: TuistGraph.Platform) -> ProjectDescription.Platform { + static func from(graph: XcodeGraph.Platform) -> ProjectDescription.Platform { switch graph { case .macOS: return .macOS diff --git a/Sources/TuistLoader/Loaders/TemplateGitLoader.swift b/Sources/TuistLoader/Loaders/TemplateGitLoader.swift index 41b57ec2127..5799feb1912 100644 --- a/Sources/TuistLoader/Loaders/TemplateGitLoader.swift +++ b/Sources/TuistLoader/Loaders/TemplateGitLoader.swift @@ -1,13 +1,13 @@ -import TuistGraph import TuistSupport +import XcodeGraph public protocol TemplateGitLoading { - /// Load `TuistGraph.Template` from the given Git repository + /// Load `XcodeGraph.Template` from the given Git repository /// to a temporary directory and performs `closure` on that template. /// - Parameters: /// - templateURL: Git repository url /// - closure: Closure to perform work on loaded template - func loadTemplate(from templateURL: String, closure: (TuistGraph.Template) throws -> Void) throws + func loadTemplate(from templateURL: String, closure: (XcodeGraph.Template) throws -> Void) throws } public final class TemplateGitLoader: TemplateGitLoading { @@ -38,7 +38,7 @@ public final class TemplateGitLoader: TemplateGitLoading { self.templateLocationParser = templateLocationParser } - public func loadTemplate(from templateURL: String, closure: (TuistGraph.Template) throws -> Void) throws { + public func loadTemplate(from templateURL: String, closure: (XcodeGraph.Template) throws -> Void) throws { let repoURL = templateLocationParser.parseRepositoryURL(from: templateURL) let repoBranch = templateLocationParser.parseRepositoryBranch(from: templateURL) try fileHandler.inTemporaryDirectory { temporaryPath in diff --git a/Sources/TuistLoader/Loaders/TemplateLoader.swift b/Sources/TuistLoader/Loaders/TemplateLoader.swift index 427f2aaecbd..513a79b47e3 100644 --- a/Sources/TuistLoader/Loaders/TemplateLoader.swift +++ b/Sources/TuistLoader/Loaders/TemplateLoader.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph public protocol TemplateLoading { /// Load `TuistScaffold.Template` at given `path` @@ -11,7 +11,7 @@ public protocol TemplateLoading { /// - path: Path of template manifest file `name_of_template.swift` /// - plugins: List of available plugins. /// - Returns: Loaded `TuistScaffold.Template` - func loadTemplate(at path: AbsolutePath, plugins: Plugins) throws -> TuistGraph.Template + func loadTemplate(at path: AbsolutePath, plugins: Plugins) throws -> XcodeGraph.Template } public class TemplateLoader: TemplateLoading { @@ -26,28 +26,28 @@ public class TemplateLoader: TemplateLoading { self.manifestLoader = manifestLoader } - public func loadTemplate(at path: AbsolutePath, plugins: Plugins) throws -> TuistGraph.Template { + public func loadTemplate(at path: AbsolutePath, plugins: Plugins) throws -> XcodeGraph.Template { try manifestLoader.register(plugins: plugins) let template = try manifestLoader.loadTemplate(at: path) let generatorPaths = GeneratorPaths(manifestDirectory: path) - return try TuistGraph.Template.from( + return try XcodeGraph.Template.from( manifest: template, generatorPaths: generatorPaths ) } } -extension TuistGraph.Template { - static func from(manifest: ProjectDescription.Template, generatorPaths: GeneratorPaths) throws -> TuistGraph.Template { - let attributes = try manifest.attributes.map(TuistGraph.Template.Attribute.from) +extension XcodeGraph.Template { + static func from(manifest: ProjectDescription.Template, generatorPaths: GeneratorPaths) throws -> XcodeGraph.Template { + let attributes = try manifest.attributes.map(XcodeGraph.Template.Attribute.from) let items = try manifest.items.map { Item( path: try RelativePath(validating: $0.path), - contents: try TuistGraph.Template.Contents.from( + contents: try XcodeGraph.Template.Contents.from( manifest: $0.contents, generatorPaths: generatorPaths ) ) } - return TuistGraph.Template( + return XcodeGraph.Template( description: manifest.description, attributes: attributes, items: items @@ -55,8 +55,8 @@ extension TuistGraph.Template { } } -extension TuistGraph.Template.Attribute { - static func from(manifest: ProjectDescription.Template.Attribute) throws -> TuistGraph.Template.Attribute { +extension XcodeGraph.Template.Attribute { + static func from(manifest: ProjectDescription.Template.Attribute) throws -> XcodeGraph.Template.Attribute { switch manifest { case let .required(name): return .required(name) @@ -66,8 +66,8 @@ extension TuistGraph.Template.Attribute { } } -extension TuistGraph.Template.Attribute.Value { - static func from(value: ProjectDescription.Template.Attribute.Value) throws -> TuistGraph.Template.Attribute.Value { +extension XcodeGraph.Template.Attribute.Value { + static func from(value: ProjectDescription.Template.Attribute.Value) throws -> XcodeGraph.Template.Attribute.Value { switch value { case let .string(string): return .string(string) @@ -78,23 +78,23 @@ extension TuistGraph.Template.Attribute.Value { case let .boolean(boolean): return .boolean(boolean) case let .dictionary(dictionary): - var newDictionary: [String: TuistGraph.Template.Attribute.Value] = [:] + var newDictionary: [String: XcodeGraph.Template.Attribute.Value] = [:] for (key, value) in dictionary { newDictionary[key] = try from(value: value) } return .dictionary(newDictionary) case let .array(array): - let newArray: [TuistGraph.Template.Attribute.Value] = try array.map { try from(value: $0) } + let newArray: [XcodeGraph.Template.Attribute.Value] = try array.map { try from(value: $0) } return .array(newArray) } } } -extension TuistGraph.Template.Contents { +extension XcodeGraph.Template.Contents { static func from( manifest: ProjectDescription.Template.Contents, generatorPaths: GeneratorPaths - ) throws -> TuistGraph.Template.Contents { + ) throws -> XcodeGraph.Template.Contents { switch manifest { case let .string(contents): return .string(contents) diff --git a/Sources/TuistLoader/Models+ManifestMappers/AnalyzeAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/AnalyzeAction+ManifestMapper.swift index d0fb1d116c3..44921e963f6 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/AnalyzeAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/AnalyzeAction+ManifestMapper.swift @@ -2,13 +2,13 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.AnalyzeAction { +extension XcodeGraph.AnalyzeAction { static func from( manifest: ProjectDescription.AnalyzeAction, generatorPaths _: GeneratorPaths - ) throws -> TuistGraph.AnalyzeAction { + ) throws -> XcodeGraph.AnalyzeAction { let configurationName = manifest.configuration.rawValue return AnalyzeAction(configurationName: configurationName) diff --git a/Sources/TuistLoader/Models+ManifestMappers/ArchiveAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ArchiveAction+ManifestMapper.swift index 5f81212d749..2b5f349053e 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/ArchiveAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/ArchiveAction+ManifestMapper.swift @@ -2,25 +2,25 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.ArchiveAction { - /// Maps a ProjectDescription.ArchiveAction instance into a TuistGraph.ArchiveAction instance. +extension XcodeGraph.ArchiveAction { + /// Maps a ProjectDescription.ArchiveAction instance into a XcodeGraph.ArchiveAction instance. /// - Parameters: /// - manifest: Manifest representation of archive action model. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.ArchiveAction, generatorPaths: GeneratorPaths) throws -> TuistGraph + static func from(manifest: ProjectDescription.ArchiveAction, generatorPaths: GeneratorPaths) throws -> XcodeGraph .ArchiveAction { let configurationName = manifest.configuration.rawValue let revealArchiveInOrganizer = manifest.revealArchiveInOrganizer let customArchiveName = manifest.customArchiveName let preActions = try manifest.preActions - .map { try TuistGraph.ExecutionAction.from(manifest: $0, generatorPaths: generatorPaths) } + .map { try XcodeGraph.ExecutionAction.from(manifest: $0, generatorPaths: generatorPaths) } let postActions = try manifest.postActions - .map { try TuistGraph.ExecutionAction.from(manifest: $0, generatorPaths: generatorPaths) } + .map { try XcodeGraph.ExecutionAction.from(manifest: $0, generatorPaths: generatorPaths) } - return TuistGraph.ArchiveAction( + return XcodeGraph.ArchiveAction( configurationName: configurationName, revealArchiveInOrganizer: revealArchiveInOrganizer, customArchiveName: customArchiveName, diff --git a/Sources/TuistLoader/Models+ManifestMappers/Arguments+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Arguments+ManifestMapper.swift index 830028a968a..7ca8a8f7268 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Arguments+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Arguments+ManifestMapper.swift @@ -1,14 +1,14 @@ import Foundation import ProjectDescription import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.Arguments { - /// Maps a ProjectDescription.Arguments instance into a TuistGraph.Arguments instance. +extension XcodeGraph.Arguments { + /// Maps a ProjectDescription.Arguments instance into a XcodeGraph.Arguments instance. /// - Parameters: /// - manifest: Manifest representation of arguments model. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.Arguments) -> TuistGraph.Arguments { + static func from(manifest: ProjectDescription.Arguments) -> XcodeGraph.Arguments { Arguments( environmentVariables: manifest.environmentVariables.mapValues(EnvironmentVariable.from), launchArguments: manifest.launchArguments.map(LaunchArgument.from) diff --git a/Sources/TuistLoader/Models+ManifestMappers/BuildAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/BuildAction+ManifestMapper.swift index 6950cb86ae3..5259cd87703 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/BuildAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/BuildAction+ManifestMapper.swift @@ -2,32 +2,32 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.BuildAction { - /// Maps a ProjectDescription.BuildAction instance into a TuistGraph.BuildAction instance. +extension XcodeGraph.BuildAction { + /// Maps a ProjectDescription.BuildAction instance into a XcodeGraph.BuildAction instance. /// - Parameters: /// - manifest: Manifest representation of build action model. /// - generatorPaths: Generator paths. static func from( manifest: ProjectDescription.BuildAction, generatorPaths: GeneratorPaths - ) throws -> TuistGraph.BuildAction { - let preActions = try manifest.preActions.map { try TuistGraph.ExecutionAction.from( + ) throws -> XcodeGraph.BuildAction { + let preActions = try manifest.preActions.map { try XcodeGraph.ExecutionAction.from( manifest: $0, generatorPaths: generatorPaths ) } - let postActions = try manifest.postActions.map { try TuistGraph.ExecutionAction.from( + let postActions = try manifest.postActions.map { try XcodeGraph.ExecutionAction.from( manifest: $0, generatorPaths: generatorPaths ) } - let targets: [TuistGraph.TargetReference] = try manifest.targets.map { + let targets: [XcodeGraph.TargetReference] = try manifest.targets.map { .init( projectPath: try generatorPaths.resolveSchemeActionProjectPath($0.projectPath), name: $0.targetName ) } - return TuistGraph.BuildAction( + return XcodeGraph.BuildAction( targets: targets, preActions: preActions, postActions: postActions, diff --git a/Sources/TuistLoader/Models+ManifestMappers/BuildConfiguration+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/BuildConfiguration+ManifestMapper.swift index 54d7e0ff852..c24fc864a0e 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/BuildConfiguration+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/BuildConfiguration+ManifestMapper.swift @@ -1,21 +1,21 @@ import Foundation import ProjectDescription import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.BuildConfiguration { - /// Maps a ProjectDescription.Configuration instance into a TuistGraph.BuildConfiguration instance. +extension XcodeGraph.BuildConfiguration { + /// Maps a ProjectDescription.Configuration instance into a XcodeGraph.BuildConfiguration instance. /// - Parameters: /// - manifest: Manifest representation of build configuration model. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.Configuration) -> TuistGraph.BuildConfiguration { - let variant: TuistGraph.BuildConfiguration.Variant + static func from(manifest: ProjectDescription.Configuration) -> XcodeGraph.BuildConfiguration { + let variant: XcodeGraph.BuildConfiguration.Variant switch manifest.variant { case .debug: variant = .debug case .release: variant = .release } - return TuistGraph.BuildConfiguration(name: manifest.name.rawValue, variant: variant) + return XcodeGraph.BuildConfiguration(name: manifest.name.rawValue, variant: variant) } } diff --git a/Sources/TuistLoader/Models+ManifestMappers/BuildRule+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/BuildRule+ManifestMapper.swift index bd825f2df96..dcb870530ac 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/BuildRule+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/BuildRule+ManifestMapper.swift @@ -1,12 +1,12 @@ import Foundation import ProjectDescription -import TuistGraph +import XcodeGraph -extension TuistGraph.BuildRule { +extension XcodeGraph.BuildRule { static func from(manifest: ProjectDescription.BuildRule) -> Self { .init( - compilerSpec: TuistGraph.BuildRule.CompilerSpec.from(manifest: manifest.compilerSpec), - fileType: TuistGraph.BuildRule.FileType.from(manifest: manifest.fileType), + compilerSpec: XcodeGraph.BuildRule.CompilerSpec.from(manifest: manifest.compilerSpec), + fileType: XcodeGraph.BuildRule.FileType.from(manifest: manifest.fileType), filePatterns: manifest.filePatterns, name: manifest.name, outputFiles: manifest.outputFiles, diff --git a/Sources/TuistLoader/Models+ManifestMappers/BuildRule.CompilerSpec+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/BuildRule.CompilerSpec+ManifestMapper.swift index 32fa638ab2d..fb8440044fa 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/BuildRule.CompilerSpec+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/BuildRule.CompilerSpec+ManifestMapper.swift @@ -1,12 +1,12 @@ import Foundation import ProjectDescription -import TuistGraph +import XcodeGraph -extension TuistGraph.BuildRule.CompilerSpec { +extension XcodeGraph.BuildRule.CompilerSpec { // swiftlint:disable function_body_length static func from( manifest: ProjectDescription.BuildRule.CompilerSpec - ) -> TuistGraph.BuildRule.CompilerSpec { + ) -> XcodeGraph.BuildRule.CompilerSpec { switch manifest { case .appIntentsMetadataExtractor: return .appIntentsMetadataExtractor diff --git a/Sources/TuistLoader/Models+ManifestMappers/BuildRule.FileType+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/BuildRule.FileType+ManifestMapper.swift index c09529ff45c..bff1c04a147 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/BuildRule.FileType+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/BuildRule.FileType+ManifestMapper.swift @@ -1,12 +1,12 @@ import Foundation import ProjectDescription -import TuistGraph +import XcodeGraph -extension TuistGraph.BuildRule.FileType { +extension XcodeGraph.BuildRule.FileType { // swiftlint:disable function_body_length static func from( manifest: ProjectDescription.BuildRule.FileType - ) -> TuistGraph.BuildRule.FileType { + ) -> XcodeGraph.BuildRule.FileType { switch manifest { case .instrumentsPackageDefinition: return .instrumentsPackageDefinition diff --git a/Sources/TuistLoader/Models+ManifestMappers/Cache+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Cache+ManifestMapper.swift index e3b977eccad..4fc9db4f41a 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Cache+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Cache+ManifestMapper.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import struct TSCUtility.Version -import TuistGraph import TuistSupport +import XcodeGraph enum CacheProfileError: FatalError, Equatable { case invalidVersion(string: String) diff --git a/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift index 97608f83ba8..f7f4dbd90e5 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph enum CloudManifestMapperError: FatalError { /// Thrown when the cloud URL is invalid. @@ -25,21 +25,21 @@ enum CloudManifestMapperError: FatalError { } } -extension TuistGraph.Cloud { - static func from(manifest: ProjectDescription.Cloud) throws -> TuistGraph.Cloud { +extension XcodeGraph.Cloud { + static func from(manifest: ProjectDescription.Cloud) throws -> XcodeGraph.Cloud { var cloudURL: URL! if let manifestCloudURL = URL(string: manifest.url.dropSuffix("/")) { cloudURL = manifestCloudURL } else { throw CloudManifestMapperError.invalidCloudURL(manifest.url) } - let options = manifest.options.compactMap(TuistGraph.Cloud.Option.from) - return TuistGraph.Cloud(url: cloudURL, projectId: manifest.projectId, options: options) + let options = manifest.options.compactMap(XcodeGraph.Cloud.Option.from) + return XcodeGraph.Cloud(url: cloudURL, projectId: manifest.projectId, options: options) } } -extension TuistGraph.Cloud.Option { - static func from(manifest: ProjectDescription.Cloud.Option) -> TuistGraph.Cloud.Option? { +extension XcodeGraph.Cloud.Option { + static func from(manifest: ProjectDescription.Cloud.Option) -> XcodeGraph.Cloud.Option? { switch manifest { case .optional: return .optional diff --git a/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift index 6155b49b137..dc31358aadd 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift @@ -2,15 +2,15 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.CompatibleXcodeVersions { - /// Maps a ProjectDescription.CompatibleXcodeVersions instance into a TuistGraph.CompatibleXcodeVersions model. +extension XcodeGraph.CompatibleXcodeVersions { + /// Maps a ProjectDescription.CompatibleXcodeVersions instance into a XcodeGraph.CompatibleXcodeVersions model. /// - Parameters: /// - manifest: Manifest representation of compatible Xcode versions. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.CompatibleXcodeVersions) -> TuistGraph.CompatibleXcodeVersions { + static func from(manifest: ProjectDescription.CompatibleXcodeVersions) -> XcodeGraph.CompatibleXcodeVersions { switch manifest { case .all: return .all diff --git a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift index a574ffb6dde..6474038ce5a 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift @@ -3,21 +3,21 @@ import ProjectDescription import TSCBasic import TSCUtility import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.Config { - /// Maps a ProjectDescription.Config instance into a TuistGraph.Config model. +extension XcodeGraph.Config { + /// Maps a ProjectDescription.Config instance into a XcodeGraph.Config model. /// - Parameters: /// - manifest: Manifest representation of Tuist config. /// - path: The path of the config file. - static func from(manifest: ProjectDescription.Config, at path: AbsolutePath) throws -> TuistGraph.Config { + static func from(manifest: ProjectDescription.Config, at path: AbsolutePath) throws -> XcodeGraph.Config { let generatorPaths = GeneratorPaths(manifestDirectory: path) - let generationOptions = try TuistGraph.Config.GenerationOptions.from( + let generationOptions = try XcodeGraph.Config.GenerationOptions.from( manifest: manifest.generationOptions, generatorPaths: generatorPaths ) - let compatibleXcodeVersions = TuistGraph.CompatibleXcodeVersions.from(manifest: manifest.compatibleXcodeVersions) + let compatibleXcodeVersions = XcodeGraph.CompatibleXcodeVersions.from(manifest: manifest.compatibleXcodeVersions) let plugins = try manifest.plugins.map { try PluginLocation.from(manifest: $0, generatorPaths: generatorPaths) } let swiftVersion: TSCUtility.Version? if let configuredVersion = manifest.swiftVersion { @@ -26,12 +26,12 @@ extension TuistGraph.Config { swiftVersion = nil } - var cloud: TuistGraph.Cloud? + var cloud: XcodeGraph.Cloud? if let manifestCloud = manifest.cloud { - cloud = try TuistGraph.Cloud.from(manifest: manifestCloud) + cloud = try XcodeGraph.Cloud.from(manifest: manifestCloud) } - return TuistGraph.Config( + return XcodeGraph.Config( compatibleXcodeVersions: compatibleXcodeVersions, cloud: cloud, swiftVersion: swiftVersion, @@ -42,15 +42,15 @@ extension TuistGraph.Config { } } -extension TuistGraph.Config.GenerationOptions { - /// Maps a ProjectDescription.Config.GenerationOptions instance into a TuistGraph.Config.GenerationOptions model. +extension XcodeGraph.Config.GenerationOptions { + /// Maps a ProjectDescription.Config.GenerationOptions instance into a XcodeGraph.Config.GenerationOptions model. /// - Parameters: /// - manifest: Manifest representation of Tuist config generation options /// - generatorPaths: Generator paths static func from( manifest: ProjectDescription.Config.GenerationOptions, generatorPaths: GeneratorPaths - ) throws -> TuistGraph.Config.GenerationOptions { + ) throws -> XcodeGraph.Config.GenerationOptions { let clonedSourcePackagesDirPath: AbsolutePath? = try { if let path = manifest.clonedSourcePackagesDirPath { return try generatorPaths.resolve(path: path) @@ -62,7 +62,7 @@ extension TuistGraph.Config.GenerationOptions { resolveDependenciesWithSystemScm: manifest.resolveDependenciesWithSystemScm, disablePackageVersionLocking: manifest.disablePackageVersionLocking, clonedSourcePackagesDirPath: clonedSourcePackagesDirPath, - staticSideEffectsWarningTargets: TuistGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets + staticSideEffectsWarningTargets: XcodeGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets .from(manifest: manifest.staticSideEffectsWarningTargets), enforceExplicitDependencies: manifest.enforceExplicitDependencies, defaultConfiguration: manifest.defaultConfiguration @@ -70,14 +70,14 @@ extension TuistGraph.Config.GenerationOptions { } } -extension TuistGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets { +extension XcodeGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets { /// Maps a ProjectDescription.Config.GenerationOptions.StaticSideEffectsWarningTargets instance into a - /// TuistGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets model. + /// XcodeGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets model. /// - Parameters: /// - manifest: Manifest representation of Tuist config static side effects warning targets option static func from( manifest: ProjectDescription.Config.GenerationOptions.StaticSideEffectsWarningTargets - ) -> TuistGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets { + ) -> XcodeGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets { switch manifest { case .all: return .all case .none: return .none diff --git a/Sources/TuistLoader/Models+ManifestMappers/Configuration+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Configuration+ManifestMapper.swift index d05be996ff5..dba6676649b 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Configuration+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Configuration+ManifestMapper.swift @@ -2,20 +2,20 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.Configuration { - /// Maps a ProjectDescription.Configuration instance into a TuistGraph.Configuration instance. +extension XcodeGraph.Configuration { + /// Maps a ProjectDescription.Configuration instance into a XcodeGraph.Configuration instance. /// - Parameters: /// - manifest: Manifest representation of configuration. /// - generatorPaths: Generator paths. static func from( manifest: ProjectDescription.Configuration?, generatorPaths: GeneratorPaths - ) throws -> TuistGraph.Configuration? { + ) throws -> XcodeGraph.Configuration? { guard let manifest else { return nil } - let settings = manifest.settings.mapValues(TuistGraph.SettingValue.from) + let settings = manifest.settings.mapValues(XcodeGraph.SettingValue.from) let xcconfig = try manifest.xcconfig.flatMap { try generatorPaths.resolve(path: $0) } return Configuration(settings: settings, xcconfig: xcconfig) } diff --git a/Sources/TuistLoader/Models+ManifestMappers/CopyFileElement+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/CopyFileElement+ManifestMapper.swift index 8b3d4892fce..a1b73a6df50 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/CopyFileElement+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/CopyFileElement+ManifestMapper.swift @@ -2,11 +2,11 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.CopyFileElement { - /// Maps a ProjectDescription.FileElement instance into a [TuistGraph.FileElement] instance. +extension XcodeGraph.CopyFileElement { + /// Maps a ProjectDescription.FileElement instance into a [XcodeGraph.FileElement] instance. /// Glob patterns in file elements are unfolded as part of the mapping. /// - Parameters: /// - manifest: Manifest representation of the file element. @@ -15,7 +15,7 @@ extension TuistGraph.CopyFileElement { manifest: ProjectDescription.CopyFileElement, generatorPaths: GeneratorPaths, includeFiles: @escaping (AbsolutePath) -> Bool = { _ in true } - ) throws -> [TuistGraph.CopyFileElement] { + ) throws -> [XcodeGraph.CopyFileElement] { func globFiles(_ path: AbsolutePath) throws -> [AbsolutePath] { if FileHandler.shared.exists(path), !FileHandler.shared.isFolder(path) { return [path] } diff --git a/Sources/TuistLoader/Models+ManifestMappers/CopyFilesAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/CopyFilesAction+ManifestMapper.swift index 512c42067fd..4657e25dde2 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/CopyFilesAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/CopyFilesAction+ManifestMapper.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph public enum CopyFilesManifestMapperError: FatalError { case invalidResourcesGlob(actionName: String, invalidGlobs: [InvalidGlob]) @@ -19,21 +19,21 @@ public enum CopyFilesManifestMapperError: FatalError { } } -extension TuistGraph.CopyFilesAction { - /// Maps a ProjectDescription.CopyFilesAction instance into a TuistGraph.CopyFilesAction instance. +extension XcodeGraph.CopyFilesAction { + /// Maps a ProjectDescription.CopyFilesAction instance into a XcodeGraph.CopyFilesAction instance. /// - Parameters: /// - manifest: Manifest representation of platform model. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.CopyFilesAction, generatorPaths: GeneratorPaths) throws -> TuistGraph + static func from(manifest: ProjectDescription.CopyFilesAction, generatorPaths: GeneratorPaths) throws -> XcodeGraph .CopyFilesAction { var invalidResourceGlobs: [InvalidGlob] = [] - let files: [TuistGraph.CopyFileElement] = try manifest.files.flatMap { manifest -> [TuistGraph.CopyFileElement] in + let files: [XcodeGraph.CopyFileElement] = try manifest.files.flatMap { manifest -> [XcodeGraph.CopyFileElement] in do { - let files = try TuistGraph.CopyFileElement.from( + let files = try XcodeGraph.CopyFileElement.from( manifest: manifest, generatorPaths: generatorPaths, - includeFiles: { TuistGraph.Target.isResource(path: $0) } + includeFiles: { XcodeGraph.Target.isResource(path: $0) } ) return files.cleanPackages() } catch let GlobError.nonExistentDirectory(invalidGlob) { @@ -46,20 +46,20 @@ extension TuistGraph.CopyFilesAction { throw CopyFilesManifestMapperError.invalidResourcesGlob(actionName: manifest.name, invalidGlobs: invalidResourceGlobs) } - return TuistGraph.CopyFilesAction( + return XcodeGraph.CopyFilesAction( name: manifest.name, - destination: TuistGraph.CopyFilesAction.Destination.from(manifest: manifest.destination), + destination: XcodeGraph.CopyFilesAction.Destination.from(manifest: manifest.destination), subpath: manifest.subpath, files: files ) } } -extension TuistGraph.CopyFilesAction.Destination { - /// Maps a ProjectDescription.TargetAction.Destination instance into a TuistGraph.TargetAction.Destination model. +extension XcodeGraph.CopyFilesAction.Destination { + /// Maps a ProjectDescription.TargetAction.Destination instance into a XcodeGraph.TargetAction.Destination model. /// - Parameters: /// - manifest: Manifest representation of target action destination. - static func from(manifest: ProjectDescription.CopyFilesAction.Destination) -> TuistGraph.CopyFilesAction.Destination { + static func from(manifest: ProjectDescription.CopyFilesAction.Destination) -> XcodeGraph.CopyFilesAction.Destination { switch manifest { case .absolutePath: return .absolutePath @@ -89,7 +89,7 @@ extension TuistGraph.CopyFilesAction.Destination { // MARK: - Array Extension FileElement -extension [TuistGraph.CopyFileElement] { +extension [XcodeGraph.CopyFileElement] { /// Packages should be added as a whole folder not individually. /// (e.g. bundled file formats recognized by the OS like .pages, .numbers, .rtfd...) /// diff --git a/Sources/TuistLoader/Models+ManifestMappers/CoreDataModel+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/CoreDataModel+ManifestMapper.swift index f953e4dccff..18f64b44c65 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/CoreDataModel+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/CoreDataModel+ManifestMapper.swift @@ -2,15 +2,15 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.CoreDataModel { - /// Maps a ProjectDescription.CoreDataModel instance into a TuistGraph.CoreDataModel instance. +extension XcodeGraph.CoreDataModel { + /// Maps a ProjectDescription.CoreDataModel instance into a XcodeGraph.CoreDataModel instance. /// - Parameters: /// - manifest: Manifest representation of Core Data model. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.CoreDataModel, generatorPaths: GeneratorPaths) throws -> TuistGraph + static func from(manifest: ProjectDescription.CoreDataModel, generatorPaths: GeneratorPaths) throws -> XcodeGraph .CoreDataModel { let modelPath = try generatorPaths.resolve(path: manifest.path) @@ -30,11 +30,11 @@ extension TuistGraph.CoreDataModel { } } -extension TuistGraph.CoreDataModel { - /// Maps a `.xcdatamodeld` package into a TuistGraph.CoreDataModel instance. +extension XcodeGraph.CoreDataModel { + /// Maps a `.xcdatamodeld` package into a XcodeGraph.CoreDataModel instance. /// - Parameters: /// - path: The path for a `.xcdatamodeld` package. - static func from(path modelPath: AbsolutePath) throws -> TuistGraph.CoreDataModel { + static func from(path modelPath: AbsolutePath) throws -> XcodeGraph.CoreDataModel { let versions = FileHandler.shared.glob(modelPath, glob: "*.xcdatamodel") let currentVersion: String = try { if CoreDataVersionExtractor.isVersioned(at: modelPath) { diff --git a/Sources/TuistLoader/Models+ManifestMappers/DefaultSettings+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/DefaultSettings+ManifestMapper.swift index 07f1380602a..3ee6084f426 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/DefaultSettings+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/DefaultSettings+ManifestMapper.swift @@ -2,15 +2,15 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.DefaultSettings { - /// Maps a ProjectDescription.DefaultSettings instance into a TuistGraph.DefaultSettings model. +extension XcodeGraph.DefaultSettings { + /// Maps a ProjectDescription.DefaultSettings instance into a XcodeGraph.DefaultSettings model. /// - Parameters: /// - manifest: Manifest representation of default settings. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.DefaultSettings) -> TuistGraph.DefaultSettings { + static func from(manifest: ProjectDescription.DefaultSettings) -> XcodeGraph.DefaultSettings { switch manifest { case let .recommended(excludedKeys): return .recommended(excluding: excludedKeys) diff --git a/Sources/TuistLoader/Models+ManifestMappers/DeploymentTargets+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/DeploymentTargets+ManifestMapper.swift index e1c36ee62de..0318590c1eb 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/DeploymentTargets+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/DeploymentTargets+ManifestMapper.swift @@ -1,14 +1,14 @@ import Foundation import ProjectDescription import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.DeploymentTargets { - /// Maps a ProjectDescription.DeploymentTargets instance into a TuistGraph.DeploymentTarget instance. +extension XcodeGraph.DeploymentTargets { + /// Maps a ProjectDescription.DeploymentTargets instance into a XcodeGraph.DeploymentTarget instance. /// - Parameters: /// - manifest: Manifest representation of deployment target model. - static func from(manifest: ProjectDescription.DeploymentTargets) -> TuistGraph.DeploymentTargets { - TuistGraph.DeploymentTargets( + static func from(manifest: ProjectDescription.DeploymentTargets) -> XcodeGraph.DeploymentTargets { + XcodeGraph.DeploymentTargets( iOS: manifest.iOS, macOS: manifest.macOS, watchOS: manifest.watchOS, diff --git a/Sources/TuistLoader/Models+ManifestMappers/Destination+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Destination+ManifestMapper.swift index bb15ec48933..389e1bd0a6b 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Destination+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Destination+ManifestMapper.swift @@ -1,16 +1,16 @@ import Foundation import ProjectDescription -import TuistGraph +import XcodeGraph -extension TuistGraph.Destination { - /// Maps a ProjectDescription.Package instance into a TuistGraph.Package model. +extension XcodeGraph.Destination { + /// Maps a ProjectDescription.Package instance into a XcodeGraph.Package model. /// - Parameters: /// - manifest: Manifest representation of Package. /// - generatorPaths: Generator paths. static func from( destinations: ProjectDescription.Destinations - ) throws -> TuistGraph.Destinations { - let mappedDestinations: [TuistGraph.Destination] = destinations.map { destination in + ) throws -> XcodeGraph.Destinations { + let mappedDestinations: [XcodeGraph.Destination] = destinations.map { destination in switch destination { case .iPhone: return .iPhone diff --git a/Sources/TuistLoader/Models+ManifestMappers/Entitlements+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Entitlements+ManifestMapper.swift index c5260ea4621..13bcd6d9a5f 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Entitlements+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Entitlements+ManifestMapper.swift @@ -2,14 +2,14 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.Entitlements { - /// Maps a ProjectDescription.Entitlements instance into a TuistGraph.Entitlements instance. +extension XcodeGraph.Entitlements { + /// Maps a ProjectDescription.Entitlements instance into a XcodeGraph.Entitlements instance. /// - Parameters: /// - manifest: Manifest representation of the Entitlements model. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.Entitlements?, generatorPaths: GeneratorPaths) throws -> TuistGraph + static func from(manifest: ProjectDescription.Entitlements?, generatorPaths: GeneratorPaths) throws -> XcodeGraph .Entitlements? { switch manifest { @@ -17,7 +17,7 @@ extension TuistGraph.Entitlements { return .file(path: try generatorPaths.resolve(path: infoplistPath)) case let .dictionary(dictionary): return .dictionary( - dictionary.mapValues { TuistGraph.Plist.Value.from(manifest: $0) } + dictionary.mapValues { XcodeGraph.Plist.Value.from(manifest: $0) } ) case let .variable(setting): return .variable(setting) diff --git a/Sources/TuistLoader/Models+ManifestMappers/EnvironmentVariable+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/EnvironmentVariable+ManifestMapper.swift index c710fe3789f..948d909b4d0 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/EnvironmentVariable+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/EnvironmentVariable+ManifestMapper.swift @@ -1,13 +1,13 @@ import Foundation import ProjectDescription import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.EnvironmentVariable { - /// Maps a ProjectDescription.EnvironmentVariable instance into a TuistGraph.EnvironmentVariable instance. +extension XcodeGraph.EnvironmentVariable { + /// Maps a ProjectDescription.EnvironmentVariable instance into a XcodeGraph.EnvironmentVariable instance. /// - Parameters: /// - manifest: Manifest representation of environment variable model. - static func from(manifest: ProjectDescription.EnvironmentVariable) -> TuistGraph.EnvironmentVariable { + static func from(manifest: ProjectDescription.EnvironmentVariable) -> XcodeGraph.EnvironmentVariable { EnvironmentVariable(value: manifest.value, isEnabled: manifest.isEnabled) } } diff --git a/Sources/TuistLoader/Models+ManifestMappers/ExecutionAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ExecutionAction+ManifestMapper.swift index 4b04bdc7d3d..f37ded268cc 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/ExecutionAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/ExecutionAction+ManifestMapper.swift @@ -1,17 +1,17 @@ import Foundation import ProjectDescription import TSCBasic -import TuistGraph +import XcodeGraph -extension TuistGraph.ExecutionAction { - /// Maps a ProjectDescription.ExecutionAction instance into a TuistGraph.ExecutionAction instance. +extension XcodeGraph.ExecutionAction { + /// Maps a ProjectDescription.ExecutionAction instance into a XcodeGraph.ExecutionAction instance. /// - Parameters: /// - manifest: Manifest representation of execution action model. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.ExecutionAction, generatorPaths: GeneratorPaths) throws -> TuistGraph + static func from(manifest: ProjectDescription.ExecutionAction, generatorPaths: GeneratorPaths) throws -> XcodeGraph .ExecutionAction { - let targetReference: TuistGraph.TargetReference? = try manifest.target.map { + let targetReference: XcodeGraph.TargetReference? = try manifest.target.map { .init( projectPath: try generatorPaths.resolveSchemeActionProjectPath($0.projectPath), name: $0.targetName diff --git a/Sources/TuistLoader/Models+ManifestMappers/FileCodeGen+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/FileCodeGen+ManifestMapper.swift index ff1192af603..77c3cec438f 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/FileCodeGen+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/FileCodeGen+ManifestMapper.swift @@ -2,11 +2,11 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.FileCodeGen { - static func from(manifest: ProjectDescription.FileCodeGen) -> TuistGraph.FileCodeGen { +extension XcodeGraph.FileCodeGen { + static func from(manifest: ProjectDescription.FileCodeGen) -> XcodeGraph.FileCodeGen { switch manifest { case .public: return .public diff --git a/Sources/TuistLoader/Models+ManifestMappers/FileElement+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/FileElement+ManifestMapper.swift index 2501c03c573..542fb5e2914 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/FileElement+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/FileElement+ManifestMapper.swift @@ -2,11 +2,11 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.FileElement { - /// Maps a ProjectDescription.FileElement instance into a [TuistGraph.FileElement] instance. +extension XcodeGraph.FileElement { + /// Maps a ProjectDescription.FileElement instance into a [XcodeGraph.FileElement] instance. /// Glob patterns in file elements are unfolded as part of the mapping. /// - Parameters: /// - manifest: Manifest representation of the file element. @@ -15,7 +15,7 @@ extension TuistGraph.FileElement { manifest: ProjectDescription.FileElement, generatorPaths: GeneratorPaths, includeFiles: @escaping (AbsolutePath) -> Bool = { _ in true } - ) throws -> [TuistGraph.FileElement] { + ) throws -> [XcodeGraph.FileElement] { func globFiles(_ path: AbsolutePath) throws -> [AbsolutePath] { if FileHandler.shared.exists(path), !FileHandler.shared.isFolder(path) { return [path] } diff --git a/Sources/TuistLoader/Models+ManifestMappers/FrameworkStatus+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/FrameworkStatus+ManifestMapper.swift index bc466de8f40..bf3ee45d7db 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/FrameworkStatus+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/FrameworkStatus+ManifestMapper.swift @@ -1,13 +1,13 @@ import Foundation import ProjectDescription import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.FrameworkStatus { - /// Maps a ProjectDescription.FrameworkStatus instance into a TuistGraph.FrameworkStatus instance. +extension XcodeGraph.FrameworkStatus { + /// Maps a ProjectDescription.FrameworkStatus instance into a XcodeGraph.FrameworkStatus instance. /// - Parameters: /// - manifest: Manifest representation of the framework status model. - static func from(manifest: ProjectDescription.FrameworkStatus) -> TuistGraph.FrameworkStatus { + static func from(manifest: ProjectDescription.FrameworkStatus) -> XcodeGraph.FrameworkStatus { switch manifest { case .required: return .required diff --git a/Sources/TuistLoader/Models+ManifestMappers/Headers+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Headers+ManifestMapper.swift index d960f455b78..59c9a5e51d5 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Headers+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Headers+ManifestMapper.swift @@ -2,11 +2,11 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.Headers { - /// Maps a ProjectDescription.Headers instance into a TuistGraph.Headers model. +extension XcodeGraph.Headers { + /// Maps a ProjectDescription.Headers instance into a XcodeGraph.Headers model. /// Glob patterns are resolved as part of the mapping process. /// - Parameters: /// - manifest: Manifest representation of Headers. @@ -16,7 +16,7 @@ extension TuistGraph.Headers { manifest: ProjectDescription.Headers, generatorPaths: GeneratorPaths, productName: String? - ) throws -> TuistGraph.Headers { + ) throws -> XcodeGraph.Headers { let resolvedUmbrellaPath = try manifest.umbrellaHeader.map { try generatorPaths.resolve(path: $0) } let headersFromUmbrella = try resolvedUmbrellaPath.map { Set(try UmbrellaHeaderHeadersExtractor.headers(from: $0, for: productName)) @@ -27,7 +27,7 @@ extension TuistGraph.Headers { let privateHeaders: [AbsolutePath] let projectHeaders: [AbsolutePath] - let allowedExtensions = TuistGraph.Headers.extensions + let allowedExtensions = XcodeGraph.Headers.extensions func unfold( _ list: FileList?, isPublic: Bool = false diff --git a/Sources/TuistLoader/Models+ManifestMappers/IDETemplateMacros+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/IDETemplateMacros+ManifestMapper.swift index a3045d9cb8b..8462acfa5ea 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/IDETemplateMacros+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/IDETemplateMacros+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation import ProjectDescription -import TuistGraph +import XcodeGraph extension IDETemplateMacros { static func from( diff --git a/Sources/TuistLoader/Models+ManifestMappers/InfoPlist+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/InfoPlist+ManifestMapper.swift index 2a800df11f1..846314ee28d 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/InfoPlist+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/InfoPlist+ManifestMapper.swift @@ -2,25 +2,25 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.InfoPlist { - /// Maps a ProjectDescription.InfoPlist instance into a TuistGraph.InfoPlist instance. +extension XcodeGraph.InfoPlist { + /// Maps a ProjectDescription.InfoPlist instance into a XcodeGraph.InfoPlist instance. /// - Parameters: /// - manifest: Manifest representation of the Info plist model. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.InfoPlist?, generatorPaths: GeneratorPaths) throws -> TuistGraph.InfoPlist? { + static func from(manifest: ProjectDescription.InfoPlist?, generatorPaths: GeneratorPaths) throws -> XcodeGraph.InfoPlist? { switch manifest { case let .file(infoplistPath): return .file(path: try generatorPaths.resolve(path: infoplistPath)) case let .dictionary(dictionary): return .dictionary( - dictionary.mapValues { TuistGraph.Plist.Value.from(manifest: $0) } + dictionary.mapValues { XcodeGraph.Plist.Value.from(manifest: $0) } ) case let .extendingDefault(dictionary): return .extendingDefault( with: - dictionary.mapValues { TuistGraph.Plist.Value.from(manifest: $0) } + dictionary.mapValues { XcodeGraph.Plist.Value.from(manifest: $0) } ) case .none: return .none diff --git a/Sources/TuistLoader/Models+ManifestMappers/LaunchArgument+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/LaunchArgument+ManifestMapper.swift index 978b4bd49b1..3fc8daf8336 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/LaunchArgument+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/LaunchArgument+ManifestMapper.swift @@ -1,13 +1,13 @@ import Foundation import ProjectDescription import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.LaunchArgument { - /// Maps a ProjectDescription.LaunchArgument instance into a TuistGraph.LaunchArgument instance. +extension XcodeGraph.LaunchArgument { + /// Maps a ProjectDescription.LaunchArgument instance into a XcodeGraph.LaunchArgument instance. /// - Parameters: /// - manifest: Manifest representation of launch argument model. - static func from(manifest: ProjectDescription.LaunchArgument) -> TuistGraph.LaunchArgument { + static func from(manifest: ProjectDescription.LaunchArgument) -> XcodeGraph.LaunchArgument { LaunchArgument(name: manifest.name, isEnabled: manifest.isEnabled) } } diff --git a/Sources/TuistLoader/Models+ManifestMappers/LaunchStyle+ManifestMappers.swift b/Sources/TuistLoader/Models+ManifestMappers/LaunchStyle+ManifestMappers.swift index 9a8e97f6cc6..374b8d9cb91 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/LaunchStyle+ManifestMappers.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/LaunchStyle+ManifestMappers.swift @@ -1,11 +1,11 @@ import ProjectDescription -import TuistGraph +import XcodeGraph -extension TuistGraph.LaunchStyle { - /// Maps a ProjectDescription.LaunchStyle instance into a TuistGraph.LaunchStyle model. +extension XcodeGraph.LaunchStyle { + /// Maps a ProjectDescription.LaunchStyle instance into a XcodeGraph.LaunchStyle model. /// - Parameters: /// - manifest: Manifest representation of LaunchStyle. - static func from(manifest: ProjectDescription.LaunchStyle) -> TuistGraph.LaunchStyle { + static func from(manifest: ProjectDescription.LaunchStyle) -> XcodeGraph.LaunchStyle { switch manifest { case .automatically: return .automatically diff --git a/Sources/TuistLoader/Models+ManifestMappers/MergedBinaryType+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/MergedBinaryType+ManifestMapper.swift index 5281ef03b3a..70564ca10ef 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/MergedBinaryType+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/MergedBinaryType+ManifestMapper.swift @@ -1,11 +1,11 @@ import ProjectDescription -import TuistGraph +import XcodeGraph -extension TuistGraph.MergedBinaryType { - /// Maps a ProjectDescription.MergedBinaryType instance into a TuistGraph.MergedBinaryType model. +extension XcodeGraph.MergedBinaryType { + /// Maps a ProjectDescription.MergedBinaryType instance into a XcodeGraph.MergedBinaryType model. /// - Parameters: /// - manifest: Manifest representation of Package. - static func from(manifest: ProjectDescription.MergedBinaryType) throws -> TuistGraph.MergedBinaryType { + static func from(manifest: ProjectDescription.MergedBinaryType) throws -> XcodeGraph.MergedBinaryType { switch manifest { case .automatic: return .automatic diff --git a/Sources/TuistLoader/Models+ManifestMappers/Package+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Package+ManifestMapper.swift index 14c2f9e69c2..3c8632d5f28 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Package+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Package+ManifestMapper.swift @@ -2,15 +2,15 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.Package { - /// Maps a ProjectDescription.Package instance into a TuistGraph.Package model. +extension XcodeGraph.Package { + /// Maps a ProjectDescription.Package instance into a XcodeGraph.Package model. /// - Parameters: /// - manifest: Manifest representation of Package. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.Package, generatorPaths: GeneratorPaths) throws -> TuistGraph.Package { + static func from(manifest: ProjectDescription.Package, generatorPaths: GeneratorPaths) throws -> XcodeGraph.Package { switch manifest { case let .local(path: local): return .local(path: try generatorPaths.resolve(path: local)) @@ -20,12 +20,12 @@ extension TuistGraph.Package { } } -extension TuistGraph.Requirement { - /// Maps a ProjectDescription.Package.Requirement instance into a TuistGraph.Package.Requirement model. +extension XcodeGraph.Requirement { + /// Maps a ProjectDescription.Package.Requirement instance into a XcodeGraph.Package.Requirement model. /// - Parameters: /// - manifest: Manifest representation of Package. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.Package.Requirement) -> TuistGraph.Requirement { + static func from(manifest: ProjectDescription.Package.Requirement) -> XcodeGraph.Requirement { switch manifest { case let .branch(branch): return .branch(branch) diff --git a/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift index e2424d457d6..e9306a9bf05 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift @@ -3,22 +3,22 @@ import ProjectDescription import TSCBasic import TSCUtility import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.PackageSettings { - /// Creates `TuistGraph.PackageSettings` instance from `ProjectDescription.PackageSettings` +extension XcodeGraph.PackageSettings { + /// Creates `XcodeGraph.PackageSettings` instance from `ProjectDescription.PackageSettings` /// instance. static func from( manifest: ProjectDescription.PackageSettings, generatorPaths: GeneratorPaths, swiftToolsVersion: TSCUtility.Version ) throws -> Self { - let productTypes = manifest.productTypes.mapValues { TuistGraph.Product.from(manifest: $0) } - let productDestinations = try manifest.productDestinations.mapValues { try TuistGraph.Destination.from(destinations: $0) } - let baseSettings = try TuistGraph.Settings.from(manifest: manifest.baseSettings, generatorPaths: generatorPaths) - let targetSettings = manifest.targetSettings.mapValues { TuistGraph.SettingsDictionary.from(manifest: $0) } - let projectOptions: [String: TuistGraph.Project.Options] = manifest + let productTypes = manifest.productTypes.mapValues { XcodeGraph.Product.from(manifest: $0) } + let productDestinations = try manifest.productDestinations.mapValues { try XcodeGraph.Destination.from(destinations: $0) } + let baseSettings = try XcodeGraph.Settings.from(manifest: manifest.baseSettings, generatorPaths: generatorPaths) + let targetSettings = manifest.targetSettings.mapValues { XcodeGraph.SettingsDictionary.from(manifest: $0) } + let projectOptions: [String: XcodeGraph.Project.Options] = manifest .projectOptions .mapValues { .from(manifest: $0) } diff --git a/Sources/TuistLoader/Models+ManifestMappers/Platform+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Platform+ManifestMapper.swift index ccb87b0a8a0..ef826eda7ec 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Platform+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Platform+ManifestMapper.swift @@ -1,13 +1,13 @@ import Foundation import ProjectDescription -import TuistGraph +import XcodeGraph -extension TuistGraph.Platform { - /// Maps a ProjectDescription.Platform instance into a TuistGraph.Platform instance. +extension XcodeGraph.Platform { + /// Maps a ProjectDescription.Platform instance into a XcodeGraph.Platform instance. /// - Parameters: /// - manifest: Manifest representation of platform model. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.Platform) throws -> TuistGraph.Platform { + static func from(manifest: ProjectDescription.Platform) throws -> XcodeGraph.Platform { switch manifest { case .macOS: return .macOS @@ -23,12 +23,12 @@ extension TuistGraph.Platform { } } -extension TuistGraph.PackagePlatform { - /// Maps a ProjectDescription.Platform instance into a TuistGraph.Platform instance. +extension XcodeGraph.PackagePlatform { + /// Maps a ProjectDescription.Platform instance into a XcodeGraph.Platform instance. /// - Parameters: /// - manifest: Manifest representation of platform model. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.PackagePlatform) throws -> TuistGraph.PackagePlatform { + static func from(manifest: ProjectDescription.PackagePlatform) throws -> XcodeGraph.PackagePlatform { switch manifest { case .macOS: return .macOS diff --git a/Sources/TuistLoader/Models+ManifestMappers/Plist+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Plist+ManifestMapper.swift index 69526b66bef..2af554b8f8b 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Plist+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Plist+ManifestMapper.swift @@ -2,14 +2,14 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.Plist.Value { - /// Maps a ProjectDescription.Plist.Value instance into a TuistGraph.Plist.Value instance. +extension XcodeGraph.Plist.Value { + /// Maps a ProjectDescription.Plist.Value instance into a XcodeGraph.Plist.Value instance. /// - Parameters: /// - manifest: Manifest representation of the Info plist value model. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.Plist.Value) -> TuistGraph.Plist.Value { + static func from(manifest: ProjectDescription.Plist.Value) -> XcodeGraph.Plist.Value { switch manifest { case let .string(value): return .string(value) @@ -20,9 +20,9 @@ extension TuistGraph.Plist.Value { case let .real(value): return .real(value) case let .array(value): - return .array(value.map { TuistGraph.Plist.Value.from(manifest: $0) }) + return .array(value.map { XcodeGraph.Plist.Value.from(manifest: $0) }) case let .dictionary(value): - return .dictionary(value.mapValues { TuistGraph.Plist.Value.from(manifest: $0) }) + return .dictionary(value.mapValues { XcodeGraph.Plist.Value.from(manifest: $0) }) } } } diff --git a/Sources/TuistLoader/Models+ManifestMappers/PluginLocation+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/PluginLocation+ManifestMapper.swift index c8dfbda645a..3069aedf71c 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/PluginLocation+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/PluginLocation+ManifestMapper.swift @@ -1,13 +1,13 @@ import Foundation import ProjectDescription -import TuistGraph +import XcodeGraph -extension TuistGraph.PluginLocation { - /// Convert from `ProjectDescription.PluginLocation` to `TuistGraph.PluginLocation` +extension XcodeGraph.PluginLocation { + /// Convert from `ProjectDescription.PluginLocation` to `XcodeGraph.PluginLocation` static func from( manifest: ProjectDescription.PluginLocation, generatorPaths: GeneratorPaths - ) throws -> TuistGraph.PluginLocation { + ) throws -> XcodeGraph.PluginLocation { switch manifest.type { case let .local(path): return .local(path: try generatorPaths.resolve(path: path).pathString) diff --git a/Sources/TuistLoader/Models+ManifestMappers/Product+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Product+ManifestMapper.swift index 7290d7e0c4d..50629860c55 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Product+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Product+ManifestMapper.swift @@ -1,9 +1,9 @@ import Foundation import ProjectDescription -import TuistGraph +import XcodeGraph -extension TuistGraph.Product { - static func from(manifest: ProjectDescription.Product) -> TuistGraph.Product { +extension XcodeGraph.Product { + static func from(manifest: ProjectDescription.Product) -> XcodeGraph.Product { switch manifest { case .app: return .app diff --git a/Sources/TuistLoader/Models+ManifestMappers/ProfileAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ProfileAction+ManifestMapper.swift index 751cd536e28..e077e933d74 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/ProfileAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/ProfileAction+ManifestMapper.swift @@ -1,32 +1,32 @@ import Foundation import ProjectDescription import TSCBasic -import TuistGraph +import XcodeGraph -extension TuistGraph.ProfileAction { +extension XcodeGraph.ProfileAction { static func from( manifest: ProjectDescription.ProfileAction, generatorPaths: GeneratorPaths - ) throws -> TuistGraph.ProfileAction { + ) throws -> XcodeGraph.ProfileAction { let configurationName = manifest.configuration.rawValue let preActions = try manifest.preActions.map { - try TuistGraph.ExecutionAction.from( + try XcodeGraph.ExecutionAction.from( manifest: $0, generatorPaths: generatorPaths ) } let postActions = try manifest.postActions.map { - try TuistGraph.ExecutionAction.from( + try XcodeGraph.ExecutionAction.from( manifest: $0, generatorPaths: generatorPaths ) } - let arguments = manifest.arguments.map { TuistGraph.Arguments.from(manifest: $0) } + let arguments = manifest.arguments.map { XcodeGraph.Arguments.from(manifest: $0) } - var executableResolved: TuistGraph.TargetReference? + var executableResolved: XcodeGraph.TargetReference? if let executable = manifest.executable { executableResolved = TargetReference( projectPath: try generatorPaths.resolveSchemeActionProjectPath(executable.projectPath), diff --git a/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift index 1240e461ffd..66aec60679b 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift @@ -1,10 +1,10 @@ import Foundation import ProjectDescription import TSCBasic -import TuistGraph +import XcodeGraph -extension TuistGraph.Project { - /// Maps a `ProjectDescription.Project` instance into a `TuistGraph.Project` instance. +extension XcodeGraph.Project { + /// Maps a `ProjectDescription.Project` instance into a `XcodeGraph.Project` instance. /// Glob patterns in file elements are unfolded as part of the mapping. /// - Parameters: /// - manifest: Manifest representation of the file element. @@ -17,34 +17,34 @@ extension TuistGraph.Project { manifest: ProjectDescription.Project, generatorPaths: GeneratorPaths, plugins: Plugins, - externalDependencies: [String: [TuistGraph.TargetDependency]], + externalDependencies: [String: [XcodeGraph.TargetDependency]], resourceSynthesizerPathLocator: ResourceSynthesizerPathLocating, isExternal: Bool - ) throws -> TuistGraph.Project { + ) throws -> XcodeGraph.Project { let name = manifest.name let xcodeProjectName = manifest.options.xcodeProjectName ?? name let organizationName = manifest.organizationName let defaultKnownRegions = manifest.options.defaultKnownRegions let developmentRegion = manifest.options.developmentRegion - let options = TuistGraph.Project.Options.from(manifest: manifest.options) - let settings = try manifest.settings.map { try TuistGraph.Settings.from(manifest: $0, generatorPaths: generatorPaths) } + let options = XcodeGraph.Project.Options.from(manifest: manifest.options) + let settings = try manifest.settings.map { try XcodeGraph.Settings.from(manifest: $0, generatorPaths: generatorPaths) } let targets = try manifest.targets.map { - try TuistGraph.Target.from( + try XcodeGraph.Target.from( manifest: $0, generatorPaths: generatorPaths, externalDependencies: externalDependencies ) } - let schemes = try manifest.schemes.map { try TuistGraph.Scheme.from(manifest: $0, generatorPaths: generatorPaths) } + let schemes = try manifest.schemes.map { try XcodeGraph.Scheme.from(manifest: $0, generatorPaths: generatorPaths) } let additionalFiles = try manifest.additionalFiles - .flatMap { try TuistGraph.FileElement.from(manifest: $0, generatorPaths: generatorPaths) } - let packages = try manifest.packages.map { try TuistGraph.Package.from(manifest: $0, generatorPaths: generatorPaths) } + .flatMap { try XcodeGraph.FileElement.from(manifest: $0, generatorPaths: generatorPaths) } + let packages = try manifest.packages.map { try XcodeGraph.Package.from(manifest: $0, generatorPaths: generatorPaths) } let ideTemplateMacros = try manifest.fileHeaderTemplate .map { try IDETemplateMacros.from(manifest: $0, generatorPaths: generatorPaths) } let resourceSynthesizers = try manifest.resourceSynthesizers.map { - try TuistGraph.ResourceSynthesizer.from( + try XcodeGraph.ResourceSynthesizer.from( manifest: $0, generatorPaths: generatorPaths, plugins: plugins, diff --git a/Sources/TuistLoader/Models+ManifestMappers/ProjectOption+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ProjectOption+ManifestMapper.swift index 0241cba9608..5589e0c45cf 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/ProjectOption+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/ProjectOption+ManifestMapper.swift @@ -1,8 +1,8 @@ import ProjectDescription -import TuistGraph +import XcodeGraph -extension TuistGraph.Project.Options { - /// Maps a ProjectDescription.ProjectOption instance into a TuistGraph.ProjectOption instance. +extension XcodeGraph.Project.Options { + /// Maps a ProjectDescription.ProjectOption instance into a XcodeGraph.ProjectOption instance. /// - Parameters: /// - manifest: Manifest representation of project options. static func from(manifest: ProjectDescription.Project.Options) -> Self { @@ -21,7 +21,7 @@ extension TuistGraph.Project.Options { } } -extension TuistGraph.Project.Options.AutomaticSchemesOptions { +extension XcodeGraph.Project.Options.AutomaticSchemesOptions { static func from( manifest: ProjectDescription.Project.Options.AutomaticSchemesOptions ) -> Self { @@ -52,7 +52,7 @@ extension TuistGraph.Project.Options.AutomaticSchemesOptions { } } -extension TuistGraph.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping { +extension XcodeGraph.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping { static func from( manifest: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping ) -> Self { diff --git a/Sources/TuistLoader/Models+ManifestMappers/ProjectOption+ToManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ProjectOption+ToManifestMapper.swift index 6b80e1cfd51..dce710ecff9 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/ProjectOption+ToManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/ProjectOption+ToManifestMapper.swift @@ -1,11 +1,11 @@ import ProjectDescription -import TuistGraph +import XcodeGraph extension ProjectDescription.Project.Options { - /// Maps a TuistGraph.ProjectOption instance into a ProjectDescription.ProjectOption instance. + /// Maps a XcodeGraph.ProjectOption instance into a ProjectDescription.ProjectOption instance. /// - Parameters: /// - manifest: Manifest representation of project options. - static func from(manifest: TuistGraph.Project.Options) -> Self { + static func from(manifest: XcodeGraph.Project.Options) -> Self { options( automaticSchemesOptions: .from(manifest: manifest.automaticSchemesOptions), disableBundleAccessors: manifest.disableBundleAccessors, @@ -23,7 +23,7 @@ extension ProjectDescription.Project.Options { extension ProjectDescription.Project.Options.AutomaticSchemesOptions { static func from( - manifest: TuistGraph.Project.Options.AutomaticSchemesOptions + manifest: XcodeGraph.Project.Options.AutomaticSchemesOptions ) -> Self { switch manifest { case let .enabled( @@ -54,7 +54,7 @@ extension ProjectDescription.Project.Options.AutomaticSchemesOptions { extension ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping { static func from( - manifest: TuistGraph.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping + manifest: XcodeGraph.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping ) -> Self { switch manifest { case .singleScheme: @@ -69,7 +69,7 @@ extension ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchem extension ProjectDescription.ScreenCaptureFormat { static func from( - manifest: TuistGraph.ScreenCaptureFormat + manifest: XcodeGraph.ScreenCaptureFormat ) -> Self { switch manifest { case .screenshots: diff --git a/Sources/TuistLoader/Models+ManifestMappers/ResourceFileElement+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ResourceFileElement+ManifestMapper.swift index 58c678f5f77..4f5a68e6032 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/ResourceFileElement+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/ResourceFileElement+ManifestMapper.swift @@ -2,11 +2,11 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.ResourceFileElement { - /// Maps a ProjectDescription.ResourceFileElement instance into a [TuistGraph.ResourceFileElement] instance. +extension XcodeGraph.ResourceFileElement { + /// Maps a ProjectDescription.ResourceFileElement instance into a [XcodeGraph.ResourceFileElement] instance. /// Glob patterns in file elements are unfolded as part of the mapping. /// - Parameters: /// - manifest: Manifest representation of the file element. @@ -15,7 +15,7 @@ extension TuistGraph.ResourceFileElement { manifest: ProjectDescription.ResourceFileElement, generatorPaths: GeneratorPaths, includeFiles: @escaping (AbsolutePath) -> Bool = { _ in true } - ) throws -> [TuistGraph.ResourceFileElement] { + ) throws -> [XcodeGraph.ResourceFileElement] { func globFiles(_ path: AbsolutePath, excluding: [String]) throws -> [AbsolutePath] { var excluded: Set = [] for path in excluding { diff --git a/Sources/TuistLoader/Models+ManifestMappers/ResourceSynthesizer+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ResourceSynthesizer+ManifestMapper.swift index a4b7d5e0779..a514b50c1b2 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/ResourceSynthesizer+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/ResourceSynthesizer+ManifestMapper.swift @@ -1,15 +1,15 @@ import ProjectDescription import TSCBasic -import TuistGraph +import XcodeGraph -extension TuistGraph.ResourceSynthesizer { +extension XcodeGraph.ResourceSynthesizer { static func from( manifest: ProjectDescription.ResourceSynthesizer, generatorPaths: GeneratorPaths, plugins: Plugins, resourceSynthesizerPathLocator: ResourceSynthesizerPathLocating ) throws -> Self { - let template: TuistGraph.ResourceSynthesizer.Template + let template: XcodeGraph.ResourceSynthesizer.Template switch manifest.templateType { case let .defaultTemplate(resourceName: resourceName): if let templatePath = resourceSynthesizerPathLocator.templatePath( @@ -30,11 +30,11 @@ extension TuistGraph.ResourceSynthesizer { } let parserOptions = manifest.parserOptions - .compactMapValues { TuistGraph.ResourceSynthesizer.Parser.Option.from(manifest: $0) + .compactMapValues { XcodeGraph.ResourceSynthesizer.Parser.Option.from(manifest: $0) } return .init( - parser: TuistGraph.ResourceSynthesizer.Parser.from(manifest: manifest.parser), + parser: XcodeGraph.ResourceSynthesizer.Parser.from(manifest: manifest.parser), parserOptions: parserOptions, extensions: manifest.extensions, template: template @@ -42,7 +42,7 @@ extension TuistGraph.ResourceSynthesizer { } } -extension TuistGraph.ResourceSynthesizer.Parser { +extension XcodeGraph.ResourceSynthesizer.Parser { static func from( manifest: ProjectDescription.ResourceSynthesizer.Parser ) -> Self { @@ -69,7 +69,7 @@ extension TuistGraph.ResourceSynthesizer.Parser { } } -extension TuistGraph.ResourceSynthesizer.Parser.Option { +extension XcodeGraph.ResourceSynthesizer.Parser.Option { static func from( manifest: ProjectDescription.ResourceSynthesizer.Parser.Option ) -> Self { diff --git a/Sources/TuistLoader/Models+ManifestMappers/RunAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/RunAction+ManifestMapper.swift index 6e892d4997f..0487421ce7d 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/RunAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/RunAction+ManifestMapper.swift @@ -2,17 +2,17 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.RunAction { - /// Maps a ProjectDescription.RunAction instance into a TuistGraph.RunAction instance. +extension XcodeGraph.RunAction { + /// Maps a ProjectDescription.RunAction instance into a XcodeGraph.RunAction instance. /// - Parameters: /// - manifest: Manifest representation of the settings. /// - generatorPaths: Generator paths. static func from( manifest: ProjectDescription.RunAction, generatorPaths: GeneratorPaths - ) throws -> TuistGraph.RunAction { + ) throws -> XcodeGraph.RunAction { let configurationName = manifest.configuration.rawValue let customLLDBInitFile = try manifest.customLLDBInitFile.map { @@ -20,22 +20,22 @@ extension TuistGraph.RunAction { } let preActions = try manifest.preActions.map { - try TuistGraph.ExecutionAction.from( + try XcodeGraph.ExecutionAction.from( manifest: $0, generatorPaths: generatorPaths ) } let postActions = try manifest.postActions.map { - try TuistGraph.ExecutionAction.from( + try XcodeGraph.ExecutionAction.from( manifest: $0, generatorPaths: generatorPaths ) } - let arguments = manifest.arguments.map { TuistGraph.Arguments.from(manifest: $0) } + let arguments = manifest.arguments.map { XcodeGraph.Arguments.from(manifest: $0) } - var executableResolved: TuistGraph.TargetReference? + var executableResolved: XcodeGraph.TargetReference? if let executable = manifest.executable { executableResolved = TargetReference( projectPath: try generatorPaths.resolveSchemeActionProjectPath(executable.projectPath), @@ -43,21 +43,21 @@ extension TuistGraph.RunAction { ) } - let options = try TuistGraph.RunActionOptions.from(manifest: manifest.options, generatorPaths: generatorPaths) + let options = try XcodeGraph.RunActionOptions.from(manifest: manifest.options, generatorPaths: generatorPaths) - let diagnosticsOptions = TuistGraph.SchemeDiagnosticsOptions.from(manifest: manifest.diagnosticsOptions) + let diagnosticsOptions = XcodeGraph.SchemeDiagnosticsOptions.from(manifest: manifest.diagnosticsOptions) - let expandVariablesFromTarget: TuistGraph.TargetReference? + let expandVariablesFromTarget: XcodeGraph.TargetReference? expandVariablesFromTarget = try manifest.expandVariableFromTarget.map { - TuistGraph.TargetReference( + XcodeGraph.TargetReference( projectPath: try generatorPaths.resolveSchemeActionProjectPath($0.projectPath), name: $0.targetName ) } - let launchStyle = TuistGraph.LaunchStyle.from(manifest: manifest.launchStyle) + let launchStyle = XcodeGraph.LaunchStyle.from(manifest: manifest.launchStyle) - return TuistGraph.RunAction( + return XcodeGraph.RunAction( configurationName: configurationName, attachDebugger: manifest.attachDebugger, customLLDBInitFile: customLLDBInitFile, diff --git a/Sources/TuistLoader/Models+ManifestMappers/RunActionOptions+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/RunActionOptions+ManifestMapper.swift index 37ec4bac4b9..dc27f303391 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/RunActionOptions+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/RunActionOptions+ManifestMapper.swift @@ -1,20 +1,20 @@ import Foundation import ProjectDescription import TSCBasic -import TuistGraph +import XcodeGraph -extension TuistGraph.RunActionOptions { - /// Maps a ProjectDescription.RunActionOptions instance into a TuistGraph.RunActionOptions instance. +extension XcodeGraph.RunActionOptions { + /// Maps a ProjectDescription.RunActionOptions instance into a XcodeGraph.RunActionOptions instance. /// - Parameters: /// - manifest: Manifest representation of the options. /// - generatorPaths: Generator paths. static func from( manifest: ProjectDescription.RunActionOptions, generatorPaths: GeneratorPaths - ) throws -> TuistGraph.RunActionOptions { + ) throws -> XcodeGraph.RunActionOptions { var language: String? var storeKitConfigurationPath: AbsolutePath? - var simulatedLocation: TuistGraph.SimulatedLocation? + var simulatedLocation: XcodeGraph.SimulatedLocation? var enableGPUFrameCaptureMode: GPUFrameCaptureMode language = manifest.language?.identifier @@ -45,7 +45,7 @@ extension TuistGraph.RunActionOptions { } } - return TuistGraph.RunActionOptions( + return XcodeGraph.RunActionOptions( language: language, region: manifest.region, storeKitConfigurationPath: storeKitConfigurationPath, diff --git a/Sources/TuistLoader/Models+ManifestMappers/SDKStatus+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/SDKStatus+ManifestMapper.swift index dfed2b929e2..e084cc635cd 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/SDKStatus+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/SDKStatus+ManifestMapper.swift @@ -1,14 +1,14 @@ import Foundation import ProjectDescription import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.SDKStatus { - /// Maps a ProjectDescription.SDKStatus instance into a TuistGraph.SDKStatus instance. +extension XcodeGraph.SDKStatus { + /// Maps a ProjectDescription.SDKStatus instance into a XcodeGraph.SDKStatus instance. /// - Parameters: /// - manifest: Manifest representation of SDK status model. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.SDKStatus) -> TuistGraph.SDKStatus { + static func from(manifest: ProjectDescription.SDKStatus) -> XcodeGraph.SDKStatus { switch manifest { case .required: return .required diff --git a/Sources/TuistLoader/Models+ManifestMappers/Scheme+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Scheme+ManifestMapper.swift index 6c3654ebd43..5fe28ddebb2 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Scheme+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Scheme+ManifestMapper.swift @@ -2,38 +2,38 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.Scheme { - /// Maps a ProjectDescription.Scheme instance into a TuistGraph.Scheme instance. +extension XcodeGraph.Scheme { + /// Maps a ProjectDescription.Scheme instance into a XcodeGraph.Scheme instance. /// - Parameters: /// - manifest: Manifest representation of build action model. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.Scheme, generatorPaths: GeneratorPaths) throws -> TuistGraph.Scheme { + static func from(manifest: ProjectDescription.Scheme, generatorPaths: GeneratorPaths) throws -> XcodeGraph.Scheme { let name = manifest.name let shared = manifest.shared let hidden = manifest.hidden - let buildAction = try manifest.buildAction.map { try TuistGraph.BuildAction.from( + let buildAction = try manifest.buildAction.map { try XcodeGraph.BuildAction.from( manifest: $0, generatorPaths: generatorPaths ) } - let testAction = try manifest.testAction.map { try TuistGraph.TestAction.from( + let testAction = try manifest.testAction.map { try XcodeGraph.TestAction.from( manifest: $0, generatorPaths: generatorPaths ) } - let runAction = try manifest.runAction.map { try TuistGraph.RunAction.from( + let runAction = try manifest.runAction.map { try XcodeGraph.RunAction.from( manifest: $0, generatorPaths: generatorPaths ) } - let archiveAction = try manifest.archiveAction.map { try TuistGraph.ArchiveAction.from( + let archiveAction = try manifest.archiveAction.map { try XcodeGraph.ArchiveAction.from( manifest: $0, generatorPaths: generatorPaths ) } - let profileAction = try manifest.profileAction.map { try TuistGraph.ProfileAction.from( + let profileAction = try manifest.profileAction.map { try XcodeGraph.ProfileAction.from( manifest: $0, generatorPaths: generatorPaths ) } - let analyzeAction = try manifest.analyzeAction.map { try TuistGraph.AnalyzeAction.from( + let analyzeAction = try manifest.analyzeAction.map { try XcodeGraph.AnalyzeAction.from( manifest: $0, generatorPaths: generatorPaths ) } diff --git a/Sources/TuistLoader/Models+ManifestMappers/SchemeDiagnosticsOption+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/SchemeDiagnosticsOption+ManifestMapper.swift index f03cffe4f26..3b31d646ee7 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/SchemeDiagnosticsOption+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/SchemeDiagnosticsOption+ManifestMapper.swift @@ -2,11 +2,11 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.SchemeDiagnosticsOptions { - static func from(manifest: ProjectDescription.SchemeDiagnosticsOptions) -> TuistGraph.SchemeDiagnosticsOptions { - return TuistGraph.SchemeDiagnosticsOptions( +extension XcodeGraph.SchemeDiagnosticsOptions { + static func from(manifest: ProjectDescription.SchemeDiagnosticsOptions) -> XcodeGraph.SchemeDiagnosticsOptions { + return XcodeGraph.SchemeDiagnosticsOptions( addressSanitizerEnabled: manifest.addressSanitizerEnabled, detectStackUseAfterReturnEnabled: manifest.detectStackUseAfterReturnEnabled, threadSanitizerEnabled: manifest.threadSanitizerEnabled, diff --git a/Sources/TuistLoader/Models+ManifestMappers/ScreenCaptureFormat+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ScreenCaptureFormat+ManifestMapper.swift index 1fe21dcde9e..06a47c7db5f 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/ScreenCaptureFormat+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/ScreenCaptureFormat+ManifestMapper.swift @@ -1,9 +1,9 @@ import Foundation import ProjectDescription -import TuistGraph +import XcodeGraph -extension TuistGraph.ScreenCaptureFormat { - static func from(manifest: ProjectDescription.ScreenCaptureFormat) -> TuistGraph.ScreenCaptureFormat { +extension XcodeGraph.ScreenCaptureFormat { + static func from(manifest: ProjectDescription.ScreenCaptureFormat) -> XcodeGraph.ScreenCaptureFormat { switch manifest { case .screenshots: return .screenshots diff --git a/Sources/TuistLoader/Models+ManifestMappers/SettingValue+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/SettingValue+ManifestMapper.swift index 3566ee25523..fdeb20b08e2 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/SettingValue+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/SettingValue+ManifestMapper.swift @@ -2,15 +2,15 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.SettingValue { - /// Maps a ProjectDescription.SettingValue instance into a TuistGraph.SettingValue model. +extension XcodeGraph.SettingValue { + /// Maps a ProjectDescription.SettingValue instance into a XcodeGraph.SettingValue model. /// - Parameters: /// - manifest: Manifest representation of setting value. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.SettingValue) -> TuistGraph.SettingValue { + static func from(manifest: ProjectDescription.SettingValue) -> XcodeGraph.SettingValue { switch manifest { case let .string(value): return .string(value) diff --git a/Sources/TuistLoader/Models+ManifestMappers/Settings+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Settings+ManifestMapper.swift index b1a9e02c862..ee45210c743 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Settings+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Settings+ManifestMapper.swift @@ -2,24 +2,24 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.Settings { - /// Maps a ProjectDescription.Settings instance into a TuistGraph.Settings instance. +extension XcodeGraph.Settings { + /// Maps a ProjectDescription.Settings instance into a XcodeGraph.Settings instance. /// - Parameters: /// - manifest: Manifest representation of the settings. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.Settings, generatorPaths: GeneratorPaths) throws -> TuistGraph.Settings { - let base = manifest.base.mapValues(TuistGraph.SettingValue.from) + static func from(manifest: ProjectDescription.Settings, generatorPaths: GeneratorPaths) throws -> XcodeGraph.Settings { + let base = manifest.base.mapValues(XcodeGraph.SettingValue.from) let configurations = try manifest.configurations - .reduce([TuistGraph.BuildConfiguration: TuistGraph.Configuration?]()) { acc, val in + .reduce([XcodeGraph.BuildConfiguration: XcodeGraph.Configuration?]()) { acc, val in var result = acc - let variant = TuistGraph.BuildConfiguration.from(manifest: val) - result[variant] = try TuistGraph.Configuration.from(manifest: val, generatorPaths: generatorPaths) + let variant = XcodeGraph.BuildConfiguration.from(manifest: val) + result[variant] = try XcodeGraph.Configuration.from(manifest: val, generatorPaths: generatorPaths) return result } - let defaultSettings = TuistGraph.DefaultSettings.from(manifest: manifest.defaultSettings) - return TuistGraph.Settings( + let defaultSettings = XcodeGraph.DefaultSettings.from(manifest: manifest.defaultSettings) + return XcodeGraph.Settings( base: base, configurations: configurations, defaultSettings: defaultSettings diff --git a/Sources/TuistLoader/Models+ManifestMappers/SettingsDictionary+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/SettingsDictionary+ManifestMapper.swift index 8f57a3a8f0a..51a32d4bac2 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/SettingsDictionary+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/SettingsDictionary+ManifestMapper.swift @@ -1,18 +1,18 @@ import Foundation import ProjectDescription -import TuistGraph +import XcodeGraph -extension TuistGraph.SettingsDictionary { - /// Maps a ProjectDescription.SettingsDictionary instance into a TuistGraph.SettingsDictionary instance. +extension XcodeGraph.SettingsDictionary { + /// Maps a ProjectDescription.SettingsDictionary instance into a XcodeGraph.SettingsDictionary instance. /// - Parameters: /// - manifest: Manifest representation of deployment target model. - static func from(manifest: ProjectDescription.SettingsDictionary) -> TuistGraph.SettingsDictionary { + static func from(manifest: ProjectDescription.SettingsDictionary) -> XcodeGraph.SettingsDictionary { manifest.mapValues { value in switch value { case let .string(stringValue): - return TuistGraph.SettingValue.string(stringValue) + return XcodeGraph.SettingValue.string(stringValue) case let .array(arrayValue): - return TuistGraph.SettingValue.array(arrayValue) + return XcodeGraph.SettingValue.array(arrayValue) } } } diff --git a/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift index 798971680f3..b655985a1c7 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph public enum TargetManifestMapperError: FatalError { case invalidResourcesGlob(targetName: String, invalidGlobs: [InvalidGlob]) @@ -19,8 +19,8 @@ public enum TargetManifestMapperError: FatalError { } // swiftlint:disable function_body_length -extension TuistGraph.Target { - /// Maps a ProjectDescription.Target instance into a TuistGraph.Target instance. +extension XcodeGraph.Target { + /// Maps a ProjectDescription.Target instance into a XcodeGraph.Target instance. /// - Parameters: /// - manifest: Manifest representation of the target. /// - generatorPaths: Generator paths. @@ -28,31 +28,31 @@ extension TuistGraph.Target { static func from( manifest: ProjectDescription.Target, generatorPaths: GeneratorPaths, - externalDependencies: [String: [TuistGraph.TargetDependency]] - ) throws -> TuistGraph.Target { + externalDependencies: [String: [XcodeGraph.TargetDependency]] + ) throws -> XcodeGraph.Target { let name = manifest.name - let destinations = try TuistGraph.Destination.from(destinations: manifest.destinations) + let destinations = try XcodeGraph.Destination.from(destinations: manifest.destinations) - let product = TuistGraph.Product.from(manifest: manifest.product) + let product = XcodeGraph.Product.from(manifest: manifest.product) let bundleId = manifest.bundleId let productName = manifest.productName - let deploymentTargets = manifest.deploymentTargets.map { TuistGraph.DeploymentTargets.from(manifest: $0) } ?? .empty() + let deploymentTargets = manifest.deploymentTargets.map { XcodeGraph.DeploymentTargets.from(manifest: $0) } ?? .empty() let dependencies = try manifest.dependencies.flatMap { - try TuistGraph.TargetDependency.from( + try XcodeGraph.TargetDependency.from( manifest: $0, generatorPaths: generatorPaths, externalDependencies: externalDependencies ) } - let infoPlist = try TuistGraph.InfoPlist.from(manifest: manifest.infoPlist, generatorPaths: generatorPaths) + let infoPlist = try XcodeGraph.InfoPlist.from(manifest: manifest.infoPlist, generatorPaths: generatorPaths) - let entitlements = try TuistGraph.Entitlements.from(manifest: manifest.entitlements, generatorPaths: generatorPaths) + let entitlements = try XcodeGraph.Entitlements.from(manifest: manifest.entitlements, generatorPaths: generatorPaths) - let settings = try manifest.settings.map { try TuistGraph.Settings.from(manifest: $0, generatorPaths: generatorPaths) } - let mergedBinaryType = try TuistGraph.MergedBinaryType.from(manifest: manifest.mergedBinaryType) + let settings = try manifest.settings.map { try XcodeGraph.Settings.from(manifest: $0, generatorPaths: generatorPaths) } + let mergedBinaryType = try XcodeGraph.MergedBinaryType.from(manifest: manifest.mergedBinaryType) let (sources, sourcesPlaygrounds) = try sourcesAndPlaygrounds( manifest: manifest, @@ -70,21 +70,21 @@ extension TuistGraph.Target { } let copyFiles = try (manifest.copyFiles ?? []).map { - try TuistGraph.CopyFilesAction.from(manifest: $0, generatorPaths: generatorPaths) + try XcodeGraph.CopyFilesAction.from(manifest: $0, generatorPaths: generatorPaths) } - let headers = try manifest.headers.map { try TuistGraph.Headers.from( + let headers = try manifest.headers.map { try XcodeGraph.Headers.from( manifest: $0, generatorPaths: generatorPaths, productName: manifest.productName ) } let coreDataModels = try manifest.coreDataModels.map { - try TuistGraph.CoreDataModel.from(manifest: $0, generatorPaths: generatorPaths) - } + resourcesCoreDatas.map { try TuistGraph.CoreDataModel.from(path: $0) } + try XcodeGraph.CoreDataModel.from(manifest: $0, generatorPaths: generatorPaths) + } + resourcesCoreDatas.map { try XcodeGraph.CoreDataModel.from(path: $0) } let scripts = try manifest.scripts.map { - try TuistGraph.TargetScript.from(manifest: $0, generatorPaths: generatorPaths) + try XcodeGraph.TargetScript.from(manifest: $0, generatorPaths: generatorPaths) } let environmentVariables = manifest.environmentVariables.mapValues(EnvironmentVariable.from) @@ -93,17 +93,17 @@ extension TuistGraph.Target { let playgrounds = sourcesPlaygrounds + resourcesPlaygrounds let additionalFiles = try manifest.additionalFiles - .flatMap { try TuistGraph.FileElement.from(manifest: $0, generatorPaths: generatorPaths) } + .flatMap { try XcodeGraph.FileElement.from(manifest: $0, generatorPaths: generatorPaths) } let buildRules = manifest.buildRules.map { - TuistGraph.BuildRule.from(manifest: $0) + XcodeGraph.BuildRule.from(manifest: $0) } let onDemandResourcesTags = manifest.onDemandResourcesTags.map { - TuistGraph.OnDemandResourcesTags(initialInstall: $0.initialInstall, prefetchOrder: $0.prefetchOrder) + XcodeGraph.OnDemandResourcesTags(initialInstall: $0.initialInstall, prefetchOrder: $0.prefetchOrder) } - return TuistGraph.Target( + return XcodeGraph.Target( name: name, destinations: destinations, product: product, @@ -139,32 +139,32 @@ extension TuistGraph.Target { generatorPaths: GeneratorPaths // swiftlint:disable:next large_tuple ) throws -> ( - resources: TuistGraph.ResourceFileElements, + resources: XcodeGraph.ResourceFileElements, playgrounds: [AbsolutePath], coreDataModels: [AbsolutePath], invalidResourceGlobs: [InvalidGlob] ) { let resourceFilter = { (path: AbsolutePath) -> Bool in - TuistGraph.Target.isResource(path: path) + XcodeGraph.Target.isResource(path: path) } - let privacyManifest: TuistGraph.PrivacyManifest? = manifest.resources?.privacyManifest.map { - return TuistGraph.PrivacyManifest( + let privacyManifest: XcodeGraph.PrivacyManifest? = manifest.resources?.privacyManifest.map { + return XcodeGraph.PrivacyManifest( tracking: $0.tracking, trackingDomains: $0.trackingDomains, - collectedDataTypes: $0.collectedDataTypes.map { $0.mapValues { TuistGraph.Plist.Value.from(manifest: $0) }}, - accessedApiTypes: $0.accessedApiTypes.map { $0.mapValues { TuistGraph.Plist.Value.from(manifest: $0) }} + collectedDataTypes: $0.collectedDataTypes.map { $0.mapValues { XcodeGraph.Plist.Value.from(manifest: $0) }}, + accessedApiTypes: $0.accessedApiTypes.map { $0.mapValues { XcodeGraph.Plist.Value.from(manifest: $0) }} ) } var invalidResourceGlobs: [InvalidGlob] = [] - var filteredResources: TuistGraph.ResourceFileElements = .init([], privacyManifest: privacyManifest) + var filteredResources: XcodeGraph.ResourceFileElements = .init([], privacyManifest: privacyManifest) var playgrounds: Set = [] var coreDataModels: Set = [] - let allResources = try (manifest.resources?.resources ?? []).flatMap { manifest -> [TuistGraph.ResourceFileElement] in + let allResources = try (manifest.resources?.resources ?? []).flatMap { manifest -> [XcodeGraph.ResourceFileElement] in do { - return try TuistGraph.ResourceFileElement.from( + return try XcodeGraph.ResourceFileElement.from( manifest: manifest, generatorPaths: generatorPaths, includeFiles: resourceFilter @@ -201,16 +201,16 @@ extension TuistGraph.Target { manifest: ProjectDescription.Target, targetName: String, generatorPaths: GeneratorPaths - ) throws -> (sources: [TuistGraph.SourceFile], playgrounds: [AbsolutePath]) { - var sourcesWithoutPlaygrounds: [TuistGraph.SourceFile] = [] + ) throws -> (sources: [XcodeGraph.SourceFile], playgrounds: [AbsolutePath]) { + var sourcesWithoutPlaygrounds: [XcodeGraph.SourceFile] = [] var playgrounds: Set = [] // Sources - let allSources = try TuistGraph.Target.sources(targetName: targetName, sources: manifest.sources?.globs.map { glob in + let allSources = try XcodeGraph.Target.sources(targetName: targetName, sources: manifest.sources?.globs.map { glob in let globPath = try generatorPaths.resolve(path: glob.glob).pathString let excluding: [String] = try glob.excluding.compactMap { try generatorPaths.resolve(path: $0).pathString } - let mappedCodeGen = glob.codeGen.map(TuistGraph.FileCodeGen.from) - return TuistGraph.SourceFileGlob( + let mappedCodeGen = glob.codeGen.map(XcodeGraph.FileCodeGen.from) + return XcodeGraph.SourceFileGlob( glob: globPath, excluding: excluding, compilerFlags: glob.compilerFlags, diff --git a/Sources/TuistLoader/Models+ManifestMappers/TargetAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TargetAction+ManifestMapper.swift index 3f3419f29d9..b32538d69ba 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TargetAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TargetAction+ManifestMapper.swift @@ -2,19 +2,19 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.TargetScript { - /// Maps a ProjectDescription.TargetAction instance into a TuistGraph.TargetAction model. +extension XcodeGraph.TargetScript { + /// Maps a ProjectDescription.TargetAction instance into a XcodeGraph.TargetAction model. /// - Parameters: /// - manifest: Manifest representation of target action. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.TargetScript, generatorPaths: GeneratorPaths) throws -> TuistGraph + static func from(manifest: ProjectDescription.TargetScript, generatorPaths: GeneratorPaths) throws -> XcodeGraph .TargetScript { let name = manifest.name - let order = TuistGraph.TargetScript.Order.from(manifest: manifest.order) + let order = XcodeGraph.TargetScript.Order.from(manifest: manifest.order) let inputPaths = try manifest.inputPaths .compactMap { try $0.unfold(generatorPaths: generatorPaths) } .flatMap { $0 } @@ -35,7 +35,7 @@ extension TuistGraph.TargetScript { dependencyFile = nil } - let script: TuistGraph.TargetScript.Script + let script: XcodeGraph.TargetScript.Script switch manifest.script { case let .embedded(text): script = .embedded(text) @@ -76,12 +76,12 @@ extension TuistGraph.TargetScript { } } -extension TuistGraph.TargetScript.Order { - /// Maps a ProjectDescription.TargetAction.Order instance into a TuistGraph.TargetAction.Order model. +extension XcodeGraph.TargetScript.Order { + /// Maps a ProjectDescription.TargetAction.Order instance into a XcodeGraph.TargetAction.Order model. /// - Parameters: /// - manifest: Manifest representation of target action order. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.TargetScript.Order) -> TuistGraph.TargetScript.Order { + static func from(manifest: ProjectDescription.TargetScript.Order) -> XcodeGraph.TargetScript.Order { switch manifest { case .pre: return .pre diff --git a/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift index beeb63a6e72..7c00b35b9fd 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph // MARK: - TargetDependency Mapper Error @@ -20,8 +20,8 @@ public enum TargetDependencyMapperError: FatalError { } } -extension TuistGraph.TargetDependency { - /// Maps a ProjectDescription.TargetDependency instance into a TuistGraph.TargetDependency instance. +extension XcodeGraph.TargetDependency { + /// Maps a ProjectDescription.TargetDependency instance into a XcodeGraph.TargetDependency instance. /// - Parameters: /// - manifest: Manifest representation of the target dependency model. /// - generatorPaths: Generator paths. @@ -29,8 +29,8 @@ extension TuistGraph.TargetDependency { static func from( // swiftlint:disable:this function_body_length manifest: ProjectDescription.TargetDependency, generatorPaths: GeneratorPaths, - externalDependencies: [String: [TuistGraph.TargetDependency]] - ) throws -> [TuistGraph.TargetDependency] { + externalDependencies: [String: [XcodeGraph.TargetDependency]] + ) throws -> [XcodeGraph.TargetDependency] { switch manifest { case let .target(name, condition): return [.target(name: name, condition: condition?.asGraphCondition)] @@ -95,19 +95,19 @@ extension TuistGraph.TargetDependency { } extension ProjectDescription.PlatformFilters { - var asGraphFilters: TuistGraph.PlatformFilters { - Set(map(\.graphPlatformFilter)) + var asGraphFilters: XcodeGraph.PlatformFilters { + Set(map(\.graphPlatformFilter)) } } extension ProjectDescription.PlatformCondition { - var asGraphCondition: TuistGraph.PlatformCondition? { + var asGraphCondition: XcodeGraph.PlatformCondition? { .when(Set(platformFilters.asGraphFilters)) } } extension ProjectDescription.PlatformFilter { - fileprivate var graphPlatformFilter: TuistGraph.PlatformFilter { + fileprivate var graphPlatformFilter: XcodeGraph.PlatformFilter { switch self { case .ios: .ios diff --git a/Sources/TuistLoader/Models+ManifestMappers/TestAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TestAction+ManifestMapper.swift index 17ef66c0844..7db63cd87f1 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TestAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TestAction+ManifestMapper.swift @@ -2,27 +2,27 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.TestAction { +extension XcodeGraph.TestAction { // swiftlint:disable function_body_length - /// Maps a ProjectDescription.TestAction instance into a TuistGraph.TestAction instance. + /// Maps a ProjectDescription.TestAction instance into a XcodeGraph.TestAction instance. /// - Parameters: /// - manifest: Manifest representation of test action model. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.TestAction, generatorPaths: GeneratorPaths) throws -> TuistGraph.TestAction { + static func from(manifest: ProjectDescription.TestAction, generatorPaths: GeneratorPaths) throws -> XcodeGraph.TestAction { // swiftlint:enable function_body_length - let testPlans: [TuistGraph.TestPlan]? - let targets: [TuistGraph.TestableTarget] - let arguments: TuistGraph.Arguments? + let testPlans: [XcodeGraph.TestPlan]? + let targets: [XcodeGraph.TestableTarget] + let arguments: XcodeGraph.Arguments? let coverage: Bool - let codeCoverageTargets: [TuistGraph.TargetReference] - let expandVariablesFromTarget: TuistGraph.TargetReference? - let diagnosticsOptions: TuistGraph.SchemeDiagnosticsOptions + let codeCoverageTargets: [XcodeGraph.TargetReference] + let expandVariablesFromTarget: XcodeGraph.TargetReference? + let diagnosticsOptions: XcodeGraph.SchemeDiagnosticsOptions let language: SchemeLanguage? let region: String? - let preferredScreenCaptureFormat: TuistGraph.ScreenCaptureFormat? + let preferredScreenCaptureFormat: XcodeGraph.ScreenCaptureFormat? let skippedTests: [String]? if let plans = manifest.testPlans { @@ -45,22 +45,22 @@ extension TuistGraph.TestAction { skippedTests = nil } else { targets = try manifest.targets - .map { try TuistGraph.TestableTarget.from(manifest: $0, generatorPaths: generatorPaths) } - arguments = manifest.arguments.map { TuistGraph.Arguments.from(manifest: $0) } + .map { try XcodeGraph.TestableTarget.from(manifest: $0, generatorPaths: generatorPaths) } + arguments = manifest.arguments.map { XcodeGraph.Arguments.from(manifest: $0) } coverage = manifest.options.coverage codeCoverageTargets = try manifest.options.codeCoverageTargets.map { - TuistGraph.TargetReference( + XcodeGraph.TargetReference( projectPath: try generatorPaths.resolveSchemeActionProjectPath($0.projectPath), name: $0.targetName ) } expandVariablesFromTarget = try manifest.expandVariableFromTarget.map { - TuistGraph.TargetReference( + XcodeGraph.TargetReference( projectPath: try generatorPaths.resolveSchemeActionProjectPath($0.projectPath), name: $0.targetName ) } - diagnosticsOptions = TuistGraph.SchemeDiagnosticsOptions.from(manifest: manifest.diagnosticsOptions) + diagnosticsOptions = XcodeGraph.SchemeDiagnosticsOptions.from(manifest: manifest.diagnosticsOptions) language = manifest.options.language region = manifest.options.region preferredScreenCaptureFormat = manifest.options.preferredScreenCaptureFormat @@ -72,11 +72,11 @@ extension TuistGraph.TestAction { } let configurationName = manifest.configuration.rawValue - let preActions = try manifest.preActions.map { try TuistGraph.ExecutionAction.from( + let preActions = try manifest.preActions.map { try XcodeGraph.ExecutionAction.from( manifest: $0, generatorPaths: generatorPaths ) } - let postActions = try manifest.postActions.map { try TuistGraph.ExecutionAction.from( + let postActions = try manifest.postActions.map { try XcodeGraph.ExecutionAction.from( manifest: $0, generatorPaths: generatorPaths ) } diff --git a/Sources/TuistLoader/Models+ManifestMappers/TestPlan+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TestPlan+ManifestMapper.swift index e810619148f..c5007a7d3a1 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TestPlan+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TestPlan+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph extension TestPlan { init(path: AbsolutePath, isDefault: Bool, generatorPaths: GeneratorPaths) throws { diff --git a/Sources/TuistLoader/Models+ManifestMappers/TestableTarget+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TestableTarget+ManifestMapper.swift index 3e052ec126a..b0c1bdfa663 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TestableTarget+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TestableTarget+ManifestMapper.swift @@ -2,23 +2,23 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph -extension TuistGraph.TestableTarget { - /// Maps a ProjectDescription.TestableTarget instance into a TuistGraph.TestableTarget instance. +extension XcodeGraph.TestableTarget { + /// Maps a ProjectDescription.TestableTarget instance into a XcodeGraph.TestableTarget instance. /// - Parameters: /// - manifest: Manifest representation of testable target model. /// - generatorPaths: Generator paths. static func from( manifest: ProjectDescription.TestableTarget, generatorPaths: GeneratorPaths - ) throws -> TuistGraph.TestableTarget { - let target = TuistGraph.TargetReference( + ) throws -> XcodeGraph.TestableTarget { + let target = XcodeGraph.TargetReference( projectPath: try generatorPaths.resolveSchemeActionProjectPath(manifest.target.projectPath), name: manifest.target.targetName ) - var simulatedLocation: TuistGraph.SimulatedLocation? + var simulatedLocation: XcodeGraph.SimulatedLocation? if let manifestLocation = manifest.simulatedLocation { switch (manifestLocation.identifier, manifestLocation.gpxFile) { diff --git a/Sources/TuistLoader/Models+ManifestMappers/TestingOptions+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TestingOptions+ManifestMapper.swift index 5e39903d69c..3daddc77de6 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TestingOptions+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TestingOptions+ManifestMapper.swift @@ -1,8 +1,8 @@ import ProjectDescription -import TuistGraph +import XcodeGraph -extension TuistGraph.TestingOptions { - /// Maps a ProjectDescription.TestingOptions instance into a TuistGraph.TestingOptions instance. +extension XcodeGraph.TestingOptions { + /// Maps a ProjectDescription.TestingOptions instance into a XcodeGraph.TestingOptions instance. /// - Parameters: /// - manifest: Manifest representation of testing options. static func from( diff --git a/Sources/TuistLoader/Models+ManifestMappers/TestingOptions+ToManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TestingOptions+ToManifestMapper.swift index 345c65af6fc..c8c174ef590 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TestingOptions+ToManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TestingOptions+ToManifestMapper.swift @@ -1,12 +1,12 @@ import ProjectDescription -import TuistGraph +import XcodeGraph extension ProjectDescription.TestingOptions { - /// Maps a TuistGraph.TestingOptions instance into a ProjectDescription.TestingOptions instance. + /// Maps a XcodeGraph.TestingOptions instance into a ProjectDescription.TestingOptions instance. /// - Parameters: /// - manifest: Manifest representation of testing options. static func from( - manifest: TuistGraph.TestingOptions + manifest: XcodeGraph.TestingOptions ) -> Self { var options: Self = [] diff --git a/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift index 562d565e265..d8c489da74d 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift @@ -2,11 +2,11 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph -extension TuistGraph.Workspace { - /// Maps a ProjectDescription.Workspace instance into a TuistGraph.Workspace model. +extension XcodeGraph.Workspace { + /// Maps a ProjectDescription.Workspace instance into a XcodeGraph.Workspace model. /// - Parameters: /// - manifest: Manifest representation of workspace. /// - generatorPaths: Generator paths. @@ -15,7 +15,7 @@ extension TuistGraph.Workspace { path: AbsolutePath, generatorPaths: GeneratorPaths, manifestLoader: ManifestLoading - ) throws -> TuistGraph.Workspace { + ) throws -> XcodeGraph.Workspace { func globProjects(_ path: Path) throws -> [AbsolutePath] { let resolvedPath = try generatorPaths.resolve(path: path) let projects = FileHandler.shared.glob(AbsolutePath.root, glob: String(resolvedPath.pathString.dropFirst())) @@ -37,17 +37,17 @@ extension TuistGraph.Workspace { } let additionalFiles = try manifest.additionalFiles.flatMap { - try TuistGraph.FileElement.from(manifest: $0, generatorPaths: generatorPaths) + try XcodeGraph.FileElement.from(manifest: $0, generatorPaths: generatorPaths) } - let schemes = try manifest.schemes.map { try TuistGraph.Scheme.from(manifest: $0, generatorPaths: generatorPaths) } + let schemes = try manifest.schemes.map { try XcodeGraph.Scheme.from(manifest: $0, generatorPaths: generatorPaths) } let generationOptions: GenerationOptions = try .from(manifest: manifest.generationOptions, generatorPaths: generatorPaths) let ideTemplateMacros = try manifest.fileHeaderTemplate .map { try IDETemplateMacros.from(manifest: $0, generatorPaths: generatorPaths) } - return TuistGraph.Workspace( + return XcodeGraph.Workspace( path: path, xcWorkspacePath: path.appending(component: "\(manifest.name).xcworkspace"), name: manifest.name, diff --git a/Sources/TuistLoader/Models+ManifestMappers/WorkspaceGenerationOptions+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/WorkspaceGenerationOptions+ManifestMapper.swift index 43959453719..8698b2a1608 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/WorkspaceGenerationOptions+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/WorkspaceGenerationOptions+ManifestMapper.swift @@ -1,9 +1,9 @@ import Foundation import ProjectDescription -import TuistGraph +import XcodeGraph -extension TuistGraph.Workspace.GenerationOptions { - /// Maps ProjectDescription.Workspace.GenerationOptions instance into a TuistGraph.Workspace.GenerationOptions model. +extension XcodeGraph.Workspace.GenerationOptions { + /// Maps ProjectDescription.Workspace.GenerationOptions instance into a XcodeGraph.Workspace.GenerationOptions model. /// - Parameters: /// - manifest: Manifest representation of a generation option. /// - generatorPaths: Generator paths. @@ -23,7 +23,7 @@ extension TuistGraph.Workspace.GenerationOptions { } } -extension TuistGraph.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes { +extension XcodeGraph.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes { static func from( manifest: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes, generatorPaths: GeneratorPaths @@ -43,7 +43,7 @@ extension TuistGraph.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes { } } -extension TuistGraph.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode { +extension XcodeGraph.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode { static func from( manifest: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode, generatorPaths: GeneratorPaths @@ -52,7 +52,7 @@ extension TuistGraph.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.C case .all: return .all case .relevant: return .relevant case let .targets(targets): - let targets: [TuistGraph.TargetReference] = try targets.map { + let targets: [XcodeGraph.TargetReference] = try targets.map { .init( projectPath: try generatorPaths.resolveSchemeActionProjectPath($0.projectPath), name: $0.targetName diff --git a/Sources/TuistLoader/Models/FileListGlob+Unfold.swift b/Sources/TuistLoader/Models/FileListGlob+Unfold.swift index 46663d31d96..53cb144d424 100644 --- a/Sources/TuistLoader/Models/FileListGlob+Unfold.swift +++ b/Sources/TuistLoader/Models/FileListGlob+Unfold.swift @@ -1,8 +1,8 @@ import Foundation import ProjectDescription import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph extension FileListGlob { func unfold( diff --git a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift index 776c95523b2..2b7b238ba1b 100644 --- a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift +++ b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph /// This protocol defines the interface to compile a temporary module with the /// helper files under /Tuist/ProjectDescriptionHelpers that can be imported diff --git a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderFactory.swift b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderFactory.swift index ac6817c0ee6..8c16d5d2585 100644 --- a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderFactory.swift +++ b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderFactory.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph // swiftlint:disable:next type_name public protocol ProjectDescriptionHelpersBuilderFactoring { diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfo+graphPlatform.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfo+graphPlatform.swift index d5463e0aabd..f60341791ae 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfo+graphPlatform.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfo+graphPlatform.swift @@ -1,10 +1,10 @@ import Foundation import ProjectDescription -import TuistGraph import TuistSupport +import XcodeGraph extension PackageInfo.Platform { - func graphPlatform() throws -> TuistGraph.Platform { + func graphPlatform() throws -> XcodeGraph.Platform { switch platformName.lowercased() { case "ios", "maccatalyst": return .iOS diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 4ad5f69c689..5446d8c1c92 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -4,8 +4,8 @@ import ProjectDescription import TSCBasic import TSCUtility import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph // MARK: - PackageInfo Mapper Errors @@ -111,7 +111,7 @@ public protocol PackageInfoMapping { packageInfo: PackageInfo, path: AbsolutePath, packageType: PackageType, - packageSettings: TuistGraph.PackageSettings, + packageSettings: XcodeGraph.PackageSettings, packageToProject: [String: AbsolutePath] ) throws -> ProjectDescription.Project? } @@ -257,7 +257,7 @@ public final class PackageInfoMapper: PackageInfoMapping { packageInfo: PackageInfo, path: AbsolutePath, packageType: PackageType, - packageSettings: TuistGraph.PackageSettings, + packageSettings: XcodeGraph.PackageSettings, packageToProject _: [String: AbsolutePath] ) throws -> ProjectDescription.Project? { // Hardcoded mapping for some well known libraries, until the logic can handle those properly @@ -396,10 +396,10 @@ public final class PackageInfoMapper: PackageInfoMapping { packageType: PackageType, path: AbsolutePath, packageFolder: AbsolutePath, - productTypes: [String: TuistGraph.Product], - productDestinations: [String: TuistGraph.Destinations], - baseSettings: TuistGraph.Settings, - targetSettings: [String: TuistGraph.SettingsDictionary] + productTypes: [String: XcodeGraph.Product], + productDestinations: [String: XcodeGraph.Destinations], + baseSettings: XcodeGraph.Settings, + targetSettings: [String: XcodeGraph.SettingsDictionary] ) throws -> ProjectDescription.Target? { switch target.type { case .regular, .system, .macro: @@ -467,7 +467,7 @@ public final class PackageInfoMapper: PackageInfoMapping { let productDestinations: Set = Set( products.flatMap { product in if product.type == .executable { - return Set([TuistGraph.Destination.mac]) + return Set([XcodeGraph.Destination.mac]) } return productDestinations[product.name] ?? Set(Destination.allCases) } @@ -691,7 +691,7 @@ extension ProjectDescription.Product { name: String, type: PackageInfo.Target.TargetType, products: Set, - productTypes: [String: TuistGraph.Product] + productTypes: [String: XcodeGraph.Product] ) -> Self? { // Swift Macros are command line tools that run in the host (macOS) at compilation time. switch type { @@ -945,8 +945,8 @@ extension ProjectDescription.Settings { settings: [PackageInfo.Target.TargetBuildSettingDescription.Setting], platforms: [PackageInfo.Platform], moduleMap: ModuleMap?, - baseSettings: TuistGraph.Settings, - targetSettings: [String: TuistGraph.SettingsDictionary] + baseSettings: XcodeGraph.Settings, + targetSettings: [String: XcodeGraph.SettingsDictionary] ) throws -> Self? { let mainPath = try target.basePath(packageFolder: packageFolder) let mainRelativePath = mainPath.relative(to: packageFolder) @@ -960,7 +960,7 @@ extension ProjectDescription.Settings { } } - var settingsDictionary: TuistGraph.SettingsDictionary = [ + var settingsDictionary: XcodeGraph.SettingsDictionary = [ // Xcode settings configured by SPM by default "ALWAYS_SEARCH_USER_PATHS": "YES", "CLANG_ENABLE_OBJC_WEAK": "NO", @@ -1072,7 +1072,7 @@ extension ProjectDescription.PackagePlatform { } extension ProjectDescription.Product { - fileprivate static func from(product: TuistGraph.Product) -> Self { + fileprivate static func from(product: XcodeGraph.Product) -> Self { switch product { case .app: return .app @@ -1119,7 +1119,7 @@ extension ProjectDescription.Product { } extension ProjectDescription.SettingsDictionary { - public static func from(settingsDictionary: TuistGraph.SettingsDictionary) -> Self { + public static func from(settingsDictionary: XcodeGraph.SettingsDictionary) -> Self { settingsDictionary.mapValues { value in switch value { case let .string(stringValue): @@ -1134,7 +1134,7 @@ extension ProjectDescription.SettingsDictionary { extension ProjectDescription.Configuration { public static func from( buildConfiguration: BuildConfiguration, - configuration: TuistGraph.Configuration?, + configuration: XcodeGraph.Configuration?, packageFolder: AbsolutePath ) -> Self { let name = ConfigurationName(stringLiteral: buildConfiguration.name) @@ -1150,7 +1150,7 @@ extension ProjectDescription.Configuration { } extension ProjectDescription.DefaultSettings { - fileprivate static func from(defaultSettings: TuistGraph.DefaultSettings) -> Self { + fileprivate static func from(defaultSettings: XcodeGraph.DefaultSettings) -> Self { switch defaultSettings { case let .recommended(excluding): return .recommended(excluding: excluding) diff --git a/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift b/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift index 0035101f0b1..6889e39af43 100644 --- a/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift @@ -1,8 +1,8 @@ import Foundation import ProjectDescription import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph struct SettingsMapper { init( @@ -19,7 +19,7 @@ struct SettingsMapper { private let mainRelativePath: RelativePath private let settings: [PackageInfo.Target.TargetBuildSettingDescription.Setting] - func settingsForPlatforms(_ platforms: [PackageInfo.Platform]) throws -> TuistGraph.SettingsDictionary { + func settingsForPlatforms(_ platforms: [PackageInfo.Platform]) throws -> XcodeGraph.SettingsDictionary { var resolvedSettings = try settingsDictionary() for platform in platforms.sorted(by: { $0.platformName < $1.platformName }) { @@ -32,7 +32,7 @@ struct SettingsMapper { func settingsForBuildConfiguration( _ buildConfiguration: String - ) throws -> TuistGraph.SettingsDictionary { + ) throws -> XcodeGraph.SettingsDictionary { try map( settings: settings.filter { setting in return setting.hasConditions && setting.condition?.config?.uppercasingFirst == buildConfiguration @@ -41,7 +41,7 @@ struct SettingsMapper { } // swiftlint:disable:next function_body_length - func settingsDictionary(for platform: PackageInfo.Platform? = nil) throws -> TuistGraph.SettingsDictionary { + func settingsDictionary(for platform: PackageInfo.Platform? = nil) throws -> XcodeGraph.SettingsDictionary { let platformSettings = try settings(for: platform?.platformName) return try map( @@ -57,7 +57,7 @@ struct SettingsMapper { headerSearchPaths: [String] = [], defines: [String: String] = [:], swiftDefines: String = "" - ) throws -> TuistGraph.SettingsDictionary { + ) throws -> XcodeGraph.SettingsDictionary { var headerSearchPaths = headerSearchPaths var defines = defines var swiftDefines = swiftDefines @@ -66,7 +66,7 @@ struct SettingsMapper { var swiftFlags: [String] = [] var linkerFlags: [String] = [] - var settingsDictionary = TuistGraph.SettingsDictionary() + var settingsDictionary = XcodeGraph.SettingsDictionary() for setting in settings { switch (setting.tool, setting.name) { case (.c, .headerSearchPath), (.cxx, .headerSearchPath): diff --git a/Sources/TuistLoader/Utils/ResourceSynthesizerPathLocator.swift b/Sources/TuistLoader/Utils/ResourceSynthesizerPathLocator.swift index 7bfbe0b1fcb..d7de9bf546c 100644 --- a/Sources/TuistLoader/Utils/ResourceSynthesizerPathLocator.swift +++ b/Sources/TuistLoader/Utils/ResourceSynthesizerPathLocator.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph public protocol ResourceSynthesizerPathLocating { func locate(at: AbsolutePath) -> AbsolutePath? diff --git a/Sources/TuistLoader/Utils/StencilPathLocator.swift b/Sources/TuistLoader/Utils/StencilPathLocator.swift index ffbb979f8d5..67795f92e36 100644 --- a/Sources/TuistLoader/Utils/StencilPathLocator.swift +++ b/Sources/TuistLoader/Utils/StencilPathLocator.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph public protocol StencilPathLocating { func locate(at: AbsolutePath) -> AbsolutePath? diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift index 80d7a900ca3..49045beed90 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift @@ -1,8 +1,8 @@ import Foundation import ProjectDescription import TSCBasic -import struct TuistGraph.Plugins import TuistSupport +import struct XcodeGraph.Plugins @testable import TuistLoader @testable import TuistSupportTesting diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockPackageSettingsLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockPackageSettingsLoader.swift index b065c46c515..7891e6a64cb 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockPackageSettingsLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockPackageSettingsLoader.swift @@ -1,7 +1,7 @@ import TSCBasic -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting @testable import TuistLoader diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift index 9b8c35813c7..a87dc4f5519 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistLoader +import XcodeGraph public final class MockTemplateGitLoader: TemplateGitLoading { public var loadTemplateStub: ((String) throws -> Template)? diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateLoader.swift index 496ddf2322b..2d70c927361 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateLoader.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistLoader +import XcodeGraph public final class MockTemplateLoader: TemplateLoading { public var loadTemplateStub: ((AbsolutePath) throws -> Template)? diff --git a/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilder.swift b/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilder.swift index 9cb405d70b6..b51a1764c07 100644 --- a/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilder.swift +++ b/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilder.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph @testable import TuistLoader diff --git a/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilderFactory.swift b/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilderFactory.swift index 21464df7c70..0b119262102 100644 --- a/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilderFactory.swift +++ b/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilderFactory.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph @testable import TuistLoader diff --git a/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceSynthesizerPathLocator.swift b/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceSynthesizerPathLocator.swift index 745e0c1bd18..02514a73510 100644 --- a/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceSynthesizerPathLocator.swift +++ b/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceSynthesizerPathLocator.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph @testable import TuistLoader public final class MockResourceSynthesizerPathLocator: ResourceSynthesizerPathLocating { diff --git a/Sources/TuistPlugin/PluginService.swift b/Sources/TuistPlugin/PluginService.swift index a63dcb2d5c3..af8350d1096 100644 --- a/Sources/TuistPlugin/PluginService.swift +++ b/Sources/TuistPlugin/PluginService.swift @@ -1,10 +1,10 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistLoader import TuistScaffold import TuistSupport +import XcodeGraph /// Paths to remote plugin's code and artifacts. public struct RemotePluginPaths: Equatable, Hashable { diff --git a/Sources/TuistPluginTesting/MockPluginService.swift b/Sources/TuistPluginTesting/MockPluginService.swift index b053e4cc6dc..53ace9af5a9 100644 --- a/Sources/TuistPluginTesting/MockPluginService.swift +++ b/Sources/TuistPluginTesting/MockPluginService.swift @@ -1,5 +1,5 @@ -import TuistGraph import TuistPlugin +import XcodeGraph public final class MockPluginService: PluginServicing { public init() {} diff --git a/Sources/TuistScaffold/TemplateGenerator.swift b/Sources/TuistScaffold/TemplateGenerator.swift index 1ac32d4bfcf..cf867a21b0c 100644 --- a/Sources/TuistScaffold/TemplateGenerator.swift +++ b/Sources/TuistScaffold/TemplateGenerator.swift @@ -3,8 +3,8 @@ import PathKit import StencilSwiftKit import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph /// Interface for generating content defined in template manifest public protocol TemplateGenerating { @@ -16,7 +16,7 @@ public protocol TemplateGenerating { func generate( template: Template, to destinationPath: AbsolutePath, - attributes: [String: TuistGraph.Template.Attribute.Value] + attributes: [String: XcodeGraph.Template.Attribute.Value] ) throws } @@ -27,7 +27,7 @@ public final class TemplateGenerator: TemplateGenerating { public func generate( template: Template, to destinationPath: AbsolutePath, - attributes: [String: TuistGraph.Template.Attribute.Value] + attributes: [String: XcodeGraph.Template.Attribute.Value] ) throws { let renderedItems = try renderItems( template: template, @@ -50,7 +50,7 @@ public final class TemplateGenerator: TemplateGenerating { /// Renders items' paths in format path_to_dir/{{ attribute_name }} with `attributes` private func renderItems( template: Template, - attributes: [String: TuistGraph.Template.Attribute.Value] + attributes: [String: XcodeGraph.Template.Attribute.Value] ) throws -> [Template.Item] { let environment = stencilSwiftEnvironment() return try template.items.map { @@ -103,7 +103,7 @@ public final class TemplateGenerator: TemplateGenerating { /// Generate all `renderedItems` private func generateItems( renderedItems: [Template.Item], - attributes: [String: TuistGraph.Template.Attribute.Value], + attributes: [String: XcodeGraph.Template.Attribute.Value], destinationPath: AbsolutePath ) throws { let environment = stencilSwiftEnvironment() @@ -156,7 +156,7 @@ public final class TemplateGenerator: TemplateGenerating { } } -extension [String: TuistGraph.Template.Attribute.Value] { +extension [String: XcodeGraph.Template.Attribute.Value] { fileprivate var toStringAny: [String: Any] { reduce([:]) { partialResult, attribute in var result: [String: Any] = partialResult diff --git a/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplateGenerator.swift b/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplateGenerator.swift index a221652d4ca..d68fbcddad3 100644 --- a/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplateGenerator.swift +++ b/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplateGenerator.swift @@ -1,17 +1,17 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph @testable import TuistCore @testable import TuistScaffold public final class MockTemplateGenerator: TemplateGenerating { - public var generateStub: ((Template, AbsolutePath, [String: TuistGraph.Template.Attribute.Value]) throws -> Void)? + public var generateStub: ((Template, AbsolutePath, [String: XcodeGraph.Template.Attribute.Value]) throws -> Void)? public func generate( template: Template, to destinationPath: AbsolutePath, - attributes: [String: TuistGraph.Template.Attribute.Value] + attributes: [String: XcodeGraph.Template.Attribute.Value] ) throws { try generateStub?(template, destinationPath, attributes) } diff --git a/Sources/TuistServer/Cache/CacheStorageFactorying.swift b/Sources/TuistServer/Cache/CacheStorageFactorying.swift index e3d067b55e8..14073faf33c 100644 --- a/Sources/TuistServer/Cache/CacheStorageFactorying.swift +++ b/Sources/TuistServer/Cache/CacheStorageFactorying.swift @@ -1,8 +1,8 @@ import Foundation import Mockable import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph @Mockable public protocol CacheStorageFactorying { diff --git a/Sources/TuistServer/Cache/CacheStoring.swift b/Sources/TuistServer/Cache/CacheStoring.swift index a41c616e28c..7341d7acc07 100644 --- a/Sources/TuistServer/Cache/CacheStoring.swift +++ b/Sources/TuistServer/Cache/CacheStoring.swift @@ -2,7 +2,7 @@ import Foundation import Mockable import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph public struct CacheStorableTarget: Hashable, Equatable { public let target: GraphTarget diff --git a/Sources/TuistServer/Cache/EmptyCacheStorageFactory.swift b/Sources/TuistServer/Cache/EmptyCacheStorageFactory.swift index 163a58d131c..ff4701308b7 100644 --- a/Sources/TuistServer/Cache/EmptyCacheStorageFactory.swift +++ b/Sources/TuistServer/Cache/EmptyCacheStorageFactory.swift @@ -1,5 +1,5 @@ import Foundation -import TuistGraph +import XcodeGraph public final class EmptyCacheStorageFactory: CacheStorageFactorying { public init() {} diff --git a/Sources/TuistSigning/SigningInteractor.swift b/Sources/TuistSigning/SigningInteractor.swift index 4b48251951e..4bd41b1077a 100644 --- a/Sources/TuistSigning/SigningInteractor.swift +++ b/Sources/TuistSigning/SigningInteractor.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph /// Interacts with signing public protocol SigningInteracting { diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 566cdf90025..6905de5b407 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -30,7 +30,7 @@ public enum Constants { public static let tuistGeneratedFileName = ".tuist-generated" /// The cache version. - /// This should change only when it changes the logic to map a `TuistGraph.Target` to a cached build artifact. + /// This should change only when it changes the logic to map a `XcodeGraph.Target` to a cached build artifact. /// Changing this results in changing the target hash and hence forcing a rebuild of its artifact. public static let cacheVersion = "1.0.0" diff --git a/Sources/TuistSupportTesting/SwiftPackageManager/PackageInfo+TestData.swift b/Sources/TuistSupportTesting/SwiftPackageManager/PackageInfo+TestData.swift index 29d27b3a09c..fba45ecc209 100644 --- a/Sources/TuistSupportTesting/SwiftPackageManager/PackageInfo+TestData.swift +++ b/Sources/TuistSupportTesting/SwiftPackageManager/PackageInfo+TestData.swift @@ -1,6 +1,6 @@ import TSCBasic import TSCUtility -import TuistGraph +import XcodeGraph @testable import TuistSupport // MARK: - Test package diff --git a/Sources/TuistGraph/DependenciesGraph/DependenciesGraph.swift b/Sources/XcodeGraph/DependenciesGraph/DependenciesGraph.swift similarity index 100% rename from Sources/TuistGraph/DependenciesGraph/DependenciesGraph.swift rename to Sources/XcodeGraph/DependenciesGraph/DependenciesGraph.swift diff --git a/Sources/TuistGraph/Graph/ConditionalGraphTarget.swift b/Sources/XcodeGraph/Graph/ConditionalGraphTarget.swift similarity index 100% rename from Sources/TuistGraph/Graph/ConditionalGraphTarget.swift rename to Sources/XcodeGraph/Graph/ConditionalGraphTarget.swift diff --git a/Sources/TuistGraph/Graph/Graph.swift b/Sources/XcodeGraph/Graph/Graph.swift similarity index 100% rename from Sources/TuistGraph/Graph/Graph.swift rename to Sources/XcodeGraph/Graph/Graph.swift diff --git a/Sources/TuistGraph/Graph/GraphDependency.swift b/Sources/XcodeGraph/Graph/GraphDependency.swift similarity index 100% rename from Sources/TuistGraph/Graph/GraphDependency.swift rename to Sources/XcodeGraph/Graph/GraphDependency.swift diff --git a/Sources/TuistGraph/Graph/GraphEdge.swift b/Sources/XcodeGraph/Graph/GraphEdge.swift similarity index 100% rename from Sources/TuistGraph/Graph/GraphEdge.swift rename to Sources/XcodeGraph/Graph/GraphEdge.swift diff --git a/Sources/TuistGraph/Graph/GraphTarget.swift b/Sources/XcodeGraph/Graph/GraphTarget.swift similarity index 100% rename from Sources/TuistGraph/Graph/GraphTarget.swift rename to Sources/XcodeGraph/Graph/GraphTarget.swift diff --git a/Sources/TuistGraph/Models/AnalyzeAction.swift b/Sources/XcodeGraph/Models/AnalyzeAction.swift similarity index 100% rename from Sources/TuistGraph/Models/AnalyzeAction.swift rename to Sources/XcodeGraph/Models/AnalyzeAction.swift diff --git a/Sources/TuistGraph/Models/ArchiveAction.swift b/Sources/XcodeGraph/Models/ArchiveAction.swift similarity index 100% rename from Sources/TuistGraph/Models/ArchiveAction.swift rename to Sources/XcodeGraph/Models/ArchiveAction.swift diff --git a/Sources/TuistGraph/Models/Arguments.swift b/Sources/XcodeGraph/Models/Arguments.swift similarity index 100% rename from Sources/TuistGraph/Models/Arguments.swift rename to Sources/XcodeGraph/Models/Arguments.swift diff --git a/Sources/TuistGraph/Models/AutogenerationOptions.swift b/Sources/XcodeGraph/Models/AutogenerationOptions.swift similarity index 100% rename from Sources/TuistGraph/Models/AutogenerationOptions.swift rename to Sources/XcodeGraph/Models/AutogenerationOptions.swift diff --git a/Sources/TuistGraph/Models/BinaryArchitecture.swift b/Sources/XcodeGraph/Models/BinaryArchitecture.swift similarity index 100% rename from Sources/TuistGraph/Models/BinaryArchitecture.swift rename to Sources/XcodeGraph/Models/BinaryArchitecture.swift diff --git a/Sources/TuistGraph/Models/BuildAction.swift b/Sources/XcodeGraph/Models/BuildAction.swift similarity index 100% rename from Sources/TuistGraph/Models/BuildAction.swift rename to Sources/XcodeGraph/Models/BuildAction.swift diff --git a/Sources/TuistGraph/Models/BuildConfiguration.swift b/Sources/XcodeGraph/Models/BuildConfiguration.swift similarity index 100% rename from Sources/TuistGraph/Models/BuildConfiguration.swift rename to Sources/XcodeGraph/Models/BuildConfiguration.swift diff --git a/Sources/TuistGraph/Models/BuildRule+CompilerSpec.swift b/Sources/XcodeGraph/Models/BuildRule+CompilerSpec.swift similarity index 100% rename from Sources/TuistGraph/Models/BuildRule+CompilerSpec.swift rename to Sources/XcodeGraph/Models/BuildRule+CompilerSpec.swift diff --git a/Sources/TuistGraph/Models/BuildRule+FileType.swift b/Sources/XcodeGraph/Models/BuildRule+FileType.swift similarity index 100% rename from Sources/TuistGraph/Models/BuildRule+FileType.swift rename to Sources/XcodeGraph/Models/BuildRule+FileType.swift diff --git a/Sources/TuistGraph/Models/BuildRule.swift b/Sources/XcodeGraph/Models/BuildRule.swift similarity index 100% rename from Sources/TuistGraph/Models/BuildRule.swift rename to Sources/XcodeGraph/Models/BuildRule.swift diff --git a/Sources/TuistGraph/Models/Cloud.swift b/Sources/XcodeGraph/Models/Cloud.swift similarity index 100% rename from Sources/TuistGraph/Models/Cloud.swift rename to Sources/XcodeGraph/Models/Cloud.swift diff --git a/Sources/TuistGraph/Models/CompatibleXcodeVersions.swift b/Sources/XcodeGraph/Models/CompatibleXcodeVersions.swift similarity index 100% rename from Sources/TuistGraph/Models/CompatibleXcodeVersions.swift rename to Sources/XcodeGraph/Models/CompatibleXcodeVersions.swift diff --git a/Sources/TuistGraph/Models/Config.swift b/Sources/XcodeGraph/Models/Config.swift similarity index 100% rename from Sources/TuistGraph/Models/Config.swift rename to Sources/XcodeGraph/Models/Config.swift diff --git a/Sources/TuistGraph/Models/ConfigGenerationOptions.swift b/Sources/XcodeGraph/Models/ConfigGenerationOptions.swift similarity index 100% rename from Sources/TuistGraph/Models/ConfigGenerationOptions.swift rename to Sources/XcodeGraph/Models/ConfigGenerationOptions.swift diff --git a/Sources/TuistGraph/Models/CopyFileElement.swift b/Sources/XcodeGraph/Models/CopyFileElement.swift similarity index 100% rename from Sources/TuistGraph/Models/CopyFileElement.swift rename to Sources/XcodeGraph/Models/CopyFileElement.swift diff --git a/Sources/TuistGraph/Models/CopyFilesAction.swift b/Sources/XcodeGraph/Models/CopyFilesAction.swift similarity index 100% rename from Sources/TuistGraph/Models/CopyFilesAction.swift rename to Sources/XcodeGraph/Models/CopyFilesAction.swift diff --git a/Sources/TuistGraph/Models/CoreDataModel.swift b/Sources/XcodeGraph/Models/CoreDataModel.swift similarity index 100% rename from Sources/TuistGraph/Models/CoreDataModel.swift rename to Sources/XcodeGraph/Models/CoreDataModel.swift diff --git a/Sources/TuistGraph/Models/Dependencies/PackageSettings.swift b/Sources/XcodeGraph/Models/Dependencies/PackageSettings.swift similarity index 93% rename from Sources/TuistGraph/Models/Dependencies/PackageSettings.swift rename to Sources/XcodeGraph/Models/Dependencies/PackageSettings.swift index a48e74493b4..6ba5d8b1f39 100644 --- a/Sources/TuistGraph/Models/Dependencies/PackageSettings.swift +++ b/Sources/XcodeGraph/Models/Dependencies/PackageSettings.swift @@ -16,7 +16,7 @@ public struct PackageSettings: Equatable, Codable { public let targetSettings: [String: SettingsDictionary] /// The custom project options for each project generated from a swift package - public let projectOptions: [String: TuistGraph.Project.Options] + public let projectOptions: [String: XcodeGraph.Project.Options] /// Swift tools version of the parsed `Package.swift` public let swiftToolsVersion: Version @@ -32,7 +32,7 @@ public struct PackageSettings: Equatable, Codable { productDestinations: [String: Destinations], baseSettings: Settings, targetSettings: [String: SettingsDictionary], - projectOptions: [String: TuistGraph.Project.Options] = [:], + projectOptions: [String: XcodeGraph.Project.Options] = [:], swiftToolsVersion: Version ) { self.productTypes = productTypes diff --git a/Sources/TuistGraph/Models/Dependencies/SwiftPackageManagerDependencies.swift b/Sources/XcodeGraph/Models/Dependencies/SwiftPackageManagerDependencies.swift similarity index 97% rename from Sources/TuistGraph/Models/Dependencies/SwiftPackageManagerDependencies.swift rename to Sources/XcodeGraph/Models/Dependencies/SwiftPackageManagerDependencies.swift index 61c0e8493fc..8aba1fa5614 100644 --- a/Sources/TuistGraph/Models/Dependencies/SwiftPackageManagerDependencies.swift +++ b/Sources/XcodeGraph/Models/Dependencies/SwiftPackageManagerDependencies.swift @@ -22,7 +22,7 @@ public struct SwiftPackageManagerDependencies: Equatable { public let targetSettings: [String: SettingsDictionary] /// The custom project options for each project generated from a swift package - public let projectOptions: [String: TuistGraph.Project.Options] + public let projectOptions: [String: XcodeGraph.Project.Options] /// Initializes a new `SwiftPackageManagerDependencies` instance. /// - Parameters: @@ -38,7 +38,7 @@ public struct SwiftPackageManagerDependencies: Equatable { productTypes: [String: Product], baseSettings: Settings, targetSettings: [String: SettingsDictionary], - projectOptions: [String: TuistGraph.Project.Options] = [:] + projectOptions: [String: XcodeGraph.Project.Options] = [:] ) { self.packagesOrManifest = packagesOrManifest self.productTypes = productTypes diff --git a/Sources/TuistGraph/Models/DeploymentTargets.swift b/Sources/XcodeGraph/Models/DeploymentTargets.swift similarity index 100% rename from Sources/TuistGraph/Models/DeploymentTargets.swift rename to Sources/XcodeGraph/Models/DeploymentTargets.swift diff --git a/Sources/TuistGraph/Models/Destination.swift b/Sources/XcodeGraph/Models/Destination.swift similarity index 100% rename from Sources/TuistGraph/Models/Destination.swift rename to Sources/XcodeGraph/Models/Destination.swift diff --git a/Sources/TuistGraph/Models/EnvironmentVariable.swift b/Sources/XcodeGraph/Models/EnvironmentVariable.swift similarity index 100% rename from Sources/TuistGraph/Models/EnvironmentVariable.swift rename to Sources/XcodeGraph/Models/EnvironmentVariable.swift diff --git a/Sources/TuistGraph/Models/ExecutionAction.swift b/Sources/XcodeGraph/Models/ExecutionAction.swift similarity index 100% rename from Sources/TuistGraph/Models/ExecutionAction.swift rename to Sources/XcodeGraph/Models/ExecutionAction.swift diff --git a/Sources/TuistGraph/Models/FileCodeGen.swift b/Sources/XcodeGraph/Models/FileCodeGen.swift similarity index 100% rename from Sources/TuistGraph/Models/FileCodeGen.swift rename to Sources/XcodeGraph/Models/FileCodeGen.swift diff --git a/Sources/TuistGraph/Models/FileElement.swift b/Sources/XcodeGraph/Models/FileElement.swift similarity index 100% rename from Sources/TuistGraph/Models/FileElement.swift rename to Sources/XcodeGraph/Models/FileElement.swift diff --git a/Sources/TuistGraph/Models/Headers.swift b/Sources/XcodeGraph/Models/Headers.swift similarity index 100% rename from Sources/TuistGraph/Models/Headers.swift rename to Sources/XcodeGraph/Models/Headers.swift diff --git a/Sources/TuistGraph/Models/IDETemplateMacros.swift b/Sources/XcodeGraph/Models/IDETemplateMacros.swift similarity index 100% rename from Sources/TuistGraph/Models/IDETemplateMacros.swift rename to Sources/XcodeGraph/Models/IDETemplateMacros.swift diff --git a/Sources/TuistGraph/Models/LaunchArgument.swift b/Sources/XcodeGraph/Models/LaunchArgument.swift similarity index 100% rename from Sources/TuistGraph/Models/LaunchArgument.swift rename to Sources/XcodeGraph/Models/LaunchArgument.swift diff --git a/Sources/TuistGraph/Models/LaunchStyle.swift b/Sources/XcodeGraph/Models/LaunchStyle.swift similarity index 100% rename from Sources/TuistGraph/Models/LaunchStyle.swift rename to Sources/XcodeGraph/Models/LaunchStyle.swift diff --git a/Sources/TuistGraph/Models/MergedBinaryType.swift b/Sources/XcodeGraph/Models/MergedBinaryType.swift similarity index 100% rename from Sources/TuistGraph/Models/MergedBinaryType.swift rename to Sources/XcodeGraph/Models/MergedBinaryType.swift diff --git a/Sources/TuistGraph/Models/Metadata/FrameworkMetadata.swift b/Sources/XcodeGraph/Models/Metadata/FrameworkMetadata.swift similarity index 100% rename from Sources/TuistGraph/Models/Metadata/FrameworkMetadata.swift rename to Sources/XcodeGraph/Models/Metadata/FrameworkMetadata.swift diff --git a/Sources/TuistGraph/Models/Metadata/LibraryMetadata.swift b/Sources/XcodeGraph/Models/Metadata/LibraryMetadata.swift similarity index 100% rename from Sources/TuistGraph/Models/Metadata/LibraryMetadata.swift rename to Sources/XcodeGraph/Models/Metadata/LibraryMetadata.swift diff --git a/Sources/TuistGraph/Models/Metadata/SystemFrameworkMetadata.swift b/Sources/XcodeGraph/Models/Metadata/SystemFrameworkMetadata.swift similarity index 100% rename from Sources/TuistGraph/Models/Metadata/SystemFrameworkMetadata.swift rename to Sources/XcodeGraph/Models/Metadata/SystemFrameworkMetadata.swift diff --git a/Sources/TuistGraph/Models/Metadata/XCFrameworkMetadata.swift b/Sources/XcodeGraph/Models/Metadata/XCFrameworkMetadata.swift similarity index 100% rename from Sources/TuistGraph/Models/Metadata/XCFrameworkMetadata.swift rename to Sources/XcodeGraph/Models/Metadata/XCFrameworkMetadata.swift diff --git a/Sources/TuistGraph/Models/OnDemandResourcesTags.swift b/Sources/XcodeGraph/Models/OnDemandResourcesTags.swift similarity index 100% rename from Sources/TuistGraph/Models/OnDemandResourcesTags.swift rename to Sources/XcodeGraph/Models/OnDemandResourcesTags.swift diff --git a/Sources/TuistGraph/Models/Package.swift b/Sources/XcodeGraph/Models/Package.swift similarity index 91% rename from Sources/TuistGraph/Models/Package.swift rename to Sources/XcodeGraph/Models/Package.swift index f1b59f48b11..18847fcadbc 100644 --- a/Sources/TuistGraph/Models/Package.swift +++ b/Sources/XcodeGraph/Models/Package.swift @@ -6,7 +6,7 @@ public enum Package: Equatable, Codable { case local(path: AbsolutePath) } -extension TuistGraph.Package { +extension XcodeGraph.Package { public var isRemote: Bool { switch self { case .remote: diff --git a/Sources/TuistGraph/Models/Platform.swift b/Sources/XcodeGraph/Models/Platform.swift similarity index 100% rename from Sources/TuistGraph/Models/Platform.swift rename to Sources/XcodeGraph/Models/Platform.swift diff --git a/Sources/TuistGraph/Models/PlatformCondition.swift b/Sources/XcodeGraph/Models/PlatformCondition.swift similarity index 100% rename from Sources/TuistGraph/Models/PlatformCondition.swift rename to Sources/XcodeGraph/Models/PlatformCondition.swift diff --git a/Sources/TuistGraph/Models/PlatformFilter.swift b/Sources/XcodeGraph/Models/PlatformFilter.swift similarity index 100% rename from Sources/TuistGraph/Models/PlatformFilter.swift rename to Sources/XcodeGraph/Models/PlatformFilter.swift diff --git a/Sources/TuistGraph/Models/Plist.swift b/Sources/XcodeGraph/Models/Plist.swift similarity index 100% rename from Sources/TuistGraph/Models/Plist.swift rename to Sources/XcodeGraph/Models/Plist.swift diff --git a/Sources/TuistGraph/Models/Plugin.swift b/Sources/XcodeGraph/Models/Plugin.swift similarity index 100% rename from Sources/TuistGraph/Models/Plugin.swift rename to Sources/XcodeGraph/Models/Plugin.swift diff --git a/Sources/TuistGraph/Models/PluginLocation.swift b/Sources/XcodeGraph/Models/PluginLocation.swift similarity index 100% rename from Sources/TuistGraph/Models/PluginLocation.swift rename to Sources/XcodeGraph/Models/PluginLocation.swift diff --git a/Sources/TuistGraph/Models/PluginResourceSynthesizer.swift b/Sources/XcodeGraph/Models/PluginResourceSynthesizer.swift similarity index 100% rename from Sources/TuistGraph/Models/PluginResourceSynthesizer.swift rename to Sources/XcodeGraph/Models/PluginResourceSynthesizer.swift diff --git a/Sources/TuistGraph/Models/Plugins.swift b/Sources/XcodeGraph/Models/Plugins.swift similarity index 100% rename from Sources/TuistGraph/Models/Plugins.swift rename to Sources/XcodeGraph/Models/Plugins.swift diff --git a/Sources/TuistGraph/Models/PrivacyManifest.swift b/Sources/XcodeGraph/Models/PrivacyManifest.swift similarity index 100% rename from Sources/TuistGraph/Models/PrivacyManifest.swift rename to Sources/XcodeGraph/Models/PrivacyManifest.swift diff --git a/Sources/TuistGraph/Models/Product.swift b/Sources/XcodeGraph/Models/Product.swift similarity index 100% rename from Sources/TuistGraph/Models/Product.swift rename to Sources/XcodeGraph/Models/Product.swift diff --git a/Sources/TuistGraph/Models/ProfileAction.swift b/Sources/XcodeGraph/Models/ProfileAction.swift similarity index 100% rename from Sources/TuistGraph/Models/ProfileAction.swift rename to Sources/XcodeGraph/Models/ProfileAction.swift diff --git a/Sources/TuistGraph/Models/Project.swift b/Sources/XcodeGraph/Models/Project.swift similarity index 100% rename from Sources/TuistGraph/Models/Project.swift rename to Sources/XcodeGraph/Models/Project.swift diff --git a/Sources/TuistGraph/Models/ProjectDescriptionHelpersPlugin.swift b/Sources/XcodeGraph/Models/ProjectDescriptionHelpersPlugin.swift similarity index 100% rename from Sources/TuistGraph/Models/ProjectDescriptionHelpersPlugin.swift rename to Sources/XcodeGraph/Models/ProjectDescriptionHelpersPlugin.swift diff --git a/Sources/TuistGraph/Models/ProjectGroup.swift b/Sources/XcodeGraph/Models/ProjectGroup.swift similarity index 100% rename from Sources/TuistGraph/Models/ProjectGroup.swift rename to Sources/XcodeGraph/Models/ProjectGroup.swift diff --git a/Sources/TuistGraph/Models/ProjectOptions.swift b/Sources/XcodeGraph/Models/ProjectOptions.swift similarity index 100% rename from Sources/TuistGraph/Models/ProjectOptions.swift rename to Sources/XcodeGraph/Models/ProjectOptions.swift diff --git a/Sources/TuistGraph/Models/RawScriptBuildPhase.swift b/Sources/XcodeGraph/Models/RawScriptBuildPhase.swift similarity index 100% rename from Sources/TuistGraph/Models/RawScriptBuildPhase.swift rename to Sources/XcodeGraph/Models/RawScriptBuildPhase.swift diff --git a/Sources/TuistGraph/Models/Requirement.swift b/Sources/XcodeGraph/Models/Requirement.swift similarity index 100% rename from Sources/TuistGraph/Models/Requirement.swift rename to Sources/XcodeGraph/Models/Requirement.swift diff --git a/Sources/TuistGraph/Models/ResourceFileElement.swift b/Sources/XcodeGraph/Models/ResourceFileElement.swift similarity index 93% rename from Sources/TuistGraph/Models/ResourceFileElement.swift rename to Sources/XcodeGraph/Models/ResourceFileElement.swift index 9c5b9b27304..d76aefd6593 100644 --- a/Sources/TuistGraph/Models/ResourceFileElement.swift +++ b/Sources/XcodeGraph/Models/ResourceFileElement.swift @@ -50,9 +50,9 @@ public enum ResourceFileElement: Equatable, Hashable, Codable { } } -extension [TuistGraph.ResourceFileElement] { +extension [XcodeGraph.ResourceFileElement] { public mutating func remove(path: AbsolutePath) { - guard let index = firstIndex(of: TuistGraph.ResourceFileElement(path: path)) else { return } + guard let index = firstIndex(of: XcodeGraph.ResourceFileElement(path: path)) else { return } remove(at: index) } } diff --git a/Sources/TuistGraph/Models/ResourceFileElements.swift b/Sources/XcodeGraph/Models/ResourceFileElements.swift similarity index 100% rename from Sources/TuistGraph/Models/ResourceFileElements.swift rename to Sources/XcodeGraph/Models/ResourceFileElements.swift diff --git a/Sources/TuistGraph/Models/ResourceSynthesizer.swift b/Sources/XcodeGraph/Models/ResourceSynthesizer.swift similarity index 100% rename from Sources/TuistGraph/Models/ResourceSynthesizer.swift rename to Sources/XcodeGraph/Models/ResourceSynthesizer.swift diff --git a/Sources/TuistGraph/Models/RunAction.swift b/Sources/XcodeGraph/Models/RunAction.swift similarity index 100% rename from Sources/TuistGraph/Models/RunAction.swift rename to Sources/XcodeGraph/Models/RunAction.swift diff --git a/Sources/TuistGraph/Models/RunActionOptions.swift b/Sources/XcodeGraph/Models/RunActionOptions.swift similarity index 100% rename from Sources/TuistGraph/Models/RunActionOptions.swift rename to Sources/XcodeGraph/Models/RunActionOptions.swift diff --git a/Sources/TuistGraph/Models/SDKSource.swift b/Sources/XcodeGraph/Models/SDKSource.swift similarity index 100% rename from Sources/TuistGraph/Models/SDKSource.swift rename to Sources/XcodeGraph/Models/SDKSource.swift diff --git a/Sources/TuistGraph/Models/SDKType.swift b/Sources/XcodeGraph/Models/SDKType.swift similarity index 100% rename from Sources/TuistGraph/Models/SDKType.swift rename to Sources/XcodeGraph/Models/SDKType.swift diff --git a/Sources/TuistGraph/Models/Scheme.swift b/Sources/XcodeGraph/Models/Scheme.swift similarity index 100% rename from Sources/TuistGraph/Models/Scheme.swift rename to Sources/XcodeGraph/Models/Scheme.swift diff --git a/Sources/TuistGraph/Models/SchemeDiagnosticsOptions.swift b/Sources/XcodeGraph/Models/SchemeDiagnosticsOptions.swift similarity index 100% rename from Sources/TuistGraph/Models/SchemeDiagnosticsOptions.swift rename to Sources/XcodeGraph/Models/SchemeDiagnosticsOptions.swift diff --git a/Sources/TuistGraph/Models/ScreenCaptureFormat.swift b/Sources/XcodeGraph/Models/ScreenCaptureFormat.swift similarity index 100% rename from Sources/TuistGraph/Models/ScreenCaptureFormat.swift rename to Sources/XcodeGraph/Models/ScreenCaptureFormat.swift diff --git a/Sources/TuistGraph/Models/Settings.swift b/Sources/XcodeGraph/Models/Settings.swift similarity index 100% rename from Sources/TuistGraph/Models/Settings.swift rename to Sources/XcodeGraph/Models/Settings.swift diff --git a/Sources/TuistGraph/Models/SimulatedLocation.swift b/Sources/XcodeGraph/Models/SimulatedLocation.swift similarity index 100% rename from Sources/TuistGraph/Models/SimulatedLocation.swift rename to Sources/XcodeGraph/Models/SimulatedLocation.swift diff --git a/Sources/TuistGraph/Models/SourceFile.swift b/Sources/XcodeGraph/Models/SourceFile.swift similarity index 100% rename from Sources/TuistGraph/Models/SourceFile.swift rename to Sources/XcodeGraph/Models/SourceFile.swift diff --git a/Sources/TuistGraph/Models/SourceFileGlob.swift b/Sources/XcodeGraph/Models/SourceFileGlob.swift similarity index 100% rename from Sources/TuistGraph/Models/SourceFileGlob.swift rename to Sources/XcodeGraph/Models/SourceFileGlob.swift diff --git a/Sources/TuistGraph/Models/Target.swift b/Sources/XcodeGraph/Models/Target.swift similarity index 100% rename from Sources/TuistGraph/Models/Target.swift rename to Sources/XcodeGraph/Models/Target.swift diff --git a/Sources/TuistGraph/Models/TargetDependency.swift b/Sources/XcodeGraph/Models/TargetDependency.swift similarity index 100% rename from Sources/TuistGraph/Models/TargetDependency.swift rename to Sources/XcodeGraph/Models/TargetDependency.swift diff --git a/Sources/TuistGraph/Models/TargetReference.swift b/Sources/XcodeGraph/Models/TargetReference.swift similarity index 100% rename from Sources/TuistGraph/Models/TargetReference.swift rename to Sources/XcodeGraph/Models/TargetReference.swift diff --git a/Sources/TuistGraph/Models/TargetScript.swift b/Sources/XcodeGraph/Models/TargetScript.swift similarity index 100% rename from Sources/TuistGraph/Models/TargetScript.swift rename to Sources/XcodeGraph/Models/TargetScript.swift diff --git a/Sources/TuistGraph/Models/Template.swift b/Sources/XcodeGraph/Models/Template.swift similarity index 100% rename from Sources/TuistGraph/Models/Template.swift rename to Sources/XcodeGraph/Models/Template.swift diff --git a/Sources/TuistGraph/Models/TestAction.swift b/Sources/XcodeGraph/Models/TestAction.swift similarity index 100% rename from Sources/TuistGraph/Models/TestAction.swift rename to Sources/XcodeGraph/Models/TestAction.swift diff --git a/Sources/TuistGraph/Models/TestPlan.swift b/Sources/XcodeGraph/Models/TestPlan.swift similarity index 100% rename from Sources/TuistGraph/Models/TestPlan.swift rename to Sources/XcodeGraph/Models/TestPlan.swift diff --git a/Sources/TuistGraph/Models/TestableTarget.swift b/Sources/XcodeGraph/Models/TestableTarget.swift similarity index 100% rename from Sources/TuistGraph/Models/TestableTarget.swift rename to Sources/XcodeGraph/Models/TestableTarget.swift diff --git a/Sources/TuistGraph/Models/TestingOptions.swift b/Sources/XcodeGraph/Models/TestingOptions.swift similarity index 100% rename from Sources/TuistGraph/Models/TestingOptions.swift rename to Sources/XcodeGraph/Models/TestingOptions.swift diff --git a/Sources/TuistGraph/Models/Workspace.swift b/Sources/XcodeGraph/Models/Workspace.swift similarity index 100% rename from Sources/TuistGraph/Models/Workspace.swift rename to Sources/XcodeGraph/Models/Workspace.swift diff --git a/Sources/TuistGraph/Models/WorkspaceGenerationOptions.swift b/Sources/XcodeGraph/Models/WorkspaceGenerationOptions.swift similarity index 100% rename from Sources/TuistGraph/Models/WorkspaceGenerationOptions.swift rename to Sources/XcodeGraph/Models/WorkspaceGenerationOptions.swift diff --git a/Sources/TuistGraph/Models/XCFrameworkInfoPlist.swift b/Sources/XcodeGraph/Models/XCFrameworkInfoPlist.swift similarity index 100% rename from Sources/TuistGraph/Models/XCFrameworkInfoPlist.swift rename to Sources/XcodeGraph/Models/XCFrameworkInfoPlist.swift diff --git a/Sources/TuistGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift b/Sources/XcodeGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift similarity index 99% rename from Sources/TuistGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift rename to Sources/XcodeGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift index 04fd1bffd02..9d32c78031a 100644 --- a/Sources/TuistGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift +++ b/Sources/XcodeGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph extension DependenciesGraph { public static func test( diff --git a/Sources/TuistGraphTesting/Graph/Graph+TestData.swift b/Sources/XcodeGraphTesting/Graph/Graph+TestData.swift similarity index 97% rename from Sources/TuistGraphTesting/Graph/Graph+TestData.swift rename to Sources/XcodeGraphTesting/Graph/Graph+TestData.swift index e4ada3bffa7..461de49a9ce 100644 --- a/Sources/TuistGraphTesting/Graph/Graph+TestData.swift +++ b/Sources/XcodeGraphTesting/Graph/Graph+TestData.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph extension Graph { public static func test( diff --git a/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift b/Sources/XcodeGraphTesting/Graph/GraphDependency+TestData.swift similarity index 99% rename from Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift rename to Sources/XcodeGraphTesting/Graph/GraphDependency+TestData.swift index 5c213e7b866..aa88cb56cbe 100644 --- a/Sources/TuistGraphTesting/Graph/GraphDependency+TestData.swift +++ b/Sources/XcodeGraphTesting/Graph/GraphDependency+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -@testable import TuistGraph +@testable import XcodeGraph // swiftlint:disable force_try diff --git a/Sources/TuistGraphTesting/Graph/GraphTarget+TestData.swift b/Sources/XcodeGraphTesting/Graph/GraphTarget+TestData.swift similarity index 92% rename from Sources/TuistGraphTesting/Graph/GraphTarget+TestData.swift rename to Sources/XcodeGraphTesting/Graph/GraphTarget+TestData.swift index 8d474c3c3c1..7cec4e07702 100644 --- a/Sources/TuistGraphTesting/Graph/GraphTarget+TestData.swift +++ b/Sources/XcodeGraphTesting/Graph/GraphTarget+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -@testable import TuistGraph +@testable import XcodeGraph extension GraphTarget { public static func test( diff --git a/Sources/TuistGraphTesting/Models/AnalyzeAction+TestData.swift b/Sources/XcodeGraphTesting/Models/AnalyzeAction+TestData.swift similarity index 88% rename from Sources/TuistGraphTesting/Models/AnalyzeAction+TestData.swift rename to Sources/XcodeGraphTesting/Models/AnalyzeAction+TestData.swift index 6372cfafca9..8a27641f79e 100644 --- a/Sources/TuistGraphTesting/Models/AnalyzeAction+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/AnalyzeAction+TestData.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -@testable import TuistGraph +@testable import XcodeGraph extension AnalyzeAction { public static func test(configurationName: String = "Beta Release") -> AnalyzeAction { diff --git a/Sources/TuistGraphTesting/Models/ArchiveAction+TestData.swift b/Sources/XcodeGraphTesting/Models/ArchiveAction+TestData.swift similarity index 95% rename from Sources/TuistGraphTesting/Models/ArchiveAction+TestData.swift rename to Sources/XcodeGraphTesting/Models/ArchiveAction+TestData.swift index c6b650d0958..d6019597148 100644 --- a/Sources/TuistGraphTesting/Models/ArchiveAction+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/ArchiveAction+TestData.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -@testable import TuistGraph +@testable import XcodeGraph extension ArchiveAction { public static func test( diff --git a/Sources/TuistGraphTesting/Models/Arguments+TestData.swift b/Sources/XcodeGraphTesting/Models/Arguments+TestData.swift similarity index 92% rename from Sources/TuistGraphTesting/Models/Arguments+TestData.swift rename to Sources/XcodeGraphTesting/Models/Arguments+TestData.swift index 135bd787322..ee73f55e01d 100644 --- a/Sources/TuistGraphTesting/Models/Arguments+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Arguments+TestData.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -@testable import TuistGraph +@testable import XcodeGraph extension Arguments { public static func test( diff --git a/Sources/TuistGraphTesting/Models/BuildAction+TestData.swift b/Sources/XcodeGraphTesting/Models/BuildAction+TestData.swift similarity index 93% rename from Sources/TuistGraphTesting/Models/BuildAction+TestData.swift rename to Sources/XcodeGraphTesting/Models/BuildAction+TestData.swift index e82639c6644..15cc81c7c5c 100644 --- a/Sources/TuistGraphTesting/Models/BuildAction+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/BuildAction+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistSupport -@testable import TuistGraph +@testable import XcodeGraph extension BuildAction { public static func test( diff --git a/Sources/TuistGraphTesting/Models/Cloud+TestData.swift b/Sources/XcodeGraphTesting/Models/Cloud+TestData.swift similarity index 91% rename from Sources/TuistGraphTesting/Models/Cloud+TestData.swift rename to Sources/XcodeGraphTesting/Models/Cloud+TestData.swift index fb8a600e543..1a2ad042ca0 100644 --- a/Sources/TuistGraphTesting/Models/Cloud+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Cloud+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistSupportTesting -@testable import TuistGraph +@testable import XcodeGraph extension Cloud { public static func test( diff --git a/Sources/TuistGraphTesting/Models/Condition+TestData.swift b/Sources/XcodeGraphTesting/Models/Condition+TestData.swift similarity index 91% rename from Sources/TuistGraphTesting/Models/Condition+TestData.swift rename to Sources/XcodeGraphTesting/Models/Condition+TestData.swift index 9957d0fa0d1..6500e4afd27 100644 --- a/Sources/TuistGraphTesting/Models/Condition+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Condition+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TuistGraph +import XcodeGraph import XCTest extension PlatformCondition { diff --git a/Sources/TuistGraphTesting/Models/Config+TestData.swift b/Sources/XcodeGraphTesting/Models/Config+TestData.swift similarity index 94% rename from Sources/TuistGraphTesting/Models/Config+TestData.swift rename to Sources/XcodeGraphTesting/Models/Config+TestData.swift index 2629bab80cb..7c088cae876 100644 --- a/Sources/TuistGraphTesting/Models/Config+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Config+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TSCUtility -@testable import TuistGraph +@testable import XcodeGraph extension Config { public static func test( @@ -28,7 +28,7 @@ extension Config.GenerationOptions { resolveDependenciesWithSystemScm: Bool = false, disablePackageVersionLocking: Bool = false, clonedSourcePackagesDirPath: AbsolutePath? = nil, - staticSideEffectsWarningTargets: TuistGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets = .all, + staticSideEffectsWarningTargets: XcodeGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets = .all, enforceExplicitDependencies: Bool = false, defaultConfiguration: String? = nil ) -> Self { diff --git a/Sources/TuistGraphTesting/Models/Headers+TestData.swift b/Sources/XcodeGraphTesting/Models/Headers+TestData.swift similarity index 92% rename from Sources/TuistGraphTesting/Models/Headers+TestData.swift rename to Sources/XcodeGraphTesting/Models/Headers+TestData.swift index aa6948c82af..868bcc86915 100644 --- a/Sources/TuistGraphTesting/Models/Headers+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Headers+TestData.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -@testable import TuistGraph +@testable import XcodeGraph extension Headers { public static func test( diff --git a/Sources/TuistGraphTesting/Models/IDETemplateMacros+TestData.swift b/Sources/XcodeGraphTesting/Models/IDETemplateMacros+TestData.swift similarity index 92% rename from Sources/TuistGraphTesting/Models/IDETemplateMacros+TestData.swift rename to Sources/XcodeGraphTesting/Models/IDETemplateMacros+TestData.swift index 959cea8b6da..167466cb895 100644 --- a/Sources/TuistGraphTesting/Models/IDETemplateMacros+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/IDETemplateMacros+TestData.swift @@ -1,6 +1,6 @@ import Foundation -import TuistGraph import TuistSupportTesting +import XcodeGraph extension IDETemplateMacros { public static func test(fileHeader: String? = "Header template") -> IDETemplateMacros { diff --git a/Sources/TuistGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift b/Sources/XcodeGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift similarity index 96% rename from Sources/TuistGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift rename to Sources/XcodeGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift index 0362e50de37..5756b7dc4b4 100644 --- a/Sources/TuistGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistSupport -@testable import TuistGraph +@testable import XcodeGraph extension FrameworkMetadata { public static func test( diff --git a/Sources/TuistGraphTesting/Models/Metadata/LibraryMetadata+TestData.swift b/Sources/XcodeGraphTesting/Models/Metadata/LibraryMetadata+TestData.swift similarity index 95% rename from Sources/TuistGraphTesting/Models/Metadata/LibraryMetadata+TestData.swift rename to Sources/XcodeGraphTesting/Models/Metadata/LibraryMetadata+TestData.swift index 83aa4287f70..72b724f6584 100644 --- a/Sources/TuistGraphTesting/Models/Metadata/LibraryMetadata+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Metadata/LibraryMetadata+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistSupport -@testable import TuistGraph +@testable import XcodeGraph extension LibraryMetadata { public static func test( diff --git a/Sources/TuistGraphTesting/Models/Metadata/XCFrameworkMetadata+TestData.swift b/Sources/XcodeGraphTesting/Models/Metadata/XCFrameworkMetadata+TestData.swift similarity index 96% rename from Sources/TuistGraphTesting/Models/Metadata/XCFrameworkMetadata+TestData.swift rename to Sources/XcodeGraphTesting/Models/Metadata/XCFrameworkMetadata+TestData.swift index 80ed8ab943e..f67941869fe 100644 --- a/Sources/TuistGraphTesting/Models/Metadata/XCFrameworkMetadata+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Metadata/XCFrameworkMetadata+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistSupport -@testable import TuistGraph +@testable import XcodeGraph extension XCFrameworkMetadata { public static func test( diff --git a/Sources/TuistGraphTesting/Models/PackageSettings+TestData.swift b/Sources/XcodeGraphTesting/Models/PackageSettings+TestData.swift similarity index 88% rename from Sources/TuistGraphTesting/Models/PackageSettings+TestData.swift rename to Sources/XcodeGraphTesting/Models/PackageSettings+TestData.swift index f2002a8421e..5d9b9193c64 100644 --- a/Sources/TuistGraphTesting/Models/PackageSettings+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/PackageSettings+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TSCUtility -@testable import TuistGraph +@testable import XcodeGraph extension PackageSettings { public static func test( @@ -9,7 +9,7 @@ extension PackageSettings { productDestinations: [String: Destinations] = [:], baseSettings: Settings = .test(), targetSettings: [String: SettingsDictionary] = [:], - projectOptions: [String: TuistGraph.Project.Options] = [:], + projectOptions: [String: XcodeGraph.Project.Options] = [:], swiftToolsVersion: Version = Version("5.4.9") ) -> PackageSettings { PackageSettings( diff --git a/Sources/TuistGraphTesting/Models/Plugins+TestData.swift b/Sources/XcodeGraphTesting/Models/Plugins+TestData.swift similarity index 94% rename from Sources/TuistGraphTesting/Models/Plugins+TestData.swift rename to Sources/XcodeGraphTesting/Models/Plugins+TestData.swift index 47e269f945c..c74be3e5ee1 100644 --- a/Sources/TuistGraphTesting/Models/Plugins+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Plugins+TestData.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -@testable import TuistGraph +@testable import XcodeGraph extension Plugins { public static func test( diff --git a/Sources/TuistGraphTesting/Models/ProfileAction+TestData.swift b/Sources/XcodeGraphTesting/Models/ProfileAction+TestData.swift similarity index 95% rename from Sources/TuistGraphTesting/Models/ProfileAction+TestData.swift rename to Sources/XcodeGraphTesting/Models/ProfileAction+TestData.swift index 6c25b37cd0b..0cb6d978772 100644 --- a/Sources/TuistGraphTesting/Models/ProfileAction+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/ProfileAction+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistSupport -@testable import TuistGraph +@testable import XcodeGraph extension ProfileAction { public static func test( diff --git a/Sources/TuistGraphTesting/Models/Project+TestData.swift b/Sources/XcodeGraphTesting/Models/Project+TestData.swift similarity index 99% rename from Sources/TuistGraphTesting/Models/Project+TestData.swift rename to Sources/XcodeGraphTesting/Models/Project+TestData.swift index 4ce743b4ff4..56791acd3e6 100644 --- a/Sources/TuistGraphTesting/Models/Project+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Project+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TSCUtility -@testable import TuistGraph +@testable import XcodeGraph extension Project { public static func test( diff --git a/Sources/TuistGraphTesting/Models/ProjectOptions+TestData.swift b/Sources/XcodeGraphTesting/Models/ProjectOptions+TestData.swift similarity index 98% rename from Sources/TuistGraphTesting/Models/ProjectOptions+TestData.swift rename to Sources/XcodeGraphTesting/Models/ProjectOptions+TestData.swift index 8941a036975..1c71d383281 100644 --- a/Sources/TuistGraphTesting/Models/ProjectOptions+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/ProjectOptions+TestData.swift @@ -1,5 +1,5 @@ import Foundation -@testable import TuistGraph +@testable import XcodeGraph extension Project.Options { public static func test( diff --git a/Sources/TuistGraphTesting/Models/RawScriptBuildPhase+TestData.swift b/Sources/XcodeGraphTesting/Models/RawScriptBuildPhase+TestData.swift similarity index 93% rename from Sources/TuistGraphTesting/Models/RawScriptBuildPhase+TestData.swift rename to Sources/XcodeGraphTesting/Models/RawScriptBuildPhase+TestData.swift index 440931af3d8..f3039d3e22f 100644 --- a/Sources/TuistGraphTesting/Models/RawScriptBuildPhase+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/RawScriptBuildPhase+TestData.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -@testable import TuistGraph +@testable import XcodeGraph extension RawScriptBuildPhase { public static func test( diff --git a/Sources/TuistGraphTesting/Models/ResourceSynthesizerPlugin+TestData.swift b/Sources/XcodeGraphTesting/Models/ResourceSynthesizerPlugin+TestData.swift similarity index 92% rename from Sources/TuistGraphTesting/Models/ResourceSynthesizerPlugin+TestData.swift rename to Sources/XcodeGraphTesting/Models/ResourceSynthesizerPlugin+TestData.swift index bfabdbe3f03..e90b4670499 100644 --- a/Sources/TuistGraphTesting/Models/ResourceSynthesizerPlugin+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/ResourceSynthesizerPlugin+TestData.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -@testable import TuistGraph +@testable import XcodeGraph extension PluginResourceSynthesizer { public static func test( diff --git a/Sources/TuistGraphTesting/Models/ResourceSynthesizers+TestData.swift b/Sources/XcodeGraphTesting/Models/ResourceSynthesizers+TestData.swift similarity index 84% rename from Sources/TuistGraphTesting/Models/ResourceSynthesizers+TestData.swift rename to Sources/XcodeGraphTesting/Models/ResourceSynthesizers+TestData.swift index f054c895c14..e7f8898ac7e 100644 --- a/Sources/TuistGraphTesting/Models/ResourceSynthesizers+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/ResourceSynthesizers+TestData.swift @@ -1,7 +1,7 @@ import Foundation -@testable import TuistGraph +@testable import XcodeGraph -extension TuistGraph.ResourceSynthesizer { +extension XcodeGraph.ResourceSynthesizer { public static func test( parser: Parser = .assets, parserOptions: [String: Parser.Option] = [:], diff --git a/Sources/TuistGraphTesting/Models/RunAction+TestData.swift b/Sources/XcodeGraphTesting/Models/RunAction+TestData.swift similarity index 93% rename from Sources/TuistGraphTesting/Models/RunAction+TestData.swift rename to Sources/XcodeGraphTesting/Models/RunAction+TestData.swift index eeb1e8423d4..3b475940f48 100644 --- a/Sources/TuistGraphTesting/Models/RunAction+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/RunAction+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistSupport -@testable import TuistGraph +@testable import XcodeGraph extension RunAction { public static func test( @@ -14,7 +14,7 @@ extension RunAction { filePath: AbsolutePath? = nil, arguments: Arguments? = Arguments.test(), options: RunActionOptions = .init(), - diagnosticsOptions: SchemeDiagnosticsOptions = TuistGraph.SchemeDiagnosticsOptions( + diagnosticsOptions: SchemeDiagnosticsOptions = XcodeGraph.SchemeDiagnosticsOptions( mainThreadCheckerEnabled: true, performanceAntipatternCheckerEnabled: true ), diff --git a/Sources/TuistGraphTesting/Models/Scheme+TestData.swift b/Sources/XcodeGraphTesting/Models/Scheme+TestData.swift similarity index 96% rename from Sources/TuistGraphTesting/Models/Scheme+TestData.swift rename to Sources/XcodeGraphTesting/Models/Scheme+TestData.swift index 362caaa8d9a..ca88b08c5f0 100644 --- a/Sources/TuistGraphTesting/Models/Scheme+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Scheme+TestData.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -@testable import TuistGraph +@testable import XcodeGraph extension Scheme { public static func test( diff --git a/Sources/TuistGraphTesting/Models/Settings+TestData.swift b/Sources/XcodeGraphTesting/Models/Settings+TestData.swift similarity index 97% rename from Sources/TuistGraphTesting/Models/Settings+TestData.swift rename to Sources/XcodeGraphTesting/Models/Settings+TestData.swift index 10ed27af8dc..667ad9c058a 100644 --- a/Sources/TuistGraphTesting/Models/Settings+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Settings+TestData.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -@testable import TuistGraph +@testable import XcodeGraph extension Configuration { public static func test( diff --git a/Sources/TuistGraphTesting/Models/Target+TestData.swift b/Sources/XcodeGraphTesting/Models/Target+TestData.swift similarity index 99% rename from Sources/TuistGraphTesting/Models/Target+TestData.swift rename to Sources/XcodeGraphTesting/Models/Target+TestData.swift index 6eb66fe0dd1..4ef04acd660 100644 --- a/Sources/TuistGraphTesting/Models/Target+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Target+TestData.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -@testable import TuistGraph +@testable import XcodeGraph extension Target { /// Creates a Target with test data diff --git a/Sources/TuistGraphTesting/Models/Template+TestData.swift b/Sources/XcodeGraphTesting/Models/Template+TestData.swift similarity index 95% rename from Sources/TuistGraphTesting/Models/Template+TestData.swift rename to Sources/XcodeGraphTesting/Models/Template+TestData.swift index 1b3f6cdd436..641aaf6e79c 100644 --- a/Sources/TuistGraphTesting/Models/Template+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Template+TestData.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -@testable import TuistGraph +@testable import XcodeGraph extension Template { public static func test( diff --git a/Sources/TuistGraphTesting/Models/TestAction+TestData.swift b/Sources/XcodeGraphTesting/Models/TestAction+TestData.swift similarity index 98% rename from Sources/TuistGraphTesting/Models/TestAction+TestData.swift rename to Sources/XcodeGraphTesting/Models/TestAction+TestData.swift index 8b60d90d6e6..a9e6ed85c5b 100644 --- a/Sources/TuistGraphTesting/Models/TestAction+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/TestAction+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TuistSupport -@testable import TuistGraph +@testable import XcodeGraph extension TestAction { public static func test( diff --git a/Sources/TuistGraphTesting/Models/TestableTarget+TestData.swift b/Sources/XcodeGraphTesting/Models/TestableTarget+TestData.swift similarity index 97% rename from Sources/TuistGraphTesting/Models/TestableTarget+TestData.swift rename to Sources/XcodeGraphTesting/Models/TestableTarget+TestData.swift index e83651a36cb..0b619a9a3bf 100644 --- a/Sources/TuistGraphTesting/Models/TestableTarget+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/TestableTarget+TestData.swift @@ -1,6 +1,6 @@ import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph extension TestableTarget { public static func test( diff --git a/Sources/TuistGraphTesting/Models/Workspace+TestData.swift b/Sources/XcodeGraphTesting/Models/Workspace+TestData.swift similarity index 98% rename from Sources/TuistGraphTesting/Models/Workspace+TestData.swift rename to Sources/XcodeGraphTesting/Models/Workspace+TestData.swift index 0d103764978..e9b21f50158 100644 --- a/Sources/TuistGraphTesting/Models/Workspace+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Workspace+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import TSCUtility -@testable import TuistGraph +@testable import XcodeGraph extension Workspace { public static func test( diff --git a/Sources/TuistGraphTesting/Models/XCFrameworkInfoPlist+TestData.swift b/Sources/XcodeGraphTesting/Models/XCFrameworkInfoPlist+TestData.swift similarity index 96% rename from Sources/TuistGraphTesting/Models/XCFrameworkInfoPlist+TestData.swift rename to Sources/XcodeGraphTesting/Models/XCFrameworkInfoPlist+TestData.swift index edc7760b1d4..de07ffa98aa 100644 --- a/Sources/TuistGraphTesting/Models/XCFrameworkInfoPlist+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/XCFrameworkInfoPlist+TestData.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -@testable import TuistGraph +@testable import XcodeGraph extension XCFrameworkInfoPlist { public static func test(libraries: [XCFrameworkInfoPlist.Library] = [.test()]) -> XCFrameworkInfoPlist { diff --git a/Tests/TuistAutomationTests/ProjectMappers/SkipUITestsProjectMapperTests.swift b/Tests/TuistAutomationTests/ProjectMappers/SkipUITestsProjectMapperTests.swift index 6f42b611394..d8e8187c8f1 100644 --- a/Tests/TuistAutomationTests/ProjectMappers/SkipUITestsProjectMapperTests.swift +++ b/Tests/TuistAutomationTests/ProjectMappers/SkipUITestsProjectMapperTests.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistAutomation diff --git a/Tests/TuistAutomationTests/ProjectMappers/SourceRootPathProjectMapperTests.swift b/Tests/TuistAutomationTests/ProjectMappers/SourceRootPathProjectMapperTests.swift index 5449f955b76..b7aba86328f 100644 --- a/Tests/TuistAutomationTests/ProjectMappers/SourceRootPathProjectMapperTests.swift +++ b/Tests/TuistAutomationTests/ProjectMappers/SourceRootPathProjectMapperTests.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistAutomation diff --git a/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift b/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift index 2bbdba9a2bd..f4390cfb19e 100644 --- a/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift +++ b/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistAutomation diff --git a/Tests/TuistAutomationTests/Utilities/TargetBuilderTests.swift b/Tests/TuistAutomationTests/Utilities/TargetBuilderTests.swift index 8ed3206b38d..ca58d469967 100644 --- a/Tests/TuistAutomationTests/Utilities/TargetBuilderTests.swift +++ b/Tests/TuistAutomationTests/Utilities/TargetBuilderTests.swift @@ -1,7 +1,7 @@ import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistAutomation diff --git a/Tests/TuistAutomationTests/Utilities/TargetRunnerTests.swift b/Tests/TuistAutomationTests/Utilities/TargetRunnerTests.swift index 6355e435b4e..c91946dbb3b 100644 --- a/Tests/TuistAutomationTests/Utilities/TargetRunnerTests.swift +++ b/Tests/TuistAutomationTests/Utilities/TargetRunnerTests.swift @@ -1,8 +1,8 @@ import TSCBasic import struct TSCUtility.Version import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistAutomation diff --git a/Tests/TuistCoreTests/Graph/CircularDependencyLinterTests.swift b/Tests/TuistCoreTests/Graph/CircularDependencyLinterTests.swift index e2f35346d8f..823fbb58f8a 100644 --- a/Tests/TuistCoreTests/Graph/CircularDependencyLinterTests.swift +++ b/Tests/TuistCoreTests/Graph/CircularDependencyLinterTests.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistCore diff --git a/Tests/TuistCoreTests/Graph/GraphDependencyTests.swift b/Tests/TuistCoreTests/Graph/GraphDependencyTests.swift index 640433868f9..c5e3d2ede3f 100644 --- a/Tests/TuistCoreTests/Graph/GraphDependencyTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphDependencyTests.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph import XCTest @testable import TuistCore @testable import TuistSupportTesting diff --git a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift index 3b1651e1e3c..38a7b7ced17 100644 --- a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistCore diff --git a/Tests/TuistCoreTests/Graph/GraphTargetTests.swift b/Tests/TuistCoreTests/Graph/GraphTargetTests.swift index 8357714e126..9fbb1af7c0e 100644 --- a/Tests/TuistCoreTests/Graph/GraphTargetTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTargetTests.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph import XCTest @testable import TuistCore @testable import TuistCoreTesting diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index 602e4460981..7fb7fa35aef 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -1,12 +1,12 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistCore @testable import TuistCoreTesting -@testable import TuistGraphTesting @testable import TuistSupportTesting +@testable import XcodeGraphTesting final class GraphTraverserTests: TuistUnitTestCase { func test_dependsOnXCTest_when_is_framework() { diff --git a/Tests/TuistCoreTests/Graph/Mappers/GraphMapperTests.swift b/Tests/TuistCoreTests/Graph/Mappers/GraphMapperTests.swift index 96f6a241aea..78d25693448 100644 --- a/Tests/TuistCoreTests/Graph/Mappers/GraphMapperTests.swift +++ b/Tests/TuistCoreTests/Graph/Mappers/GraphMapperTests.swift @@ -2,7 +2,7 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph +import XcodeGraph import XCTest @testable import TuistSupportTesting diff --git a/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift b/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift index 1a63187a795..b3f7f05b964 100644 --- a/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift +++ b/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift @@ -2,7 +2,7 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph +import XcodeGraph import XCTest @testable import TuistSupportTesting diff --git a/Tests/TuistCoreTests/Graph/Mappers/WorkspaceMapperTests.swift b/Tests/TuistCoreTests/Graph/Mappers/WorkspaceMapperTests.swift index 555c0061364..0d21abe64c8 100644 --- a/Tests/TuistCoreTests/Graph/Mappers/WorkspaceMapperTests.swift +++ b/Tests/TuistCoreTests/Graph/Mappers/WorkspaceMapperTests.swift @@ -2,7 +2,7 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph +import XcodeGraph import XCTest @testable import TuistSupportTesting diff --git a/Tests/TuistCoreTests/MetadataProviders/FrameworkMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/FrameworkMetadataProviderTests.swift index da29178faa6..fcabeeb31ea 100644 --- a/Tests/TuistCoreTests/MetadataProviders/FrameworkMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/FrameworkMetadataProviderTests.swift @@ -1,5 +1,5 @@ import TSCBasic -import TuistGraph +import XcodeGraph import XCTest @testable import TuistCore @testable import TuistSupportTesting diff --git a/Tests/TuistCoreTests/MetadataProviders/LibraryMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/LibraryMetadataProviderTests.swift index 0e258a14c63..67a4dab76f7 100644 --- a/Tests/TuistCoreTests/MetadataProviders/LibraryMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/LibraryMetadataProviderTests.swift @@ -1,5 +1,5 @@ import TSCBasic -import TuistGraph +import XcodeGraph import XCTest @testable import TuistCore @testable import TuistSupportTesting diff --git a/Tests/TuistCoreTests/MetadataProviders/PrecompiledMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/PrecompiledMetadataProviderTests.swift index fc9df9f5ca7..d79d7601494 100644 --- a/Tests/TuistCoreTests/MetadataProviders/PrecompiledMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/PrecompiledMetadataProviderTests.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistCore diff --git a/Tests/TuistCoreTests/MetadataProviders/SystemFrameworkMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/SystemFrameworkMetadataProviderTests.swift index 924e6e93d51..32dc4a4fa12 100644 --- a/Tests/TuistCoreTests/MetadataProviders/SystemFrameworkMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/SystemFrameworkMetadataProviderTests.swift @@ -1,5 +1,5 @@ import TSCBasic -import TuistGraph +import XcodeGraph import XCTest @testable import TuistCore @testable import TuistSupportTesting diff --git a/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift index 80343dce1dd..95eee7306b3 100644 --- a/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift @@ -1,8 +1,8 @@ import TSCBasic import XCTest @testable import TuistCore -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class XCFrameworkMetadataProviderTests: TuistTestCase { var subject: XCFrameworkMetadataProvider! diff --git a/Tests/TuistCoreTests/NodeLoaders/FrameworkLoaderTests.swift b/Tests/TuistCoreTests/NodeLoaders/FrameworkLoaderTests.swift index 140d446c3b9..fd203ac4cbf 100644 --- a/Tests/TuistCoreTests/NodeLoaders/FrameworkLoaderTests.swift +++ b/Tests/TuistCoreTests/NodeLoaders/FrameworkLoaderTests.swift @@ -1,6 +1,6 @@ import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistCore @testable import TuistCoreTesting diff --git a/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift b/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift index 5bfa725f15d..890ae68314a 100644 --- a/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift +++ b/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift @@ -1,6 +1,6 @@ import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistCore diff --git a/Tests/TuistDependenciesTests/Mappers/ExternalDependencyPathWorkspaceMapper.swift b/Tests/TuistDependenciesTests/Mappers/ExternalDependencyPathWorkspaceMapper.swift index 98844980f1c..76aa25a1821 100644 --- a/Tests/TuistDependenciesTests/Mappers/ExternalDependencyPathWorkspaceMapper.swift +++ b/Tests/TuistDependenciesTests/Mappers/ExternalDependencyPathWorkspaceMapper.swift @@ -1,9 +1,9 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport import TuistSupportTesting +import XcodeGraph import XCTest @testable import TuistDependencies diff --git a/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift index c67bc8fe424..7236eab4dd5 100644 --- a/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift @@ -1,6 +1,6 @@ import Foundation -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistDependencies diff --git a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift index 2b4a4ef1c5b..55c0d947e86 100644 --- a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistDependencies diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift index 94dc4ec726a..52c47379a9c 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift @@ -1,8 +1,8 @@ import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting import TuistLoaderTesting +import XcodeGraph +import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/StableStructureIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/StableStructureIntegrationTests.swift index 6e8a57d4b80..5288b988437 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/StableStructureIntegrationTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/StableStructureIntegrationTests.swift @@ -1,9 +1,9 @@ import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph import TuistLoaderTesting import TuistSupport +import XcodeGraph import XcodeProj import XCTest diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift index cf56b1d7e0e..d85206f315f 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift @@ -3,9 +3,9 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift b/Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift index c95fbdcfc9a..486f8f358e8 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift @@ -2,8 +2,8 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph import TuistLoaderTesting +import XcodeGraph @testable import TuistGenerator @testable import TuistSupport @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/TuistGeneratorPerformanceTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/TuistGeneratorPerformanceTests.swift index b9f0e868ed0..e3f10d0f0e5 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/TuistGeneratorPerformanceTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/TuistGeneratorPerformanceTests.swift @@ -1,9 +1,9 @@ import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph import TuistLoaderTesting import TuistSupport +import XcodeGraph import XcodeProj import XCTest diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/WorkspaceGeneratorIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/WorkspaceGeneratorIntegrationTests.swift index b51a11ef1b5..16067c4ca63 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/WorkspaceGeneratorIntegrationTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/WorkspaceGeneratorIntegrationTests.swift @@ -2,9 +2,9 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Extensions/Xcodeproj+ExtrasTests.swift b/Tests/TuistGeneratorTests/Extensions/Xcodeproj+ExtrasTests.swift index 491df576da1..b41ffe8f516 100644 --- a/Tests/TuistGeneratorTests/Extensions/Xcodeproj+ExtrasTests.swift +++ b/Tests/TuistGeneratorTests/Extensions/Xcodeproj+ExtrasTests.swift @@ -1,8 +1,8 @@ -import TuistGraph +import XcodeGraph import XcodeProj import XCTest @testable import TuistGenerator -@testable import TuistGraphTesting +@testable import XcodeGraphTesting class XcodeprojExtrasTests: XCTestCase { func test_pbxFileElement_sort() { diff --git a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift index 069d9a1df0e..1a59612fa82 100644 --- a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift @@ -1,9 +1,9 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift index 8efb4fb0e1d..3d4c530a1a8 100644 --- a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift @@ -2,9 +2,9 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/InfoPlistContentProviderTests.swift b/Tests/TuistGeneratorTests/Generator/InfoPlistContentProviderTests.swift index 613ef50c920..8f225123b63 100644 --- a/Tests/TuistGeneratorTests/Generator/InfoPlistContentProviderTests.swift +++ b/Tests/TuistGeneratorTests/Generator/InfoPlistContentProviderTests.swift @@ -1,8 +1,8 @@ import Foundation import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift index 4d535c50dc6..e4e04eb2b10 100644 --- a/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistCoreTesting diff --git a/Tests/TuistGeneratorTests/Generator/Mocks/MockInfoPlistContentProvider.swift b/Tests/TuistGeneratorTests/Generator/Mocks/MockInfoPlistContentProvider.swift index aafeedd7d9f..f6182df8faa 100644 --- a/Tests/TuistGeneratorTests/Generator/Mocks/MockInfoPlistContentProvider.swift +++ b/Tests/TuistGeneratorTests/Generator/Mocks/MockInfoPlistContentProvider.swift @@ -1,8 +1,8 @@ import Foundation import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting @testable import TuistGenerator final class MockInfoPlistContentProvider: InfoPlistContentProviding { diff --git a/Tests/TuistGeneratorTests/Generator/Mocks/MockProjectDescriptorGenerator.swift b/Tests/TuistGeneratorTests/Generator/Mocks/MockProjectDescriptorGenerator.swift index 5514ad7b194..52f81426af7 100644 --- a/Tests/TuistGeneratorTests/Generator/Mocks/MockProjectDescriptorGenerator.swift +++ b/Tests/TuistGeneratorTests/Generator/Mocks/MockProjectDescriptorGenerator.swift @@ -2,9 +2,9 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XcodeProj @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/Mocks/MockSchemeDescriptorsGenerator.swift b/Tests/TuistGeneratorTests/Generator/Mocks/MockSchemeDescriptorsGenerator.swift index d16490160e4..b3f2402dbaf 100644 --- a/Tests/TuistGeneratorTests/Generator/Mocks/MockSchemeDescriptorsGenerator.swift +++ b/Tests/TuistGeneratorTests/Generator/Mocks/MockSchemeDescriptorsGenerator.swift @@ -2,8 +2,8 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting @testable import TuistGenerator final class MockSchemeDescriptorsGenerator: SchemeDescriptorsGenerating { diff --git a/Tests/TuistGeneratorTests/Generator/Mocks/MockTargetGenerator.swift b/Tests/TuistGeneratorTests/Generator/Mocks/MockTargetGenerator.swift index f1290518e20..0d7fb42b145 100644 --- a/Tests/TuistGeneratorTests/Generator/Mocks/MockTargetGenerator.swift +++ b/Tests/TuistGeneratorTests/Generator/Mocks/MockTargetGenerator.swift @@ -2,9 +2,9 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XcodeProj @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/Mocks/MockWorkspaceDescriptorGenerator.swift b/Tests/TuistGeneratorTests/Generator/Mocks/MockWorkspaceDescriptorGenerator.swift index f647eaaa1c2..82b0d40be69 100644 --- a/Tests/TuistGeneratorTests/Generator/Mocks/MockWorkspaceDescriptorGenerator.swift +++ b/Tests/TuistGeneratorTests/Generator/Mocks/MockWorkspaceDescriptorGenerator.swift @@ -2,9 +2,9 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XcodeProj @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift index d7c30c916ed..5d4a881bb3a 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift @@ -3,9 +3,9 @@ import TSCBasic import struct TSCUtility.Version import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift index 445d623b87e..916c12f5aaf 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift @@ -3,8 +3,8 @@ import MockableTest import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift index 27061540eba..bd74430ee72 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift @@ -3,8 +3,8 @@ import PathKit import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift index 28c4c438f8d..1ac1884ca01 100644 --- a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift @@ -2,9 +2,9 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XcodeProj import XCTest diff --git a/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift index 5c4947c95cc..09ef5f38416 100644 --- a/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift @@ -2,8 +2,8 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift index 7c5ab6a921a..3b456ada95b 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift @@ -2,9 +2,9 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift index 015aa183579..beb2cb83a7a 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift @@ -2,9 +2,9 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift index 6708267d1d7..c65f826f1dd 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift @@ -1,9 +1,9 @@ import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistGenerator @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift b/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift index 88daeef783d..0b8f44551c7 100644 --- a/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift +++ b/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift b/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift index a3a6e34255f..c114661c723 100644 --- a/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift +++ b/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift @@ -2,8 +2,8 @@ import Foundation import GraphViz import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistGenerator @@ -195,7 +195,7 @@ final class GraphToGraphVizMapperTests: XCTestCase { return graph } - private func makeGivenGraph() throws -> TuistGraph.Graph { + private func makeGivenGraph() throws -> XcodeGraph.Graph { let framework = GraphDependency.testFramework(path: try AbsolutePath(validating: "/XcodeProj.framework")) let library = GraphDependency.testLibrary(path: try AbsolutePath(validating: "/RxSwift.a")) let sdk = GraphDependency.testSDK(name: "CoreData.framework", status: .required, source: .developer) @@ -232,7 +232,7 @@ final class GraphToGraphVizMapperTests: XCTestCase { let externalProject = Project.test(path: "/Tuist/Dependencies", targets: [externalTargetTarget], isExternal: true) let externalDependency = GraphDependency.target(name: externalTarget.target.name, path: externalTarget.path) - let graph = TuistGraph.Graph.test( + let graph = XcodeGraph.Graph.test( projects: [ project.path: project, coreProject.path: coreProject, diff --git a/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift b/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift index 34280bc4db8..2b8e5861453 100644 --- a/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift @@ -1,9 +1,9 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistCoreTesting @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift index d4d09b0eb07..7dc55f68c65 100644 --- a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift @@ -2,14 +2,14 @@ import Foundation import TSCBasic import struct TSCUtility.Version import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistCoreTesting @testable import TuistGenerator -@testable import TuistGraphTesting @testable import TuistSupportTesting +@testable import XcodeGraphTesting final class GraphLinterTests: TuistUnitTestCase { var subject: GraphLinter! diff --git a/Tests/TuistGeneratorTests/Linter/Mocks/MockPackageLinter.swift b/Tests/TuistGeneratorTests/Linter/Mocks/MockPackageLinter.swift index e62236fd82e..fe095280015 100644 --- a/Tests/TuistGeneratorTests/Linter/Mocks/MockPackageLinter.swift +++ b/Tests/TuistGeneratorTests/Linter/Mocks/MockPackageLinter.swift @@ -1,8 +1,8 @@ import Foundation import TuistCore -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting @testable import TuistGenerator class MockPackageLinter: PackageLinting { diff --git a/Tests/TuistGeneratorTests/Linter/Mocks/MockProjectLinter.swift b/Tests/TuistGeneratorTests/Linter/Mocks/MockProjectLinter.swift index bd1fb1fc014..89c5dd4b9bf 100644 --- a/Tests/TuistGeneratorTests/Linter/Mocks/MockProjectLinter.swift +++ b/Tests/TuistGeneratorTests/Linter/Mocks/MockProjectLinter.swift @@ -1,9 +1,9 @@ import Foundation import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting @testable import TuistGenerator class MockProjectLinter: ProjectLinting { diff --git a/Tests/TuistGeneratorTests/Linter/Mocks/MockSchemeLinter.swift b/Tests/TuistGeneratorTests/Linter/Mocks/MockSchemeLinter.swift index 27a85c0b22b..f6db4388376 100644 --- a/Tests/TuistGeneratorTests/Linter/Mocks/MockSchemeLinter.swift +++ b/Tests/TuistGeneratorTests/Linter/Mocks/MockSchemeLinter.swift @@ -1,8 +1,8 @@ import Foundation import TuistCore -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting @testable import TuistGenerator class MockSchemeLinter: SchemeLinting { diff --git a/Tests/TuistGeneratorTests/Linter/Mocks/MockSettingsLinter.swift b/Tests/TuistGeneratorTests/Linter/Mocks/MockSettingsLinter.swift index 314816b2d16..f4c6e85fe20 100644 --- a/Tests/TuistGeneratorTests/Linter/Mocks/MockSettingsLinter.swift +++ b/Tests/TuistGeneratorTests/Linter/Mocks/MockSettingsLinter.swift @@ -1,8 +1,8 @@ import Foundation import TuistCore -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting @testable import TuistGenerator class MockSettingsLinter: SettingsLinting { diff --git a/Tests/TuistGeneratorTests/Linter/Mocks/MockStaticProductsGraphLinter.swift b/Tests/TuistGeneratorTests/Linter/Mocks/MockStaticProductsGraphLinter.swift index 892742cbde2..53254515db4 100644 --- a/Tests/TuistGeneratorTests/Linter/Mocks/MockStaticProductsGraphLinter.swift +++ b/Tests/TuistGeneratorTests/Linter/Mocks/MockStaticProductsGraphLinter.swift @@ -1,6 +1,6 @@ import Foundation import TuistCore -import TuistGraph +import XcodeGraph @testable import TuistGenerator class MockStaticProductsGraphLinter: StaticProductsGraphLinting { diff --git a/Tests/TuistGeneratorTests/Linter/Mocks/MockTargetLinter.swift b/Tests/TuistGeneratorTests/Linter/Mocks/MockTargetLinter.swift index d310a381832..68c9aef6f78 100644 --- a/Tests/TuistGeneratorTests/Linter/Mocks/MockTargetLinter.swift +++ b/Tests/TuistGeneratorTests/Linter/Mocks/MockTargetLinter.swift @@ -1,8 +1,8 @@ import Foundation import TuistCore -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting @testable import TuistGenerator class MockTargetLinter: TargetLinting { diff --git a/Tests/TuistGeneratorTests/Linter/PackageLinterTests.swift b/Tests/TuistGeneratorTests/Linter/PackageLinterTests.swift index ed119f16240..abbf2071579 100644 --- a/Tests/TuistGeneratorTests/Linter/PackageLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/PackageLinterTests.swift @@ -2,9 +2,9 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistGenerator @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift b/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift index a3fa87f7f90..150236516f3 100644 --- a/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift @@ -2,9 +2,9 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Linter/SchemeLinterTests.swift b/Tests/TuistGeneratorTests/Linter/SchemeLinterTests.swift index 898f9aa2683..d1450761e10 100644 --- a/Tests/TuistGeneratorTests/Linter/SchemeLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/SchemeLinterTests.swift @@ -1,9 +1,9 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistGenerator @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/Linter/SettingsLinterTests.swift b/Tests/TuistGeneratorTests/Linter/SettingsLinterTests.swift index 80da003fff3..78c55e52174 100644 --- a/Tests/TuistGeneratorTests/Linter/SettingsLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/SettingsLinterTests.swift @@ -1,12 +1,12 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistGenerator -@testable import TuistGraphTesting @testable import TuistSupportTesting +@testable import XcodeGraphTesting final class SettingsLinterTests: TuistUnitTestCase { var subject: SettingsLinter! diff --git a/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift index aaa581046dc..a111d8cef3e 100644 --- a/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift @@ -1,12 +1,12 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph import XCTest @testable import TuistCore @testable import TuistCoreTesting @testable import TuistGenerator -@testable import TuistGraphTesting @testable import TuistSupportTesting +@testable import XcodeGraphTesting class StaticProductsGraphLinterTests: XCTestCase { var subject: StaticProductsGraphLinter! diff --git a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift index 40db52f5139..6d2cf3533a8 100644 --- a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift @@ -2,9 +2,9 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistGenerator @testable import TuistSupportTesting @@ -352,7 +352,7 @@ final class TargetLinterTests: TuistUnitTestCase { XCTDoesNotContainLintingIssue( got, LintingIssue( - reason: "Found an inconsistency between target destinations `[TuistGraph.Destination.appleVisionWithiPadDesign, TuistGraph.Destination.iPad, TuistGraph.Destination.iPhone]` and deployment target `visionOS`", + reason: "Found an inconsistency between target destinations `[XcodeGraph.Destination.appleVisionWithiPadDesign, XcodeGraph.Destination.iPad, XcodeGraph.Destination.iPhone]` and deployment target `visionOS`", severity: .error ) ) diff --git a/Tests/TuistGeneratorTests/Linter/TargetScriptLinterTests.swift b/Tests/TuistGeneratorTests/Linter/TargetScriptLinterTests.swift index b50f0c0cfe0..b0cfe5f859c 100644 --- a/Tests/TuistGeneratorTests/Linter/TargetScriptLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/TargetScriptLinterTests.swift @@ -2,9 +2,9 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistGenerator @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift index d5a10d53ab8..4720d60c3be 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistGenerator @@ -1465,7 +1465,7 @@ final class AutogeneratedSchemesProjectMapperTests: TuistUnitTestCase { testRegion: String? = nil, testScreenCaptureFormat: ScreenCaptureFormat? = nil, runActionOptions: RunActionOptions? = nil - ) -> TuistGraph.Scheme { + ) -> XcodeGraph.Scheme { Scheme( name: name, shared: true, diff --git a/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift index c15f4604a6f..e4846735ba2 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift @@ -1,9 +1,9 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistCoreTesting @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift index b50d26df813..080025c62f8 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift @@ -1,7 +1,7 @@ import Foundation -import TuistGraph import TuistSupport import TuistSupportTesting +import XcodeGraph import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift index 104fe4afc51..126091a303c 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift @@ -1,9 +1,9 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistCoreTesting @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/ProjectMappers/IDETemplateMacrosMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/IDETemplateMacrosMapperTests.swift index 4a6fae33b0a..95935ef06b6 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/IDETemplateMacrosMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/IDETemplateMacrosMapperTests.swift @@ -2,8 +2,8 @@ import Foundation import TSCBasic import TuistCore import TuistGenerator -import TuistGraph import TuistSupportTesting +import XcodeGraph import XCTest final class IDETemplateMacrosMapperTests: XCTestCase { diff --git a/Tests/TuistGeneratorTests/ProjectMappers/LastUpgradeVersionWorkspaceMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/LastUpgradeVersionWorkspaceMapperTests.swift index 0d4d5ab9bd8..e59d4493f80 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/LastUpgradeVersionWorkspaceMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/LastUpgradeVersionWorkspaceMapperTests.swift @@ -1,6 +1,6 @@ import TuistCore import TuistGenerator -import TuistGraph +import XcodeGraph import XCTest @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift index d827fc205f8..d07c0244541 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift @@ -1,6 +1,6 @@ import TuistCore import TuistGenerator -import TuistGraph +import XcodeGraph import XCTest @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 820cdd61d2d..6adac21cea2 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistCoreTesting diff --git a/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift index 11c19f3ffac..e77af88c688 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift @@ -1,9 +1,9 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistCoreTesting diff --git a/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift index 8d755af1757..52f490b4d05 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift @@ -1,6 +1,6 @@ import TuistCore -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistGenerator @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/Settings/DefaultSettingsProviderTests.swift b/Tests/TuistGeneratorTests/Settings/DefaultSettingsProviderTests.swift index 0e7625f2675..86686a85f3e 100644 --- a/Tests/TuistGeneratorTests/Settings/DefaultSettingsProviderTests.swift +++ b/Tests/TuistGeneratorTests/Settings/DefaultSettingsProviderTests.swift @@ -1,8 +1,8 @@ import struct TSCUtility.Version import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistGenerator @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/Utils/Mocks/MockSynthesizedResourceInterfaceGenerator.swift b/Tests/TuistGeneratorTests/Utils/Mocks/MockSynthesizedResourceInterfaceGenerator.swift index 8fb0ef6a755..ed84b390efa 100644 --- a/Tests/TuistGeneratorTests/Utils/Mocks/MockSynthesizedResourceInterfaceGenerator.swift +++ b/Tests/TuistGeneratorTests/Utils/Mocks/MockSynthesizedResourceInterfaceGenerator.swift @@ -1,5 +1,5 @@ import TSCBasic -import TuistGraph +import XcodeGraph @testable import TuistGenerator final class MockSynthesizedResourceInterfaceGenerator: SynthesizedResourceInterfacesGenerating { diff --git a/Tests/TuistGeneratorTests/Utils/SettingsHelperTests.swift b/Tests/TuistGeneratorTests/Utils/SettingsHelperTests.swift index dc5c8a1243c..8ca23605e8b 100644 --- a/Tests/TuistGeneratorTests/Utils/SettingsHelperTests.swift +++ b/Tests/TuistGeneratorTests/Utils/SettingsHelperTests.swift @@ -1,7 +1,7 @@ import Foundation import TuistCore import TuistCoreTesting -import TuistGraph +import XcodeGraph import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistKitIntegrationTests/Utils/ManifestGraphLoaderIntegrationTests.swift b/Tests/TuistKitIntegrationTests/Utils/ManifestGraphLoaderIntegrationTests.swift index b7173c76532..8c746149fd3 100644 --- a/Tests/TuistKitIntegrationTests/Utils/ManifestGraphLoaderIntegrationTests.swift +++ b/Tests/TuistKitIntegrationTests/Utils/ManifestGraphLoaderIntegrationTests.swift @@ -1,9 +1,9 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistLoader import TuistSupport +import XcodeGraph import XCTest @testable import TuistCoreTesting @testable import TuistKit diff --git a/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift index b48331d6ca2..f075adb088e 100644 --- a/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift @@ -3,12 +3,12 @@ import MockableTest import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistLoader import TuistLoaderTesting import TuistServer import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistKit @testable import TuistSupportTesting diff --git a/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift index c9523016a76..0c58191f42f 100644 --- a/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift @@ -1,9 +1,9 @@ import MockableTest -import TuistGraph -import TuistGraphTesting import TuistLoader import TuistServer import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift index a9d5e455b5d..76d950ad748 100644 --- a/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift @@ -1,10 +1,10 @@ import MockableTest import TSCBasic -import TuistGraph -import TuistGraphTesting import TuistLoader import TuistServer import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift index aed3098f736..e40df94bfa3 100644 --- a/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift @@ -3,12 +3,12 @@ import MockableTest import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistLoader import TuistLoaderTesting import TuistServer import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift index b549d10ccad..713be05f1ed 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift @@ -1,10 +1,10 @@ import Foundation import MockableTest -import TuistGraph import TuistLoader import TuistServer import TuistSupport import TuistSupportTesting +import XcodeGraph import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift index ef7de0e3bb4..50b5344379c 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift @@ -1,10 +1,10 @@ import Foundation import Mockable import MockableTest -import TuistGraph import TuistLoader import TuistServer import TuistSupportTesting +import XcodeGraph import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift index cc9efd9a28f..6f1db9f2956 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift @@ -1,10 +1,10 @@ import Foundation import Mockable import MockableTest -import TuistGraph import TuistLoader import TuistServer import TuistSupportTesting +import XcodeGraph import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift index dba649f1114..7628b3fd526 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift @@ -1,10 +1,10 @@ import Foundation import MockableTest -import TuistGraph import TuistLoader import TuistServer import TuistSupport import TuistSupportTesting +import XcodeGraph import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift index ce95795569b..17a94660d93 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift @@ -1,10 +1,10 @@ import Foundation import Mockable import MockableTest -import TuistGraph import TuistLoader import TuistServer import TuistSupportTesting +import XcodeGraph import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift index 7a1f52a1b06..b5231896588 100644 --- a/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift @@ -1,10 +1,10 @@ import Foundation import MockableTest -import TuistGraph import TuistLoader import TuistServer import TuistSupport import TuistSupportTesting +import XcodeGraph import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift index a9a08d3ba88..21d238df0e4 100644 --- a/Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift @@ -1,9 +1,9 @@ import Foundation import MockableTest -import TuistGraph import TuistLoader import TuistServer import TuistSupportTesting +import XcodeGraph import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift index d3675c1ef86..0d10dbe47f7 100644 --- a/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift @@ -3,12 +3,12 @@ import MockableTest import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistLoader import TuistLoaderTesting import TuistServer import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Dot/MockDotGraphGenerator.swift b/Tests/TuistKitTests/Dot/MockDotGraphGenerator.swift index 944afee749e..acd5e927cea 100644 --- a/Tests/TuistKitTests/Dot/MockDotGraphGenerator.swift +++ b/Tests/TuistKitTests/Dot/MockDotGraphGenerator.swift @@ -2,13 +2,13 @@ import Foundation import GraphViz import TSCBasic import TuistGenerator -import TuistGraph import TuistKit +import XcodeGraph final class MockGraphToGraphVizMapper: GraphToGraphVizMapping { var stubMap: GraphViz.Graph? func map( - graph _: TuistGraph.Graph, + graph _: XcodeGraph.Graph, targetsAndDependencies _: [GraphTarget: Set] ) -> GraphViz.Graph { stubMap ?? GraphViz.Graph() diff --git a/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift b/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift index f6a15ee1ff7..aa258f41cba 100644 --- a/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift +++ b/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift @@ -2,8 +2,8 @@ import Foundation import TSCBasic import TuistCore import TuistGenerator -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting @testable import TuistKit final class MockGenerator: Generating { diff --git a/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift b/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift index 2bfd6884259..2e77feca20e 100644 --- a/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift +++ b/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift @@ -2,8 +2,8 @@ import Foundation import TSCBasic import TuistAutomation import TuistCoreTesting -import TuistGraph import TuistLoader +import XcodeGraph import XCTest @testable import TuistCore @testable import TuistGenerator diff --git a/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift b/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift index df78dfd0fae..db68bcb6518 100644 --- a/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift +++ b/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift @@ -2,8 +2,8 @@ import Foundation import TSCBasic import TuistAutomation import TuistCoreTesting -import TuistGraph import TuistLoader +import XcodeGraph import XCTest @testable import TuistCore @testable import TuistGenerator diff --git a/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift b/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift index 0e8986215c1..533802013f1 100644 --- a/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift +++ b/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift @@ -2,8 +2,8 @@ import Foundation import TSCBasic import TSCUtility import TuistCoreTesting -import TuistGraph import TuistLoader +import XcodeGraph import XCTest @testable import TuistAutomation @testable import TuistCore diff --git a/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift b/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift index 17cd016bba7..ebb517e6f7d 100644 --- a/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift +++ b/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift @@ -2,8 +2,8 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph import TuistSupportTesting +import XcodeGraph import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift b/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift index 46b9f599403..160148e4348 100644 --- a/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift +++ b/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift @@ -1,6 +1,6 @@ import Foundation import TSCBasic -import TuistGraph +import XcodeGraph import XCTest @testable import TuistCore @testable import TuistCoreTesting diff --git a/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift b/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift index d662c2f85e1..881e3855f18 100644 --- a/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift +++ b/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift @@ -2,9 +2,9 @@ import Foundation import TSCBasic import TuistCoreTesting import TuistGenerator -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistCore diff --git a/Tests/TuistKitTests/Mappers/Workspace/TuistWorkspaceRenderMarkdownReadmeMapperTests.swift b/Tests/TuistKitTests/Mappers/Workspace/TuistWorkspaceRenderMarkdownReadmeMapperTests.swift index 6d99cd7f881..30724c66057 100644 --- a/Tests/TuistKitTests/Mappers/Workspace/TuistWorkspaceRenderMarkdownReadmeMapperTests.swift +++ b/Tests/TuistKitTests/Mappers/Workspace/TuistWorkspaceRenderMarkdownReadmeMapperTests.swift @@ -2,7 +2,7 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph +import XcodeGraph import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift b/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift index d82a810d659..adfe5c3b545 100644 --- a/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift +++ b/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting +import XcodeGraph +import XcodeGraphTesting @testable import TuistKit final class MockManifestGraphLoader: ManifestGraphLoading { diff --git a/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift b/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift index 043ee1806a4..d32d48ed4d5 100644 --- a/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift +++ b/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift @@ -1,9 +1,9 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting import TuistLoader +import XcodeGraph +import XcodeGraphTesting @testable import TuistCoreTesting @testable import TuistKit diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift index 323bc5dd810..0e66cfcc476 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift @@ -2,10 +2,10 @@ import Foundation import TSCBasic import TSCUtility import TuistCore -import TuistGraph -import TuistGraphTesting import TuistLoader import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift index 8b22dd30524..c6d70c633d2 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift @@ -2,12 +2,12 @@ import Foundation import MockableTest import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting import TuistLoader import TuistPlugin import TuistPluginTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistCoreTesting diff --git a/Tests/TuistKitTests/Services/BuildServiceTests.swift b/Tests/TuistKitTests/Services/BuildServiceTests.swift index f225cadeb8a..5961280936e 100644 --- a/Tests/TuistKitTests/Services/BuildServiceTests.swift +++ b/Tests/TuistKitTests/Services/BuildServiceTests.swift @@ -3,10 +3,10 @@ import MockableTest import TSCBasic import TSCUtility import TuistCore -import TuistGraph -import TuistGraphTesting import TuistServer import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistAutomationTesting @@ -326,7 +326,7 @@ extension BuildService { derivedDataPath: String? = nil, path: AbsolutePath, device: String? = nil, - platform: TuistGraph.Platform? = nil, + platform: XcodeGraph.Platform? = nil, osVersion: String? = nil, rosetta: Bool = false, generateOnly: Bool = false, diff --git a/Tests/TuistKitTests/Services/EditServiceTests.swift b/Tests/TuistKitTests/Services/EditServiceTests.swift index 3e797851a9c..0c5228b7562 100644 --- a/Tests/TuistKitTests/Services/EditServiceTests.swift +++ b/Tests/TuistKitTests/Services/EditServiceTests.swift @@ -1,8 +1,8 @@ import MockableTest import TSCBasic import TuistCore -import TuistGraph import TuistLoader +import XcodeGraph import XcodeProj import XCTest @testable import TuistCoreTesting diff --git a/Tests/TuistKitTests/Services/GenerateServiceTests.swift b/Tests/TuistKitTests/Services/GenerateServiceTests.swift index e76f42aae39..ca9ba50fd2b 100644 --- a/Tests/TuistKitTests/Services/GenerateServiceTests.swift +++ b/Tests/TuistKitTests/Services/GenerateServiceTests.swift @@ -2,9 +2,9 @@ import Foundation import MockableTest import TSCBasic import TuistCore -import TuistGraph import TuistLoader import TuistServer +import XcodeGraph import XcodeProj import XCTest @testable import TuistCoreTesting diff --git a/Tests/TuistKitTests/Services/GraphServiceTests.swift b/Tests/TuistKitTests/Services/GraphServiceTests.swift index 2cbedf1ed44..0c176925395 100644 --- a/Tests/TuistKitTests/Services/GraphServiceTests.swift +++ b/Tests/TuistKitTests/Services/GraphServiceTests.swift @@ -3,9 +3,9 @@ import Foundation import GraphViz import ProjectAutomation import TSCBasic -import TuistGraph import TuistPlugin import TuistSupport +import XcodeGraph import XcodeProj import XCTest diff --git a/Tests/TuistKitTests/Services/InitServiceTests.swift b/Tests/TuistKitTests/Services/InitServiceTests.swift index d85b12858a6..f23929ff550 100644 --- a/Tests/TuistKitTests/Services/InitServiceTests.swift +++ b/Tests/TuistKitTests/Services/InitServiceTests.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic -import TuistGraph import TuistScaffold import TuistSupport +import XcodeGraph import XCTest @testable import TuistKit @@ -67,12 +67,12 @@ final class InitServiceTests: TuistUnitTestCase { let tuistVersion = "4.0.3" tuistVersionLoader.getVersionStub = tuistVersion - let expectedAttributes: [String: TuistGraph.Template.Attribute.Value] = [ + let expectedAttributes: [String: XcodeGraph.Template.Attribute.Value] = [ "name": .string("Name"), "platform": .string("macOS"), "tuist_version": .string(tuistVersion), ] - var generatorAttributes: [String: TuistGraph.Template.Attribute.Value] = [:] + var generatorAttributes: [String: XcodeGraph.Template.Attribute.Value] = [:] templateGenerator.generateStub = { _, _, attributes in generatorAttributes = attributes } @@ -94,12 +94,12 @@ final class InitServiceTests: TuistUnitTestCase { let tuistVersion = "4.0.3" tuistVersionLoader.getVersionStub = tuistVersion - let expectedAttributes: [String: TuistGraph.Template.Attribute.Value] = [ + let expectedAttributes: [String: XcodeGraph.Template.Attribute.Value] = [ "name": .string("Name"), "platform": .string("iOS"), "tuist_version": .string(tuistVersion), ] - var generatorAttributes: [String: TuistGraph.Template.Attribute.Value] = [:] + var generatorAttributes: [String: XcodeGraph.Template.Attribute.Value] = [:] templateGenerator.generateStub = { _, _, attributes in generatorAttributes = attributes } @@ -127,14 +127,14 @@ final class InitServiceTests: TuistUnitTestCase { let tuistVersion = "4.0.3" tuistVersionLoader.getVersionStub = tuistVersion - let expectedAttributes: [String: TuistGraph.Template.Attribute.Value] = [ + let expectedAttributes: [String: XcodeGraph.Template.Attribute.Value] = [ "name": .string("Name"), "platform": .string("macOS"), "tuist_version": .string(tuistVersion), "required": .string("requiredValue"), "optional": .string("optionalValue"), ] - var generatorAttributes: [String: TuistGraph.Template.Attribute.Value] = [:] + var generatorAttributes: [String: XcodeGraph.Template.Attribute.Value] = [:] templateGenerator.generateStub = { _, _, attributes in generatorAttributes = attributes } @@ -155,7 +155,7 @@ final class InitServiceTests: TuistUnitTestCase { func test_optional_dictionary_attribute_is_taken_from_template() async throws { // Given - let context: TuistGraph.Template.Attribute.Value = .dictionary([ + let context: XcodeGraph.Template.Attribute.Value = .dictionary([ "key1": .string("value1"), "key2": .string("value2"), ]) @@ -174,14 +174,14 @@ final class InitServiceTests: TuistUnitTestCase { [defaultTemplatePath] } - let expectedAttributes: [String: TuistGraph.Template.Attribute.Value] = [ + let expectedAttributes: [String: XcodeGraph.Template.Attribute.Value] = [ "name": .string("Name"), "platform": .string("iOS"), "tuist_version": .string(tuistVersion), "optional": context, ] - var generatorAttributes: [String: TuistGraph.Template.Attribute.Value] = [:] + var generatorAttributes: [String: XcodeGraph.Template.Attribute.Value] = [:] templateGenerator.generateStub = { _, _, attributes in generatorAttributes = attributes } @@ -195,7 +195,7 @@ final class InitServiceTests: TuistUnitTestCase { func test_optional_integer_attribute_is_taken_from_template() async throws { // Given - let defaultIntegerValue: TuistGraph.Template.Attribute.Value = .integer(999) + let defaultIntegerValue: XcodeGraph.Template.Attribute.Value = .integer(999) templateLoader.loadTemplateStub = { _ in Template.test(attributes: [ @@ -211,14 +211,14 @@ final class InitServiceTests: TuistUnitTestCase { [defaultTemplatePath] } - let expectedAttributes: [String: TuistGraph.Template.Attribute.Value] = [ + let expectedAttributes: [String: XcodeGraph.Template.Attribute.Value] = [ "name": .string("Name"), "platform": .string("iOS"), "tuist_version": .string(tuistVersion), "optional": defaultIntegerValue, ] - var generatorAttributes: [String: TuistGraph.Template.Attribute.Value] = [:] + var generatorAttributes: [String: XcodeGraph.Template.Attribute.Value] = [:] templateGenerator.generateStub = { _, _, attributes in generatorAttributes = attributes } diff --git a/Tests/TuistKitTests/Services/InstallServiceTests.swift b/Tests/TuistKitTests/Services/InstallServiceTests.swift index b248b7e0137..6778aef498c 100644 --- a/Tests/TuistKitTests/Services/InstallServiceTests.swift +++ b/Tests/TuistKitTests/Services/InstallServiceTests.swift @@ -4,12 +4,12 @@ import TSCBasic import TSCUtility import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistLoader import TuistPluginTesting import TuistSupport import TuistSupportTesting +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Services/ListServiceTests.swift b/Tests/TuistKitTests/Services/ListServiceTests.swift index ca13137c411..b406a87e247 100644 --- a/Tests/TuistKitTests/Services/ListServiceTests.swift +++ b/Tests/TuistKitTests/Services/ListServiceTests.swift @@ -1,7 +1,7 @@ import TSCBasic -import TuistGraph -import TuistGraphTesting import TuistPluginTesting +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistCore diff --git a/Tests/TuistKitTests/Services/RunServiceTests.swift b/Tests/TuistKitTests/Services/RunServiceTests.swift index b28c43d28d0..e5e9792eeb9 100644 --- a/Tests/TuistKitTests/Services/RunServiceTests.swift +++ b/Tests/TuistKitTests/Services/RunServiceTests.swift @@ -3,9 +3,9 @@ import MockableTest import TSCBasic import struct TSCUtility.Version import TuistCore -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistAutomationTesting diff --git a/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift b/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift index 19c99ae4cc5..37c76e6a4c7 100644 --- a/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift +++ b/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift @@ -2,11 +2,11 @@ import Foundation import MockableTest import TSCBasic import TuistCore -import TuistGraph -import TuistGraphTesting import TuistLoader import TuistScaffold import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistCoreTesting diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index 3360b88ab5b..a01cda54393 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -3,10 +3,10 @@ import MockableTest import TSCBasic import TuistAutomation import TuistCore -import TuistGraph -import TuistGraphTesting import TuistLoader import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistAutomationTesting diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift index a292f1560ec..c588c10c50f 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift @@ -2,9 +2,9 @@ import MockableTest import TuistAnalytics import TuistCore import TuistCoreTesting -import TuistGraph import TuistServer import TuistSupport +import XcodeGraph import XCTest @testable import TuistKit @testable import TuistSupportTesting diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift index fffa1cf63a6..643e3d19049 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift @@ -1,9 +1,9 @@ import Mockable import MockableTest import TuistCore -import TuistGraph import TuistServer import TuistSupport +import XcodeGraph import XCTest @testable import TuistAnalytics diff --git a/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift b/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift index 82c458ebca7..5f3a5ce7b3e 100644 --- a/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift +++ b/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift @@ -1,8 +1,8 @@ import Foundation import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistLoader diff --git a/Tests/TuistLoaderTests/Extensions/TuistTestCase+ManifestMappers.swift b/Tests/TuistLoaderTests/Extensions/TuistTestCase+ManifestMappers.swift index 0ffaacb48e5..9ac1c4f2839 100644 --- a/Tests/TuistLoaderTests/Extensions/TuistTestCase+ManifestMappers.swift +++ b/Tests/TuistLoaderTests/Extensions/TuistTestCase+ManifestMappers.swift @@ -2,15 +2,15 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport import TuistSupportTesting +import XcodeGraph import XCTest @testable import TuistLoader extension TuistTestCase { func XCTAssertSettingsMatchesManifest( - settings: TuistGraph.Settings, + settings: XcodeGraph.Settings, matches manifest: ProjectDescription.Settings, at path: AbsolutePath, generatorPaths: GeneratorPaths, @@ -34,7 +34,7 @@ extension TuistTestCase { } func XCTAssertTargetMatchesManifest( - target: TuistGraph.Target, + target: XcodeGraph.Target, matches manifest: ProjectDescription.Target, at path: AbsolutePath, generatorPaths: GeneratorPaths, @@ -85,7 +85,7 @@ extension TuistTestCase { } func XCTAssertBuildConfigurationMatchesManifest( - configuration: (TuistGraph.BuildConfiguration, TuistGraph.Configuration?), + configuration: (XcodeGraph.BuildConfiguration, XcodeGraph.Configuration?), matches manifest: ProjectDescription.Configuration, at _: AbsolutePath, generatorPaths: GeneratorPaths, @@ -108,7 +108,7 @@ extension TuistTestCase { } func assert( - coreDataModels: [TuistGraph.CoreDataModel], + coreDataModels: [XcodeGraph.CoreDataModel], matches manifests: [ProjectDescription.CoreDataModel], at path: AbsolutePath, generatorPaths: GeneratorPaths, @@ -127,7 +127,7 @@ extension TuistTestCase { } func coreDataModel( - _ coreDataModel: TuistGraph.CoreDataModel, + _ coreDataModel: XcodeGraph.CoreDataModel, matches manifest: ProjectDescription.CoreDataModel, at _: AbsolutePath, generatorPaths: GeneratorPaths @@ -137,7 +137,7 @@ extension TuistTestCase { } func assert( - scheme: TuistGraph.Scheme, + scheme: XcodeGraph.Scheme, matches manifest: ProjectDescription.Scheme, path: AbsolutePath, generatorPaths: GeneratorPaths, @@ -160,14 +160,14 @@ extension TuistTestCase { } func assert( - buildAction: TuistGraph.BuildAction, + buildAction: XcodeGraph.BuildAction, matches manifest: ProjectDescription.BuildAction, path _: AbsolutePath, generatorPaths: GeneratorPaths, file: StaticString = #file, line: UInt = #line ) throws { - let convertedTargets: [TuistGraph.TargetReference] = try manifest.targets.map { + let convertedTargets: [XcodeGraph.TargetReference] = try manifest.targets.map { let resolvedPath = try generatorPaths.resolveSchemeActionProjectPath($0.projectPath) return .init(projectPath: resolvedPath, name: $0.targetName) } @@ -175,7 +175,7 @@ extension TuistTestCase { } func assert( - testAction: TuistGraph.TestAction, + testAction: XcodeGraph.TestAction, matches manifest: ProjectDescription.TestAction, path _: AbsolutePath, generatorPaths: GeneratorPaths, @@ -192,7 +192,7 @@ extension TuistTestCase { } func assert( - runAction: TuistGraph.RunAction, + runAction: XcodeGraph.RunAction, matches manifest: ProjectDescription.RunAction, path _: AbsolutePath, generatorPaths: GeneratorPaths, @@ -213,7 +213,7 @@ extension TuistTestCase { } func assert( - arguments: TuistGraph.Arguments, + arguments: XcodeGraph.Arguments, matches manifest: ProjectDescription.Arguments, file: StaticString = #file, line: UInt = #line @@ -250,10 +250,10 @@ extension TuistTestCase { } private func == ( - _ lhs: TuistGraph.Platform, + _ lhs: XcodeGraph.Platform, _ rhs: ProjectDescription.Platform ) -> Bool { - let map: [TuistGraph.Platform: ProjectDescription.Platform] = [ + let map: [XcodeGraph.Platform: ProjectDescription.Platform] = [ .iOS: .iOS, .macOS: .macOS, .tvOS: .tvOS, @@ -262,17 +262,17 @@ private func == ( } private func == ( - _ lhs: TuistGraph.Destinations, + _ lhs: XcodeGraph.Destinations, _ rhs: ProjectDescription.Destinations ) -> Bool { lhs.map(\.rawValue).sorted() == rhs.map(\.rawValue).sorted() } private func == ( - _ lhs: TuistGraph.Product, + _ lhs: XcodeGraph.Product, _ rhs: ProjectDescription.Product ) -> Bool { - let map: [TuistGraph.Product: ProjectDescription.Product] = [ + let map: [XcodeGraph.Product: ProjectDescription.Product] = [ .app: .app, .framework: .framework, .staticFramework: .staticFramework, diff --git a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift index 0693070a5d5..c754de35c9f 100644 --- a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift @@ -3,8 +3,8 @@ import MockableTest import ProjectDescription import TSCBasic import TuistCore -import struct TuistGraph.Plugins import TuistSupport +import struct XcodeGraph.Plugins import XCTest @testable import TuistCoreTesting diff --git a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift index e7713f480e6..f772f8703b7 100644 --- a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift @@ -1,9 +1,9 @@ import Foundation import ProjectDescription import TSCBasic -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistCoreTesting @testable import TuistLoader @@ -71,7 +71,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { let result = try subject.loadConfig(path: path) // Then - XCTAssertEqual(result, TuistGraph.Config( + XCTAssertEqual(result, XcodeGraph.Config( compatibleXcodeVersions: .all, cloud: nil, swiftVersion: nil, @@ -111,7 +111,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { let result = try subject.loadConfig(path: "/project/Module/A/") // Then - XCTAssertEqual(result, TuistGraph.Config( + XCTAssertEqual(result, XcodeGraph.Config( compatibleXcodeVersions: .all, cloud: nil, swiftVersion: nil, diff --git a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift index b90c4d15229..4bfd2dd7665 100644 --- a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift @@ -4,9 +4,9 @@ import TSCBasic import TSCUtility import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistSupport +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import ProjectDescription @@ -58,15 +58,15 @@ final class PackageSettingsLoaderTests: TuistUnitTestCase { let got = try subject.loadPackageSettings(at: temporaryPath, with: plugins) // Then - let expected: TuistGraph.PackageSettings = .init( + let expected: XcodeGraph.PackageSettings = .init( productTypes: [:], productDestinations: [:], - baseSettings: TuistGraph.Settings( + baseSettings: XcodeGraph.Settings( base: [:], baseDebug: [:], configurations: [ - .release: TuistGraph.Configuration(settings: [:], xcconfig: nil), - .debug: TuistGraph.Configuration(settings: [:], xcconfig: nil), + .release: XcodeGraph.Configuration(settings: [:], xcconfig: nil), + .debug: XcodeGraph.Configuration(settings: [:], xcconfig: nil), ], defaultSettings: .recommended ), diff --git a/Tests/TuistLoaderTests/Loaders/SwiftPackageManagerDependenciesTests.swift b/Tests/TuistLoaderTests/Loaders/SwiftPackageManagerDependenciesTests.swift index bc1c4d371cc..4e0d872d0eb 100644 --- a/Tests/TuistLoaderTests/Loaders/SwiftPackageManagerDependenciesTests.swift +++ b/Tests/TuistLoaderTests/Loaders/SwiftPackageManagerDependenciesTests.swift @@ -1,7 +1,7 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class SwiftPackageManagerDependenciesTests: TuistUnitTestCase { func test_manifestValue_singleDependency() throws { diff --git a/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift index 6677d2ec7f7..8bac9967ac1 100644 --- a/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift @@ -1,7 +1,7 @@ import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import ProjectDescription @@ -43,7 +43,7 @@ final class TemplateGitLoaderTests: TuistUnitTestCase { var pathToLoadTemplateFrom: AbsolutePath? templateLoader.loadTemplateStub = { path in pathToLoadTemplateFrom = path - return TuistGraph.Template( + return XcodeGraph.Template( description: "" ) } diff --git a/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift index 7fa554bd80a..527a21b4aea 100644 --- a/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift @@ -1,7 +1,7 @@ import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import ProjectDescription @@ -56,7 +56,7 @@ final class TemplateLoaderTests: TuistUnitTestCase { let got = try subject.loadTemplate(at: temporaryPath, plugins: .none) // Then - XCTAssertEqual(got, TuistGraph.Template( + XCTAssertEqual(got, XcodeGraph.Template( description: "desc", items: [Template.Item( path: try RelativePath(validating: "generateOne"), diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift index f271ca378f2..f90d555b59c 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TuistGraph +import XcodeGraph import XCTest @testable import TuistLoader @@ -8,7 +8,7 @@ import XCTest final class CloudManifestMapperTests: TuistUnitTestCase { func test_removes_trailing_back_slash_if_present_in_url() throws { // When - let got = try TuistGraph.Cloud.from( + let got = try XcodeGraph.Cloud.from( manifest: .cloud( projectId: "tuist/tuist", url: "https://cloud.tuist.io/" diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/CodeCoverageMode+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/CodeCoverageMode+ManifestMapperTests.swift index d0b378105a5..3d6f443e74f 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/CodeCoverageMode+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/CodeCoverageMode+ManifestMapperTests.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistLoader @@ -19,7 +19,7 @@ final class CodeCoverageManifestMapperTests: TuistUnitTestCase { let manifest = Manifest.all // When - let got = try TuistGraph.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode + let got = try XcodeGraph.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode .from(manifest: manifest, generatorPaths: generatorPaths) // Then @@ -33,7 +33,7 @@ final class CodeCoverageManifestMapperTests: TuistUnitTestCase { let manifest = Manifest.relevant // When - let got = try TuistGraph.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode + let got = try XcodeGraph.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode .from(manifest: manifest, generatorPaths: generatorPaths) // Then @@ -48,7 +48,7 @@ final class CodeCoverageManifestMapperTests: TuistUnitTestCase { let manifest = Manifest.targets([targetRef]) // When - let got = try TuistGraph.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode + let got = try XcodeGraph.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode .from(manifest: manifest, generatorPaths: generatorPaths) // Then diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Configuration+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Configuration+ManifestMapperTests.swift index 58f964c0686..2af1d4ae20b 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Configuration+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Configuration+ManifestMapperTests.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistLoader @@ -16,7 +16,7 @@ final class ConfigurationManifestMapperTests: TuistUnitTestCase { let generatorPaths = GeneratorPaths(manifestDirectory: temporaryPath) // When - let got = try TuistGraph.Configuration.from(manifest: nil, generatorPaths: generatorPaths) + let got = try XcodeGraph.Configuration.from(manifest: nil, generatorPaths: generatorPaths) // Then XCTAssertNil(got) @@ -35,7 +35,7 @@ final class ConfigurationManifestMapperTests: TuistUnitTestCase { ) // When - let got = try TuistGraph.Configuration.from( + let got = try XcodeGraph.Configuration.from( manifest: manifest, generatorPaths: generatorPaths ) @@ -46,7 +46,7 @@ final class ConfigurationManifestMapperTests: TuistUnitTestCase { return } - guard case let TuistGraph.SettingValue.string(aString) = aSetting else { + guard case let XcodeGraph.SettingValue.string(aString) = aSetting else { XCTFail("Expected A to be a string") return } diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFileElement+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFileElement+ManifestMapperTests.swift index 33251b2e987..de4132d4295 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFileElement+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFileElement+ManifestMapperTests.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistLoader @@ -22,7 +22,7 @@ final class CopyFileElementManifestMapperTests: TuistUnitTestCase { let manifest = ProjectDescription.CopyFileElement.glob(pattern: "Documentation") // When - let model = try TuistGraph.CopyFileElement.from( + let model = try XcodeGraph.CopyFileElement.from( manifest: manifest, generatorPaths: generatorPaths, includeFiles: { !FileHandler.shared.isFolder($0) } @@ -47,7 +47,7 @@ final class CopyFileElementManifestMapperTests: TuistUnitTestCase { let manifest = ProjectDescription.CopyFileElement.folderReference(path: "README.md") // When - let model = try TuistGraph.CopyFileElement.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.CopyFileElement.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertPrinterOutputContains("README.md is not a directory - folder reference paths need to point to directories") @@ -61,7 +61,7 @@ final class CopyFileElementManifestMapperTests: TuistUnitTestCase { let manifest = ProjectDescription.CopyFileElement.folderReference(path: "Documentation") // When - let model = try TuistGraph.CopyFileElement.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.CopyFileElement.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertPrinterOutputContains("Documentation does not exist") @@ -80,6 +80,6 @@ final class CopyFileElementManifestMapperTests: TuistUnitTestCase { let error = GlobError.nonExistentDirectory(invalidGlob) // Then - XCTAssertThrowsSpecific(try TuistGraph.CopyFileElement.from(manifest: manifest, generatorPaths: generatorPaths), error) + XCTAssertThrowsSpecific(try XcodeGraph.CopyFileElement.from(manifest: manifest, generatorPaths: generatorPaths), error) } } diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFilesAction+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFilesAction+ManifestMapperTests.swift index 58d29ff7d08..ffb2be18311 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFilesAction+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFilesAction+ManifestMapperTests.swift @@ -2,7 +2,7 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph +import XcodeGraph import XCTest @testable import TuistLoader @@ -28,7 +28,7 @@ final class CopyFilesManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.CopyFilesAction.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.CopyFilesAction.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertEqual(model.name, "Copy Fonts") @@ -61,7 +61,7 @@ final class CopyFilesManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.CopyFilesAction.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.CopyFilesAction.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertEqual(model.name, "Copy Templates") diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/CoreDataModel+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/CoreDataModel+ManifestMapperTests.swift index 54b7cace648..c4891881ba2 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/CoreDataModel+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/CoreDataModel+ManifestMapperTests.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistLoader @@ -21,7 +21,7 @@ final class CoreDataModelManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.CoreDataModel.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.CoreDataModel.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertTrue(try coreDataModel(model, matches: manifest, at: temporaryPath, generatorPaths: generatorPaths)) @@ -41,7 +41,7 @@ final class CoreDataModelManifestMapperTests: TuistUnitTestCase { let manifestWithoutCurrentVersion = ProjectDescription.CoreDataModel.coreDataModel("model.xcdatamodeld") // When - let model = try TuistGraph.CoreDataModel.from(manifest: manifestWithoutCurrentVersion, generatorPaths: generatorPaths) + let model = try XcodeGraph.CoreDataModel.from(manifest: manifestWithoutCurrentVersion, generatorPaths: generatorPaths) let manifestWithCurrentVersionExplicitly = ProjectDescription.CoreDataModel.coreDataModel( "model.xcdatamodeld", @@ -76,7 +76,7 @@ final class CoreDataModelManifestMapperTests: TuistUnitTestCase { // Then XCTAssertThrowsError( - try TuistGraph.CoreDataModel.from(manifest: manifestWithoutCurrentVersion, generatorPaths: generatorPaths) + try XcodeGraph.CoreDataModel.from(manifest: manifestWithoutCurrentVersion, generatorPaths: generatorPaths) ) } @@ -89,11 +89,11 @@ final class CoreDataModelManifestMapperTests: TuistUnitTestCase { let manifestWithoutCurrentVersion = ProjectDescription.CoreDataModel.coreDataModel("model.xcdatamodeld") XCTAssertEqual( - try TuistGraph.CoreDataModel.from( + try XcodeGraph.CoreDataModel.from( manifest: manifestWithoutCurrentVersion, generatorPaths: generatorPaths ), - TuistGraph.CoreDataModel( + XcodeGraph.CoreDataModel( path: temporaryPath.appending(component: "model.xcdatamodeld"), versions: [], currentVersion: "model" diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/FileElement+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/FileElement+ManifestMapperTests.swift index 7a8b7c177cc..db5fabb255c 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/FileElement+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/FileElement+ManifestMapperTests.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistLoader @@ -22,7 +22,7 @@ final class FileElementManifestMapperTests: TuistUnitTestCase { let manifest = ProjectDescription.FileElement.glob(pattern: "Documentation") // When - let model = try TuistGraph.FileElement.from( + let model = try XcodeGraph.FileElement.from( manifest: manifest, generatorPaths: generatorPaths, includeFiles: { !FileHandler.shared.isFolder($0) } @@ -47,7 +47,7 @@ final class FileElementManifestMapperTests: TuistUnitTestCase { let manifest = ProjectDescription.FileElement.folderReference(path: "README.md") // When - let model = try TuistGraph.FileElement.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.FileElement.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertPrinterOutputContains("README.md is not a directory - folder reference paths need to point to directories") @@ -61,7 +61,7 @@ final class FileElementManifestMapperTests: TuistUnitTestCase { let manifest = ProjectDescription.FileElement.folderReference(path: "Documentation") // When - let model = try TuistGraph.FileElement.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.FileElement.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertPrinterOutputContains("Documentation does not exist") @@ -80,6 +80,6 @@ final class FileElementManifestMapperTests: TuistUnitTestCase { let error = GlobError.nonExistentDirectory(invalidGlob) // Then - XCTAssertThrowsSpecific(try TuistGraph.FileElement.from(manifest: manifest, generatorPaths: generatorPaths), error) + XCTAssertThrowsSpecific(try XcodeGraph.FileElement.from(manifest: manifest, generatorPaths: generatorPaths), error) } } diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Headers+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Headers+ManifestMapperTests.swift index 2f5fac56a86..09d41b26fd8 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Headers+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Headers+ManifestMapperTests.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistLoader @@ -38,7 +38,7 @@ final class HeadersManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.Headers.from( + let model = try XcodeGraph.Headers.from( manifest: manifest, generatorPaths: generatorPaths, productName: "ModuleA" @@ -89,7 +89,7 @@ final class HeadersManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.Headers.from( + let model = try XcodeGraph.Headers.from( manifest: manifest, generatorPaths: generatorPaths, productName: "ModuleA" @@ -132,7 +132,7 @@ final class HeadersManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.Headers.from( + let model = try XcodeGraph.Headers.from( manifest: manifest, generatorPaths: generatorPaths, productName: "ModuleA" @@ -177,7 +177,7 @@ final class HeadersManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.Headers.from( + let model = try XcodeGraph.Headers.from( manifest: manifest, generatorPaths: generatorPaths, productName: "ModuleA" @@ -221,7 +221,7 @@ final class HeadersManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.Headers.from( + let model = try XcodeGraph.Headers.from( manifest: manifest, generatorPaths: generatorPaths, productName: "ModuleA" @@ -264,7 +264,7 @@ final class HeadersManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.Headers.from( + let model = try XcodeGraph.Headers.from( manifest: manifest, generatorPaths: generatorPaths, productName: "ModuleA" @@ -320,7 +320,7 @@ final class HeadersManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.Headers.from( + let model = try XcodeGraph.Headers.from( manifest: manifest, generatorPaths: generatorPaths, productName: "ModuleA" @@ -373,7 +373,7 @@ final class HeadersManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.Headers.from( + let model = try XcodeGraph.Headers.from( manifest: manifest, generatorPaths: generatorPaths, productName: "ModuleA" @@ -436,7 +436,7 @@ final class HeadersManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.Headers.from( + let model = try XcodeGraph.Headers.from( manifest: manifest, generatorPaths: generatorPaths, productName: "TuistTestModule" @@ -503,7 +503,7 @@ final class HeadersManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.Headers.from( + let model = try XcodeGraph.Headers.from( manifest: manifest, generatorPaths: generatorPaths, productName: "TuistTestModule" @@ -570,7 +570,7 @@ final class HeadersManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.Headers.from( + let model = try XcodeGraph.Headers.from( manifest: manifest, generatorPaths: generatorPaths, productName: "TuistTestModule" diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Platform+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Platform+ManifestMapperTests.swift index 049cd3ccb95..4544e0243d6 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Platform+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Platform+ManifestMapperTests.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistLoader @@ -15,7 +15,7 @@ final class PlatformManifestMapperTests: TuistUnitTestCase { let manifest: ProjectDescription.Platform = .iOS // When - let model = try TuistGraph.Platform.from(manifest: manifest) + let model = try XcodeGraph.Platform.from(manifest: manifest) // Then XCTAssertEqual(model, .iOS) @@ -26,7 +26,7 @@ final class PlatformManifestMapperTests: TuistUnitTestCase { let manifest: ProjectDescription.Platform = .tvOS // When - let model = try TuistGraph.Platform.from(manifest: manifest) + let model = try XcodeGraph.Platform.from(manifest: manifest) // Then XCTAssertEqual(model, .tvOS) @@ -37,7 +37,7 @@ final class PlatformManifestMapperTests: TuistUnitTestCase { let manifest: ProjectDescription.Platform = .macOS // When - let model = try TuistGraph.Platform.from(manifest: manifest) + let model = try XcodeGraph.Platform.from(manifest: manifest) // Then XCTAssertEqual(model, .macOS) @@ -48,7 +48,7 @@ final class PlatformManifestMapperTests: TuistUnitTestCase { let manifest: ProjectDescription.Platform = .watchOS // When - let model = try TuistGraph.Platform.from(manifest: manifest) + let model = try XcodeGraph.Platform.from(manifest: manifest) // Then XCTAssertEqual(model, .watchOS) diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift index 5965a849c9e..e8004783505 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift @@ -6,9 +6,9 @@ import TuistLoaderTesting import TuistSupport import XCTest -@testable import TuistGraph @testable import TuistLoader @testable import TuistSupportTesting +@testable import XcodeGraph final class ProjectManifestMapperTests: TuistUnitTestCase { func test_from() throws { @@ -43,7 +43,7 @@ final class ProjectManifestMapperTests: TuistUnitTestCase { fileHandler.stubExists = { _ in true } // When - let got = try TuistGraph.Project.from( + let got = try XcodeGraph.Project.from( manifest: project, generatorPaths: .init(manifestDirectory: "/"), plugins: .none, @@ -55,7 +55,7 @@ final class ProjectManifestMapperTests: TuistUnitTestCase { // Then XCTAssertEqual( got, - TuistGraph.Project( + XcodeGraph.Project( path: "/", sourceRootPath: "/", xcodeProjPath: "/XcodeName.xcodeproj", diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceFileElementManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceFileElementManifestMapperTests.swift index fd005e3931b..f7df045b78f 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceFileElementManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceFileElementManifestMapperTests.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistLoader @@ -22,7 +22,7 @@ final class ResourceFileElementManifestMapperTests: TuistUnitTestCase { let manifest = ProjectDescription.ResourceFileElement.glob(pattern: "Documentation") // When - let model = try TuistGraph.ResourceFileElement.from( + let model = try XcodeGraph.ResourceFileElement.from( manifest: manifest, generatorPaths: generatorPaths, includeFiles: { !FileHandler.shared.isFolder($0) } @@ -47,7 +47,7 @@ final class ResourceFileElementManifestMapperTests: TuistUnitTestCase { let manifest = ProjectDescription.ResourceFileElement.folderReference(path: "README.md") // When - let model = try TuistGraph.ResourceFileElement.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.ResourceFileElement.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertPrinterOutputContains("README.md is not a directory - folder reference paths need to point to directories") @@ -61,7 +61,7 @@ final class ResourceFileElementManifestMapperTests: TuistUnitTestCase { let manifest = ProjectDescription.ResourceFileElement.folderReference(path: "Documentation") // When - let model = try TuistGraph.ResourceFileElement.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.ResourceFileElement.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertPrinterOutputContains("Documentation does not exist") @@ -81,7 +81,7 @@ final class ResourceFileElementManifestMapperTests: TuistUnitTestCase { // Then XCTAssertThrowsSpecific( - try TuistGraph.ResourceFileElement.from(manifest: manifest, generatorPaths: generatorPaths), + try XcodeGraph.ResourceFileElement.from(manifest: manifest, generatorPaths: generatorPaths), error ) } @@ -99,7 +99,7 @@ final class ResourceFileElementManifestMapperTests: TuistUnitTestCase { // Then XCTAssertEqual( - try TuistGraph.ResourceFileElement.from(manifest: manifest, generatorPaths: generatorPaths), + try XcodeGraph.ResourceFileElement.from(manifest: manifest, generatorPaths: generatorPaths), [ .file(path: resourcesFolder, tags: []), .file(path: includedResource, tags: []), @@ -121,7 +121,7 @@ final class ResourceFileElementManifestMapperTests: TuistUnitTestCase { // Then XCTAssertEqual( - try TuistGraph.ResourceFileElement.from(manifest: manifest, generatorPaths: generatorPaths), + try XcodeGraph.ResourceFileElement.from(manifest: manifest, generatorPaths: generatorPaths), [ .file(path: resourcesFolder, tags: []), .file(path: includedResource, tags: []), @@ -143,7 +143,7 @@ final class ResourceFileElementManifestMapperTests: TuistUnitTestCase { // Then XCTAssertEqual( - try TuistGraph.ResourceFileElement.from(manifest: manifest, generatorPaths: generatorPaths), + try XcodeGraph.ResourceFileElement.from(manifest: manifest, generatorPaths: generatorPaths), [ .file(path: resourcesFolder, tags: []), .file(path: includedResource, tags: []), @@ -165,7 +165,7 @@ final class ResourceFileElementManifestMapperTests: TuistUnitTestCase { // Then XCTAssertEqual( - try TuistGraph.ResourceFileElement.from(manifest: manifest, generatorPaths: generatorPaths), + try XcodeGraph.ResourceFileElement.from(manifest: manifest, generatorPaths: generatorPaths), [] ) } diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceSynthesizer+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceSynthesizer+ManifestMapperTests.swift index 9dcd7a00570..f806f642820 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceSynthesizer+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceSynthesizer+ManifestMapperTests.swift @@ -2,9 +2,9 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistLoaderTesting import TuistSupportTesting +import XcodeGraph import XCTest @testable import TuistLoader diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Scheme+ManifestMapper.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Scheme+ManifestMapper.swift index c5e86e2bc72..a9960f3b8ef 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Scheme+ManifestMapper.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Scheme+ManifestMapper.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistLoader @@ -20,7 +20,7 @@ final class SchemeManifestMapperTests: TuistUnitTestCase { let generatorPaths = GeneratorPaths(manifestDirectory: projectPath) // When - let model = try TuistGraph.Scheme.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.Scheme.from(manifest: manifest, generatorPaths: generatorPaths) // Then try assert(scheme: model, matches: manifest, path: projectPath, generatorPaths: generatorPaths) @@ -60,7 +60,7 @@ final class SchemeManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.Scheme.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.Scheme.from(manifest: manifest, generatorPaths: generatorPaths) // Then try assert(scheme: model, matches: manifest, path: projectPath, generatorPaths: generatorPaths) diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Settings+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Settings+ManifestMapperTests.swift index ef1beb19482..3c9c7b6af59 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Settings+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Settings+ManifestMapperTests.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistLoader @@ -33,7 +33,7 @@ final class SettingsManifestMapperTests: TuistUnitTestCase { ) // When - let model = try TuistGraph.Settings.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.Settings.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertSettingsMatchesManifest(settings: model, matches: manifest, at: temporaryPath, generatorPaths: generatorPaths) diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Stencil+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Stencil+ManifestMapperTests.swift index 51856244641..59fd3a59ccc 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Stencil+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Stencil+ManifestMapperTests.swift @@ -2,9 +2,9 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistLoaderTesting import TuistSupportTesting +import XcodeGraph import XCTest @testable import TuistLoader diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift index f5304d0c136..eb211856e06 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistLoader @@ -16,7 +16,7 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let generatorPaths = GeneratorPaths(manifestDirectory: try AbsolutePath(validating: "/")) // When - let got = try TuistGraph.TargetDependency.from( + let got = try XcodeGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, externalDependencies: ["library": [.xcframework(path: "/path.xcframework", status: .required)]] @@ -38,7 +38,7 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let generatorPaths = GeneratorPaths(manifestDirectory: try AbsolutePath(validating: "/")) // When - let got = try TuistGraph.TargetDependency.from( + let got = try XcodeGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, externalDependencies: ["library": [.project(target: "Target", path: "/Project")]] @@ -60,7 +60,7 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let generatorPaths = GeneratorPaths(manifestDirectory: try AbsolutePath(validating: "/")) // When - let got = try TuistGraph.TargetDependency.from( + let got = try XcodeGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, externalDependencies: [ @@ -94,7 +94,7 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let generatorPaths = GeneratorPaths(manifestDirectory: try AbsolutePath(validating: "/")) // When - let got = try TuistGraph.TargetDependency.from( + let got = try XcodeGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, externalDependencies: [:] @@ -116,7 +116,7 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let generatorPaths = GeneratorPaths(manifestDirectory: try AbsolutePath(validating: "/")) // When - let got = try TuistGraph.TargetDependency.from( + let got = try XcodeGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, externalDependencies: [:] @@ -138,7 +138,7 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let generatorPaths = GeneratorPaths(manifestDirectory: try AbsolutePath(validating: "/")) // When - let got = try TuistGraph.TargetDependency.from( + let got = try XcodeGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, externalDependencies: [:] @@ -160,7 +160,7 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let generatorPaths = GeneratorPaths(manifestDirectory: try AbsolutePath(validating: "/")) // When - let got = try TuistGraph.TargetDependency.from( + let got = try XcodeGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, externalDependencies: [:] @@ -182,7 +182,7 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { let generatorPaths = GeneratorPaths(manifestDirectory: try AbsolutePath(validating: "/")) // When - let got = try TuistGraph.TargetDependency.from( + let got = try XcodeGraph.TargetDependency.from( manifest: dependency, generatorPaths: generatorPaths, externalDependencies: [:] diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetScript+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetScript+ManifestMapperTests.swift index ec6612b506f..680b26cad1e 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetScript+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetScript+ManifestMapperTests.swift @@ -2,8 +2,8 @@ import Foundation import ProjectDescription import TSCBasic import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistLoader @@ -21,7 +21,7 @@ final class TargetScriptManifestMapperTests: TuistUnitTestCase { arguments: ["arg1", "arg2"] ) // When - let model = try TuistGraph.TargetScript.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.TargetScript.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertEqual(model.name, "MyScript") @@ -57,7 +57,7 @@ final class TargetScriptManifestMapperTests: TuistUnitTestCase { outputFileListPaths: ["$(SRCROOT)/foo/bar/**/*.swift"] ) // When - let model = try TuistGraph.TargetScript.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.TargetScript.from(manifest: manifest, generatorPaths: generatorPaths) // Then let relativeSources = try model.inputPaths.map { try AbsolutePath(validating: $0).relative(to: temporaryPath).pathString } @@ -123,7 +123,7 @@ final class TargetScriptManifestMapperTests: TuistUnitTestCase { outputFileListPaths: ["$(SRCROOT)/foo/bar/**/*.swift"] ) // When - let model = try TuistGraph.TargetScript.from(manifest: manifest, generatorPaths: generatorPaths) + let model = try XcodeGraph.TargetScript.from(manifest: manifest, generatorPaths: generatorPaths) // Then let relativeSources = try model.inputPaths.map { try AbsolutePath(validating: $0).relative(to: temporaryPath).pathString } diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/WorkspaceGenerationOptions+ManifestWrapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/WorkspaceGenerationOptions+ManifestWrapperTests.swift index a01be850999..bd7f9e1c4be 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/WorkspaceGenerationOptions+ManifestWrapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/WorkspaceGenerationOptions+ManifestWrapperTests.swift @@ -1,9 +1,9 @@ import Foundation import ProjectDescription import TuistCore -import TuistGraph import TuistSupport import TuistSupportTesting +import XcodeGraph import XCTest @testable import TuistLoader @@ -21,7 +21,7 @@ final class WorkspaceGenerationOptionsManifestMapperTests: TuistTestCase { ) // When - let actual = try TuistGraph.Workspace.GenerationOptions.from(manifest: manifest, generatorPaths: generatorPaths) + let actual = try XcodeGraph.Workspace.GenerationOptions.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertEqual( @@ -45,7 +45,7 @@ final class WorkspaceGenerationOptionsManifestMapperTests: TuistTestCase { ) // When - let actual = try TuistGraph.Workspace.GenerationOptions.from(manifest: manifest, generatorPaths: generatorPaths) + let actual = try XcodeGraph.Workspace.GenerationOptions.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertEqual( @@ -70,7 +70,7 @@ final class WorkspaceGenerationOptionsManifestMapperTests: TuistTestCase { ) // When - let actual = try TuistGraph.Workspace.GenerationOptions.from(manifest: manifest, generatorPaths: generatorPaths) + let actual = try XcodeGraph.Workspace.GenerationOptions.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertEqual( @@ -97,7 +97,7 @@ final class WorkspaceGenerationOptionsManifestMapperTests: TuistTestCase { ) // When - let actual = try TuistGraph.Workspace.GenerationOptions.from(manifest: manifest, generatorPaths: generatorPaths) + let actual = try XcodeGraph.Workspace.GenerationOptions.from(manifest: manifest, generatorPaths: generatorPaths) // Then XCTAssertEqual( diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoGraphPlatformTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoGraphPlatformTests.swift index 26643f23ffa..6f88edf8a73 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoGraphPlatformTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoGraphPlatformTests.swift @@ -1,7 +1,7 @@ import Foundation import ProjectDescription -import TuistGraph import TuistSupport +import XcodeGraph import XCTest diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 8e003a0eeb4..25bbc8423c7 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -2,8 +2,8 @@ import ProjectDescription import TSCBasic import TSCUtility import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistCoreTesting @@ -2241,7 +2241,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { let sourcesPath = basePath.appending(try RelativePath(validating: "Package/Sources/Target1")) try fileHandler.createFolder(sourcesPath) - let customSettings: TuistGraph.SettingsDictionary = ["CUSTOM_SETTING": .string("CUSTOM_VALUE")] + let customSettings: XcodeGraph.SettingsDictionary = ["CUSTOM_SETTING": .string("CUSTOM_VALUE")] let targetSettings = ["Target1": customSettings] @@ -3309,7 +3309,7 @@ extension PackageInfoMapping { basePath: AbsolutePath = "/", packageType: PackageType? = nil, packageInfos: [String: PackageInfo] = [:], - packageSettings: TuistGraph.PackageSettings = .test( + packageSettings: XcodeGraph.PackageSettings = .test( baseSettings: .default ) ) throws -> ProjectDescription.Project? { diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift index 7cbbd1bc8b7..35ec87940a5 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift @@ -2,8 +2,8 @@ import ProjectDescription import TSCBasic import TSCUtility import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistLoader @@ -249,7 +249,7 @@ final class SettingsMapperTests: XCTestCase { // OTHER_LDFLAGS -extension TuistGraph.SettingsDictionary { +extension XcodeGraph.SettingsDictionary { func stringValueFor(_ key: String) throws -> String { try XCTUnwrap(self[key]?.stringValue) } @@ -259,7 +259,7 @@ extension TuistGraph.SettingsDictionary { } } -extension TuistGraph.SettingValue { +extension XcodeGraph.SettingValue { var stringValue: String? { if case let .string(string) = self { return string diff --git a/Tests/TuistPluginTests/PluginServiceTests.swift b/Tests/TuistPluginTests/PluginServiceTests.swift index 8686a0789ef..43848bc4701 100644 --- a/Tests/TuistPluginTests/PluginServiceTests.swift +++ b/Tests/TuistPluginTests/PluginServiceTests.swift @@ -3,14 +3,14 @@ import ProjectDescription import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraph -import TuistGraphTesting import TuistLoader import TuistLoaderTesting import TuistScaffold import TuistScaffoldTesting import TuistSupport import TuistSupportTesting +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistPlugin @@ -253,7 +253,7 @@ final class PluginServiceTests: TuistUnitTestCase { ProjectDescription.Plugin(name: pluginName) } - let config = mockConfig(plugins: [TuistGraph.PluginLocation.local(path: pluginPath.pathString)]) + let config = mockConfig(plugins: [XcodeGraph.PluginLocation.local(path: pluginPath.pathString)]) try fileHandler.createFolder( pluginPath.appending(component: Constants.helpersDirectoryName) @@ -294,7 +294,7 @@ final class PluginServiceTests: TuistUnitTestCase { try fileHandler.createFolder(cachedPluginPath.appending(component: Constants.helpersDirectoryName)) let config = mockConfig(plugins: [ - TuistGraph.PluginLocation.git( + XcodeGraph.PluginLocation.git( url: pluginGitUrl, gitReference: .tag(pluginGitReference), directory: nil, @@ -331,7 +331,7 @@ final class PluginServiceTests: TuistUnitTestCase { ProjectDescription.Plugin(name: pluginName) } - let config = mockConfig(plugins: [TuistGraph.PluginLocation.local(path: pluginPath.pathString)]) + let config = mockConfig(plugins: [XcodeGraph.PluginLocation.local(path: pluginPath.pathString)]) // When let plugins = try await subject.loadPlugins(using: config) @@ -368,7 +368,7 @@ final class PluginServiceTests: TuistUnitTestCase { let config = mockConfig(plugins: [ - TuistGraph.PluginLocation.git( + XcodeGraph.PluginLocation.git( url: pluginGitUrl, gitReference: .tag(pluginGitReference), directory: nil, @@ -408,7 +408,7 @@ final class PluginServiceTests: TuistUnitTestCase { ProjectDescription.Plugin(name: pluginName) } - let config = mockConfig(plugins: [TuistGraph.PluginLocation.local(path: pluginPath.pathString)]) + let config = mockConfig(plugins: [XcodeGraph.PluginLocation.local(path: pluginPath.pathString)]) // Then let plugins = try await subject.loadPlugins(using: config) @@ -447,7 +447,7 @@ final class PluginServiceTests: TuistUnitTestCase { let config = mockConfig(plugins: [ - TuistGraph.PluginLocation + XcodeGraph.PluginLocation .git(url: pluginGitUrl, gitReference: .tag(pluginGitReference), directory: nil, releaseUrl: nil), ]) @@ -457,7 +457,7 @@ final class PluginServiceTests: TuistUnitTestCase { XCTAssertEqual(plugins, expectedPlugins) } - private func mockConfig(plugins: [TuistGraph.PluginLocation]) -> TuistGraph.Config { + private func mockConfig(plugins: [XcodeGraph.PluginLocation]) -> XcodeGraph.Config { Config( compatibleXcodeVersions: .all, cloud: nil, diff --git a/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift b/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift index aeebe909dd1..392e423ac0e 100644 --- a/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift +++ b/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistCore diff --git a/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift b/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift index 3db832d696e..28a61df27ee 100644 --- a/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift +++ b/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift @@ -1,8 +1,8 @@ import TSCBasic import TSCUtility import TuistCore -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistSupportTesting diff --git a/Tests/TuistGraphTests/DependenciesGraph/DependenciesGraphTests.swift b/Tests/XcodeGraphTests/DependenciesGraph/DependenciesGraphTests.swift similarity index 91% rename from Tests/TuistGraphTests/DependenciesGraph/DependenciesGraphTests.swift rename to Tests/XcodeGraphTests/DependenciesGraph/DependenciesGraphTests.swift index bd398e6055f..718152be870 100644 --- a/Tests/TuistGraphTests/DependenciesGraph/DependenciesGraphTests.swift +++ b/Tests/XcodeGraphTests/DependenciesGraph/DependenciesGraphTests.swift @@ -2,8 +2,8 @@ import Foundation import TuistSupport import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class DependenciesGraphTests: TuistUnitTestCase { func test_codable_xcframework() { diff --git a/Tests/TuistGraphTests/Graph/GraphDependencyTests.swift b/Tests/XcodeGraphTests/Graph/GraphDependencyTests.swift similarity index 98% rename from Tests/TuistGraphTests/Graph/GraphDependencyTests.swift rename to Tests/XcodeGraphTests/Graph/GraphDependencyTests.swift index 9cc2e18b7f0..0dcaa17ba26 100644 --- a/Tests/TuistGraphTests/Graph/GraphDependencyTests.swift +++ b/Tests/XcodeGraphTests/Graph/GraphDependencyTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class GraphDependencyTests: TuistUnitTestCase { func test_codable_target() { diff --git a/Tests/TuistGraphTests/Graph/GraphTargetTests.swift b/Tests/XcodeGraphTests/Graph/GraphTargetTests.swift similarity index 90% rename from Tests/TuistGraphTests/Graph/GraphTargetTests.swift rename to Tests/XcodeGraphTests/Graph/GraphTargetTests.swift index 743f48a80b2..b61990f7516 100644 --- a/Tests/TuistGraphTests/Graph/GraphTargetTests.swift +++ b/Tests/XcodeGraphTests/Graph/GraphTargetTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class GraphTargetTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Graph/GraphTests.swift b/Tests/XcodeGraphTests/Graph/GraphTests.swift similarity index 90% rename from Tests/TuistGraphTests/Graph/GraphTests.swift rename to Tests/XcodeGraphTests/Graph/GraphTests.swift index 8ba1154730e..71257735355 100644 --- a/Tests/TuistGraphTests/Graph/GraphTests.swift +++ b/Tests/XcodeGraphTests/Graph/GraphTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class GraphTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/AnalyzeActionTests.swift b/Tests/XcodeGraphTests/Models/AnalyzeActionTests.swift similarity index 91% rename from Tests/TuistGraphTests/Models/AnalyzeActionTests.swift rename to Tests/XcodeGraphTests/Models/AnalyzeActionTests.swift index 5bb2c79c0fd..ed3c9b2b3a7 100644 --- a/Tests/TuistGraphTests/Models/AnalyzeActionTests.swift +++ b/Tests/XcodeGraphTests/Models/AnalyzeActionTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class AnalyzeActionTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/ArchiveActionTests.swift b/Tests/XcodeGraphTests/Models/ArchiveActionTests.swift similarity index 97% rename from Tests/TuistGraphTests/Models/ArchiveActionTests.swift rename to Tests/XcodeGraphTests/Models/ArchiveActionTests.swift index 37235a281ba..d5b2e9a2400 100644 --- a/Tests/TuistGraphTests/Models/ArchiveActionTests.swift +++ b/Tests/XcodeGraphTests/Models/ArchiveActionTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class ArchiveActionTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/ArgumentsTests.swift b/Tests/XcodeGraphTests/Models/ArgumentsTests.swift similarity index 95% rename from Tests/TuistGraphTests/Models/ArgumentsTests.swift rename to Tests/XcodeGraphTests/Models/ArgumentsTests.swift index 11a4de86850..c2164a8f098 100644 --- a/Tests/TuistGraphTests/Models/ArgumentsTests.swift +++ b/Tests/XcodeGraphTests/Models/ArgumentsTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class ArgumentsTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/BinaryArchitectureTests.swift b/Tests/XcodeGraphTests/Models/BinaryArchitectureTests.swift similarity index 97% rename from Tests/TuistGraphTests/Models/BinaryArchitectureTests.swift rename to Tests/XcodeGraphTests/Models/BinaryArchitectureTests.swift index 51d6480e2f3..e6445069ae7 100644 --- a/Tests/TuistGraphTests/Models/BinaryArchitectureTests.swift +++ b/Tests/XcodeGraphTests/Models/BinaryArchitectureTests.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic -import TuistGraph import TuistSupport +import XcodeGraph import XCTest @testable import TuistSupportTesting diff --git a/Tests/TuistGraphTests/Models/BuildActionTests.swift b/Tests/XcodeGraphTests/Models/BuildActionTests.swift similarity index 97% rename from Tests/TuistGraphTests/Models/BuildActionTests.swift rename to Tests/XcodeGraphTests/Models/BuildActionTests.swift index 32a4b3b67c2..395b09a6765 100644 --- a/Tests/TuistGraphTests/Models/BuildActionTests.swift +++ b/Tests/XcodeGraphTests/Models/BuildActionTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class BuildActionTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/BuildConfigurationTests.swift b/Tests/XcodeGraphTests/Models/BuildConfigurationTests.swift similarity index 98% rename from Tests/TuistGraphTests/Models/BuildConfigurationTests.swift rename to Tests/XcodeGraphTests/Models/BuildConfigurationTests.swift index c9325af837e..dbc3c536488 100644 --- a/Tests/TuistGraphTests/Models/BuildConfigurationTests.swift +++ b/Tests/XcodeGraphTests/Models/BuildConfigurationTests.swift @@ -2,8 +2,8 @@ import Foundation import TuistCore import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class BuildConfigurationTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/BuildRule.CompilerSpecTests.swift b/Tests/XcodeGraphTests/Models/BuildRule.CompilerSpecTests.swift similarity index 91% rename from Tests/TuistGraphTests/Models/BuildRule.CompilerSpecTests.swift rename to Tests/XcodeGraphTests/Models/BuildRule.CompilerSpecTests.swift index 192d4ebe0a5..95f95d5ea83 100644 --- a/Tests/TuistGraphTests/Models/BuildRule.CompilerSpecTests.swift +++ b/Tests/XcodeGraphTests/Models/BuildRule.CompilerSpecTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class BuildRuleCompilerSpecTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/BuildRule.FileTypeTests.swift b/Tests/XcodeGraphTests/Models/BuildRule.FileTypeTests.swift similarity index 91% rename from Tests/TuistGraphTests/Models/BuildRule.FileTypeTests.swift rename to Tests/XcodeGraphTests/Models/BuildRule.FileTypeTests.swift index 0e6e9a18fe7..b9ab2aae709 100644 --- a/Tests/TuistGraphTests/Models/BuildRule.FileTypeTests.swift +++ b/Tests/XcodeGraphTests/Models/BuildRule.FileTypeTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class BuildRuleFileTypeTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/BuildRuleTests.swift b/Tests/XcodeGraphTests/Models/BuildRuleTests.swift similarity index 92% rename from Tests/TuistGraphTests/Models/BuildRuleTests.swift rename to Tests/XcodeGraphTests/Models/BuildRuleTests.swift index e8cf0a5d1d7..03fc38c6cef 100644 --- a/Tests/TuistGraphTests/Models/BuildRuleTests.swift +++ b/Tests/XcodeGraphTests/Models/BuildRuleTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class BuildRuleTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/CompatibleXcodeVersionsTests.swift b/Tests/XcodeGraphTests/Models/CompatibleXcodeVersionsTests.swift similarity index 99% rename from Tests/TuistGraphTests/Models/CompatibleXcodeVersionsTests.swift rename to Tests/XcodeGraphTests/Models/CompatibleXcodeVersionsTests.swift index bbfe7a8f409..f0aed625378 100644 --- a/Tests/TuistGraphTests/Models/CompatibleXcodeVersionsTests.swift +++ b/Tests/XcodeGraphTests/Models/CompatibleXcodeVersionsTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class CompatibleXcodeVersionsTests: XCTestCase { func test_isCompatible_when_all() { diff --git a/Tests/TuistGraphTests/Models/CopyFileElementTests.swift b/Tests/XcodeGraphTests/Models/CopyFileElementTests.swift similarity index 95% rename from Tests/TuistGraphTests/Models/CopyFileElementTests.swift rename to Tests/XcodeGraphTests/Models/CopyFileElementTests.swift index 2c75661d7fe..9d6d07b9938 100644 --- a/Tests/TuistGraphTests/Models/CopyFileElementTests.swift +++ b/Tests/XcodeGraphTests/Models/CopyFileElementTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class CopyFileElementTests: TuistUnitTestCase { func test_codable_file() { diff --git a/Tests/TuistGraphTests/Models/CopyFilesActionTests.swift b/Tests/XcodeGraphTests/Models/CopyFilesActionTests.swift similarity index 94% rename from Tests/TuistGraphTests/Models/CopyFilesActionTests.swift rename to Tests/XcodeGraphTests/Models/CopyFilesActionTests.swift index 8ac858d25df..992a71a80be 100644 --- a/Tests/TuistGraphTests/Models/CopyFilesActionTests.swift +++ b/Tests/XcodeGraphTests/Models/CopyFilesActionTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class CopyFilesActionTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/CoreDataModelTests.swift b/Tests/XcodeGraphTests/Models/CoreDataModelTests.swift similarity index 93% rename from Tests/TuistGraphTests/Models/CoreDataModelTests.swift rename to Tests/XcodeGraphTests/Models/CoreDataModelTests.swift index d8f3a27411f..0a57ee88053 100644 --- a/Tests/TuistGraphTests/Models/CoreDataModelTests.swift +++ b/Tests/XcodeGraphTests/Models/CoreDataModelTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class CoreDataModelTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/ExecutionActionTests.swift b/Tests/XcodeGraphTests/Models/ExecutionActionTests.swift similarity index 94% rename from Tests/TuistGraphTests/Models/ExecutionActionTests.swift rename to Tests/XcodeGraphTests/Models/ExecutionActionTests.swift index 4133294200b..9ef50e0e6d4 100644 --- a/Tests/TuistGraphTests/Models/ExecutionActionTests.swift +++ b/Tests/XcodeGraphTests/Models/ExecutionActionTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class ExecutionActionTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/FileElementTests.swift b/Tests/XcodeGraphTests/Models/FileElementTests.swift similarity index 94% rename from Tests/TuistGraphTests/Models/FileElementTests.swift rename to Tests/XcodeGraphTests/Models/FileElementTests.swift index 966518bd56f..6824223a735 100644 --- a/Tests/TuistGraphTests/Models/FileElementTests.swift +++ b/Tests/XcodeGraphTests/Models/FileElementTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class FileElementTests: TuistUnitTestCase { func test_codable_file() { diff --git a/Tests/TuistGraphTests/Models/HeadersTests.swift b/Tests/XcodeGraphTests/Models/HeadersTests.swift similarity index 94% rename from Tests/TuistGraphTests/Models/HeadersTests.swift rename to Tests/XcodeGraphTests/Models/HeadersTests.swift index 8a9b015970b..ba173863275 100644 --- a/Tests/TuistGraphTests/Models/HeadersTests.swift +++ b/Tests/XcodeGraphTests/Models/HeadersTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class HeadersTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/IDETemplateMacrosTests.swift b/Tests/XcodeGraphTests/Models/IDETemplateMacrosTests.swift similarity index 98% rename from Tests/TuistGraphTests/Models/IDETemplateMacrosTests.swift rename to Tests/XcodeGraphTests/Models/IDETemplateMacrosTests.swift index eb44c9878fc..a28118d478d 100644 --- a/Tests/TuistGraphTests/Models/IDETemplateMacrosTests.swift +++ b/Tests/XcodeGraphTests/Models/IDETemplateMacrosTests.swift @@ -1,4 +1,4 @@ -import TuistGraph +import XcodeGraph import XCTest final class IDETemplateMacrosTests: XCTestCase { diff --git a/Tests/TuistGraphTests/Models/InfoPlistTests.swift b/Tests/XcodeGraphTests/Models/InfoPlistTests.swift similarity index 97% rename from Tests/TuistGraphTests/Models/InfoPlistTests.swift rename to Tests/XcodeGraphTests/Models/InfoPlistTests.swift index 76f93d8679c..808fea62267 100644 --- a/Tests/TuistGraphTests/Models/InfoPlistTests.swift +++ b/Tests/XcodeGraphTests/Models/InfoPlistTests.swift @@ -2,8 +2,8 @@ import Foundation import TSCBasic import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class InfoPlistTests: XCTestCase { func test_codable_file() { diff --git a/Tests/TuistGraphTests/Models/LintingIssueTests.swift b/Tests/XcodeGraphTests/Models/LintingIssueTests.swift similarity index 98% rename from Tests/TuistGraphTests/Models/LintingIssueTests.swift rename to Tests/XcodeGraphTests/Models/LintingIssueTests.swift index d6bc6e6c1d7..d934b5a63c9 100644 --- a/Tests/TuistGraphTests/Models/LintingIssueTests.swift +++ b/Tests/XcodeGraphTests/Models/LintingIssueTests.swift @@ -2,8 +2,8 @@ import Foundation import TSCBasic import TuistCore import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class LintingIssueTests: TuistUnitTestCase { func test_description() { diff --git a/Tests/TuistGraphTests/Models/PackageTests.swift b/Tests/XcodeGraphTests/Models/PackageTests.swift similarity index 97% rename from Tests/TuistGraphTests/Models/PackageTests.swift rename to Tests/XcodeGraphTests/Models/PackageTests.swift index ccf145c7413..655016e304e 100644 --- a/Tests/TuistGraphTests/Models/PackageTests.swift +++ b/Tests/XcodeGraphTests/Models/PackageTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class PackageTests: TuistUnitTestCase { func test_codable_local() { diff --git a/Tests/TuistGraphTests/Models/PlatformFilterTests.swift b/Tests/XcodeGraphTests/Models/PlatformFilterTests.swift similarity index 97% rename from Tests/TuistGraphTests/Models/PlatformFilterTests.swift rename to Tests/XcodeGraphTests/Models/PlatformFilterTests.swift index 59faa4fcddc..57945601bf8 100644 --- a/Tests/TuistGraphTests/Models/PlatformFilterTests.swift +++ b/Tests/XcodeGraphTests/Models/PlatformFilterTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class PlatformFilterTests: TuistUnitTestCase { func test_xcodeprojValue() { diff --git a/Tests/TuistGraphTests/Models/PlatformTests.swift b/Tests/XcodeGraphTests/Models/PlatformTests.swift similarity index 99% rename from Tests/TuistGraphTests/Models/PlatformTests.swift rename to Tests/XcodeGraphTests/Models/PlatformTests.swift index 11833f8e465..c7a03f63da7 100644 --- a/Tests/TuistGraphTests/Models/PlatformTests.swift +++ b/Tests/XcodeGraphTests/Models/PlatformTests.swift @@ -1,6 +1,6 @@ import Foundation import XCTest -@testable import TuistGraph +@testable import XcodeGraph final class PlatformTests: XCTestCase { func test_codable_iOS() { diff --git a/Tests/TuistGraphTests/Models/ProductTests.swift b/Tests/XcodeGraphTests/Models/ProductTests.swift similarity index 99% rename from Tests/TuistGraphTests/Models/ProductTests.swift rename to Tests/XcodeGraphTests/Models/ProductTests.swift index 525845965a7..d7b34943505 100644 --- a/Tests/TuistGraphTests/Models/ProductTests.swift +++ b/Tests/XcodeGraphTests/Models/ProductTests.swift @@ -1,7 +1,7 @@ import Foundation import XcodeProj import XCTest -@testable import TuistGraph +@testable import XcodeGraph final class ProductTests: XCTestCase { func test_codable_app() { diff --git a/Tests/TuistGraphTests/Models/ProfileActionTests.swift b/Tests/XcodeGraphTests/Models/ProfileActionTests.swift similarity index 96% rename from Tests/TuistGraphTests/Models/ProfileActionTests.swift rename to Tests/XcodeGraphTests/Models/ProfileActionTests.swift index 01518474041..58ed1acdf26 100644 --- a/Tests/TuistGraphTests/Models/ProfileActionTests.swift +++ b/Tests/XcodeGraphTests/Models/ProfileActionTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class ProfileActionTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/ProjectGroupTests.swift b/Tests/XcodeGraphTests/Models/ProjectGroupTests.swift similarity index 90% rename from Tests/TuistGraphTests/Models/ProjectGroupTests.swift rename to Tests/XcodeGraphTests/Models/ProjectGroupTests.swift index c4cdf404b53..aea23cf955c 100644 --- a/Tests/TuistGraphTests/Models/ProjectGroupTests.swift +++ b/Tests/XcodeGraphTests/Models/ProjectGroupTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class ProjectGroupTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/ProjectTests.swift b/Tests/XcodeGraphTests/Models/ProjectTests.swift similarity index 97% rename from Tests/TuistGraphTests/Models/ProjectTests.swift rename to Tests/XcodeGraphTests/Models/ProjectTests.swift index 4bb76568a0c..ceb574895fa 100644 --- a/Tests/TuistGraphTests/Models/ProjectTests.swift +++ b/Tests/XcodeGraphTests/Models/ProjectTests.swift @@ -2,9 +2,9 @@ import Foundation import TSCBasic import TuistCore import TuistCoreTesting -import TuistGraphTesting +import XcodeGraphTesting import XCTest -@testable import TuistGraph +@testable import XcodeGraph final class ProjectTests: XCTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/RawScriptBuildPhaseTests.swift b/Tests/XcodeGraphTests/Models/RawScriptBuildPhaseTests.swift similarity index 93% rename from Tests/TuistGraphTests/Models/RawScriptBuildPhaseTests.swift rename to Tests/XcodeGraphTests/Models/RawScriptBuildPhaseTests.swift index 9afefd47801..bc84ce11975 100644 --- a/Tests/TuistGraphTests/Models/RawScriptBuildPhaseTests.swift +++ b/Tests/XcodeGraphTests/Models/RawScriptBuildPhaseTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class RawScriptBuildPhaseTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/RequirementTests.swift b/Tests/XcodeGraphTests/Models/RequirementTests.swift similarity index 94% rename from Tests/TuistGraphTests/Models/RequirementTests.swift rename to Tests/XcodeGraphTests/Models/RequirementTests.swift index 9f983d7177f..39ec0e7502a 100644 --- a/Tests/TuistGraphTests/Models/RequirementTests.swift +++ b/Tests/XcodeGraphTests/Models/RequirementTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class RequirementTests: TuistUnitTestCase { func test_codable_range() { diff --git a/Tests/TuistGraphTests/Models/ResourceFileElementTests.swift b/Tests/XcodeGraphTests/Models/ResourceFileElementTests.swift similarity index 95% rename from Tests/TuistGraphTests/Models/ResourceFileElementTests.swift rename to Tests/XcodeGraphTests/Models/ResourceFileElementTests.swift index da65b35cc94..cc9a6963ae8 100644 --- a/Tests/TuistGraphTests/Models/ResourceFileElementTests.swift +++ b/Tests/XcodeGraphTests/Models/ResourceFileElementTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class ResourceFileElementTests: TuistUnitTestCase { func test_codable_file() { diff --git a/Tests/TuistGraphTests/Models/ResourceSynthesizerTests.swift b/Tests/XcodeGraphTests/Models/ResourceSynthesizerTests.swift similarity index 94% rename from Tests/TuistGraphTests/Models/ResourceSynthesizerTests.swift rename to Tests/XcodeGraphTests/Models/ResourceSynthesizerTests.swift index 363b00ce4d3..d9e08e72b85 100644 --- a/Tests/TuistGraphTests/Models/ResourceSynthesizerTests.swift +++ b/Tests/XcodeGraphTests/Models/ResourceSynthesizerTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class ResourceSynthesizerTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/RunActionTests.swift b/Tests/XcodeGraphTests/Models/RunActionTests.swift similarity index 97% rename from Tests/TuistGraphTests/Models/RunActionTests.swift rename to Tests/XcodeGraphTests/Models/RunActionTests.swift index 95b86027e93..09ddff9fc97 100644 --- a/Tests/TuistGraphTests/Models/RunActionTests.swift +++ b/Tests/XcodeGraphTests/Models/RunActionTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class RunActionTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/SDKSourceTests.swift b/Tests/XcodeGraphTests/Models/SDKSourceTests.swift similarity index 93% rename from Tests/TuistGraphTests/Models/SDKSourceTests.swift rename to Tests/XcodeGraphTests/Models/SDKSourceTests.swift index e2d7729a7b9..7e7f11f2269 100644 --- a/Tests/TuistGraphTests/Models/SDKSourceTests.swift +++ b/Tests/XcodeGraphTests/Models/SDKSourceTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class SDKSourceTests: TuistUnitTestCase { func test_codable_developer() { diff --git a/Tests/TuistGraphTests/Models/SchemeTests.swift b/Tests/XcodeGraphTests/Models/SchemeTests.swift similarity index 90% rename from Tests/TuistGraphTests/Models/SchemeTests.swift rename to Tests/XcodeGraphTests/Models/SchemeTests.swift index bd006d50925..be187dcb0db 100644 --- a/Tests/TuistGraphTests/Models/SchemeTests.swift +++ b/Tests/XcodeGraphTests/Models/SchemeTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class SchemeTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/SettingsTests.swift b/Tests/XcodeGraphTests/Models/SettingsTests.swift similarity index 99% rename from Tests/TuistGraphTests/Models/SettingsTests.swift rename to Tests/XcodeGraphTests/Models/SettingsTests.swift index fece94c1849..1d27363d116 100644 --- a/Tests/TuistGraphTests/Models/SettingsTests.swift +++ b/Tests/XcodeGraphTests/Models/SettingsTests.swift @@ -2,7 +2,7 @@ import Foundation import TSCBasic import TuistSupportTesting import XCTest -@testable import TuistGraph +@testable import XcodeGraph final class SettingsTests: XCTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/SourceFileTests.swift b/Tests/XcodeGraphTests/Models/SourceFileTests.swift similarity index 92% rename from Tests/TuistGraphTests/Models/SourceFileTests.swift rename to Tests/XcodeGraphTests/Models/SourceFileTests.swift index f9ee8706669..cd249b56d57 100644 --- a/Tests/TuistGraphTests/Models/SourceFileTests.swift +++ b/Tests/XcodeGraphTests/Models/SourceFileTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class SourceFileTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/TargetDependencyTests.swift b/Tests/XcodeGraphTests/Models/TargetDependencyTests.swift similarity index 98% rename from Tests/TuistGraphTests/Models/TargetDependencyTests.swift rename to Tests/XcodeGraphTests/Models/TargetDependencyTests.swift index 9d1661e8aed..8fbc237409c 100644 --- a/Tests/TuistGraphTests/Models/TargetDependencyTests.swift +++ b/Tests/XcodeGraphTests/Models/TargetDependencyTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class TargetDependencyTests: TuistUnitTestCase { func test_codable_framework() { diff --git a/Tests/TuistGraphTests/Models/TargetReferenceTests.swift b/Tests/XcodeGraphTests/Models/TargetReferenceTests.swift similarity index 92% rename from Tests/TuistGraphTests/Models/TargetReferenceTests.swift rename to Tests/XcodeGraphTests/Models/TargetReferenceTests.swift index d08d2a0fbb1..72eaaf94dfe 100644 --- a/Tests/TuistGraphTests/Models/TargetReferenceTests.swift +++ b/Tests/XcodeGraphTests/Models/TargetReferenceTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class TargetReferenceTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/TargetScriptTests.swift b/Tests/XcodeGraphTests/Models/TargetScriptTests.swift similarity index 95% rename from Tests/TuistGraphTests/Models/TargetScriptTests.swift rename to Tests/XcodeGraphTests/Models/TargetScriptTests.swift index c157af96d77..fb5359e2fee 100644 --- a/Tests/TuistGraphTests/Models/TargetScriptTests.swift +++ b/Tests/XcodeGraphTests/Models/TargetScriptTests.swift @@ -1,7 +1,7 @@ import Foundation import TSCBasic import XCTest -@testable import TuistGraph +@testable import XcodeGraph private let script = """ echo 'Hello World' diff --git a/Tests/TuistGraphTests/Models/TargetTests.swift b/Tests/XcodeGraphTests/Models/TargetTests.swift similarity index 99% rename from Tests/TuistGraphTests/Models/TargetTests.swift rename to Tests/XcodeGraphTests/Models/TargetTests.swift index e1ec0763b58..4fdc3f57c43 100644 --- a/Tests/TuistGraphTests/Models/TargetTests.swift +++ b/Tests/XcodeGraphTests/Models/TargetTests.swift @@ -3,9 +3,9 @@ import TSCBasic import TuistCore import TuistSupport import XCTest -@testable import TuistGraph -@testable import TuistGraphTesting @testable import TuistSupportTesting +@testable import XcodeGraph +@testable import XcodeGraphTesting final class TargetErrorTests: TuistUnitTestCase { func test_description() { diff --git a/Tests/TuistGraphTests/Models/TestActionTests.swift b/Tests/XcodeGraphTests/Models/TestActionTests.swift similarity index 90% rename from Tests/TuistGraphTests/Models/TestActionTests.swift rename to Tests/XcodeGraphTests/Models/TestActionTests.swift index 68cb0603764..8ff3209d907 100644 --- a/Tests/TuistGraphTests/Models/TestActionTests.swift +++ b/Tests/XcodeGraphTests/Models/TestActionTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class TestActionTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/TestPlanTests.swift b/Tests/XcodeGraphTests/Models/TestPlanTests.swift similarity index 92% rename from Tests/TuistGraphTests/Models/TestPlanTests.swift rename to Tests/XcodeGraphTests/Models/TestPlanTests.swift index 3df7672e657..0b112176960 100644 --- a/Tests/TuistGraphTests/Models/TestPlanTests.swift +++ b/Tests/XcodeGraphTests/Models/TestPlanTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class TestPlanTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/TestableTargetTests.swift b/Tests/XcodeGraphTests/Models/TestableTargetTests.swift similarity index 94% rename from Tests/TuistGraphTests/Models/TestableTargetTests.swift rename to Tests/XcodeGraphTests/Models/TestableTargetTests.swift index bc773849640..14361029094 100644 --- a/Tests/TuistGraphTests/Models/TestableTargetTests.swift +++ b/Tests/XcodeGraphTests/Models/TestableTargetTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class TestableTargetTests: TuistUnitTestCase { func test_codable() { diff --git a/Tests/TuistGraphTests/Models/WorkspaceGenerationOptionsTests.swift b/Tests/XcodeGraphTests/Models/WorkspaceGenerationOptionsTests.swift similarity index 91% rename from Tests/TuistGraphTests/Models/WorkspaceGenerationOptionsTests.swift rename to Tests/XcodeGraphTests/Models/WorkspaceGenerationOptionsTests.swift index d9a6d75c9ba..b67be12cb48 100644 --- a/Tests/TuistGraphTests/Models/WorkspaceGenerationOptionsTests.swift +++ b/Tests/XcodeGraphTests/Models/WorkspaceGenerationOptionsTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class WorkspaceGenerationOptionsTests: TuistUnitTestCase { func test_codable_whenDefault() { diff --git a/Tests/TuistGraphTests/Models/WorkspaceTests.swift b/Tests/XcodeGraphTests/Models/WorkspaceTests.swift similarity index 92% rename from Tests/TuistGraphTests/Models/WorkspaceTests.swift rename to Tests/XcodeGraphTests/Models/WorkspaceTests.swift index 2f4cb55f296..44098e20e81 100644 --- a/Tests/TuistGraphTests/Models/WorkspaceTests.swift +++ b/Tests/XcodeGraphTests/Models/WorkspaceTests.swift @@ -1,8 +1,8 @@ import Foundation import XCTest -@testable import TuistGraph @testable import TuistSupportTesting +@testable import XcodeGraph final class WorkspaceTests: TuistUnitTestCase { func test_codable() { diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index 98a7ca416e8..6eb5885e5a2 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -10,7 +10,7 @@ public enum Module: String, CaseIterable { case acceptanceTesting = "TuistAcceptanceTesting" case support = "TuistSupport" case kit = "TuistKit" - case graph = "TuistGraph" + case xcodeProjectGenerator = "XcodeGraph" case core = "TuistCore" case generator = "TuistGenerator" case scaffold = "TuistScaffold" @@ -147,7 +147,8 @@ public enum Module: String, CaseIterable { public var integrationTestsTargetName: String? { switch self { - case .tuist, .tuistBenchmark, .tuistFixtureGenerator, .projectAutomation, .projectDescription, .graph, .asyncQueue, + case .tuist, .tuistBenchmark, .tuistFixtureGenerator, .projectAutomation, .projectDescription, .xcodeProjectGenerator, + .asyncQueue, .plugin, .analytics, .dependencies, .acceptanceTesting, .app: return nil default: @@ -247,12 +248,12 @@ public enum Module: String, CaseIterable { .target(name: Module.asyncQueue.targetName), .target(name: Module.analytics.targetName), .target(name: Module.plugin.targetName), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), .external(name: "ArgumentParser"), .external(name: "GraphViz"), .external(name: "AnyCodable"), ] - case .graph: + case .xcodeProjectGenerator: [ .target(name: Module.support.targetName), .external(name: "AnyCodable"), @@ -261,13 +262,13 @@ public enum Module: String, CaseIterable { [ .target(name: Module.projectDescription.targetName), .target(name: Module.support.targetName), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), .external(name: "XcodeProj"), ] case .generator: [ .target(name: Module.core.targetName), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.targetName), .external(name: "SwiftGenKit"), .external(name: "PathKit"), @@ -278,7 +279,7 @@ public enum Module: String, CaseIterable { case .scaffold: [ .target(name: Module.core.targetName), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.targetName), .external(name: "PathKit"), .external(name: "StencilSwiftKit"), @@ -286,7 +287,7 @@ public enum Module: String, CaseIterable { case .loader: [ .target(name: Module.core.targetName), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.targetName), .target(name: Module.projectDescription.targetName), .external(name: "XcodeProj"), @@ -294,7 +295,7 @@ public enum Module: String, CaseIterable { case .asyncQueue: [ .target(name: Module.core.targetName), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.targetName), .external(name: "Queuer"), .external(name: "XcodeProj"), @@ -302,7 +303,7 @@ public enum Module: String, CaseIterable { case .plugin: [ .target(name: Module.core.targetName), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.loader.targetName), .target(name: Module.support.targetName), .target(name: Module.scaffold.targetName), @@ -311,7 +312,7 @@ public enum Module: String, CaseIterable { [ .target(name: Module.asyncQueue.targetName), .target(name: Module.core.targetName), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.loader.targetName), .target(name: Module.support.targetName), .external(name: "AnyCodable"), @@ -319,7 +320,7 @@ public enum Module: String, CaseIterable { case .migration: [ .target(name: Module.core.targetName), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.targetName), .external(name: "PathKit"), .external(name: "XcodeProj"), @@ -328,13 +329,13 @@ public enum Module: String, CaseIterable { [ .target(name: Module.projectDescription.targetName), .target(name: Module.core.targetName), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.targetName), ] case .automation: [ .target(name: Module.core.targetName), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.targetName), .external(name: "XcodeProj"), .external(name: "XcbeautifyLib"), @@ -377,14 +378,14 @@ public enum Module: String, CaseIterable { .target(name: Module.automation.testingTargetName!), .target(name: Module.migration.testingTargetName!), .target(name: Module.asyncQueue.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.plugin.targetName), .target(name: Module.plugin.testingTargetName!), .external(name: "ArgumentParser"), .external(name: "GraphViz"), .external(name: "AnyCodable"), ] - case .graph: + case .xcodeProjectGenerator: [ .target(name: Module.core.targetName), .target(name: Module.core.testingTargetName!), @@ -395,15 +396,15 @@ public enum Module: String, CaseIterable { case .core: [ .target(name: Module.support.targetName), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), ] case .generator: [ .target(name: Module.core.testingTargetName!), .target(name: Module.support.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), .external(name: "XcodeProj"), .external(name: "GraphViz"), ] @@ -411,11 +412,11 @@ public enum Module: String, CaseIterable { [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), ] case .loader: [ - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), ] @@ -423,7 +424,7 @@ public enum Module: String, CaseIterable { [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), .external(name: "Queuer"), ] case .plugin: @@ -431,7 +432,7 @@ public enum Module: String, CaseIterable { .target(name: Module.projectDescription.targetName), .target(name: Module.loader.targetName), .target(name: Module.loader.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), .target(name: Module.scaffold.testingTargetName!), @@ -440,19 +441,19 @@ public enum Module: String, CaseIterable { case .analytics: [ .target(name: Module.support.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.core.testingTargetName!), ] case .migration: [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), ] case .dependencies: [ .target(name: Module.core.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.loader.testingTargetName!), .target(name: Module.support.testingTargetName!), ] @@ -460,7 +461,7 @@ public enum Module: String, CaseIterable { [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), ] case .app: [ @@ -488,11 +489,11 @@ public enum Module: String, CaseIterable { case .support: [ .target(name: Module.core.targetName), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), ] case .kit: [] - case .graph: + case .xcodeProjectGenerator: [ .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), @@ -501,47 +502,47 @@ public enum Module: String, CaseIterable { case .core: [ .target(name: Module.support.targetName), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), ] case .generator: [ .target(name: Module.core.testingTargetName!), .target(name: Module.support.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), .external(name: "XcodeProj"), ] case .scaffold: [ - .target(name: Module.graph.testingTargetName!), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.targetName), ] case .loader: [ .target(name: Module.core.targetName), .target(name: Module.projectDescription.targetName), .target(name: Module.support.testingTargetName!), - .target(name: Module.graph.testingTargetName!), - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.targetName), ] case .asyncQueue: [ - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), ] case .plugin: [ - .target(name: Module.graph.targetName), + .target(name: Module.xcodeProjectGenerator.targetName), ] case .analytics: [] case .migration: [ - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), ] case .dependencies: [ - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.projectDescription.targetName), ] case .automation: @@ -550,7 +551,7 @@ public enum Module: String, CaseIterable { .target(name: Module.core.testingTargetName!), .target(name: Module.projectDescription.targetName), .target(name: Module.support.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), ] case .app: [] @@ -568,7 +569,7 @@ public enum Module: String, CaseIterable { .target(name: Module.support.testingTargetName!), .target(name: Module.support.targetName), .target(name: Module.core.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.loader.testingTargetName!), .external(name: "SwiftToolsSupport"), .external(name: "XcodeProj"), @@ -580,10 +581,10 @@ public enum Module: String, CaseIterable { .target(name: Module.projectDescription.targetName), .target(name: Module.automation.targetName), .target(name: Module.loader.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), .external(name: "XcodeProj"), ] - case .graph: + case .xcodeProjectGenerator: [] case .core: [ @@ -593,17 +594,17 @@ public enum Module: String, CaseIterable { [ .target(name: Module.core.testingTargetName!), .target(name: Module.support.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), .external(name: "XcodeProj"), ] case .scaffold: [ .target(name: Module.support.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), ] case .loader: [ - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.support.testingTargetName!), .target(name: Module.projectDescription.targetName), ] @@ -617,14 +618,14 @@ public enum Module: String, CaseIterable { [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), ] case .dependencies: [] case .automation: [ .target(name: Module.support.testingTargetName!), - .target(name: Module.graph.testingTargetName!), + .target(name: Module.xcodeProjectGenerator.testingTargetName!), ] case .app: [] diff --git a/docs/docs/guide/project/plugins.md b/docs/docs/guide/project/plugins.md index 77e6e615ce3..68faec90539 100644 --- a/docs/docs/guide/project/plugins.md +++ b/docs/docs/guide/project/plugins.md @@ -97,7 +97,7 @@ If you were using Tuist for distributing tasks, we recommend building your - If you name your tool `tuist-{xxx}` and users can install it by running `mise install`, they can run it either invoking it directly, or through `tuist xxx`. > [!NOTE] THE FUTURE OF PROJECTAUTOMATION -> We plan to consolidate the models of `ProjectAutomation` and `TuistGraph` into a single backward-compatible framework that exposes the entirity of the project graph to the user. Moreover, we'll extract the generation logic into a new layer, `XcodeProjectGenerator` that you can also use from your own CLI. Think of it as building your own Tuist. +> We plan to consolidate the models of `ProjectAutomation` and `XcodeGraph` into a single backward-compatible framework that exposes the entirity of the project graph to the user. Moreover, we'll extract the generation logic into a new layer, `XcodeGraph` that you can also use from your own CLI. Think of it as building your own Tuist. ## Using plugins From a5235f6c0f4976ba2b8e2b270393d2ceb18a3b32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 6 Jun 2024 19:40:08 +0200 Subject: [PATCH 338/509] Upload test run result bundle objects (#6373) --- .../Utils/TuistAnalyticsCloudBackend.swift | 5 +- .../Models/CloudCommandEvent.swift | 36 + .../TuistServer/Models/InvocationRecord.swift | 28 + Sources/TuistServer/OpenAPI/Types.swift | 26 +- Sources/TuistServer/OpenAPI/cloud.yml | 5 + .../AnalyticsArtifactUploadService.swift | 109 ++- ...tipartUploadCompleteAnalyticsService.swift | 4 +- ...artUploadGenerateURLAnalyticsService.swift | 6 +- ...MultipartUploadStartAnalyticsService.swift | 4 +- .../Utilities/XCResultToolController.swift | 31 + .../TuistAnalyticsCloudBackendTests.swift | 4 +- .../Utils/TuistAnalyticsDispatcherTests.swift | 4 +- .../AnalyticsArtifactUploadServiceTests.swift | 57 +- .../TestData/InvocationRecord+TestData.swift | 635 ++++++++++++++++++ 14 files changed, 921 insertions(+), 33 deletions(-) create mode 100644 Sources/TuistServer/Models/InvocationRecord.swift create mode 100644 Sources/TuistServer/Utilities/XCResultToolController.swift create mode 100644 Tests/TuistServerTests/TestData/InvocationRecord+TestData.swift diff --git a/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift b/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift index fe1a9f85f23..12dae9f6377 100644 --- a/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift +++ b/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift @@ -1,4 +1,5 @@ import Foundation +import TSCBasic import TuistAnalytics import TuistAsyncQueue import TuistCore @@ -56,8 +57,8 @@ public class TuistAnalyticsCloudBackend: TuistAnalyticsBackend { .appending(component: "\(Constants.resultBundleName).xcresult") if fileHandler.exists(resultBundle) { - try await analyticsArtifactUploadService.uploadAnalyticsArtifact( - artifactPath: resultBundle, + try await analyticsArtifactUploadService.uploadResultBundle( + resultBundle, commandEventId: cloudCommandEvent.id, serverURL: config.url ) diff --git a/Sources/TuistServer/Models/CloudCommandEvent.swift b/Sources/TuistServer/Models/CloudCommandEvent.swift index 4fcbacfd272..8fdbd239105 100644 --- a/Sources/TuistServer/Models/CloudCommandEvent.swift +++ b/Sources/TuistServer/Models/CloudCommandEvent.swift @@ -15,6 +15,23 @@ public struct CloudCommandEvent: Codable { self.name = name self.url = url } + + public struct Artifact: Equatable { + let type: ArtifactType + let name: String? + + init( + type: ArtifactType, + name: String? = nil + ) { + self.type = type + self.name = name + } + + enum ArtifactType { + case resultBundle, invocationRecord, resultBundleObject + } + } } extension CloudCommandEvent { @@ -25,6 +42,25 @@ extension CloudCommandEvent { } } +extension Components.Schemas.CommandEventArtifact { + init(_ artifact: CloudCommandEvent.Artifact) { + self = .init(name: artifact.name, _type: .init(artifact.type)) + } +} + +extension Components.Schemas.CommandEventArtifact._typePayload { + init(_ type: CloudCommandEvent.Artifact.ArtifactType) { + switch type { + case .resultBundle: + self = .result_bundle + case .invocationRecord: + self = .invocation_record + case .resultBundleObject: + self = .result_bundle_object + } + } +} + #if MOCKING extension CloudCommandEvent { public static func test( diff --git a/Sources/TuistServer/Models/InvocationRecord.swift b/Sources/TuistServer/Models/InvocationRecord.swift new file mode 100644 index 00000000000..74960422a60 --- /dev/null +++ b/Sources/TuistServer/Models/InvocationRecord.swift @@ -0,0 +1,28 @@ +import Foundation + +struct InvocationRecord: Codable { + let actions: XCObjectArray +} + +struct ActionRecord: Codable { + let schemeCommandName: XCObjectItem + let actionResult: ActionResult +} + +struct ActionResult: Codable { + let testsRef: Reference? + + struct Reference: Codable { + let id: XCObjectItem + } +} + +struct XCObjectArray: Codable { + // swiftlint:disable:next identifier_name + let _values: [T] +} + +struct XCObjectItem: Codable { + // swiftlint:disable:next identifier_name + let _value: T +} diff --git a/Sources/TuistServer/OpenAPI/Types.swift b/Sources/TuistServer/OpenAPI/Types.swift index 197811e18e2..af5f71e9faf 100644 --- a/Sources/TuistServer/OpenAPI/Types.swift +++ b/Sources/TuistServer/OpenAPI/Types.swift @@ -700,6 +700,10 @@ public enum Components { /// /// - Remark: Generated from `#/components/schemas/CommandEventArtifact`. public struct CommandEventArtifact: Codable, Equatable, Hashable, Sendable { + /// The name of the file. It's used only for certain types such as result_bundle_object + /// + /// - Remark: Generated from `#/components/schemas/CommandEventArtifact/name`. + public var name: Swift.String? /// The command event artifact type. /// /// - Remark: Generated from `#/components/schemas/CommandEventArtifact/type`. @@ -708,11 +712,15 @@ public enum Components { _AutoLosslessStringConvertible, CaseIterable { case result_bundle + case invocation_record + case result_bundle_object /// Parsed a raw value that was not defined in the OpenAPI document. case undocumented(String) public init?(rawValue: String) { switch rawValue { case "result_bundle": self = .result_bundle + case "invocation_record": self = .invocation_record + case "result_bundle_object": self = .result_bundle_object default: self = .undocumented(rawValue) } } @@ -720,9 +728,13 @@ public enum Components { switch self { case let .undocumented(string): return string case .result_bundle: return "result_bundle" + case .invocation_record: return "invocation_record" + case .result_bundle_object: return "result_bundle_object" } } - public static var allCases: [_typePayload] { [.result_bundle] } + public static var allCases: [_typePayload] { + [.result_bundle, .invocation_record, .result_bundle_object] + } } /// The command event artifact type. /// @@ -731,11 +743,19 @@ public enum Components { /// Creates a new `CommandEventArtifact`. /// /// - Parameters: + /// - name: The name of the file. It's used only for certain types such as result_bundle_object /// - _type: The command event artifact type. - public init(_type: Components.Schemas.CommandEventArtifact._typePayload) { + public init( + name: Swift.String? = nil, + _type: Components.Schemas.CommandEventArtifact._typePayload + ) { + self.name = name self._type = _type } - public enum CodingKeys: String, CodingKey { case _type = "type" } + public enum CodingKeys: String, CodingKey { + case name + case _type = "type" + } } /// - Remark: Generated from `#/components/schemas/Error`. public struct _Error: Codable, Equatable, Hashable, Sendable { diff --git a/Sources/TuistServer/OpenAPI/cloud.yml b/Sources/TuistServer/OpenAPI/cloud.yml index 7104cb0185f..52708b47087 100644 --- a/Sources/TuistServer/OpenAPI/cloud.yml +++ b/Sources/TuistServer/OpenAPI/cloud.yml @@ -192,10 +192,15 @@ components: CommandEventArtifact: description: It represents an artifact that's associated with a command event (e.g. result bundles) properties: + name: + description: The name of the file. It's used only for certain types such as result_bundle_object + type: string type: description: The command event artifact type. enum: - result_bundle + - invocation_record + - result_bundle_object type: string required: - type diff --git a/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift b/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift index b54966daded..a3639cf8a40 100644 --- a/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift +++ b/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift @@ -5,8 +5,8 @@ import TuistSupport @Mockable public protocol AnalyticsArtifactUploadServicing { - func uploadAnalyticsArtifact( - artifactPath: AbsolutePath, + func uploadResultBundle( + _ resultBundle: AbsolutePath, commandEventId: Int, serverURL: URL ) async throws @@ -14,6 +14,7 @@ public protocol AnalyticsArtifactUploadServicing { public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServicing { private let fileHandler: FileHandling + private let xcresultToolController: XCResultToolControlling private let fileArchiver: FileArchivingFactorying private let retryProvider: RetryProviding private let multipartUploadStartAnalyticsService: MultipartUploadStartAnalyticsServicing @@ -21,18 +22,33 @@ public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServic private let multipartUploadArtifactService: MultipartUploadArtifactServicing private let multipartUploadCompleteAnalyticsService: MultipartUploadCompleteAnalyticsServicing - public init( - fileHandler: FileHandling = FileHandler.shared, - fileArchiver: FileArchivingFactorying = FileArchivingFactory(), - retryProvider: RetryProviding = RetryProvider(), - multipartUploadStartAnalyticsService: MultipartUploadStartAnalyticsServicing = MultipartUploadStartAnalyticsService(), - multipartUploadGenerateURLAnalyticsService: MultipartUploadGenerateURLAnalyticsServicing = + public convenience init() { + self.init( + fileHandler: FileHandler.shared, + xcresultToolController: XCResultToolController(), + fileArchiver: FileArchivingFactory(), + retryProvider: RetryProvider(), + multipartUploadStartAnalyticsService: MultipartUploadStartAnalyticsService(), + multipartUploadGenerateURLAnalyticsService: MultipartUploadGenerateURLAnalyticsService(), - multipartUploadArtifactService: MultipartUploadArtifactServicing = MultipartUploadArtifactService(), - multipartUploadCompleteAnalyticsService: MultipartUploadCompleteAnalyticsServicing = + multipartUploadArtifactService: MultipartUploadArtifactService(), + multipartUploadCompleteAnalyticsService: MultipartUploadCompleteAnalyticsService() + ) + } + + init( + fileHandler: FileHandling, + xcresultToolController: XCResultToolControlling, + fileArchiver: FileArchivingFactorying, + retryProvider: RetryProviding, + multipartUploadStartAnalyticsService: MultipartUploadStartAnalyticsServicing, + multipartUploadGenerateURLAnalyticsService: MultipartUploadGenerateURLAnalyticsServicing, + multipartUploadArtifactService: MultipartUploadArtifactServicing, + multipartUploadCompleteAnalyticsService: MultipartUploadCompleteAnalyticsServicing ) { self.fileHandler = fileHandler + self.xcresultToolController = xcresultToolController self.fileArchiver = fileArchiver self.retryProvider = retryProvider self.multipartUploadStartAnalyticsService = multipartUploadStartAnalyticsService @@ -41,24 +57,88 @@ public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServic self.multipartUploadCompleteAnalyticsService = multipartUploadCompleteAnalyticsService } - public func uploadAnalyticsArtifact( + public func uploadResultBundle( + _ resultBundle: AbsolutePath, + commandEventId: Int, + serverURL: URL + ) async throws { + try await uploadAnalyticsArtifact( + CloudCommandEvent.Artifact( + type: .resultBundle + ), + artifactPath: resultBundle, + commandEventId: commandEventId, + serverURL: serverURL + ) + + let invocationRecordString = try xcresultToolController.resultBundleObject(resultBundle) + let invocationRecordPath = resultBundle.parentDirectory.appending(component: "invocation_record.json") + try fileHandler.write(invocationRecordString, path: invocationRecordPath, atomically: true) + + let decoder = JSONDecoder() + let invocationRecord = try decoder.decode(InvocationRecord.self, from: invocationRecordString.data(using: .utf8)!) + for testActionRecord in invocationRecord.actions._values + .filter({ $0.schemeCommandName._value == "Test" }) + { + guard let id = testActionRecord.actionResult.testsRef?.id._value else { continue } + let resultBundleObjectString = try xcresultToolController.resultBundleObject( + resultBundle, + id: id + ) + let filename = "\(id).json" + let resultBundleObjectPath = resultBundle.parentDirectory.appending(component: filename) + try fileHandler.write(resultBundleObjectString, path: resultBundleObjectPath, atomically: true) + try await uploadAnalyticsArtifact( + CloudCommandEvent.Artifact( + type: .resultBundleObject, + name: id + ), + artifactPath: resultBundleObjectPath, + commandEventId: commandEventId, + serverURL: serverURL + ) + } + + try await uploadAnalyticsArtifact( + CloudCommandEvent.Artifact( + type: .invocationRecord + ), + artifactPath: invocationRecordPath, + commandEventId: commandEventId, + serverURL: serverURL + ) + } + + private func uploadAnalyticsArtifact( + _ artifact: CloudCommandEvent.Artifact, artifactPath: AbsolutePath, + name: String? = nil, commandEventId: Int, serverURL: URL ) async throws { - let artifactArchivePath = try fileArchiver.makeFileArchiver(for: [artifactPath]) - .zip(name: artifactPath.basenameWithoutExt) + let passedArtifactPath = artifactPath + let artifactPath: AbsolutePath + + switch artifact.type { + case .resultBundle: + artifactPath = try fileArchiver.makeFileArchiver(for: [passedArtifactPath]) + .zip(name: passedArtifactPath.basenameWithoutExt) + case .invocationRecord, .resultBundleObject: + artifactPath = passedArtifactPath + } try await retryProvider.runWithRetries { [self] in let uploadId = try await multipartUploadStartAnalyticsService.uploadAnalyticsArtifact( + artifact, commandEventId: commandEventId, serverURL: serverURL ) let parts = try await multipartUploadArtifactService.multipartUploadArtifact( - artifactPath: artifactArchivePath, + artifactPath: artifactPath, generateUploadURL: { partNumber in try await self.multipartUploadGenerateURLAnalyticsService.uploadAnalytics( + artifact, commandEventId: commandEventId, partNumber: partNumber, uploadId: uploadId, @@ -68,6 +148,7 @@ public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServic ) try await multipartUploadCompleteAnalyticsService.uploadAnalyticsArtifact( + artifact, commandEventId: commandEventId, uploadId: uploadId, parts: parts, diff --git a/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift b/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift index ff3df5f6faf..d07962cac04 100644 --- a/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift +++ b/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift @@ -6,6 +6,7 @@ import TuistSupport @Mockable public protocol MultipartUploadCompleteAnalyticsServicing { func uploadAnalyticsArtifact( + _ artifact: CloudCommandEvent.Artifact, commandEventId: Int, uploadId: String, parts: [(etag: String, partNumber: Int)], @@ -41,6 +42,7 @@ public final class MultipartUploadCompleteAnalyticsService: MultipartUploadCompl public init() {} public func uploadAnalyticsArtifact( + _ artifact: CloudCommandEvent.Artifact, commandEventId: Int, uploadId: String, parts: [(etag: String, partNumber: Int)], @@ -52,7 +54,7 @@ public final class MultipartUploadCompleteAnalyticsService: MultipartUploadCompl path: .init(run_id: commandEventId), body: .json( .init( - command_event_artifact: .init(_type: .result_bundle), + command_event_artifact: .init(artifact), multipart_upload_parts: .init( parts: parts .map { .init(etag: $0.etag, part_number: $0.partNumber) }, diff --git a/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift b/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift index 46cf05de842..f173bb8ee60 100644 --- a/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift +++ b/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift @@ -5,6 +5,7 @@ import TuistSupport @Mockable public protocol MultipartUploadGenerateURLAnalyticsServicing { func uploadAnalytics( + _ artifact: CloudCommandEvent.Artifact, commandEventId: Int, partNumber: Int, uploadId: String, @@ -40,6 +41,7 @@ public final class MultipartUploadGenerateURLAnalyticsService: MultipartUploadGe public init() {} public func uploadAnalytics( + _ artifact: CloudCommandEvent.Artifact, commandEventId: Int, partNumber: Int, uploadId: String, @@ -51,9 +53,7 @@ public final class MultipartUploadGenerateURLAnalyticsService: MultipartUploadGe path: .init(run_id: commandEventId), body: .json( .init( - command_event_artifact: .init( - _type: .result_bundle - ), + command_event_artifact: .init(artifact), multipart_upload_part: .init( part_number: partNumber, upload_id: uploadId diff --git a/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift b/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift index 3445ba9d770..b7d5dd532b9 100644 --- a/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift +++ b/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift @@ -5,6 +5,7 @@ import TuistSupport @Mockable public protocol MultipartUploadStartAnalyticsServicing { func uploadAnalyticsArtifact( + _ artifact: CloudCommandEvent.Artifact, commandEventId: Int, serverURL: URL ) async throws -> String @@ -39,6 +40,7 @@ public final class MultipartUploadStartAnalyticsService: MultipartUploadStartAna public init() {} public func uploadAnalyticsArtifact( + _ artifact: CloudCommandEvent.Artifact, commandEventId: Int, serverURL: URL ) async throws -> String { @@ -46,7 +48,7 @@ public final class MultipartUploadStartAnalyticsService: MultipartUploadStartAna let response = try await client.startAnalyticsArtifactMultipartUpload( .init( path: .init(run_id: commandEventId), - body: .json(.init(_type: .result_bundle)) + body: .json(.init(artifact)) ) ) switch response { diff --git a/Sources/TuistServer/Utilities/XCResultToolController.swift b/Sources/TuistServer/Utilities/XCResultToolController.swift new file mode 100644 index 00000000000..fe0011c91cf --- /dev/null +++ b/Sources/TuistServer/Utilities/XCResultToolController.swift @@ -0,0 +1,31 @@ +import Mockable +import TSCBasic +import TuistSupport + +@Mockable +protocol XCResultToolControlling { + func resultBundleObject(_ path: AbsolutePath) throws -> String + func resultBundleObject(_ path: AbsolutePath, id: String) throws -> String +} + +final class XCResultToolController: XCResultToolControlling { + private let system: Systeming + + init( + system: Systeming = System.shared + ) { + self.system = system + } + + func resultBundleObject(_ path: AbsolutePath) throws -> String { + try system.capture( + ["/usr/bin/xcrun", "xcresulttool", "get", "--path", path.pathString, "--format", "json"] + ) + } + + func resultBundleObject(_ path: AbsolutePath, id: String) throws -> String { + try system.capture( + ["/usr/bin/xcrun", "xcresulttool", "get", "--path", path.pathString, "--id", id, "--format", "json"] + ) + } +} diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift index c588c10c50f..2be910866cf 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift @@ -133,8 +133,8 @@ final class TuistAnalyticsCloudBackendTests: TuistUnitTestCase { try fileHandler.createFolder(resultBundle) given(analyticsArtifactUploadService) - .uploadAnalyticsArtifact( - artifactPath: .value(resultBundle), + .uploadResultBundle( + .value(resultBundle), commandEventId: .value(10), serverURL: .value(config.url) ) diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift index 643e3d19049..35367f42855 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift @@ -63,8 +63,8 @@ final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { .willReturn(.test(id: 10)) given(analyticsArtifactUploadService) - .uploadAnalyticsArtifact( - artifactPath: .any, + .uploadResultBundle( + .any, commandEventId: .value(10), serverURL: .value(cloudURL) ) diff --git a/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift b/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift index bce9cb12145..2d5dc4c071f 100644 --- a/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift +++ b/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift @@ -8,6 +8,7 @@ import XCTest final class AnalyticsArtifactUploadServiceTests: TuistTestCase { private var subject: AnalyticsArtifactUploadService! + private var xcresultToolController: MockXCResultToolControlling! private var fileArchiverFactory: MockFileArchivingFactorying! private var multipartUploadStartAnalyticsService: MockMultipartUploadStartAnalyticsServicing! private var multipartUploadGenerateURLAnalyticsService: MockMultipartUploadGenerateURLAnalyticsServicing! @@ -17,6 +18,7 @@ final class AnalyticsArtifactUploadServiceTests: TuistTestCase { override func setUp() { super.setUp() + xcresultToolController = .init() fileArchiverFactory = .init() multipartUploadStartAnalyticsService = .init() multipartUploadGenerateURLAnalyticsService = .init() @@ -25,7 +27,9 @@ final class AnalyticsArtifactUploadServiceTests: TuistTestCase { subject = AnalyticsArtifactUploadService( fileHandler: fileHandler, + xcresultToolController: xcresultToolController, fileArchiver: fileArchiverFactory, + retryProvider: RetryProvider(), multipartUploadStartAnalyticsService: multipartUploadStartAnalyticsService, multipartUploadGenerateURLAnalyticsService: multipartUploadGenerateURLAnalyticsService, multipartUploadArtifactService: multipartUploadArtifactService, @@ -46,14 +50,14 @@ final class AnalyticsArtifactUploadServiceTests: TuistTestCase { func test_upload_analytics_artifact() async throws { // Given let temporaryDirectory = try temporaryPath() - let artifactPath = temporaryDirectory.appending(component: "artifact.bundle") - try FileHandler.shared.touch(artifactPath) + let resultBundle = temporaryDirectory.appending(component: "artifact.bundle") + try FileHandler.shared.touch(resultBundle) let serverURL: URL = .test() let fileArchiver = MockFileArchiving() given(fileArchiverFactory) - .makeFileArchiver(for: .value([artifactPath])) + .makeFileArchiver(for: .value([resultBundle])) .willReturn(fileArchiver) let artifactArchivePath = temporaryDirectory.appending(component: "artifact.zip") @@ -64,6 +68,7 @@ final class AnalyticsArtifactUploadServiceTests: TuistTestCase { given(multipartUploadStartAnalyticsService) .uploadAnalyticsArtifact( + .value(.init(type: .resultBundle)), commandEventId: .value(1), serverURL: .value(serverURL) ) @@ -78,6 +83,7 @@ final class AnalyticsArtifactUploadServiceTests: TuistTestCase { given(multipartUploadCompleteAnalyticsService) .uploadAnalyticsArtifact( + .any, commandEventId: .value(1), uploadId: .value("upload-id"), parts: .matching { parts in @@ -87,9 +93,50 @@ final class AnalyticsArtifactUploadServiceTests: TuistTestCase { ) .willReturn(()) + given(multipartUploadStartAnalyticsService) + .uploadAnalyticsArtifact( + .value(.init(type: .invocationRecord)), + commandEventId: .value(1), + serverURL: .value(serverURL) + ) + .willReturn("upload-id") + + given(multipartUploadArtifactService) + .multipartUploadArtifact( + artifactPath: .value(resultBundle.parentDirectory.appending(component: "invocation_record.json")), + generateUploadURL: .any + ) + .willReturn([(etag: "etag", partNumber: 1)]) + + given(xcresultToolController) + .resultBundleObject(.value(resultBundle)) + .willReturn(invocationRecordMockString) + + let testResultBundleObjectId = + "0~8YCjlb3k7BnCmnR4_ZFg18UnVp4hOkZw8KiWEX8RunY_pe9wBaIbW90Jo1HePHl7st5Le_nRyAP4_dSvsdxYpw==" + + given(xcresultToolController) + .resultBundleObject(.value(resultBundle), id: .value(testResultBundleObjectId)) + .willReturn("{}") + + given(multipartUploadStartAnalyticsService) + .uploadAnalyticsArtifact( + .value(.init(type: .resultBundleObject, name: testResultBundleObjectId)), + commandEventId: .value(1), + serverURL: .value(serverURL) + ) + .willReturn("upload-id") + + given(multipartUploadArtifactService) + .multipartUploadArtifact( + artifactPath: .value(resultBundle.parentDirectory.appending(component: "\(testResultBundleObjectId).json")), + generateUploadURL: .any + ) + .willReturn([(etag: "etag", partNumber: 1)]) + // When / Then - try await subject.uploadAnalyticsArtifact( - artifactPath: artifactPath, + try await subject.uploadResultBundle( + resultBundle, commandEventId: 1, serverURL: serverURL ) diff --git a/Tests/TuistServerTests/TestData/InvocationRecord+TestData.swift b/Tests/TuistServerTests/TestData/InvocationRecord+TestData.swift new file mode 100644 index 00000000000..07b24e1d411 --- /dev/null +++ b/Tests/TuistServerTests/TestData/InvocationRecord+TestData.swift @@ -0,0 +1,635 @@ +import Foundation + +extension AnalyticsArtifactUploadServiceTests { + var invocationRecordMockString: String { + #""" + { + "_type" : { + "_name" : "ActionsInvocationRecord" + }, + "actions" : { + "_type" : { + "_name" : "Array" + }, + "_values" : [ + { + "_type" : { + "_name" : "ActionRecord" + }, + "actionResult" : { + "_type" : { + "_name" : "ActionResult" + }, + "coverage" : { + "_type" : { + "_name" : "CodeCoverageInfo" + } + }, + "diagnosticsRef" : { + "_type" : { + "_name" : "Reference" + }, + "id" : { + "_type" : { + "_name" : "String" + }, + "_value" : "0~OswFMxdHsqFpfWmB3LFdBaMZLu-tXkrmvBsNwQ0BKaT9taUvjiIfOuMGRBR-MawOmNo0LnXLkdHQm5N67mVz1w==" + } + }, + "issues" : { + "_type" : { + "_name" : "ResultIssueSummaries" + }, + "testFailureSummaries" : { + "_type" : { + "_name" : "Array" + }, + "_values" : [ + { + "_type" : { + "_name" : "TestFailureIssueSummary", + "_supertype" : { + "_name" : "IssueSummary" + } + }, + "documentLocationInCreatingWorkspace" : { + "_type" : { + "_name" : "DocumentLocation" + }, + "concreteTypeName" : { + "_type" : { + "_name" : "String" + }, + "_value" : "DVTTextDocumentLocation" + }, + "url" : { + "_type" : { + "_name" : "String" + }, + "_value" : "file:\/\/\/Users\/builder\/clone\/Tests\/TuistDependenciesAcceptanceTests\/DependenciesAcceptanceTests.swift#EndingLineNumber=40&StartingLineNumber=40" + } + }, + "issueType" : { + "_type" : { + "_name" : "String" + }, + "_value" : "Uncategorized" + }, + "message" : { + "_type" : { + "_name" : "String" + }, + "_value" : "failed: caught error: \"The 'xcodebuild' command exited with error code 65 and message:\n2024-05-20 12:44:17.788570+0000 xcodebuild[14114:50965] [devicemanager] DeviceManager sending check-in request: F988FF5A-CDAC-42C9-9C3F-BE87134AD171\n2024-05-20 12:44:17.790440+0000 xcodebuild[14114:50965] [devicemanager] DeviceManager check-in (F988FF5A-CDAC-42C9-9C3F-BE87134AD171) completed successfully\n2024-05-20 12:44:17.793515+0000 xcodebuild[14114:50961] [All] MobileDevice.framework version: 1643.100.58\n2024-05-20 12:44:17.798111+0000 xcodebuild[14114:50961] [All] RemotePairing.framework version: 117.100.41\n2024-05-20 12:44:17.798690+0000 xcodebuild[14114:50961] [library] USBMuxListenerCreateFiltered:898 Created 0x600003581f40\n2024-05-20 12:44:17.798774+0000 xcodebuild[14114:50961] [All] Subscribed for device notifications from usbmuxd.\n2024-05-20 12:44:18.054503+0000 xcodebuild[14114:50949] [general] initializing workspace at path \/var\/folders\/w2\/rrf5p87d1bbfyphxc7jdnyvh0000gn\/T\/TemporaryDirectory.AMHRiB\/ios_app_with_spm_dependencies\/App.xcworkspace\n2024-05-20 12:44:18.055591+0000 xcodebuild[14114:50949] [general] setting up workspace \/var\/folders\/w2\/rrf5p87d1bbfyphxc7jdnyvh0000gn\/T\/TemporaryDirectory.AMHRiB\/ios_app_with_spm_dependencies\/App.xcworkspace\n2024-05-20 12:44:18.071588+0000 xcodebuild[14114:50949] [general] using plugin library at \/Applications\/Xcode-15.3.app\/Contents\/SharedFrameworks\/SwiftPM.framework\/SharedSupport\/PluginAPI\n2024-05-20 12:44:18.071680+0000 xcodebuild[14114:50949] [general] synchronizing contents of workspace at path \/var\/folders\/w2\/rrf5p87d1bbfyphxc7jdnyvh0000gn\/T\/TemporaryDirectory.AMHRiB\/ios_app_with_spm_dependencies\/App.xcworkspace\n2024-05-20 12:44:18.071698+0000 xcodebuild[14114:50949] [general] marking workspace as having finished initial package resolution\n--- xcodebuild: WARNING: Using the first of multiple matching destinations:\n{ platform:iOS Simulator, id:2B6F50E6-2782-405A-94DF-E659C9398717, OS:17.4, name:iPad Pro (12.9-inch) (6th generation) }\n{ platform:iOS Simulator, id:2B6F50E6-2782-405A-94DF-E659C9398717, OS:17.4, name:iPad Pro (12.9-inch) (6th generation) }\n2024-05-20 12:44:18.106264+0000 xcodebuild[14114:50949] [building] creating scheme operation preamble operations for build command Build\nTesting failed:\n\tCompiling for iOS 14.0, but module 'App' has a minimum deployment target of iOS 16.0: \/Users\/builder\/Library\/Developer\/Xcode\/DerivedData\/App-fzcodvpjdyxljhcxfidulaohhxre\/Build\/Products\/Debug-iphonesimulator\/App.swiftmodule\/arm64-apple-ios-simulator.swiftmodule\n\tTesting cancelled because the build failed.\n\n** TEST FAILED **\n\n\nThe following build commands failed:\n\tSwiftEmitModule normal arm64 Emitting\\ module\\ for\\ AppTests (in target 'AppTests' from project 'App')\n(1 failure)\n\"" + }, + "testCaseName" : { + "_type" : { + "_name" : "String" + }, + "_value" : "DependenciesAcceptanceTestIosAppWithSPMDependencies.test_ios_app_spm_dependencies()" + } + } + ] + } + }, + "logRef" : { + "_type" : { + "_name" : "Reference" + }, + "id" : { + "_type" : { + "_name" : "String" + }, + "_value" : "0~P3EqtGf1QBDVW81JX_KQylSrGzn-HJAEOm1bhpBdwiiWhpaRIfCbhxtixsVOOLHp6jGB-YAVUqA1rmIc7dBy4g==" + }, + "targetType" : { + "_type" : { + "_name" : "TypeDefinition" + }, + "name" : { + "_type" : { + "_name" : "String" + }, + "_value" : "ActivityLogSection" + } + } + }, + "metrics" : { + "_type" : { + "_name" : "ResultMetrics" + }, + "testsCount" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "3" + }, + "testsFailedCount" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "1" + } + }, + "resultName" : { + "_type" : { + "_name" : "String" + }, + "_value" : "action" + }, + "status" : { + "_type" : { + "_name" : "String" + }, + "_value" : "failed" + }, + "testsRef" : { + "_type" : { + "_name" : "Reference" + }, + "id" : { + "_type" : { + "_name" : "String" + }, + "_value" : "0~8YCjlb3k7BnCmnR4_ZFg18UnVp4hOkZw8KiWEX8RunY_pe9wBaIbW90Jo1HePHl7st5Le_nRyAP4_dSvsdxYpw==" + }, + "targetType" : { + "_type" : { + "_name" : "TypeDefinition" + }, + "name" : { + "_type" : { + "_name" : "String" + }, + "_value" : "ActionTestPlanRunSummaries" + } + } + } + }, + "buildResult" : { + "_type" : { + "_name" : "ActionResult" + }, + "coverage" : { + "_type" : { + "_name" : "CodeCoverageInfo" + } + }, + "issues" : { + "_type" : { + "_name" : "ResultIssueSummaries" + } + }, + "logRef" : { + "_type" : { + "_name" : "Reference" + }, + "id" : { + "_type" : { + "_name" : "String" + }, + "_value" : "0~JlTezqV63xbUrp0gsF4KV89HvbbNAfQ_g5JOvwR1ecy70PjnlqcfDdyHgggMuhSwJYY9MSoVtKYHzmxj3ZaRcw==" + }, + "targetType" : { + "_type" : { + "_name" : "TypeDefinition" + }, + "name" : { + "_type" : { + "_name" : "String" + }, + "_value" : "ActivityLogSection" + } + } + }, + "metrics" : { + "_type" : { + "_name" : "ResultMetrics" + } + }, + "resultName" : { + "_type" : { + "_name" : "String" + }, + "_value" : "build" + }, + "status" : { + "_type" : { + "_name" : "String" + }, + "_value" : "succeeded" + } + }, + "endedTime" : { + "_type" : { + "_name" : "Date" + }, + "_value" : "2024-05-20T12:44:51.162+0000" + }, + "runDestination" : { + "_type" : { + "_name" : "ActionRunDestinationRecord" + }, + "displayName" : { + "_type" : { + "_name" : "String" + }, + "_value" : "My Mac" + }, + "localComputerRecord" : { + "_type" : { + "_name" : "ActionDeviceRecord" + }, + "busSpeedInMHz" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "0" + }, + "cpuCount" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "1" + }, + "cpuKind" : { + "_type" : { + "_name" : "String" + }, + "_value" : "Apple M1 (Virtual)" + }, + "cpuSpeedInMHz" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "0" + }, + "identifier" : { + "_type" : { + "_name" : "String" + }, + "_value" : "0000FE00-343A79319AA17942" + }, + "isConcreteDevice" : { + "_type" : { + "_name" : "Bool" + }, + "_value" : "true" + }, + "logicalCPUCoresPerPackage" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "4" + }, + "modelCode" : { + "_type" : { + "_name" : "String" + }, + "_value" : "VirtualMac2,1" + }, + "modelName" : { + "_type" : { + "_name" : "String" + }, + "_value" : "Apple Virtual Machine 1" + }, + "modelUTI" : { + "_type" : { + "_name" : "String" + }, + "_value" : "com.apple.virtual-machine" + }, + "name" : { + "_type" : { + "_name" : "String" + }, + "_value" : "My Mac" + }, + "nativeArchitecture" : { + "_type" : { + "_name" : "String" + }, + "_value" : "arm64e" + }, + "operatingSystemVersion" : { + "_type" : { + "_name" : "String" + }, + "_value" : "14.3.1" + }, + "operatingSystemVersionWithBuildNumber" : { + "_type" : { + "_name" : "String" + }, + "_value" : "14.3.1 (23D60)" + }, + "physicalCPUCoresPerPackage" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "4" + }, + "platformRecord" : { + "_type" : { + "_name" : "ActionPlatformRecord" + }, + "identifier" : { + "_type" : { + "_name" : "String" + }, + "_value" : "com.apple.platform.macosx" + }, + "userDescription" : { + "_type" : { + "_name" : "String" + }, + "_value" : "macOS" + } + }, + "ramSizeInMegabytes" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "8192" + } + }, + "targetArchitecture" : { + "_type" : { + "_name" : "String" + }, + "_value" : "arm64" + }, + "targetDeviceRecord" : { + "_type" : { + "_name" : "ActionDeviceRecord" + }, + "busSpeedInMHz" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "0" + }, + "cpuCount" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "1" + }, + "cpuKind" : { + "_type" : { + "_name" : "String" + }, + "_value" : "Apple M1 (Virtual)" + }, + "cpuSpeedInMHz" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "0" + }, + "identifier" : { + "_type" : { + "_name" : "String" + }, + "_value" : "0000FE00-343A79319AA17942" + }, + "isConcreteDevice" : { + "_type" : { + "_name" : "Bool" + }, + "_value" : "true" + }, + "logicalCPUCoresPerPackage" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "4" + }, + "modelCode" : { + "_type" : { + "_name" : "String" + }, + "_value" : "VirtualMac2,1" + }, + "modelName" : { + "_type" : { + "_name" : "String" + }, + "_value" : "Apple Virtual Machine 1" + }, + "modelUTI" : { + "_type" : { + "_name" : "String" + }, + "_value" : "com.apple.virtual-machine" + }, + "name" : { + "_type" : { + "_name" : "String" + }, + "_value" : "My Mac" + }, + "nativeArchitecture" : { + "_type" : { + "_name" : "String" + }, + "_value" : "arm64e" + }, + "operatingSystemVersion" : { + "_type" : { + "_name" : "String" + }, + "_value" : "14.3.1" + }, + "operatingSystemVersionWithBuildNumber" : { + "_type" : { + "_name" : "String" + }, + "_value" : "14.3.1 (23D60)" + }, + "physicalCPUCoresPerPackage" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "4" + }, + "platformRecord" : { + "_type" : { + "_name" : "ActionPlatformRecord" + }, + "identifier" : { + "_type" : { + "_name" : "String" + }, + "_value" : "com.apple.platform.macosx" + }, + "userDescription" : { + "_type" : { + "_name" : "String" + }, + "_value" : "macOS" + } + }, + "ramSizeInMegabytes" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "8192" + } + }, + "targetSDKRecord" : { + "_type" : { + "_name" : "ActionSDKRecord" + }, + "identifier" : { + "_type" : { + "_name" : "String" + }, + "_value" : "macosx14.4" + }, + "name" : { + "_type" : { + "_name" : "String" + }, + "_value" : "macOS 14.4" + }, + "operatingSystemVersion" : { + "_type" : { + "_name" : "String" + }, + "_value" : "14.4" + } + } + }, + "schemeCommandName" : { + "_type" : { + "_name" : "String" + }, + "_value" : "Test" + }, + "schemeTaskName" : { + "_type" : { + "_name" : "String" + }, + "_value" : "BuildAndAction" + }, + "startedTime" : { + "_type" : { + "_name" : "Date" + }, + "_value" : "2024-05-20T12:34:11.228+0000" + }, + "testPlanName" : { + "_type" : { + "_name" : "String" + }, + "_value" : "TuistDependenciesAcceptanceTests" + }, + "title" : { + "_type" : { + "_name" : "String" + }, + "_value" : "Testing workspace Tuist with scheme TuistDependenciesAcceptanceTests" + } + } + ] + }, + "issues" : { + "_type" : { + "_name" : "ResultIssueSummaries" + }, + "testFailureSummaries" : { + "_type" : { + "_name" : "Array" + }, + "_values" : [ + { + "_type" : { + "_name" : "TestFailureIssueSummary", + "_supertype" : { + "_name" : "IssueSummary" + } + }, + "documentLocationInCreatingWorkspace" : { + "_type" : { + "_name" : "DocumentLocation" + }, + "concreteTypeName" : { + "_type" : { + "_name" : "String" + }, + "_value" : "DVTTextDocumentLocation" + }, + "url" : { + "_type" : { + "_name" : "String" + }, + "_value" : "file:\/\/\/Users\/builder\/clone\/Tests\/TuistDependenciesAcceptanceTests\/DependenciesAcceptanceTests.swift#EndingLineNumber=40&StartingLineNumber=40" + } + }, + "issueType" : { + "_type" : { + "_name" : "String" + }, + "_value" : "Uncategorized" + }, + "message" : { + "_type" : { + "_name" : "String" + }, + "_value" : "failed: caught error: \"The 'xcodebuild' command exited with error code 65 and message:\n2024-05-20 12:44:17.788570+0000 xcodebuild[14114:50965] [devicemanager] DeviceManager sending check-in request: F988FF5A-CDAC-42C9-9C3F-BE87134AD171\n2024-05-20 12:44:17.790440+0000 xcodebuild[14114:50965] [devicemanager] DeviceManager check-in (F988FF5A-CDAC-42C9-9C3F-BE87134AD171) completed successfully\n2024-05-20 12:44:17.793515+0000 xcodebuild[14114:50961] [All] MobileDevice.framework version: 1643.100.58\n2024-05-20 12:44:17.798111+0000 xcodebuild[14114:50961] [All] RemotePairing.framework version: 117.100.41\n2024-05-20 12:44:17.798690+0000 xcodebuild[14114:50961] [library] USBMuxListenerCreateFiltered:898 Created 0x600003581f40\n2024-05-20 12:44:17.798774+0000 xcodebuild[14114:50961] [All] Subscribed for device notifications from usbmuxd.\n2024-05-20 12:44:18.054503+0000 xcodebuild[14114:50949] [general] initializing workspace at path \/var\/folders\/w2\/rrf5p87d1bbfyphxc7jdnyvh0000gn\/T\/TemporaryDirectory.AMHRiB\/ios_app_with_spm_dependencies\/App.xcworkspace\n2024-05-20 12:44:18.055591+0000 xcodebuild[14114:50949] [general] setting up workspace \/var\/folders\/w2\/rrf5p87d1bbfyphxc7jdnyvh0000gn\/T\/TemporaryDirectory.AMHRiB\/ios_app_with_spm_dependencies\/App.xcworkspace\n2024-05-20 12:44:18.071588+0000 xcodebuild[14114:50949] [general] using plugin library at \/Applications\/Xcode-15.3.app\/Contents\/SharedFrameworks\/SwiftPM.framework\/SharedSupport\/PluginAPI\n2024-05-20 12:44:18.071680+0000 xcodebuild[14114:50949] [general] synchronizing contents of workspace at path \/var\/folders\/w2\/rrf5p87d1bbfyphxc7jdnyvh0000gn\/T\/TemporaryDirectory.AMHRiB\/ios_app_with_spm_dependencies\/App.xcworkspace\n2024-05-20 12:44:18.071698+0000 xcodebuild[14114:50949] [general] marking workspace as having finished initial package resolution\n--- xcodebuild: WARNING: Using the first of multiple matching destinations:\n{ platform:iOS Simulator, id:2B6F50E6-2782-405A-94DF-E659C9398717, OS:17.4, name:iPad Pro (12.9-inch) (6th generation) }\n{ platform:iOS Simulator, id:2B6F50E6-2782-405A-94DF-E659C9398717, OS:17.4, name:iPad Pro (12.9-inch) (6th generation) }\n2024-05-20 12:44:18.106264+0000 xcodebuild[14114:50949] [building] creating scheme operation preamble operations for build command Build\nTesting failed:\n\tCompiling for iOS 14.0, but module 'App' has a minimum deployment target of iOS 16.0: \/Users\/builder\/Library\/Developer\/Xcode\/DerivedData\/App-fzcodvpjdyxljhcxfidulaohhxre\/Build\/Products\/Debug-iphonesimulator\/App.swiftmodule\/arm64-apple-ios-simulator.swiftmodule\n\tTesting cancelled because the build failed.\n\n** TEST FAILED **\n\n\nThe following build commands failed:\n\tSwiftEmitModule normal arm64 Emitting\\ module\\ for\\ AppTests (in target 'AppTests' from project 'App')\n(1 failure)\n\"" + }, + "testCaseName" : { + "_type" : { + "_name" : "String" + }, + "_value" : "DependenciesAcceptanceTestIosAppWithSPMDependencies.test_ios_app_spm_dependencies()" + } + } + ] + } + }, + "metadataRef" : { + "_type" : { + "_name" : "Reference" + }, + "id" : { + "_type" : { + "_name" : "String" + }, + "_value" : "0~VbN52oFuHDTG0EcAOQetUdZLbKa9zYQrCBFDkKY7h3D2Xi29FsjOinUPBURI9WNvHK3-dvcDm8cZNYvXbsYCHw==" + }, + "targetType" : { + "_type" : { + "_name" : "TypeDefinition" + }, + "name" : { + "_type" : { + "_name" : "String" + }, + "_value" : "ActionsInvocationMetadata" + } + } + }, + "metrics" : { + "_type" : { + "_name" : "ResultMetrics" + }, + "testsCount" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "3" + }, + "testsFailedCount" : { + "_type" : { + "_name" : "Int" + }, + "_value" : "1" + } + } + } + + """# + } +} From c93737c60215e6584f92adb1af02342cf6785bf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Fri, 7 Jun 2024 11:00:09 +0200 Subject: [PATCH 339/509] Some Mise configuration adjustments and deletion of version files (#6376) * Increase Mise timeout * Delete veresion files --- .mise.toml | 7 ++++++- .swift-version | 1 - .swiftformat-version | 1 - 3 files changed, 6 insertions(+), 3 deletions(-) delete mode 100644 .swift-version delete mode 100644 .swiftformat-version diff --git a/.mise.toml b/.mise.toml index ca408934841..1fc980f9453 100644 --- a/.mise.toml +++ b/.mise.toml @@ -8,4 +8,9 @@ sourcedocs = "2.0.1" [plugins] python = 'https://github.com/asdf-community/asdf-tuist' -sourcedocs = "https://github.com/tuist/asdf-sourcedocs.git" \ No newline at end of file +sourcedocs = "https://github.com/tuist/asdf-sourcedocs.git" + +[settings] +jobs = 6 +http_timeout = 30 +experimental = true \ No newline at end of file diff --git a/.swift-version b/.swift-version deleted file mode 100644 index f0933d48835..00000000000 --- a/.swift-version +++ /dev/null @@ -1 +0,0 @@ -5.10 \ No newline at end of file diff --git a/.swiftformat-version b/.swiftformat-version deleted file mode 100644 index 7f422a161ae..00000000000 --- a/.swiftformat-version +++ /dev/null @@ -1 +0,0 @@ -0.53.0 From deac1fd0e22ec8e1eda4af1fff52937ee4bf93d4 Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Fri, 7 Jun 2024 05:05:08 -0400 Subject: [PATCH 340/509] Fix extra logs from Xcode commands (#6372) * Refactor `System` to provide just a `run` implementation with a required redirection. * Linting * PR comments --- .../XcodeBuild/XcodeBuildController.swift | 2 +- .../Utils/SwiftPackageManagerInteractor.swift | 2 +- Sources/TuistSupport/System/System.swift | 16 +++++++++++----- Sources/TuistSupport/System/Systeming.swift | 4 ++-- .../TuistSupportTesting/Utils/MockSystem.swift | 2 +- .../System/SystemIntegrationTests.swift | 2 +- 6 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift index 7cd2a08423c..741cfc9c844 100644 --- a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift +++ b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift @@ -310,7 +310,7 @@ public final class XcodeBuildController: XcodeBuildControlling { logger.debug("Running xcodebuild command: \(command.joined(separator: " "))") - try System.shared.runAndPrint(command, + try System.shared.run(command, verbose: false, environment: System.shared.env, redirection: .stream(stdout: { bytes in diff --git a/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift b/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift index e78ed0ec13b..6aed76bc92a 100644 --- a/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift +++ b/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift @@ -85,7 +85,7 @@ public class SwiftPackageManagerInteractor: SwiftPackageManagerInteracting { arguments.append(contentsOf: ["-workspace", workspacePath.pathString, "-list"]) - try System.shared.runAndPrint( + try System.shared.run( arguments, verbose: false, environment: System.shared.env, diff --git a/Sources/TuistSupport/System/System.swift b/Sources/TuistSupport/System/System.swift index d159d74b9a3..a83488f557d 100644 --- a/Sources/TuistSupport/System/System.swift +++ b/Sources/TuistSupport/System/System.swift @@ -127,11 +127,19 @@ public final class System: Systeming { } public func runAndPrint(_ arguments: [String]) throws { - try runAndPrint(arguments, verbose: false, environment: env, redirection: .none) + try run(arguments, verbose: false, environment: env, redirection: streamToStandardOutputs) } public func runAndPrint(_ arguments: [String], verbose: Bool, environment: [String: String]) throws { - try runAndPrint(arguments, verbose: false, environment: environment, redirection: .none) + try run(arguments, verbose: verbose, environment: environment, redirection: streamToStandardOutputs) + } + + private var streamToStandardOutputs: TSCBasic.Process.OutputRedirection { + return .stream { bytes in + FileHandle.standardOutput.write(Data(bytes)) + } stderr: { bytes in + FileHandle.standardError.write(Data(bytes)) + } } public func runAndCollectOutput(_ arguments: [String]) async throws -> SystemCollectedOutput { @@ -211,7 +219,7 @@ public final class System: Systeming { try localFileSystem.chmod(mode, path: path, options: options) } - public func runAndPrint( + public func run( _ arguments: [String], verbose: Bool = false, environment: [String: String] = ProcessInfo.processInfo.environment, @@ -225,11 +233,9 @@ public final class System: Systeming { arguments: arguments, environment: environment, outputRedirection: .stream(stdout: { bytes in - FileHandle.standardOutput.write(Data(bytes)) redirection.outputClosures?.stdoutClosure(bytes) }, stderr: { bytes in stdErrData.append(contentsOf: bytes) - FileHandle.standardError.write(Data(bytes)) redirection.outputClosures?.stderrClosure(bytes) }), startNewProcessGroup: false, diff --git a/Sources/TuistSupport/System/Systeming.swift b/Sources/TuistSupport/System/Systeming.swift index fc1e9108142..ba686be9250 100644 --- a/Sources/TuistSupport/System/Systeming.swift +++ b/Sources/TuistSupport/System/Systeming.swift @@ -45,7 +45,7 @@ public protocol Systeming { /// - Throws: An error if the command fails. func runAndPrint(_ arguments: [String], verbose: Bool, environment: [String: String]) throws - /// Runs a command in the shell printing its output. + /// Runs a command in the shell and redirects output based on the passed in parameter. /// /// - Parameters: /// - arguments: Command. @@ -53,7 +53,7 @@ public protocol Systeming { /// - environment: Environment that should be used when running the task. /// - redirection: Output Redirection behavior for the underlying `Process` /// - Throws: An error if the command fails. - func runAndPrint( + func run( _ arguments: [String], verbose: Bool, environment: [String: String], diff --git a/Sources/TuistSupportTesting/Utils/MockSystem.swift b/Sources/TuistSupportTesting/Utils/MockSystem.swift index ef4abf48d29..ada38e4e397 100644 --- a/Sources/TuistSupportTesting/Utils/MockSystem.swift +++ b/Sources/TuistSupportTesting/Utils/MockSystem.swift @@ -60,7 +60,7 @@ public final class MockSystem: Systeming { _ = try capture(arguments, verbose: false, environment: env) } - public func runAndPrint( + public func run( _ arguments: [String], verbose _: Bool, environment _: [String: String], diff --git a/Tests/TuistSupportIntegrationTests/System/SystemIntegrationTests.swift b/Tests/TuistSupportIntegrationTests/System/SystemIntegrationTests.swift index beba8df6cbe..ebbca4ae5e9 100644 --- a/Tests/TuistSupportIntegrationTests/System/SystemIntegrationTests.swift +++ b/Tests/TuistSupportIntegrationTests/System/SystemIntegrationTests.swift @@ -30,7 +30,7 @@ final class SystemIntegrationTests: TuistTestCase { func test_run_output_is_redirected() throws { var output = "" - try subject.runAndPrint( + try subject.run( ["echo", "hola"], verbose: false, environment: System.shared.env, From 024983ab42d5d542b9cf53e5dd567202b5dc9a3f Mon Sep 17 00:00:00 2001 From: Jaewon-Yun Date: Sun, 9 Jun 2024 02:25:20 +0900 Subject: [PATCH 341/509] Improve error message (#6377) --- .../TuistGenerator/Linter/ProjectLinter.swift | 6 +- .../TuistGenerator/Linter/TargetLinter.swift | 12 +- Sources/XcodeGraph/Models/Product.swift | 4 +- .../Linter/Mocks/MockTargetLinter.swift | 2 +- .../Linter/TargetLinterTests.swift | 169 ++++++++++++++---- .../XcodeGraphTests/Models/ProductTests.swift | 2 +- 6 files changed, 150 insertions(+), 45 deletions(-) diff --git a/Sources/TuistGenerator/Linter/ProjectLinter.swift b/Sources/TuistGenerator/Linter/ProjectLinter.swift index 25f65da75f1..6bc2bfa790e 100644 --- a/Sources/TuistGenerator/Linter/ProjectLinter.swift +++ b/Sources/TuistGenerator/Linter/ProjectLinter.swift @@ -48,8 +48,8 @@ class ProjectLinter: ProjectLinting { } private func lintTargets(project: Project) -> [LintingIssue] { - var issues: [LintingIssue] = [] - issues.append(contentsOf: project.targets.values.flatMap(targetLinter.lint)) - return issues + return project.targets.values.flatMap { target in + targetLinter.lint(target: target, options: project.options) + } } } diff --git a/Sources/TuistGenerator/Linter/TargetLinter.swift b/Sources/TuistGenerator/Linter/TargetLinter.swift index 028f23b9c50..ab4d6cf30de 100644 --- a/Sources/TuistGenerator/Linter/TargetLinter.swift +++ b/Sources/TuistGenerator/Linter/TargetLinter.swift @@ -4,7 +4,7 @@ import TuistSupport import XcodeGraph protocol TargetLinting: AnyObject { - func lint(target: Target) -> [LintingIssue] + func lint(target: Target, options: Project.Options) -> [LintingIssue] } class TargetLinter: TargetLinting { @@ -25,7 +25,7 @@ class TargetLinter: TargetLinting { // MARK: - TargetLinting - func lint(target: Target) -> [LintingIssue] { + func lint(target: Target, options: Project.Options) -> [LintingIssue] { var issues: [LintingIssue] = [] issues.append(contentsOf: lintProductName(target: target)) issues.append(contentsOf: lintProductNameBuildSettings(target: target)) @@ -33,7 +33,7 @@ class TargetLinter: TargetLinting { issues.append(contentsOf: lintBundleIdentifier(target: target)) issues.append(contentsOf: lintHasSourceFiles(target: target)) issues.append(contentsOf: lintCopiedFiles(target: target)) - issues.append(contentsOf: lintLibraryHasNoResources(target: target)) + issues.append(contentsOf: lintLibraryHasNoResources(target: target, options: options)) issues.append(contentsOf: lintDeploymentTarget(target: target)) issues.append(contentsOf: settingsLinter.lint(target: target)) issues.append(contentsOf: lintDuplicateDependency(target: target)) @@ -220,15 +220,15 @@ class TargetLinter: TargetLinting { return issues } - private func lintLibraryHasNoResources(target: Target) -> [LintingIssue] { + private func lintLibraryHasNoResources(target: Target, options: Project.Options) -> [LintingIssue] { if target.supportsResources { return [] } - if target.resources.resources.isEmpty == false { + if target.resources.resources.isEmpty == false, options.disableBundleAccessors { return [ LintingIssue( - reason: "Target \(target.name) cannot contain resources. \(target.product) targets do not support resources", + reason: "Target \(target.name) cannot contain resources. For \(target.product) targets to support resources, 'Bundle Accessors' feature should be enabled.", severity: .error ), ] diff --git a/Sources/XcodeGraph/Models/Product.swift b/Sources/XcodeGraph/Models/Product.swift index c0c38986466..322a0683d6b 100644 --- a/Sources/XcodeGraph/Models/Product.swift +++ b/Sources/XcodeGraph/Models/Product.swift @@ -88,9 +88,9 @@ public enum Product: String, CustomStringConvertible, CaseIterable, Codable { case .dynamicLibrary: return "dynamic library" case .framework: - return "framework" + return "dynamic framework" case .staticFramework: - return "staticFramework" + return "static framework" case .unitTests: return "unit tests" case .uiTests: diff --git a/Tests/TuistGeneratorTests/Linter/Mocks/MockTargetLinter.swift b/Tests/TuistGeneratorTests/Linter/Mocks/MockTargetLinter.swift index 68c9aef6f78..4e32776d6eb 100644 --- a/Tests/TuistGeneratorTests/Linter/Mocks/MockTargetLinter.swift +++ b/Tests/TuistGeneratorTests/Linter/Mocks/MockTargetLinter.swift @@ -6,7 +6,7 @@ import XcodeGraphTesting @testable import TuistGenerator class MockTargetLinter: TargetLinting { - func lint(target _: Target) -> [LintingIssue] { + func lint(target _: Target, options _: Project.Options) -> [LintingIssue] { [] } } diff --git a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift index 6d2cf3533a8..06c61c6ee52 100644 --- a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift @@ -24,7 +24,7 @@ final class TargetLinterTests: TuistUnitTestCase { func test_lint_when_target_has_invalid_product_name() { let XCTAssertInvalidProductNameApp: (Target) -> Void = { target in - let got = self.subject.lint(target: target) + let got = self.subject.lint(target: target, options: .test()) let reason: String switch target.product { case .framework, .staticFramework: @@ -39,7 +39,7 @@ final class TargetLinterTests: TuistUnitTestCase { } let XCTAssertValidProductNameApp: (Target) -> Void = { target in - let got = self.subject.lint(target: target) + let got = self.subject.lint(target: target, options: .test()) XCTAssertNil(got.first(where: { $0.description.contains("Invalid product name") })) } @@ -65,7 +65,7 @@ final class TargetLinterTests: TuistUnitTestCase { )) // When - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) // Then XCTContainsLintingIssue( @@ -86,7 +86,7 @@ final class TargetLinterTests: TuistUnitTestCase { )) // When - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) // Then XCTContainsLintingIssue( @@ -101,14 +101,14 @@ final class TargetLinterTests: TuistUnitTestCase { func test_lint_when_target_has_invalid_bundle_identifier() { let XCTAssertInvalidBundleId: (String) -> Void = { bundleId in let target = Target.test(bundleId: bundleId) - let got = self.subject.lint(target: target) + let got = self.subject.lint(target: target, options: .test()) let reason = "Invalid bundle identifier '\(bundleId)'. This string must be a uniform type identifier (UTI) that contains only alphanumeric (A-Z,a-z,0-9), hyphen (-), and period (.) characters." self.XCTContainsLintingIssue(got, LintingIssue(reason: reason, severity: .error)) } let XCTAssertValidBundleId: (String) -> Void = { bundleId in let target = Target.test(bundleId: bundleId) - let got = self.subject.lint(target: target) + let got = self.subject.lint(target: target, options: .test()) XCTAssertNil(got.first(where: { $0.description.contains("Invalid bundle identifier") })) } @@ -121,7 +121,7 @@ final class TargetLinterTests: TuistUnitTestCase { func test_lint_when_target_no_source_files() { let target = Target.test(sources: []) - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) XCTContainsLintingIssue( got, @@ -133,7 +133,7 @@ final class TargetLinterTests: TuistUnitTestCase { let target = Target.test(sources: [], dependencies: [ TargetDependency.sdk(name: "libc++.tbd", status: .optional), ]) - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) XCTAssertEqual(0, got.count) } @@ -142,7 +142,7 @@ final class TargetLinterTests: TuistUnitTestCase { let target = Target.test(sources: [], scripts: [ TargetScript(name: "Test script", order: .post, script: .embedded("echo 'This is a test'")), ]) - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) XCTAssertEqual(0, got.count) } @@ -161,7 +161,7 @@ final class TargetLinterTests: TuistUnitTestCase { ) ) - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) XCTContainsLintingIssue( got, @@ -183,7 +183,7 @@ final class TargetLinterTests: TuistUnitTestCase { let path = try! AbsolutePath(validating: "/App.entitlements") let target = Target.test(resources: .init([.file(path: path)])) - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) XCTContainsLintingIssue( got, @@ -199,7 +199,7 @@ final class TargetLinterTests: TuistUnitTestCase { let path = temporaryPath.appending(component: "Info.plist") let target = Target.test(infoPlist: .file(path: path)) - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) XCTContainsLintingIssue( got, @@ -212,7 +212,7 @@ final class TargetLinterTests: TuistUnitTestCase { let path = temporaryPath.appending(component: "App.entitlements") let target = Target.test(entitlements: .file(path: path)) - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) XCTContainsLintingIssue( got, @@ -228,20 +228,125 @@ final class TargetLinterTests: TuistUnitTestCase { let staticLibrary = Target.test(product: .staticLibrary, resources: .init([element])) let dynamicLibrary = Target.test(product: .dynamicLibrary, resources: .init([element])) - let staticResult = subject.lint(target: staticLibrary) + let staticLibraryResult = subject.lint( + target: staticLibrary, + options: .test() + ) + XCTDoesNotContainLintingIssue( + staticLibraryResult, + LintingIssue( + reason: "Target \(staticLibrary.name) cannot contain resources. For \(staticLibrary.product) targets to support resources, 'Bundle Accessors' feature should be enabled.", + severity: .error + ) + ) + + let dynamicLibraryResult = subject.lint( + target: dynamicLibrary, + options: .test() + ) + XCTDoesNotContainLintingIssue( + dynamicLibraryResult, + LintingIssue( + reason: "Target \(dynamicLibrary.name) cannot contain resources. For \(dynamicLibrary.product) targets to support resources, 'Bundle Accessors' feature should be enabled.", + severity: .error + ) + ) + } + + func test_lint_when_library_has_resources_with_disable_bundle_accessors() throws { + let temporaryPath = try temporaryPath() + let path = temporaryPath.appending(component: "Image.png") + let element = ResourceFileElement.file(path: path) + + let staticLibrary = Target.test(product: .staticLibrary, resources: .init([element])) + let dynamicLibrary = Target.test(product: .dynamicLibrary, resources: .init([element])) + + let staticLibraryResult = subject.lint( + target: staticLibrary, + options: .test(disableBundleAccessors: true) + ) + XCTContainsLintingIssue( + staticLibraryResult, + LintingIssue( + reason: "Target \(staticLibrary.name) cannot contain resources. For \(staticLibrary.product) targets to support resources, 'Bundle Accessors' feature should be enabled.", + severity: .error + ) + ) + + let dynamicLibraryResult = subject.lint( + target: dynamicLibrary, + options: .test(disableBundleAccessors: true) + ) XCTContainsLintingIssue( - staticResult, + dynamicLibraryResult, + LintingIssue( + reason: "Target \(dynamicLibrary.name) cannot contain resources. For \(dynamicLibrary.product) targets to support resources, 'Bundle Accessors' feature should be enabled.", + severity: .error + ) + ) + } + + func test_lint_when_framework_has_resources() throws { + let temporaryPath = try temporaryPath() + let path = temporaryPath.appending(component: "Image.png") + let element = ResourceFileElement.file(path: path) + + let staticFramework = Target.test(product: .staticFramework, resources: .init([element])) + let dynamicFramework = Target.test(product: .framework, resources: .init([element])) + + let staticFrameworkResult = subject.lint( + target: staticFramework, + options: .test() + ) + XCTDoesNotContainLintingIssue( + staticFrameworkResult, + LintingIssue( + reason: "Target \(staticFramework.name) cannot contain resources. For \(staticFramework.product) targets to support resources, 'Bundle Accessors' feature should be enabled.", + severity: .error + ) + ) + + let dynamicFrameworkResult = subject.lint( + target: dynamicFramework, + options: .test() + ) + XCTDoesNotContainLintingIssue( + dynamicFrameworkResult, LintingIssue( - reason: "Target \(staticLibrary.name) cannot contain resources. static library targets do not support resources", + reason: "Target \(dynamicFramework.name) cannot contain resources. For \(dynamicFramework.product) targets to support resources, 'Bundle Accessors' feature should be enabled.", severity: .error ) ) + } + + func test_lint_when_framework_has_resources_with_disable_bundle_accessors() throws { + let temporaryPath = try temporaryPath() + let path = temporaryPath.appending(component: "Image.png") + let element = ResourceFileElement.file(path: path) + + let staticFramework = Target.test(product: .staticFramework, resources: .init([element])) + let dynamicFramework = Target.test(product: .framework, resources: .init([element])) - let dynamicResult = subject.lint(target: dynamicLibrary) + let staticFrameworkResult = subject.lint( + target: staticFramework, + options: .test(disableBundleAccessors: true) + ) XCTContainsLintingIssue( - dynamicResult, + staticFrameworkResult, + LintingIssue( + reason: "Target \(staticFramework.name) cannot contain resources. For \(staticFramework.product) targets to support resources, 'Bundle Accessors' feature should be enabled.", + severity: .error + ) + ) + + let dynamicFrameworkResult = subject.lint( + target: dynamicFramework, + options: .test(disableBundleAccessors: true) + ) + XCTDoesNotContainLintingIssue( + dynamicFrameworkResult, LintingIssue( - reason: "Target \(dynamicLibrary.name) cannot contain resources. dynamic library targets do not support resources", + reason: "Target \(dynamicFramework.name) cannot contain resources. For \(dynamicFramework.product) targets to support resources, 'Bundle Accessors' feature should be enabled.", severity: .error ) ) @@ -259,7 +364,7 @@ final class TargetLinterTests: TuistUnitTestCase { ) // When - let result = subject.lint(target: bundle) + let result = subject.lint(target: bundle, options: .test()) // Then XCTContainsLintingIssue( @@ -281,7 +386,7 @@ final class TargetLinterTests: TuistUnitTestCase { ) // When - let result = subject.lint(target: bundle) + let result = subject.lint(target: bundle, options: .test()) // Then XCTAssertTrue(result.isEmpty) @@ -300,7 +405,7 @@ final class TargetLinterTests: TuistUnitTestCase { ) // When - let result = subject.lint(target: bundle) + let result = subject.lint(target: bundle, options: .test()) // Then XCTAssertTrue(result.isEmpty) @@ -313,7 +418,7 @@ final class TargetLinterTests: TuistUnitTestCase { let target = Target.test(platform: .macOS, deploymentTarget: .macOS(version)) // When - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) // Then XCTDoesNotContainLintingIssue( @@ -346,7 +451,7 @@ final class TargetLinterTests: TuistUnitTestCase { ] for target in targets { - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) // Then XCTDoesNotContainLintingIssue( @@ -366,7 +471,7 @@ final class TargetLinterTests: TuistUnitTestCase { let target = Target.test(platform: .macOS, deploymentTarget: .macOS(version)) // When - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) // Then XCTContainsLintingIssue(got, LintingIssue(reason: "The version of deployment target is incorrect", severity: .error)) @@ -385,7 +490,7 @@ final class TargetLinterTests: TuistUnitTestCase { let target = Target.test(platform: combinations.0, deploymentTarget: combinations.1) // When - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) let expectedPlatform = try XCTUnwrap(combinations.1.configuredVersions.first?.platform.caseValue) // Then @@ -407,7 +512,7 @@ final class TargetLinterTests: TuistUnitTestCase { ] // When - let got = invalidTargets.flatMap { subject.lint(target: $0) } + let got = invalidTargets.flatMap { subject.lint(target: $0, options: .test()) } // Then let expectedIssues: [LintingIssue] = [ @@ -430,7 +535,7 @@ final class TargetLinterTests: TuistUnitTestCase { let target = Target.test(dependencies: .init(repeating: testDependency, count: 2)) // When - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) // Then XCTContainsLintingIssue(got, .init( @@ -448,7 +553,7 @@ final class TargetLinterTests: TuistUnitTestCase { ]) // When - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) // Then XCTContainsLintingIssue(got, .init( @@ -468,7 +573,7 @@ final class TargetLinterTests: TuistUnitTestCase { ]) // When - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) // Then XCTContainsLintingIssue(got, .init( @@ -491,7 +596,7 @@ final class TargetLinterTests: TuistUnitTestCase { ) // When - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) // Then XCTContainsLintingIssue(got, .init( @@ -510,7 +615,7 @@ final class TargetLinterTests: TuistUnitTestCase { ) // When - let got = subject.lint(target: target) + let got = subject.lint(target: target, options: .test()) // Then XCTContainsLintingIssue(got, .init( diff --git a/Tests/XcodeGraphTests/Models/ProductTests.swift b/Tests/XcodeGraphTests/Models/ProductTests.swift index d7b34943505..da4b1f85637 100644 --- a/Tests/XcodeGraphTests/Models/ProductTests.swift +++ b/Tests/XcodeGraphTests/Models/ProductTests.swift @@ -36,7 +36,7 @@ final class ProductTests: XCTestCase { XCTAssertEqual(Product.app.description, "application") XCTAssertEqual(Product.staticLibrary.description, "static library") XCTAssertEqual(Product.dynamicLibrary.description, "dynamic library") - XCTAssertEqual(Product.framework.description, "framework") + XCTAssertEqual(Product.framework.description, "dynamic framework") XCTAssertEqual(Product.unitTests.description, "unit tests") XCTAssertEqual(Product.uiTests.description, "ui tests") XCTAssertEqual(Product.appExtension.description, "app extension") From 042a8ac498df7154a1c615dc1e82fdc633704c8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Mon, 10 Jun 2024 12:00:46 +0200 Subject: [PATCH 342/509] Migrate to `tuist/path` (#6378) * Use tuist/path for paths * Some fixes * Force CI run * Fix linting issues --------- Co-authored-by: Daniele Formichelli --- Package.resolved | 11 +- Package.swift | 45 ++-- .../TuistAcceptanceTestCase+Extra.swift | 2 +- .../TuistAcceptanceTestCase.swift | 2 +- Sources/TuistAnalytics/TuistAnalytics.swift | 2 +- .../TuistAsyncQueue/AsyncQueuePersistor.swift | 2 +- .../SkipUITestsProjectMapper.swift | 2 +- .../SourceRootPathProjectMapper.swift | 2 +- .../Utilities/BuildGraphInspector.swift | 2 +- .../Utilities/TargetBuilder.swift | 2 +- .../Utilities/TargetRunner.swift | 2 +- .../XcodeBuildDestination+Find.swift | 2 +- .../XcodeBuild/XcodeBuildController.swift | 2 +- .../Utilities/MockBuildGraphInspector.swift | 2 +- .../Utilities/MockTargetBuilder.swift | 2 +- .../Utilities/MockTargetRunner.swift | 2 +- .../TuistCore/Analytics/CommandEvent.swift | 2 +- .../Automation/XcodeBuildArgument.swift | 2 +- .../Automation/XcodeBuildControlling.swift | 2 +- .../Automation/XcodeBuildSettings.swift | 2 +- .../Automation/XcodeBuildTarget.swift | 2 +- .../Cache/CacheDirectoriesProvider.swift | 4 +- .../TuistCore/Cache/FileContentHashing.swift | 2 +- .../ContentHashing/ContentHasher.swift | 2 +- .../ContentHashing/ContentHashingError.swift | 2 +- .../ContentHashing/HashingFilesFilter.swift | 2 +- .../Descriptors/DirectoryDescriptor.swift | 2 +- .../Descriptors/FileDescriptor.swift | 2 +- .../Descriptors/SideEffectDescriptor.swift | 2 +- .../Graph/CircularDependencyLinter.swift | 2 +- .../Graph/GraphCircularDetector.swift | 3 +- .../Graph/GraphDependencyReference.swift | 2 +- Sources/TuistCore/Graph/GraphLoader.swift | 2 +- .../TuistCore/Graph/GraphLoadingError.swift | 2 +- Sources/TuistCore/Graph/GraphTraverser.swift | 93 ++++---- .../TuistCore/Graph/Mappers/GraphMapper.swift | 2 +- .../Graph/ModelExtensions/Project+Core.swift | 2 +- .../Graph/ModelExtensions/Target+Core.swift | 2 +- .../ModelExtensions/TargetScript+Core.swift | 2 +- .../GraphTraverser/GraphTraversing.swift | 2 +- .../FrameworkMetadataProvider.swift | 2 +- .../LibraryMetadataProvider.swift | 2 +- .../PrecompiledMetadataProvider.swift | 2 +- .../SystemFrameworksMetadataProvider.swift | 2 +- .../XCFrameworkMetadataProvider.swift | 2 +- .../NodeLoaders/FrameworkLoader.swift | 2 +- .../NodeLoaders/XCFrameworkLoader.swift | 2 +- .../Simulator/SimulatorController.swift | 2 +- .../TuistCore/Simulator/SimulatorDevice.swift | 2 +- .../Simulator/SimulatorRuntime.swift | 2 +- .../Utils/RootDirectoryLocator.swift | 2 +- .../XcodeProjectBuildDirectoryLocator.swift | 2 +- .../Automation/MockXcodeBuildController.swift | 2 +- .../Cache/MockContentHasher.swift | 2 +- .../TuistTestCase+LintingIssue.swift | 2 +- .../Graph/DependenciesGraph+TestData.swift | 2 +- .../GraphDependencyReference+TestData.swift | 2 +- .../Graph/MockGraphLoader.swift | 2 +- .../WorkspaceWithProjects+TestData.swift | 2 +- .../GraphTraverser/MockGraphTraverser.swift | 20 +- .../Mappers/MockProjectMapper.swift | 2 +- .../Mappers/MockWorkspaceMapper.swift | 2 +- .../MockFrameworkMetadataProvider.swift | 2 +- .../MockLibraryMetadataProvider.swift | 2 +- .../MockPrecompiledMetadataProvider.swift | 2 +- .../MockXCFrameworkMetadataProvider.swift | 2 +- .../NodeLoaders/MockFrameworkNodeLoader.swift | 2 +- .../NodeLoaders/MockXCFrameworkLoader.swift | 2 +- .../Simulator/MockSimulatorController.swift | 2 +- .../Simulator/SimulatorDevice+TestData.swift | 2 +- .../SimulatorDeviceAndRuntime+TestData.swift | 2 +- .../Simulator/SimulatorRuntime+TestData.swift | 2 +- .../Utils/MockRootDirectoryLocator.swift | 2 +- ...ockXcodeProjectBuildDirectoryLocator.swift | 2 +- ...xternalDependencyPathWorkspaceMapper.swift | 2 +- .../Descriptors/ProjectDescriptor.swift | 2 +- .../Descriptors/WorkspaceDescriptor.swift | 2 +- .../WorkspaceSettingsDescriptor.swift | 2 +- .../Extensions/AbsolutePath+Extras.swift | 2 +- .../Extensions/Graph+Extras.swift | 3 +- .../Generator/BuildPhaseGenerator.swift | 2 +- .../Generator/ConfigGenerator.swift | 2 +- .../Generator/DescriptorGenerator.swift | 2 +- .../Generator/GeneratedProject.swift | 2 +- .../Generator/LinkGenerator.swift | 2 +- .../ProjectDescriptorGenerator.swift | 2 +- .../Generator/ProjectFileElements.swift | 2 +- .../Generator/ProjectGroups.swift | 1 + .../SchemeDescriptorsGenerator.swift | 2 +- .../Generator/TargetGenerator.swift | 2 +- .../WorkspaceDescriptorGenerator.swift | 2 +- .../WorkspaceStructureGenerator.swift | 2 +- .../Linter/EnvironmentLinter.swift | 2 +- .../TuistGenerator/Linter/PackageLinter.swift | 2 +- .../TuistGenerator/Linter/ProjectLinter.swift | 2 +- .../Linter/SettingsLinter.swift | 2 +- .../Linter/StaticProductsGraphLinter.swift | 2 +- .../AutogeneratedSchemesProjectMapper.swift | 2 +- .../ExplicitDependencyGraphMapper.swift | 2 +- .../GenerateEntitlementsProjectMapper.swift | 2 +- .../GenerateInfoPlistProjectMapper.swift | 2 +- ...GeneratePrivacyManifestProjectMapper.swift | 2 +- .../Mappers/IDETemplateMacrosMapper.swift | 2 +- .../Mappers/ModuleMapMapper.swift | 2 +- .../Mappers/ResourcesProjectMapper.swift | 2 +- ...esizedResourceInterfaceProjectMapper.swift | 2 +- .../Utils/EmbedScriptGenerator.swift | 2 +- .../Utils/SwiftPackageManagerInteractor.swift | 2 +- ...nthesizedResourceInterfacesGenerator.swift | 2 +- .../Writers/XcodeProjWriter.swift | 2 +- .../MockSideEffectDescriptorExecutor.swift | 2 +- .../TestData/ProjectDescriptor+TestData.swift | 2 +- .../TestData/SchemeDescriptor+TestData.swift | 2 +- .../WorkspaceDescriptor+TestData.swift | 2 +- .../Generator/MockDescriptorGenerator.swift | 2 +- .../Linter/MockEnvironmentLinter.swift | 2 +- Sources/TuistKit/Commands/BuildCommand.swift | 2 +- .../Cloud/CloudAnalyticsCommand.swift | 2 +- .../Commands/Cloud/CloudAuthCommand.swift | 2 +- .../Commands/Cloud/CloudCleanCommand.swift | 2 +- .../Commands/Cloud/CloudInitCommand.swift | 2 +- .../Commands/Cloud/CloudLogoutCommand.swift | 2 +- .../CloudOrganizationBillingCommand.swift | 2 +- .../Cloud/CloudOrganizationCommand.swift | 2 +- .../CloudOrganizationCreateCommand.swift | 2 +- .../CloudOrganizationDeleteCommand.swift | 2 +- .../CloudOrganizationInviteCommand.swift | 2 +- .../Cloud/CloudOrganizationListCommand.swift | 2 +- .../CloudOrganizationRemoveCommand.swift | 2 +- ...CloudOrganizationRemoveInviteCommand.swift | 2 +- ...CloudOrganizationRemoveMemberCommand.swift | 2 +- .../CloudOrganizationRemoveSSOCommand.swift | 2 +- .../Cloud/CloudOrganizationShowCommand.swift | 2 +- .../CloudOrganizationUpdateCommand.swift | 2 +- ...CloudOrganizationUpdateMemberCommand.swift | 2 +- .../CloudOrganizationUpdateSSOCommand.swift | 2 +- .../Commands/Cloud/CloudProjectCommand.swift | 2 +- .../Cloud/CloudProjectCreateCommand.swift | 2 +- .../Cloud/CloudProjectListCommand.swift | 2 +- .../Cloud/CloudProjectTokenCommand.swift | 2 +- .../Commands/Cloud/CloudSessionCommand.swift | 2 +- Sources/TuistKit/Commands/CloudCommand.swift | 2 +- Sources/TuistKit/Commands/DumpCommand.swift | 2 +- Sources/TuistKit/Commands/EditCommand.swift | 2 +- Sources/TuistKit/Commands/GraphCommand.swift | 2 +- Sources/TuistKit/Commands/InitCommand.swift | 2 +- .../TuistKit/Commands/InstallCommand.swift | 2 +- ...rationCheckEmptyBuildSettingsCommand.swift | 2 +- .../MigrationSettingsToXCConfigCommand.swift | 2 +- ...igrationTargetsByDependenciesCommand.swift | 2 +- .../TuistKit/Commands/MigrationCommand.swift | 2 +- .../Plugin/PluginArchiveCommand.swift | 2 +- .../Commands/Plugin/PluginBuildCommand.swift | 2 +- .../Commands/Plugin/PluginCommand.swift | 2 +- .../Commands/Plugin/PluginRunCommand.swift | 2 +- .../Commands/Plugin/PluginTestCommand.swift | 2 +- Sources/TuistKit/Commands/RunCommand.swift | 2 +- .../TuistKit/Commands/ScaffoldCommand.swift | 2 +- Sources/TuistKit/Commands/TestCommand.swift | 2 +- Sources/TuistKit/Commands/TuistCommand.swift | 2 +- Sources/TuistKit/Generator/Generator.swift | 2 +- .../TuistKit/Generator/GeneratorFactory.swift | 2 +- .../Factories/GraphMapperFactory.swift | 2 +- .../Factories/WorkspaceMapperFactory.swift | 2 +- .../Mappers/FocusTargetsGraphMappers.swift | 1 + .../TreeShakePrunedTargetsGraphMapper.swift | 2 +- .../EditablePluginManifest.swift | 2 +- .../ProjectEditor/ProjectEditor.swift | 2 +- .../ProjectEditor/ProjectEditorMapper.swift | 2 +- Sources/TuistKit/Services/BuildService.swift | 2 +- Sources/TuistKit/Services/CleanService.swift | 4 +- .../Cloud/CloudAnalyticsService.swift | 2 +- .../Services/Cloud/CloudAuthService.swift | 2 +- .../Services/Cloud/CloudCleanService.swift | 2 +- .../Services/Cloud/CloudInitService.swift | 2 +- .../Services/Cloud/CloudLogoutService.swift | 2 +- .../CloudOrganizationBillingService.swift | 2 +- .../CloudOrganizationCreateService.swift | 2 +- .../CloudOrganizationDeleteService.swift | 2 +- .../CloudOrganizationInviteService.swift | 2 +- .../Cloud/CloudOrganizationListService.swift | 2 +- ...CloudOrganizationRemoveInviteService.swift | 2 +- ...CloudOrganizationRemoveMemberService.swift | 2 +- .../CloudOrganizationRemoveSSOService.swift | 2 +- .../Cloud/CloudOrganizationShowService.swift | 2 +- ...CloudOrganizationUpdateMemberService.swift | 2 +- .../CloudOrganizationUpdateService.swift | 2 +- .../Cloud/CloudProjectCreateService.swift | 2 +- .../Cloud/CloudProjectDeleteService.swift | 2 +- .../Cloud/CloudProjectListService.swift | 2 +- .../Cloud/CloudProjectTokenService.swift | 2 +- .../Services/Cloud/CloudSessionService.swift | 2 +- Sources/TuistKit/Services/DumpService.swift | 3 +- Sources/TuistKit/Services/EditService.swift | 2 +- .../TuistKit/Services/GenerateService.swift | 2 +- Sources/TuistKit/Services/GraphService.swift | 2 +- Sources/TuistKit/Services/InitService.swift | 2 +- .../TuistKit/Services/InstallService.swift | 2 +- Sources/TuistKit/Services/ListService.swift | 2 +- ...rationCheckEmptyBuildSettingsService.swift | 2 +- .../MigrationSettingsToXCConfigService.swift | 2 +- ...igrationTargetsByDependenciesService.swift | 2 +- .../Plugin/PluginArchiveService.swift | 2 +- .../Services/Plugin/PluginBuildService.swift | 2 +- .../Services/Plugin/PluginRunService.swift | 2 +- .../Services/Plugin/PluginTestService.swift | 2 +- .../ProjectAutomation+ManifestMapper.swift | 2 +- Sources/TuistKit/Services/RunService.swift | 2 +- .../TuistKit/Services/ScaffoldService.swift | 2 +- Sources/TuistKit/Services/TestService.swift | 2 +- Sources/TuistKit/Services/TuistService.swift | 2 +- .../TuistKit/Utils/ManifestGraphLoader.swift | 2 +- .../Utils/TuistAnalyticsCloudBackend.swift | 2 +- .../Loaders/CachedManifestLoader.swift | 2 +- .../TuistLoader/Loaders/ConfigLoader.swift | 2 +- .../TuistLoader/Loaders/ManifestLoader.swift | 2 +- .../Loaders/ManifestModelConverter.swift | 2 +- .../Loaders/PackageSettingsLoader.swift | 2 +- .../Loaders/RecursiveManifestLoader.swift | 4 +- .../SwiftPackageManagerGraphLoader.swift | 2 +- .../TuistLoader/Loaders/TemplateLoader.swift | 2 +- .../UmbrellaHeaderHeadersExtractor.swift | 2 +- .../AnalyzeAction+ManifestMapper.swift | 2 +- .../ArchiveAction+ManifestMapper.swift | 2 +- .../BuildAction+ManifestMapper.swift | 2 +- .../Cache+ManifestMapper.swift | 2 +- .../Cloud+ManifestMapper.swift | 2 +- ...mpatibleXcodeVersions+ManifestMapper.swift | 2 +- .../Config+ManifestMapper.swift | 2 +- .../Configuration+ManifestMapper.swift | 2 +- .../CopyFileElement+ManifestMapper.swift | 2 +- .../CopyFilesAction+ManifestMapper.swift | 2 +- .../CoreDataModel+ManifestMapper.swift | 2 +- .../DefaultSettings+ManifestMapper.swift | 2 +- .../Entitlements+ManifestMapper.swift | 2 +- .../ExecutionAction+ManifestMapper.swift | 2 +- .../FileCodeGen+ManifestMapper.swift | 2 +- .../FileElement+ManifestMapper.swift | 2 +- .../Headers+ManifestMapper.swift | 2 +- .../IDETemplateMacros+ManifestMapper.swift | 2 +- .../InfoPlist+ManifestMapper.swift | 2 +- .../Package+ManifestMapper.swift | 2 +- .../PackageSettings+ManifestMapper.swift | 2 +- .../Plist+ManifestMapper.swift | 2 +- .../ProfileAction+ManifestMapper.swift | 2 +- .../Project+ManifestMapper.swift | 2 +- .../ResourceFileElement+ManifestMapper.swift | 2 +- .../ResourceSynthesizer+ManifestMapper.swift | 2 +- .../RunAction+ManifestMapper.swift | 2 +- .../RunActionOptions+ManifestMapper.swift | 2 +- .../Scheme+ManifestMapper.swift | 2 +- ...hemeDiagnosticsOption+ManifestMapper.swift | 2 +- .../SettingValue+ManifestMapper.swift | 2 +- .../Settings+ManifestMapper.swift | 2 +- .../Target+ManifestMapper.swift | 2 +- .../TargetAction+ManifestMapper.swift | 2 +- .../TargetDependency+ManifestMapper.swift | 2 +- .../TestAction+ManifestMapper.swift | 2 +- .../TestPlan+ManifestMapper.swift | 4 +- .../TestableTarget+ManifestMapper.swift | 2 +- .../Workspace+ManifestMapper.swift | 2 +- .../Models/FileListGlob+Unfold.swift | 2 +- .../TuistLoader/Models/GeneratorPaths.swift | 2 +- Sources/TuistLoader/Models/Manifest.swift | 2 +- .../TuistLoader/Models/PluginStencil.swift | 2 +- .../ProjectDescriptionHelpersModule.swift | 2 +- .../ProjectDescriptionHelpersBuilder.swift | 4 +- ...jectDescriptionHelpersBuilderFactory.swift | 2 +- .../ProjectDescriptionHelpersHasher.swift | 2 +- .../Protocols/GraphInitiatable.swift | 3 +- .../PackageInfoMapper.swift | 2 +- .../SwiftPackageManager/SettingsMapper.swift | 2 +- ...wiftPackageManagerModuleMapGenerator.swift | 2 +- .../Utils/HelpersDirectoryLocator.swift | 2 +- .../Utils/ManifestFilesLocator.swift | 2 +- .../Utils/ProjectDescriptionPaths.swift | 2 +- .../TuistLoader/Utils/ResourceLocator.swift | 5 +- .../ResourceSynthesizerPathLocator.swift | 2 +- .../Utils/StencilPathLocator.swift | 2 +- .../Loaders/Mocks/MockManifestLoader.swift | 2 +- .../Mocks/MockPackageSettingsLoader.swift | 2 +- .../Loaders/Mocks/MockTemplateGitLoader.swift | 2 +- .../Loaders/Mocks/MockTemplateLoader.swift | 2 +- ...MockProjectDescriptionHelpersBuilder.swift | 2 +- ...jectDescriptionHelpersBuilderFactory.swift | 2 +- .../Mocks/MockHelpersDirectoryLocator.swift | 2 +- .../Utils/Mocks/MockResourceLocator.swift | 2 +- .../MockResourceSynthesizerPathLocator.swift | 4 +- .../Utilities/EmptyBuildSettingsChecker.swift | 2 +- .../SettingsToXCConfigExtractor.swift | 2 +- .../Utilities/TargetsExtractor.swift | 10 +- .../MockEmptyBuildSettingsChecker.swift | 2 +- Sources/TuistPlugin/PluginService.swift | 2 +- Sources/TuistScaffold/TemplateGenerator.swift | 2 +- .../TemplatesDirectoryLocator.swift | 4 +- .../Utils/Mocks/MockTemplateGenerator.swift | 2 +- .../Mocks/MockTemplatesDirectoryLocator.swift | 2 +- Sources/TuistServer/Cache/CacheStoring.swift | 2 +- .../TuistServer/Cache/EmptyCacheStorage.swift | 2 +- .../AnalyticsArtifactUploadService.swift | 2 +- .../MultipartUploadArtifactService.swift | 2 +- .../Utilities/CloudCredentialsStore.swift | 2 +- .../Utilities/XCResultToolController.swift | 2 +- .../CoreDataVersionExtractor.swift | 2 +- .../Extensions/AbsolutePath+Extras.swift | 2 +- .../Extensions/TSCBasic+Extras.swift | 5 +- Sources/TuistSupport/HTTP/FileClient.swift | 2 +- Sources/TuistSupport/Logging/FileLogger.swift | 2 +- Sources/TuistSupport/Models/InvalidGlob.swift | 2 +- .../SwiftPackageManager/PackageInfo.swift | 2 +- .../SwiftPackageManagerController.swift | 2 +- Sources/TuistSupport/System/System.swift | 5 +- Sources/TuistSupport/System/Systeming.swift | 3 +- .../Utils/DerivedDataLocator.swift | 2 +- .../Utils/DeveloperEnvironment.swift | 2 +- Sources/TuistSupport/Utils/Environment.swift | 2 +- Sources/TuistSupport/Utils/FileArchiver.swift | 2 +- .../Utils/FileArchivingFactory.swift | 2 +- Sources/TuistSupport/Utils/FileHandler.swift | 198 ++++++++++-------- .../TuistSupport/Utils/FileUnarchiver.swift | 2 +- Sources/TuistSupport/Utils/GitHandler.swift | 2 +- Sources/TuistSupport/Utils/Opener.swift | 2 +- .../Utils/TemporaryDirectory.swift | 10 +- Sources/TuistSupport/Xcode/Xcode.swift | 2 +- .../TuistSupport/Xcode/XcodeController.swift | 2 +- .../Extensions/XCTestCase+Extras.swift | 2 +- .../HTTP/MockFileClient.swift | 2 +- .../MockSwiftPackageManagerController.swift | 2 +- .../PackageInfo+TestData.swift | 2 +- .../TestCase/TuistTestCase.swift | 2 +- .../Utils/MockDerivedDataLocator.swift | 2 +- .../Utils/MockDeveloperEnvironment.swift | 2 +- .../Utils/MockEnvironment.swift | 2 +- .../Utils/MockGitHandler.swift | 2 +- .../Utils/MockOpener.swift | 2 +- .../Utils/MockSystem.swift | 5 +- .../Xcode/TestData/Xcode+TestData.swift | 2 +- .../DependenciesGraph/DependenciesGraph.swift | 2 +- .../Graph/ConditionalGraphTarget.swift | 2 +- Sources/XcodeGraph/Graph/Graph.swift | 2 +- .../XcodeGraph/Graph/GraphDependency.swift | 2 +- Sources/XcodeGraph/Graph/GraphTarget.swift | 2 +- Sources/XcodeGraph/Models/ArchiveAction.swift | 2 +- Sources/XcodeGraph/Models/BuildAction.swift | 2 +- Sources/XcodeGraph/Models/Config.swift | 2 +- .../Models/ConfigGenerationOptions.swift | 2 +- .../XcodeGraph/Models/CopyFileElement.swift | 2 +- .../XcodeGraph/Models/CopyFilesAction.swift | 2 +- Sources/XcodeGraph/Models/CoreDataModel.swift | 2 +- .../SwiftPackageManagerDependencies.swift | 2 +- .../XcodeGraph/Models/ExecutionAction.swift | 2 +- Sources/XcodeGraph/Models/FileElement.swift | 2 +- Sources/XcodeGraph/Models/Headers.swift | 2 +- .../Models/Metadata/FrameworkMetadata.swift | 2 +- .../Models/Metadata/LibraryMetadata.swift | 2 +- .../Metadata/SystemFrameworkMetadata.swift | 2 +- .../Models/Metadata/XCFrameworkMetadata.swift | 2 +- Sources/XcodeGraph/Models/Package.swift | 2 +- .../XcodeGraph/Models/PlatformCondition.swift | 2 +- Sources/XcodeGraph/Models/Plist.swift | 2 +- Sources/XcodeGraph/Models/Plugin.swift | 2 +- .../Models/PluginResourceSynthesizer.swift | 2 +- Sources/XcodeGraph/Models/Plugins.swift | 2 +- Sources/XcodeGraph/Models/Project.swift | 2 +- .../ProjectDescriptionHelpersPlugin.swift | 2 +- .../Models/RawScriptBuildPhase.swift | 2 +- .../Models/ResourceFileElement.swift | 2 +- .../Models/ResourceSynthesizer.swift | 2 +- Sources/XcodeGraph/Models/RunAction.swift | 2 +- .../XcodeGraph/Models/RunActionOptions.swift | 2 +- Sources/XcodeGraph/Models/Scheme.swift | 2 +- Sources/XcodeGraph/Models/Settings.swift | 2 +- .../XcodeGraph/Models/SimulatedLocation.swift | 2 +- Sources/XcodeGraph/Models/SourceFile.swift | 2 +- Sources/XcodeGraph/Models/Target.swift | 2 +- .../XcodeGraph/Models/TargetDependency.swift | 2 +- .../XcodeGraph/Models/TargetReference.swift | 2 +- Sources/XcodeGraph/Models/TargetScript.swift | 2 +- Sources/XcodeGraph/Models/Template.swift | 2 +- Sources/XcodeGraph/Models/TestAction.swift | 2 +- Sources/XcodeGraph/Models/TestPlan.swift | 2 +- Sources/XcodeGraph/Models/Workspace.swift | 2 +- .../Models/XCFrameworkInfoPlist.swift | 2 +- .../DependenciesGraph+TestData.swift | 2 +- .../Graph/Graph+TestData.swift | 2 +- .../Graph/GraphDependency+TestData.swift | 2 +- .../Graph/GraphTarget+TestData.swift | 2 +- .../Models/AnalyzeAction+TestData.swift | 2 +- .../Models/ArchiveAction+TestData.swift | 2 +- .../Models/Arguments+TestData.swift | 2 +- .../Models/BuildAction+TestData.swift | 2 +- .../Models/Cloud+TestData.swift | 2 +- .../Models/Config+TestData.swift | 2 +- .../Models/Headers+TestData.swift | 2 +- .../Metadata/FrameworkMetadata+TestData.swift | 2 +- .../Metadata/LibraryMetadata+TestData.swift | 2 +- .../XCFrameworkMetadata+TestData.swift | 2 +- .../Models/PackageSettings+TestData.swift | 2 +- .../Models/Plugins+TestData.swift | 2 +- .../Models/ProfileAction+TestData.swift | 2 +- .../Models/Project+TestData.swift | 2 +- .../Models/RawScriptBuildPhase+TestData.swift | 2 +- .../ResourceSynthesizerPlugin+TestData.swift | 2 +- .../Models/RunAction+TestData.swift | 2 +- .../Models/Scheme+TestData.swift | 2 +- .../Models/Settings+TestData.swift | 2 +- .../Models/Target+TestData.swift | 2 +- .../Models/Template+TestData.swift | 2 +- .../Models/TestAction+TestData.swift | 2 +- .../Models/TestableTarget+TestData.swift | 2 +- .../Models/Workspace+TestData.swift | 2 +- .../XCFrameworkInfoPlist+TestData.swift | 2 +- Sources/tuist/TuistApp.swift | 1 + .../tuistbenchmark/Benchmark/Measure.swift | 2 + Sources/tuistbenchmark/main.swift | 2 +- .../Generator/Generator.swift | 1 + Sources/tuistfixturegenerator/main.swift | 2 - .../BuildRulesAcceptanceTests.swift | 2 +- .../EditAcceptanceTests.swift | 2 +- .../GraphAcceptanceTests.swift | 2 +- .../InitAcceptanceTests.swift | 2 +- .../ListTargetsAcceptanceTests.swift | 2 +- .../PluginAcceptanceTests.swift | 2 +- .../PrecompiledAcceptanceTests.swift | 2 +- .../RunAcceptanceTests.swift | 2 +- .../ScaffoldAcceptanceTests.swift | 2 +- .../AsyncQueuePersistorTests.swift | 2 +- .../BuildAcceptanceTests.swift | 2 +- .../TestAcceptanceTests.swift | 2 +- .../SimulatorControllerIntegrationTests.swift | 2 +- ...XcodeBuildControllerIntegrationTests.swift | 2 +- ...workMetadataProviderIntegrationTests.swift | 2 +- ...iledMetadataProviderIntegrationTests.swift | 2 +- ...RootDirectoryLocatorIntegrationTests.swift | 2 +- .../Automation/XcodeBuildArgumentTests.swift | 2 +- .../Automation/XcodeBuildTargetTests.swift | 2 +- .../ContentHashing/ContentHasherTests.swift | 2 +- .../Graph/CircularDependencyLinterTests.swift | 2 +- .../Graph/GraphDependencyReferenceTests.swift | 2 +- .../Graph/GraphDependencyTests.swift | 2 +- .../Graph/GraphLoaderTests.swift | 2 +- .../Graph/GraphLoadingErrorTests.swift | 2 +- .../Graph/GraphTargetTests.swift | 2 +- .../Graph/GraphTraverserTests.swift | 2 +- .../Graph/Mappers/GraphMapperTests.swift | 2 +- .../Graph/Mappers/ProjectMapperTests.swift | 2 +- .../Graph/Mappers/WorkspaceMapperTests.swift | 2 +- .../FrameworkMetadataProviderTests.swift | 2 +- .../LibraryMetadataProviderTests.swift | 2 +- .../PrecompiledMetadataProviderTests.swift | 2 +- ...SystemFrameworkMetadataProviderTests.swift | 2 +- .../XCFrameworkMetadataProviderTests.swift | 2 +- .../NodeLoaders/FrameworkLoaderTests.swift | 2 +- .../NodeLoaders/XCFrameworkLoaderTests.swift | 2 +- .../Simulator/SimulatorControllerTests.swift | 2 +- .../Utils/GraphCircularDetectorTests.swift | 2 +- ...odeProjectBuildDirectoryLocatorTests.swift | 2 +- .../DependenciesAcceptanceTests.swift | 2 +- ...xternalDependencyPathWorkspaceMapper.swift | 2 +- ...rphanExternalTargetsGraphMapperTests.swift | 2 +- .../GenerateAcceptanceTests.swift | 2 +- ...ltipleConfigurationsIntegrationTests.swift | 9 +- .../StableStructureIntegrationTests.swift | 2 +- .../SwiftPackageManagerInteractorTests.swift | 2 +- .../Generator/TestModelGenerator.swift | 2 +- .../TuistGeneratorPerformanceTests.swift | 2 +- .../WorkspaceGeneratorIntegrationTests.swift | 2 +- .../Generator/XcodeProjWriterTests.swift | 2 +- .../Generator/BuildPhaseGeneratorTests.swift | 2 +- .../Generator/ConfigGeneratorTests.swift | 2 +- .../Generator/LinkGeneratorTests.swift | 2 +- .../MockProjectDescriptorGenerator.swift | 2 +- .../MockSchemeDescriptorsGenerator.swift | 2 +- .../Generator/Mocks/MockTargetGenerator.swift | 2 +- .../MockWorkspaceDescriptorGenerator.swift | 2 +- .../ProjectDescriptorGeneratorTests.swift | 2 +- .../Generator/ProjectFileElementsTests.swift | 2 +- .../Generator/ProjectGroupsTests.swift | 2 +- .../SchemeDescriptorsGeneratorTests.swift | 2 +- .../Generator/TargetGeneratorTests.swift | 2 +- .../TestData/GeneratedProject+TestData.swift | 2 +- .../WorkspaceDescriptorGeneratorTests.swift | 2 +- ...paceSettingsDescriptorGeneratorTests.swift | 2 +- .../WorkspaceSettingsDescriptorTests.swift | 2 +- .../WorkspaceStructureGeneratorTests.swift | 2 +- ...dWorkspaceSchemeWorkspaceMapperTests.swift | 2 +- .../GraphViz/GraphToGraphVizMapperTests.swift | 2 +- .../Linter/EnvironmentLinterTests.swift | 2 +- .../Linter/GraphLinterTests.swift | 2 +- .../Linter/PackageLinterTests.swift | 2 +- .../Linter/ProjectLinterTests.swift | 2 +- .../Linter/SchemeLinterTests.swift | 2 +- .../Linter/SettingsLinterTests.swift | 2 +- .../StaticProductsGraphLinterTests.swift | 2 +- .../Linter/TargetLinterTests.swift | 2 +- .../Linter/TargetScriptLinterTests.swift | 2 +- ...togeneratedSchemesProjectMapperTests.swift | 2 +- ...teDerivedDirectoryProjectMapperTests.swift | 2 +- .../GenerateInfoPlistProjectMapperTests.swift | 2 +- .../IDETemplateMacrosMapperTests.swift | 2 +- .../ResourcesProjectMapperTests.swift | 2 +- ...dResourceInterfaceProjectMapperTests.swift | 2 +- .../Utils/EmbedScriptGeneratorTests.swift | 2 +- .../Mocks/MockEmbedScriptGenerator.swift | 2 +- ...ynthesizedResourceInterfaceGenerator.swift | 2 +- .../DumpServiceIntegrationTests.swift | 2 +- .../ManifestGraphLoaderIntegrationTests.swift | 2 +- .../Cloud/CloudAuthServiceTests.swift | 2 +- .../Cloud/CloudInitServiceTests.swift | 2 +- .../Cloud/CloudLogoutServiceTests.swift | 2 +- .../Cloud/CloudSessionServiceTests.swift | 2 +- .../CommandEnvironmentVariableTests.swift | 2 +- .../Dot/MockDotGraphGenerator.swift | 2 +- .../Generator/Mocks/MockGenerator.swift | 2 +- .../Factories/GraphMapperFactoryTests.swift | 2 +- .../Factories/ProjectMapperFactoryTests.swift | 2 +- .../WorkspaceMapperFactoryTests.swift | 2 +- .../FocusTargetsGraphMappersTests.swift | 2 +- ...eeShakePrunedTargetsGraphMapperTests.swift | 2 +- ...ateWorkspaceProjectsGraphMapperTests.swift | 2 +- ...spaceRenderMarkdownReadmeMapperTests.swift | 2 +- .../Mocks/MockManifestGraphLoader.swift | 2 +- .../Mocks/MockProjectEditorMapper.swift | 2 +- .../ProjectEditorMapperTests.swift | 2 +- .../ProjectEditor/ProjectEditorTests.swift | 2 +- .../Services/BuildServiceTests.swift | 2 +- .../Services/CleanServiceTests.swift | 2 +- .../Services/EditServiceTests.swift | 2 +- .../Services/GenerateServiceTests.swift | 2 +- .../Services/GraphServiceTests.swift | 2 +- .../Services/InitServiceTests.swift | 2 +- .../Services/InstallServiceTests.swift | 2 +- .../Services/ListServiceTests.swift | 2 +- ...nCheckEmptyBuildSettingsServiceTests.swift | 2 +- .../Plugin/PluginArchiveServiceTests.swift | 2 +- .../Plugin/PluginBuildServiceTests.swift | 2 +- .../Plugin/PluginRunServiceTests.swift | 2 +- .../Plugin/PluginTestServiceTests.swift | 2 +- .../Services/RunServiceTests.swift | 2 +- .../Services/ScaffoldServiceTests.swift | 2 +- .../Services/TestServiceTests.swift | 2 +- .../Services/TuistServiceTests.swift | 2 +- .../Loaders/ManifestLoaderTests.swift | 2 +- ...iptionHelpersBuilderIntegrationTests.swift | 2 +- .../TuistTestCase+ManifestMappers.swift | 2 +- .../Loaders/CachedManifestLoaderTests.swift | 2 +- .../Loaders/ConfigLoaderTests.swift | 2 +- .../Loaders/ManifestLoaderErrorTests.swift | 2 +- .../Loaders/ManifestLoaderFactoryTests.swift | 2 +- .../Loaders/ManifestModelConverterTests.swift | 2 +- .../Loaders/PackageSettingsLoaderTests.swift | 2 +- .../RecursiveManifestLoaderTests.swift | 2 +- .../Loaders/TemplateGitLoaderTests.swift | 2 +- .../Loaders/TemplateLoaderTests.swift | 2 +- ...CodeCoverageMode+ManifestMapperTests.swift | 2 +- .../Configuration+ManifestMapperTests.swift | 2 +- .../CopyFileElement+ManifestMapperTests.swift | 2 +- .../CopyFilesAction+ManifestMapperTests.swift | 2 +- .../CoreDataModel+ManifestMapperTests.swift | 8 +- .../FileElement+ManifestMapperTests.swift | 2 +- .../Headers+ManifestMapperTests.swift | 2 +- .../Platform+ManifestMapperTests.swift | 2 +- .../Project+ManifestMapperTests.swift | 2 +- ...sourceFileElementManifestMapperTests.swift | 2 +- ...ourceSynthesizer+ManifestMapperTests.swift | 2 +- .../Scheme+ManifestMapper.swift | 2 +- .../Settings+ManifestMapperTests.swift | 2 +- .../Stencil+ManifestMapperTests.swift | 2 +- .../Target+ManifestMapperTests.swift | 2 +- ...TargetDependency+ManifestMapperTests.swift | 2 +- .../TargetScript+ManifestMapperTests.swift | 2 +- .../Models/GeneratorPathsTests.swift | 2 +- .../MockProjectDescriptionHelpersHasher.swift | 2 +- ...ProjectDescriptionHelpersHasherTests.swift | 2 +- .../PackageInfoMapperTests.swift | 2 +- .../SettingsMapperTests.swift | 2 +- ...ackageManagerModuleMapGeneratorTests.swift | 2 +- .../Utils/ManifestFilesLocatorTests.swift | 2 +- .../Utils/PluginsHelperTests.swift | 2 +- .../ProjectDescriptionSearchPathsTests.swift | 2 +- ...BuildSettingsCheckerIntegrationTests.swift | 2 +- ...sToXCConfigExtractorIntegrationTests.swift | 2 +- .../TargetsExtractorIntegrationTests.swift | 2 +- .../EmptyBuildSettingsCheckerTests.swift | 2 +- .../TuistPluginTests/PluginServiceTests.swift | 20 +- ...atesDirectoryLocatorIntegrationTests.swift | 2 +- .../TemplateGeneratorTests.swift | 2 +- .../Session/CloudSessionControllerTests.swift | 2 +- .../System/SystemIntegrationTests.swift | 59 ------ .../Extensions/AbsolutePath+ExtrasTests.swift | 2 +- .../Extensions/FileManager+ExtrasTests.swift | 2 +- .../Extensions/String+ExtrasTests.swift | 2 +- .../Models/InvalidGlobTests.swift | 2 +- .../SwiftPackageManagerControllerTests.swift | 2 +- .../System/SystemTests.swift | 1 + .../Utils/FileHandlerTests.swift | 8 +- .../TuistSupportTests/Utils/OpenerTests.swift | 2 +- .../Utils/TextTableTests.swift | 2 +- .../Models/BinaryArchitectureTests.swift | 2 +- .../Models/InfoPlistTests.swift | 2 +- .../Models/LintingIssueTests.swift | 2 +- .../XcodeGraphTests/Models/ProjectTests.swift | 2 +- .../Models/SettingsTests.swift | 2 +- .../Models/TargetScriptTests.swift | 2 +- .../XcodeGraphTests/Models/TargetTests.swift | 2 +- Tuist/ProjectDescriptionHelpers/Module.swift | 13 +- 606 files changed, 858 insertions(+), 858 deletions(-) delete mode 100644 Tests/TuistSupportIntegrationTests/System/SystemIntegrationTests.swift diff --git a/Package.resolved b/Package.resolved index b61467f4e12..e293da34791 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "d37db3f22e16eeca44eacdba528daf5f694b1c811b68c38e2fd77199db920165", + "originHash" : "355f9ed60b1d843fa8956e1b2c94f0be3e9c4591068b9955a571c0456e0e8a6c", "pins" : [ { "identity" : "aexml", @@ -91,6 +91,15 @@ "version" : "1.1.3" } }, + { + "identity" : "path", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tuist/Path.git", + "state" : { + "revision" : "4490da629937fc3994f72dd787dcc3f50d6973fe", + "version" : "0.3.0" + } + }, { "identity" : "pathkit", "kind" : "remoteSourceControl", diff --git a/Package.swift b/Package.swift index ec71d4fb85b..24881eb68a1 100644 --- a/Package.swift +++ b/Package.swift @@ -3,6 +3,7 @@ import PackageDescription let swiftToolsSupportDependency: Target.Dependency = .product(name: "SwiftToolsSupport-auto", package: "swift-tools-support-core") +let pathDependency: Target.Dependency = .product(name: "Path", package: "Path") let loggingDependency: Target.Dependency = .product(name: "Logging", package: "swift-log") let argumentParserDependency: Target.Dependency = .product(name: "ArgumentParser", package: "swift-argument-parser") let swiftGenKitDependency: Target.Dependency = .product(name: "SwiftGenKit", package: "SwiftGen") @@ -12,6 +13,7 @@ var targets: [Target] = [ name: "tuistbenchmark", dependencies: [ argumentParserDependency, + pathDependency, swiftToolsSupportDependency, ] ), @@ -19,13 +21,14 @@ var targets: [Target] = [ name: "tuistfixturegenerator", dependencies: [ argumentParserDependency, + pathDependency, swiftToolsSupportDependency, ] ), .target( name: "XcodeGraph", dependencies: [ - swiftToolsSupportDependency, + pathDependency, "AnyCodable", "TuistSupport", "Mockable", @@ -39,7 +42,7 @@ var targets: [Target] = [ dependencies: [ "XcodeGraph", "TuistSupportTesting", - swiftToolsSupportDependency, + pathDependency, "AnyCodable", ], linkerSettings: [.linkedFramework("XCTest")] @@ -47,7 +50,7 @@ var targets: [Target] = [ .target( name: "TuistCore", dependencies: [ - swiftToolsSupportDependency, + pathDependency, "ProjectDescription", "TuistSupport", "XcodeGraph", @@ -64,7 +67,7 @@ var targets: [Target] = [ "TuistCore", "TuistSupportTesting", "XcodeGraphTesting", - swiftToolsSupportDependency, + pathDependency, ], linkerSettings: [.linkedFramework("XCTest")] ), @@ -72,7 +75,7 @@ var targets: [Target] = [ name: "TuistKit", dependencies: [ "XcodeProj", - swiftToolsSupportDependency, + pathDependency, argumentParserDependency, "TuistSupport", "TuistGenerator", @@ -101,6 +104,7 @@ var targets: [Target] = [ "TuistKit", "ProjectDescription", "ProjectAutomation", + swiftToolsSupportDependency, ] ), .target( @@ -113,7 +117,7 @@ var targets: [Target] = [ .target( name: "TuistSupport", dependencies: [ - swiftToolsSupportDependency, + pathDependency, loggingDependency, "KeychainAccess", "ZIPFoundation", @@ -129,7 +133,7 @@ var targets: [Target] = [ dependencies: [ "TuistSupport", "XcodeGraph", - swiftToolsSupportDependency, + pathDependency, "Difference", ], linkerSettings: [.linkedFramework("XCTest")] @@ -142,7 +146,7 @@ var targets: [Target] = [ "TuistSupport", "TuistSupportTesting", "XcodeProj", - swiftToolsSupportDependency, + pathDependency, ], linkerSettings: [.linkedFramework("XCTest")] ), @@ -150,7 +154,7 @@ var targets: [Target] = [ name: "TuistGenerator", dependencies: [ "XcodeProj", - swiftToolsSupportDependency, + pathDependency, "TuistCore", "XcodeGraph", "TuistSupport", @@ -167,14 +171,14 @@ var targets: [Target] = [ name: "TuistGeneratorTesting", dependencies: [ "TuistGenerator", - swiftToolsSupportDependency, + pathDependency, ], linkerSettings: [.linkedFramework("XCTest")] ), .target( name: "TuistScaffold", dependencies: [ - swiftToolsSupportDependency, + pathDependency, "TuistCore", "XcodeGraph", "TuistSupport", @@ -190,7 +194,7 @@ var targets: [Target] = [ name: "TuistAutomation", dependencies: [ "XcodeProj", - swiftToolsSupportDependency, + pathDependency, .product(name: "XcbeautifyLib", package: "xcbeautify"), "TuistCore", "XcodeGraph", @@ -210,7 +214,7 @@ var targets: [Target] = [ "TuistSupport", "TuistPlugin", "Mockable", - swiftToolsSupportDependency, + pathDependency, ], swiftSettings: [ .define("MOCKING", .when(configuration: .debug)), @@ -224,7 +228,7 @@ var targets: [Target] = [ "TuistSupport", "XcodeProj", "Mockable", - swiftToolsSupportDependency, + pathDependency, ], swiftSettings: [ .define("MOCKING", .when(configuration: .debug)), @@ -238,7 +242,7 @@ var targets: [Target] = [ "TuistSupport", "XcodeProj", "Mockable", - swiftToolsSupportDependency, + pathDependency, "Queuer", ], swiftSettings: [ @@ -249,7 +253,7 @@ var targets: [Target] = [ name: "TuistLoader", dependencies: [ "XcodeProj", - swiftToolsSupportDependency, + pathDependency, "TuistCore", "XcodeGraph", "TuistSupport", @@ -264,7 +268,7 @@ var targets: [Target] = [ name: "TuistLoaderTesting", dependencies: [ "TuistLoader", - swiftToolsSupportDependency, + pathDependency, "TuistCore", "XcodeGraphTesting", "ProjectDescription", @@ -281,7 +285,7 @@ var targets: [Target] = [ "XcodeGraph", "TuistLoader", "Mockable", - swiftToolsSupportDependency, + pathDependency, ], swiftSettings: [ .define("MOCKING", .when(configuration: .debug)), @@ -295,7 +299,7 @@ var targets: [Target] = [ "TuistSupport", "TuistScaffold", "Mockable", - swiftToolsSupportDependency, + pathDependency, ], swiftSettings: [ .define("MOCKING", .when(configuration: .debug)), @@ -306,7 +310,7 @@ var targets: [Target] = [ dependencies: [ "TuistCore", "TuistSupport", - swiftToolsSupportDependency, + pathDependency, .product(name: "OpenAPIRuntime", package: "swift-openapi-runtime"), .product(name: "OpenAPIURLSession", package: "swift-openapi-urlsession"), ], @@ -442,6 +446,7 @@ let package = Package( .package(url: "https://github.com/Kolos65/Mockable.git", from: "0.0.2"), .package(url: "https://github.com/tuist/swift-openapi-runtime", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/swift-openapi-urlsession", branch: "swift-tools-version"), + .package(url: "https://github.com/tuist/Path", .upToNextMajor(from: "0.3.0")), ], targets: targets ) diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase+Extra.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase+Extra.swift index a96095d0e32..0ce81363f90 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase+Extra.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase+Extra.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistSupport import XcodeProj import XCTest diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift index 9aee901ecb8..b7f60a3c32e 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift @@ -1,5 +1,5 @@ // swiftlint:disable force_try -import TSCBasic +import Path import TuistCore @_exported import TuistKit import XcodeGraph diff --git a/Sources/TuistAnalytics/TuistAnalytics.swift b/Sources/TuistAnalytics/TuistAnalytics.swift index aa06b3c173a..968a5273215 100644 --- a/Sources/TuistAnalytics/TuistAnalytics.swift +++ b/Sources/TuistAnalytics/TuistAnalytics.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistAsyncQueue import TuistLoader import XcodeGraph diff --git a/Sources/TuistAsyncQueue/AsyncQueuePersistor.swift b/Sources/TuistAsyncQueue/AsyncQueuePersistor.swift index 056fe00dd77..ead9a03ea6e 100644 --- a/Sources/TuistAsyncQueue/AsyncQueuePersistor.swift +++ b/Sources/TuistAsyncQueue/AsyncQueuePersistor.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport diff --git a/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift b/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift index 533abb47092..a62b7acef40 100644 --- a/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift +++ b/Sources/TuistAutomation/ProjectMappers/SkipUITestsProjectMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph diff --git a/Sources/TuistAutomation/ProjectMappers/SourceRootPathProjectMapper.swift b/Sources/TuistAutomation/ProjectMappers/SourceRootPathProjectMapper.swift index e9a3f30061e..0dd41a88f4b 100644 --- a/Sources/TuistAutomation/ProjectMappers/SourceRootPathProjectMapper.swift +++ b/Sources/TuistAutomation/ProjectMappers/SourceRootPathProjectMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph diff --git a/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift b/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift index 3a6d55ac7d2..3a9b95af270 100644 --- a/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift +++ b/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistAutomation/Utilities/TargetBuilder.swift b/Sources/TuistAutomation/Utilities/TargetBuilder.swift index b37070f932c..7e8348fea24 100644 --- a/Sources/TuistAutomation/Utilities/TargetBuilder.swift +++ b/Sources/TuistAutomation/Utilities/TargetBuilder.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TSCUtility import TuistCore import TuistSupport diff --git a/Sources/TuistAutomation/Utilities/TargetRunner.swift b/Sources/TuistAutomation/Utilities/TargetRunner.swift index a0f127a2eb0..f0c82ad2308 100644 --- a/Sources/TuistAutomation/Utilities/TargetRunner.swift +++ b/Sources/TuistAutomation/Utilities/TargetRunner.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import struct TSCUtility.Version import TuistCore import TuistSupport diff --git a/Sources/TuistAutomation/Utilities/XcodeBuildDestination+Find.swift b/Sources/TuistAutomation/Utilities/XcodeBuildDestination+Find.swift index 376959ee92c..fd4514f0e24 100644 --- a/Sources/TuistAutomation/Utilities/XcodeBuildDestination+Find.swift +++ b/Sources/TuistAutomation/Utilities/XcodeBuildDestination+Find.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TSCUtility import TuistCore import TuistSupport diff --git a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift index 741cfc9c844..a89a21385ab 100644 --- a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift +++ b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport diff --git a/Sources/TuistAutomationTesting/Utilities/MockBuildGraphInspector.swift b/Sources/TuistAutomationTesting/Utilities/MockBuildGraphInspector.swift index e6ea4c42bf1..d93db664fe5 100644 --- a/Sources/TuistAutomationTesting/Utilities/MockBuildGraphInspector.swift +++ b/Sources/TuistAutomationTesting/Utilities/MockBuildGraphInspector.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import XcodeGraph diff --git a/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift b/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift index 1a9f4962b1c..4bab2a0bd38 100644 --- a/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift +++ b/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TSCUtility import TuistAutomation import TuistCore diff --git a/Sources/TuistAutomationTesting/Utilities/MockTargetRunner.swift b/Sources/TuistAutomationTesting/Utilities/MockTargetRunner.swift index 1c71ae478a3..f8c750db285 100644 --- a/Sources/TuistAutomationTesting/Utilities/MockTargetRunner.swift +++ b/Sources/TuistAutomationTesting/Utilities/MockTargetRunner.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import struct TSCUtility.Version import TuistAutomation import XcodeGraph diff --git a/Sources/TuistCore/Analytics/CommandEvent.swift b/Sources/TuistCore/Analytics/CommandEvent.swift index 27fd82d2563..907751240b7 100644 --- a/Sources/TuistCore/Analytics/CommandEvent.swift +++ b/Sources/TuistCore/Analytics/CommandEvent.swift @@ -1,6 +1,6 @@ import AnyCodable import Foundation -import TSCBasic +import Path /// A `CommandEvent` is the analytics event to track the execution of a Tuist command public struct CommandEvent: Codable, Equatable, AsyncQueueEvent { diff --git a/Sources/TuistCore/Automation/XcodeBuildArgument.swift b/Sources/TuistCore/Automation/XcodeBuildArgument.swift index c360e4de78a..e4514b0daa1 100644 --- a/Sources/TuistCore/Automation/XcodeBuildArgument.swift +++ b/Sources/TuistCore/Automation/XcodeBuildArgument.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// It represents arguments that can be passed to the xcodebuild command. public enum XcodeBuildArgument: Equatable, CustomStringConvertible { diff --git a/Sources/TuistCore/Automation/XcodeBuildControlling.swift b/Sources/TuistCore/Automation/XcodeBuildControlling.swift index f6319eea082..8a8d41ff99e 100644 --- a/Sources/TuistCore/Automation/XcodeBuildControlling.swift +++ b/Sources/TuistCore/Automation/XcodeBuildControlling.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport public enum XcodeBuildDestination: Equatable { diff --git a/Sources/TuistCore/Automation/XcodeBuildSettings.swift b/Sources/TuistCore/Automation/XcodeBuildSettings.swift index fecf8c62fba..ebfee4426e2 100644 --- a/Sources/TuistCore/Automation/XcodeBuildSettings.swift +++ b/Sources/TuistCore/Automation/XcodeBuildSettings.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public struct XcodeBuildSettings { public typealias DictionaryType = [String: String] diff --git a/Sources/TuistCore/Automation/XcodeBuildTarget.swift b/Sources/TuistCore/Automation/XcodeBuildTarget.swift index fd0e2b39db9..5a02d7dede6 100644 --- a/Sources/TuistCore/Automation/XcodeBuildTarget.swift +++ b/Sources/TuistCore/Automation/XcodeBuildTarget.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public enum XcodeBuildTarget: Equatable { /// The target is an Xcode project. diff --git a/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift b/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift index 40451b204f2..e46d25702e6 100644 --- a/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift +++ b/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift @@ -1,6 +1,6 @@ import Foundation import Mockable -import TSCBasic +import Path import TuistSupport import XcodeGraph @@ -36,7 +36,7 @@ public final class CacheDirectoriesProvider: CacheDirectoriesProviding { return cacheDirectory.appending(components: ["tuist", category.directoryName]) } - public func cacheDirectory() throws -> TSCBasic.AbsolutePath { + public func cacheDirectory() throws -> Path.AbsolutePath { if let xdgCacheHome = ProcessInfo.processInfo.environment["XDG_CACHE_HOME"] { return try AbsolutePath(validating: xdgCacheHome) } else { diff --git a/Sources/TuistCore/Cache/FileContentHashing.swift b/Sources/TuistCore/Cache/FileContentHashing.swift index 8795493f48a..ca68fab0468 100644 --- a/Sources/TuistCore/Cache/FileContentHashing.swift +++ b/Sources/TuistCore/Cache/FileContentHashing.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public protocol FileContentHashing { func hash(path: AbsolutePath) throws -> String diff --git a/Sources/TuistCore/ContentHashing/ContentHasher.swift b/Sources/TuistCore/ContentHashing/ContentHasher.swift index aec292ccf45..004060d17e9 100644 --- a/Sources/TuistCore/ContentHashing/ContentHasher.swift +++ b/Sources/TuistCore/ContentHashing/ContentHasher.swift @@ -1,6 +1,6 @@ import CryptoKit import Foundation -import TSCBasic +import Path import TuistSupport /// `ContentHasher` diff --git a/Sources/TuistCore/ContentHashing/ContentHashingError.swift b/Sources/TuistCore/ContentHashing/ContentHashingError.swift index bc0779bbcf0..ee095188b9c 100644 --- a/Sources/TuistCore/ContentHashing/ContentHashingError.swift +++ b/Sources/TuistCore/ContentHashing/ContentHashingError.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport /// `ContentHashingError` diff --git a/Sources/TuistCore/ContentHashing/HashingFilesFilter.swift b/Sources/TuistCore/ContentHashing/HashingFilesFilter.swift index c1031e2e576..a71d9e858bb 100644 --- a/Sources/TuistCore/ContentHashing/HashingFilesFilter.swift +++ b/Sources/TuistCore/ContentHashing/HashingFilesFilter.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path class HashingFilesFilter { /// an array of filters, which should return if a path should be included in hashing calculations or not. diff --git a/Sources/TuistCore/Descriptors/DirectoryDescriptor.swift b/Sources/TuistCore/Descriptors/DirectoryDescriptor.swift index ce831ab73e2..794c7c6ea24 100644 --- a/Sources/TuistCore/Descriptors/DirectoryDescriptor.swift +++ b/Sources/TuistCore/Descriptors/DirectoryDescriptor.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// Directory Descriptor /// diff --git a/Sources/TuistCore/Descriptors/FileDescriptor.swift b/Sources/TuistCore/Descriptors/FileDescriptor.swift index 5aab4563677..37cfac0fd1d 100644 --- a/Sources/TuistCore/Descriptors/FileDescriptor.swift +++ b/Sources/TuistCore/Descriptors/FileDescriptor.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// File Descriptor /// diff --git a/Sources/TuistCore/Descriptors/SideEffectDescriptor.swift b/Sources/TuistCore/Descriptors/SideEffectDescriptor.swift index d7a42f30883..45e2e82f171 100644 --- a/Sources/TuistCore/Descriptors/SideEffectDescriptor.swift +++ b/Sources/TuistCore/Descriptors/SideEffectDescriptor.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// Side Effect Descriptor /// diff --git a/Sources/TuistCore/Graph/CircularDependencyLinter.swift b/Sources/TuistCore/Graph/CircularDependencyLinter.swift index fb6e564c727..9f4bf94b366 100644 --- a/Sources/TuistCore/Graph/CircularDependencyLinter.swift +++ b/Sources/TuistCore/Graph/CircularDependencyLinter.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph // MARK: - CircularDependencyLinting diff --git a/Sources/TuistCore/Graph/GraphCircularDetector.swift b/Sources/TuistCore/Graph/GraphCircularDetector.swift index 96adb1037b9..1694589fe0d 100644 --- a/Sources/TuistCore/Graph/GraphCircularDetector.swift +++ b/Sources/TuistCore/Graph/GraphCircularDetector.swift @@ -1,8 +1,9 @@ import Foundation +import Path import TSCBasic struct GraphCircularDetectorNode: Hashable { - let path: AbsolutePath + let path: Path.AbsolutePath let name: String } diff --git a/Sources/TuistCore/Graph/GraphDependencyReference.swift b/Sources/TuistCore/Graph/GraphDependencyReference.swift index 6a6f6885fb3..f6794d1afdd 100644 --- a/Sources/TuistCore/Graph/GraphDependencyReference.swift +++ b/Sources/TuistCore/Graph/GraphDependencyReference.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph public enum GraphDependencyReference: Equatable, Comparable, Hashable { diff --git a/Sources/TuistCore/Graph/GraphLoader.swift b/Sources/TuistCore/Graph/GraphLoader.swift index 4a53b647f6b..3c1ce02b6b8 100644 --- a/Sources/TuistCore/Graph/GraphLoader.swift +++ b/Sources/TuistCore/Graph/GraphLoader.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph // MARK: - GraphLoading diff --git a/Sources/TuistCore/Graph/GraphLoadingError.swift b/Sources/TuistCore/Graph/GraphLoadingError.swift index 272912d0d5b..016261b63fd 100644 --- a/Sources/TuistCore/Graph/GraphLoadingError.swift +++ b/Sources/TuistCore/Graph/GraphLoadingError.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport enum GraphLoadingError: FatalError, Equatable { diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index 9bb7802afe6..3af1f870f61 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -1,4 +1,5 @@ import Foundation +import Path import TSCBasic import TuistSupport import XcodeGraph @@ -7,14 +8,14 @@ import XcodeGraph public class GraphTraverser: GraphTraversing { public var name: String { graph.name } public var hasPackages: Bool { !graph.packages.flatMap(\.value).isEmpty } - public var path: AbsolutePath { graph.path } + public var path: Path.AbsolutePath { graph.path } public var workspace: Workspace { graph.workspace } - public var projects: [AbsolutePath: Project] { graph.projects } + public var projects: [Path.AbsolutePath: Project] { graph.projects } /// It returns the targets of the graph projects. /// - Returns: A dictionary where the key is the path to the project, and the value are a dictionary where /// the keys are the name of the targets, and the value the target representation. - public func targets() -> [AbsolutePath: [String: Target]] { + public func targets() -> [Path.AbsolutePath: [String: Target]] { return projects.mapValues { $0.targets } } @@ -74,12 +75,12 @@ public class GraphTraverser: GraphTraversing { projects.values.flatMap(\.schemes) + graph.workspace.schemes } - public func precompiledFrameworksPaths() -> Set { + public func precompiledFrameworksPaths() -> Set { let dependencies = graph.dependencies.reduce(into: Set()) { acc, next in acc.formUnion([next.key]) acc.formUnion(next.value) } - return Set(dependencies.compactMap { dependency -> AbsolutePath? in + return Set(dependencies.compactMap { dependency -> Path.AbsolutePath? in guard case let GraphDependency.framework(path, _, _, _, _, _, _) = dependency else { return nil } return path }) @@ -97,13 +98,13 @@ public class GraphTraverser: GraphTraversing { return filteredTargets } - public func target(path: AbsolutePath, name: String) -> GraphTarget? { + public func target(path: Path.AbsolutePath, name: String) -> GraphTarget? { guard let project = graph.projects[path], let target = project.targets[name] else { return nil } return GraphTarget(path: path, target: target, project: project) } - public func targets(at path: AbsolutePath) -> Set { + public func targets(at path: Path.AbsolutePath) -> Set { guard let project = graph.projects[path] else { return Set() } return Set(project.targets.values.map { GraphTarget(path: path, target: $0, project: project) }) } @@ -112,7 +113,7 @@ public class GraphTraverser: GraphTraversing { allTestPlans().first { $0.name == name } } - public func allTargetDependencies(path: AbsolutePath, name: String) -> Set { + public func allTargetDependencies(path: Path.AbsolutePath, name: String) -> Set { guard let target = target(path: path, name: name) else { return [] } return transitiveClosure([target]) { target in Array( @@ -124,7 +125,7 @@ public class GraphTraverser: GraphTraversing { } } - public func directTargetDependencies(path: AbsolutePath, name: String) -> Set { + public func directTargetDependencies(path: Path.AbsolutePath, name: String) -> Set { let target = GraphDependency.target(name: name, path: path) guard let dependencies = graph.dependencies[target] else { return [] } @@ -135,7 +136,7 @@ public class GraphTraverser: GraphTraversing { return Set(convertToGraphTargetReferences(targetDependencies, for: target)) } - public func directLocalTargetDependencies(path: AbsolutePath, name: String) -> Set { + public func directLocalTargetDependencies(path: Path.AbsolutePath, name: String) -> Set { let target = GraphDependency.target(name: name, path: path) guard let dependencies = graph.dependencies[target], graph.projects[path] != nil @@ -149,7 +150,7 @@ public class GraphTraverser: GraphTraversing { } func convertToGraphTargetReferences( - _ dependencies: [(name: String, path: AbsolutePath)], + _ dependencies: [(name: String, path: Path.AbsolutePath)], for target: GraphDependency ) -> [GraphTargetReference] { dependencies.compactMap { dependencyName, dependencyPath -> GraphTargetReference? in @@ -165,7 +166,7 @@ public class GraphTraverser: GraphTraversing { } } - public func resourceBundleDependencies(path: AbsolutePath, name: String) -> Set { + public func resourceBundleDependencies(path: Path.AbsolutePath, name: String) -> Set { guard let target = graph.projects[path]?.targets[name] else { return [] } guard target.supportsResources else { return [] } @@ -191,7 +192,7 @@ public class GraphTraverser: GraphTraversing { return GraphTarget(path: path, target: target, project: project) } - public func appExtensionDependencies(path: AbsolutePath, name: String) -> Set { + public func appExtensionDependencies(path: Path.AbsolutePath, name: String) -> Set { let validProducts: [Product] = [ .appExtension, .stickerPackExtension, .watch2Extension, .tvTopShelfExtension, .messagesExtension, ] @@ -201,7 +202,7 @@ public class GraphTraverser: GraphTraversing { ) } - public func extensionKitExtensionDependencies(path: TSCBasic.AbsolutePath, name: String) -> Set { + public func extensionKitExtensionDependencies(path: Path.AbsolutePath, name: String) -> Set { let validProducts: [Product] = [ .extensionKitExtension, ] @@ -211,12 +212,12 @@ public class GraphTraverser: GraphTraversing { ) } - public func appClipDependencies(path: AbsolutePath, name: String) -> GraphTargetReference? { + public func appClipDependencies(path: Path.AbsolutePath, name: String) -> GraphTargetReference? { directLocalTargetDependencies(path: path, name: name) .first { $0.target.product == .appClip } } - public func buildsForMacCatalyst(path: AbsolutePath, name: String) -> Bool { + public func buildsForMacCatalyst(path: Path.AbsolutePath, name: String) -> Bool { guard target(path: path, name: name)?.target.supportsCatalyst ?? false else { return false } @@ -232,7 +233,7 @@ public class GraphTraverser: GraphTraversing { } // Filter based on edges - public func directStaticDependencies(path: AbsolutePath, name: String) -> Set { + public func directStaticDependencies(path: Path.AbsolutePath, name: String) -> Set { Set( graph.dependencies[.target(name: name, path: path)]? .compactMap { (dependency: GraphDependency) -> GraphDependencyReference? in @@ -252,7 +253,7 @@ public class GraphTraverser: GraphTraversing { ) } - public func embeddableFrameworks(path: AbsolutePath, name: String) -> Set { + public func embeddableFrameworks(path: Path.AbsolutePath, name: String) -> Set { guard let target = target(path: path, name: name), canEmbedProducts(target: target.target) else { return Set() } var references: Set = Set([]) @@ -301,18 +302,18 @@ public class GraphTraverser: GraphTraversing { return references } - public func searchablePathDependencies(path: AbsolutePath, name: String) throws -> Set { + public func searchablePathDependencies(path: Path.AbsolutePath, name: String) throws -> Set { try linkableDependencies(path: path, name: name, shouldExcludeHostAppDependencies: false) .union(staticPrecompiledFrameworksDependencies(path: path, name: name)) } - public func linkableDependencies(path: AbsolutePath, name: String) throws -> Set { + public func linkableDependencies(path: Path.AbsolutePath, name: String) throws -> Set { try linkableDependencies(path: path, name: name, shouldExcludeHostAppDependencies: true) } // swiftlint:disable:next function_body_length public func linkableDependencies( - path: AbsolutePath, + path: Path.AbsolutePath, name: String, shouldExcludeHostAppDependencies: Bool ) throws -> Set { @@ -429,7 +430,7 @@ public class GraphTraverser: GraphTraversing { return references } - public func copyProductDependencies(path: AbsolutePath, name: String) -> Set { + public func copyProductDependencies(path: Path.AbsolutePath, name: String) -> Set { guard let target = target(path: path, name: name) else { return Set() } var dependencies = Set() @@ -444,7 +445,7 @@ public class GraphTraverser: GraphTraversing { return Set(dependencies) } - public func directSwiftMacroExecutables(path: AbsolutePath, name: String) -> Set { + public func directSwiftMacroExecutables(path: Path.AbsolutePath, name: String) -> Set { let dependencies = directTargetDependencies(path: path, name: name) .filter { $0.target.product == .macro } .map { GraphDependencyReference.product( @@ -456,14 +457,14 @@ public class GraphTraverser: GraphTraversing { return Set(dependencies) } - public func directSwiftMacroTargets(path: AbsolutePath, name: String) -> Set { + public func directSwiftMacroTargets(path: Path.AbsolutePath, name: String) -> Set { let dependencies = directTargetDependencies(path: path, name: name) .filter { [.staticFramework, .framework, .dynamicLibrary, .staticLibrary].contains($0.target.product) } .filter { self.directSwiftMacroExecutables(path: $0.graphTarget.path, name: $0.graphTarget.target.name).count != 0 } return Set(dependencies) } - public func allSwiftMacroTargets(path: AbsolutePath, name: String) -> Set { + public func allSwiftMacroTargets(path: Path.AbsolutePath, name: String) -> Set { var dependencies = allTargetDependencies(path: path, name: name) .filter { [.staticFramework, .framework, .dynamicLibrary, .staticLibrary].contains($0.target.product) } .filter { self.directSwiftMacroExecutables(path: $0.path, name: $0.target.name).count != 0 } @@ -475,25 +476,25 @@ public class GraphTraverser: GraphTraversing { return Set(dependencies) } - public func librariesPublicHeadersFolders(path: AbsolutePath, name: String) -> Set { + public func librariesPublicHeadersFolders(path: Path.AbsolutePath, name: String) -> Set { let dependencies = graph.dependencies[.target(name: name, path: path), default: []] - let libraryPublicHeaders = dependencies.compactMap { dependency -> AbsolutePath? in + let libraryPublicHeaders = dependencies.compactMap { dependency -> Path.AbsolutePath? in guard case let GraphDependency.library(_, publicHeaders, _, _, _) = dependency else { return nil } return publicHeaders } return Set(libraryPublicHeaders) } - public func librariesSearchPaths(path: AbsolutePath, name: String) throws -> Set { + public func librariesSearchPaths(path: Path.AbsolutePath, name: String) throws -> Set { let directDependencies = graph.dependencies[.target(name: name, path: path), default: []] - let directDependenciesLibraryPaths = directDependencies.compactMap { dependency -> AbsolutePath? in + let directDependenciesLibraryPaths = directDependencies.compactMap { dependency -> Path.AbsolutePath? in guard case let GraphDependency.library(path, _, _, _, _) = dependency else { return nil } return path } // In addition to any directly linked libraries, search paths for any transitivley linked libraries // are also needed. - let linkedLibraryPaths: [AbsolutePath] = try linkableDependencies( + let linkedLibraryPaths: [Path.AbsolutePath] = try linkableDependencies( path: path, name: name, shouldExcludeHostAppDependencies: false @@ -509,16 +510,16 @@ public class GraphTraverser: GraphTraversing { return Set((directDependenciesLibraryPaths + linkedLibraryPaths).compactMap { $0.removingLastComponent() }) } - public func librariesSwiftIncludePaths(path: AbsolutePath, name: String) -> Set { + public func librariesSwiftIncludePaths(path: Path.AbsolutePath, name: String) -> Set { let dependencies = graph.dependencies[.target(name: name, path: path), default: []] - let librarySwiftModuleMapPaths = dependencies.compactMap { dependency -> AbsolutePath? in + let librarySwiftModuleMapPaths = dependencies.compactMap { dependency -> Path.AbsolutePath? in guard case let GraphDependency.library(_, _, _, _, swiftModuleMapPath) = dependency else { return nil } return swiftModuleMapPath } return Set(librarySwiftModuleMapPaths.compactMap { $0.removingLastComponent() }) } - public func runPathSearchPaths(path: AbsolutePath, name: String) -> Set { + public func runPathSearchPaths(path: Path.AbsolutePath, name: String) -> Set { guard let target = target(path: path, name: name), canEmbedProducts(target: target.target), target.target.product == .unitTests, @@ -527,7 +528,7 @@ public class GraphTraverser: GraphTraversing { return Set() } - var references: Set = Set([]) + var references: Set = Set([]) let from = GraphDependency.target(name: name, path: path) let precompiledFrameworksPaths = filterDependencies( @@ -536,7 +537,7 @@ public class GraphTraverser: GraphTraversing { skip: canDependencyEmbedProducts ) .lazy - .compactMap { (dependency: GraphDependency) -> AbsolutePath? in + .compactMap { (dependency: GraphDependency) -> Path.AbsolutePath? in switch dependency { case let .xcframework(xcframework): return xcframework.path case let .framework(path, _, _, _, _, _, _): return path @@ -554,7 +555,7 @@ public class GraphTraverser: GraphTraversing { return references } - public func hostTargetFor(path: AbsolutePath, name: String) -> GraphTarget? { + public func hostTargetFor(path: Path.AbsolutePath, name: String) -> GraphTarget? { guard let project = graph.projects[path] else { return nil } let targets = project.targets @@ -570,7 +571,7 @@ public class GraphTraverser: GraphTraversing { }.first } - public func allProjectDependencies(path: AbsolutePath) throws -> Set { + public func allProjectDependencies(path: Path.AbsolutePath) throws -> Set { let targets = targets(at: path) if targets.isEmpty { return Set() } var references: Set = Set() @@ -584,11 +585,11 @@ public class GraphTraverser: GraphTraversing { return references } - public func needsEnableTestingSearchPaths(path: AbsolutePath, name: String) -> Bool { + public func needsEnableTestingSearchPaths(path: Path.AbsolutePath, name: String) -> Bool { var cache: [GraphTarget: Bool] = [:] func _needsEnableTestingSearchPaths( - path: AbsolutePath, + path: Path.AbsolutePath, name: String ) -> Bool { // Target could not be created, something must be wrong @@ -640,7 +641,7 @@ public class GraphTraverser: GraphTraversing { return _needsEnableTestingSearchPaths(path: path, name: name) } - public func dependsOnXCTest(path: AbsolutePath, name: String) -> Bool { + public func dependsOnXCTest(path: Path.AbsolutePath, name: String) -> Bool { guard let target = target(path: path, name: name) else { return false } @@ -674,7 +675,7 @@ public class GraphTraverser: GraphTraversing { allInternalTargets().filter { directTargetExternalDependencies(path: $0.path, name: $0.target.name).count != 0 } } - public func directTargetExternalDependencies(path: AbsolutePath, name: String) -> Set { + public func directTargetExternalDependencies(path: Path.AbsolutePath, name: String) -> Set { directTargetDependencies(path: path, name: name).filter(\.graphTarget.project.isExternal) } @@ -709,8 +710,8 @@ public class GraphTraverser: GraphTraversing { } // swiftlint:disable:next function_body_length - public func allSwiftPluginExecutables(path: TSCBasic.AbsolutePath, name: String) -> Set { - func precompiledMacroDependencies(_ graphDependency: GraphDependency) -> Set { + public func allSwiftPluginExecutables(path: Path.AbsolutePath, name: String) -> Set { + func precompiledMacroDependencies(_ graphDependency: GraphDependency) -> Set { Set( dependencies[graphDependency, default: Set()] .lazy @@ -1096,7 +1097,7 @@ public class GraphTraverser: GraphTraversing { } } - func unitTestHost(path: AbsolutePath, name: String) -> GraphTarget? { + func unitTestHost(path: Path.AbsolutePath, name: String) -> GraphTarget? { directLocalTargetDependencies(path: path, name: name) .first(where: { $0.target.product.canHostTests() })?.graphTarget } @@ -1197,7 +1198,7 @@ public class GraphTraverser: GraphTraversing { } private func staticPrecompiledFrameworksDependencies( - path: AbsolutePath, + path: Path.AbsolutePath, name: String ) -> [GraphDependencyReference] { let precompiledStatic = graph.dependencies[.target(name: name, path: path), default: []] @@ -1218,7 +1219,7 @@ public class GraphTraverser: GraphTraversing { } private func staticPrecompiledXCFrameworksDependencies( - path: AbsolutePath, + path: Path.AbsolutePath, name: String ) -> [GraphDependencyReference] { let dependencies = filterDependencies( diff --git a/Sources/TuistCore/Graph/Mappers/GraphMapper.swift b/Sources/TuistCore/Graph/Mappers/GraphMapper.swift index c46b5cbe27b..100b96302de 100644 --- a/Sources/TuistCore/Graph/Mappers/GraphMapper.swift +++ b/Sources/TuistCore/Graph/Mappers/GraphMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph /// A protocol that defines an interface to map dependency graphs. diff --git a/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift index f985f68409b..16d02acd4fb 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/Project+Core.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/TuistCore/Graph/ModelExtensions/Target+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/Target+Core.swift index 6cb1b85776d..a37ed67b64e 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/Target+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/Target+Core.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/TuistCore/Graph/ModelExtensions/TargetScript+Core.swift b/Sources/TuistCore/Graph/ModelExtensions/TargetScript+Core.swift index 08db67134d8..d620a27652f 100644 --- a/Sources/TuistCore/Graph/ModelExtensions/TargetScript+Core.swift +++ b/Sources/TuistCore/Graph/ModelExtensions/TargetScript+Core.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/TuistCore/GraphTraverser/GraphTraversing.swift b/Sources/TuistCore/GraphTraverser/GraphTraversing.swift index a7e1acd49d5..ae904ca902f 100644 --- a/Sources/TuistCore/GraphTraverser/GraphTraversing.swift +++ b/Sources/TuistCore/GraphTraverser/GraphTraversing.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph public protocol GraphTraversing { diff --git a/Sources/TuistCore/MetadataProviders/FrameworkMetadataProvider.swift b/Sources/TuistCore/MetadataProviders/FrameworkMetadataProvider.swift index eebc00de738..baf32027349 100644 --- a/Sources/TuistCore/MetadataProviders/FrameworkMetadataProvider.swift +++ b/Sources/TuistCore/MetadataProviders/FrameworkMetadataProvider.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/TuistCore/MetadataProviders/LibraryMetadataProvider.swift b/Sources/TuistCore/MetadataProviders/LibraryMetadataProvider.swift index ce964081f11..99515fb9d83 100644 --- a/Sources/TuistCore/MetadataProviders/LibraryMetadataProvider.swift +++ b/Sources/TuistCore/MetadataProviders/LibraryMetadataProvider.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/TuistCore/MetadataProviders/PrecompiledMetadataProvider.swift b/Sources/TuistCore/MetadataProviders/PrecompiledMetadataProvider.swift index f3d2bfc97a4..a48ac31b4dd 100644 --- a/Sources/TuistCore/MetadataProviders/PrecompiledMetadataProvider.swift +++ b/Sources/TuistCore/MetadataProviders/PrecompiledMetadataProvider.swift @@ -1,6 +1,6 @@ import Foundation import MachO -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/TuistCore/MetadataProviders/SystemFrameworksMetadataProvider.swift b/Sources/TuistCore/MetadataProviders/SystemFrameworksMetadataProvider.swift index a72fa2b4419..0bb0833f89f 100644 --- a/Sources/TuistCore/MetadataProviders/SystemFrameworksMetadataProvider.swift +++ b/Sources/TuistCore/MetadataProviders/SystemFrameworksMetadataProvider.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/TuistCore/MetadataProviders/XCFrameworkMetadataProvider.swift b/Sources/TuistCore/MetadataProviders/XCFrameworkMetadataProvider.swift index c26c18c63a8..e2836f3fc49 100644 --- a/Sources/TuistCore/MetadataProviders/XCFrameworkMetadataProvider.swift +++ b/Sources/TuistCore/MetadataProviders/XCFrameworkMetadataProvider.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/TuistCore/NodeLoaders/FrameworkLoader.swift b/Sources/TuistCore/NodeLoaders/FrameworkLoader.swift index eb479dd5689..c80356504f7 100644 --- a/Sources/TuistCore/NodeLoaders/FrameworkLoader.swift +++ b/Sources/TuistCore/NodeLoaders/FrameworkLoader.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift b/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift index 8865a4e28bd..1585a9ea374 100644 --- a/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift +++ b/Sources/TuistCore/NodeLoaders/XCFrameworkLoader.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/TuistCore/Simulator/SimulatorController.swift b/Sources/TuistCore/Simulator/SimulatorController.swift index c109e1a91f4..41904726750 100644 --- a/Sources/TuistCore/Simulator/SimulatorController.swift +++ b/Sources/TuistCore/Simulator/SimulatorController.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import struct TSCUtility.Version import TuistSupport import XcodeGraph diff --git a/Sources/TuistCore/Simulator/SimulatorDevice.swift b/Sources/TuistCore/Simulator/SimulatorDevice.swift index eb76245a558..dcdcf611572 100644 --- a/Sources/TuistCore/Simulator/SimulatorDevice.swift +++ b/Sources/TuistCore/Simulator/SimulatorDevice.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// It represents a simulator device. Devices are obtained using Xcode's CLI simctl public struct SimulatorDevice: Decodable, Hashable, CustomStringConvertible { diff --git a/Sources/TuistCore/Simulator/SimulatorRuntime.swift b/Sources/TuistCore/Simulator/SimulatorRuntime.swift index c4f94ef603d..a4e615282c6 100644 --- a/Sources/TuistCore/Simulator/SimulatorRuntime.swift +++ b/Sources/TuistCore/Simulator/SimulatorRuntime.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// It represents a runtime that is available in the system. The list of available runtimes is obtained /// using Xcode's simctl cli tool. diff --git a/Sources/TuistCore/Utils/RootDirectoryLocator.swift b/Sources/TuistCore/Utils/RootDirectoryLocator.swift index 72c3ea9735e..fd35a427e59 100644 --- a/Sources/TuistCore/Utils/RootDirectoryLocator.swift +++ b/Sources/TuistCore/Utils/RootDirectoryLocator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport public protocol RootDirectoryLocating { diff --git a/Sources/TuistCore/Utils/XcodeProjectBuildDirectoryLocator.swift b/Sources/TuistCore/Utils/XcodeProjectBuildDirectoryLocator.swift index 683838ff796..d69904e111e 100644 --- a/Sources/TuistCore/Utils/XcodeProjectBuildDirectoryLocator.swift +++ b/Sources/TuistCore/Utils/XcodeProjectBuildDirectoryLocator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift b/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift index d99c718a3ee..7b010da409f 100644 --- a/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift +++ b/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport @testable import TuistSupportTesting diff --git a/Sources/TuistCoreTesting/Cache/MockContentHasher.swift b/Sources/TuistCoreTesting/Cache/MockContentHasher.swift index 42d59844e7d..9615eb3e827 100644 --- a/Sources/TuistCoreTesting/Cache/MockContentHasher.swift +++ b/Sources/TuistCoreTesting/Cache/MockContentHasher.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore public final class MockContentHasher: ContentHashing { diff --git a/Sources/TuistCoreTesting/Extensions/TuistTestCase+LintingIssue.swift b/Sources/TuistCoreTesting/Extensions/TuistTestCase+LintingIssue.swift index e2977740f04..e2ba2195e99 100644 --- a/Sources/TuistCoreTesting/Extensions/TuistTestCase+LintingIssue.swift +++ b/Sources/TuistCoreTesting/Extensions/TuistTestCase+LintingIssue.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupportTesting import XCTest diff --git a/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift b/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift index e5891ac26d7..e05b573528e 100644 --- a/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift +++ b/Sources/TuistCoreTesting/Graph/DependenciesGraph+TestData.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import TuistSupportTesting diff --git a/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift b/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift index bd200129508..e07b61e7249 100644 --- a/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift +++ b/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistCoreTesting/Graph/MockGraphLoader.swift b/Sources/TuistCoreTesting/Graph/MockGraphLoader.swift index def47363f25..5d4a789972c 100644 --- a/Sources/TuistCoreTesting/Graph/MockGraphLoader.swift +++ b/Sources/TuistCoreTesting/Graph/MockGraphLoader.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph @testable import XcodeGraphTesting diff --git a/Sources/TuistCoreTesting/Graph/WorkspaceWithProjects+TestData.swift b/Sources/TuistCoreTesting/Graph/WorkspaceWithProjects+TestData.swift index 8639a3f00fe..129ca0aeeb0 100644 --- a/Sources/TuistCoreTesting/Graph/WorkspaceWithProjects+TestData.swift +++ b/Sources/TuistCoreTesting/Graph/WorkspaceWithProjects+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph import XcodeGraphTesting @testable import TuistCore diff --git a/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift b/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift index 9f5164d67f6..4d2573dafc3 100644 --- a/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift +++ b/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph @testable import TuistCore @@ -68,7 +68,7 @@ final class MockGraphTraverser: GraphTraversing { var invokedTargets = false var invokedTargetsCount = 0 var stubbedTargets: [AbsolutePath: [String: Target]]! = [:] - func targets() -> [TSCBasic.AbsolutePath: [String: XcodeGraph.Target]] { + func targets() -> [Path.AbsolutePath: [String: XcodeGraph.Target]] { invokedTargets = true invokedTargetsCount += 1 return stubbedTargets @@ -198,7 +198,7 @@ final class MockGraphTraverser: GraphTraversing { var invokedBuildsForMacCatalystParametersList = [(path: AbsolutePath, name: String)]() var stubbedBuildsForMacCatalystResult: Bool! - func buildsForMacCatalyst(path: TSCBasic.AbsolutePath, name: String) -> Bool { + func buildsForMacCatalyst(path: Path.AbsolutePath, name: String) -> Bool { invokedBuildsForMacCatalyst = true invokedBuildsForMacCatalystCount += 1 invokedBuildsForMacCatalystParameters = (path, name) @@ -241,7 +241,7 @@ final class MockGraphTraverser: GraphTraversing { name: String )? var invokedAllTargetDependenciesResult: Set = [] - func allTargetDependencies(path: TSCBasic.AbsolutePath, name: String) -> Set { + func allTargetDependencies(path: Path.AbsolutePath, name: String) -> Set { invokedAllTargetDependencies = true invokedAllTargetDependenciesCount += 1 invokedAllTargetDependenciesParameters = (path, name) @@ -565,7 +565,7 @@ final class MockGraphTraverser: GraphTraversing { [(path: AbsolutePath, name: String)]() var stubbedExtensionKitExtensionDependenciesResult: Set! = [] - func extensionKitExtensionDependencies(path: TSCBasic.AbsolutePath, name: String) -> Set { + func extensionKitExtensionDependencies(path: Path.AbsolutePath, name: String) -> Set { invokedExtensionKitExtensionDependencies = true invokedExtensionKitExtensionDependenciesCount += 1 invokedExtensionKitExtensionDependenciesParameters = (path, name) @@ -582,7 +582,7 @@ final class MockGraphTraverser: GraphTraversing { [(path: AbsolutePath, name: String)]() var stubbedExtensionKitExtensionDependenciesWithConditionsResult: [(GraphTarget, PlatformCondition?)]! = [] - func extensionKitExtensionDependenciesWithConditions(path: TSCBasic.AbsolutePath, name: String) -> [( + func extensionKitExtensionDependenciesWithConditions(path: Path.AbsolutePath, name: String) -> [( XcodeGraph.GraphTarget, XcodeGraph.PlatformCondition? )] { @@ -600,7 +600,7 @@ final class MockGraphTraverser: GraphTraversing { [(path: AbsolutePath, name: String)]() var stubbedDirectSwiftMacroExecutablesResult: Set! = [] - func directSwiftMacroExecutables(path: TSCBasic.AbsolutePath, name: String) -> Set { + func directSwiftMacroExecutables(path: Path.AbsolutePath, name: String) -> Set { invokedDirectSwiftMacroExecutables = true invokedDirectSwiftMacroExecutablesCount += 1 invokedDirectSwiftMacroExecutablesParameters = (path, name) @@ -614,7 +614,7 @@ final class MockGraphTraverser: GraphTraversing { var invokedDirectSwiftMacroTargetsParametersList = [(path: AbsolutePath, name: String)]() var stubbedDirectSwiftMacroTargetsResult: Set! = [] - func directSwiftMacroTargets(path: TSCBasic.AbsolutePath, name: String) -> Set { + func directSwiftMacroTargets(path: Path.AbsolutePath, name: String) -> Set { invokedDirectSwiftMacroTargets = true invokedDirectSwiftMacroTargetsCount += 1 invokedDirectSwiftMacroTargetsParameters = (path, name) @@ -628,7 +628,7 @@ final class MockGraphTraverser: GraphTraversing { var invokedAllSwiftMacroTargetsParametersList = [(path: AbsolutePath, name: String)]() var stubbedAllSwiftMacroTargetsResult: Set! = [] - func allSwiftMacroTargets(path: TSCBasic.AbsolutePath, name: String) -> Set { + func allSwiftMacroTargets(path: Path.AbsolutePath, name: String) -> Set { invokedAllSwiftMacroTargets = true invokedAllSwiftMacroTargetsCount += 1 invokedAllSwiftMacroTargetsParameters = (path, name) @@ -692,7 +692,7 @@ final class MockGraphTraverser: GraphTraversing { var invokedAllSwiftPluginExecutablesParametersList = [(path: AbsolutePath, name: String)]() var stubbedAllSwiftPluginExecutablesResult: Set! = [] - func allSwiftPluginExecutables(path: TSCBasic.AbsolutePath, name: String) -> Set { + func allSwiftPluginExecutables(path: Path.AbsolutePath, name: String) -> Set { invokedAllSwiftPluginExecutables = true invokedAllSwiftPluginExecutablesCount += 1 invokedAllSwiftPluginExecutablesParameters = (path, name) diff --git a/Sources/TuistCoreTesting/Mappers/MockProjectMapper.swift b/Sources/TuistCoreTesting/Mappers/MockProjectMapper.swift index f34d1a92194..d1a58618f33 100644 --- a/Sources/TuistCoreTesting/Mappers/MockProjectMapper.swift +++ b/Sources/TuistCoreTesting/Mappers/MockProjectMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph @testable import TuistCore diff --git a/Sources/TuistCoreTesting/Mappers/MockWorkspaceMapper.swift b/Sources/TuistCoreTesting/Mappers/MockWorkspaceMapper.swift index 3f45a3a7a7b..9a1e3859901 100644 --- a/Sources/TuistCoreTesting/Mappers/MockWorkspaceMapper.swift +++ b/Sources/TuistCoreTesting/Mappers/MockWorkspaceMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph @testable import TuistCore diff --git a/Sources/TuistCoreTesting/MetadataProviders/MockFrameworkMetadataProvider.swift b/Sources/TuistCoreTesting/MetadataProviders/MockFrameworkMetadataProvider.swift index 98e4166dc37..8b100bb4546 100644 --- a/Sources/TuistCoreTesting/MetadataProviders/MockFrameworkMetadataProvider.swift +++ b/Sources/TuistCoreTesting/MetadataProviders/MockFrameworkMetadataProvider.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph @testable import TuistCore diff --git a/Sources/TuistCoreTesting/MetadataProviders/MockLibraryMetadataProvider.swift b/Sources/TuistCoreTesting/MetadataProviders/MockLibraryMetadataProvider.swift index 306cc39d0c0..a8e38b88dd8 100644 --- a/Sources/TuistCoreTesting/MetadataProviders/MockLibraryMetadataProvider.swift +++ b/Sources/TuistCoreTesting/MetadataProviders/MockLibraryMetadataProvider.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph @testable import TuistCore diff --git a/Sources/TuistCoreTesting/MetadataProviders/MockPrecompiledMetadataProvider.swift b/Sources/TuistCoreTesting/MetadataProviders/MockPrecompiledMetadataProvider.swift index 040b2fdeb3f..d18b14e9484 100644 --- a/Sources/TuistCoreTesting/MetadataProviders/MockPrecompiledMetadataProvider.swift +++ b/Sources/TuistCoreTesting/MetadataProviders/MockPrecompiledMetadataProvider.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph @testable import TuistCore diff --git a/Sources/TuistCoreTesting/MetadataProviders/MockXCFrameworkMetadataProvider.swift b/Sources/TuistCoreTesting/MetadataProviders/MockXCFrameworkMetadataProvider.swift index f02fea09ead..c8a9cc03cee 100644 --- a/Sources/TuistCoreTesting/MetadataProviders/MockXCFrameworkMetadataProvider.swift +++ b/Sources/TuistCoreTesting/MetadataProviders/MockXCFrameworkMetadataProvider.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph @testable import TuistCore diff --git a/Sources/TuistCoreTesting/NodeLoaders/MockFrameworkNodeLoader.swift b/Sources/TuistCoreTesting/NodeLoaders/MockFrameworkNodeLoader.swift index 0dc8667c3d5..c22c2c226bb 100644 --- a/Sources/TuistCoreTesting/NodeLoaders/MockFrameworkNodeLoader.swift +++ b/Sources/TuistCoreTesting/NodeLoaders/MockFrameworkNodeLoader.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph diff --git a/Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift b/Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift index e31e6e2542f..389e5deaa3b 100644 --- a/Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift +++ b/Sources/TuistCoreTesting/NodeLoaders/MockXCFrameworkLoader.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph diff --git a/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift b/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift index 37938b0973f..09be1abd98f 100644 --- a/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift +++ b/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import struct TSCUtility.Version import TuistSupport import XcodeGraph diff --git a/Sources/TuistCoreTesting/Simulator/SimulatorDevice+TestData.swift b/Sources/TuistCoreTesting/Simulator/SimulatorDevice+TestData.swift index 4c5718aac32..dea705dc735 100644 --- a/Sources/TuistCoreTesting/Simulator/SimulatorDevice+TestData.swift +++ b/Sources/TuistCoreTesting/Simulator/SimulatorDevice+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import TuistCore extension SimulatorDevice { diff --git a/Sources/TuistCoreTesting/Simulator/SimulatorDeviceAndRuntime+TestData.swift b/Sources/TuistCoreTesting/Simulator/SimulatorDeviceAndRuntime+TestData.swift index 997c8247368..2d2adfde6f4 100644 --- a/Sources/TuistCoreTesting/Simulator/SimulatorDeviceAndRuntime+TestData.swift +++ b/Sources/TuistCoreTesting/Simulator/SimulatorDeviceAndRuntime+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import TuistCore extension SimulatorDeviceAndRuntime { diff --git a/Sources/TuistCoreTesting/Simulator/SimulatorRuntime+TestData.swift b/Sources/TuistCoreTesting/Simulator/SimulatorRuntime+TestData.swift index fbaf5a61fc4..4062e3915fb 100644 --- a/Sources/TuistCoreTesting/Simulator/SimulatorRuntime+TestData.swift +++ b/Sources/TuistCoreTesting/Simulator/SimulatorRuntime+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import TuistCore extension SimulatorRuntime { diff --git a/Sources/TuistCoreTesting/Utils/MockRootDirectoryLocator.swift b/Sources/TuistCoreTesting/Utils/MockRootDirectoryLocator.swift index db8141d2747..7611537892e 100644 --- a/Sources/TuistCoreTesting/Utils/MockRootDirectoryLocator.swift +++ b/Sources/TuistCoreTesting/Utils/MockRootDirectoryLocator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import TuistCore public final class MockRootDirectoryLocator: RootDirectoryLocating { diff --git a/Sources/TuistCoreTesting/Utils/MockXcodeProjectBuildDirectoryLocator.swift b/Sources/TuistCoreTesting/Utils/MockXcodeProjectBuildDirectoryLocator.swift index e2c340d7d81..89a9fd9df78 100644 --- a/Sources/TuistCoreTesting/Utils/MockXcodeProjectBuildDirectoryLocator.swift +++ b/Sources/TuistCoreTesting/Utils/MockXcodeProjectBuildDirectoryLocator.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistCore import XcodeGraph diff --git a/Sources/TuistDependencies/Mappers/ExternalDependencyPathWorkspaceMapper.swift b/Sources/TuistDependencies/Mappers/ExternalDependencyPathWorkspaceMapper.swift index fcf5fd9a6c8..5a7edd37bde 100644 --- a/Sources/TuistDependencies/Mappers/ExternalDependencyPathWorkspaceMapper.swift +++ b/Sources/TuistDependencies/Mappers/ExternalDependencyPathWorkspaceMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Descriptors/ProjectDescriptor.swift b/Sources/TuistGenerator/Descriptors/ProjectDescriptor.swift index a5e12017740..2985a2f7e95 100644 --- a/Sources/TuistGenerator/Descriptors/ProjectDescriptor.swift +++ b/Sources/TuistGenerator/Descriptors/ProjectDescriptor.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeProj diff --git a/Sources/TuistGenerator/Descriptors/WorkspaceDescriptor.swift b/Sources/TuistGenerator/Descriptors/WorkspaceDescriptor.swift index 8a50a5a4ff0..8cfd11320c1 100644 --- a/Sources/TuistGenerator/Descriptors/WorkspaceDescriptor.swift +++ b/Sources/TuistGenerator/Descriptors/WorkspaceDescriptor.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeProj diff --git a/Sources/TuistGenerator/Descriptors/WorkspaceSettingsDescriptor.swift b/Sources/TuistGenerator/Descriptors/WorkspaceSettingsDescriptor.swift index 92d8de7b6cd..3c95feaa9e8 100644 --- a/Sources/TuistGenerator/Descriptors/WorkspaceSettingsDescriptor.swift +++ b/Sources/TuistGenerator/Descriptors/WorkspaceSettingsDescriptor.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeProj /// Workspace Settings Descriptor diff --git a/Sources/TuistGenerator/Extensions/AbsolutePath+Extras.swift b/Sources/TuistGenerator/Extensions/AbsolutePath+Extras.swift index 377caa36b2f..e55da711ab7 100644 --- a/Sources/TuistGenerator/Extensions/AbsolutePath+Extras.swift +++ b/Sources/TuistGenerator/Extensions/AbsolutePath+Extras.swift @@ -1,6 +1,6 @@ import Foundation +import Path import PathKit -import TSCBasic extension AbsolutePath { var path: Path { diff --git a/Sources/TuistGenerator/Extensions/Graph+Extras.swift b/Sources/TuistGenerator/Extensions/Graph+Extras.swift index 5589e101b87..235179e560a 100644 --- a/Sources/TuistGenerator/Extensions/Graph+Extras.swift +++ b/Sources/TuistGenerator/Extensions/Graph+Extras.swift @@ -1,4 +1,5 @@ import Foundation +import Path import TSCBasic import TuistCore import XcodeGraph @@ -59,7 +60,7 @@ extension XcodeGraph.Graph { } extension GraphDependency { - fileprivate func isExternal(_ projects: [AbsolutePath: XcodeGraph.Project]) -> Bool { + fileprivate func isExternal(_ projects: [Path.AbsolutePath: XcodeGraph.Project]) -> Bool { switch self { case let .target(_, path): return projects[path]?.isExternal ?? false diff --git a/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift b/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift index 9d136f3f9f9..195b9f4c3a3 100644 --- a/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift +++ b/Sources/TuistGenerator/Generator/BuildPhaseGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Generator/ConfigGenerator.swift b/Sources/TuistGenerator/Generator/ConfigGenerator.swift index 835bb9f66da..c1c5a1dc82a 100644 --- a/Sources/TuistGenerator/Generator/ConfigGenerator.swift +++ b/Sources/TuistGenerator/Generator/ConfigGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Generator/DescriptorGenerator.swift b/Sources/TuistGenerator/Generator/DescriptorGenerator.swift index c32d88eb630..9fbffcde43e 100644 --- a/Sources/TuistGenerator/Generator/DescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/DescriptorGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Generator/GeneratedProject.swift b/Sources/TuistGenerator/Generator/GeneratedProject.swift index f08cd316663..dd11386808f 100644 --- a/Sources/TuistGenerator/Generator/GeneratedProject.swift +++ b/Sources/TuistGenerator/Generator/GeneratedProject.swift @@ -1,6 +1,6 @@ import Foundation +import Path import PathKit -import TSCBasic import XcodeProj final class GeneratedProject { diff --git a/Sources/TuistGenerator/Generator/LinkGenerator.swift b/Sources/TuistGenerator/Generator/LinkGenerator.swift index 64bc67807fd..548768f3882 100644 --- a/Sources/TuistGenerator/Generator/LinkGenerator.swift +++ b/Sources/TuistGenerator/Generator/LinkGenerator.swift @@ -1,6 +1,6 @@ import Foundation +import Path import PathKit -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift index 59b8d1a8dee..5983464f1a1 100644 --- a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Generator/ProjectFileElements.swift b/Sources/TuistGenerator/Generator/ProjectFileElements.swift index 2f297181e91..e8010706e55 100644 --- a/Sources/TuistGenerator/Generator/ProjectFileElements.swift +++ b/Sources/TuistGenerator/Generator/ProjectFileElements.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Generator/ProjectGroups.swift b/Sources/TuistGenerator/Generator/ProjectGroups.swift index 248165db317..df4f7a337e8 100644 --- a/Sources/TuistGenerator/Generator/ProjectGroups.swift +++ b/Sources/TuistGenerator/Generator/ProjectGroups.swift @@ -1,4 +1,5 @@ import Foundation +import Path import TSCBasic import TuistCore import TuistSupport diff --git a/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift b/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift index 9a9dfff22c7..b8faf39fb84 100644 --- a/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift +++ b/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility import TuistCore import TuistSupport diff --git a/Sources/TuistGenerator/Generator/TargetGenerator.swift b/Sources/TuistGenerator/Generator/TargetGenerator.swift index e5c004feab0..159074d9495 100644 --- a/Sources/TuistGenerator/Generator/TargetGenerator.swift +++ b/Sources/TuistGenerator/Generator/TargetGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Generator/WorkspaceDescriptorGenerator.swift b/Sources/TuistGenerator/Generator/WorkspaceDescriptorGenerator.swift index 350ef92222a..86510f87c70 100644 --- a/Sources/TuistGenerator/Generator/WorkspaceDescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/WorkspaceDescriptorGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeProj diff --git a/Sources/TuistGenerator/Generator/WorkspaceStructureGenerator.swift b/Sources/TuistGenerator/Generator/WorkspaceStructureGenerator.swift index cbc5edf2737..512c2fccb6d 100644 --- a/Sources/TuistGenerator/Generator/WorkspaceStructureGenerator.swift +++ b/Sources/TuistGenerator/Generator/WorkspaceStructureGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Linter/EnvironmentLinter.swift b/Sources/TuistGenerator/Linter/EnvironmentLinter.swift index a0ebbfb565e..081a5b2890f 100644 --- a/Sources/TuistGenerator/Linter/EnvironmentLinter.swift +++ b/Sources/TuistGenerator/Linter/EnvironmentLinter.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Linter/PackageLinter.swift b/Sources/TuistGenerator/Linter/PackageLinter.swift index 52eea27d598..b00999ce227 100644 --- a/Sources/TuistGenerator/Linter/PackageLinter.swift +++ b/Sources/TuistGenerator/Linter/PackageLinter.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Linter/ProjectLinter.swift b/Sources/TuistGenerator/Linter/ProjectLinter.swift index 6bc2bfa790e..234c5887164 100644 --- a/Sources/TuistGenerator/Linter/ProjectLinter.swift +++ b/Sources/TuistGenerator/Linter/ProjectLinter.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Linter/SettingsLinter.swift b/Sources/TuistGenerator/Linter/SettingsLinter.swift index b06cb476fc8..7a80359dfe8 100644 --- a/Sources/TuistGenerator/Linter/SettingsLinter.swift +++ b/Sources/TuistGenerator/Linter/SettingsLinter.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift b/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift index 479e9c2c11f..be930cd5733 100644 --- a/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift +++ b/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph diff --git a/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift b/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift index 107bc16f617..9f16040a950 100644 --- a/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/AutogeneratedSchemesProjectMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph diff --git a/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift b/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift index 6b5e14f0540..5d9dcbeae42 100644 --- a/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift +++ b/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift b/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift index f6b09b7b8ea..070bdf7ae76 100644 --- a/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GenerateEntitlementsProjectMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift b/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift index 0ba1ba168e7..fa305ca867d 100644 --- a/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GenerateInfoPlistProjectMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift b/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift index 052a65ac0bd..19c3f0a4ef6 100644 --- a/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/GeneratePrivacyManifestProjectMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Mappers/IDETemplateMacrosMapper.swift b/Sources/TuistGenerator/Mappers/IDETemplateMacrosMapper.swift index 22a58effe40..c2ca8499aa6 100644 --- a/Sources/TuistGenerator/Mappers/IDETemplateMacrosMapper.swift +++ b/Sources/TuistGenerator/Mappers/IDETemplateMacrosMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph diff --git a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift index 3613f98a7c3..f000863928f 100644 --- a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift +++ b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index 1b2aa484e3a..dba53ddf205 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift index 97bf5fd13aa..9852cd95623 100644 --- a/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/SynthesizedResourceInterfaceProjectMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import SwiftGenKit -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Utils/EmbedScriptGenerator.swift b/Sources/TuistGenerator/Utils/EmbedScriptGenerator.swift index 9e375b85b82..4f664288c8f 100644 --- a/Sources/TuistGenerator/Utils/EmbedScriptGenerator.swift +++ b/Sources/TuistGenerator/Utils/EmbedScriptGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore /// This protocols defines the interface of an utility that given a list of embeddable frameworks diff --git a/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift b/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift index 6aed76bc92a..09d29bac3d7 100644 --- a/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift +++ b/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Utils/SynthesizedResourceInterfacesGenerator.swift b/Sources/TuistGenerator/Utils/SynthesizedResourceInterfacesGenerator.swift index 18d2a5ccffc..d5dc1ad21cf 100644 --- a/Sources/TuistGenerator/Utils/SynthesizedResourceInterfacesGenerator.swift +++ b/Sources/TuistGenerator/Utils/SynthesizedResourceInterfacesGenerator.swift @@ -1,8 +1,8 @@ +import Path import PathKit import Stencil import StencilSwiftKit import SwiftGenKit -import TSCBasic import TuistSupport import XcodeGraph diff --git a/Sources/TuistGenerator/Writers/XcodeProjWriter.swift b/Sources/TuistGenerator/Writers/XcodeProjWriter.swift index 912113a7337..bc30bd0920c 100644 --- a/Sources/TuistGenerator/Writers/XcodeProjWriter.swift +++ b/Sources/TuistGenerator/Writers/XcodeProjWriter.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeProj diff --git a/Sources/TuistGeneratorTesting/Descriptors/Mocks/MockSideEffectDescriptorExecutor.swift b/Sources/TuistGeneratorTesting/Descriptors/Mocks/MockSideEffectDescriptorExecutor.swift index 72e75721727..3c058ef2967 100644 --- a/Sources/TuistGeneratorTesting/Descriptors/Mocks/MockSideEffectDescriptorExecutor.swift +++ b/Sources/TuistGeneratorTesting/Descriptors/Mocks/MockSideEffectDescriptorExecutor.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore @testable import TuistGenerator diff --git a/Sources/TuistGeneratorTesting/Descriptors/TestData/ProjectDescriptor+TestData.swift b/Sources/TuistGeneratorTesting/Descriptors/TestData/ProjectDescriptor+TestData.swift index 5afdcce3cb5..b26af76ca3b 100644 --- a/Sources/TuistGeneratorTesting/Descriptors/TestData/ProjectDescriptor+TestData.swift +++ b/Sources/TuistGeneratorTesting/Descriptors/TestData/ProjectDescriptor+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeProj diff --git a/Sources/TuistGeneratorTesting/Descriptors/TestData/SchemeDescriptor+TestData.swift b/Sources/TuistGeneratorTesting/Descriptors/TestData/SchemeDescriptor+TestData.swift index 73faf2df283..96ef54e437d 100644 --- a/Sources/TuistGeneratorTesting/Descriptors/TestData/SchemeDescriptor+TestData.swift +++ b/Sources/TuistGeneratorTesting/Descriptors/TestData/SchemeDescriptor+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeProj @testable import TuistGenerator diff --git a/Sources/TuistGeneratorTesting/Descriptors/TestData/WorkspaceDescriptor+TestData.swift b/Sources/TuistGeneratorTesting/Descriptors/TestData/WorkspaceDescriptor+TestData.swift index c98867a6acc..53c5c47f53e 100644 --- a/Sources/TuistGeneratorTesting/Descriptors/TestData/WorkspaceDescriptor+TestData.swift +++ b/Sources/TuistGeneratorTesting/Descriptors/TestData/WorkspaceDescriptor+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeProj diff --git a/Sources/TuistGeneratorTesting/Generator/MockDescriptorGenerator.swift b/Sources/TuistGeneratorTesting/Generator/MockDescriptorGenerator.swift index 44fdd053b35..28cc8b5049c 100644 --- a/Sources/TuistGeneratorTesting/Generator/MockDescriptorGenerator.swift +++ b/Sources/TuistGeneratorTesting/Generator/MockDescriptorGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph import XcodeProj diff --git a/Sources/TuistGeneratorTesting/Linter/MockEnvironmentLinter.swift b/Sources/TuistGeneratorTesting/Linter/MockEnvironmentLinter.swift index b663452d8c8..43be18152ca 100644 --- a/Sources/TuistGeneratorTesting/Linter/MockEnvironmentLinter.swift +++ b/Sources/TuistGeneratorTesting/Linter/MockEnvironmentLinter.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph diff --git a/Sources/TuistKit/Commands/BuildCommand.swift b/Sources/TuistKit/Commands/BuildCommand.swift index 5dab010805c..97fbe9218e9 100644 --- a/Sources/TuistKit/Commands/BuildCommand.swift +++ b/Sources/TuistKit/Commands/BuildCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TSCUtility import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift index 28ee50d25b9..e4f139da07f 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudAnalyticsCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift index 8ae33f2b481..f7422880f6a 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path struct CloudAuthCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { diff --git a/Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift index 83c1314bae5..164142e7c7d 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudCleanCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift index 007bf99519f..d3075793f75 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudInitCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift index 83691fe86d8..2329a129049 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path struct CloudLogoutCommand: ParsableCommand { static var configuration: CommandConfiguration { diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift index 66188710c49..fac07ea3445 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudOrganizationBillingCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationCommand.swift index dca1e589613..75c6a90d31f 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path struct CloudOrganizationCommand: ParsableCommand { static var configuration: CommandConfiguration { diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift index b110ce6e266..dc0d251295a 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudOrganizationCreateCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift index 48c18647439..339d20fab47 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudOrganizationDeleteCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift index 37d4cf15327..54f594183e9 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudOrganizationInviteCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift index 8a9f79cae48..9fce3010523 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudOrganizationListCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveCommand.swift index 2625a55aede..2cefd925617 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path struct CloudOrganizationRemoveCommand: ParsableCommand { static var configuration: CommandConfiguration { diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift index 832ee37d9ba..1a473abd515 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudOrganizationRemoveInviteCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift index 95ee194100e..5c7f748c9b9 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudOrganizationRemoveMemberCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift index 8897c856628..a78146d9ef4 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudOrganizationRemoveSSOCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift index 9d27d5da835..95130ee83ee 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudOrganizationShowCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateCommand.swift index 0b05955941d..ff37a85beda 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path struct CloudOrganizationUpdateCommand: ParsableCommand { static var configuration: CommandConfiguration { diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift index c407918186e..29269e8cb4b 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudOrganizationUpdateMemberCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift index 0b1ec7355d4..a450deff330 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport enum SSOProvider: String, ExpressibleByArgument, CaseIterable { diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectCommand.swift index 09543d9e397..16300130840 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path struct CloudProjectCommand: ParsableCommand { static var configuration: CommandConfiguration { diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift index 82f6ea57e07..0063f07684d 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudProjectCreateCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift index 2c58f7fbea7..233bf296166 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudProjectListCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift index 371a95f4441..f8003f51fec 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct CloudProjectTokenCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift index 295f518350c..17c739838fd 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path struct CloudSessionCommand: ParsableCommand { static var configuration: CommandConfiguration { diff --git a/Sources/TuistKit/Commands/CloudCommand.swift b/Sources/TuistKit/Commands/CloudCommand.swift index 371a1c47ad0..647c4a6559f 100644 --- a/Sources/TuistKit/Commands/CloudCommand.swift +++ b/Sources/TuistKit/Commands/CloudCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path struct CloudCommand: ParsableCommand { static var configuration: CommandConfiguration { diff --git a/Sources/TuistKit/Commands/DumpCommand.swift b/Sources/TuistKit/Commands/DumpCommand.swift index 1b5e2401919..078762d8144 100644 --- a/Sources/TuistKit/Commands/DumpCommand.swift +++ b/Sources/TuistKit/Commands/DumpCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistLoader import TuistSupport diff --git a/Sources/TuistKit/Commands/EditCommand.swift b/Sources/TuistKit/Commands/EditCommand.swift index f36cdb3fb28..f03edf85359 100644 --- a/Sources/TuistKit/Commands/EditCommand.swift +++ b/Sources/TuistKit/Commands/EditCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistGenerator import TuistSupport diff --git a/Sources/TuistKit/Commands/GraphCommand.swift b/Sources/TuistKit/Commands/GraphCommand.swift index ee7413c479e..a974fb3bd2b 100644 --- a/Sources/TuistKit/Commands/GraphCommand.swift +++ b/Sources/TuistKit/Commands/GraphCommand.swift @@ -2,7 +2,7 @@ import AnyCodable import ArgumentParser import Foundation import GraphViz -import TSCBasic +import Path import TuistGenerator import TuistLoader import TuistSupport diff --git a/Sources/TuistKit/Commands/InitCommand.swift b/Sources/TuistKit/Commands/InitCommand.swift index f800ef1a532..8a57a1a097c 100644 --- a/Sources/TuistKit/Commands/InitCommand.swift +++ b/Sources/TuistKit/Commands/InitCommand.swift @@ -1,7 +1,7 @@ import AnyCodable import ArgumentParser import Foundation -import TSCBasic +import Path import TuistCore import TuistGenerator import TuistLoader diff --git a/Sources/TuistKit/Commands/InstallCommand.swift b/Sources/TuistKit/Commands/InstallCommand.swift index d981a9c788b..c921d8129f7 100644 --- a/Sources/TuistKit/Commands/InstallCommand.swift +++ b/Sources/TuistKit/Commands/InstallCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path /// A command to install the remote content the project depends on. public struct InstallCommand: AsyncParsableCommand { diff --git a/Sources/TuistKit/Commands/Migration/MigrationCheckEmptyBuildSettingsCommand.swift b/Sources/TuistKit/Commands/Migration/MigrationCheckEmptyBuildSettingsCommand.swift index 89a4cc0dedd..e520ffbfecb 100644 --- a/Sources/TuistKit/Commands/Migration/MigrationCheckEmptyBuildSettingsCommand.swift +++ b/Sources/TuistKit/Commands/Migration/MigrationCheckEmptyBuildSettingsCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct MigrationCheckEmptyBuildSettingsCommand: ParsableCommand { diff --git a/Sources/TuistKit/Commands/Migration/MigrationSettingsToXCConfigCommand.swift b/Sources/TuistKit/Commands/Migration/MigrationSettingsToXCConfigCommand.swift index 3b67107d822..f8ccb3e1d8f 100644 --- a/Sources/TuistKit/Commands/Migration/MigrationSettingsToXCConfigCommand.swift +++ b/Sources/TuistKit/Commands/Migration/MigrationSettingsToXCConfigCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport struct MigrationSettingsToXCConfigCommand: ParsableCommand { diff --git a/Sources/TuistKit/Commands/Migration/MigrationTargetsByDependenciesCommand.swift b/Sources/TuistKit/Commands/Migration/MigrationTargetsByDependenciesCommand.swift index e0e82c689f9..b2e966857d1 100644 --- a/Sources/TuistKit/Commands/Migration/MigrationTargetsByDependenciesCommand.swift +++ b/Sources/TuistKit/Commands/Migration/MigrationTargetsByDependenciesCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistSupport public struct MigrationTargetsByDependenciesCommand: ParsableCommand { diff --git a/Sources/TuistKit/Commands/MigrationCommand.swift b/Sources/TuistKit/Commands/MigrationCommand.swift index b450e003e72..59adc3fc69f 100644 --- a/Sources/TuistKit/Commands/MigrationCommand.swift +++ b/Sources/TuistKit/Commands/MigrationCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path struct MigrationCommand: ParsableCommand { static var configuration: CommandConfiguration { diff --git a/Sources/TuistKit/Commands/Plugin/PluginArchiveCommand.swift b/Sources/TuistKit/Commands/Plugin/PluginArchiveCommand.swift index 5e56107ae11..4ea1c49278f 100644 --- a/Sources/TuistKit/Commands/Plugin/PluginArchiveCommand.swift +++ b/Sources/TuistKit/Commands/Plugin/PluginArchiveCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path struct PluginArchiveCommand: ParsableCommand { static var configuration: CommandConfiguration { diff --git a/Sources/TuistKit/Commands/Plugin/PluginBuildCommand.swift b/Sources/TuistKit/Commands/Plugin/PluginBuildCommand.swift index 1611c0a138e..91096b8a33f 100644 --- a/Sources/TuistKit/Commands/Plugin/PluginBuildCommand.swift +++ b/Sources/TuistKit/Commands/Plugin/PluginBuildCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path public struct PluginBuildCommand: ParsableCommand { public init() {} diff --git a/Sources/TuistKit/Commands/Plugin/PluginCommand.swift b/Sources/TuistKit/Commands/Plugin/PluginCommand.swift index de8d6df3052..0790e590977 100644 --- a/Sources/TuistKit/Commands/Plugin/PluginCommand.swift +++ b/Sources/TuistKit/Commands/Plugin/PluginCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path struct PluginCommand: ParsableCommand { static var configuration: CommandConfiguration { diff --git a/Sources/TuistKit/Commands/Plugin/PluginRunCommand.swift b/Sources/TuistKit/Commands/Plugin/PluginRunCommand.swift index 3bd646e05de..9bb6454036d 100644 --- a/Sources/TuistKit/Commands/Plugin/PluginRunCommand.swift +++ b/Sources/TuistKit/Commands/Plugin/PluginRunCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path public struct PluginRunCommand: ParsableCommand { public init() {} diff --git a/Sources/TuistKit/Commands/Plugin/PluginTestCommand.swift b/Sources/TuistKit/Commands/Plugin/PluginTestCommand.swift index ad447945a26..96420c8024d 100644 --- a/Sources/TuistKit/Commands/Plugin/PluginTestCommand.swift +++ b/Sources/TuistKit/Commands/Plugin/PluginTestCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path public struct PluginTestCommand: ParsableCommand { public init() {} diff --git a/Sources/TuistKit/Commands/RunCommand.swift b/Sources/TuistKit/Commands/RunCommand.swift index 4f4948dfea4..850bbc56eda 100644 --- a/Sources/TuistKit/Commands/RunCommand.swift +++ b/Sources/TuistKit/Commands/RunCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TSCUtility import TuistSupport diff --git a/Sources/TuistKit/Commands/ScaffoldCommand.swift b/Sources/TuistKit/Commands/ScaffoldCommand.swift index 49af18a6230..e2ca8607585 100644 --- a/Sources/TuistKit/Commands/ScaffoldCommand.swift +++ b/Sources/TuistKit/Commands/ScaffoldCommand.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TuistCore import TuistLoader import TuistPlugin diff --git a/Sources/TuistKit/Commands/TestCommand.swift b/Sources/TuistKit/Commands/TestCommand.swift index 19b8d13cd5f..eb568f62a0d 100644 --- a/Sources/TuistKit/Commands/TestCommand.swift +++ b/Sources/TuistKit/Commands/TestCommand.swift @@ -1,7 +1,7 @@ import AnyCodable import ArgumentParser import Foundation -import TSCBasic +import Path import TuistCore import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index d989d86eba1..9084616f74b 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -1,6 +1,6 @@ @_exported import ArgumentParser import Foundation -import TSCBasic +import Path import TuistAnalytics import TuistLoader import TuistSupport diff --git a/Sources/TuistKit/Generator/Generator.swift b/Sources/TuistKit/Generator/Generator.swift index a2d5f4e57bd..a1e88378ef2 100644 --- a/Sources/TuistKit/Generator/Generator.swift +++ b/Sources/TuistKit/Generator/Generator.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistDependencies import TuistGenerator diff --git a/Sources/TuistKit/Generator/GeneratorFactory.swift b/Sources/TuistKit/Generator/GeneratorFactory.swift index 04eae2dec35..db3db09a7d5 100644 --- a/Sources/TuistKit/Generator/GeneratorFactory.swift +++ b/Sources/TuistKit/Generator/GeneratorFactory.swift @@ -1,6 +1,6 @@ import Foundation import Mockable -import TSCBasic +import Path import TuistCore import TuistGenerator import TuistLoader diff --git a/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift b/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift index dcc366c55c8..a2626549f0b 100644 --- a/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift +++ b/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistDependencies import TuistGenerator diff --git a/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift b/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift index 0254c32a188..371f14bf1e3 100644 --- a/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift +++ b/Sources/TuistKit/Mappers/Factories/WorkspaceMapperFactory.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility import TuistAutomation import TuistCore diff --git a/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift b/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift index d49982bc24c..90f061bb94c 100644 --- a/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift +++ b/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift @@ -1,4 +1,5 @@ import Foundation +import Path import TSCBasic import TuistCore import TuistSupport diff --git a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift index bca39277d5e..2b3dd817ceb 100644 --- a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift +++ b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph diff --git a/Sources/TuistKit/ProjectEditor/EditablePluginManifest.swift b/Sources/TuistKit/ProjectEditor/EditablePluginManifest.swift index 911316abe85..dd0473733f0 100644 --- a/Sources/TuistKit/ProjectEditor/EditablePluginManifest.swift +++ b/Sources/TuistKit/ProjectEditor/EditablePluginManifest.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// A plugin which is loaded & editable as part of the `tuist edit` command. struct EditablePluginManifest { diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditor.swift b/Sources/TuistKit/ProjectEditor/ProjectEditor.swift index 56c6dd61e9e..dc549fcfec1 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditor.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditor.swift @@ -1,6 +1,6 @@ import Foundation import Mockable -import TSCBasic +import Path import TuistCore import TuistGenerator import TuistLoader diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift index b5f795aad96..30462c74f6f 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistLoader import TuistSupport diff --git a/Sources/TuistKit/Services/BuildService.swift b/Sources/TuistKit/Services/BuildService.swift index 95a7ffc5afa..39ae782fd51 100644 --- a/Sources/TuistKit/Services/BuildService.swift +++ b/Sources/TuistKit/Services/BuildService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistAutomation import TuistCore import TuistLoader diff --git a/Sources/TuistKit/Services/CleanService.swift b/Sources/TuistKit/Services/CleanService.swift index 45310adc7ab..5b11b58bfff 100644 --- a/Sources/TuistKit/Services/CleanService.swift +++ b/Sources/TuistKit/Services/CleanService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistLoader import TuistSupport @@ -55,7 +55,7 @@ enum TuistCleanCategory: CleanCategory, Equatable { func directory( packageDirectory: AbsolutePath?, cacheDirectory: AbsolutePath - ) throws -> TSCBasic.AbsolutePath? { + ) throws -> Path.AbsolutePath? { switch self { case let .global(category): return CacheDirectoriesProvider.tuistCacheDirectory(for: category, cacheDirectory: cacheDirectory) diff --git a/Sources/TuistKit/Services/Cloud/CloudAnalyticsService.swift b/Sources/TuistKit/Services/Cloud/CloudAnalyticsService.swift index f6b9432b999..395b2c69848 100644 --- a/Sources/TuistKit/Services/Cloud/CloudAnalyticsService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudAnalyticsService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudAuthService.swift b/Sources/TuistKit/Services/Cloud/CloudAuthService.swift index f698a90814d..04843bebf24 100644 --- a/Sources/TuistKit/Services/Cloud/CloudAuthService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudAuthService.swift @@ -1,6 +1,6 @@ import Foundation import Mockable -import TSCBasic +import Path import TuistCore import TuistLoader import TuistServer diff --git a/Sources/TuistKit/Services/Cloud/CloudCleanService.swift b/Sources/TuistKit/Services/Cloud/CloudCleanService.swift index 72df4e2a584..122efee76d3 100644 --- a/Sources/TuistKit/Services/Cloud/CloudCleanService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudCleanService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudInitService.swift b/Sources/TuistKit/Services/Cloud/CloudInitService.swift index db36500bdf3..9937a4f6d77 100644 --- a/Sources/TuistKit/Services/Cloud/CloudInitService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudInitService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudLogoutService.swift b/Sources/TuistKit/Services/Cloud/CloudLogoutService.swift index ee7c30c4620..ac3382ff76a 100644 --- a/Sources/TuistKit/Services/Cloud/CloudLogoutService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudLogoutService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistLoader import TuistServer diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationBillingService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationBillingService.swift index 6a34395ad8b..01fcefd4f13 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationBillingService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationBillingService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationCreateService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationCreateService.swift index 7d6568c00f2..9a64a950c99 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationCreateService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationCreateService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationDeleteService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationDeleteService.swift index 33de52f0a4f..dc73b9fdaa2 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationDeleteService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationDeleteService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationInviteService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationInviteService.swift index 1f05293029f..03d8a332bfb 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationInviteService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationInviteService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift index 8925ae8d2bc..8dba691b90c 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveInviteService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveInviteService.swift index 0ea6af1a439..049e7de2003 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveInviteService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveInviteService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveMemberService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveMemberService.swift index 48008f45d76..da21a40b48d 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveMemberService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveMemberService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveSSOService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveSSOService.swift index b94cfbbb849..62086f47deb 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveSSOService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveSSOService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift index 7a321979476..de630514f4b 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateMemberService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateMemberService.swift index fc8aefc6290..9ae3c7f1f8f 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateMemberService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateMemberService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateService.swift index 793064c5721..bd89ba78282 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift b/Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift index 171ebf6df9f..f2f9998b6f6 100644 --- a/Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift b/Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift index 5024e28be12..af895bc37d5 100644 --- a/Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectListService.swift b/Sources/TuistKit/Services/Cloud/CloudProjectListService.swift index 1a1332afa94..182f2eaa1dd 100644 --- a/Sources/TuistKit/Services/Cloud/CloudProjectListService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudProjectListService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift b/Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift index 92f46c4a903..2f4ae3224db 100644 --- a/Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Sources/TuistKit/Services/Cloud/CloudSessionService.swift b/Sources/TuistKit/Services/Cloud/CloudSessionService.swift index f42e980715a..536e236cf2d 100644 --- a/Sources/TuistKit/Services/Cloud/CloudSessionService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudSessionService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistLoader import TuistServer diff --git a/Sources/TuistKit/Services/DumpService.swift b/Sources/TuistKit/Services/DumpService.swift index db49c264cc2..3c070c4bc90 100644 --- a/Sources/TuistKit/Services/DumpService.swift +++ b/Sources/TuistKit/Services/DumpService.swift @@ -1,4 +1,5 @@ import Foundation +import Path import TSCBasic import TuistCore import TuistLoader @@ -13,7 +14,7 @@ final class DumpService { } func run(path: String?, manifest: DumpableManifest) async throws { - let projectPath: AbsolutePath + let projectPath: Path.AbsolutePath if let path { projectPath = try AbsolutePath(validating: path, relativeTo: AbsolutePath.current) } else { diff --git a/Sources/TuistKit/Services/EditService.swift b/Sources/TuistKit/Services/EditService.swift index d3a90a1b2af..4cd03ebe2a0 100644 --- a/Sources/TuistKit/Services/EditService.swift +++ b/Sources/TuistKit/Services/EditService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistGenerator import TuistLoader diff --git a/Sources/TuistKit/Services/GenerateService.swift b/Sources/TuistKit/Services/GenerateService.swift index cd74790d72a..33b4689c268 100644 --- a/Sources/TuistKit/Services/GenerateService.swift +++ b/Sources/TuistKit/Services/GenerateService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistGenerator import TuistLoader diff --git a/Sources/TuistKit/Services/GraphService.swift b/Sources/TuistKit/Services/GraphService.swift index 62750241d50..a9c69ad8cc2 100644 --- a/Sources/TuistKit/Services/GraphService.swift +++ b/Sources/TuistKit/Services/GraphService.swift @@ -1,9 +1,9 @@ import DOT import Foundation import GraphViz +import Path import ProjectAutomation import Tools -import TSCBasic import TuistCore import TuistGenerator import TuistLoader diff --git a/Sources/TuistKit/Services/InitService.swift b/Sources/TuistKit/Services/InitService.swift index 21e50244410..3f1d84f959a 100644 --- a/Sources/TuistKit/Services/InitService.swift +++ b/Sources/TuistKit/Services/InitService.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistCore import TuistLoader import TuistScaffold diff --git a/Sources/TuistKit/Services/InstallService.swift b/Sources/TuistKit/Services/InstallService.swift index b02c0143c59..0c09424cf14 100644 --- a/Sources/TuistKit/Services/InstallService.swift +++ b/Sources/TuistKit/Services/InstallService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistDependencies import TuistLoader diff --git a/Sources/TuistKit/Services/ListService.swift b/Sources/TuistKit/Services/ListService.swift index f8ac510e132..89d80fe02e3 100644 --- a/Sources/TuistKit/Services/ListService.swift +++ b/Sources/TuistKit/Services/ListService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import TuistPlugin import TuistScaffold diff --git a/Sources/TuistKit/Services/Migration/MigrationCheckEmptyBuildSettingsService.swift b/Sources/TuistKit/Services/Migration/MigrationCheckEmptyBuildSettingsService.swift index f996a701934..08cd799cae7 100644 --- a/Sources/TuistKit/Services/Migration/MigrationCheckEmptyBuildSettingsService.swift +++ b/Sources/TuistKit/Services/Migration/MigrationCheckEmptyBuildSettingsService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistMigration import TuistSupport diff --git a/Sources/TuistKit/Services/Migration/MigrationSettingsToXCConfigService.swift b/Sources/TuistKit/Services/Migration/MigrationSettingsToXCConfigService.swift index 93b2dfbe06c..db90fd3418b 100644 --- a/Sources/TuistKit/Services/Migration/MigrationSettingsToXCConfigService.swift +++ b/Sources/TuistKit/Services/Migration/MigrationSettingsToXCConfigService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistMigration import TuistSupport diff --git a/Sources/TuistKit/Services/Migration/MigrationTargetsByDependenciesService.swift b/Sources/TuistKit/Services/Migration/MigrationTargetsByDependenciesService.swift index b7b10d5cb25..70fe5aad208 100644 --- a/Sources/TuistKit/Services/Migration/MigrationTargetsByDependenciesService.swift +++ b/Sources/TuistKit/Services/Migration/MigrationTargetsByDependenciesService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistMigration import TuistSupport diff --git a/Sources/TuistKit/Services/Plugin/PluginArchiveService.swift b/Sources/TuistKit/Services/Plugin/PluginArchiveService.swift index a81027649f9..8b2506e0e48 100644 --- a/Sources/TuistKit/Services/Plugin/PluginArchiveService.swift +++ b/Sources/TuistKit/Services/Plugin/PluginArchiveService.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistDependencies import TuistLoader import TuistSupport diff --git a/Sources/TuistKit/Services/Plugin/PluginBuildService.swift b/Sources/TuistKit/Services/Plugin/PluginBuildService.swift index 29e0f208a79..b3d512a38c8 100644 --- a/Sources/TuistKit/Services/Plugin/PluginBuildService.swift +++ b/Sources/TuistKit/Services/Plugin/PluginBuildService.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistSupport final class PluginBuildService { diff --git a/Sources/TuistKit/Services/Plugin/PluginRunService.swift b/Sources/TuistKit/Services/Plugin/PluginRunService.swift index 4a8ae101a3b..2d3ef938905 100644 --- a/Sources/TuistKit/Services/Plugin/PluginRunService.swift +++ b/Sources/TuistKit/Services/Plugin/PluginRunService.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistSupport final class PluginRunService { diff --git a/Sources/TuistKit/Services/Plugin/PluginTestService.swift b/Sources/TuistKit/Services/Plugin/PluginTestService.swift index b761322eefc..dad1c14d4f6 100644 --- a/Sources/TuistKit/Services/Plugin/PluginTestService.swift +++ b/Sources/TuistKit/Services/Plugin/PluginTestService.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistSupport final class PluginTestService { diff --git a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift index 18b42507341..6c547b40ab1 100644 --- a/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift +++ b/Sources/TuistKit/Services/ProjectAutomation+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectAutomation -import TSCBasic import TuistSupport import XcodeGraph diff --git a/Sources/TuistKit/Services/RunService.swift b/Sources/TuistKit/Services/RunService.swift index 071ce6f0bd8..5e72345ffbd 100644 --- a/Sources/TuistKit/Services/RunService.swift +++ b/Sources/TuistKit/Services/RunService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import struct TSCUtility.Version import TuistAutomation import TuistCore diff --git a/Sources/TuistKit/Services/ScaffoldService.swift b/Sources/TuistKit/Services/ScaffoldService.swift index cf6dc9a5113..1ecca3cf859 100644 --- a/Sources/TuistKit/Services/ScaffoldService.swift +++ b/Sources/TuistKit/Services/ScaffoldService.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistCore import TuistLoader import TuistPlugin diff --git a/Sources/TuistKit/Services/TestService.swift b/Sources/TuistKit/Services/TestService.swift index 809dd996d73..78274717b40 100644 --- a/Sources/TuistKit/Services/TestService.swift +++ b/Sources/TuistKit/Services/TestService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import struct TSCUtility.Version import TuistAutomation import TuistCore diff --git a/Sources/TuistKit/Services/TuistService.swift b/Sources/TuistKit/Services/TuistService.swift index 1219d5abfeb..424cd9384ce 100644 --- a/Sources/TuistKit/Services/TuistService.swift +++ b/Sources/TuistKit/Services/TuistService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistLoader import TuistPlugin diff --git a/Sources/TuistKit/Utils/ManifestGraphLoader.swift b/Sources/TuistKit/Utils/ManifestGraphLoader.swift index 0acb759348c..e66120ee321 100644 --- a/Sources/TuistKit/Utils/ManifestGraphLoader.swift +++ b/Sources/TuistKit/Utils/ManifestGraphLoader.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistDependencies import TuistLoader diff --git a/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift b/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift index 12dae9f6377..47147181583 100644 --- a/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift +++ b/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistAnalytics import TuistAsyncQueue import TuistCore diff --git a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift index 5bc4cd1bea1..02aeefa1403 100644 --- a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import struct XcodeGraph.Config diff --git a/Sources/TuistLoader/Loaders/ConfigLoader.swift b/Sources/TuistLoader/Loaders/ConfigLoader.swift index d3a04457133..9e5e67a5ef8 100644 --- a/Sources/TuistLoader/Loaders/ConfigLoader.swift +++ b/Sources/TuistLoader/Loaders/ConfigLoader.swift @@ -1,7 +1,7 @@ import Foundation import Mockable +import Path import struct ProjectDescription.Config -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Loaders/ManifestLoader.swift b/Sources/TuistLoader/Loaders/ManifestLoader.swift index ea3b3ac230b..15a3a6e806f 100644 --- a/Sources/TuistLoader/Loaders/ManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/ManifestLoader.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Loaders/ManifestModelConverter.swift b/Sources/TuistLoader/Loaders/ManifestModelConverter.swift index 45ea5b81573..b2f9de4860e 100644 --- a/Sources/TuistLoader/Loaders/ManifestModelConverter.swift +++ b/Sources/TuistLoader/Loaders/ManifestModelConverter.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TSCUtility import TuistCore import TuistSupport diff --git a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift index b10df7e5ad4..4b86ecf84f5 100644 --- a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift +++ b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TSCUtility import TuistCore import TuistSupport diff --git a/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift b/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift index 4e54105d9a9..c982084db5e 100644 --- a/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistSupport import XcodeGraph @@ -49,7 +49,7 @@ public class RecursiveManifestLoader: RecursiveManifestLoading { self.packageInfoMapper = packageInfoMapper } - public func loadWorkspace(at path: TSCBasic.AbsolutePath) throws -> LoadedWorkspace { + public func loadWorkspace(at path: AbsolutePath) throws -> LoadedWorkspace { let loadedWorkspace: ProjectDescription.Workspace? do { loadedWorkspace = try manifestLoader.loadWorkspace(at: path) diff --git a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift index 6bb671a9cdc..717d134b07c 100644 --- a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift +++ b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TSCUtility import TuistCore import TuistSupport diff --git a/Sources/TuistLoader/Loaders/TemplateLoader.swift b/Sources/TuistLoader/Loaders/TemplateLoader.swift index 513a79b47e3..40730fbc66d 100644 --- a/Sources/TuistLoader/Loaders/TemplateLoader.swift +++ b/Sources/TuistLoader/Loaders/TemplateLoader.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Loaders/UmbrellaHeaderHeadersExtractor.swift b/Sources/TuistLoader/Loaders/UmbrellaHeaderHeadersExtractor.swift index 69510dd46c6..19cfc08e888 100644 --- a/Sources/TuistLoader/Loaders/UmbrellaHeaderHeadersExtractor.swift +++ b/Sources/TuistLoader/Loaders/UmbrellaHeaderHeadersExtractor.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport public enum UmbrellaHeaderHeadersExtractor { diff --git a/Sources/TuistLoader/Models+ManifestMappers/AnalyzeAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/AnalyzeAction+ManifestMapper.swift index 44921e963f6..e19cbeff570 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/AnalyzeAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/AnalyzeAction+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/ArchiveAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ArchiveAction+ManifestMapper.swift index 2b5f349053e..4ac3cb2722e 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/ArchiveAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/ArchiveAction+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/BuildAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/BuildAction+ManifestMapper.swift index 5259cd87703..0d64ae043ba 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/BuildAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/BuildAction+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/Cache+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Cache+ManifestMapper.swift index 4fc9db4f41a..c32dfbb8acf 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Cache+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Cache+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import struct TSCUtility.Version import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift index f7f4dbd90e5..e4bd5b9d68f 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift index dc31358aadd..4ae5485595c 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift index 6474038ce5a..f50381dd73a 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TSCUtility import TuistCore import TuistSupport diff --git a/Sources/TuistLoader/Models+ManifestMappers/Configuration+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Configuration+ManifestMapper.swift index dba6676649b..be7bfb7c260 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Configuration+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Configuration+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/CopyFileElement+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/CopyFileElement+ManifestMapper.swift index a1b73a6df50..444516a5d8c 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/CopyFileElement+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/CopyFileElement+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/CopyFilesAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/CopyFilesAction+ManifestMapper.swift index 4657e25dde2..687a52979ab 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/CopyFilesAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/CopyFilesAction+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/CoreDataModel+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/CoreDataModel+ManifestMapper.swift index 18f64b44c65..23b5ea4ad8b 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/CoreDataModel+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/CoreDataModel+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/DefaultSettings+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/DefaultSettings+ManifestMapper.swift index 3ee6084f426..b1d0250d1da 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/DefaultSettings+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/DefaultSettings+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/Entitlements+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Entitlements+ManifestMapper.swift index 13bcd6d9a5f..8dca99e1caa 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Entitlements+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Entitlements+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/ExecutionAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ExecutionAction+ManifestMapper.swift index f37ded268cc..d40c388973d 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/ExecutionAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/ExecutionAction+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import XcodeGraph extension XcodeGraph.ExecutionAction { diff --git a/Sources/TuistLoader/Models+ManifestMappers/FileCodeGen+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/FileCodeGen+ManifestMapper.swift index 77c3cec438f..b87dfd1b448 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/FileCodeGen+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/FileCodeGen+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/FileElement+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/FileElement+ManifestMapper.swift index 542fb5e2914..8555b0b05dc 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/FileElement+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/FileElement+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/Headers+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Headers+ManifestMapper.swift index 59c9a5e51d5..843011f5ec4 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Headers+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Headers+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/IDETemplateMacros+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/IDETemplateMacros+ManifestMapper.swift index 8462acfa5ea..f314a26d6a9 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/IDETemplateMacros+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/IDETemplateMacros+ManifestMapper.swift @@ -10,7 +10,7 @@ extension IDETemplateMacros { switch manifest { case let .file(path): let templatePath = try generatorPaths.resolve(path: path) - let templateContent = try String(contentsOf: templatePath.asURL) + let templateContent = try String(contentsOf: URL(fileURLWithPath: templatePath.pathString)) return IDETemplateMacros(fileHeader: templateContent) case let .string(templateContent): return IDETemplateMacros(fileHeader: templateContent) diff --git a/Sources/TuistLoader/Models+ManifestMappers/InfoPlist+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/InfoPlist+ManifestMapper.swift index 846314ee28d..e029d557b27 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/InfoPlist+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/InfoPlist+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/Package+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Package+ManifestMapper.swift index 3c8632d5f28..b11b0732000 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Package+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Package+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift index e9306a9bf05..ba4aeec0701 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TSCUtility import TuistCore import TuistSupport diff --git a/Sources/TuistLoader/Models+ManifestMappers/Plist+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Plist+ManifestMapper.swift index 2af554b8f8b..00ee7fb28c9 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Plist+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Plist+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/ProfileAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ProfileAction+ManifestMapper.swift index e077e933d74..c7a056580cd 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/ProfileAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/ProfileAction+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import XcodeGraph extension XcodeGraph.ProfileAction { diff --git a/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift index 66aec60679b..9400bbc4907 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import XcodeGraph extension XcodeGraph.Project { diff --git a/Sources/TuistLoader/Models+ManifestMappers/ResourceFileElement+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ResourceFileElement+ManifestMapper.swift index 4f5a68e6032..20f3bc83e52 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/ResourceFileElement+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/ResourceFileElement+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/ResourceSynthesizer+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ResourceSynthesizer+ManifestMapper.swift index a514b50c1b2..f362cde38c1 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/ResourceSynthesizer+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/ResourceSynthesizer+ManifestMapper.swift @@ -1,5 +1,5 @@ +import Path import ProjectDescription -import TSCBasic import XcodeGraph extension XcodeGraph.ResourceSynthesizer { diff --git a/Sources/TuistLoader/Models+ManifestMappers/RunAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/RunAction+ManifestMapper.swift index 0487421ce7d..b8de5f91815 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/RunAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/RunAction+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/RunActionOptions+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/RunActionOptions+ManifestMapper.swift index dc27f303391..abb8f58245a 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/RunActionOptions+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/RunActionOptions+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import XcodeGraph extension XcodeGraph.RunActionOptions { diff --git a/Sources/TuistLoader/Models+ManifestMappers/Scheme+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Scheme+ManifestMapper.swift index 5fe28ddebb2..098581e1b4d 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Scheme+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Scheme+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/SchemeDiagnosticsOption+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/SchemeDiagnosticsOption+ManifestMapper.swift index 3b31d646ee7..5350a83ca62 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/SchemeDiagnosticsOption+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/SchemeDiagnosticsOption+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/SettingValue+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/SettingValue+ManifestMapper.swift index fdeb20b08e2..673da04b904 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/SettingValue+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/SettingValue+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/Settings+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Settings+ManifestMapper.swift index ee45210c743..31f522f64f9 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Settings+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Settings+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift index b655985a1c7..b6cc610ac8f 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Target+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/TargetAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TargetAction+ManifestMapper.swift index b32538d69ba..834ce127b44 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TargetAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TargetAction+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift index 7c00b35b9fd..0390e28b231 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/TestAction+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TestAction+ManifestMapper.swift index 7db63cd87f1..51611623559 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TestAction+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TestAction+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/TestPlan+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TestPlan+ManifestMapper.swift index c5007a7d3a1..c6a0ea31e9d 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TestPlan+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TestPlan+ManifestMapper.swift @@ -1,11 +1,11 @@ import Foundation -import TSCBasic +import Path import XcodeGraph extension TestPlan { init(path: AbsolutePath, isDefault: Bool, generatorPaths: GeneratorPaths) throws { let jsonDecoder = JSONDecoder() - let testPlanData = try Data(contentsOf: path.asURL) + let testPlanData = try Data(contentsOf: URL(fileURLWithPath: path.pathString)) let xcTestPlan = try jsonDecoder.decode(XCTestPlan.self, from: testPlanData) try self.init( diff --git a/Sources/TuistLoader/Models+ManifestMappers/TestableTarget+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TestableTarget+ManifestMapper.swift index b0c1bdfa663..c583f1365c0 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TestableTarget+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TestableTarget+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import XcodeGraph diff --git a/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift index d8c489da74d..6b97ac59649 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models/FileListGlob+Unfold.swift b/Sources/TuistLoader/Models/FileListGlob+Unfold.swift index 53cb144d424..9ce57d8cc86 100644 --- a/Sources/TuistLoader/Models/FileListGlob+Unfold.swift +++ b/Sources/TuistLoader/Models/FileListGlob+Unfold.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Models/GeneratorPaths.swift b/Sources/TuistLoader/Models/GeneratorPaths.swift index 32eaca0b906..8608d79a1b8 100644 --- a/Sources/TuistLoader/Models/GeneratorPaths.swift +++ b/Sources/TuistLoader/Models/GeneratorPaths.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport diff --git a/Sources/TuistLoader/Models/Manifest.swift b/Sources/TuistLoader/Models/Manifest.swift index c2f2e057feb..4c12a57ec0f 100644 --- a/Sources/TuistLoader/Models/Manifest.swift +++ b/Sources/TuistLoader/Models/Manifest.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public enum Manifest: CaseIterable { case project diff --git a/Sources/TuistLoader/Models/PluginStencil.swift b/Sources/TuistLoader/Models/PluginStencil.swift index d2ebef81114..0c42cede60b 100644 --- a/Sources/TuistLoader/Models/PluginStencil.swift +++ b/Sources/TuistLoader/Models/PluginStencil.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// Stencil plugin model public struct PluginStencil: Equatable { diff --git a/Sources/TuistLoader/Models/ProjectDescriptionHelpersModule.swift b/Sources/TuistLoader/Models/ProjectDescriptionHelpersModule.swift index d0b986417ce..43f859ed6f2 100644 --- a/Sources/TuistLoader/Models/ProjectDescriptionHelpersModule.swift +++ b/Sources/TuistLoader/Models/ProjectDescriptionHelpersModule.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// Defines a module for a project description helper. /// Project description helpers are modules which can be imported wherever "ProjectDescription" can be imported. diff --git a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift index 2b7b238ba1b..15e7d540654 100644 --- a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift +++ b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph @@ -116,7 +116,7 @@ public final class ProjectDescriptionHelpersBuilder: ProjectDescriptionHelpersBu ) throws -> ProjectDescriptionHelpersModule? { guard let tuistHelpersDirectory = helpersDirectoryLocator.locate(at: path) else { return nil } #if DEBUG - if let sourceRoot = ProcessEnv.vars["TUIST_CONFIG_SRCROOT"], + if let sourceRoot = ProcessInfo.processInfo.environment["TUIST_CONFIG_SRCROOT"], tuistHelpersDirectory.isDescendant( // swiftlint:disable:next force_try of: try! AbsolutePath(validating: sourceRoot).appending(component: Constants.tuistDirectoryName) diff --git a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderFactory.swift b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderFactory.swift index 8c16d5d2585..e748f0c0ea3 100644 --- a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderFactory.swift +++ b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderFactory.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasher.swift b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasher.swift index 4d86228ee67..17d2f2cd153 100644 --- a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasher.swift +++ b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasher.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport public protocol ProjectDescriptionHelpersHashing: AnyObject { diff --git a/Sources/TuistLoader/Protocols/GraphInitiatable.swift b/Sources/TuistLoader/Protocols/GraphInitiatable.swift index 786748d6938..6d6e9bcba1e 100644 --- a/Sources/TuistLoader/Protocols/GraphInitiatable.swift +++ b/Sources/TuistLoader/Protocols/GraphInitiatable.swift @@ -1,4 +1,5 @@ import Foundation +import Path import TSCBasic import TuistSupport @@ -15,5 +16,5 @@ protocol GraphInitiatable { /// - projectPath: Absolute path to the folder that contains the manifest. /// This is useful to obtain absolute paths from the relative paths provided in the manifest by the user. /// - Throws: A decoding error if an expected property is missing or has an invalid value. - init(dictionary: JSON, projectPath: AbsolutePath) throws + init(dictionary: JSON, projectPath: Path.AbsolutePath) throws } diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 5446d8c1c92..0efe79e743d 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -1,7 +1,7 @@ import Foundation import Mockable +import Path import ProjectDescription -import TSCBasic import TSCUtility import TuistCore import TuistSupport diff --git a/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift b/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift index 6889e39af43..fcb9a285764 100644 --- a/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift b/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift index 20b14deffd7..f290f398391 100644 --- a/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift +++ b/Sources/TuistLoader/SwiftPackageManager/SwiftPackageManagerModuleMapGenerator.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistCore import TuistSupport diff --git a/Sources/TuistLoader/Utils/HelpersDirectoryLocator.swift b/Sources/TuistLoader/Utils/HelpersDirectoryLocator.swift index 6f88d26c7eb..2bd650c5d90 100644 --- a/Sources/TuistLoader/Utils/HelpersDirectoryLocator.swift +++ b/Sources/TuistLoader/Utils/HelpersDirectoryLocator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport diff --git a/Sources/TuistLoader/Utils/ManifestFilesLocator.swift b/Sources/TuistLoader/Utils/ManifestFilesLocator.swift index 275030d3661..0bbb62375ef 100644 --- a/Sources/TuistLoader/Utils/ManifestFilesLocator.swift +++ b/Sources/TuistLoader/Utils/ManifestFilesLocator.swift @@ -1,6 +1,6 @@ import Foundation import Mockable -import TSCBasic +import Path import TuistCore import TuistSupport diff --git a/Sources/TuistLoader/Utils/ProjectDescriptionPaths.swift b/Sources/TuistLoader/Utils/ProjectDescriptionPaths.swift index 78ed322a8fc..6cd2333fc22 100644 --- a/Sources/TuistLoader/Utils/ProjectDescriptionPaths.swift +++ b/Sources/TuistLoader/Utils/ProjectDescriptionPaths.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// Project Description Paths /// diff --git a/Sources/TuistLoader/Utils/ResourceLocator.swift b/Sources/TuistLoader/Utils/ResourceLocator.swift index 3e02cc41f94..1c9bd20d84e 100644 --- a/Sources/TuistLoader/Utils/ResourceLocator.swift +++ b/Sources/TuistLoader/Utils/ResourceLocator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport public protocol ResourceLocating: AnyObject { @@ -58,7 +58,8 @@ public final class ResourceLocator: ResourceLocating { */ bundlePath.parentDirectory.appending(component: "lib"), ] - if let frameworkSearchPaths = ProcessEnv.vars["TUIST_FRAMEWORK_SEARCH_PATHS"]?.components(separatedBy: " ") + if let frameworkSearchPaths = ProcessInfo.processInfo.environment["TUIST_FRAMEWORK_SEARCH_PATHS"]? + .components(separatedBy: " ") .filter({ !$0.isEmpty }) { paths.append( diff --git a/Sources/TuistLoader/Utils/ResourceSynthesizerPathLocator.swift b/Sources/TuistLoader/Utils/ResourceSynthesizerPathLocator.swift index d7de9bf546c..1cefed97065 100644 --- a/Sources/TuistLoader/Utils/ResourceSynthesizerPathLocator.swift +++ b/Sources/TuistLoader/Utils/ResourceSynthesizerPathLocator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoader/Utils/StencilPathLocator.swift b/Sources/TuistLoader/Utils/StencilPathLocator.swift index 67795f92e36..6657875ffbf 100644 --- a/Sources/TuistLoader/Utils/StencilPathLocator.swift +++ b/Sources/TuistLoader/Utils/StencilPathLocator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift index 49045beed90..3ccfde98967 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistSupport import struct XcodeGraph.Plugins @testable import TuistLoader diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockPackageSettingsLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockPackageSettingsLoader.swift index 7891e6a64cb..b23a4dd543c 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockPackageSettingsLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockPackageSettingsLoader.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistSupport import XcodeGraph import XcodeGraphTesting diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift index a87dc4f5519..a162400c28b 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import XcodeGraph diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateLoader.swift index 2d70c927361..74116dbb7f7 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateLoader.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistLoader import XcodeGraph diff --git a/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilder.swift b/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilder.swift index b51a1764c07..c517bb82e93 100644 --- a/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilder.swift +++ b/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilder.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilderFactory.swift b/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilderFactory.swift index 0b119262102..a252b27946b 100644 --- a/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilderFactory.swift +++ b/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilderFactory.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/TuistLoaderTesting/Utils/Mocks/MockHelpersDirectoryLocator.swift b/Sources/TuistLoaderTesting/Utils/Mocks/MockHelpersDirectoryLocator.swift index 0343a32d255..24173d4c4d2 100644 --- a/Sources/TuistLoaderTesting/Utils/Mocks/MockHelpersDirectoryLocator.swift +++ b/Sources/TuistLoaderTesting/Utils/Mocks/MockHelpersDirectoryLocator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import TuistLoader public final class MockHelpersDirectoryLocator: HelpersDirectoryLocating { diff --git a/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceLocator.swift b/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceLocator.swift index 8bc29ae1a55..8ac14413d6d 100644 --- a/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceLocator.swift +++ b/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceLocator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import TuistLoader public final class MockResourceLocator: ResourceLocating { diff --git a/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceSynthesizerPathLocator.swift b/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceSynthesizerPathLocator.swift index 02514a73510..ef43e9b7bf4 100644 --- a/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceSynthesizerPathLocator.swift +++ b/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceSynthesizerPathLocator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph @testable import TuistLoader @@ -24,7 +24,7 @@ public final class MockResourceSynthesizerPathLocator: ResourceSynthesizerPathLo } public var locateStub: ((AbsolutePath) -> AbsolutePath?)? - public func locate(at: TSCBasic.AbsolutePath) -> TSCBasic.AbsolutePath? { + public func locate(at: Path.AbsolutePath) -> Path.AbsolutePath? { locateStub?(at) } } diff --git a/Sources/TuistMigration/Utilities/EmptyBuildSettingsChecker.swift b/Sources/TuistMigration/Utilities/EmptyBuildSettingsChecker.swift index 24842450ccb..404a717898c 100644 --- a/Sources/TuistMigration/Utilities/EmptyBuildSettingsChecker.swift +++ b/Sources/TuistMigration/Utilities/EmptyBuildSettingsChecker.swift @@ -1,6 +1,6 @@ import Foundation +import Path import PathKit -import TSCBasic import TuistSupport import XcodeProj diff --git a/Sources/TuistMigration/Utilities/SettingsToXCConfigExtractor.swift b/Sources/TuistMigration/Utilities/SettingsToXCConfigExtractor.swift index d22b6b5aeb1..f009afc12d5 100644 --- a/Sources/TuistMigration/Utilities/SettingsToXCConfigExtractor.swift +++ b/Sources/TuistMigration/Utilities/SettingsToXCConfigExtractor.swift @@ -1,6 +1,6 @@ import Foundation +import Path import PathKit -import TSCBasic import TuistSupport import XcodeProj diff --git a/Sources/TuistMigration/Utilities/TargetsExtractor.swift b/Sources/TuistMigration/Utilities/TargetsExtractor.swift index 62a01ac4275..850018c97d3 100644 --- a/Sources/TuistMigration/Utilities/TargetsExtractor.swift +++ b/Sources/TuistMigration/Utilities/TargetsExtractor.swift @@ -1,11 +1,11 @@ import Foundation -import PathKit +import Path import TSCBasic import TuistSupport import XcodeProj public enum TargetsExtractorError: FatalError, Equatable { - case missingXcodeProj(AbsolutePath) + case missingXcodeProj(Path.AbsolutePath) case noTargets case failedToExtractTargets(String) case failedToEncode @@ -37,7 +37,7 @@ public enum TargetsExtractorError: FatalError, Equatable { public protocol TargetsExtracting { /// - Parameters: /// - xcodeprojPath: Path to the Xcode project. - func targetsSortedByDependencies(xcodeprojPath: AbsolutePath) throws -> [TargetDependencyCount] + func targetsSortedByDependencies(xcodeprojPath: Path.AbsolutePath) throws -> [TargetDependencyCount] } public struct TargetDependencyCount: Encodable { @@ -53,9 +53,9 @@ public final class TargetsExtractor: TargetsExtracting { // MARK: - EmptyBuildSettingsChecking - public func targetsSortedByDependencies(xcodeprojPath: AbsolutePath) throws -> [TargetDependencyCount] { + public func targetsSortedByDependencies(xcodeprojPath: Path.AbsolutePath) throws -> [TargetDependencyCount] { guard FileHandler.shared.exists(xcodeprojPath) else { throw TargetsExtractorError.missingXcodeProj(xcodeprojPath) } - let pbxproj = try XcodeProj(path: Path(xcodeprojPath.pathString)).pbxproj + let pbxproj = try XcodeProj(pathString: xcodeprojPath.pathString).pbxproj let targets = pbxproj.nativeTargets + pbxproj.aggregateTargets + pbxproj.legacyTargets if targets.isEmpty { throw TargetsExtractorError.noTargets diff --git a/Sources/TuistMigrationTesting/Utilities/MockEmptyBuildSettingsChecker.swift b/Sources/TuistMigrationTesting/Utilities/MockEmptyBuildSettingsChecker.swift index 806780bbc17..4a1c1dd62a5 100644 --- a/Sources/TuistMigrationTesting/Utilities/MockEmptyBuildSettingsChecker.swift +++ b/Sources/TuistMigrationTesting/Utilities/MockEmptyBuildSettingsChecker.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistMigration public class MockEmptyBuildSettingsChecker: EmptyBuildSettingsChecking { diff --git a/Sources/TuistPlugin/PluginService.swift b/Sources/TuistPlugin/PluginService.swift index af8350d1096..d28f2755eb2 100644 --- a/Sources/TuistPlugin/PluginService.swift +++ b/Sources/TuistPlugin/PluginService.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistLoader import TuistScaffold diff --git a/Sources/TuistScaffold/TemplateGenerator.swift b/Sources/TuistScaffold/TemplateGenerator.swift index cf867a21b0c..c2dbaf1e804 100644 --- a/Sources/TuistScaffold/TemplateGenerator.swift +++ b/Sources/TuistScaffold/TemplateGenerator.swift @@ -1,7 +1,7 @@ import Foundation +import Path import PathKit import StencilSwiftKit -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Sources/TuistScaffold/TemplatesDirectoryLocator.swift b/Sources/TuistScaffold/TemplatesDirectoryLocator.swift index 5d5ac7c1221..bf9322d1ee9 100644 --- a/Sources/TuistScaffold/TemplatesDirectoryLocator.swift +++ b/Sources/TuistScaffold/TemplatesDirectoryLocator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport @@ -32,7 +32,7 @@ public final class TemplatesDirectoryLocator: TemplatesDirectoryLocating { public func locateTuistTemplates() -> AbsolutePath? { #if DEBUG let maybeBundlePath: AbsolutePath? - if let sourceRoot = ProcessEnv.vars["TUIST_CONFIG_SRCROOT"] { + if let sourceRoot = ProcessInfo.processInfo.environment["TUIST_CONFIG_SRCROOT"] { maybeBundlePath = try? AbsolutePath(validating: sourceRoot).appending(component: "Templates") } else { // Used only for debug purposes to find templates in your tuist working directory diff --git a/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplateGenerator.swift b/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplateGenerator.swift index d68fbcddad3..960d8a5336d 100644 --- a/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplateGenerator.swift +++ b/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplateGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph @testable import TuistCore diff --git a/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplatesDirectoryLocator.swift b/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplatesDirectoryLocator.swift index 8a897c273b5..60ec2db63fb 100644 --- a/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplatesDirectoryLocator.swift +++ b/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplatesDirectoryLocator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import TuistScaffold public final class MockTemplatesDirectoryLocator: TemplatesDirectoryLocating { diff --git a/Sources/TuistServer/Cache/CacheStoring.swift b/Sources/TuistServer/Cache/CacheStoring.swift index 7341d7acc07..ceb6c90346f 100644 --- a/Sources/TuistServer/Cache/CacheStoring.swift +++ b/Sources/TuistServer/Cache/CacheStoring.swift @@ -1,6 +1,6 @@ import Foundation import Mockable -import TSCBasic +import Path import TuistCore import XcodeGraph diff --git a/Sources/TuistServer/Cache/EmptyCacheStorage.swift b/Sources/TuistServer/Cache/EmptyCacheStorage.swift index 95dbd52b167..717682c651e 100644 --- a/Sources/TuistServer/Cache/EmptyCacheStorage.swift +++ b/Sources/TuistServer/Cache/EmptyCacheStorage.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore /// Empty `CacheStoring` implementation as we noop cache storing in the opensource repository diff --git a/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift b/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift index a3639cf8a40..e17c858a280 100644 --- a/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift +++ b/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift @@ -1,6 +1,6 @@ import Foundation import Mockable -import TSCBasic +import Path import TuistSupport @Mockable diff --git a/Sources/TuistServer/Services/MultipartUploadArtifactService.swift b/Sources/TuistServer/Services/MultipartUploadArtifactService.swift index 889d408be2c..a0ce25ef3d8 100644 --- a/Sources/TuistServer/Services/MultipartUploadArtifactService.swift +++ b/Sources/TuistServer/Services/MultipartUploadArtifactService.swift @@ -1,6 +1,6 @@ import Foundation import Mockable -import TSCBasic +import Path import TuistSupport enum MultipartUploadArtifactServiceError: FatalError { diff --git a/Sources/TuistServer/Utilities/CloudCredentialsStore.swift b/Sources/TuistServer/Utilities/CloudCredentialsStore.swift index 4f075602c54..516a492585b 100644 --- a/Sources/TuistServer/Utilities/CloudCredentialsStore.swift +++ b/Sources/TuistServer/Utilities/CloudCredentialsStore.swift @@ -1,6 +1,6 @@ import Foundation import Mockable -import TSCBasic +import Path import TuistSupport public struct CloudCredentials: Codable, Equatable { diff --git a/Sources/TuistServer/Utilities/XCResultToolController.swift b/Sources/TuistServer/Utilities/XCResultToolController.swift index fe0011c91cf..121946c78e7 100644 --- a/Sources/TuistServer/Utilities/XCResultToolController.swift +++ b/Sources/TuistServer/Utilities/XCResultToolController.swift @@ -1,5 +1,5 @@ import Mockable -import TSCBasic +import Path import TuistSupport @Mockable diff --git a/Sources/TuistSupport/CoreDataVersionExtractor.swift b/Sources/TuistSupport/CoreDataVersionExtractor.swift index a0450676021..0076edc04e8 100644 --- a/Sources/TuistSupport/CoreDataVersionExtractor.swift +++ b/Sources/TuistSupport/CoreDataVersionExtractor.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// Extract version from .xccurrentversion file. public enum CoreDataVersionExtractor { diff --git a/Sources/TuistSupport/Extensions/AbsolutePath+Extras.swift b/Sources/TuistSupport/Extensions/AbsolutePath+Extras.swift index 7283fde0973..0727600b185 100644 --- a/Sources/TuistSupport/Extensions/AbsolutePath+Extras.swift +++ b/Sources/TuistSupport/Extensions/AbsolutePath+Extras.swift @@ -1,6 +1,6 @@ import Darwin import Foundation -import TSCBasic +import Path import UniformTypeIdentifiers let systemGlob = Darwin.glob diff --git a/Sources/TuistSupport/Extensions/TSCBasic+Extras.swift b/Sources/TuistSupport/Extensions/TSCBasic+Extras.swift index eb3a6a734c1..b1cbf15914c 100644 --- a/Sources/TuistSupport/Extensions/TSCBasic+Extras.swift +++ b/Sources/TuistSupport/Extensions/TSCBasic+Extras.swift @@ -1,9 +1,10 @@ +import Path import TSCBasic -public func withTemporaryDirectories(body: (AbsolutePath, AbsolutePath) throws -> Result) throws -> Result { +public func withTemporaryDirectories(body: (Path.AbsolutePath, Path.AbsolutePath) throws -> Result) throws -> Result { try withTemporaryDirectory { tempDirOne in try withTemporaryDirectory { tempDirTwo in - try body(tempDirOne, tempDirTwo) + try body(.init(validating: tempDirOne.pathString), .init(validating: tempDirTwo.pathString)) } } } diff --git a/Sources/TuistSupport/HTTP/FileClient.swift b/Sources/TuistSupport/HTTP/FileClient.swift index 8ff9f14b81f..99d0e55d1b3 100644 --- a/Sources/TuistSupport/HTTP/FileClient.swift +++ b/Sources/TuistSupport/HTTP/FileClient.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path enum FileClientError: LocalizedError, FatalError { case urlSessionError(URLRequest, Error, AbsolutePath?) diff --git a/Sources/TuistSupport/Logging/FileLogger.swift b/Sources/TuistSupport/Logging/FileLogger.swift index 03c83106ff4..02e469dd10c 100644 --- a/Sources/TuistSupport/Logging/FileLogger.swift +++ b/Sources/TuistSupport/Logging/FileLogger.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public struct FileLogger: TextOutputStream { enum FileHandlerOutputStream: Error { diff --git a/Sources/TuistSupport/Models/InvalidGlob.swift b/Sources/TuistSupport/Models/InvalidGlob.swift index dbba010ab91..216c723d122 100644 --- a/Sources/TuistSupport/Models/InvalidGlob.swift +++ b/Sources/TuistSupport/Models/InvalidGlob.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path /// A structs that represents an invalid glob pattern. public struct InvalidGlob: Equatable, CustomStringConvertible, Sendable { diff --git a/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift b/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift index f17e0e2661a..190f6e22ed0 100644 --- a/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift +++ b/Sources/TuistSupport/SwiftPackageManager/PackageInfo.swift @@ -1,5 +1,5 @@ +import Path import ProjectDescription -import TSCBasic import TSCUtility // MARK: - PackageInfo diff --git a/Sources/TuistSupport/SwiftPackageManager/SwiftPackageManagerController.swift b/Sources/TuistSupport/SwiftPackageManager/SwiftPackageManagerController.swift index b5558d73aab..00a9ae517d8 100644 --- a/Sources/TuistSupport/SwiftPackageManager/SwiftPackageManagerController.swift +++ b/Sources/TuistSupport/SwiftPackageManager/SwiftPackageManagerController.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility /// Protocol that defines an interface to interact with the Swift Package Manager. diff --git a/Sources/TuistSupport/System/System.swift b/Sources/TuistSupport/System/System.swift index a83488f557d..b7a7ce68a14 100644 --- a/Sources/TuistSupport/System/System.swift +++ b/Sources/TuistSupport/System/System.swift @@ -1,4 +1,5 @@ import Foundation +import Path import TSCBasic extension ProcessResult { @@ -213,10 +214,10 @@ public final class System: Systeming { public func chmod( _ mode: FileMode, - path: AbsolutePath, + path: Path.AbsolutePath, options: Set ) throws { - try localFileSystem.chmod(mode, path: path, options: options) + try localFileSystem.chmod(mode, path: .init(validating: path.pathString), options: options) } public func run( diff --git a/Sources/TuistSupport/System/Systeming.swift b/Sources/TuistSupport/System/Systeming.swift index ba686be9250..568bd395c36 100644 --- a/Sources/TuistSupport/System/Systeming.swift +++ b/Sources/TuistSupport/System/Systeming.swift @@ -1,4 +1,5 @@ import Foundation +import Path import TSCBasic public protocol Systeming { @@ -97,7 +98,7 @@ public protocol Systeming { /// - mode: Defines user file mode. /// - path: Path of file for which the permissions should be changed. /// - options: Options for changing permissions. - func chmod(_ mode: FileMode, path: AbsolutePath, options: Set) throws + func chmod(_ mode: FileMode, path: Path.AbsolutePath, options: Set) throws } extension Systeming { diff --git a/Sources/TuistSupport/Utils/DerivedDataLocator.swift b/Sources/TuistSupport/Utils/DerivedDataLocator.swift index edf0cd7b1c4..b7d4c12c76c 100644 --- a/Sources/TuistSupport/Utils/DerivedDataLocator.swift +++ b/Sources/TuistSupport/Utils/DerivedDataLocator.swift @@ -1,6 +1,6 @@ import CryptoKit import Foundation -import TSCBasic +import Path public protocol DerivedDataLocating { func locate( diff --git a/Sources/TuistSupport/Utils/DeveloperEnvironment.swift b/Sources/TuistSupport/Utils/DeveloperEnvironment.swift index 2cb5d0d9b66..c73438b7282 100644 --- a/Sources/TuistSupport/Utils/DeveloperEnvironment.swift +++ b/Sources/TuistSupport/Utils/DeveloperEnvironment.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public protocol DeveloperEnvironmenting { /// Returns the derived data directory selected in the environment. diff --git a/Sources/TuistSupport/Utils/Environment.swift b/Sources/TuistSupport/Utils/Environment.swift index 9ed84db4dc0..9c3c5db0f1e 100644 --- a/Sources/TuistSupport/Utils/Environment.swift +++ b/Sources/TuistSupport/Utils/Environment.swift @@ -1,6 +1,6 @@ import Darwin import Foundation -import TSCBasic +import Path /// Protocol that defines the interface of a local environment controller. /// It manages the local directory where tuistenv stores the tuist versions and user settings. diff --git a/Sources/TuistSupport/Utils/FileArchiver.swift b/Sources/TuistSupport/Utils/FileArchiver.swift index 8bf949dc15c..85b9af3f476 100644 --- a/Sources/TuistSupport/Utils/FileArchiver.swift +++ b/Sources/TuistSupport/Utils/FileArchiver.swift @@ -1,6 +1,6 @@ import Foundation import Mockable -import TSCBasic +import Path /// An interface to archive files in a zip file. @Mockable diff --git a/Sources/TuistSupport/Utils/FileArchivingFactory.swift b/Sources/TuistSupport/Utils/FileArchivingFactory.swift index 5686078592b..fdc5d027a15 100644 --- a/Sources/TuistSupport/Utils/FileArchivingFactory.swift +++ b/Sources/TuistSupport/Utils/FileArchivingFactory.swift @@ -1,5 +1,5 @@ import Mockable -import TSCBasic +import Path /// An interface that defines a factory of archiver and unarchivers. @Mockable diff --git a/Sources/TuistSupport/Utils/FileHandler.swift b/Sources/TuistSupport/Utils/FileHandler.swift index da95f1ce584..c6ed0733ef4 100644 --- a/Sources/TuistSupport/Utils/FileHandler.swift +++ b/Sources/TuistSupport/Utils/FileHandler.swift @@ -1,15 +1,16 @@ import CryptoKit import Foundation +import Path import TSCBasic import ZIPFoundation public enum FileHandlerError: FatalError, Equatable { - case invalidTextEncoding(AbsolutePath) - case writingError(AbsolutePath) - case fileNotFound(AbsolutePath) - case unreachableFileSize(AbsolutePath) - case expectedAFile(AbsolutePath) - case propertyListDecodeError(AbsolutePath, description: String) + case invalidTextEncoding(Path.AbsolutePath) + case writingError(Path.AbsolutePath) + case fileNotFound(Path.AbsolutePath) + case unreachableFileSize(Path.AbsolutePath) + case expectedAFile(Path.AbsolutePath) + case propertyListDecodeError(Path.AbsolutePath, description: String) public var description: String { switch self { @@ -42,46 +43,46 @@ public enum FileHandlerError: FatalError, Equatable { /// methods to interact with the system files and folders. public protocol FileHandling: AnyObject { /// Returns the current path. - var currentPath: AbsolutePath { get } + var currentPath: Path.AbsolutePath { get } /// Returns `AbsolutePath` to home directory - var homeDirectory: AbsolutePath { get } - - func replace(_ to: AbsolutePath, with: AbsolutePath) throws - func exists(_ path: AbsolutePath) -> Bool - func move(from: AbsolutePath, to: AbsolutePath) throws - func copy(from: AbsolutePath, to: AbsolutePath) throws - func readFile(_ at: AbsolutePath) throws -> Data - func readTextFile(_ at: AbsolutePath) throws -> String - func readPlistFile(_ at: AbsolutePath) throws -> T + var homeDirectory: Path.AbsolutePath { get } + + func replace(_ to: Path.AbsolutePath, with: Path.AbsolutePath) throws + func exists(_ path: Path.AbsolutePath) -> Bool + func move(from: Path.AbsolutePath, to: Path.AbsolutePath) throws + func copy(from: Path.AbsolutePath, to: Path.AbsolutePath) throws + func readFile(_ at: Path.AbsolutePath) throws -> Data + func readTextFile(_ at: Path.AbsolutePath) throws -> String + func readPlistFile(_ at: Path.AbsolutePath) throws -> T /// Determine temporary directory either default for user or specified by ENV variable - func determineTemporaryDirectory() throws -> AbsolutePath - func temporaryDirectory() throws -> AbsolutePath - func inTemporaryDirectory(_ closure: @escaping (AbsolutePath) async throws -> Void) async throws - func inTemporaryDirectory(_ closure: (AbsolutePath) throws -> Void) throws - func inTemporaryDirectory(removeOnCompletion: Bool, _ closure: (AbsolutePath) throws -> Void) throws - func inTemporaryDirectory(_ closure: (AbsolutePath) throws -> Result) throws -> Result - func inTemporaryDirectory(removeOnCompletion: Bool, _ closure: (AbsolutePath) throws -> Result) throws -> Result - func write(_ content: String, path: AbsolutePath, atomically: Bool) throws - func locateDirectoryTraversingParents(from: AbsolutePath, path: String) -> AbsolutePath? - func locateDirectory(_ path: String, traversingFrom from: AbsolutePath) throws -> AbsolutePath? - func files(in path: AbsolutePath, nameFilter: Set?, extensionFilter: Set?) -> Set - func glob(_ path: AbsolutePath, glob: String) -> [AbsolutePath] - func throwingGlob(_ path: AbsolutePath, glob: String) throws -> [AbsolutePath] - func linkFile(atPath: AbsolutePath, toPath: AbsolutePath) throws - func createFolder(_ path: AbsolutePath) throws - func delete(_ path: AbsolutePath) throws - func isFolder(_ path: AbsolutePath) -> Bool - func touch(_ path: AbsolutePath) throws - func contentsOfDirectory(_ path: AbsolutePath) throws -> [AbsolutePath] - func urlSafeBase64MD5(path: AbsolutePath) throws -> String - func fileSize(path: AbsolutePath) throws -> UInt64 - func changeExtension(path: AbsolutePath, to newExtension: String) throws -> AbsolutePath - func resolveSymlinks(_ path: AbsolutePath) throws -> AbsolutePath - func fileAttributes(at path: AbsolutePath) throws -> [FileAttributeKey: Any] - func filesAndDirectoriesContained(in path: AbsolutePath) throws -> [AbsolutePath]? - func zipItem(at sourcePath: AbsolutePath, to destinationPath: AbsolutePath) throws - func unzipItem(at sourcePath: AbsolutePath, to destinationPath: AbsolutePath) throws + func determineTemporaryDirectory() throws -> Path.AbsolutePath + func temporaryDirectory() throws -> Path.AbsolutePath + func inTemporaryDirectory(_ closure: @escaping (Path.AbsolutePath) async throws -> Void) async throws + func inTemporaryDirectory(_ closure: (Path.AbsolutePath) throws -> Void) throws + func inTemporaryDirectory(removeOnCompletion: Bool, _ closure: (Path.AbsolutePath) throws -> Void) throws + func inTemporaryDirectory(_ closure: (Path.AbsolutePath) throws -> Result) throws -> Result + func inTemporaryDirectory(removeOnCompletion: Bool, _ closure: (Path.AbsolutePath) throws -> Result) throws -> Result + func write(_ content: String, path: Path.AbsolutePath, atomically: Bool) throws + func locateDirectoryTraversingParents(from: Path.AbsolutePath, path: String) -> Path.AbsolutePath? + func locateDirectory(_ path: String, traversingFrom from: Path.AbsolutePath) throws -> Path.AbsolutePath? + func files(in path: Path.AbsolutePath, nameFilter: Set?, extensionFilter: Set?) -> Set + func glob(_ path: Path.AbsolutePath, glob: String) -> [Path.AbsolutePath] + func throwingGlob(_ path: Path.AbsolutePath, glob: String) throws -> [Path.AbsolutePath] + func linkFile(atPath: Path.AbsolutePath, toPath: Path.AbsolutePath) throws + func createFolder(_ path: Path.AbsolutePath) throws + func delete(_ path: Path.AbsolutePath) throws + func isFolder(_ path: Path.AbsolutePath) -> Bool + func touch(_ path: Path.AbsolutePath) throws + func contentsOfDirectory(_ path: Path.AbsolutePath) throws -> [Path.AbsolutePath] + func urlSafeBase64MD5(path: Path.AbsolutePath) throws -> String + func fileSize(path: Path.AbsolutePath) throws -> UInt64 + func changeExtension(path: Path.AbsolutePath, to newExtension: String) throws -> Path.AbsolutePath + func resolveSymlinks(_ path: Path.AbsolutePath) throws -> Path.AbsolutePath + func fileAttributes(at path: Path.AbsolutePath) throws -> [FileAttributeKey: Any] + func filesAndDirectoriesContained(in path: Path.AbsolutePath) throws -> [Path.AbsolutePath]? + func zipItem(at sourcePath: Path.AbsolutePath, to destinationPath: Path.AbsolutePath) throws + func unzipItem(at sourcePath: Path.AbsolutePath, to destinationPath: Path.AbsolutePath) throws } public class FileHandler: FileHandling { @@ -98,15 +99,15 @@ public class FileHandler: FileHandling { self.fileManager = fileManager } - public var currentPath: AbsolutePath { + public var currentPath: Path.AbsolutePath { try! AbsolutePath(validating: fileManager.currentDirectoryPath) // swiftlint:disable:this force_try } - public var homeDirectory: AbsolutePath { + public var homeDirectory: Path.AbsolutePath { try! AbsolutePath(validating: NSHomeDirectory()) // swiftlint:disable:this force_try } - public func replace(_ to: AbsolutePath, with: AbsolutePath) throws { + public func replace(_ to: Path.AbsolutePath, with: Path.AbsolutePath) throws { // To support cases where the destination is on a different volume // we need to create a temporary directory that is suitable // for performing a `replaceItemAt` @@ -127,57 +128,65 @@ public class FileHandler: FileHandling { _ = try fileManager.replaceItemAt(to.url, withItemAt: tempUrl) } - public func temporaryDirectory() throws -> AbsolutePath { + public func temporaryDirectory() throws -> Path.AbsolutePath { let directory = try TemporaryDirectory(removeTreeOnDeinit: false) return directory.path } - public func determineTemporaryDirectory() throws -> AbsolutePath { - try determineTempDirectory() + public func determineTemporaryDirectory() throws -> Path.AbsolutePath { + try .init(validating: determineTempDirectory().pathString) } - public func inTemporaryDirectory(_ closure: (AbsolutePath) throws -> Result) throws -> Result { - try withTemporaryDirectory(removeTreeOnDeinit: true, closure) + public func inTemporaryDirectory(_ closure: (Path.AbsolutePath) throws -> Result) throws -> Result { + try withTemporaryDirectory(removeTreeOnDeinit: true) { path in + try closure(.init(validating: path.pathString)) + } } - public func inTemporaryDirectory(removeOnCompletion: Bool, _ closure: (AbsolutePath) throws -> Void) throws { - try withTemporaryDirectory(removeTreeOnDeinit: removeOnCompletion, closure) + public func inTemporaryDirectory(removeOnCompletion: Bool, _ closure: (Path.AbsolutePath) throws -> Void) throws { + try withTemporaryDirectory(removeTreeOnDeinit: removeOnCompletion) { path in + try closure(.init(validating: path.pathString)) + } } - public func inTemporaryDirectory(_ closure: (AbsolutePath) throws -> Void) throws { - try withTemporaryDirectory(removeTreeOnDeinit: true, closure) + public func inTemporaryDirectory(_ closure: (Path.AbsolutePath) throws -> Void) throws { + try withTemporaryDirectory(removeTreeOnDeinit: true) { path in + try closure(.init(validating: path.pathString)) + } } - public func inTemporaryDirectory(_ closure: @escaping (AbsolutePath) async throws -> Void) async throws { + public func inTemporaryDirectory(_ closure: @escaping (Path.AbsolutePath) async throws -> Void) async throws { let directory = try TemporaryDirectory(removeTreeOnDeinit: true) try await closure(directory.path) } public func inTemporaryDirectory( removeOnCompletion: Bool, - _ closure: (AbsolutePath) throws -> Result + _ closure: (Path.AbsolutePath) throws -> Result ) throws -> Result { - try withTemporaryDirectory(removeTreeOnDeinit: removeOnCompletion, closure) + try withTemporaryDirectory(removeTreeOnDeinit: removeOnCompletion) { path in + try closure(try .init(validating: path.pathString)) + } } - public func exists(_ path: AbsolutePath) -> Bool { + public func exists(_ path: Path.AbsolutePath) -> Bool { let exists = fileManager.fileExists(atPath: path.pathString) return exists } - public func copy(from: AbsolutePath, to: AbsolutePath) throws { + public func copy(from: Path.AbsolutePath, to: Path.AbsolutePath) throws { try fileManager.copyItem(atPath: from.pathString, toPath: to.pathString) } - public func move(from: AbsolutePath, to: AbsolutePath) throws { + public func move(from: Path.AbsolutePath, to: Path.AbsolutePath) throws { try fileManager.moveItem(atPath: from.pathString, toPath: to.pathString) } - public func readFile(_ at: AbsolutePath) throws -> Data { + public func readFile(_ at: Path.AbsolutePath) throws -> Data { return try Data(contentsOf: at.url) } - public func readTextFile(_ at: AbsolutePath) throws -> String { + public func readTextFile(_ at: Path.AbsolutePath) throws -> String { let data = try Data(contentsOf: at.url) if let content = String(data: data, encoding: .utf8) { return content @@ -186,7 +195,7 @@ public class FileHandler: FileHandling { } } - public func readPlistFile(_ at: AbsolutePath) throws -> T { + public func readPlistFile(_ at: Path.AbsolutePath) throws -> T { guard let data = fileManager.contents(atPath: at.pathString) else { throw FileHandlerError.fileNotFound(at) } @@ -201,17 +210,17 @@ public class FileHandler: FileHandling { } } - public func linkFile(atPath: AbsolutePath, toPath: AbsolutePath) throws { + public func linkFile(atPath: Path.AbsolutePath, toPath: Path.AbsolutePath) throws { try fileManager.linkItem(atPath: atPath.pathString, toPath: toPath.pathString) } - public func write(_ content: String, path: AbsolutePath, atomically: Bool) throws { + public func write(_ content: String, path: Path.AbsolutePath, atomically: Bool) throws { do { try content.write(to: path.url, atomically: atomically, encoding: .utf8) } catch {} } - public func locateDirectory(_ path: String, traversingFrom from: AbsolutePath) throws -> AbsolutePath? { + public func locateDirectory(_ path: String, traversingFrom from: Path.AbsolutePath) throws -> Path.AbsolutePath? { let extendedPath = from.appending(try RelativePath(validating: path)) if exists(extendedPath) { return extendedPath @@ -223,11 +232,11 @@ public class FileHandler: FileHandling { } public func files( - in path: AbsolutePath, + in path: Path.AbsolutePath, nameFilter: Set?, extensionFilter: Set? - ) -> Set { - var results = Set() + ) -> Set { + var results = Set() let enumerator = fileManager.enumerator( at: path.url, @@ -262,15 +271,15 @@ public class FileHandler: FileHandling { return results } - public func glob(_ path: AbsolutePath, glob: String) -> [AbsolutePath] { + public func glob(_ path: Path.AbsolutePath, glob: String) -> [Path.AbsolutePath] { path.glob(glob) } - public func throwingGlob(_ path: AbsolutePath, glob: String) throws -> [AbsolutePath] { + public func throwingGlob(_ path: Path.AbsolutePath, glob: String) throws -> [Path.AbsolutePath] { try path.throwingGlob(glob) } - public func createFolder(_ path: AbsolutePath) throws { + public func createFolder(_ path: Path.AbsolutePath) throws { try fileManager.createDirectory( at: path.url, withIntermediateDirectories: true, @@ -278,13 +287,13 @@ public class FileHandler: FileHandling { ) } - public func delete(_ path: AbsolutePath) throws { + public func delete(_ path: Path.AbsolutePath) throws { if exists(path) { try fileManager.removeItem(atPath: path.pathString) } } - public func touch(_ path: AbsolutePath) throws { + public func touch(_ path: Path.AbsolutePath) throws { try fileManager.createDirectory( at: path.removingLastComponent().url, withIntermediateDirectories: true, @@ -293,16 +302,16 @@ public class FileHandler: FileHandling { try Data().write(to: path.url) } - public func isFolder(_ path: AbsolutePath) -> Bool { + public func isFolder(_ path: Path.AbsolutePath) -> Bool { var isDirectory = ObjCBool(true) let exists = fileManager.fileExists(atPath: path.pathString, isDirectory: &isDirectory) return exists && isDirectory.boolValue } - public func locateDirectoryTraversingParents(from: AbsolutePath, path: String) -> AbsolutePath? { + public func locateDirectoryTraversingParents(from: Path.AbsolutePath, path: String) -> Path.AbsolutePath? { let configPath = from.appending(component: path) - let root = try! AbsolutePath(validating: "/") // swiftlint:disable:this force_try + let root = try! Path.AbsolutePath(validating: "/") // swiftlint:disable:this force_try if FileHandler.shared.exists(configPath) { return configPath } else if from == root { @@ -312,29 +321,29 @@ public class FileHandler: FileHandling { } } - public func contentsOfDirectory(_ path: AbsolutePath) throws -> [AbsolutePath] { + public func contentsOfDirectory(_ path: Path.AbsolutePath) throws -> [Path.AbsolutePath] { try fileManager.contentsOfDirectory(atPath: path.pathString).map { try AbsolutePath(validating: $0, relativeTo: path) } } - public func createSymbolicLink(at path: AbsolutePath, destination: AbsolutePath) throws { + public func createSymbolicLink(at path: Path.AbsolutePath, destination: Path.AbsolutePath) throws { try fileManager.createSymbolicLink(atPath: path.pathString, withDestinationPath: destination.pathString) } - public func resolveSymlinks(_ path: AbsolutePath) throws -> AbsolutePath { - try TSCBasic.resolveSymlinks(path) + public func resolveSymlinks(_ path: Path.AbsolutePath) throws -> Path.AbsolutePath { + try .init(validating: TSCBasic.resolveSymlinks(.init(validating: path.pathString)).pathString) } - public func fileAttributes(at path: AbsolutePath) throws -> [FileAttributeKey: Any] { + public func fileAttributes(at path: Path.AbsolutePath) throws -> [FileAttributeKey: Any] { try fileManager.attributesOfItem(atPath: path.pathString) } - public func filesAndDirectoriesContained(in path: AbsolutePath) throws -> [AbsolutePath]? { + public func filesAndDirectoriesContained(in path: Path.AbsolutePath) throws -> [Path.AbsolutePath]? { try fileManager.subpaths(atPath: path.pathString)?.map { path.appending(try RelativePath(validating: $0)) } } // MARK: - MD5 - public func urlSafeBase64MD5(path: AbsolutePath) throws -> String { + public func urlSafeBase64MD5(path: Path.AbsolutePath) throws -> String { let data = try Data(contentsOf: path.url) let digestData = Data(Insecure.MD5.hash(data: data)) return digestData.base64EncodedString() @@ -344,7 +353,7 @@ public class FileHandler: FileHandling { // MARK: - File Attributes - public func fileSize(path: AbsolutePath) throws -> UInt64 { + public func fileSize(path: Path.AbsolutePath) throws -> UInt64 { let attr = try fileManager.attributesOfItem(atPath: path.pathString) guard let size = attr[FileAttributeKey.size] as? UInt64 else { throw FileHandlerError.unreachableFileSize(path) } return size @@ -352,7 +361,7 @@ public class FileHandler: FileHandling { // MARK: - Extension - public func changeExtension(path: AbsolutePath, to fileExtension: String) throws -> AbsolutePath { + public func changeExtension(path: Path.AbsolutePath, to fileExtension: String) throws -> Path.AbsolutePath { guard isFolder(path) == false else { throw FileHandlerError.expectedAFile(path) } let sanitizedExtension = fileExtension.starts(with: ".") ? String(fileExtension.dropFirst()) : fileExtension guard path.extension != sanitizedExtension else { return path } @@ -362,11 +371,18 @@ public class FileHandler: FileHandling { return newPath } - public func zipItem(at sourcePath: AbsolutePath, to destinationPath: AbsolutePath) throws { - try fileManager.zipItem(at: sourcePath.asURL, to: destinationPath.asURL, shouldKeepParent: false) + public func zipItem(at sourcePath: Path.AbsolutePath, to destinationPath: Path.AbsolutePath) throws { + try fileManager.zipItem( + at: URL(fileURLWithPath: sourcePath.pathString), + to: URL(fileURLWithPath: destinationPath.pathString), + shouldKeepParent: false + ) } - public func unzipItem(at sourcePath: AbsolutePath, to destinationPath: AbsolutePath) throws { - try fileManager.unzipItem(at: sourcePath.asURL, to: destinationPath.asURL) + public func unzipItem(at sourcePath: Path.AbsolutePath, to destinationPath: Path.AbsolutePath) throws { + try fileManager.unzipItem( + at: URL(fileURLWithPath: sourcePath.pathString), + to: URL(fileURLWithPath: destinationPath.pathString) + ) } } diff --git a/Sources/TuistSupport/Utils/FileUnarchiver.swift b/Sources/TuistSupport/Utils/FileUnarchiver.swift index 40adc0f1f39..53b64cfd7e2 100644 --- a/Sources/TuistSupport/Utils/FileUnarchiver.swift +++ b/Sources/TuistSupport/Utils/FileUnarchiver.swift @@ -1,6 +1,6 @@ import Foundation import Mockable -import TSCBasic +import Path @Mockable public protocol FileUnarchiving { diff --git a/Sources/TuistSupport/Utils/GitHandler.swift b/Sources/TuistSupport/Utils/GitHandler.swift index dd84b7512bb..b2d932b381f 100644 --- a/Sources/TuistSupport/Utils/GitHandler.swift +++ b/Sources/TuistSupport/Utils/GitHandler.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility public protocol GitHandling { diff --git a/Sources/TuistSupport/Utils/Opener.swift b/Sources/TuistSupport/Utils/Opener.swift index ea02cffdc7e..314ba0a507a 100644 --- a/Sources/TuistSupport/Utils/Opener.swift +++ b/Sources/TuistSupport/Utils/Opener.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path enum OpeningError: FatalError, Equatable { case notFound(AbsolutePath) diff --git a/Sources/TuistSupport/Utils/TemporaryDirectory.swift b/Sources/TuistSupport/Utils/TemporaryDirectory.swift index 0f71362ba5a..eefa5f20248 100644 --- a/Sources/TuistSupport/Utils/TemporaryDirectory.swift +++ b/Sources/TuistSupport/Utils/TemporaryDirectory.swift @@ -1,4 +1,5 @@ import Foundation +import Path import TSCBasic import TSCLibc @@ -8,7 +9,7 @@ public final class TemporaryDirectory { let prefix: String /// The full path of the temporary directory. - public let path: AbsolutePath + public let path: Path.AbsolutePath /// If true, try to remove the whole directory tree before deallocating. let shouldRemoveTreeOnDeinit: Bool @@ -24,14 +25,15 @@ public final class TemporaryDirectory { /// /// - Throws: MakeDirectoryError public init( - dir: AbsolutePath? = nil, + dir: Path.AbsolutePath? = nil, prefix: String = "TemporaryDirectory", removeTreeOnDeinit: Bool = false ) throws { shouldRemoveTreeOnDeinit = removeTreeOnDeinit self.prefix = prefix // Construct path to the temporary directory. - let path = try determineTempDirectory(dir).appending(try RelativePath(validating: prefix + ".XXXXXX")) + let path = try determineTempDirectory(dir.map { try .init(validating: $0.pathString) }) + .appending(try RelativePath(validating: prefix + ".XXXXXX")) // Convert path to a C style string terminating with null char to be an valid input // to mkdtemp method. The XXXXXX in this string will be replaced by a random string @@ -42,7 +44,7 @@ public final class TemporaryDirectory { throw MakeDirectoryError.other(errno) } - self.path = try AbsolutePath(validating: String(cString: template)) + self.path = try Path.AbsolutePath(validating: String(cString: template)) } /// Remove the temporary file before deallocating. diff --git a/Sources/TuistSupport/Xcode/Xcode.swift b/Sources/TuistSupport/Xcode/Xcode.swift index 04ee58324ad..92aa8f82f0d 100644 --- a/Sources/TuistSupport/Xcode/Xcode.swift +++ b/Sources/TuistSupport/Xcode/Xcode.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public enum XcodeError: FatalError, Equatable { case infoPlistNotFound(AbsolutePath) diff --git a/Sources/TuistSupport/Xcode/XcodeController.swift b/Sources/TuistSupport/Xcode/XcodeController.swift index 3ce5d1cb19b..0dc53524a14 100644 --- a/Sources/TuistSupport/Xcode/XcodeController.swift +++ b/Sources/TuistSupport/Xcode/XcodeController.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility public protocol XcodeControlling: Sendable { diff --git a/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift b/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift index e3cd0a2e931..22dfe313c65 100644 --- a/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift +++ b/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Sources/TuistSupportTesting/HTTP/MockFileClient.swift b/Sources/TuistSupportTesting/HTTP/MockFileClient.swift index a25bd0f8a28..02c8be98dd2 100644 --- a/Sources/TuistSupportTesting/HTTP/MockFileClient.swift +++ b/Sources/TuistSupportTesting/HTTP/MockFileClient.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport // swiftlint:disable large_tuple diff --git a/Sources/TuistSupportTesting/SwiftPackageManager/MockSwiftPackageManagerController.swift b/Sources/TuistSupportTesting/SwiftPackageManager/MockSwiftPackageManagerController.swift index 30f6cd2e995..37b847b77bd 100644 --- a/Sources/TuistSupportTesting/SwiftPackageManager/MockSwiftPackageManagerController.swift +++ b/Sources/TuistSupportTesting/SwiftPackageManager/MockSwiftPackageManagerController.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TSCUtility @testable import TuistSupport diff --git a/Sources/TuistSupportTesting/SwiftPackageManager/PackageInfo+TestData.swift b/Sources/TuistSupportTesting/SwiftPackageManager/PackageInfo+TestData.swift index fba45ecc209..0acb567a9c2 100644 --- a/Sources/TuistSupportTesting/SwiftPackageManager/PackageInfo+TestData.swift +++ b/Sources/TuistSupportTesting/SwiftPackageManager/PackageInfo+TestData.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TSCUtility import XcodeGraph @testable import TuistSupport diff --git a/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift b/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift index e4351d2d297..3f881b59bf9 100644 --- a/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift +++ b/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift @@ -1,6 +1,6 @@ import Difference import Foundation -import TSCBasic +import Path import XCTest @testable import TuistSupport diff --git a/Sources/TuistSupportTesting/Utils/MockDerivedDataLocator.swift b/Sources/TuistSupportTesting/Utils/MockDerivedDataLocator.swift index 165b1227eeb..190f253ffcf 100644 --- a/Sources/TuistSupportTesting/Utils/MockDerivedDataLocator.swift +++ b/Sources/TuistSupportTesting/Utils/MockDerivedDataLocator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport public final class MockDerivedDataLocator: DerivedDataLocating { diff --git a/Sources/TuistSupportTesting/Utils/MockDeveloperEnvironment.swift b/Sources/TuistSupportTesting/Utils/MockDeveloperEnvironment.swift index 99dc031bef0..c5443aac229 100644 --- a/Sources/TuistSupportTesting/Utils/MockDeveloperEnvironment.swift +++ b/Sources/TuistSupportTesting/Utils/MockDeveloperEnvironment.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import TuistSupport public final class MockDeveloperEnvironment: DeveloperEnvironmenting { diff --git a/Sources/TuistSupportTesting/Utils/MockEnvironment.swift b/Sources/TuistSupportTesting/Utils/MockEnvironment.swift index 8faa0156186..fba6246d5ae 100644 --- a/Sources/TuistSupportTesting/Utils/MockEnvironment.swift +++ b/Sources/TuistSupportTesting/Utils/MockEnvironment.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Sources/TuistSupportTesting/Utils/MockGitHandler.swift b/Sources/TuistSupportTesting/Utils/MockGitHandler.swift index 07ee49e2e0a..f9946552837 100644 --- a/Sources/TuistSupportTesting/Utils/MockGitHandler.swift +++ b/Sources/TuistSupportTesting/Utils/MockGitHandler.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TSCUtility import TuistSupport diff --git a/Sources/TuistSupportTesting/Utils/MockOpener.swift b/Sources/TuistSupportTesting/Utils/MockOpener.swift index a24f402fa9a..9ccea892f3d 100644 --- a/Sources/TuistSupportTesting/Utils/MockOpener.swift +++ b/Sources/TuistSupportTesting/Utils/MockOpener.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport // swiftlint:disable large_tuple diff --git a/Sources/TuistSupportTesting/Utils/MockSystem.swift b/Sources/TuistSupportTesting/Utils/MockSystem.swift index ada38e4e397..c31e227322d 100644 --- a/Sources/TuistSupportTesting/Utils/MockSystem.swift +++ b/Sources/TuistSupportTesting/Utils/MockSystem.swift @@ -1,4 +1,5 @@ import Foundation +import Path import TSCBasic import XCTest @testable import TuistSupport @@ -121,10 +122,10 @@ public final class MockSystem: Systeming { } } - public var chmodStub: ((FileMode, AbsolutePath, Set) throws -> Void)? + public var chmodStub: ((FileMode, Path.AbsolutePath, Set) throws -> Void)? public func chmod( _ mode: FileMode, - path: AbsolutePath, + path: Path.AbsolutePath, options: Set ) throws { try chmodStub?(mode, path, options) diff --git a/Sources/TuistSupportTesting/Xcode/TestData/Xcode+TestData.swift b/Sources/TuistSupportTesting/Xcode/TestData/Xcode+TestData.swift index 3a1539716ff..d07098d1b38 100644 --- a/Sources/TuistSupportTesting/Xcode/TestData/Xcode+TestData.swift +++ b/Sources/TuistSupportTesting/Xcode/TestData/Xcode+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport diff --git a/Sources/XcodeGraph/DependenciesGraph/DependenciesGraph.swift b/Sources/XcodeGraph/DependenciesGraph/DependenciesGraph.swift index bb7e7e8893f..f9927f0ac35 100644 --- a/Sources/XcodeGraph/DependenciesGraph/DependenciesGraph.swift +++ b/Sources/XcodeGraph/DependenciesGraph/DependenciesGraph.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistSupport /// A directed acyclic graph (DAG) that Tuist uses to represent the dependency tree. diff --git a/Sources/XcodeGraph/Graph/ConditionalGraphTarget.swift b/Sources/XcodeGraph/Graph/ConditionalGraphTarget.swift index b4ee787e2f8..e132261208a 100644 --- a/Sources/XcodeGraph/Graph/ConditionalGraphTarget.swift +++ b/Sources/XcodeGraph/Graph/ConditionalGraphTarget.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public struct GraphTargetReference: Equatable, Comparable, Hashable, CustomDebugStringConvertible, CustomStringConvertible, Codable diff --git a/Sources/XcodeGraph/Graph/Graph.swift b/Sources/XcodeGraph/Graph/Graph.swift index a14981d639d..033b95abe50 100644 --- a/Sources/XcodeGraph/Graph/Graph.swift +++ b/Sources/XcodeGraph/Graph/Graph.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// A directed acyclic graph (DAG) that Tuist uses to represent the dependency tree. public struct Graph: Equatable, Codable { diff --git a/Sources/XcodeGraph/Graph/GraphDependency.swift b/Sources/XcodeGraph/Graph/GraphDependency.swift index 98d13d6f216..870b73c4cce 100644 --- a/Sources/XcodeGraph/Graph/GraphDependency.swift +++ b/Sources/XcodeGraph/Graph/GraphDependency.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Codable { public struct XCFramework: Hashable, CustomStringConvertible, Comparable, Codable { diff --git a/Sources/XcodeGraph/Graph/GraphTarget.swift b/Sources/XcodeGraph/Graph/GraphTarget.swift index 8c80eff6527..a2126db3812 100644 --- a/Sources/XcodeGraph/Graph/GraphTarget.swift +++ b/Sources/XcodeGraph/Graph/GraphTarget.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public struct GraphTarget: Equatable, Hashable, Comparable, CustomDebugStringConvertible, CustomStringConvertible, Codable { /// Path to the directory that contains the project where the target is defined. diff --git a/Sources/XcodeGraph/Models/ArchiveAction.swift b/Sources/XcodeGraph/Models/ArchiveAction.swift index 7902429b95d..da727bb996d 100644 --- a/Sources/XcodeGraph/Models/ArchiveAction.swift +++ b/Sources/XcodeGraph/Models/ArchiveAction.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public struct ArchiveAction: Equatable, Codable { // MARK: - Attributes diff --git a/Sources/XcodeGraph/Models/BuildAction.swift b/Sources/XcodeGraph/Models/BuildAction.swift index 792226b78ae..e539571ecba 100644 --- a/Sources/XcodeGraph/Models/BuildAction.swift +++ b/Sources/XcodeGraph/Models/BuildAction.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public struct BuildAction: Equatable, Codable { // MARK: - Attributes diff --git a/Sources/XcodeGraph/Models/Config.swift b/Sources/XcodeGraph/Models/Config.swift index 388536439da..8c9536c78a9 100644 --- a/Sources/XcodeGraph/Models/Config.swift +++ b/Sources/XcodeGraph/Models/Config.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility /// This model allows to configure Tuist. diff --git a/Sources/XcodeGraph/Models/ConfigGenerationOptions.swift b/Sources/XcodeGraph/Models/ConfigGenerationOptions.swift index c3912c3b184..6431908a14a 100644 --- a/Sources/XcodeGraph/Models/ConfigGenerationOptions.swift +++ b/Sources/XcodeGraph/Models/ConfigGenerationOptions.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TSCUtility extension Config { diff --git a/Sources/XcodeGraph/Models/CopyFileElement.swift b/Sources/XcodeGraph/Models/CopyFileElement.swift index b6a070c13fd..649599e385f 100644 --- a/Sources/XcodeGraph/Models/CopyFileElement.swift +++ b/Sources/XcodeGraph/Models/CopyFileElement.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public enum CopyFileElement: Equatable, Hashable, Codable { case file(path: AbsolutePath, condition: PlatformCondition? = nil, codeSignOnCopy: Bool = false) diff --git a/Sources/XcodeGraph/Models/CopyFilesAction.swift b/Sources/XcodeGraph/Models/CopyFilesAction.swift index 06318634ca9..d61b35d68e3 100644 --- a/Sources/XcodeGraph/Models/CopyFilesAction.swift +++ b/Sources/XcodeGraph/Models/CopyFilesAction.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public struct CopyFilesAction: Equatable, Codable { /// Name of the build phase when the project gets generated. diff --git a/Sources/XcodeGraph/Models/CoreDataModel.swift b/Sources/XcodeGraph/Models/CoreDataModel.swift index 4301b6cb0f2..b17b74e293c 100644 --- a/Sources/XcodeGraph/Models/CoreDataModel.swift +++ b/Sources/XcodeGraph/Models/CoreDataModel.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// Represents a Core Data model public struct CoreDataModel: Equatable, Codable { diff --git a/Sources/XcodeGraph/Models/Dependencies/SwiftPackageManagerDependencies.swift b/Sources/XcodeGraph/Models/Dependencies/SwiftPackageManagerDependencies.swift index 8aba1fa5614..e61900ab763 100644 --- a/Sources/XcodeGraph/Models/Dependencies/SwiftPackageManagerDependencies.swift +++ b/Sources/XcodeGraph/Models/Dependencies/SwiftPackageManagerDependencies.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public enum PackagesOrManifest: Equatable { case packages([Package]) diff --git a/Sources/XcodeGraph/Models/ExecutionAction.swift b/Sources/XcodeGraph/Models/ExecutionAction.swift index 9aed0a32944..5c1f97379be 100644 --- a/Sources/XcodeGraph/Models/ExecutionAction.swift +++ b/Sources/XcodeGraph/Models/ExecutionAction.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// A execution action public struct ExecutionAction: Equatable, Codable { diff --git a/Sources/XcodeGraph/Models/FileElement.swift b/Sources/XcodeGraph/Models/FileElement.swift index bb2ed322b87..f7fe037934f 100644 --- a/Sources/XcodeGraph/Models/FileElement.swift +++ b/Sources/XcodeGraph/Models/FileElement.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public enum FileElement: Equatable, Hashable, Codable { case file(path: AbsolutePath) diff --git a/Sources/XcodeGraph/Models/Headers.swift b/Sources/XcodeGraph/Models/Headers.swift index e78422075f5..85e76eacbb4 100644 --- a/Sources/XcodeGraph/Models/Headers.swift +++ b/Sources/XcodeGraph/Models/Headers.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// Headers public struct Headers: Equatable, Codable { diff --git a/Sources/XcodeGraph/Models/Metadata/FrameworkMetadata.swift b/Sources/XcodeGraph/Models/Metadata/FrameworkMetadata.swift index f97de4854a0..d1bf70b626b 100644 --- a/Sources/XcodeGraph/Models/Metadata/FrameworkMetadata.swift +++ b/Sources/XcodeGraph/Models/Metadata/FrameworkMetadata.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// The metadata associated with a precompiled framework (.framework) public struct FrameworkMetadata: Equatable { diff --git a/Sources/XcodeGraph/Models/Metadata/LibraryMetadata.swift b/Sources/XcodeGraph/Models/Metadata/LibraryMetadata.swift index eba1eabc992..c8aad5cc99a 100644 --- a/Sources/XcodeGraph/Models/Metadata/LibraryMetadata.swift +++ b/Sources/XcodeGraph/Models/Metadata/LibraryMetadata.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// The metadata associated with a precompiled library (.a / .dylib) public struct LibraryMetadata: Equatable { diff --git a/Sources/XcodeGraph/Models/Metadata/SystemFrameworkMetadata.swift b/Sources/XcodeGraph/Models/Metadata/SystemFrameworkMetadata.swift index 5055f531e8f..fa82494069c 100644 --- a/Sources/XcodeGraph/Models/Metadata/SystemFrameworkMetadata.swift +++ b/Sources/XcodeGraph/Models/Metadata/SystemFrameworkMetadata.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// The metadata associated with a system framework or library (e.g. UIKit.framework, libc++.tbd) public struct SystemFrameworkMetadata: Equatable { diff --git a/Sources/XcodeGraph/Models/Metadata/XCFrameworkMetadata.swift b/Sources/XcodeGraph/Models/Metadata/XCFrameworkMetadata.swift index 21e78ffd11d..707bfa74ae8 100644 --- a/Sources/XcodeGraph/Models/Metadata/XCFrameworkMetadata.swift +++ b/Sources/XcodeGraph/Models/Metadata/XCFrameworkMetadata.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// The metadata associated with a precompiled xcframework public struct XCFrameworkMetadata: Equatable { diff --git a/Sources/XcodeGraph/Models/Package.swift b/Sources/XcodeGraph/Models/Package.swift index 18847fcadbc..ac4aab84164 100644 --- a/Sources/XcodeGraph/Models/Package.swift +++ b/Sources/XcodeGraph/Models/Package.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public enum Package: Equatable, Codable { case remote(url: String, requirement: Requirement) diff --git a/Sources/XcodeGraph/Models/PlatformCondition.swift b/Sources/XcodeGraph/Models/PlatformCondition.swift index 1833efeb18a..9709766f436 100644 --- a/Sources/XcodeGraph/Models/PlatformCondition.swift +++ b/Sources/XcodeGraph/Models/PlatformCondition.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public struct PlatformCondition: Codable, Hashable, Equatable, Comparable { public static func < (lhs: PlatformCondition, rhs: PlatformCondition) -> Bool { diff --git a/Sources/XcodeGraph/Models/Plist.swift b/Sources/XcodeGraph/Models/Plist.swift index 4d0ee174cc5..1ac2ff82ab2 100644 --- a/Sources/XcodeGraph/Models/Plist.swift +++ b/Sources/XcodeGraph/Models/Plist.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path // MARK: - Plist diff --git a/Sources/XcodeGraph/Models/Plugin.swift b/Sources/XcodeGraph/Models/Plugin.swift index 4125503d171..e43cb18ea02 100644 --- a/Sources/XcodeGraph/Models/Plugin.swift +++ b/Sources/XcodeGraph/Models/Plugin.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// A `Plugin` used to extend Tuist. public struct Plugin: Equatable, Hashable { diff --git a/Sources/XcodeGraph/Models/PluginResourceSynthesizer.swift b/Sources/XcodeGraph/Models/PluginResourceSynthesizer.swift index 2137b86d707..65409941b5b 100644 --- a/Sources/XcodeGraph/Models/PluginResourceSynthesizer.swift +++ b/Sources/XcodeGraph/Models/PluginResourceSynthesizer.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// Resource synthesizer plugin model public struct PluginResourceSynthesizer: Equatable { diff --git a/Sources/XcodeGraph/Models/Plugins.swift b/Sources/XcodeGraph/Models/Plugins.swift index 7f14b5c394a..61424933a7e 100644 --- a/Sources/XcodeGraph/Models/Plugins.swift +++ b/Sources/XcodeGraph/Models/Plugins.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// A model which contains all loaded plugin representations. public struct Plugins: Equatable { diff --git a/Sources/XcodeGraph/Models/Project.swift b/Sources/XcodeGraph/Models/Project.swift index 078b184b2a3..1cd9b2c6619 100644 --- a/Sources/XcodeGraph/Models/Project.swift +++ b/Sources/XcodeGraph/Models/Project.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebugStringConvertible, Codable { diff --git a/Sources/XcodeGraph/Models/ProjectDescriptionHelpersPlugin.swift b/Sources/XcodeGraph/Models/ProjectDescriptionHelpersPlugin.swift index f81cf5ecfb4..2301a321164 100644 --- a/Sources/XcodeGraph/Models/ProjectDescriptionHelpersPlugin.swift +++ b/Sources/XcodeGraph/Models/ProjectDescriptionHelpersPlugin.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// A model representing a custom `ProjectDescription` helper. public struct ProjectDescriptionHelpersPlugin: Equatable { diff --git a/Sources/XcodeGraph/Models/RawScriptBuildPhase.swift b/Sources/XcodeGraph/Models/RawScriptBuildPhase.swift index 63c337ad922..a1588453550 100644 --- a/Sources/XcodeGraph/Models/RawScriptBuildPhase.swift +++ b/Sources/XcodeGraph/Models/RawScriptBuildPhase.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// It represents a raw script build phase. public struct RawScriptBuildPhase: Equatable, Codable { diff --git a/Sources/XcodeGraph/Models/ResourceFileElement.swift b/Sources/XcodeGraph/Models/ResourceFileElement.swift index d76aefd6593..5023f01e0d6 100644 --- a/Sources/XcodeGraph/Models/ResourceFileElement.swift +++ b/Sources/XcodeGraph/Models/ResourceFileElement.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public enum ResourceFileElement: Equatable, Hashable, Codable { /// A file path (or glob pattern) to include, a list of file paths (or glob patterns) to exclude, ODR tags list and inclusion diff --git a/Sources/XcodeGraph/Models/ResourceSynthesizer.swift b/Sources/XcodeGraph/Models/ResourceSynthesizer.swift index 9905c3759a6..67a5e5ac841 100644 --- a/Sources/XcodeGraph/Models/ResourceSynthesizer.swift +++ b/Sources/XcodeGraph/Models/ResourceSynthesizer.swift @@ -1,6 +1,6 @@ import AnyCodable import Foundation -import TSCBasic +import Path public struct ResourceSynthesizer: Equatable, Hashable, Codable { public let parser: Parser diff --git a/Sources/XcodeGraph/Models/RunAction.swift b/Sources/XcodeGraph/Models/RunAction.swift index 0c16a2247ef..a7ac3aa9934 100644 --- a/Sources/XcodeGraph/Models/RunAction.swift +++ b/Sources/XcodeGraph/Models/RunAction.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public struct RunAction: Equatable, Codable { // MARK: - Attributes diff --git a/Sources/XcodeGraph/Models/RunActionOptions.swift b/Sources/XcodeGraph/Models/RunActionOptions.swift index 3fe6dc8d5e4..5cae4294ac3 100644 --- a/Sources/XcodeGraph/Models/RunActionOptions.swift +++ b/Sources/XcodeGraph/Models/RunActionOptions.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// Options for the `RunAction` action public struct RunActionOptions: Equatable, Codable { diff --git a/Sources/XcodeGraph/Models/Scheme.swift b/Sources/XcodeGraph/Models/Scheme.swift index 4e1716fd53e..8440cd14aa3 100644 --- a/Sources/XcodeGraph/Models/Scheme.swift +++ b/Sources/XcodeGraph/Models/Scheme.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public struct Scheme: Equatable, Codable { // MARK: - Attributes diff --git a/Sources/XcodeGraph/Models/Settings.swift b/Sources/XcodeGraph/Models/Settings.swift index cd4876921f6..8e103c3da74 100644 --- a/Sources/XcodeGraph/Models/Settings.swift +++ b/Sources/XcodeGraph/Models/Settings.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public typealias SettingsDictionary = [String: SettingValue] diff --git a/Sources/XcodeGraph/Models/SimulatedLocation.swift b/Sources/XcodeGraph/Models/SimulatedLocation.swift index 587cc2d43a5..0840c6ed583 100644 --- a/Sources/XcodeGraph/Models/SimulatedLocation.swift +++ b/Sources/XcodeGraph/Models/SimulatedLocation.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public enum SimulatedLocation { case gpxFile(AbsolutePath) diff --git a/Sources/XcodeGraph/Models/SourceFile.swift b/Sources/XcodeGraph/Models/SourceFile.swift index b80872afc46..9defe25d3f2 100644 --- a/Sources/XcodeGraph/Models/SourceFile.swift +++ b/Sources/XcodeGraph/Models/SourceFile.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// A type that represents a source file. public struct SourceFile: ExpressibleByStringLiteral, Equatable, Codable { diff --git a/Sources/XcodeGraph/Models/Target.swift b/Sources/XcodeGraph/Models/Target.swift index f091e803a94..0216454d2ff 100644 --- a/Sources/XcodeGraph/Models/Target.swift +++ b/Sources/XcodeGraph/Models/Target.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path // swiftlint:disable:next type_body_length public struct Target: Equatable, Hashable, Comparable, Codable { diff --git a/Sources/XcodeGraph/Models/TargetDependency.swift b/Sources/XcodeGraph/Models/TargetDependency.swift index bfee06a3669..05763bc0003 100644 --- a/Sources/XcodeGraph/Models/TargetDependency.swift +++ b/Sources/XcodeGraph/Models/TargetDependency.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public enum FrameworkStatus: String, Hashable, Codable { case required diff --git a/Sources/XcodeGraph/Models/TargetReference.swift b/Sources/XcodeGraph/Models/TargetReference.swift index d6c13eb84e6..5ff8b4d76fa 100644 --- a/Sources/XcodeGraph/Models/TargetReference.swift +++ b/Sources/XcodeGraph/Models/TargetReference.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public struct TargetReference: Hashable, Codable { public var projectPath: AbsolutePath diff --git a/Sources/XcodeGraph/Models/TargetScript.swift b/Sources/XcodeGraph/Models/TargetScript.swift index a32b82fb043..a9cf89a567f 100644 --- a/Sources/XcodeGraph/Models/TargetScript.swift +++ b/Sources/XcodeGraph/Models/TargetScript.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// It represents a target script build phase public struct TargetScript: Equatable, Codable { diff --git a/Sources/XcodeGraph/Models/Template.swift b/Sources/XcodeGraph/Models/Template.swift index 33073447bc3..b266d05c5e4 100644 --- a/Sources/XcodeGraph/Models/Template.swift +++ b/Sources/XcodeGraph/Models/Template.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path public struct Template: Equatable { public let description: String diff --git a/Sources/XcodeGraph/Models/TestAction.swift b/Sources/XcodeGraph/Models/TestAction.swift index ee12892f46f..501251afa70 100644 --- a/Sources/XcodeGraph/Models/TestAction.swift +++ b/Sources/XcodeGraph/Models/TestAction.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public struct TestAction: Equatable, Codable { // MARK: - Attributes diff --git a/Sources/XcodeGraph/Models/TestPlan.swift b/Sources/XcodeGraph/Models/TestPlan.swift index aa5b7ee7a62..341603ae3b4 100644 --- a/Sources/XcodeGraph/Models/TestPlan.swift +++ b/Sources/XcodeGraph/Models/TestPlan.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path public struct TestPlan: Hashable, Codable { public let name: String diff --git a/Sources/XcodeGraph/Models/Workspace.swift b/Sources/XcodeGraph/Models/Workspace.swift index 13a3252d6b9..b384e31127a 100644 --- a/Sources/XcodeGraph/Models/Workspace.swift +++ b/Sources/XcodeGraph/Models/Workspace.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility public struct Workspace: Equatable, Codable { diff --git a/Sources/XcodeGraph/Models/XCFrameworkInfoPlist.swift b/Sources/XcodeGraph/Models/XCFrameworkInfoPlist.swift index e7b7986f208..27b56a1f675 100644 --- a/Sources/XcodeGraph/Models/XCFrameworkInfoPlist.swift +++ b/Sources/XcodeGraph/Models/XCFrameworkInfoPlist.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// It represents th Info.plist contained in an .xcframework bundle. public struct XCFrameworkInfoPlist: Codable, Hashable, Equatable { diff --git a/Sources/XcodeGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift b/Sources/XcodeGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift index 9d32c78031a..fe51b9b2970 100644 --- a/Sources/XcodeGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift +++ b/Sources/XcodeGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph extension DependenciesGraph { diff --git a/Sources/XcodeGraphTesting/Graph/Graph+TestData.swift b/Sources/XcodeGraphTesting/Graph/Graph+TestData.swift index 461de49a9ce..266b1c0c126 100644 --- a/Sources/XcodeGraphTesting/Graph/Graph+TestData.swift +++ b/Sources/XcodeGraphTesting/Graph/Graph+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph extension Graph { diff --git a/Sources/XcodeGraphTesting/Graph/GraphDependency+TestData.swift b/Sources/XcodeGraphTesting/Graph/GraphDependency+TestData.swift index aa88cb56cbe..8373926c6a8 100644 --- a/Sources/XcodeGraphTesting/Graph/GraphDependency+TestData.swift +++ b/Sources/XcodeGraphTesting/Graph/GraphDependency+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Graph/GraphTarget+TestData.swift b/Sources/XcodeGraphTesting/Graph/GraphTarget+TestData.swift index 7cec4e07702..5bf7fc67822 100644 --- a/Sources/XcodeGraphTesting/Graph/GraphTarget+TestData.swift +++ b/Sources/XcodeGraphTesting/Graph/GraphTarget+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Models/AnalyzeAction+TestData.swift b/Sources/XcodeGraphTesting/Models/AnalyzeAction+TestData.swift index 8a27641f79e..28e1b7edb24 100644 --- a/Sources/XcodeGraphTesting/Models/AnalyzeAction+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/AnalyzeAction+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import XcodeGraph extension AnalyzeAction { diff --git a/Sources/XcodeGraphTesting/Models/ArchiveAction+TestData.swift b/Sources/XcodeGraphTesting/Models/ArchiveAction+TestData.swift index d6019597148..0e1e91569ee 100644 --- a/Sources/XcodeGraphTesting/Models/ArchiveAction+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/ArchiveAction+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import XcodeGraph extension ArchiveAction { diff --git a/Sources/XcodeGraphTesting/Models/Arguments+TestData.swift b/Sources/XcodeGraphTesting/Models/Arguments+TestData.swift index ee73f55e01d..ed2d6c956bb 100644 --- a/Sources/XcodeGraphTesting/Models/Arguments+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Arguments+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import XcodeGraph extension Arguments { diff --git a/Sources/XcodeGraphTesting/Models/BuildAction+TestData.swift b/Sources/XcodeGraphTesting/Models/BuildAction+TestData.swift index 15cc81c7c5c..b361b92e127 100644 --- a/Sources/XcodeGraphTesting/Models/BuildAction+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/BuildAction+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport @testable import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Models/Cloud+TestData.swift b/Sources/XcodeGraphTesting/Models/Cloud+TestData.swift index 1a2ad042ca0..06bebd38e9e 100644 --- a/Sources/XcodeGraphTesting/Models/Cloud+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Cloud+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupportTesting @testable import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Models/Config+TestData.swift b/Sources/XcodeGraphTesting/Models/Config+TestData.swift index 7c088cae876..a62d32b5831 100644 --- a/Sources/XcodeGraphTesting/Models/Config+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Config+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility @testable import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Models/Headers+TestData.swift b/Sources/XcodeGraphTesting/Models/Headers+TestData.swift index 868bcc86915..4a6641b54ea 100644 --- a/Sources/XcodeGraphTesting/Models/Headers+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Headers+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import XcodeGraph extension Headers { diff --git a/Sources/XcodeGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift b/Sources/XcodeGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift index 5756b7dc4b4..6a016067547 100644 --- a/Sources/XcodeGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport @testable import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Models/Metadata/LibraryMetadata+TestData.swift b/Sources/XcodeGraphTesting/Models/Metadata/LibraryMetadata+TestData.swift index 72b724f6584..266cddc1ed6 100644 --- a/Sources/XcodeGraphTesting/Models/Metadata/LibraryMetadata+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Metadata/LibraryMetadata+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport @testable import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Models/Metadata/XCFrameworkMetadata+TestData.swift b/Sources/XcodeGraphTesting/Models/Metadata/XCFrameworkMetadata+TestData.swift index f67941869fe..c9ad0312fb1 100644 --- a/Sources/XcodeGraphTesting/Models/Metadata/XCFrameworkMetadata+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Metadata/XCFrameworkMetadata+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport @testable import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Models/PackageSettings+TestData.swift b/Sources/XcodeGraphTesting/Models/PackageSettings+TestData.swift index 5d9b9193c64..cfef21cb722 100644 --- a/Sources/XcodeGraphTesting/Models/PackageSettings+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/PackageSettings+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility @testable import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Models/Plugins+TestData.swift b/Sources/XcodeGraphTesting/Models/Plugins+TestData.swift index c74be3e5ee1..073b0ad7b81 100644 --- a/Sources/XcodeGraphTesting/Models/Plugins+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Plugins+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import XcodeGraph extension Plugins { diff --git a/Sources/XcodeGraphTesting/Models/ProfileAction+TestData.swift b/Sources/XcodeGraphTesting/Models/ProfileAction+TestData.swift index 0cb6d978772..18e352ba23d 100644 --- a/Sources/XcodeGraphTesting/Models/ProfileAction+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/ProfileAction+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport @testable import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Models/Project+TestData.swift b/Sources/XcodeGraphTesting/Models/Project+TestData.swift index 56791acd3e6..14c83e8f6f4 100644 --- a/Sources/XcodeGraphTesting/Models/Project+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Project+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility @testable import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Models/RawScriptBuildPhase+TestData.swift b/Sources/XcodeGraphTesting/Models/RawScriptBuildPhase+TestData.swift index f3039d3e22f..4ed99315d93 100644 --- a/Sources/XcodeGraphTesting/Models/RawScriptBuildPhase+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/RawScriptBuildPhase+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import XcodeGraph extension RawScriptBuildPhase { diff --git a/Sources/XcodeGraphTesting/Models/ResourceSynthesizerPlugin+TestData.swift b/Sources/XcodeGraphTesting/Models/ResourceSynthesizerPlugin+TestData.swift index e90b4670499..a2e33ac2d09 100644 --- a/Sources/XcodeGraphTesting/Models/ResourceSynthesizerPlugin+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/ResourceSynthesizerPlugin+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import XcodeGraph extension PluginResourceSynthesizer { diff --git a/Sources/XcodeGraphTesting/Models/RunAction+TestData.swift b/Sources/XcodeGraphTesting/Models/RunAction+TestData.swift index 3b475940f48..03c5b69bda0 100644 --- a/Sources/XcodeGraphTesting/Models/RunAction+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/RunAction+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport @testable import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Models/Scheme+TestData.swift b/Sources/XcodeGraphTesting/Models/Scheme+TestData.swift index ca88b08c5f0..4a9b51f8067 100644 --- a/Sources/XcodeGraphTesting/Models/Scheme+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Scheme+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import XcodeGraph extension Scheme { diff --git a/Sources/XcodeGraphTesting/Models/Settings+TestData.swift b/Sources/XcodeGraphTesting/Models/Settings+TestData.swift index 667ad9c058a..950a79ad5ba 100644 --- a/Sources/XcodeGraphTesting/Models/Settings+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Settings+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import XcodeGraph extension Configuration { diff --git a/Sources/XcodeGraphTesting/Models/Target+TestData.swift b/Sources/XcodeGraphTesting/Models/Target+TestData.swift index 4ef04acd660..ca648e6e495 100644 --- a/Sources/XcodeGraphTesting/Models/Target+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Target+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import XcodeGraph extension Target { diff --git a/Sources/XcodeGraphTesting/Models/Template+TestData.swift b/Sources/XcodeGraphTesting/Models/Template+TestData.swift index 641aaf6e79c..020b6abdac0 100644 --- a/Sources/XcodeGraphTesting/Models/Template+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Template+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import XcodeGraph extension Template { diff --git a/Sources/XcodeGraphTesting/Models/TestAction+TestData.swift b/Sources/XcodeGraphTesting/Models/TestAction+TestData.swift index a9e6ed85c5b..1459baaa4b1 100644 --- a/Sources/XcodeGraphTesting/Models/TestAction+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/TestAction+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport @testable import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Models/TestableTarget+TestData.swift b/Sources/XcodeGraphTesting/Models/TestableTarget+TestData.swift index 0b619a9a3bf..ef3a8ad6235 100644 --- a/Sources/XcodeGraphTesting/Models/TestableTarget+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/TestableTarget+TestData.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistSupport import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Models/Workspace+TestData.swift b/Sources/XcodeGraphTesting/Models/Workspace+TestData.swift index e9b21f50158..f197dafdc68 100644 --- a/Sources/XcodeGraphTesting/Models/Workspace+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/Workspace+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility @testable import XcodeGraph diff --git a/Sources/XcodeGraphTesting/Models/XCFrameworkInfoPlist+TestData.swift b/Sources/XcodeGraphTesting/Models/XCFrameworkInfoPlist+TestData.swift index de07ffa98aa..832f09e2676 100644 --- a/Sources/XcodeGraphTesting/Models/XCFrameworkInfoPlist+TestData.swift +++ b/Sources/XcodeGraphTesting/Models/XCFrameworkInfoPlist+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import XcodeGraph diff --git a/Sources/tuist/TuistApp.swift b/Sources/tuist/TuistApp.swift index dd85126e99a..d001200ec6a 100644 --- a/Sources/tuist/TuistApp.swift +++ b/Sources/tuist/TuistApp.swift @@ -1,4 +1,5 @@ import Foundation +import Path import TSCBasic import TuistKit import TuistLoader diff --git a/Sources/tuistbenchmark/Benchmark/Measure.swift b/Sources/tuistbenchmark/Benchmark/Measure.swift index 98208a2c9d0..d3872b0f112 100644 --- a/Sources/tuistbenchmark/Benchmark/Measure.swift +++ b/Sources/tuistbenchmark/Benchmark/Measure.swift @@ -1,5 +1,6 @@ import Foundation import TSCBasic +import TSCUtility struct MeasureResult { var fixture: String @@ -49,6 +50,7 @@ final class Measure { fixturePath: AbsolutePath ) throws -> [TimeInterval] { try (0 ..< runs).map { _ in + try withTemporaryDirectory(removeTreeOnDeinit: true) { temporaryDirectoryPath in let temporaryPath = temporaryDirectoryPath.appending(component: "fixture") try fileHandler.copy(path: fixturePath, to: temporaryPath) diff --git a/Sources/tuistbenchmark/main.swift b/Sources/tuistbenchmark/main.swift index 0f82ad68d27..ec2ee192ad8 100644 --- a/Sources/tuistbenchmark/main.swift +++ b/Sources/tuistbenchmark/main.swift @@ -1,6 +1,6 @@ import ArgumentParser import Foundation -import TSCBasic +import Path import TSCUtility public struct TuistBenchmarkCommand: ParsableCommand { diff --git a/Sources/tuistfixturegenerator/Generator/Generator.swift b/Sources/tuistfixturegenerator/Generator/Generator.swift index cd868cad6a3..62c68870b1e 100644 --- a/Sources/tuistfixturegenerator/Generator/Generator.swift +++ b/Sources/tuistfixturegenerator/Generator/Generator.swift @@ -1,5 +1,6 @@ import Foundation import TSCBasic +import TSCUtility class Generator { private let fileSystem: FileSystem diff --git a/Sources/tuistfixturegenerator/main.swift b/Sources/tuistfixturegenerator/main.swift index aec25e2eedb..7278c9169d2 100644 --- a/Sources/tuistfixturegenerator/main.swift +++ b/Sources/tuistfixturegenerator/main.swift @@ -1,7 +1,5 @@ import ArgumentParser import Foundation -import TSCBasic -import TSCUtility public struct TuistFixtureGeneratorCommand: ParsableCommand { public init() {} diff --git a/Tests/TuistAcceptanceTests/BuildRulesAcceptanceTests.swift b/Tests/TuistAcceptanceTests/BuildRulesAcceptanceTests.swift index 64b09951dd8..56419118434 100644 --- a/Tests/TuistAcceptanceTests/BuildRulesAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/BuildRulesAcceptanceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistAcceptanceTesting import TuistSupport import TuistSupportTesting diff --git a/Tests/TuistAcceptanceTests/EditAcceptanceTests.swift b/Tests/TuistAcceptanceTests/EditAcceptanceTests.swift index 8a58dfda32a..920fce49ad8 100644 --- a/Tests/TuistAcceptanceTests/EditAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/EditAcceptanceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistAcceptanceTesting import TuistSupport import TuistSupportTesting diff --git a/Tests/TuistAcceptanceTests/GraphAcceptanceTests.swift b/Tests/TuistAcceptanceTests/GraphAcceptanceTests.swift index 1c35777faf2..e356963662c 100644 --- a/Tests/TuistAcceptanceTests/GraphAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/GraphAcceptanceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistAcceptanceTesting import TuistSupport import TuistSupportTesting diff --git a/Tests/TuistAcceptanceTests/InitAcceptanceTests.swift b/Tests/TuistAcceptanceTests/InitAcceptanceTests.swift index 78e3cde6a38..3ff034dbcf4 100644 --- a/Tests/TuistAcceptanceTests/InitAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/InitAcceptanceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistAcceptanceTesting import TuistSupport import TuistSupportTesting diff --git a/Tests/TuistAcceptanceTests/ListTargetsAcceptanceTests.swift b/Tests/TuistAcceptanceTests/ListTargetsAcceptanceTests.swift index 370d3d426ac..3bf693ef7cd 100644 --- a/Tests/TuistAcceptanceTests/ListTargetsAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/ListTargetsAcceptanceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistAcceptanceTesting import TuistSupport import TuistSupportTesting diff --git a/Tests/TuistAcceptanceTests/PluginAcceptanceTests.swift b/Tests/TuistAcceptanceTests/PluginAcceptanceTests.swift index 58b96a3f342..cb27df59c7e 100644 --- a/Tests/TuistAcceptanceTests/PluginAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/PluginAcceptanceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistAcceptanceTesting import TuistSupport import TuistSupportTesting diff --git a/Tests/TuistAcceptanceTests/PrecompiledAcceptanceTests.swift b/Tests/TuistAcceptanceTests/PrecompiledAcceptanceTests.swift index 4001a1dcf1c..8982dfce6ef 100644 --- a/Tests/TuistAcceptanceTests/PrecompiledAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/PrecompiledAcceptanceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistAcceptanceTesting import TuistSupport import TuistSupportTesting diff --git a/Tests/TuistAcceptanceTests/RunAcceptanceTests.swift b/Tests/TuistAcceptanceTests/RunAcceptanceTests.swift index 9348443ba3a..73765f73eab 100644 --- a/Tests/TuistAcceptanceTests/RunAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/RunAcceptanceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistAcceptanceTesting import TuistSupport import TuistSupportTesting diff --git a/Tests/TuistAcceptanceTests/ScaffoldAcceptanceTests.swift b/Tests/TuistAcceptanceTests/ScaffoldAcceptanceTests.swift index 2c330b3c38f..d745dc91a89 100644 --- a/Tests/TuistAcceptanceTests/ScaffoldAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/ScaffoldAcceptanceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistAcceptanceTesting import TuistSupport import TuistSupportTesting diff --git a/Tests/TuistAsyncQueueTests/AsyncQueuePersistorTests.swift b/Tests/TuistAsyncQueueTests/AsyncQueuePersistorTests.swift index 9c8f3aa5419..f8f97b924f1 100644 --- a/Tests/TuistAsyncQueueTests/AsyncQueuePersistorTests.swift +++ b/Tests/TuistAsyncQueueTests/AsyncQueuePersistorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XCTest diff --git a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift index 625870976ac..4d0e96a2bf5 100644 --- a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift +++ b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistAcceptanceTesting import TuistSupport import XCTest diff --git a/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift b/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift index f6c65210e6c..c167fba980d 100644 --- a/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift +++ b/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistAcceptanceTesting import TuistSupport import XCTest diff --git a/Tests/TuistAutomationIntegrationTests/Simulator/SimulatorControllerIntegrationTests.swift b/Tests/TuistAutomationIntegrationTests/Simulator/SimulatorControllerIntegrationTests.swift index 2e012b8bb4e..af05c2297ff 100644 --- a/Tests/TuistAutomationIntegrationTests/Simulator/SimulatorControllerIntegrationTests.swift +++ b/Tests/TuistAutomationIntegrationTests/Simulator/SimulatorControllerIntegrationTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Tests/TuistAutomationIntegrationTests/XcodeBuild/XcodeBuildControllerIntegrationTests.swift b/Tests/TuistAutomationIntegrationTests/XcodeBuild/XcodeBuildControllerIntegrationTests.swift index 8e35143e554..6d3bb7aa84c 100644 --- a/Tests/TuistAutomationIntegrationTests/XcodeBuild/XcodeBuildControllerIntegrationTests.swift +++ b/Tests/TuistAutomationIntegrationTests/XcodeBuild/XcodeBuildControllerIntegrationTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XCTest diff --git a/Tests/TuistCoreIntegrationTests/MetadataProviders/FrameworkMetadataProviderIntegrationTests.swift b/Tests/TuistCoreIntegrationTests/MetadataProviders/FrameworkMetadataProviderIntegrationTests.swift index 7f5c6ddcbaf..5df880ae7de 100644 --- a/Tests/TuistCoreIntegrationTests/MetadataProviders/FrameworkMetadataProviderIntegrationTests.swift +++ b/Tests/TuistCoreIntegrationTests/MetadataProviders/FrameworkMetadataProviderIntegrationTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Tests/TuistCoreIntegrationTests/MetadataProviders/PrecompiledMetadataProviderIntegrationTests.swift b/Tests/TuistCoreIntegrationTests/MetadataProviders/PrecompiledMetadataProviderIntegrationTests.swift index ed1477183dd..cb9b445f0c7 100644 --- a/Tests/TuistCoreIntegrationTests/MetadataProviders/PrecompiledMetadataProviderIntegrationTests.swift +++ b/Tests/TuistCoreIntegrationTests/MetadataProviders/PrecompiledMetadataProviderIntegrationTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Tests/TuistCoreIntegrationTests/RootDirectoryLocatorIntegrationTests.swift b/Tests/TuistCoreIntegrationTests/RootDirectoryLocatorIntegrationTests.swift index 6369723913d..203cd995e4b 100644 --- a/Tests/TuistCoreIntegrationTests/RootDirectoryLocatorIntegrationTests.swift +++ b/Tests/TuistCoreIntegrationTests/RootDirectoryLocatorIntegrationTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XCTest diff --git a/Tests/TuistCoreTests/Automation/XcodeBuildArgumentTests.swift b/Tests/TuistCoreTests/Automation/XcodeBuildArgumentTests.swift index 4401b0b13c7..48196dd18c5 100644 --- a/Tests/TuistCoreTests/Automation/XcodeBuildArgumentTests.swift +++ b/Tests/TuistCoreTests/Automation/XcodeBuildArgumentTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import TuistCore @testable import TuistSupportTesting diff --git a/Tests/TuistCoreTests/Automation/XcodeBuildTargetTests.swift b/Tests/TuistCoreTests/Automation/XcodeBuildTargetTests.swift index 3a986521093..b977acfa4ac 100644 --- a/Tests/TuistCoreTests/Automation/XcodeBuildTargetTests.swift +++ b/Tests/TuistCoreTests/Automation/XcodeBuildTargetTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XCTest diff --git a/Tests/TuistCoreTests/ContentHashing/ContentHasherTests.swift b/Tests/TuistCoreTests/ContentHashing/ContentHasherTests.swift index bab699cc2a5..c09a03bb0c4 100644 --- a/Tests/TuistCoreTests/ContentHashing/ContentHasherTests.swift +++ b/Tests/TuistCoreTests/ContentHashing/ContentHasherTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistSupport import XCTest @testable import TuistCore diff --git a/Tests/TuistCoreTests/Graph/CircularDependencyLinterTests.swift b/Tests/TuistCoreTests/Graph/CircularDependencyLinterTests.swift index 823fbb58f8a..4a83019248b 100644 --- a/Tests/TuistCoreTests/Graph/CircularDependencyLinterTests.swift +++ b/Tests/TuistCoreTests/Graph/CircularDependencyLinterTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph import XCTest diff --git a/Tests/TuistCoreTests/Graph/GraphDependencyReferenceTests.swift b/Tests/TuistCoreTests/Graph/GraphDependencyReferenceTests.swift index 9638abf7b83..8fd067b6382 100644 --- a/Tests/TuistCoreTests/Graph/GraphDependencyReferenceTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphDependencyReferenceTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Tests/TuistCoreTests/Graph/GraphDependencyTests.swift b/Tests/TuistCoreTests/Graph/GraphDependencyTests.swift index c5e3d2ede3f..0a05d977d42 100644 --- a/Tests/TuistCoreTests/Graph/GraphDependencyTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphDependencyTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph import XCTest @testable import TuistCore diff --git a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift index 38a7b7ced17..51886be5011 100644 --- a/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphLoaderTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph import XCTest diff --git a/Tests/TuistCoreTests/Graph/GraphLoadingErrorTests.swift b/Tests/TuistCoreTests/Graph/GraphLoadingErrorTests.swift index efbab6e12bc..52731dfc1e4 100644 --- a/Tests/TuistCoreTests/Graph/GraphLoadingErrorTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphLoadingErrorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import TuistCore diff --git a/Tests/TuistCoreTests/Graph/GraphTargetTests.swift b/Tests/TuistCoreTests/Graph/GraphTargetTests.swift index 9fbb1af7c0e..5c0a59f9256 100644 --- a/Tests/TuistCoreTests/Graph/GraphTargetTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTargetTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph import XCTest @testable import TuistCore diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index 7fb7fa35aef..ec2956f0d03 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph import XCTest diff --git a/Tests/TuistCoreTests/Graph/Mappers/GraphMapperTests.swift b/Tests/TuistCoreTests/Graph/Mappers/GraphMapperTests.swift index 78d25693448..146aa22051a 100644 --- a/Tests/TuistCoreTests/Graph/Mappers/GraphMapperTests.swift +++ b/Tests/TuistCoreTests/Graph/Mappers/GraphMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import XcodeGraph diff --git a/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift b/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift index b3f7f05b964..89e4be55f77 100644 --- a/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift +++ b/Tests/TuistCoreTests/Graph/Mappers/ProjectMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import XcodeGraph diff --git a/Tests/TuistCoreTests/Graph/Mappers/WorkspaceMapperTests.swift b/Tests/TuistCoreTests/Graph/Mappers/WorkspaceMapperTests.swift index 0d21abe64c8..dbf6d0f7761 100644 --- a/Tests/TuistCoreTests/Graph/Mappers/WorkspaceMapperTests.swift +++ b/Tests/TuistCoreTests/Graph/Mappers/WorkspaceMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import XcodeGraph diff --git a/Tests/TuistCoreTests/MetadataProviders/FrameworkMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/FrameworkMetadataProviderTests.swift index fcabeeb31ea..d64edcc65b4 100644 --- a/Tests/TuistCoreTests/MetadataProviders/FrameworkMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/FrameworkMetadataProviderTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import XcodeGraph import XCTest @testable import TuistCore diff --git a/Tests/TuistCoreTests/MetadataProviders/LibraryMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/LibraryMetadataProviderTests.swift index 67a4dab76f7..188e91160b7 100644 --- a/Tests/TuistCoreTests/MetadataProviders/LibraryMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/LibraryMetadataProviderTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import XcodeGraph import XCTest @testable import TuistCore diff --git a/Tests/TuistCoreTests/MetadataProviders/PrecompiledMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/PrecompiledMetadataProviderTests.swift index d79d7601494..94139c98400 100644 --- a/Tests/TuistCoreTests/MetadataProviders/PrecompiledMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/PrecompiledMetadataProviderTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph import XCTest diff --git a/Tests/TuistCoreTests/MetadataProviders/SystemFrameworkMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/SystemFrameworkMetadataProviderTests.swift index 32dc4a4fa12..56547d6b9f3 100644 --- a/Tests/TuistCoreTests/MetadataProviders/SystemFrameworkMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/SystemFrameworkMetadataProviderTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import XcodeGraph import XCTest @testable import TuistCore diff --git a/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift index 95eee7306b3..145f8af6266 100644 --- a/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import XCTest @testable import TuistCore @testable import TuistSupportTesting diff --git a/Tests/TuistCoreTests/NodeLoaders/FrameworkLoaderTests.swift b/Tests/TuistCoreTests/NodeLoaders/FrameworkLoaderTests.swift index fd203ac4cbf..57730f95324 100644 --- a/Tests/TuistCoreTests/NodeLoaders/FrameworkLoaderTests.swift +++ b/Tests/TuistCoreTests/NodeLoaders/FrameworkLoaderTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistSupport import XcodeGraph import XCTest diff --git a/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift b/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift index 890ae68314a..2534f9d7c6e 100644 --- a/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift +++ b/Tests/TuistCoreTests/NodeLoaders/XCFrameworkLoaderTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistSupport import XcodeGraph import XCTest diff --git a/Tests/TuistCoreTests/Simulator/SimulatorControllerTests.swift b/Tests/TuistCoreTests/Simulator/SimulatorControllerTests.swift index 72bbd8dfdbb..14d1081a418 100644 --- a/Tests/TuistCoreTests/Simulator/SimulatorControllerTests.swift +++ b/Tests/TuistCoreTests/Simulator/SimulatorControllerTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import TuistCore diff --git a/Tests/TuistCoreTests/Utils/GraphCircularDetectorTests.swift b/Tests/TuistCoreTests/Utils/GraphCircularDetectorTests.swift index c10cf9207ba..83d82362fe0 100644 --- a/Tests/TuistCoreTests/Utils/GraphCircularDetectorTests.swift +++ b/Tests/TuistCoreTests/Utils/GraphCircularDetectorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import TuistCore diff --git a/Tests/TuistCoreTests/Utils/XcodeProjectBuildDirectoryLocatorTests.swift b/Tests/TuistCoreTests/Utils/XcodeProjectBuildDirectoryLocatorTests.swift index 794c9724f18..eef120a4d7d 100644 --- a/Tests/TuistCoreTests/Utils/XcodeProjectBuildDirectoryLocatorTests.swift +++ b/Tests/TuistCoreTests/Utils/XcodeProjectBuildDirectoryLocatorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupportTesting import XCTest diff --git a/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift b/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift index f87a4dcaeb9..e477a75b6ee 100644 --- a/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift +++ b/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistAcceptanceTesting import TuistSupport import TuistSupportTesting diff --git a/Tests/TuistDependenciesTests/Mappers/ExternalDependencyPathWorkspaceMapper.swift b/Tests/TuistDependenciesTests/Mappers/ExternalDependencyPathWorkspaceMapper.swift index 76aa25a1821..61e086100c3 100644 --- a/Tests/TuistDependenciesTests/Mappers/ExternalDependencyPathWorkspaceMapper.swift +++ b/Tests/TuistDependenciesTests/Mappers/ExternalDependencyPathWorkspaceMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import TuistSupportTesting diff --git a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift index 55c0d947e86..f40b56a80b9 100644 --- a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph import XcodeGraphTesting import XCTest diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index 36c778b91dc..deeae5d25ff 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistAcceptanceTesting import TuistSupport import TuistSupportTesting diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift index 52c47379a9c..42a62f69903 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift @@ -1,3 +1,4 @@ +import Path import TSCBasic import TuistCore import TuistLoaderTesting @@ -352,7 +353,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { } @discardableResult - private func createFile(path relativePath: String, content: String) throws -> AbsolutePath { + private func createFile(path relativePath: String, content: String) throws -> Path.AbsolutePath { let temporaryPath = try temporaryPath() let absolutePath = temporaryPath.appending(try RelativePath(validating: relativePath)) try FileHandler.shared.touch(absolutePath) @@ -384,7 +385,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { ) } - private func createWorkspace(path: AbsolutePath, projects: [String]) throws -> Workspace { + private func createWorkspace(path: Path.AbsolutePath, projects: [String]) throws -> Workspace { Workspace( path: path, xcWorkspacePath: path.appending(component: "Workspace.xcworkspace"), @@ -395,7 +396,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { } private func createProject( - path: AbsolutePath, + path: Path.AbsolutePath, settings: Settings, targets: [Target], packages: [Package] = [], @@ -436,7 +437,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { ) } - private func pathTo(_ relativePath: String) throws -> AbsolutePath { + private func pathTo(_ relativePath: String) throws -> Path.AbsolutePath { let temporaryPath = try temporaryPath() return temporaryPath.appending(try RelativePath(validating: relativePath)) } diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/StableStructureIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/StableStructureIntegrationTests.swift index 5288b988437..d480265ea5d 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/StableStructureIntegrationTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/StableStructureIntegrationTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistLoaderTesting diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift index d85206f315f..21b216a0d56 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift @@ -1,6 +1,6 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupport diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift b/Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift index 486f8f358e8..87d670f05ab 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistLoaderTesting diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/TuistGeneratorPerformanceTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/TuistGeneratorPerformanceTests.swift index e3f10d0f0e5..bc94fa514fd 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/TuistGeneratorPerformanceTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/TuistGeneratorPerformanceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistLoaderTesting diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/WorkspaceGeneratorIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/WorkspaceGeneratorIntegrationTests.swift index 16067c4ca63..a4c56b337fe 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/WorkspaceGeneratorIntegrationTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/WorkspaceGeneratorIntegrationTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupport diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/XcodeProjWriterTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/XcodeProjWriterTests.swift index f135e1fa7be..4cab00c7570 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/XcodeProjWriterTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/XcodeProjWriterTests.swift @@ -1,6 +1,6 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistGeneratorTesting import TuistSupport diff --git a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift index 1a59612fa82..320c6fe5720 100644 --- a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift index 3d4c530a1a8..ba23a8187cc 100644 --- a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupport diff --git a/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift index e4e04eb2b10..379940d6621 100644 --- a/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph import XcodeGraphTesting diff --git a/Tests/TuistGeneratorTests/Generator/Mocks/MockProjectDescriptorGenerator.swift b/Tests/TuistGeneratorTests/Generator/Mocks/MockProjectDescriptorGenerator.swift index 52f81426af7..8a59a14c3aa 100644 --- a/Tests/TuistGeneratorTests/Generator/Mocks/MockProjectDescriptorGenerator.swift +++ b/Tests/TuistGeneratorTests/Generator/Mocks/MockProjectDescriptorGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupport diff --git a/Tests/TuistGeneratorTests/Generator/Mocks/MockSchemeDescriptorsGenerator.swift b/Tests/TuistGeneratorTests/Generator/Mocks/MockSchemeDescriptorsGenerator.swift index b3f2402dbaf..e88adda9653 100644 --- a/Tests/TuistGeneratorTests/Generator/Mocks/MockSchemeDescriptorsGenerator.swift +++ b/Tests/TuistGeneratorTests/Generator/Mocks/MockSchemeDescriptorsGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import XcodeGraph diff --git a/Tests/TuistGeneratorTests/Generator/Mocks/MockTargetGenerator.swift b/Tests/TuistGeneratorTests/Generator/Mocks/MockTargetGenerator.swift index 0d7fb42b145..a221447b250 100644 --- a/Tests/TuistGeneratorTests/Generator/Mocks/MockTargetGenerator.swift +++ b/Tests/TuistGeneratorTests/Generator/Mocks/MockTargetGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupport diff --git a/Tests/TuistGeneratorTests/Generator/Mocks/MockWorkspaceDescriptorGenerator.swift b/Tests/TuistGeneratorTests/Generator/Mocks/MockWorkspaceDescriptorGenerator.swift index 82b0d40be69..28bd7d34f1c 100644 --- a/Tests/TuistGeneratorTests/Generator/Mocks/MockWorkspaceDescriptorGenerator.swift +++ b/Tests/TuistGeneratorTests/Generator/Mocks/MockWorkspaceDescriptorGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupport diff --git a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift index 5d4a881bb3a..60174e5d4d1 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import struct TSCUtility.Version import TuistCore import TuistCoreTesting diff --git a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift index 916c12f5aaf..5fc01f42ac7 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift @@ -1,6 +1,6 @@ import Foundation import MockableTest -import TSCBasic +import Path import TuistCore import TuistCoreTesting import XcodeGraph diff --git a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift index bd74430ee72..3f705074e24 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import PathKit -import TSCBasic import TuistCore import TuistCoreTesting import XcodeGraph diff --git a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift index 1ac1884ca01..ca18ad5b80d 100644 --- a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupport diff --git a/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift index 09ef5f38416..5a232ac5389 100644 --- a/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import XcodeGraph diff --git a/Tests/TuistGeneratorTests/Generator/TestData/GeneratedProject+TestData.swift b/Tests/TuistGeneratorTests/Generator/TestData/GeneratedProject+TestData.swift index 3daa4b3901d..7fa8929c0bd 100644 --- a/Tests/TuistGeneratorTests/Generator/TestData/GeneratedProject+TestData.swift +++ b/Tests/TuistGeneratorTests/Generator/TestData/GeneratedProject+TestData.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeProj @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift index 3b456ada95b..73063b1cc10 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupport diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift index beb2cb83a7a..e9b50986e16 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupport diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorTests.swift index c6dd3f4f55f..12a0c23895e 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift index c65f826f1dd..f45801b0b5a 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupport diff --git a/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift b/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift index 0b8f44551c7..84607206c62 100644 --- a/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift +++ b/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph import XcodeGraphTesting diff --git a/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift b/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift index c114661c723..b43db168c07 100644 --- a/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift +++ b/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift @@ -1,6 +1,6 @@ import Foundation import GraphViz -import TSCBasic +import Path import TuistCore import XcodeGraph import XcodeGraphTesting diff --git a/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift b/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift index 2b8e5861453..41c5d869fb3 100644 --- a/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift index 7dc55f68c65..87d3cf2c9a3 100644 --- a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import struct TSCUtility.Version import TuistCore import TuistSupport diff --git a/Tests/TuistGeneratorTests/Linter/PackageLinterTests.swift b/Tests/TuistGeneratorTests/Linter/PackageLinterTests.swift index abbf2071579..fbae149394f 100644 --- a/Tests/TuistGeneratorTests/Linter/PackageLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/PackageLinterTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupport diff --git a/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift b/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift index 150236516f3..4e43a76edba 100644 --- a/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupport diff --git a/Tests/TuistGeneratorTests/Linter/SchemeLinterTests.swift b/Tests/TuistGeneratorTests/Linter/SchemeLinterTests.swift index d1450761e10..707c0935545 100644 --- a/Tests/TuistGeneratorTests/Linter/SchemeLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/SchemeLinterTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistGeneratorTests/Linter/SettingsLinterTests.swift b/Tests/TuistGeneratorTests/Linter/SettingsLinterTests.swift index 78c55e52174..401e793e27a 100644 --- a/Tests/TuistGeneratorTests/Linter/SettingsLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/SettingsLinterTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift index a111d8cef3e..e85b5c19641 100644 --- a/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph import XCTest @testable import TuistCore diff --git a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift index 06c61c6ee52..d16df7b42eb 100644 --- a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupport diff --git a/Tests/TuistGeneratorTests/Linter/TargetScriptLinterTests.swift b/Tests/TuistGeneratorTests/Linter/TargetScriptLinterTests.swift index b0cfe5f859c..9cf10736619 100644 --- a/Tests/TuistGeneratorTests/Linter/TargetScriptLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/TargetScriptLinterTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupport diff --git a/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift index 4720d60c3be..c909de001b0 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph import XcodeGraphTesting diff --git a/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift index e4846735ba2..853ab6c6d3f 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift index 126091a303c..ae19123aeec 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistGeneratorTests/ProjectMappers/IDETemplateMacrosMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/IDETemplateMacrosMapperTests.swift index 95935ef06b6..a1fa6eafb62 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/IDETemplateMacrosMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/IDETemplateMacrosMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistGenerator import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 6adac21cea2..541a877338c 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph import XcodeGraphTesting diff --git a/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift index e77af88c688..fe21bb16561 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistGeneratorTests/Utils/EmbedScriptGeneratorTests.swift b/Tests/TuistGeneratorTests/Utils/EmbedScriptGeneratorTests.swift index 4a98dc4177b..a5854ba7179 100644 --- a/Tests/TuistGeneratorTests/Utils/EmbedScriptGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Utils/EmbedScriptGeneratorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XCTest diff --git a/Tests/TuistGeneratorTests/Utils/Mocks/MockEmbedScriptGenerator.swift b/Tests/TuistGeneratorTests/Utils/Mocks/MockEmbedScriptGenerator.swift index 14787089fdb..7c72ffbdf3d 100644 --- a/Tests/TuistGeneratorTests/Utils/Mocks/MockEmbedScriptGenerator.swift +++ b/Tests/TuistGeneratorTests/Utils/Mocks/MockEmbedScriptGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Utils/Mocks/MockSynthesizedResourceInterfaceGenerator.swift b/Tests/TuistGeneratorTests/Utils/Mocks/MockSynthesizedResourceInterfaceGenerator.swift index ed84b390efa..57938d74fdc 100644 --- a/Tests/TuistGeneratorTests/Utils/Mocks/MockSynthesizedResourceInterfaceGenerator.swift +++ b/Tests/TuistGeneratorTests/Utils/Mocks/MockSynthesizedResourceInterfaceGenerator.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import XcodeGraph @testable import TuistGenerator diff --git a/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift b/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift index 2ffb2ae2aa5..d0fb950d114 100644 --- a/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift +++ b/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Tests/TuistKitIntegrationTests/Utils/ManifestGraphLoaderIntegrationTests.swift b/Tests/TuistKitIntegrationTests/Utils/ManifestGraphLoaderIntegrationTests.swift index 8c746149fd3..b86ed61bd7f 100644 --- a/Tests/TuistKitIntegrationTests/Utils/ManifestGraphLoaderIntegrationTests.swift +++ b/Tests/TuistKitIntegrationTests/Utils/ManifestGraphLoaderIntegrationTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistLoader import TuistSupport diff --git a/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift index f075adb088e..5697e1242b1 100644 --- a/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift @@ -1,6 +1,6 @@ import Foundation import MockableTest -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistLoader diff --git a/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift index 76d950ad748..655872634ab 100644 --- a/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift @@ -1,5 +1,5 @@ import MockableTest -import TSCBasic +import Path import TuistLoader import TuistServer import TuistSupport diff --git a/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift index e40df94bfa3..69873e06f90 100644 --- a/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift @@ -1,6 +1,6 @@ import Foundation import MockableTest -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistLoader diff --git a/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift index 0d10dbe47f7..be02c82e377 100644 --- a/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift @@ -1,6 +1,6 @@ import Foundation import MockableTest -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistLoader diff --git a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift index 01ab412638e..29f6ad16874 100644 --- a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift +++ b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift @@ -3,7 +3,7 @@ import Difference import Foundation import TSCUtility import XCTest -@testable import TSCBasic +@testable import Path @testable import TuistCore @testable import TuistKit @testable import TuistSupport diff --git a/Tests/TuistKitTests/Dot/MockDotGraphGenerator.swift b/Tests/TuistKitTests/Dot/MockDotGraphGenerator.swift index acd5e927cea..800311c7dde 100644 --- a/Tests/TuistKitTests/Dot/MockDotGraphGenerator.swift +++ b/Tests/TuistKitTests/Dot/MockDotGraphGenerator.swift @@ -1,6 +1,6 @@ import Foundation import GraphViz -import TSCBasic +import Path import TuistGenerator import TuistKit import XcodeGraph diff --git a/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift b/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift index aa258f41cba..78626056053 100644 --- a/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift +++ b/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistGenerator import XcodeGraph diff --git a/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift b/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift index 2e77feca20e..835b2b27e83 100644 --- a/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift +++ b/Tests/TuistKitTests/Mappers/Factories/GraphMapperFactoryTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistAutomation import TuistCoreTesting import TuistLoader diff --git a/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift b/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift index db68bcb6518..0079ee98871 100644 --- a/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift +++ b/Tests/TuistKitTests/Mappers/Factories/ProjectMapperFactoryTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistAutomation import TuistCoreTesting import TuistLoader diff --git a/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift b/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift index 533802013f1..8522e4410a8 100644 --- a/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift +++ b/Tests/TuistKitTests/Mappers/Factories/WorkspaceMapperFactoryTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility import TuistCoreTesting import TuistLoader diff --git a/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift b/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift index ebb517e6f7d..8b4a917958a 100644 --- a/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift +++ b/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistSupportTesting diff --git a/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift b/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift index 160148e4348..8f666182a5c 100644 --- a/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift +++ b/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XcodeGraph import XCTest @testable import TuistCore diff --git a/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift b/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift index 881e3855f18..cbcfcdd9cd8 100644 --- a/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift +++ b/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCoreTesting import TuistGenerator import TuistSupport diff --git a/Tests/TuistKitTests/Mappers/Workspace/TuistWorkspaceRenderMarkdownReadmeMapperTests.swift b/Tests/TuistKitTests/Mappers/Workspace/TuistWorkspaceRenderMarkdownReadmeMapperTests.swift index 30724c66057..97c9aabd0dd 100644 --- a/Tests/TuistKitTests/Mappers/Workspace/TuistWorkspaceRenderMarkdownReadmeMapperTests.swift +++ b/Tests/TuistKitTests/Mappers/Workspace/TuistWorkspaceRenderMarkdownReadmeMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import XcodeGraph diff --git a/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift b/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift index adfe5c3b545..b54e575d12c 100644 --- a/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift +++ b/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XcodeGraph import XcodeGraphTesting diff --git a/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift b/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift index d32d48ed4d5..c1be7d1dd18 100644 --- a/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift +++ b/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistLoader import XcodeGraph diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift index 0e66cfcc476..8c08d57519f 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility import TuistCore import TuistLoader diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift index c6d70c633d2..71052ba16d6 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift @@ -1,6 +1,6 @@ import Foundation import MockableTest -import TSCBasic +import Path import TuistCore import TuistLoader import TuistPlugin diff --git a/Tests/TuistKitTests/Services/BuildServiceTests.swift b/Tests/TuistKitTests/Services/BuildServiceTests.swift index 5961280936e..5f51f98f0d0 100644 --- a/Tests/TuistKitTests/Services/BuildServiceTests.swift +++ b/Tests/TuistKitTests/Services/BuildServiceTests.swift @@ -1,6 +1,6 @@ import Foundation import MockableTest -import TSCBasic +import Path import TSCUtility import TuistCore import TuistServer diff --git a/Tests/TuistKitTests/Services/CleanServiceTests.swift b/Tests/TuistKitTests/Services/CleanServiceTests.swift index 8b6aa214644..dafd8c570eb 100644 --- a/Tests/TuistKitTests/Services/CleanServiceTests.swift +++ b/Tests/TuistKitTests/Services/CleanServiceTests.swift @@ -1,6 +1,6 @@ import Foundation import MockableTest -import TSCBasic +import Path import TuistCore import TuistCoreTesting import TuistLoader diff --git a/Tests/TuistKitTests/Services/EditServiceTests.swift b/Tests/TuistKitTests/Services/EditServiceTests.swift index 0c5228b7562..8a936451c8e 100644 --- a/Tests/TuistKitTests/Services/EditServiceTests.swift +++ b/Tests/TuistKitTests/Services/EditServiceTests.swift @@ -1,5 +1,5 @@ import MockableTest -import TSCBasic +import Path import TuistCore import TuistLoader import XcodeGraph diff --git a/Tests/TuistKitTests/Services/GenerateServiceTests.swift b/Tests/TuistKitTests/Services/GenerateServiceTests.swift index ca9ba50fd2b..10359f7ff40 100644 --- a/Tests/TuistKitTests/Services/GenerateServiceTests.swift +++ b/Tests/TuistKitTests/Services/GenerateServiceTests.swift @@ -1,6 +1,6 @@ import Foundation import MockableTest -import TSCBasic +import Path import TuistCore import TuistLoader import TuistServer diff --git a/Tests/TuistKitTests/Services/GraphServiceTests.swift b/Tests/TuistKitTests/Services/GraphServiceTests.swift index 0c176925395..874712e22b7 100644 --- a/Tests/TuistKitTests/Services/GraphServiceTests.swift +++ b/Tests/TuistKitTests/Services/GraphServiceTests.swift @@ -1,8 +1,8 @@ import DOT import Foundation import GraphViz +import Path import ProjectAutomation -import TSCBasic import TuistPlugin import TuistSupport import XcodeGraph diff --git a/Tests/TuistKitTests/Services/InitServiceTests.swift b/Tests/TuistKitTests/Services/InitServiceTests.swift index f23929ff550..7a574ee45cb 100644 --- a/Tests/TuistKitTests/Services/InitServiceTests.swift +++ b/Tests/TuistKitTests/Services/InitServiceTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistScaffold import TuistSupport import XcodeGraph diff --git a/Tests/TuistKitTests/Services/InstallServiceTests.swift b/Tests/TuistKitTests/Services/InstallServiceTests.swift index 6778aef498c..7066662d6d5 100644 --- a/Tests/TuistKitTests/Services/InstallServiceTests.swift +++ b/Tests/TuistKitTests/Services/InstallServiceTests.swift @@ -1,6 +1,6 @@ import Foundation import MockableTest -import TSCBasic +import Path import TSCUtility import TuistCore import TuistCoreTesting diff --git a/Tests/TuistKitTests/Services/ListServiceTests.swift b/Tests/TuistKitTests/Services/ListServiceTests.swift index b406a87e247..2c41b62deaa 100644 --- a/Tests/TuistKitTests/Services/ListServiceTests.swift +++ b/Tests/TuistKitTests/Services/ListServiceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistPluginTesting import XcodeGraph import XcodeGraphTesting diff --git a/Tests/TuistKitTests/Services/Migration/MigrationCheckEmptyBuildSettingsServiceTests.swift b/Tests/TuistKitTests/Services/Migration/MigrationCheckEmptyBuildSettingsServiceTests.swift index 9d284ceb7ca..f67e253bad0 100644 --- a/Tests/TuistKitTests/Services/Migration/MigrationCheckEmptyBuildSettingsServiceTests.swift +++ b/Tests/TuistKitTests/Services/Migration/MigrationCheckEmptyBuildSettingsServiceTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XCTest diff --git a/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift b/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift index 995c01d0758..db773805cda 100644 --- a/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift +++ b/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift @@ -1,5 +1,5 @@ import MockableTest -import TSCBasic +import Path import TuistLoaderTesting import TuistSupport import TuistSupportTesting diff --git a/Tests/TuistKitTests/Services/Plugin/PluginBuildServiceTests.swift b/Tests/TuistKitTests/Services/Plugin/PluginBuildServiceTests.swift index 948ea77b6db..bb95bf4ac3c 100644 --- a/Tests/TuistKitTests/Services/Plugin/PluginBuildServiceTests.swift +++ b/Tests/TuistKitTests/Services/Plugin/PluginBuildServiceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistSupport import TuistSupportTesting import XCTest diff --git a/Tests/TuistKitTests/Services/Plugin/PluginRunServiceTests.swift b/Tests/TuistKitTests/Services/Plugin/PluginRunServiceTests.swift index ebc2f8d8896..972ce85125d 100644 --- a/Tests/TuistKitTests/Services/Plugin/PluginRunServiceTests.swift +++ b/Tests/TuistKitTests/Services/Plugin/PluginRunServiceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistSupport import TuistSupportTesting import XCTest diff --git a/Tests/TuistKitTests/Services/Plugin/PluginTestServiceTests.swift b/Tests/TuistKitTests/Services/Plugin/PluginTestServiceTests.swift index 02b24785b58..b21ef78768d 100644 --- a/Tests/TuistKitTests/Services/Plugin/PluginTestServiceTests.swift +++ b/Tests/TuistKitTests/Services/Plugin/PluginTestServiceTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistSupport import TuistSupportTesting import XCTest diff --git a/Tests/TuistKitTests/Services/RunServiceTests.swift b/Tests/TuistKitTests/Services/RunServiceTests.swift index e5e9792eeb9..6b0f9a09eab 100644 --- a/Tests/TuistKitTests/Services/RunServiceTests.swift +++ b/Tests/TuistKitTests/Services/RunServiceTests.swift @@ -1,6 +1,6 @@ import Foundation import MockableTest -import TSCBasic +import Path import struct TSCUtility.Version import TuistCore import TuistSupport diff --git a/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift b/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift index 37c76e6a4c7..11724e9b363 100644 --- a/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift +++ b/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift @@ -1,6 +1,6 @@ import Foundation import MockableTest -import TSCBasic +import Path import TuistCore import TuistLoader import TuistScaffold diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index a01cda54393..a0402c9f925 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -1,6 +1,6 @@ import Foundation import MockableTest -import TSCBasic +import Path import TuistAutomation import TuistCore import TuistLoader diff --git a/Tests/TuistKitTests/Services/TuistServiceTests.swift b/Tests/TuistKitTests/Services/TuistServiceTests.swift index 42a857c0950..af65f71b686 100644 --- a/Tests/TuistKitTests/Services/TuistServiceTests.swift +++ b/Tests/TuistKitTests/Services/TuistServiceTests.swift @@ -1,5 +1,5 @@ import MockableTest -import TSCBasic +import Path import TuistLoader import TuistPlugin import TuistPluginTesting diff --git a/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift b/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift index 16dc3dbb477..173610d67e9 100644 --- a/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift +++ b/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import TuistLoader diff --git a/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift b/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift index 5f3a5ce7b3e..eaf80198392 100644 --- a/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift +++ b/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistLoaderTests/Extensions/TuistTestCase+ManifestMappers.swift b/Tests/TuistLoaderTests/Extensions/TuistTestCase+ManifestMappers.swift index 9ac1c4f2839..997e40d1b23 100644 --- a/Tests/TuistLoaderTests/Extensions/TuistTestCase+ManifestMappers.swift +++ b/Tests/TuistLoaderTests/Extensions/TuistTestCase+ManifestMappers.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import TuistSupportTesting diff --git a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift index c754de35c9f..460143f6fc4 100644 --- a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift @@ -1,7 +1,7 @@ import Foundation import MockableTest +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import struct XcodeGraph.Plugins diff --git a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift index f772f8703b7..af30ac64399 100644 --- a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistSupport import XcodeGraph import XcodeGraphTesting diff --git a/Tests/TuistLoaderTests/Loaders/ManifestLoaderErrorTests.swift b/Tests/TuistLoaderTests/Loaders/ManifestLoaderErrorTests.swift index 60106ebd408..4d3b84e62d0 100644 --- a/Tests/TuistLoaderTests/Loaders/ManifestLoaderErrorTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ManifestLoaderErrorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Tests/TuistLoaderTests/Loaders/ManifestLoaderFactoryTests.swift b/Tests/TuistLoaderTests/Loaders/ManifestLoaderFactoryTests.swift index 08629ed4c86..4365269c831 100644 --- a/Tests/TuistLoaderTests/Loaders/ManifestLoaderFactoryTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ManifestLoaderFactoryTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift b/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift index c13fec5b2e7..e997070d9b0 100644 --- a/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XCTest diff --git a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift index 4bfd2dd7665..c93ecde4561 100644 --- a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift @@ -1,6 +1,6 @@ import Foundation import MockableTest -import TSCBasic +import Path import TSCUtility import TuistCore import TuistCoreTesting diff --git a/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift index a77b28facd3..d6484c31a05 100644 --- a/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift @@ -1,7 +1,7 @@ import Foundation import MockableTest +import Path import ProjectDescription -import TSCBasic import TuistSupport import XCTest diff --git a/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift index 8bac9967ac1..3cb4fe7050a 100644 --- a/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift index 527a21b4aea..f59607fc77b 100644 --- a/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/CodeCoverageMode+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/CodeCoverageMode+ManifestMapperTests.swift index 3d6f443e74f..a58410ffff9 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/CodeCoverageMode+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/CodeCoverageMode+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Configuration+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Configuration+ManifestMapperTests.swift index 2af1d4ae20b..23729073b32 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Configuration+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Configuration+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFileElement+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFileElement+ManifestMapperTests.swift index de4132d4295..7d87151c4a8 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFileElement+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFileElement+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFilesAction+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFilesAction+ManifestMapperTests.swift index ffb2be18311..a061ac132d7 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFilesAction+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/CopyFilesAction+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import XcodeGraph import XCTest diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/CoreDataModel+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/CoreDataModel+ManifestMapperTests.swift index c4891881ba2..76ef8de1da5 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/CoreDataModel+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/CoreDataModel+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph @@ -33,7 +33,7 @@ final class CoreDataModelManifestMapperTests: TuistUnitTestCase { let generatorPaths = GeneratorPaths(manifestDirectory: temporaryPath) try FileManager.default.createDirectory( - at: temporaryPath.appending(component: "model.xcdatamodeld").asURL, + at: URL(fileURLWithPath: temporaryPath.appending(component: "model.xcdatamodeld").pathString), withIntermediateDirectories: false ) try createVersionFile(xcVersion: xcVersionDataString(), temporaryPath: temporaryPath) @@ -63,7 +63,7 @@ final class CoreDataModelManifestMapperTests: TuistUnitTestCase { let generatorPaths = GeneratorPaths(manifestDirectory: temporaryPath) try FileManager.default.createDirectory( - at: temporaryPath.appending(component: "model.xcdatamodeld").asURL, + at: URL(fileURLWithPath: temporaryPath.appending(component: "model.xcdatamodeld").pathString), withIntermediateDirectories: false ) try createVersionFile( @@ -105,7 +105,7 @@ final class CoreDataModelManifestMapperTests: TuistUnitTestCase { let urlToCurrentVersion = temporaryPath.appending(try RelativePath(validating: "model.xcdatamodeld")) .appending(component: ".xccurrentversion") let data = try XCTUnwrap(xcVersion.data(using: .utf8)) - try data.write(to: urlToCurrentVersion.asURL) + try data.write(to: URL(fileURLWithPath: urlToCurrentVersion.pathString)) } private func xcVersionDataString() -> String { diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/FileElement+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/FileElement+ManifestMapperTests.swift index db5fabb255c..5fe7a5ff363 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/FileElement+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/FileElement+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Headers+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Headers+ManifestMapperTests.swift index 09d41b26fd8..4af3ad24606 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Headers+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Headers+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Platform+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Platform+ManifestMapperTests.swift index 4544e0243d6..f2021a2a254 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Platform+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Platform+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift index e8004783505..73a075ddcf2 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistLoaderTesting import TuistSupport diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceFileElementManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceFileElementManifestMapperTests.swift index f7df045b78f..0f7811a8bb4 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceFileElementManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceFileElementManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceSynthesizer+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceSynthesizer+ManifestMapperTests.swift index f806f642820..455281a36ec 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceSynthesizer+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceSynthesizer+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistLoaderTesting import TuistSupportTesting diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Scheme+ManifestMapper.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Scheme+ManifestMapper.swift index a9960f3b8ef..ee61b4f33e7 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Scheme+ManifestMapper.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Scheme+ManifestMapper.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Settings+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Settings+ManifestMapperTests.swift index 3c9c7b6af59..b4efe1372e7 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Settings+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Settings+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Stencil+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Stencil+ManifestMapperTests.swift index 59fd3a59ccc..0b050886a53 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Stencil+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Stencil+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistLoaderTesting import TuistSupportTesting diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Target+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Target+ManifestMapperTests.swift index 8926ef0efd5..1e27923e274 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Target+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Target+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XCTest diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift index eb211856e06..6d50f56f8f0 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetScript+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetScript+ManifestMapperTests.swift index 680b26cad1e..ce4751ed72a 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetScript+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetScript+ManifestMapperTests.swift @@ -1,6 +1,6 @@ import Foundation +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XcodeGraph diff --git a/Tests/TuistLoaderTests/Models/GeneratorPathsTests.swift b/Tests/TuistLoaderTests/Models/GeneratorPathsTests.swift index d44fbbe8180..5aa1539bd26 100644 --- a/Tests/TuistLoaderTests/Models/GeneratorPathsTests.swift +++ b/Tests/TuistLoaderTests/Models/GeneratorPathsTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistCore import TuistSupport import XCTest diff --git a/Tests/TuistLoaderTests/ProjectDescriptionHelpers/Mocks/MockProjectDescriptionHelpersHasher.swift b/Tests/TuistLoaderTests/ProjectDescriptionHelpers/Mocks/MockProjectDescriptionHelpersHasher.swift index 07e14a8a329..db376f891c2 100644 --- a/Tests/TuistLoaderTests/ProjectDescriptionHelpers/Mocks/MockProjectDescriptionHelpersHasher.swift +++ b/Tests/TuistLoaderTests/ProjectDescriptionHelpers/Mocks/MockProjectDescriptionHelpersHasher.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path @testable import TuistLoader final class MockProjectDescriptionHelpersHasher: ProjectDescriptionHelpersHashing { diff --git a/Tests/TuistLoaderTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasherTests.swift b/Tests/TuistLoaderTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasherTests.swift index 2f65defa41d..280710139ea 100644 --- a/Tests/TuistLoaderTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasherTests.swift +++ b/Tests/TuistLoaderTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasherTests.swift @@ -1,5 +1,5 @@ +import Path import ProjectDescription -import TSCBasic import TuistCore import TuistSupport import XCTest diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 25bbc8423c7..f9a48eecf17 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -1,5 +1,5 @@ +import Path import ProjectDescription -import TSCBasic import TSCUtility import TuistCore import TuistSupport diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift index 35ec87940a5..0d8565a72ed 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift @@ -1,5 +1,5 @@ +import Path import ProjectDescription -import TSCBasic import TSCUtility import TuistCore import TuistSupport diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift index b1745edde5d..b37c161cdef 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TuistCoreTesting import TuistSupportTesting import XCTest diff --git a/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift b/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift index 68ea7e96f4c..f2845019fc3 100644 --- a/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift +++ b/Tests/TuistLoaderTests/Utils/ManifestFilesLocatorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Tests/TuistLoaderTests/Utils/PluginsHelperTests.swift b/Tests/TuistLoaderTests/Utils/PluginsHelperTests.swift index bd6b37c8813..2e9c2a45194 100644 --- a/Tests/TuistLoaderTests/Utils/PluginsHelperTests.swift +++ b/Tests/TuistLoaderTests/Utils/PluginsHelperTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Tests/TuistLoaderTests/Utils/ProjectDescriptionSearchPathsTests.swift b/Tests/TuistLoaderTests/Utils/ProjectDescriptionSearchPathsTests.swift index 784c2aa1e2f..e8b4d4da3f0 100644 --- a/Tests/TuistLoaderTests/Utils/ProjectDescriptionSearchPathsTests.swift +++ b/Tests/TuistLoaderTests/Utils/ProjectDescriptionSearchPathsTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import TuistLoader diff --git a/Tests/TuistMigrationIntegrationTests/Utilities/EmptyBuildSettingsCheckerIntegrationTests.swift b/Tests/TuistMigrationIntegrationTests/Utilities/EmptyBuildSettingsCheckerIntegrationTests.swift index 3eba19f4418..5132d75a389 100644 --- a/Tests/TuistMigrationIntegrationTests/Utilities/EmptyBuildSettingsCheckerIntegrationTests.swift +++ b/Tests/TuistMigrationIntegrationTests/Utilities/EmptyBuildSettingsCheckerIntegrationTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Tests/TuistMigrationIntegrationTests/Utilities/SettingsToXCConfigExtractorIntegrationTests.swift b/Tests/TuistMigrationIntegrationTests/Utilities/SettingsToXCConfigExtractorIntegrationTests.swift index c2a771b1fb9..9611bbe789c 100644 --- a/Tests/TuistMigrationIntegrationTests/Utilities/SettingsToXCConfigExtractorIntegrationTests.swift +++ b/Tests/TuistMigrationIntegrationTests/Utilities/SettingsToXCConfigExtractorIntegrationTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Tests/TuistMigrationIntegrationTests/Utilities/TargetsExtractorIntegrationTests.swift b/Tests/TuistMigrationIntegrationTests/Utilities/TargetsExtractorIntegrationTests.swift index 6cd9142b0cd..5a699d55109 100644 --- a/Tests/TuistMigrationIntegrationTests/Utilities/TargetsExtractorIntegrationTests.swift +++ b/Tests/TuistMigrationIntegrationTests/Utilities/TargetsExtractorIntegrationTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Tests/TuistMigrationTests/Utilities/EmptyBuildSettingsCheckerTests.swift b/Tests/TuistMigrationTests/Utilities/EmptyBuildSettingsCheckerTests.swift index 7565e1c5470..540241263e0 100644 --- a/Tests/TuistMigrationTests/Utilities/EmptyBuildSettingsCheckerTests.swift +++ b/Tests/TuistMigrationTests/Utilities/EmptyBuildSettingsCheckerTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import TuistMigration @testable import TuistSupportTesting diff --git a/Tests/TuistPluginTests/PluginServiceTests.swift b/Tests/TuistPluginTests/PluginServiceTests.swift index 43848bc4701..49b10f4d1db 100644 --- a/Tests/TuistPluginTests/PluginServiceTests.swift +++ b/Tests/TuistPluginTests/PluginServiceTests.swift @@ -1,5 +1,7 @@ import MockableTest -import ProjectDescription +import Path +import struct ProjectDescription.Plugin +import struct ProjectDescription.PluginLocation import TSCBasic import TuistCore import TuistCoreTesting @@ -134,13 +136,13 @@ final class PluginServiceTests: TuistUnitTestCase { ] ) var invokedCloneURL: String? - var invokedClonePath: AbsolutePath? + var invokedClonePath: Path.AbsolutePath? gitHandler.cloneToStub = { url, path in invokedCloneURL = url invokedClonePath = path } var invokedCheckoutID: String? - var invokedCheckoutPath: AbsolutePath? + var invokedCheckoutPath: Path.AbsolutePath? gitHandler.checkoutStub = { id, path in invokedCheckoutID = id invokedCheckoutPath = path @@ -178,13 +180,13 @@ final class PluginServiceTests: TuistUnitTestCase { ] ) var invokedCloneURL: String? - var invokedClonePath: AbsolutePath? + var invokedClonePath: Path.AbsolutePath? gitHandler.cloneToStub = { url, path in invokedCloneURL = url invokedClonePath = path } var invokedCheckoutID: String? - var invokedCheckoutPath: AbsolutePath? + var invokedCheckoutPath: Path.AbsolutePath? gitHandler.checkoutStub = { id, path in invokedCheckoutID = id invokedCheckoutPath = path @@ -321,7 +323,7 @@ final class PluginServiceTests: TuistUnitTestCase { let pluginName = "TestPlugin" let resourceTemplatesPath = pluginPath.appending(components: "ResourceSynthesizers") - try makeDirectories(resourceTemplatesPath) + try makeDirectories(.init(validating: resourceTemplatesPath.pathString)) manifestLoader.loadConfigStub = { _ in .test(plugins: [.local(path: .relativeToRoot(pluginPath.pathString))]) @@ -356,7 +358,7 @@ final class PluginServiceTests: TuistUnitTestCase { let pluginName = "TestPlugin" let resourceTemplatesPath = cachedPluginPath.appending(components: "ResourceSynthesizers") - try makeDirectories(resourceTemplatesPath) + try makeDirectories(.init(validating: resourceTemplatesPath.pathString)) manifestLoader.loadConfigStub = { _ in .test(plugins: [ProjectDescription.PluginLocation.git(url: pluginGitUrl, tag: pluginGitReference)]) @@ -397,7 +399,7 @@ final class PluginServiceTests: TuistUnitTestCase { ] } - try makeDirectories(templatePath) + try makeDirectories(.init(validating: templatePath.pathString)) // When manifestLoader.loadConfigStub = { _ in @@ -434,7 +436,7 @@ final class PluginServiceTests: TuistUnitTestCase { ] } - try makeDirectories(templatePath) + try makeDirectories(.init(validating: templatePath.pathString)) // When manifestLoader.loadConfigStub = { _ in diff --git a/Tests/TuistScaffoldIntegrationTests/Utils/TemplatesDirectoryLocatorIntegrationTests.swift b/Tests/TuistScaffoldIntegrationTests/Utils/TemplatesDirectoryLocatorIntegrationTests.swift index 4b34a6e04e7..ec64cd51595 100644 --- a/Tests/TuistScaffoldIntegrationTests/Utils/TemplatesDirectoryLocatorIntegrationTests.swift +++ b/Tests/TuistScaffoldIntegrationTests/Utils/TemplatesDirectoryLocatorIntegrationTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift b/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift index 392e423ac0e..892d84109e0 100644 --- a/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift +++ b/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph import XCTest diff --git a/Tests/TuistServerTests/Session/CloudSessionControllerTests.swift b/Tests/TuistServerTests/Session/CloudSessionControllerTests.swift index 3f8bc7a408e..50521b884cd 100644 --- a/Tests/TuistServerTests/Session/CloudSessionControllerTests.swift +++ b/Tests/TuistServerTests/Session/CloudSessionControllerTests.swift @@ -1,7 +1,7 @@ import Foundation import Mockable import MockableTest -import TSCBasic +import Path import TuistSupport import XCTest diff --git a/Tests/TuistSupportIntegrationTests/System/SystemIntegrationTests.swift b/Tests/TuistSupportIntegrationTests/System/SystemIntegrationTests.swift deleted file mode 100644 index ebbca4ae5e9..00000000000 --- a/Tests/TuistSupportIntegrationTests/System/SystemIntegrationTests.swift +++ /dev/null @@ -1,59 +0,0 @@ -import TSCBasic -import XCTest -@testable import TuistSupport -@testable import TuistSupportTesting - -final class SystemIntegrationTests: TuistTestCase { - var subject: System! - - override func setUp() { - super.setUp() - subject = System() - } - - override func tearDown() { - subject = nil - super.tearDown() - } - - func test_run_valid_command() { - XCTAssertNoThrow(try subject.run(["ls"])) - } - - func test_run_invalid_command() { - XCTAssertThrowsError(try subject.run(["abcdef", "ghi"])) - } - - func test_run_valid_command_that_returns_nonzero_exit() { - XCTAssertThrowsError(try subject.run(["ls", "abcdefghi"])) - } - - func test_run_output_is_redirected() throws { - var output = "" - try subject.run( - ["echo", "hola"], - verbose: false, - environment: System.shared.env, - redirection: .stream(stdout: { bytes in - output = String(decoding: bytes, as: Unicode.UTF8.self) - }, stderr: { _ in }) - ) - - XCTAssertEqual(output.spm_chomp(), "hola") - } - - func test_run_errors() throws { - do { - try subject.runAndPrint(["/usr/bin/xcrun", "invalid"], verbose: false, environment: System.shared.env) - XCTFail("expected command to fail but it did not") - } catch { - XCTAssertTrue(error is TuistSupport.SystemError) - } - } - - func sandbox(_ name: String, value: String, do block: () throws -> Void) rethrows { - try? ProcessEnv.setVar(name, value: value) - _ = try? block() - try? ProcessEnv.unsetVar(name) - } -} diff --git a/Tests/TuistSupportTests/Extensions/AbsolutePath+ExtrasTests.swift b/Tests/TuistSupportTests/Extensions/AbsolutePath+ExtrasTests.swift index 9f091634d83..0c599836557 100644 --- a/Tests/TuistSupportTests/Extensions/AbsolutePath+ExtrasTests.swift +++ b/Tests/TuistSupportTests/Extensions/AbsolutePath+ExtrasTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import TuistSupport diff --git a/Tests/TuistSupportTests/Extensions/FileManager+ExtrasTests.swift b/Tests/TuistSupportTests/Extensions/FileManager+ExtrasTests.swift index 463ce42cf4c..dfba2a5961e 100644 --- a/Tests/TuistSupportTests/Extensions/FileManager+ExtrasTests.swift +++ b/Tests/TuistSupportTests/Extensions/FileManager+ExtrasTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import TuistSupport diff --git a/Tests/TuistSupportTests/Extensions/String+ExtrasTests.swift b/Tests/TuistSupportTests/Extensions/String+ExtrasTests.swift index a5fe6b63e2c..ad502d71a5b 100644 --- a/Tests/TuistSupportTests/Extensions/String+ExtrasTests.swift +++ b/Tests/TuistSupportTests/Extensions/String+ExtrasTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TSCUtility import XCTest diff --git a/Tests/TuistSupportTests/Models/InvalidGlobTests.swift b/Tests/TuistSupportTests/Models/InvalidGlobTests.swift index 16e0d2643a6..1a8739f91db 100644 --- a/Tests/TuistSupportTests/Models/InvalidGlobTests.swift +++ b/Tests/TuistSupportTests/Models/InvalidGlobTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import TuistSupport @testable import TuistSupportTesting diff --git a/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift b/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift index 28a61df27ee..fff6b660977 100644 --- a/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift +++ b/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import TSCUtility import TuistCore import TuistSupport diff --git a/Tests/TuistSupportTests/System/SystemTests.swift b/Tests/TuistSupportTests/System/SystemTests.swift index 9484276282e..f184a3b176c 100644 --- a/Tests/TuistSupportTests/System/SystemTests.swift +++ b/Tests/TuistSupportTests/System/SystemTests.swift @@ -1,4 +1,5 @@ import Foundation +import Path import TSCBasic import XCTest @testable import TuistSupport diff --git a/Tests/TuistSupportTests/Utils/FileHandlerTests.swift b/Tests/TuistSupportTests/Utils/FileHandlerTests.swift index 81c0b43ea9c..117186e6b3f 100644 --- a/Tests/TuistSupportTests/Utils/FileHandlerTests.swift +++ b/Tests/TuistSupportTests/Utils/FileHandlerTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import TuistSupport @testable import TuistSupportTesting @@ -43,13 +43,13 @@ final class FileHandlerTests: TuistUnitTestCase { let temporaryPath = try temporaryPath() let tempFile = temporaryPath.appending(component: "Temporary") let destFile = temporaryPath.appending(component: "Destination") - try "content".write(to: tempFile.asURL, atomically: true, encoding: .utf8) + try "content".write(to: URL(fileURLWithPath: tempFile.pathString), atomically: true, encoding: .utf8) // When try subject.replace(destFile, with: tempFile) // Then - let content = try String(contentsOf: destFile.asURL) + let content = try String(contentsOf: URL(fileURLWithPath: destFile.pathString)) XCTAssertEqual(content, "content") } @@ -135,7 +135,7 @@ final class FileHandlerTests: TuistUnitTestCase { create: true ).path) let rootTempPath = tempPath.parentDirectory - try fileManager.removeItem(at: tempPath.asURL) + try fileManager.removeItem(at: URL(fileURLWithPath: tempPath.pathString)) let content = try fileManager.contentsOfDirectory(atPath: rootTempPath.pathString) return content.count } diff --git a/Tests/TuistSupportTests/Utils/OpenerTests.swift b/Tests/TuistSupportTests/Utils/OpenerTests.swift index fe6d2eea216..7c2ed604fb2 100644 --- a/Tests/TuistSupportTests/Utils/OpenerTests.swift +++ b/Tests/TuistSupportTests/Utils/OpenerTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import TuistSupport diff --git a/Tests/TuistSupportTests/Utils/TextTableTests.swift b/Tests/TuistSupportTests/Utils/TextTableTests.swift index df3beff7571..950b582b328 100644 --- a/Tests/TuistSupportTests/Utils/TextTableTests.swift +++ b/Tests/TuistSupportTests/Utils/TextTableTests.swift @@ -1,4 +1,4 @@ -import TSCBasic +import Path import XCTest @testable import TuistSupport diff --git a/Tests/XcodeGraphTests/Models/BinaryArchitectureTests.swift b/Tests/XcodeGraphTests/Models/BinaryArchitectureTests.swift index e6445069ae7..bc362aefbc2 100644 --- a/Tests/XcodeGraphTests/Models/BinaryArchitectureTests.swift +++ b/Tests/XcodeGraphTests/Models/BinaryArchitectureTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupport import XcodeGraph import XCTest diff --git a/Tests/XcodeGraphTests/Models/InfoPlistTests.swift b/Tests/XcodeGraphTests/Models/InfoPlistTests.swift index 808fea62267..d5415e3109f 100644 --- a/Tests/XcodeGraphTests/Models/InfoPlistTests.swift +++ b/Tests/XcodeGraphTests/Models/InfoPlistTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import TuistSupportTesting diff --git a/Tests/XcodeGraphTests/Models/LintingIssueTests.swift b/Tests/XcodeGraphTests/Models/LintingIssueTests.swift index d934b5a63c9..3fb9c45219f 100644 --- a/Tests/XcodeGraphTests/Models/LintingIssueTests.swift +++ b/Tests/XcodeGraphTests/Models/LintingIssueTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import XCTest @testable import TuistSupportTesting diff --git a/Tests/XcodeGraphTests/Models/ProjectTests.swift b/Tests/XcodeGraphTests/Models/ProjectTests.swift index ceb574895fa..e14f58ba617 100644 --- a/Tests/XcodeGraphTests/Models/ProjectTests.swift +++ b/Tests/XcodeGraphTests/Models/ProjectTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistCoreTesting import XcodeGraphTesting diff --git a/Tests/XcodeGraphTests/Models/SettingsTests.swift b/Tests/XcodeGraphTests/Models/SettingsTests.swift index 1d27363d116..d78f7f74d97 100644 --- a/Tests/XcodeGraphTests/Models/SettingsTests.swift +++ b/Tests/XcodeGraphTests/Models/SettingsTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistSupportTesting import XCTest @testable import XcodeGraph diff --git a/Tests/XcodeGraphTests/Models/TargetScriptTests.swift b/Tests/XcodeGraphTests/Models/TargetScriptTests.swift index fb5359e2fee..c613bb01ebd 100644 --- a/Tests/XcodeGraphTests/Models/TargetScriptTests.swift +++ b/Tests/XcodeGraphTests/Models/TargetScriptTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import XCTest @testable import XcodeGraph diff --git a/Tests/XcodeGraphTests/Models/TargetTests.swift b/Tests/XcodeGraphTests/Models/TargetTests.swift index 4fdc3f57c43..d9ada08cfbc 100644 --- a/Tests/XcodeGraphTests/Models/TargetTests.swift +++ b/Tests/XcodeGraphTests/Models/TargetTests.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path import TuistCore import TuistSupport import XCTest diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index 6eb5885e5a2..4056a0ed2d2 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -111,7 +111,7 @@ public enum Module: String, CaseIterable { fileprivate var sharedDependencies: [TargetDependency] { return [ - .external(name: "SwiftToolsSupport"), + .external(name: "Path"), .external(name: "SystemPackage"), ] } @@ -212,13 +212,16 @@ public enum Module: String, CaseIterable { .target(name: Module.automation.targetName), .external(name: "GraphViz"), .external(name: "ArgumentParser"), + .external(name: "SwiftToolsSupport"), ] case .tuistBenchmark: [ + .external(name: "SwiftToolsSupport"), .external(name: "ArgumentParser"), ] case .tuistFixtureGenerator: [ + .external(name: "SwiftToolsSupport"), .external(name: "ArgumentParser"), ] case .projectAutomation, .projectDescription: @@ -226,6 +229,7 @@ public enum Module: String, CaseIterable { case .support: [ .target(name: Module.projectDescription.targetName), + .external(name: "SwiftToolsSupport"), .external(name: "AnyCodable"), .external(name: "XcodeProj"), .external(name: "KeychainAccess"), @@ -249,6 +253,7 @@ public enum Module: String, CaseIterable { .target(name: Module.analytics.targetName), .target(name: Module.plugin.targetName), .target(name: Module.xcodeProjectGenerator.targetName), + .external(name: "SwiftToolsSupport"), .external(name: "ArgumentParser"), .external(name: "GraphViz"), .external(name: "AnyCodable"), @@ -264,6 +269,7 @@ public enum Module: String, CaseIterable { .target(name: Module.support.targetName), .target(name: Module.xcodeProjectGenerator.targetName), .external(name: "XcodeProj"), + .external(name: "SwiftToolsSupport"), ] case .generator: [ @@ -275,6 +281,7 @@ public enum Module: String, CaseIterable { .external(name: "StencilSwiftKit"), .external(name: "XcodeProj"), .external(name: "GraphViz"), + .external(name: "SwiftToolsSupport"), ] case .scaffold: [ @@ -291,6 +298,7 @@ public enum Module: String, CaseIterable { .target(name: Module.support.targetName), .target(name: Module.projectDescription.targetName), .external(name: "XcodeProj"), + .external(name: "SwiftToolsSupport"), ] case .asyncQueue: [ @@ -307,6 +315,7 @@ public enum Module: String, CaseIterable { .target(name: Module.loader.targetName), .target(name: Module.support.targetName), .target(name: Module.scaffold.targetName), + .external(name: "SwiftToolsSupport"), ] case .analytics: [ @@ -324,6 +333,7 @@ public enum Module: String, CaseIterable { .target(name: Module.support.targetName), .external(name: "PathKit"), .external(name: "XcodeProj"), + .external(name: "SwiftToolsSupport"), ] case .dependencies: [ @@ -571,7 +581,6 @@ public enum Module: String, CaseIterable { .target(name: Module.core.testingTargetName!), .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.loader.testingTargetName!), - .external(name: "SwiftToolsSupport"), .external(name: "XcodeProj"), ] case .kit: From 743e53c55c1d4f4d0866ea511d4a0ac99f78e603 Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Mon, 10 Jun 2024 08:28:54 -0400 Subject: [PATCH 343/509] Remove @Atomic (#6352) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Extract `ThreadSafe` to allow usage outside of `Array` Migrates `ThreadSafe` to use `os_unfair_lock` in order to enable broader usage across the codebase. The docs for `DispatchQueue` mention limiting the number of instances of queues created to avoid [excessive thread creation](https://developer.apple.com/documentation/dispatch/dispatchqueue#3136752). * Adding `Caching` and `ThrowableCaching` types * Extract `SwiftVersionProviding` from `System` This enables caching without having a coupling to `System.shared` * Migrate the rest of the caching use cases to `ThrowableCaching` * Remove `@Atomic` completely * Annotate ThreadSafe with `Sendable` * Migrate TuistSupport’s singletons to `ThreadSafe` * Fix Tests * Linting * Linting * Fix tests after rebasing on `main` * Rebase on main * Linting * Fix compilation issue after merging * Add missing dependency --------- Co-authored-by: Pedro --- .../TuistAcceptanceTestCase.swift | 2 +- .../Utils/RootDirectoryLocator.swift | 8 +-- .../ProjectEditor/ProjectEditorMapper.swift | 2 +- .../Loaders/CachedManifestLoader.swift | 38 +++++------ .../ProjectDescriptionHelpersHasher.swift | 2 +- .../PackageInfoMapper.swift | 2 +- Sources/TuistSupport/Atomic.swift | 36 ---------- .../Extensions/Array+ExecutionContext.swift | 28 ++------ .../System/SwiftVersionProviding.swift | 67 +++++++++++++++++++ Sources/TuistSupport/System/System.swift | 48 ++----------- Sources/TuistSupport/System/Systeming.swift | 12 ---- Sources/TuistSupport/Utils/Cached.swift | 57 ++++++++++++++++ .../Utils/DeveloperEnvironment.swift | 64 ++++++++++-------- Sources/TuistSupport/Utils/Environment.swift | 11 ++- Sources/TuistSupport/Utils/FileHandler.swift | 8 ++- Sources/TuistSupport/Utils/ThreadSafe.swift | 60 +++++++++++++++++ .../TuistSupport/Xcode/XcodeController.swift | 30 ++++----- .../TestCase/TuistTestCase.swift | 4 +- .../TestCase/TuistUnitTestCase.swift | 21 ++++-- .../Utils/MockSystem.swift | 18 ----- .../Xcode/Mocks/MockXcodeController.swift | 26 +++++-- ...ltipleConfigurationsIntegrationTests.swift | 8 ++- .../Generator/BuildPhaseGeneratorTests.swift | 16 ++++- .../ProjectDescriptorGeneratorTests.swift | 6 +- .../WorkspaceDescriptorGeneratorTests.swift | 7 +- ...paceSettingsDescriptorGeneratorTests.swift | 7 +- .../CommandEnvironmentVariableTests.swift | 4 +- .../ProjectEditorMapperTests.swift | 7 +- ...ProjectDescriptionHelpersHasherTests.swift | 5 +- .../PackageInfoMapperTests.swift | 12 +++- Tuist/ProjectDescriptionHelpers/Module.swift | 1 + 31 files changed, 382 insertions(+), 235 deletions(-) delete mode 100644 Sources/TuistSupport/Atomic.swift create mode 100644 Sources/TuistSupport/System/SwiftVersionProviding.swift create mode 100644 Sources/TuistSupport/Utils/Cached.swift create mode 100644 Sources/TuistSupport/Utils/ThreadSafe.swift diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift index b7f60a3c32e..835e7b2ef0b 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift @@ -42,7 +42,7 @@ open class TuistAcceptanceTestCase: XCTestCase { do { // Environment environment = try MockEnvironment() - Environment.shared = environment + Environment._shared.mutate { $0 = environment } } catch { XCTFail("Failed to setup environment") } diff --git a/Sources/TuistCore/Utils/RootDirectoryLocator.swift b/Sources/TuistCore/Utils/RootDirectoryLocator.swift index fd35a427e59..332ecd499df 100644 --- a/Sources/TuistCore/Utils/RootDirectoryLocator.swift +++ b/Sources/TuistCore/Utils/RootDirectoryLocator.swift @@ -16,7 +16,7 @@ public protocol RootDirectoryLocating { public final class RootDirectoryLocator: RootDirectoryLocating { private let fileHandler: FileHandling = FileHandler.shared /// This cache avoids having to traverse the directories hierarchy every time the locate method is called. - @Atomic private var cache: [AbsolutePath: AbsolutePath] = [:] + private let cache: ThreadSafe<[AbsolutePath: AbsolutePath]> = ThreadSafe([:]) public init() {} @@ -45,7 +45,7 @@ public final class RootDirectoryLocator: RootDirectoryLocating { // MARK: - Fileprivate fileprivate func cached(path: AbsolutePath) -> AbsolutePath? { - cache[path] + cache.value[path] } /// This method caches the root directory of path, and all its parents up to the root directory. @@ -54,10 +54,10 @@ public final class RootDirectoryLocator: RootDirectoryLocating { /// - path: Path for which we are caching the root directory. fileprivate func cache(rootDirectory: AbsolutePath, for path: AbsolutePath) { if path != rootDirectory { - _cache.modify { $0[path] = rootDirectory } + cache.mutate { $0[path] = rootDirectory } cache(rootDirectory: rootDirectory, for: path.parentDirectory) } else if path == rootDirectory { - _cache.modify { $0[path] = rootDirectory } + cache.mutate { $0[path] = rootDirectory } } } } diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift index 30462c74f6f..66889c9da7e 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift @@ -54,7 +54,7 @@ final class ProjectEditorMapper: ProjectEditorMapping { projectDescriptionSearchPath: AbsolutePath ) throws -> Graph { logger.notice("Building the editable project graph") - let swiftVersion = try System.shared.swiftVersion() + let swiftVersion = try SwiftVersionProvider.shared.swiftVersion() let pluginsProject = mapPluginsProject( pluginManifests: editablePluginManifests, diff --git a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift index 02aeefa1403..b015c4c36db 100644 --- a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift @@ -22,9 +22,9 @@ public class CachedManifestLoader: ManifestLoading { private let tuistVersion: String private let decoder = JSONDecoder() private let encoder = JSONEncoder() - @Atomic private var helpersCache: [AbsolutePath: String?] = [:] - @Atomic private var pluginsHashCache: String? - @Atomic private var cacheDirectory: AbsolutePath! + private let helpersCache: ThreadSafe<[AbsolutePath: String?]> = ThreadSafe([:]) + private let pluginsHashCache: ThreadSafe = ThreadSafe(nil) + private let cacheDirectory: ThrowableCaching public convenience init(manifestLoader: ManifestLoading = ManifestLoader()) { let environment = TuistSupport.Environment.shared @@ -55,12 +55,14 @@ public class CachedManifestLoader: ManifestLoading { self.environment = environment self.cacheDirectoryProviderFactory = cacheDirectoryProviderFactory self.tuistVersion = tuistVersion + cacheDirectory = ThrowableCaching { + try cacheDirectoryProviderFactory.cacheDirectories().tuistCacheDirectory(for: .manifests) + } } public func loadConfig(at path: AbsolutePath) throws -> ProjectDescription.Config { try load(manifest: .config, at: path) { let projectDescriptionConfig = try manifestLoader.loadConfig(at: path) - cacheDirectory = try cacheDirectoryProviderFactory.cacheDirectories().tuistCacheDirectory(for: .manifests) return projectDescriptionConfig } } @@ -110,17 +112,13 @@ public class CachedManifestLoader: ManifestLoading { } public func register(plugins: Plugins) throws { - pluginsHashCache = try calculatePluginsHash(for: plugins) + try pluginsHashCache.mutate { $0 = try calculatePluginsHash(for: plugins) } try manifestLoader.register(plugins: plugins) } // MARK: - Private private func load(manifest: Manifest, at path: AbsolutePath, loader: () throws -> T) throws -> T { - if cacheDirectory == nil { - cacheDirectory = try cacheDirectoryProviderFactory.cacheDirectories().tuistCacheDirectory(for: .manifests) - } - let manifestPath = path.appending(component: manifest.fileName(path)) guard fileHandler.exists(manifestPath) else { throw ManifestLoaderError.manifestNotFound(manifest, path) @@ -137,7 +135,7 @@ public class CachedManifestLoader: ManifestLoading { return try loader() } - let cachedManifestPath = cachedPath(for: manifestPath) + let cachedManifestPath = try cachedPath(for: manifestPath) if let cached: T = loadCachedManifest( at: cachedManifestPath, hashes: hashes @@ -169,7 +167,7 @@ public class CachedManifestLoader: ManifestLoading { return Hashes( manifestHash: manifestHash, helpersHash: helpersHash, - pluginsHash: pluginsHashCache, + pluginsHash: pluginsHashCache.value, environmentHash: environmentHash ) } @@ -186,14 +184,16 @@ public class CachedManifestLoader: ManifestLoading { return nil } - if let cached = helpersCache[helpersDirectory] { - return cached - } + return try helpersCache.mutate { cache in + if let cached = cache[helpersDirectory] { + return cached + } - let hash = try projectDescriptionHelpersHasher.hash(helpersDirectory: helpersDirectory) - helpersCache[helpersDirectory] = hash + let hash = try projectDescriptionHelpersHasher.hash(helpersDirectory: helpersDirectory) + cache[helpersDirectory] = hash - return hash + return hash + } } private func calculatePluginsHash(for plugins: Plugins) throws -> String? { @@ -211,11 +211,11 @@ public class CachedManifestLoader: ManifestLoading { return tuistEnvVariables.joined(separator: "-").md5 } - private func cachedPath(for manifestPath: AbsolutePath) -> AbsolutePath { + private func cachedPath(for manifestPath: AbsolutePath) throws -> AbsolutePath { let pathHash = manifestPath.pathString.md5 let cacheVersion = CachedManifest.currentCacheVersion.description let fileName = [cacheVersion, pathHash].joined(separator: ".") - return cacheDirectory.appending(component: fileName) + return try cacheDirectory.value.appending(component: fileName) } private func loadCachedManifest( diff --git a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasher.swift b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasher.swift index 17d2f2cd153..ddd5b8b34b9 100644 --- a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasher.swift +++ b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasher.swift @@ -31,7 +31,7 @@ public final class ProjectDescriptionHelpersHasher: ProjectDescriptionHelpersHas .compactMap { $0.sha256() } .compactMap { $0.compactMap { byte in String(format: "%02x", byte) }.joined() } let tuistEnvVariables = Environment.shared.manifestLoadingVariables.map { "\($0.key)=\($0.value)" }.sorted() - let swiftVersion = try System.shared.swiftVersion() + let swiftVersion = try SwiftVersionProvider.shared.swiftVersion() #if DEBUG let debug = true #else diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 0efe79e743d..b3720a44d73 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -500,7 +500,7 @@ public final class PackageInfoMapper: PackageInfoMapping { } } - let version = try Version(versionString: try System.shared.swiftVersion(), usesLenientParsing: true) + let version = try Version(versionString: try SwiftVersionProvider.shared.swiftVersion(), usesLenientParsing: true) let minDeploymentTargets = ProjectDescription.DeploymentTargets.oldestVersions(for: version) let deploymentTargets = try ProjectDescription.DeploymentTargets.from( diff --git a/Sources/TuistSupport/Atomic.swift b/Sources/TuistSupport/Atomic.swift deleted file mode 100644 index df369b84317..00000000000 --- a/Sources/TuistSupport/Atomic.swift +++ /dev/null @@ -1,36 +0,0 @@ -import Foundation - -/// Ensures that writing and reading from property annotated with this property wrapper is thread safe -/// Taken from https://www.onswiftwings.com/posts/atomic-property-wrapper/ -@propertyWrapper -public class Atomic { - private var value: Value - private let lock = NSLock() - - public init(wrappedValue value: Value) { - self.value = value - } - - public var wrappedValue: Value { - get { load() } - set { store(newValue: newValue) } - } - - public func modify(_ accessBlock: (inout Value) -> Void) { - lock.lock() - defer { lock.unlock() } - accessBlock(&value) - } - - private func load() -> Value { - lock.lock() - defer { lock.unlock() } - return value - } - - private func store(newValue: Value) { - modify { - $0 = newValue - } - } -} diff --git a/Sources/TuistSupport/Extensions/Array+ExecutionContext.swift b/Sources/TuistSupport/Extensions/Array+ExecutionContext.swift index bed38f2964d..091187c3872 100644 --- a/Sources/TuistSupport/Extensions/Array+ExecutionContext.swift +++ b/Sources/TuistSupport/Extensions/Array+ExecutionContext.swift @@ -89,35 +89,17 @@ extension Array where Element: Sendable { // based on https://talk.objc.io/episodes/S01E90-concurrent-map // extension Array { - private final class ThreadSafe { - private var _value: A - private let queue = DispatchQueue(label: "ThreadSafe") - init(_ value: A) { - _value = value - } - - var value: A { - queue.sync { _value } - } - - func atomically(_ transform: @escaping (inout A) -> Void) { - queue.async { - transform(&self._value) - } - } - } - private func concurrentMap(_ transform: (Element) throws -> B) rethrows -> [B] { let result = ThreadSafe([Result?](repeating: nil, count: count)) DispatchQueue.concurrentPerform(iterations: count) { idx in let element = self[idx] do { let transformed = try transform(element) - result.atomically { + result.mutate { $0[idx] = .success(transformed) } } catch { - result.atomically { + result.mutate { $0[idx] = .failure(error) } } @@ -131,11 +113,11 @@ extension Array { let element = self[idx] do { guard let transformed = try transform(element) else { return } - result.atomically { + result.mutate { $0[idx] = .success(transformed) } } catch { - result.atomically { + result.mutate { $0[idx] = .failure(error) } } @@ -150,7 +132,7 @@ extension Array { do { try perform(element) } catch { - result.atomically { + result.mutate { $0[idx] = error } } diff --git a/Sources/TuistSupport/System/SwiftVersionProviding.swift b/Sources/TuistSupport/System/SwiftVersionProviding.swift new file mode 100644 index 00000000000..9a75ca30776 --- /dev/null +++ b/Sources/TuistSupport/System/SwiftVersionProviding.swift @@ -0,0 +1,67 @@ +import Foundation +import Mockable + +@Mockable +public protocol SwiftVersionProviding { + /// Returns the Swift version. + /// + /// - Returns: Swift version. + /// - Throws: An error if Swift is not installed or it exists unsuccessfully. + func swiftVersion() throws -> String + + /// Returns the Swift version, including the build number. + /// + /// - Returns: Swift version including the build number. + /// - Throws: An error if Swift is not installed or it exists unsuccessfully. + func swiftlangVersion() throws -> String +} + +public final class SwiftVersionProvider: SwiftVersionProviding { + public static var shared: SwiftVersionProviding { + _shared.value + } + + // swiftlint:disable:next identifier_name + static let _shared: ThreadSafe = ThreadSafe(SwiftVersionProvider(System.shared)) + // swiftlint:disable force_try + + /// Regex expression used to get the Swift version (for example, 5.9) from the output of the 'swift --version' command. + private static let swiftVersionRegex = try! NSRegularExpression(pattern: "Apple Swift version\\s(.+)\\s\\(.+\\)", options: []) + + /// Regex expression used to get the Swiftlang version (for example, 5.7.0.127.4) from the output of the 'swift --version' + /// command. + private static let swiftlangVersionRegex = try! NSRegularExpression(pattern: "swiftlang-(.+)\\sclang", options: []) + + // swiftlint:enable force_try + + public func swiftVersion() throws -> String { + try cachedSwiftVersion.value + } + + public func swiftlangVersion() throws -> String { + try cachedSwiftlangVersion.value + } + + let cachedSwiftVersion: ThrowableCaching + let cachedSwiftlangVersion: ThrowableCaching + + init(_ system: Systeming) { + cachedSwiftVersion = ThrowableCaching { + let output = try system.capture(["/usr/bin/xcrun", "swift", "--version"]) + let range = NSRange(location: 0, length: output.count) + guard let match = SwiftVersionProvider.swiftVersionRegex.firstMatch(in: output, options: [], range: range) else { + throw SystemError.parseSwiftVersion(output) + } + return NSString(string: output).substring(with: match.range(at: 1)).spm_chomp() + } + + cachedSwiftlangVersion = ThrowableCaching { + let output = try system.capture(["/usr/bin/xcrun", "swift", "--version"]) + let range = NSRange(location: 0, length: output.count) + guard let match = SwiftVersionProvider.swiftlangVersionRegex.firstMatch(in: output, options: [], range: range) else { + throw SystemError.parseSwiftVersion(output) + } + return NSString(string: output).substring(with: match.range(at: 1)).spm_chomp() + } + } +} diff --git a/Sources/TuistSupport/System/System.swift b/Sources/TuistSupport/System/System.swift index b7a7ce68a14..c62e1a98688 100644 --- a/Sources/TuistSupport/System/System.swift +++ b/Sources/TuistSupport/System/System.swift @@ -67,18 +67,12 @@ public enum SystemError: FatalError, Equatable { // swiftlint:disable:next type_body_length public final class System: Systeming { /// Shared system instance. - public static var shared: Systeming = System() - - // swiftlint:disable force_try - - /// Regex expression used to get the Swift version (for example, 5.9) from the output of the 'swift --version' command. - private static let swiftVersionRegex = try! NSRegularExpression(pattern: "Apple Swift version\\s(.+)\\s\\(.+\\)", options: []) - - /// Regex expression used to get the Swiftlang version (for example, 5.7.0.127.4) from the output of the 'swift --version' - /// command. - private static let swiftlangVersion = try! NSRegularExpression(pattern: "swiftlang-(.+)\\sclang", options: []) + public static var shared: Systeming { + _shared.value + } - // swiftlint:enable force_try + // swiftlint:disable:next identifier_name + static let _shared: ThreadSafe = ThreadSafe(System()) /// Convenience shortcut to the environment. public var env: [String: String] { @@ -174,38 +168,6 @@ public final class System: Systeming { try process.launch() } - @Atomic - var cachedSwiftVersion: String? - - @Atomic - var cachedSwiftlangVersion: String? - - public func swiftVersion() throws -> String { - if let cachedSwiftVersion { - return cachedSwiftVersion - } - let output = try capture(["/usr/bin/xcrun", "swift", "--version"]) - let range = NSRange(location: 0, length: output.count) - guard let match = System.swiftVersionRegex.firstMatch(in: output, options: [], range: range) else { - throw SystemError.parseSwiftVersion(output) - } - cachedSwiftVersion = NSString(string: output).substring(with: match.range(at: 1)).spm_chomp() - return cachedSwiftVersion! - } - - public func swiftlangVersion() throws -> String { - if let cachedSwiftlangVersion { - return cachedSwiftlangVersion - } - let output = try capture(["/usr/bin/xcrun", "swift", "--version"]) - let range = NSRange(location: 0, length: output.count) - guard let match = System.swiftlangVersion.firstMatch(in: output, options: [], range: range) else { - throw SystemError.parseSwiftVersion(output) - } - cachedSwiftlangVersion = NSString(string: output).substring(with: match.range(at: 1)).spm_chomp() - return cachedSwiftlangVersion! - } - public func which(_ name: String) throws -> String { try capture(["/usr/bin/env", "which", name]).spm_chomp() } diff --git a/Sources/TuistSupport/System/Systeming.swift b/Sources/TuistSupport/System/Systeming.swift index 568bd395c36..b3f5c05fe52 100644 --- a/Sources/TuistSupport/System/Systeming.swift +++ b/Sources/TuistSupport/System/Systeming.swift @@ -74,18 +74,6 @@ public protocol Systeming { /// - Throws: An error if the command fails. func async(_ arguments: [String]) throws - /// Returns the Swift version. - /// - /// - Returns: Swift version. - /// - Throws: An error if Swift is not installed or it exists unsuccessfully. - func swiftVersion() throws -> String - - /// Returns the Swift version, including the build number. - /// - /// - Returns: Swift version including the build number. - /// - Throws: An error if Swift is not installed or it exists unsuccessfully. - func swiftlangVersion() throws -> String - /// Runs /usr/bin/which passing the given tool. /// /// - Parameter name: Tool whose path will be obtained using which. diff --git a/Sources/TuistSupport/Utils/Cached.swift b/Sources/TuistSupport/Utils/Cached.swift new file mode 100644 index 00000000000..54359e55024 --- /dev/null +++ b/Sources/TuistSupport/Utils/Cached.swift @@ -0,0 +1,57 @@ +import Foundation + +@propertyWrapper +public final class Cached { + private let _cache: Caching + public var wrappedValue: T { + return _cache.value + } + + init(_ lazyValue: @Sendable @escaping () -> T) { + _cache = Caching(lazyValue) + } +} + +public final class Caching { + private let _value: ThreadSafe = ThreadSafe(nil) + public var value: T { + return _value.mutate { value in + if let value { + return value + } else { + let realizedValue = builder() + value = realizedValue + return realizedValue + } + } + } + + let builder: @Sendable () -> T + + public init(_ lazyValue: @Sendable @escaping () -> T) { + builder = lazyValue + } +} + +public final class ThrowableCaching { + private let _value: ThreadSafe = ThreadSafe(nil) + public var value: T { + get throws { + return try _value.mutate { value in + if let value { + return value + } else { + let realizedValue = try builder() + value = realizedValue + return realizedValue + } + } + } + } + + let builder: @Sendable () throws -> T + + public init(_ lazyValue: @Sendable @escaping () throws -> T) { + builder = lazyValue + } +} diff --git a/Sources/TuistSupport/Utils/DeveloperEnvironment.swift b/Sources/TuistSupport/Utils/DeveloperEnvironment.swift index c73438b7282..f0cb0cd6694 100644 --- a/Sources/TuistSupport/Utils/DeveloperEnvironment.swift +++ b/Sources/TuistSupport/Utils/DeveloperEnvironment.swift @@ -13,7 +13,12 @@ public final class DeveloperEnvironment: DeveloperEnvironmenting { /// Shared instance to be used publicly. /// Since the environment doesn't change during the execution of Tuist, we can cache /// state internally to speed up future access to environment attributes. - public internal(set) static var shared: DeveloperEnvironmenting = DeveloperEnvironment() + public static var shared: DeveloperEnvironmenting { + _shared.value + } + + // swiftlint:disable identifier_name + static let _shared: ThreadSafe = ThreadSafe(DeveloperEnvironment()) /// File handler instance. let fileHandler: FileHandling @@ -24,40 +29,41 @@ public final class DeveloperEnvironment: DeveloperEnvironmenting { private init(fileHandler: FileHandling) { self.fileHandler = fileHandler - } - // swiftlint:disable identifier_name - - /// https://pewpewthespells.com/blog/xcode_build_locations.html/// https://pewpewthespells.com/blog/xcode_build_locations.html - @Atomic private var _derivedDataDirectory: AbsolutePath? - public var derivedDataDirectory: AbsolutePath { - if let _derivedDataDirectory { - return _derivedDataDirectory - } - let location: AbsolutePath - if let customLocation = try? System.shared.capture([ - "/usr/bin/defaults", - "read", - "com.apple.dt.Xcode IDECustomDerivedDataLocation", - ]) { - location = try! AbsolutePath(validating: customLocation.chomp()) // swiftlint:disable:this force_try - } else { - // Default location - // swiftlint:disable:next force_try - location = fileHandler.homeDirectory.appending(try! RelativePath(validating: "Library/Developer/Xcode/DerivedData/")) + derivedDataDirectoryCache = ThrowableCaching { + let location: AbsolutePath + if let customLocation = try? System.shared.capture([ + "/usr/bin/defaults", + "read", + "com.apple.dt.Xcode IDECustomDerivedDataLocation", + ]) { + location = try! AbsolutePath(validating: customLocation.chomp()) // swiftlint:disable:this force_try + } else { + // Default location + location = fileHandler.homeDirectory + .appending(try! RelativePath( // swiftlint:disable:this force_try + validating: "Library/Developer/Xcode/DerivedData/" + )) + } + return location } - _derivedDataDirectory = location - return location } - @Atomic private var _architecture: MacArchitecture? + /// https://pewpewthespells.com/blog/xcode_build_locations.html + private let derivedDataDirectoryCache: ThrowableCaching + public var derivedDataDirectory: Path.AbsolutePath { + // swiftlint:disable:next force_try + try! derivedDataDirectoryCache.value + } + public var architecture: MacArchitecture { - if let _architecture { - return _architecture - } + // swiftlint:disable:next force_try + try! architectureCache.value + } + + private let architectureCache = ThrowableCaching { // swiftlint:disable:next force_try let output = try! System.shared.capture(["/usr/bin/uname", "-m"]).chomp() - _architecture = MacArchitecture(rawValue: output) - return _architecture! + return MacArchitecture(rawValue: output)! } // swiftlint:enable identifier_name } diff --git a/Sources/TuistSupport/Utils/Environment.swift b/Sources/TuistSupport/Utils/Environment.swift index 9c3c5db0f1e..e8cd38e5c7f 100644 --- a/Sources/TuistSupport/Utils/Environment.swift +++ b/Sources/TuistSupport/Utils/Environment.swift @@ -4,7 +4,7 @@ import Path /// Protocol that defines the interface of a local environment controller. /// It manages the local directory where tuistenv stores the tuist versions and user settings. -public protocol Environmenting: AnyObject { +public protocol Environmenting: AnyObject, Sendable { /// Returns the versions directory. var versionsDirectory: AbsolutePath { get } @@ -44,8 +44,13 @@ public protocol Environmenting: AnyObject { } /// Local environment controller. -public class Environment: Environmenting { - public static var shared: Environmenting = Environment() +public final class Environment: Environmenting { + public static var shared: Environmenting { + _shared.value + } + + // swiftlint:disable:next identifier_name + static let _shared: ThreadSafe = ThreadSafe(Environment()) /// Returns the default local directory. static let defaultDirectory = try! AbsolutePath( // swiftlint:disable:this force_try diff --git a/Sources/TuistSupport/Utils/FileHandler.swift b/Sources/TuistSupport/Utils/FileHandler.swift index c6ed0733ef4..a5f105dacc5 100644 --- a/Sources/TuistSupport/Utils/FileHandler.swift +++ b/Sources/TuistSupport/Utils/FileHandler.swift @@ -88,7 +88,13 @@ public protocol FileHandling: AnyObject { public class FileHandler: FileHandling { // MARK: - Attributes - public static var shared: FileHandling = FileHandler() + public static var shared: FileHandling { + _shared.value + } + + // swiftlint:disable:next identifier_name + static let _shared: ThreadSafe = ThreadSafe(FileHandler()) + private let fileManager: FileManager private let propertyListDecoder = PropertyListDecoder() diff --git a/Sources/TuistSupport/Utils/ThreadSafe.swift b/Sources/TuistSupport/Utils/ThreadSafe.swift new file mode 100644 index 00000000000..2f4330d70b3 --- /dev/null +++ b/Sources/TuistSupport/Utils/ThreadSafe.swift @@ -0,0 +1,60 @@ +import Foundation + +/// Type that ensures thread safe access to the underlying value. +public final class ThreadSafe: @unchecked Sendable { + private let _lock: UnsafeMutablePointer = { + let lock = UnsafeMutablePointer.allocate(capacity: 1) + lock.initialize(to: os_unfair_lock()) + return lock + }() + + private var _value: T + + /// Returns the value boxed by `ThreadSafe` + public var value: T { + return withValue { $0 } + } + + /** + Mutates in place the value boxed by `ThreadSafe` + + Example: + ``` + let array = ThreadSafe([1,2,3]) + array.mutate { $0.append(4) } + ``` + - Parameter with : block used to mutate the underlying value + */ + @discardableResult + public func mutate(_ body: (inout T) throws -> Result) rethrows -> Result { + os_unfair_lock_lock(_lock) + defer { os_unfair_lock_unlock(_lock) } + return try body(&_value) + } + + /// Like `mutate`, but passes the value as readonly, returning the result of the closure. + /// + /// Example: + /// ``` + /// let array = ThreadSafe([1, 2, 3]) + /// let sum = array.withValue { $0.reduce(0, +) } // 6 + /// ``` + public func withValue(_ body: (T) throws -> Result) rethrows -> Result { + return try mutate { + try body($0) + } + } + + /** + + Example: + ``` + let array = ThreadSafe([1,2,3]) // ThreadSafe> + let optional = ThreadSafe(nil) + let optionalString: ThreadSafe = ThreadSafe("Initial Value") + ``` + + - Parameter initial : initial value used within the Atmoic box + */ + public init(_ initial: T) { _value = initial } +} diff --git a/Sources/TuistSupport/Xcode/XcodeController.swift b/Sources/TuistSupport/Xcode/XcodeController.swift index 0dc53524a14..e8295000522 100644 --- a/Sources/TuistSupport/Xcode/XcodeController.swift +++ b/Sources/TuistSupport/Xcode/XcodeController.swift @@ -21,11 +21,21 @@ public class XcodeController: XcodeControlling, @unchecked Sendable { public init() {} /// Shared instance. - public static var shared: XcodeControlling = XcodeController() + public static var shared: XcodeControlling { + _shared.value + } + + // swiftlint:disable:next identifier_name + static let _shared: ThreadSafe = ThreadSafe(XcodeController()) /// Cached response of `xcode-select` command - @Atomic - private var selectedXcode: Xcode? + private let selectedXcode = ThrowableCaching { + guard let path = try? System.shared.capture(["xcode-select", "-p"]).spm_chomp() else { + return nil + } + + return try Xcode.read(path: try AbsolutePath(validating: path).parentDirectory.parentDirectory) + } /// Returns the selected Xcode. It uses xcode-select to determine /// the Xcode that is selected in the environment. @@ -33,19 +43,7 @@ public class XcodeController: XcodeControlling, @unchecked Sendable { /// - Returns: Selected Xcode. /// - Throws: An error if it can't be obtained. public func selected() throws -> Xcode? { - // Return cached value if available - if let cached = selectedXcode { - return cached - } - - // e.g. /Applications/Xcode.app/Contents/Developer - guard let path = try? System.shared.capture(["xcode-select", "-p"]).spm_chomp() else { - return nil - } - - let xcode = try Xcode.read(path: try AbsolutePath(validating: path).parentDirectory.parentDirectory) - selectedXcode = xcode - return xcode + return try selectedXcode.value } enum XcodeVersionError: FatalError { diff --git a/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift b/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift index 3f881b59bf9..02f2462da7f 100644 --- a/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift +++ b/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift @@ -131,14 +131,14 @@ open class TuistTestCase: XCTestCase { do { // Environment environment = try MockEnvironment() - Environment.shared = environment + Environment._shared.mutate { $0 = environment } } catch { XCTFail("Failed to setup environment") } // FileHandler fileHandler = MockFileHandler(temporaryDirectory: { try self.temporaryPath() }) - FileHandler.shared = fileHandler + FileHandler._shared.mutate { $0 = fileHandler } } override open func tearDown() { diff --git a/Sources/TuistSupportTesting/TestCase/TuistUnitTestCase.swift b/Sources/TuistSupportTesting/TestCase/TuistUnitTestCase.swift index 1e3b498dfe0..96a99a3c96b 100644 --- a/Sources/TuistSupportTesting/TestCase/TuistUnitTestCase.swift +++ b/Sources/TuistSupportTesting/TestCase/TuistUnitTestCase.swift @@ -7,38 +7,45 @@ open class TuistUnitTestCase: TuistTestCase { public var system: MockSystem! public var developerEnvironment: MockDeveloperEnvironment! public var xcodeController: MockXcodeController! + public var swiftVersionProvider: MockSwiftVersionProviding! override open func setUp() { super.setUp() // System system = MockSystem() - System.shared = system + System._shared.mutate { $0 = system } + + swiftVersionProvider = MockSwiftVersionProviding() + SwiftVersionProvider._shared.mutate { $0 = swiftVersionProvider } // Xcode controller xcodeController = MockXcodeController() - XcodeController.shared = xcodeController + XcodeController._shared.mutate { $0 = xcodeController } // Developer environment developerEnvironment = MockDeveloperEnvironment() - DeveloperEnvironment.shared = developerEnvironment + DeveloperEnvironment._shared.mutate { $0 = developerEnvironment } } override open func tearDown() { // System system = nil - System.shared = System() + System._shared.mutate { $0 = System() } + + swiftVersionProvider = nil + SwiftVersionProvider._shared.mutate { $0 = SwiftVersionProvider(System.shared) } // Xcode controller xcodeController = nil - XcodeController.shared = XcodeController() + XcodeController._shared.mutate { $0 = XcodeController() } // Environment environment = nil - Environment.shared = Environment() + Environment._shared.mutate { $0 = Environment() } // Developer environment developerEnvironment = nil - DeveloperEnvironment.shared = DeveloperEnvironment() + DeveloperEnvironment._shared.mutate { $0 = DeveloperEnvironment() } super.tearDown() } diff --git a/Sources/TuistSupportTesting/Utils/MockSystem.swift b/Sources/TuistSupportTesting/Utils/MockSystem.swift index c31e227322d..0aa7391ceae 100644 --- a/Sources/TuistSupportTesting/Utils/MockSystem.swift +++ b/Sources/TuistSupportTesting/Utils/MockSystem.swift @@ -11,8 +11,6 @@ public final class MockSystem: Systeming { public var stubs: [String: (stderror: String?, stdout: String?, exitstatus: Int?)] = [:] private var calls: [String] = [] public var whichStub: ((String) throws -> String?)? - public var swiftVersionStub: (() throws -> String)? - public var swiftlangVersionStub: (() throws -> String)? public init() {} @@ -98,22 +96,6 @@ public final class MockSystem: Systeming { } } - public func swiftVersion() throws -> String { - if let swiftVersionStub { - return try swiftVersionStub() - } else { - throw TestError("Call to non-stubbed method swiftVersion") - } - } - - public func swiftlangVersion() throws -> String { - if let swiftlangVersion = swiftlangVersionStub { - return try swiftlangVersion() - } else { - throw TestError("Call to non-stubbed method swiftlangVersion") - } - } - public func which(_ name: String) throws -> String { if let path = try whichStub?(name) { return path diff --git a/Sources/TuistSupportTesting/Xcode/Mocks/MockXcodeController.swift b/Sources/TuistSupportTesting/Xcode/Mocks/MockXcodeController.swift index 8e91524b30d..3be0bf48b42 100644 --- a/Sources/TuistSupportTesting/Xcode/Mocks/MockXcodeController.swift +++ b/Sources/TuistSupportTesting/Xcode/Mocks/MockXcodeController.swift @@ -4,11 +4,29 @@ import TuistSupport import XCTest public final class MockXcodeController: XcodeControlling, @unchecked Sendable { - @Atomic - public var selectedStub: Result? + public var selectedStub: Result? { + get { + _selectedStub.value + } + set { + _selectedStub.mutate { $0 = newValue } + } + } + + // swiftlint:disable:next identifier_name + private var _selectedStub: ThreadSafe?> = ThreadSafe(nil) + + public var selectedVersionStub: Result { + get { + _selectedVersionStub.value + } + set { + _selectedVersionStub.mutate { $0 = newValue } + } + } - @Atomic - public var selectedVersionStub: Result = .success(Version(0, 0, 0)) + // swiftlint:disable:next identifier_name + public let _selectedVersionStub: ThreadSafe> = ThreadSafe(.success(Version(0, 0, 0))) public func selected() throws -> Xcode? { guard let selectedStub else { return nil } diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift index 42a62f69903..0b82e0fce58 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift @@ -1,3 +1,4 @@ +import MockableTest import Path import TSCBasic import TuistCore @@ -14,7 +15,10 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { override func setUp() { super.setUp() do { - system.swiftVersionStub = { "5.2" } + given(swiftVersionProvider) + .swiftVersion() + .willReturn("5.2") + xcodeController.selectedVersionStub = .success("11.0.0") try setupTestProject() } catch { @@ -518,7 +522,7 @@ private func extractBuildSettings(path: XcodePath) throws -> ExtractedBuildSetti arguments.append(scheme) } - let rawBuildSettings = try TSCBasic.Process.checkNonZeroExit(arguments: arguments) + let rawBuildSettings = try Process.checkNonZeroExit(arguments: arguments) return ExtractedBuildSettings(rawBuildSettings: rawBuildSettings) } diff --git a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift index 320c6fe5720..c429e86bf3d 100644 --- a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift @@ -1,4 +1,5 @@ import Foundation +import MockableTest import Path import TuistCore import TuistSupport @@ -1199,7 +1200,10 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { func test_generateTarget_actions() throws { // Given - system.swiftVersionStub = { "5.2" } + given(swiftVersionProvider) + .swiftVersion() + .willReturn("5.2") + let fileElements = ProjectFileElements([:]) let graph = Graph.test() let graphTraverser = GraphTraverser(graph: graph) @@ -1274,7 +1278,10 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { func test_generateTarget_action_custom_shell() throws { // Given - system.swiftVersionStub = { "5.2" } + given(swiftVersionProvider) + .swiftVersion() + .willReturn("5.2") + let fileElements = ProjectFileElements([:]) let graph = Graph.test() let graphTraverser = GraphTraverser(graph: graph) @@ -1340,7 +1347,10 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { func test_generateTarget_action_dependency_file() throws { // Given - system.swiftVersionStub = { "5.2" } + given(swiftVersionProvider) + .swiftVersion() + .willReturn("5.2") + let fileElements = ProjectFileElements([:]) let graph = Graph.test() let graphTraverser = GraphTraverser(graph: graph) diff --git a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift index 60174e5d4d1..633d4d3a55f 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift @@ -1,4 +1,5 @@ import Foundation +import MockableTest import Path import struct TSCUtility.Version import TuistCore @@ -16,7 +17,10 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { override func setUp() { super.setUp() - system.swiftVersionStub = { "5.2" } + given(swiftVersionProvider) + .swiftVersion() + .willReturn("5.2") + subject = ProjectDescriptorGenerator() } diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift index 73063b1cc10..01d8e585d00 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift @@ -1,4 +1,5 @@ import Foundation +import MockableTest import Path import TuistCore import TuistCoreTesting @@ -15,7 +16,11 @@ final class WorkspaceDescriptorGeneratorTests: TuistUnitTestCase { override func setUp() { super.setUp() - system.swiftVersionStub = { "5.2" } + + given(swiftVersionProvider) + .swiftVersion() + .willReturn("5.2") + subject = WorkspaceDescriptorGenerator(config: .init(projectGenerationContext: .serial)) } diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift index e9b50986e16..2b2e34147d6 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift @@ -1,4 +1,5 @@ import Foundation +import MockableTest import Path import TuistCore import TuistCoreTesting @@ -15,7 +16,11 @@ final class WorkspaceSettingsDescriptorGeneratorTests: TuistUnitTestCase { override func setUp() { super.setUp() - system.swiftVersionStub = { "5.2" } + + given(swiftVersionProvider) + .swiftVersion() + .willReturn("5.2") + subject = WorkspaceSettingsDescriptorGenerator() } diff --git a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift index 29f6ad16874..2466d46e197 100644 --- a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift +++ b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift @@ -15,12 +15,12 @@ final class CommandEnvironmentVariableTests: XCTestCase { override func setUp() { super.setUp() mockEnvironment = try! MockEnvironment() - Environment.shared = mockEnvironment + Environment._shared.mutate { $0 = mockEnvironment } } override func tearDown() { mockEnvironment = nil - Environment.shared = Environment() + Environment._shared.mutate { $0 = Environment() } super.tearDown() } diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift index 8c08d57519f..ac101f18c06 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift @@ -1,4 +1,5 @@ import Foundation +import MockableTest import Path import TSCUtility import TuistCore @@ -17,7 +18,11 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { override func setUp() { super.setUp() - system.swiftVersionStub = { "5.2" } + + given(swiftVersionProvider) + .swiftVersion() + .willReturn("5.2") + developerEnvironment.stubbedArchitecture = .arm64 swiftPackageManagerController = MockSwiftPackageManagerController() subject = ProjectEditorMapper( diff --git a/Tests/TuistLoaderTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasherTests.swift b/Tests/TuistLoaderTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasherTests.swift index 280710139ea..74d1b9015f0 100644 --- a/Tests/TuistLoaderTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasherTests.swift +++ b/Tests/TuistLoaderTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasherTests.swift @@ -1,3 +1,4 @@ +import MockableTest import Path import ProjectDescription import TuistCore @@ -12,7 +13,9 @@ class ProjectDescriptionHelpersHasherTests: TuistUnitTestCase { override func setUp() { super.setUp() - system.swiftVersionStub = { "5.2" } + given(swiftVersionProvider) + .swiftVersion() + .willReturn("5.2") subject = ProjectDescriptionHelpersHasher(tuistVersion: "3.2.1") } diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index f9a48eecf17..01d8ce69716 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -1,3 +1,4 @@ +import MockableTest import Path import ProjectDescription import TSCUtility @@ -16,7 +17,9 @@ final class PackageInfoMapperTests: TuistUnitTestCase { override func setUp() { super.setUp() - system.swiftVersionStub = { "5.9.0" } + given(swiftVersionProvider) + .swiftVersion() + .willReturn("5.9") subject = PackageInfoMapper() } @@ -418,7 +421,12 @@ final class PackageInfoMapperTests: TuistUnitTestCase { } func testMap_whenLegacySwift_usesLegacyIOSVersion() throws { - system.swiftVersionStub = { "5.6.0" } + // Reset is needed because `Mockable` was queueing the responses, the value in `setUp` would be emitted first and then + // this one. + swiftVersionProvider.reset() + given(swiftVersionProvider) + .swiftVersion() + .willReturn("5.6.0") let basePath = try temporaryPath() let sourcesPath = basePath.appending(try RelativePath(validating: "Package/Sources/Target1")) diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index 4056a0ed2d2..5529dac50da 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -641,6 +641,7 @@ public enum Module: String, CaseIterable { } dependencies.append(contentsOf: sharedDependencies) dependencies.append(.target(name: targetName)) + dependencies.append(.external(name: "MockableTest")) if let testingTargetName { dependencies.append(contentsOf: [.target(name: testingTargetName)]) } From e36f83a1232a3345fe998c94ab38359b0f4afc70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Mon, 10 Jun 2024 15:40:34 +0200 Subject: [PATCH 344/509] Consume the graph from `tuist/xcodegraph` (#6385) * Delete sources and tests * Add dependency * Fix targets graph * Use tuist/xcodegraph --- Package.resolved | 11 +- Package.swift | 31 +--- .../Utilities/TargetBuilder.swift | 6 +- .../XcodeBuildDestination+Find.swift | 4 +- .../Utilities/MockTargetBuilder.swift | 4 +- .../SchemeDescriptorsGenerator.swift | 2 +- Sources/TuistKit/Services/BuildService.swift | 4 +- Sources/TuistKit/Services/RunService.swift | 2 +- ...mpatibleXcodeVersions+ManifestMapper.swift | 6 +- .../Config+ManifestMapper.swift | 2 +- .../PackageSettings+ManifestMapper.swift | 2 +- .../PackageInfoMapper.swift | 2 +- Sources/XcodeGraph/Graph/GraphEdge.swift | 17 -- Sources/XcodeGraph/Models/AnalyzeAction.swift | 13 -- Sources/XcodeGraph/Models/Arguments.swift | 30 --- .../Models/AutogenerationOptions.swift | 6 - .../Models/BinaryArchitecture.swift | 24 --- .../Models/BuildConfiguration.swift | 58 ------ .../Models/BuildRule+CompilerSpec.swift | 59 ------ .../Models/BuildRule+FileType.swift | 54 ------ Sources/XcodeGraph/Models/BuildRule.swift | 53 ------ Sources/XcodeGraph/Models/Cloud.swift | 29 --- .../Models/CompatibleXcodeVersions.swift | 72 -------- .../Models/Dependencies/PackageSettings.swift | 45 ----- .../XcodeGraph/Models/DeploymentTargets.swift | 84 --------- Sources/XcodeGraph/Models/Destination.swift | 69 ------- .../Models/EnvironmentVariable.swift | 23 --- Sources/XcodeGraph/Models/FileCodeGen.swift | 15 -- .../XcodeGraph/Models/IDETemplateMacros.swift | 38 ---- .../XcodeGraph/Models/LaunchArgument.swift | 18 -- Sources/XcodeGraph/Models/LaunchStyle.swift | 6 - .../XcodeGraph/Models/MergedBinaryType.swift | 37 ---- .../Models/OnDemandResourcesTags.swift | 9 - Sources/XcodeGraph/Models/Platform.swift | 161 ---------------- .../XcodeGraph/Models/PlatformFilter.swift | 71 -------- .../XcodeGraph/Models/PluginLocation.swift | 41 ----- .../XcodeGraph/Models/PrivacyManifest.swift | 23 --- Sources/XcodeGraph/Models/ProfileAction.swift | 27 --- Sources/XcodeGraph/Models/ProjectGroup.swift | 5 - .../XcodeGraph/Models/ProjectOptions.swift | 172 ------------------ Sources/XcodeGraph/Models/Requirement.swift | 10 - .../Models/ResourceFileElements.swift | 15 -- Sources/XcodeGraph/Models/SDKSource.swift | 16 -- Sources/XcodeGraph/Models/SDKType.swift | 13 -- .../Models/SchemeDiagnosticsOptions.swift | 23 --- .../Models/ScreenCaptureFormat.swift | 6 - .../XcodeGraph/Models/SourceFileGlob.swift | 40 ---- .../XcodeGraph/Models/TestableTarget.swift | 29 --- .../XcodeGraph/Models/TestingOptions.swift | 10 - .../Models/WorkspaceGenerationOptions.swift | 104 ----------- .../Models/Condition+TestData.swift | 9 - .../Models/IDETemplateMacros+TestData.swift | 9 - .../Models/ProjectOptions+TestData.swift | 44 ----- .../ResourceSynthesizers+TestData.swift | 13 -- .../ProjectEditorMapperTests.swift | 2 +- .../Services/InstallServiceTests.swift | 4 +- .../Loaders/PackageSettingsLoaderTests.swift | 2 +- .../SwiftPackageManagerControllerTests.swift | 2 +- .../DependenciesGraphTests.swift | 16 -- .../Graph/GraphDependencyTests.swift | 45 ----- .../Graph/GraphTargetTests.swift | 15 -- Tests/XcodeGraphTests/Graph/GraphTests.swift | 15 -- .../Models/AnalyzeActionTests.swift | 15 -- .../Models/ArchiveActionTests.swift | 37 ---- .../Models/ArgumentsTests.swift | 25 --- .../Models/BuildActionTests.swift | 40 ---- .../Models/BuildConfigurationTests.swift | 58 ------ .../Models/BuildRule.CompilerSpecTests.swift | 15 -- .../Models/BuildRule.FileTypeTests.swift | 15 -- .../Models/BuildRuleTests.swift | 18 -- .../Models/CompatibleXcodeVersionsTests.swift | 84 --------- .../Models/CopyFileElementTests.swift | 23 --- .../Models/CopyFilesActionTests.swift | 22 --- .../Models/CoreDataModelTests.swift | 21 --- .../Models/ExecutionActionTests.swift | 24 --- .../Models/FileElementTests.swift | 23 --- .../XcodeGraphTests/Models/HeadersTests.swift | 25 --- .../Models/IDETemplateMacrosTests.swift | 58 ------ .../XcodeGraphTests/Models/PackageTests.swift | 45 ----- .../Models/PlatformFilterTests.swift | 26 --- .../Models/PlatformTests.swift | 108 ----------- .../Models/ProfileActionTests.swift | 32 ---- .../Models/ProjectGroupTests.swift | 15 -- .../Models/RawScriptBuildPhaseTests.swift | 20 -- .../Models/RequirementTests.swift | 23 --- .../Models/ResourceFileElementTests.swift | 33 ---- .../Models/ResourceSynthesizerTests.swift | 23 --- .../Models/RunActionTests.swift | 40 ---- .../Models/SDKSourceTests.swift | 23 --- .../XcodeGraphTests/Models/SchemeTests.swift | 15 -- .../Models/SourceFileTests.swift | 19 -- .../Models/TargetDependencyTests.swift | 64 ------- .../Models/TargetReferenceTests.swift | 18 -- .../Models/TestActionTests.swift | 15 -- .../Models/TestPlanTests.swift | 19 -- .../Models/TestableTargetTests.swift | 23 --- .../WorkspaceGenerationOptionsTests.swift | 15 -- .../Models/WorkspaceTests.swift | 18 -- Tuist/ProjectDescriptionHelpers/Module.swift | 110 +++++------ 99 files changed, 77 insertions(+), 2907 deletions(-) delete mode 100644 Sources/XcodeGraph/Graph/GraphEdge.swift delete mode 100644 Sources/XcodeGraph/Models/AnalyzeAction.swift delete mode 100644 Sources/XcodeGraph/Models/Arguments.swift delete mode 100644 Sources/XcodeGraph/Models/AutogenerationOptions.swift delete mode 100644 Sources/XcodeGraph/Models/BinaryArchitecture.swift delete mode 100644 Sources/XcodeGraph/Models/BuildConfiguration.swift delete mode 100644 Sources/XcodeGraph/Models/BuildRule+CompilerSpec.swift delete mode 100644 Sources/XcodeGraph/Models/BuildRule+FileType.swift delete mode 100644 Sources/XcodeGraph/Models/BuildRule.swift delete mode 100644 Sources/XcodeGraph/Models/Cloud.swift delete mode 100644 Sources/XcodeGraph/Models/CompatibleXcodeVersions.swift delete mode 100644 Sources/XcodeGraph/Models/Dependencies/PackageSettings.swift delete mode 100644 Sources/XcodeGraph/Models/DeploymentTargets.swift delete mode 100644 Sources/XcodeGraph/Models/Destination.swift delete mode 100644 Sources/XcodeGraph/Models/EnvironmentVariable.swift delete mode 100644 Sources/XcodeGraph/Models/FileCodeGen.swift delete mode 100644 Sources/XcodeGraph/Models/IDETemplateMacros.swift delete mode 100644 Sources/XcodeGraph/Models/LaunchArgument.swift delete mode 100644 Sources/XcodeGraph/Models/LaunchStyle.swift delete mode 100644 Sources/XcodeGraph/Models/MergedBinaryType.swift delete mode 100644 Sources/XcodeGraph/Models/OnDemandResourcesTags.swift delete mode 100644 Sources/XcodeGraph/Models/Platform.swift delete mode 100644 Sources/XcodeGraph/Models/PlatformFilter.swift delete mode 100644 Sources/XcodeGraph/Models/PluginLocation.swift delete mode 100644 Sources/XcodeGraph/Models/PrivacyManifest.swift delete mode 100644 Sources/XcodeGraph/Models/ProfileAction.swift delete mode 100644 Sources/XcodeGraph/Models/ProjectGroup.swift delete mode 100644 Sources/XcodeGraph/Models/ProjectOptions.swift delete mode 100644 Sources/XcodeGraph/Models/Requirement.swift delete mode 100644 Sources/XcodeGraph/Models/ResourceFileElements.swift delete mode 100644 Sources/XcodeGraph/Models/SDKSource.swift delete mode 100644 Sources/XcodeGraph/Models/SDKType.swift delete mode 100644 Sources/XcodeGraph/Models/SchemeDiagnosticsOptions.swift delete mode 100644 Sources/XcodeGraph/Models/ScreenCaptureFormat.swift delete mode 100644 Sources/XcodeGraph/Models/SourceFileGlob.swift delete mode 100644 Sources/XcodeGraph/Models/TestableTarget.swift delete mode 100644 Sources/XcodeGraph/Models/TestingOptions.swift delete mode 100644 Sources/XcodeGraph/Models/WorkspaceGenerationOptions.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Condition+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/IDETemplateMacros+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/ProjectOptions+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/ResourceSynthesizers+TestData.swift delete mode 100644 Tests/XcodeGraphTests/DependenciesGraph/DependenciesGraphTests.swift delete mode 100644 Tests/XcodeGraphTests/Graph/GraphDependencyTests.swift delete mode 100644 Tests/XcodeGraphTests/Graph/GraphTargetTests.swift delete mode 100644 Tests/XcodeGraphTests/Graph/GraphTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/AnalyzeActionTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/ArchiveActionTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/ArgumentsTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/BuildActionTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/BuildConfigurationTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/BuildRule.CompilerSpecTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/BuildRule.FileTypeTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/BuildRuleTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/CompatibleXcodeVersionsTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/CopyFileElementTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/CopyFilesActionTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/CoreDataModelTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/ExecutionActionTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/FileElementTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/HeadersTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/IDETemplateMacrosTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/PackageTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/PlatformFilterTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/PlatformTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/ProfileActionTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/ProjectGroupTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/RawScriptBuildPhaseTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/RequirementTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/ResourceFileElementTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/ResourceSynthesizerTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/RunActionTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/SDKSourceTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/SchemeTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/SourceFileTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/TargetDependencyTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/TargetReferenceTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/TestActionTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/TestPlanTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/TestableTargetTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/WorkspaceGenerationOptionsTests.swift delete mode 100644 Tests/XcodeGraphTests/Models/WorkspaceTests.swift diff --git a/Package.resolved b/Package.resolved index e293da34791..d5e3ca84104 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "355f9ed60b1d843fa8956e1b2c94f0be3e9c4591068b9955a571c0456e0e8a6c", + "originHash" : "026755a035a6925da2ead11d61025383dd47d8db6b0c23d6a14cb94e12523887", "pins" : [ { "identity" : "aexml", @@ -235,6 +235,15 @@ "version" : "2.0.1" } }, + { + "identity" : "xcodegraph", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tuist/XcodeGraph.git", + "state" : { + "revision" : "634fd424d7d7c43aca6598f223c01b2ecf353502", + "version" : "0.2.0" + } + }, { "identity" : "xcodeproj", "kind" : "remoteSourceControl", diff --git a/Package.swift b/Package.swift index 24881eb68a1..e496fce1d82 100644 --- a/Package.swift +++ b/Package.swift @@ -25,28 +25,6 @@ var targets: [Target] = [ swiftToolsSupportDependency, ] ), - .target( - name: "XcodeGraph", - dependencies: [ - pathDependency, - "AnyCodable", - "TuistSupport", - "Mockable", - ], - swiftSettings: [ - .define("MOCKING", .when(configuration: .debug)), - ] - ), - .target( - name: "XcodeGraphTesting", - dependencies: [ - "XcodeGraph", - "TuistSupportTesting", - pathDependency, - "AnyCodable", - ], - linkerSettings: [.linkedFramework("XCTest")] - ), .target( name: "TuistCore", dependencies: [ @@ -356,14 +334,6 @@ let package = Package( type: .dynamic, targets: ["ProjectAutomation"] ), - .library( - name: "XcodeGraph", - targets: ["XcodeGraph"] - ), - .library( - name: "XcodeGraphTesting", - targets: ["XcodeGraphTesting"] - ), .library( name: "TuistKit", targets: ["TuistKit"] @@ -447,6 +417,7 @@ let package = Package( .package(url: "https://github.com/tuist/swift-openapi-runtime", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/swift-openapi-urlsession", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/Path", .upToNextMajor(from: "0.3.0")), + .package(url: "https://github.com/tuist/XcodeGraph.git", .upToNextMajor(from: "0.2.0")), ], targets: targets ) diff --git a/Sources/TuistAutomation/Utilities/TargetBuilder.swift b/Sources/TuistAutomation/Utilities/TargetBuilder.swift index 7e8348fea24..c1db35f9de3 100644 --- a/Sources/TuistAutomation/Utilities/TargetBuilder.swift +++ b/Sources/TuistAutomation/Utilities/TargetBuilder.swift @@ -29,7 +29,7 @@ public protocol TargetBuilding { buildOutputPath: AbsolutePath?, derivedDataPath: AbsolutePath?, device: String?, - osVersion: Version?, + osVersion: XcodeGraph.Version?, rosetta: Bool, graphTraverser: GraphTraversing, passthroughXcodeBuildArguments: [String] @@ -87,7 +87,7 @@ public final class TargetBuilder: TargetBuilding { buildOutputPath: AbsolutePath?, derivedDataPath: AbsolutePath?, device: String?, - osVersion: Version?, + osVersion: XcodeGraph.Version?, rosetta: Bool, graphTraverser: GraphTraversing, passthroughXcodeBuildArguments: [String] @@ -105,7 +105,7 @@ public final class TargetBuilder: TargetBuilding { for: target.target, on: platform, scheme: scheme, - version: osVersion, + version: osVersion.map { try .init(versionString: $0.description) }, deviceName: device, graphTraverser: graphTraverser, simulatorController: simulatorController diff --git a/Sources/TuistAutomation/Utilities/XcodeBuildDestination+Find.swift b/Sources/TuistAutomation/Utilities/XcodeBuildDestination+Find.swift index fd4514f0e24..77ee073cc5f 100644 --- a/Sources/TuistAutomation/Utilities/XcodeBuildDestination+Find.swift +++ b/Sources/TuistAutomation/Utilities/XcodeBuildDestination+Find.swift @@ -18,14 +18,14 @@ extension XcodeBuildDestination { for target: Target, on platform: XcodeGraph.Platform, scheme: Scheme, - version: Version?, + version: TSCUtility.Version?, deviceName: String?, graphTraverser: GraphTraversing, simulatorController: SimulatorControlling ) async throws -> XcodeBuildDestination { switch platform { case .iOS, .tvOS, .watchOS, .visionOS: - let minVersion: Version? + let minVersion: TSCUtility.Version? if let deploymentTargetVersion = target.deploymentTargets[platform] { minVersion = deploymentTargetVersion.version() } else { diff --git a/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift b/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift index 4bab2a0bd38..9d18d42e939 100644 --- a/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift +++ b/Sources/TuistAutomationTesting/Utilities/MockTargetBuilder.swift @@ -16,7 +16,7 @@ public final class MockTargetBuilder: TargetBuilding { AbsolutePath?, AbsolutePath?, String?, - Version?, + XcodeGraph.Version?, Bool, GraphTraversing, [String] @@ -32,7 +32,7 @@ public final class MockTargetBuilder: TargetBuilding { buildOutputPath: AbsolutePath?, derivedDataPath: AbsolutePath?, device: String?, - osVersion: Version?, + osVersion: XcodeGraph.Version?, rosetta: Bool, graphTraverser: GraphTraversing, passthroughXcodeBuildArguments: [String] diff --git a/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift b/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift index b8faf39fb84..3282337f31b 100644 --- a/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift +++ b/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift @@ -121,7 +121,7 @@ final class SchemeDescriptorsGenerator: SchemeDescriptorsGenerating { path: AbsolutePath, graphTraverser: GraphTraversing, generatedProjects: [AbsolutePath: GeneratedProject], - lastUpgradeCheck: Version? + lastUpgradeCheck: XcodeGraph.Version? ) throws -> SchemeDescriptor { let generatedBuildAction = try schemeBuildAction( scheme: scheme, diff --git a/Sources/TuistKit/Services/BuildService.swift b/Sources/TuistKit/Services/BuildService.swift index 39ae782fd51..a8e8533fe50 100644 --- a/Sources/TuistKit/Services/BuildService.swift +++ b/Sources/TuistKit/Services/BuildService.swift @@ -138,7 +138,7 @@ public final class BuildService { buildOutputPath: buildOutputPath, derivedDataPath: derivedDataPath, device: device, - osVersion: osVersion?.version(), + osVersion: osVersion?.version().map { .init(stringLiteral: $0.description) }, rosetta: rosetta, graphTraverser: graphTraverser, passthroughXcodeBuildArguments: passthroughXcodeBuildArguments @@ -170,7 +170,7 @@ public final class BuildService { buildOutputPath: buildOutputPath, derivedDataPath: derivedDataPath, device: device, - osVersion: osVersion?.version(), + osVersion: osVersion?.version().map { .init(stringLiteral: $0.description) }, rosetta: rosetta, graphTraverser: graphTraverser, passthroughXcodeBuildArguments: passthroughXcodeBuildArguments diff --git a/Sources/TuistKit/Services/RunService.swift b/Sources/TuistKit/Services/RunService.swift index 5e72345ffbd..2318dc172e6 100644 --- a/Sources/TuistKit/Services/RunService.swift +++ b/Sources/TuistKit/Services/RunService.swift @@ -117,7 +117,7 @@ final class RunService { buildOutputPath: nil, derivedDataPath: nil, device: device, - osVersion: version?.version(), + osVersion: version?.version().map { .init(stringLiteral: $0.description) }, rosetta: rosetta, graphTraverser: graphTraverser, passthroughXcodeBuildArguments: [] diff --git a/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift index 4ae5485595c..3dcb65ee317 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift @@ -15,11 +15,11 @@ extension XcodeGraph.CompatibleXcodeVersions { case .all: return .all case let .exact(version): - return .exact(version) + return .exact(.init(stringLiteral: version.description)) case let .upToNextMajor(version): - return .upToNextMajor(version) + return .upToNextMajor(.init(stringLiteral: version.description)) case let .upToNextMinor(version): - return .upToNextMinor(version) + return .upToNextMinor(.init(stringLiteral: version.description)) case let .list(versions): return .list(versions.map { from(manifest: $0) }) } diff --git a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift index f50381dd73a..cc0d892129a 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift @@ -34,7 +34,7 @@ extension XcodeGraph.Config { return XcodeGraph.Config( compatibleXcodeVersions: compatibleXcodeVersions, cloud: cloud, - swiftVersion: swiftVersion, + swiftVersion: swiftVersion.map { .init(stringLiteral: $0.description) }, plugins: plugins, generationOptions: generationOptions, path: path diff --git a/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift index ba4aeec0701..a99a2b967b4 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift @@ -28,7 +28,7 @@ extension XcodeGraph.PackageSettings { baseSettings: baseSettings, targetSettings: targetSettings, projectOptions: projectOptions, - swiftToolsVersion: swiftToolsVersion + swiftToolsVersion: .init(stringLiteral: swiftToolsVersion.description) ) } } diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index b3720a44d73..a701d7b3900 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -375,7 +375,7 @@ public final class PackageInfoMapper: PackageInfoMapping { name: packageInfo.name, options: options, settings: packageInfo.projectSettings( - swiftToolsVersion: packageSettings.swiftToolsVersion, + swiftToolsVersion: .init(packageSettings.swiftToolsVersion.description), buildConfigs: baseSettings.configurations.map { key, _ in key } ), targets: targets, diff --git a/Sources/XcodeGraph/Graph/GraphEdge.swift b/Sources/XcodeGraph/Graph/GraphEdge.swift deleted file mode 100644 index da6a397561e..00000000000 --- a/Sources/XcodeGraph/Graph/GraphEdge.swift +++ /dev/null @@ -1,17 +0,0 @@ -import Foundation - -/// A directed edge linking representing a dependent relationship -/// e.g. `from` (MainApp) depends on `to` (UIKit) -public struct GraphEdge: Hashable, Codable { - public let from: GraphDependency - public let to: GraphDependency - public init(from: GraphDependency, to: GraphDependency) { - self.from = from - self.to = to - } - - public init(from: GraphDependency, to: GraphTarget) { - self.from = from - self.to = .target(name: to.target.name, path: to.path) - } -} diff --git a/Sources/XcodeGraph/Models/AnalyzeAction.swift b/Sources/XcodeGraph/Models/AnalyzeAction.swift deleted file mode 100644 index 7f80868e973..00000000000 --- a/Sources/XcodeGraph/Models/AnalyzeAction.swift +++ /dev/null @@ -1,13 +0,0 @@ -import Foundation - -public struct AnalyzeAction: Equatable, Codable { - // MARK: - Attributes - - public let configurationName: String - - // MARK: - Init - - public init(configurationName: String) { - self.configurationName = configurationName - } -} diff --git a/Sources/XcodeGraph/Models/Arguments.swift b/Sources/XcodeGraph/Models/Arguments.swift deleted file mode 100644 index 8f43b1d75fa..00000000000 --- a/Sources/XcodeGraph/Models/Arguments.swift +++ /dev/null @@ -1,30 +0,0 @@ -import Foundation - -/// Arguments contain commandline arguments passed on launch and Environment variables. -public struct Arguments: Codable { - // MARK: - Attributes - - /// Launch arguments that are passed by the scheme when running a scheme action. - public let launchArguments: [LaunchArgument] - /// The environment variables that are passed by the scheme when running a scheme action. - public let environmentVariables: [String: EnvironmentVariable] - - // MARK: - Init - - public init( - environmentVariables: [String: EnvironmentVariable] = [:], - launchArguments: [LaunchArgument] = [] - ) { - self.environmentVariables = environmentVariables - self.launchArguments = launchArguments - } -} - -extension Arguments: Equatable { - /// Implement `Equatable` manually so order of arguments doesn't matter. - public static func == (lhs: Arguments, rhs: Arguments) -> Bool { - lhs.environmentVariables == rhs.environmentVariables - && lhs.launchArguments.sorted { $0.name < $1.name } - == rhs.launchArguments.sorted { $0.name == $1.name } - } -} diff --git a/Sources/XcodeGraph/Models/AutogenerationOptions.swift b/Sources/XcodeGraph/Models/AutogenerationOptions.swift deleted file mode 100644 index 1fc374de51b..00000000000 --- a/Sources/XcodeGraph/Models/AutogenerationOptions.swift +++ /dev/null @@ -1,6 +0,0 @@ -import Foundation - -public enum AutogenerationOptions: Hashable { - case disabled - case enabled(TestingOptions) -} diff --git a/Sources/XcodeGraph/Models/BinaryArchitecture.swift b/Sources/XcodeGraph/Models/BinaryArchitecture.swift deleted file mode 100644 index ce2321a31fa..00000000000 --- a/Sources/XcodeGraph/Models/BinaryArchitecture.swift +++ /dev/null @@ -1,24 +0,0 @@ -import Foundation - -public enum BinaryArchitecture: String, Codable { - case x8664 = "x86_64" - case i386 - case armv7 - case armv7s - case arm64 - case armv7k - case arm6432 = "arm64_32" - case arm64e -} - -public enum BinaryLinking: String, Hashable, Codable { - case `static`, dynamic -} - -extension Sequence { - /// Returns true if all the architectures are only for simulator. - public var onlySimulator: Bool { - let simulatorArchitectures: [BinaryArchitecture] = [.x8664, .i386, .arm64] - return allSatisfy { simulatorArchitectures.contains($0) } - } -} diff --git a/Sources/XcodeGraph/Models/BuildConfiguration.swift b/Sources/XcodeGraph/Models/BuildConfiguration.swift deleted file mode 100644 index b49438bba71..00000000000 --- a/Sources/XcodeGraph/Models/BuildConfiguration.swift +++ /dev/null @@ -1,58 +0,0 @@ -import Foundation - -/// A build configuration acts as a configuration identifier. -/// -/// -/// -/// It hosts the name as well as the variant of -/// a configuration to help infer the appropriate -/// default settings. -public struct BuildConfiguration: Codable { - public enum Variant: String, Codable { - case debug, release - } - - public static let debug = BuildConfiguration(name: "Debug", variant: .debug) - public static let release = BuildConfiguration(name: "Release", variant: .release) - - public let name: String - public let variant: Variant - - public init(name: String, variant: Variant) { - self.name = name - self.variant = variant - } - - public static func release(_ name: String) -> BuildConfiguration { - BuildConfiguration(name: name, variant: .release) - } - - public static func debug(_ name: String) -> BuildConfiguration { - BuildConfiguration(name: name, variant: .debug) - } -} - -extension BuildConfiguration: Equatable { - public static func == (lhs: BuildConfiguration, rhs: BuildConfiguration) -> Bool { - lhs.name.caseInsensitiveCompare(rhs.name) == .orderedSame && lhs.variant == rhs.variant - } -} - -extension BuildConfiguration: Hashable { - public func hash(into hasher: inout Hasher) { - hasher.combine(name.lowercased()) - hasher.combine(variant) - } -} - -extension BuildConfiguration: Comparable { - public static func < (lhs: BuildConfiguration, rhs: BuildConfiguration) -> Bool { - lhs.name < rhs.name - } -} - -extension BuildConfiguration: CustomStringConvertible { - public var description: String { - "\(name) (\(variant.rawValue))" - } -} diff --git a/Sources/XcodeGraph/Models/BuildRule+CompilerSpec.swift b/Sources/XcodeGraph/Models/BuildRule+CompilerSpec.swift deleted file mode 100644 index e615f9d18e2..00000000000 --- a/Sources/XcodeGraph/Models/BuildRule+CompilerSpec.swift +++ /dev/null @@ -1,59 +0,0 @@ -import Foundation - -extension BuildRule { - /// Mapping of compiler specs supported by a build rule to Xcode's internal representation. - /// All values were coppied from `pbxproj`. - public enum CompilerSpec: String, Codable { - case appIntentsMetadataExtractor = "com.apple.compilers.appintentsmetadata" - case appShortcutStringsMetadataExtractor = "com.apple.compilers.appshortcutstringsmetadata" - case appleClang = "com.apple.compilers.llvm.clang.1_0" - case assetCatalogCompiler = "com.apple.compilers.assetcatalog" - case codeSign = "com.apple.build-tools.codesign" - case compileRealityComposerProject = "com.apple.build-tasks.compile-rc-project.xcplugin" - case compileSceneKitShaders = "com.apple.build-tasks.compile-scenekit-shadercache" - case compileSkybox = "com.apple.build-tasks.compile-skybox.xcplugin" - case compileUSDZ = "com.apple.build-tasks.compile-usdz.xcplugin" - case compressPNG = "com.apple.build-tasks.copy-png-file" - case copyPlistFile = "com.apple.build-tasks.copy-plist-file" - case copySceneKitAssets = "com.apple.build-tasks.copy-scenekit-assets" - case copyStringsFile = "com.apple.build-tasks.copy-strings-file" - case copyTiffFile = "com.apple.build-tasks.copy-tiff-file" - case coreDataMappingModelCompiler = "com.apple.compilers.model.coredatamapping" - case coreMLModelCompiler = "com.apple.compilers.coreml" - case dataModelCompiler = "com.apple.compilers.model.coredata" - case defaultCompiler = "com.apple.compilers.gcc" - case documentationCompiler = "com.apple.compilers.documentation" - case dTrace = "com.apple.compilers.dtrace" - case generateSpriteKitTextureAtlas = "com.apple.build-tasks.generate-texture-atlas.xcplugin" - case iconutil = "com.apple.compilers.iconutil" - case instrumetsPackageBuilder = "com.apple.compilers.instruments-package-builder" - case intentDefinitionCompiler = "com.apple.compilers.intents" - case interfaceBuilderNIBPostprocessor = "com.apple.xcode.tools.ibtool.postprocessor" - case interfaceBuilderStoryboardCompiler = "com.apple.xcode.tools.ibtool.storyboard.compiler" - case interfaceBuilderStoryboardLinker = "com.apple.xcode.tools.ibtool.storyboard.linker" - case interfaceBuilderStoryboardPostprocessor = "com.apple.xcode.tools.ibtool.storyboard.postprocessor" - case interfaceBuilderXIBCompiler = "com.apple.xcode.tools.ibtool.compiler" - case ioKitInterfaceGenerator = "com.apple.compilers.iig" - case lex = "com.apple.compilers.lex" - case lsRegisterURL = "com.apple.build-tasks.ls-register-url" - case metalCompiler = "com.apple.compilers.metal" - case metalLinker = "com.apple.compilers.metal-linker" - case mig = "com.apple.compilers.mig" - case nasm = "com.apple.compilers.nasm" - case nmedit = "com.apple.build-tools.nmedit" - case openCL = "com.apple.compilers.opencl" - case osaCompile = "com.apple.compilers.osacompile" - case pbxcp = "com.apple.compilers.pbxcp" - case processSceneKitDocument = "com.apple.compilers.scntool" - case processXCAppExtensionPoints = "com.apple.compilers.process-xcappextensionpoints" - case rez = "com.apple.compilers.rez" - case stripSymbols = "com.apple.build-tools.strip" - case swiftCompiler = "com.apple.xcode.tools.swift.compiler" - case swiftABIBaselineGenerator = "com.apple.build-tools.swift-abi-generation" - case swiftFrameworkABIChecker = "com.apple.build-tools.swift-abi-checker" - case textBasedAPITool = "com.apple.build-tools.tapi.installapi" - case unifdef = "public.build-task.unifdef" - case yacc = "com.apple.compilers.yacc" - case customScript = "com.apple.compilers.proxy.script" - } -} diff --git a/Sources/XcodeGraph/Models/BuildRule+FileType.swift b/Sources/XcodeGraph/Models/BuildRule+FileType.swift deleted file mode 100644 index 3f6f957b39b..00000000000 --- a/Sources/XcodeGraph/Models/BuildRule+FileType.swift +++ /dev/null @@ -1,54 +0,0 @@ -import Foundation - -extension BuildRule { - /// Mapping of file types supported by a build rule to Xcode's internal representation. - /// All values were coppied from `pbxproj`. - public enum FileType: String, Codable { - case instrumentsPackageDefinition = "com.apple.instruments.package-definition" - case metalAIR = "compiled.air" - case machO = "compiled.mach-o" - case machOObject = "compiled.mach-o.objfile" - case siriKitIntent = "file.intentdefinition" - case coreMLMachineLearning = "file.mlmodel" - case rcProjectDocument = "file.rcproject" - case skyboxDocument = "file.skybox" - case interfaceBuilderStoryboard = "file.storyboard" - case interfaceBuilder = "file.xib" - case documentationCatalog = "folder.documentationcatalog" - case coreMLMachineLearningModelPackage = "folder.mlpackage" - case assemblyAsm = "sourcecode.asm" - case assemblyAsmAsm = "sourcecode.asm.asm" - case llvmAssembly = "sourcecode.asm.llvm" - case cSource = "sourcecode.c" - case clipsSource = "sourcecode.clips" - case cppSource = "sourcecode.cpp" - case dtraceSource = "sourcecode.dtrace" - case dylanSource = "sourcecode.dylan" - case fortranSource = "sourcecode.fortran" - case glslSource = "sourcecode.glsl" - case iigSource = "sourcecode.iig" - case javaSource = "sourcecode.java" - case lexSource = "sourcecode.lex" - case metalShaderSource = "sourcecode.metal" - case migSource = "sourcecode.mig" - case nasmAssembly = "sourcecode.nasm" - case openCLSource = "sourcecode.opencl" - case pascalSource = "sourcecode.pascal" - case protobufSource = "sourcecode.protobuf" - case rezSource = "sourcecode.rez" - case swiftSource = "sourcecode.swift" - case yaccSource = "sourcecode.yacc" - case localizationString = "text.plist.strings" - case localizationStringDictionary = "text.plist.stringsdict" - case xcAppExtensionPoints = "text.plist.xcappextensionpoints" - case xcodeSpecificationPlist = "text.plist.xcspec" - case dae = "text.xml.dae" - case nib = "wrapper.nib" - case interfaceBuilderStoryboardPackage = "wrapper.storyboardc" - case classModel = "wrapper.xcclassmodel" - case dataModel = "wrapper.xcdatamodel" - case dataModelVersion = "wrapper.xcdatamodeld" - case mappingModel = "wrapper.xcmappingmodel" - case sourceFilesWithNamesMatching = "pattern.proxy" - } -} diff --git a/Sources/XcodeGraph/Models/BuildRule.swift b/Sources/XcodeGraph/Models/BuildRule.swift deleted file mode 100644 index 7464b4e10c1..00000000000 --- a/Sources/XcodeGraph/Models/BuildRule.swift +++ /dev/null @@ -1,53 +0,0 @@ -import Foundation - -/// A BuildRule is used to specify a method for transforming an input file in to an output file(s). -public struct BuildRule: Codable, Equatable { - /// Element compiler spec. - public let compilerSpec: CompilerSpec - - /// Element file patterns. - public let filePatterns: String? - - /// Element file type. - public let fileType: FileType - - /// Element name. - public let name: String? - - /// Element output files. - public let outputFiles: [String] - - /// Element input files. - public let inputFiles: [String]? - - /// Element output files compiler flags. - public let outputFilesCompilerFlags: [String]? - - /// Element script. - public let script: String? - - /// Element run once per architecture. - public let runOncePerArchitecture: Bool? - - public init( - compilerSpec: CompilerSpec, - fileType: FileType, - filePatterns: String? = nil, - name: String? = nil, - outputFiles: [String] = [], - inputFiles: [String]? = nil, - outputFilesCompilerFlags: [String]? = nil, - script: String? = nil, - runOncePerArchitecture: Bool? = nil - ) { - self.compilerSpec = compilerSpec - self.filePatterns = filePatterns - self.fileType = fileType - self.name = name - self.outputFiles = outputFiles - self.inputFiles = inputFiles - self.outputFilesCompilerFlags = outputFilesCompilerFlags - self.script = script - self.runOncePerArchitecture = runOncePerArchitecture - } -} diff --git a/Sources/XcodeGraph/Models/Cloud.swift b/Sources/XcodeGraph/Models/Cloud.swift deleted file mode 100644 index 3a99661b6ff..00000000000 --- a/Sources/XcodeGraph/Models/Cloud.swift +++ /dev/null @@ -1,29 +0,0 @@ -import Foundation - -/// Cloud represents the configuration to connect to the server. -public struct Cloud: Equatable, Hashable { - /// Cloud option. - public enum Option: String, Codable, Equatable { - case optional - } - - /// The base URL that points to the cloud server - public let url: URL - - /// The project unique identifier. - public let projectId: String - - /// Cloud options. - public let options: [Option] - - /// Initializes an instance of Cloud. - /// - Parameters: - /// - url: Cloud server base URL. - /// - projectId: Project unique identifier. - /// - options: Cloud options. - public init(url: URL, projectId: String, options: [Option]) { - self.url = url - self.projectId = projectId - self.options = options - } -} diff --git a/Sources/XcodeGraph/Models/CompatibleXcodeVersions.swift b/Sources/XcodeGraph/Models/CompatibleXcodeVersions.swift deleted file mode 100644 index 4a370868052..00000000000 --- a/Sources/XcodeGraph/Models/CompatibleXcodeVersions.swift +++ /dev/null @@ -1,72 +0,0 @@ -import Foundation -import struct ProjectDescription.Version - -/// Enum that represents all the Xcode versions that a project or set of projects is compatible with. -public enum CompatibleXcodeVersions: Equatable, Hashable, ExpressibleByArrayLiteral, ExpressibleByStringInterpolation, - CustomStringConvertible -{ - /// The project supports all Xcode versions. - case all - - /// The project supports only a specific Xcode version. - case exact(Version) - - /// The project supports all Xcode versions from the specified version up to but not including the next major version. - case upToNextMajor(Version) - - /// The project supports all Xcode versions from the specified version up to but not including the next minor version. - case upToNextMinor(Version) - - /// List of versions that are supported by the project. - case list([CompatibleXcodeVersions]) - - public func isCompatible(versionString: String) -> Bool { - let xCodeVersion: Version = "\(versionString)" - - switch self { - case .all: - return true - case let .exact(version): - return version == xCodeVersion - case let .upToNextMajor(version): - return xCodeVersion.major == version.major && xCodeVersion >= version - case let .upToNextMinor(version): - return version.major == xCodeVersion.major && version.minor == xCodeVersion.minor && xCodeVersion >= version - case let .list(versions): - return versions.contains { $0.isCompatible(versionString: versionString) } - } - } - - // MARK: - ExpressibleByStringInterpolation - - public init(stringLiteral value: String) { - self = .exact(Version(stringLiteral: value)) - } - - // MARK: - ExpressibleByArrayLiteral - - public init(arrayLiteral elements: [CompatibleXcodeVersions]) { - self = .list(elements) - } - - public init(arrayLiteral elements: CompatibleXcodeVersions...) { - self = .list(elements) - } - - // MARK: - CustomStringConvertible - - public var description: String { - switch self { - case .all: - return "all" - case let .exact(version): - return "\(version)" - case let .upToNextMajor(version): - return "\(version)..<\(version.major + 1).0.0" - case let .upToNextMinor(version): - return "\(version)..<\(version.major).\(version.minor + 1).0" - case let .list(versions): - return "\(versions.map(\.description).joined(separator: " or "))" - } - } -} diff --git a/Sources/XcodeGraph/Models/Dependencies/PackageSettings.swift b/Sources/XcodeGraph/Models/Dependencies/PackageSettings.swift deleted file mode 100644 index 6ba5d8b1f39..00000000000 --- a/Sources/XcodeGraph/Models/Dependencies/PackageSettings.swift +++ /dev/null @@ -1,45 +0,0 @@ -import Foundation -import TSCUtility - -/// Contains the description of custom SPM settings -public struct PackageSettings: Equatable, Codable { - /// The custom `Product` types to be used for SPM targets. - public let productTypes: [String: Product] - - /// Custom destinations to be used for SPM products. - public let productDestinations: [String: Destinations] - - // The base settings to be used for targets generated from SwiftPackageManager - public let baseSettings: Settings - - /// The custom `Settings` to be applied to SPM targets - public let targetSettings: [String: SettingsDictionary] - - /// The custom project options for each project generated from a swift package - public let projectOptions: [String: XcodeGraph.Project.Options] - - /// Swift tools version of the parsed `Package.swift` - public let swiftToolsVersion: Version - - /// Initializes a new `PackageSettings` instance. - /// - Parameters: - /// - productTypes: The custom `Product` types to be used for SPM targets. - /// - baseSettings: The base settings to be used for targets generated from SwiftPackageManager - /// - targetSettings: The custom `SettingsDictionary` to be applied to denoted targets - /// - projectOptions: The custom project options for each project generated from a swift package - public init( - productTypes: [String: Product], - productDestinations: [String: Destinations], - baseSettings: Settings, - targetSettings: [String: SettingsDictionary], - projectOptions: [String: XcodeGraph.Project.Options] = [:], - swiftToolsVersion: Version - ) { - self.productTypes = productTypes - self.productDestinations = productDestinations - self.baseSettings = baseSettings - self.targetSettings = targetSettings - self.projectOptions = projectOptions - self.swiftToolsVersion = swiftToolsVersion - } -} diff --git a/Sources/XcodeGraph/Models/DeploymentTargets.swift b/Sources/XcodeGraph/Models/DeploymentTargets.swift deleted file mode 100644 index 54db36d7226..00000000000 --- a/Sources/XcodeGraph/Models/DeploymentTargets.swift +++ /dev/null @@ -1,84 +0,0 @@ -import Foundation - -// MARK: - DeploymentTargets - -public struct DeploymentTargets: Hashable, Codable { - public let iOS: String? - public let macOS: String? - public let watchOS: String? - public let tvOS: String? - public let visionOS: String? - - public init(iOS: String? = nil, macOS: String? = nil, watchOS: String? = nil, tvOS: String? = nil, visionOS: String? = nil) { - self.iOS = iOS - self.macOS = macOS - self.watchOS = watchOS - self.tvOS = tvOS - self.visionOS = visionOS - } - - public subscript(platform: Platform) -> String? { - switch platform { - case .iOS: - return iOS - case .macOS: - return macOS - case .watchOS: - return watchOS - case .tvOS: - return tvOS - case .visionOS: - return visionOS - } - } - - public var configuredVersions: [(platform: Platform, versionString: String)] { - var versions = [(Platform, String)]() - - if let iOS { - versions.append((.iOS, iOS)) - } - - if let macOS { - versions.append((.macOS, macOS)) - } - - if let watchOS { - versions.append((.watchOS, watchOS)) - } - - if let tvOS { - versions.append((.tvOS, tvOS)) - } - - if let visionOS { - versions.append((.visionOS, visionOS)) - } - - return versions - } - - public static func iOS(_ version: String) -> DeploymentTargets { - DeploymentTargets(iOS: version) - } - - public static func macOS(_ version: String) -> DeploymentTargets { - DeploymentTargets(macOS: version) - } - - public static func watchOS(_ version: String) -> DeploymentTargets { - DeploymentTargets(watchOS: version) - } - - public static func tvOS(_ version: String) -> DeploymentTargets { - DeploymentTargets(tvOS: version) - } - - public static func visionOS(_ version: String) -> DeploymentTargets { - DeploymentTargets(visionOS: version) - } - - public static func empty() -> DeploymentTargets { - DeploymentTargets() - } -} diff --git a/Sources/XcodeGraph/Models/Destination.swift b/Sources/XcodeGraph/Models/Destination.swift deleted file mode 100644 index 0d7b2028437..00000000000 --- a/Sources/XcodeGraph/Models/Destination.swift +++ /dev/null @@ -1,69 +0,0 @@ -import Foundation - -public typealias Destinations = Set - -extension Destinations { - public static var watchOS: Destinations = [.appleWatch] - public static var iOS: Destinations = [.iPhone, .iPad, .macWithiPadDesign] - public static var macOS: Destinations = [.mac] - public static var tvOS: Destinations = [.appleTv] - public static var visionOS: Destinations = [.appleVision] -} - -extension Destinations { - public var platforms: Set { - let platforms = map(\.platform) - return Set(platforms) - } -} - -/// A supported platform representation. -public enum Destination: String, Codable, Equatable, CaseIterable { - case iPhone - case iPad - case mac - case macWithiPadDesign - case macCatalyst - case appleWatch - case appleTv - case appleVision - case appleVisionWithiPadDesign - - public var platform: Platform { - switch self { - case .iPad, .iPhone, .macCatalyst, .macWithiPadDesign, .appleVisionWithiPadDesign: - return .iOS - case .mac: - return .macOS - case .appleTv: - return .tvOS - case .appleWatch: - return .watchOS - case .appleVision: - return .visionOS - } - } - - public var platformFilter: PlatformFilter { - switch self { - case .iPad, .iPhone, .macWithiPadDesign, .appleVisionWithiPadDesign: - return .ios - case .macCatalyst: - return .catalyst - case .mac: - return .macos - case .appleTv: - return .tvos - case .appleWatch: - return .watchos - case .appleVision: - return .visionos - } - } -} - -extension Collection { - public func supports(_ platform: Platform) -> Bool { - contains(where: { $0.platform == platform }) - } -} diff --git a/Sources/XcodeGraph/Models/EnvironmentVariable.swift b/Sources/XcodeGraph/Models/EnvironmentVariable.swift deleted file mode 100644 index 9e40a70cbcf..00000000000 --- a/Sources/XcodeGraph/Models/EnvironmentVariable.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation - -/// It represents an environment variable that is passed when running a scheme's action -public struct EnvironmentVariable: Equatable, Codable, Hashable, ExpressibleByStringLiteral { - // MARK: - Attributes - - /// The value of the environment variable - public let value: String - /// Whether the variable is enabled or not - public let isEnabled: Bool - - // MARK: - Init - - public init(value: String, isEnabled: Bool) { - self.value = value - self.isEnabled = isEnabled - } - - public init(stringLiteral value: StringLiteralType) { - self.value = value - isEnabled = true - } -} diff --git a/Sources/XcodeGraph/Models/FileCodeGen.swift b/Sources/XcodeGraph/Models/FileCodeGen.swift deleted file mode 100644 index e947f212154..00000000000 --- a/Sources/XcodeGraph/Models/FileCodeGen.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation - -/// FileCodeGen: Soure file code generation attribues -/// -/// - `public`: public codegen attribute `settings = {ATTRIBUTES = (codegen, )`} -/// - `private`: private codegen attribute `settings = {ATTRIBUTES = (private_codegen, )}` -/// - `project`: project codegen attribute `settings = {ATTRIBUTES = (project_codegen, )}` -/// - `disabled`: disabled codegen attribute `settings = {ATTRIBUTES = (no_codegen, )}` -/// -public enum FileCodeGen: String, Codable, Equatable { - case `public` = "codegen" - case `private` = "private_codegen" - case project = "project_codegen" - case disabled = "no_codegen" -} diff --git a/Sources/XcodeGraph/Models/IDETemplateMacros.swift b/Sources/XcodeGraph/Models/IDETemplateMacros.swift deleted file mode 100644 index 59490b2af0e..00000000000 --- a/Sources/XcodeGraph/Models/IDETemplateMacros.swift +++ /dev/null @@ -1,38 +0,0 @@ -import Foundation - -public struct IDETemplateMacros: Codable, Hashable { - private enum CodingKeys: String, CodingKey { - case fileHeader = "FILEHEADER" - } - - public let fileHeader: String? - - public init(fileHeader: String?) { - self.fileHeader = fileHeader.map(Self.normalize) - } - - private static func normalize(fileHeader: String) -> String { - var fileHeader = fileHeader - - // As Xcode appends file header directly after `//` it adds to the beginning of template, - // it is desired to also add leading space if it is not already present, - // but if header starts with `//` then I know what I am doing and it should be kept intact - if !fileHeader.hasPrefix("//"), let first = fileHeader.first.map(String.init), - first.trimmingCharacters(in: .whitespacesAndNewlines) == first - { - fileHeader.insert(" ", at: fileHeader.startIndex) - } - - // Xcode by default adds comment slashes to first line of header template - if fileHeader.hasPrefix("//") { - fileHeader.removeFirst(2) - } - - // Xcode by default adds extra newline at the end, so if it is present, just remove it - if fileHeader.last == "\n" { - fileHeader.removeLast() - } - - return fileHeader - } -} diff --git a/Sources/XcodeGraph/Models/LaunchArgument.swift b/Sources/XcodeGraph/Models/LaunchArgument.swift deleted file mode 100644 index 8ad8d6979de..00000000000 --- a/Sources/XcodeGraph/Models/LaunchArgument.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation - -/// It represents an argument that is passed when running a scheme's action -public struct LaunchArgument: Equatable, Codable, Hashable { - // MARK: - Attributes - - /// The name of the launch argument - public let name: String - /// Whether the argument is enabled or not - public let isEnabled: Bool - - // MARK: - Init - - public init(name: String, isEnabled: Bool) { - self.name = name - self.isEnabled = isEnabled - } -} diff --git a/Sources/XcodeGraph/Models/LaunchStyle.swift b/Sources/XcodeGraph/Models/LaunchStyle.swift deleted file mode 100644 index 93e06b7c9de..00000000000 --- a/Sources/XcodeGraph/Models/LaunchStyle.swift +++ /dev/null @@ -1,6 +0,0 @@ -import Foundation - -public enum LaunchStyle: Codable { - case automatically - case waitForExecutableToBeLaunched -} diff --git a/Sources/XcodeGraph/Models/MergedBinaryType.swift b/Sources/XcodeGraph/Models/MergedBinaryType.swift deleted file mode 100644 index 2de57535084..00000000000 --- a/Sources/XcodeGraph/Models/MergedBinaryType.swift +++ /dev/null @@ -1,37 +0,0 @@ -/// Represents the different options to configure a target for mergeable libraries -/// -/// https://developer.apple.com/documentation/xcode/configuring-your-project-to-use-mergeable-libraries -public enum MergedBinaryType: Equatable, Codable { - /// Target is never going to merge available dependencies - case disabled - - /// Target is going to merge direct target dependencies (just the ones declared as part of it's project). With this build - /// setting, - /// Xcode treats mergeable dependencies like normal dynamic libraries in debug builds, - /// but performs steps in release mode to automatically handle merging for **direct dependencies** - /// - /// A direct dependency is a library that meets two criteria: - /// - The library is listed in your target’s Link Binary with Libraries build phase. - /// - The library is the product of another target in your project. - case automatic - - /// Target is going to merge direct and specified dependencies that are not part of the project. The set of dependencies - /// is going to reflect the list of precompiled dynamic dependencies you want to merge as part of the target. These binaries - /// must be compiled with `MAKE_MERGEABLE` flag set to true - /// - /// In some cases, you may want to manually configure merging between your app or framework target and dependent libraries. - /// For example, you might not want to automatically merge dependencies that you share between an app and an app extension - /// if you’re concerned about the app extension’s binary size. To set up manual merging, configure your app or framework - /// target, - /// then configure your dependent libraries. - /// - /// In your app or framework target, add the flag `mergedBinaryType` and set it to manual. After you add that setting to your - /// target: - /// - In release builds, Xcode merges the products of any of its direct dependencies which have - /// MAKE_MERGEABLE enabled using the linker flags -merge_framework, -merge-l and so on. - /// - In debug builds, Xcode links any of your target’s direct dependencies which have MERGEABLE_LIBRARY - /// enabled, but not MAKE_MERGEABLE with the linker flags -reexport_framework, -reexport-l, and so on. - /// - Xcode uses normal linking for targets that don’t have MERGEABLE_LIBRARY enabled. This is the same linking - /// that Xcode uses for static libraries, or dynamic libraries that aren’t mergeable. - case manual(mergeableDependencies: Set) -} diff --git a/Sources/XcodeGraph/Models/OnDemandResourcesTags.swift b/Sources/XcodeGraph/Models/OnDemandResourcesTags.swift deleted file mode 100644 index 75da69d16bd..00000000000 --- a/Sources/XcodeGraph/Models/OnDemandResourcesTags.swift +++ /dev/null @@ -1,9 +0,0 @@ -public struct OnDemandResourcesTags: Codable, Equatable { - public let initialInstall: [String]? - public let prefetchOrder: [String]? - - public init(initialInstall: [String]?, prefetchOrder: [String]?) { - self.initialInstall = initialInstall - self.prefetchOrder = prefetchOrder - } -} diff --git a/Sources/XcodeGraph/Models/Platform.swift b/Sources/XcodeGraph/Models/Platform.swift deleted file mode 100644 index bf1a2e108cb..00000000000 --- a/Sources/XcodeGraph/Models/Platform.swift +++ /dev/null @@ -1,161 +0,0 @@ -import Foundation -import TuistSupport - -struct UnsupportedPlatformError: FatalError, CustomStringConvertible, Equatable { - let type: TuistSupport.ErrorType = .abort - - let input: String - var description: String { - "Specified platform \(input) does not map to any of these supported platforms: \(Platform.allCases.map(\.caseValue).joined(separator: ", ")) " - } -} - -public enum Platform: String, CaseIterable, Codable, Comparable { - case iOS = "ios" - case macOS = "macos" - case tvOS = "tvos" - case watchOS = "watchos" - case visionOS = "visionos" - - public var caseValue: String { - switch self { - case .iOS: return "iOS" - case .macOS: return "macOS" - case .tvOS: return "tvOS" - case .watchOS: return "watchOS" - case .visionOS: return "visionOS" - } - } - - public init?(commandLineValue: String) { - self.init(rawValue: commandLineValue.lowercased()) - } - - public static func from(commandLineValue: String) throws -> Platform { - guard let platform = Platform(rawValue: commandLineValue.lowercased()) else { - throw UnsupportedPlatformError(input: commandLineValue) - } - return platform - } - - public static func < (lhs: Platform, rhs: Platform) -> Bool { - lhs.rawValue < rhs.rawValue - } -} - -public enum PackagePlatform: String, CaseIterable, Codable, Comparable { - case iOS = "ios" - case macCatalyst = "maccatalyst" - case macOS = "macos" - case tvOS = "tvos" - case watchOS = "watchos" - case visionOS = "visionos" - - public var caseValue: String { - switch self { - case .iOS: return "iOS" - case .macCatalyst: return "macCatalyst" - case .macOS: return "macOS" - case .tvOS: return "tvOS" - case .watchOS: return "watchOS" - case .visionOS: return "visionOS" - } - } - - public static func < (lhs: PackagePlatform, rhs: PackagePlatform) -> Bool { - lhs.rawValue < rhs.rawValue - } -} - -extension Platform { - public var xcodeSdkRoot: String { - switch self { - case .macOS: - return "macosx" - case .iOS: - return "iphoneos" - case .tvOS: - return "appletvos" - case .watchOS: - return "watchos" - case .visionOS: - return "xros" - } - } - - /// Returns whether the platform has simulators. - public var hasSimulators: Bool { - switch self { - case .macOS: return false - default: return true - } - } - - /// It returns the destination that should be used to - /// compile a product for this platform's simulator. - public var xcodeSimulatorDestination: String? { - switch self { - case .macOS: return nil - default: return "platform=\(caseValue) Simulator" - } - } - - /// Returns the SDK of the platform's simulator - /// If the platform doesn't have simulators, like macOS, it returns nil. - public var xcodeSimulatorSDK: String? { - switch self { - case .tvOS: return "appletvsimulator" - case .iOS: return "iphonesimulator" - case .watchOS: return "watchsimulator" - case .visionOS: return "xrsimulator" - case .macOS: return nil - } - } - - /// Returns the SDK to build for the platform's device. - public var xcodeDeviceSDK: String { - switch self { - case .tvOS: - return "appletvos" - case .iOS: - return "iphoneos" - case .macOS: - return "macosx" - case .watchOS: - return "watchos" - case .visionOS: - return "xros" - } - } - - /// The SDK Root Path within Xcode's developer directory - public var xcodeSdkRootPath: String { - switch self { - case .iOS: - return "Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk" - case .macOS: - return "Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk" - case .tvOS: - return "Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk" - case .watchOS: - return "Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk" - case .visionOS: - return "Platforms/XROS.platform/Developer/SDKs/XROS.sdk" - } - } - - public var xcodeDeveloperSdkRootPath: String { - switch self { - case .iOS: - return "Platforms/iPhoneOS.platform/Developer/Library" - case .macOS: - return "Platforms/MacOSX.platform/Developer/Library" - case .tvOS: - return "Platforms/AppleTVOS.platform/Developer/Library" - case .watchOS: - return "Platforms/WatchOS.platform/Developer/Library" - case .visionOS: - return "Platforms/XROS.platform/Developer/Library" - } - } -} diff --git a/Sources/XcodeGraph/Models/PlatformFilter.swift b/Sources/XcodeGraph/Models/PlatformFilter.swift deleted file mode 100644 index 00f2b2ed29e..00000000000 --- a/Sources/XcodeGraph/Models/PlatformFilter.swift +++ /dev/null @@ -1,71 +0,0 @@ -import Foundation - -/// Convenience typealias to be used to ensure unique filters are applied -public typealias PlatformFilters = Set - -extension PlatformFilters: Comparable { - public static func < (lhs: Set, rhs: Set) -> Bool { - lhs.map(\.xcodeprojValue).sorted().joined() < rhs.map(\.xcodeprojValue).sorted().joined() - } -} - -/// Defines a set of platforms that can be used to limit where things -/// like build files, resources, and dependencies are used. -/// Context: https://github.com/tuist/tuist/pull/3152 -public enum PlatformFilter: Comparable, Hashable, Codable, CaseIterable { - case ios - case macos - case tvos - case catalyst - case driverkit - case watchos - case visionos - - public var xcodeprojValue: String { - switch self { - case .catalyst: - return "maccatalyst" - case .macos: - return "macos" - case .tvos: - return "tvos" - case .ios: - return "ios" - case .driverkit: - return "driverkit" - case .watchos: - return "watchos" - case .visionos: - return "xros" - } - } - - /// It returns the platform that the filter is filtering for - public var platform: Platform? { - switch self { - case .ios, .catalyst: - return .iOS - case .macos: - return .macOS - case .tvos: - return .tvOS - case .watchos: - return .watchOS - case .visionos: - return .visionOS - case .driverkit: - // TODO: Add support for it - return nil - } - } -} - -extension PlatformFilters { - /// Examples - - /// This should not be here but downstream - /// `platformFilter = ios` - /// `platformFilters = (ios, xros, )` - public var xcodeprojValue: [String] { - map(\.xcodeprojValue).sorted() - } -} diff --git a/Sources/XcodeGraph/Models/PluginLocation.swift b/Sources/XcodeGraph/Models/PluginLocation.swift deleted file mode 100644 index 3af5ed9a5ee..00000000000 --- a/Sources/XcodeGraph/Models/PluginLocation.swift +++ /dev/null @@ -1,41 +0,0 @@ -import Foundation - -/// The location to a directory containing a `Plugin` manifest. -public enum PluginLocation: Hashable, Equatable { - public enum GitReference: Hashable, Equatable { - case sha(String) - case tag(String) - } - - /// An absolute path `String` to a directory a `Plugin` manifest. - /// - /// Example: - /// ``` - /// .local(path: "/User/local/bin") - /// ``` - case local(path: String) - - /// A `URL` to a `git` repository pointing at a `GitReference` (either sha or tag), and optionally a directory - /// - /// Examples: - /// ``` - /// .git(url: "https://git/helpers.git", gitReference: .tag("1.0.0")) - /// .git(url: "https://git/helpers.git", gitReference: .sha("1.0.0")) - /// ``` - case git(url: String, gitReference: GitReference, directory: String?, releaseUrl: String?) -} - -// MARK: - description - -extension PluginLocation: CustomStringConvertible { - public var description: String { - switch self { - case let .local(path): - return "local path: \(path)" - case let .git(url, .tag(tag), directory, releaseUrl): - return "git url: \(url), tag: \(tag), directory: \(directory ?? "nil"), releaseUrl: \(releaseUrl ?? "nil")" - case let .git(url, .sha(sha), directory, releaseUrl): - return "git url: \(url), sha: \(sha), directory: \(directory ?? "nil"), releaseUrl: \(releaseUrl ?? "nil")" - } - } -} diff --git a/Sources/XcodeGraph/Models/PrivacyManifest.swift b/Sources/XcodeGraph/Models/PrivacyManifest.swift deleted file mode 100644 index be1e2fc39ed..00000000000 --- a/Sources/XcodeGraph/Models/PrivacyManifest.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation - -public struct PrivacyManifest: Codable, Equatable { - public var tracking: Bool - - public var trackingDomains: [String] - - public var collectedDataTypes: [[String: Plist.Value]] - - public var accessedApiTypes: [[String: Plist.Value]] - - public init( - tracking: Bool, - trackingDomains: [String], - collectedDataTypes: [[String: Plist.Value]], - accessedApiTypes: [[String: Plist.Value]] - ) { - self.tracking = tracking - self.trackingDomains = trackingDomains - self.collectedDataTypes = collectedDataTypes - self.accessedApiTypes = accessedApiTypes - } -} diff --git a/Sources/XcodeGraph/Models/ProfileAction.swift b/Sources/XcodeGraph/Models/ProfileAction.swift deleted file mode 100644 index 106943290fe..00000000000 --- a/Sources/XcodeGraph/Models/ProfileAction.swift +++ /dev/null @@ -1,27 +0,0 @@ -import Foundation - -public struct ProfileAction: Equatable, Codable { - // MARK: - Attributes - - public let configurationName: String - public let preActions: [ExecutionAction] - public let postActions: [ExecutionAction] - public let executable: TargetReference? - public let arguments: Arguments? - - // MARK: - Init - - public init( - configurationName: String, - preActions: [ExecutionAction] = [], - postActions: [ExecutionAction] = [], - executable: TargetReference? = nil, - arguments: Arguments? = nil - ) { - self.configurationName = configurationName - self.preActions = preActions - self.postActions = postActions - self.executable = executable - self.arguments = arguments - } -} diff --git a/Sources/XcodeGraph/Models/ProjectGroup.swift b/Sources/XcodeGraph/Models/ProjectGroup.swift deleted file mode 100644 index cebcdb1fd71..00000000000 --- a/Sources/XcodeGraph/Models/ProjectGroup.swift +++ /dev/null @@ -1,5 +0,0 @@ -import Foundation - -public enum ProjectGroup: Hashable, Codable { - case group(name: String) -} diff --git a/Sources/XcodeGraph/Models/ProjectOptions.swift b/Sources/XcodeGraph/Models/ProjectOptions.swift deleted file mode 100644 index 219aae9cf40..00000000000 --- a/Sources/XcodeGraph/Models/ProjectOptions.swift +++ /dev/null @@ -1,172 +0,0 @@ -import Foundation - -extension Project { - /// Additional options related to the `Project` - public struct Options: Codable, Hashable { - /// Defines how to generate automatic schemes - public let automaticSchemesOptions: AutomaticSchemesOptions - - /// Disables generating Bundle accessors. - public let disableBundleAccessors: Bool - - /// Tuist disables echoing the ENV in shell script build phases - public let disableShowEnvironmentVarsInScriptPhases: Bool - - /// Disable the synthesized resource accessors generation - public let disableSynthesizedResourceAccessors: Bool - - /// Text settings to override user ones for current project - public let textSettings: TextSettings - - public init( - automaticSchemesOptions: AutomaticSchemesOptions, - disableBundleAccessors: Bool, - disableShowEnvironmentVarsInScriptPhases: Bool, - disableSynthesizedResourceAccessors: Bool, - textSettings: TextSettings - ) { - self.automaticSchemesOptions = automaticSchemesOptions - self.disableBundleAccessors = disableBundleAccessors - self.disableShowEnvironmentVarsInScriptPhases = disableShowEnvironmentVarsInScriptPhases - self.disableSynthesizedResourceAccessors = disableSynthesizedResourceAccessors - self.textSettings = textSettings - } - } -} - -// MARK: - AutomaticSchemesOptions - -extension Project.Options { - /// The automatic schemes options - public enum AutomaticSchemesOptions: Codable, Hashable { - /// Defines how to group targets into scheme for autogenerated schemes - public enum TargetSchemesGrouping: Codable, Hashable { - /// Generate a single scheme per project - case singleScheme - - /// Group the targets according to their name suffixes - case byNameSuffix(build: Set, test: Set, run: Set) - - /// Do not group targets, create a scheme for each target - case notGrouped - } - - /// Enable autogenerated schemes - case enabled( - targetSchemesGrouping: TargetSchemesGrouping, - codeCoverageEnabled: Bool, - testingOptions: TestingOptions, - testLanguage: String? = nil, - testRegion: String? = nil, - testScreenCaptureFormat: ScreenCaptureFormat? = nil, - runLanguage: String? = nil, - runRegion: String? = nil - ) - - /// Disable autogenerated schemes - case disabled - } - - /// The text settings options - public struct TextSettings: Codable, Hashable { - /// Whether tabs should be used instead of spaces - public let usesTabs: Bool? - - /// The width of space indent - public let indentWidth: UInt? - - /// The width of tab indent - public let tabWidth: UInt? - - /// Whether lines should be wrapped or not - public let wrapsLines: Bool? - - public init( - usesTabs: Bool?, - indentWidth: UInt?, - tabWidth: UInt?, - wrapsLines: Bool? - ) { - self.usesTabs = usesTabs - self.indentWidth = indentWidth - self.tabWidth = tabWidth - self.wrapsLines = wrapsLines - } - } -} - -// MARK: - Array + ProjectOption - -extension Project.Options { - public var targetSchemesGrouping: AutomaticSchemesOptions.TargetSchemesGrouping? { - switch automaticSchemesOptions { - case let .enabled(targetSchemesGrouping, _, _, _, _, _, _, _): - return targetSchemesGrouping - case .disabled: - return nil - } - } - - public var codeCoverageEnabled: Bool { - switch automaticSchemesOptions { - case let .enabled(_, codeCoverageEnabled, _, _, _, _, _, _): - return codeCoverageEnabled - case .disabled: - return false - } - } - - public var testingOptions: TestingOptions { - switch automaticSchemesOptions { - case let .enabled(_, _, testingOptions, _, _, _, _, _): - return testingOptions - case .disabled: - return [] - } - } - - public var testLanguage: String? { - switch automaticSchemesOptions { - case let .enabled(_, _, _, language, _, _, _, _): - return language - case .disabled: - return nil - } - } - - public var testRegion: String? { - switch automaticSchemesOptions { - case let .enabled(_, _, _, _, region, _, _, _): - return region - case .disabled: - return nil - } - } - - public var testScreenCaptureFormat: ScreenCaptureFormat? { - switch automaticSchemesOptions { - case let .enabled(_, _, _, _, _, testScreenCaptureFormat, _, _): - return testScreenCaptureFormat - case .disabled: - return nil - } - } - - public var runLanguage: String? { - switch automaticSchemesOptions { - case let .enabled(_, _, _, _, _, _, language, _): - return language - case .disabled: - return nil - } - } - - public var runRegion: String? { - switch automaticSchemesOptions { - case let .enabled(_, _, _, _, _, _, _, region): - return region - case .disabled: - return nil - } - } -} diff --git a/Sources/XcodeGraph/Models/Requirement.swift b/Sources/XcodeGraph/Models/Requirement.swift deleted file mode 100644 index 6b3852f39dc..00000000000 --- a/Sources/XcodeGraph/Models/Requirement.swift +++ /dev/null @@ -1,10 +0,0 @@ -import Foundation - -public enum Requirement: Equatable, Codable { - case upToNextMajor(String) - case upToNextMinor(String) - case range(from: String, to: String) - case exact(String) - case branch(String) - case revision(String) -} diff --git a/Sources/XcodeGraph/Models/ResourceFileElements.swift b/Sources/XcodeGraph/Models/ResourceFileElements.swift deleted file mode 100644 index ec17e6fdfe1..00000000000 --- a/Sources/XcodeGraph/Models/ResourceFileElements.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation - -public struct ResourceFileElements: Codable, Equatable { - public var resources: [ResourceFileElement] - - public var privacyManifest: PrivacyManifest? - - public init( - _ resources: [ResourceFileElement], - privacyManifest: PrivacyManifest? = nil - ) { - self.resources = resources - self.privacyManifest = privacyManifest - } -} diff --git a/Sources/XcodeGraph/Models/SDKSource.swift b/Sources/XcodeGraph/Models/SDKSource.swift deleted file mode 100644 index 2c52a66e931..00000000000 --- a/Sources/XcodeGraph/Models/SDKSource.swift +++ /dev/null @@ -1,16 +0,0 @@ -import Foundation - -public enum SDKSource: String, Equatable, Codable { - case developer // Platforms/iPhoneOS.platform/Developer/Library - case system // Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library - - /// Returns the framework search path that should be used in Xcode to locate the SDK. - public var frameworkSearchPath: String? { - switch self { - case .developer: - return "$(PLATFORM_DIR)/Developer/Library/Frameworks" - case .system: - return nil - } - } -} diff --git a/Sources/XcodeGraph/Models/SDKType.swift b/Sources/XcodeGraph/Models/SDKType.swift deleted file mode 100644 index 7d970cece76..00000000000 --- a/Sources/XcodeGraph/Models/SDKType.swift +++ /dev/null @@ -1,13 +0,0 @@ -import Foundation - -public enum SDKType: String, CaseIterable, Equatable { - case framework - case library = "tbd" - - public static var supportedTypesDescription: String { - let supportedTypes = allCases - .map { ".\($0.rawValue)" } - .joined(separator: ", ") - return "[\(supportedTypes)]" - } -} diff --git a/Sources/XcodeGraph/Models/SchemeDiagnosticsOptions.swift b/Sources/XcodeGraph/Models/SchemeDiagnosticsOptions.swift deleted file mode 100644 index 02dd794c5a7..00000000000 --- a/Sources/XcodeGraph/Models/SchemeDiagnosticsOptions.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation - -public struct SchemeDiagnosticsOptions: Equatable, Codable { - public let addressSanitizerEnabled: Bool - public let detectStackUseAfterReturnEnabled: Bool - public let threadSanitizerEnabled: Bool - public let mainThreadCheckerEnabled: Bool - public let performanceAntipatternCheckerEnabled: Bool - - public init( - addressSanitizerEnabled: Bool = false, - detectStackUseAfterReturnEnabled: Bool = false, - threadSanitizerEnabled: Bool = false, - mainThreadCheckerEnabled: Bool = false, - performanceAntipatternCheckerEnabled: Bool = false - ) { - self.addressSanitizerEnabled = addressSanitizerEnabled - self.detectStackUseAfterReturnEnabled = detectStackUseAfterReturnEnabled - self.threadSanitizerEnabled = threadSanitizerEnabled - self.mainThreadCheckerEnabled = mainThreadCheckerEnabled - self.performanceAntipatternCheckerEnabled = performanceAntipatternCheckerEnabled - } -} diff --git a/Sources/XcodeGraph/Models/ScreenCaptureFormat.swift b/Sources/XcodeGraph/Models/ScreenCaptureFormat.swift deleted file mode 100644 index 49e7f59afe7..00000000000 --- a/Sources/XcodeGraph/Models/ScreenCaptureFormat.swift +++ /dev/null @@ -1,6 +0,0 @@ -import Foundation - -public enum ScreenCaptureFormat: String, Codable { - case screenshots - case screenRecording -} diff --git a/Sources/XcodeGraph/Models/SourceFileGlob.swift b/Sources/XcodeGraph/Models/SourceFileGlob.swift deleted file mode 100644 index 5c142f48117..00000000000 --- a/Sources/XcodeGraph/Models/SourceFileGlob.swift +++ /dev/null @@ -1,40 +0,0 @@ -import Foundation - -/// A type that represents a list of source files defined by a glob. -public struct SourceFileGlob: Equatable { - /// Glob pattern to unfold all the source files. - public let glob: String - - /// Glob pattern used for filtering out files. - public let excluding: [String] - - /// Compiler flags. - public let compilerFlags: String? - - /// Source file code generation attribute. - public let codeGen: FileCodeGen? - - /// Compilation condition the source file. - public let compilationCondition: PlatformCondition? - - /// Initializes the source file glob. - /// - Parameters: - /// - glob: Glob pattern to unfold all the source files. - /// - excluding: Glob pattern used for filtering out files. - /// - compilerFlags: Compiler flags. - /// - codeGen: Source file code generation attribute. - /// - compilationCondition: Condition for file compilation. - public init( - glob: String, - excluding: [String] = [], - compilerFlags: String? = nil, - codeGen: FileCodeGen? = nil, - compilationCondition: PlatformCondition? = nil - ) { - self.glob = glob - self.excluding = excluding - self.compilerFlags = compilerFlags - self.codeGen = codeGen - self.compilationCondition = compilationCondition - } -} diff --git a/Sources/XcodeGraph/Models/TestableTarget.swift b/Sources/XcodeGraph/Models/TestableTarget.swift deleted file mode 100644 index b53e6099ee9..00000000000 --- a/Sources/XcodeGraph/Models/TestableTarget.swift +++ /dev/null @@ -1,29 +0,0 @@ -import Foundation - -/// Testable target describe target and tests information. -public struct TestableTarget: Equatable, Hashable, Codable { - /// The target name and its project path. - public let target: TargetReference - /// Skip test target from TestAction. - public let isSkipped: Bool - /// Execute tests in parallel. - public let isParallelizable: Bool - /// Execute tests in random order. - public let isRandomExecutionOrdering: Bool - /// A simulated location used when testing this test target. - public let simulatedLocation: SimulatedLocation? - - public init( - target: TargetReference, - skipped: Bool = false, - parallelizable: Bool = false, - randomExecutionOrdering: Bool = false, - simulatedLocation: SimulatedLocation? = nil - ) { - self.target = target - isSkipped = skipped - isParallelizable = parallelizable - isRandomExecutionOrdering = randomExecutionOrdering - self.simulatedLocation = simulatedLocation - } -} diff --git a/Sources/XcodeGraph/Models/TestingOptions.swift b/Sources/XcodeGraph/Models/TestingOptions.swift deleted file mode 100644 index 675db447ed8..00000000000 --- a/Sources/XcodeGraph/Models/TestingOptions.swift +++ /dev/null @@ -1,10 +0,0 @@ -public struct TestingOptions: OptionSet, Codable, Hashable { - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - public static let parallelizable = TestingOptions(rawValue: 1 << 0) - public static let randomExecutionOrdering = TestingOptions(rawValue: 1 << 1) -} diff --git a/Sources/XcodeGraph/Models/WorkspaceGenerationOptions.swift b/Sources/XcodeGraph/Models/WorkspaceGenerationOptions.swift deleted file mode 100644 index bd86d8cadf2..00000000000 --- a/Sources/XcodeGraph/Models/WorkspaceGenerationOptions.swift +++ /dev/null @@ -1,104 +0,0 @@ -import TSCUtility - -extension Workspace { - /// Contains options related to the workspace generation. - public struct GenerationOptions: Codable, Equatable { - /// Contains options for autogenerated workspace schemes - public enum AutogeneratedWorkspaceSchemes: Codable, Equatable { - /// Contains options for code coverage - public enum CodeCoverageMode: Codable, Equatable { - /// Gather code coverage for all targets - case all - /// Gather code coverage only for targets, that have code coverage enabled at least in one scheme - case relevant - /// Gather code coverage only for given targets - case targets([TargetReference]) - /// Do not gather code coverage - case disabled - } - - /// Tuist will not automatically generate the workspace schemes - case disabled - /// Tuist will generate the workspace schemes - case enabled( - codeCoverageMode: CodeCoverageMode = .disabled, - testingOptions: TestingOptions = [], - testLanguage: String? = nil, - testRegion: String? = nil, - testScreenCaptureFormat: ScreenCaptureFormat? = nil - ) - - public var codeCoverageMode: CodeCoverageMode { - switch self { - case let .enabled(codeCoverageMode, _, _, _, _): - return codeCoverageMode - case .disabled: - return .disabled - } - } - - public var testingOptions: TestingOptions { - switch self { - case let .enabled(_, testingOptions, _, _, _): - return testingOptions - case .disabled: - return [] - } - } - - public var testLanguage: String? { - switch self { - case let .enabled(_, _, language, _, _): - return language - case .disabled: - return nil - } - } - - public var testRegion: String? { - switch self { - case let .enabled(_, _, _, region, _): - return region - case .disabled: - return nil - } - } - - public var testScreenCaptureFormat: ScreenCaptureFormat? { - switch self { - case let .enabled(_, _, _, _, testScreenCaptureFormat): - return testScreenCaptureFormat - case .disabled: - return nil - } - } - } - - /// Tuist generates a WorkspaceSettings.xcsettings file, setting the related key to the associated value. - public let enableAutomaticXcodeSchemes: Bool? - - /// Options for autogenerated workspace schemes - public let autogeneratedWorkspaceSchemes: AutogeneratedWorkspaceSchemes - - /// Allows to suppress warnings in Xcode about updates to recommended settings added in or below the specified Xcode - /// version. The warnings appear when Xcode version has been upgraded. - /// It is recommended to set the version option to Xcode's version that is used for development of a project, for example - /// `.lastXcodeUpgradeCheck(Version(13, 0, 0))` for Xcode 13.0.0. - public let lastXcodeUpgradeCheck: Version? - - /// Allows to render markdown files inside the workspace including an .xcodesamples.plist inside it. - public let renderMarkdownReadme: Bool - - public init( - enableAutomaticXcodeSchemes: Bool?, - autogeneratedWorkspaceSchemes: AutogeneratedWorkspaceSchemes, - lastXcodeUpgradeCheck: Version?, - renderMarkdownReadme: Bool - ) { - self.enableAutomaticXcodeSchemes = enableAutomaticXcodeSchemes - self.autogeneratedWorkspaceSchemes = autogeneratedWorkspaceSchemes - self.lastXcodeUpgradeCheck = lastXcodeUpgradeCheck - self.renderMarkdownReadme = renderMarkdownReadme - } - } -} diff --git a/Sources/XcodeGraphTesting/Models/Condition+TestData.swift b/Sources/XcodeGraphTesting/Models/Condition+TestData.swift deleted file mode 100644 index 6500e4afd27..00000000000 --- a/Sources/XcodeGraphTesting/Models/Condition+TestData.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation -import XcodeGraph -import XCTest - -extension PlatformCondition { - static func test(_ platformFilters: PlatformFilters) throws -> PlatformCondition { - try XCTUnwrap(.when(platformFilters)) - } -} diff --git a/Sources/XcodeGraphTesting/Models/IDETemplateMacros+TestData.swift b/Sources/XcodeGraphTesting/Models/IDETemplateMacros+TestData.swift deleted file mode 100644 index 167466cb895..00000000000 --- a/Sources/XcodeGraphTesting/Models/IDETemplateMacros+TestData.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation -import TuistSupportTesting -import XcodeGraph - -extension IDETemplateMacros { - public static func test(fileHeader: String? = "Header template") -> IDETemplateMacros { - IDETemplateMacros(fileHeader: fileHeader) - } -} diff --git a/Sources/XcodeGraphTesting/Models/ProjectOptions+TestData.swift b/Sources/XcodeGraphTesting/Models/ProjectOptions+TestData.swift deleted file mode 100644 index 1c71d383281..00000000000 --- a/Sources/XcodeGraphTesting/Models/ProjectOptions+TestData.swift +++ /dev/null @@ -1,44 +0,0 @@ -import Foundation -@testable import XcodeGraph - -extension Project.Options { - public static func test( - automaticSchemesOptions: AutomaticSchemesOptions = .enabled( - targetSchemesGrouping: .byNameSuffix( - build: ["Implementation", "Interface", "Mocks", "Testing"], - test: ["Tests", "IntegrationTests", "UITests", "SnapshotTests"], - run: ["App", "Demo"] - ), - codeCoverageEnabled: false, - testingOptions: [] - ), - disableBundleAccessors: Bool = false, - disableShowEnvironmentVarsInScriptPhases: Bool = false, - disableSynthesizedResourceAccessors: Bool = false, - textSettings: TextSettings = .init(usesTabs: nil, indentWidth: nil, tabWidth: nil, wrapsLines: nil) - ) -> Self { - .init( - automaticSchemesOptions: automaticSchemesOptions, - disableBundleAccessors: disableBundleAccessors, - disableShowEnvironmentVarsInScriptPhases: disableShowEnvironmentVarsInScriptPhases, - disableSynthesizedResourceAccessors: disableSynthesizedResourceAccessors, - textSettings: textSettings - ) - } -} - -extension Project.Options.TextSettings { - public static func test( - usesTabs: Bool? = true, - indentWidth: UInt? = 2, - tabWidth: UInt? = 2, - wrapsLines: Bool? = true - ) -> Self { - .init( - usesTabs: usesTabs, - indentWidth: indentWidth, - tabWidth: tabWidth, - wrapsLines: wrapsLines - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/ResourceSynthesizers+TestData.swift b/Sources/XcodeGraphTesting/Models/ResourceSynthesizers+TestData.swift deleted file mode 100644 index e7f8898ac7e..00000000000 --- a/Sources/XcodeGraphTesting/Models/ResourceSynthesizers+TestData.swift +++ /dev/null @@ -1,13 +0,0 @@ -import Foundation -@testable import XcodeGraph - -extension XcodeGraph.ResourceSynthesizer { - public static func test( - parser: Parser = .assets, - parserOptions: [String: Parser.Option] = [:], - extensions: Set = ["xcassets"], - template: Template = .defaultTemplate("Assets") - ) -> Self { - ResourceSynthesizer(parser: parser, parserOptions: parserOptions, extensions: extensions, template: template) - } -} diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift index ac101f18c06..dfbe022f48a 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift @@ -56,7 +56,7 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { sourceRootPath.appending(component: "PluginThree"), ].map { EditablePluginManifest(name: $0.basename, path: $0) } swiftPackageManagerController.getToolsVersionStub = { _ in - Version("5.5.0") + .init(stringLiteral: "5.5.0") } xcodeController.selectedStub = .success(.test(path: AbsolutePath("/Applications/Xcode.app"))) diff --git a/Tests/TuistKitTests/Services/InstallServiceTests.swift b/Tests/TuistKitTests/Services/InstallServiceTests.swift index 7066662d6d5..9d6b7e04082 100644 --- a/Tests/TuistKitTests/Services/InstallServiceTests.swift +++ b/Tests/TuistKitTests/Services/InstallServiceTests.swift @@ -61,7 +61,7 @@ final class InstallServiceTests: TuistUnitTestCase { given(configLoader) .loadConfig(path: .any) .willReturn( - Config.test(swiftVersion: stubbedSwiftVersion) + Config.test(swiftVersion: .init(stringLiteral: stubbedSwiftVersion.description)) ) pluginService.fetchRemotePluginsStub = { _ in @@ -126,7 +126,7 @@ final class InstallServiceTests: TuistUnitTestCase { given(configLoader) .loadConfig(path: .any) .willReturn( - Config.test(swiftVersion: stubbedSwiftVersion) + Config.test(swiftVersion: .init(stringLiteral: stubbedSwiftVersion.description)) ) pluginService.fetchRemotePluginsStub = { _ in } diff --git a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift index c93ecde4561..2b457df0404 100644 --- a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift @@ -71,7 +71,7 @@ final class PackageSettingsLoaderTests: TuistUnitTestCase { defaultSettings: .recommended ), targetSettings: [:], - swiftToolsVersion: TSCUtility.Version("5.4.9") + swiftToolsVersion: Version(stringLiteral: "5.4.9") ) XCTAssertEqual(manifestLoader.registerPluginsCount, 1) XCTAssertEqual(got, expected) diff --git a/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift b/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift index fff6b660977..fad8cd81276 100644 --- a/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift +++ b/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift @@ -66,7 +66,7 @@ final class SwiftPackageManagerControllerTests: TuistUnitTestCase { ]) // When / Then - XCTAssertNoThrow(try subject.setToolsVersion(at: path, to: version)) + XCTAssertNoThrow(try subject.setToolsVersion(at: path, to: version!)) } func test_loadPackageInfo() throws { diff --git a/Tests/XcodeGraphTests/DependenciesGraph/DependenciesGraphTests.swift b/Tests/XcodeGraphTests/DependenciesGraph/DependenciesGraphTests.swift deleted file mode 100644 index 718152be870..00000000000 --- a/Tests/XcodeGraphTests/DependenciesGraph/DependenciesGraphTests.swift +++ /dev/null @@ -1,16 +0,0 @@ -import Foundation -import TuistSupport -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class DependenciesGraphTests: TuistUnitTestCase { - func test_codable_xcframework() { - // Given - let subject = DependenciesGraph.test() - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Graph/GraphDependencyTests.swift b/Tests/XcodeGraphTests/Graph/GraphDependencyTests.swift deleted file mode 100644 index 0dcaa17ba26..00000000000 --- a/Tests/XcodeGraphTests/Graph/GraphDependencyTests.swift +++ /dev/null @@ -1,45 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class GraphDependencyTests: TuistUnitTestCase { - func test_codable_target() { - // Given - let subject = GraphDependency.testTarget() - - // Then - XCTAssertCodable(subject) - } - - func test_codable_framework() { - // Given - let subject = GraphDependency.testFramework() - - // Then - XCTAssertCodable(subject) - } - - func test_isLinkable() { - XCTAssertFalse(GraphDependency.testMacro().isLinkable) - XCTAssertTrue(GraphDependency.testXCFramework().isLinkable) - XCTAssertTrue(GraphDependency.testFramework().isLinkable) - XCTAssertTrue(GraphDependency.testLibrary().isLinkable) - XCTAssertFalse(GraphDependency.testBundle().isLinkable) - XCTAssertTrue(GraphDependency.testPackageProduct().isLinkable) - XCTAssertTrue(GraphDependency.testTarget().isLinkable) - XCTAssertTrue(GraphDependency.testSDK().isLinkable) - } - - func test_isPrecompiledMacro() { - XCTAssertTrue(GraphDependency.testMacro().isPrecompiledMacro) - XCTAssertFalse(GraphDependency.testXCFramework().isPrecompiledMacro) - XCTAssertFalse(GraphDependency.testFramework().isPrecompiledMacro) - XCTAssertFalse(GraphDependency.testLibrary().isPrecompiledMacro) - XCTAssertFalse(GraphDependency.testBundle().isPrecompiledMacro) - XCTAssertFalse(GraphDependency.testPackageProduct().isPrecompiledMacro) - XCTAssertFalse(GraphDependency.testTarget().isPrecompiledMacro) - XCTAssertFalse(GraphDependency.testSDK().isPrecompiledMacro) - } -} diff --git a/Tests/XcodeGraphTests/Graph/GraphTargetTests.swift b/Tests/XcodeGraphTests/Graph/GraphTargetTests.swift deleted file mode 100644 index b61990f7516..00000000000 --- a/Tests/XcodeGraphTests/Graph/GraphTargetTests.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class GraphTargetTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = GraphTarget.test() - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Graph/GraphTests.swift b/Tests/XcodeGraphTests/Graph/GraphTests.swift deleted file mode 100644 index 71257735355..00000000000 --- a/Tests/XcodeGraphTests/Graph/GraphTests.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class GraphTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = Graph.test(name: "name", path: "/path/to") - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/AnalyzeActionTests.swift b/Tests/XcodeGraphTests/Models/AnalyzeActionTests.swift deleted file mode 100644 index ed3c9b2b3a7..00000000000 --- a/Tests/XcodeGraphTests/Models/AnalyzeActionTests.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class AnalyzeActionTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = AnalyzeAction(configurationName: "name") - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/ArchiveActionTests.swift b/Tests/XcodeGraphTests/Models/ArchiveActionTests.swift deleted file mode 100644 index d5b2e9a2400..00000000000 --- a/Tests/XcodeGraphTests/Models/ArchiveActionTests.swift +++ /dev/null @@ -1,37 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class ArchiveActionTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = ArchiveAction( - configurationName: "name", - revealArchiveInOrganizer: true, - customArchiveName: "archiveName", - preActions: [ - .init( - title: "preActionTitle", - scriptText: "text", - target: nil, - shellPath: nil, - showEnvVarsInLog: false - ), - ], - postActions: [ - .init( - title: "postActionTitle", - scriptText: "text", - target: nil, - shellPath: nil, - showEnvVarsInLog: true - ), - ] - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/ArgumentsTests.swift b/Tests/XcodeGraphTests/Models/ArgumentsTests.swift deleted file mode 100644 index c2164a8f098..00000000000 --- a/Tests/XcodeGraphTests/Models/ArgumentsTests.swift +++ /dev/null @@ -1,25 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class ArgumentsTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = Arguments( - environmentVariables: [ - "key": EnvironmentVariable(value: "value", isEnabled: true), - ], - launchArguments: [ - .init( - name: "name", - isEnabled: true - ), - ] - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/BuildActionTests.swift b/Tests/XcodeGraphTests/Models/BuildActionTests.swift deleted file mode 100644 index 395b09a6765..00000000000 --- a/Tests/XcodeGraphTests/Models/BuildActionTests.swift +++ /dev/null @@ -1,40 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class BuildActionTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = BuildAction( - targets: [ - .init( - projectPath: "/path/to/project", - name: "name" - ), - ], - preActions: [ - .init( - title: "preActionTitle", - scriptText: "text", - target: nil, - shellPath: nil, - showEnvVarsInLog: true - ), - ], - postActions: [ - .init( - title: "postActionTitle", - scriptText: "text", - target: nil, - shellPath: nil, - showEnvVarsInLog: false - ), - ] - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/BuildConfigurationTests.swift b/Tests/XcodeGraphTests/Models/BuildConfigurationTests.swift deleted file mode 100644 index dbc3c536488..00000000000 --- a/Tests/XcodeGraphTests/Models/BuildConfigurationTests.swift +++ /dev/null @@ -1,58 +0,0 @@ -import Foundation -import TuistCore -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class BuildConfigurationTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = BuildConfiguration( - name: "Debug", - variant: .debug - ) - - // Then - XCTAssertCodable(subject) - } - - func test_name_returnsTheRightValue_whenDebug() { - XCTAssertEqual(BuildConfiguration.debug.name, "Debug") - } - - func test_name_returnsTheRightValue_whenRelease() { - XCTAssertEqual(BuildConfiguration.release.name, "Release") - } - - func test_xcodeValue_returnsTheRightValue_whenDebug() { - XCTAssertEqual(BuildConfiguration.debug.xcodeValue, "Debug") - } - - func test_xcodeValue_returnsTheRightValue_whenRelease() { - XCTAssertEqual(BuildConfiguration.release.xcodeValue, "Release") - } - - func test_hashValue() { - XCTAssertEqual( - BuildConfiguration(name: "Debug", variant: .debug).hashValue, - BuildConfiguration(name: "Debug", variant: .debug).hashValue - ) - XCTAssertEqual( - BuildConfiguration(name: "Debug", variant: .debug).hashValue, - BuildConfiguration.debug.hashValue - ) - XCTAssertEqual( - BuildConfiguration(name: "debug", variant: .debug).hashValue, - BuildConfiguration.debug.hashValue - ) - XCTAssertNotEqual( - BuildConfiguration(name: "Debug", variant: .debug).hashValue, - BuildConfiguration.release.hashValue - ) - XCTAssertNotEqual( - BuildConfiguration(name: "debug", variant: .debug).hashValue, - BuildConfiguration.release.hashValue - ) - } -} diff --git a/Tests/XcodeGraphTests/Models/BuildRule.CompilerSpecTests.swift b/Tests/XcodeGraphTests/Models/BuildRule.CompilerSpecTests.swift deleted file mode 100644 index 95f95d5ea83..00000000000 --- a/Tests/XcodeGraphTests/Models/BuildRule.CompilerSpecTests.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class BuildRuleCompilerSpecTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = BuildRule.CompilerSpec.customScript - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/BuildRule.FileTypeTests.swift b/Tests/XcodeGraphTests/Models/BuildRule.FileTypeTests.swift deleted file mode 100644 index b9ab2aae709..00000000000 --- a/Tests/XcodeGraphTests/Models/BuildRule.FileTypeTests.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class BuildRuleFileTypeTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = BuildRule.FileType.sourceFilesWithNamesMatching - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/BuildRuleTests.swift b/Tests/XcodeGraphTests/Models/BuildRuleTests.swift deleted file mode 100644 index 03fc38c6cef..00000000000 --- a/Tests/XcodeGraphTests/Models/BuildRuleTests.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class BuildRuleTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = BuildRule( - compilerSpec: .unifdef, - fileType: .sourceFilesWithNamesMatching - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/CompatibleXcodeVersionsTests.swift b/Tests/XcodeGraphTests/Models/CompatibleXcodeVersionsTests.swift deleted file mode 100644 index f0aed625378..00000000000 --- a/Tests/XcodeGraphTests/Models/CompatibleXcodeVersionsTests.swift +++ /dev/null @@ -1,84 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class CompatibleXcodeVersionsTests: XCTestCase { - func test_isCompatible_when_all() { - // Given - let subject = CompatibleXcodeVersions.all - - // Then - XCTAssertTrue(subject.isCompatible(versionString: "1")) - XCTAssertTrue(subject.isCompatible(versionString: "5.5")) - XCTAssertTrue(subject.isCompatible(versionString: "15.10.10")) - } - - func test_isCompatible_when_list() { - // Given - let subject = CompatibleXcodeVersions.list([.upToNextMajor("13.2.2"), .upToNextMinor("1"), "12.5.1"]) - - // Then - XCTAssertTrue(subject.isCompatible(versionString: "12.5.1")) - XCTAssertFalse(subject.isCompatible(versionString: "12.5.2")) - XCTAssertFalse(subject.isCompatible(versionString: "13.2.1")) - XCTAssertTrue(subject.isCompatible(versionString: "13.2.2")) - XCTAssertTrue(subject.isCompatible(versionString: "13.3.6")) - XCTAssertFalse(subject.isCompatible(versionString: "14.2.0")) - XCTAssertTrue(subject.isCompatible(versionString: "1.0.0")) - XCTAssertTrue(subject.isCompatible(versionString: "1.0.5")) - XCTAssertFalse(subject.isCompatible(versionString: "2.0.0")) - } - - func test_isCompatible_when_exact() { - // Given - let subject = CompatibleXcodeVersions.exact("13.2") - - // Then - XCTAssertTrue(subject.isCompatible(versionString: "13.2")) - XCTAssertTrue(subject.isCompatible(versionString: "13.2.0")) - XCTAssertFalse(subject.isCompatible(versionString: "13.2.2")) - XCTAssertFalse(subject.isCompatible(versionString: "13.3.0")) - XCTAssertFalse(subject.isCompatible(versionString: "14.2.0")) - } - - func test_isCompatible_when_upToNextMajor() { - // Given - let subject = CompatibleXcodeVersions.upToNextMajor("13.2") - - // Then - XCTAssertFalse(subject.isCompatible(versionString: "12.3.0")) - XCTAssertFalse(subject.isCompatible(versionString: "13.0.0")) - XCTAssertTrue(subject.isCompatible(versionString: "13.2")) - XCTAssertTrue(subject.isCompatible(versionString: "13.2.0")) - XCTAssertTrue(subject.isCompatible(versionString: "13.2.2")) - XCTAssertTrue(subject.isCompatible(versionString: "13.3.0")) - XCTAssertFalse(subject.isCompatible(versionString: "14.0.0")) - XCTAssertFalse(subject.isCompatible(versionString: "14.2.0")) - } - - func test_isCompatible_when_upToNextMinor() { - // Given - let subject = CompatibleXcodeVersions.upToNextMinor("13.2") - - // Then - XCTAssertFalse(subject.isCompatible(versionString: "12.2.0")) - XCTAssertFalse(subject.isCompatible(versionString: "13.0.0")) - XCTAssertTrue(subject.isCompatible(versionString: "13.2")) - XCTAssertTrue(subject.isCompatible(versionString: "13.2.0")) - XCTAssertTrue(subject.isCompatible(versionString: "13.2.2")) - XCTAssertFalse(subject.isCompatible(versionString: "13.3.0")) - XCTAssertFalse(subject.isCompatible(versionString: "14.2.0")) - } - - func test_description() { - XCTAssertTrue("\(CompatibleXcodeVersions.all)" == "all") - XCTAssertTrue("\(CompatibleXcodeVersions.exact("1.2"))" == "1.2.0") - XCTAssertTrue("\(CompatibleXcodeVersions.upToNextMajor("1.2.3"))" == "1.2.3..<2.0.0") - XCTAssertTrue("\(CompatibleXcodeVersions.upToNextMinor("1.2.3"))" == "1.2.3..<1.3.0") - - let versionsList = CompatibleXcodeVersions.list([.upToNextMajor("13.2.2"), .upToNextMinor("1"), "12.5.1"]) - XCTAssertTrue("\(versionsList)" == "13.2.2..<14.0.0 or 1.0.0..<1.1.0 or 12.5.1") - } -} diff --git a/Tests/XcodeGraphTests/Models/CopyFileElementTests.swift b/Tests/XcodeGraphTests/Models/CopyFileElementTests.swift deleted file mode 100644 index 9d6d07b9938..00000000000 --- a/Tests/XcodeGraphTests/Models/CopyFileElementTests.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class CopyFileElementTests: TuistUnitTestCase { - func test_codable_file() { - // Given - let subject = CopyFileElement.file(path: "/path/to/file", condition: .when([.macos])) - - // Then - XCTAssertCodable(subject) - } - - func test_codable_folderReference() { - // Given - let subject = CopyFileElement.folderReference(path: "/folder/reference", condition: .when([.macos])) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/CopyFilesActionTests.swift b/Tests/XcodeGraphTests/Models/CopyFilesActionTests.swift deleted file mode 100644 index 992a71a80be..00000000000 --- a/Tests/XcodeGraphTests/Models/CopyFilesActionTests.swift +++ /dev/null @@ -1,22 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class CopyFilesActionTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = CopyFilesAction( - name: "name", - destination: .frameworks, - subpath: "subpath", - files: [ - .file(path: "/path/to/file"), - ] - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/CoreDataModelTests.swift b/Tests/XcodeGraphTests/Models/CoreDataModelTests.swift deleted file mode 100644 index 0a57ee88053..00000000000 --- a/Tests/XcodeGraphTests/Models/CoreDataModelTests.swift +++ /dev/null @@ -1,21 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class CoreDataModelTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = CoreDataModel( - path: "/path/to/model", - versions: [ - "/path/to/version", - ], - currentVersion: "1.1.1" - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/ExecutionActionTests.swift b/Tests/XcodeGraphTests/Models/ExecutionActionTests.swift deleted file mode 100644 index 9ef50e0e6d4..00000000000 --- a/Tests/XcodeGraphTests/Models/ExecutionActionTests.swift +++ /dev/null @@ -1,24 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class ExecutionActionTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = ExecutionAction( - title: "title", - scriptText: "text", - target: .init( - projectPath: "/path/to/project", - name: "name" - ), - shellPath: nil, - showEnvVarsInLog: false - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/FileElementTests.swift b/Tests/XcodeGraphTests/Models/FileElementTests.swift deleted file mode 100644 index 6824223a735..00000000000 --- a/Tests/XcodeGraphTests/Models/FileElementTests.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class FileElementTests: TuistUnitTestCase { - func test_codable_file() { - // Given - let subject = FileElement.file(path: "/path/to/file") - - // Then - XCTAssertCodable(subject) - } - - func test_codable_folderReference() { - // Given - let subject = FileElement.folderReference(path: "/folder/reference") - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/HeadersTests.swift b/Tests/XcodeGraphTests/Models/HeadersTests.swift deleted file mode 100644 index ba173863275..00000000000 --- a/Tests/XcodeGraphTests/Models/HeadersTests.swift +++ /dev/null @@ -1,25 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class HeadersTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = Headers( - public: [ - "/path/to/public/header", - ], - private: [ - "/path/to/private/header", - ], - project: [ - "/path/to/project/header", - ] - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/IDETemplateMacrosTests.swift b/Tests/XcodeGraphTests/Models/IDETemplateMacrosTests.swift deleted file mode 100644 index a28118d478d..00000000000 --- a/Tests/XcodeGraphTests/Models/IDETemplateMacrosTests.swift +++ /dev/null @@ -1,58 +0,0 @@ -import XcodeGraph -import XCTest - -final class IDETemplateMacrosTests: XCTestCase { - func test_removing_leading_comment_slashes() { - // Given - let fileHeader = "// Some template" - let templateMacros = IDETemplateMacros(fileHeader: fileHeader) - - // Then - XCTAssertEqual(" Some template", templateMacros.fileHeader) - } - - func test_space_preservation_if_leading_comment_slashes_are_present() { - // Given - let fileHeader = "//Some template" - let templateMacros = IDETemplateMacros(fileHeader: fileHeader) - - // Then - XCTAssertEqual("Some template", templateMacros.fileHeader) - } - - func test_removing_trailing_newline() { - // Given - let fileHeader = "Some template\n" - let templateMacros = IDETemplateMacros(fileHeader: fileHeader) - - // Then - XCTAssertEqual(" Some template", templateMacros.fileHeader) - } - - func test_inserting_leading_space() { - // Given - let fileHeader = "Some template" - let templateMacros = IDETemplateMacros(fileHeader: fileHeader) - - // Then - XCTAssertEqual(" Some template", templateMacros.fileHeader) - } - - func test_not_inserting_leading_space_if_already_present() { - // Given - let fileHeader = " Some template" - let templateMacros = IDETemplateMacros(fileHeader: fileHeader) - - // Then - XCTAssertEqual(" Some template", templateMacros.fileHeader) - } - - func test_not_inserting_leading_space_if_starting_with_newline() { - // Given - let fileHeader = "\nSome template" - let templateMacros = IDETemplateMacros(fileHeader: fileHeader) - - // Then - XCTAssertEqual("\nSome template", templateMacros.fileHeader) - } -} diff --git a/Tests/XcodeGraphTests/Models/PackageTests.swift b/Tests/XcodeGraphTests/Models/PackageTests.swift deleted file mode 100644 index 655016e304e..00000000000 --- a/Tests/XcodeGraphTests/Models/PackageTests.swift +++ /dev/null @@ -1,45 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class PackageTests: TuistUnitTestCase { - func test_codable_local() { - // Given - let subject = Package.local(path: "/path/to/package") - - // Then - XCTAssertCodable(subject) - } - - func test_codable_remote() { - // Given - let subject = Package.remote( - url: "/url/to/package", - requirement: .branch("branch") - ) - - // Then - XCTAssertCodable(subject) - } - - func test_is_remote_local() { - // Given - let subject = Package.local(path: "/path/to/package") - - // Then - XCTAssertFalse(subject.isRemote) - } - - func test_is_remote_remote() { - // Given - let subject = Package.remote( - url: "/url/to/package", - requirement: .branch("branch") - ) - - // Then - XCTAssertTrue(subject.isRemote) - } -} diff --git a/Tests/XcodeGraphTests/Models/PlatformFilterTests.swift b/Tests/XcodeGraphTests/Models/PlatformFilterTests.swift deleted file mode 100644 index 57945601bf8..00000000000 --- a/Tests/XcodeGraphTests/Models/PlatformFilterTests.swift +++ /dev/null @@ -1,26 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class PlatformFilterTests: TuistUnitTestCase { - func test_xcodeprojValue() { - XCTAssertEqual(PlatformFilter.catalyst.xcodeprojValue, "maccatalyst") - XCTAssertEqual(PlatformFilter.ios.xcodeprojValue, "ios") - XCTAssertEqual(PlatformFilter.driverkit.xcodeprojValue, "driverkit") - XCTAssertEqual(PlatformFilter.macos.xcodeprojValue, "macos") - XCTAssertEqual(PlatformFilter.tvos.xcodeprojValue, "tvos") - XCTAssertEqual(PlatformFilter.watchos.xcodeprojValue, "watchos") - } - - func test_platformfilters_xcodeprojValue() { - func xcodeProjValueFor(_ filters: PlatformFilters) -> [String] { - filters.xcodeprojValue - } - - XCTAssertEqual(xcodeProjValueFor([.ios, .macos]), ["ios", "macos"]) - XCTAssertEqual(xcodeProjValueFor([.macos, .ios]), ["ios", "macos"]) - XCTAssertEqual(xcodeProjValueFor([.tvos, .macos, .ios]), ["ios", "macos", "tvos"]) - } -} diff --git a/Tests/XcodeGraphTests/Models/PlatformTests.swift b/Tests/XcodeGraphTests/Models/PlatformTests.swift deleted file mode 100644 index c7a03f63da7..00000000000 --- a/Tests/XcodeGraphTests/Models/PlatformTests.swift +++ /dev/null @@ -1,108 +0,0 @@ -import Foundation -import XCTest -@testable import XcodeGraph - -final class PlatformTests: XCTestCase { - func test_codable_iOS() { - // Given - let subject = Platform.iOS - - // Then - XCTAssertCodable(subject) - } - - func test_codable_tvOS() { - // Given - let subject = Platform.tvOS - - // Then - XCTAssertCodable(subject) - } - - func test_caseInsensitiveCommandInput() { - XCTAssertEqual(Platform.macOS, Platform(commandLineValue: "macos")) - XCTAssertEqual(Platform.macOS, Platform(commandLineValue: "macOS")) - XCTAssertEqual(Platform.macOS, Platform(commandLineValue: "MACOS")) - XCTAssertEqual(Platform.iOS, Platform(commandLineValue: "ios")) - XCTAssertEqual(Platform.iOS, Platform(commandLineValue: "iOS")) - XCTAssertEqual(Platform.iOS, Platform(commandLineValue: "IOS")) - XCTAssertEqual(Platform.tvOS, Platform(commandLineValue: "tvos")) - XCTAssertEqual(Platform.tvOS, Platform(commandLineValue: "tvOS")) - XCTAssertEqual(Platform.watchOS, Platform(commandLineValue: "watchos")) - XCTAssertEqual(Platform.watchOS, Platform(commandLineValue: "watchOS")) - XCTAssertEqual(Platform.visionOS, Platform(commandLineValue: "visionos")) - XCTAssertEqual(Platform.visionOS, Platform(commandLineValue: "visionOS")) - } - - func test_caseInvalidPlatform_throws() { - do { - let _ = try Platform.from(commandLineValue: "not_a_platform") - XCTFail("Expected erro to be thrown") - } catch let error as UnsupportedPlatformError { - XCTAssertEqual(error, UnsupportedPlatformError(input: "not_a_platform")) - } catch { - XCTFail("Unexpected error thrown") - } - } - - func test_caseValidPlatform_doesNotThrow() throws { - XCTAssertEqual(Platform.iOS, try Platform.from(commandLineValue: "iOS")) - XCTAssertEqual(Platform.macOS, try Platform.from(commandLineValue: "macOS")) - XCTAssertEqual(Platform.macOS, try Platform.from(commandLineValue: "macos")) - } - - func test_xcodeSdkRoot_returns_the_right_value() { - XCTAssertEqual(Platform.macOS.xcodeSdkRoot, "macosx") - XCTAssertEqual(Platform.iOS.xcodeSdkRoot, "iphoneos") - XCTAssertEqual(Platform.tvOS.xcodeSdkRoot, "appletvos") - XCTAssertEqual(Platform.watchOS.xcodeSdkRoot, "watchos") - XCTAssertEqual(Platform.visionOS.xcodeSdkRoot, "xros") - } - - func test_xcodeSimulatorSDK() { - XCTAssertEqual(Platform.tvOS.xcodeSimulatorSDK, "appletvsimulator") - XCTAssertEqual(Platform.iOS.xcodeSimulatorSDK, "iphonesimulator") - XCTAssertEqual(Platform.watchOS.xcodeSimulatorSDK, "watchsimulator") - XCTAssertEqual(Platform.visionOS.xcodeSimulatorSDK, "xrsimulator") - XCTAssertNil(Platform.macOS.xcodeSimulatorSDK) - } - - func test_xcodeDeviceSDK() { - XCTAssertEqual(Platform.tvOS.xcodeDeviceSDK, "appletvos") - XCTAssertEqual(Platform.iOS.xcodeDeviceSDK, "iphoneos") - XCTAssertEqual(Platform.watchOS.xcodeDeviceSDK, "watchos") - XCTAssertEqual(Platform.macOS.xcodeDeviceSDK, "macosx") - XCTAssertEqual(Platform.visionOS.xcodeDeviceSDK, "xros") - } - - func test_hasSimulators() { - XCTAssertFalse(Platform.macOS.hasSimulators) - XCTAssertTrue(Platform.tvOS.hasSimulators) - XCTAssertTrue(Platform.watchOS.hasSimulators) - XCTAssertTrue(Platform.tvOS.hasSimulators) - XCTAssertTrue(Platform.visionOS.hasSimulators) - } - - func test_xcodeSdkRootPath() { - // Given - let platforms: [Platform] = [ - .iOS, - .macOS, - .tvOS, - .watchOS, - .visionOS, - ] - - // When - let paths = platforms.map(\.xcodeSdkRootPath) - - // Then - XCTAssertEqual(paths, [ - "Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk", - "Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk", - "Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk", - "Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk", - "Platforms/XROS.platform/Developer/SDKs/XROS.sdk", - ]) - } -} diff --git a/Tests/XcodeGraphTests/Models/ProfileActionTests.swift b/Tests/XcodeGraphTests/Models/ProfileActionTests.swift deleted file mode 100644 index 58ed1acdf26..00000000000 --- a/Tests/XcodeGraphTests/Models/ProfileActionTests.swift +++ /dev/null @@ -1,32 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class ProfileActionTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = ProfileAction( - configurationName: "name", - executable: .init( - projectPath: "/path/to/project", - name: "name" - ), - arguments: .init( - environmentVariables: [ - "key": EnvironmentVariable(value: "value", isEnabled: true), - ], - launchArguments: [ - .init( - name: "name", - isEnabled: false - ), - ] - ) - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/ProjectGroupTests.swift b/Tests/XcodeGraphTests/Models/ProjectGroupTests.swift deleted file mode 100644 index aea23cf955c..00000000000 --- a/Tests/XcodeGraphTests/Models/ProjectGroupTests.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class ProjectGroupTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = ProjectGroup.group(name: "name") - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/RawScriptBuildPhaseTests.swift b/Tests/XcodeGraphTests/Models/RawScriptBuildPhaseTests.swift deleted file mode 100644 index bc84ce11975..00000000000 --- a/Tests/XcodeGraphTests/Models/RawScriptBuildPhaseTests.swift +++ /dev/null @@ -1,20 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class RawScriptBuildPhaseTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = RawScriptBuildPhase( - name: "name", - script: "script", - showEnvVarsInLog: true, - hashable: true - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/RequirementTests.swift b/Tests/XcodeGraphTests/Models/RequirementTests.swift deleted file mode 100644 index 39ec0e7502a..00000000000 --- a/Tests/XcodeGraphTests/Models/RequirementTests.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class RequirementTests: TuistUnitTestCase { - func test_codable_range() { - // Given - let subject = Requirement.range(from: "1.0.0", to: "2.0.0") - - // Then - XCTAssertCodable(subject) - } - - func test_codable_upToNextMajor() { - // Given - let subject = Requirement.upToNextMajor("1.2.3") - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/ResourceFileElementTests.swift b/Tests/XcodeGraphTests/Models/ResourceFileElementTests.swift deleted file mode 100644 index cc9a6963ae8..00000000000 --- a/Tests/XcodeGraphTests/Models/ResourceFileElementTests.swift +++ /dev/null @@ -1,33 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class ResourceFileElementTests: TuistUnitTestCase { - func test_codable_file() { - // Given - let subject = ResourceFileElement.file( - path: "/path/to/element", - tags: [ - "tag", - ] - ) - - // Then - XCTAssertCodable(subject) - } - - func test_codable_folderReference() { - // Given - let subject = ResourceFileElement.folderReference( - path: "/path/to/folder", - tags: [ - "tag", - ] - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/ResourceSynthesizerTests.swift b/Tests/XcodeGraphTests/Models/ResourceSynthesizerTests.swift deleted file mode 100644 index d9e08e72b85..00000000000 --- a/Tests/XcodeGraphTests/Models/ResourceSynthesizerTests.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class ResourceSynthesizerTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = ResourceSynthesizer( - parser: .coreData, - parserOptions: ["key": "value"], - extensions: [ - "extension1", - "extension2", - ], - template: .defaultTemplate("template") - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/RunActionTests.swift b/Tests/XcodeGraphTests/Models/RunActionTests.swift deleted file mode 100644 index 09ddff9fc97..00000000000 --- a/Tests/XcodeGraphTests/Models/RunActionTests.swift +++ /dev/null @@ -1,40 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class RunActionTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = RunAction( - configurationName: "name", - attachDebugger: true, - customLLDBInitFile: "/path/to/project", - executable: .init( - projectPath: "/path/to/project", - name: "name" - ), - filePath: "/path/to/file", - arguments: .init( - environmentVariables: [ - "key": EnvironmentVariable(value: "value", isEnabled: true), - ], - launchArguments: [ - .init( - name: "name", - isEnabled: true - ), - ] - ), - options: .init(), - diagnosticsOptions: SchemeDiagnosticsOptions( - mainThreadCheckerEnabled: true, - performanceAntipatternCheckerEnabled: true - ) - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/SDKSourceTests.swift b/Tests/XcodeGraphTests/Models/SDKSourceTests.swift deleted file mode 100644 index 7e7f11f2269..00000000000 --- a/Tests/XcodeGraphTests/Models/SDKSourceTests.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class SDKSourceTests: TuistUnitTestCase { - func test_codable_developer() { - // Given - let subject = SDKSource.developer - - // Then - XCTAssertCodable(subject) - } - - func test_codable_system() { - // Given - let subject = SDKSource.system - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/SchemeTests.swift b/Tests/XcodeGraphTests/Models/SchemeTests.swift deleted file mode 100644 index be187dcb0db..00000000000 --- a/Tests/XcodeGraphTests/Models/SchemeTests.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class SchemeTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = Scheme.test(name: "name", shared: true) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/SourceFileTests.swift b/Tests/XcodeGraphTests/Models/SourceFileTests.swift deleted file mode 100644 index cd249b56d57..00000000000 --- a/Tests/XcodeGraphTests/Models/SourceFileTests.swift +++ /dev/null @@ -1,19 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class SourceFileTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = SourceFile( - path: "/path/to/file", - compilerFlags: "flag", - contentHash: "hash" - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/TargetDependencyTests.swift b/Tests/XcodeGraphTests/Models/TargetDependencyTests.swift deleted file mode 100644 index 8fbc237409c..00000000000 --- a/Tests/XcodeGraphTests/Models/TargetDependencyTests.swift +++ /dev/null @@ -1,64 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class TargetDependencyTests: TuistUnitTestCase { - func test_codable_framework() { - // Given - let subject = TargetDependency.framework( - path: "/path/to/framework", - status: .required - ) - - // Then - XCTAssertCodable(subject) - } - - func test_codable_project() { - // Given - let subject = TargetDependency.project(target: "target", path: "/path/to/target") - - // Then - XCTAssertCodable(subject) - } - - func test_codable_library() { - // Given - let subject = TargetDependency.library( - path: "/path/to/library", - publicHeaders: "/path/to/publicheaders", - swiftModuleMap: "/path/to/swiftModuleMap" - ) - - // Then - XCTAssertCodable(subject) - } - - func test_filtering() { - let expected: PlatformCondition? = .when([.macos]) - - let subjects: [TargetDependency] = [ - .framework(path: "/", status: .required, condition: expected), - .library(path: "/", publicHeaders: "/", swiftModuleMap: "/", condition: expected), - .sdk(name: "", status: .required, condition: expected), - .package(product: "", type: .plugin, condition: expected), - .target(name: "", condition: expected), - .xcframework(path: "/", status: .required, condition: expected), - .project(target: "", path: "/", condition: expected), - ] - - for subject in subjects { - XCTAssertEqual(subject.condition, expected) - XCTAssertEqual(subject.withCondition(.when([.catalyst])).condition, .when([.catalyst])) - } - } - - func test_xctest_platformFilters_alwaysReturnAll() { - let subject = TargetDependency.xctest - - XCTAssertNil(subject.condition) - XCTAssertNil(subject.withCondition(.when([.catalyst])).condition) - } -} diff --git a/Tests/XcodeGraphTests/Models/TargetReferenceTests.swift b/Tests/XcodeGraphTests/Models/TargetReferenceTests.swift deleted file mode 100644 index 72eaaf94dfe..00000000000 --- a/Tests/XcodeGraphTests/Models/TargetReferenceTests.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class TargetReferenceTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = TargetReference( - projectPath: "/path/to/project", - name: "name" - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/TestActionTests.swift b/Tests/XcodeGraphTests/Models/TestActionTests.swift deleted file mode 100644 index 8ff3209d907..00000000000 --- a/Tests/XcodeGraphTests/Models/TestActionTests.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class TestActionTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = TestAction.test() - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/TestPlanTests.swift b/Tests/XcodeGraphTests/Models/TestPlanTests.swift deleted file mode 100644 index 0b112176960..00000000000 --- a/Tests/XcodeGraphTests/Models/TestPlanTests.swift +++ /dev/null @@ -1,19 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class TestPlanTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = TestPlan( - path: "/path/to", - testTargets: [], - isDefault: true - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/TestableTargetTests.swift b/Tests/XcodeGraphTests/Models/TestableTargetTests.swift deleted file mode 100644 index 14361029094..00000000000 --- a/Tests/XcodeGraphTests/Models/TestableTargetTests.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class TestableTargetTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = TestableTarget( - target: .init( - projectPath: "/path/to/project", - name: "name" - ), - skipped: true, - parallelizable: true, - randomExecutionOrdering: true - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/WorkspaceGenerationOptionsTests.swift b/Tests/XcodeGraphTests/Models/WorkspaceGenerationOptionsTests.swift deleted file mode 100644 index b67be12cb48..00000000000 --- a/Tests/XcodeGraphTests/Models/WorkspaceGenerationOptionsTests.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class WorkspaceGenerationOptionsTests: TuistUnitTestCase { - func test_codable_whenDefault() { - // Given - let subject = Workspace.GenerationOptions.test() - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tests/XcodeGraphTests/Models/WorkspaceTests.swift b/Tests/XcodeGraphTests/Models/WorkspaceTests.swift deleted file mode 100644 index 44098e20e81..00000000000 --- a/Tests/XcodeGraphTests/Models/WorkspaceTests.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class WorkspaceTests: TuistUnitTestCase { - func test_codable() { - // Given - let subject = Workspace.test( - path: "/path/to/workspace", - name: "name" - ) - - // Then - XCTAssertCodable(subject) - } -} diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index 5529dac50da..45da26790b9 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -10,7 +10,6 @@ public enum Module: String, CaseIterable { case acceptanceTesting = "TuistAcceptanceTesting" case support = "TuistSupport" case kit = "TuistKit" - case xcodeProjectGenerator = "XcodeGraph" case core = "TuistCore" case generator = "TuistGenerator" case scaffold = "TuistScaffold" @@ -147,7 +146,7 @@ public enum Module: String, CaseIterable { public var integrationTestsTargetName: String? { switch self { - case .tuist, .tuistBenchmark, .tuistFixtureGenerator, .projectAutomation, .projectDescription, .xcodeProjectGenerator, + case .tuist, .tuistBenchmark, .tuistFixtureGenerator, .projectAutomation, .projectDescription, .asyncQueue, .plugin, .analytics, .dependencies, .acceptanceTesting, .app: return nil @@ -252,30 +251,25 @@ public enum Module: String, CaseIterable { .target(name: Module.asyncQueue.targetName), .target(name: Module.analytics.targetName), .target(name: Module.plugin.targetName), - .target(name: Module.xcodeProjectGenerator.targetName), .external(name: "SwiftToolsSupport"), + .external(name: "XcodeGraph"), .external(name: "ArgumentParser"), .external(name: "GraphViz"), .external(name: "AnyCodable"), ] - case .xcodeProjectGenerator: - [ - .target(name: Module.support.targetName), - .external(name: "AnyCodable"), - ] case .core: [ .target(name: Module.projectDescription.targetName), .target(name: Module.support.targetName), - .target(name: Module.xcodeProjectGenerator.targetName), + .external(name: "XcodeGraph"), .external(name: "XcodeProj"), .external(name: "SwiftToolsSupport"), ] case .generator: [ .target(name: Module.core.targetName), - .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.targetName), + .external(name: "XcodeGraph"), .external(name: "SwiftGenKit"), .external(name: "PathKit"), .external(name: "StencilSwiftKit"), @@ -286,32 +280,31 @@ public enum Module: String, CaseIterable { case .scaffold: [ .target(name: Module.core.targetName), - .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.targetName), + .external(name: "XcodeGraph"), .external(name: "PathKit"), .external(name: "StencilSwiftKit"), ] case .loader: [ .target(name: Module.core.targetName), - .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.targetName), .target(name: Module.projectDescription.targetName), + .external(name: "XcodeGraph"), .external(name: "XcodeProj"), .external(name: "SwiftToolsSupport"), ] case .asyncQueue: [ .target(name: Module.core.targetName), - .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.targetName), + .external(name: "XcodeGraph"), .external(name: "Queuer"), .external(name: "XcodeProj"), ] case .plugin: [ .target(name: Module.core.targetName), - .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.loader.targetName), .target(name: Module.support.targetName), .target(name: Module.scaffold.targetName), @@ -321,34 +314,34 @@ public enum Module: String, CaseIterable { [ .target(name: Module.asyncQueue.targetName), .target(name: Module.core.targetName), - .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.loader.targetName), .target(name: Module.support.targetName), .external(name: "AnyCodable"), + .external(name: "XcodeGraph"), ] case .migration: [ .target(name: Module.core.targetName), - .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.targetName), .external(name: "PathKit"), .external(name: "XcodeProj"), .external(name: "SwiftToolsSupport"), + .external(name: "XcodeGraph"), ] case .dependencies: [ .target(name: Module.projectDescription.targetName), .target(name: Module.core.targetName), - .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.targetName), + .external(name: "XcodeGraph"), ] case .automation: [ .target(name: Module.core.targetName), - .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.targetName), .external(name: "XcodeProj"), .external(name: "XcbeautifyLib"), + .external(name: "XcodeGraph"), ] case .app: [ @@ -388,53 +381,45 @@ public enum Module: String, CaseIterable { .target(name: Module.automation.testingTargetName!), .target(name: Module.migration.testingTargetName!), .target(name: Module.asyncQueue.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.plugin.targetName), .target(name: Module.plugin.testingTargetName!), .external(name: "ArgumentParser"), .external(name: "GraphViz"), .external(name: "AnyCodable"), - ] - case .xcodeProjectGenerator: - [ - .target(name: Module.core.targetName), - .target(name: Module.core.testingTargetName!), - .target(name: Module.support.targetName), - .target(name: Module.support.testingTargetName!), - .external(name: "XcodeProj"), + .external(name: "XcodeGraphTesting"), ] case .core: [ .target(name: Module.support.targetName), - .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraph"), + .external(name: "XcodeGraphTesting"), ] case .generator: [ .target(name: Module.core.testingTargetName!), .target(name: Module.support.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), .external(name: "XcodeProj"), .external(name: "GraphViz"), + .external(name: "XcodeGraphTesting"), ] case .scaffold: [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraphTesting"), ] case .loader: [ - .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), + .external(name: "XcodeGraphTesting"), ] case .asyncQueue: [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraphTesting"), .external(name: "Queuer"), ] case .plugin: @@ -442,36 +427,36 @@ public enum Module: String, CaseIterable { .target(name: Module.projectDescription.targetName), .target(name: Module.loader.targetName), .target(name: Module.loader.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), .target(name: Module.scaffold.testingTargetName!), .target(name: Module.core.testingTargetName!), + .external(name: "XcodeGraphTesting"), ] case .analytics: [ .target(name: Module.support.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.core.testingTargetName!), + .external(name: "XcodeGraphTesting"), ] case .migration: [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraphTesting"), ] case .dependencies: [ .target(name: Module.core.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.loader.testingTargetName!), .target(name: Module.support.testingTargetName!), + .external(name: "XcodeGraphTesting"), ] case .automation: [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraphTesting"), ] case .app: [ @@ -499,61 +484,55 @@ public enum Module: String, CaseIterable { case .support: [ .target(name: Module.core.targetName), - .target(name: Module.xcodeProjectGenerator.targetName), + .external(name: "XcodeGraph"), ] case .kit: [] - case .xcodeProjectGenerator: - [ - .target(name: Module.support.targetName), - .target(name: Module.support.testingTargetName!), - .external(name: "XcodeProj"), - ] case .core: [ .target(name: Module.support.targetName), - .target(name: Module.xcodeProjectGenerator.targetName), .target(name: Module.support.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraph"), + .external(name: "XcodeGraphTesting"), ] case .generator: [ .target(name: Module.core.testingTargetName!), .target(name: Module.support.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraphTesting"), .external(name: "XcodeProj"), ] case .scaffold: [ - .target(name: Module.xcodeProjectGenerator.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.targetName), + .external(name: "XcodeGraph"), + .external(name: "XcodeGraphTesting"), ] case .loader: [ .target(name: Module.core.targetName), .target(name: Module.projectDescription.targetName), .target(name: Module.support.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.targetName), + .external(name: "XcodeGraph"), + .external(name: "XcodeGraphTesting"), ] case .asyncQueue: [ - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraphTesting"), ] case .plugin: [ - .target(name: Module.xcodeProjectGenerator.targetName), + .external(name: "XcodeGraph"), ] case .analytics: [] case .migration: [ - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraphTesting"), ] case .dependencies: [ - .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.projectDescription.targetName), + .external(name: "XcodeGraphTesting"), ] case .automation: [ @@ -561,7 +540,7 @@ public enum Module: String, CaseIterable { .target(name: Module.core.testingTargetName!), .target(name: Module.projectDescription.targetName), .target(name: Module.support.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraphTesting"), ] case .app: [] @@ -579,8 +558,9 @@ public enum Module: String, CaseIterable { .target(name: Module.support.testingTargetName!), .target(name: Module.support.targetName), .target(name: Module.core.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.loader.testingTargetName!), + .external(name: "XcodeGraphTesting"), + .external(name: "SwiftToolsSupport"), .external(name: "XcodeProj"), ] case .kit: @@ -590,11 +570,9 @@ public enum Module: String, CaseIterable { .target(name: Module.projectDescription.targetName), .target(name: Module.automation.targetName), .target(name: Module.loader.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraphTesting"), .external(name: "XcodeProj"), ] - case .xcodeProjectGenerator: - [] case .core: [ .target(name: Module.support.testingTargetName!), @@ -603,19 +581,19 @@ public enum Module: String, CaseIterable { [ .target(name: Module.core.testingTargetName!), .target(name: Module.support.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraphTesting"), .external(name: "XcodeProj"), ] case .scaffold: [ .target(name: Module.support.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraphTesting"), ] case .loader: [ - .target(name: Module.xcodeProjectGenerator.testingTargetName!), .target(name: Module.support.testingTargetName!), .target(name: Module.projectDescription.targetName), + .external(name: "XcodeGraphTesting"), ] case .asyncQueue: [] @@ -627,14 +605,14 @@ public enum Module: String, CaseIterable { [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraphTesting"), ] case .dependencies: [] case .automation: [ .target(name: Module.support.testingTargetName!), - .target(name: Module.xcodeProjectGenerator.testingTargetName!), + .external(name: "XcodeGraphTesting"), ] case .app: [] From ab9ad9b6b950444e67d34e8d3a8a14dbe1ff7686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Mon, 10 Jun 2024 17:18:55 +0200 Subject: [PATCH 345/509] Fix Package.swift dependency (#6387) --- Package.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index e496fce1d82..b6633c135b2 100644 --- a/Package.swift +++ b/Package.swift @@ -44,7 +44,7 @@ var targets: [Target] = [ dependencies: [ "TuistCore", "TuistSupportTesting", - "XcodeGraphTesting", + .product(name: "XcodeGraphTesting", package: "XcodeGraph"), pathDependency, ], linkerSettings: [.linkedFramework("XCTest")] @@ -248,7 +248,7 @@ var targets: [Target] = [ "TuistLoader", pathDependency, "TuistCore", - "XcodeGraphTesting", + .product(name: "XcodeGraphTesting", package: "XcodeGraph"), "ProjectDescription", "TuistSupportTesting", ], From 0039616cb42af36f667a5fa4e8bbd9292eb4621d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 10 Jun 2024 17:59:45 +0200 Subject: [PATCH 346/509] Add docs for Prometheus metrics (#6384) * Add docs for Prometheus metrics * Add note about scrape_interval --- docs/docs/cloud/on-premise.md | 41 +++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/docs/docs/cloud/on-premise.md b/docs/docs/cloud/on-premise.md index af9bbc17046..2a09ad9799f 100644 --- a/docs/docs/cloud/on-premise.md +++ b/docs/docs/cloud/on-premise.md @@ -35,7 +35,7 @@ To run it, your infrastructure must support running Docker images. Note that mos In addition to running the Docker images, you’ll need a [Postgres database](https://www.postgresql.org/) to store relational data. Most infrastructure providers include Posgres databases in their offering (e.g., [AWS](https://aws.amazon.com/rds/postgresql/) & [Google Cloud](https://cloud.google.com/sql/docs/postgres)). -For performant analytics, we use a [Timescale Postgres extension](https://www.timescale.com/). You need to make sure that TimescaleDB is installed on the machine running the Postgres database. Follow the installation instructions [here](https://docs.timescale.com/self-hosted/latest/install/) to learn more. +For performant analytics, we use a [Timescale Postgres extension](https://www.timescale.com/). You need to make sure that TimescaleDB is installed on the machine running the Postgres database. Follow the installation instructions [here](https://docs.timescale.com/self-hosted/latest/install/) to learn more. If you are unable to install the Timescale extension, you can set up your own dashboard using the Prometheus metrics. > [!INFO] MIGRATIONS > The Docker image's entrypoint automatically runs any pending schema migrations before starting the service. @@ -312,4 +312,41 @@ services: volumes: db: driver: local -``` \ No newline at end of file +``` + +## Metrics + +You can ingest metrics gathered by the Tuist server using [Prometheus](https://prometheus.io/) and a visualization tool such as [Grafana](https://grafana.com/) to create a custom dashboard tailored to your needs. The Prometheus metrics are served via the `/metrics` endpoint. The Prometheus' [scrape_interval](https://prometheus.io/docs/introduction/first_steps/#configuring-prometheus) should be set as less than 10_000 seconds (we recommend keeping the default of 15 seconds). + +### Runs metrics + +A set of metrics related to Tuist Runs. + +#### `tuist_runs_total` (counter) + +The total number of Tuist Runs. + +**Tags:** +- `name` – name of the `tuist` command that was run, such as `build`, `test`, etc. +- `is_ci` – a boolean indicating if the executor was a CI or a developer's machine. +- `status` – `0` in case of `success`, `1` in case of `failure` + +#### `tuist_runs_duration_milliseconds` (histogram) + +The total duration of each tuist run in milliseconds. + +**Tags:** +- `name` – name of the `tuist` command that was run, such as `build`, `test`, etc. +- `is_ci` – a boolean indicating if the executor was a CI or a developer's machine. +- `status` – `0` in case of `success`, `1` in case of `failure` + +### Cache metrics + +A set of metrics related to the Tuist Cache. + +#### `tuist_cache_events_total` (counter) + +The total number of Tuist Binary Cache events. + +**Tags:** +- `event_type`: Can be either of `local_hit`, `remote_hit`, or `miss`. From aeeb19b7830c3a1da8f8cf2af206e326029bd9d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 10 Jun 2024 18:00:37 +0200 Subject: [PATCH 347/509] Do not override GCC_PREFIX_HEADER for internal targets (#6388) --- .../TuistGenerator/Mappers/ResourcesProjectMapper.swift | 3 ++- .../ProjectMappers/ResourcesProjectMapperTests.swift | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index dba53ddf205..a11e5ea5d29 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -81,7 +81,8 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this sideEffects.append(sideEffect) } - if target.supportsSources, + if project.isExternal, + target.supportsSources, target.sources.containsObjcFiles, target.resources.containsBundleAccessedResources { diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 541a877338c..74ca7f1302d 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -416,11 +416,12 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { // Then let gotTarget = try XCTUnwrap(gotProject.targets.values.sorted().last) - verifyObjcBundleAccessor( - for: target, - gotTarget: gotTarget, - gotSideEffects: gotSideEffects + XCTAssertEqual( + gotTarget.settings?.base["GCC_PREFIX_HEADER"], + nil ) + XCTAssertEqual(gotTarget.sources.count, 1) + XCTAssertEqual(gotSideEffects.count, 0) } func test_map_when_project_name_has_dashes_in_it_bundle_name_include_dash_for_project_name_and_underscore_for_target_name( From a0aa54aeba0b1b63f4e9b8cfc41f2c36933b1f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 10 Jun 2024 18:07:43 +0200 Subject: [PATCH 348/509] Fix missing platform-specific settings for SPM packages (#6386) * Fix missing platform-specific settings for SPM packages * Respect maccatalyst setting condition --- .../PackageInfo+graphPlatform.swift | 17 ------ .../PackageInfoMapper.swift | 4 +- .../SwiftPackageManager/SettingsMapper.swift | 19 ++++--- .../RunAcceptanceTests.swift | 1 + .../GenerateAcceptanceTests.swift | 1 + .../PackageInfoGraphPlatformTests.swift | 41 -------------- .../PackageInfoMapperTests.swift | 16 +++++- .../SettingsMapperTests.swift | 53 ++++++++++++++++++- .../command_line_tool_basic/Project.swift | 5 +- .../Tuist/Package.resolved | 15 ++++++ .../Tuist/Package.swift | 13 +++++ 11 files changed, 113 insertions(+), 72 deletions(-) delete mode 100644 Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoGraphPlatformTests.swift create mode 100644 fixtures/command_line_tool_basic/Tuist/Package.resolved create mode 100644 fixtures/command_line_tool_basic/Tuist/Package.swift diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfo+graphPlatform.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfo+graphPlatform.swift index f60341791ae..58f98f1010c 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfo+graphPlatform.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfo+graphPlatform.swift @@ -4,23 +4,6 @@ import TuistSupport import XcodeGraph extension PackageInfo.Platform { - func graphPlatform() throws -> XcodeGraph.Platform { - switch platformName.lowercased() { - case "ios", "maccatalyst": - return .iOS - case "macos": - return .macOS - case "tvos": - return .tvOS - case "watchos": - return .watchOS - case "visionos": - return .visionOS - default: - throw PackageInfoMapperError.unknownPlatform(platformName) - } - } - func destinations() throws -> ProjectDescription.Destinations { switch platformName.lowercased() { case "ios": diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index a701d7b3900..942bb06429a 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -593,7 +593,6 @@ public final class PackageInfoMapper: PackageInfoMapping { packageFolder: packageFolder, packageName: packageInfo.name, settings: target.settings, - platforms: packageInfo.platforms, moduleMap: moduleMap, baseSettings: baseSettings, targetSettings: targetSettings @@ -943,7 +942,6 @@ extension ProjectDescription.Settings { packageFolder: AbsolutePath, packageName _: String, settings: [PackageInfo.Target.TargetBuildSettingDescription.Setting], - platforms: [PackageInfo.Platform], moduleMap: ModuleMap?, baseSettings: XcodeGraph.Settings, targetSettings: [String: XcodeGraph.SettingsDictionary] @@ -980,7 +978,7 @@ extension ProjectDescription.Settings { settings: settings ) - let resolvedSettings = try mapper.settingsForPlatforms(platforms) + let resolvedSettings = try mapper.mapSettings() settingsDictionary.merge(resolvedSettings) { $1 } diff --git a/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift b/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift index fcb9a285764..157ebcbab93 100644 --- a/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift @@ -19,12 +19,12 @@ struct SettingsMapper { private let mainRelativePath: RelativePath private let settings: [PackageInfo.Target.TargetBuildSettingDescription.Setting] - func settingsForPlatforms(_ platforms: [PackageInfo.Platform]) throws -> XcodeGraph.SettingsDictionary { + func mapSettings() throws -> XcodeGraph.SettingsDictionary { var resolvedSettings = try settingsDictionary() - for platform in platforms.sorted(by: { $0.platformName < $1.platformName }) { + for platform in XcodeGraph.Platform.allCases.sorted(by: { $0.rawValue < $1.rawValue }) { let platformSettings = try settingsDictionary(for: platform) - resolvedSettings.overlay(with: platformSettings, for: try platform.graphPlatform()) + resolvedSettings.overlay(with: platformSettings, for: platform) } return resolvedSettings @@ -41,8 +41,8 @@ struct SettingsMapper { } // swiftlint:disable:next function_body_length - func settingsDictionary(for platform: PackageInfo.Platform? = nil) throws -> XcodeGraph.SettingsDictionary { - let platformSettings = try settings(for: platform?.platformName) + func settingsDictionary(for platform: XcodeGraph.Platform? = nil) throws -> XcodeGraph.SettingsDictionary { + let platformSettings = try settings(for: platform?.rawValue) return try map( settings: platformSettings, @@ -141,7 +141,14 @@ struct SettingsMapper { { settings.filter { setting in if let platformName, setting.hasConditions { - return setting.condition?.platformNames.contains(platformName) == true + let hasMacCatalystPlatform = setting.condition?.platformNames.contains("maccatalyst") == true + let platformNames: [String] + if hasMacCatalystPlatform { + platformNames = (setting.condition?.platformNames ?? []) + ["ios"] + } else { + platformNames = setting.condition?.platformNames ?? [] + } + return platformNames.contains(platformName) } else { return !setting.hasConditions } diff --git a/Tests/TuistAcceptanceTests/RunAcceptanceTests.swift b/Tests/TuistAcceptanceTests/RunAcceptanceTests.swift index 73765f73eab..297d8e3d4c5 100644 --- a/Tests/TuistAcceptanceTests/RunAcceptanceTests.swift +++ b/Tests/TuistAcceptanceTests/RunAcceptanceTests.swift @@ -8,6 +8,7 @@ import XCTest final class RunAcceptanceTestCommandLineToolBasic: TuistAcceptanceTestCase { func test_command_line_tool_basic() async throws { try setUpFixture(.commandLineToolBasic) + try await run(InstallCommand.self) try await run(RunCommand.self, "CommandLineTool") } } diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index deeae5d25ff..2a7cc5fc3b3 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -634,6 +634,7 @@ final class GenerateAcceptanceTestiOSAppWithAppClip: TuistAcceptanceTestCase { final class GenerateAcceptanceTestCommandLineToolBase: TuistAcceptanceTestCase { func test_command_line_tool_basic() async throws { try setUpFixture(.commandLineToolBasic) + try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "CommandLineTool") } diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoGraphPlatformTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoGraphPlatformTests.swift deleted file mode 100644 index 6f88edf8a73..00000000000 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoGraphPlatformTests.swift +++ /dev/null @@ -1,41 +0,0 @@ -import Foundation -import ProjectDescription -import TuistSupport -import XcodeGraph - -import XCTest - -@testable import TuistLoader -@testable import TuistSupportTesting - -final class PackageInfoGraphPlatformTests: TuistUnitTestCase { - func test_platformNameCorrectCase() throws { - let iosPlatform = PackageInfo.Platform(platformName: "iOS", version: "17.0.0", options: []) - - let graphPlatform = try iosPlatform.graphPlatform() - let destinations = try iosPlatform.destinations() - - XCTAssertEqual(graphPlatform, .iOS) - XCTAssertEqual(destinations, [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign]) - } - - func test_platformNameLowerCase() throws { - let iosPlatform = PackageInfo.Platform(platformName: "ios", version: "17.0.0", options: []) - - let graphPlatform = try iosPlatform.graphPlatform() - let destinations = try iosPlatform.destinations() - - XCTAssertEqual(graphPlatform, .iOS) - XCTAssertEqual(destinations, [.iPhone, .iPad, .macWithiPadDesign, .appleVisionWithiPadDesign]) - } - - func test_platformNameMixedCase() throws { - let iosPlatform = PackageInfo.Platform(platformName: "VisiOnOS", version: "17.0.0", options: []) - - let graphPlatform = try iosPlatform.graphPlatform() - let destinations = try iosPlatform.destinations() - - XCTAssertEqual(graphPlatform, .visionOS) - XCTAssertEqual(destinations, [.appleVision]) - } -} diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 01d8ce69716..4063d32bc50 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -2300,7 +2300,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ) } - func testMap_whenConditionalSetting_ignoresByPlatform() throws { + func testMap_whenConditionalSetting() throws { let basePath = try temporaryPath() let sourcesPath = basePath.appending(try RelativePath(validating: "Package/Sources/Target1")) try fileHandler.createFolder(sourcesPath) @@ -2348,7 +2348,19 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - customSettings: ["HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Target1/otherValue"]] + customSettings: [ + "HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Target1/otherValue"], + "HEADER_SEARCH_PATHS[sdk=appletvos*]": [ + "$(inherited)", + "$(SRCROOT)/Sources/Target1/value", + "$(SRCROOT)/Sources/Target1/otherValue", + ], + "HEADER_SEARCH_PATHS[sdk=appletvsimulator*]": [ + "$(inherited)", + "$(SRCROOT)/Sources/Target1/value", + "$(SRCROOT)/Sources/Target1/otherValue", + ], + ] ), ] ) diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift index 0d8565a72ed..3c14fcd9eff 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift @@ -211,14 +211,14 @@ final class SettingsMapperTests: XCTestCase { .string("$(inherited) SWIFT_PACKAGE Define1") ) - let iosPlatformSettings = try mapper.settingsDictionary(for: .ios) + let iosPlatformSettings = try mapper.settingsDictionary(for: .iOS) XCTAssertEqual( iosPlatformSettings["SWIFT_ACTIVE_COMPILATION_CONDITIONS"], .string("$(inherited) SWIFT_PACKAGE Define1 Define2") ) - let combinedSettings = try mapper.settingsForPlatforms([.ios, .macos, .tvos]) + let combinedSettings = try mapper.mapSettings() XCTAssertEqual( combinedSettings["SWIFT_ACTIVE_COMPILATION_CONDITIONS[sdk=iphoneos*]"], @@ -245,6 +245,55 @@ final class SettingsMapperTests: XCTestCase { .string("$(inherited) SWIFT_PACKAGE Define1") ) } + + func test_set_maccatalyst() throws { + let settings: [PackageInfo.Target.TargetBuildSettingDescription.Setting] = [ + .init(tool: .swift, name: .define, condition: nil, value: ["Define1"]), + .init( + tool: .swift, + name: .define, + condition: PackageInfo.PackageConditionDescription(platformNames: ["maccatalyst"], config: nil), + value: ["Define2"] + ), + ] + + let mapper = SettingsMapper( + headerSearchPaths: [], + mainRelativePath: try RelativePath(validating: "path"), + settings: settings + ) + + let allPlatformSettings = try mapper.settingsDictionary() + + XCTAssertEqual( + allPlatformSettings["SWIFT_ACTIVE_COMPILATION_CONDITIONS"], + .string("$(inherited) SWIFT_PACKAGE Define1") + ) + + let iosPlatformSettings = try mapper.settingsDictionary(for: .iOS) + + XCTAssertEqual( + iosPlatformSettings["SWIFT_ACTIVE_COMPILATION_CONDITIONS"], + .string("$(inherited) SWIFT_PACKAGE Define1 Define2") + ) + + let combinedSettings = try mapper.mapSettings() + + XCTAssertEqual( + combinedSettings["SWIFT_ACTIVE_COMPILATION_CONDITIONS[sdk=iphoneos*]"], + .string("$(inherited) SWIFT_PACKAGE Define1 Define2") + ) + + XCTAssertEqual( + combinedSettings["SWIFT_ACTIVE_COMPILATION_CONDITIONS[sdk=iphonesimulator*]"], + .string("$(inherited) SWIFT_PACKAGE Define1 Define2") + ) + + XCTAssertEqual( + combinedSettings["SWIFT_ACTIVE_COMPILATION_CONDITIONS"], + .string("$(inherited) SWIFT_PACKAGE Define1") + ) + } } // OTHER_LDFLAGS diff --git a/fixtures/command_line_tool_basic/Project.swift b/fixtures/command_line_tool_basic/Project.swift index c58aac1267e..38485d883b5 100644 --- a/fixtures/command_line_tool_basic/Project.swift +++ b/fixtures/command_line_tool_basic/Project.swift @@ -9,7 +9,10 @@ let project = Project( product: .commandLineTool, bundleId: "com.example.commandlinetool", infoPlist: .default, - sources: ["main.swift"] + sources: ["main.swift"], + dependencies: [ + .external(name: "SystemPackage"), + ] ), ] ) diff --git a/fixtures/command_line_tool_basic/Tuist/Package.resolved b/fixtures/command_line_tool_basic/Tuist/Package.resolved new file mode 100644 index 00000000000..23bc833b3cb --- /dev/null +++ b/fixtures/command_line_tool_basic/Tuist/Package.resolved @@ -0,0 +1,15 @@ +{ + "originHash" : "1d9037060b1f5bba948714e32c2f1311d4e0412b80099aa57b7e530425cb4cea", + "pins" : [ + { + "identity" : "swift-system", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-system.git", + "state" : { + "revision" : "f9266c85189c2751589a50ea5aec72799797e471", + "version" : "1.3.0" + } + } + ], + "version" : 3 +} diff --git a/fixtures/command_line_tool_basic/Tuist/Package.swift b/fixtures/command_line_tool_basic/Tuist/Package.swift new file mode 100644 index 00000000000..183c2a5487b --- /dev/null +++ b/fixtures/command_line_tool_basic/Tuist/Package.swift @@ -0,0 +1,13 @@ +// swift-tools-version:5.10 + +import PackageDescription + +let package = Package( + name: "workspace-dependencies", + dependencies: [ + .package( + url: "https://github.com/apple/swift-system.git", + from: "1.3.0" + ), + ] +) From a8259aff812816703d91e921dee8254a62baeba3 Mon Sep 17 00:00:00 2001 From: Pedro Date: Mon, 10 Jun 2024 18:34:10 +0200 Subject: [PATCH 349/509] Update release date --- Package.swift | 2 +- .../Client/CloudClientCLIMetadataHeadersMiddleware.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index b6633c135b2..012d97fde70 100644 --- a/Package.swift +++ b/Package.swift @@ -417,7 +417,7 @@ let package = Package( .package(url: "https://github.com/tuist/swift-openapi-runtime", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/swift-openapi-urlsession", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/Path", .upToNextMajor(from: "0.3.0")), - .package(url: "https://github.com/tuist/XcodeGraph.git", .upToNextMajor(from: "0.2.0")), + .package(url: "https://github.com/tuist/XcodeGraph.git", exact: "0.2.0"), ], targets: targets ) diff --git a/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift b/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift index f9d1d8035a9..0931a2afec0 100644 --- a/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift +++ b/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift @@ -5,7 +5,7 @@ import TuistSupport /// This middleware includes the release date of the CLI in the headers so that we can show /// warnings if the on-premise installation is too old. struct CloudClientCLIMetadataHeadersMiddleware: ClientMiddleware { - let releaseDate = "2024.06.04" + let releaseDate = "2024.06.10" func intercept( _ request: Request, From c96514f2d7f122aecc1e6f5e42063197bcef2f81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 11 Jun 2024 08:47:21 +0200 Subject: [PATCH 350/509] Complete analytics uploads with extra test metadata (#6382) * Complete analytics uploads with extra test metadata * Update API --- Sources/TuistKit/Commands/TestCommand.swift | 2 + .../ProjectEditor/ProjectEditorMapper.swift | 4 - .../Utils/TuistAnalyticsCloudBackend.swift | 7 +- .../TuistServer/Cache/CacheAnalytics.swift | 7 + Sources/TuistServer/Models/CloudModule.swift | 27 ++ .../Network/URLSession+Cloud.swift | 2 +- Sources/TuistServer/OpenAPI/Client.swift | 81 ++++++ Sources/TuistServer/OpenAPI/Types.swift | 232 +++++++++++++++++- Sources/TuistServer/OpenAPI/cloud.yml | 68 ++++- .../AnalyticsArtifactUploadService.swift | 28 ++- .../CompleteAnalyticsArtifactsUploads.swift | 73 ++++++ .../Graph/GraphTraverserTests.swift | 12 - .../TuistAnalyticsCloudBackendTests.swift | 2 + .../Utils/TuistAnalyticsDispatcherTests.swift | 2 + .../AnalyticsArtifactUploadServiceTests.swift | 16 +- 15 files changed, 538 insertions(+), 25 deletions(-) create mode 100644 Sources/TuistServer/Models/CloudModule.swift create mode 100644 Sources/TuistServer/Services/CompleteAnalyticsArtifactsUploads.swift diff --git a/Sources/TuistKit/Commands/TestCommand.swift b/Sources/TuistKit/Commands/TestCommand.swift index eb568f62a0d..3eb51df032e 100644 --- a/Sources/TuistKit/Commands/TestCommand.swift +++ b/Sources/TuistKit/Commands/TestCommand.swift @@ -229,6 +229,8 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { parameters["test_targets"] = AnyCodable(CacheAnalyticsStore.shared.testTargets) parameters["local_test_target_hits"] = AnyCodable(CacheAnalyticsStore.shared.localTestTargetHits) parameters["remote_test_target_hits"] = AnyCodable(CacheAnalyticsStore.shared.remoteTestTargetHits) + parameters["target_hashes"] = AnyCodable(CacheAnalyticsStore.shared.targetHashes) + parameters["graph_path"] = AnyCodable(CacheAnalyticsStore.shared.graphPath) TestCommand.analyticsDelegate?.addParameters( parameters diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift index 66889c9da7e..3bbf06d2cc5 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift @@ -100,10 +100,6 @@ final class ProjectEditorMapper: ProjectEditorMapping { let graphProjects = Dictionary(uniqueKeysWithValues: projects.map { ($0.path, $0) }) - let graphTargets = projects - .lazy - .map { ($0.path, $0.targets) } - let graphDependencies = projects .lazy .flatMap { project -> [(GraphDependency, Set)] in diff --git a/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift b/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift index 47147181583..51eaab30a37 100644 --- a/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift +++ b/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift @@ -56,9 +56,14 @@ public class TuistAnalyticsCloudBackend: TuistAnalyticsBackend { let resultBundle = runDirectory .appending(component: "\(Constants.resultBundleName).xcresult") - if fileHandler.exists(resultBundle) { + if fileHandler.exists(resultBundle), + let targetHashes = commandEvent.params["target_hashes"]?.value as? [GraphTarget: String], + let graphPath = commandEvent.params["graph_path"]?.value as? AbsolutePath + { try await analyticsArtifactUploadService.uploadResultBundle( resultBundle, + targetHashes: targetHashes, + graphPath: graphPath, commandEventId: cloudCommandEvent.id, serverURL: config.url ) diff --git a/Sources/TuistServer/Cache/CacheAnalytics.swift b/Sources/TuistServer/Cache/CacheAnalytics.swift index 7f0910213f7..ac7c3194ca0 100644 --- a/Sources/TuistServer/Cache/CacheAnalytics.swift +++ b/Sources/TuistServer/Cache/CacheAnalytics.swift @@ -1,6 +1,8 @@ import Foundation import Mockable +import TSCBasic import TuistSupport +import XcodeGraph @Mockable public protocol CacheAnalyticsStoring: AnyObject { @@ -10,6 +12,9 @@ public protocol CacheAnalyticsStoring: AnyObject { var testTargets: [String] { get set } var localTestTargetHits: [String] { get set } var remoteTestTargetHits: [String] { get set } + /// Map of a relative path of a project that has a map of a target name to its hash + var targetHashes: [GraphTarget: String] { get set } + var graphPath: AbsolutePath? { get set } } public final class CacheAnalyticsStore: CacheAnalyticsStoring { @@ -19,6 +24,8 @@ public final class CacheAnalyticsStore: CacheAnalyticsStoring { public var testTargets: [String] = [] public var localTestTargetHits: [String] = [] public var remoteTestTargetHits: [String] = [] + public var targetHashes: [GraphTarget: String] = [:] + public var graphPath: AbsolutePath? public static let shared = CacheAnalyticsStore() } diff --git a/Sources/TuistServer/Models/CloudModule.swift b/Sources/TuistServer/Models/CloudModule.swift new file mode 100644 index 00000000000..56df2112a5b --- /dev/null +++ b/Sources/TuistServer/Models/CloudModule.swift @@ -0,0 +1,27 @@ +import Foundation +import TSCBasic + +/// Cloud module +public struct CloudModule: Codable { + public init( + hash: String, + projectRelativePath: RelativePath, + name: String + ) { + self.hash = hash + self.projectRelativePath = projectRelativePath + self.name = name + } + + public let hash: String + public let projectRelativePath: RelativePath + public let name: String +} + +extension Components.Schemas.Module { + init(_ module: CloudModule) { + hash = module.hash + project_identifier = module.projectRelativePath.pathString + name = module.name + } +} diff --git a/Sources/TuistServer/Network/URLSession+Cloud.swift b/Sources/TuistServer/Network/URLSession+Cloud.swift index 44289d8bc7e..4b6f6cae669 100644 --- a/Sources/TuistServer/Network/URLSession+Cloud.swift +++ b/Sources/TuistServer/Network/URLSession+Cloud.swift @@ -1,7 +1,7 @@ import Foundation private func cloudURLSessionConfiguration() -> URLSessionConfiguration { - var configuration: URLSessionConfiguration = .ephemeral + let configuration: URLSessionConfiguration = .ephemeral /** Our API design leads to an inefficient usage of the transport layer, which leads to Fly having to spin new machines suddenly, and that causes URLSession to time out. The high timeouts here are temporary diff --git a/Sources/TuistServer/OpenAPI/Client.swift b/Sources/TuistServer/OpenAPI/Client.swift index e56f5577baa..9838c54cd67 100644 --- a/Sources/TuistServer/OpenAPI/Client.swift +++ b/Sources/TuistServer/OpenAPI/Client.swift @@ -2004,6 +2004,87 @@ public struct Client: APIProtocol { } ) } + /// Completes artifacts uploads for a given command event + /// + /// Given a command event, it marks all artifact uploads as finished and does extra processing of a given command run, such as test flakiness detection. + /// + /// - Remark: HTTP `PUT /api/runs/{run_id}/complete_artifacts_uploads`. + /// - Remark: Generated from `#/paths//api/runs/{run_id}/complete_artifacts_uploads/put(completeAnalyticsArtifactsUploads)`. + public func completeAnalyticsArtifactsUploads( + _ input: Operations.completeAnalyticsArtifactsUploads.Input + ) async throws -> Operations.completeAnalyticsArtifactsUploads.Output { + try await client.send( + input: input, + forOperation: Operations.completeAnalyticsArtifactsUploads.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/runs/{}/complete_artifacts_uploads", + parameters: [input.path.run_id] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .put) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 204: + let headers: + Operations.completeAnalyticsArtifactsUploads.Output.NoContent.Headers = + .init() + return .noContent(.init(headers: headers, body: nil)) + case 403: + let headers: + Operations.completeAnalyticsArtifactsUploads.Output.Forbidden.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.completeAnalyticsArtifactsUploads.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: + Operations.completeAnalyticsArtifactsUploads.Output.NotFound.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.completeAnalyticsArtifactsUploads.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } /// It generates a signed URL for uploading a part. /// /// Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. diff --git a/Sources/TuistServer/OpenAPI/Types.swift b/Sources/TuistServer/OpenAPI/Types.swift index af5f71e9faf..c24b8d1ef60 100644 --- a/Sources/TuistServer/OpenAPI/Types.swift +++ b/Sources/TuistServer/OpenAPI/Types.swift @@ -184,6 +184,15 @@ public protocol APIProtocol: Sendable { func completeAnalyticsArtifactMultipartUpload( _ input: Operations.completeAnalyticsArtifactMultipartUpload.Input ) async throws -> Operations.completeAnalyticsArtifactMultipartUpload.Output + /// Completes artifacts uploads for a given command event + /// + /// Given a command event, it marks all artifact uploads as finished and does extra processing of a given command run, such as test flakiness detection. + /// + /// - Remark: HTTP `PUT /api/runs/{run_id}/complete_artifacts_uploads`. + /// - Remark: Generated from `#/paths//api/runs/{run_id}/complete_artifacts_uploads/put(completeAnalyticsArtifactsUploads)`. + func completeAnalyticsArtifactsUploads( + _ input: Operations.completeAnalyticsArtifactsUploads.Input + ) async throws -> Operations.completeAnalyticsArtifactsUploads.Output /// It generates a signed URL for uploading a part. /// /// Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. @@ -704,7 +713,11 @@ public enum Components { /// /// - Remark: Generated from `#/components/schemas/CommandEventArtifact/name`. public var name: Swift.String? - /// The command event artifact type. + /// The command event artifact type. It can be: + /// - result_bundle: A result bundle artifact that represents the whole `.xcresult` bundle + /// - invocation_record: An invocation record artifact. This is a root bundle object of the result bundle + /// - result_bundle_object: A result bundle object. There are many different bundle objects per result bundle. + /// /// /// - Remark: Generated from `#/components/schemas/CommandEventArtifact/type`. @frozen @@ -736,7 +749,11 @@ public enum Components { [.result_bundle, .invocation_record, .result_bundle_object] } } - /// The command event artifact type. + /// The command event artifact type. It can be: + /// - result_bundle: A result bundle artifact that represents the whole `.xcresult` bundle + /// - invocation_record: An invocation record artifact. This is a root bundle object of the result bundle + /// - result_bundle_object: A result bundle object. There are many different bundle objects per result bundle. + /// /// /// - Remark: Generated from `#/components/schemas/CommandEventArtifact/type`. public var _type: Components.Schemas.CommandEventArtifact._typePayload @@ -744,7 +761,7 @@ public enum Components { /// /// - Parameters: /// - name: The name of the file. It's used only for certain types such as result_bundle_object - /// - _type: The command event artifact type. + /// - _type: The command event artifact type. It can be: public init( name: Swift.String? = nil, _type: Components.Schemas.CommandEventArtifact._typePayload @@ -819,6 +836,37 @@ public enum Components { case token } } + /// - Remark: Generated from `#/components/schemas/Module`. + public struct Module: Codable, Equatable, Hashable, Sendable { + /// A hash that represents the module. + /// + /// - Remark: Generated from `#/components/schemas/Module/hash`. + public var hash: Swift.String + /// A name of the module + /// + /// - Remark: Generated from `#/components/schemas/Module/name`. + public var name: Swift.String + /// Project's relative path from the root of the repository + /// + /// - Remark: Generated from `#/components/schemas/Module/project_identifier`. + public var project_identifier: Swift.String + /// Creates a new `Module`. + /// + /// - Parameters: + /// - hash: A hash that represents the module. + /// - name: A name of the module + /// - project_identifier: Project's relative path from the root of the repository + public init(hash: Swift.String, name: Swift.String, project_identifier: Swift.String) { + self.hash = hash + self.name = name + self.project_identifier = project_identifier + } + public enum CodingKeys: String, CodingKey { + case hash + case name + case project_identifier + } + } /// An organization /// /// - Remark: Generated from `#/components/schemas/Organization`. @@ -5720,6 +5768,184 @@ public enum Operations { case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) } } + /// Completes artifacts uploads for a given command event + /// + /// Given a command event, it marks all artifact uploads as finished and does extra processing of a given command run, such as test flakiness detection. + /// + /// - Remark: HTTP `PUT /api/runs/{run_id}/complete_artifacts_uploads`. + /// - Remark: Generated from `#/paths//api/runs/{run_id}/complete_artifacts_uploads/put(completeAnalyticsArtifactsUploads)`. + public enum completeAnalyticsArtifactsUploads { + public static let id: String = "completeAnalyticsArtifactsUploads" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var run_id: Swift.Int + /// Creates a new `Path`. + /// + /// - Parameters: + /// - run_id: + public init(run_id: Swift.Int) { self.run_id = run_id } + } + public var path: Operations.completeAnalyticsArtifactsUploads.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.completeAnalyticsArtifactsUploads.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.completeAnalyticsArtifactsUploads.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.completeAnalyticsArtifactsUploads.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Extra metadata for the post-processing of a command event. + /// + /// - Remark: Generated from `#/paths/api/runs/{run_id}/complete_artifacts_uploads/PUT/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// A list of modules with their metadata. + /// + /// - Remark: Generated from `#/paths/api/runs/{run_id}/complete_artifacts_uploads/PUT/json/modules`. + public var modules: [Components.Schemas.Module] + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - modules: A list of modules with their metadata. + public init(modules: [Components.Schemas.Module]) { self.modules = modules } + public enum CodingKeys: String, CodingKey { case modules } + } + case json(Operations.completeAnalyticsArtifactsUploads.Input.Body.jsonPayload) + } + public var body: Operations.completeAnalyticsArtifactsUploads.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.completeAnalyticsArtifactsUploads.Input.Path, + query: Operations.completeAnalyticsArtifactsUploads.Input.Query = .init(), + headers: Operations.completeAnalyticsArtifactsUploads.Input.Headers = .init(), + cookies: Operations.completeAnalyticsArtifactsUploads.Input.Cookies = .init(), + body: Operations.completeAnalyticsArtifactsUploads.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct NoContent: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.completeAnalyticsArtifactsUploads.Output.NoContent.Headers + @frozen public enum Body: Sendable, Equatable, Hashable {} + /// Received HTTP response body + public var body: Operations.completeAnalyticsArtifactsUploads.Output.NoContent.Body? + /// Creates a new `NoContent`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.completeAnalyticsArtifactsUploads.Output.NoContent.Headers = + .init(), + body: Operations.completeAnalyticsArtifactsUploads.Output.NoContent.Body? = nil + ) { + self.headers = headers + self.body = body + } + } + /// The command event artifact uploads were successfully finished + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/complete_artifacts_uploads/put(completeAnalyticsArtifactsUploads)/responses/204`. + /// + /// HTTP response code: `204 noContent`. + case noContent(Operations.completeAnalyticsArtifactsUploads.Output.NoContent) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.completeAnalyticsArtifactsUploads.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.completeAnalyticsArtifactsUploads.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.completeAnalyticsArtifactsUploads.Output.Forbidden.Headers = + .init(), + body: Operations.completeAnalyticsArtifactsUploads.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/complete_artifacts_uploads/put(completeAnalyticsArtifactsUploads)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.completeAnalyticsArtifactsUploads.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.completeAnalyticsArtifactsUploads.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.completeAnalyticsArtifactsUploads.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.completeAnalyticsArtifactsUploads.Output.NotFound.Headers = + .init(), + body: Operations.completeAnalyticsArtifactsUploads.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The command event doesn't exist + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/complete_artifacts_uploads/put(completeAnalyticsArtifactsUploads)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.completeAnalyticsArtifactsUploads.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } /// It generates a signed URL for uploading a part. /// /// Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. diff --git a/Sources/TuistServer/OpenAPI/cloud.yml b/Sources/TuistServer/OpenAPI/cloud.yml index 52708b47087..4456d6995fc 100644 --- a/Sources/TuistServer/OpenAPI/cloud.yml +++ b/Sources/TuistServer/OpenAPI/cloud.yml @@ -196,7 +196,11 @@ components: description: The name of the file. It's used only for certain types such as result_bundle_object type: string type: - description: The command event artifact type. + description: | + The command event artifact type. It can be: + - result_bundle: A result bundle artifact that represents the whole `.xcresult` bundle + - invocation_record: An invocation record artifact. This is a root bundle object of the result bundle + - result_bundle_object: A result bundle object. There are many different bundle objects per result bundle. enum: - result_bundle - invocation_record @@ -241,6 +245,24 @@ components: title: Invitation type: object x-struct: Elixir.TuistCloudWeb.API.Schemas.Invitation + Module: + properties: + hash: + description: A hash that represents the module. + type: string + name: + description: A name of the module + type: string + project_identifier: + description: Project's relative path from the root of the repository + type: string + required: + - name + - project_identifier + - hash + title: Module + type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.Module Organization: description: An organization properties: @@ -1517,6 +1539,50 @@ paths: description: The project doesn't exist summary: It completes a multi-part upload. tags: [] + /api/runs/{run_id}/complete_artifacts_uploads: + put: + callbacks: {} + description: Given a command event, it marks all artifact uploads as finished and does extra processing of a given command run, such as test flakiness detection. + operationId: completeAnalyticsArtifactsUploads + parameters: + - description: The id of the command event. + in: path + name: run_id + required: true + schema: + type: integer + requestBody: + content: + application/json: + schema: + properties: + modules: + description: A list of modules with their metadata. + items: + $ref: '#/components/schemas/Module' + type: array + required: + - modules + type: object + description: Extra metadata for the post-processing of a command event. + required: false + responses: + 204: + description: The command event artifact uploads were successfully finished + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The command event doesn't exist + summary: Completes artifacts uploads for a given command event + tags: [] /api/runs/{run_id}/generate-url: post: callbacks: {} diff --git a/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift b/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift index e17c858a280..15cf834f663 100644 --- a/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift +++ b/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift @@ -2,11 +2,14 @@ import Foundation import Mockable import Path import TuistSupport +import XcodeGraph @Mockable public protocol AnalyticsArtifactUploadServicing { func uploadResultBundle( _ resultBundle: AbsolutePath, + targetHashes: [GraphTarget: String], + graphPath: AbsolutePath, commandEventId: Int, serverURL: URL ) async throws @@ -21,6 +24,7 @@ public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServic private let multipartUploadGenerateURLAnalyticsService: MultipartUploadGenerateURLAnalyticsServicing private let multipartUploadArtifactService: MultipartUploadArtifactServicing private let multipartUploadCompleteAnalyticsService: MultipartUploadCompleteAnalyticsServicing + private let completeAnalyticsArtifactsUploadsService: CompleteAnalyticsArtifactsUploadsServicing public convenience init() { self.init( @@ -33,7 +37,8 @@ public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServic MultipartUploadGenerateURLAnalyticsService(), multipartUploadArtifactService: MultipartUploadArtifactService(), multipartUploadCompleteAnalyticsService: - MultipartUploadCompleteAnalyticsService() + MultipartUploadCompleteAnalyticsService(), + completeAnalyticsArtifactsUploadsService: CompleteAnalyticsArtifactsUploadsService() ) } @@ -45,7 +50,8 @@ public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServic multipartUploadStartAnalyticsService: MultipartUploadStartAnalyticsServicing, multipartUploadGenerateURLAnalyticsService: MultipartUploadGenerateURLAnalyticsServicing, multipartUploadArtifactService: MultipartUploadArtifactServicing, - multipartUploadCompleteAnalyticsService: MultipartUploadCompleteAnalyticsServicing + multipartUploadCompleteAnalyticsService: MultipartUploadCompleteAnalyticsServicing, + completeAnalyticsArtifactsUploadsService: CompleteAnalyticsArtifactsUploadsServicing ) { self.fileHandler = fileHandler self.xcresultToolController = xcresultToolController @@ -55,10 +61,13 @@ public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServic self.multipartUploadGenerateURLAnalyticsService = multipartUploadGenerateURLAnalyticsService self.multipartUploadArtifactService = multipartUploadArtifactService self.multipartUploadCompleteAnalyticsService = multipartUploadCompleteAnalyticsService + self.completeAnalyticsArtifactsUploadsService = completeAnalyticsArtifactsUploadsService } public func uploadResultBundle( _ resultBundle: AbsolutePath, + targetHashes: [GraphTarget: String], + graphPath: AbsolutePath, commandEventId: Int, serverURL: URL ) async throws { @@ -107,6 +116,21 @@ public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServic commandEventId: commandEventId, serverURL: serverURL ) + + let modules = targetHashes.map { key, value in + CloudModule( + hash: value, + projectRelativePath: + key.project.xcodeProjPath.relative(to: graphPath), + name: key.target.name + ) + } + + try await completeAnalyticsArtifactsUploadsService.completeAnalyticsArtifactsUploads( + modules: modules, + commandEventId: commandEventId, + serverURL: serverURL + ) } private func uploadAnalyticsArtifact( diff --git a/Sources/TuistServer/Services/CompleteAnalyticsArtifactsUploads.swift b/Sources/TuistServer/Services/CompleteAnalyticsArtifactsUploads.swift new file mode 100644 index 00000000000..a79f076a276 --- /dev/null +++ b/Sources/TuistServer/Services/CompleteAnalyticsArtifactsUploads.swift @@ -0,0 +1,73 @@ +import Foundation +import Mockable +import OpenAPIRuntime +import TuistSupport + +@Mockable +public protocol CompleteAnalyticsArtifactsUploadsServicing { + func completeAnalyticsArtifactsUploads( + modules: [CloudModule], + commandEventId: Int, + serverURL: URL + ) async throws +} + +public enum CompleteAnalyticsArtifactsUploadsServiceError: FatalError, Equatable { + case unknownError(Int) + case notFound(String) + case forbidden(String) + + public var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .forbidden: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The analytics artifacts uploads could not get completed due to an unknown Tuist Cloud response of \(statusCode)." + case let .notFound(message), let .forbidden(message): + return message + } + } +} + +public final class CompleteAnalyticsArtifactsUploadsService: CompleteAnalyticsArtifactsUploadsServicing { + public init() {} + + public func completeAnalyticsArtifactsUploads( + modules: [CloudModule], + commandEventId: Int, + serverURL: URL + ) async throws { + let client = Client.cloud(serverURL: serverURL) + let response = try await client.completeAnalyticsArtifactsUploads( + .init( + path: .init(run_id: commandEventId), + body: .json( + .init(modules: .init(modules.map(Components.Schemas.Module.init))) + ) + ) + ) + switch response { + case .noContent: + return + case let .undocumented(statusCode: statusCode, _): + throw CompleteAnalyticsArtifactsUploadsServiceError.unknownError(statusCode) + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw CompleteAnalyticsArtifactsUploadsServiceError.forbidden(error.message) + } + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw CompleteAnalyticsArtifactsUploadsServiceError.notFound(error.message) + } + } + } +} diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index ec2956f0d03..83d539464e4 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -16,10 +16,6 @@ final class GraphTraverserTests: TuistUnitTestCase { product: .framework ) let project = Project.test(targets: [target]) - let frameworkTarget = GraphTarget.test( - path: project.path, - target: target - ) let graph = Graph.test( projects: [ project.path: project, @@ -41,10 +37,6 @@ final class GraphTraverserTests: TuistUnitTestCase { product: .unitTests ) let project = Project.test(targets: [target]) - let unitTestsTarget = GraphTarget.test( - path: project.path, - target: target - ) let graph = Graph.test( projects: [ project.path: project, @@ -99,10 +91,6 @@ final class GraphTraverserTests: TuistUnitTestCase { ]) ) let project = Project.test(targets: [target]) - let frameworkTarget = GraphTarget.test( - path: project.path, - target: target - ) let graph = Graph.test( projects: [ project.path: project, diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift index 2be910866cf..e746f182451 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift @@ -135,6 +135,8 @@ final class TuistAnalyticsCloudBackendTests: TuistUnitTestCase { given(analyticsArtifactUploadService) .uploadResultBundle( .value(resultBundle), + targetHashes: .any, + graphPath: .any, commandEventId: .value(10), serverURL: .value(config.url) ) diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift index 35367f42855..19f1c67553b 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift @@ -65,6 +65,8 @@ final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { given(analyticsArtifactUploadService) .uploadResultBundle( .any, + targetHashes: .any, + graphPath: .any, commandEventId: .value(10), serverURL: .value(cloudURL) ) diff --git a/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift b/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift index 2d5dc4c071f..bd93a6d72dc 100644 --- a/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift +++ b/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift @@ -2,6 +2,8 @@ import Foundation import MockableTest import TuistSupport import TuistSupportTesting +import XcodeGraph +import XcodeGraphTesting import XCTest @testable import TuistServer @@ -14,6 +16,7 @@ final class AnalyticsArtifactUploadServiceTests: TuistTestCase { private var multipartUploadGenerateURLAnalyticsService: MockMultipartUploadGenerateURLAnalyticsServicing! private var multipartUploadArtifactService: MockMultipartUploadArtifactServicing! private var multipartUploadCompleteAnalyticsService: MockMultipartUploadCompleteAnalyticsServicing! + private var completeAnalyticsArtifactsUploadsService: MockCompleteAnalyticsArtifactsUploadsServicing! override func setUp() { super.setUp() @@ -24,6 +27,7 @@ final class AnalyticsArtifactUploadServiceTests: TuistTestCase { multipartUploadGenerateURLAnalyticsService = .init() multipartUploadArtifactService = .init() multipartUploadCompleteAnalyticsService = .init() + completeAnalyticsArtifactsUploadsService = .init() subject = AnalyticsArtifactUploadService( fileHandler: fileHandler, @@ -33,7 +37,8 @@ final class AnalyticsArtifactUploadServiceTests: TuistTestCase { multipartUploadStartAnalyticsService: multipartUploadStartAnalyticsService, multipartUploadGenerateURLAnalyticsService: multipartUploadGenerateURLAnalyticsService, multipartUploadArtifactService: multipartUploadArtifactService, - multipartUploadCompleteAnalyticsService: multipartUploadCompleteAnalyticsService + multipartUploadCompleteAnalyticsService: multipartUploadCompleteAnalyticsService, + completeAnalyticsArtifactsUploadsService: completeAnalyticsArtifactsUploadsService ) } @@ -43,6 +48,7 @@ final class AnalyticsArtifactUploadServiceTests: TuistTestCase { multipartUploadGenerateURLAnalyticsService = nil multipartUploadArtifactService = nil multipartUploadCompleteAnalyticsService = nil + completeAnalyticsArtifactsUploadsService = nil super.tearDown() } @@ -137,6 +143,14 @@ final class AnalyticsArtifactUploadServiceTests: TuistTestCase { // When / Then try await subject.uploadResultBundle( resultBundle, + targetHashes: [ + GraphTarget( + path: try temporaryPath(), + target: .test(), + project: .test() + ): "target-hash", + ], + graphPath: try temporaryPath(), commandEventId: 1, serverURL: serverURL ) From 89a74c2792ad06fbd32155ecb16fe502f06056d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 11 Jun 2024 08:51:44 +0200 Subject: [PATCH 351/509] Fix failing acceptance tests due to empty run id (#6389) Co-authored-by: Daniele Formichelli --- Sources/TuistKit/Commands/GenerateCommand.swift | 2 +- Sources/TuistKit/Commands/GraphCommand.swift | 2 +- Sources/TuistKit/Commands/InitCommand.swift | 2 +- Sources/TuistKit/Commands/TestCommand.swift | 2 +- .../Commands/TrackableCommand/TrackableCommand.swift | 6 ++++-- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Sources/TuistKit/Commands/GenerateCommand.swift b/Sources/TuistKit/Commands/GenerateCommand.swift index 24072bdf186..a7e091bcb50 100644 --- a/Sources/TuistKit/Commands/GenerateCommand.swift +++ b/Sources/TuistKit/Commands/GenerateCommand.swift @@ -11,7 +11,7 @@ public struct GenerateCommand: AsyncParsableCommand, HasTrackableParameters { public static var analyticsDelegate: TrackableParametersDelegate? public static var generatorFactory: GeneratorFactorying = GeneratorFactory() public static var cacheStorageFactory: CacheStorageFactorying = EmptyCacheStorageFactory() - public var runId = "" + public var runId = UUID().uuidString public static var configuration: CommandConfiguration { CommandConfiguration( diff --git a/Sources/TuistKit/Commands/GraphCommand.swift b/Sources/TuistKit/Commands/GraphCommand.swift index a974fb3bd2b..619d7c51d9e 100644 --- a/Sources/TuistKit/Commands/GraphCommand.swift +++ b/Sources/TuistKit/Commands/GraphCommand.swift @@ -13,7 +13,7 @@ public struct GraphCommand: AsyncParsableCommand, HasTrackableParameters { public init() {} public static var analyticsDelegate: TrackableParametersDelegate? - public var runId = "" + public var runId = UUID().uuidString public static var configuration: CommandConfiguration { CommandConfiguration( diff --git a/Sources/TuistKit/Commands/InitCommand.swift b/Sources/TuistKit/Commands/InitCommand.swift index 8a57a1a097c..a68d0abc190 100644 --- a/Sources/TuistKit/Commands/InitCommand.swift +++ b/Sources/TuistKit/Commands/InitCommand.swift @@ -21,7 +21,7 @@ public struct InitCommand: ParsableCommand, HasTrackableParameters { } public static var analyticsDelegate: TrackableParametersDelegate? - public var runId = "" + public var runId = UUID().uuidString @Option( help: "The platform (ios, tvos, visionos, watchos or macos) the product will be for (Default: ios)", diff --git a/Sources/TuistKit/Commands/TestCommand.swift b/Sources/TuistKit/Commands/TestCommand.swift index 3eb51df032e..552986cf777 100644 --- a/Sources/TuistKit/Commands/TestCommand.swift +++ b/Sources/TuistKit/Commands/TestCommand.swift @@ -14,7 +14,7 @@ public struct TestCommand: AsyncParsableCommand, HasTrackableParameters { public static var analyticsDelegate: TrackableParametersDelegate? public static var generatorFactory: GeneratorFactorying = GeneratorFactory() public static var cacheStorageFactory: CacheStorageFactorying = EmptyCacheStorageFactory() - public var runId = "" + public var runId = UUID().uuidString public static var configuration: CommandConfiguration { CommandConfiguration( diff --git a/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift b/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift index 50ec0476681..3e8d1c1d269 100644 --- a/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift +++ b/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift @@ -41,12 +41,14 @@ public class TrackableCommand: TrackableParametersDelegate { } public func run() async throws { - let runId = UUID().uuidString + let runId: String let timer = clock.startTimer() if var command = command as? HasTrackableParameters & ParsableCommand { type(of: command).analyticsDelegate = self - command.runId = runId + runId = command.runId self.command = command + } else { + runId = UUID().uuidString } do { if var asyncCommand = command as? AsyncParsableCommand { From 461def94a5327bac1889bbdab5415c1a075dae38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 11 Jun 2024 11:20:34 +0200 Subject: [PATCH 352/509] Add missing dependency (#6392) --- Package.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Package.swift b/Package.swift index 012d97fde70..056a5ba0b50 100644 --- a/Package.swift +++ b/Package.swift @@ -97,6 +97,7 @@ var targets: [Target] = [ dependencies: [ pathDependency, loggingDependency, + swiftToolsSupportDependency, "KeychainAccess", "ZIPFoundation", "ProjectDescription", From 8a3865e773c56a11e1063e7501a29a81297c1062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 11 Jun 2024 13:18:10 +0200 Subject: [PATCH 353/509] Fix compilation issue (#6393) * Fix compilation issue * Force CI run --- Sources/TuistServer/Models/CloudModule.swift | 2 +- codemagic.yaml | 23 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/Sources/TuistServer/Models/CloudModule.swift b/Sources/TuistServer/Models/CloudModule.swift index 56df2112a5b..65e1af1a6ce 100644 --- a/Sources/TuistServer/Models/CloudModule.swift +++ b/Sources/TuistServer/Models/CloudModule.swift @@ -1,5 +1,5 @@ import Foundation -import TSCBasic +import Path /// Cloud module public struct CloudModule: Codable { diff --git a/codemagic.yaml b/codemagic.yaml index 47b13b36d5c..bcf70094f76 100644 --- a/codemagic.yaml +++ b/codemagic.yaml @@ -22,6 +22,29 @@ workflows: - pattern: '*' include: true cancel_previous_builds: true + spm_build: + name: SPM Build + max_build_duration: 60 + environment: + xcode: 15.3 + scripts: + - name: Set environment variables + script: | + echo "MISE_EXPERIMENTAL=1" >> $CM_ENV + - name: Install Mise + script: | + curl https://mise.run | sh + mise install + - name: Build + script: swift build --configuration debug + triggering: &branch_triggering + events: + - push + - pull_request + branch_patterns: + - pattern: '*' + include: true + cancel_previous_builds: true build_docs: name: Build Documentation max_build_duration: 60 From 71ab477202c817ccd90964cce446adfe61b6a9b3 Mon Sep 17 00:00:00 2001 From: Tuist Date: Tue, 11 Jun 2024 13:26:55 +0000 Subject: [PATCH 354/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.17.0 --- .mise.toml | 2 +- CHANGELOG.md | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 1fc980f9453..638734ed0b1 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.16.1" +tuist = "4.17.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index 522d1c653d0..ef1d363cf53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## 4.17.0 - 2024-06-11 + +### Tuist + +#### Changed + +- Do not generate resource accessors for internal targets with resources and Objective-C source files [#6388](https://github.com/tuist/tuist/pull/6388) by [@fortmarek](https://github.com/fortmarek) +- Complete analytics uploads with extra test metadata [#6382](https://github.com/tuist/tuist/pull/6382) by [@fortmarek](https://github.com/fortmarek) + +#### Added + +- Upload test run result bundle objects [#6373](https://github.com/tuist/tuist/pull/6373) by [@fortmarek](https://github.com/fortmarek) + +#### Fixed + +- Fix extra logs from Xcode commands [#6372](https://github.com/tuist/tuist/pull/6372) by [@waltflanagan](https://github.com/waltflanagan) +- Fix missing platform-specific settings for SPM packages [#6386](https://github.com/tuist/tuist/pull/6386) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +- no changes + ## 4.16.1 - 2024-06-05 ### Tuist From 3381ecb789aeb3c431cbdc0ac5dfc7f779f2f73a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 12 Jun 2024 09:16:33 +0200 Subject: [PATCH 355/509] Remove duplicate branch_triggering definition in codemagic.yaml (#6397) --- codemagic.yaml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/codemagic.yaml b/codemagic.yaml index bcf70094f76..54e3c4fdc59 100644 --- a/codemagic.yaml +++ b/codemagic.yaml @@ -37,14 +37,8 @@ workflows: mise install - name: Build script: swift build --configuration debug - triggering: &branch_triggering - events: - - push - - pull_request - branch_patterns: - - pattern: '*' - include: true - cancel_previous_builds: true + triggering: + << : *branch_triggering build_docs: name: Build Documentation max_build_duration: 60 From afc5078abacd6584e54140182f5b6ded66191aa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 12 Jun 2024 09:46:11 +0200 Subject: [PATCH 356/509] Change TSCBasic import to Path for CacheAnalyticsStore (#6395) --- Sources/TuistServer/Cache/CacheAnalytics.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistServer/Cache/CacheAnalytics.swift b/Sources/TuistServer/Cache/CacheAnalytics.swift index ac7c3194ca0..733ea23e02a 100644 --- a/Sources/TuistServer/Cache/CacheAnalytics.swift +++ b/Sources/TuistServer/Cache/CacheAnalytics.swift @@ -1,6 +1,6 @@ import Foundation import Mockable -import TSCBasic +import Path import TuistSupport import XcodeGraph From 2fd34818f3222885f1af2fb4beea0ec016636c5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 12 Jun 2024 12:34:17 +0200 Subject: [PATCH 357/509] Finish early instead of failing when testing a scheme with no tests (#6398) * Finish early instead of failing when running a scheme with no tests * Remove scheme print * Remove redundant test action check --- .../Utilities/BuildGraphInspector.swift | 2 + .../Utilities/MockBuildGraphInspector.swift | 96 --- .../TrackableCommand/TrackableCommand.swift | 2 +- Sources/TuistKit/Generator/Generator.swift | 2 + Sources/TuistKit/Services/TestService.swift | 4 +- .../Generator/Mocks/MockGenerator.swift | 72 --- .../Services/BuildServiceTests.swift | 218 +++---- .../Services/GenerateServiceTests.swift | 22 +- .../Services/RunServiceTests.swift | 111 ++-- .../Services/TestServiceTests.swift | 561 ++++++++++++------ 10 files changed, 582 insertions(+), 508 deletions(-) delete mode 100644 Sources/TuistAutomationTesting/Utilities/MockBuildGraphInspector.swift delete mode 100644 Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift diff --git a/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift b/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift index 3a9b95af270..802ec5b7df0 100644 --- a/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift +++ b/Sources/TuistAutomation/Utilities/BuildGraphInspector.swift @@ -1,9 +1,11 @@ import Foundation +import Mockable import Path import TuistCore import TuistSupport import XcodeGraph +@Mockable public protocol BuildGraphInspecting { /// Returns the build arguments to be used with the given target. /// - Parameter project: Project whose build arguments will be returned. diff --git a/Sources/TuistAutomationTesting/Utilities/MockBuildGraphInspector.swift b/Sources/TuistAutomationTesting/Utilities/MockBuildGraphInspector.swift deleted file mode 100644 index d93db664fe5..00000000000 --- a/Sources/TuistAutomationTesting/Utilities/MockBuildGraphInspector.swift +++ /dev/null @@ -1,96 +0,0 @@ -import Foundation -import Path -import TuistCore -import TuistCoreTesting -import XcodeGraph - -@testable import TuistAutomation - -public final class MockBuildGraphInspector: BuildGraphInspecting { - public init() {} - public var workspacePathStub: ((AbsolutePath) -> AbsolutePath?)? - public func workspacePath(directory: AbsolutePath) -> AbsolutePath? { - workspacePathStub?(directory) ?? nil - } - - public var buildableTargetStub: ((Scheme, GraphTraversing) -> GraphTarget?)? - public func buildableTarget(scheme: Scheme, graphTraverser: GraphTraversing) -> GraphTarget? { - if let buildableTargetStub { - return buildableTargetStub(scheme, graphTraverser) - } else { - return GraphTarget.test() - } - } - - public var buildableSchemesStub: ((GraphTraversing) -> [Scheme])? - public func buildableSchemes(graphTraverser: GraphTraversing) -> [Scheme] { - if let buildableSchemesStub { - return buildableSchemesStub(graphTraverser) - } else { - return [] - } - } - - public var buildableEntrySchemesStub: ((GraphTraversing) -> [Scheme])? - public func buildableEntrySchemes(graphTraverser: GraphTraversing) -> [Scheme] { - buildableEntrySchemesStub?(graphTraverser) ?? [] - } - - public var buildArgumentsStub: ((Project, Target, String?, Bool) -> [XcodeBuildArgument])? - public func buildArguments( - project: Project, - target: Target, - configuration: String?, - skipSigning: Bool - ) -> [XcodeBuildArgument] { - if let buildArgumentsStub { - return buildArgumentsStub(project, target, configuration, skipSigning) - } else { - return [] - } - } - - public var testableTargetStub: ((Scheme, String?, [TestIdentifier], [TestIdentifier], GraphTraversing) -> GraphTarget?)? - public func testableTarget( - scheme: Scheme, - testPlan: String?, - testTargets: [TestIdentifier], - skipTestTargets: [TestIdentifier], - graphTraverser: GraphTraversing - ) -> GraphTarget? { - if let testableTargetStub { - return testableTargetStub(scheme, testPlan, testTargets, skipTestTargets, graphTraverser) - } else { - return GraphTarget.test() - } - } - - public var testableSchemesStub: ((GraphTraversing) -> [Scheme])? - public func testableSchemes(graphTraverser: GraphTraversing) -> [Scheme] { - if let testableSchemesStub { - return testableSchemesStub(graphTraverser) - } else { - return [] - } - } - - public var testSchemesStub: ((GraphTraversing) -> [Scheme])? - public func testSchemes(graphTraverser: GraphTraversing) -> [Scheme] { - testSchemesStub?(graphTraverser) ?? [] - } - - public var runnableTargetStub: ((Scheme, GraphTraversing) -> GraphTarget?)? - public func runnableTarget(scheme: Scheme, graphTraverser: GraphTraversing) -> GraphTarget? { - runnableTargetStub?(scheme, graphTraverser) - } - - public var runnableSchemesStub: ((GraphTraversing) -> [Scheme])? - public func runnableSchemes(graphTraverser: GraphTraversing) -> [Scheme] { - runnableSchemesStub?(graphTraverser) ?? [] - } - - public var workspaceSchemesStub: ((GraphTraversing) -> [Scheme])? - public func workspaceSchemes(graphTraverser: GraphTraversing) -> [Scheme] { - workspaceSchemesStub?(graphTraverser) ?? [] - } -} diff --git a/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift b/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift index 3e8d1c1d269..caa8b181484 100644 --- a/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift +++ b/Sources/TuistKit/Commands/TrackableCommand/TrackableCommand.swift @@ -43,7 +43,7 @@ public class TrackableCommand: TrackableParametersDelegate { public func run() async throws { let runId: String let timer = clock.startTimer() - if var command = command as? HasTrackableParameters & ParsableCommand { + if let command = command as? HasTrackableParameters & ParsableCommand { type(of: command).analyticsDelegate = self runId = command.runId self.command = command diff --git a/Sources/TuistKit/Generator/Generator.swift b/Sources/TuistKit/Generator/Generator.swift index a1e88378ef2..7f0c338d189 100644 --- a/Sources/TuistKit/Generator/Generator.swift +++ b/Sources/TuistKit/Generator/Generator.swift @@ -1,4 +1,5 @@ import Foundation +import Mockable import Path import ProjectDescription import TuistCore @@ -9,6 +10,7 @@ import TuistPlugin import TuistSupport import XcodeGraph +@Mockable public protocol Generating { @discardableResult func load(path: AbsolutePath) async throws -> Graph diff --git a/Sources/TuistKit/Services/TestService.swift b/Sources/TuistKit/Services/TestService.swift index 78274717b40..fcaaf0eba53 100644 --- a/Sources/TuistKit/Services/TestService.swift +++ b/Sources/TuistKit/Services/TestService.swift @@ -245,7 +245,7 @@ final class TestService { // swiftlint:disable:this type_body_length } if let schemeName { - guard let scheme = testableSchemes.first(where: { $0.name == schemeName }) + guard let scheme = graphTraverser.schemes().first(where: { $0.name == schemeName }) else { throw TestServiceError.schemeNotFound( scheme: schemeName, @@ -254,6 +254,8 @@ final class TestService { // swiftlint:disable:this type_body_length } switch (testPlanConfiguration?.testPlan, scheme.testAction?.targets.isEmpty, scheme.testAction?.testPlans?.isEmpty) { + case (_, false, _): + break case (nil, true, _), (nil, nil, _): logger.log(level: .info, "The scheme \(schemeName)'s test action has no tests to run, finishing early.") return diff --git a/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift b/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift deleted file mode 100644 index 78626056053..00000000000 --- a/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift +++ /dev/null @@ -1,72 +0,0 @@ -import Foundation -import Path -import TuistCore -import TuistGenerator -import XcodeGraph -import XcodeGraphTesting -@testable import TuistKit - -final class MockGenerator: Generating { - enum MockError: Error { - case stubNotImplemented - } - - var generateCalls: [AbsolutePath] = [] - var generateStub: ((AbsolutePath) throws -> AbsolutePath)? - func generate(path: AbsolutePath) throws -> AbsolutePath { - guard let generateStub else { - throw MockError.stubNotImplemented - } - - generateCalls.append(path) - return try generateStub(path) - } - - var generateWithGraphCalls: [AbsolutePath] = [] - var generateWithGraphStub: ((AbsolutePath) throws -> (AbsolutePath, Graph))? - func generateWithGraph(path: AbsolutePath) throws -> (AbsolutePath, Graph) { - guard let generateWithGraphStub else { - throw MockError.stubNotImplemented - } - generateWithGraphCalls.append(path) - return try generateWithGraphStub(path) - } - - var invokedGenerateProjectWorkspace = false - var invokedGenerateProjectWorkspaceCount = 0 - var invokedGenerateProjectWorkspaceParameters: (path: AbsolutePath, Void)? - var invokedGenerateProjectWorkspaceParametersList = [(path: AbsolutePath, Void)]() - var stubbedGenerateProjectWorkspaceError: Error? - var stubbedGenerateProjectWorkspaceResult: (AbsolutePath, Graph)! - - func generateProjectWorkspace(path: AbsolutePath) throws -> (AbsolutePath, Graph) { - invokedGenerateProjectWorkspace = true - invokedGenerateProjectWorkspaceCount += 1 - invokedGenerateProjectWorkspaceParameters = (path, ()) - invokedGenerateProjectWorkspaceParametersList.append((path, ())) - if let error = stubbedGenerateProjectWorkspaceError { - throw error - } - return stubbedGenerateProjectWorkspaceResult - } - - var invokedLoadParameterPath: AbsolutePath? - var loadStub: ((AbsolutePath) throws -> Graph)? - func load(path: AbsolutePath) throws -> Graph { - invokedLoadParameterPath = path - if let loadStub { - return try loadStub(path) - } else { - return Graph.test() - } - } - - var loadProjectStub: ((AbsolutePath) throws -> (Project, Graph, [SideEffectDescriptor]))? - func loadProject(path: AbsolutePath) throws -> (Project, Graph, [SideEffectDescriptor]) { - if let loadProjectStub { - return try loadProjectStub(path) - } else { - return (Project.test(), Graph.test(), []) - } - } -} diff --git a/Tests/TuistKitTests/Services/BuildServiceTests.swift b/Tests/TuistKitTests/Services/BuildServiceTests.swift index 5f51f98f0d0..af79e047678 100644 --- a/Tests/TuistKitTests/Services/BuildServiceTests.swift +++ b/Tests/TuistKitTests/Services/BuildServiceTests.swift @@ -2,6 +2,7 @@ import Foundation import MockableTest import Path import TSCUtility +import TuistAutomation import TuistCore import TuistServer import TuistSupport @@ -38,16 +39,16 @@ final class BuildServiceErrorTests: TuistUnitTestCase { } final class BuildServiceTests: TuistUnitTestCase { - private var generator: MockGenerator! + private var generator: MockGenerating! private var generatorFactory: MockGeneratorFactorying! - private var buildGraphInspector: MockBuildGraphInspector! + private var buildGraphInspector: MockBuildGraphInspecting! private var targetBuilder: MockTargetBuilder! private var cacheStorageFactory: MockCacheStorageFactorying! private var subject: BuildService! override func setUp() { super.setUp() - generator = MockGenerator() + generator = .init() generatorFactory = .init() given(generatorFactory) .building( @@ -57,7 +58,11 @@ final class BuildServiceTests: TuistUnitTestCase { cacheStorage: .any ) .willReturn(generator) - buildGraphInspector = MockBuildGraphInspector() + buildGraphInspector = .init() + given(buildGraphInspector) + .buildableEntrySchemes(graphTraverser: .any) + .willReturn([]) + targetBuilder = MockTargetBuilder() cacheStorageFactory = .init() given(cacheStorageFactory) @@ -92,27 +97,26 @@ final class BuildServiceTests: TuistUnitTestCase { let buildArguments: [XcodeBuildArgument] = [.sdk("iphoneos")] let skipSigning = false - generator.generateWithGraphStub = { _path in - XCTAssertEqual(_path, path) - return (path, graph) - } - buildGraphInspector.buildableSchemesStub = { _ in - [scheme] - } - buildGraphInspector.buildableTargetStub = { _scheme, _ in - XCTAssertEqual(_scheme, scheme) - return GraphTarget.test(path: project.path, target: target, project: project) - } - buildGraphInspector.workspacePathStub = { _path in - XCTAssertEqual(_path, path) - return workspacePath - } - buildGraphInspector.buildArgumentsStub = { _project, _target, _, _skipSigning in - XCTAssertEqual(_project, project) - XCTAssertEqual(_target, target) - XCTAssertEqual(_skipSigning, skipSigning) - return buildArguments - } + given(generator) + .load(path: .value(path)) + .willReturn(graph) + given(buildGraphInspector) + .buildableSchemes(graphTraverser: .any) + .willReturn([scheme]) + given(buildGraphInspector) + .buildableTarget(scheme: .value(scheme), graphTraverser: .any) + .willReturn(GraphTarget.test(path: project.path, target: target, project: project)) + given(buildGraphInspector) + .workspacePath(directory: .value(path)) + .willReturn(workspacePath) + given(buildGraphInspector) + .buildArguments( + project: .value(project), + target: .value(target), + configuration: .any, + skipSigning: .value(skipSigning) + ) + .willReturn(buildArguments) targetBuilder .buildTargetStub = { _, _workspacePath, _scheme, _clean, _, _, _, _device, _osVersion, _, _, _ in XCTAssertEqual(_workspacePath, workspacePath) @@ -140,27 +144,30 @@ final class BuildServiceTests: TuistUnitTestCase { let buildArguments: [XcodeBuildArgument] = [.sdk("iphoneos")] let skipSigning = false - generator.loadStub = { _path in - XCTAssertEqual(_path, path) - return graph - } - buildGraphInspector.buildableSchemesStub = { _ in - [scheme] - } - buildGraphInspector.buildableTargetStub = { _scheme, _ in - XCTAssertEqual(_scheme, scheme) - return GraphTarget.test(path: project.path, target: target, project: project) - } - buildGraphInspector.workspacePathStub = { _path in - XCTAssertEqual(_path, path) - return workspacePath - } - buildGraphInspector.buildArgumentsStub = { _project, _target, _, _skipSigning in - XCTAssertEqual(_project, project) - XCTAssertEqual(_target, target) - XCTAssertEqual(_skipSigning, skipSigning) - return buildArguments - } + given(generator) + .load(path: .value(path)) + .willReturn(graph) + given(buildGraphInspector) + .buildableSchemes(graphTraverser: .any) + .willReturn( + [ + scheme, + ] + ) + given(buildGraphInspector) + .buildableTarget(scheme: .value(scheme), graphTraverser: .any) + .willReturn(GraphTarget.test(path: project.path, target: target, project: project)) + given(buildGraphInspector) + .workspacePath(directory: .value(path)) + .willReturn(workspacePath) + given(buildGraphInspector) + .buildArguments( + project: .value(project), + target: .value(target), + configuration: .any, + skipSigning: .value(skipSigning) + ) + .willReturn(buildArguments) targetBuilder.buildTargetStub = { _, _workspacePath, _scheme, _clean, _, _, _, _, _, _, _, _ in XCTAssertEqual(_workspacePath, workspacePath) XCTAssertEqual(_scheme, scheme) @@ -187,26 +194,29 @@ final class BuildServiceTests: TuistUnitTestCase { let buildArguments: [XcodeBuildArgument] = [.sdk("iphoneos")] let skipSigning = false - generator.loadStub = { _path in - XCTAssertEqual(_path, path) - return graph - } - buildGraphInspector.buildableSchemesStub = { _ in - [schemeA, schemeB] - } - buildGraphInspector.buildableTargetStub = { _scheme, _ in - if _scheme == schemeA { return GraphTarget.test(path: project.path, target: targetA, project: project) } - else if _scheme == schemeB { return GraphTarget.test(path: project.path, target: targetB, project: project) } - else { XCTFail("unexpected scheme"); return GraphTarget.test(path: project.path, target: targetA, project: project) } - } - buildGraphInspector.workspacePathStub = { _path in - XCTAssertEqual(_path, path) - return workspacePath - } - buildGraphInspector.buildArgumentsStub = { _, _, _, _skipSigning in - XCTAssertEqual(_skipSigning, skipSigning) - return buildArguments - } + given(generator) + .load(path: .value(path)) + .willReturn(graph) + given(buildGraphInspector) + .buildableSchemes(graphTraverser: .any) + .willReturn([schemeA, schemeB]) + given(buildGraphInspector) + .buildableTarget(scheme: .matching { + $0 == schemeA || $0 == schemeB + }, graphTraverser: .any) + .willProduce { scheme, _ in + if scheme == schemeA { + return GraphTarget.test(path: project.path, target: targetA, project: project) + } else { + return GraphTarget.test(path: project.path, target: targetB, project: project) + } + } + given(buildGraphInspector) + .workspacePath(directory: .value(path)) + .willReturn(workspacePath) + given(buildGraphInspector) + .buildArguments(project: .any, target: .any, configuration: .any, skipSigning: .value(skipSigning)) + .willReturn(buildArguments) targetBuilder .buildTargetStub = { _, _workspacePath, _scheme, _clean, _, _, _, _device, _osVersion, _, _, _ in XCTAssertEqual(_workspacePath, workspacePath) @@ -244,26 +254,34 @@ final class BuildServiceTests: TuistUnitTestCase { let buildArguments: [XcodeBuildArgument] = [.sdk("iphoneos")] let skipSigning = false - generator.loadStub = { _path in - XCTAssertEqual(_path, path) - return graph - } - buildGraphInspector.buildableSchemesStub = { _ in - [schemeA, schemeB] - } - buildGraphInspector.buildableTargetStub = { _scheme, _ in - if _scheme == schemeA { return GraphTarget.test(path: project.path, target: targetA, project: project) } - else if _scheme == schemeB { return GraphTarget.test(path: project.path, target: targetB, project: project) } - else { XCTFail("unexpected scheme"); return GraphTarget.test(path: project.path, target: targetA, project: project) } - } - buildGraphInspector.workspacePathStub = { _path in - XCTAssertEqual(_path, path) - return workspacePath - } - buildGraphInspector.buildArgumentsStub = { _, _, _, _skipSigning in - XCTAssertEqual(_skipSigning, skipSigning) - return buildArguments - } + given(generator) + .load(path: .value(path)) + .willReturn(graph) + given(buildGraphInspector) + .buildableSchemes(graphTraverser: .any) + .willReturn( + [ + schemeA, + schemeB, + ] + ) + given(buildGraphInspector) + .buildableTarget(scheme: .matching { + $0 == schemeA || $0 == schemeB + }, graphTraverser: .any) + .willProduce { scheme, _ in + if scheme == schemeA { + return GraphTarget.test(path: project.path, target: targetA, project: project) + } else { + return GraphTarget.test(path: project.path, target: targetB, project: project) + } + } + given(buildGraphInspector) + .workspacePath(directory: .value(path)) + .willReturn(workspacePath) + given(buildGraphInspector) + .buildArguments(project: .any, target: .any, configuration: .any, skipSigning: .value(skipSigning)) + .willReturn(buildArguments) targetBuilder.buildTargetStub = { _, _workspacePath, _scheme, _clean, _, _, _, _, _, _, _, _ in XCTAssertEqual(_workspacePath, workspacePath) if _scheme.name == "A" { @@ -288,20 +306,20 @@ final class BuildServiceTests: TuistUnitTestCase { let graph = Graph.test() let schemeA = Scheme.test(name: "A") let schemeB = Scheme.test(name: "B") - generator.loadStub = { _path in - XCTAssertEqual(_path, path) - return graph - } - buildGraphInspector.workspacePathStub = { _path in - XCTAssertEqual(_path, path) - return workspacePath - } - buildGraphInspector.buildableSchemesStub = { _ in - [ - schemeA, - schemeB, - ] - } + given(generator) + .load(path: .value(path)) + .willReturn(graph) + given(buildGraphInspector) + .workspacePath(directory: .value(path)) + .willReturn(workspacePath) + given(buildGraphInspector) + .buildableSchemes(graphTraverser: .any) + .willReturn( + [ + schemeA, + schemeB, + ] + ) // When try await subject.testRun( diff --git a/Tests/TuistKitTests/Services/GenerateServiceTests.swift b/Tests/TuistKitTests/Services/GenerateServiceTests.swift index 10359f7ff40..79dc4327cce 100644 --- a/Tests/TuistKitTests/Services/GenerateServiceTests.swift +++ b/Tests/TuistKitTests/Services/GenerateServiceTests.swift @@ -15,7 +15,7 @@ import XCTest final class GenerateServiceTests: TuistUnitTestCase { private var subject: GenerateService! private var opener: MockOpener! - private var generator: MockGenerator! + private var generator: MockGenerating! private var generatorFactory: MockGeneratorFactorying! private var cacheStorageFactory: MockCacheStorageFactorying! private var clock: StubClock! @@ -23,7 +23,7 @@ final class GenerateServiceTests: TuistUnitTestCase { override func setUp() { super.setUp() opener = MockOpener() - generator = MockGenerator() + generator = .init() generatorFactory = .init() given(generatorFactory) .generation( @@ -59,9 +59,9 @@ final class GenerateServiceTests: TuistUnitTestCase { func test_run_fatalErrors_when_theworkspaceGenerationFails() async throws { let expectedError = NSError.test() - generator.generateStub = { _ in - throw expectedError - } + given(generator) + .generate(path: .any) + .willThrow(expectedError) do { try await subject @@ -81,9 +81,9 @@ final class GenerateServiceTests: TuistUnitTestCase { func test_run() async throws { let workspacePath = try AbsolutePath(validating: "/test.xcworkspace") - generator.generateStub = { _ in - workspacePath - } + given(generator) + .generate(path: .any) + .willReturn(workspacePath) try await subject.run( path: nil, @@ -100,9 +100,9 @@ final class GenerateServiceTests: TuistUnitTestCase { // Given let workspacePath = try AbsolutePath(validating: "/test.xcworkspace") - generator.generateStub = { _ in - workspacePath - } + given(generator) + .generate(path: .any) + .willReturn(workspacePath) clock.assertOnUnexpectedCalls = true clock.primedTimers = [ 0.234, diff --git a/Tests/TuistKitTests/Services/RunServiceTests.swift b/Tests/TuistKitTests/Services/RunServiceTests.swift index 6b0f9a09eab..b76c93f7ffc 100644 --- a/Tests/TuistKitTests/Services/RunServiceTests.swift +++ b/Tests/TuistKitTests/Services/RunServiceTests.swift @@ -2,6 +2,7 @@ import Foundation import MockableTest import Path import struct TSCUtility.Version +import TuistAutomation import TuistCore import TuistSupport import XcodeGraph @@ -37,9 +38,9 @@ final class RunServiceErrorTests: TuistUnitTestCase { } final class RunServiceTests: TuistUnitTestCase { - private var generator: MockGenerator! + private var generator: MockGenerating! private var generatorFactory: MockGeneratorFactorying! - private var buildGraphInspector: MockBuildGraphInspector! + private var buildGraphInspector: MockBuildGraphInspecting! private var targetBuilder: MockTargetBuilder! private var targetRunner: MockTargetRunner! private var subject: RunService! @@ -48,12 +49,12 @@ final class RunServiceTests: TuistUnitTestCase { override func setUp() { super.setUp() - generator = MockGenerator() + generator = .init() generatorFactory = MockGeneratorFactorying() given(generatorFactory) .defaultGenerator(config: .any) .willReturn(generator) - buildGraphInspector = MockBuildGraphInspector() + buildGraphInspector = .init() targetBuilder = MockTargetBuilder() targetRunner = MockTargetRunner() subject = RunService( @@ -76,42 +77,48 @@ final class RunServiceTests: TuistUnitTestCase { func test_run_generates_when_generateIsTrue() async throws { // Given - let expectation = expectation(description: "generates when required") - generator.generateWithGraphStub = { _ in - expectation.fulfill() - return (try AbsolutePath(validating: "/path/to/project.xcworkspace"), .test()) - } - buildGraphInspector.workspacePathStub = { _ in try! AbsolutePath(validating: "/path/to/project.xcworkspace") } - buildGraphInspector.runnableSchemesStub = { _ in [.test()] } - buildGraphInspector.runnableTargetStub = { _, _ in .test() } + given(generator) + .generateWithGraph(path: .any) + .willReturn((try AbsolutePath(validating: "/path/to/project.xcworkspace"), .test())) + given(buildGraphInspector) + .workspacePath(directory: .any) + .willReturn(try! AbsolutePath(validating: "/path/to/project.xcworkspace")) + given(buildGraphInspector) + .runnableSchemes(graphTraverser: .any) + .willReturn([.test()]) + given(buildGraphInspector) + .runnableTarget(scheme: .any, graphTraverser: .any) + .willReturn(.test()) try await subject.run(generate: true) - await fulfillment(of: [expectation], timeout: 1) } func test_run_generates_when_workspaceNotFound() async throws { // Given let workspacePath = try temporaryPath().appending(component: "App.xcworkspace") - let expectation = expectation(description: "generates when required") - generator.generateWithGraphStub = { _ in - // Then - self.buildGraphInspector.workspacePathStub = { _ in workspacePath } - expectation.fulfill() - return (workspacePath, .test()) - } - buildGraphInspector.workspacePathStub = { _ in nil } - buildGraphInspector.runnableSchemesStub = { _ in [.test()] } - buildGraphInspector.runnableTargetStub = { _, _ in .test() } + given(generator) + .generateWithGraph(path: .any) + .willReturn((workspacePath, .test())) + given(generator) + .load(path: .any) + .willReturn(.test()) + given(buildGraphInspector) + .workspacePath(directory: .any) + .willReturn(workspacePath) + given(buildGraphInspector) + .runnableSchemes(graphTraverser: .any) + .willReturn([.test()]) + given(buildGraphInspector) + .runnableTarget(scheme: .any, graphTraverser: .any) + .willReturn(.test()) // When try await subject.run() - await fulfillment(of: [expectation], timeout: 1) } func test_run_buildsTarget() async throws { // Given let workspacePath = try temporaryPath().appending(component: "App.xcworkspace") - let expectation = expectation(description: "builds target") let schemeName = "AScheme" let clean = true let configuration = "Test" @@ -122,13 +129,20 @@ final class RunServiceTests: TuistUnitTestCase { XCTAssertEqual(_scheme.name, schemeName) XCTAssertEqual(_clean, clean) XCTAssertEqual(_configuration, configuration) - expectation.fulfill() } - generator.generateWithGraphStub = { _ in (workspacePath, .test()) } + given(generator) + .load(path: .any) + .willReturn(.test()) targetRunner.assertCanRunTargetStub = { _ in } - buildGraphInspector.workspacePathStub = { _ in workspacePath } - buildGraphInspector.runnableSchemesStub = { _ in [.test(name: schemeName)] } - buildGraphInspector.runnableTargetStub = { _, _ in .test() } + given(buildGraphInspector) + .workspacePath(directory: .any) + .willReturn(workspacePath) + given(buildGraphInspector) + .runnableSchemes(graphTraverser: .any) + .willReturn([.test(name: schemeName)]) + given(buildGraphInspector) + .runnableTarget(scheme: .any, graphTraverser: .any) + .willReturn(.test()) // When try await subject.run( @@ -136,13 +150,11 @@ final class RunServiceTests: TuistUnitTestCase { clean: clean, configuration: configuration ) - await fulfillment(of: [expectation], timeout: 1) } func test_run_runsTarget() async throws { // Given let workspacePath = try AbsolutePath(validating: "/path/to/project.xcworkspace") - let expectation = expectation(description: "runs target") let schemeName = "AScheme" let configuration = "Test" let minVersion = Target.test().deploymentTargets.configuredVersions.first?.versionString.version() @@ -159,13 +171,20 @@ final class RunServiceTests: TuistUnitTestCase { XCTAssertEqual(_version, version) XCTAssertEqual(_deviceName, deviceName) XCTAssertEqual(_arguments, arguments) - expectation.fulfill() } - generator.generateWithGraphStub = { _ in (workspacePath, .test()) } + given(generator) + .load(path: .any) + .willReturn(.test()) targetRunner.assertCanRunTargetStub = { _ in } - buildGraphInspector.workspacePathStub = { _ in workspacePath } - buildGraphInspector.runnableSchemesStub = { _ in [.test(name: schemeName)] } - buildGraphInspector.runnableTargetStub = { _, _ in .test() } + given(buildGraphInspector) + .workspacePath(directory: .any) + .willReturn(workspacePath) + given(buildGraphInspector) + .runnableSchemes(graphTraverser: .any) + .willReturn([.test(name: schemeName)]) + given(buildGraphInspector) + .runnableTarget(scheme: .any, graphTraverser: .any) + .willReturn(.test()) // When try await subject.run( @@ -175,8 +194,6 @@ final class RunServiceTests: TuistUnitTestCase { version: version.description, arguments: arguments ) - - await fulfillment(of: [expectation], timeout: 1) } func test_run_throws_beforeBuilding_if_cantRunTarget() async throws { @@ -184,10 +201,18 @@ final class RunServiceTests: TuistUnitTestCase { let workspacePath = try temporaryPath().appending(component: "App.xcworkspace") let expectation = expectation(description: "does not run target builder") expectation.isInverted = true - generator.generateWithGraphStub = { _ in (workspacePath, .test()) } - buildGraphInspector.workspacePathStub = { _ in workspacePath } - buildGraphInspector.runnableSchemesStub = { _ in [.test()] } - buildGraphInspector.runnableTargetStub = { _, _ in .test() } + given(generator) + .load(path: .any) + .willReturn(.test()) + given(buildGraphInspector) + .workspacePath(directory: .any) + .willReturn(workspacePath) + given(buildGraphInspector) + .runnableSchemes(graphTraverser: .any) + .willReturn([.test()]) + given(buildGraphInspector) + .runnableTarget(scheme: .any, graphTraverser: .any) + .willReturn(.test()) targetBuilder.buildTargetStub = { _, _, _, _, _, _, _, _, _, _, _, _ in expectation.fulfill() } targetRunner.assertCanRunTargetStub = { _ in throw TestError() } diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index a0402c9f925..0e26e76910d 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -16,10 +16,10 @@ import XCTest final class TestServiceTests: TuistUnitTestCase { private var subject: TestService! - private var generator: MockGenerator! + private var generator: MockGenerating! private var generatorFactory: MockGeneratorFactorying! private var xcodebuildController: MockXcodeBuildController! - private var buildGraphInspector: MockBuildGraphInspector! + private var buildGraphInspector: MockBuildGraphInspecting! private var simulatorController: MockSimulatorController! private var contentHasher: MockContentHasher! private var testsCacheTemporaryDirectory: TemporaryDirectory! @@ -53,6 +53,10 @@ final class TestServiceTests: TuistUnitTestCase { "hash" } + given(buildGraphInspector) + .buildArguments(project: .any, target: .any, configuration: .any, skipSigning: .any) + .willReturn([]) + subject = TestService( generatorFactory: generatorFactory, xcodebuildController: xcodebuildController, @@ -183,46 +187,57 @@ final class TestServiceTests: TuistUnitTestCase { // Given givenGenerator() let path = try temporaryPath() - var generatedPath: AbsolutePath? - generator.generateWithGraphStub = { - generatedPath = $0 - return ($0, Graph.test()) - } + given(generator) + .generateWithGraph(path: .value(path)) + .willReturn((path, .test())) + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn([]) + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn([]) + given(configLoader) .loadConfig(path: .any) .willReturn(.default) // When - try? await subject.testRun( + try await subject.testRun( path: path ) - - // Then - XCTAssertEqual(generatedPath, path) } - func test_run_tests_wtih_specified_arch() async throws { + func test_run_tests_with_specified_arch() async throws { // Given givenGenerator() given(configLoader) .loadConfig(path: .any) .willReturn(.default) - buildGraphInspector.testableSchemesStub = { _ in - [ - Scheme.test(name: "App-Workspace"), - Scheme.test(name: "TestScheme"), - ] - } - buildGraphInspector.testableTargetStub = { scheme, _, _, _, _ in - GraphTarget.test( - target: Target.test( - name: scheme.name - ) + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "App-Workspace"), + Scheme.test(name: "TestScheme"), + ] ) - } - generator.generateWithGraphStub = { path in - (path, Graph.test()) - } + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn([]) + given(buildGraphInspector) + .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) + .willProduce { scheme, _, _, _, _ in + GraphTarget.test( + target: Target.test( + name: scheme.name + ) + ) + } + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + (path, .test(workspace: .test(schemes: [.test(name: "TestScheme")]))) + } var testedRosetta: Bool? xcodebuildController.testStub = { _, _, _, _, rosetta, _, _, _, _, _, _, _, _ in testedRosetta = rosetta @@ -245,22 +260,31 @@ final class TestServiceTests: TuistUnitTestCase { given(configLoader) .loadConfig(path: .any) .willReturn(.default) - buildGraphInspector.testableSchemesStub = { _ in - [ - Scheme.test(name: "App-Workspace"), - Scheme.test(name: "TestScheme"), - ] - } - buildGraphInspector.testableTargetStub = { scheme, _, _, _, _ in - GraphTarget.test( - target: Target.test( - name: scheme.name - ) + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "App-Workspace"), + Scheme.test(name: "TestScheme"), + ] ) - } - generator.generateWithGraphStub = { path in - (path, Graph.test()) - } + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn([]) + given(buildGraphInspector) + .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) + .willProduce { scheme, _, _, _, _ in + GraphTarget.test( + target: Target.test( + name: scheme.name + ) + ) + } + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + (path, .test(workspace: .test(schemes: [.test(name: "TestScheme")]))) + } var testedSchemes: [String] = [] xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) @@ -282,20 +306,29 @@ final class TestServiceTests: TuistUnitTestCase { given(configLoader) .loadConfig(path: .any) .willReturn(.default) - buildGraphInspector.testableSchemesStub = { _ in - [ - Scheme.test(name: "TestScheme"), - ] - } - buildGraphInspector.workspaceSchemesStub = { _ in - [ - Scheme.test(name: "ProjectSchemeOne"), - Scheme.test(name: "ProjectSchemeTwo"), - ] - } - generator.generateWithGraphStub = { path in - (path, Graph.test()) - } + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "TestScheme"), + ] + ) + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "ProjectSchemeOne"), + Scheme.test(name: "ProjectSchemeTwo"), + ] + ) + given(buildGraphInspector) + .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) + .willReturn(.test()) + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + (path, .test()) + } var testedSchemes: [String] = [] xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) @@ -328,20 +361,29 @@ final class TestServiceTests: TuistUnitTestCase { given(configLoader) .loadConfig(path: .any) .willReturn(.default) - buildGraphInspector.testableSchemesStub = { _ in - [ - Scheme.test(name: "TestScheme"), - ] - } - buildGraphInspector.workspaceSchemesStub = { _ in - [ - Scheme.test(name: "ProjectSchemeOne"), - Scheme.test(name: "ProjectSchemeTwo"), - ] - } - generator.generateWithGraphStub = { path in - (path, Graph.test()) - } + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "TestScheme"), + ] + ) + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "ProjectSchemeOne"), + Scheme.test(name: "ProjectSchemeTwo"), + ] + ) + given(buildGraphInspector) + .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) + .willReturn(.test()) + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOne"), .test(name: "ProjectSchemeTwo")]))) + } var testedSchemes: [String] = [] xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) @@ -363,6 +405,48 @@ final class TestServiceTests: TuistUnitTestCase { XCTAssertEqual(testedSchemes, ["ProjectSchemeOne"]) } + func test_run_tests_individual_scheme_with_no_test_actions() async throws { + // Given + givenGenerator() + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn([]) + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn([]) + given(buildGraphInspector) + .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) + .willReturn(.test()) + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOne", testAction: .test(targets: []))]))) + } + var testedSchemes: [String] = [] + xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in + testedSchemes.append(scheme) + } + try fileHandler.touch( + testsCacheTemporaryDirectory.path.appending(component: "A") + ) + try fileHandler.touch( + testsCacheTemporaryDirectory.path.appending(component: "B") + ) + + // When + try await subject.testRun( + schemeName: "ProjectSchemeOne", + path: try temporaryPath() + ) + + // Then + XCTAssertStandardOutput(pattern: "The scheme ProjectSchemeOne's test action has no tests to run, finishing early.") + XCTAssertEmpty(testedSchemes) + } + func test_run_tests_with_skipped_targets() async throws { // Given given(generatorFactory) @@ -382,14 +466,24 @@ final class TestServiceTests: TuistUnitTestCase { given(configLoader) .loadConfig(path: .any) .willReturn(.default) - buildGraphInspector.testableSchemesStub = { _ in - [ - Scheme.test(name: "ProjectSchemeOneTests"), - ] - } - generator.generateWithGraphStub = { path in - (path, Graph.test()) - } + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "ProjectSchemeOneTests"), + ] + ) + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn([]) + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOneTests")]))) + } + given(buildGraphInspector) + .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) + .willReturn(.test()) var testedSchemes: [String] = [] xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) @@ -412,14 +506,24 @@ final class TestServiceTests: TuistUnitTestCase { given(configLoader) .loadConfig(path: .any) .willReturn(.default) - buildGraphInspector.workspaceSchemesStub = { _ in - [ - Scheme.test(name: "ProjectScheme"), - ] - } - generator.generateWithGraphStub = { path in - (path, Graph.test()) - } + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "ProjectScheme"), + ] + ) + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + (path, .test()) + } + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn([]) + given(buildGraphInspector) + .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) + .willReturn(.test()) var testedSchemes: [String] = [] xcodebuildController.testErrorStub = NSError.test() xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in @@ -453,12 +557,20 @@ final class TestServiceTests: TuistUnitTestCase { given(configLoader) .loadConfig(path: .any) .willReturn(.default) - buildGraphInspector.workspaceSchemesStub = { _ in - [] - } - generator.generateWithGraphStub = { path in - (path, Graph.test()) - } + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn([]) + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn([]) + given(buildGraphInspector) + .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) + .willReturn(.test()) + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + (path, .test()) + } var testedSchemes: [String] = [] xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) @@ -486,14 +598,24 @@ final class TestServiceTests: TuistUnitTestCase { xcodebuildController.testStub = { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in resourceBundlePath = gotResourceBundlePath } - generator.generateWithGraphStub = { path in - (path, Graph.test()) - } - buildGraphInspector.workspaceSchemesStub = { _ in - [ - Scheme.test(name: "ProjectScheme"), - ] - } + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + (path, .test()) + } + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "ProjectScheme"), + ] + ) + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn([]) + given(buildGraphInspector) + .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) + .willReturn(.test()) // When try await subject.testRun( @@ -519,14 +641,24 @@ final class TestServiceTests: TuistUnitTestCase { xcodebuildController.testStub = { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in resultBundlePath = gotResourceBundlePath } - generator.generateWithGraphStub = { path in - (path, Graph.test()) - } - buildGraphInspector.workspaceSchemesStub = { _ in - [ - Scheme.test(name: "ProjectScheme"), - ] - } + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + (path, .test()) + } + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "ProjectScheme"), + ] + ) + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn([]) + given(buildGraphInspector) + .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) + .willReturn(.test()) given(configLoader) .loadConfig(path: .any) .willReturn( @@ -564,15 +696,25 @@ final class TestServiceTests: TuistUnitTestCase { xcodebuildController.testStub = { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in resourceBundlePath = gotResourceBundlePath } - generator.generateWithGraphStub = { path in - (path, Graph.test()) - } - buildGraphInspector.workspaceSchemesStub = { _ in - [ - Scheme.test(name: "ProjectScheme"), - Scheme.test(name: "ProjectScheme2"), - ] - } + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + (path, .test(workspace: .test(schemes: [.test(name: "ProjectScheme2")]))) + } + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "ProjectScheme"), + Scheme.test(name: "ProjectScheme2"), + ] + ) + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn([]) + given(buildGraphInspector) + .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) + .willReturn(.test()) // When try await subject.testRun( @@ -594,19 +736,28 @@ final class TestServiceTests: TuistUnitTestCase { given(configLoader) .loadConfig(path: .any) .willReturn(.default) - buildGraphInspector.testableSchemesStub = { _ in - [ - Scheme.test(name: "TestScheme"), - ] - } - buildGraphInspector.workspaceSchemesStub = { _ in - [ - Scheme.test(name: "ProjectSchemeOne"), - ] - } - generator.generateWithGraphStub = { path in - (path, Graph.test()) - } + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "TestScheme"), + ] + ) + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "ProjectSchemeOne"), + ] + ) + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOne")]))) + } + given(buildGraphInspector) + .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) + .willReturn(.test()) var passedRetryCount = 0 xcodebuildController.testStub = { _, _, _, _, _, _, _, _, retryCount, _, _, _, _ in @@ -630,19 +781,28 @@ final class TestServiceTests: TuistUnitTestCase { given(configLoader) .loadConfig(path: .any) .willReturn(.default) - buildGraphInspector.testableSchemesStub = { _ in - [ - Scheme.test(name: "TestScheme"), - ] - } - buildGraphInspector.workspaceSchemesStub = { _ in - [ - Scheme.test(name: "ProjectSchemeOne"), - ] - } - generator.generateWithGraphStub = { path in - (path, Graph.test()) - } + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "TestScheme"), + ] + ) + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "ProjectSchemeOne"), + ] + ) + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOne")]))) + } + given(buildGraphInspector) + .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) + .willReturn(.test()) var passedRetryCount = -1 xcodebuildController.testStub = { _, _, _, _, _, _, _, _, retryCount, _, _, _, _ in @@ -667,29 +827,54 @@ final class TestServiceTests: TuistUnitTestCase { .willReturn(.default) let testPlan = "TestPlan" let testPlanPath = try AbsolutePath(validating: "/testPlan/\(testPlan)") - buildGraphInspector.testableSchemesStub = { _ in - [ - Scheme.test(name: "App-Workspace"), - Scheme.test( - name: "TestScheme", - testAction: .test( - testPlans: [.init(path: testPlanPath, testTargets: [], isDefault: true)] + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "App-Workspace"), + Scheme.test( + name: "TestScheme", + testAction: .test( + testPlans: [.init(path: testPlanPath, testTargets: [], isDefault: true)] + ) + ), + ] + ) + given(buildGraphInspector) + .testableTarget( + scheme: .any, + testPlan: .value(testPlan), + testTargets: .any, + skipTestTargets: .any, + graphTraverser: .any + ) + .willProduce { scheme, _, _, _, _ in + GraphTarget.test( + target: Target.test( + name: scheme.name ) - ), - ] - } - var passedTestPlan: String? - buildGraphInspector.testableTargetStub = { scheme, testPlan, _, _, _ in - passedTestPlan = testPlan - return GraphTarget.test( - target: Target.test( - name: scheme.name ) - ) - } - generator.generateWithGraphStub = { path in - (path, Graph.test()) - } + } + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn([]) + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + ( + path, + .test( + workspace: .test( + schemes: [ + .test( + name: "TestScheme", + testAction: .test(targets: [.test()]) + ), + ] + ) + ) + ) + } var testedSchemes: [String] = [] xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) @@ -704,7 +889,6 @@ final class TestServiceTests: TuistUnitTestCase { // Then XCTAssertEqual(testedSchemes, ["TestScheme"]) - XCTAssertEqual(passedTestPlan, testPlan) } func test_run_test_plan_failure() async throws { @@ -715,25 +899,34 @@ final class TestServiceTests: TuistUnitTestCase { .willReturn(.default) let testPlan = "TestPlan" let testPlanPath = try AbsolutePath(validating: "/testPlan/\(testPlan)") - buildGraphInspector.testableSchemesStub = { _ in - [ - Scheme.test(name: "App-Workspace"), - Scheme.test( - name: "TestScheme", - testAction: .test( - testPlans: [.init(path: testPlanPath, testTargets: [], isDefault: true)] - ) - ), - ] - } - buildGraphInspector.workspaceSchemesStub = { _ in - [ - Scheme.test(name: "ProjectSchemeOne"), - ] - } - generator.generateWithGraphStub = { path in - (path, Graph.test()) - } + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "App-Workspace"), + Scheme.test( + name: "TestScheme", + testAction: .test( + testPlans: [.init(path: testPlanPath, testTargets: [], isDefault: true)] + ) + ), + ] + ) + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn( + [ + Scheme.test(name: "ProjectSchemeOne"), + ] + ) + given(buildGraphInspector) + .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) + .willReturn(.test()) + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + (path, .test(workspace: .test(schemes: [.test(name: "TestScheme")]))) + } xcodebuildController.testStub = { _, _, _, _, _, _, _, _, _, _, _, _, _ in } let notDefinedTestPlan = "NotDefined" From 72e7657633716e158f36d0f7c6727167aa54be28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 12 Jun 2024 14:56:06 +0200 Subject: [PATCH 358/509] Fix sporadic errors when Tuist tries to preserve the SPM lockfile across project generations (#6394) * package-race-cond * Some fixes * Fix tests --- .../Utils/SwiftPackageManagerInteractor.swift | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift b/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift index 09d29bac3d7..fbae2c9b5d3 100644 --- a/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift +++ b/Sources/TuistGenerator/Utils/SwiftPackageManagerInteractor.swift @@ -58,12 +58,11 @@ public class SwiftPackageManagerInteractor: SwiftPackageManagerInteracting { .appending(try RelativePath(validating: "\(workspaceName)/xcshareddata/swiftpm")) let workspacePackageResolvedPath = workspacePackageResolvedFolderPath.appending(component: "Package.resolved") - if fileHandler.exists(rootPackageResolvedPath) { - try fileHandler.createFolder(workspacePackageResolvedFolderPath) - if fileHandler.exists(workspacePackageResolvedPath) { - try fileHandler.delete(workspacePackageResolvedPath) + if fileHandler.exists(rootPackageResolvedPath), !fileHandler.exists(workspacePackageResolvedPath) { + if !fileHandler.exists(workspacePackageResolvedPath.parentDirectory) { + try fileHandler.createFolder(workspacePackageResolvedPath.parentDirectory) } - try fileHandler.copy(from: rootPackageResolvedPath, to: workspacePackageResolvedPath) + try fileHandler.linkFile(atPath: rootPackageResolvedPath, toPath: workspacePackageResolvedPath) } let workspacePath = path.appending(component: workspaceName) @@ -98,10 +97,11 @@ public class SwiftPackageManagerInteractor: SwiftPackageManagerInteracting { }) ) - if fileHandler.exists(rootPackageResolvedPath) { - try fileHandler.delete(rootPackageResolvedPath) + if !fileHandler.exists(rootPackageResolvedPath), fileHandler.exists(workspacePackageResolvedPath) { + try fileHandler.copy(from: workspacePackageResolvedPath, to: rootPackageResolvedPath) + if !fileHandler.exists(workspacePackageResolvedPath) { + try fileHandler.linkFile(atPath: rootPackageResolvedPath, toPath: workspacePackageResolvedPath) + } } - - try fileHandler.linkFile(atPath: workspacePackageResolvedPath, toPath: rootPackageResolvedPath) } } From cdb9197e43a64bf09b1b93ee867df44aa51db351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 12 Jun 2024 15:23:33 +0200 Subject: [PATCH 359/509] Extract Tuist-specific models from `XcodeGraph` (#6401) * Remove no-longer needed models * Introduce TuistModels * Fix compilation * Fix Package.swift * Fix some linting issues * Remove TuistModels and merge models into TuistCore --- Package.resolved | 6 +- Package.swift | 4 +- Sources/TuistCore/Models/Cloud.swift | 41 ++ .../Models/CompatibleXcodeVersions.swift | 72 ++++ .../Models/Config.swift | 44 ++- .../Models/ConfigGenerationOptions.swift | 1 - .../TuistCore/Models/PackageSettings.swift | 67 ++++ .../Models/Plugin.swift | 0 Sources/TuistCore/Models/PluginLocation.swift | 41 ++ .../Models/PluginResourceSynthesizer.swift | 14 + .../Models/Plugins.swift | 16 + .../ProjectDescriptionHelpersPlugin.swift | 0 .../Models/Template.swift | 28 ++ .../GraphDependencyReference+TestData.swift | 1 - .../Graph/MockGraphLoader.swift | 1 - .../WorkspaceWithProjects+TestData.swift | 1 - .../Linter/EnvironmentLinter.swift | 1 - .../Linter/MockEnvironmentLinter.swift | 1 - .../Linter/MockGraphLinter.swift | 1 - Sources/TuistKit/Services/InitService.swift | 4 +- Sources/TuistKit/Services/ListService.swift | 1 + .../TuistKit/Services/ScaffoldService.swift | 2 +- .../TuistKit/Utils/ManifestGraphLoader.swift | 2 +- .../Loaders/CachedManifestLoader.swift | 8 +- .../TuistLoader/Loaders/ConfigLoader.swift | 10 +- .../Loaders/PackageSettingsLoader.swift | 6 +- .../Loaders/RecursiveManifestLoader.swift | 8 +- .../SwiftPackageManagerGraphLoader.swift | 4 +- .../Loaders/TemplateGitLoader.swift | 5 +- .../TuistLoader/Loaders/TemplateLoader.swift | 32 +- .../Cloud+ManifestMapper.swift | 12 +- ...mpatibleXcodeVersions+ManifestMapper.swift | 5 +- .../Config+ManifestMapper.swift | 24 +- .../PackageSettings+ManifestMapper.swift | 2 +- .../PluginLocation+ManifestMapper.swift | 6 +- .../Project+ManifestMapper.swift | 1 + .../ResourceSynthesizer+ManifestMapper.swift | 1 + .../ProjectDescriptionHelpersBuilder.swift | 4 +- .../PackageInfoMapper.swift | 4 +- .../ResourceSynthesizerPathLocator.swift | 3 +- .../Loaders/Mocks/MockManifestLoader.swift | 2 +- .../Mocks/MockPackageSettingsLoader.swift | 3 +- .../Loaders/Mocks/MockTemplateGitLoader.swift | 2 +- .../Loaders/Mocks/MockTemplateLoader.swift | 2 +- ...MockProjectDescriptionHelpersBuilder.swift | 2 +- .../MockResourceSynthesizerPathLocator.swift | 2 +- Sources/TuistPlugin/PluginService.swift | 1 - .../MockPluginService.swift | 2 +- Sources/TuistScaffold/TemplateGenerator.swift | 11 +- .../Utils/Mocks/MockTemplateGenerator.swift | 7 +- .../Cache/EmptyCacheStorageFactory.swift | 2 +- .../DependenciesGraph/DependenciesGraph.swift | 21 - .../Graph/ConditionalGraphTarget.swift | 49 --- Sources/XcodeGraph/Graph/Graph.swift | 67 ---- .../XcodeGraph/Graph/GraphDependency.swift | 284 -------------- Sources/XcodeGraph/Graph/GraphTarget.swift | 33 -- Sources/XcodeGraph/Models/ArchiveAction.swift | 28 -- Sources/XcodeGraph/Models/BuildAction.swift | 25 -- .../XcodeGraph/Models/CopyFileElement.swift | 39 -- .../XcodeGraph/Models/CopyFilesAction.swift | 43 --- Sources/XcodeGraph/Models/CoreDataModel.swift | 28 -- .../SwiftPackageManagerDependencies.swift | 135 ------- .../XcodeGraph/Models/ExecutionAction.swift | 34 -- Sources/XcodeGraph/Models/FileElement.swift | 25 -- Sources/XcodeGraph/Models/Headers.swift | 23 -- .../Models/Metadata/FrameworkMetadata.swift | 31 -- .../Models/Metadata/LibraryMetadata.swift | 25 -- .../Metadata/SystemFrameworkMetadata.swift | 22 -- .../Models/Metadata/XCFrameworkMetadata.swift | 31 -- Sources/XcodeGraph/Models/Package.swift | 18 - .../XcodeGraph/Models/PlatformCondition.swift | 64 --- Sources/XcodeGraph/Models/Plist.swift | 168 -------- Sources/XcodeGraph/Models/Product.swift | 241 ------------ Sources/XcodeGraph/Models/Project.swift | 152 -------- .../Models/RawScriptBuildPhase.swift | 40 -- .../Models/ResourceFileElement.swift | 58 --- .../Models/ResourceSynthesizer.swift | 96 ----- Sources/XcodeGraph/Models/RunAction.swift | 49 --- .../XcodeGraph/Models/RunActionOptions.swift | 66 ---- Sources/XcodeGraph/Models/Scheme.swift | 40 -- Sources/XcodeGraph/Models/Settings.swift | 201 ---------- .../XcodeGraph/Models/SimulatedLocation.swift | 46 --- Sources/XcodeGraph/Models/SourceFile.swift | 47 --- Sources/XcodeGraph/Models/Target.swift | 365 ------------------ .../XcodeGraph/Models/TargetDependency.swift | 74 ---- .../XcodeGraph/Models/TargetReference.swift | 12 - Sources/XcodeGraph/Models/TargetScript.swift | 152 -------- Sources/XcodeGraph/Models/TestAction.swift | 58 --- Sources/XcodeGraph/Models/TestPlan.swift | 16 - Sources/XcodeGraph/Models/Workspace.swift | 150 ------- .../Models/XCFrameworkInfoPlist.swift | 72 ---- .../DependenciesGraph+TestData.swift | 176 --------- .../Graph/Graph+TestData.swift | 25 -- .../Graph/GraphDependency+TestData.swift | 113 ------ .../Graph/GraphTarget+TestData.swift | 18 - .../Models/AnalyzeAction+TestData.swift | 9 - .../Models/ArchiveAction+TestData.swift | 21 - .../Models/Arguments+TestData.swift | 15 - .../Models/BuildAction+TestData.swift | 14 - .../Models/Cloud+TestData.swift | 14 - .../Models/Config+TestData.swift | 44 --- .../Models/Headers+TestData.swift | 17 - .../Metadata/FrameworkMetadata+TestData.swift | 26 -- .../Metadata/LibraryMetadata+TestData.swift | 22 -- .../XCFrameworkMetadata+TestData.swift | 26 -- .../Models/PackageSettings+TestData.swift | 24 -- .../Models/Plugins+TestData.swift | 17 - .../Models/ProfileAction+TestData.swift | 22 -- .../Models/Project+TestData.swift | 91 ----- .../Models/RawScriptBuildPhase+TestData.swift | 14 - .../ResourceSynthesizerPlugin+TestData.swift | 15 - .../Models/RunAction+TestData.swift | 39 -- .../Models/Scheme+TestData.swift | 27 -- .../Models/Settings+TestData.swift | 48 --- .../Models/Target+TestData.swift | 184 --------- .../Models/Template+TestData.swift | 29 -- .../Models/TestAction+TestData.swift | 42 -- .../Models/TestableTarget+TestData.swift | 21 - .../Models/Workspace+TestData.swift | 49 --- .../XCFrameworkInfoPlist+TestData.swift | 27 -- .../Graph/GraphTraverserTests.swift | 17 +- ...ectsPlatformNarrowerGraphMapperTests.swift | 1 - ...rphanExternalTargetsGraphMapperTests.swift | 1 - ...ltipleConfigurationsIntegrationTests.swift | 1 - .../SwiftPackageManagerInteractorTests.swift | 1 - .../WorkspaceGeneratorIntegrationTests.swift | 1 - .../Extensions/Xcodeproj+ExtrasTests.swift | 11 +- .../Generator/BuildPhaseGeneratorTests.swift | 1 - .../Generator/ConfigGeneratorTests.swift | 1 - .../InfoPlistContentProviderTests.swift | 1 - .../Generator/LinkGeneratorTests.swift | 1 - .../Mocks/MockInfoPlistContentProvider.swift | 1 - .../MockProjectDescriptorGenerator.swift | 1 - .../MockSchemeDescriptorsGenerator.swift | 1 - .../Generator/Mocks/MockTargetGenerator.swift | 1 - .../MockWorkspaceDescriptorGenerator.swift | 1 - .../ProjectDescriptorGeneratorTests.swift | 1 - .../Generator/ProjectFileElementsTests.swift | 1 - .../Generator/ProjectGroupsTests.swift | 1 - .../SchemeDescriptorsGeneratorTests.swift | 1 - .../Generator/TargetGeneratorTests.swift | 1 - .../WorkspaceDescriptorGeneratorTests.swift | 1 - ...paceSettingsDescriptorGeneratorTests.swift | 1 - .../WorkspaceStructureGeneratorTests.swift | 1 - ...dWorkspaceSchemeWorkspaceMapperTests.swift | 1 - .../GraphViz/GraphToGraphVizMapperTests.swift | 1 - .../Linter/EnvironmentLinterTests.swift | 1 - .../Linter/GraphLinterTests.swift | 3 +- .../Linter/Mocks/MockPackageLinter.swift | 1 - .../Linter/Mocks/MockProjectLinter.swift | 1 - .../Linter/Mocks/MockSchemeLinter.swift | 1 - .../Linter/Mocks/MockSettingsLinter.swift | 1 - .../Mocks/MockStaticProductsGraphLinter.swift | 1 - .../Linter/Mocks/MockTargetLinter.swift | 1 - .../Linter/PackageLinterTests.swift | 1 - .../Linter/ProjectLinterTests.swift | 1 - .../Linter/SchemeLinterTests.swift | 1 - .../Linter/SettingsLinterTests.swift | 1 - .../StaticProductsGraphLinterTests.swift | 1 - .../Linter/TargetLinterTests.swift | 1 - .../Linter/TargetScriptLinterTests.swift | 1 - ...togeneratedSchemesProjectMapperTests.swift | 1 - ...teDerivedDirectoryProjectMapperTests.swift | 1 - .../GenerateInfoPlistProjectMapperTests.swift | 1 - .../ResourcesProjectMapperTests.swift | 1 - ...dResourceInterfaceProjectMapperTests.swift | 1 - ...DisableShowEnvVarsProjectMapperTests.swift | 1 - .../DefaultSettingsProviderTests.swift | 1 - .../Cloud/CloudAuthServiceTests.swift | 1 - .../Cloud/CloudCleanServiceTests.swift | 2 +- .../Cloud/CloudInitServiceTests.swift | 2 +- .../Cloud/CloudLogoutServiceTests.swift | 1 - .../Cloud/CloudSessionServiceTests.swift | 1 - .../Generator/Mocks/MockGenerator.swift | 71 ++++ ...ateWorkspaceProjectsGraphMapperTests.swift | 1 - .../Mocks/MockManifestGraphLoader.swift | 1 - .../Mocks/MockProjectEditorMapper.swift | 1 - .../ProjectEditorMapperTests.swift | 1 - .../ProjectEditor/ProjectEditorTests.swift | 1 - .../Services/BuildServiceTests.swift | 1 - .../Services/InitServiceTests.swift | 25 +- .../Services/InstallServiceTests.swift | 1 - .../Services/ListServiceTests.swift | 2 +- .../Services/RunServiceTests.swift | 1 - .../Services/ScaffoldServiceTests.swift | 1 - .../Services/TestServiceTests.swift | 1 - .../Utils/TuistAnalyticsDispatcherTests.swift | 1 - ...iptionHelpersBuilderIntegrationTests.swift | 1 - .../Loaders/CachedManifestLoaderTests.swift | 10 +- .../Loaders/ConfigLoaderTests.swift | 6 +- .../Loaders/PackageSettingsLoaderTests.swift | 3 +- ...SwiftPackageManagerDependenciesTests.swift | 146 ------- .../Loaders/TemplateGitLoaderTests.swift | 3 +- .../Loaders/TemplateLoaderTests.swift | 3 +- .../Cloud+ManifestMapperTests.swift | 4 +- ...ourceSynthesizer+ManifestMapperTests.swift | 2 +- .../PackageInfoMapperTests.swift | 2 +- .../Utils/PluginsHelperTests.swift | 1 + .../TuistPluginTests/PluginServiceTests.swift | 18 +- .../TemplateGeneratorTests.swift | 2 +- .../AnalyticsArtifactUploadServiceTests.swift | 1 - .../XcodeGraphTests/Models/TargetTests.swift | 1 - Tuist/ProjectDescriptionHelpers/Module.swift | 27 -- 203 files changed, 540 insertions(+), 4719 deletions(-) create mode 100644 Sources/TuistCore/Models/Cloud.swift create mode 100644 Sources/TuistCore/Models/CompatibleXcodeVersions.swift rename Sources/{XcodeGraph => TuistCore}/Models/Config.swift (58%) rename Sources/{XcodeGraph => TuistCore}/Models/ConfigGenerationOptions.swift (98%) create mode 100644 Sources/TuistCore/Models/PackageSettings.swift rename Sources/{XcodeGraph => TuistCore}/Models/Plugin.swift (100%) create mode 100644 Sources/TuistCore/Models/PluginLocation.swift rename Sources/{XcodeGraph => TuistCore}/Models/PluginResourceSynthesizer.swift (54%) rename Sources/{XcodeGraph => TuistCore}/Models/Plugins.swift (72%) rename Sources/{XcodeGraph => TuistCore}/Models/ProjectDescriptionHelpersPlugin.swift (100%) rename Sources/{XcodeGraph => TuistCore}/Models/Template.swift (85%) delete mode 100644 Sources/XcodeGraph/DependenciesGraph/DependenciesGraph.swift delete mode 100644 Sources/XcodeGraph/Graph/ConditionalGraphTarget.swift delete mode 100644 Sources/XcodeGraph/Graph/Graph.swift delete mode 100644 Sources/XcodeGraph/Graph/GraphDependency.swift delete mode 100644 Sources/XcodeGraph/Graph/GraphTarget.swift delete mode 100644 Sources/XcodeGraph/Models/ArchiveAction.swift delete mode 100644 Sources/XcodeGraph/Models/BuildAction.swift delete mode 100644 Sources/XcodeGraph/Models/CopyFileElement.swift delete mode 100644 Sources/XcodeGraph/Models/CopyFilesAction.swift delete mode 100644 Sources/XcodeGraph/Models/CoreDataModel.swift delete mode 100644 Sources/XcodeGraph/Models/Dependencies/SwiftPackageManagerDependencies.swift delete mode 100644 Sources/XcodeGraph/Models/ExecutionAction.swift delete mode 100644 Sources/XcodeGraph/Models/FileElement.swift delete mode 100644 Sources/XcodeGraph/Models/Headers.swift delete mode 100644 Sources/XcodeGraph/Models/Metadata/FrameworkMetadata.swift delete mode 100644 Sources/XcodeGraph/Models/Metadata/LibraryMetadata.swift delete mode 100644 Sources/XcodeGraph/Models/Metadata/SystemFrameworkMetadata.swift delete mode 100644 Sources/XcodeGraph/Models/Metadata/XCFrameworkMetadata.swift delete mode 100644 Sources/XcodeGraph/Models/Package.swift delete mode 100644 Sources/XcodeGraph/Models/PlatformCondition.swift delete mode 100644 Sources/XcodeGraph/Models/Plist.swift delete mode 100644 Sources/XcodeGraph/Models/Product.swift delete mode 100644 Sources/XcodeGraph/Models/Project.swift delete mode 100644 Sources/XcodeGraph/Models/RawScriptBuildPhase.swift delete mode 100644 Sources/XcodeGraph/Models/ResourceFileElement.swift delete mode 100644 Sources/XcodeGraph/Models/ResourceSynthesizer.swift delete mode 100644 Sources/XcodeGraph/Models/RunAction.swift delete mode 100644 Sources/XcodeGraph/Models/RunActionOptions.swift delete mode 100644 Sources/XcodeGraph/Models/Scheme.swift delete mode 100644 Sources/XcodeGraph/Models/Settings.swift delete mode 100644 Sources/XcodeGraph/Models/SimulatedLocation.swift delete mode 100644 Sources/XcodeGraph/Models/SourceFile.swift delete mode 100644 Sources/XcodeGraph/Models/Target.swift delete mode 100644 Sources/XcodeGraph/Models/TargetDependency.swift delete mode 100644 Sources/XcodeGraph/Models/TargetReference.swift delete mode 100644 Sources/XcodeGraph/Models/TargetScript.swift delete mode 100644 Sources/XcodeGraph/Models/TestAction.swift delete mode 100644 Sources/XcodeGraph/Models/TestPlan.swift delete mode 100644 Sources/XcodeGraph/Models/Workspace.swift delete mode 100644 Sources/XcodeGraph/Models/XCFrameworkInfoPlist.swift delete mode 100644 Sources/XcodeGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Graph/Graph+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Graph/GraphDependency+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Graph/GraphTarget+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/AnalyzeAction+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/ArchiveAction+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Arguments+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/BuildAction+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Cloud+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Config+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Headers+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Metadata/LibraryMetadata+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Metadata/XCFrameworkMetadata+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/PackageSettings+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Plugins+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/ProfileAction+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Project+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/RawScriptBuildPhase+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/ResourceSynthesizerPlugin+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/RunAction+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Scheme+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Settings+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Target+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Template+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/TestAction+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/TestableTarget+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/Workspace+TestData.swift delete mode 100644 Sources/XcodeGraphTesting/Models/XCFrameworkInfoPlist+TestData.swift create mode 100644 Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift delete mode 100644 Tests/TuistLoaderTests/Loaders/SwiftPackageManagerDependenciesTests.swift diff --git a/Package.resolved b/Package.resolved index d5e3ca84104..0efad86762b 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "026755a035a6925da2ead11d61025383dd47d8db6b0c23d6a14cb94e12523887", + "originHash" : "be656e1285b67cd89206d2e44ae693ca74086bd97ce1788a21d0533b6a6b6f62", "pins" : [ { "identity" : "aexml", @@ -240,8 +240,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/tuist/XcodeGraph.git", "state" : { - "revision" : "634fd424d7d7c43aca6598f223c01b2ecf353502", - "version" : "0.2.0" + "revision" : "0e44220403553ce7f20a79e49873b492302b4650", + "version" : "0.5.0" } }, { diff --git a/Package.swift b/Package.swift index 056a5ba0b50..8144b74ee4d 100644 --- a/Package.swift +++ b/Package.swift @@ -44,7 +44,6 @@ var targets: [Target] = [ dependencies: [ "TuistCore", "TuistSupportTesting", - .product(name: "XcodeGraphTesting", package: "XcodeGraph"), pathDependency, ], linkerSettings: [.linkedFramework("XCTest")] @@ -249,7 +248,6 @@ var targets: [Target] = [ "TuistLoader", pathDependency, "TuistCore", - .product(name: "XcodeGraphTesting", package: "XcodeGraph"), "ProjectDescription", "TuistSupportTesting", ], @@ -418,7 +416,7 @@ let package = Package( .package(url: "https://github.com/tuist/swift-openapi-runtime", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/swift-openapi-urlsession", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/Path", .upToNextMajor(from: "0.3.0")), - .package(url: "https://github.com/tuist/XcodeGraph.git", exact: "0.2.0"), + .package(url: "https://github.com/tuist/XcodeGraph.git", .upToNextMajor(from: "0.5.0")), ], targets: targets ) diff --git a/Sources/TuistCore/Models/Cloud.swift b/Sources/TuistCore/Models/Cloud.swift new file mode 100644 index 00000000000..dcf42313f20 --- /dev/null +++ b/Sources/TuistCore/Models/Cloud.swift @@ -0,0 +1,41 @@ +import Foundation + +/// Cloud represents the configuration to connect to the server. +public struct Cloud: Equatable, Hashable { + /// Cloud option. + public enum Option: String, Codable, Equatable { + case optional + } + + /// The base URL that points to the cloud server + public let url: URL + + /// The project unique identifier. + public let projectId: String + + /// Cloud options. + public let options: [Option] + + /// Initializes an instance of Cloud. + /// - Parameters: + /// - url: Cloud server base URL. + /// - projectId: Project unique identifier. + /// - options: Cloud options. + public init(url: URL, projectId: String, options: [Option]) { + self.url = url + self.projectId = projectId + self.options = options + } +} + +#if DEBUG + extension Cloud { + public static func test( + url: URL = URL(string: "https://test.tuist.io")!, + projectId: String = "123", + options: [Cloud.Option] = [] + ) -> Cloud { + Cloud(url: url, projectId: projectId, options: options) + } + } +#endif diff --git a/Sources/TuistCore/Models/CompatibleXcodeVersions.swift b/Sources/TuistCore/Models/CompatibleXcodeVersions.swift new file mode 100644 index 00000000000..df13fde0740 --- /dev/null +++ b/Sources/TuistCore/Models/CompatibleXcodeVersions.swift @@ -0,0 +1,72 @@ +import Foundation +import XcodeGraph + +/// Enum that represents all the Xcode versions that a project or set of projects is compatible with. +public enum CompatibleXcodeVersions: Equatable, Hashable, ExpressibleByArrayLiteral, ExpressibleByStringInterpolation, + CustomStringConvertible +{ + /// The project supports all Xcode versions. + case all + + /// The project supports only a specific Xcode version. + case exact(Version) + + /// The project supports all Xcode versions from the specified version up to but not including the next major version. + case upToNextMajor(Version) + + /// The project supports all Xcode versions from the specified version up to but not including the next minor version. + case upToNextMinor(Version) + + /// List of versions that are supported by the project. + case list([CompatibleXcodeVersions]) + + public func isCompatible(versionString: String) -> Bool { + let xCodeVersion: Version = "\(versionString)" + + switch self { + case .all: + return true + case let .exact(version): + return version == xCodeVersion + case let .upToNextMajor(version): + return xCodeVersion.major == version.major && xCodeVersion >= version + case let .upToNextMinor(version): + return version.major == xCodeVersion.major && version.minor == xCodeVersion.minor && xCodeVersion >= version + case let .list(versions): + return versions.contains { $0.isCompatible(versionString: versionString) } + } + } + + // MARK: - ExpressibleByStringInterpolation + + public init(stringLiteral value: String) { + self = .exact(Version(stringLiteral: value)) + } + + // MARK: - ExpressibleByArrayLiteral + + public init(arrayLiteral elements: [CompatibleXcodeVersions]) { + self = .list(elements) + } + + public init(arrayLiteral elements: CompatibleXcodeVersions...) { + self = .list(elements) + } + + // MARK: - CustomStringConvertible + + public var description: String { + switch self { + case .all: + return "all" + case let .exact(version): + return "\(version)" + case let .upToNextMajor(version): + return "\(version)..<\(version.major + 1).0.0" + case let .upToNextMinor(version): + return "\(version)..<\(version.major).\(version.minor + 1).0" + case let .list(versions): + return "\(versions.map(\.description).joined(separator: " or "))" + } + } +} diff --git a/Sources/XcodeGraph/Models/Config.swift b/Sources/TuistCore/Models/Config.swift similarity index 58% rename from Sources/XcodeGraph/Models/Config.swift rename to Sources/TuistCore/Models/Config.swift index 8c9536c78a9..a6833fb69f1 100644 --- a/Sources/XcodeGraph/Models/Config.swift +++ b/Sources/TuistCore/Models/Config.swift @@ -1,6 +1,6 @@ import Foundation import Path -import TSCUtility +import XcodeGraph /// This model allows to configure Tuist. public struct Config: Equatable, Hashable { @@ -73,3 +73,45 @@ public struct Config: Equatable, Hashable { hasher.combine(compatibleXcodeVersions) } } + +#if DEBUG + extension Config { + public static func test( + compatibleXcodeVersions: CompatibleXcodeVersions = .all, + cloud: Cloud? = Cloud.test(), + swiftVersion: Version? = nil, + plugins: [PluginLocation] = [], + generationOptions: GenerationOptions = Config.default.generationOptions, + path: AbsolutePath? = nil + ) -> Config { + .init( + compatibleXcodeVersions: compatibleXcodeVersions, + cloud: cloud, + swiftVersion: swiftVersion, + plugins: plugins, + generationOptions: generationOptions, + path: path + ) + } + } + + extension Config.GenerationOptions { + public static func test( + resolveDependenciesWithSystemScm: Bool = false, + disablePackageVersionLocking: Bool = false, + clonedSourcePackagesDirPath: AbsolutePath? = nil, + staticSideEffectsWarningTargets: TuistCore.Config.GenerationOptions.StaticSideEffectsWarningTargets = .all, + enforceExplicitDependencies: Bool = false, + defaultConfiguration: String? = nil + ) -> Self { + .init( + resolveDependenciesWithSystemScm: resolveDependenciesWithSystemScm, + disablePackageVersionLocking: disablePackageVersionLocking, + clonedSourcePackagesDirPath: clonedSourcePackagesDirPath, + staticSideEffectsWarningTargets: staticSideEffectsWarningTargets, + enforceExplicitDependencies: enforceExplicitDependencies, + defaultConfiguration: defaultConfiguration + ) + } + } +#endif diff --git a/Sources/XcodeGraph/Models/ConfigGenerationOptions.swift b/Sources/TuistCore/Models/ConfigGenerationOptions.swift similarity index 98% rename from Sources/XcodeGraph/Models/ConfigGenerationOptions.swift rename to Sources/TuistCore/Models/ConfigGenerationOptions.swift index 6431908a14a..b2eeba444dd 100644 --- a/Sources/XcodeGraph/Models/ConfigGenerationOptions.swift +++ b/Sources/TuistCore/Models/ConfigGenerationOptions.swift @@ -1,5 +1,4 @@ import Path -import TSCUtility extension Config { public struct GenerationOptions: Codable, Hashable { diff --git a/Sources/TuistCore/Models/PackageSettings.swift b/Sources/TuistCore/Models/PackageSettings.swift new file mode 100644 index 00000000000..449a1ae74c8 --- /dev/null +++ b/Sources/TuistCore/Models/PackageSettings.swift @@ -0,0 +1,67 @@ +import Foundation +import XcodeGraph + +/// Contains the description of custom SPM settings +public struct PackageSettings: Equatable, Codable { + /// The custom `Product` types to be used for SPM targets. + public let productTypes: [String: Product] + + /// Custom destinations to be used for SPM products. + public let productDestinations: [String: Destinations] + + // The base settings to be used for targets generated from SwiftPackageManager + public let baseSettings: Settings + + /// The custom `Settings` to be applied to SPM targets + public let targetSettings: [String: SettingsDictionary] + + /// The custom project options for each project generated from a swift package + public let projectOptions: [String: XcodeGraph.Project.Options] + + /// Swift tools version of the parsed `Package.swift` + public let swiftToolsVersion: Version + + /// Initializes a new `PackageSettings` instance. + /// - Parameters: + /// - productTypes: The custom `Product` types to be used for SPM targets. + /// - baseSettings: The base settings to be used for targets generated from SwiftPackageManager + /// - targetSettings: The custom `SettingsDictionary` to be applied to denoted targets + /// - projectOptions: The custom project options for each project generated from a swift package + public init( + productTypes: [String: Product], + productDestinations: [String: Destinations], + baseSettings: Settings, + targetSettings: [String: SettingsDictionary], + projectOptions: [String: XcodeGraph.Project.Options] = [:], + swiftToolsVersion: Version + ) { + self.productTypes = productTypes + self.productDestinations = productDestinations + self.baseSettings = baseSettings + self.targetSettings = targetSettings + self.projectOptions = projectOptions + self.swiftToolsVersion = swiftToolsVersion + } +} + +#if DEBUG + extension PackageSettings { + public static func test( + productTypes: [String: Product] = [:], + productDestinations: [String: Destinations] = [:], + baseSettings: Settings = Settings.default, + targetSettings: [String: SettingsDictionary] = [:], + projectOptions: [String: XcodeGraph.Project.Options] = [:], + swiftToolsVersion: Version = Version("5.4.9") + ) -> PackageSettings { + PackageSettings( + productTypes: productTypes, + productDestinations: productDestinations, + baseSettings: baseSettings, + targetSettings: targetSettings, + projectOptions: projectOptions, + swiftToolsVersion: swiftToolsVersion + ) + } + } +#endif diff --git a/Sources/XcodeGraph/Models/Plugin.swift b/Sources/TuistCore/Models/Plugin.swift similarity index 100% rename from Sources/XcodeGraph/Models/Plugin.swift rename to Sources/TuistCore/Models/Plugin.swift diff --git a/Sources/TuistCore/Models/PluginLocation.swift b/Sources/TuistCore/Models/PluginLocation.swift new file mode 100644 index 00000000000..3af5ed9a5ee --- /dev/null +++ b/Sources/TuistCore/Models/PluginLocation.swift @@ -0,0 +1,41 @@ +import Foundation + +/// The location to a directory containing a `Plugin` manifest. +public enum PluginLocation: Hashable, Equatable { + public enum GitReference: Hashable, Equatable { + case sha(String) + case tag(String) + } + + /// An absolute path `String` to a directory a `Plugin` manifest. + /// + /// Example: + /// ``` + /// .local(path: "/User/local/bin") + /// ``` + case local(path: String) + + /// A `URL` to a `git` repository pointing at a `GitReference` (either sha or tag), and optionally a directory + /// + /// Examples: + /// ``` + /// .git(url: "https://git/helpers.git", gitReference: .tag("1.0.0")) + /// .git(url: "https://git/helpers.git", gitReference: .sha("1.0.0")) + /// ``` + case git(url: String, gitReference: GitReference, directory: String?, releaseUrl: String?) +} + +// MARK: - description + +extension PluginLocation: CustomStringConvertible { + public var description: String { + switch self { + case let .local(path): + return "local path: \(path)" + case let .git(url, .tag(tag), directory, releaseUrl): + return "git url: \(url), tag: \(tag), directory: \(directory ?? "nil"), releaseUrl: \(releaseUrl ?? "nil")" + case let .git(url, .sha(sha), directory, releaseUrl): + return "git url: \(url), sha: \(sha), directory: \(directory ?? "nil"), releaseUrl: \(releaseUrl ?? "nil")" + } + } +} diff --git a/Sources/XcodeGraph/Models/PluginResourceSynthesizer.swift b/Sources/TuistCore/Models/PluginResourceSynthesizer.swift similarity index 54% rename from Sources/XcodeGraph/Models/PluginResourceSynthesizer.swift rename to Sources/TuistCore/Models/PluginResourceSynthesizer.swift index 65409941b5b..47048e0016c 100644 --- a/Sources/XcodeGraph/Models/PluginResourceSynthesizer.swift +++ b/Sources/TuistCore/Models/PluginResourceSynthesizer.swift @@ -16,3 +16,17 @@ public struct PluginResourceSynthesizer: Equatable { self.path = path } } + +#if DEBUG + extension PluginResourceSynthesizer { + public static func test( + name: String = "Plugin", + path: AbsolutePath = try! AbsolutePath(validating: "/test") // swiftlint:disable:this force_try + ) -> Self { + .init( + name: name, + path: path + ) + } + } +#endif diff --git a/Sources/XcodeGraph/Models/Plugins.swift b/Sources/TuistCore/Models/Plugins.swift similarity index 72% rename from Sources/XcodeGraph/Models/Plugins.swift rename to Sources/TuistCore/Models/Plugins.swift index 61424933a7e..81e1e75bede 100644 --- a/Sources/XcodeGraph/Models/Plugins.swift +++ b/Sources/TuistCore/Models/Plugins.swift @@ -35,3 +35,19 @@ public struct Plugins: Equatable { resourceSynthesizers: [] ) } + +#if DEBUG + extension Plugins { + public static func test( + projectDescriptionHelpers: [ProjectDescriptionHelpersPlugin] = [], + templatePaths: [AbsolutePath] = [], + resourceSynthesizers: [PluginResourceSynthesizer] = [] + ) -> Plugins { + Plugins( + projectDescriptionHelpers: projectDescriptionHelpers, + templatePaths: templatePaths, + resourceSynthesizers: resourceSynthesizers + ) + } + } +#endif diff --git a/Sources/XcodeGraph/Models/ProjectDescriptionHelpersPlugin.swift b/Sources/TuistCore/Models/ProjectDescriptionHelpersPlugin.swift similarity index 100% rename from Sources/XcodeGraph/Models/ProjectDescriptionHelpersPlugin.swift rename to Sources/TuistCore/Models/ProjectDescriptionHelpersPlugin.swift diff --git a/Sources/XcodeGraph/Models/Template.swift b/Sources/TuistCore/Models/Template.swift similarity index 85% rename from Sources/XcodeGraph/Models/Template.swift rename to Sources/TuistCore/Models/Template.swift index b266d05c5e4..98b6a6423fa 100644 --- a/Sources/XcodeGraph/Models/Template.swift +++ b/Sources/TuistCore/Models/Template.swift @@ -149,3 +149,31 @@ extension Template.Attribute.Value: RawRepresentable { } } } + +#if DEBUG + extension Template { + public static func test( + description: String = "Template", + attributes: [Attribute] = [], + items: [Template.Item] = [] + ) -> Template { + Template( + description: description, + attributes: attributes, + items: items + ) + } + } + + extension Template.Item { + public static func test( + path: RelativePath, + contents: Template.Contents = .string("test content") + ) -> Template.Item { + Template.Item( + path: path, + contents: contents + ) + } + } +#endif diff --git a/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift b/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift index e07b61e7249..f25f0aa31e3 100644 --- a/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift +++ b/Sources/TuistCoreTesting/Graph/GraphDependencyReference+TestData.swift @@ -3,7 +3,6 @@ import Path import TuistCore import TuistSupport import XcodeGraph -import XcodeGraphTesting extension GraphDependencyReference { public static func testFramework( diff --git a/Sources/TuistCoreTesting/Graph/MockGraphLoader.swift b/Sources/TuistCoreTesting/Graph/MockGraphLoader.swift index 5d4a789972c..9a46859ddc2 100644 --- a/Sources/TuistCoreTesting/Graph/MockGraphLoader.swift +++ b/Sources/TuistCoreTesting/Graph/MockGraphLoader.swift @@ -2,7 +2,6 @@ import Foundation import Path import TuistCore import XcodeGraph -@testable import XcodeGraphTesting public final class MockGraphLoader: GraphLoading { public init() {} diff --git a/Sources/TuistCoreTesting/Graph/WorkspaceWithProjects+TestData.swift b/Sources/TuistCoreTesting/Graph/WorkspaceWithProjects+TestData.swift index 129ca0aeeb0..8473c96b457 100644 --- a/Sources/TuistCoreTesting/Graph/WorkspaceWithProjects+TestData.swift +++ b/Sources/TuistCoreTesting/Graph/WorkspaceWithProjects+TestData.swift @@ -1,7 +1,6 @@ import Foundation import Path import XcodeGraph -import XcodeGraphTesting @testable import TuistCore extension WorkspaceWithProjects { diff --git a/Sources/TuistGenerator/Linter/EnvironmentLinter.swift b/Sources/TuistGenerator/Linter/EnvironmentLinter.swift index 081a5b2890f..670d9f99868 100644 --- a/Sources/TuistGenerator/Linter/EnvironmentLinter.swift +++ b/Sources/TuistGenerator/Linter/EnvironmentLinter.swift @@ -2,7 +2,6 @@ import Foundation import Path import TuistCore import TuistSupport -import XcodeGraph public protocol EnvironmentLinting { /// Lints a given Tuist configuration. diff --git a/Sources/TuistGeneratorTesting/Linter/MockEnvironmentLinter.swift b/Sources/TuistGeneratorTesting/Linter/MockEnvironmentLinter.swift index 43be18152ca..59e31a3bd68 100644 --- a/Sources/TuistGeneratorTesting/Linter/MockEnvironmentLinter.swift +++ b/Sources/TuistGeneratorTesting/Linter/MockEnvironmentLinter.swift @@ -1,7 +1,6 @@ import Foundation import Path import TuistCore -import XcodeGraph @testable import TuistGenerator diff --git a/Sources/TuistGeneratorTesting/Linter/MockGraphLinter.swift b/Sources/TuistGeneratorTesting/Linter/MockGraphLinter.swift index 5f9ea4ec41e..41893d68efc 100644 --- a/Sources/TuistGeneratorTesting/Linter/MockGraphLinter.swift +++ b/Sources/TuistGeneratorTesting/Linter/MockGraphLinter.swift @@ -1,7 +1,6 @@ import Foundation import TuistCore import TuistSupport -import XcodeGraph @testable import TuistGenerator public class MockGraphLinter: GraphLinting { diff --git a/Sources/TuistKit/Services/InitService.swift b/Sources/TuistKit/Services/InitService.swift index 3f1d84f959a..32e61bbf88b 100644 --- a/Sources/TuistKit/Services/InitService.swift +++ b/Sources/TuistKit/Services/InitService.swift @@ -187,8 +187,8 @@ class InitService { requiredTemplateOptions: [String: String], optionalTemplateOptions: [String: String?], template: Template - ) throws -> [String: XcodeGraph.Template.Attribute.Value] { - let defaultAttributes: [String: XcodeGraph.Template.Attribute.Value] = [ + ) throws -> [String: Template.Attribute.Value] { + let defaultAttributes: [String: Template.Attribute.Value] = [ "name": .string(name), "platform": .string(platform.caseValue), "tuist_version": .string(tuistVersion), diff --git a/Sources/TuistKit/Services/ListService.swift b/Sources/TuistKit/Services/ListService.swift index 89d80fe02e3..9e8d2a3add8 100644 --- a/Sources/TuistKit/Services/ListService.swift +++ b/Sources/TuistKit/Services/ListService.swift @@ -1,5 +1,6 @@ import Foundation import Path +import TuistCore import TuistLoader import TuistPlugin import TuistScaffold diff --git a/Sources/TuistKit/Services/ScaffoldService.swift b/Sources/TuistKit/Services/ScaffoldService.swift index 1ecca3cf859..16ae55b4913 100644 --- a/Sources/TuistKit/Services/ScaffoldService.swift +++ b/Sources/TuistKit/Services/ScaffoldService.swift @@ -131,7 +131,7 @@ final class ScaffoldService { requiredTemplateOptions: [String: String], optionalTemplateOptions: [String: String?], template: Template - ) throws -> [String: XcodeGraph.Template.Attribute.Value] { + ) throws -> [String: Template.Attribute.Value] { try template.attributes.reduce(into: [:]) { attributesDictionary, attribute in switch attribute { case let .required(name): diff --git a/Sources/TuistKit/Utils/ManifestGraphLoader.swift b/Sources/TuistKit/Utils/ManifestGraphLoader.swift index e66120ee321..24e9d8b02f4 100644 --- a/Sources/TuistKit/Utils/ManifestGraphLoader.swift +++ b/Sources/TuistKit/Utils/ManifestGraphLoader.swift @@ -107,7 +107,7 @@ public final class ManifestGraphLoader: ManifestGraphLoading { // Load DependenciesGraph let dependenciesGraph: XcodeGraph.DependenciesGraph - let packageSettings: XcodeGraph.PackageSettings? + let packageSettings: TuistCore.PackageSettings? // Load SPM graph only if is SPM Project only or the workspace is using external dependencies if let packagePath = manifestFilesLocator.locatePackageManifest(at: path), diff --git a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift index b015c4c36db..a8c7039bb31 100644 --- a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift @@ -3,8 +3,6 @@ import Path import ProjectDescription import TuistCore import TuistSupport -import struct XcodeGraph.Config -import struct XcodeGraph.Plugins /// Cached Manifest Loader /// @@ -79,19 +77,19 @@ public class CachedManifestLoader: ManifestLoading { } } - public func loadTemplate(at path: AbsolutePath) throws -> Template { + public func loadTemplate(at path: AbsolutePath) throws -> ProjectDescription.Template { try load(manifest: .template, at: path) { try manifestLoader.loadTemplate(at: path) } } - public func loadPlugin(at path: AbsolutePath) throws -> Plugin { + public func loadPlugin(at path: AbsolutePath) throws -> ProjectDescription.Plugin { try load(manifest: .plugin, at: path) { try manifestLoader.loadPlugin(at: path) } } - public func loadPackageSettings(at path: AbsolutePath) throws -> PackageSettings { + public func loadPackageSettings(at path: AbsolutePath) throws -> ProjectDescription.PackageSettings { try load(manifest: .packageSettings, at: path) { try manifestLoader.loadPackageSettings(at: path) } diff --git a/Sources/TuistLoader/Loaders/ConfigLoader.swift b/Sources/TuistLoader/Loaders/ConfigLoader.swift index 9e5e67a5ef8..83651cf11a8 100644 --- a/Sources/TuistLoader/Loaders/ConfigLoader.swift +++ b/Sources/TuistLoader/Loaders/ConfigLoader.swift @@ -14,7 +14,7 @@ public protocol ConfigLoading { /// - Parameter path: Directory from which look up and load the Config. /// - Returns: Loaded Config object. /// - Throws: An error if the Config.swift can't be parsed. - func loadConfig(path: AbsolutePath) throws -> XcodeGraph.Config + func loadConfig(path: AbsolutePath) throws -> TuistCore.Config /// Locates the Config.swift manifest from the given directory. func locateConfig(at: AbsolutePath) -> AbsolutePath? @@ -24,7 +24,7 @@ public final class ConfigLoader: ConfigLoading { private let manifestLoader: ManifestLoading private let rootDirectoryLocator: RootDirectoryLocating private let fileHandler: FileHandling - private var cachedConfigs: [AbsolutePath: XcodeGraph.Config] = [:] + private var cachedConfigs: [AbsolutePath: TuistCore.Config] = [:] public init( manifestLoader: ManifestLoading = ManifestLoader(), @@ -36,19 +36,19 @@ public final class ConfigLoader: ConfigLoading { self.fileHandler = fileHandler } - public func loadConfig(path: AbsolutePath) throws -> XcodeGraph.Config { + public func loadConfig(path: AbsolutePath) throws -> TuistCore.Config { if let cached = cachedConfigs[path] { return cached } guard let configPath = locateConfig(at: path) else { - let config = XcodeGraph.Config.default + let config = TuistCore.Config.default cachedConfigs[path] = config return config } let manifest = try manifestLoader.loadConfig(at: configPath.parentDirectory) - let config = try XcodeGraph.Config.from(manifest: manifest, at: configPath) + let config = try TuistCore.Config.from(manifest: manifest, at: configPath) cachedConfigs[path] = config return config } diff --git a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift index 4b86ecf84f5..07b81cc7a02 100644 --- a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift +++ b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift @@ -12,7 +12,7 @@ public protocol PackageSettingsLoading { /// - Parameter path: The absolute path for the `PackageSettings` to load. /// - Parameter plugins: The plugins for the `PackageSettings` to load. /// - Returns: The `PackageSettings` loaded from the specified path. - func loadPackageSettings(at path: AbsolutePath, with plugins: Plugins) throws -> XcodeGraph.PackageSettings + func loadPackageSettings(at path: AbsolutePath, with plugins: Plugins) throws -> TuistCore.PackageSettings } public final class PackageSettingsLoader: PackageSettingsLoading { @@ -33,7 +33,7 @@ public final class PackageSettingsLoader: PackageSettingsLoading { self.manifestFilesLocator = manifestFilesLocator } - public func loadPackageSettings(at path: AbsolutePath, with plugins: Plugins) throws -> XcodeGraph.PackageSettings { + public func loadPackageSettings(at path: AbsolutePath, with plugins: Plugins) throws -> TuistCore.PackageSettings { let path = manifestFilesLocator.locatePackageManifest(at: path)?.parentDirectory ?? path try manifestLoader.register(plugins: plugins) let manifest = try manifestLoader.loadPackageSettings(at: path) @@ -42,7 +42,7 @@ public final class PackageSettingsLoader: PackageSettingsLoading { at: path ) - return try XcodeGraph.PackageSettings.from( + return try TuistCore.PackageSettings.from( manifest: manifest, generatorPaths: generatorPaths, swiftToolsVersion: swiftToolsVersion diff --git a/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift b/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift index c982084db5e..72142f7c5a9 100644 --- a/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift @@ -1,8 +1,8 @@ import Foundation import Path import ProjectDescription +import TuistCore import TuistSupport -import XcodeGraph /// A component that can load a manifest and all its (transitive) manifest dependencies public protocol RecursiveManifestLoading { @@ -20,7 +20,7 @@ public protocol RecursiveManifestLoading { /// - Returns: Loaded manifest func loadAndMergePackageProjects( in loadedWorkspace: LoadedWorkspace, - packageSettings: XcodeGraph.PackageSettings + packageSettings: TuistCore.PackageSettings ) throws -> LoadedWorkspace } @@ -85,7 +85,7 @@ public class RecursiveManifestLoader: RecursiveManifestLoading { ) } - public func loadAndMergePackageProjects(in loadedWorkspace: LoadedWorkspace, packageSettings: XcodeGraph.PackageSettings) + public func loadAndMergePackageProjects(in loadedWorkspace: LoadedWorkspace, packageSettings: TuistCore.PackageSettings) throws -> LoadedWorkspace { let generatorPaths = GeneratorPaths(manifestDirectory: loadedWorkspace.path) @@ -120,7 +120,7 @@ public class RecursiveManifestLoader: RecursiveManifestLoading { private func loadPackageProjects( paths: [AbsolutePath], - packageSettings: XcodeGraph.PackageSettings? + packageSettings: TuistCore.PackageSettings? ) throws -> LoadedProjects { guard let packageSettings else { return LoadedProjects(projects: [:]) } var cache = [AbsolutePath: ProjectDescription.Project]() diff --git a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift index 717d134b07c..0bc42be5043 100644 --- a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift +++ b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift @@ -48,7 +48,7 @@ public protocol SwiftPackageManagerGraphLoading { /// dependencies. func load( packagePath: AbsolutePath, - packageSettings: XcodeGraph.PackageSettings + packageSettings: TuistCore.PackageSettings ) throws -> TuistCore.DependenciesGraph } @@ -73,7 +73,7 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi // swiftlint:disable:next function_body_length public func load( packagePath: AbsolutePath, - packageSettings: XcodeGraph.PackageSettings + packageSettings: TuistCore.PackageSettings ) throws -> TuistCore.DependenciesGraph { let path = packagePath.parentDirectory.appending( component: Constants.SwiftPackageManager.packageBuildDirectoryName diff --git a/Sources/TuistLoader/Loaders/TemplateGitLoader.swift b/Sources/TuistLoader/Loaders/TemplateGitLoader.swift index 5799feb1912..5b5325ce18f 100644 --- a/Sources/TuistLoader/Loaders/TemplateGitLoader.swift +++ b/Sources/TuistLoader/Loaders/TemplateGitLoader.swift @@ -1,3 +1,4 @@ +import TuistCore import TuistSupport import XcodeGraph @@ -7,7 +8,7 @@ public protocol TemplateGitLoading { /// - Parameters: /// - templateURL: Git repository url /// - closure: Closure to perform work on loaded template - func loadTemplate(from templateURL: String, closure: (XcodeGraph.Template) throws -> Void) throws + func loadTemplate(from templateURL: String, closure: (TuistCore.Template) throws -> Void) throws } public final class TemplateGitLoader: TemplateGitLoading { @@ -38,7 +39,7 @@ public final class TemplateGitLoader: TemplateGitLoading { self.templateLocationParser = templateLocationParser } - public func loadTemplate(from templateURL: String, closure: (XcodeGraph.Template) throws -> Void) throws { + public func loadTemplate(from templateURL: String, closure: (TuistCore.Template) throws -> Void) throws { let repoURL = templateLocationParser.parseRepositoryURL(from: templateURL) let repoBranch = templateLocationParser.parseRepositoryBranch(from: templateURL) try fileHandler.inTemporaryDirectory { temporaryPath in diff --git a/Sources/TuistLoader/Loaders/TemplateLoader.swift b/Sources/TuistLoader/Loaders/TemplateLoader.swift index 40730fbc66d..c267548195d 100644 --- a/Sources/TuistLoader/Loaders/TemplateLoader.swift +++ b/Sources/TuistLoader/Loaders/TemplateLoader.swift @@ -11,7 +11,7 @@ public protocol TemplateLoading { /// - path: Path of template manifest file `name_of_template.swift` /// - plugins: List of available plugins. /// - Returns: Loaded `TuistScaffold.Template` - func loadTemplate(at path: AbsolutePath, plugins: Plugins) throws -> XcodeGraph.Template + func loadTemplate(at path: AbsolutePath, plugins: Plugins) throws -> TuistCore.Template } public class TemplateLoader: TemplateLoading { @@ -26,28 +26,28 @@ public class TemplateLoader: TemplateLoading { self.manifestLoader = manifestLoader } - public func loadTemplate(at path: AbsolutePath, plugins: Plugins) throws -> XcodeGraph.Template { + public func loadTemplate(at path: AbsolutePath, plugins: Plugins) throws -> TuistCore.Template { try manifestLoader.register(plugins: plugins) let template = try manifestLoader.loadTemplate(at: path) let generatorPaths = GeneratorPaths(manifestDirectory: path) - return try XcodeGraph.Template.from( + return try TuistCore.Template.from( manifest: template, generatorPaths: generatorPaths ) } } -extension XcodeGraph.Template { - static func from(manifest: ProjectDescription.Template, generatorPaths: GeneratorPaths) throws -> XcodeGraph.Template { - let attributes = try manifest.attributes.map(XcodeGraph.Template.Attribute.from) +extension TuistCore.Template { + static func from(manifest: ProjectDescription.Template, generatorPaths: GeneratorPaths) throws -> TuistCore.Template { + let attributes = try manifest.attributes.map(TuistCore.Template.Attribute.from) let items = try manifest.items.map { Item( path: try RelativePath(validating: $0.path), - contents: try XcodeGraph.Template.Contents.from( + contents: try TuistCore.Template.Contents.from( manifest: $0.contents, generatorPaths: generatorPaths ) ) } - return XcodeGraph.Template( + return TuistCore.Template( description: manifest.description, attributes: attributes, items: items @@ -55,8 +55,8 @@ extension XcodeGraph.Template { } } -extension XcodeGraph.Template.Attribute { - static func from(manifest: ProjectDescription.Template.Attribute) throws -> XcodeGraph.Template.Attribute { +extension TuistCore.Template.Attribute { + static func from(manifest: ProjectDescription.Template.Attribute) throws -> TuistCore.Template.Attribute { switch manifest { case let .required(name): return .required(name) @@ -66,8 +66,8 @@ extension XcodeGraph.Template.Attribute { } } -extension XcodeGraph.Template.Attribute.Value { - static func from(value: ProjectDescription.Template.Attribute.Value) throws -> XcodeGraph.Template.Attribute.Value { +extension TuistCore.Template.Attribute.Value { + static func from(value: ProjectDescription.Template.Attribute.Value) throws -> TuistCore.Template.Attribute.Value { switch value { case let .string(string): return .string(string) @@ -78,23 +78,23 @@ extension XcodeGraph.Template.Attribute.Value { case let .boolean(boolean): return .boolean(boolean) case let .dictionary(dictionary): - var newDictionary: [String: XcodeGraph.Template.Attribute.Value] = [:] + var newDictionary: [String: TuistCore.Template.Attribute.Value] = [:] for (key, value) in dictionary { newDictionary[key] = try from(value: value) } return .dictionary(newDictionary) case let .array(array): - let newArray: [XcodeGraph.Template.Attribute.Value] = try array.map { try from(value: $0) } + let newArray: [TuistCore.Template.Attribute.Value] = try array.map { try from(value: $0) } return .array(newArray) } } } -extension XcodeGraph.Template.Contents { +extension TuistCore.Template.Contents { static func from( manifest: ProjectDescription.Template.Contents, generatorPaths: GeneratorPaths - ) throws -> XcodeGraph.Template.Contents { + ) throws -> TuistCore.Template.Contents { switch manifest { case let .string(contents): return .string(contents) diff --git a/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift index e4bd5b9d68f..037a2ed9440 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift @@ -25,21 +25,21 @@ enum CloudManifestMapperError: FatalError { } } -extension XcodeGraph.Cloud { - static func from(manifest: ProjectDescription.Cloud) throws -> XcodeGraph.Cloud { +extension TuistCore.Cloud { + static func from(manifest: ProjectDescription.Cloud) throws -> TuistCore.Cloud { var cloudURL: URL! if let manifestCloudURL = URL(string: manifest.url.dropSuffix("/")) { cloudURL = manifestCloudURL } else { throw CloudManifestMapperError.invalidCloudURL(manifest.url) } - let options = manifest.options.compactMap(XcodeGraph.Cloud.Option.from) - return XcodeGraph.Cloud(url: cloudURL, projectId: manifest.projectId, options: options) + let options = manifest.options.compactMap(TuistCore.Cloud.Option.from) + return TuistCore.Cloud(url: cloudURL, projectId: manifest.projectId, options: options) } } -extension XcodeGraph.Cloud.Option { - static func from(manifest: ProjectDescription.Cloud.Option) -> XcodeGraph.Cloud.Option? { +extension TuistCore.Cloud.Option { + static func from(manifest: ProjectDescription.Cloud.Option) -> TuistCore.Cloud.Option? { switch manifest { case .optional: return .optional diff --git a/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift index 3dcb65ee317..c9d65f65f2f 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/CompatibleXcodeVersions+ManifestMapper.swift @@ -3,14 +3,13 @@ import Path import ProjectDescription import TuistCore import TuistSupport -import XcodeGraph -extension XcodeGraph.CompatibleXcodeVersions { +extension TuistCore.CompatibleXcodeVersions { /// Maps a ProjectDescription.CompatibleXcodeVersions instance into a XcodeGraph.CompatibleXcodeVersions model. /// - Parameters: /// - manifest: Manifest representation of compatible Xcode versions. /// - generatorPaths: Generator paths. - static func from(manifest: ProjectDescription.CompatibleXcodeVersions) -> XcodeGraph.CompatibleXcodeVersions { + static func from(manifest: ProjectDescription.CompatibleXcodeVersions) -> TuistCore.CompatibleXcodeVersions { switch manifest { case .all: return .all diff --git a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift index cc0d892129a..d13f3599cc0 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift @@ -6,18 +6,18 @@ import TuistCore import TuistSupport import XcodeGraph -extension XcodeGraph.Config { +extension TuistCore.Config { /// Maps a ProjectDescription.Config instance into a XcodeGraph.Config model. /// - Parameters: /// - manifest: Manifest representation of Tuist config. /// - path: The path of the config file. - static func from(manifest: ProjectDescription.Config, at path: AbsolutePath) throws -> XcodeGraph.Config { + static func from(manifest: ProjectDescription.Config, at path: AbsolutePath) throws -> TuistCore.Config { let generatorPaths = GeneratorPaths(manifestDirectory: path) - let generationOptions = try XcodeGraph.Config.GenerationOptions.from( + let generationOptions = try TuistCore.Config.GenerationOptions.from( manifest: manifest.generationOptions, generatorPaths: generatorPaths ) - let compatibleXcodeVersions = XcodeGraph.CompatibleXcodeVersions.from(manifest: manifest.compatibleXcodeVersions) + let compatibleXcodeVersions = TuistCore.CompatibleXcodeVersions.from(manifest: manifest.compatibleXcodeVersions) let plugins = try manifest.plugins.map { try PluginLocation.from(manifest: $0, generatorPaths: generatorPaths) } let swiftVersion: TSCUtility.Version? if let configuredVersion = manifest.swiftVersion { @@ -26,12 +26,12 @@ extension XcodeGraph.Config { swiftVersion = nil } - var cloud: XcodeGraph.Cloud? + var cloud: TuistCore.Cloud? if let manifestCloud = manifest.cloud { - cloud = try XcodeGraph.Cloud.from(manifest: manifestCloud) + cloud = try TuistCore.Cloud.from(manifest: manifestCloud) } - return XcodeGraph.Config( + return TuistCore.Config( compatibleXcodeVersions: compatibleXcodeVersions, cloud: cloud, swiftVersion: swiftVersion.map { .init(stringLiteral: $0.description) }, @@ -42,7 +42,7 @@ extension XcodeGraph.Config { } } -extension XcodeGraph.Config.GenerationOptions { +extension TuistCore.Config.GenerationOptions { /// Maps a ProjectDescription.Config.GenerationOptions instance into a XcodeGraph.Config.GenerationOptions model. /// - Parameters: /// - manifest: Manifest representation of Tuist config generation options @@ -50,7 +50,7 @@ extension XcodeGraph.Config.GenerationOptions { static func from( manifest: ProjectDescription.Config.GenerationOptions, generatorPaths: GeneratorPaths - ) throws -> XcodeGraph.Config.GenerationOptions { + ) throws -> TuistCore.Config.GenerationOptions { let clonedSourcePackagesDirPath: AbsolutePath? = try { if let path = manifest.clonedSourcePackagesDirPath { return try generatorPaths.resolve(path: path) @@ -62,7 +62,7 @@ extension XcodeGraph.Config.GenerationOptions { resolveDependenciesWithSystemScm: manifest.resolveDependenciesWithSystemScm, disablePackageVersionLocking: manifest.disablePackageVersionLocking, clonedSourcePackagesDirPath: clonedSourcePackagesDirPath, - staticSideEffectsWarningTargets: XcodeGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets + staticSideEffectsWarningTargets: TuistCore.Config.GenerationOptions.StaticSideEffectsWarningTargets .from(manifest: manifest.staticSideEffectsWarningTargets), enforceExplicitDependencies: manifest.enforceExplicitDependencies, defaultConfiguration: manifest.defaultConfiguration @@ -70,14 +70,14 @@ extension XcodeGraph.Config.GenerationOptions { } } -extension XcodeGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets { +extension TuistCore.Config.GenerationOptions.StaticSideEffectsWarningTargets { /// Maps a ProjectDescription.Config.GenerationOptions.StaticSideEffectsWarningTargets instance into a /// XcodeGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets model. /// - Parameters: /// - manifest: Manifest representation of Tuist config static side effects warning targets option static func from( manifest: ProjectDescription.Config.GenerationOptions.StaticSideEffectsWarningTargets - ) -> XcodeGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets { + ) -> TuistCore.Config.GenerationOptions.StaticSideEffectsWarningTargets { switch manifest { case .all: return .all case .none: return .none diff --git a/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift index a99a2b967b4..c0ca642c35e 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/PackageSettings+ManifestMapper.swift @@ -6,7 +6,7 @@ import TuistCore import TuistSupport import XcodeGraph -extension XcodeGraph.PackageSettings { +extension TuistCore.PackageSettings { /// Creates `XcodeGraph.PackageSettings` instance from `ProjectDescription.PackageSettings` /// instance. static func from( diff --git a/Sources/TuistLoader/Models+ManifestMappers/PluginLocation+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/PluginLocation+ManifestMapper.swift index 3069aedf71c..d5c40208fb5 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/PluginLocation+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/PluginLocation+ManifestMapper.swift @@ -1,13 +1,13 @@ import Foundation import ProjectDescription -import XcodeGraph +import TuistCore -extension XcodeGraph.PluginLocation { +extension TuistCore.PluginLocation { /// Convert from `ProjectDescription.PluginLocation` to `XcodeGraph.PluginLocation` static func from( manifest: ProjectDescription.PluginLocation, generatorPaths: GeneratorPaths - ) throws -> XcodeGraph.PluginLocation { + ) throws -> TuistCore.PluginLocation { switch manifest.type { case let .local(path): return .local(path: try generatorPaths.resolve(path: path).pathString) diff --git a/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift index 9400bbc4907..2290fbc7891 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift @@ -1,6 +1,7 @@ import Foundation import Path import ProjectDescription +import TuistCore import XcodeGraph extension XcodeGraph.Project { diff --git a/Sources/TuistLoader/Models+ManifestMappers/ResourceSynthesizer+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/ResourceSynthesizer+ManifestMapper.swift index f362cde38c1..945db504356 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/ResourceSynthesizer+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/ResourceSynthesizer+ManifestMapper.swift @@ -1,5 +1,6 @@ import Path import ProjectDescription +import TuistCore import XcodeGraph extension XcodeGraph.ResourceSynthesizer { diff --git a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift index 15e7d540654..83fa112b9a8 100644 --- a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift +++ b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift @@ -1,7 +1,7 @@ import Foundation import Path +import TuistCore import TuistSupport -import XcodeGraph /// This protocol defines the interface to compile a temporary module with the /// helper files under /Tuist/ProjectDescriptionHelpers that can be imported @@ -19,7 +19,7 @@ public protocol ProjectDescriptionHelpersBuilding: AnyObject { func build( at path: AbsolutePath, projectDescriptionSearchPaths: ProjectDescriptionSearchPaths, - projectDescriptionHelperPlugins: [ProjectDescriptionHelpersPlugin] + projectDescriptionHelperPlugins: [TuistCore.ProjectDescriptionHelpersPlugin] ) throws -> [ProjectDescriptionHelpersModule] /// Builds all the plugin helpers module and returns the location to the built modules. diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 942bb06429a..be6a8f5a5f4 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -111,7 +111,7 @@ public protocol PackageInfoMapping { packageInfo: PackageInfo, path: AbsolutePath, packageType: PackageType, - packageSettings: XcodeGraph.PackageSettings, + packageSettings: TuistCore.PackageSettings, packageToProject: [String: AbsolutePath] ) throws -> ProjectDescription.Project? } @@ -257,7 +257,7 @@ public final class PackageInfoMapper: PackageInfoMapping { packageInfo: PackageInfo, path: AbsolutePath, packageType: PackageType, - packageSettings: XcodeGraph.PackageSettings, + packageSettings: TuistCore.PackageSettings, packageToProject _: [String: AbsolutePath] ) throws -> ProjectDescription.Project? { // Hardcoded mapping for some well known libraries, until the logic can handle those properly diff --git a/Sources/TuistLoader/Utils/ResourceSynthesizerPathLocator.swift b/Sources/TuistLoader/Utils/ResourceSynthesizerPathLocator.swift index 1cefed97065..77a9ddd50d7 100644 --- a/Sources/TuistLoader/Utils/ResourceSynthesizerPathLocator.swift +++ b/Sources/TuistLoader/Utils/ResourceSynthesizerPathLocator.swift @@ -2,7 +2,6 @@ import Foundation import Path import TuistCore import TuistSupport -import XcodeGraph public protocol ResourceSynthesizerPathLocating { func locate(at: AbsolutePath) -> AbsolutePath? @@ -10,7 +9,7 @@ public protocol ResourceSynthesizerPathLocating { func templatePath( for pluginName: String, resourceName: String, - resourceSynthesizerPlugins: [PluginResourceSynthesizer] + resourceSynthesizerPlugins: [TuistCore.PluginResourceSynthesizer] ) throws -> AbsolutePath func templatePath( diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift index 3ccfde98967..ab9a0cf1df8 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift @@ -1,8 +1,8 @@ import Foundation import Path import ProjectDescription +import struct TuistCore.Plugins import TuistSupport -import struct XcodeGraph.Plugins @testable import TuistLoader @testable import TuistSupportTesting diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockPackageSettingsLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockPackageSettingsLoader.swift index b23a4dd543c..ee0d51f97f7 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockPackageSettingsLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockPackageSettingsLoader.swift @@ -1,7 +1,6 @@ import Path +import TuistCore import TuistSupport -import XcodeGraph -import XcodeGraphTesting @testable import TuistLoader diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift index a162400c28b..f9d5f615cda 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift @@ -1,7 +1,7 @@ import Foundation import Path +import TuistCore import TuistLoader -import XcodeGraph public final class MockTemplateGitLoader: TemplateGitLoading { public var loadTemplateStub: ((String) throws -> Template)? diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateLoader.swift index 74116dbb7f7..8d5f2baeae2 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateLoader.swift @@ -1,7 +1,7 @@ import Foundation import Path +import TuistCore import TuistLoader -import XcodeGraph public final class MockTemplateLoader: TemplateLoading { public var loadTemplateStub: ((AbsolutePath) throws -> Template)? diff --git a/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilder.swift b/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilder.swift index c517bb82e93..c3e2207dbac 100644 --- a/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilder.swift +++ b/Sources/TuistLoaderTesting/ProjectDescriptionHelpers/MockProjectDescriptionHelpersBuilder.swift @@ -1,7 +1,7 @@ import Foundation import Path +import TuistCore import TuistSupport -import XcodeGraph @testable import TuistLoader diff --git a/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceSynthesizerPathLocator.swift b/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceSynthesizerPathLocator.swift index ef43e9b7bf4..3ce9c86d88c 100644 --- a/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceSynthesizerPathLocator.swift +++ b/Sources/TuistLoaderTesting/Utils/Mocks/MockResourceSynthesizerPathLocator.swift @@ -1,6 +1,6 @@ import Foundation import Path -import XcodeGraph +import TuistCore @testable import TuistLoader public final class MockResourceSynthesizerPathLocator: ResourceSynthesizerPathLocating { diff --git a/Sources/TuistPlugin/PluginService.swift b/Sources/TuistPlugin/PluginService.swift index d28f2755eb2..1f69570b9dd 100644 --- a/Sources/TuistPlugin/PluginService.swift +++ b/Sources/TuistPlugin/PluginService.swift @@ -4,7 +4,6 @@ import TuistCore import TuistLoader import TuistScaffold import TuistSupport -import XcodeGraph /// Paths to remote plugin's code and artifacts. public struct RemotePluginPaths: Equatable, Hashable { diff --git a/Sources/TuistPluginTesting/MockPluginService.swift b/Sources/TuistPluginTesting/MockPluginService.swift index 53ace9af5a9..3849e1f12bb 100644 --- a/Sources/TuistPluginTesting/MockPluginService.swift +++ b/Sources/TuistPluginTesting/MockPluginService.swift @@ -1,5 +1,5 @@ +import TuistCore import TuistPlugin -import XcodeGraph public final class MockPluginService: PluginServicing { public init() {} diff --git a/Sources/TuistScaffold/TemplateGenerator.swift b/Sources/TuistScaffold/TemplateGenerator.swift index c2dbaf1e804..cbd05bca939 100644 --- a/Sources/TuistScaffold/TemplateGenerator.swift +++ b/Sources/TuistScaffold/TemplateGenerator.swift @@ -4,7 +4,6 @@ import PathKit import StencilSwiftKit import TuistCore import TuistSupport -import XcodeGraph /// Interface for generating content defined in template manifest public protocol TemplateGenerating { @@ -16,7 +15,7 @@ public protocol TemplateGenerating { func generate( template: Template, to destinationPath: AbsolutePath, - attributes: [String: XcodeGraph.Template.Attribute.Value] + attributes: [String: Template.Attribute.Value] ) throws } @@ -27,7 +26,7 @@ public final class TemplateGenerator: TemplateGenerating { public func generate( template: Template, to destinationPath: AbsolutePath, - attributes: [String: XcodeGraph.Template.Attribute.Value] + attributes: [String: Template.Attribute.Value] ) throws { let renderedItems = try renderItems( template: template, @@ -50,7 +49,7 @@ public final class TemplateGenerator: TemplateGenerating { /// Renders items' paths in format path_to_dir/{{ attribute_name }} with `attributes` private func renderItems( template: Template, - attributes: [String: XcodeGraph.Template.Attribute.Value] + attributes: [String: Template.Attribute.Value] ) throws -> [Template.Item] { let environment = stencilSwiftEnvironment() return try template.items.map { @@ -103,7 +102,7 @@ public final class TemplateGenerator: TemplateGenerating { /// Generate all `renderedItems` private func generateItems( renderedItems: [Template.Item], - attributes: [String: XcodeGraph.Template.Attribute.Value], + attributes: [String: Template.Attribute.Value], destinationPath: AbsolutePath ) throws { let environment = stencilSwiftEnvironment() @@ -156,7 +155,7 @@ public final class TemplateGenerator: TemplateGenerating { } } -extension [String: XcodeGraph.Template.Attribute.Value] { +extension [String: Template.Attribute.Value] { fileprivate var toStringAny: [String: Any] { reduce([:]) { partialResult, attribute in var result: [String: Any] = partialResult diff --git a/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplateGenerator.swift b/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplateGenerator.swift index 960d8a5336d..7027ca5eea9 100644 --- a/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplateGenerator.swift +++ b/Sources/TuistScaffoldTesting/Utils/Mocks/MockTemplateGenerator.swift @@ -1,17 +1,16 @@ import Foundation import Path -import XcodeGraph +import TuistCore -@testable import TuistCore @testable import TuistScaffold public final class MockTemplateGenerator: TemplateGenerating { - public var generateStub: ((Template, AbsolutePath, [String: XcodeGraph.Template.Attribute.Value]) throws -> Void)? + public var generateStub: ((Template, AbsolutePath, [String: TuistCore.Template.Attribute.Value]) throws -> Void)? public func generate( template: Template, to destinationPath: AbsolutePath, - attributes: [String: XcodeGraph.Template.Attribute.Value] + attributes: [String: TuistCore.Template.Attribute.Value] ) throws { try generateStub?(template, destinationPath, attributes) } diff --git a/Sources/TuistServer/Cache/EmptyCacheStorageFactory.swift b/Sources/TuistServer/Cache/EmptyCacheStorageFactory.swift index ff4701308b7..3cdb04c36a2 100644 --- a/Sources/TuistServer/Cache/EmptyCacheStorageFactory.swift +++ b/Sources/TuistServer/Cache/EmptyCacheStorageFactory.swift @@ -1,5 +1,5 @@ import Foundation -import XcodeGraph +import TuistCore public final class EmptyCacheStorageFactory: CacheStorageFactorying { public init() {} diff --git a/Sources/XcodeGraph/DependenciesGraph/DependenciesGraph.swift b/Sources/XcodeGraph/DependenciesGraph/DependenciesGraph.swift deleted file mode 100644 index f9927f0ac35..00000000000 --- a/Sources/XcodeGraph/DependenciesGraph/DependenciesGraph.swift +++ /dev/null @@ -1,21 +0,0 @@ -import Path -import TuistSupport - -/// A directed acyclic graph (DAG) that Tuist uses to represent the dependency tree. -public struct DependenciesGraph: Equatable, Codable { - /// A dictionary where the keys are the supported platforms and the values are dictionaries where the keys are the names of - /// dependencies, and the values are the dependencies themselves. - public let externalDependencies: [String: [TargetDependency]] - - /// A dictionary where the keys are the folder of external projects, and the values are the projects themselves. - public let externalProjects: [AbsolutePath: Project] - - /// Create an instance of `DependenciesGraph` model. - public init(externalDependencies: [String: [TargetDependency]], externalProjects: [AbsolutePath: Project]) { - self.externalDependencies = externalDependencies - self.externalProjects = externalProjects - } - - /// An empty `DependenciesGraph`. - public static let none: DependenciesGraph = .init(externalDependencies: [:], externalProjects: [:]) -} diff --git a/Sources/XcodeGraph/Graph/ConditionalGraphTarget.swift b/Sources/XcodeGraph/Graph/ConditionalGraphTarget.swift deleted file mode 100644 index e132261208a..00000000000 --- a/Sources/XcodeGraph/Graph/ConditionalGraphTarget.swift +++ /dev/null @@ -1,49 +0,0 @@ -import Foundation -import Path - -public struct GraphTargetReference: Equatable, Comparable, Hashable, CustomDebugStringConvertible, CustomStringConvertible, - Codable -{ - /// Path to the directory that contains the project where the target is defined. - public let graphTarget: GraphTarget - - public var target: Target { graphTarget.target } - - /// Platforms the target is conditionally deployed to. - public let condition: PlatformCondition? - - public init(target: GraphTarget, condition: PlatformCondition? = nil) { - graphTarget = target - self.condition = condition - } - - public static func < (lhs: GraphTargetReference, rhs: GraphTargetReference) -> Bool { - lhs.graphTarget < rhs.graphTarget -// guard let -// return (lhs.condition, lhs.graphTarget) < (rhs.condtion, rhs.graphTarget) -// -// -// switch (lhs.condition, rhs.condition) { -// case (let lhsCondtion, let rhsCondtion): -// return (lhsCondition, lhs.graphTarget) < (rhsCondtion, rhs.graphTarget) -// case -// } - } - - // MARK: - CustomDebugStringConvertible/CustomStringConvertible - - public var debugDescription: String { - description - } - - public var description: String { - "Target '\(target.name)' at path '\(graphTarget.project.path)'" - } -} - -// -// extension GraphTarget { -// public func reference(_ condition: PlatformCondition?) -> GraphTargetReference { -// return GraphTargetReference(target: self, condition: condition) -// } -// } diff --git a/Sources/XcodeGraph/Graph/Graph.swift b/Sources/XcodeGraph/Graph/Graph.swift deleted file mode 100644 index 033b95abe50..00000000000 --- a/Sources/XcodeGraph/Graph/Graph.swift +++ /dev/null @@ -1,67 +0,0 @@ -import Foundation -import Path - -/// A directed acyclic graph (DAG) that Tuist uses to represent the dependency tree. -public struct Graph: Equatable, Codable { - /// The name of the graph - public var name: String - - /// The path where the graph has been loaded from. - public var path: AbsolutePath - - /// Graph's workspace. - public var workspace: Workspace - - /// A dictionary where the keys are the paths to the directories where the projects are defined, - /// and the values are the projects defined in the directories. - public var projects: [AbsolutePath: Project] - - /// A dictionary where the keys are paths to the directories where the projects that contain packages are defined, - /// and the values are dictionaries where the key is the reference to the package, and the values are the packages. - public var packages: [AbsolutePath: [String: Package]] - - /// A dictionary that contains the one-to-many dependencies that represent the graph. - public var dependencies: [GraphDependency: Set] - - /// A dictionary that contains the Conditions to apply to a dependency relationship - public var dependencyConditions: [GraphEdge: PlatformCondition] - - public init( - name: String, - path: AbsolutePath, - workspace: Workspace, - projects: [AbsolutePath: Project], - packages: [AbsolutePath: [String: Package]], - dependencies: [GraphDependency: Set], - dependencyConditions: [GraphEdge: PlatformCondition] - ) { - self.name = name - self.path = path - self.workspace = workspace - self.projects = projects - self.packages = packages - self.dependencies = dependencies - self.dependencyConditions = dependencyConditions - } -} - -/// Convenience accessors to work with `GraphTarget` and `GraphDependency` types while traversing the graph -extension [GraphEdge: PlatformCondition] { - public subscript(_ edge: (GraphDependency, GraphDependency)) -> PlatformCondition? { - get { - self[GraphEdge(from: edge.0, to: edge.1)] - } - set { - self[GraphEdge(from: edge.0, to: edge.1)] = newValue - } - } - - public subscript(_ edge: (GraphDependency, GraphTarget)) -> PlatformCondition? { - get { - self[GraphEdge(from: edge.0, to: edge.1)] - } - set { - self[GraphEdge(from: edge.0, to: edge.1)] = newValue - } - } -} diff --git a/Sources/XcodeGraph/Graph/GraphDependency.swift b/Sources/XcodeGraph/Graph/GraphDependency.swift deleted file mode 100644 index 870b73c4cce..00000000000 --- a/Sources/XcodeGraph/Graph/GraphDependency.swift +++ /dev/null @@ -1,284 +0,0 @@ -import Foundation -import Path - -public enum GraphDependency: Hashable, CustomStringConvertible, Comparable, Codable { - public struct XCFramework: Hashable, CustomStringConvertible, Comparable, Codable { - public let path: AbsolutePath - public let infoPlist: XCFrameworkInfoPlist - public let primaryBinaryPath: AbsolutePath - public let linking: BinaryLinking - public let mergeable: Bool - public let status: FrameworkStatus - - public init( - path: AbsolutePath, - infoPlist: XCFrameworkInfoPlist, - primaryBinaryPath: AbsolutePath, - linking: BinaryLinking, - mergeable: Bool, - status: FrameworkStatus, - macroPath _: AbsolutePath? - ) { - self.path = path - self.infoPlist = infoPlist - self.primaryBinaryPath = primaryBinaryPath - self.linking = linking - self.mergeable = mergeable - self.status = status - } - - public var description: String { - "xcframework '\(path.basename)'" - } - - public static func < (lhs: GraphDependency.XCFramework, rhs: GraphDependency.XCFramework) -> Bool { - lhs.description < rhs.description - } - } - - public enum PackageProductType: String, Hashable, CustomStringConvertible, Comparable, Codable { - public var description: String { - rawValue - } - - case runtime = "runtime package product" - case plugin = "plugin package product" - case macro = "macro package product" - - public static func < (lhs: PackageProductType, rhs: PackageProductType) -> Bool { - lhs.description < rhs.description - } - } - - case xcframework(GraphDependency.XCFramework) - - /// A dependency that represents a pre-compiled framework. - case framework( - path: AbsolutePath, - binaryPath: AbsolutePath, - dsymPath: AbsolutePath?, - bcsymbolmapPaths: [AbsolutePath], - linking: BinaryLinking, - architectures: [BinaryArchitecture], - status: FrameworkStatus - ) - - /// A dependency that represents a pre-compiled library. - case library( - path: AbsolutePath, - publicHeaders: AbsolutePath, - linking: BinaryLinking, - architectures: [BinaryArchitecture], - swiftModuleMap: AbsolutePath? - ) - - /// A macOS executable that represents a macro - case macro(path: AbsolutePath) - - /// A dependency that represents a pre-compiled bundle. - case bundle(path: AbsolutePath) - - /// A dependency that represents a package product. - case packageProduct(path: AbsolutePath, product: String, type: PackageProductType) - - /// A dependency that represents a target that is defined in the project at the given path. - case target(name: String, path: AbsolutePath) - - /// A dependency that represents an SDK - case sdk(name: String, path: AbsolutePath, status: SDKStatus, source: SDKSource) - - public func hash(into hasher: inout Hasher) { - switch self { - case let .macro(path): - hasher.combine(path) - case let .xcframework(xcframework): - hasher.combine(xcframework) - case let .framework(path, _, _, _, _, _, _): - hasher.combine("framework") - hasher.combine(path) - case let .library(path, _, _, _, _): - hasher.combine("library") - hasher.combine(path) - case let .bundle(path): - hasher.combine("bundle") - hasher.combine(path) - case let .packageProduct(path, product, isPlugin): - hasher.combine("package") - hasher.combine(path) - hasher.combine(product) - hasher.combine(isPlugin) - case let .target(name, path): - hasher.combine("target") - hasher.combine(name) - hasher.combine(path) - case let .sdk(name, path, status, source): - hasher.combine("sdk") - hasher.combine(name) - hasher.combine(path) - hasher.combine(status) - hasher.combine(source) - } - } - - public var isTarget: Bool { - switch self { - case .macro: return false - case .xcframework: return false - case .framework: return false - case .library: return false - case .bundle: return false - case .packageProduct: return false - case .target: return true - case .sdk: return false - } - } - - /** - When the graph dependency represents a pre-compiled static binary. - */ - public var isStaticPrecompiled: Bool { - switch self { - case .macro: return false - case let .xcframework(xcframework): - return xcframework.linking == .static - case let .framework(_, _, _, _, linking, _, _), - let .library(_, _, linking, _, _): return linking == .static - case .bundle: return false - case .packageProduct: return false - case .target: return false - case .sdk: return false - } - } - - /** - When the graph dependency represents a dynamic precompiled binary, it returns true. - */ - public var isDynamicPrecompiled: Bool { - switch self { - case .macro: return false - case let .xcframework(xcframework): - return xcframework.linking == .dynamic - case let .framework(_, _, _, _, linking, _, _), - let .library(_, _, linking, _, _): return linking == .dynamic - case .bundle: return false - case .packageProduct: return false - case .target: return false - case .sdk: return false - } - } - - public var isPrecompiled: Bool { - switch self { - case .macro: return true - case .xcframework: return true - case .framework: return true - case .library: return true - case .bundle: return true - case .packageProduct: return false - case .target: return false - case .sdk: return false - } - } - - public var isLinkable: Bool { - switch self { - case .macro: return false - case .xcframework: return true - case .framework: return true - case .library: return true - case .bundle: return false - case .packageProduct: return true - case .target: return true - case .sdk: return true - } - } - - public var isPrecompiledMacro: Bool { - switch self { - case .macro: return true - case .xcframework: return false - case .framework: return false - case .library: return false - case .bundle: return false - case .packageProduct: return false - case .target: return false - case .sdk: return false - } - } - - public var isPrecompiledDynamicAndLinkable: Bool { - switch self { - case .macro: return false - case let .xcframework(xcframework): - return xcframework.linking == .dynamic - case let .framework(_, _, _, _, linking, _, _), - let .library(path: _, publicHeaders: _, linking: linking, architectures: _, swiftModuleMap: _): - return linking == .dynamic - case .bundle: return false - case .packageProduct: return false - case .target: return false - case .sdk: return false - } - } - - // MARK: - Internal - - public var targetDependency: (name: String, path: AbsolutePath)? { - switch self { - case let .target(name: name, path: path): - return (name, path) - default: - return nil - } - } - - // MARK: - CustomStringConvertible - - public var description: String { - switch self { - case .macro: - return "macro '\(name)'" - case .xcframework: - return "xcframework '\(name)'" - case .framework: - return "framework '\(name)'" - case .library: - return "library '\(name)'" - case .bundle: - return "bundle '\(name)'" - case .packageProduct: - return "package '\(name)'" - case .target: - return "target '\(name)'" - case .sdk: - return "sdk '\(name)'" - } - } - - public var name: String { - switch self { - case let .macro(path): - return path.basename - case let .xcframework(xcframework): - return xcframework.path.basename - case let .framework(path, _, _, _, _, _, _): - return path.basename - case let .library(path, _, _, _, _): - return path.basename - case let .bundle(path): - return path.basename - case let .packageProduct(_, product, _): - return product - case let .target(name, _): - return name - case let .sdk(name, _, _, _): - return name - } - } - - // MARK: - Comparable - - public static func < (lhs: GraphDependency, rhs: GraphDependency) -> Bool { - lhs.description < rhs.description - } -} diff --git a/Sources/XcodeGraph/Graph/GraphTarget.swift b/Sources/XcodeGraph/Graph/GraphTarget.swift deleted file mode 100644 index a2126db3812..00000000000 --- a/Sources/XcodeGraph/Graph/GraphTarget.swift +++ /dev/null @@ -1,33 +0,0 @@ -import Foundation -import Path - -public struct GraphTarget: Equatable, Hashable, Comparable, CustomDebugStringConvertible, CustomStringConvertible, Codable { - /// Path to the directory that contains the project where the target is defined. - public let path: AbsolutePath - - /// Target representation. - public let target: Target - - /// Project that contains the target. - public let project: Project - - public init(path: AbsolutePath, target: Target, project: Project) { - self.path = path - self.target = target - self.project = project - } - - public static func < (lhs: GraphTarget, rhs: GraphTarget) -> Bool { - (lhs.path, lhs.target) < (rhs.path, rhs.target) - } - - // MARK: - CustomDebugStringConvertible/CustomStringConvertible - - public var debugDescription: String { - description - } - - public var description: String { - "Target '\(target.name)' at path '\(project.path)'" - } -} diff --git a/Sources/XcodeGraph/Models/ArchiveAction.swift b/Sources/XcodeGraph/Models/ArchiveAction.swift deleted file mode 100644 index da727bb996d..00000000000 --- a/Sources/XcodeGraph/Models/ArchiveAction.swift +++ /dev/null @@ -1,28 +0,0 @@ -import Foundation -import Path - -public struct ArchiveAction: Equatable, Codable { - // MARK: - Attributes - - public let configurationName: String - public let revealArchiveInOrganizer: Bool - public let customArchiveName: String? - public let preActions: [ExecutionAction] - public let postActions: [ExecutionAction] - - // MARK: - Init - - public init( - configurationName: String, - revealArchiveInOrganizer: Bool = true, - customArchiveName: String? = nil, - preActions: [ExecutionAction] = [], - postActions: [ExecutionAction] = [] - ) { - self.configurationName = configurationName - self.revealArchiveInOrganizer = revealArchiveInOrganizer - self.customArchiveName = customArchiveName - self.preActions = preActions - self.postActions = postActions - } -} diff --git a/Sources/XcodeGraph/Models/BuildAction.swift b/Sources/XcodeGraph/Models/BuildAction.swift deleted file mode 100644 index e539571ecba..00000000000 --- a/Sources/XcodeGraph/Models/BuildAction.swift +++ /dev/null @@ -1,25 +0,0 @@ -import Foundation -import Path - -public struct BuildAction: Equatable, Codable { - // MARK: - Attributes - - public var targets: [TargetReference] - public var preActions: [ExecutionAction] - public var postActions: [ExecutionAction] - public var runPostActionsOnFailure: Bool - - // MARK: - Init - - public init( - targets: [TargetReference] = [], - preActions: [ExecutionAction] = [], - postActions: [ExecutionAction] = [], - runPostActionsOnFailure: Bool = false - ) { - self.targets = targets - self.preActions = preActions - self.postActions = postActions - self.runPostActionsOnFailure = runPostActionsOnFailure - } -} diff --git a/Sources/XcodeGraph/Models/CopyFileElement.swift b/Sources/XcodeGraph/Models/CopyFileElement.swift deleted file mode 100644 index 649599e385f..00000000000 --- a/Sources/XcodeGraph/Models/CopyFileElement.swift +++ /dev/null @@ -1,39 +0,0 @@ -import Foundation -import Path - -public enum CopyFileElement: Equatable, Hashable, Codable { - case file(path: AbsolutePath, condition: PlatformCondition? = nil, codeSignOnCopy: Bool = false) - case folderReference(path: AbsolutePath, condition: PlatformCondition? = nil, codeSignOnCopy: Bool = false) - - public var path: AbsolutePath { - switch self { - case let .file(path, _, _): - return path - case let .folderReference(path, _, _): - return path - } - } - - public var isReference: Bool { - switch self { - case .file: - return false - case .folderReference: - return true - } - } - - public var condition: PlatformCondition? { - switch self { - case let .file(_, condition, _), let .folderReference(_, condition, _): - return condition - } - } - - public var codeSignOnCopy: Bool { - switch self { - case let .file(_, _, codeSignOnCopy), let .folderReference(_, _, codeSignOnCopy): - return codeSignOnCopy - } - } -} diff --git a/Sources/XcodeGraph/Models/CopyFilesAction.swift b/Sources/XcodeGraph/Models/CopyFilesAction.swift deleted file mode 100644 index d61b35d68e3..00000000000 --- a/Sources/XcodeGraph/Models/CopyFilesAction.swift +++ /dev/null @@ -1,43 +0,0 @@ -import Foundation -import Path - -public struct CopyFilesAction: Equatable, Codable { - /// Name of the build phase when the project gets generated. - public var name: String - - /// Destination to copy files to. - public var destination: Destination - - /// Path to a folder inside the destination. - public var subpath: String? - - /// Relative paths to the files to be copied. - public var files: [CopyFileElement] - - /// Destination path. - public enum Destination: String, Equatable, Codable { - case absolutePath - case productsDirectory - case wrapper - case executables - case resources - case javaResources - case frameworks - case sharedFrameworks - case sharedSupport - case plugins - case other - } - - public init( - name: String, - destination: Destination, - subpath: String? = nil, - files: [CopyFileElement] - ) { - self.name = name - self.destination = destination - self.subpath = subpath - self.files = files - } -} diff --git a/Sources/XcodeGraph/Models/CoreDataModel.swift b/Sources/XcodeGraph/Models/CoreDataModel.swift deleted file mode 100644 index b17b74e293c..00000000000 --- a/Sources/XcodeGraph/Models/CoreDataModel.swift +++ /dev/null @@ -1,28 +0,0 @@ -import Foundation -import Path - -/// Represents a Core Data model -public struct CoreDataModel: Equatable, Codable { - // MARK: - Attributes - - /// Relative path to the Core Data model. - public let path: AbsolutePath - - /// Paths to the versions. - public let versions: [AbsolutePath] - - /// Current version without the extension. - public let currentVersion: String - - // MARK: - Init - - public init( - path: AbsolutePath, - versions: [AbsolutePath], - currentVersion: String - ) { - self.path = path - self.versions = versions - self.currentVersion = currentVersion - } -} diff --git a/Sources/XcodeGraph/Models/Dependencies/SwiftPackageManagerDependencies.swift b/Sources/XcodeGraph/Models/Dependencies/SwiftPackageManagerDependencies.swift deleted file mode 100644 index e61900ab763..00000000000 --- a/Sources/XcodeGraph/Models/Dependencies/SwiftPackageManagerDependencies.swift +++ /dev/null @@ -1,135 +0,0 @@ -import Foundation -import Path - -public enum PackagesOrManifest: Equatable { - case packages([Package]) - case manifest -} - -/// Contains the description of a dependency that can be installed using Swift Package Manager. -public struct SwiftPackageManagerDependencies: Equatable { - /// The path to the `Package.swift` manifest defining the dependencies, or the list of packages that will be installed using - /// Swift Package Manager. - public let packagesOrManifest: PackagesOrManifest - - /// The custom `Product` types to be used for SPM targets. - public let productTypes: [String: Product] - - // The base settings to be used for targets generated from SwiftPackageManager - public let baseSettings: Settings - - /// The custom `Settings` to be applied to SPM targets - public let targetSettings: [String: SettingsDictionary] - - /// The custom project options for each project generated from a swift package - public let projectOptions: [String: XcodeGraph.Project.Options] - - /// Initializes a new `SwiftPackageManagerDependencies` instance. - /// - Parameters: - /// - packagesOrManifest: The path to the `Package.swift` manifest defining the dependencies, or the list of packages - /// that will be installed using Swift Package Manager. - /// - productTypes: The custom `Product` types to be used for SPM targets. - /// - baseSettings: The base settings to be used for targets generated from SwiftPackageManager - /// - targetSettings: The custom `SettingsDictionary` to be applied to denoted targets - /// - projectOptions: The custom project options for each project generated from a swift package - - public init( - _ packagesOrManifest: PackagesOrManifest, - productTypes: [String: Product], - baseSettings: Settings, - targetSettings: [String: SettingsDictionary], - projectOptions: [String: XcodeGraph.Project.Options] = [:] - ) { - self.packagesOrManifest = packagesOrManifest - self.productTypes = productTypes - self.baseSettings = baseSettings - self.targetSettings = targetSettings - self.projectOptions = projectOptions - } -} - -extension SwiftPackageManagerDependencies { - public enum Manifest: Equatable { - case content(String) - case manifest - } - - /// Returns `Package.swift` representation. - public func manifest(isLegacy: Bool, packageManifestFolder: AbsolutePath) -> Manifest { - switch packagesOrManifest { - case let .packages(packages): - return .content( - """ - import PackageDescription - - let package = Package( - name: "PackageName", - dependencies: [ - \(packages.map { - let manifest = $0.manifestValue(isLegacy: isLegacy, packageManifestFolder: packageManifestFolder) - return manifest + "," - }.joined(separator: "\n ")) - ] - ) - """ - ) - case .manifest: - return .manifest - } - } -} - -// MARK: - Package.manifestValue() - -extension Package { - /// Returns `Package.swift` representation. - fileprivate func manifestValue(isLegacy: Bool, packageManifestFolder: AbsolutePath) -> String { - switch self { - case let .local(path): - return #".package(path: "\#(path.relative(to: packageManifestFolder))")"# - case let .remote(url, requirement): - let requirementManifestValue = isLegacy ? requirement.legacyManifestValue : requirement.manifestValue - return #".package(url: "\#(url)", \#(requirementManifestValue))"# - } - } -} - -// MARK: - Requirement.manifestValue() - -extension Requirement { - /// Returns `Package.swift` representation. - fileprivate var manifestValue: String { - switch self { - case let .exact(version): - return #"exact: "\#(version)""# - case let .upToNextMajor(version): - return #"from: "\#(version)""# - case let .upToNextMinor(version): - return #".upToNextMinor(from: "\#(version)")"# - case let .branch(branch): - return #"branch: "\#(branch)""# - case let .revision(revision): - return #"revision: "\#(revision)""# - case let .range(from, to): - return #""\#(from)" ..< "\#(to)""# - } - } - - /// Returns legacy `Package.swift` representation. - fileprivate var legacyManifestValue: String { - switch self { - case let .exact(version): - return #".exact("\#(version)")"# - case let .upToNextMajor(version): - return #".upToNextMajor(from: "\#(version)")"# - case let .upToNextMinor(version): - return #".upToNextMinor(from: "\#(version)")"# - case let .branch(branch): - return #".branch("\#(branch)")"# - case let .revision(revision): - return #".revision("\#(revision)")"# - case let .range(from, to): - return #""\#(from)" ..< "\#(to)""# - } - } -} diff --git a/Sources/XcodeGraph/Models/ExecutionAction.swift b/Sources/XcodeGraph/Models/ExecutionAction.swift deleted file mode 100644 index 5c1f97379be..00000000000 --- a/Sources/XcodeGraph/Models/ExecutionAction.swift +++ /dev/null @@ -1,34 +0,0 @@ -import Foundation -import Path - -/// A execution action -public struct ExecutionAction: Equatable, Codable { - // MARK: - Attributes - - /// Name of a script. - public let title: String - /// An inline shell script. - public let scriptText: String - /// Name of the build or test target that will provide the action's build settings. - public let target: TargetReference? - /// The path to the shell which shall execute this script. if it is nil, Xcode will use default value. - public let shellPath: String? - - public let showEnvVarsInLog: Bool - - // MARK: - Init - - public init( - title: String, - scriptText: String, - target: TargetReference?, - shellPath: String?, - showEnvVarsInLog: Bool = true - ) { - self.title = title - self.scriptText = scriptText - self.target = target - self.shellPath = shellPath - self.showEnvVarsInLog = showEnvVarsInLog - } -} diff --git a/Sources/XcodeGraph/Models/FileElement.swift b/Sources/XcodeGraph/Models/FileElement.swift deleted file mode 100644 index f7fe037934f..00000000000 --- a/Sources/XcodeGraph/Models/FileElement.swift +++ /dev/null @@ -1,25 +0,0 @@ -import Foundation -import Path - -public enum FileElement: Equatable, Hashable, Codable { - case file(path: AbsolutePath) - case folderReference(path: AbsolutePath) - - public var path: AbsolutePath { - switch self { - case let .file(path): - return path - case let .folderReference(path): - return path - } - } - - public var isReference: Bool { - switch self { - case .file: - return false - case .folderReference: - return true - } - } -} diff --git a/Sources/XcodeGraph/Models/Headers.swift b/Sources/XcodeGraph/Models/Headers.swift deleted file mode 100644 index 85e76eacbb4..00000000000 --- a/Sources/XcodeGraph/Models/Headers.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation -import Path - -/// Headers -public struct Headers: Equatable, Codable { - // MARK: - Attributes - - public let `public`: [AbsolutePath] - public let `private`: [AbsolutePath] - public let project: [AbsolutePath] - - // MARK: - Init - - public init( - public: [AbsolutePath], - private: [AbsolutePath], - project: [AbsolutePath] - ) { - self.public = `public` - self.private = `private` - self.project = project - } -} diff --git a/Sources/XcodeGraph/Models/Metadata/FrameworkMetadata.swift b/Sources/XcodeGraph/Models/Metadata/FrameworkMetadata.swift deleted file mode 100644 index d1bf70b626b..00000000000 --- a/Sources/XcodeGraph/Models/Metadata/FrameworkMetadata.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation -import Path - -/// The metadata associated with a precompiled framework (.framework) -public struct FrameworkMetadata: Equatable { - public var path: AbsolutePath - public var binaryPath: AbsolutePath - public var dsymPath: AbsolutePath? - public var bcsymbolmapPaths: [AbsolutePath] - public var linking: BinaryLinking - public var architectures: [BinaryArchitecture] - public var status: FrameworkStatus - - public init( - path: AbsolutePath, - binaryPath: AbsolutePath, - dsymPath: AbsolutePath?, - bcsymbolmapPaths: [AbsolutePath], - linking: BinaryLinking, - architectures: [BinaryArchitecture], - status: FrameworkStatus - ) { - self.path = path - self.binaryPath = binaryPath - self.dsymPath = dsymPath - self.bcsymbolmapPaths = bcsymbolmapPaths - self.linking = linking - self.architectures = architectures - self.status = status - } -} diff --git a/Sources/XcodeGraph/Models/Metadata/LibraryMetadata.swift b/Sources/XcodeGraph/Models/Metadata/LibraryMetadata.swift deleted file mode 100644 index c8aad5cc99a..00000000000 --- a/Sources/XcodeGraph/Models/Metadata/LibraryMetadata.swift +++ /dev/null @@ -1,25 +0,0 @@ -import Foundation -import Path - -/// The metadata associated with a precompiled library (.a / .dylib) -public struct LibraryMetadata: Equatable { - public var path: AbsolutePath - public var publicHeaders: AbsolutePath - public var swiftModuleMap: AbsolutePath? - public var architectures: [BinaryArchitecture] - public var linking: BinaryLinking - - public init( - path: AbsolutePath, - publicHeaders: AbsolutePath, - swiftModuleMap: AbsolutePath?, - architectures: [BinaryArchitecture], - linking: BinaryLinking - ) { - self.path = path - self.publicHeaders = publicHeaders - self.swiftModuleMap = swiftModuleMap - self.architectures = architectures - self.linking = linking - } -} diff --git a/Sources/XcodeGraph/Models/Metadata/SystemFrameworkMetadata.swift b/Sources/XcodeGraph/Models/Metadata/SystemFrameworkMetadata.swift deleted file mode 100644 index fa82494069c..00000000000 --- a/Sources/XcodeGraph/Models/Metadata/SystemFrameworkMetadata.swift +++ /dev/null @@ -1,22 +0,0 @@ -import Foundation -import Path - -/// The metadata associated with a system framework or library (e.g. UIKit.framework, libc++.tbd) -public struct SystemFrameworkMetadata: Equatable { - public var name: String - public var path: AbsolutePath - public var status: SDKStatus - public var source: SDKSource - - public init( - name: String, - path: AbsolutePath, - status: SDKStatus, - source: SDKSource - ) { - self.name = name - self.path = path - self.status = status - self.source = source - } -} diff --git a/Sources/XcodeGraph/Models/Metadata/XCFrameworkMetadata.swift b/Sources/XcodeGraph/Models/Metadata/XCFrameworkMetadata.swift deleted file mode 100644 index 707bfa74ae8..00000000000 --- a/Sources/XcodeGraph/Models/Metadata/XCFrameworkMetadata.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation -import Path - -/// The metadata associated with a precompiled xcframework -public struct XCFrameworkMetadata: Equatable { - public var path: AbsolutePath - public var infoPlist: XCFrameworkInfoPlist - public var primaryBinaryPath: AbsolutePath - public var linking: BinaryLinking - public var mergeable: Bool - public var status: FrameworkStatus - public var macroPath: AbsolutePath? - - public init( - path: AbsolutePath, - infoPlist: XCFrameworkInfoPlist, - primaryBinaryPath: AbsolutePath, - linking: BinaryLinking, - mergeable: Bool, - status: FrameworkStatus, - macroPath: AbsolutePath? - ) { - self.path = path - self.infoPlist = infoPlist - self.primaryBinaryPath = primaryBinaryPath - self.linking = linking - self.mergeable = mergeable - self.status = status - self.macroPath = macroPath - } -} diff --git a/Sources/XcodeGraph/Models/Package.swift b/Sources/XcodeGraph/Models/Package.swift deleted file mode 100644 index ac4aab84164..00000000000 --- a/Sources/XcodeGraph/Models/Package.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation -import Path - -public enum Package: Equatable, Codable { - case remote(url: String, requirement: Requirement) - case local(path: AbsolutePath) -} - -extension XcodeGraph.Package { - public var isRemote: Bool { - switch self { - case .remote: - return true - case .local: - return false - } - } -} diff --git a/Sources/XcodeGraph/Models/PlatformCondition.swift b/Sources/XcodeGraph/Models/PlatformCondition.swift deleted file mode 100644 index 9709766f436..00000000000 --- a/Sources/XcodeGraph/Models/PlatformCondition.swift +++ /dev/null @@ -1,64 +0,0 @@ -import Foundation -import Path - -public struct PlatformCondition: Codable, Hashable, Equatable, Comparable { - public static func < (lhs: PlatformCondition, rhs: PlatformCondition) -> Bool { - lhs.platformFilters < rhs.platformFilters - } - - public static func < (lhs: PlatformCondition, rhs: PlatformCondition?) -> Bool { - guard let rhsFilters = rhs?.platformFilters else { return false } - return lhs.platformFilters < rhsFilters - } - - public let platformFilters: PlatformFilters - private init(platformFilters: PlatformFilters) { - self.platformFilters = platformFilters - } - - public static func when(_ platformFilters: Set) -> PlatformCondition? { - guard !platformFilters.isEmpty else { return nil } - return PlatformCondition(platformFilters: platformFilters) - } - - public func intersection(_ other: PlatformCondition?) -> CombinationResult { - guard let otherFilters = other?.platformFilters else { return .condition(self) } - let filters = platformFilters.intersection(otherFilters) - - if filters.isEmpty { - return .incompatible - } else { - return .condition(PlatformCondition(platformFilters: filters)) - } - } - - public func union(_ other: PlatformCondition?) -> CombinationResult { - guard let otherFilters = other?.platformFilters else { return .condition(nil) } - let filters = platformFilters.union(otherFilters) - - if filters.isEmpty { - return .condition(nil) - } else { - return .condition(PlatformCondition(platformFilters: filters)) - } - } - - public enum CombinationResult: Equatable { - case incompatible - case condition(PlatformCondition?) - - public func combineWith(_ other: CombinationResult) -> CombinationResult { - switch (self, other) { - case (.incompatible, .incompatible): - return .incompatible - case (_, .incompatible): - return self - case (.incompatible, _): - return other - case let (.condition(lhs), .condition(rhs)): - guard let lhs, let rhs else { return .condition(nil) } - return lhs.union(rhs) - } - } - } -} diff --git a/Sources/XcodeGraph/Models/Plist.swift b/Sources/XcodeGraph/Models/Plist.swift deleted file mode 100644 index 1ac2ff82ab2..00000000000 --- a/Sources/XcodeGraph/Models/Plist.swift +++ /dev/null @@ -1,168 +0,0 @@ -import Foundation -import Path - -// MARK: - Plist - -public enum Plist { - case infoPlist(InfoPlist) - case entitlements(Entitlements) - - public indirect enum Value: Equatable, Codable { - case string(String) - case integer(Int) - case real(Double) - case boolean(Bool) - case dictionary([String: Value]) - case array([Value]) - - public var value: Any { - switch self { - case let .array(array): - return array.map(\.value) - case let .boolean(boolean): - return boolean - case let .dictionary(dictionary): - return dictionary.mapValues { $0.value } - case let .integer(integer): - return integer - case let .string(string): - return string - case let .real(double): - return double - } - } - } -} - -// MARK: - Plist.Value - ExpressibleByStringLiteral - -extension Plist.Value: ExpressibleByStringLiteral { - public init(stringLiteral value: String) { - self = .string(value) - } -} - -// MARK: - Plist.Value - ExpressibleByIntegerLiteral - -extension Plist.Value: ExpressibleByIntegerLiteral { - public init(integerLiteral value: Int) { - self = .integer(value) - } -} - -// MARK: - Plist.Value - ExpressibleByIntegerLiteral - -extension Plist.Value: ExpressibleByFloatLiteral { - public init(floatLiteral value: Double) { - self = .real(value) - } -} - -// MARK: - Plist.Value - ExpressibleByBooleanLiteral - -extension Plist.Value: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = .boolean(value) - } -} - -// MARK: - Plist.Value - ExpressibleByDictionaryLiteral - -extension Plist.Value: ExpressibleByDictionaryLiteral { - public init(dictionaryLiteral elements: (String, Plist.Value)...) { - self = .dictionary(Dictionary(uniqueKeysWithValues: elements)) - } -} - -// MARK: - Plist.Value - ExpressibleByArrayLiteral - -extension Plist.Value: ExpressibleByArrayLiteral { - public init(arrayLiteral elements: Plist.Value...) { - self = .array(elements) - } -} - -// MARK: - Dictionary (Plist.Value) - -extension Dictionary where Value == Plist.Value { - public func unwrappingValues() -> [Key: Any] { - mapValues { $0.value } - } -} - -// MARK: - InfoPlist - -public enum InfoPlist: Equatable, Codable { - // Path to a user defined info.plist file (already exists on disk). - case file(path: AbsolutePath) - - // Path to a generated info.plist file (may not exist on disk at the time of project generation). - // Data of the generated file - case generatedFile(path: AbsolutePath, data: Data) - - // User defined dictionary of keys/values for an info.plist file. - case dictionary([String: Plist.Value]) - - // User defined dictionary of keys/values for an info.plist file extending the default set of keys/values - // for the target type. - case extendingDefault(with: [String: Plist.Value]) - - // MARK: - Public - - public var path: AbsolutePath? { - switch self { - case let .file(path), let .generatedFile(path: path, data: _): - return path - default: - return nil - } - } -} - -// MARK: - InfoPlist - ExpressibleByStringLiteral - -extension InfoPlist: ExpressibleByStringLiteral { - public init(stringLiteral value: String) { - self = .file(path: try! AbsolutePath(validating: value)) // swiftlint:disable:this force_try - } -} - -// MARK: - Entitlements - -public enum Entitlements: Equatable, Codable { - // Path to a user defined .entitlements file (already exists on disk). - case file(path: AbsolutePath) - - // Path to a generated .entitlements file (may not exist on disk at the time of project generation). - // Data of the generated file - case generatedFile(path: AbsolutePath, data: Data) - - // User defined dictionary of keys/values for an .entitlements file. - case dictionary([String: Plist.Value]) - - // A user defined xcconfig variable map to .entitlements file - case variable(String) - - // MARK: - Public - - public var path: AbsolutePath? { - switch self { - case let .file(path), let .generatedFile(path: path, data: _): - return path - default: - return nil - } - } -} - -// MARK: - Entitlements - ExpressibleByStringLiteral - -extension Entitlements: ExpressibleByStringLiteral { - public init(stringLiteral value: String) { - if value.hasPrefix("$(") { - self = .variable(value) - } else { - self = .file(path: try! AbsolutePath(validating: value)) // swiftlint:disable:this force_try - } - } -} diff --git a/Sources/XcodeGraph/Models/Product.swift b/Sources/XcodeGraph/Models/Product.swift deleted file mode 100644 index 322a0683d6b..00000000000 --- a/Sources/XcodeGraph/Models/Product.swift +++ /dev/null @@ -1,241 +0,0 @@ -import Foundation - -public enum Product: String, CustomStringConvertible, CaseIterable, Codable { - case app - case staticLibrary = "static_library" - case dynamicLibrary = "dynamic_library" - case framework - case staticFramework - case unitTests = "unit_tests" - case uiTests = "ui_tests" - case bundle - case commandLineTool - case appExtension = "app_extension" - // case watchApp = "watch_app" - case watch2App = "watch_2_app" - // case watchExtension = "watch_extension" - case watch2Extension = "watch_2_extension" - case tvTopShelfExtension = "tv_top_shelf_extension" - // case tvIntentsExtension = "tv_intents_extension" - // case messagesApplication = "messages_application" - case messagesExtension = "messages_extension" - case stickerPackExtension = "sticker_pack_extension" - case appClip - case xpc - case systemExtension = "system_extension" - case extensionKitExtension = "extension_kit_extension" - case macro - - public var caseValue: String { - switch self { - case .app: - return "app" - case .staticLibrary: - return "staticLibrary" - case .dynamicLibrary: - return "dynamicLibrary" - case .framework: - return "framework" - case .staticFramework: - return "staticFramework" - case .unitTests: - return "unitTests" - case .uiTests: - return "uiTests" - case .bundle: - return "bundle" - case .appExtension: - return "appExtension" - // case .watchApp: - // return "watchApp" - case .watch2App: - return "watch2App" - // case .watchExtension: - // return "watchExtension" - case .watch2Extension: - return "watch2Extension" - case .tvTopShelfExtension: - return "tvTopShelfExtension" - // case .tvIntentsExtension: - // return "tvIntentsExtension" - // case .messagesApplication: - // return "messagesApplication" - case .messagesExtension: - return "messagesExtension" - case .stickerPackExtension: - return "stickerPackExtension" - case .commandLineTool: - return "commandLineTool" - case .appClip: - return "appClip" - case .xpc: - return "xpc" - case .systemExtension: - return "systemExtension" - case .extensionKitExtension: - return "extensionKitExtension" - case .macro: - return "macro" - } - } - - public var description: String { - switch self { - case .app: - return "application" - case .staticLibrary: - return "static library" - case .dynamicLibrary: - return "dynamic library" - case .framework: - return "dynamic framework" - case .staticFramework: - return "static framework" - case .unitTests: - return "unit tests" - case .uiTests: - return "ui tests" - case .bundle: - return "bundle" - case .appExtension: - return "app extension" - // case .watchApp: - // return "watch application" - case .watch2App: - return "watch 2 application" - // case .watchExtension: - // return "watch extension" - case .watch2Extension: - return "watch 2 extension" - case .tvTopShelfExtension: - return "tv top shelf extension" - // case .tvIntentsExtension: - // return "tv intents extension" - // case .messagesApplication: - // return "iMessage application" - case .messagesExtension: - return "iMessage extension" - case .stickerPackExtension: - return "sticker pack extension" - case .commandLineTool: - return "command line tool" - case .appClip: - return "appClip" - case .xpc: - return "xpc" - case .systemExtension: - return "system extension" - case .extensionKitExtension: - return "extensionKit extension" - case .macro: - return "Swift Macro" - } - } - - /// Returns true if the target can be ran. - public var runnable: Bool { - switch self { - case - .app, - .appClip, - .commandLineTool, - .watch2App, - .appExtension, - .messagesExtension, - .stickerPackExtension, - .tvTopShelfExtension, - .watch2Extension, - .extensionKitExtension, - .macro: - return true - case - .bundle, - .systemExtension, - .dynamicLibrary, - .framework, - .staticFramework, - .staticLibrary, - .unitTests, - .uiTests, - .xpc: - return false - } - } - - /// Returns true if the product is a tests bundle. - public var testsBundle: Bool { - self == .uiTests || self == .unitTests - } - - public static func forPlatform(_ platform: Platform) -> Set { - var base: [Product] = [ - .app, - .staticLibrary, - .dynamicLibrary, - .framework, - ] - - if platform == .iOS { - base.append(.stickerPackExtension) - // base.append(.messagesApplication) - base.append(.messagesExtension) - base.append(.appClip) - } - if platform == .iOS || platform == .visionOS { - base.append(.appExtension) - } - - if platform == .tvOS { - base.append(.tvTopShelfExtension) - // base.append(.tvIntentsExtension) - } - - if platform == .macOS || - platform == .tvOS || - platform == .iOS || - platform == .visionOS - { - base.append(.unitTests) - } - - if platform == .macOS || - platform == .tvOS || - platform == .iOS - { - base.append(.uiTests) - } - - if platform == .macOS { - base.append(.commandLineTool) - base.append(.macro) - base.append(.xpc) - base.append(.systemExtension) - } - - // if platform == .watchOS { - // base.append(contentsOf: [ - // .watchApp, - // .watch2App, - // .watchExtension, - // .watch2Extension, - // ]) - // } - return Set(base) - } - - public var isStatic: Bool { - [.staticLibrary, .staticFramework].contains(self) - } - - public var isFramework: Bool { - [.framework, .staticFramework].contains(self) - } - - public var isDynamic: Bool { - [.framework, .dynamicLibrary].contains(self) - } - - public func canHostTests() -> Bool { - [.app, .appClip, .watch2App].contains(self) - } -} diff --git a/Sources/XcodeGraph/Models/Project.swift b/Sources/XcodeGraph/Models/Project.swift deleted file mode 100644 index 1cd9b2c6619..00000000000 --- a/Sources/XcodeGraph/Models/Project.swift +++ /dev/null @@ -1,152 +0,0 @@ -import Foundation -import Path -import TSCUtility - -public struct Project: Hashable, Equatable, CustomStringConvertible, CustomDebugStringConvertible, Codable { - // MARK: - Attributes - - /// Path to the folder that contains the project manifest. - public var path: AbsolutePath - - /// Path to the root of the project sources. - public var sourceRootPath: AbsolutePath - - /// Path to the Xcode project that will be generated. - public var xcodeProjPath: AbsolutePath - - /// Project name. - public var name: String - - /// Organization name. - public var organizationName: String? - - /// Default known regions - public var defaultKnownRegions: [String]? - - /// Development region code e.g. `en`. - public var developmentRegion: String? - - /// Additional project options. - public var options: Options - - /// Project targets. - public var targets: [String: Target] - - /// Project swift packages. - public var packages: [Package] - - /// Project schemes - public var schemes: [Scheme] - - /// Project settings. - public var settings: Settings - - /// The group to place project files within - public var filesGroup: ProjectGroup - - /// Additional files to include in the project - public var additionalFiles: [FileElement] - - /// IDE template macros that represent content of IDETemplateMacros.plist - public var ideTemplateMacros: IDETemplateMacros? - - /// `ResourceSynthesizers` that will be applied on individual target's resources - public var resourceSynthesizers: [ResourceSynthesizer] - - /// The version in which a check happened related to recommended settings after updating Xcode. - public var lastUpgradeCheck: Version? - - /// Indicates whether the project is imported through `Package.swift`. - public var isExternal: Bool - - // MARK: - Init - - /// Initializes the project with its attributes. - /// - /// - Parameters: - /// - path: Path to the folder that contains the project manifest. - /// - sourceRootPath: Path to the directory where the Xcode project will be generated. - /// - xcodeProjPath: Path to the Xcode project that will be generated. - /// - name: Project name. - /// - organizationName: Organization name. - /// - defaultKnownRegions: Default known regions. - /// - developmentRegion: Development region. - /// - options: Additional project options. - /// - settings: The settings to apply at the project level - /// - filesGroup: The root group to place project files within - /// - targets: The project targets - /// *(Those won't be included in any build phases)* - /// - packages: Project swift packages. - /// - schemes: Project schemes. - /// - ideTemplateMacros: IDE template macros that represent content of IDETemplateMacros.plist. - /// - additionalFiles: The additional files to include in the project - /// - resourceSynthesizers: `ResourceSynthesizers` that will be applied on individual target's resources - /// - lastUpgradeCheck: The version in which a check happened related to recommended settings after updating Xcode. - /// - isExternal: Indicates whether the project is imported through `Package.swift`. - public init( - path: AbsolutePath, - sourceRootPath: AbsolutePath, - xcodeProjPath: AbsolutePath, - name: String, - organizationName: String?, - defaultKnownRegions: [String]?, - developmentRegion: String?, - options: Options, - settings: Settings, - filesGroup: ProjectGroup, - targets: [Target], - packages: [Package], - schemes: [Scheme], - ideTemplateMacros: IDETemplateMacros?, - additionalFiles: [FileElement], - resourceSynthesizers: [ResourceSynthesizer], - lastUpgradeCheck: Version?, - isExternal: Bool - ) { - self.path = path - self.sourceRootPath = sourceRootPath - self.xcodeProjPath = xcodeProjPath - self.name = name - self.organizationName = organizationName - self.defaultKnownRegions = defaultKnownRegions - self.developmentRegion = developmentRegion - self.options = options - self.targets = Dictionary(uniqueKeysWithValues: targets.map { ($0.name, $0) }) - self.packages = packages - self.schemes = schemes - self.settings = settings - self.filesGroup = filesGroup - self.ideTemplateMacros = ideTemplateMacros - self.additionalFiles = additionalFiles - self.resourceSynthesizers = resourceSynthesizers - self.lastUpgradeCheck = lastUpgradeCheck - self.isExternal = isExternal - } - - // MARK: - CustomStringConvertible - - public var description: String { - name - } - - // MARK: - CustomDebugStringConvertible - - public var debugDescription: String { - name - } - - // MARK: - Hashable - - public func hash(into hasher: inout Hasher) { - hasher.combine(path) - } - - // MARK: - Public - - /// Returns the name of the default configuration. - public var defaultDebugBuildConfigurationName: String { - let debugConfiguration = settings.defaultDebugBuildConfiguration() - let buildConfiguration = debugConfiguration ?? settings.configurations.keys.first - return buildConfiguration?.name ?? BuildConfiguration.debug.name - } -} diff --git a/Sources/XcodeGraph/Models/RawScriptBuildPhase.swift b/Sources/XcodeGraph/Models/RawScriptBuildPhase.swift deleted file mode 100644 index a1588453550..00000000000 --- a/Sources/XcodeGraph/Models/RawScriptBuildPhase.swift +++ /dev/null @@ -1,40 +0,0 @@ -import Foundation -import Path - -/// It represents a raw script build phase. -public struct RawScriptBuildPhase: Equatable, Codable { - /// The name of the build phase. - public let name: String - - /// Script. - public let script: String - - /// Whether we want the build phase to show the environment variables in the logs. - public let showEnvVarsInLog: Bool - - /// Whether the script should be hashed for caching purposes. - public let hashable: Bool - - /// The path to the shell which shall execute this script. - public let shellPath: String - - /// Initializes the target script. - /// - Parameter name: The name of the build phase. - /// - Parameter script: Script. - /// - Parameter showEnvVarsInLog: Whether we want the build phase to show the environment variables in the logs. - /// - Parameter hashable: Whether the script should be hashed for caching purposes. - /// - Parameter shellPath: The path to the shell which shall execute this script. Default is `/bin/sh`. - public init( - name: String, - script: String, - showEnvVarsInLog: Bool, - hashable: Bool, - shellPath: String = "/bin/sh" - ) { - self.name = name - self.script = script - self.showEnvVarsInLog = showEnvVarsInLog - self.hashable = hashable - self.shellPath = shellPath - } -} diff --git a/Sources/XcodeGraph/Models/ResourceFileElement.swift b/Sources/XcodeGraph/Models/ResourceFileElement.swift deleted file mode 100644 index 5023f01e0d6..00000000000 --- a/Sources/XcodeGraph/Models/ResourceFileElement.swift +++ /dev/null @@ -1,58 +0,0 @@ -import Foundation -import Path - -public enum ResourceFileElement: Equatable, Hashable, Codable { - /// A file path (or glob pattern) to include, a list of file paths (or glob patterns) to exclude, ODR tags list and inclusion - /// condition. - /// For convenience, a string literal can be used as an alternate way to specify this option. - case file(path: AbsolutePath, tags: [String] = [], inclusionCondition: PlatformCondition? = nil) - /// A directory path to include as a folder reference, ODR tags list and inclusion condition. - case folderReference(path: AbsolutePath, tags: [String] = [], inclusionCondition: PlatformCondition? = nil) - - public var path: AbsolutePath { - switch self { - case let .file(path, _, _): - return path - case let .folderReference(path, _, _): - return path - } - } - - public var isReference: Bool { - switch self { - case .file: - return false - case .folderReference: - return true - } - } - - public var tags: [String] { - switch self { - case let .file(_, tags, _): - return tags - case let .folderReference(_, tags, _): - return tags - } - } - - public var inclusionCondition: PlatformCondition? { - switch self { - case let .file(_, _, condition): - return condition - case let .folderReference(_, _, condition): - return condition - } - } - - public init(path: AbsolutePath) { - self = .file(path: path) - } -} - -extension [XcodeGraph.ResourceFileElement] { - public mutating func remove(path: AbsolutePath) { - guard let index = firstIndex(of: XcodeGraph.ResourceFileElement(path: path)) else { return } - remove(at: index) - } -} diff --git a/Sources/XcodeGraph/Models/ResourceSynthesizer.swift b/Sources/XcodeGraph/Models/ResourceSynthesizer.swift deleted file mode 100644 index 67a5e5ac841..00000000000 --- a/Sources/XcodeGraph/Models/ResourceSynthesizer.swift +++ /dev/null @@ -1,96 +0,0 @@ -import AnyCodable -import Foundation -import Path - -public struct ResourceSynthesizer: Equatable, Hashable, Codable { - public let parser: Parser - public let parserOptions: [String: Parser.Option] - public let extensions: Set - public let template: Template - - public enum Template: Equatable, Hashable, Codable { - case file(AbsolutePath) - case defaultTemplate(String) - } - - public enum Parser: String, Equatable, Hashable, Codable { - case strings - case assets - case plists - case fonts - case coreData - case interfaceBuilder - case json - case yaml - case files - - public struct Option: Equatable, Hashable, Codable { - public var value: Any { anyCodableValue.value } - private let anyCodableValue: AnyCodable - - public init(value: some Any) { - anyCodableValue = AnyCodable(value) - } - } - } - - public init( - parser: Parser, - parserOptions: [String: Parser.Option], - extensions: Set, - template: Template - ) { - self.parser = parser - self.parserOptions = parserOptions - self.extensions = extensions - self.template = template - } -} - -// MARK: - ResourceSynthesizer.Parser.Option - ExpressibleByStringInterpolation - -extension ResourceSynthesizer.Parser.Option: ExpressibleByStringInterpolation { - public init(stringLiteral value: String) { - self = .init(value: value) - } -} - -// MARK: - ResourceSynthesizer.Parser.Option - ExpressibleByIntegerLiteral - -extension ResourceSynthesizer.Parser.Option: ExpressibleByIntegerLiteral { - public init(integerLiteral value: Int) { - self = .init(value: value) - } -} - -// MARK: - ResourceSynthesizer.Parser.Option - ExpressibleByFloatLiteral - -extension ResourceSynthesizer.Parser.Option: ExpressibleByFloatLiteral { - public init(floatLiteral value: Double) { - self = .init(value: value) - } -} - -// MARK: - ResourceSynthesizer.Parser.Option - ExpressibleByBooleanLiteral - -extension ResourceSynthesizer.Parser.Option: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = .init(value: value) - } -} - -// MARK: - ResourceSynthesizer.Parser.Option - ExpressibleByDictionaryLiteral - -extension ResourceSynthesizer.Parser.Option: ExpressibleByDictionaryLiteral { - public init(dictionaryLiteral elements: (String, Self)...) { - self = .init(value: Dictionary(uniqueKeysWithValues: elements)) - } -} - -// MARK: - ResourceSynthesizer.Parser.Option - ExpressibleByArrayLiteral - -extension ResourceSynthesizer.Parser.Option: ExpressibleByArrayLiteral { - public init(arrayLiteral elements: Self...) { - self = .init(value: elements) - } -} diff --git a/Sources/XcodeGraph/Models/RunAction.swift b/Sources/XcodeGraph/Models/RunAction.swift deleted file mode 100644 index a7ac3aa9934..00000000000 --- a/Sources/XcodeGraph/Models/RunAction.swift +++ /dev/null @@ -1,49 +0,0 @@ -import Foundation -import Path - -public struct RunAction: Equatable, Codable { - // MARK: - Attributes - - public let configurationName: String - public let attachDebugger: Bool - public let customLLDBInitFile: AbsolutePath? - public let preActions: [ExecutionAction] - public let postActions: [ExecutionAction] - public let executable: TargetReference? - public let filePath: AbsolutePath? - public let arguments: Arguments? - public let options: RunActionOptions - public let diagnosticsOptions: SchemeDiagnosticsOptions - public let expandVariableFromTarget: TargetReference? - public let launchStyle: LaunchStyle - - // MARK: - Init - - public init( - configurationName: String, - attachDebugger: Bool, - customLLDBInitFile: AbsolutePath?, - preActions: [ExecutionAction] = [], - postActions: [ExecutionAction] = [], - executable: TargetReference?, - filePath: AbsolutePath?, - arguments: Arguments?, - options: RunActionOptions = .init(), - diagnosticsOptions: SchemeDiagnosticsOptions, - expandVariableFromTarget: TargetReference? = nil, - launchStyle: LaunchStyle = .automatically - ) { - self.configurationName = configurationName - self.attachDebugger = attachDebugger - self.customLLDBInitFile = customLLDBInitFile - self.preActions = preActions - self.postActions = postActions - self.executable = executable - self.filePath = filePath - self.arguments = arguments - self.options = options - self.diagnosticsOptions = diagnosticsOptions - self.expandVariableFromTarget = expandVariableFromTarget - self.launchStyle = launchStyle - } -} diff --git a/Sources/XcodeGraph/Models/RunActionOptions.swift b/Sources/XcodeGraph/Models/RunActionOptions.swift deleted file mode 100644 index 5cae4294ac3..00000000000 --- a/Sources/XcodeGraph/Models/RunActionOptions.swift +++ /dev/null @@ -1,66 +0,0 @@ -import Foundation -import Path - -/// Options for the `RunAction` action -public struct RunActionOptions: Equatable, Codable { - /// App Language. - public let language: String? - - /// App Region. - public let region: String? - - /// The path of the - /// [StoreKit configuration - /// file](https://developer.apple.com/documentation/xcode/setting_up_storekit_testing_in_xcode#3625700) - public let storeKitConfigurationPath: AbsolutePath? - - /// A simulated location used when running the provided run action. - public let simulatedLocation: SimulatedLocation? - - /// Configure your project to work with the Metal frame debugger. - public let enableGPUFrameCaptureMode: GPUFrameCaptureMode - - /// Creates an `RunActionOptions` instance - /// - /// - Parameters: - /// - language: language (e.g. "pl"). - /// - /// - storeKitConfigurationPath: The absolute path of the - /// [StoreKit configuration - /// file](https://developer.apple.com/documentation/xcode/setting_up_storekit_testing_in_xcode#3625700). - /// The default value is `nil`, which results in no - /// configuration defined for the scheme - /// - /// - simulatedLocation: The simulated GPS location to use when running the app. - /// - /// - enableGPUFrameCaptureMode: The Metal Frame Capture mode to use. e.g: .disabled - /// If your target links to the Metal framework, Xcode enables GPU Frame Capture. - /// You can disable it to test your app in best performance. - - public init( - language: String? = nil, - region: String? = nil, - storeKitConfigurationPath: AbsolutePath? = nil, - simulatedLocation: SimulatedLocation? = nil, - enableGPUFrameCaptureMode: GPUFrameCaptureMode = .autoEnabled - ) { - self.language = language - self.region = region - self.storeKitConfigurationPath = storeKitConfigurationPath - self.simulatedLocation = simulatedLocation - self.enableGPUFrameCaptureMode = enableGPUFrameCaptureMode - } -} - -extension RunActionOptions { - public enum GPUFrameCaptureMode: String, Codable, Equatable { - case autoEnabled - case metal - case openGL - case disabled - - public static var `default`: GPUFrameCaptureMode { - .autoEnabled - } - } -} diff --git a/Sources/XcodeGraph/Models/Scheme.swift b/Sources/XcodeGraph/Models/Scheme.swift deleted file mode 100644 index 8440cd14aa3..00000000000 --- a/Sources/XcodeGraph/Models/Scheme.swift +++ /dev/null @@ -1,40 +0,0 @@ -import Foundation -import Path - -public struct Scheme: Equatable, Codable { - // MARK: - Attributes - - public var name: String - public var shared: Bool - public var hidden: Bool - public var buildAction: BuildAction? - public var testAction: TestAction? - public var runAction: RunAction? - public var archiveAction: ArchiveAction? - public var profileAction: ProfileAction? - public var analyzeAction: AnalyzeAction? - - // MARK: - Init - - public init( - name: String, - shared: Bool = false, - hidden: Bool = false, - buildAction: BuildAction? = nil, - testAction: TestAction? = nil, - runAction: RunAction? = nil, - archiveAction: ArchiveAction? = nil, - profileAction: ProfileAction? = nil, - analyzeAction: AnalyzeAction? = nil - ) { - self.name = name - self.shared = shared - self.hidden = hidden - self.buildAction = buildAction - self.testAction = testAction - self.runAction = runAction - self.archiveAction = archiveAction - self.profileAction = profileAction - self.analyzeAction = analyzeAction - } -} diff --git a/Sources/XcodeGraph/Models/Settings.swift b/Sources/XcodeGraph/Models/Settings.swift deleted file mode 100644 index 8e103c3da74..00000000000 --- a/Sources/XcodeGraph/Models/Settings.swift +++ /dev/null @@ -1,201 +0,0 @@ -import Foundation -import Path - -public typealias SettingsDictionary = [String: SettingValue] - -public enum SettingValue: ExpressibleByStringInterpolation, ExpressibleByStringLiteral, ExpressibleByArrayLiteral, Equatable, - Codable -{ - case string(String) - case array([String]) - - public init(stringLiteral value: String) { - self = .string(value) - } - - public init(arrayLiteral elements: String...) { - self = .array(elements) - } - - public func normalize() -> SettingValue { - switch self { - case let .array(currentValue): - if currentValue.count == 1 { - return .string(currentValue[0]) - } - return self - case .string: - return self - } - } -} - -extension SettingsDictionary { - /// Overlays a SettingsDictionary by adding a `[sdk=*]` qualifier - /// e.g. for a multiplatform target - /// `LD_RUNPATH_SEARCH_PATHS = @executable_path/Frameworks` - /// `LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = @executable_path/../Frameworks` - public mutating func overlay( - with other: SettingsDictionary, - for platform: Platform - ) { - for (key, newValue) in other { - if self[key] == nil { - self[key] = newValue - } else if self[key] != newValue { - let newKey = "\(key)[sdk=\(platform.xcodeSdkRoot)*]" - self[newKey] = newValue - if platform.hasSimulators, let simulatorSDK = platform.xcodeSimulatorSDK { - let newKey = "\(key)[sdk=\(simulatorSDK)*]" - self[newKey] = newValue - } - } - } - } - - /// Combines two `SettingsDictionary`. Instead of overriding values for a duplicate key, it combines them. - public func combine(with settings: SettingsDictionary) -> SettingsDictionary { - merging(settings, uniquingKeysWith: { oldValue, newValue in - let newValues: [String] - switch newValue { - case let .string(value): - newValues = [value] - case let .array(values): - newValues = values - } - switch oldValue { - case let .array(values): - return .array(values + newValues) - case let .string(value): - return .array(value.split(separator: " ").map(String.init) + newValues) - } - }) - } -} - -public struct Configuration: Equatable, Codable { - // MARK: - Attributes - - public var settings: SettingsDictionary - public var xcconfig: AbsolutePath? - - // MARK: - Init - - public init(settings: SettingsDictionary = [:], xcconfig: AbsolutePath? = nil) { - self.settings = settings - self.xcconfig = xcconfig - } - - // MARK: - Public - - /// Returns a copy of the configuration with the given settings set. - /// - Parameter settings: SettingsDictionary to be set to the copy. - public func with(settings: SettingsDictionary) -> Configuration { - Configuration( - settings: settings, - xcconfig: xcconfig - ) - } -} - -public enum DefaultSettings: Codable, Equatable { - case recommended(excluding: Set = []) - case essential(excluding: Set = []) - case none -} - -extension DefaultSettings { - public static var recommended: DefaultSettings { - .recommended(excluding: []) - } - - public static var essential: DefaultSettings { - .essential(excluding: []) - } -} - -public struct Settings: Equatable, Codable { - public static let `default` = Settings( - configurations: [.release: nil, .debug: nil], - defaultSettings: .recommended - ) - - // MARK: - Attributes - - public let base: SettingsDictionary - /// Base settings applied only for configurations of `variant == .debug` - public let baseDebug: SettingsDictionary - public let configurations: [BuildConfiguration: Configuration?] - public let defaultSettings: DefaultSettings - - // MARK: - Init - - public init( - base: SettingsDictionary = [:], - baseDebug: SettingsDictionary = [:], - configurations: [BuildConfiguration: Configuration?], - defaultSettings: DefaultSettings = .recommended - ) { - self.base = base - self.baseDebug = baseDebug - self.configurations = configurations - self.defaultSettings = defaultSettings - } - - public func with(base: SettingsDictionary) -> Settings { - .init( - base: base, - configurations: configurations, - defaultSettings: defaultSettings - ) - } -} - -extension Settings { - /// Finds the default debug `BuildConfiguration` if it exists, otherwise returns the first debug configuration available. - /// - /// - Returns: The default debug `BuildConfiguration` - public func defaultDebugBuildConfiguration() -> BuildConfiguration? { - let debugConfigurations = configurations.keys - .filter { $0.variant == .debug } - .sorted() - let defaultConfiguration = debugConfigurations.first(where: { $0 == BuildConfiguration.debug }) - return defaultConfiguration ?? debugConfigurations.first - } - - /// Finds the default release `BuildConfiguration` if it exists, otherwise returns the first release configuration available. - /// - /// - Returns: The default release `BuildConfiguration` - public func defaultReleaseBuildConfiguration() -> BuildConfiguration? { - let releaseConfigurations = configurations.keys - .filter { $0.variant == .release } - .sorted() - let defaultConfiguration = releaseConfigurations.first(where: { $0 == BuildConfiguration.release }) - return defaultConfiguration ?? releaseConfigurations.first - } -} - -extension [BuildConfiguration: Configuration?] { - public func sortedByBuildConfigurationName() -> [(key: BuildConfiguration, value: Configuration?)] { - sorted(by: { first, second -> Bool in first.key < second.key }) - } - - public func xcconfigs() -> [AbsolutePath] { - sortedByBuildConfigurationName() - .map(\.value) - .compactMap { $0?.xcconfig } - } -} - -extension [String: SettingValue] { - public func toAny() -> [String: Any] { - mapValues { value in - switch value { - case let .array(array): - return array - case let .string(string): - return string - } - } - } -} diff --git a/Sources/XcodeGraph/Models/SimulatedLocation.swift b/Sources/XcodeGraph/Models/SimulatedLocation.swift deleted file mode 100644 index 0840c6ed583..00000000000 --- a/Sources/XcodeGraph/Models/SimulatedLocation.swift +++ /dev/null @@ -1,46 +0,0 @@ -import Foundation -import Path - -public enum SimulatedLocation { - case gpxFile(AbsolutePath) - case reference(String) - - /// A unique identifier string for the selected simulated location. - /// - /// In case of Xcode's simulated locations, this is a string representing the location. - /// In case of a custom GPX file, this is a path to that file. - public var identifier: String { - switch self { - case let .gpxFile(path): - return path.pathString - case let .reference(identifier): - return identifier - } - } - - /// A reference type is 1 if using Xcode's built-in simulated locations. - /// Otherwise, it is 0. - public var referenceType: String { - if case .gpxFile = self { return "0" } - return "1" - } -} - -extension SimulatedLocation: Equatable, Codable, Hashable { - public init(from decoder: Decoder) throws { - let container = try decoder.singleValueContainer() - let value = try container.decode(String.self) - - guard value.hasSuffix(".gpx") else { - self = .reference(value) - return - } - - self = .gpxFile(try AbsolutePath(validating: value)) - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.singleValueContainer() - try container.encode(identifier) - } -} diff --git a/Sources/XcodeGraph/Models/SourceFile.swift b/Sources/XcodeGraph/Models/SourceFile.swift deleted file mode 100644 index 9defe25d3f2..00000000000 --- a/Sources/XcodeGraph/Models/SourceFile.swift +++ /dev/null @@ -1,47 +0,0 @@ -import Foundation -import Path - -/// A type that represents a source file. -public struct SourceFile: ExpressibleByStringLiteral, Equatable, Codable { - /// Source file path. - public var path: AbsolutePath - - /// Compiler flags - /// When source files are added to a target, they can contain compiler flags that Xcode's build system - /// passes to the compiler when compiling those files. By default none is passed. - public var compilerFlags: String? - - /// This is intended to be used by the mappers that generate files through side effects. - /// This attribute is used by the content hasher used by the caching functionality. - public var contentHash: String? - - /// Source file code generation attribute - public let codeGen: FileCodeGen? - - /// Source file condition for platform filters - public let compilationCondition: PlatformCondition? - - public init( - path: AbsolutePath, - compilerFlags: String? = nil, - contentHash: String? = nil, - codeGen: FileCodeGen? = nil, - compilationCondition: PlatformCondition? = nil - ) { - self.path = path - self.compilerFlags = compilerFlags - self.contentHash = contentHash - self.codeGen = codeGen - self.compilationCondition = compilationCondition - } - - // MARK: - ExpressibleByStringLiteral - - public init(stringLiteral value: String) { - path = try! AbsolutePath(validating: value) // swiftlint:disable:this force_try - compilerFlags = nil - contentHash = nil - codeGen = nil - compilationCondition = nil - } -} diff --git a/Sources/XcodeGraph/Models/Target.swift b/Sources/XcodeGraph/Models/Target.swift deleted file mode 100644 index 0216454d2ff..00000000000 --- a/Sources/XcodeGraph/Models/Target.swift +++ /dev/null @@ -1,365 +0,0 @@ -import Foundation -import Path - -// swiftlint:disable:next type_body_length -public struct Target: Equatable, Hashable, Comparable, Codable { - // MARK: - Static - - // Note: The `.docc` file type is technically both a valid source extension and folder extension - // in order to compile the documentation archive (including Tutorials, Articles, etc.) - public static let validSourceExtensions: [String] = [ - "m", "swift", "mm", "cpp", "cc", "c", "d", "s", "intentdefinition", "xcmappingmodel", "metal", "mlmodel", "docc", - "playground", "rcproject", "mlpackage", - ] - public static let validFolderExtensions: [String] = [ - "framework", "bundle", "app", "xcassets", "appiconset", "scnassets", - ] - - // MARK: - Attributes - - public var name: String - public var destinations: Destinations - public var product: Product - public var bundleId: String - public var productName: String - public var deploymentTargets: DeploymentTargets - - // An info.plist file is needed for (dynamic) frameworks, applications and executables - // however is not needed for other products such as static libraries. - public var infoPlist: InfoPlist? - public var entitlements: Entitlements? - public var settings: Settings? - public var dependencies: [TargetDependency] - public var sources: [SourceFile] - public var resources: ResourceFileElements - public var copyFiles: [CopyFilesAction] - public var headers: Headers? - public var coreDataModels: [CoreDataModel] - public var scripts: [TargetScript] - public var environmentVariables: [String: EnvironmentVariable] - public var launchArguments: [LaunchArgument] - public var filesGroup: ProjectGroup - public var rawScriptBuildPhases: [RawScriptBuildPhase] - public var playgrounds: [AbsolutePath] - public let additionalFiles: [FileElement] - public var buildRules: [BuildRule] - public var prune: Bool - public let mergedBinaryType: MergedBinaryType - public let mergeable: Bool - public let onDemandResourcesTags: OnDemandResourcesTags? - - // MARK: - Init - - public init( - name: String, - destinations: Destinations, - product: Product, - productName: String?, - bundleId: String, - deploymentTargets: DeploymentTargets = DeploymentTargets(), - infoPlist: InfoPlist? = nil, - entitlements: Entitlements? = nil, - settings: Settings? = nil, - sources: [SourceFile] = [], - resources: ResourceFileElements = .init([]), - copyFiles: [CopyFilesAction] = [], - headers: Headers? = nil, - coreDataModels: [CoreDataModel] = [], - scripts: [TargetScript] = [], - environmentVariables: [String: EnvironmentVariable] = [:], - launchArguments: [LaunchArgument] = [], - filesGroup: ProjectGroup, - dependencies: [TargetDependency] = [], - rawScriptBuildPhases: [RawScriptBuildPhase] = [], - playgrounds: [AbsolutePath] = [], - additionalFiles: [FileElement] = [], - buildRules: [BuildRule] = [], - prune: Bool = false, - mergedBinaryType: MergedBinaryType = .disabled, - mergeable: Bool = false, - onDemandResourcesTags: OnDemandResourcesTags? = nil - ) { - self.name = name - self.product = product - self.destinations = destinations - self.bundleId = bundleId - self.productName = productName ?? name.sanitizedModuleName - self.deploymentTargets = deploymentTargets - self.infoPlist = infoPlist - self.entitlements = entitlements - self.settings = settings - self.sources = sources - self.resources = resources - self.copyFiles = copyFiles - self.headers = headers - self.coreDataModels = coreDataModels - self.scripts = scripts - self.environmentVariables = environmentVariables - self.launchArguments = launchArguments - self.filesGroup = filesGroup - self.dependencies = dependencies - self.rawScriptBuildPhases = rawScriptBuildPhases - self.playgrounds = playgrounds - self.additionalFiles = additionalFiles - self.buildRules = buildRules - self.prune = prune - self.mergedBinaryType = mergedBinaryType - self.mergeable = mergeable - self.onDemandResourcesTags = onDemandResourcesTags - } - - /// Target can be included in the link phase of other targets - public func isLinkable() -> Bool { - [.dynamicLibrary, .staticLibrary, .framework, .staticFramework].contains(product) - } - - /// Returns whether a target is exclusive to a single platform - public func isExclusiveTo(_ platform: Platform) -> Bool { - destinations.map(\.platform).allSatisfy { $0 == platform } - } - - /// Returns whether a target supports a platform - public func supports(_ platform: Platform) -> Bool { - destinations.map(\.platform).contains(platform) - } - - /// List of platforms this target deploys to - public var supportedPlatforms: Set { - Set(destinations.map(\.platform)) - } - - /// Returns target's pre scripts. - public var preScripts: [TargetScript] { - scripts.filter { $0.order == .pre } - } - - /// Returns target's post scripts. - public var postScripts: [TargetScript] { - scripts.filter { $0.order == .post } - } - - /// Returns true if the target supports Mac Catalyst - public var supportsCatalyst: Bool { - destinations.contains(.macCatalyst) - } - - /// Target can link static products (e.g. an app can link a staticLibrary) - public func canLinkStaticProducts() -> Bool { - [ - .framework, - .app, - .commandLineTool, - .xpc, - .unitTests, - .uiTests, - .appExtension, - .watch2Extension, - .messagesExtension, - .appClip, - .tvTopShelfExtension, - .systemExtension, - .extensionKitExtension, - .macro, - ].contains(product) - } - - /// Returns true if the target supports having a headers build phase.. - public var shouldIncludeHeadersBuildPhase: Bool { - switch product { - case .framework, .staticFramework, .staticLibrary, .dynamicLibrary: - return true - default: - return false - } - } - - /// Returns true if the target supports having sources. - public var supportsSources: Bool { - switch product { - case .stickerPackExtension, .watch2App: - return false - case .bundle: - // Bundles only support source when targetting macOS only - return isExclusiveTo(.macOS) - default: - return true - } - } - - /// Returns true if the target deploys to more then one platform - public var isMultiplatform: Bool { - supportedPlatforms.count > 1 - } - - /// Returns true if the target supports hosting resources - public var supportsResources: Bool { - switch product { - case .app, - .framework, - .unitTests, - .uiTests, - .bundle, - .appExtension, - .watch2App, - .watch2Extension, - .tvTopShelfExtension, - .messagesExtension, - .stickerPackExtension, - .appClip, - .systemExtension, - .extensionKitExtension: - return true - - case .commandLineTool, - .macro, - .dynamicLibrary, - .staticLibrary, - .staticFramework, - .xpc: - return false - } - } - - public var legacyPlatform: Platform { - destinations.first?.platform ?? .iOS - } - - /// Returns true if the target is an AppClip - public var isAppClip: Bool { - if case .appClip = product { - return true - } - return false - } - - /// Determines if the target is an embeddable watch application - /// i.e. a product that can be bundled with a host iOS application - public func isEmbeddableWatchApplication() -> Bool { - let isWatchOS = isExclusiveTo(.watchOS) - let isApp = (product == .watch2App || product == .app) - return isWatchOS && isApp - } - - /// Determines if the target is an embeddable xpc service - /// i.e. a product that can be bundled with a host macOS application - public func isEmbeddableXPCService() -> Bool { - product == .xpc - } - - /// Determines if the target is an embeddable system extension - /// i.e. a product that can be bundled with a host macOS application - public func isEmbeddableSystemExtension() -> Bool { - product == .systemExtension - } - - /// Determines if the target is able to embed a watch application - /// i.e. a product that can be bundled with a watchOS application - public func canEmbedWatchApplications() -> Bool { - supports(.iOS) && product == .app - } - - /// Determines if the target is able to embed an system extension - /// i.e. a product that can be bundled with a macOS application - public func canEmbedSystemExtensions() -> Bool { - supports(.macOS) && product == .app - } - - /// Return the a set of PlatformFilters to control linking based on what platform is being compiled - /// This allows a target to link against a dependency conditionally when it is being compiled for a compatible platform - /// E.g. An app linking against CarPlay only when built for iOS. - public var dependencyPlatformFilters: PlatformFilters { - Set(destinations.map(\.platformFilter)) - } - - // MARK: - Equatable - - public static func == (lhs: Target, rhs: Target) -> Bool { - lhs.name == rhs.name && - lhs.destinations == rhs.destinations && - lhs.product == rhs.product && - lhs.bundleId == rhs.bundleId && - lhs.productName == rhs.productName && - lhs.infoPlist == rhs.infoPlist && - lhs.entitlements == rhs.entitlements && - lhs.settings == rhs.settings && - lhs.sources == rhs.sources && - lhs.resources == rhs.resources && - lhs.headers == rhs.headers && - lhs.coreDataModels == rhs.coreDataModels && - lhs.scripts == rhs.scripts && - lhs.dependencies == rhs.dependencies && - lhs.mergedBinaryType == rhs.mergedBinaryType && - lhs.mergeable == rhs.mergeable && - lhs.environmentVariables == rhs.environmentVariables - } - - public func hash(into hasher: inout Hasher) { - hasher.combine(name) - hasher.combine(destinations) - hasher.combine(product) - hasher.combine(bundleId) - hasher.combine(productName) - hasher.combine(environmentVariables) - } - - /// Returns a new copy of the target with the given InfoPlist set. - /// - Parameter infoPlist: InfoPlist to be set to the copied instance. - public func with(infoPlist: InfoPlist) -> Target { - var copy = self - copy.infoPlist = infoPlist - return copy - } - - /// Returns a new copy of the target with the given entitlements set. - /// - Parameter entitlements: entitlements to be set to the copied instance. - public func with(entitlements: Entitlements) -> Target { - var copy = self - copy.entitlements = entitlements - return copy - } - - /// Returns a new copy of the target with the given scripts. - /// - Parameter scripts: Actions to be set to the copied instance. - public func with(scripts: [TargetScript]) -> Target { - var copy = self - copy.scripts = scripts - return copy - } - - /// Returns a new copy of the target with the given additional settings - /// - Parameter additionalSettings: settings to be added. - public func with(additionalSettings: SettingsDictionary) -> Target { - var copy = self - if let oldSettings = copy.settings { - copy.settings = Settings( - base: oldSettings.base.merging(additionalSettings, uniquingKeysWith: { $1 }), - configurations: oldSettings.configurations, - defaultSettings: oldSettings.defaultSettings - ) - } else { - copy.settings = Settings( - base: additionalSettings, - configurations: [:] - ) - } - return copy - } - - // MARK: - Comparable - - public static func < (lhs: Target, rhs: Target) -> Bool { - lhs.name < rhs.name - } -} - -extension Sequence { - /// Filters and returns only the targets that are test bundles. - var testBundles: [Target] { - filter(\.product.testsBundle) - } - - /// Filters and returns only the targets that are apps and app clips. - var apps: [Target] { - filter { $0.product == .app || $0.product == .appClip } - } -} diff --git a/Sources/XcodeGraph/Models/TargetDependency.swift b/Sources/XcodeGraph/Models/TargetDependency.swift deleted file mode 100644 index 05763bc0003..00000000000 --- a/Sources/XcodeGraph/Models/TargetDependency.swift +++ /dev/null @@ -1,74 +0,0 @@ -import Foundation -import Path - -public enum FrameworkStatus: String, Hashable, Codable { - case required - case optional -} - -public enum SDKStatus: String, Codable { - case required - case optional -} - -public enum TargetDependency: Equatable, Hashable, Codable { - public enum PackageType: String, Equatable, Hashable, Codable { - case runtime - case plugin - case macro - } - - case target(name: String, condition: PlatformCondition? = nil) - case project(target: String, path: AbsolutePath, condition: PlatformCondition? = nil) - case framework(path: AbsolutePath, status: FrameworkStatus, condition: PlatformCondition? = nil) - case xcframework(path: AbsolutePath, status: FrameworkStatus, condition: PlatformCondition? = nil) - case library( - path: AbsolutePath, - publicHeaders: AbsolutePath, - swiftModuleMap: AbsolutePath?, - condition: PlatformCondition? = nil - ) - case package(product: String, type: PackageType, condition: PlatformCondition? = nil) - case sdk(name: String, status: SDKStatus, condition: PlatformCondition? = nil) - case xctest - - public var condition: PlatformCondition? { - switch self { - case .target(name: _, condition: let condition): - condition - case .project(target: _, path: _, condition: let condition): - condition - case .framework(path: _, status: _, condition: let condition): - condition - case .xcframework(path: _, status: _, condition: let condition): - condition - case .library(path: _, publicHeaders: _, swiftModuleMap: _, condition: let condition): - condition - case .package(product: _, type: _, condition: let condition): - condition - case .sdk(name: _, status: _, condition: let condition): - condition - case .xctest: nil - } - } - - public func withCondition(_ condition: PlatformCondition?) -> TargetDependency { - switch self { - case .target(name: let name, condition: _): - return .target(name: name, condition: condition) - case .project(target: let target, path: let path, condition: _): - return .project(target: target, path: path, condition: condition) - case .framework(path: let path, status: let status, condition: _): - return .framework(path: path, status: status, condition: condition) - case .xcframework(path: let path, status: let status, condition: _): - return .xcframework(path: path, status: status, condition: condition) - case .library(path: let path, publicHeaders: let headers, swiftModuleMap: let moduleMap, condition: _): - return .library(path: path, publicHeaders: headers, swiftModuleMap: moduleMap, condition: condition) - case .package(product: let product, type: let type, condition: _): - return .package(product: product, type: type, condition: condition) - case .sdk(name: let name, status: let status, condition: _): - return .sdk(name: name, status: status, condition: condition) - case .xctest: return .xctest - } - } -} diff --git a/Sources/XcodeGraph/Models/TargetReference.swift b/Sources/XcodeGraph/Models/TargetReference.swift deleted file mode 100644 index 5ff8b4d76fa..00000000000 --- a/Sources/XcodeGraph/Models/TargetReference.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation -import Path - -public struct TargetReference: Hashable, Codable { - public var projectPath: AbsolutePath - public var name: String - - public init(projectPath: AbsolutePath, name: String) { - self.projectPath = projectPath - self.name = name - } -} diff --git a/Sources/XcodeGraph/Models/TargetScript.swift b/Sources/XcodeGraph/Models/TargetScript.swift deleted file mode 100644 index a9cf89a567f..00000000000 --- a/Sources/XcodeGraph/Models/TargetScript.swift +++ /dev/null @@ -1,152 +0,0 @@ -import Foundation -import Path - -/// It represents a target script build phase -public struct TargetScript: Equatable, Codable { - /// Order when the script gets executed. - /// - /// - pre: Before the sources and resources build phase. - /// - post: After the sources and resources build phase. - public enum Order: String, Equatable, Codable { - case pre - case post - } - - /// Specifies how to execute the target script - /// - /// - tool: Executes the tool with the given arguments. Tuist will look up the tool on the environment's PATH. - /// - scriptPath: Executes the file at the path with the given arguments. - /// - embedded: Executes the embedded script. This should be a short command. - public enum Script: Equatable, Codable { - case tool(path: String, args: [String] = []) - case scriptPath(path: AbsolutePath, args: [String] = []) - case embedded(String) - } - - /// Name of the build phase when the project gets generated - public let name: String - - /// The script to execute in the script - public let script: Script - - /// The text of the embedded script - public var embeddedScript: String? { - if case let Script.embedded(embeddedScript) = script { - return embeddedScript - } - - return nil - } - - /// Name of the tool to execute. Tuist will look up the tool on the environment's PATH. - public var tool: String? { - if case let Script.tool(tool, _) = script { - return tool - } - - return nil - } - - /// Path to the script to execute. - public var path: AbsolutePath? { - if case let Script.scriptPath(path, _) = script { - return path - } - - return nil - } - - /// Target script order - public let order: Order - - /// Arguments that to be passed - public var arguments: [String] { - switch script { - case let .scriptPath(_, args), let .tool(_, args): - return args - - case .embedded: - return [] - } - } - - /// List of input file paths - public let inputPaths: [String] - - /// List of input filelist paths - public let inputFileListPaths: [AbsolutePath] - - /// List of output file paths - public let outputPaths: [String] - - /// List of output filelist paths - public let outputFileListPaths: [AbsolutePath] - - /// Show environment variables in the logs - public var showEnvVarsInLog: Bool - - /// Whether to skip running this script in incremental builds, if nothing has changed - public let basedOnDependencyAnalysis: Bool? - - /// Whether this script only runs on install builds (default is false) - public let runForInstallBuildsOnly: Bool - - /// The path to the shell which shall execute this script. - public let shellPath: String - - /// The path to the dependency file - public let dependencyFile: AbsolutePath? - - /// Initializes a new target script with its attributes using a script at the given path to be executed. - /// - /// - Parameters: - /// - name: Name of the build phase when the project gets generated - /// - order: Target script order - /// - script: The script to execute in the script - /// - inputPaths: List of input file paths - /// - inputFileListPaths: List of input filelist paths - /// - outputPaths: List of output file paths - /// - outputFileListPaths: List of output filelist paths - /// - showEnvVarsInLog: Show environment variables in the logs - /// - basedOnDependencyAnalysis: Whether to skip running this script in incremental builds - /// - runForInstallBuildsOnly: Whether this script only runs on install builds (default is false) - /// - shellPath: The path to the shell which shall execute this script. Default is `/bin/sh`. - /// - dependencyFile: The path to the dependency file. Default is `nil`. - public init( - name: String, - order: Order, - script: Script = .embedded(""), - inputPaths: [String] = [], - inputFileListPaths: [AbsolutePath] = [], - outputPaths: [String] = [], - outputFileListPaths: [AbsolutePath] = [], - showEnvVarsInLog: Bool = true, - basedOnDependencyAnalysis: Bool? = nil, - runForInstallBuildsOnly: Bool = false, - shellPath: String = "/bin/sh", - dependencyFile: AbsolutePath? = nil - ) { - self.name = name - self.order = order - self.script = script - self.inputPaths = inputPaths - self.inputFileListPaths = inputFileListPaths - self.outputPaths = outputPaths - self.outputFileListPaths = outputFileListPaths - self.showEnvVarsInLog = showEnvVarsInLog - self.basedOnDependencyAnalysis = basedOnDependencyAnalysis - self.runForInstallBuildsOnly = runForInstallBuildsOnly - self.shellPath = shellPath - self.dependencyFile = dependencyFile - } -} - -extension [TargetScript] { - public var preScripts: [TargetScript] { - filter { $0.order == .pre } - } - - public var postScripts: [TargetScript] { - filter { $0.order == .post } - } -} diff --git a/Sources/XcodeGraph/Models/TestAction.swift b/Sources/XcodeGraph/Models/TestAction.swift deleted file mode 100644 index 501251afa70..00000000000 --- a/Sources/XcodeGraph/Models/TestAction.swift +++ /dev/null @@ -1,58 +0,0 @@ -import Foundation -import Path - -public struct TestAction: Equatable, Codable { - // MARK: - Attributes - - public var testPlans: [TestPlan]? - public var targets: [TestableTarget] - public var arguments: Arguments? - public var configurationName: String - public var attachDebugger: Bool - public var coverage: Bool - public var codeCoverageTargets: [TargetReference] - public var expandVariableFromTarget: TargetReference? - public var preActions: [ExecutionAction] - public var postActions: [ExecutionAction] - public var diagnosticsOptions: SchemeDiagnosticsOptions - public var language: String? - public var region: String? - public var preferredScreenCaptureFormat: ScreenCaptureFormat? - public var skippedTests: [String]? - - // MARK: - Init - - public init( - targets: [TestableTarget], - arguments: Arguments?, - configurationName: String, - attachDebugger: Bool, - coverage: Bool, - codeCoverageTargets: [TargetReference], - expandVariableFromTarget: TargetReference?, - preActions: [ExecutionAction], - postActions: [ExecutionAction], - diagnosticsOptions: SchemeDiagnosticsOptions, - language: String? = nil, - region: String? = nil, - preferredScreenCaptureFormat: ScreenCaptureFormat? = nil, - testPlans: [TestPlan]? = nil, - skippedTests: [String]? = nil - ) { - self.testPlans = testPlans - self.targets = targets - self.arguments = arguments - self.configurationName = configurationName - self.attachDebugger = attachDebugger - self.coverage = coverage - self.preActions = preActions - self.postActions = postActions - self.codeCoverageTargets = codeCoverageTargets - self.expandVariableFromTarget = expandVariableFromTarget - self.diagnosticsOptions = diagnosticsOptions - self.language = language - self.region = region - self.preferredScreenCaptureFormat = preferredScreenCaptureFormat - self.skippedTests = skippedTests - } -} diff --git a/Sources/XcodeGraph/Models/TestPlan.swift b/Sources/XcodeGraph/Models/TestPlan.swift deleted file mode 100644 index 341603ae3b4..00000000000 --- a/Sources/XcodeGraph/Models/TestPlan.swift +++ /dev/null @@ -1,16 +0,0 @@ -import Foundation -import Path - -public struct TestPlan: Hashable, Codable { - public let name: String - public let path: AbsolutePath - public let testTargets: [TestableTarget] - public let isDefault: Bool - - public init(path: AbsolutePath, testTargets: [TestableTarget], isDefault: Bool) { - name = path.basenameWithoutExt - self.path = path - self.testTargets = testTargets - self.isDefault = isDefault - } -} diff --git a/Sources/XcodeGraph/Models/Workspace.swift b/Sources/XcodeGraph/Models/Workspace.swift deleted file mode 100644 index b384e31127a..00000000000 --- a/Sources/XcodeGraph/Models/Workspace.swift +++ /dev/null @@ -1,150 +0,0 @@ -import Foundation -import Path -import TSCUtility - -public struct Workspace: Equatable, Codable { - // MARK: - Attributes - - /// Path to where the manifest / root directory of this workspace is located - public var path: AbsolutePath - /// Path to where the `.xcworkspace` will be generated - public var xcWorkspacePath: AbsolutePath - public var name: String - public var projects: [AbsolutePath] - public var schemes: [Scheme] - public var ideTemplateMacros: IDETemplateMacros? - public var additionalFiles: [FileElement] - public var generationOptions: GenerationOptions - - // MARK: - Init - - public init( - path: AbsolutePath, - xcWorkspacePath: AbsolutePath, - name: String, - projects: [AbsolutePath], - schemes: [Scheme] = [], - generationOptions: GenerationOptions = .init( - enableAutomaticXcodeSchemes: false, - autogeneratedWorkspaceSchemes: .enabled( - codeCoverageMode: .disabled, - testingOptions: [], - testLanguage: nil, - testRegion: nil, - testScreenCaptureFormat: nil - ), - lastXcodeUpgradeCheck: nil, - renderMarkdownReadme: false - ), - ideTemplateMacros: IDETemplateMacros? = nil, - additionalFiles: [FileElement] = [] - ) { - self.path = path - self.xcWorkspacePath = xcWorkspacePath - self.name = name - self.projects = projects - self.schemes = schemes - self.generationOptions = generationOptions - self.ideTemplateMacros = ideTemplateMacros - self.additionalFiles = additionalFiles - } -} - -extension Workspace { - public func with(name: String) -> Workspace { - var copy = self - copy.name = name - return copy - } - - public func adding(files: [AbsolutePath]) -> Workspace { - Workspace( - path: path, - xcWorkspacePath: xcWorkspacePath, - name: name, - projects: projects, - schemes: schemes, - generationOptions: generationOptions, - ideTemplateMacros: ideTemplateMacros, - additionalFiles: additionalFiles + files.map { .file(path: $0) } - ) - } - - public func replacing(projects: [AbsolutePath]) -> Workspace { - Workspace( - path: path, - xcWorkspacePath: xcWorkspacePath, - name: name, - projects: projects, - schemes: schemes, - generationOptions: generationOptions, - ideTemplateMacros: ideTemplateMacros, - additionalFiles: additionalFiles - ) - } - - public func merging(projects otherProjects: [AbsolutePath]) -> Workspace { - Workspace( - path: path, - xcWorkspacePath: xcWorkspacePath, - name: name, - projects: Array(Set(projects + otherProjects)), - schemes: schemes, - generationOptions: generationOptions, - ideTemplateMacros: ideTemplateMacros, - additionalFiles: additionalFiles - ) - } - - public func codeCoverageTargets(projects: [Project]) -> [TargetReference] { - switch codeCoverageMode { - case .all, .disabled: return [] - case let .targets(targets): return targets - case .relevant: - let allSchemes = schemes + projects.flatMap(\.schemes) - var resultTargets = Set() - - allSchemes.forEach { scheme in - // try to add code coverage targets only if code coverage is enabled - guard let testAction = scheme.testAction, testAction.coverage else { return } - - let schemeCoverageTargets = testAction.codeCoverageTargets - - // having empty `codeCoverageTargets` means that we should gather code coverage for all build targets - if schemeCoverageTargets.isEmpty, let buildAction = scheme.buildAction { - resultTargets.formUnion(buildAction.targets) - } else { - resultTargets.formUnion(schemeCoverageTargets) - } - } - - // if we find no schemes that gather code coverage data, there are no relevant targets, - // so we disable code coverage - if resultTargets.isEmpty { - return [] - } - - return Array(resultTargets) - } - } -} - -extension Workspace { - public var codeCoverageMode: GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode { - switch generationOptions.autogeneratedWorkspaceSchemes { - case let .enabled(codeCoverageMode, _, _, _, _): - return codeCoverageMode - case .disabled: - return .disabled - } - } - - public var testingOptions: TestingOptions { - switch generationOptions.autogeneratedWorkspaceSchemes { - case let .enabled(_, testingOptions, _, _, _): - return testingOptions - case .disabled: - return [] - } - } -} diff --git a/Sources/XcodeGraph/Models/XCFrameworkInfoPlist.swift b/Sources/XcodeGraph/Models/XCFrameworkInfoPlist.swift deleted file mode 100644 index 27b56a1f675..00000000000 --- a/Sources/XcodeGraph/Models/XCFrameworkInfoPlist.swift +++ /dev/null @@ -1,72 +0,0 @@ -import Foundation -import Path - -/// It represents th Info.plist contained in an .xcframework bundle. -public struct XCFrameworkInfoPlist: Codable, Hashable, Equatable { - private enum CodingKeys: String, CodingKey { - case libraries = "AvailableLibraries" - } - - /// It represents a library inside an .xcframework - public struct Library: Codable, Hashable, Equatable { - private enum CodingKeys: String, CodingKey { - case identifier = "LibraryIdentifier" - case path = "LibraryPath" - case architectures = "SupportedArchitectures" - case mergeable = "MergeableMetadata" - } - - /// It represents the library's platform. - public enum Platform: String, Hashable, Codable { - case ios - } - - /// Binary name used to import the library - public var binaryName: String { - path.basenameWithoutExt - } - - /// Library identifier. - public let identifier: String - - /// Path to the library. - public let path: RelativePath - - /// Declares if the library is mergeable or not - public let mergeable: Bool - - /// Architectures the binary is built for. - public let architectures: [BinaryArchitecture] - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(identifier, forKey: .identifier) - try container.encode(path, forKey: .path) - try container.encode(mergeable, forKey: .mergeable) - try container.encode(architectures, forKey: .architectures) - } - - public init( - identifier: String, - path: RelativePath, - mergeable: Bool, - architectures: [BinaryArchitecture] - ) { - self.identifier = identifier - self.path = path - self.mergeable = mergeable - self.architectures = architectures - } - - public init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - identifier = try container.decode(String.self, forKey: .identifier) - path = try container.decode(RelativePath.self, forKey: .path) - architectures = try container.decode([BinaryArchitecture].self, forKey: .architectures) - mergeable = try container.decodeIfPresent(Bool.self, forKey: .mergeable) ?? false - } - } - - /// List of libraries that are part of the .xcframework. - public let libraries: [Library] -} diff --git a/Sources/XcodeGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift b/Sources/XcodeGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift deleted file mode 100644 index fe51b9b2970..00000000000 --- a/Sources/XcodeGraphTesting/DependenciesGraph/DependenciesGraph+TestData.swift +++ /dev/null @@ -1,176 +0,0 @@ -import Foundation -import Path -import XcodeGraph - -extension DependenciesGraph { - public static func test( - externalDependencies: [String: [TargetDependency]] = [:], - externalProjects: [AbsolutePath: Project] = [:] - ) -> Self { - .init(externalDependencies: externalDependencies, externalProjects: externalProjects) - } - - public static func testXCFramework( - name: String = "Test", - // swiftlint:disable:next force_try - path: AbsolutePath = AbsolutePath.root.appending(try! RelativePath(validating: "Test.xcframework")), - status: FrameworkStatus = .required - ) -> DependenciesGraph { - let externalDependencies = [name: [TargetDependency.xcframework(path: path, status: status)]] - - return .init( - externalDependencies: externalDependencies, - externalProjects: [:] - ) - } - - public static func test( - packageFolder: AbsolutePath - ) -> Self { - let externalDependencies = [ - "Tuist": [ - TargetDependency.project( - target: "Tuist", - path: packageFolder - ), - ], - ] - - return .init( - externalDependencies: externalDependencies, - externalProjects: [:] - ) - } - - public static func aDependency( - packageFolder: AbsolutePath - ) -> Self { - let externalDependencies = [ - "ALibrary": [ - TargetDependency.project( - target: "ALibrary", - path: packageFolder - ), - ], - ] - - return .init( - externalDependencies: externalDependencies, - externalProjects: [:] - ) - } - - public static func anotherDependency( - packageFolder: AbsolutePath - ) -> Self { - let externalDependencies = [ - "AnotherLibrary": [ - TargetDependency.project( - target: "AnotherLibrary", - path: packageFolder - ), - ], - ] - - return .init( - externalDependencies: externalDependencies, - externalProjects: [:] - ) - } - - public static func alamofire( - packageFolder: AbsolutePath - ) -> Self { - let externalDependencies = [ - "Alamofire": [ - TargetDependency.project( - target: "Alamofire", - path: packageFolder - ), - ], - ] - - return .init( - externalDependencies: externalDependencies, - externalProjects: [:] - ) - } - - public static func googleAppMeasurement( - packageFolder: AbsolutePath - ) -> Self { - let externalDependencies = [ - "GoogleAppMeasurement": [ - TargetDependency.project( - target: "GoogleAppMeasurementTarget", - path: packageFolder - ), - ], - "GoogleAppMeasurementWithoutAdIdSupport": [ - TargetDependency.project( - target: "GoogleAppMeasurementWithoutAdIdSupportTarget", - path: packageFolder - ), - ], - ] - - return .init( - externalDependencies: externalDependencies, - externalProjects: [:] - ) - } - - public static func googleUtilities( - packageFolder: AbsolutePath - ) -> Self { - let externalDependencies = [ - "GULAppDelegateSwizzler": [ - TargetDependency.project( - target: "GULAppDelegateSwizzler", - path: packageFolder - ), - ], - "GULMethodSwizzler": [ - TargetDependency.project( - target: "GULMethodSwizzler", - path: packageFolder - ), - ], - "GULNSData": [ - TargetDependency.project( - target: "GULNSData", - path: packageFolder - ), - ], - "GULNetwork": [ - TargetDependency.project( - target: "GULNetwork", - path: packageFolder - ), - ], - ] - - return .init( - externalDependencies: externalDependencies, - externalProjects: [:] - ) - } - - public static func nanopb( - packageFolder: AbsolutePath - ) -> Self { - let externalDependencies = [ - "nanopb": [ - TargetDependency.project( - target: "nanopb", - path: packageFolder - ), - ], - ] - - return .init( - externalDependencies: externalDependencies, - externalProjects: [:] - ) - } -} diff --git a/Sources/XcodeGraphTesting/Graph/Graph+TestData.swift b/Sources/XcodeGraphTesting/Graph/Graph+TestData.swift deleted file mode 100644 index 266b1c0c126..00000000000 --- a/Sources/XcodeGraphTesting/Graph/Graph+TestData.swift +++ /dev/null @@ -1,25 +0,0 @@ -import Foundation -import Path -import XcodeGraph - -extension Graph { - public static func test( - name: String = "graph", - path: AbsolutePath = .root, - workspace: Workspace = .test(), - projects: [AbsolutePath: Project] = [:], - packages: [AbsolutePath: [String: Package]] = [:], - dependencies: [GraphDependency: Set] = [:], - dependencyConditions: [GraphEdge: PlatformCondition] = [:] - ) -> Graph { - Graph( - name: name, - path: path, - workspace: workspace, - projects: projects, - packages: packages, - dependencies: dependencies, - dependencyConditions: dependencyConditions - ) - } -} diff --git a/Sources/XcodeGraphTesting/Graph/GraphDependency+TestData.swift b/Sources/XcodeGraphTesting/Graph/GraphDependency+TestData.swift deleted file mode 100644 index 8373926c6a8..00000000000 --- a/Sources/XcodeGraphTesting/Graph/GraphDependency+TestData.swift +++ /dev/null @@ -1,113 +0,0 @@ -import Foundation -import Path - -@testable import XcodeGraph - -// swiftlint:disable force_try - -extension GraphDependency { - public static func testFramework( - path: AbsolutePath = AbsolutePath.root.appending(component: "Test.framework"), - binaryPath: AbsolutePath = AbsolutePath.root.appending(try! RelativePath(validating: "Test.framework/Test")), - dsymPath: AbsolutePath? = nil, - bcsymbolmapPaths: [AbsolutePath] = [], - linking: BinaryLinking = .dynamic, - architectures: [BinaryArchitecture] = [.armv7], - status: FrameworkStatus = .required - ) -> GraphDependency { - GraphDependency.framework( - path: path, - binaryPath: binaryPath, - dsymPath: dsymPath, - bcsymbolmapPaths: bcsymbolmapPaths, - linking: linking, - architectures: architectures, - status: status - ) - } - - public static func testMacro( - path: AbsolutePath = AbsolutePath.root.appending(try! RelativePath(validating: "macro")) - ) -> GraphDependency { - .macro(path: path) - } - - public static func testXCFramework( - path: AbsolutePath = AbsolutePath.root.appending(try! RelativePath(validating: "Test.xcframework")), - infoPlist: XCFrameworkInfoPlist = .test(), - primaryBinaryPath: AbsolutePath = AbsolutePath.root - .appending(try! RelativePath(validating: "Test.xcframework/Test")), - linking: BinaryLinking = .dynamic, - status: FrameworkStatus = .required, - macroPath: AbsolutePath? = nil - ) -> GraphDependency { - .xcframework( - GraphDependency.XCFramework( - path: path, - infoPlist: infoPlist, - primaryBinaryPath: primaryBinaryPath, - linking: linking, - mergeable: false, - status: status, - macroPath: macroPath - ) - ) - } - - public static func testTarget( - name: String = "Test", - path: AbsolutePath = .root - ) -> GraphDependency { - .target( - name: name, - path: path - ) - } - - public static func testSDK( - name: String = "XCTest.framework", - path: AbsolutePath = AbsolutePath.root.appending(try! RelativePath(validating: "XCTest.framework")), - status: SDKStatus = .required, - source: SDKSource = .system - ) -> GraphDependency { - .sdk( - name: name, - path: path, - status: status, - source: source - ) - } - - public static func testLibrary( - path: AbsolutePath = AbsolutePath.root.appending(try! RelativePath(validating: "libTuist.a")), - publicHeaders: AbsolutePath = AbsolutePath.root.appending(try! RelativePath(validating: "headers")), - linking: BinaryLinking = .dynamic, - architectures: [BinaryArchitecture] = [.armv7], - swiftModuleMap: AbsolutePath? = nil - ) -> GraphDependency { - .library( - path: path, - publicHeaders: publicHeaders, - linking: linking, - architectures: architectures, - swiftModuleMap: swiftModuleMap - ) - } - - public static func testBundle(path: AbsolutePath = .root.appending(component: "test.bundle")) -> GraphDependency { - .bundle(path: path) - } - - public static func testPackageProduct( - path: AbsolutePath = .root, - product: String = "Tuist" - ) -> GraphDependency { - .packageProduct( - path: path, - product: product, - type: .runtime - ) - } -} - -// swiftlint:enable force_try diff --git a/Sources/XcodeGraphTesting/Graph/GraphTarget+TestData.swift b/Sources/XcodeGraphTesting/Graph/GraphTarget+TestData.swift deleted file mode 100644 index 5bf7fc67822..00000000000 --- a/Sources/XcodeGraphTesting/Graph/GraphTarget+TestData.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation -import Path - -@testable import XcodeGraph - -extension GraphTarget { - public static func test( - path: AbsolutePath = .root, - target: Target = .test(), - project: Project = .test() - ) -> GraphTarget { - GraphTarget( - path: path, - target: target, - project: project - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/AnalyzeAction+TestData.swift b/Sources/XcodeGraphTesting/Models/AnalyzeAction+TestData.swift deleted file mode 100644 index 28e1b7edb24..00000000000 --- a/Sources/XcodeGraphTesting/Models/AnalyzeAction+TestData.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation -import Path -@testable import XcodeGraph - -extension AnalyzeAction { - public static func test(configurationName: String = "Beta Release") -> AnalyzeAction { - AnalyzeAction(configurationName: configurationName) - } -} diff --git a/Sources/XcodeGraphTesting/Models/ArchiveAction+TestData.swift b/Sources/XcodeGraphTesting/Models/ArchiveAction+TestData.swift deleted file mode 100644 index 0e1e91569ee..00000000000 --- a/Sources/XcodeGraphTesting/Models/ArchiveAction+TestData.swift +++ /dev/null @@ -1,21 +0,0 @@ -import Foundation -import Path -@testable import XcodeGraph - -extension ArchiveAction { - public static func test( - configurationName: String = "Beta Release", - revealArchiveInOrganizer: Bool = true, - customArchiveName: String? = nil, - preActions: [ExecutionAction] = [], - postActions: [ExecutionAction] = [] - ) -> ArchiveAction { - ArchiveAction( - configurationName: configurationName, - revealArchiveInOrganizer: revealArchiveInOrganizer, - customArchiveName: customArchiveName, - preActions: preActions, - postActions: postActions - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/Arguments+TestData.swift b/Sources/XcodeGraphTesting/Models/Arguments+TestData.swift deleted file mode 100644 index ed2d6c956bb..00000000000 --- a/Sources/XcodeGraphTesting/Models/Arguments+TestData.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation -import Path -@testable import XcodeGraph - -extension Arguments { - public static func test( - environmentVariables: [String: EnvironmentVariable] = [:], - launchArguments: [LaunchArgument] = [] - ) -> Arguments { - Arguments( - environmentVariables: environmentVariables, - launchArguments: launchArguments - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/BuildAction+TestData.swift b/Sources/XcodeGraphTesting/Models/BuildAction+TestData.swift deleted file mode 100644 index b361b92e127..00000000000 --- a/Sources/XcodeGraphTesting/Models/BuildAction+TestData.swift +++ /dev/null @@ -1,14 +0,0 @@ -import Foundation -import Path -import TuistSupport -@testable import XcodeGraph - -extension BuildAction { - public static func test( - targets: [TargetReference] = [TargetReference(projectPath: "/Project", name: "App")], - preActions: [ExecutionAction] = [], - postActions: [ExecutionAction] = [] - ) -> BuildAction { - BuildAction(targets: targets, preActions: preActions, postActions: postActions) - } -} diff --git a/Sources/XcodeGraphTesting/Models/Cloud+TestData.swift b/Sources/XcodeGraphTesting/Models/Cloud+TestData.swift deleted file mode 100644 index 06bebd38e9e..00000000000 --- a/Sources/XcodeGraphTesting/Models/Cloud+TestData.swift +++ /dev/null @@ -1,14 +0,0 @@ -import Foundation -import Path -import TuistSupportTesting -@testable import XcodeGraph - -extension Cloud { - public static func test( - url: URL = URL.test(), - projectId: String = "123", - options: [Cloud.Option] = [] - ) -> Cloud { - Cloud(url: url, projectId: projectId, options: options) - } -} diff --git a/Sources/XcodeGraphTesting/Models/Config+TestData.swift b/Sources/XcodeGraphTesting/Models/Config+TestData.swift deleted file mode 100644 index a62d32b5831..00000000000 --- a/Sources/XcodeGraphTesting/Models/Config+TestData.swift +++ /dev/null @@ -1,44 +0,0 @@ -import Foundation -import Path -import TSCUtility -@testable import XcodeGraph - -extension Config { - public static func test( - compatibleXcodeVersions: CompatibleXcodeVersions = .all, - cloud: Cloud? = Cloud.test(), - swiftVersion: Version? = nil, - plugins: [PluginLocation] = [], - generationOptions: GenerationOptions = Config.default.generationOptions, - path: AbsolutePath? = nil - ) -> Config { - .init( - compatibleXcodeVersions: compatibleXcodeVersions, - cloud: cloud, - swiftVersion: swiftVersion, - plugins: plugins, - generationOptions: generationOptions, - path: path - ) - } -} - -extension Config.GenerationOptions { - public static func test( - resolveDependenciesWithSystemScm: Bool = false, - disablePackageVersionLocking: Bool = false, - clonedSourcePackagesDirPath: AbsolutePath? = nil, - staticSideEffectsWarningTargets: XcodeGraph.Config.GenerationOptions.StaticSideEffectsWarningTargets = .all, - enforceExplicitDependencies: Bool = false, - defaultConfiguration: String? = nil - ) -> Self { - .init( - resolveDependenciesWithSystemScm: resolveDependenciesWithSystemScm, - disablePackageVersionLocking: disablePackageVersionLocking, - clonedSourcePackagesDirPath: clonedSourcePackagesDirPath, - staticSideEffectsWarningTargets: staticSideEffectsWarningTargets, - enforceExplicitDependencies: enforceExplicitDependencies, - defaultConfiguration: defaultConfiguration - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/Headers+TestData.swift b/Sources/XcodeGraphTesting/Models/Headers+TestData.swift deleted file mode 100644 index 4a6641b54ea..00000000000 --- a/Sources/XcodeGraphTesting/Models/Headers+TestData.swift +++ /dev/null @@ -1,17 +0,0 @@ -import Foundation -import Path -@testable import XcodeGraph - -extension Headers { - public static func test( - public: [AbsolutePath] = [], - private: [AbsolutePath] = [], - project: [AbsolutePath] = [] - ) -> Headers { - Headers( - public: `public`, - private: `private`, - project: project - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift b/Sources/XcodeGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift deleted file mode 100644 index 6a016067547..00000000000 --- a/Sources/XcodeGraphTesting/Models/Metadata/FrameworkMetadata+TestData.swift +++ /dev/null @@ -1,26 +0,0 @@ -import Foundation -import Path -import TuistSupport -@testable import XcodeGraph - -extension FrameworkMetadata { - public static func test( - path: AbsolutePath = "/Frameworks/TestFramework.xframework", - binaryPath: AbsolutePath = "/Frameworks/TestFramework.xframework/TestFramework", - dsymPath: AbsolutePath? = nil, - bcsymbolmapPaths: [AbsolutePath] = [], - linking: BinaryLinking = .dynamic, - architectures: [BinaryArchitecture] = [.arm64], - status: FrameworkStatus = .required - ) -> FrameworkMetadata { - FrameworkMetadata( - path: path, - binaryPath: binaryPath, - dsymPath: dsymPath, - bcsymbolmapPaths: bcsymbolmapPaths, - linking: linking, - architectures: architectures, - status: status - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/Metadata/LibraryMetadata+TestData.swift b/Sources/XcodeGraphTesting/Models/Metadata/LibraryMetadata+TestData.swift deleted file mode 100644 index 266cddc1ed6..00000000000 --- a/Sources/XcodeGraphTesting/Models/Metadata/LibraryMetadata+TestData.swift +++ /dev/null @@ -1,22 +0,0 @@ -import Foundation -import Path -import TuistSupport -@testable import XcodeGraph - -extension LibraryMetadata { - public static func test( - path: AbsolutePath = "/Libraries/libTest/libTest.a", - publicHeaders: AbsolutePath = "/Libraries/libTest/include", - swiftModuleMap: AbsolutePath? = "/Libraries/libTest/libTest.swiftmodule", - architectures: [BinaryArchitecture] = [.arm64], - linking: BinaryLinking = .static - ) -> LibraryMetadata { - LibraryMetadata( - path: path, - publicHeaders: publicHeaders, - swiftModuleMap: swiftModuleMap, - architectures: architectures, - linking: linking - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/Metadata/XCFrameworkMetadata+TestData.swift b/Sources/XcodeGraphTesting/Models/Metadata/XCFrameworkMetadata+TestData.swift deleted file mode 100644 index c9ad0312fb1..00000000000 --- a/Sources/XcodeGraphTesting/Models/Metadata/XCFrameworkMetadata+TestData.swift +++ /dev/null @@ -1,26 +0,0 @@ -import Foundation -import Path -import TuistSupport -@testable import XcodeGraph - -extension XCFrameworkMetadata { - public static func test( - path: AbsolutePath = "/XCFrameworks/XCFramework.xcframework", - infoPlist: XCFrameworkInfoPlist = .test(), - primaryBinaryPath: AbsolutePath = "/XCFrameworks/XCFramework.xcframework/ios-arm64/XCFramework", - linking: BinaryLinking = .dynamic, - mergeable: Bool = false, - status: FrameworkStatus = .required, - macroPath: AbsolutePath? = nil - ) -> XCFrameworkMetadata { - XCFrameworkMetadata( - path: path, - infoPlist: infoPlist, - primaryBinaryPath: primaryBinaryPath, - linking: linking, - mergeable: mergeable, - status: status, - macroPath: macroPath - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/PackageSettings+TestData.swift b/Sources/XcodeGraphTesting/Models/PackageSettings+TestData.swift deleted file mode 100644 index cfef21cb722..00000000000 --- a/Sources/XcodeGraphTesting/Models/PackageSettings+TestData.swift +++ /dev/null @@ -1,24 +0,0 @@ -import Foundation -import Path -import TSCUtility -@testable import XcodeGraph - -extension PackageSettings { - public static func test( - productTypes: [String: Product] = [:], - productDestinations: [String: Destinations] = [:], - baseSettings: Settings = .test(), - targetSettings: [String: SettingsDictionary] = [:], - projectOptions: [String: XcodeGraph.Project.Options] = [:], - swiftToolsVersion: Version = Version("5.4.9") - ) -> PackageSettings { - PackageSettings( - productTypes: productTypes, - productDestinations: productDestinations, - baseSettings: baseSettings, - targetSettings: targetSettings, - projectOptions: projectOptions, - swiftToolsVersion: swiftToolsVersion - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/Plugins+TestData.swift b/Sources/XcodeGraphTesting/Models/Plugins+TestData.swift deleted file mode 100644 index 073b0ad7b81..00000000000 --- a/Sources/XcodeGraphTesting/Models/Plugins+TestData.swift +++ /dev/null @@ -1,17 +0,0 @@ -import Foundation -import Path -@testable import XcodeGraph - -extension Plugins { - public static func test( - projectDescriptionHelpers: [ProjectDescriptionHelpersPlugin] = [], - templatePaths: [AbsolutePath] = [], - resourceSynthesizers: [PluginResourceSynthesizer] = [] - ) -> Plugins { - Plugins( - projectDescriptionHelpers: projectDescriptionHelpers, - templatePaths: templatePaths, - resourceSynthesizers: resourceSynthesizers - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/ProfileAction+TestData.swift b/Sources/XcodeGraphTesting/Models/ProfileAction+TestData.swift deleted file mode 100644 index 18e352ba23d..00000000000 --- a/Sources/XcodeGraphTesting/Models/ProfileAction+TestData.swift +++ /dev/null @@ -1,22 +0,0 @@ -import Foundation -import Path -import TuistSupport -@testable import XcodeGraph - -extension ProfileAction { - public static func test( - configurationName: String = "Beta Release", - preActions: [ExecutionAction] = [], - postActions: [ExecutionAction] = [], - executable: TargetReference? = TargetReference(projectPath: "/Project", name: "App"), - arguments: Arguments? = Arguments.test() - ) -> ProfileAction { - ProfileAction( - configurationName: configurationName, - preActions: preActions, - postActions: postActions, - executable: executable, - arguments: arguments - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/Project+TestData.swift b/Sources/XcodeGraphTesting/Models/Project+TestData.swift deleted file mode 100644 index 14c83e8f6f4..00000000000 --- a/Sources/XcodeGraphTesting/Models/Project+TestData.swift +++ /dev/null @@ -1,91 +0,0 @@ -import Foundation -import Path -import TSCUtility -@testable import XcodeGraph - -extension Project { - public static func test( - path: AbsolutePath = try! AbsolutePath(validating: "/Project"), // swiftlint:disable:this force_try - sourceRootPath: AbsolutePath = try! AbsolutePath(validating: "/Project"), // swiftlint:disable:this force_try - // swiftlint:disable:next force_try - xcodeProjPath: AbsolutePath = try! AbsolutePath(validating: "/Project/Project.xcodeproj"), - name: String = "Project", - organizationName: String? = nil, - defaultKnownRegions: [String]? = nil, - developmentRegion: String? = nil, - options: Options = .test(automaticSchemesOptions: .disabled), - settings: Settings = Settings.test(), - filesGroup: ProjectGroup = .group(name: "Project"), - targets: [Target] = [Target.test()], - packages: [Package] = [], - schemes: [Scheme] = [], - ideTemplateMacros: IDETemplateMacros? = nil, - additionalFiles: [FileElement] = [], - resourceSynthesizers: [ResourceSynthesizer] = [], - lastUpgradeCheck: Version? = nil, - isExternal: Bool = false - ) -> Project { - Project( - path: path, - sourceRootPath: sourceRootPath, - xcodeProjPath: xcodeProjPath, - name: name, - organizationName: organizationName, - defaultKnownRegions: defaultKnownRegions, - developmentRegion: developmentRegion, - options: options, - settings: settings, - filesGroup: filesGroup, - targets: targets, - packages: packages, - schemes: schemes, - ideTemplateMacros: ideTemplateMacros, - additionalFiles: additionalFiles, - resourceSynthesizers: resourceSynthesizers, - lastUpgradeCheck: lastUpgradeCheck, - isExternal: isExternal - ) - } - - public static func empty( - path: AbsolutePath = try! AbsolutePath(validating: "/test/"), // swiftlint:disable:this force_try - sourceRootPath: AbsolutePath = try! AbsolutePath(validating: "/test/"), // swiftlint:disable:this force_try - xcodeProjPath: AbsolutePath = try! AbsolutePath(validating: "/test/text.xcodeproj"), // swiftlint:disable:this force_try - name: String = "Project", - organizationName: String? = nil, - defaultKnownRegions: [String]? = nil, - developmentRegion: String? = nil, - options: Options = .test(automaticSchemesOptions: .disabled), - settings: Settings = .default, - filesGroup: ProjectGroup = .group(name: "Project"), - targets: [Target] = [], - packages: [Package] = [], - schemes: [Scheme] = [], - ideTemplateMacros: IDETemplateMacros? = nil, - additionalFiles: [FileElement] = [], - resourceSynthesizers: [ResourceSynthesizer] = [], - lastUpgradeCheck: Version? = nil, - isExternal: Bool = false - ) -> Project { - Project( - path: path, - sourceRootPath: sourceRootPath, - xcodeProjPath: xcodeProjPath, - name: name, - organizationName: organizationName, - defaultKnownRegions: defaultKnownRegions, - developmentRegion: developmentRegion, - options: options, - settings: settings, - filesGroup: filesGroup, - targets: targets, - packages: packages, - schemes: schemes, - ideTemplateMacros: ideTemplateMacros, - additionalFiles: additionalFiles, - resourceSynthesizers: resourceSynthesizers, - lastUpgradeCheck: lastUpgradeCheck, - isExternal: isExternal - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/RawScriptBuildPhase+TestData.swift b/Sources/XcodeGraphTesting/Models/RawScriptBuildPhase+TestData.swift deleted file mode 100644 index 4ed99315d93..00000000000 --- a/Sources/XcodeGraphTesting/Models/RawScriptBuildPhase+TestData.swift +++ /dev/null @@ -1,14 +0,0 @@ -import Foundation -import Path -@testable import XcodeGraph - -extension RawScriptBuildPhase { - public static func test( - name: String = "Test", - script: String = "", - showEnvVarsInLog: Bool = false, - hashable: Bool = false - ) -> RawScriptBuildPhase { - RawScriptBuildPhase(name: name, script: script, showEnvVarsInLog: showEnvVarsInLog, hashable: hashable) - } -} diff --git a/Sources/XcodeGraphTesting/Models/ResourceSynthesizerPlugin+TestData.swift b/Sources/XcodeGraphTesting/Models/ResourceSynthesizerPlugin+TestData.swift deleted file mode 100644 index a2e33ac2d09..00000000000 --- a/Sources/XcodeGraphTesting/Models/ResourceSynthesizerPlugin+TestData.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation -import Path -@testable import XcodeGraph - -extension PluginResourceSynthesizer { - public static func test( - name: String = "Plugin", - path: AbsolutePath = try! AbsolutePath(validating: "/test") // swiftlint:disable:this force_try - ) -> Self { - .init( - name: name, - path: path - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/RunAction+TestData.swift b/Sources/XcodeGraphTesting/Models/RunAction+TestData.swift deleted file mode 100644 index 03c5b69bda0..00000000000 --- a/Sources/XcodeGraphTesting/Models/RunAction+TestData.swift +++ /dev/null @@ -1,39 +0,0 @@ -import Foundation -import Path -import TuistSupport -@testable import XcodeGraph - -extension RunAction { - public static func test( - configurationName: String = BuildConfiguration.debug.name, - attachDebugger: Bool = true, - customLLDBInitFile: AbsolutePath? = nil, - preActions: [ExecutionAction] = [], - postActions: [ExecutionAction] = [], - executable: TargetReference? = TargetReference(projectPath: "/Project", name: "App"), - filePath: AbsolutePath? = nil, - arguments: Arguments? = Arguments.test(), - options: RunActionOptions = .init(), - diagnosticsOptions: SchemeDiagnosticsOptions = XcodeGraph.SchemeDiagnosticsOptions( - mainThreadCheckerEnabled: true, - performanceAntipatternCheckerEnabled: true - ), - expandVariableFromTarget: TargetReference? = nil, - launchStyle: LaunchStyle = .automatically - ) -> RunAction { - RunAction( - configurationName: configurationName, - attachDebugger: attachDebugger, - customLLDBInitFile: customLLDBInitFile, - preActions: preActions, - postActions: postActions, - executable: executable, - filePath: filePath, - arguments: arguments, - options: options, - diagnosticsOptions: diagnosticsOptions, - expandVariableFromTarget: expandVariableFromTarget, - launchStyle: launchStyle - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/Scheme+TestData.swift b/Sources/XcodeGraphTesting/Models/Scheme+TestData.swift deleted file mode 100644 index 4a9b51f8067..00000000000 --- a/Sources/XcodeGraphTesting/Models/Scheme+TestData.swift +++ /dev/null @@ -1,27 +0,0 @@ -import Foundation -import Path -@testable import XcodeGraph - -extension Scheme { - public static func test( - name: String = "Test", - shared: Bool = false, - buildAction: BuildAction? = BuildAction.test(), - testAction: TestAction? = TestAction.test(), - runAction: RunAction? = RunAction.test(), - archiveAction: ArchiveAction? = ArchiveAction.test(), - profileAction: ProfileAction? = ProfileAction.test(), - analyzeAction: AnalyzeAction? = AnalyzeAction.test() - ) -> Scheme { - Scheme( - name: name, - shared: shared, - buildAction: buildAction, - testAction: testAction, - runAction: runAction, - archiveAction: archiveAction, - profileAction: profileAction, - analyzeAction: analyzeAction - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/Settings+TestData.swift b/Sources/XcodeGraphTesting/Models/Settings+TestData.swift deleted file mode 100644 index 950a79ad5ba..00000000000 --- a/Sources/XcodeGraphTesting/Models/Settings+TestData.swift +++ /dev/null @@ -1,48 +0,0 @@ -import Foundation -import Path -@testable import XcodeGraph - -extension Configuration { - public static func test( - settings: SettingsDictionary = [:], - xcconfig: AbsolutePath? = try! AbsolutePath(validating: "/Config.xcconfig") // swiftlint:disable:this force_try - ) -> Configuration { - Configuration(settings: settings, xcconfig: xcconfig) - } -} - -extension Settings { - public static func test( - base: SettingsDictionary, - debug: Configuration, - release: Configuration - ) -> Settings { - Settings( - base: base, - configurations: [.debug: debug, .release: release] - ) - } - - public static func test( - base: SettingsDictionary = [:], - baseDebug: SettingsDictionary = [:], - configurations: [BuildConfiguration: Configuration?] = [:] - ) -> Settings { - Settings( - base: base, - baseDebug: baseDebug, - configurations: configurations - ) - } - - public static func test(defaultSettings: DefaultSettings) -> Settings { - Settings( - base: [:], - configurations: [ - .debug: Configuration(settings: [:]), - .release: Configuration(settings: [:]), - ], - defaultSettings: defaultSettings - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/Target+TestData.swift b/Sources/XcodeGraphTesting/Models/Target+TestData.swift deleted file mode 100644 index ca648e6e495..00000000000 --- a/Sources/XcodeGraphTesting/Models/Target+TestData.swift +++ /dev/null @@ -1,184 +0,0 @@ -import Foundation -import Path -@testable import XcodeGraph - -extension Target { - /// Creates a Target with test data - /// Note: Referenced paths may not exist - public static func test( - name: String = "Target", - destinations: Destinations = [.iPhone, .iPad], - product: Product = .app, - productName: String? = nil, - bundleId: String? = nil, - deploymentTargets: DeploymentTargets = .iOS("13.1"), - infoPlist: InfoPlist? = nil, - entitlements: Entitlements? = nil, - settings: Settings? = Settings.test(), - sources: [SourceFile] = [], - resources: ResourceFileElements = .init([]), - copyFiles: [CopyFilesAction] = [], - coreDataModels: [CoreDataModel] = [], - headers: Headers? = nil, - scripts: [TargetScript] = [], - environmentVariables: [String: EnvironmentVariable] = [:], - filesGroup: ProjectGroup = .group(name: "Project"), - dependencies: [TargetDependency] = [], - rawScriptBuildPhases: [RawScriptBuildPhase] = [], - launchArguments: [LaunchArgument] = [], - playgrounds: [AbsolutePath] = [], - additionalFiles: [FileElement] = [], - prune: Bool = false, - mergedBinaryType: MergedBinaryType = .disabled, - mergeable: Bool = false - ) -> Target { - Target( - name: name, - destinations: destinations, - product: product, - productName: productName, - bundleId: bundleId ?? "io.tuist.\(name)", - deploymentTargets: deploymentTargets, - infoPlist: infoPlist, - entitlements: entitlements, - settings: settings, - sources: sources, - resources: resources, - copyFiles: copyFiles, - headers: headers, - coreDataModels: coreDataModels, - scripts: scripts, - environmentVariables: environmentVariables, - launchArguments: launchArguments, - filesGroup: filesGroup, - dependencies: dependencies, - rawScriptBuildPhases: rawScriptBuildPhases, - playgrounds: playgrounds, - additionalFiles: additionalFiles, - prune: prune, - mergedBinaryType: mergedBinaryType, - mergeable: mergeable - ) - } - - /// Creates a Target with test data - /// Note: Referenced paths may not exist - public static func test( - name: String = "Target", - platform: Platform, - product: Product = .app, - productName: String? = nil, - bundleId: String? = nil, - deploymentTarget: DeploymentTargets = .iOS("13.1"), - infoPlist: InfoPlist? = nil, - entitlements: Entitlements? = nil, - settings: Settings? = Settings.test(), - sources: [SourceFile] = [], - resources: ResourceFileElements = .init([]), - copyFiles: [CopyFilesAction] = [], - coreDataModels: [CoreDataModel] = [], - headers: Headers? = nil, - scripts: [TargetScript] = [], - environmentVariables: [String: EnvironmentVariable] = [:], - filesGroup: ProjectGroup = .group(name: "Project"), - dependencies: [TargetDependency] = [], - rawScriptBuildPhases: [RawScriptBuildPhase] = [], - launchArguments: [LaunchArgument] = [], - playgrounds: [AbsolutePath] = [], - additionalFiles: [FileElement] = [], - prune: Bool = false, - mergedBinaryType: MergedBinaryType = .disabled, - mergeable: Bool = false - ) -> Target { - Target( - name: name, - destinations: destinationsFrom(platform), - product: product, - productName: productName, - bundleId: bundleId ?? "io.tuist.\(name)", - deploymentTargets: deploymentTarget, - infoPlist: infoPlist, - entitlements: entitlements, - settings: settings, - sources: sources, - resources: resources, - copyFiles: copyFiles, - headers: headers, - coreDataModels: coreDataModels, - scripts: scripts, - environmentVariables: environmentVariables, - launchArguments: launchArguments, - filesGroup: filesGroup, - dependencies: dependencies, - rawScriptBuildPhases: rawScriptBuildPhases, - playgrounds: playgrounds, - additionalFiles: additionalFiles, - prune: prune, - mergedBinaryType: mergedBinaryType, - mergeable: mergeable - ) - } - - /// Creates a bare bones Target with as little data as possible - public static func empty( - name: String = "Target", - destinations: Destinations = [.iPhone, .iPad], - product: Product = .app, - productName: String? = nil, - bundleId: String? = nil, - deploymentTargets: DeploymentTargets = .init(), - infoPlist: InfoPlist? = nil, - entitlements: Entitlements? = nil, - settings: Settings? = nil, - sources: [SourceFile] = [], - resources: ResourceFileElements = .init([]), - copyFiles: [CopyFilesAction] = [], - coreDataModels: [CoreDataModel] = [], - headers: Headers? = nil, - scripts: [TargetScript] = [], - environmentVariables: [String: EnvironmentVariable] = [:], - filesGroup: ProjectGroup = .group(name: "Project"), - dependencies: [TargetDependency] = [], - rawScriptBuildPhases: [RawScriptBuildPhase] = [], - onDemandResourcesTags: OnDemandResourcesTags? = nil - ) -> Target { - Target( - name: name, - destinations: destinations, - product: product, - productName: productName, - bundleId: bundleId ?? "io.tuist.\(name)", - deploymentTargets: deploymentTargets, - infoPlist: infoPlist, - entitlements: entitlements, - settings: settings, - sources: sources, - resources: resources, - copyFiles: copyFiles, - headers: headers, - coreDataModels: coreDataModels, - scripts: scripts, - environmentVariables: environmentVariables, - filesGroup: filesGroup, - dependencies: dependencies, - rawScriptBuildPhases: rawScriptBuildPhases, - onDemandResourcesTags: onDemandResourcesTags - ) - } - - // Maps a platform to a set of Destinations. For migration purposes - private static func destinationsFrom(_ platform: Platform) -> Destinations { - switch platform { - case .iOS: - return .iOS - case .macOS: - return .macOS - case .tvOS: - return .tvOS - case .watchOS: - return .watchOS - case .visionOS: - return .visionOS - } - } -} diff --git a/Sources/XcodeGraphTesting/Models/Template+TestData.swift b/Sources/XcodeGraphTesting/Models/Template+TestData.swift deleted file mode 100644 index 020b6abdac0..00000000000 --- a/Sources/XcodeGraphTesting/Models/Template+TestData.swift +++ /dev/null @@ -1,29 +0,0 @@ -import Foundation -import Path -@testable import XcodeGraph - -extension Template { - public static func test( - description: String = "Template", - attributes: [Attribute] = [], - items: [Template.Item] = [] - ) -> Template { - Template( - description: description, - attributes: attributes, - items: items - ) - } -} - -extension Template.Item { - public static func test( - path: RelativePath, - contents: Template.Contents = .string("test content") - ) -> Template.Item { - Template.Item( - path: path, - contents: contents - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/TestAction+TestData.swift b/Sources/XcodeGraphTesting/Models/TestAction+TestData.swift deleted file mode 100644 index 1459baaa4b1..00000000000 --- a/Sources/XcodeGraphTesting/Models/TestAction+TestData.swift +++ /dev/null @@ -1,42 +0,0 @@ -import Foundation -import Path -import TuistSupport -@testable import XcodeGraph - -extension TestAction { - public static func test( - targets: [TestableTarget] = [TestableTarget(target: TargetReference(projectPath: "/Project", name: "AppTests"))], - arguments: Arguments? = Arguments.test(), - configurationName: String = BuildConfiguration.debug.name, - attachDebugger: Bool = true, - coverage: Bool = false, - codeCoverageTargets: [TargetReference] = [], - expandVariableFromTarget: TargetReference? = nil, - preActions: [ExecutionAction] = [], - postActions: [ExecutionAction] = [], - diagnosticsOptions: SchemeDiagnosticsOptions = SchemeDiagnosticsOptions(mainThreadCheckerEnabled: true), - language: String? = nil, - region: String? = nil, - preferredScreenCaptureFormat: ScreenCaptureFormat? = nil, - testPlans: [TestPlan]? = nil, - skippedTests: [String]? = nil - ) -> TestAction { - TestAction( - targets: targets, - arguments: arguments, - configurationName: configurationName, - attachDebugger: attachDebugger, - coverage: coverage, - codeCoverageTargets: codeCoverageTargets, - expandVariableFromTarget: expandVariableFromTarget, - preActions: preActions, - postActions: postActions, - diagnosticsOptions: diagnosticsOptions, - language: language, - region: region, - preferredScreenCaptureFormat: preferredScreenCaptureFormat, - testPlans: testPlans, - skippedTests: skippedTests - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/TestableTarget+TestData.swift b/Sources/XcodeGraphTesting/Models/TestableTarget+TestData.swift deleted file mode 100644 index ef3a8ad6235..00000000000 --- a/Sources/XcodeGraphTesting/Models/TestableTarget+TestData.swift +++ /dev/null @@ -1,21 +0,0 @@ -import Path -import TuistSupport -import XcodeGraph - -extension TestableTarget { - public static func test( - target: TargetReference = TargetReference(projectPath: "/Project", name: "App"), - skipped: Bool = false, - parallelizable: Bool = false, - randomExecutionOrdering: Bool = false, - simulatedLocation: SimulatedLocation? = nil - ) -> TestableTarget { - TestableTarget( - target: target, - skipped: skipped, - parallelizable: parallelizable, - randomExecutionOrdering: randomExecutionOrdering, - simulatedLocation: simulatedLocation - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/Workspace+TestData.swift b/Sources/XcodeGraphTesting/Models/Workspace+TestData.swift deleted file mode 100644 index f197dafdc68..00000000000 --- a/Sources/XcodeGraphTesting/Models/Workspace+TestData.swift +++ /dev/null @@ -1,49 +0,0 @@ -import Foundation -import Path -import TSCUtility -@testable import XcodeGraph - -extension Workspace { - public static func test( - path: AbsolutePath = try! AbsolutePath(validating: "/"), // swiftlint:disable:this force_try - xcWorkspacePath: AbsolutePath = try! AbsolutePath(validating: "/"), // swiftlint:disable:this force_try - name: String = "test", - projects: [AbsolutePath] = [], - schemes: [Scheme] = [], - ideTemplateMacros: IDETemplateMacros? = nil, - additionalFiles: [FileElement] = [], - generationOptions: GenerationOptions = .test() - ) -> Workspace { - Workspace( - path: path, - xcWorkspacePath: xcWorkspacePath, - name: name, - projects: projects, - schemes: schemes, - generationOptions: generationOptions, - ideTemplateMacros: ideTemplateMacros, - additionalFiles: additionalFiles - ) - } -} - -extension Workspace.GenerationOptions { - public static func test( - enableAutomaticXcodeSchemes: Bool? = false, - autogeneratedWorkspaceSchemes: AutogeneratedWorkspaceSchemes = .enabled( - codeCoverageMode: .disabled, - testingOptions: [], - testLanguage: nil, - testRegion: nil, - testScreenCaptureFormat: nil - ), - lastXcodeUpgradeCheck: Version? = nil - ) -> Self { - .init( - enableAutomaticXcodeSchemes: enableAutomaticXcodeSchemes, - autogeneratedWorkspaceSchemes: autogeneratedWorkspaceSchemes, - lastXcodeUpgradeCheck: lastXcodeUpgradeCheck, - renderMarkdownReadme: false - ) - } -} diff --git a/Sources/XcodeGraphTesting/Models/XCFrameworkInfoPlist+TestData.swift b/Sources/XcodeGraphTesting/Models/XCFrameworkInfoPlist+TestData.swift deleted file mode 100644 index 832f09e2676..00000000000 --- a/Sources/XcodeGraphTesting/Models/XCFrameworkInfoPlist+TestData.swift +++ /dev/null @@ -1,27 +0,0 @@ -import Foundation -import Path - -@testable import XcodeGraph - -extension XCFrameworkInfoPlist { - public static func test(libraries: [XCFrameworkInfoPlist.Library] = [.test()]) -> XCFrameworkInfoPlist { - XCFrameworkInfoPlist(libraries: libraries) - } -} - -extension XCFrameworkInfoPlist.Library { - public static func test( - identifier: String = "test", - // swiftlint:disable:next force_try - path: RelativePath = try! RelativePath(validating: "relative/to/library"), - mergeable: Bool = false, - architectures: [BinaryArchitecture] = [.i386] - ) -> XCFrameworkInfoPlist.Library { - XCFrameworkInfoPlist.Library( - identifier: identifier, - path: path, - mergeable: mergeable, - architectures: architectures - ) - } -} diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index 83d539464e4..cb44cae5686 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -6,7 +6,6 @@ import XCTest @testable import TuistCore @testable import TuistCoreTesting @testable import TuistSupportTesting -@testable import XcodeGraphTesting final class GraphTraverserTests: TuistUnitTestCase { func test_dependsOnXCTest_when_is_framework() { @@ -3869,7 +3868,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ], ], dependencyConditions: [ - GraphEdge(from: appkGraphDependency, to: staticFrameworkGraphDependency): try .test([.ios]), + GraphEdge(from: appkGraphDependency, to: staticFrameworkGraphDependency): try XCTUnwrap(.test([.ios])), ] ) let subject = GraphTraverser(graph: graph) @@ -3910,8 +3909,8 @@ final class GraphTraverserTests: TuistUnitTestCase { ], ], dependencyConditions: [ - GraphEdge(from: appkGraphDependency, to: staticFrameworkGraphDependency): try .test([.macos]), - GraphEdge(from: staticFrameworkGraphDependency, to: sdkGraphDependency): try .test([.ios]), + GraphEdge(from: appkGraphDependency, to: staticFrameworkGraphDependency): try XCTUnwrap(.test([.macos])), + GraphEdge(from: staticFrameworkGraphDependency, to: sdkGraphDependency): try XCTUnwrap(.test([.ios])), ] ) let subject = GraphTraverser(graph: graph) @@ -3950,7 +3949,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ], ], dependencyConditions: [ - GraphEdge(from: staticFrameworkGraphDependency, to: sdkGraphDependency): try .test([.ios]), + GraphEdge(from: staticFrameworkGraphDependency, to: sdkGraphDependency): try XCTUnwrap(.test([.ios])), ] ) let subject = GraphTraverser(graph: graph) @@ -4007,7 +4006,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ], ], dependencyConditions: [ - GraphEdge(from: staticFrameworkAGraphDependency, to: sdkGraphDependency): try .test([.ios]), + GraphEdge(from: staticFrameworkAGraphDependency, to: sdkGraphDependency): try XCTUnwrap(.test([.ios])), ] ) let subject = GraphTraverser(graph: graph) @@ -4077,7 +4076,7 @@ final class GraphTraverserTests: TuistUnitTestCase { ], ], dependencyConditions: [ - GraphEdge(from: appkGraphDependency, to: staticFrameworkBGraphDependency): try .test([.macos]), + GraphEdge(from: appkGraphDependency, to: staticFrameworkBGraphDependency): try XCTUnwrap(.test([.macos])), ] ) let subject = GraphTraverser(graph: graph) @@ -4285,7 +4284,7 @@ final class GraphTraverserTests: TuistUnitTestCase { appDependency: Set([frameworkDependency]), frameworkDependency: Set([]), ] - let platformCondition = try PlatformCondition.test([.ios]) + let platformCondition = try XCTUnwrap(PlatformCondition.test([.ios])) // Given: Value Graph let graph = Graph.test( @@ -4333,7 +4332,7 @@ final class GraphTraverserTests: TuistUnitTestCase { frameworkBDependency: Set([frameworkCDependency]), frameworkCDependency: Set([frameworkDDependency]), ] - let platformCondition = try PlatformCondition.test([.ios]) + let platformCondition = try XCTUnwrap(PlatformCondition.test([.ios])) // Given: Value Graph let graph = Graph.test( diff --git a/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift index 7236eab4dd5..a02716138f0 100644 --- a/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift @@ -1,6 +1,5 @@ import Foundation import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistDependencies diff --git a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift index f40b56a80b9..5596ce249eb 100644 --- a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift @@ -1,7 +1,6 @@ import Foundation import Path import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistDependencies diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift index 0b82e0fce58..8a6156aa34c 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift @@ -4,7 +4,6 @@ import TSCBasic import TuistCore import TuistLoaderTesting import XcodeGraph -import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift index 21b216a0d56..1d1c96a3b65 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift @@ -5,7 +5,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/WorkspaceGeneratorIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/WorkspaceGeneratorIntegrationTests.swift index a4c56b337fe..ec7fad19bb0 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/WorkspaceGeneratorIntegrationTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/WorkspaceGeneratorIntegrationTests.swift @@ -4,7 +4,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Extensions/Xcodeproj+ExtrasTests.swift b/Tests/TuistGeneratorTests/Extensions/Xcodeproj+ExtrasTests.swift index b41ffe8f516..c63f567ca24 100644 --- a/Tests/TuistGeneratorTests/Extensions/Xcodeproj+ExtrasTests.swift +++ b/Tests/TuistGeneratorTests/Extensions/Xcodeproj+ExtrasTests.swift @@ -2,7 +2,6 @@ import XcodeGraph import XcodeProj import XCTest @testable import TuistGenerator -@testable import XcodeGraphTesting class XcodeprojExtrasTests: XCTestCase { func test_pbxFileElement_sort() { @@ -37,7 +36,7 @@ class XcodeprojExtrasTests: XCTestCase { // Given let target = Target.test(destinations: [.iPhone, .iPad, .mac]) let buildFile = PBXBuildFile() - let dependencyCondition: PlatformCondition = try .test([.ios, .macos]) + let dependencyCondition: PlatformCondition = try XCTUnwrap(.test([.ios, .macos])) // When buildFile.applyCondition(dependencyCondition, applicableTo: target) @@ -64,7 +63,7 @@ class XcodeprojExtrasTests: XCTestCase { // Given let target = Target.test(destinations: [.mac]) let buildFile = PBXBuildFile() - let dependencyCondition: PlatformCondition = try .test([.ios, .macos]) + let dependencyCondition: PlatformCondition = try XCTUnwrap(.test([.ios, .macos])) // When buildFile.applyCondition(dependencyCondition, applicableTo: target) @@ -78,7 +77,7 @@ class XcodeprojExtrasTests: XCTestCase { // Given let target = Target.test(destinations: [.iPhone, .iPad, .mac, .appleVision]) let buildFile = PBXBuildFile() - let dependencyCondition: PlatformCondition = try .test([.ios, .macos]) + let dependencyCondition: PlatformCondition = try XCTUnwrap(.test([.ios, .macos])) // When buildFile.applyCondition(dependencyCondition, applicableTo: target) @@ -92,7 +91,7 @@ class XcodeprojExtrasTests: XCTestCase { // Given let target = Target.test(destinations: [.iPhone, .iPad, .appleVision]) let buildFile = PBXBuildFile() - let dependencyCondition: PlatformCondition = try .test([.ios, .macos]) + let dependencyCondition: PlatformCondition = try XCTUnwrap(.test([.ios, .macos])) // When buildFile.applyCondition(dependencyCondition, applicableTo: target) @@ -106,7 +105,7 @@ class XcodeprojExtrasTests: XCTestCase { // Given let target = Target.test(destinations: [.appleVision]) let buildFile = PBXBuildFile() - let dependencyCondition: PlatformCondition = try .test([.macos]) + let dependencyCondition: PlatformCondition = try XCTUnwrap(.test([.macos])) // When buildFile.applyCondition(dependencyCondition, applicableTo: target) diff --git a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift index c429e86bf3d..76a3e4f6ac4 100644 --- a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift @@ -4,7 +4,6 @@ import Path import TuistCore import TuistSupport import XcodeGraph -import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift index ba23a8187cc..aadafaa7b3b 100644 --- a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift @@ -4,7 +4,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/InfoPlistContentProviderTests.swift b/Tests/TuistGeneratorTests/Generator/InfoPlistContentProviderTests.swift index 8f225123b63..8db215c389b 100644 --- a/Tests/TuistGeneratorTests/Generator/InfoPlistContentProviderTests.swift +++ b/Tests/TuistGeneratorTests/Generator/InfoPlistContentProviderTests.swift @@ -2,7 +2,6 @@ import Foundation import TuistCore import TuistCoreTesting import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift index 379940d6621..e573a08b001 100644 --- a/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift @@ -2,7 +2,6 @@ import Foundation import Path import TuistCore import XcodeGraph -import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistCoreTesting diff --git a/Tests/TuistGeneratorTests/Generator/Mocks/MockInfoPlistContentProvider.swift b/Tests/TuistGeneratorTests/Generator/Mocks/MockInfoPlistContentProvider.swift index f6182df8faa..318dd434b7b 100644 --- a/Tests/TuistGeneratorTests/Generator/Mocks/MockInfoPlistContentProvider.swift +++ b/Tests/TuistGeneratorTests/Generator/Mocks/MockInfoPlistContentProvider.swift @@ -2,7 +2,6 @@ import Foundation import TuistCore import TuistCoreTesting import XcodeGraph -import XcodeGraphTesting @testable import TuistGenerator final class MockInfoPlistContentProvider: InfoPlistContentProviding { diff --git a/Tests/TuistGeneratorTests/Generator/Mocks/MockProjectDescriptorGenerator.swift b/Tests/TuistGeneratorTests/Generator/Mocks/MockProjectDescriptorGenerator.swift index 8a59a14c3aa..929899b4ead 100644 --- a/Tests/TuistGeneratorTests/Generator/Mocks/MockProjectDescriptorGenerator.swift +++ b/Tests/TuistGeneratorTests/Generator/Mocks/MockProjectDescriptorGenerator.swift @@ -4,7 +4,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XcodeProj @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/Mocks/MockSchemeDescriptorsGenerator.swift b/Tests/TuistGeneratorTests/Generator/Mocks/MockSchemeDescriptorsGenerator.swift index e88adda9653..1f8a399896c 100644 --- a/Tests/TuistGeneratorTests/Generator/Mocks/MockSchemeDescriptorsGenerator.swift +++ b/Tests/TuistGeneratorTests/Generator/Mocks/MockSchemeDescriptorsGenerator.swift @@ -3,7 +3,6 @@ import Path import TuistCore import TuistCoreTesting import XcodeGraph -import XcodeGraphTesting @testable import TuistGenerator final class MockSchemeDescriptorsGenerator: SchemeDescriptorsGenerating { diff --git a/Tests/TuistGeneratorTests/Generator/Mocks/MockTargetGenerator.swift b/Tests/TuistGeneratorTests/Generator/Mocks/MockTargetGenerator.swift index a221447b250..3cd3dbfc5fe 100644 --- a/Tests/TuistGeneratorTests/Generator/Mocks/MockTargetGenerator.swift +++ b/Tests/TuistGeneratorTests/Generator/Mocks/MockTargetGenerator.swift @@ -4,7 +4,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XcodeProj @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/Mocks/MockWorkspaceDescriptorGenerator.swift b/Tests/TuistGeneratorTests/Generator/Mocks/MockWorkspaceDescriptorGenerator.swift index 28bd7d34f1c..789b1bb606f 100644 --- a/Tests/TuistGeneratorTests/Generator/Mocks/MockWorkspaceDescriptorGenerator.swift +++ b/Tests/TuistGeneratorTests/Generator/Mocks/MockWorkspaceDescriptorGenerator.swift @@ -4,7 +4,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XcodeProj @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift index 633d4d3a55f..61651456f9e 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift @@ -6,7 +6,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift index 5fc01f42ac7..c51234e0bc8 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift @@ -4,7 +4,6 @@ import Path import TuistCore import TuistCoreTesting import XcodeGraph -import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift index 3f705074e24..edec22b6eb3 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift @@ -4,7 +4,6 @@ import PathKit import TuistCore import TuistCoreTesting import XcodeGraph -import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift index ca18ad5b80d..a6a48b48d9a 100644 --- a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift @@ -4,7 +4,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XcodeProj import XCTest diff --git a/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift index 5a232ac5389..25c99206ef8 100644 --- a/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/TargetGeneratorTests.swift @@ -3,7 +3,6 @@ import Path import TuistCore import TuistCoreTesting import XcodeGraph -import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift index 01d8e585d00..834057763e5 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift @@ -5,7 +5,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift index 2b2e34147d6..370dfd95e3e 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceSettingsDescriptorGeneratorTests.swift @@ -5,7 +5,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XcodeProj import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift index f45801b0b5a..fb297be002b 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift @@ -3,7 +3,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistGenerator @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift b/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift index 84607206c62..27e47d7d531 100644 --- a/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift +++ b/Tests/TuistGeneratorTests/GraphMappers/AutogeneratedWorkspaceSchemeWorkspaceMapperTests.swift @@ -2,7 +2,6 @@ import Foundation import Path import TuistCore import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift b/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift index b43db168c07..d3dc34d23a4 100644 --- a/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift +++ b/Tests/TuistGeneratorTests/GraphViz/GraphToGraphVizMapperTests.swift @@ -3,7 +3,6 @@ import GraphViz import Path import TuistCore import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift b/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift index 41c5d869fb3..bc7c6ed5a0b 100644 --- a/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift @@ -3,7 +3,6 @@ import Path import TuistCore import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistCoreTesting @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift index 87d3cf2c9a3..f4d5703473b 100644 --- a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift @@ -9,7 +9,6 @@ import XCTest @testable import TuistCoreTesting @testable import TuistGenerator @testable import TuistSupportTesting -@testable import XcodeGraphTesting final class GraphLinterTests: TuistUnitTestCase { var subject: GraphLinter! @@ -1765,7 +1764,7 @@ final class GraphLinterTests: TuistUnitTestCase { GraphEdge( from: .target(name: iOSAndMacTarget.name, path: path), to: .target(name: macOnlyTarget.name, path: path) - ): try .test([.macos]), + ): try XCTUnwrap(.test([.macos])), ] ) let config = Config.test() diff --git a/Tests/TuistGeneratorTests/Linter/Mocks/MockPackageLinter.swift b/Tests/TuistGeneratorTests/Linter/Mocks/MockPackageLinter.swift index fe095280015..318297d8786 100644 --- a/Tests/TuistGeneratorTests/Linter/Mocks/MockPackageLinter.swift +++ b/Tests/TuistGeneratorTests/Linter/Mocks/MockPackageLinter.swift @@ -2,7 +2,6 @@ import Foundation import TuistCore import TuistSupport import XcodeGraph -import XcodeGraphTesting @testable import TuistGenerator class MockPackageLinter: PackageLinting { diff --git a/Tests/TuistGeneratorTests/Linter/Mocks/MockProjectLinter.swift b/Tests/TuistGeneratorTests/Linter/Mocks/MockProjectLinter.swift index 89c5dd4b9bf..8c2aef7389c 100644 --- a/Tests/TuistGeneratorTests/Linter/Mocks/MockProjectLinter.swift +++ b/Tests/TuistGeneratorTests/Linter/Mocks/MockProjectLinter.swift @@ -3,7 +3,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting @testable import TuistGenerator class MockProjectLinter: ProjectLinting { diff --git a/Tests/TuistGeneratorTests/Linter/Mocks/MockSchemeLinter.swift b/Tests/TuistGeneratorTests/Linter/Mocks/MockSchemeLinter.swift index f6db4388376..b2987edaec2 100644 --- a/Tests/TuistGeneratorTests/Linter/Mocks/MockSchemeLinter.swift +++ b/Tests/TuistGeneratorTests/Linter/Mocks/MockSchemeLinter.swift @@ -2,7 +2,6 @@ import Foundation import TuistCore import TuistSupport import XcodeGraph -import XcodeGraphTesting @testable import TuistGenerator class MockSchemeLinter: SchemeLinting { diff --git a/Tests/TuistGeneratorTests/Linter/Mocks/MockSettingsLinter.swift b/Tests/TuistGeneratorTests/Linter/Mocks/MockSettingsLinter.swift index f4c6e85fe20..9deb38a314c 100644 --- a/Tests/TuistGeneratorTests/Linter/Mocks/MockSettingsLinter.swift +++ b/Tests/TuistGeneratorTests/Linter/Mocks/MockSettingsLinter.swift @@ -2,7 +2,6 @@ import Foundation import TuistCore import TuistSupport import XcodeGraph -import XcodeGraphTesting @testable import TuistGenerator class MockSettingsLinter: SettingsLinting { diff --git a/Tests/TuistGeneratorTests/Linter/Mocks/MockStaticProductsGraphLinter.swift b/Tests/TuistGeneratorTests/Linter/Mocks/MockStaticProductsGraphLinter.swift index 53254515db4..68582eafccf 100644 --- a/Tests/TuistGeneratorTests/Linter/Mocks/MockStaticProductsGraphLinter.swift +++ b/Tests/TuistGeneratorTests/Linter/Mocks/MockStaticProductsGraphLinter.swift @@ -1,6 +1,5 @@ import Foundation import TuistCore -import XcodeGraph @testable import TuistGenerator class MockStaticProductsGraphLinter: StaticProductsGraphLinting { diff --git a/Tests/TuistGeneratorTests/Linter/Mocks/MockTargetLinter.swift b/Tests/TuistGeneratorTests/Linter/Mocks/MockTargetLinter.swift index 4e32776d6eb..f62868f7f1d 100644 --- a/Tests/TuistGeneratorTests/Linter/Mocks/MockTargetLinter.swift +++ b/Tests/TuistGeneratorTests/Linter/Mocks/MockTargetLinter.swift @@ -2,7 +2,6 @@ import Foundation import TuistCore import TuistSupport import XcodeGraph -import XcodeGraphTesting @testable import TuistGenerator class MockTargetLinter: TargetLinting { diff --git a/Tests/TuistGeneratorTests/Linter/PackageLinterTests.swift b/Tests/TuistGeneratorTests/Linter/PackageLinterTests.swift index fbae149394f..e638ad7e897 100644 --- a/Tests/TuistGeneratorTests/Linter/PackageLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/PackageLinterTests.swift @@ -4,7 +4,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistGenerator @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift b/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift index 4e43a76edba..78dad9dbff8 100644 --- a/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/ProjectLinterTests.swift @@ -4,7 +4,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/Linter/SchemeLinterTests.swift b/Tests/TuistGeneratorTests/Linter/SchemeLinterTests.swift index 707c0935545..08900b93eb6 100644 --- a/Tests/TuistGeneratorTests/Linter/SchemeLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/SchemeLinterTests.swift @@ -3,7 +3,6 @@ import Path import TuistCore import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistGenerator @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/Linter/SettingsLinterTests.swift b/Tests/TuistGeneratorTests/Linter/SettingsLinterTests.swift index 401e793e27a..82fe6adbfb4 100644 --- a/Tests/TuistGeneratorTests/Linter/SettingsLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/SettingsLinterTests.swift @@ -6,7 +6,6 @@ import XcodeGraph import XCTest @testable import TuistGenerator @testable import TuistSupportTesting -@testable import XcodeGraphTesting final class SettingsLinterTests: TuistUnitTestCase { var subject: SettingsLinter! diff --git a/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift index e85b5c19641..c940f38a334 100644 --- a/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift @@ -6,7 +6,6 @@ import XCTest @testable import TuistCoreTesting @testable import TuistGenerator @testable import TuistSupportTesting -@testable import XcodeGraphTesting class StaticProductsGraphLinterTests: XCTestCase { var subject: StaticProductsGraphLinter! diff --git a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift index d16df7b42eb..008370851ae 100644 --- a/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/TargetLinterTests.swift @@ -4,7 +4,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistGenerator @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/Linter/TargetScriptLinterTests.swift b/Tests/TuistGeneratorTests/Linter/TargetScriptLinterTests.swift index 9cf10736619..d2c44b7980b 100644 --- a/Tests/TuistGeneratorTests/Linter/TargetScriptLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/TargetScriptLinterTests.swift @@ -4,7 +4,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistGenerator @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift index c909de001b0..f3a2f52dd63 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift @@ -2,7 +2,6 @@ import Foundation import Path import TuistCore import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift index 853ab6c6d3f..ef5c4a25d5e 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/DeleteDerivedDirectoryProjectMapperTests.swift @@ -3,7 +3,6 @@ import Path import TuistCore import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistCoreTesting @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift index ae19123aeec..72113aa6624 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/GenerateInfoPlistProjectMapperTests.swift @@ -3,7 +3,6 @@ import Path import TuistCore import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistCoreTesting @testable import TuistGenerator diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 74ca7f1302d..5976641f069 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -2,7 +2,6 @@ import Foundation import Path import TuistCore import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistCoreTesting diff --git a/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift index fe21bb16561..cd5c5250f08 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/SynthesizedResourceInterfaceProjectMapperTests.swift @@ -3,7 +3,6 @@ import Path import TuistCore import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistCoreTesting diff --git a/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift index 52f490b4d05..73ff03cf7d4 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/TargetActionDisableShowEnvVarsProjectMapperTests.swift @@ -1,6 +1,5 @@ import TuistCore import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistGenerator @testable import TuistSupportTesting diff --git a/Tests/TuistGeneratorTests/Settings/DefaultSettingsProviderTests.swift b/Tests/TuistGeneratorTests/Settings/DefaultSettingsProviderTests.swift index 86686a85f3e..cbf6ebe07f9 100644 --- a/Tests/TuistGeneratorTests/Settings/DefaultSettingsProviderTests.swift +++ b/Tests/TuistGeneratorTests/Settings/DefaultSettingsProviderTests.swift @@ -2,7 +2,6 @@ import struct TSCUtility.Version import TuistCore import TuistCoreTesting import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistGenerator @testable import TuistSupportTesting diff --git a/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift index 5697e1242b1..f5a8958e96f 100644 --- a/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift @@ -8,7 +8,6 @@ import TuistLoaderTesting import TuistServer import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistKit @testable import TuistSupportTesting diff --git a/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift index 0c58191f42f..ab99e2998e1 100644 --- a/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift @@ -1,9 +1,9 @@ import MockableTest +import TuistCore import TuistLoader import TuistServer import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift index 655872634ab..204865c9f6f 100644 --- a/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift @@ -1,10 +1,10 @@ import MockableTest import Path +import TuistCore import TuistLoader import TuistServer import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift index 69873e06f90..1bc48d40305 100644 --- a/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift @@ -8,7 +8,6 @@ import TuistLoaderTesting import TuistServer import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift index be02c82e377..dfbd6a6a039 100644 --- a/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift @@ -8,7 +8,6 @@ import TuistLoaderTesting import TuistServer import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift b/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift new file mode 100644 index 00000000000..7412f32b8a4 --- /dev/null +++ b/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift @@ -0,0 +1,71 @@ +import Foundation +import Path +import TuistCore +import TuistGenerator +import XcodeGraph +@testable import TuistKit + +final class MockGenerator: Generating { + enum MockError: Error { + case stubNotImplemented + } + + var generateCalls: [AbsolutePath] = [] + var generateStub: ((AbsolutePath) throws -> AbsolutePath)? + func generate(path: AbsolutePath) throws -> AbsolutePath { + guard let generateStub else { + throw MockError.stubNotImplemented + } + + generateCalls.append(path) + return try generateStub(path) + } + + var generateWithGraphCalls: [AbsolutePath] = [] + var generateWithGraphStub: ((AbsolutePath) throws -> (AbsolutePath, Graph))? + func generateWithGraph(path: AbsolutePath) throws -> (AbsolutePath, Graph) { + guard let generateWithGraphStub else { + throw MockError.stubNotImplemented + } + generateWithGraphCalls.append(path) + return try generateWithGraphStub(path) + } + + var invokedGenerateProjectWorkspace = false + var invokedGenerateProjectWorkspaceCount = 0 + var invokedGenerateProjectWorkspaceParameters: (path: AbsolutePath, Void)? + var invokedGenerateProjectWorkspaceParametersList = [(path: AbsolutePath, Void)]() + var stubbedGenerateProjectWorkspaceError: Error? + var stubbedGenerateProjectWorkspaceResult: (AbsolutePath, Graph)! + + func generateProjectWorkspace(path: AbsolutePath) throws -> (AbsolutePath, Graph) { + invokedGenerateProjectWorkspace = true + invokedGenerateProjectWorkspaceCount += 1 + invokedGenerateProjectWorkspaceParameters = (path, ()) + invokedGenerateProjectWorkspaceParametersList.append((path, ())) + if let error = stubbedGenerateProjectWorkspaceError { + throw error + } + return stubbedGenerateProjectWorkspaceResult + } + + var invokedLoadParameterPath: AbsolutePath? + var loadStub: ((AbsolutePath) throws -> Graph)? + func load(path: AbsolutePath) throws -> Graph { + invokedLoadParameterPath = path + if let loadStub { + return try loadStub(path) + } else { + return Graph.test() + } + } + + var loadProjectStub: ((AbsolutePath) throws -> (Project, Graph, [SideEffectDescriptor]))? + func loadProject(path: AbsolutePath) throws -> (Project, Graph, [SideEffectDescriptor]) { + if let loadProjectStub { + return try loadProjectStub(path) + } else { + return (Project.test(), Graph.test(), []) + } + } +} diff --git a/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift b/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift index cbcfcdd9cd8..5ba7abcf2b7 100644 --- a/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift +++ b/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift @@ -4,7 +4,6 @@ import TuistCoreTesting import TuistGenerator import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistCore diff --git a/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift b/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift index b54e575d12c..216a1eb5026 100644 --- a/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift +++ b/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift @@ -2,7 +2,6 @@ import Foundation import Path import TuistCore import XcodeGraph -import XcodeGraphTesting @testable import TuistKit final class MockManifestGraphLoader: ManifestGraphLoading { diff --git a/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift b/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift index c1be7d1dd18..aa0c2fa7ed5 100644 --- a/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift +++ b/Tests/TuistKitTests/ProjectEditor/Mocks/MockProjectEditorMapper.swift @@ -3,7 +3,6 @@ import Path import TuistCore import TuistLoader import XcodeGraph -import XcodeGraphTesting @testable import TuistCoreTesting @testable import TuistKit diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift index dfbe022f48a..d304de5cc66 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift @@ -6,7 +6,6 @@ import TuistCore import TuistLoader import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift index 71052ba16d6..6877e31d428 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift @@ -7,7 +7,6 @@ import TuistPlugin import TuistPluginTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistCoreTesting diff --git a/Tests/TuistKitTests/Services/BuildServiceTests.swift b/Tests/TuistKitTests/Services/BuildServiceTests.swift index af79e047678..2b9f1568b52 100644 --- a/Tests/TuistKitTests/Services/BuildServiceTests.swift +++ b/Tests/TuistKitTests/Services/BuildServiceTests.swift @@ -7,7 +7,6 @@ import TuistCore import TuistServer import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistAutomationTesting diff --git a/Tests/TuistKitTests/Services/InitServiceTests.swift b/Tests/TuistKitTests/Services/InitServiceTests.swift index 7a574ee45cb..28e04211c48 100644 --- a/Tests/TuistKitTests/Services/InitServiceTests.swift +++ b/Tests/TuistKitTests/Services/InitServiceTests.swift @@ -1,5 +1,6 @@ import Foundation import Path +import TuistCore import TuistScaffold import TuistSupport import XcodeGraph @@ -67,12 +68,12 @@ final class InitServiceTests: TuistUnitTestCase { let tuistVersion = "4.0.3" tuistVersionLoader.getVersionStub = tuistVersion - let expectedAttributes: [String: XcodeGraph.Template.Attribute.Value] = [ + let expectedAttributes: [String: Template.Attribute.Value] = [ "name": .string("Name"), "platform": .string("macOS"), "tuist_version": .string(tuistVersion), ] - var generatorAttributes: [String: XcodeGraph.Template.Attribute.Value] = [:] + var generatorAttributes: [String: Template.Attribute.Value] = [:] templateGenerator.generateStub = { _, _, attributes in generatorAttributes = attributes } @@ -94,12 +95,12 @@ final class InitServiceTests: TuistUnitTestCase { let tuistVersion = "4.0.3" tuistVersionLoader.getVersionStub = tuistVersion - let expectedAttributes: [String: XcodeGraph.Template.Attribute.Value] = [ + let expectedAttributes: [String: Template.Attribute.Value] = [ "name": .string("Name"), "platform": .string("iOS"), "tuist_version": .string(tuistVersion), ] - var generatorAttributes: [String: XcodeGraph.Template.Attribute.Value] = [:] + var generatorAttributes: [String: Template.Attribute.Value] = [:] templateGenerator.generateStub = { _, _, attributes in generatorAttributes = attributes } @@ -127,14 +128,14 @@ final class InitServiceTests: TuistUnitTestCase { let tuistVersion = "4.0.3" tuistVersionLoader.getVersionStub = tuistVersion - let expectedAttributes: [String: XcodeGraph.Template.Attribute.Value] = [ + let expectedAttributes: [String: Template.Attribute.Value] = [ "name": .string("Name"), "platform": .string("macOS"), "tuist_version": .string(tuistVersion), "required": .string("requiredValue"), "optional": .string("optionalValue"), ] - var generatorAttributes: [String: XcodeGraph.Template.Attribute.Value] = [:] + var generatorAttributes: [String: Template.Attribute.Value] = [:] templateGenerator.generateStub = { _, _, attributes in generatorAttributes = attributes } @@ -155,7 +156,7 @@ final class InitServiceTests: TuistUnitTestCase { func test_optional_dictionary_attribute_is_taken_from_template() async throws { // Given - let context: XcodeGraph.Template.Attribute.Value = .dictionary([ + let context: Template.Attribute.Value = .dictionary([ "key1": .string("value1"), "key2": .string("value2"), ]) @@ -174,14 +175,14 @@ final class InitServiceTests: TuistUnitTestCase { [defaultTemplatePath] } - let expectedAttributes: [String: XcodeGraph.Template.Attribute.Value] = [ + let expectedAttributes: [String: Template.Attribute.Value] = [ "name": .string("Name"), "platform": .string("iOS"), "tuist_version": .string(tuistVersion), "optional": context, ] - var generatorAttributes: [String: XcodeGraph.Template.Attribute.Value] = [:] + var generatorAttributes: [String: Template.Attribute.Value] = [:] templateGenerator.generateStub = { _, _, attributes in generatorAttributes = attributes } @@ -195,7 +196,7 @@ final class InitServiceTests: TuistUnitTestCase { func test_optional_integer_attribute_is_taken_from_template() async throws { // Given - let defaultIntegerValue: XcodeGraph.Template.Attribute.Value = .integer(999) + let defaultIntegerValue: Template.Attribute.Value = .integer(999) templateLoader.loadTemplateStub = { _ in Template.test(attributes: [ @@ -211,14 +212,14 @@ final class InitServiceTests: TuistUnitTestCase { [defaultTemplatePath] } - let expectedAttributes: [String: XcodeGraph.Template.Attribute.Value] = [ + let expectedAttributes: [String: Template.Attribute.Value] = [ "name": .string("Name"), "platform": .string("iOS"), "tuist_version": .string(tuistVersion), "optional": defaultIntegerValue, ] - var generatorAttributes: [String: XcodeGraph.Template.Attribute.Value] = [:] + var generatorAttributes: [String: Template.Attribute.Value] = [:] templateGenerator.generateStub = { _, _, attributes in generatorAttributes = attributes } diff --git a/Tests/TuistKitTests/Services/InstallServiceTests.swift b/Tests/TuistKitTests/Services/InstallServiceTests.swift index 9d6b7e04082..e4a3b874e9e 100644 --- a/Tests/TuistKitTests/Services/InstallServiceTests.swift +++ b/Tests/TuistKitTests/Services/InstallServiceTests.swift @@ -9,7 +9,6 @@ import TuistPluginTesting import TuistSupport import TuistSupportTesting import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistKit diff --git a/Tests/TuistKitTests/Services/ListServiceTests.swift b/Tests/TuistKitTests/Services/ListServiceTests.swift index 2c41b62deaa..c7347b5aed8 100644 --- a/Tests/TuistKitTests/Services/ListServiceTests.swift +++ b/Tests/TuistKitTests/Services/ListServiceTests.swift @@ -1,7 +1,7 @@ import Path +import TuistCore import TuistPluginTesting import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistCore diff --git a/Tests/TuistKitTests/Services/RunServiceTests.swift b/Tests/TuistKitTests/Services/RunServiceTests.swift index b76c93f7ffc..01a8482b3ad 100644 --- a/Tests/TuistKitTests/Services/RunServiceTests.swift +++ b/Tests/TuistKitTests/Services/RunServiceTests.swift @@ -6,7 +6,6 @@ import TuistAutomation import TuistCore import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistAutomationTesting diff --git a/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift b/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift index 11724e9b363..f0ac7dfc5e5 100644 --- a/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift +++ b/Tests/TuistKitTests/Services/ScaffoldServiceTests.swift @@ -6,7 +6,6 @@ import TuistLoader import TuistScaffold import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistCoreTesting diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index 0e26e76910d..9f8ef42e0a4 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -6,7 +6,6 @@ import TuistCore import TuistLoader import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistAutomationTesting diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift index 19f1c67553b..45ea8b68b7f 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift @@ -4,7 +4,6 @@ import TuistCore import TuistServer import TuistSupport import XcodeGraph - import XCTest @testable import TuistAnalytics @testable import TuistCoreTesting diff --git a/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift b/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift index eaf80198392..bebd3feb151 100644 --- a/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift +++ b/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift @@ -2,7 +2,6 @@ import Foundation import Path import TuistCore import TuistSupport -import XcodeGraph import XCTest @testable import TuistLoader diff --git a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift index 460143f6fc4..5778cb7e325 100644 --- a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift @@ -3,8 +3,8 @@ import MockableTest import Path import ProjectDescription import TuistCore +import struct TuistCore.Plugins import TuistSupport -import struct XcodeGraph.Plugins import XCTest @testable import TuistCoreTesting @@ -21,8 +21,8 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { private var cacheDirectoriesProviderFactory: MockCacheDirectoriesProviderFactoring! private var workspaceManifests: [AbsolutePath: Workspace] = [:] private var projectManifests: [AbsolutePath: Project] = [:] - private var configManifests: [AbsolutePath: Config] = [:] - private var pluginManifests: [AbsolutePath: Plugin] = [:] + private var configManifests: [AbsolutePath: ProjectDescription.Config] = [:] + private var pluginManifests: [AbsolutePath: ProjectDescription.Plugin] = [:] private var recordedLoadWorkspaceCalls: Int = 0 private var recordedLoadProjectCalls: Int = 0 private var recordedLoadConfigCalls: Int = 0 @@ -337,7 +337,7 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { } private func stub( - deprecatedManifest manifest: Config, + deprecatedManifest manifest: ProjectDescription.Config, at path: AbsolutePath ) throws { let manifestPath = path.appending(component: Manifest.config.fileName(path)) @@ -356,7 +356,7 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { } private func stubPlugins(withHash hash: String) throws { - let plugin = Plugin(name: "TestPlugin") + let plugin = ProjectDescription.Plugin(name: "TestPlugin") let path = try temporaryPath().appending(component: "TestPlugin") let manifestPath = path.appending(component: Manifest.plugin.fileName(path)) try fileHandler.touch(manifestPath) diff --git a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift index af30ac64399..c43dfe642d6 100644 --- a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift @@ -1,9 +1,9 @@ import Foundation import Path import ProjectDescription +import TuistCore import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistCoreTesting @testable import TuistLoader @@ -71,7 +71,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { let result = try subject.loadConfig(path: path) // Then - XCTAssertEqual(result, XcodeGraph.Config( + XCTAssertEqual(result, TuistCore.Config( compatibleXcodeVersions: .all, cloud: nil, swiftVersion: nil, @@ -111,7 +111,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { let result = try subject.loadConfig(path: "/project/Module/A/") // Then - XCTAssertEqual(result, XcodeGraph.Config( + XCTAssertEqual(result, TuistCore.Config( compatibleXcodeVersions: .all, cloud: nil, swiftVersion: nil, diff --git a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift index 2b457df0404..fa8ba2e949e 100644 --- a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift @@ -6,7 +6,6 @@ import TuistCore import TuistCoreTesting import TuistSupport import XcodeGraph -import XcodeGraphTesting import XCTest @testable import ProjectDescription @@ -58,7 +57,7 @@ final class PackageSettingsLoaderTests: TuistUnitTestCase { let got = try subject.loadPackageSettings(at: temporaryPath, with: plugins) // Then - let expected: XcodeGraph.PackageSettings = .init( + let expected: TuistCore.PackageSettings = .init( productTypes: [:], productDestinations: [:], baseSettings: XcodeGraph.Settings( diff --git a/Tests/TuistLoaderTests/Loaders/SwiftPackageManagerDependenciesTests.swift b/Tests/TuistLoaderTests/Loaders/SwiftPackageManagerDependenciesTests.swift deleted file mode 100644 index 4e0d872d0eb..00000000000 --- a/Tests/TuistLoaderTests/Loaders/SwiftPackageManagerDependenciesTests.swift +++ /dev/null @@ -1,146 +0,0 @@ -import Foundation -import XCTest -@testable import TuistSupportTesting -@testable import XcodeGraph - -final class SwiftPackageManagerDependenciesTests: TuistUnitTestCase { - func test_manifestValue_singleDependency() throws { - // Given - let subject = SwiftPackageManagerDependencies( - .packages([ - .remote(url: "url/url/url", requirement: .branch("branch")), - ]), - productTypes: [:], - baseSettings: .init(configurations: [:]), - targetSettings: [:], - projectOptions: [:] - ) - - // When - let got = subject.manifest(isLegacy: false, packageManifestFolder: "/") - - // Then - let expected = SwiftPackageManagerDependencies.Manifest.content(""" - import PackageDescription - - let package = Package( - name: "PackageName", - dependencies: [ - .package(url: "url/url/url", branch: "branch"), - ] - ) - """) - XCTAssertEqual(got, expected) - } - - func test_manifestValue_multipleDependencies() throws { - // Given - let subject = SwiftPackageManagerDependencies( - .packages([ - .remote(url: "xyz", requirement: .exact("10.10.10")), - .remote(url: "foo/foo", requirement: .upToNextMinor("1.2.3")), - .remote(url: "bar/bar", requirement: .upToNextMajor("3.2.1")), - .remote(url: "http://xyz.com", requirement: .branch("develop")), - .remote(url: "https://www.google.com/", requirement: .revision("a083aa1435eb35d8a1cb369115a7636cb4b65135")), - .remote(url: "url/url/url", requirement: .range(from: "1.2.3", to: "5.2.1")), - .local(path: "/path/path/path"), - ]), - productTypes: [:], - baseSettings: .init(configurations: [:]), - targetSettings: [:], - projectOptions: [:] - ) - - // When - let got = subject.manifest(isLegacy: false, packageManifestFolder: "/path") - - // Then - let expected = SwiftPackageManagerDependencies.Manifest.content(""" - import PackageDescription - - let package = Package( - name: "PackageName", - dependencies: [ - .package(url: "xyz", exact: "10.10.10"), - .package(url: "foo/foo", .upToNextMinor(from: "1.2.3")), - .package(url: "bar/bar", from: "3.2.1"), - .package(url: "http://xyz.com", branch: "develop"), - .package(url: "https://www.google.com/", revision: "a083aa1435eb35d8a1cb369115a7636cb4b65135"), - .package(url: "url/url/url", "1.2.3" ..< "5.2.1"), - .package(path: "path/path"), - ] - ) - """) - XCTAssertEqual(got, expected) - } - - func test_legacyManifest_singleDependency() throws { - // Given - let subject = SwiftPackageManagerDependencies( - .packages([ - .remote(url: "url/url/url", requirement: .branch("branch")), - ]), - productTypes: [:], - baseSettings: .init(configurations: [:]), - targetSettings: [:], - projectOptions: [:] - ) - - // When - let got = subject.manifest(isLegacy: true, packageManifestFolder: "/path") - - // Then - let expected = SwiftPackageManagerDependencies.Manifest.content(""" - import PackageDescription - - let package = Package( - name: "PackageName", - dependencies: [ - .package(url: "url/url/url", .branch("branch")), - ] - ) - """) - XCTAssertEqual(got, expected) - } - - func test_legacyManifest_multipleDependencies() throws { - // Given - let subject = SwiftPackageManagerDependencies( - .packages([ - .remote(url: "xyz", requirement: .exact("10.10.10")), - .remote(url: "foo/foo", requirement: .upToNextMinor("1.2.3")), - .remote(url: "bar/bar", requirement: .upToNextMajor("3.2.1")), - .remote(url: "http://xyz.com", requirement: .branch("develop")), - .remote(url: "https://www.google.com/", requirement: .revision("a083aa1435eb35d8a1cb369115a7636cb4b65135")), - .remote(url: "url/url/url", requirement: .range(from: "1.2.3", to: "5.2.1")), - .local(path: "/path/path/path"), - ]), - productTypes: [:], - baseSettings: .init(configurations: [:]), - targetSettings: [:], - projectOptions: [:] - ) - - // When - let got = subject.manifest(isLegacy: true, packageManifestFolder: "/path") - - // Then - let expected = SwiftPackageManagerDependencies.Manifest.content(""" - import PackageDescription - - let package = Package( - name: "PackageName", - dependencies: [ - .package(url: "xyz", .exact("10.10.10")), - .package(url: "foo/foo", .upToNextMinor(from: "1.2.3")), - .package(url: "bar/bar", .upToNextMajor(from: "3.2.1")), - .package(url: "http://xyz.com", .branch("develop")), - .package(url: "https://www.google.com/", .revision("a083aa1435eb35d8a1cb369115a7636cb4b65135")), - .package(url: "url/url/url", "1.2.3" ..< "5.2.1"), - .package(path: "path/path"), - ] - ) - """) - XCTAssertEqual(got, expected) - } -} diff --git a/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift index 3cb4fe7050a..f01420076c8 100644 --- a/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift @@ -1,7 +1,6 @@ import Path import TuistCore import TuistSupport -import XcodeGraph import XCTest @testable import ProjectDescription @@ -43,7 +42,7 @@ final class TemplateGitLoaderTests: TuistUnitTestCase { var pathToLoadTemplateFrom: AbsolutePath? templateLoader.loadTemplateStub = { path in pathToLoadTemplateFrom = path - return XcodeGraph.Template( + return TuistCore.Template( description: "" ) } diff --git a/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift index f59607fc77b..ca308d6b93c 100644 --- a/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift @@ -1,7 +1,6 @@ import Path import TuistCore import TuistSupport -import XcodeGraph import XCTest @testable import ProjectDescription @@ -56,7 +55,7 @@ final class TemplateLoaderTests: TuistUnitTestCase { let got = try subject.loadTemplate(at: temporaryPath, plugins: .none) // Then - XCTAssertEqual(got, XcodeGraph.Template( + XCTAssertEqual(got, TuistCore.Template( description: "desc", items: [Template.Item( path: try RelativePath(validating: "generateOne"), diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift index f90d555b59c..96775125c38 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift @@ -1,5 +1,5 @@ import Foundation -import XcodeGraph +import TuistCore import XCTest @testable import TuistLoader @@ -8,7 +8,7 @@ import XCTest final class CloudManifestMapperTests: TuistUnitTestCase { func test_removes_trailing_back_slash_if_present_in_url() throws { // When - let got = try XcodeGraph.Cloud.from( + let got = try TuistCore.Cloud.from( manifest: .cloud( projectId: "tuist/tuist", url: "https://cloud.tuist.io/" diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceSynthesizer+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceSynthesizer+ManifestMapperTests.swift index 455281a36ec..a4235b867ff 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceSynthesizer+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/ResourceSynthesizer+ManifestMapperTests.swift @@ -126,7 +126,7 @@ final class ResourceSynthesizerManifestMapperTests: TuistUnitTestCase { let manifestDirectory = try temporaryPath() var invokedPluginNames: [String] = [] var invokedResourceNames: [String] = [] - var invokedResourceSynthesizerPlugins: [PluginResourceSynthesizer] = [] + var invokedResourceSynthesizerPlugins: [TuistCore.PluginResourceSynthesizer] = [] resourceSynthesizerPathLocator.templatePathStub = { pluginName, resourceName, resourceSynthesizerPlugins in invokedPluginNames.append(pluginName) invokedResourceNames.append(resourceName) diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 4063d32bc50..36650c25a56 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -3329,7 +3329,7 @@ extension PackageInfoMapping { basePath: AbsolutePath = "/", packageType: PackageType? = nil, packageInfos: [String: PackageInfo] = [:], - packageSettings: XcodeGraph.PackageSettings = .test( + packageSettings: TuistCore.PackageSettings = .test( baseSettings: .default ) ) throws -> ProjectDescription.Project? { diff --git a/Tests/TuistLoaderTests/Utils/PluginsHelperTests.swift b/Tests/TuistLoaderTests/Utils/PluginsHelperTests.swift index 2e9c2a45194..674fc0763d1 100644 --- a/Tests/TuistLoaderTests/Utils/PluginsHelperTests.swift +++ b/Tests/TuistLoaderTests/Utils/PluginsHelperTests.swift @@ -1,5 +1,6 @@ import Foundation import Path +import TuistCore import TuistSupport import XCTest diff --git a/Tests/TuistPluginTests/PluginServiceTests.swift b/Tests/TuistPluginTests/PluginServiceTests.swift index 49b10f4d1db..f6ead93f450 100644 --- a/Tests/TuistPluginTests/PluginServiceTests.swift +++ b/Tests/TuistPluginTests/PluginServiceTests.swift @@ -12,9 +12,7 @@ import TuistScaffoldTesting import TuistSupport import TuistSupportTesting import XcodeGraph -import XcodeGraphTesting import XCTest - @testable import TuistPlugin final class PluginServiceTests: TuistUnitTestCase { @@ -255,7 +253,7 @@ final class PluginServiceTests: TuistUnitTestCase { ProjectDescription.Plugin(name: pluginName) } - let config = mockConfig(plugins: [XcodeGraph.PluginLocation.local(path: pluginPath.pathString)]) + let config = mockConfig(plugins: [TuistCore.PluginLocation.local(path: pluginPath.pathString)]) try fileHandler.createFolder( pluginPath.appending(component: Constants.helpersDirectoryName) @@ -296,7 +294,7 @@ final class PluginServiceTests: TuistUnitTestCase { try fileHandler.createFolder(cachedPluginPath.appending(component: Constants.helpersDirectoryName)) let config = mockConfig(plugins: [ - XcodeGraph.PluginLocation.git( + TuistCore.PluginLocation.git( url: pluginGitUrl, gitReference: .tag(pluginGitReference), directory: nil, @@ -333,7 +331,7 @@ final class PluginServiceTests: TuistUnitTestCase { ProjectDescription.Plugin(name: pluginName) } - let config = mockConfig(plugins: [XcodeGraph.PluginLocation.local(path: pluginPath.pathString)]) + let config = mockConfig(plugins: [TuistCore.PluginLocation.local(path: pluginPath.pathString)]) // When let plugins = try await subject.loadPlugins(using: config) @@ -370,7 +368,7 @@ final class PluginServiceTests: TuistUnitTestCase { let config = mockConfig(plugins: [ - XcodeGraph.PluginLocation.git( + TuistCore.PluginLocation.git( url: pluginGitUrl, gitReference: .tag(pluginGitReference), directory: nil, @@ -410,7 +408,7 @@ final class PluginServiceTests: TuistUnitTestCase { ProjectDescription.Plugin(name: pluginName) } - let config = mockConfig(plugins: [XcodeGraph.PluginLocation.local(path: pluginPath.pathString)]) + let config = mockConfig(plugins: [TuistCore.PluginLocation.local(path: pluginPath.pathString)]) // Then let plugins = try await subject.loadPlugins(using: config) @@ -449,7 +447,7 @@ final class PluginServiceTests: TuistUnitTestCase { let config = mockConfig(plugins: [ - XcodeGraph.PluginLocation + TuistCore.PluginLocation .git(url: pluginGitUrl, gitReference: .tag(pluginGitReference), directory: nil, releaseUrl: nil), ]) @@ -459,8 +457,8 @@ final class PluginServiceTests: TuistUnitTestCase { XCTAssertEqual(plugins, expectedPlugins) } - private func mockConfig(plugins: [XcodeGraph.PluginLocation]) -> XcodeGraph.Config { - Config( + private func mockConfig(plugins: [TuistCore.PluginLocation]) -> TuistCore.Config { + TuistCore.Config( compatibleXcodeVersions: .all, cloud: nil, swiftVersion: nil, diff --git a/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift b/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift index 892d84109e0..b8bb4733f46 100644 --- a/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift +++ b/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift @@ -1,7 +1,7 @@ import Foundation import Path +import TuistCore import TuistSupport -import XcodeGraph import XCTest @testable import TuistCore diff --git a/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift b/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift index bd93a6d72dc..a9d76d5fcc1 100644 --- a/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift +++ b/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift @@ -3,7 +3,6 @@ import MockableTest import TuistSupport import TuistSupportTesting import XcodeGraph -import XcodeGraphTesting import XCTest @testable import TuistServer diff --git a/Tests/XcodeGraphTests/Models/TargetTests.swift b/Tests/XcodeGraphTests/Models/TargetTests.swift index d9ada08cfbc..ebbe512dba8 100644 --- a/Tests/XcodeGraphTests/Models/TargetTests.swift +++ b/Tests/XcodeGraphTests/Models/TargetTests.swift @@ -5,7 +5,6 @@ import TuistSupport import XCTest @testable import TuistSupportTesting @testable import XcodeGraph -@testable import XcodeGraphTesting final class TargetErrorTests: TuistUnitTestCase { func test_description() { diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index 45da26790b9..ff9914dc497 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -386,14 +386,11 @@ public enum Module: String, CaseIterable { .external(name: "ArgumentParser"), .external(name: "GraphViz"), .external(name: "AnyCodable"), - .external(name: "XcodeGraphTesting"), ] case .core: [ .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), - .external(name: "XcodeGraph"), - .external(name: "XcodeGraphTesting"), ] case .generator: [ @@ -401,25 +398,21 @@ public enum Module: String, CaseIterable { .target(name: Module.support.testingTargetName!), .external(name: "XcodeProj"), .external(name: "GraphViz"), - .external(name: "XcodeGraphTesting"), ] case .scaffold: [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .external(name: "XcodeGraphTesting"), ] case .loader: [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .external(name: "XcodeGraphTesting"), ] case .asyncQueue: [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .external(name: "XcodeGraphTesting"), .external(name: "Queuer"), ] case .plugin: @@ -431,32 +424,27 @@ public enum Module: String, CaseIterable { .target(name: Module.support.testingTargetName!), .target(name: Module.scaffold.testingTargetName!), .target(name: Module.core.testingTargetName!), - .external(name: "XcodeGraphTesting"), ] case .analytics: [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .external(name: "XcodeGraphTesting"), ] case .migration: [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .external(name: "XcodeGraphTesting"), ] case .dependencies: [ .target(name: Module.core.testingTargetName!), .target(name: Module.loader.testingTargetName!), .target(name: Module.support.testingTargetName!), - .external(name: "XcodeGraphTesting"), ] case .automation: [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .external(name: "XcodeGraphTesting"), ] case .app: [ @@ -493,19 +481,16 @@ public enum Module: String, CaseIterable { .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), .external(name: "XcodeGraph"), - .external(name: "XcodeGraphTesting"), ] case .generator: [ .target(name: Module.core.testingTargetName!), .target(name: Module.support.testingTargetName!), - .external(name: "XcodeGraphTesting"), .external(name: "XcodeProj"), ] case .scaffold: [ .external(name: "XcodeGraph"), - .external(name: "XcodeGraphTesting"), ] case .loader: [ @@ -513,11 +498,9 @@ public enum Module: String, CaseIterable { .target(name: Module.projectDescription.targetName), .target(name: Module.support.testingTargetName!), .external(name: "XcodeGraph"), - .external(name: "XcodeGraphTesting"), ] case .asyncQueue: [ - .external(name: "XcodeGraphTesting"), ] case .plugin: [ @@ -527,12 +510,10 @@ public enum Module: String, CaseIterable { [] case .migration: [ - .external(name: "XcodeGraphTesting"), ] case .dependencies: [ .target(name: Module.projectDescription.targetName), - .external(name: "XcodeGraphTesting"), ] case .automation: [ @@ -540,7 +521,6 @@ public enum Module: String, CaseIterable { .target(name: Module.core.testingTargetName!), .target(name: Module.projectDescription.targetName), .target(name: Module.support.testingTargetName!), - .external(name: "XcodeGraphTesting"), ] case .app: [] @@ -559,7 +539,6 @@ public enum Module: String, CaseIterable { .target(name: Module.support.targetName), .target(name: Module.core.testingTargetName!), .target(name: Module.loader.testingTargetName!), - .external(name: "XcodeGraphTesting"), .external(name: "SwiftToolsSupport"), .external(name: "XcodeProj"), ] @@ -570,7 +549,6 @@ public enum Module: String, CaseIterable { .target(name: Module.projectDescription.targetName), .target(name: Module.automation.targetName), .target(name: Module.loader.testingTargetName!), - .external(name: "XcodeGraphTesting"), .external(name: "XcodeProj"), ] case .core: @@ -581,19 +559,16 @@ public enum Module: String, CaseIterable { [ .target(name: Module.core.testingTargetName!), .target(name: Module.support.testingTargetName!), - .external(name: "XcodeGraphTesting"), .external(name: "XcodeProj"), ] case .scaffold: [ .target(name: Module.support.testingTargetName!), - .external(name: "XcodeGraphTesting"), ] case .loader: [ .target(name: Module.support.testingTargetName!), .target(name: Module.projectDescription.targetName), - .external(name: "XcodeGraphTesting"), ] case .asyncQueue: [] @@ -605,14 +580,12 @@ public enum Module: String, CaseIterable { [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), - .external(name: "XcodeGraphTesting"), ] case .dependencies: [] case .automation: [ .target(name: Module.support.testingTargetName!), - .external(name: "XcodeGraphTesting"), ] case .app: [] From 205ba32ad6003f7aa076c561156cecf6421cbf07 Mon Sep 17 00:00:00 2001 From: Binlogo Date: Sun, 16 Jun 2024 16:41:17 +0800 Subject: [PATCH 360/509] Fix doc and pull request template issues (#6408) * Update get-started.md Fix a tiny typo. * Fix broken link * Lint fix * Fix lint fix command checklist guide --- .github/PULL_REQUEST_TEMPLATE.md | 6 +++--- Sources/TuistCore/Graph/GraphLoader.swift | 2 ++ .../Generator/WorkspaceDescriptorGenerator.swift | 2 ++ .../TuistLoader/SwiftPackageManager/SettingsMapper.swift | 1 - docs/docs/contributors/get-started.md | 9 ++++----- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index b4c0b29d1a2..43c57fe4e5c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,4 +1,4 @@ -Resolves https://github.com/tuist/tuist/issues/YYY +Resolves ### Short description 📝 @@ -6,11 +6,11 @@ Resolves https://github.com/tuist/tuist/issues/YYY ### How to test the changes locally 🧐 -> Include a set of steps for the reviewer to test the changes locally (see [the documentation](https://docs.tuist.io/contributors/testing-strategy) for reference). +> Include a set of steps for the reviewer to test the changes locally (see [the documentation](https://docs.tuist.io/contributors/get-started) for reference). ### Contributor checklist ✅ -- [ ] The code has been linted using run `mise run lint:fix` +- [ ] The code has been linted using run `mise run lint-fix` - [ ] The change is tested via unit testing or acceptance testing, or both - [ ] The title of the PR is formulated in a way that is usable as a changelog entry - [ ] In case the PR introduces changes that affect users, the documentation has been updated diff --git a/Sources/TuistCore/Graph/GraphLoader.swift b/Sources/TuistCore/Graph/GraphLoader.swift index 3c1ce02b6b8..f32738141af 100644 --- a/Sources/TuistCore/Graph/GraphLoader.swift +++ b/Sources/TuistCore/Graph/GraphLoader.swift @@ -177,6 +177,7 @@ public final class GraphLoader: GraphLoading { source: .system ) } + case let .package(product, type, _): switch type { case .macro: @@ -186,6 +187,7 @@ public final class GraphLoader: GraphLoading { case .plugin: return try loadPackage(fromPath: path, productName: product, type: .plugin) } + case .xctest: return try platforms.map { platform in try loadXCTestSDK(platform: platform) diff --git a/Sources/TuistGenerator/Generator/WorkspaceDescriptorGenerator.swift b/Sources/TuistGenerator/Generator/WorkspaceDescriptorGenerator.swift index 86510f87c70..771e4e9e61d 100644 --- a/Sources/TuistGenerator/Generator/WorkspaceDescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/WorkspaceDescriptorGenerator.swift @@ -238,6 +238,7 @@ final class WorkspaceDescriptorGenerator: WorkspaceDescriptorGenerating { ) return .group(groupReference) + case let .virtualGroup(name, contents): return .group(.init(location: .container(""), name: name, children: try contents.map { try recursiveChildElement( @@ -246,6 +247,7 @@ final class WorkspaceDescriptorGenerator: WorkspaceDescriptorGenerating { path: path ) }.sorted(by: workspaceDataElementSort))) + case let .project(path: projectPath): guard generatedProjects[projectPath] != nil else { throw WorkspaceDescriptorGeneratorError.projectNotFound(path: projectPath) diff --git a/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift b/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift index 157ebcbab93..4e1dbf1468d 100644 --- a/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift @@ -91,7 +91,6 @@ struct SettingsMapper { case (.linker, .linkedFramework), (.linker, .linkedLibrary): // Handled as dependency continue - case (.c, .linkedFramework), (.c, .linkedLibrary), (.cxx, .linkedFramework), (.cxx, .linkedLibrary), (.swift, .headerSearchPath), (.swift, .linkedFramework), (.swift, .linkedLibrary), (.linker, .headerSearchPath), (.linker, .define), (_, .enableUpcomingFeature), diff --git a/docs/docs/contributors/get-started.md b/docs/docs/contributors/get-started.md index f78e0d718ed..ca72ddd202d 100644 --- a/docs/docs/contributors/get-started.md +++ b/docs/docs/contributors/get-started.md @@ -3,7 +3,6 @@ title: Get started titleTemplate: ':title - Contribute to Tuist' description: Get started contributing to Tuist by following this guide. --- - # Get started If you have experience building apps for Apple platforms, like iOS, adding code to Tuist shouldn’t be much different. There are two differences compared to developing apps that are worth mentioning: @@ -31,7 +30,7 @@ To start working on the project, we can follow the steps below: - Run `tuist install` to install the external dependencies needed by Tuist - Run `tuist generate` to generate the Tuist Xcode project using Tuist itself -**The generated project opens automatically**. If you need to open again without generating it, run open `Tuist.xcworkspace` (or ue Finder). +**The generated project opens automatically**. If you need to open again without generating it, run open `Tuist.xcworkspace` (or use Finder). > [!NOTE] XED . > If you try to open the project using `xed .`, it will open the package, and not the project generated by Tuist. We recommend using the Tuist-generated project to dog-food the tool. @@ -44,12 +43,11 @@ If you needed to edit the project, for example to add dependencies or adjust tar ### From Xcode - To run `tuist` from the generated Xcode project, edit the `tuist` scheme, and set the arguments that you'd like to pass to the command. For example, to run the `tuist generate` command, you can set the arguments to `generate --no-open` to prevent the project from opening after the generation. ![An example of a scheme configuration to run the generate command with Tuist](./scheme-arguments.png) -You'll also have to set the working directory to the root of the project being generated. You can do that either by using the `--path` argument, which all the commmands accept, or configuring the working directory in the scheme as shown below: +You'll also have to set the working directory to the root of the project being generated. You can do that either by using the `--path` argument, which all the commands accept, or configuring the working directory in the scheme as shown below: ![An example of how to set the working directory to run Tuist](./scheme-working-directory.png) @@ -63,4 +61,5 @@ Although `tuist` provides a [run command](/guide/automation/run) it does not sup ```bash swift build --product ProjectDescription swift run tuist generate --path /path/to/project --no-open -``` \ No newline at end of file +``` + From c3dcecbf0570a983e14f90716296b7eefd56da21 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 16 Jun 2024 10:41:36 +0200 Subject: [PATCH 361/509] add Binlogo as a contributor for doc (#6409) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2e5eaef60ad..a3dcb814112 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1409,6 +1409,15 @@ "contributions": [ "code" ] + }, + { + "login": "Binlogo", + "name": "Binlogo", + "avatar_url": "https://avatars.githubusercontent.com/u/7845507?v=4", + "profile": "https://github.com/Binlogo", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 62dd3db9ea4..d9220da4381 100644 --- a/README.md +++ b/README.md @@ -558,6 +558,7 @@ Thanks goes to these wonderful people:
    Andy Kolean
    +
    Binlogo
    From 58c33b48408f18fb4d0de99d1aa7780b1f24f0b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 17 Jun 2024 09:14:20 +0200 Subject: [PATCH 362/509] Change bounty issue link to Algora (#6410) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d9220da4381..b4ac660704b 100644 --- a/README.md +++ b/README.md @@ -319,7 +319,7 @@ Great companies support the project by giving us access to their service through ## 🧑‍💻 Want to contribute? -You can use our [contribution docs](https://docs.tuist.io/documentation/tuist/get-started-as-contributor) to get started. If you don't have a specific issue in mind, we are more than happy to help you, just ask for help in a given issue or on our [Slack](https://join.slack.com/t/tuistapp/shared_invite/zt-1lqw355mp-zElRwLeoZ2EQsgGEkyaFgg). You can find good issues for first-time contributors [here](https://github.com/tuist/tuist/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). We also offer [issue bounties](https://github.com/tuist/tuist/discussions/4982) for some highly-valued issues. +You can use our [contribution docs](https://docs.tuist.io/documentation/tuist/get-started-as-contributor) to get started. If you don't have a specific issue in mind, we are more than happy to help you, just ask for help in a given issue or on our [Slack](https://join.slack.com/t/tuistapp/shared_invite/zt-1lqw355mp-zElRwLeoZ2EQsgGEkyaFgg). You can find good issues for first-time contributors [here](https://github.com/tuist/tuist/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). We also offer [issue bounties](https://console.algora.io/org/tuist) for some highly-valued issues. ## ✨ Core Team From 08651ef636719ef3386e58972be29b1671e53d68 Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Mon, 17 Jun 2024 03:15:10 -0400 Subject: [PATCH 363/509] Use the Tuist fork of `GraphViz` (#6391) * Use the Tuist fork of `GraphViz` * Revert to a fork of 0.2.0 --- Package.resolved | 12 ++++++------ Package.swift | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Package.resolved b/Package.resolved index 0efad86762b..d2fdec13e74 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "be656e1285b67cd89206d2e44ae693ca74086bd97ce1788a21d0533b6a6b6f62", + "originHash" : "99adbc11a85398bfb5a122e70f3eae05647f395e69824666334c300d621ee363", "pins" : [ { "identity" : "aexml", @@ -40,10 +40,10 @@ { "identity" : "graphviz", "kind" : "remoteSourceControl", - "location" : "https://github.com/SwiftDocOrg/GraphViz.git", + "location" : "https://github.com/tuist/GraphViz.git", "state" : { - "revision" : "70bebcf4597b9ce33e19816d6bbd4ba9b7bdf038", - "version" : "0.2.0" + "branch" : "0.2.1", + "revision" : "e4e0796a8fa74b000aba54b0256601abf75d0307" } }, { @@ -276,8 +276,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/weichsel/ZIPFoundation.git", "state" : { - "revision" : "a3f5c2bae0f04b0bce9ef3c4ba6bd1031a0564c4", - "version" : "0.9.17" + "revision" : "02b6abe5f6eef7e3cbd5f247c5cc24e246efcfe0", + "version" : "0.9.19" } } ], diff --git a/Package.swift b/Package.swift index 8144b74ee4d..0bbe394ca6d 100644 --- a/Package.swift +++ b/Package.swift @@ -403,10 +403,10 @@ let package = Package( .package(url: "https://github.com/apple/swift-tools-support-core", from: "0.6.1"), .package(url: "https://github.com/FabrizioBrancati/Queuer", from: "2.1.1"), .package(url: "https://github.com/Flight-School/AnyCodable", from: "0.6.7"), - .package(url: "https://github.com/weichsel/ZIPFoundation", from: "0.9.17"), + .package(url: "https://github.com/weichsel/ZIPFoundation", from: "0.9.19"), .package(url: "https://github.com/kishikawakatsumi/KeychainAccess", from: "4.2.2"), .package(url: "https://github.com/stencilproject/Stencil", exact: "0.15.1"), - .package(url: "https://github.com/SwiftDocOrg/GraphViz", exact: "0.2.0"), + .package(url: "https://github.com/tuist/GraphViz.git", branch: "0.2.1"), .package(url: "https://github.com/SwiftGen/StencilSwiftKit", exact: "2.10.1"), .package(url: "https://github.com/SwiftGen/SwiftGen", exact: "6.6.2"), .package(url: "https://github.com/tuist/XcodeProj", exact: "8.19.0"), From d349a94b02dd92d6e0153088f1b4d163bc4cc509 Mon Sep 17 00:00:00 2001 From: Jaewon-Yun Date: Mon, 17 Jun 2024 21:02:34 +0900 Subject: [PATCH 364/509] Improve `tuist init` command (#6400) * Improve `tuist init` command * Rename method of converting string * Replace `XcodeGraph` to `TuistCore` * Add missing dependency --------- Co-authored-by: Daniele Formichelli --- Sources/TuistKit/Services/InitService.swift | 11 ++--- .../Loaders/TemplateGitLoader.swift | 3 +- .../TuistLoader/Loaders/TemplateLoader.swift | 4 +- .../Extensions/String+Extras.swift | 5 +++ Templates/default/AppProject.stencil | 13 ++++-- Templates/default/AppTests.stencil | 2 +- Templates/default/LaunchScreen+iOS.stencil | 25 ----------- Templates/default/LaunchScreen+macOS.stencil | 8 ---- Templates/default/LaunchScreen+tvOS.stencil | 25 ----------- Templates/default/app.stencil | 2 +- Templates/default/default.swift | 9 ++-- .../Services/InitServiceTests.swift | 39 +++++++++++++++- .../Extensions/String+ExtrasTests.swift | 44 +++++++++++++++++++ Tuist/ProjectDescriptionHelpers/Module.swift | 1 + .../adopting-tuist/new-project.md | 5 ++- 15 files changed, 116 insertions(+), 80 deletions(-) delete mode 100644 Templates/default/LaunchScreen+iOS.stencil delete mode 100644 Templates/default/LaunchScreen+macOS.stencil delete mode 100644 Templates/default/LaunchScreen+tvOS.stencil diff --git a/Sources/TuistKit/Services/InitService.swift b/Sources/TuistKit/Services/InitService.swift index 32e61bbf88b..d302d7adabd 100644 --- a/Sources/TuistKit/Services/InitService.swift +++ b/Sources/TuistKit/Services/InitService.swift @@ -192,6 +192,8 @@ class InitService { "name": .string(name), "platform": .string(platform.caseValue), "tuist_version": .string(tuistVersion), + "class_name": .string(name.toValidSwiftIdentifier()), + "bundle_identifier": .string(name.toValidInBundleIdentifier()), ] return try template.attributes.reduce(into: defaultAttributes) { attributesDictionary, attribute in if defaultAttributes.keys.contains(attribute.name) { return } @@ -224,16 +226,15 @@ class InitService { return templateDirectory } + /// Returns name to use. If `name` is nil, returns a directory name executed `init` command. private func name(_ name: String?, path: AbsolutePath) throws -> String { - let initName: String if let name { - initName = name - } else if let name = path.components.last { - initName = name + return name + } else if let directoryName = path.components.last { + return directoryName } else { throw InitServiceError.ungettableProjectName(AbsolutePath.current) } - return initName.camelized.uppercasingFirst } private func path(_ path: String?) throws -> AbsolutePath { diff --git a/Sources/TuistLoader/Loaders/TemplateGitLoader.swift b/Sources/TuistLoader/Loaders/TemplateGitLoader.swift index 5b5325ce18f..f8c8da4378f 100644 --- a/Sources/TuistLoader/Loaders/TemplateGitLoader.swift +++ b/Sources/TuistLoader/Loaders/TemplateGitLoader.swift @@ -1,9 +1,8 @@ import TuistCore import TuistSupport -import XcodeGraph public protocol TemplateGitLoading { - /// Load `XcodeGraph.Template` from the given Git repository + /// Load `TuistCore.Template` from the given Git repository /// to a temporary directory and performs `closure` on that template. /// - Parameters: /// - templateURL: Git repository url diff --git a/Sources/TuistLoader/Loaders/TemplateLoader.swift b/Sources/TuistLoader/Loaders/TemplateLoader.swift index c267548195d..ce333a6f9c3 100644 --- a/Sources/TuistLoader/Loaders/TemplateLoader.swift +++ b/Sources/TuistLoader/Loaders/TemplateLoader.swift @@ -6,11 +6,11 @@ import TuistSupport import XcodeGraph public protocol TemplateLoading { - /// Load `TuistScaffold.Template` at given `path` + /// Load `TuistCore.Template` at given `path` /// - Parameters: /// - path: Path of template manifest file `name_of_template.swift` /// - plugins: List of available plugins. - /// - Returns: Loaded `TuistScaffold.Template` + /// - Returns: Loaded `TuistCore.Template` func loadTemplate(at path: AbsolutePath, plugins: Plugins) throws -> TuistCore.Template } diff --git a/Sources/TuistSupport/Extensions/String+Extras.swift b/Sources/TuistSupport/Extensions/String+Extras.swift index 651ebd6c65c..4325c2f92e7 100644 --- a/Sources/TuistSupport/Extensions/String+Extras.swift +++ b/Sources/TuistSupport/Extensions/String+Extras.swift @@ -140,6 +140,11 @@ extension String { return sanitized } + /// Makes the string to be available in the `Bundle Identifier`. + public func toValidInBundleIdentifier() -> String { + return replacingOccurrences(of: "[^a-zA-Z0-9.-]", with: "-", options: .regularExpression) + } + public func camelCaseToKebabCase() -> String { convertCamelCase(separator: "-") } diff --git a/Templates/default/AppProject.stencil b/Templates/default/AppProject.stencil index 1cbf77f56a4..3d4a202d722 100644 --- a/Templates/default/AppProject.stencil +++ b/Templates/default/AppProject.stencil @@ -7,12 +7,19 @@ let project = Project( name: "{{ name }}", destinations: .{{ platform }}, product: .app, - bundleId: "io.tuist.{{ name }}", + bundleId: "io.tuist.{{ bundle_identifier }}", +{% if platform == "iOS" or platform == "tvOS" %} infoPlist: .extendingDefault( with: [ - "UILaunchStoryboardName": "LaunchScreen.storyboard", + "UILaunchScreen": [ + "UIColorName": "", + "UIImageName": "", + ], ] ), +{% elif platform == "macOS" %} + infoPlist: .default, +{% endif %} sources: ["{{ name }}/Sources/**"], resources: ["{{ name }}/Resources/**"], dependencies: [] @@ -21,7 +28,7 @@ let project = Project( name: "{{ name }}Tests", destinations: .{{ platform }}, product: .unitTests, - bundleId: "io.tuist.{{ name }}Tests", + bundleId: "io.tuist.{{ bundle_identifier }}Tests", infoPlist: .default, sources: ["{{ name }}/Tests/**"], resources: [], diff --git a/Templates/default/AppTests.stencil b/Templates/default/AppTests.stencil index fb7776aa513..71b0f0da106 100644 --- a/Templates/default/AppTests.stencil +++ b/Templates/default/AppTests.stencil @@ -1,7 +1,7 @@ import Foundation import XCTest -final class {{ name }}Tests: XCTestCase { +final class {{ class_name }}Tests: XCTestCase { func test_twoPlusTwo_isFour() { XCTAssertEqual(2+2, 4) } diff --git a/Templates/default/LaunchScreen+iOS.stencil b/Templates/default/LaunchScreen+iOS.stencil deleted file mode 100644 index 865e9329f37..00000000000 --- a/Templates/default/LaunchScreen+iOS.stencil +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Templates/default/LaunchScreen+macOS.stencil b/Templates/default/LaunchScreen+macOS.stencil deleted file mode 100644 index be1034ddd63..00000000000 --- a/Templates/default/LaunchScreen+macOS.stencil +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Templates/default/LaunchScreen+tvOS.stencil b/Templates/default/LaunchScreen+tvOS.stencil deleted file mode 100644 index eadb1feac0c..00000000000 --- a/Templates/default/LaunchScreen+tvOS.stencil +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Templates/default/app.stencil b/Templates/default/app.stencil index e9a32cea9a0..51b074cc1b7 100644 --- a/Templates/default/app.stencil +++ b/Templates/default/app.stencil @@ -1,7 +1,7 @@ import SwiftUI @main -struct {{ name }}App: App { +struct {{ class_name }}App: App { var body: some Scene { WindowGroup { ContentView() diff --git a/Templates/default/default.swift b/Templates/default/default.swift index db1f14fe231..fb6798db012 100644 --- a/Templates/default/default.swift +++ b/Templates/default/default.swift @@ -4,6 +4,7 @@ let nameAttribute: Template.Attribute = .required("name") let platformAttribute: Template.Attribute = .optional("platform", default: "iOS") let projectPath = "." let appPath = "./\(nameAttribute)" +let classNameAttribute: Template.Attribute = .required("class_name") let template = Template( description: "Default template", @@ -21,7 +22,7 @@ let template = Template( templatePath: "Package.stencil" ), .file( - path: appPath + "/Sources/\(nameAttribute)App.swift", + path: appPath + "/Sources/\(classNameAttribute)App.swift", templatePath: "app.stencil" ), .file( @@ -37,7 +38,7 @@ let template = Template( sourcePath: "Preview Content" ), .file( - path: appPath + "/Tests/\(nameAttribute)Tests.swift", + path: appPath + "/Tests/\(classNameAttribute)Tests.swift", templatePath: "AppTests.stencil" ), .file( @@ -48,9 +49,5 @@ let template = Template( path: ".mise.toml", templatePath: "mise.stencil" ), - .file( - path: appPath + "/Resources/LaunchScreen.storyboard", - templatePath: "LaunchScreen+\(platformAttribute).stencil" - ), ] ) diff --git a/Tests/TuistKitTests/Services/InitServiceTests.swift b/Tests/TuistKitTests/Services/InitServiceTests.swift index 28e04211c48..e3fea17b875 100644 --- a/Tests/TuistKitTests/Services/InitServiceTests.swift +++ b/Tests/TuistKitTests/Services/InitServiceTests.swift @@ -3,7 +3,6 @@ import Path import TuistCore import TuistScaffold import TuistSupport -import XcodeGraph import XCTest @testable import TuistKit @@ -72,6 +71,8 @@ final class InitServiceTests: TuistUnitTestCase { "name": .string("Name"), "platform": .string("macOS"), "tuist_version": .string(tuistVersion), + "class_name": .string("Name"), + "bundle_identifier": .string("Name"), ] var generatorAttributes: [String: Template.Attribute.Value] = [:] templateGenerator.generateStub = { _, _, attributes in @@ -99,6 +100,8 @@ final class InitServiceTests: TuistUnitTestCase { "name": .string("Name"), "platform": .string("iOS"), "tuist_version": .string(tuistVersion), + "class_name": .string("Name"), + "bundle_identifier": .string("Name"), ] var generatorAttributes: [String: Template.Attribute.Value] = [:] templateGenerator.generateStub = { _, _, attributes in @@ -112,6 +115,34 @@ final class InitServiceTests: TuistUnitTestCase { XCTAssertEqual(expectedAttributes, generatorAttributes) } + func test_init_default_with_unusual_name() throws { + // Given + let defaultTemplatePath = try temporaryPath().appending(component: "default") + templatesDirectoryLocator.templateDirectoriesStub = { _ in + [defaultTemplatePath] + } + let tuistVersion = "4.0.3" + tuistVersionLoader.getVersionStub = tuistVersion + + let expectedAttributes: [String: TuistCore.Template.Attribute.Value] = [ + "name": .string("unusual name"), + "platform": .string("iOS"), + "tuist_version": .string(tuistVersion), + "class_name": .string("UnusualName"), + "bundle_identifier": .string("unusual-name"), + ] + var generatorAttributes: [String: TuistCore.Template.Attribute.Value] = [:] + templateGenerator.generateStub = { _, _, attributes in + generatorAttributes = attributes + } + + // When + try subject.testRun(name: "unusual name") + + // Then + XCTAssertEqual(expectedAttributes, generatorAttributes) + } + func test_load_git_template_attributes() async throws { // Given templateGitLoader.loadTemplateStub = { _ in @@ -132,6 +163,8 @@ final class InitServiceTests: TuistUnitTestCase { "name": .string("Name"), "platform": .string("macOS"), "tuist_version": .string(tuistVersion), + "class_name": .string("Name"), + "bundle_identifier": .string("Name"), "required": .string("requiredValue"), "optional": .string("optionalValue"), ] @@ -179,6 +212,8 @@ final class InitServiceTests: TuistUnitTestCase { "name": .string("Name"), "platform": .string("iOS"), "tuist_version": .string(tuistVersion), + "class_name": .string("Name"), + "bundle_identifier": .string("Name"), "optional": context, ] @@ -216,6 +251,8 @@ final class InitServiceTests: TuistUnitTestCase { "name": .string("Name"), "platform": .string("iOS"), "tuist_version": .string(tuistVersion), + "class_name": .string("Name"), + "bundle_identifier": .string("Name"), "optional": defaultIntegerValue, ] diff --git a/Tests/TuistSupportTests/Extensions/String+ExtrasTests.swift b/Tests/TuistSupportTests/Extensions/String+ExtrasTests.swift index ad502d71a5b..a66ba1f2048 100644 --- a/Tests/TuistSupportTests/Extensions/String+ExtrasTests.swift +++ b/Tests/TuistSupportTests/Extensions/String+ExtrasTests.swift @@ -73,6 +73,50 @@ final class StringExtrasTests: TuistUnitTestCase { XCTAssertEqual(got, "ValidClassName") } + func test_to_valid_in_bundle_identifier_when_string_is_already_valid() { + // Given + let subject = "TestBundleIdentifier.tuist" + + // When + let got = subject.toValidInBundleIdentifier() + + // Then + XCTAssertEqual(got, "TestBundleIdentifier.tuist") + } + + func test_to_valid_in_bundle_identifier_when_string_contains_under_bars() { + // Given + let subject = "_test_bundle_identifier_" + + // When + let got = subject.toValidInBundleIdentifier() + + // Then + XCTAssertEqual(got, "-test-bundle-identifier-") + } + + func test_to_valid_in_bundle_identifier_when_string_contains_special_characters() { + // Given + let subject = "$test+bundle@identifier" + + // When + let got = subject.toValidInBundleIdentifier() + + // Then + XCTAssertEqual(got, "-test-bundle-identifier") + } + + func test_to_valid_in_bundle_identifier_when_string_contains_white_spaces() { + // Given + let subject = "test bundle identifier" + + // When + let got = subject.toValidInBundleIdentifier() + + // Then + XCTAssertEqual(got, "test--bundle--identifier") + } + func test_string_doesnt_match_GitURL_regex() { // Given let stringToEvaluate = "not a url string" diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index ff9914dc497..49784886cce 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -557,6 +557,7 @@ public enum Module: String, CaseIterable { ] case .generator: [ + .target(name: Module.loader.testingTargetName!), .target(name: Module.core.testingTargetName!), .target(name: Module.support.testingTargetName!), .external(name: "XcodeProj"), diff --git a/docs/docs/guide/introduction/adopting-tuist/new-project.md b/docs/docs/guide/introduction/adopting-tuist/new-project.md index c6017a1edbe..916e04c43f2 100644 --- a/docs/docs/guide/introduction/adopting-tuist/new-project.md +++ b/docs/docs/guide/introduction/adopting-tuist/new-project.md @@ -47,7 +47,10 @@ let project = Project( bundleId: "io.tuist.MyApp", infoPlist: .extendingDefault( with: [ - "UILaunchStoryboardName": "LaunchScreen.storyboard", + "UILaunchScreen": [ + "UIColorName": "", + "UIImageName": "", + ], ] ), sources: ["MyApp/Sources/**"], From cd047b92dbf56bca3d5dc6e32da00e1af895b776 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 09:19:59 +0200 Subject: [PATCH 365/509] add DevilDimon as a contributor for code (#6416) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a3dcb814112..003f7ec5c76 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1418,6 +1418,15 @@ "contributions": [ "doc" ] + }, + { + "login": "DevilDimon", + "name": "Dmitry Serov", + "avatar_url": "https://avatars.githubusercontent.com/u/10220441?v=4", + "profile": "https://github.com/DevilDimon", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index b4ac660704b..9f5f32f796a 100644 --- a/README.md +++ b/README.md @@ -559,6 +559,7 @@ Thanks goes to these wonderful people:
    Andy Kolean

    Binlogo
    +
    Dmitry Serov
    From cdc962687d0270513caf895722398773d4d2b4c0 Mon Sep 17 00:00:00 2001 From: Dmitry Serov Date: Tue, 18 Jun 2024 08:22:33 +0100 Subject: [PATCH 366/509] Allow dependencies between iOS app extensions and bundles (#6415) --- .../TuistGenerator/Linter/GraphLinter.swift | 1 + .../GenerateAcceptanceTests.swift | 5 ++++ .../Linter/GraphLinterTests.swift | 27 +++++++++++++++++++ .../ios_app_with_extensions/Bundle/dummy.jpg | 0 .../ios_app_with_extensions/Project.swift | 8 ++++++ 5 files changed, 41 insertions(+) create mode 100644 fixtures/ios_app_with_extensions/Bundle/dummy.jpg diff --git a/Sources/TuistGenerator/Linter/GraphLinter.swift b/Sources/TuistGenerator/Linter/GraphLinter.swift index 69185f780d1..6d43a57e40a 100644 --- a/Sources/TuistGenerator/Linter/GraphLinter.swift +++ b/Sources/TuistGenerator/Linter/GraphLinter.swift @@ -443,6 +443,7 @@ public class GraphLinter: GraphLinting { LintableTarget(platform: .iOS, product: .dynamicLibrary), LintableTarget(platform: .iOS, product: .staticFramework), LintableTarget(platform: .iOS, product: .framework), + LintableTarget(platform: .iOS, product: .bundle), LintableTarget(platform: .macOS, product: .macro), ], LintableTarget(platform: .iOS, product: .appClip): [ diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index 2a7cc5fc3b3..4faa70ba758 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -483,6 +483,11 @@ final class GenerateAcceptanceTestiOSAppWithExtensions: TuistAcceptanceTestCase "App.app", destination: "Debug-iphonesimulator" ) + try await XCTAssertProductWithDestinationContainsResource( + "WidgetExtension.appex", + destination: "Debug-iphonesimulator", + resource: "Bundle.bundle/dummy.jpg" + ) } } diff --git a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift index f4d5703473b..85a4693fa40 100644 --- a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift @@ -233,6 +233,33 @@ final class GraphLinterTests: TuistUnitTestCase { XCTAssertTrue(result.isEmpty) } + func test_lint_appExtension_canDependOnBundle() throws { + // Given + let path: AbsolutePath = "/project" + let appExtension = Target.empty(name: "app_extension", product: .appExtension) + let bundle = Target.empty(name: "bundle", product: .bundle) + let project = Project.empty(path: path) + + let dependencies: [GraphDependency: Set] = [ + .target(name: appExtension.name, path: path): Set([.target(name: bundle.name, path: path)]), + .target(name: bundle.name, path: path): Set([]), + ] + + let graph = Graph.test( + path: path, + projects: [path: project], + dependencies: dependencies + ) + let config = Config.test() + let graphTraverser = GraphTraverser(graph: graph) + + // When + let result = subject.lint(graphTraverser: graphTraverser, config: config) + + // Then + XCTAssertTrue(result.isEmpty) + } + func test_lint_frameworkDependsOnBundle() throws { // Given let path: AbsolutePath = "/project" diff --git a/fixtures/ios_app_with_extensions/Bundle/dummy.jpg b/fixtures/ios_app_with_extensions/Bundle/dummy.jpg new file mode 100644 index 00000000000..e69de29bb2d diff --git a/fixtures/ios_app_with_extensions/Project.swift b/fixtures/ios_app_with_extensions/Project.swift index eae73cc020e..a1d36014ffe 100644 --- a/fixtures/ios_app_with_extensions/Project.swift +++ b/fixtures/ios_app_with_extensions/Project.swift @@ -96,6 +96,7 @@ let project = Project( sources: "WidgetExtension/Sources/**", resources: "WidgetExtension/Resources/**", dependencies: [ + .target(name: "Bundle"), .target(name: "StaticFramework"), ] ), @@ -119,5 +120,12 @@ let project = Project( ]), sources: "AppIntentExtension/Sources/**" ), + .target( + name: "Bundle", + destinations: .iOS, + product: .bundle, + bundleId: "io.tuist.App.Bundle", + resources: "Bundle/**" + ), ] ) From acad9c493dba0fe7b29a19368333af519fb12efa Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 18 Jun 2024 10:34:51 +0200 Subject: [PATCH 367/509] Update release date --- .../Client/CloudClientCLIMetadataHeadersMiddleware.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift b/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift index 0931a2afec0..c095b898364 100644 --- a/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift +++ b/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift @@ -5,7 +5,7 @@ import TuistSupport /// This middleware includes the release date of the CLI in the headers so that we can show /// warnings if the on-premise installation is too old. struct CloudClientCLIMetadataHeadersMiddleware: ClientMiddleware { - let releaseDate = "2024.06.10" + let releaseDate = "2024.06.18" func intercept( _ request: Request, From 1a81ff599d8fd96578de381714520d6379ecf900 Mon Sep 17 00:00:00 2001 From: Tuist Date: Tue, 18 Jun 2024 09:09:56 +0000 Subject: [PATCH 368/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.18.0 --- .mise.toml | 2 +- CHANGELOG.md | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 638734ed0b1..0bffaea576a 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.17.0" +tuist = "4.18.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index ef1d363cf53..7307489aad5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## 4.18.0 - 2024-06-18 + +### Tuist + +#### Changed + +- Finish early instead of failing when testing a scheme with no tests [#6398](https://github.com/tuist/tuist/pull/6398) by [@fortmarek](https://github.com/fortmarek) +- Allow iOS app extensions to depend on bundles [#6415](https://github.com/tuist/tuist/pull/6415) by [@DevilDimon](https://github.com/DevilDimon) + +#### Fixed + +- Fix sporadic errors when Tuist tries to preserve the SPM lockfile across project generations [#6394](https://github.com/tuist/tuist/pull/6394) by [@pepicrft](https://github.com/pepicrft) + +### Tuist Cloud + +- no changes + ## 4.17.0 - 2024-06-11 ### Tuist From b2a2f18f68d9d7339b80eeab664f26c2af0457b8 Mon Sep 17 00:00:00 2001 From: Florian Fittschen Date: Tue, 18 Jun 2024 15:34:49 +0200 Subject: [PATCH 369/509] Add ProjectAutomation-auto package product (#6417) --- Package.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Package.swift b/Package.swift index 0bbe394ca6d..4c5ae5424e4 100644 --- a/Package.swift +++ b/Package.swift @@ -333,6 +333,10 @@ let package = Package( type: .dynamic, targets: ["ProjectAutomation"] ), + .library( + name: "ProjectAutomation-auto", + targets: ["ProjectAutomation"] + ), .library( name: "TuistKit", targets: ["TuistKit"] From c0cdecff4db772fb20f2318fa715eae0db971b45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 18 Jun 2024 16:11:24 +0200 Subject: [PATCH 370/509] Remove upload of result bundles to CI (#6412) --- codemagic.yaml | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/codemagic.yaml b/codemagic.yaml index 54e3c4fdc59..7535ef5f6c3 100644 --- a/codemagic.yaml +++ b/codemagic.yaml @@ -72,8 +72,6 @@ workflows: cache: cache_paths: - $CM_BUILD_DIR/.build - artifacts: - - /tmp/tuist/** scripts: - name: Set environment variables script: | @@ -85,7 +83,7 @@ workflows: - name: Install Tuist dependencies script: mise x -- tuist install - name: Run tests - script: mise x -- tuist test TuistUnitTests --result-bundle-path /tmp/tuist/test-result-bundle + script: mise x -- tuist test TuistUnitTests triggering: << : *branch_triggering cache: @@ -98,8 +96,6 @@ workflows: cache: cache_paths: - $CM_BUILD_DIR/.build - artifacts: - - /tmp/tuist/** scripts: - name: Set environment variables script: | @@ -161,8 +157,6 @@ workflows: cache: cache_paths: - $CM_BUILD_DIR/.build - artifacts: - - /tmp/tuist/** scripts: - name: Set environment variables script: | @@ -178,7 +172,7 @@ workflows: - name: Install Tuist dependencies script: mise x -- tuist install - name: Run tests - script: mise x -- tuist test TuistAutomationAcceptanceTests --result-bundle-path /tmp/tuist/automation-acceptance-test-result-bundle + script: mise x -- tuist test TuistAutomationAcceptanceTests triggering: << : *branch_triggering @@ -192,8 +186,6 @@ workflows: cache: cache_paths: - $CM_BUILD_DIR/.build - artifacts: - - /tmp/tuist/** scripts: - name: Set environment variables script: | @@ -209,7 +201,7 @@ workflows: - name: Install Tuist dependencies script: mise x -- tuist install - name: Run tests - script: mise x -- tuist test --result-bundle-path /tmp/tuist/dependencies-acceptance-test-result-bundle TuistDependenciesAcceptanceTests + script: mise x -- tuist test triggering: << : *branch_triggering @@ -223,8 +215,6 @@ workflows: cache: cache_paths: - $CM_BUILD_DIR/.build - artifacts: - - /tmp/tuist/** scripts: - name: Set environment variables script: | @@ -240,7 +230,7 @@ workflows: - name: Install Tuist dependencies script: mise x -- tuist install - name: Run tests - script: mise x -- tuist test TuistGeneratorAcceptanceTests --result-bundle-path /tmp/tuist/generator-acceptance-test-result-bundle + script: mise x -- tuist test TuistGeneratorAcceptanceTests triggering: << : *branch_triggering @@ -254,8 +244,6 @@ workflows: cache: cache_paths: - $CM_BUILD_DIR/.build - artifacts: - - /tmp/tuist/** scripts: - name: Set environment variables script: | @@ -271,6 +259,6 @@ workflows: - name: Install Tuist dependencies script: mise x -- tuist install - name: Run tests - script: mise x -- tuist test tuistAcceptanceTests --result-bundle-path /tmp/tuist/tuist-acceptance-test-result-bundle + script: mise x -- tuist test tuistAcceptanceTests triggering: << : *branch_triggering \ No newline at end of file From 1468a058fec48ce59de175cadf7401650289b20d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 20 Jun 2024 12:17:32 +0200 Subject: [PATCH 371/509] Surface current organization usage in cloud organization show (#6421) --- .../Cloud/CloudOrganizationShowService.swift | 11 ++ .../Models/CloudOrganizationUsage.swift | 31 +++ Sources/TuistServer/OpenAPI/Client.swift | 72 +++++++ Sources/TuistServer/OpenAPI/Types.swift | 184 ++++++++++++++++++ Sources/TuistServer/OpenAPI/cloud.yml | 46 ++++- .../Services/GetOrganizationUsage.swift | 74 +++++++ .../CloudOrganizationShowServiceTests.swift | 14 ++ 7 files changed, 431 insertions(+), 1 deletion(-) create mode 100644 Sources/TuistServer/Models/CloudOrganizationUsage.swift create mode 100644 Sources/TuistServer/Services/GetOrganizationUsage.swift diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift index de630514f4b..f540bd53d50 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift @@ -14,15 +14,18 @@ protocol CloudOrganizationShowServicing { final class CloudOrganizationShowService: CloudOrganizationShowServicing { private let getOrganizationService: GetOrganizationServicing + private let getOrganizationUsageService: GetOrganizationUsageServicing private let cloudURLService: CloudURLServicing private let configLoader: ConfigLoading init( getOrganizationService: GetOrganizationServicing = GetOrganizationService(), + getOrganizationUsageService: GetOrganizationUsageServicing = GetOrganizationUsageService(), cloudURLService: CloudURLServicing = CloudURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.getOrganizationService = getOrganizationService + self.getOrganizationUsageService = getOrganizationUsageService self.cloudURLService = cloudURLService self.configLoader = configLoader } @@ -46,6 +49,11 @@ final class CloudOrganizationShowService: CloudOrganizationShowServicing { serverURL: cloudURL ) + let organizationUsage = try await getOrganizationUsageService.getOrganizationUsage( + organizationName: organizationName, + serverURL: cloudURL + ) + if json { let json = try organization.toJSON() logger.info(.init(stringLiteral: json.toString(prettyPrint: true))) @@ -87,6 +95,9 @@ final class CloudOrganizationShowService: CloudOrganizationShowServicing { logger.info(""" \(baseInfo.joined(separator: "\n")) + \("Usage".bold()) (current calendar month) + Remote cache hits: \(organizationUsage.currentMonthRemoteCacheHits) + \("Organization members".bold()) (total number: \(organization.members.count)) \(membersTable) diff --git a/Sources/TuistServer/Models/CloudOrganizationUsage.swift b/Sources/TuistServer/Models/CloudOrganizationUsage.swift new file mode 100644 index 00000000000..3d1a3c24739 --- /dev/null +++ b/Sources/TuistServer/Models/CloudOrganizationUsage.swift @@ -0,0 +1,31 @@ +import Foundation +import Path + +/// Cloud organization usage +public struct CloudOrganizationUsage: Codable { + public init( + currentMonthRemoteCacheHits: Int + ) { + self.currentMonthRemoteCacheHits = currentMonthRemoteCacheHits + } + + public let currentMonthRemoteCacheHits: Int +} + +extension CloudOrganizationUsage { + init(_ organizationUsage: Components.Schemas.OrganizationUsage) { + currentMonthRemoteCacheHits = Int(organizationUsage.current_month_remote_cache_hits) + } +} + +#if DEBUG + extension CloudOrganizationUsage { + public static func test( + currentMonthRemoteCacheHits: Int = 100 + ) -> Self { + .init( + currentMonthRemoteCacheHits: currentMonthRemoteCacheHits + ) + } + } +#endif diff --git a/Sources/TuistServer/OpenAPI/Client.swift b/Sources/TuistServer/OpenAPI/Client.swift index 9838c54cd67..c844c35d5cf 100644 --- a/Sources/TuistServer/OpenAPI/Client.swift +++ b/Sources/TuistServer/OpenAPI/Client.swift @@ -1604,6 +1604,78 @@ public struct Client: APIProtocol { } ) } + /// Shows the usage of an organization + /// + /// Returns the usage of the organization with the given identifier. (e.g. number of remote cache hits) + /// + /// - Remark: HTTP `GET /api/organizations/{organization_name}/usage`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/usage/get(showOrganizationUsage)`. + public func showOrganizationUsage(_ input: Operations.showOrganizationUsage.Input) async throws + -> Operations.showOrganizationUsage.Output + { + try await client.send( + input: input, + forOperation: Operations.showOrganizationUsage.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/organizations/{}/usage", + parameters: [input.path.organization_name] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .get) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.showOrganizationUsage.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.showOrganizationUsage.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.OrganizationUsage.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 403: + let headers: Operations.showOrganizationUsage.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.showOrganizationUsage.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.showOrganizationUsage.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.showOrganizationUsage.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } /// List projects the authenticated user has access to. /// /// - Remark: HTTP `GET /api/projects`. diff --git a/Sources/TuistServer/OpenAPI/Types.swift b/Sources/TuistServer/OpenAPI/Types.swift index c24b8d1ef60..dc425a75454 100644 --- a/Sources/TuistServer/OpenAPI/Types.swift +++ b/Sources/TuistServer/OpenAPI/Types.swift @@ -145,6 +145,14 @@ public protocol APIProtocol: Sendable { /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/delete(removeOrganizationMember)`. func removeOrganizationMember(_ input: Operations.removeOrganizationMember.Input) async throws -> Operations.removeOrganizationMember.Output + /// Shows the usage of an organization + /// + /// Returns the usage of the organization with the given identifier. (e.g. number of remote cache hits) + /// + /// - Remark: HTTP `GET /api/organizations/{organization_name}/usage`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/usage/get(showOrganizationUsage)`. + func showOrganizationUsage(_ input: Operations.showOrganizationUsage.Input) async throws + -> Operations.showOrganizationUsage.Output /// List projects the authenticated user has access to. /// /// - Remark: HTTP `GET /api/projects`. @@ -1071,6 +1079,23 @@ public enum Components { case role } } + /// The usage of an organization. + /// + /// - Remark: Generated from `#/components/schemas/OrganizationUsage`. + public struct OrganizationUsage: Codable, Equatable, Hashable, Sendable { + /// The number of remote cache hits in the current month + /// + /// - Remark: Generated from `#/components/schemas/OrganizationUsage/current_month_remote_cache_hits`. + public var current_month_remote_cache_hits: Swift.Double + /// Creates a new `OrganizationUsage`. + /// + /// - Parameters: + /// - current_month_remote_cache_hits: The number of remote cache hits in the current month + public init(current_month_remote_cache_hits: Swift.Double) { + self.current_month_remote_cache_hits = current_month_remote_cache_hits + } + public enum CodingKeys: String, CodingKey { case current_month_remote_cache_hits } + } /// - Remark: Generated from `#/components/schemas/Project`. public struct Project: Codable, Equatable, Hashable, Sendable { /// The full name of the project (e.g. tuist/tuist) @@ -4819,6 +4844,165 @@ public enum Operations { case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) } } + /// Shows the usage of an organization + /// + /// Returns the usage of the organization with the given identifier. (e.g. number of remote cache hits) + /// + /// - Remark: HTTP `GET /api/organizations/{organization_name}/usage`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/usage/get(showOrganizationUsage)`. + public enum showOrganizationUsage { + public static let id: String = "showOrganizationUsage" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var organization_name: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - organization_name: + public init(organization_name: Swift.String) { + self.organization_name = organization_name + } + } + public var path: Operations.showOrganizationUsage.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.showOrganizationUsage.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.showOrganizationUsage.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.showOrganizationUsage.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.showOrganizationUsage.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.showOrganizationUsage.Input.Path, + query: Operations.showOrganizationUsage.Input.Query = .init(), + headers: Operations.showOrganizationUsage.Input.Headers = .init(), + cookies: Operations.showOrganizationUsage.Input.Cookies = .init(), + body: Operations.showOrganizationUsage.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.showOrganizationUsage.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.OrganizationUsage) + } + /// Received HTTP response body + public var body: Operations.showOrganizationUsage.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.showOrganizationUsage.Output.Ok.Headers = .init(), + body: Operations.showOrganizationUsage.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization usage + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/usage/get(showOrganizationUsage)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.showOrganizationUsage.Output.Ok) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.showOrganizationUsage.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.showOrganizationUsage.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.showOrganizationUsage.Output.Forbidden.Headers = .init(), + body: Operations.showOrganizationUsage.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/usage/get(showOrganizationUsage)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.showOrganizationUsage.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.showOrganizationUsage.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.showOrganizationUsage.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.showOrganizationUsage.Output.NotFound.Headers = .init(), + body: Operations.showOrganizationUsage.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The organization with the given name was not found + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/usage/get(showOrganizationUsage)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.showOrganizationUsage.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } /// List projects the authenticated user has access to. /// /// - Remark: HTTP `GET /api/projects`. diff --git a/Sources/TuistServer/OpenAPI/cloud.yml b/Sources/TuistServer/OpenAPI/cloud.yml index 4456d6995fc..253b3d951d5 100644 --- a/Sources/TuistServer/OpenAPI/cloud.yml +++ b/Sources/TuistServer/OpenAPI/cloud.yml @@ -341,6 +341,17 @@ components: title: OrganizationMember type: object x-struct: Elixir.TuistCloudWeb.API.Schemas.OrganizationMember + OrganizationUsage: + description: The usage of an organization. + properties: + current_month_remote_cache_hits: + description: The number of remote cache hits in the current month + type: number + required: + - current_month_remote_cache_hits + title: OrganizationUsage + type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.OrganizationUsage Project: properties: full_name: @@ -383,7 +394,7 @@ components: scheme: bearer type: http info: - title: Tuist Cloud + title: Tuist version: 0.1.0 openapi: 3.0.0 paths: @@ -1333,6 +1344,39 @@ paths: description: The organization or the user with the given name was not found summary: Updates a member in an organization tags: [] + /api/organizations/{organization_name}/usage: + get: + callbacks: {} + description: Returns the usage of the organization with the given identifier. (e.g. number of remote cache hits) + operationId: showOrganizationUsage + parameters: + - description: The name of the organization to show. + in: path + name: organization_name + required: true + schema: + type: string + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationUsage' + description: The organization usage + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The organization with the given name was not found + summary: Shows the usage of an organization + tags: [] /api/projects: get: callbacks: {} diff --git a/Sources/TuistServer/Services/GetOrganizationUsage.swift b/Sources/TuistServer/Services/GetOrganizationUsage.swift new file mode 100644 index 00000000000..645bfcb84c7 --- /dev/null +++ b/Sources/TuistServer/Services/GetOrganizationUsage.swift @@ -0,0 +1,74 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol GetOrganizationUsageServicing { + func getOrganizationUsage( + organizationName: String, + serverURL: URL + ) async throws -> CloudOrganizationUsage +} + +enum GetOrganizationUsageServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .forbidden, .notFound: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "We could not get the OrganizationUsage due to an unknown cloud response of \(statusCode)." + case let .forbidden(message), let .notFound(message): + return message + } + } +} + +public final class GetOrganizationUsageService: GetOrganizationUsageServicing { + public init() {} + + public func getOrganizationUsage( + organizationName: String, + serverURL: URL + ) async throws -> CloudOrganizationUsage { + let client = Client.cloud(serverURL: serverURL) + + let response = try await client.showOrganizationUsage( + .init( + path: .init( + organization_name: organizationName + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(organizationUsage): + return CloudOrganizationUsage(organizationUsage) + } + case let .notFound(notFound): + switch notFound.body { + case let .json(error): + throw GetOrganizationUsageServiceError.notFound(error.message) + } + case let .forbidden(forbidden): + switch forbidden.body { + case let .json(error): + throw GetOrganizationUsageServiceError.forbidden(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw GetOrganizationUsageServiceError.unknownError(statusCode) + } + } +} diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift index 7628b3fd526..7720cca3cde 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift @@ -10,6 +10,7 @@ import XCTest final class CloudOrganizationShowServiceTests: TuistUnitTestCase { private var getOrganizationService: MockGetOrganizationServicing! + private var getOrganizationUsageService: MockGetOrganizationUsageServicing! private var subject: CloudOrganizationShowService! private var configLoader: MockConfigLoading! private var cloudURL: URL! @@ -17,17 +18,20 @@ final class CloudOrganizationShowServiceTests: TuistUnitTestCase { override func setUp() { super.setUp() getOrganizationService = .init() + getOrganizationUsageService = .init() configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) subject = CloudOrganizationShowService( getOrganizationService: getOrganizationService, + getOrganizationUsageService: getOrganizationUsageService, configLoader: configLoader ) } override func tearDown() { getOrganizationService = nil + getOrganizationUsageService = nil configLoader = nil cloudURL = nil subject = nil @@ -64,6 +68,10 @@ final class CloudOrganizationShowServiceTests: TuistUnitTestCase { ) ) + given(getOrganizationUsageService) + .getOrganizationUsage(organizationName: .any, serverURL: .any) + .willReturn(.test(currentMonthRemoteCacheHits: 210)) + // When try await subject.run( organizationName: "tuist", @@ -77,6 +85,9 @@ final class CloudOrganizationShowServiceTests: TuistUnitTestCase { Name: test-one Plan: Team + \(TerminalStyle.bold.open)Usage\(TerminalStyle.reset.open) (current calendar month) + Remote cache hits: 210 + \(TerminalStyle.bold.open)Organization members\(TerminalStyle.reset.open) (total number: 2) username email role name-one name-one@email.io user @@ -99,6 +110,9 @@ final class CloudOrganizationShowServiceTests: TuistUnitTestCase { ssoOrganization: .google("tuist.io") ) ) + given(getOrganizationUsageService) + .getOrganizationUsage(organizationName: .any, serverURL: .any) + .willReturn(.test()) // When try await subject.run( From 3f723b319a8666e5696f1a404a1d9395eaae83e3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 21 Jun 2024 08:45:04 +0200 Subject: [PATCH 372/509] add Binlogo as a contributor for code (#6427) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 003f7ec5c76..5d2218204ba 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1416,7 +1416,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/7845507?v=4", "profile": "https://github.com/Binlogo", "contributions": [ - "doc" + "doc", + "code" ] }, { From 19381feca95acf05fc72ce5553ece715e593cf61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 21 Jun 2024 10:09:59 +0200 Subject: [PATCH 373/509] Fix tuist clean when no category is provided (#6422) --- Sources/TuistKit/Commands/EnvKey/EnvKey.swift | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift index aedb45f2a0c..bd8076ca043 100644 --- a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift +++ b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift @@ -232,10 +232,7 @@ extension EnvKey { return T(argument: envValueString) } - func envValue() -> [T] { - guard let envValueString else { - return [] - } - return envValueString.split(separator: ",").compactMap { T(argument: String($0)) } + func envValue() -> [T]? { + return envValueString?.split(separator: ",").compactMap { T(argument: String($0)) } } } From 297c4bd1ae128480e736b09ed3ef71fd7b58c16b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 21 Jun 2024 11:00:38 +0200 Subject: [PATCH 374/509] Fix caching ProjectDescriptionHelpers across macOS versions (#6429) --- .../ProjectDescriptionHelpersHasher.swift | 19 ++++++++++++++----- Sources/TuistSupport/MachineEnvironment.swift | 2 ++ .../Loaders/ManifestLoaderFactoryTests.swift | 7 +++++++ ...ProjectDescriptionHelpersHasherTests.swift | 17 +++++++++++++---- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasher.swift b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasher.swift index ddd5b8b34b9..94c4571a2ad 100644 --- a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasher.swift +++ b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasher.swift @@ -16,10 +16,18 @@ public protocol ProjectDescriptionHelpersHashing: AnyObject { public final class ProjectDescriptionHelpersHasher: ProjectDescriptionHelpersHashing { /// Tuist version. - let tuistVersion: String - - public init(tuistVersion: String = Constants.version) { + private let tuistVersion: String + private let machineEnvironment: MachineEnvironmentRetrieving + private let swiftVersionProvider: SwiftVersionProviding + + public init( + tuistVersion: String = Constants.version, + machineEnvironment: MachineEnvironmentRetrieving = MachineEnvironment.shared, + swiftVersionProvider: SwiftVersionProviding = SwiftVersionProvider.shared + ) { self.tuistVersion = tuistVersion + self.machineEnvironment = machineEnvironment + self.swiftVersionProvider = swiftVersionProvider } // MARK: - ProjectDescriptionHelpersHashing @@ -31,14 +39,15 @@ public final class ProjectDescriptionHelpersHasher: ProjectDescriptionHelpersHas .compactMap { $0.sha256() } .compactMap { $0.compactMap { byte in String(format: "%02x", byte) }.joined() } let tuistEnvVariables = Environment.shared.manifestLoadingVariables.map { "\($0.key)=\($0.value)" }.sorted() - let swiftVersion = try SwiftVersionProvider.shared.swiftVersion() + let swiftVersion = try swiftVersionProvider.swiftVersion() + let macosVersion = machineEnvironment.macOSVersion #if DEBUG let debug = true #else let debug = false #endif - let identifiers = [swiftVersion, tuistVersion] + fileHashes + tuistEnvVariables + ["\(debug)"] + let identifiers = [macosVersion, swiftVersion, tuistVersion] + fileHashes + tuistEnvVariables + ["\(debug)"] return identifiers.joined(separator: "-").md5 } diff --git a/Sources/TuistSupport/MachineEnvironment.swift b/Sources/TuistSupport/MachineEnvironment.swift index 608827fb427..0c32a3c0606 100644 --- a/Sources/TuistSupport/MachineEnvironment.swift +++ b/Sources/TuistSupport/MachineEnvironment.swift @@ -1,6 +1,8 @@ import CryptoKit import Foundation +import Mockable +@Mockable public protocol MachineEnvironmentRetrieving: Sendable { var clientId: String { get } var macOSVersion: String { get } diff --git a/Tests/TuistLoaderTests/Loaders/ManifestLoaderFactoryTests.swift b/Tests/TuistLoaderTests/Loaders/ManifestLoaderFactoryTests.swift index 4365269c831..b154032493b 100644 --- a/Tests/TuistLoaderTests/Loaders/ManifestLoaderFactoryTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ManifestLoaderFactoryTests.swift @@ -1,4 +1,5 @@ import Foundation +import Mockable import Path import TuistSupport import XCTest @@ -7,6 +8,12 @@ import XCTest @testable import TuistSupportTesting final class ManifestLoaderFactoryTests: TuistUnitTestCase { + override func setUp() { + super.setUp() + + system.succeedCommand(["/usr/bin/xcrun", "swift", "-version"], output: "Swift Version 5.2.1") + } + func test_create_default_cached_manifest_loader() { // Given let sut = ManifestLoaderFactory() diff --git a/Tests/TuistLoaderTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasherTests.swift b/Tests/TuistLoaderTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasherTests.swift index 74d1b9015f0..e33f2783ffa 100644 --- a/Tests/TuistLoaderTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasherTests.swift +++ b/Tests/TuistLoaderTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersHasherTests.swift @@ -8,15 +8,24 @@ import XCTest @testable import TuistLoader @testable import TuistSupportTesting -class ProjectDescriptionHelpersHasherTests: TuistUnitTestCase { - var subject: ProjectDescriptionHelpersHasher! +final class ProjectDescriptionHelpersHasherTests: TuistUnitTestCase { + private var subject: ProjectDescriptionHelpersHasher! + private var machineEnvironment: MockMachineEnvironmentRetrieving! override func setUp() { super.setUp() given(swiftVersionProvider) .swiftVersion() .willReturn("5.2") - subject = ProjectDescriptionHelpersHasher(tuistVersion: "3.2.1") + machineEnvironment = .init() + given(machineEnvironment) + .macOSVersion + .willReturn("15.2.4") + subject = ProjectDescriptionHelpersHasher( + tuistVersion: "3.2.1", + machineEnvironment: machineEnvironment, + swiftVersionProvider: swiftVersionProvider + ) } override func tearDown() { @@ -34,7 +43,7 @@ class ProjectDescriptionHelpersHasherTests: TuistUnitTestCase { // Then for _ in 0 ..< 20 { let got = try subject.hash(helpersDirectory: temporaryDir) - XCTAssertEqual(got, "0a46768e766bdd05bdf901098d323b8a") + XCTAssertEqual(got, "5032b92c268cb7283c91ee37ec935c73") } } From 3de0f842f05979c0bae1ba8069d3f4600f0d85a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Fri, 21 Jun 2024 12:12:31 +0200 Subject: [PATCH 375/509] Document how to control the log level in the Tuist on-premise instance (#6425) --- docs/docs/cloud/on-premise.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/cloud/on-premise.md b/docs/docs/cloud/on-premise.md index 2a09ad9799f..c7f5c3c8ef8 100644 --- a/docs/docs/cloud/on-premise.md +++ b/docs/docs/cloud/on-premise.md @@ -73,6 +73,7 @@ As an on-premise user, you'll receive a license key that you'll need to expose a | `TUIST_SECRET_KEY_PASSWORD` | Pepper to generate hashed passwords | No | `$TUIST_SECRET_KEY_BASE` | | | `TUIST_SECRET_KEY_TOKENS` | Secret key to generate random tokens | No | `$TUIST_SECRET_KEY_BASE` | | | `TUIST_USE_IPV6` | When `1` it configures the app to use IPv6 addresses | No | `0` | `1`| +| `TUIST_LOG_LEVEL` | The log level to use for the app | No | `info` | [Log levels](https://hexdocs.pm/logger/1.12.3/Logger.html#module-levels) | ### Authentication environment configuration From 380a2ad978a32287669bf54d38d245b1590b6583 Mon Sep 17 00:00:00 2001 From: Charles Pisciotta Date: Sat, 22 Jun 2024 05:37:54 -0400 Subject: [PATCH 376/509] Bump to xcbeautify 2.4.0 (#6431) As part of this PR, change the package definition to `from`, so it automatically inherits non-breaking updates. --- Package.resolved | 10 +++++----- Package.swift | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Package.resolved b/Package.resolved index d2fdec13e74..272f1efd4ad 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "99adbc11a85398bfb5a122e70f3eae05647f395e69824666334c300d621ee363", + "originHash" : "4080d161ed0c091cdaef55ea652849f51665b8794ae236477b94e919ff68eb09", "pins" : [ { "identity" : "aexml", @@ -159,8 +159,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-argument-parser.git", "state" : { - "revision" : "c8ed701b513cf5177118a175d85fbbbcd707ab41", - "version" : "1.3.0" + "revision" : "0fbc8848e389af3bb55c182bc19ca9d5dc2f255b", + "version" : "1.4.0" } }, { @@ -231,8 +231,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/cpisciotta/xcbeautify", "state" : { - "revision" : "3140aa2d58063dbe30426cce118f8ba8feb37e60", - "version" : "2.0.1" + "revision" : "d9e8acfd22aa3133d95a4b998d31e0f77895c755", + "version" : "2.4.0" } }, { diff --git a/Package.swift b/Package.swift index 4c5ae5424e4..f4669694e6f 100644 --- a/Package.swift +++ b/Package.swift @@ -414,7 +414,7 @@ let package = Package( .package(url: "https://github.com/SwiftGen/StencilSwiftKit", exact: "2.10.1"), .package(url: "https://github.com/SwiftGen/SwiftGen", exact: "6.6.2"), .package(url: "https://github.com/tuist/XcodeProj", exact: "8.19.0"), - .package(url: "https://github.com/cpisciotta/xcbeautify", exact: "2.0.1"), + .package(url: "https://github.com/cpisciotta/xcbeautify", from: "2.4.0"), .package(url: "https://github.com/krzysztofzablocki/Difference.git", from: "1.0.2"), .package(url: "https://github.com/Kolos65/Mockable.git", from: "0.0.2"), .package(url: "https://github.com/tuist/swift-openapi-runtime", branch: "swift-tools-version"), From 7a12bcdfa98386f44312dc7d1fe7db516529e5f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Sat, 22 Jun 2024 15:08:30 +0200 Subject: [PATCH 377/509] Add note about the directory requirement (#6428) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add note about the directory requirement * Update docs/docs/guide/introduction/adopting-tuist/swift-package.md Co-authored-by: Pedro Piñera Buendía <663605+pepicrft@users.noreply.github.com> --------- Co-authored-by: Pedro Piñera Buendía <663605+pepicrft@users.noreply.github.com> --- docs/docs/guide/introduction/adopting-tuist/swift-package.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/docs/guide/introduction/adopting-tuist/swift-package.md b/docs/docs/guide/introduction/adopting-tuist/swift-package.md index 56c616d16c2..5bf543bbce6 100644 --- a/docs/docs/guide/introduction/adopting-tuist/swift-package.md +++ b/docs/docs/guide/introduction/adopting-tuist/swift-package.md @@ -13,6 +13,9 @@ Tuist supports using `Package.swift` as a DSL for your projects–It converts yo > [!WARNING] > The aim of this feature is to provide an easy way for developers to assess the impact of adopting Tuist and [Tuist Cloud](/cloud/what-is-cloud) in their Swift Packages. Therefore, we don't plan to support the full range of Swift Package Manager features nor to bring every Tuist's unique features like [project description helpers](/guide/project/code-sharing) to the packages world. +> [!NOTE] ROOT DIRECTORY +> Tuist commands expect a certain [directory structure](/guide/project/directory-structure.html#standard-tuist-projects) whose root is identified by a `Tuist` or a `.git` directory. + ## Using Tuist with a Swift Package We are going to use Tuist with the [Swift Composable Architecture](https://github.com/pointfreeco/swift-composable-architecture) repository, which contains a Swift Package. The first thing that we need to do is to clone the repository: From bbbb2d782dc3287e147ffebedd929587230f0b0b Mon Sep 17 00:00:00 2001 From: Jaewon-Yun Date: Tue, 25 Jun 2024 15:46:15 +0900 Subject: [PATCH 378/509] Add test targets to project when generating from `Package.swift` file. (#6424) --- .../PackageInfoMapper.swift | 108 +++++--- .../GenerateAcceptanceTests.swift | 1 + .../PackageInfoMapperTests.swift | 245 ++++++++++++++++++ .../SettingsMapperTests.swift | 12 +- fixtures/spm_package/Package.swift | 25 +- .../MyCommonPackage/MyCommonPackage.swift | 7 + .../{MyPackage.swift => MyUIKitPackage.swift} | 0 .../MyUIKitPackageTests.swift | 13 + 8 files changed, 368 insertions(+), 43 deletions(-) create mode 100644 fixtures/spm_package/Sources/MyCommonPackage/MyCommonPackage.swift rename fixtures/spm_package/Sources/MyUIKitPackage/{MyPackage.swift => MyUIKitPackage.swift} (100%) create mode 100644 fixtures/spm_package/Tests/MyUIKitPackageTests/MyUIKitPackageTests.swift diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index be6a8f5a5f4..2ddd2fec4e6 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -338,7 +338,7 @@ public final class PackageInfoMapper: PackageInfoMapping { .compactMap { target -> ProjectDescription.Target? in return try map( target: target, - products: targetToProducts[target.name] ?? Set(), + targetToProducts: targetToProducts, packageInfo: packageInfo, packageType: packageType, path: path, @@ -391,7 +391,7 @@ public final class PackageInfoMapper: PackageInfoMapping { // swiftlint:disable:next function_body_length private func map( target: PackageInfo.Target, - products: Set, + targetToProducts: [String: Set], packageInfo: PackageInfo, packageType: PackageType, path: AbsolutePath, @@ -401,6 +401,8 @@ public final class PackageInfoMapper: PackageInfoMapping { baseSettings: XcodeGraph.Settings, targetSettings: [String: XcodeGraph.SettingsDictionary] ) throws -> ProjectDescription.Target? { + // Ignores or passes a target based on the `type` and the `packageType`. + // After that, it assumes that no target is ignored. switch target.type { case .regular, .system, .macro: break @@ -417,6 +419,8 @@ public final class PackageInfoMapper: PackageInfoMapping { return nil } + let products = targetToProducts[target.name] ?? Set() + guard let product = ProjectDescription.Product.from( name: target.name, type: target.type, @@ -461,40 +465,20 @@ public final class PackageInfoMapper: PackageInfoMapping { switch target.type { case .macro, .executable: destinations = Set([.mac]) + case .test: + var testDestinations = Set(XcodeGraph.Destination.allCases) + let dependencyNames = target.dependencies.map(\.name) + for dependencyName in dependencyNames { + let dependencyProducts = targetToProducts[dependencyName] ?? Set() + let destinations = unionDestinationsOfProducts(dependencyProducts, in: productDestinations) + testDestinations.formIntersection(destinations) + } + destinations = ProjectDescription.Destinations.from(destinations: testDestinations) default: switch packageType { case .local: - let productDestinations: Set = Set( - products.flatMap { product in - if product.type == .executable { - return Set([XcodeGraph.Destination.mac]) - } - return productDestinations[product.name] ?? Set(Destination.allCases) - } - .map { - switch $0 { - case .iPhone: - return .iPhone - case .iPad: - return .iPad - case .mac: - return .mac - case .macWithiPadDesign: - return .macWithiPadDesign - case .macCatalyst: - return .macCatalyst - case .appleWatch: - return .appleWatch - case .appleTv: - return .appleTv - case .appleVision: - return .appleVision - case .appleVisionWithiPadDesign: - return .appleVisionWithiPadDesign - } - } - ) - destinations = Set(Destination.allCases).intersection(productDestinations) + let productDestinations = unionDestinationsOfProducts(products, in: productDestinations) + destinations = ProjectDescription.Destinations.from(destinations: productDestinations) case .external: destinations = Set(Destination.allCases) } @@ -616,6 +600,21 @@ public final class PackageInfoMapper: PackageInfoMapping { settings: settings ) } + + /// Returns a union of products' destinations. + private func unionDestinationsOfProducts( + _ products: Set, + in productToDestinations: [String: XcodeGraph.Destinations] + ) -> XcodeGraph.Destinations { + Set( + products.flatMap { product in + if product.type == .executable { + return Set([XcodeGraph.Destination.mac]) + } + return productToDestinations[product.name] ?? Set(Destination.allCases) + } + ) + } } extension ProjectDescription.DeploymentTargets { @@ -1160,6 +1159,35 @@ extension ProjectDescription.DefaultSettings { } } +extension ProjectDescription.Destinations { + fileprivate static func from(destinations: XcodeGraph.Destinations) -> Self { + Set( + destinations.map { + switch $0 { + case .iPhone: + return .iPhone + case .iPad: + return .iPad + case .mac: + return .mac + case .macWithiPadDesign: + return .macWithiPadDesign + case .macCatalyst: + return .macCatalyst + case .appleWatch: + return .appleWatch + case .appleTv: + return .appleTv + case .appleVision: + return .appleVision + case .appleVisionWithiPadDesign: + return .appleVisionWithiPadDesign + } + } + ) + } +} + extension PackageInfo { fileprivate func projectSettings( swiftToolsVersion: TSCUtility.Version?, @@ -1241,6 +1269,20 @@ extension PackageInfo.Target { } } +extension PackageInfo.Target.Dependency { + /// The literal name of the dependency. + var name: String { + switch self { + case let .target(name: name, _): + return name + case let .product(name: name, _, _, _): + return name + case let .byName(name: name, _): + return name + } + } +} + extension PackageInfoMapper { public enum ResolvedDependency: Equatable { case target(name: String, condition: ProjectDescription.PlatformCondition? = nil) diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index 4faa70ba758..bf6bb770772 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -854,6 +854,7 @@ final class GenerateAcceptanceTestSPMPackage: TuistAcceptanceTestCase { try await run(BuildCommand.self, "MyUIKitPackage", "--platform", "ios") try await run(BuildCommand.self, "MyCLI") try await run(TestCommand.self, "--platform", "ios") + try await run(TestCommand.self, "MyPackage", "--platform", "macos") } } diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 36650c25a56..0c064016cf7 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -3304,6 +3304,251 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ) ) } + + func testMap_whenSwiftPackageHasTestTarget() throws { + // Given + let basePath = try temporaryPath() + let sourcesPath = basePath.appending(components: ["Package", "Sources", "Target"]) + try fileHandler.createFolder(sourcesPath) + let testsPath = basePath.appending(components: ["Package", "Tests", "TargetTests"]) + try fileHandler.createFolder(testsPath) + + // When + let project = try subject.map( + package: "Package", + basePath: basePath, + packageType: .local, + packageInfos: [ + "Package": .init( + name: "Package", + products: [ + .init(name: "Product", type: .library(.automatic), targets: ["Target"]), + ], + targets: [ + .test(name: "Target"), + .test( + name: "TargetTests", + type: .test, + dependencies: [.target(name: "Target", condition: nil)] + ), + ], + platforms: [.ios], + cLanguageStandard: nil, + cxxLanguageStandard: nil, + swiftLanguageVersions: nil + ), + ] + ) + + // Then + XCTAssertBetterEqual( + project, + .test( + name: "Package", + options: .options( + automaticSchemesOptions: .enabled(), + disableSynthesizedResourceAccessors: true + ), + settings: .settings(), + targets: [ + .test("Target", basePath: basePath), + .test( + "TargetTests", + basePath: basePath, + product: .unitTests, + customSources: .custom(.sourceFilesList(globs: [ + "\(testsPath.pathString)/**", + ])), + dependencies: [.target(name: "Target")] + ), + ] + ) + ) + } + + func testMap_whenSwiftPackageHasTestTargetWithExplicitProductDestinations() throws { + // Given + let basePath = try temporaryPath() + let sourcesPath = basePath.appending(components: ["Package", "Sources", "Target"]) + try fileHandler.createFolder(sourcesPath) + let testsPath = basePath.appending(components: ["Package", "Tests", "TargetTests"]) + try fileHandler.createFolder(testsPath) + + // When + let project = try subject.map( + package: "Package", + basePath: basePath, + packageType: .local, + packageInfos: [ + "Package": .init( + name: "Package", + products: [ + .init(name: "Product", type: .library(.automatic), targets: ["Target"]), + ], + targets: [ + .test(name: "Target"), + .test( + name: "TargetTests", + type: .test, + dependencies: [.target(name: "Target", condition: nil)] + ), + ], + platforms: [.ios, .macos], + cLanguageStandard: nil, + cxxLanguageStandard: nil, + swiftLanguageVersions: nil + ), + ], + packageSettings: .test( + productDestinations: ["Product": [.iPhone, .iPad]] + ) + ) + + // Then + XCTAssertBetterEqual( + project, + .test( + name: "Package", + options: .options( + automaticSchemesOptions: .enabled(), + disableSynthesizedResourceAccessors: true + ), + settings: .settings(), + targets: [ + .test( + "Target", + basePath: basePath, + destinations: [.iPhone, .iPad], + deploymentTargets: .iOS("12.0") + ), + .test( + "TargetTests", + basePath: basePath, + destinations: [.iPhone, .iPad], + product: .unitTests, + deploymentTargets: .iOS("12.0"), + customSources: .custom(.sourceFilesList(globs: [ + "\(testsPath.pathString)/**", + ])), + dependencies: [.target(name: "Target")] + ), + ] + ) + ) + } + + func testMap_whenSwiftPackageHasMultiDependencyTestTargetsWithExplicitProductDestinations() throws { + // Given + let basePath = try temporaryPath() + try fileHandler.createFolder(basePath.appending(components: ["Package", "Sources", "Target"])) + try fileHandler.createFolder(basePath.appending(components: ["Package", "Sources", "MacTarget"])) + try fileHandler.createFolder(basePath.appending(components: ["Package", "Sources", "CommonTarget"])) + let productTestsPath = basePath.appending(components: ["Package", "Tests", "ProductTests"]) + try fileHandler.createFolder(productTestsPath) + let macProductTestsPath = basePath.appending(components: ["Package", "Tests", "MacProductTests"]) + try fileHandler.createFolder(macProductTestsPath) + + // When + let project = try subject.map( + package: "Package", + basePath: basePath, + packageType: .local, + packageInfos: [ + "Package": .init( + name: "Package", + products: [ + .init( + name: "Product", + type: .library(.automatic), + targets: ["Target", "CommonTarget"] + ), + .init( + name: "MacProduct", + type: .library(.automatic), + targets: ["MacTarget", "CommonTarget"] + ), + ], + targets: [ + .test(name: "Target"), + .test(name: "MacTarget"), + .test(name: "CommonTarget"), + .test( + name: "ProductTests", + type: .test, + dependencies: [ + .target(name: "Target", condition: nil), + .target(name: "CommonTarget", condition: nil), + ] + ), + .test( + name: "MacProductTests", + type: .test, + dependencies: [ + .target(name: "MacTarget", condition: nil), + .target(name: "CommonTarget", condition: nil), + ] + ), + ], + platforms: [.ios, .macos], + cLanguageStandard: nil, + cxxLanguageStandard: nil, + swiftLanguageVersions: nil + ), + ], + packageSettings: .test( + productDestinations: ["MacProduct": [.mac]] + ) + ) + + // Then + XCTAssertBetterEqual( + project, + .test( + name: "Package", + options: .options( + automaticSchemesOptions: .enabled(), + disableSynthesizedResourceAccessors: true + ), + settings: .settings(), + targets: [ + .test("Target", basePath: basePath), + .test( + "MacTarget", + basePath: basePath, + destinations: [.mac], + deploymentTargets: .macOS("10.13") + ), + .test("CommonTarget", basePath: basePath), + .test( + "ProductTests", + basePath: basePath, + product: .unitTests, + customSources: .custom(.sourceFilesList(globs: [ + "\(productTestsPath.pathString)/**", + ])), + dependencies: [ + .target(name: "Target"), + .target(name: "CommonTarget"), + ] + ), + .test( + "MacProductTests", + basePath: basePath, + destinations: [.mac], + product: .unitTests, + deploymentTargets: .macOS("10.13"), + customSources: .custom(.sourceFilesList(globs: [ + "\(macProductTestsPath.pathString)/**", + ])), + dependencies: [ + .target(name: "MacTarget"), + .target(name: "CommonTarget"), + ] + ), + ] + ) + ) + } } private func defaultSpmResources(_ target: String, customPath: String? = nil) -> ProjectDescription.ResourceFileElements { diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift index 3c14fcd9eff..2a8e48beb2b 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/SettingsMapperTests.swift @@ -327,11 +327,9 @@ extension XcodeGraph.SettingValue { } extension PackageInfo.Platform { - static var ios = PackageInfo.Platform(platformName: "ios", version: "11.0", options: []) - static var macos = PackageInfo.Platform(platformName: "macos", version: "11.0", options: []) - static var watchos = PackageInfo.Platform(platformName: "watchos", version: "11.0", options: []) - static var tvos = PackageInfo.Platform(platformName: "tvos", version: "11.0", options: []) - static var visionos = PackageInfo.Platform(platformName: "visionos", version: "11.0", options: []) - static var linux = PackageInfo.Platform(platformName: "linux", version: "11.0", options: []) - static var windows = PackageInfo.Platform(platformName: "windows", version: "11.0", options: []) + static var ios = PackageInfo.Platform(platformName: "ios", version: "12.0", options: []) + static var macos = PackageInfo.Platform(platformName: "macos", version: "10.13", options: []) + static var watchos = PackageInfo.Platform(platformName: "watchos", version: "4.0", options: []) + static var tvos = PackageInfo.Platform(platformName: "tvos", version: "12.0", options: []) + static var visionos = PackageInfo.Platform(platformName: "visionos", version: "1.0", options: []) } diff --git a/fixtures/spm_package/Package.swift b/fixtures/spm_package/Package.swift index 66cb05f0661..97c34238b4d 100644 --- a/fixtures/spm_package/Package.swift +++ b/fixtures/spm_package/Package.swift @@ -24,11 +24,17 @@ let package = Package( // Products define the executables and libraries a package produces, making them visible to other packages. .library( name: "MyPackage", - targets: ["MyPackage"] + targets: [ + "MyPackage", + "MyCommonPackage", + ] ), .library( name: "MyUIKitPackage", - targets: ["MyUIKitPackage"] + targets: [ + "MyUIKitPackage", + "MyCommonPackage", + ] ), ], dependencies: [ @@ -43,6 +49,9 @@ let package = Package( "MyPackage", ] ), + .target( + name: "MyCommonPackage" + ), .target( name: "MyPackage", dependencies: [ @@ -57,7 +66,17 @@ let package = Package( ), .testTarget( name: "MyPackageTests", - dependencies: ["MyPackage"] + dependencies: [ + "MyPackage", + "MyCommonPackage", + ] + ), + .testTarget( + name: "MyUIKitPackageTests", + dependencies: [ + "MyUIKitPackage", + "MyCommonPackage", + ] ), ] ) diff --git a/fixtures/spm_package/Sources/MyCommonPackage/MyCommonPackage.swift b/fixtures/spm_package/Sources/MyCommonPackage/MyCommonPackage.swift new file mode 100644 index 00000000000..69538f5f9c6 --- /dev/null +++ b/fixtures/spm_package/Sources/MyCommonPackage/MyCommonPackage.swift @@ -0,0 +1,7 @@ +import Foundation + +enum MyCommonPackage { + static func myCommonPackage() { + _ = UUID() + } +} diff --git a/fixtures/spm_package/Sources/MyUIKitPackage/MyPackage.swift b/fixtures/spm_package/Sources/MyUIKitPackage/MyUIKitPackage.swift similarity index 100% rename from fixtures/spm_package/Sources/MyUIKitPackage/MyPackage.swift rename to fixtures/spm_package/Sources/MyUIKitPackage/MyUIKitPackage.swift diff --git a/fixtures/spm_package/Tests/MyUIKitPackageTests/MyUIKitPackageTests.swift b/fixtures/spm_package/Tests/MyUIKitPackageTests/MyUIKitPackageTests.swift new file mode 100644 index 00000000000..0d2bc5bda69 --- /dev/null +++ b/fixtures/spm_package/Tests/MyUIKitPackageTests/MyUIKitPackageTests.swift @@ -0,0 +1,13 @@ +import XCTest +@testable import MyCommonPackage +@testable import MyUIKitPackage + +final class MyUIKitPackageTests: XCTestCase { + func testExample() throws { + // XCTest Documentation + // https://developer.apple.com/documentation/xctest + + // Defining Test Cases and Test Methods + // https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods + } +} From 5a8b78625131f9eaecd0504105b7441ecad115cf Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 25 Jun 2024 12:47:34 +0200 Subject: [PATCH 379/509] Add Izi logo to the README --- README.md | 5 +++++ assets/companies/izi.svg | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 assets/companies/izi.svg diff --git a/README.md b/README.md index 9f5f32f796a..7f373300c00 100644 --- a/README.md +++ b/README.md @@ -290,6 +290,11 @@ The financial sustainability of the project is possible thanks to the ongoing co smlab_logo + + + izi_logo + + diff --git a/assets/companies/izi.svg b/assets/companies/izi.svg new file mode 100644 index 00000000000..7955eeef89a --- /dev/null +++ b/assets/companies/izi.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + From 7aca750f13f18f995cfd0a7928b4eb3230a62d66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 25 Jun 2024 12:51:11 +0200 Subject: [PATCH 380/509] Skip tests for schemes removed by selective testing (#6435) * Skip tests for schemes removed by selective testing * Remove extra space --- .../Utilities/AutomationStorage.swift | 18 + .../Automation/XcodeBuildControlling.swift | 2 + .../Automation/MockXcodeBuildController.swift | 160 ------ .../TuistKit/Generator/GeneratorFactory.swift | 8 +- Sources/TuistKit/Services/TestService.swift | 25 +- .../Services/TestServiceTests.swift | 495 ++++++++++++++++-- 6 files changed, 486 insertions(+), 222 deletions(-) create mode 100644 Sources/TuistAutomation/Utilities/AutomationStorage.swift delete mode 100644 Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift diff --git a/Sources/TuistAutomation/Utilities/AutomationStorage.swift b/Sources/TuistAutomation/Utilities/AutomationStorage.swift new file mode 100644 index 00000000000..2da8b625840 --- /dev/null +++ b/Sources/TuistAutomation/Utilities/AutomationStorage.swift @@ -0,0 +1,18 @@ +import Foundation +import Mockable +import XcodeGraph + +@Mockable +/** + Store for automation-related metadata + */ +public protocol AutomationStoring: AnyObject { + /// Initial graph before automation mappers were applied + var initialGraph: Graph? { get set } +} + +public final class AutomationStorage: AutomationStoring { + public init() {} + + public var initialGraph: Graph? +} diff --git a/Sources/TuistCore/Automation/XcodeBuildControlling.swift b/Sources/TuistCore/Automation/XcodeBuildControlling.swift index 8a8d41ff99e..249b0b3bbca 100644 --- a/Sources/TuistCore/Automation/XcodeBuildControlling.swift +++ b/Sources/TuistCore/Automation/XcodeBuildControlling.swift @@ -1,4 +1,5 @@ import Foundation +import Mockable import Path import TuistSupport @@ -7,6 +8,7 @@ public enum XcodeBuildDestination: Equatable { case mac } +@Mockable public protocol XcodeBuildControlling { /// Returns an observable to build the given project using xcodebuild. /// - Parameters: diff --git a/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift b/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift deleted file mode 100644 index 7b010da409f..00000000000 --- a/Sources/TuistCoreTesting/Automation/MockXcodeBuildController.swift +++ /dev/null @@ -1,160 +0,0 @@ -import Foundation -import Path -import TuistCore -import TuistSupport -@testable import TuistSupportTesting - -final class MockXcodeBuildController: XcodeBuildControlling { - var buildStub: (( - XcodeBuildTarget, - String, - XcodeBuildDestination?, - Bool, - AbsolutePath?, - Bool, - [XcodeBuildArgument], - [String] - ) -> Void)? - - func build( - _ target: XcodeBuildTarget, - scheme: String, - destination: XcodeBuildDestination?, - rosetta: Bool, - derivedDataPath: AbsolutePath?, - clean: Bool, - arguments: [XcodeBuildArgument], - passthroughXcodeBuildArguments: [String] - ) throws { - if let buildStub { - buildStub( - target, - scheme, - destination, - rosetta, - derivedDataPath, - clean, - arguments, - passthroughXcodeBuildArguments - ) - } else { - throw TestError( - "\(String(describing: MockXcodeBuildController.self)) received an unexpected call to build" - ) - } - } - - var testStub: ( - ( - XcodeBuildTarget, - String, - Bool, - XcodeBuildDestination, - Bool, - AbsolutePath?, - AbsolutePath?, - [XcodeBuildArgument], - Int, - [TestIdentifier], - [TestIdentifier], - TestPlanConfiguration?, - [String] - ) - -> Void - )? - var testErrorStub: Error? - func test( - _ target: XcodeBuildTarget, - scheme: String, - clean: Bool, - destination: XcodeBuildDestination, - rosetta: Bool, - derivedDataPath: AbsolutePath?, - resultBundlePath: AbsolutePath?, - arguments: [XcodeBuildArgument], - retryCount: Int, - testTargets: [TestIdentifier], - skipTestTargets: [TestIdentifier], - testPlanConfiguration: TestPlanConfiguration?, - passthroughXcodeBuildArguments: [String] - ) throws { - if let testStub { - testStub( - target, - scheme, - clean, - destination, - rosetta, - derivedDataPath, - resultBundlePath, - arguments, - retryCount, - testTargets, - skipTestTargets, - testPlanConfiguration, - passthroughXcodeBuildArguments - ) - if let testErrorStub { - throw testErrorStub - } - } else { - throw TestError( - "\(String(describing: MockXcodeBuildController.self)) received an unexpected call to test" - ) - } - } - - var archiveStub: ( - (XcodeBuildTarget, String, Bool, AbsolutePath, [XcodeBuildArgument], AbsolutePath?) - -> Void - )? - func archive( - _ target: XcodeBuildTarget, - scheme: String, - clean: Bool, - archivePath: AbsolutePath, - arguments: [XcodeBuildArgument], - derivedDataPath: AbsolutePath? - ) throws { - if let archiveStub { - archiveStub(target, scheme, clean, archivePath, arguments, derivedDataPath) - } else { - throw TestError( - "\(String(describing: MockXcodeBuildController.self)) received an unexpected call to archive" - ) - } - } - - var createXCFrameworkStub: ( - ([String], AbsolutePath) - -> Void - )? - func createXCFramework( - arguments: [String], - output: AbsolutePath - ) throws { - if let createXCFrameworkStub { - createXCFrameworkStub(arguments, output) - } else { - throw TestError( - "\(String(describing: MockXcodeBuildController.self)) received an unexpected call to createXCFramework" - ) - } - } - - var showBuildSettingsStub: ((XcodeBuildTarget, String, String, AbsolutePath?) -> [String: XcodeBuildSettings])? - func showBuildSettings( - _ target: XcodeBuildTarget, - scheme: String, - configuration: String, - derivedDataPath: AbsolutePath? - ) throws -> [String: XcodeBuildSettings] { - if let showBuildSettingsStub { - return showBuildSettingsStub(target, scheme, configuration, derivedDataPath) - } else { - throw TestError( - "\(String(describing: MockXcodeBuildController.self)) received an unexpected call to showBuildSettings" - ) - } - } -} diff --git a/Sources/TuistKit/Generator/GeneratorFactory.swift b/Sources/TuistKit/Generator/GeneratorFactory.swift index db3db09a7d5..31cce4e9ba7 100644 --- a/Sources/TuistKit/Generator/GeneratorFactory.swift +++ b/Sources/TuistKit/Generator/GeneratorFactory.swift @@ -1,6 +1,7 @@ import Foundation import Mockable import Path +import TuistAutomation import TuistCore import TuistGenerator import TuistLoader @@ -19,6 +20,7 @@ public protocol GeneratorFactorying { /// - Parameter ignoreBinaryCache: True to not include binaries from the cache. /// - Parameter ignoreSelectiveTesting: True to run all tests /// - Parameter cacheStorage: The cache storage instance. + /// - Parameter automationStorage: The storage for automation. /// - Returns: A Generator instance. func testing( config: Config, @@ -30,7 +32,8 @@ public protocol GeneratorFactorying { configuration: String?, ignoreBinaryCache: Bool, ignoreSelectiveTesting: Bool, - cacheStorage: CacheStoring + cacheStorage: CacheStoring, + automationStorage: AutomationStoring ) -> Generating /// Returns the generator for focused projects. @@ -84,7 +87,8 @@ public class GeneratorFactory: GeneratorFactorying { configuration _: String?, ignoreBinaryCache _: Bool, ignoreSelectiveTesting _: Bool, - cacheStorage _: CacheStoring + cacheStorage _: CacheStoring, + automationStorage _: AutomationStoring ) -> Generating { let contentHasher = ContentHasher() let projectMapperFactory = ProjectMapperFactory(contentHasher: contentHasher) diff --git a/Sources/TuistKit/Services/TestService.swift b/Sources/TuistKit/Services/TestService.swift index fcaaf0eba53..0097944890a 100644 --- a/Sources/TuistKit/Services/TestService.swift +++ b/Sources/TuistKit/Services/TestService.swift @@ -65,6 +65,7 @@ final class TestService { // swiftlint:disable:this type_body_length private let buildGraphInspector: BuildGraphInspecting private let simulatorController: SimulatorControlling private let contentHasher: ContentHashing + private let automationStorage: AutomationStoring private let cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring private let configLoader: ConfigLoading @@ -79,7 +80,8 @@ final class TestService { // swiftlint:disable:this type_body_length self.init( generatorFactory: generatorFactory, cacheStorageFactory: cacheStorageFactory, - configLoader: configLoader + configLoader: configLoader, + automationStorage: AutomationStorage() ) } @@ -91,7 +93,8 @@ final class TestService { // swiftlint:disable:this type_body_length simulatorController: SimulatorControlling = SimulatorController(), contentHasher: ContentHashing = ContentHasher(), cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring = CacheDirectoriesProviderFactory(), - configLoader: ConfigLoading + configLoader: ConfigLoading, + automationStorage: AutomationStoring ) { self.generatorFactory = generatorFactory self.cacheStorageFactory = cacheStorageFactory @@ -101,6 +104,7 @@ final class TestService { // swiftlint:disable:this type_body_length self.contentHasher = contentHasher self.cacheDirectoryProviderFactory = cacheDirectoryProviderFactory self.configLoader = configLoader + self.automationStorage = automationStorage } static func validateParameters( @@ -199,7 +203,8 @@ final class TestService { // swiftlint:disable:this type_body_length configuration: configuration, ignoreBinaryCache: ignoreBinaryCache, ignoreSelectiveTesting: ignoreSelectiveTesting, - cacheStorage: cacheStorage + cacheStorage: cacheStorage, + automationStorage: automationStorage ) logger.notice("Generating project for testing", metadata: .section) @@ -247,10 +252,16 @@ final class TestService { // swiftlint:disable:this type_body_length if let schemeName { guard let scheme = graphTraverser.schemes().first(where: { $0.name == schemeName }) else { - throw TestServiceError.schemeNotFound( - scheme: schemeName, - existing: testableSchemes.map(\.name) - ) + let schemes = automationStorage.initialGraph.map(GraphTraverser.init)?.schemes() ?? graphTraverser.schemes() + if schemes.first(where: { $0.name == schemeName }) != nil { + logger.log(level: .info, "The scheme \(schemeName)'s test action has no tests to run, finishing early.") + return + } else { + throw TestServiceError.schemeNotFound( + scheme: schemeName, + existing: Set(schemes.map(\.name)).map { $0 } + ) + } } switch (testPlanConfiguration?.testPlan, scheme.testAction?.targets.isEmpty, scheme.testAction?.testPlans?.isEmpty) { diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index 9f8ef42e0a4..82d72f19e02 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -17,13 +17,14 @@ final class TestServiceTests: TuistUnitTestCase { private var subject: TestService! private var generator: MockGenerating! private var generatorFactory: MockGeneratorFactorying! - private var xcodebuildController: MockXcodeBuildController! + private var xcodebuildController: MockXcodeBuildControlling! private var buildGraphInspector: MockBuildGraphInspecting! private var simulatorController: MockSimulatorController! private var contentHasher: MockContentHasher! private var testsCacheTemporaryDirectory: TemporaryDirectory! private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! private var configLoader: MockConfigLoading! + private var automationStorage: MockAutomationStoring! override func setUpWithError() throws { try super.setUpWithError() @@ -47,6 +48,7 @@ final class TestServiceTests: TuistUnitTestCase { .willReturn(runsCacheDirectory) configLoader = .init() + automationStorage = .init() contentHasher.hashStub = { _ in "hash" @@ -63,7 +65,8 @@ final class TestServiceTests: TuistUnitTestCase { simulatorController: simulatorController, contentHasher: contentHasher, cacheDirectoryProviderFactory: cacheDirectoryProviderFactory, - configLoader: configLoader + configLoader: configLoader, + automationStorage: automationStorage ) } @@ -75,6 +78,7 @@ final class TestServiceTests: TuistUnitTestCase { testsCacheTemporaryDirectory = nil generatorFactory = nil contentHasher = nil + automationStorage = nil subject = nil super.tearDown() } @@ -237,20 +241,30 @@ final class TestServiceTests: TuistUnitTestCase { .willProduce { path in (path, .test(workspace: .test(schemes: [.test(name: "TestScheme")]))) } - var testedRosetta: Bool? - xcodebuildController.testStub = { _, _, _, _, rosetta, _, _, _, _, _, _, _, _ in - testedRosetta = rosetta - } + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .value(true), + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willReturn(()) - // When + // When / Then try await subject.testRun( schemeName: "TestScheme", path: try temporaryPath(), rosetta: true ) - - // Then - XCTAssertEqual(testedRosetta, true) } func test_run_tests_for_only_specified_scheme() async throws { @@ -285,9 +299,25 @@ final class TestServiceTests: TuistUnitTestCase { (path, .test(workspace: .test(schemes: [.test(name: "TestScheme")]))) } var testedSchemes: [String] = [] - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in - testedSchemes.append(scheme) - } + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in + testedSchemes.append(scheme) + } // When try await subject.testRun( @@ -329,9 +359,25 @@ final class TestServiceTests: TuistUnitTestCase { (path, .test()) } var testedSchemes: [String] = [] - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in - testedSchemes.append(scheme) - } + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in + testedSchemes.append(scheme) + } try fileHandler.touch( testsCacheTemporaryDirectory.path.appending(component: "A") ) @@ -384,9 +430,25 @@ final class TestServiceTests: TuistUnitTestCase { (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOne"), .test(name: "ProjectSchemeTwo")]))) } var testedSchemes: [String] = [] - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in - testedSchemes.append(scheme) - } + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in + testedSchemes.append(scheme) + } try fileHandler.touch( testsCacheTemporaryDirectory.path.appending(component: "A") ) @@ -425,9 +487,25 @@ final class TestServiceTests: TuistUnitTestCase { (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOne", testAction: .test(targets: []))]))) } var testedSchemes: [String] = [] - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in - testedSchemes.append(scheme) - } + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in + testedSchemes.append(scheme) + } try fileHandler.touch( testsCacheTemporaryDirectory.path.appending(component: "A") ) @@ -446,6 +524,153 @@ final class TestServiceTests: TuistUnitTestCase { XCTAssertEmpty(testedSchemes) } + func test_throws_when_scheme_does_not_exist_and_initial_graph_is_nil() async throws { + // Given + givenGenerator() + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn([]) + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn([]) + given(automationStorage) + .initialGraph + .willReturn(nil) + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + ( + path, + .test( + projects: [ + try self.temporaryPath(): .test(schemes: [.test(name: "ProjectSchemeTwo")]), + ] + ) + ) + } + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.testRun( + schemeName: "ProjectSchemeOne", + path: try temporaryPath() + ), + TestServiceError.schemeNotFound( + scheme: "ProjectSchemeOne", + existing: ["ProjectSchemeTwo"] + ) + ) + } + + func test_throws_scheme_does_not_exist_in_initial_graph() async throws { + // Given + givenGenerator() + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn([]) + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn([]) + given(automationStorage) + .initialGraph + .willReturn( + .test( + workspace: .test( + schemes: [.test(name: "ProjectSchemeTwo", testAction: .test(targets: []))] + ), + projects: [ + try temporaryPath(): .test(schemes: [.test(name: "ProjectSchemeTwo")]), + ] + ) + ) + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + ( + path, + .test() + ) + } + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.testRun( + schemeName: "ProjectSchemeOne", + path: try temporaryPath() + ), + TestServiceError.schemeNotFound( + scheme: "ProjectSchemeOne", + existing: ["ProjectSchemeTwo"] + ) + ) + } + + func test_skips_running_tests_when_scheme_is_in_initial_graph_only() async throws { + // Given + givenGenerator() + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn([]) + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn([]) + var testedSchemes: [String] = [] + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in + testedSchemes.append(scheme) + } + given(automationStorage) + .initialGraph + .willReturn( + .test( + projects: [ + try temporaryPath(): .test(schemes: [.test(name: "ProjectSchemeOne")]), + ] + ) + ) + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + ( + path, + .test() + ) + } + + // When + try await subject.testRun( + schemeName: "ProjectSchemeOne", + path: try temporaryPath() + ) + + // Then + XCTAssertEmpty(testedSchemes) + } + func test_run_tests_with_skipped_targets() async throws { // Given given(generatorFactory) @@ -459,7 +684,8 @@ final class TestServiceTests: TuistUnitTestCase { configuration: .any, ignoreBinaryCache: .any, ignoreSelectiveTesting: .any, - cacheStorage: .any + cacheStorage: .any, + automationStorage: .any ) .willReturn(generator) given(configLoader) @@ -484,9 +710,25 @@ final class TestServiceTests: TuistUnitTestCase { .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) .willReturn(.test()) var testedSchemes: [String] = [] - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in - testedSchemes.append(scheme) - } + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in + testedSchemes.append(scheme) + } // When try await subject.testRun( @@ -524,10 +766,26 @@ final class TestServiceTests: TuistUnitTestCase { .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) .willReturn(.test()) var testedSchemes: [String] = [] - xcodebuildController.testErrorStub = NSError.test() - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in - testedSchemes.append(scheme) - } + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in + testedSchemes.append(scheme) + throw NSError.test() + } try fileHandler.touch( testsCacheTemporaryDirectory.path.appending(component: "A") ) @@ -571,9 +829,25 @@ final class TestServiceTests: TuistUnitTestCase { (path, .test()) } var testedSchemes: [String] = [] - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in - testedSchemes.append(scheme) - } + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in + testedSchemes.append(scheme) + } // When try await subject.testRun( @@ -594,9 +868,25 @@ final class TestServiceTests: TuistUnitTestCase { let expectedResourceBundlePath = try AbsolutePath(validating: "/test") var resourceBundlePath: AbsolutePath? - xcodebuildController.testStub = { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in - resourceBundlePath = gotResourceBundlePath - } + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in + resourceBundlePath = gotResourceBundlePath + } given(generator) .generateWithGraph(path: .any) .willProduce { path in @@ -637,9 +927,25 @@ final class TestServiceTests: TuistUnitTestCase { .tuistCacheDirectory(for: .runs) .appending(components: "run-id", Constants.resultBundleName) - xcodebuildController.testStub = { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in - resultBundlePath = gotResourceBundlePath - } + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in + resultBundlePath = gotResourceBundlePath + } given(generator) .generateWithGraph(path: .any) .willProduce { path in @@ -692,9 +998,26 @@ final class TestServiceTests: TuistUnitTestCase { let expectedResourceBundlePath = try AbsolutePath(validating: "/test") var resourceBundlePath: AbsolutePath? - xcodebuildController.testStub = { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in - resourceBundlePath = gotResourceBundlePath - } + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, _, _, _, _, _, gotResourceBundlePath, _, _, _, _, _, _ in + resourceBundlePath = gotResourceBundlePath + } + given(generator) .generateWithGraph(path: .any) .willProduce { path in @@ -759,9 +1082,25 @@ final class TestServiceTests: TuistUnitTestCase { .willReturn(.test()) var passedRetryCount = 0 - xcodebuildController.testStub = { _, _, _, _, _, _, _, _, retryCount, _, _, _, _ in - passedRetryCount = retryCount - } + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, _, _, _, _, _, _, _, retryCount, _, _, _, _ in + passedRetryCount = retryCount + } // When try await subject.testRun( @@ -804,9 +1143,25 @@ final class TestServiceTests: TuistUnitTestCase { .willReturn(.test()) var passedRetryCount = -1 - xcodebuildController.testStub = { _, _, _, _, _, _, _, _, retryCount, _, _, _, _ in - passedRetryCount = retryCount - } + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, _, _, _, _, _, _, _, retryCount, _, _, _, _ in + passedRetryCount = retryCount + } // When try await subject.testRun( @@ -875,9 +1230,25 @@ final class TestServiceTests: TuistUnitTestCase { ) } var testedSchemes: [String] = [] - xcodebuildController.testStub = { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in - testedSchemes.append(scheme) - } + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in + testedSchemes.append(scheme) + } // When try await subject.testRun( @@ -926,7 +1297,24 @@ final class TestServiceTests: TuistUnitTestCase { .willProduce { path in (path, .test(workspace: .test(schemes: [.test(name: "TestScheme")]))) } - xcodebuildController.testStub = { _, _, _, _, _, _, _, _, _, _, _, _, _ in } + var testedSchemes: [String] = [] + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willReturn(()) let notDefinedTestPlan = "NotDefined" do { @@ -957,7 +1345,8 @@ final class TestServiceTests: TuistUnitTestCase { configuration: .any, ignoreBinaryCache: .any, ignoreSelectiveTesting: .any, - cacheStorage: .any + cacheStorage: .any, + automationStorage: .any ) .willReturn(generator) } From 8317f0ec8abe182134597511a439dda496e5b367 Mon Sep 17 00:00:00 2001 From: fortmarek Date: Tue, 25 Jun 2024 13:17:23 +0200 Subject: [PATCH 381/509] Update release date --- .../Client/CloudClientCLIMetadataHeadersMiddleware.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift b/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift index c095b898364..4e1726e35ae 100644 --- a/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift +++ b/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift @@ -5,7 +5,7 @@ import TuistSupport /// This middleware includes the release date of the CLI in the headers so that we can show /// warnings if the on-premise installation is too old. struct CloudClientCLIMetadataHeadersMiddleware: ClientMiddleware { - let releaseDate = "2024.06.18" + let releaseDate = "2024.06.25" func intercept( _ request: Request, From ff80a8f8d8b9d344d02abc30a5d88ddb2cbfd785 Mon Sep 17 00:00:00 2001 From: Tuist Date: Tue, 25 Jun 2024 11:48:06 +0000 Subject: [PATCH 382/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.19.0 --- .mise.toml | 2 +- CHANGELOG.md | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 0bffaea576a..3b88fb90d7d 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.18.0" +tuist = "4.19.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index 7307489aad5..d95da4fd919 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## 4.19.0 - 2024-06-25 + +### Tuist + +#### Changed + +- Surface current organization usage in cloud organization show [#6421](https://github.com/tuist/tuist/pull/6421) by [@fortmarek](https://github.com/fortmarek) + +#### Added + +- Add test targets to project when generating from `Package.swift` file. [#6424](https://github.com/tuist/tuist/pull/6424) by [@woin2ee](https://github.com/woin2ee) + +#### Fixed + +- Fix tuist clean when no category is provided [#6422](https://github.com/tuist/tuist/pull/6422) by [@fortmarek](https://github.com/fortmarek) +- Fix caching ProjectDescriptionHelpers across macOS versions [#6429](https://github.com/tuist/tuist/pull/6429) by [@fortmarek](https://github.com/fortmarek) +- Skip tests for schemes removed by selective testing [#6435](https://github.com/tuist/tuist/pull/6435) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +- no changes + ## 4.18.0 - 2024-06-18 ### Tuist From 9254c063a457202254889e136caf54e3c2944b48 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 17:38:14 +0200 Subject: [PATCH 383/509] add darrarski as a contributor for code (#6441) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 5d2218204ba..646ba35fc78 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1428,6 +1428,15 @@ "contributions": [ "code" ] + }, + { + "login": "darrarski", + "name": "Dariusz Rybicki", + "avatar_url": "https://avatars.githubusercontent.com/u/1384684?v=4", + "profile": "http://darrarski.pl", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 7f373300c00..3fd3538a710 100644 --- a/README.md +++ b/README.md @@ -565,6 +565,7 @@ Thanks goes to these wonderful people:
    Andy Kolean

    Binlogo

    Dmitry Serov
    +
    Dariusz Rybicki
    From 2263acd62339905c1305c83c07d7b8bd21a778da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 25 Jun 2024 19:15:28 +0200 Subject: [PATCH 384/509] Print only JSON string for dump and when --json flag is present (#6440) * Print only JSON for dump and when --json flag is present * Do not use WarningController directly for cloud client warnings * Do not hardcode dump command name * Remove MachineReadableCommand * Skip formatting of _commandName property * Fix typo --- Sources/TuistKit/Commands/DumpCommand.swift | 8 ++- .../Cloud/CloudOrganizationListService.swift | 2 +- .../Cloud/CloudOrganizationShowService.swift | 2 +- .../Cloud/CloudProjectListService.swift | 2 +- Sources/TuistKit/Services/DumpService.swift | 2 +- Sources/TuistKit/Services/ListService.swift | 11 ++-- .../CloudClientOutputWarningsMiddleware.swift | 2 +- .../TuistSupport/Logging/JSONLogHandler.swift | 61 +++++++++++++++++++ .../Logging/Logger.Metadata+Tuist.swift | 5 ++ Sources/TuistSupport/Logging/Logger.swift | 14 +++++ Sources/tuist/TuistApp.swift | 10 ++- ...dClientOutputWarningsMiddlewareTests.swift | 6 +- 12 files changed, 108 insertions(+), 17 deletions(-) create mode 100644 Sources/TuistSupport/Logging/JSONLogHandler.swift diff --git a/Sources/TuistKit/Commands/DumpCommand.swift b/Sources/TuistKit/Commands/DumpCommand.swift index 078762d8144..cee25521cf4 100644 --- a/Sources/TuistKit/Commands/DumpCommand.swift +++ b/Sources/TuistKit/Commands/DumpCommand.swift @@ -4,8 +4,10 @@ import Path import TuistLoader import TuistSupport -struct DumpCommand: AsyncParsableCommand { - static var configuration: CommandConfiguration { +public struct DumpCommand: AsyncParsableCommand { + public init() {} + + public static var configuration: CommandConfiguration { CommandConfiguration( commandName: "dump", abstract: "Outputs the manifest as a JSON" @@ -25,7 +27,7 @@ struct DumpCommand: AsyncParsableCommand { @Argument(help: "The manifest to be dumped", envKey: .dumpManifest) var manifest: DumpableManifest = .project - func run() async throws { + public func run() async throws { try await DumpService().run(path: path, manifest: manifest) } } diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift index 8dba691b90c..f59364b8046 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift @@ -45,7 +45,7 @@ final class CloudOrganizationListService: CloudOrganizationListServicing { if json { let json = organizations.toJSON() - logger.info(.init(stringLiteral: json.toString(prettyPrint: true))) + logger.info(.init(stringLiteral: json.toString(prettyPrint: true)), metadata: .json) return } diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift b/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift index f540bd53d50..6f3b4fe8a6e 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift @@ -56,7 +56,7 @@ final class CloudOrganizationShowService: CloudOrganizationShowServicing { if json { let json = try organization.toJSON() - logger.info(.init(stringLiteral: json.toString(prettyPrint: true))) + logger.info(.init(stringLiteral: json.toString(prettyPrint: true)), metadata: .json) return } diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectListService.swift b/Sources/TuistKit/Services/Cloud/CloudProjectListService.swift index 182f2eaa1dd..5e8288f7ba1 100644 --- a/Sources/TuistKit/Services/Cloud/CloudProjectListService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudProjectListService.swift @@ -45,7 +45,7 @@ final class CloudProjectListService: CloudProjectListServicing { if json { let json = try projects.toJSON() - logger.info(.init(stringLiteral: json.toString(prettyPrint: true))) + logger.info(.init(stringLiteral: json.toString(prettyPrint: true)), metadata: .json) return } diff --git a/Sources/TuistKit/Services/DumpService.swift b/Sources/TuistKit/Services/DumpService.swift index 3c070c4bc90..90a40373ab4 100644 --- a/Sources/TuistKit/Services/DumpService.swift +++ b/Sources/TuistKit/Services/DumpService.swift @@ -45,7 +45,7 @@ final class DumpService { } let json: JSON = try encoded.toJSON() - logger.notice("\(json.toString(prettyPrint: true))") + logger.notice("\(json.toString(prettyPrint: true))", metadata: .json) } } diff --git a/Sources/TuistKit/Services/ListService.swift b/Sources/TuistKit/Services/ListService.swift index 9e8d2a3add8..434ff2a645f 100644 --- a/Sources/TuistKit/Services/ListService.swift +++ b/Sources/TuistKit/Services/ListService.swift @@ -42,8 +42,7 @@ class ListService { return PrintableTemplate(name: path.basename, description: template.description) } - let output = try string(for: templates, in: format) - logger.notice("\(output)") + try output(for: templates, in: format) } // MARK: - Helpers @@ -56,21 +55,21 @@ class ListService { } } - private func string( + private func output( for templates: [PrintableTemplate], in format: ListService.OutputFormat - ) throws -> String { + ) throws { switch format { case .table: let textTable = TextTable { [ TextTable.Column(title: "Name", value: $0.name), TextTable.Column(title: "Description", value: $0.description), ] } - return textTable.render(templates) + logger.notice("\(textTable.render(templates))") case .json: let json = try templates.toJSON() - return json.toString(prettyPrint: true) + logger.notice("\(json.toString(prettyPrint: true))", metadata: .json) } } diff --git a/Sources/TuistServer/Client/CloudClientOutputWarningsMiddleware.swift b/Sources/TuistServer/Client/CloudClientOutputWarningsMiddleware.swift index c0b623ec8a2..b721cb61596 100644 --- a/Sources/TuistServer/Client/CloudClientOutputWarningsMiddleware.swift +++ b/Sources/TuistServer/Client/CloudClientOutputWarningsMiddleware.swift @@ -55,7 +55,7 @@ struct CloudClientOutputWarningsMiddleware: ClientMiddleware { throw CloudClientOutputWarningsMiddlewareError.invalidSchema } - json.forEach { warningController.append(warning: $0) } + json.forEach { logger.warning("\($0)") } return response } diff --git a/Sources/TuistSupport/Logging/JSONLogHandler.swift b/Sources/TuistSupport/Logging/JSONLogHandler.swift new file mode 100644 index 00000000000..a0e110eb8ec --- /dev/null +++ b/Sources/TuistSupport/Logging/JSONLogHandler.swift @@ -0,0 +1,61 @@ +import Foundation +import Logging + +public struct JSONLogHandler: LogHandler { + public var logLevel: Logger.Level + + public let label: String + + public init(label: String) { + self.init(label: label, logLevel: .info) + } + + public init(label: String, logLevel: Logger.Level) { + self.label = label + self.logLevel = logLevel + } + + public func log( + level: Logger.Level, + message: Logger.Message, + metadata: Logger.Metadata?, + file _: String, function _: String, line _: UInt + ) { + let string: String + + switch metadata?[Logger.Metadata.tuist] { + case Logger.Metadata.jsonKey?: + string = message.description + default: + switch level { + case .critical: + if Environment.shared.shouldOutputBeColoured { + string = message.description.bold() + } else { + string = message.description + } + case .error: + if Environment.shared.shouldOutputBeColoured { + string = message.description.red() + } else { + string = message.description + } + default: + return + } + } + + output(for: level).print(string) + } + + func output(for level: Logger.Level) -> FileHandle { + level < .error ? .standardOutput : .standardError + } + + public var metadata = Logger.Metadata() + + public subscript(metadataKey key: String) -> Logger.Metadata.Value? { + get { metadata[key] } + set { metadata[key] = newValue } + } +} diff --git a/Sources/TuistSupport/Logging/Logger.Metadata+Tuist.swift b/Sources/TuistSupport/Logging/Logger.Metadata+Tuist.swift index fe9782faa1a..ba2d4447459 100644 --- a/Sources/TuistSupport/Logging/Logger.Metadata+Tuist.swift +++ b/Sources/TuistSupport/Logging/Logger.Metadata+Tuist.swift @@ -20,4 +20,9 @@ extension Logger.Metadata { public static var pretty: Logger.Metadata { [tuist: .string(prettyKey)] } + + public static let jsonKey: String = "json" + public static var json: Logger.Metadata { + [tuist: .string(jsonKey)] + } } diff --git a/Sources/TuistSupport/Logging/Logger.swift b/Sources/TuistSupport/Logging/Logger.swift index 538237f7b88..0e658a7405d 100644 --- a/Sources/TuistSupport/Logging/Logger.swift +++ b/Sources/TuistSupport/Logging/Logger.swift @@ -4,10 +4,16 @@ import class Foundation.ProcessInfo let logger = Logger(label: "io.tuist.support") public struct LoggingConfig { + public init(loggerType: LoggerType, verbose: Bool) { + self.loggerType = loggerType + self.verbose = verbose + } + public enum LoggerType { case console case detailed case osLog + case json } public var loggerType: LoggerType @@ -45,6 +51,8 @@ public enum LogOutput { handler = DetailedLogHandler.self case .console: handler = StandardLogHandler.self + case .json: + handler = JSONLogHandler.self } if config.verbose { @@ -78,3 +86,9 @@ extension OSLogHandler: VerboseLogHandler { OSLogHandler(label: label, logLevel: .debug) } } + +extension JSONLogHandler: VerboseLogHandler { + public static func verbose(label: String) -> LogHandler { + JSONLogHandler(label: label, logLevel: .debug) + } +} diff --git a/Sources/tuist/TuistApp.swift b/Sources/tuist/TuistApp.swift index d001200ec6a..1197feadfde 100644 --- a/Sources/tuist/TuistApp.swift +++ b/Sources/tuist/TuistApp.swift @@ -13,7 +13,15 @@ private enum TuistServer { try? ProcessEnv.setVar(Constants.EnvironmentVariables.verbose, value: "true") } - TuistSupport.LogOutput.bootstrap() + let machineReadableCommands = [DumpCommand.self] + // swiftformat:disable all + let isCommandMachineReadable = CommandLine.arguments.count > 1 && machineReadableCommands.map { $0._commandName }.contains(CommandLine.arguments[1]) + // swiftformat:enable all + if isCommandMachineReadable || CommandLine.arguments.contains("--json") { + TuistSupport.LogOutput.bootstrap(config: LoggingConfig(loggerType: .json, verbose: false)) + } else { + TuistSupport.LogOutput.bootstrap() + } try TuistSupport.Environment.shared.bootstrap() diff --git a/Tests/TuistServerTests/Client/CloudClientOutputWarningsMiddlewareTests.swift b/Tests/TuistServerTests/Client/CloudClientOutputWarningsMiddlewareTests.swift index a65fd9b85b3..2b807f8997c 100644 --- a/Tests/TuistServerTests/Client/CloudClientOutputWarningsMiddlewareTests.swift +++ b/Tests/TuistServerTests/Client/CloudClientOutputWarningsMiddlewareTests.swift @@ -50,7 +50,9 @@ final class CloudClientOutputWarningsMiddlewareTests: TuistUnitTestCase { // Then XCTAssertEqual(gotResponse, response) - XCTAssertEqual(warningController.warnings, warnings) + for warning in warnings { + XCTAssertStandardOutput(pattern: warning) + } } func test_doesntOutputAnyWarning_whenTheHeaderIsAbsent() async throws { @@ -66,6 +68,6 @@ final class CloudClientOutputWarningsMiddlewareTests: TuistUnitTestCase { // Then XCTAssertEqual(gotResponse, response) - XCTAssertEqual(warningController.warnings, []) + XCTAssertEqual(TestingLogHandler.collected[.warning, <=], "") } } From 855353e7c626d960d7a0afcc940c9c1ed7932083 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 27 Jun 2024 20:01:40 +0200 Subject: [PATCH 385/509] Handle unauthorized server errors (#6451) --- Sources/TuistServer/OpenAPI/Client.swift | 352 ++++++++ Sources/TuistServer/OpenAPI/Types.swift | 833 +++++++++++++++++- Sources/TuistServer/OpenAPI/cloud.yml | 150 ++++ .../Services/CacheExistsService.swift | 10 +- .../CancelOrganizationInviteService.swift | 10 +- .../Services/CleanCacheService.swift | 10 +- .../CompleteAnalyticsArtifactsUploads.swift | 10 +- .../Services/CreateCommandEventService.swift | 10 +- .../CreateOrganizationInviteService.swift | 10 +- .../Services/CreateProjectService.swift | 10 +- .../Services/DeleteOrganizationService.swift | 10 +- .../Services/DeleteProjectService.swift | 10 +- .../Services/GetCacheService.swift | 10 +- .../Services/GetOrganizationService.swift | 10 +- .../Services/GetOrganizationUsage.swift | 10 +- .../Services/GetProjectService.swift | 10 +- .../Services/ListOrganizationsService.swift | 10 +- .../Services/ListProjectsService.swift | 10 + ...tipartUploadCompleteAnalyticsService.swift | 10 +- .../MultipartUploadCompleteCacheService.swift | 10 +- ...artUploadGenerateURLAnalyticsService.swift | 10 +- ...ltipartUploadGenerateURLCacheService.swift | 10 +- ...MultipartUploadStartAnalyticsService.swift | 10 +- .../MultipartUploadStartCacheService.swift | 10 +- .../RemoveOrganizationMemberService.swift | 10 +- .../UpdateOrganizationMemberService.swift | 10 +- .../Services/UpdateOrganizationService.swift | 10 +- .../Services/TestServiceTests.swift | 1 - 28 files changed, 1517 insertions(+), 59 deletions(-) diff --git a/Sources/TuistServer/OpenAPI/Client.swift b/Sources/TuistServer/OpenAPI/Client.swift index c844c35d5cf..0b7001db816 100644 --- a/Sources/TuistServer/OpenAPI/Client.swift +++ b/Sources/TuistServer/OpenAPI/Client.swift @@ -87,6 +87,19 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .ok(.init(headers: headers, body: body)) + case 401: + let headers: Operations.createCommandEvent.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createCommandEvent.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.createCommandEvent.Output.Forbidden.Headers = .init() try converter.validateContentTypeIfPresent( @@ -235,6 +248,20 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .ok(.init(headers: headers, body: body)) + case 401: + let headers: Operations.downloadCacheArtifact.Output.Unauthorized.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.downloadCacheArtifact.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 402: let headers: Operations.downloadCacheArtifact.Output.PaymentRequired.Headers = .init() @@ -341,6 +368,20 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .ok(.init(headers: headers, body: body)) + case 401: + let headers: Operations.cacheArtifactExists.Output.Unauthorized.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.cacheArtifactExists.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 402: let headers: Operations.cacheArtifactExists.Output.PaymentRequired.Headers = .init() @@ -467,6 +508,22 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .ok(.init(headers: headers, body: body)) + case 401: + let headers: + Operations.completeCacheArtifactMultipartUpload.Output.Unauthorized.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.completeCacheArtifactMultipartUpload.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 402: let headers: Operations.completeCacheArtifactMultipartUpload.Output.PaymentRequired @@ -592,6 +649,22 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .ok(.init(headers: headers, body: body)) + case 401: + let headers: + Operations.generateCacheArtifactMultipartUploadURL.Output.Unauthorized + .Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.generateCacheArtifactMultipartUploadURL.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 402: let headers: Operations.generateCacheArtifactMultipartUploadURL.Output.PaymentRequired @@ -707,6 +780,22 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .ok(.init(headers: headers, body: body)) + case 401: + let headers: + Operations.startCacheArtifactMultipartUpload.Output.Unauthorized.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.startCacheArtifactMultipartUpload.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 402: let headers: Operations.startCacheArtifactMultipartUpload.Output.PaymentRequired.Headers = @@ -799,6 +888,19 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .ok(.init(headers: headers, body: body)) + case 401: + let headers: Operations.listOrganizations.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.listOrganizations.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.listOrganizations.Output.Forbidden.Headers = .init() try converter.validateContentTypeIfPresent( @@ -930,6 +1032,19 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .ok(.init(headers: headers, body: body)) + case 401: + let headers: Operations.showOrganization.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.showOrganization.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.showOrganization.Output.Forbidden.Headers = .init() try converter.validateContentTypeIfPresent( @@ -1029,6 +1144,20 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .badRequest(.init(headers: headers, body: body)) + case 401: + let headers: Operations.updateOrganization__2_.Output.Unauthorized.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganization__2_.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.updateOrganization__2_.Output.Forbidden.Headers = .init() @@ -1128,6 +1257,19 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .badRequest(.init(headers: headers, body: body)) + case 401: + let headers: Operations.updateOrganization.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganization.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.updateOrganization.Output.Forbidden.Headers = .init() try converter.validateContentTypeIfPresent( @@ -1200,6 +1342,19 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .noContent(.init(headers: headers, body: body)) + case 401: + let headers: Operations.deleteOrganization.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.deleteOrganization.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.deleteOrganization.Output.Forbidden.Headers = .init() try converter.validateContentTypeIfPresent( @@ -1298,6 +1453,19 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .badRequest(.init(headers: headers, body: body)) + case 401: + let headers: Operations.createInvitation.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createInvitation.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.createInvitation.Output.Forbidden.Headers = .init() try converter.validateContentTypeIfPresent( @@ -1383,6 +1551,19 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .noContent(.init(headers: headers, body: body)) + case 401: + let headers: Operations.cancelInvitation.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.cancelInvitation.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.cancelInvitation.Output.Forbidden.Headers = .init() try converter.validateContentTypeIfPresent( @@ -1482,6 +1663,20 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .badRequest(.init(headers: headers, body: body)) + case 401: + let headers: Operations.updateOrganizationMember.Output.Unauthorized.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateOrganizationMember.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.updateOrganizationMember.Output.Forbidden.Headers = .init() @@ -1571,6 +1766,20 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .badRequest(.init(headers: headers, body: body)) + case 401: + let headers: Operations.removeOrganizationMember.Output.Unauthorized.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.removeOrganizationMember.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.removeOrganizationMember.Output.Forbidden.Headers = .init() @@ -1645,6 +1854,20 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .ok(.init(headers: headers, body: body)) + case 401: + let headers: Operations.showOrganizationUsage.Output.Unauthorized.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.showOrganizationUsage.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.showOrganizationUsage.Output.Forbidden.Headers = .init() try converter.validateContentTypeIfPresent( @@ -1715,6 +1938,19 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .ok(.init(headers: headers, body: body)) + case 401: + let headers: Operations.listProjects.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.listProjects.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) default: return .undocumented(statusCode: response.statusCode, .init()) } } @@ -1785,6 +2021,19 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .badRequest(.init(headers: headers, body: body)) + case 401: + let headers: Operations.createProject.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createProject.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.createProject.Output.Forbidden.Headers = .init() try converter.validateContentTypeIfPresent( @@ -1842,6 +2091,19 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .ok(.init(headers: headers, body: body)) + case 401: + let headers: Operations.showProject.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.showProject.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.showProject.Output.Forbidden.Headers = .init() try converter.validateContentTypeIfPresent( @@ -1902,6 +2164,19 @@ public struct Client: APIProtocol { case 204: let headers: Operations.cleanCache.Output.NoContent.Headers = .init() return .noContent(.init(headers: headers, body: nil)) + case 401: + let headers: Operations.cleanCache.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.cleanCache.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.cleanCache.Output.Forbidden.Headers = .init() try converter.validateContentTypeIfPresent( @@ -1962,6 +2237,19 @@ public struct Client: APIProtocol { case 204: let headers: Operations.deleteProject.Output.NoContent.Headers = .init() return .noContent(.init(headers: headers, body: nil)) + case 401: + let headers: Operations.deleteProject.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.deleteProject.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.deleteProject.Output.Forbidden.Headers = .init() try converter.validateContentTypeIfPresent( @@ -2039,6 +2327,22 @@ public struct Client: APIProtocol { Operations.completeAnalyticsArtifactMultipartUpload.Output.NoContent.Headers = .init() return .noContent(.init(headers: headers, body: nil)) + case 401: + let headers: + Operations.completeAnalyticsArtifactMultipartUpload.Output.Unauthorized + .Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.completeAnalyticsArtifactMultipartUpload.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.completeAnalyticsArtifactMultipartUpload.Output.Forbidden.Headers = @@ -2122,6 +2426,22 @@ public struct Client: APIProtocol { Operations.completeAnalyticsArtifactsUploads.Output.NoContent.Headers = .init() return .noContent(.init(headers: headers, body: nil)) + case 401: + let headers: + Operations.completeAnalyticsArtifactsUploads.Output.Unauthorized.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.completeAnalyticsArtifactsUploads.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.completeAnalyticsArtifactsUploads.Output.Forbidden.Headers = @@ -2214,6 +2534,22 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .ok(.init(headers: headers, body: body)) + case 401: + let headers: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Unauthorized + .Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Unauthorized + .Body = try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Forbidden @@ -2306,6 +2642,22 @@ public struct Client: APIProtocol { transforming: { value in .json(value) } ) return .ok(.init(headers: headers, body: body)) + case 401: + let headers: + Operations.startAnalyticsArtifactMultipartUpload.Output.Unauthorized.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.startAnalyticsArtifactMultipartUpload.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) case 403: let headers: Operations.startAnalyticsArtifactMultipartUpload.Output.Forbidden.Headers = diff --git a/Sources/TuistServer/OpenAPI/Types.swift b/Sources/TuistServer/OpenAPI/Types.swift index dc425a75454..fec1984dad8 100644 --- a/Sources/TuistServer/OpenAPI/Types.swift +++ b/Sources/TuistServer/OpenAPI/Types.swift @@ -1462,6 +1462,37 @@ public enum Operations { /// /// HTTP response code: `200 ok`. case ok(Operations.createCommandEvent.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createCommandEvent.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createCommandEvent.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createCommandEvent.Output.Unauthorized.Headers = .init(), + body: Operations.createCommandEvent.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/analytics/post(createCommandEvent)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.createCommandEvent.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -1776,6 +1807,37 @@ public enum Operations { /// /// HTTP response code: `200 ok`. case ok(Operations.downloadCacheArtifact.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.downloadCacheArtifact.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.downloadCacheArtifact.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.downloadCacheArtifact.Output.Unauthorized.Headers = .init(), + body: Operations.downloadCacheArtifact.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/cache/get(downloadCacheArtifact)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.downloadCacheArtifact.Output.Unauthorized) public struct PaymentRequired: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -2030,6 +2092,37 @@ public enum Operations { /// /// HTTP response code: `200 ok`. case ok(Operations.cacheArtifactExists.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.cacheArtifactExists.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.cacheArtifactExists.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.cacheArtifactExists.Output.Unauthorized.Headers = .init(), + body: Operations.cacheArtifactExists.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/cache/exists/get(cacheArtifactExists)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.cacheArtifactExists.Output.Unauthorized) public struct PaymentRequired: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -2379,6 +2472,40 @@ public enum Operations { /// /// HTTP response code: `200 ok`. case ok(Operations.completeCacheArtifactMultipartUpload.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.completeCacheArtifactMultipartUpload.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.completeCacheArtifactMultipartUpload.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.completeCacheArtifactMultipartUpload.Output.Unauthorized + .Headers = .init(), + body: Operations.completeCacheArtifactMultipartUpload.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/complete/post(completeCacheArtifactMultipartUpload)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.completeCacheArtifactMultipartUpload.Output.Unauthorized) public struct PaymentRequired: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -2605,6 +2732,43 @@ public enum Operations { /// /// HTTP response code: `200 ok`. case ok(Operations.generateCacheArtifactMultipartUploadURL.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.generateCacheArtifactMultipartUploadURL.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.generateCacheArtifactMultipartUploadURL.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.generateCacheArtifactMultipartUploadURL.Output.Unauthorized + .Headers = .init(), + body: Operations.generateCacheArtifactMultipartUploadURL.Output.Unauthorized + .Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/generate-url/post(generateCacheArtifactMultipartUploadURL)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized( + Operations.generateCacheArtifactMultipartUploadURL.Output.Unauthorized + ) public struct PaymentRequired: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -2823,6 +2987,40 @@ public enum Operations { /// /// HTTP response code: `200 ok`. case ok(Operations.startCacheArtifactMultipartUpload.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.startCacheArtifactMultipartUpload.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.startCacheArtifactMultipartUpload.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.startCacheArtifactMultipartUpload.Output.Unauthorized + .Headers = .init(), + body: Operations.startCacheArtifactMultipartUpload.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/cache/multipart/start/post(startCacheArtifactMultipartUpload)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.startCacheArtifactMultipartUpload.Output.Unauthorized) public struct PaymentRequired: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -3031,6 +3229,37 @@ public enum Operations { /// /// HTTP response code: `200 ok`. case ok(Operations.listOrganizations.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.listOrganizations.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.listOrganizations.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.listOrganizations.Output.Unauthorized.Headers = .init(), + body: Operations.listOrganizations.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/organizations/get(listOrganizations)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.listOrganizations.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -3298,6 +3527,37 @@ public enum Operations { /// /// HTTP response code: `200 ok`. case ok(Operations.showOrganization.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.showOrganization.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.showOrganization.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.showOrganization.Output.Unauthorized.Headers = .init(), + body: Operations.showOrganization.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/get(showOrganization)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.showOrganization.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -3549,6 +3809,38 @@ public enum Operations { /// /// HTTP response code: `400 badRequest`. case badRequest(Operations.updateOrganization__2_.Output.BadRequest) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganization__2_.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateOrganization__2_.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganization__2_.Output.Unauthorized.Headers = + .init(), + body: Operations.updateOrganization__2_.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/patch(updateOrganization (2))/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.updateOrganization__2_.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -3799,6 +4091,37 @@ public enum Operations { /// /// HTTP response code: `400 badRequest`. case badRequest(Operations.updateOrganization.Output.BadRequest) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganization.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateOrganization.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganization.Output.Unauthorized.Headers = .init(), + body: Operations.updateOrganization.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/put(updateOrganization)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.updateOrganization.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -3958,6 +4281,37 @@ public enum Operations { /// /// HTTP response code: `204 noContent`. case noContent(Operations.deleteOrganization.Output.NoContent) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.deleteOrganization.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.deleteOrganization.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.deleteOrganization.Output.Unauthorized.Headers = .init(), + body: Operations.deleteOrganization.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/delete(deleteOrganization)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.deleteOrganization.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -4165,44 +4519,75 @@ public enum Operations { /// /// HTTP response code: `400 badRequest`. case badRequest(Operations.createInvitation.Output.BadRequest) - public struct Forbidden: Sendable, Equatable, Hashable { + public struct Unauthorized: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. public init() {} } /// Received HTTP response headers - public var headers: Operations.createInvitation.Output.Forbidden.Headers + public var headers: Operations.createInvitation.Output.Unauthorized.Headers @frozen public enum Body: Sendable, Equatable, Hashable { case json(Components.Schemas._Error) } /// Received HTTP response body - public var body: Operations.createInvitation.Output.Forbidden.Body - /// Creates a new `Forbidden`. + public var body: Operations.createInvitation.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. /// /// - Parameters: /// - headers: Received HTTP response headers /// - body: Received HTTP response body public init( - headers: Operations.createInvitation.Output.Forbidden.Headers = .init(), - body: Operations.createInvitation.Output.Forbidden.Body + headers: Operations.createInvitation.Output.Unauthorized.Headers = .init(), + body: Operations.createInvitation.Output.Unauthorized.Body ) { self.headers = headers self.body = body } } - /// The authenticated subject is not authorized to perform this action + /// You need to be authenticated to access this resource /// - /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/post(createInvitation)/responses/403`. + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/post(createInvitation)/responses/401`. /// - /// HTTP response code: `403 forbidden`. - case forbidden(Operations.createInvitation.Output.Forbidden) - public struct NotFound: Sendable, Equatable, Hashable { + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.createInvitation.Output.Unauthorized) + public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. public init() {} } /// Received HTTP response headers - public var headers: Operations.createInvitation.Output.NotFound.Headers + public var headers: Operations.createInvitation.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createInvitation.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createInvitation.Output.Forbidden.Headers = .init(), + body: Operations.createInvitation.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/post(createInvitation)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.createInvitation.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createInvitation.Output.NotFound.Headers @frozen public enum Body: Sendable, Equatable, Hashable { case json(Components.Schemas._Error) } @@ -4341,6 +4726,37 @@ public enum Operations { /// /// HTTP response code: `204 noContent`. case noContent(Operations.cancelInvitation.Output.NoContent) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.cancelInvitation.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.cancelInvitation.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.cancelInvitation.Output.Unauthorized.Headers = .init(), + body: Operations.cancelInvitation.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/invitations/delete(cancelInvitation)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.cancelInvitation.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -4582,6 +4998,38 @@ public enum Operations { /// /// HTTP response code: `400 badRequest`. case badRequest(Operations.updateOrganizationMember.Output.BadRequest) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateOrganizationMember.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateOrganizationMember.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateOrganizationMember.Output.Unauthorized.Headers = + .init(), + body: Operations.updateOrganizationMember.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/put(updateOrganizationMember)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.updateOrganizationMember.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -4776,6 +5224,38 @@ public enum Operations { /// /// HTTP response code: `400 badRequest`. case badRequest(Operations.removeOrganizationMember.Output.BadRequest) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.removeOrganizationMember.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.removeOrganizationMember.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.removeOrganizationMember.Output.Unauthorized.Headers = + .init(), + body: Operations.removeOrganizationMember.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/members/{user_name}/delete(removeOrganizationMember)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.removeOrganizationMember.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -4935,6 +5415,37 @@ public enum Operations { /// /// HTTP response code: `200 ok`. case ok(Operations.showOrganizationUsage.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.showOrganizationUsage.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.showOrganizationUsage.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.showOrganizationUsage.Output.Unauthorized.Headers = .init(), + body: Operations.showOrganizationUsage.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/organizations/{organization_name}/usage/get(showOrganizationUsage)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.showOrganizationUsage.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -5099,6 +5610,37 @@ public enum Operations { /// /// HTTP response code: `200 ok`. case ok(Operations.listProjects.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.listProjects.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.listProjects.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.listProjects.Output.Unauthorized.Headers = .init(), + body: Operations.listProjects.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/projects/get(listProjects)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.listProjects.Output.Unauthorized) /// Undocumented response. /// /// A response with a code that is not documented in the OpenAPI document. @@ -5247,6 +5789,37 @@ public enum Operations { /// /// HTTP response code: `400 badRequest`. case badRequest(Operations.createProject.Output.BadRequest) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createProject.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createProject.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createProject.Output.Unauthorized.Headers = .init(), + body: Operations.createProject.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/projects/post(createProject)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.createProject.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -5376,6 +5949,37 @@ public enum Operations { /// /// HTTP response code: `200 ok`. case ok(Operations.showProject.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.showProject.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.showProject.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.showProject.Output.Unauthorized.Headers = .init(), + body: Operations.showProject.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/get(showProject)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.showProject.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -5534,6 +6138,37 @@ public enum Operations { /// /// HTTP response code: `204 noContent`. case noContent(Operations.cleanCache.Output.NoContent) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.cleanCache.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.cleanCache.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.cleanCache.Output.Unauthorized.Headers = .init(), + body: Operations.cleanCache.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/cache/clean/put(cleanCache)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.cleanCache.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -5687,6 +6322,37 @@ public enum Operations { /// /// HTTP response code: `204 noContent`. case noContent(Operations.deleteProject.Output.NoContent) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.deleteProject.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.deleteProject.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.deleteProject.Output.Unauthorized.Headers = .init(), + body: Operations.deleteProject.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/projects/{id}/delete(deleteProject)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.deleteProject.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -5878,6 +6544,43 @@ public enum Operations { /// /// HTTP response code: `204 noContent`. case noContent(Operations.completeAnalyticsArtifactMultipartUpload.Output.NoContent) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.completeAnalyticsArtifactMultipartUpload.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.completeAnalyticsArtifactMultipartUpload.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.completeAnalyticsArtifactMultipartUpload.Output.Unauthorized + .Headers = .init(), + body: Operations.completeAnalyticsArtifactMultipartUpload.Output.Unauthorized + .Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/complete/post(completeAnalyticsArtifactMultipartUpload)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized( + Operations.completeAnalyticsArtifactMultipartUpload.Output.Unauthorized + ) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -6058,6 +6761,40 @@ public enum Operations { /// /// HTTP response code: `204 noContent`. case noContent(Operations.completeAnalyticsArtifactsUploads.Output.NoContent) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.completeAnalyticsArtifactsUploads.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.completeAnalyticsArtifactsUploads.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.completeAnalyticsArtifactsUploads.Output.Unauthorized + .Headers = .init(), + body: Operations.completeAnalyticsArtifactsUploads.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/complete_artifacts_uploads/put(completeAnalyticsArtifactsUploads)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.completeAnalyticsArtifactsUploads.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -6253,6 +6990,44 @@ public enum Operations { /// /// HTTP response code: `200 ok`. case ok(Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Unauthorized + .Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.generateAnalyticsArtifactMultipartUploadURL.Output + .Unauthorized.Headers = .init(), + body: Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Unauthorized + .Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/generate-url/post(generateAnalyticsArtifactMultipartUploadURL)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized( + Operations.generateAnalyticsArtifactMultipartUploadURL.Output.Unauthorized + ) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. @@ -6422,6 +7197,40 @@ public enum Operations { /// /// HTTP response code: `200 ok`. case ok(Operations.startAnalyticsArtifactMultipartUpload.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.startAnalyticsArtifactMultipartUpload.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: + Operations.startAnalyticsArtifactMultipartUpload.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.startAnalyticsArtifactMultipartUpload.Output.Unauthorized + .Headers = .init(), + body: Operations.startAnalyticsArtifactMultipartUpload.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/runs/{run_id}/start/post(startAnalyticsArtifactMultipartUpload)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.startAnalyticsArtifactMultipartUpload.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. diff --git a/Sources/TuistServer/OpenAPI/cloud.yml b/Sources/TuistServer/OpenAPI/cloud.yml index 253b3d951d5..6afe1bff6a3 100644 --- a/Sources/TuistServer/OpenAPI/cloud.yml +++ b/Sources/TuistServer/OpenAPI/cloud.yml @@ -504,6 +504,12 @@ paths: schema: $ref: '#/components/schemas/CommandEvent' description: The command event was created + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -588,6 +594,12 @@ paths: schema: $ref: '#/components/schemas/CacheArtifactDownloadURL' description: The artifact exists and is downloadable + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 402: content: application/json: @@ -657,6 +669,12 @@ paths: title: CacheArtifactExistence type: object description: The artifact exists + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 402: content: application/json: @@ -762,6 +780,12 @@ paths: title: CacheArtifactMultipartUploadCompletion type: object description: The upload has been completed + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 402: content: application/json: @@ -831,6 +855,12 @@ paths: schema: $ref: '#/components/schemas/ArtifactMultipartUploadURL' description: The URL has been generated + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 402: content: application/json: @@ -888,6 +918,12 @@ paths: schema: $ref: '#/components/schemas/ArtifactUploadID' description: The upload has been started + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 402: content: application/json: @@ -930,6 +966,12 @@ paths: title: OrganizationList type: object description: The list of organizations + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -988,6 +1030,12 @@ paths: content: application/json: {} description: The organization was deleted + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1020,6 +1068,12 @@ paths: schema: $ref: '#/components/schemas/Organization' description: The organization + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1076,6 +1130,12 @@ paths: schema: $ref: '#/components/schemas/Error' description: The organization could not be updated due to a validation error + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1132,6 +1192,12 @@ paths: schema: $ref: '#/components/schemas/Error' description: The organization could not be updated due to a validation error + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1176,6 +1242,12 @@ paths: content: application/json: {} description: The invitation was cancelled + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1227,6 +1299,12 @@ paths: schema: $ref: '#/components/schemas/Error' description: The user could not be invited due to a validation error + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1270,6 +1348,12 @@ paths: schema: $ref: '#/components/schemas/Error' description: The member could not be removed due to a validation error + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1330,6 +1414,12 @@ paths: schema: $ref: '#/components/schemas/Error' description: The member could not be updated due to a validation error + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1363,6 +1453,12 @@ paths: schema: $ref: '#/components/schemas/OrganizationUsage' description: The organization usage + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1396,6 +1492,12 @@ paths: - projects type: object description: List of projects + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource summary: List projects the authenticated user has access to. tags: [] post: @@ -1431,6 +1533,12 @@ paths: schema: $ref: '#/components/schemas/Error' description: The account was not found + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1463,6 +1571,12 @@ paths: schema: $ref: '#/components/schemas/Project' description: The project to show + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1497,6 +1611,12 @@ paths: responses: 204: description: The cache has been successfully cleaned + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1525,6 +1645,12 @@ paths: responses: 204: description: The project was successfully deleted. + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1569,6 +1695,12 @@ paths: responses: 204: description: The upload has been completed + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1613,6 +1745,12 @@ paths: responses: 204: description: The command event artifact uploads were successfully finished + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1661,6 +1799,12 @@ paths: schema: $ref: '#/components/schemas/ArtifactMultipartUploadURL' description: The URL has been generated + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: @@ -1701,6 +1845,12 @@ paths: schema: $ref: '#/components/schemas/ArtifactUploadID' description: The upload has been started + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource 403: content: application/json: diff --git a/Sources/TuistServer/Services/CacheExistsService.swift b/Sources/TuistServer/Services/CacheExistsService.swift index 9902c82bd26..a834317afd1 100644 --- a/Sources/TuistServer/Services/CacheExistsService.swift +++ b/Sources/TuistServer/Services/CacheExistsService.swift @@ -19,12 +19,13 @@ public enum CacheExistsServiceError: FatalError, Equatable { case notFound(String) case paymentRequired(String) case forbidden(String) + case unauthorized(String) public var type: ErrorType { switch self { case .unknownError: return .bug - case .notFound, .paymentRequired, .forbidden: + case .notFound, .paymentRequired, .forbidden, .unauthorized: return .abort } } @@ -33,7 +34,7 @@ public enum CacheExistsServiceError: FatalError, Equatable { switch self { case let .unknownError(statusCode): return "The remote cache could not be used due to an unknown Tuist Cloud response of \(statusCode)." - case let .notFound(message), let .paymentRequired(message), let .forbidden(message): + case let .notFound(message), let .paymentRequired(message), let .forbidden(message), let .unauthorized(message): return message } } @@ -76,6 +77,11 @@ public final class CacheExistsService: CacheExistsServicing { case let .json(error): throw CacheExistsServiceError.forbidden(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } } } } diff --git a/Sources/TuistServer/Services/CancelOrganizationInviteService.swift b/Sources/TuistServer/Services/CancelOrganizationInviteService.swift index 4371dee3254..70a4469faf0 100644 --- a/Sources/TuistServer/Services/CancelOrganizationInviteService.swift +++ b/Sources/TuistServer/Services/CancelOrganizationInviteService.swift @@ -14,12 +14,13 @@ enum CancelOrganizationInviteServiceError: FatalError { case unknownError(Int) case notFound(String) case forbidden(String) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .notFound, .forbidden: + case .notFound, .forbidden, .unauthorized: return .abort } } @@ -28,7 +29,7 @@ enum CancelOrganizationInviteServiceError: FatalError { switch self { case let .unknownError(statusCode): return "The invitation could not be cancelled due to an unknown cloud response of \(statusCode)." - case let .notFound(message), let .forbidden(message): + case let .notFound(message), let .forbidden(message), let .unauthorized(message): return message } } @@ -64,6 +65,11 @@ public final class CancelOrganizationInviteService: CancelOrganizationInviteServ case let .json(error): throw CancelOrganizationInviteServiceError.forbidden(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } case let .undocumented(statusCode: statusCode, _): throw CancelOrganizationInviteServiceError.unknownError(statusCode) } diff --git a/Sources/TuistServer/Services/CleanCacheService.swift b/Sources/TuistServer/Services/CleanCacheService.swift index 0be430b916f..dfa8bc196bf 100644 --- a/Sources/TuistServer/Services/CleanCacheService.swift +++ b/Sources/TuistServer/Services/CleanCacheService.swift @@ -14,12 +14,13 @@ enum CleanCacheServiceError: FatalError { case unknownError(Int) case notFound(String) case forbidden(String) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .notFound, .forbidden: + case .notFound, .forbidden, .unauthorized: return .abort } } @@ -28,7 +29,7 @@ enum CleanCacheServiceError: FatalError { switch self { case let .unknownError(statusCode): return "The project clean failed due to an unknown cloud response of \(statusCode)." - case let .notFound(message), let .forbidden(message): + case let .notFound(message), let .forbidden(message), let .unauthorized(message): return message } } @@ -62,6 +63,11 @@ public final class CleanCacheService: CleanCacheServicing { case let .json(error): throw CleanCacheServiceError.forbidden(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } case let .undocumented(statusCode: statusCode, _): throw CleanCacheServiceError.unknownError(statusCode) } diff --git a/Sources/TuistServer/Services/CompleteAnalyticsArtifactsUploads.swift b/Sources/TuistServer/Services/CompleteAnalyticsArtifactsUploads.swift index a79f076a276..cad274c6928 100644 --- a/Sources/TuistServer/Services/CompleteAnalyticsArtifactsUploads.swift +++ b/Sources/TuistServer/Services/CompleteAnalyticsArtifactsUploads.swift @@ -16,12 +16,13 @@ public enum CompleteAnalyticsArtifactsUploadsServiceError: FatalError, Equatable case unknownError(Int) case notFound(String) case forbidden(String) + case unauthorized(String) public var type: ErrorType { switch self { case .unknownError: return .bug - case .notFound, .forbidden: + case .notFound, .forbidden, .unauthorized: return .abort } } @@ -30,7 +31,7 @@ public enum CompleteAnalyticsArtifactsUploadsServiceError: FatalError, Equatable switch self { case let .unknownError(statusCode): return "The analytics artifacts uploads could not get completed due to an unknown Tuist Cloud response of \(statusCode)." - case let .notFound(message), let .forbidden(message): + case let .notFound(message), let .forbidden(message), let .unauthorized(message): return message } } @@ -68,6 +69,11 @@ public final class CompleteAnalyticsArtifactsUploadsService: CompleteAnalyticsAr case let .json(error): throw CompleteAnalyticsArtifactsUploadsServiceError.notFound(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } } } } diff --git a/Sources/TuistServer/Services/CreateCommandEventService.swift b/Sources/TuistServer/Services/CreateCommandEventService.swift index 9f5d2a35a8d..d42a979b341 100644 --- a/Sources/TuistServer/Services/CreateCommandEventService.swift +++ b/Sources/TuistServer/Services/CreateCommandEventService.swift @@ -16,12 +16,13 @@ public protocol CreateCommandEventServicing { enum CreateCommandEventServiceError: FatalError { case unknownError(Int) case forbidden(String) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .forbidden: + case .forbidden, .unauthorized: return .abort } } @@ -30,7 +31,7 @@ enum CreateCommandEventServiceError: FatalError { switch self { case let .unknownError(statusCode): return "The organization could not be created due to an unknown cloud response of \(statusCode)." - case let .forbidden(message): + case let .forbidden(message), let .unauthorized(message): return message } } @@ -99,6 +100,11 @@ public final class CreateCommandEventService: CreateCommandEventServicing { case let .json(error): throw CreateCommandEventServiceError.forbidden(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } } } } diff --git a/Sources/TuistServer/Services/CreateOrganizationInviteService.swift b/Sources/TuistServer/Services/CreateOrganizationInviteService.swift index 9fe2ce532b0..f5c4adcd6c3 100644 --- a/Sources/TuistServer/Services/CreateOrganizationInviteService.swift +++ b/Sources/TuistServer/Services/CreateOrganizationInviteService.swift @@ -17,12 +17,13 @@ enum CreateOrganizationInviteServiceError: FatalError { case notFound(String) case forbidden(String) case badRequest(String) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .notFound, .forbidden, .badRequest: + case .notFound, .forbidden, .badRequest, .unauthorized: return .abort } } @@ -31,7 +32,7 @@ enum CreateOrganizationInviteServiceError: FatalError { switch self { case let .unknownError(statusCode): return "The user could not be invited due to an unknown cloud response of \(statusCode)." - case let .notFound(message), let .forbidden(message), let .badRequest(message): + case let .notFound(message), let .forbidden(message), let .badRequest(message), let .unauthorized(message): return message } } @@ -76,6 +77,11 @@ public final class CreateOrganizationInviteService: CreateOrganizationInviteServ } case let .undocumented(statusCode: statusCode, _): throw CreateOrganizationInviteServiceError.unknownError(statusCode) + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } } } } diff --git a/Sources/TuistServer/Services/CreateProjectService.swift b/Sources/TuistServer/Services/CreateProjectService.swift index 2e2eea86ea0..8e0f4af41ab 100644 --- a/Sources/TuistServer/Services/CreateProjectService.swift +++ b/Sources/TuistServer/Services/CreateProjectService.swift @@ -16,12 +16,13 @@ enum CreateProjectServiceError: FatalError { case unknownError(Int) case forbidden(String) case badRequest(String) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .forbidden, .badRequest: + case .forbidden, .badRequest, .unauthorized: return .abort } } @@ -30,7 +31,7 @@ enum CreateProjectServiceError: FatalError { switch self { case let .unknownError(statusCode): return "The project could not be created due to an unknown Cloud response of \(statusCode)." - case let .forbidden(message), let .badRequest(message): + case let .forbidden(message), let .badRequest(message), let .unauthorized(message): return message } } @@ -74,6 +75,11 @@ public final class CreateProjectService: CreateProjectServicing { case let .json(error): throw CreateProjectServiceError.badRequest(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } } } } diff --git a/Sources/TuistServer/Services/DeleteOrganizationService.swift b/Sources/TuistServer/Services/DeleteOrganizationService.swift index 41e142ea6eb..a429068d067 100644 --- a/Sources/TuistServer/Services/DeleteOrganizationService.swift +++ b/Sources/TuistServer/Services/DeleteOrganizationService.swift @@ -13,12 +13,13 @@ enum DeleteOrganizationServiceError: FatalError { case unknownError(Int) case notFound(String) case forbidden(String) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .forbidden, .notFound: + case .forbidden, .unauthorized, .notFound: return .abort } } @@ -27,7 +28,7 @@ enum DeleteOrganizationServiceError: FatalError { switch self { case let .unknownError(statusCode): return "The organization could not be deleted due to an unknown cloud response of \(statusCode)." - case let .forbidden(message), let .notFound(message): + case let .forbidden(message), let .unauthorized(message), let .notFound(message): return message } } @@ -63,6 +64,11 @@ public final class DeleteOrganizationService: DeleteOrganizationServicing { case let .json(error): throw DeleteOrganizationServiceError.forbidden(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } case let .undocumented(statusCode: statusCode, _): throw DeleteOrganizationServiceError.unknownError(statusCode) } diff --git a/Sources/TuistServer/Services/DeleteProjectService.swift b/Sources/TuistServer/Services/DeleteProjectService.swift index c86a1992bd1..ce26492c1ca 100644 --- a/Sources/TuistServer/Services/DeleteProjectService.swift +++ b/Sources/TuistServer/Services/DeleteProjectService.swift @@ -15,12 +15,13 @@ enum DeleteProjectServiceError: FatalError { case unknownError(Int) case notFound(String) case forbidden(String) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .forbidden, .notFound: + case .forbidden, .notFound, .unauthorized: return .abort } } @@ -29,7 +30,7 @@ enum DeleteProjectServiceError: FatalError { switch self { case let .unknownError(statusCode): return "The project could not be deleted due to an unknown cloud response of \(statusCode)." - case let .forbidden(message), let .notFound(message): + case let .forbidden(message), let .unauthorized(message), let .notFound(message): return message } } @@ -63,6 +64,11 @@ public final class DeleteProjectService: DeleteProjectServicing { case let .json(error): throw DeleteProjectServiceError.forbidden(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } case let .undocumented(statusCode: statusCode, _): throw DeleteProjectServiceError.unknownError(statusCode) } diff --git a/Sources/TuistServer/Services/GetCacheService.swift b/Sources/TuistServer/Services/GetCacheService.swift index 3d1897dd4cc..e5328daec5f 100644 --- a/Sources/TuistServer/Services/GetCacheService.swift +++ b/Sources/TuistServer/Services/GetCacheService.swift @@ -19,12 +19,13 @@ public enum GetCacheServiceError: FatalError, Equatable { case notFound(String) case paymentRequired(String) case forbidden(String) + case unauthorized(String) public var type: ErrorType { switch self { case .unknownError: return .bug - case .notFound, .paymentRequired, .forbidden: + case .notFound, .paymentRequired, .forbidden, .unauthorized: return .abort } } @@ -33,7 +34,7 @@ public enum GetCacheServiceError: FatalError, Equatable { switch self { case let .unknownError(statusCode): return "The remote cache could not be used due to an unknown Tuist Cloud response of \(statusCode)." - case let .notFound(message), let .paymentRequired(message), let .forbidden(message): + case let .notFound(message), let .paymentRequired(message), let .forbidden(message), let .unauthorized(message): return message } } @@ -78,6 +79,11 @@ public final class GetCacheService: GetCacheServicing { case let .json(error): throw GetCacheServiceError.notFound(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } } } } diff --git a/Sources/TuistServer/Services/GetOrganizationService.swift b/Sources/TuistServer/Services/GetOrganizationService.swift index 731d1251f49..1ffa2b315c3 100644 --- a/Sources/TuistServer/Services/GetOrganizationService.swift +++ b/Sources/TuistServer/Services/GetOrganizationService.swift @@ -15,12 +15,13 @@ enum GetOrganizationServiceError: FatalError { case unknownError(Int) case notFound(String) case forbidden(String) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .forbidden, .notFound: + case .forbidden, .notFound, .unauthorized: return .abort } } @@ -29,7 +30,7 @@ enum GetOrganizationServiceError: FatalError { switch self { case let .unknownError(statusCode): return "We could not get the organization due to an unknown cloud response of \(statusCode)." - case let .forbidden(message), let .notFound(message): + case let .forbidden(message), let .notFound(message), let .unauthorized(message): return message } } @@ -67,6 +68,11 @@ public final class GetOrganizationService: GetOrganizationServicing { case let .json(error): throw GetOrganizationServiceError.forbidden(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } case let .undocumented(statusCode: statusCode, _): throw GetOrganizationServiceError.unknownError(statusCode) } diff --git a/Sources/TuistServer/Services/GetOrganizationUsage.swift b/Sources/TuistServer/Services/GetOrganizationUsage.swift index 645bfcb84c7..f3e9a3c6fd3 100644 --- a/Sources/TuistServer/Services/GetOrganizationUsage.swift +++ b/Sources/TuistServer/Services/GetOrganizationUsage.swift @@ -15,12 +15,13 @@ enum GetOrganizationUsageServiceError: FatalError { case unknownError(Int) case notFound(String) case forbidden(String) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .forbidden, .notFound: + case .forbidden, .notFound, .unauthorized: return .abort } } @@ -29,7 +30,7 @@ enum GetOrganizationUsageServiceError: FatalError { switch self { case let .unknownError(statusCode): return "We could not get the OrganizationUsage due to an unknown cloud response of \(statusCode)." - case let .forbidden(message), let .notFound(message): + case let .forbidden(message), let .notFound(message), let .unauthorized(message): return message } } @@ -67,6 +68,11 @@ public final class GetOrganizationUsageService: GetOrganizationUsageServicing { case let .json(error): throw GetOrganizationUsageServiceError.forbidden(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } case let .undocumented(statusCode: statusCode, _): throw GetOrganizationUsageServiceError.unknownError(statusCode) } diff --git a/Sources/TuistServer/Services/GetProjectService.swift b/Sources/TuistServer/Services/GetProjectService.swift index a4ebca2c9ea..a7e36b40890 100644 --- a/Sources/TuistServer/Services/GetProjectService.swift +++ b/Sources/TuistServer/Services/GetProjectService.swift @@ -16,12 +16,13 @@ enum GetProjectServiceError: FatalError { case unknownError(Int) case notFound(String) case forbidden(String) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .forbidden, .notFound: + case .forbidden, .notFound, .unauthorized: return .abort } } @@ -30,7 +31,7 @@ enum GetProjectServiceError: FatalError { switch self { case let .unknownError(statusCode): return "We could not get the project due to an unknown cloud response of \(statusCode)." - case let .forbidden(message), let .notFound(message): + case let .forbidden(message), let .notFound(message), let .unauthorized(message): return message } } @@ -70,6 +71,11 @@ public final class GetProjectService: GetProjectServicing { case let .json(error): throw GetProjectServiceError.forbidden(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } case let .undocumented(statusCode: statusCode, _): throw GetProjectServiceError.unknownError(statusCode) } diff --git a/Sources/TuistServer/Services/ListOrganizationsService.swift b/Sources/TuistServer/Services/ListOrganizationsService.swift index 9974a10c6d3..c35fec797e5 100644 --- a/Sources/TuistServer/Services/ListOrganizationsService.swift +++ b/Sources/TuistServer/Services/ListOrganizationsService.swift @@ -13,12 +13,13 @@ public protocol ListOrganizationsServicing { enum ListOrganizationsServiceError: FatalError { case unknownError(Int) case forbidden(String) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .forbidden: + case .forbidden, .unauthorized: return .abort } } @@ -27,7 +28,7 @@ enum ListOrganizationsServiceError: FatalError { switch self { case let .unknownError(statusCode): return "The organizations could not be listed due to an unknown cloud response of \(statusCode)." - case let .forbidden(message): + case let .forbidden(message), let .unauthorized(message): return message } } @@ -57,6 +58,11 @@ public final class ListOrganizationsService: ListOrganizationsServicing { case let .json(error): throw ListOrganizationsServiceError.forbidden(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } case let .undocumented(statusCode: statusCode, _): throw ListOrganizationsServiceError.unknownError(statusCode) } diff --git a/Sources/TuistServer/Services/ListProjectsService.swift b/Sources/TuistServer/Services/ListProjectsService.swift index 0e26d25ebdb..425c72dacf0 100644 --- a/Sources/TuistServer/Services/ListProjectsService.swift +++ b/Sources/TuistServer/Services/ListProjectsService.swift @@ -18,11 +18,14 @@ public protocol ListProjectsServicing { enum ListProjectsServiceError: FatalError { case unknownError(Int) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug + case .unauthorized: + return .abort } } @@ -30,6 +33,8 @@ enum ListProjectsServiceError: FatalError { switch self { case let .unknownError(statusCode): return "The project could not be listed due to an unknown cloud response of \(statusCode)." + case let .unauthorized(message): + return message } } } @@ -65,6 +70,11 @@ public final class ListProjectsService: ListProjectsServicing { } case let .undocumented(statusCode: statusCode, _): throw ListProjectsServiceError.unknownError(statusCode) + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } } } } diff --git a/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift b/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift index d07962cac04..f7895822804 100644 --- a/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift +++ b/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift @@ -18,12 +18,13 @@ public enum MultipartUploadCompleteAnalyticsServiceError: FatalError, Equatable case unknownError(Int) case notFound(String) case forbidden(String) + case unauthorized(String) public var type: ErrorType { switch self { case .unknownError: return .bug - case .notFound, .forbidden: + case .notFound, .forbidden, .unauthorized: return .abort } } @@ -32,7 +33,7 @@ public enum MultipartUploadCompleteAnalyticsServiceError: FatalError, Equatable switch self { case let .unknownError(statusCode): return "The multi-part upload could not get completed due to an unknown Tuist Cloud response of \(statusCode)." - case let .notFound(message), let .forbidden(message): + case let .notFound(message), let .forbidden(message), let .unauthorized(message): return message } } @@ -79,6 +80,11 @@ public final class MultipartUploadCompleteAnalyticsService: MultipartUploadCompl case let .json(error): throw MultipartUploadCompleteAnalyticsServiceError.notFound(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } } } } diff --git a/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift b/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift index 3ea658c378e..c0fb7bd2acb 100644 --- a/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift +++ b/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift @@ -22,12 +22,13 @@ public enum MultipartUploadCompleteCacheServiceError: FatalError, Equatable { case notFound(String) case paymentRequired(String) case forbidden(String) + case unauthorized(String) public var type: ErrorType { switch self { case .unknownError: return .bug - case .notFound, .paymentRequired, .forbidden: + case .notFound, .paymentRequired, .forbidden, .unauthorized: return .abort } } @@ -36,7 +37,7 @@ public enum MultipartUploadCompleteCacheServiceError: FatalError, Equatable { switch self { case let .unknownError(statusCode): return "The multi-part upload could not get completed due to an unknown Tuist Cloud response of \(statusCode)." - case let .notFound(message), let .paymentRequired(message), let .forbidden(message): + case let .notFound(message), let .paymentRequired(message), let .forbidden(message), let .unauthorized(message): return message } } @@ -85,6 +86,11 @@ public final class MultipartUploadCompleteCacheService: MultipartUploadCompleteC case let .json(error): throw MultipartUploadCompleteCacheServiceError.notFound(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } } } } diff --git a/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift b/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift index f173bb8ee60..36f72876739 100644 --- a/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift +++ b/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift @@ -17,12 +17,13 @@ public enum MultipartUploadGenerateURLAnalyticsServiceError: FatalError, Equatab case unknownError(Int) case notFound(String) case forbidden(String) + case unauthorized(String) public var type: ErrorType { switch self { case .unknownError: return .bug - case .notFound, .forbidden: + case .notFound, .forbidden, .unauthorized: return .abort } } @@ -31,7 +32,7 @@ public enum MultipartUploadGenerateURLAnalyticsServiceError: FatalError, Equatab switch self { case let .unknownError(statusCode): return "The generation of a multi-part upload URL failed due to an unknown Tuist response of \(statusCode)." - case let .notFound(message), let .forbidden(message): + case let .notFound(message), let .forbidden(message), let .unauthorized(message): return message } } @@ -80,6 +81,11 @@ public final class MultipartUploadGenerateURLAnalyticsService: MultipartUploadGe case let .json(error): throw MultipartUploadGenerateURLAnalyticsServiceError.notFound(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } } } } diff --git a/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift b/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift index c1073b07b0c..2b138d7d2c2 100644 --- a/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift +++ b/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift @@ -21,12 +21,13 @@ public enum MultipartUploadGenerateURLCacheServiceError: FatalError, Equatable { case notFound(String) case paymentRequired(String) case forbidden(String) + case unauthorized(String) public var type: ErrorType { switch self { case .unknownError: return .bug - case .notFound, .paymentRequired, .forbidden: + case .notFound, .paymentRequired, .forbidden, .unauthorized: return .abort } } @@ -35,7 +36,7 @@ public enum MultipartUploadGenerateURLCacheServiceError: FatalError, Equatable { switch self { case let .unknownError(statusCode): return "The generation of a multi-part upload URL failed due to an unknown Tuist Cloud response of \(statusCode)." - case let .notFound(message), let .paymentRequired(message), let .forbidden(message): + case let .notFound(message), let .paymentRequired(message), let .forbidden(message), let .unauthorized(message): return message } } @@ -85,6 +86,11 @@ public final class MultipartUploadGenerateURLCacheService: MultipartUploadGenera case let .json(error): throw MultipartUploadGenerateURLCacheServiceError.notFound(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } } } } diff --git a/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift b/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift index b7d5dd532b9..cb2bb063b6a 100644 --- a/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift +++ b/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift @@ -16,12 +16,13 @@ public enum MultipartUploadStartAnalyticsServiceError: FatalError, Equatable { case notFound(String) case paymentRequired(String) case forbidden(String) + case unauthorized(String) public var type: ErrorType { switch self { case .unknownError: return .bug - case .notFound, .paymentRequired, .forbidden: + case .notFound, .paymentRequired, .forbidden, .unauthorized: return .abort } } @@ -30,7 +31,7 @@ public enum MultipartUploadStartAnalyticsServiceError: FatalError, Equatable { switch self { case let .unknownError(statusCode): return "The remote cache artifact could not be uploaded due to an unknown Tuist Cloud response of \(statusCode)." - case let .notFound(message), let .paymentRequired(message), let .forbidden(message): + case let .notFound(message), let .paymentRequired(message), let .forbidden(message), let .unauthorized(message): return message } } @@ -69,6 +70,11 @@ public final class MultipartUploadStartAnalyticsService: MultipartUploadStartAna case let .json(error): throw MultipartUploadStartAnalyticsServiceError.notFound(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } } } } diff --git a/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift b/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift index c7feae37a68..d1299d860d4 100644 --- a/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift +++ b/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift @@ -19,12 +19,13 @@ public enum MultipartUploadStartCacheServiceError: FatalError, Equatable { case notFound(String) case paymentRequired(String) case forbidden(String) + case unauthorized(String) public var type: ErrorType { switch self { case .unknownError: return .bug - case .notFound, .paymentRequired, .forbidden: + case .notFound, .paymentRequired, .forbidden, .unauthorized: return .abort } } @@ -33,7 +34,7 @@ public enum MultipartUploadStartCacheServiceError: FatalError, Equatable { switch self { case let .unknownError(statusCode): return "The remote cache artifact could not be uploaded due to an unknown Tuist Cloud response of \(statusCode)." - case let .notFound(message), let .paymentRequired(message), let .forbidden(message): + case let .notFound(message), let .paymentRequired(message), let .forbidden(message), let .unauthorized(message): return message } } @@ -79,6 +80,11 @@ public final class MultipartUploadStartCacheService: MultipartUploadStartCacheSe case let .json(error): throw MultipartUploadStartCacheServiceError.notFound(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } } } } diff --git a/Sources/TuistServer/Services/RemoveOrganizationMemberService.swift b/Sources/TuistServer/Services/RemoveOrganizationMemberService.swift index 7f306b83a32..605fcd0fdac 100644 --- a/Sources/TuistServer/Services/RemoveOrganizationMemberService.swift +++ b/Sources/TuistServer/Services/RemoveOrganizationMemberService.swift @@ -15,12 +15,13 @@ enum RemoveOrganizationMemberServiceError: FatalError { case notFound(String) case forbidden(String) case badRequest(String) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .notFound, .forbidden, .badRequest: + case .notFound, .forbidden, .badRequest, .unauthorized: return .abort } } @@ -29,7 +30,7 @@ enum RemoveOrganizationMemberServiceError: FatalError { switch self { case let .unknownError(statusCode): return "The member could not be removed due to an unknown cloud response of \(statusCode)." - case let .notFound(message), let .forbidden(message), let .badRequest(message): + case let .notFound(message), let .forbidden(message), let .badRequest(message), let .unauthorized(message): return message } } @@ -74,6 +75,11 @@ public final class RemoveOrganizationMemberService: RemoveOrganizationMemberServ case let .json(error): throw RemoveOrganizationMemberServiceError.badRequest(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } } } } diff --git a/Sources/TuistServer/Services/UpdateOrganizationMemberService.swift b/Sources/TuistServer/Services/UpdateOrganizationMemberService.swift index d6bb93e2875..a888dd4651e 100644 --- a/Sources/TuistServer/Services/UpdateOrganizationMemberService.swift +++ b/Sources/TuistServer/Services/UpdateOrganizationMemberService.swift @@ -16,12 +16,13 @@ enum UpdateOrganizationMemberServiceError: FatalError { case notFound(String) case forbidden(String) case badRequest(String) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .notFound, .forbidden, .badRequest: + case .notFound, .forbidden, .unauthorized, .badRequest: return .abort } } @@ -30,7 +31,7 @@ enum UpdateOrganizationMemberServiceError: FatalError { switch self { case let .unknownError(statusCode): return "The member could not be updated due to an unknown cloud response of \(statusCode)." - case let .notFound(message), let .forbidden(message), let .badRequest(message): + case let .notFound(message), let .forbidden(message), let .unauthorized(message), let .badRequest(message): return message } } @@ -72,6 +73,11 @@ public final class UpdateOrganizationMemberService: UpdateOrganizationMemberServ case let .json(error): throw UpdateOrganizationMemberServiceError.forbidden(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } case let .undocumented(statusCode: statusCode, _): throw UpdateOrganizationMemberServiceError.unknownError(statusCode) case let .badRequest(badRequestResponse): diff --git a/Sources/TuistServer/Services/UpdateOrganizationService.swift b/Sources/TuistServer/Services/UpdateOrganizationService.swift index 4a546ef3034..873af2f45c4 100644 --- a/Sources/TuistServer/Services/UpdateOrganizationService.swift +++ b/Sources/TuistServer/Services/UpdateOrganizationService.swift @@ -17,12 +17,13 @@ enum UpdateOrganizationServiceError: FatalError { case notFound(String) case forbidden(String) case badRequest(String) + case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .forbidden, .notFound, .badRequest: + case .forbidden, .notFound, .badRequest, .unauthorized: return .abort } } @@ -31,7 +32,7 @@ enum UpdateOrganizationServiceError: FatalError { switch self { case let .unknownError(statusCode): return "We could not get the organization due to an unknown cloud response of \(statusCode)." - case let .forbidden(message), let .notFound(message), let .badRequest(message): + case let .forbidden(message), let .notFound(message), let .badRequest(message), let .unauthorized(message): return message } } @@ -90,6 +91,11 @@ public final class UpdateOrganizationService: UpdateOrganizationServicing { case let .json(error): throw UpdateOrganizationServiceError.forbidden(error.message) } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DeleteOrganizationServiceError.unauthorized(error.message) + } case let .badRequest(badRequest): switch badRequest.body { case let .json(error): diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index 82d72f19e02..a10372c77cf 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -1297,7 +1297,6 @@ final class TestServiceTests: TuistUnitTestCase { .willProduce { path in (path, .test(workspace: .test(schemes: [.test(name: "TestScheme")]))) } - var testedSchemes: [String] = [] given(xcodebuildController) .test( .any, From 0c30939eb86d7d9880e43e37b2f69b3034fe423f Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Thu, 27 Jun 2024 16:48:03 -0400 Subject: [PATCH 386/509] Add support for enabling explicit modules for Xcode 16 (#6405) --- Sources/ProjectDescription/SettingsTransformers.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Sources/ProjectDescription/SettingsTransformers.swift b/Sources/ProjectDescription/SettingsTransformers.swift index 5bb8da3b1e7..9a0b9c066a4 100644 --- a/Sources/ProjectDescription/SettingsTransformers.swift +++ b/Sources/ProjectDescription/SettingsTransformers.swift @@ -186,4 +186,12 @@ extension SettingsDictionary { public func debugInformationFormat(_ format: DebugInformationFormat) -> SettingsDictionary { merging(["DEBUG_INFORMATION_FORMAT": SettingValue(format)]) } + + /// Sets `"_EXPERIMENTAL_SWIFT_EXPLICIT_MODULES"` + /// NOTE: This is only available when using Xcode 16 or later. + /// This setting may change and is not guaranteed to work across all beta versions. + public func betaFeature_enableExplicitModules(_ enabled: Bool) -> SettingsDictionary { + // This is the value as of Xcode 16 beta 1 + merging(["_EXPERIMENTAL_SWIFT_EXPLICIT_MODULES": SettingValue(enabled)]) + } } From 93a98d8a0c2bfc5990aa94bb3ef7ccc43dafb802 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Bergstr=C3=B6m?= Date: Fri, 28 Jun 2024 09:27:19 +0200 Subject: [PATCH 387/509] fix(Quick): added Quick's QuickObjcRuntime target to the list of testing targets to automatically add 'ENABLE_TESTING_SEARCH_PATHS=YES' (#6445) --- Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 2ddd2fec4e6..0062d3fb40d 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -282,6 +282,7 @@ public final class PackageInfoMapper: PackageInfoMapping { "Nimble", // https://github.com/Quick/Nimble "NimbleObjectiveC", // https://github.com/Quick/Nimble "Quick", // https://github.com/Quick/Quick + "QuickObjCRuntime", // https://github.com/Quick/Quick "RxTest", // https://github.com/ReactiveX/RxSwift "RxTest-Dynamic", // https://github.com/ReactiveX/RxSwift "SnapshotTesting", // https://github.com/pointfreeco/swift-snapshot-testing From 51405682b0f934e2f1061061305981c4dabd3b38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 28 Jun 2024 12:29:09 +0200 Subject: [PATCH 388/509] Run only TuistDependenciesAcceptanceTests in the tuist_dependencies_acceptance_tests workflow (#6457) --- codemagic.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemagic.yaml b/codemagic.yaml index 7535ef5f6c3..8d7f3a6b2e8 100644 --- a/codemagic.yaml +++ b/codemagic.yaml @@ -201,7 +201,7 @@ workflows: - name: Install Tuist dependencies script: mise x -- tuist install - name: Run tests - script: mise x -- tuist test + script: mise x -- tuist test TuistDependenciesAcceptanceTests triggering: << : *branch_triggering From 242180b9f88a5167173e8378bc59fc32d431920e Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Fri, 28 Jun 2024 11:51:57 -0400 Subject: [PATCH 389/509] Reduce direct access to `.shared` singletons (#6381) * Migrate `SwiftPackageManagerController` off singletons * MIgrate `SimulatorController` and `XcodeBuildController` off singltons (mostly) * Migrate away from direct calls to DeveloperEnvironment.shared * Migrate Formatter off `Environment.shared` * Migrate `GitHandler` off `System.shared` * Migrate `ManifestLoaderFactory` off `Environment.shared` * linting * Move .shared access to default parameter values on `SimulatorController` --- .../TuistAutomation/Utilities/Formatter.swift | 10 +++--- .../XcodeBuild/XcodeBuildController.swift | 18 +++++++---- .../Simulator/SimulatorController.swift | 31 +++++++++++------- .../ProjectEditor/ProjectEditorMapper.swift | 5 ++- .../TuistKit/Services/InstallService.swift | 5 ++- .../Plugin/PluginArchiveService.swift | 5 ++- .../TuistLoader/Loaders/ManifestLoader.swift | 2 +- .../Loaders/ManifestLoaderFactory.swift | 4 +-- .../Loaders/PackageSettingsLoader.swift | 5 ++- .../SwiftPackageManagerGraphLoader.swift | 5 ++- .../SwiftPackageManagerController.swift | 32 +++++++++++-------- .../Utils/DerivedDataLocator.swift | 8 +++-- Sources/TuistSupport/Utils/GitHandler.swift | 9 ++++-- .../Simulator/SimulatorControllerTests.swift | 2 +- .../SwiftPackageManagerControllerTests.swift | 2 +- 15 files changed, 92 insertions(+), 51 deletions(-) diff --git a/Sources/TuistAutomation/Utilities/Formatter.swift b/Sources/TuistAutomation/Utilities/Formatter.swift index aef2a924292..cdb3fbf69f0 100644 --- a/Sources/TuistAutomation/Utilities/Formatter.swift +++ b/Sources/TuistAutomation/Utilities/Formatter.swift @@ -10,10 +10,10 @@ protocol Formatting { final class Formatter: Formatting { private let formatter: XCBeautifier - init() { + init(environment: Environmenting = Environment.shared) { formatter = XCBeautifier( - colored: Environment.shared.shouldOutputBeColoured, - renderer: Self.renderer(), + colored: environment.shouldOutputBeColoured, + renderer: Self.renderer(for: environment), preserveUnbeautifiedLines: false, additionalLines: { nil } ) @@ -23,8 +23,8 @@ final class Formatter: Formatting { formatter.format(line: line) } - private static func renderer() -> Renderer { - if Environment.shared.isGitHubActions { + private static func renderer(for environment: Environmenting) -> Renderer { + if environment.isGitHubActions { return .gitHubActions } else { return .terminal diff --git a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift index a89a21385ab..789a0384c6c 100644 --- a/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift +++ b/Sources/TuistAutomation/XcodeBuild/XcodeBuildController.swift @@ -17,6 +17,8 @@ public final class XcodeBuildController: XcodeBuildControlling { private let formatter: Formatting private let environment: Environmenting + private let simulatorController: SimulatorController + private let system: Systeming public convenience init() { self.init(formatter: Formatter(), environment: Environment.shared) @@ -28,6 +30,8 @@ public final class XcodeBuildController: XcodeBuildControlling { ) { self.formatter = formatter self.environment = environment + self.simulatorController = SimulatorController() + self.system = System.shared } public func build( @@ -69,7 +73,7 @@ public final class XcodeBuildController: XcodeBuildControlling { } command.append(contentsOf: ["-destination", value.joined(separator: ",")]) case .mac: - command.append(contentsOf: ["-destination", SimulatorController().macOSDestination()]) + command.append(contentsOf: ["-destination", simulatorController.macOSDestination()]) case nil: break } @@ -131,7 +135,7 @@ public final class XcodeBuildController: XcodeBuildControlling { } command.append(contentsOf: ["-destination", value.joined(separator: ",")]) case .mac: - command.append(contentsOf: ["-destination", SimulatorController().macOSDestination()]) + command.append(contentsOf: ["-destination", simulatorController.macOSDestination()]) } // Derived data path @@ -310,10 +314,10 @@ public final class XcodeBuildController: XcodeBuildControlling { logger.debug("Running xcodebuild command: \(command.joined(separator: " "))") - try System.shared.run(command, - verbose: false, - environment: System.shared.env, - redirection: .stream(stdout: { bytes in + try system.run(command, + verbose: false, + environment: system.env, + redirection: .stream(stdout: { bytes in log(bytes) }, stderr: { bytes in log(bytes, isError: true) @@ -328,7 +332,7 @@ public final class XcodeBuildController: XcodeBuildControlling { // like that's happening. return try await Task.retrying(maxRetryCount: 5) { let systemTask = Task { - return try await System.shared.runAndCollectOutput(command).standardOutput + return try await self.system.runAndCollectOutput(command).standardOutput } let timeoutTask = Task { diff --git a/Sources/TuistCore/Simulator/SimulatorController.swift b/Sources/TuistCore/Simulator/SimulatorController.swift index 41904726750..faa629ad1a8 100644 --- a/Sources/TuistCore/Simulator/SimulatorController.swift +++ b/Sources/TuistCore/Simulator/SimulatorController.swift @@ -97,13 +97,22 @@ public final class SimulatorController: SimulatorControlling { private let jsonDecoder = JSONDecoder() private let userInputReader: UserInputReading - public init(userInputReader: UserInputReading = UserInputReader()) { + private let system: Systeming + private let devEnvironment: DeveloperEnvironmenting + + public init( + userInputReader: UserInputReading = UserInputReader(), + system: Systeming = System.shared, + devEnvironment: DeveloperEnvironmenting = DeveloperEnvironment.shared + ) { self.userInputReader = userInputReader + self.system = system + self.devEnvironment = devEnvironment } /// Returns the list of simulator devices that are available in the system. func devices() async throws -> [SimulatorDevice] { - let output = try await System.shared.runAndCollectOutput(["/usr/bin/xcrun", "simctl", "list", "devices", "--json"]) + let output = try await system.runAndCollectOutput(["/usr/bin/xcrun", "simctl", "list", "devices", "--json"]) let data = output.standardOutput.data(using: .utf8)! let json = try JSONSerialization.jsonObject(with: data, options: []) guard let dictionary = json as? [String: Any], @@ -125,7 +134,7 @@ public final class SimulatorController: SimulatorControlling { /// Returns the list of simulator runtimes that are available in the system. func runtimes() async throws -> [SimulatorRuntime] { - let output = try await System.shared.runAndCollectOutput(["/usr/bin/xcrun", "simctl", "list", "runtimes", "--json"]) + let output = try await system.runAndCollectOutput(["/usr/bin/xcrun", "simctl", "list", "runtimes", "--json"]) let data = output.standardOutput.data(using: .utf8)! let json = try JSONSerialization.jsonObject(with: data, options: []) guard let dictionary = json as? [String: Any], @@ -241,15 +250,15 @@ public final class SimulatorController: SimulatorControlling { public func installApp(at path: AbsolutePath, device: SimulatorDevice) throws { logger.debug("Installing app at \(path) on simulator device with id \(device.udid)") - let device = try device.booted() - try System.shared.run(["/usr/bin/xcrun", "simctl", "install", device.udid, path.pathString]) + let device = try device.booted(using: system) + try system.run(["/usr/bin/xcrun", "simctl", "install", device.udid, path.pathString]) } public func launchApp(bundleId: String, device: SimulatorDevice, arguments: [String]) throws { logger.debug("Launching app with bundle id \(bundleId) on simulator device with id \(device.udid)") - let device = try device.booted() - try System.shared.run(["/usr/bin/open", "-a", "Simulator"]) - try System.shared.run(["/usr/bin/xcrun", "simctl", "launch", device.udid, bundleId] + arguments) + let device = try device.booted(using: system) + try system.run(["/usr/bin/open", "-a", "Simulator"]) + try system.run(["/usr/bin/xcrun", "simctl", "launch", device.udid, bundleId] + arguments) } /// https://www.mokacoding.com/blog/xcodebuild-destination-options/ @@ -280,7 +289,7 @@ public final class SimulatorController: SimulatorControlling { public func macOSDestination() -> String { let arch: String - switch DeveloperEnvironment.shared.architecture { + switch devEnvironment.architecture { case .arm64: arch = "arm64" case .x8664: @@ -293,9 +302,9 @@ public final class SimulatorController: SimulatorControlling { extension SimulatorDevice { /// Attempts to boot the simulator. /// - returns: The `SimulatorDevice` with updated `isShutdown` field. - fileprivate func booted() throws -> Self { + fileprivate func booted(using system: Systeming) throws -> Self { guard isShutdown else { return self } - try System.shared.run(["/usr/bin/xcrun", "simctl", "boot", udid]) + try system.run(["/usr/bin/xcrun", "simctl", "boot", udid]) return SimulatorDevice( dataPath: dataPath, logPath: logPath, diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift index 3bbf06d2cc5..125cabb882a 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift @@ -30,7 +30,10 @@ final class ProjectEditorMapper: ProjectEditorMapping { private let swiftPackageManagerController: SwiftPackageManagerControlling init( - swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController() + swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController( + system: System.shared, + fileHandler: FileHandler.shared + ) ) { self.swiftPackageManagerController = swiftPackageManagerController } diff --git a/Sources/TuistKit/Services/InstallService.swift b/Sources/TuistKit/Services/InstallService.swift index 0c09424cf14..64382e25dbf 100644 --- a/Sources/TuistKit/Services/InstallService.swift +++ b/Sources/TuistKit/Services/InstallService.swift @@ -17,7 +17,10 @@ final class InstallService { init( pluginService: PluginServicing = PluginService(), configLoader: ConfigLoading = ConfigLoader(manifestLoader: CachedManifestLoader()), - swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController(), + swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController( + system: System.shared, + fileHandler: FileHandler.shared + ), fileHandler: FileHandling = FileHandler.shared, manifestFilesLocator: ManifestFilesLocating = ManifestFilesLocator() ) { diff --git a/Sources/TuistKit/Services/Plugin/PluginArchiveService.swift b/Sources/TuistKit/Services/Plugin/PluginArchiveService.swift index 8b2506e0e48..1b3b494f04a 100644 --- a/Sources/TuistKit/Services/Plugin/PluginArchiveService.swift +++ b/Sources/TuistKit/Services/Plugin/PluginArchiveService.swift @@ -11,7 +11,10 @@ final class PluginArchiveService { private let fileArchiverFactory: FileArchivingFactorying init( - swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController(), + swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController( + system: System.shared, + fileHandler: FileHandler.shared + ), manifestLoader: ManifestLoading = ManifestLoader(), fileArchiverFactory: FileArchivingFactorying = FileArchivingFactory() ) { diff --git a/Sources/TuistLoader/Loaders/ManifestLoader.swift b/Sources/TuistLoader/Loaders/ManifestLoader.swift index 15a3a6e806f..03a0c09dce4 100644 --- a/Sources/TuistLoader/Loaders/ManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/ManifestLoader.swift @@ -123,7 +123,7 @@ public class ManifestLoader: ManifestLoading { projectDescriptionHelpersBuilderFactory: ProjectDescriptionHelpersBuilderFactory(), manifestFilesLocator: ManifestFilesLocator(), xcodeController: XcodeController.shared, - swiftPackageManagerController: SwiftPackageManagerController() + swiftPackageManagerController: SwiftPackageManagerController(system: System.shared, fileHandler: FileHandler.shared) ) } diff --git a/Sources/TuistLoader/Loaders/ManifestLoaderFactory.swift b/Sources/TuistLoader/Loaders/ManifestLoaderFactory.swift index 4d03b1d78ce..9ea7ff0e573 100644 --- a/Sources/TuistLoader/Loaders/ManifestLoaderFactory.swift +++ b/Sources/TuistLoader/Loaders/ManifestLoaderFactory.swift @@ -3,8 +3,8 @@ import TuistSupport public final class ManifestLoaderFactory { private let useCache: Bool - public convenience init() { - let cacheSetting = Environment.shared.tuistConfigVariables[Constants.EnvironmentVariables.cacheManifests, default: "1"] + public convenience init(environment: Environmenting = Environment.shared) { + let cacheSetting = environment.tuistConfigVariables[Constants.EnvironmentVariables.cacheManifests, default: "1"] self.init(useCache: cacheSetting == "1") } diff --git a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift index 07b81cc7a02..b46df11489f 100644 --- a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift +++ b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift @@ -23,7 +23,10 @@ public final class PackageSettingsLoader: PackageSettingsLoading { public init( manifestLoader: ManifestLoading = ManifestLoader(), - swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController(), + swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController( + system: System.shared, + fileHandler: FileHandler.shared + ), fileHandler: FileHandling = FileHandler.shared, manifestFilesLocator: ManifestFilesLocating = ManifestFilesLocator() ) { diff --git a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift index 0bc42be5043..6de7ef6d367 100644 --- a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift +++ b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift @@ -59,7 +59,10 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi private let fileHandler: FileHandling public init( - swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController(), + swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController( + system: System.shared, + fileHandler: FileHandler.shared + ), packageInfoMapper: PackageInfoMapping = PackageInfoMapper(), manifestLoader: ManifestLoading = ManifestLoader(), fileHandler: FileHandling = FileHandler.shared diff --git a/Sources/TuistSupport/SwiftPackageManager/SwiftPackageManagerController.swift b/Sources/TuistSupport/SwiftPackageManager/SwiftPackageManagerController.swift index 00a9ae517d8..189f9d5ab72 100644 --- a/Sources/TuistSupport/SwiftPackageManager/SwiftPackageManagerController.swift +++ b/Sources/TuistSupport/SwiftPackageManager/SwiftPackageManagerController.swift @@ -45,22 +45,28 @@ public protocol SwiftPackageManagerControlling { } public final class SwiftPackageManagerController: SwiftPackageManagerControlling { - public init() {} + let system: Systeming + let fileHandler: FileHandling + + public init(system: Systeming, fileHandler: FileHandling) { + self.system = system + self.fileHandler = fileHandler + } public func resolve(at path: AbsolutePath, printOutput: Bool) throws { let command = buildSwiftPackageCommand(packagePath: path, extraArguments: ["resolve"]) printOutput ? - try System.shared.runAndPrint(command) : - try System.shared.run(command) + try system.runAndPrint(command) : + try system.run(command) } public func update(at path: AbsolutePath, printOutput: Bool) throws { let command = buildSwiftPackageCommand(packagePath: path, extraArguments: ["update"]) printOutput ? - try System.shared.runAndPrint(command) : - try System.shared.run(command) + try system.runAndPrint(command) : + try system.run(command) } public func setToolsVersion(at path: AbsolutePath, to version: Version) throws { @@ -68,7 +74,7 @@ public final class SwiftPackageManagerController: SwiftPackageManagerControlling let command = buildSwiftPackageCommand(packagePath: path, extraArguments: extraArguments) - try System.shared.run(command) + try system.run(command) } public func getToolsVersion(at path: AbsolutePath) throws -> Version { @@ -76,14 +82,14 @@ public final class SwiftPackageManagerController: SwiftPackageManagerControlling let command = buildSwiftPackageCommand(packagePath: path, extraArguments: extraArguments) - let rawVersion = try System.shared.capture(command).trimmingCharacters(in: .whitespacesAndNewlines) + let rawVersion = try system.capture(command).trimmingCharacters(in: .whitespacesAndNewlines) return try Version(versionString: rawVersion) } public func loadPackageInfo(at path: AbsolutePath) throws -> PackageInfo { let command = buildSwiftPackageCommand(packagePath: path, extraArguments: ["dump-package"]) - let json = try System.shared.capture(command) + let json = try system.capture(command) let data = Data(json.utf8) let decoder = JSONDecoder() @@ -109,22 +115,22 @@ public final class SwiftPackageManagerController: SwiftPackageManagerControlling let arm64Target = "arm64-apple-macosx" let x64Target = "x86_64-apple-macosx" - try System.shared.run( + try system.run( buildCommand + [ arm64Target, ] ) - try System.shared.run( + try system.run( buildCommand + [ x64Target, ] ) - if !FileHandler.shared.exists(outputPath) { - try FileHandler.shared.createFolder(outputPath) + if !fileHandler.exists(outputPath) { + try fileHandler.createFolder(outputPath) } - try System.shared.run([ + try system.run([ "lipo", "-create", "-output", outputPath.appending(component: product).pathString, buildPath.appending(components: arm64Target, "release", product).pathString, buildPath.appending(components: x64Target, "release", product).pathString, diff --git a/Sources/TuistSupport/Utils/DerivedDataLocator.swift b/Sources/TuistSupport/Utils/DerivedDataLocator.swift index b7d4c12c76c..bbecde39a1f 100644 --- a/Sources/TuistSupport/Utils/DerivedDataLocator.swift +++ b/Sources/TuistSupport/Utils/DerivedDataLocator.swift @@ -9,13 +9,17 @@ public protocol DerivedDataLocating { } public final class DerivedDataLocator: DerivedDataLocating { - public init() {} + private let devEnvironment: DeveloperEnvironmenting + + public init(devEnvironment: DeveloperEnvironmenting = DeveloperEnvironment.shared) { + self.devEnvironment = devEnvironment + } public func locate( for projectPath: AbsolutePath ) throws -> AbsolutePath { let hash = try XcodeProjectPathHasher.hashString(for: projectPath.pathString) - return DeveloperEnvironment.shared.derivedDataDirectory + return devEnvironment.derivedDataDirectory .appending(component: "\(projectPath.basenameWithoutExt)-\(hash)") } } diff --git a/Sources/TuistSupport/Utils/GitHandler.swift b/Sources/TuistSupport/Utils/GitHandler.swift index b2d932b381f..d0abfdd01ab 100644 --- a/Sources/TuistSupport/Utils/GitHandler.swift +++ b/Sources/TuistSupport/Utils/GitHandler.swift @@ -42,11 +42,14 @@ public protocol GitHandling { /// Uses the system to execute git commands. public final class GitHandler: GitHandling { private let system: Systeming + private let environment: Environmenting public init( - system: Systeming = System.shared + system: Systeming = System.shared, + environment: Environmenting = Environment.shared ) { self.system = system + self.environment = environment } public func clone(url: String, into path: AbsolutePath) throws { @@ -75,7 +78,7 @@ public final class GitHandler: GitHandling { } private func run(command: String...) throws { - if Environment.shared.isVerbose { + if environment.isVerbose { try system.runAndPrint(command, verbose: true, environment: System.shared.env) } else { try system.run(command) @@ -83,7 +86,7 @@ public final class GitHandler: GitHandling { } private func capture(command: String...) throws -> String { - if Environment.shared.isVerbose { + if environment.isVerbose { return try system.capture(command, verbose: true, environment: System.shared.env) } else { return try system.capture(command) diff --git a/Tests/TuistCoreTests/Simulator/SimulatorControllerTests.swift b/Tests/TuistCoreTests/Simulator/SimulatorControllerTests.swift index 14d1081a418..aead8af0b52 100644 --- a/Tests/TuistCoreTests/Simulator/SimulatorControllerTests.swift +++ b/Tests/TuistCoreTests/Simulator/SimulatorControllerTests.swift @@ -11,7 +11,7 @@ final class SimulatorControllerTests: TuistUnitTestCase { override func setUp() { super.setUp() - subject = SimulatorController() + subject = SimulatorController(system: system) } override func tearDown() { diff --git a/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift b/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift index fad8cd81276..5f226826288 100644 --- a/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift +++ b/Tests/TuistSupportTests/SwiftPackageManager/SwiftPackageManagerControllerTests.swift @@ -12,7 +12,7 @@ final class SwiftPackageManagerControllerTests: TuistUnitTestCase { override func setUp() { super.setUp() - subject = SwiftPackageManagerController() + subject = SwiftPackageManagerController(system: system, fileHandler: fileHandler) } override func tearDown() { From b9003a64fd1aab836d51fd9031142769a6ba3914 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Sat, 29 Jun 2024 08:01:23 +0200 Subject: [PATCH 390/509] Reference Elixir metrics (#6449) --- docs/.vitepress/config.mjs | 14 +- docs/docs/cloud/on-premise.md | 39 +--- docs/docs/cloud/on-premise/metrics.md | 257 ++++++++++++++++++++++++++ 3 files changed, 269 insertions(+), 41 deletions(-) create mode 100644 docs/docs/cloud/on-premise/metrics.md diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 96ae1e70f3e..a03f0d2826c 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -35,7 +35,7 @@ function generateNestedSidebarItems(items) { const nestedItems = {}; items.forEach((item) => { - const category = item.category + const category = item.category; if (!nestedItems[category]) { nestedItems[category] = { text: capitalize(category), @@ -43,7 +43,10 @@ function generateNestedSidebarItems(items) { items: [], }; } - nestedItems[category].items.push({ text: item.title, link: `/reference/cli/${item.command}` }); + nestedItems[category].items.push({ + text: item.title, + link: `/reference/cli/${item.command}`, + }); }); function isLinkItem(item) { @@ -68,7 +71,6 @@ function generateNestedSidebarItems(items) { return convertToArray(nestedItems); } - const cliData = cliDataLoader.load(); const cliSidebar = { @@ -202,6 +204,12 @@ const guideSidebar = [ { text: "On-premise", link: "/cloud/on-premise", + items: [ + { + text: "Metrics", + link: "/cloud/on-premise/metrics", + }, + ], }, ], }, diff --git a/docs/docs/cloud/on-premise.md b/docs/docs/cloud/on-premise.md index c7f5c3c8ef8..d45be442f82 100644 --- a/docs/docs/cloud/on-premise.md +++ b/docs/docs/cloud/on-premise.md @@ -313,41 +313,4 @@ services: volumes: db: driver: local -``` - -## Metrics - -You can ingest metrics gathered by the Tuist server using [Prometheus](https://prometheus.io/) and a visualization tool such as [Grafana](https://grafana.com/) to create a custom dashboard tailored to your needs. The Prometheus metrics are served via the `/metrics` endpoint. The Prometheus' [scrape_interval](https://prometheus.io/docs/introduction/first_steps/#configuring-prometheus) should be set as less than 10_000 seconds (we recommend keeping the default of 15 seconds). - -### Runs metrics - -A set of metrics related to Tuist Runs. - -#### `tuist_runs_total` (counter) - -The total number of Tuist Runs. - -**Tags:** -- `name` – name of the `tuist` command that was run, such as `build`, `test`, etc. -- `is_ci` – a boolean indicating if the executor was a CI or a developer's machine. -- `status` – `0` in case of `success`, `1` in case of `failure` - -#### `tuist_runs_duration_milliseconds` (histogram) - -The total duration of each tuist run in milliseconds. - -**Tags:** -- `name` – name of the `tuist` command that was run, such as `build`, `test`, etc. -- `is_ci` – a boolean indicating if the executor was a CI or a developer's machine. -- `status` – `0` in case of `success`, `1` in case of `failure` - -### Cache metrics - -A set of metrics related to the Tuist Cache. - -#### `tuist_cache_events_total` (counter) - -The total number of Tuist Binary Cache events. - -**Tags:** -- `event_type`: Can be either of `local_hit`, `remote_hit`, or `miss`. +``` \ No newline at end of file diff --git a/docs/docs/cloud/on-premise/metrics.md b/docs/docs/cloud/on-premise/metrics.md new file mode 100644 index 00000000000..1fa0f0047b0 --- /dev/null +++ b/docs/docs/cloud/on-premise/metrics.md @@ -0,0 +1,257 @@ +--- +title: On-premise metrics +titleTemplate: ':title - Tuist Cloud' +description: Optimize your build times by caching compiled binaries and sharing them across different environments. +--- + + +# Metrics + +You can ingest metrics gathered by the Tuist server using [Prometheus](https://prometheus.io/) and a visualization tool such as [Grafana](https://grafana.com/) to create a custom dashboard tailored to your needs. The Prometheus metrics are served via the `/metrics` endpoint. The Prometheus' [scrape_interval](https://prometheus.io/docs/introduction/first_steps/#configuring-prometheus) should be set as less than 10_000 seconds (we recommend keeping the default of 15 seconds). + +## Elixir metrics + +By default we include metrics of the Elixir runtime, [BEAM](https://en.wikipedia.org/wiki/BEAM_(Erlang_virtual_machine)), Elixir, and some of the libraries we use. The following are some of the metrics you can expect to see: +- [Application](https://hexdocs.pm/prom_ex/PromEx.Plugins.Application.html) +- [BEAM](https://hexdocs.pm/prom_ex/PromEx.Plugins.Beam.html) +- [Phoenix](https://hexdocs.pm/prom_ex/PromEx.Plugins.Phoenix.html) +- [Phoenix LiveView](https://hexdocs.pm/prom_ex/PromEx.Plugins.PhoenixLiveView.html) +- [Ecto](https://hexdocs.pm/prom_ex/PromEx.Plugins.Ecto.html) +- [Oban](https://hexdocs.pm/prom_ex/PromEx.Plugins.Oban.html) + +We recommend checking those pages to know which metrics are available and how to use them. + +## Runs metrics + +A set of metrics related to Tuist Runs. + +### `tuist_runs_total` (counter) + +The total number of Tuist Runs. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `name` | The name of the `tuist` command that was run, such as `build`, `test`, etc. | +| `is_ci` | A boolean indicating if the executor was a CI or a developer's machine. | +| `status` | `0` in case of `success`, `1` in case of `failure`. | + +### `tuist_runs_duration_milliseconds` (histogram) + +The total duration of each tuist run in milliseconds. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `name` | The name of the `tuist` command that was run, such as `build`, `test`, etc. | +| `is_ci` | A boolean indicating if the executor was a CI or a developer's machine. | +| `status` | `0` in case of `success`, `1` in case of `failure`. | + +## Cache metrics + +A set of metrics related to the Tuist Cache. + +### `tuist_cache_events_total` (counter) + +The total number of Tuist Binary Cache events. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `event_type` | Can be either of `local_hit`, `remote_hit`, or `miss`. | + +--- + +## Storage metrics + +A set of metrics related to the storage of artifacts in a remote storage (e.g. s3). + +> [!TIP] +> These metrics are useful to understand the performance of the storage operations and to identify potential bottlenecks. + +### `tuist_storage_get_object_size_size_bytes` (histogram) + +The size (in bytes) of an object fetched from the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | + + +### `tuist_storage_get_object_size_duration_miliseconds` (histogram) + +The duration (in milliseconds) of fetching an object size from the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | + + +### `tuist_storage_get_object_size_count` (counter) + +The number of times an object size was fetched from the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | + +### `tuist_storage_delete_all_objects_duration_milliseconds` (histogram) + +The duration (in milliseconds) of deleting all objects from the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `project_slug` | The project slug of the project whose objects are being deleted. | + + +### `tuist_storage_delete_all_objects_count` (counter) + +The number of times all project objects were deleted from the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `project_slug` | The project slug of the project whose objects are being deleted. | + + +### `tuist_storage_multipart_start_upload_duration_milliseconds` (histogram) + +The duration (in milliseconds) of starting an upload to the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | + +### `tuist_storage_multipart_start_upload_duration_count` (counter) + +The number of times an upload was started to the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | + + +### `tuist_storage_get_object_as_string_duration_milliseconds` (histogram) + +The duration (in milliseconds) of fetching an object as a string from the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | + +### `tuist_storage_get_object_as_string_count` (count) + +The number of times an object was fetched as a string from the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | + + +### `tuist_storage_check_object_existence_duration_milliseconds` (histogram) + +The duration (in milliseconds) of checking the existence of an object in the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | + +### `tuist_storage_check_object_existence_count` (count) + +The number of times the existence of an object was checked in the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | + +### `tuist_storage_generate_download_presigned_url_duration_milliseconds` (histogram) + +The duration (in milliseconds) of generating a download presigned URL for an object in the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | + + +### `tuist_storage_generate_download_presigned_url_count` (count) + +The number of times a download presigned URL was generated for an object in the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | + +### `tuist_storage_multipart_generate_upload_part_presigned_url_duration_milliseconds` (histogram) + +The duration (in milliseconds) of generating a part upload presigned URL for an object in the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | +| `part_number` | The part number of the object being uploaded. | +| `upload_id` | The upload ID of the multipart upload. | + +### `tuist_storage_multipart_generate_upload_part_presigned_url_count` (count) + +The number of times a part upload presigned URL was generated for an object in the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | +| `part_number` | The part number of the object being uploaded. | +| `upload_id` | The upload ID of the multipart upload. | + +### `tuist_storage_multipart_complete_upload_duration_milliseconds` (histogram) + +The duration (in milliseconds) of completing an upload to the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | +| `upload_id` | The upload ID of the multipart upload. | + + +### `tuist_storage_multipart_complete_upload_count` (count) + +The total number of times an upload was completed to the remote storage. + +#### Tags + +| Tag | Description | +|--- | ---- | +| `object_key` | The lookup key of the object in the remote storage. | +| `upload_id` | The upload ID of the multipart upload. | \ No newline at end of file From 592a1cdabcd25212acdf8a98b92509ffd993e1e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Sun, 30 Jun 2024 18:41:52 +0200 Subject: [PATCH 391/509] Provide better error message for a missing Tuist server token (#6450) --- Package.swift | 1 + Sources/TuistKit/Commands/TuistCommand.swift | 7 +++++++ .../Client/CloudClientAuthenticationMiddleware.swift | 8 ++++---- Tuist/ProjectDescriptionHelpers/Module.swift | 1 + 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Package.swift b/Package.swift index f4669694e6f..baaa97b9c2e 100644 --- a/Package.swift +++ b/Package.swift @@ -70,6 +70,7 @@ var targets: [Target] = [ "XcodeGraph", "Mockable", "TuistServer", + .product(name: "OpenAPIRuntime", package: "swift-openapi-runtime"), ], swiftSettings: [ .define("MOCKING", .when(configuration: .debug)), diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index 9084616f74b..1e4b2136658 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -1,8 +1,10 @@ @_exported import ArgumentParser import Foundation +import OpenAPIRuntime import Path import TuistAnalytics import TuistLoader +import TuistServer import TuistSupport public struct TuistCommand: AsyncParsableCommand { @@ -87,6 +89,11 @@ public struct TuistCommand: AsyncParsableCommand { WarningController.shared.flush() errorHandler.fatal(error: error) _exit(exitCode(for: error).rawValue) + } catch let error as ClientError where error.underlyingError is CloudClientAuthenticationError { + WarningController.shared.flush() + // swiftlint:disable:next force_cast + logger.error("\((error.underlyingError as! CloudClientAuthenticationError).description)") + _exit(exitCode(for: error).rawValue) } catch { WarningController.shared.flush() if let parsedError { diff --git a/Sources/TuistServer/Client/CloudClientAuthenticationMiddleware.swift b/Sources/TuistServer/Client/CloudClientAuthenticationMiddleware.swift index c30c6d9a9b6..41ca8f192cb 100644 --- a/Sources/TuistServer/Client/CloudClientAuthenticationMiddleware.swift +++ b/Sources/TuistServer/Client/CloudClientAuthenticationMiddleware.swift @@ -2,20 +2,20 @@ import Foundation import OpenAPIRuntime import TuistSupport -enum CloudClientAuthenticationError: FatalError { +public enum CloudClientAuthenticationError: FatalError { case notAuthenticated - var type: ErrorType { + public var type: ErrorType { switch self { case .notAuthenticated: return .abort } } - var description: String { + public var description: String { switch self { case .notAuthenticated: - return "No cloud authentication token found. Authenticate by running `tuist cloud auth`." + return "No Tuist authentication token found. Authenticate by running `tuist cloud auth`." } } } diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index 49784886cce..81e642f5bff 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -256,6 +256,7 @@ public enum Module: String, CaseIterable { .external(name: "ArgumentParser"), .external(name: "GraphViz"), .external(name: "AnyCodable"), + .external(name: "OpenAPIRuntime"), ] case .core: [ From 26ffe1b5a2e8addfeae81c9072205c2cbb58c418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Sun, 30 Jun 2024 18:42:42 +0200 Subject: [PATCH 392/509] Fix deleting Tuist project and organization (#6455) * Fix deleting Tuist project and organization * Update codemagic pipelines * Revert Tuist fixture URL to canary * Lint fix * Add Tuist server credentials to all acceptance tests --- Project.swift | 4 ++++ Sources/TuistServer/OpenAPI/Client.swift | 12 +---------- Sources/TuistServer/OpenAPI/Types.swift | 12 +++++------ Sources/TuistServer/OpenAPI/cloud.yml | 4 +--- .../Services/DeleteProjectService.swift | 2 +- .../BuildRulesAcceptanceTests.swift | 0 .../EditAcceptanceTests.swift | 0 .../GraphAcceptanceTests.swift | 0 .../InitAcceptanceTests.swift | 0 .../ListTargetsAcceptanceTests.swift | 0 .../PluginAcceptanceTests.swift | 0 .../PrecompiledAcceptanceTests.swift | 0 .../RunAcceptanceTests.swift | 0 .../ScaffoldAcceptanceTests.swift | 0 .../ServerAcceptanceTests.swift | 21 +++++++++++++++++++ Tuist/ProjectDescriptionHelpers/Module.swift | 20 +++++++++--------- codemagic.yaml | 6 +++--- 17 files changed, 46 insertions(+), 35 deletions(-) rename Tests/{TuistAcceptanceTests => TuistKitAcceptanceTests}/BuildRulesAcceptanceTests.swift (100%) rename Tests/{TuistAcceptanceTests => TuistKitAcceptanceTests}/EditAcceptanceTests.swift (100%) rename Tests/{TuistAcceptanceTests => TuistKitAcceptanceTests}/GraphAcceptanceTests.swift (100%) rename Tests/{TuistAcceptanceTests => TuistKitAcceptanceTests}/InitAcceptanceTests.swift (100%) rename Tests/{TuistAcceptanceTests => TuistKitAcceptanceTests}/ListTargetsAcceptanceTests.swift (100%) rename Tests/{TuistAcceptanceTests => TuistKitAcceptanceTests}/PluginAcceptanceTests.swift (100%) rename Tests/{TuistAcceptanceTests => TuistKitAcceptanceTests}/PrecompiledAcceptanceTests.swift (100%) rename Tests/{TuistAcceptanceTests => TuistKitAcceptanceTests}/RunAcceptanceTests.swift (100%) rename Tests/{TuistAcceptanceTests => TuistKitAcceptanceTests}/ScaffoldAcceptanceTests.swift (100%) create mode 100644 Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift diff --git a/Project.swift b/Project.swift index c2ec54b314c..608b885c025 100644 --- a/Project.swift +++ b/Project.swift @@ -44,6 +44,8 @@ func schemes() -> [Scheme] { environmentVariables: [ "TUIST_CONFIG_SRCROOT": "$(SRCROOT)", "TUIST_FRAMEWORK_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", + "CI": "true", + "TUIST_CONFIG_CLOUD_TOKEN": "i1932DHAyBwEtHCsRYyE2Ub6ReHNwQ", ] ) ) @@ -94,6 +96,8 @@ func schemes() -> [Scheme] { environmentVariables: [ "TUIST_CONFIG_SRCROOT": "$(SRCROOT)", "TUIST_FRAMEWORK_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", + "CI": "true", + "TUIST_CONFIG_CLOUD_TOKEN": "i1932DHAyBwEtHCsRYyE2Ub6ReHNwQ", ] ) ) diff --git a/Sources/TuistServer/OpenAPI/Client.swift b/Sources/TuistServer/OpenAPI/Client.swift index 0b7001db816..0a59c71e16e 100644 --- a/Sources/TuistServer/OpenAPI/Client.swift +++ b/Sources/TuistServer/OpenAPI/Client.swift @@ -1331,17 +1331,7 @@ public struct Client: APIProtocol { switch response.statusCode { case 204: let headers: Operations.deleteOrganization.Output.NoContent.Headers = .init() - try converter.validateContentTypeIfPresent( - in: response.headerFields, - substring: "application/json" - ) - let body: Operations.deleteOrganization.Output.NoContent.Body = - try converter.getResponseBodyAsJSON( - OpenAPIRuntime.OpenAPIValueContainer.self, - from: response.body, - transforming: { value in .json(value) } - ) - return .noContent(.init(headers: headers, body: body)) + return .noContent(.init(headers: headers, body: nil)) case 401: let headers: Operations.deleteOrganization.Output.Unauthorized.Headers = .init() try converter.validateContentTypeIfPresent( diff --git a/Sources/TuistServer/OpenAPI/Types.swift b/Sources/TuistServer/OpenAPI/Types.swift index fec1984dad8..772d68cda42 100644 --- a/Sources/TuistServer/OpenAPI/Types.swift +++ b/Sources/TuistServer/OpenAPI/Types.swift @@ -4257,11 +4257,9 @@ public enum Operations { } /// Received HTTP response headers public var headers: Operations.deleteOrganization.Output.NoContent.Headers - @frozen public enum Body: Sendable, Equatable, Hashable { - case json(OpenAPIRuntime.OpenAPIValueContainer) - } + @frozen public enum Body: Sendable, Equatable, Hashable {} /// Received HTTP response body - public var body: Operations.deleteOrganization.Output.NoContent.Body + public var body: Operations.deleteOrganization.Output.NoContent.Body? /// Creates a new `NoContent`. /// /// - Parameters: @@ -4269,7 +4267,7 @@ public enum Operations { /// - body: Received HTTP response body public init( headers: Operations.deleteOrganization.Output.NoContent.Headers = .init(), - body: Operations.deleteOrganization.Output.NoContent.Body + body: Operations.deleteOrganization.Output.NoContent.Body? = nil ) { self.headers = headers self.body = body @@ -6245,12 +6243,12 @@ public enum Operations { public static let id: String = "deleteProject" public struct Input: Sendable, Equatable, Hashable { public struct Path: Sendable, Equatable, Hashable { - public var id: Swift.Double + public var id: Swift.Int /// Creates a new `Path`. /// /// - Parameters: /// - id: - public init(id: Swift.Double) { self.id = id } + public init(id: Swift.Int) { self.id = id } } public var path: Operations.deleteProject.Input.Path public struct Query: Sendable, Equatable, Hashable { diff --git a/Sources/TuistServer/OpenAPI/cloud.yml b/Sources/TuistServer/OpenAPI/cloud.yml index 6afe1bff6a3..169362a5b35 100644 --- a/Sources/TuistServer/OpenAPI/cloud.yml +++ b/Sources/TuistServer/OpenAPI/cloud.yml @@ -1027,8 +1027,6 @@ paths: type: string responses: 204: - content: - application/json: {} description: The organization was deleted 401: content: @@ -1641,7 +1639,7 @@ paths: name: id required: true schema: - type: number + type: integer responses: 204: description: The project was successfully deleted. diff --git a/Sources/TuistServer/Services/DeleteProjectService.swift b/Sources/TuistServer/Services/DeleteProjectService.swift index ce26492c1ca..52d85e2eaf0 100644 --- a/Sources/TuistServer/Services/DeleteProjectService.swift +++ b/Sources/TuistServer/Services/DeleteProjectService.swift @@ -47,7 +47,7 @@ public final class DeleteProjectService: DeleteProjectServicing { let response = try await client.deleteProject( .init( - path: .init(id: Double(projectId)) + path: .init(id: projectId) ) ) switch response { diff --git a/Tests/TuistAcceptanceTests/BuildRulesAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/BuildRulesAcceptanceTests.swift similarity index 100% rename from Tests/TuistAcceptanceTests/BuildRulesAcceptanceTests.swift rename to Tests/TuistKitAcceptanceTests/BuildRulesAcceptanceTests.swift diff --git a/Tests/TuistAcceptanceTests/EditAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/EditAcceptanceTests.swift similarity index 100% rename from Tests/TuistAcceptanceTests/EditAcceptanceTests.swift rename to Tests/TuistKitAcceptanceTests/EditAcceptanceTests.swift diff --git a/Tests/TuistAcceptanceTests/GraphAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/GraphAcceptanceTests.swift similarity index 100% rename from Tests/TuistAcceptanceTests/GraphAcceptanceTests.swift rename to Tests/TuistKitAcceptanceTests/GraphAcceptanceTests.swift diff --git a/Tests/TuistAcceptanceTests/InitAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/InitAcceptanceTests.swift similarity index 100% rename from Tests/TuistAcceptanceTests/InitAcceptanceTests.swift rename to Tests/TuistKitAcceptanceTests/InitAcceptanceTests.swift diff --git a/Tests/TuistAcceptanceTests/ListTargetsAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/ListTargetsAcceptanceTests.swift similarity index 100% rename from Tests/TuistAcceptanceTests/ListTargetsAcceptanceTests.swift rename to Tests/TuistKitAcceptanceTests/ListTargetsAcceptanceTests.swift diff --git a/Tests/TuistAcceptanceTests/PluginAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/PluginAcceptanceTests.swift similarity index 100% rename from Tests/TuistAcceptanceTests/PluginAcceptanceTests.swift rename to Tests/TuistKitAcceptanceTests/PluginAcceptanceTests.swift diff --git a/Tests/TuistAcceptanceTests/PrecompiledAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/PrecompiledAcceptanceTests.swift similarity index 100% rename from Tests/TuistAcceptanceTests/PrecompiledAcceptanceTests.swift rename to Tests/TuistKitAcceptanceTests/PrecompiledAcceptanceTests.swift diff --git a/Tests/TuistAcceptanceTests/RunAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/RunAcceptanceTests.swift similarity index 100% rename from Tests/TuistAcceptanceTests/RunAcceptanceTests.swift rename to Tests/TuistKitAcceptanceTests/RunAcceptanceTests.swift diff --git a/Tests/TuistAcceptanceTests/ScaffoldAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/ScaffoldAcceptanceTests.swift similarity index 100% rename from Tests/TuistAcceptanceTests/ScaffoldAcceptanceTests.swift rename to Tests/TuistKitAcceptanceTests/ScaffoldAcceptanceTests.swift diff --git a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift new file mode 100644 index 00000000000..05867514b95 --- /dev/null +++ b/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift @@ -0,0 +1,21 @@ +import Foundation +import TuistAcceptanceTesting +import XCTest + +@testable import TuistKit +@testable import TuistServer + +final class ServerAcceptanceTestProjects: TuistAcceptanceTestCase { + func test_create_and_delete_organization_with_project() async throws { + try setUpFixture(.iosAppWithFrameworks) + let organizationName = String(UUID().uuidString.prefix(12).lowercased()) + let projectName = String(UUID().uuidString.prefix(12).lowercased()) + try await run(CloudOrganizationCreateCommand.self, organizationName) + try await run(CloudProjectCreateCommand.self, projectName, "--organization", organizationName) + try await run(CloudProjectListCommand.self) + try await run(CloudProjectDeleteCommand.self, projectName, "--organization", organizationName) + try await run(CloudOrganizationDeleteCommand.self, organizationName) + XCTAssertStandardOutput(pattern: "Listing all your projects:") + XCTAssertStandardOutput(pattern: "• \(organizationName)/\(projectName)") + } +} diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index 81e642f5bff..10b0078ed4b 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -20,7 +20,7 @@ public enum Module: String, CaseIterable { case migration = "TuistMigration" case dependencies = "TuistDependencies" case automation = "TuistAutomation" - case app = "TuistServer" + case server = "TuistServer" public var isRunnable: Bool { switch self { @@ -117,7 +117,7 @@ public enum Module: String, CaseIterable { public var acceptanceTestsTargetName: String? { switch self { - case .tuist, .automation, .dependencies, .generator: + case .kit, .automation, .dependencies, .generator: return "\(rawValue)AcceptanceTests" default: return nil @@ -127,7 +127,7 @@ public enum Module: String, CaseIterable { public var testingTargetName: String? { switch self { case .tuist, .tuistBenchmark, .tuistFixtureGenerator, .kit, .projectAutomation, .projectDescription, .analytics, - .dependencies, .acceptanceTesting, .app: + .dependencies, .acceptanceTesting, .server: return nil default: return "\(rawValue)Testing" @@ -148,7 +148,7 @@ public enum Module: String, CaseIterable { switch self { case .tuist, .tuistBenchmark, .tuistFixtureGenerator, .projectAutomation, .projectDescription, .asyncQueue, - .plugin, .analytics, .dependencies, .acceptanceTesting, .app: + .plugin, .analytics, .dependencies, .acceptanceTesting, .server: return nil default: return "\(rawValue)IntegrationTests" @@ -172,7 +172,7 @@ public enum Module: String, CaseIterable { public var acceptanceTestDependencies: [TargetDependency] { let dependencies: [TargetDependency] = switch self { - case .tuist, .automation, .dependencies, .generator: + case .kit, .automation, .dependencies, .generator: [ .target(name: Module.acceptanceTesting.targetName), .target(name: Module.support.testingTargetName!), @@ -241,7 +241,7 @@ public enum Module: String, CaseIterable { .target(name: Module.support.targetName), .target(name: Module.generator.targetName), .target(name: Module.automation.targetName), - .target(name: Module.app.targetName), + .target(name: Module.server.targetName), .target(name: Module.projectDescription.targetName), .target(name: Module.projectAutomation.targetName), .target(name: Module.loader.targetName), @@ -344,7 +344,7 @@ public enum Module: String, CaseIterable { .external(name: "XcbeautifyLib"), .external(name: "XcodeGraph"), ] - case .app: + case .server: [ .target(name: Module.core.targetName), .target(name: Module.support.targetName), @@ -447,7 +447,7 @@ public enum Module: String, CaseIterable { .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), ] - case .app: + case .server: [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), @@ -523,7 +523,7 @@ public enum Module: String, CaseIterable { .target(name: Module.projectDescription.targetName), .target(name: Module.support.testingTargetName!), ] - case .app: + case .server: [] } return dependencies + sharedDependencies + [.target(name: targetName)] @@ -589,7 +589,7 @@ public enum Module: String, CaseIterable { [ .target(name: Module.support.testingTargetName!), ] - case .app: + case .server: [] } dependencies.append(contentsOf: sharedDependencies) diff --git a/codemagic.yaml b/codemagic.yaml index 8d7f3a6b2e8..f5e6bc109ad 100644 --- a/codemagic.yaml +++ b/codemagic.yaml @@ -234,8 +234,8 @@ workflows: triggering: << : *branch_triggering - tuist_acceptance_tests: - name: Tuist acceptance tests + tuist_kit_acceptance_tests: + name: TuistKit acceptance tests max_build_duration: 60 environment: xcode: 15.3 @@ -259,6 +259,6 @@ workflows: - name: Install Tuist dependencies script: mise x -- tuist install - name: Run tests - script: mise x -- tuist test tuistAcceptanceTests + script: mise x -- tuist test TuistKitAcceptanceTests triggering: << : *branch_triggering \ No newline at end of file From a8ec3e3f882c9d7d6daecd3a05467769e120e731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 1 Jul 2024 19:20:14 +0200 Subject: [PATCH 393/509] Align client plan with server (#6466) --- .../Models/CloudOrganization.swift | 34 +++++++++---------- Sources/TuistServer/OpenAPI/Types.swift | 17 +++++++--- Sources/TuistServer/OpenAPI/cloud.yml | 5 ++- .../CloudOrganizationShowServiceTests.swift | 8 ++--- 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/Sources/TuistServer/Models/CloudOrganization.swift b/Sources/TuistServer/Models/CloudOrganization.swift index 1548b5660d0..6983cb507bf 100644 --- a/Sources/TuistServer/Models/CloudOrganization.swift +++ b/Sources/TuistServer/Models/CloudOrganization.swift @@ -2,26 +2,24 @@ import Foundation /// Cloud organization public struct CloudOrganization: Codable { - public enum Plan: Codable, RawRepresentable { - case team, none + public enum Plan: String, Codable { + case air + case pro + case enterprise + case none - public init(rawValue: String) { - switch rawValue { - case "team": - self = .team - default: + public init(_ organization: Components.Schemas.Organization.planPayload) { + switch organization { + case .air: + self = .air + case .pro: + self = .pro + case .enterprise: + self = .enterprise + case .none, .undocumented: self = .none } } - - public var rawValue: String { - switch self { - case .team: - return "team" - case .none: - return "none" - } - } } public struct Member: Codable { @@ -95,7 +93,7 @@ extension CloudOrganization { init(_ organization: Components.Schemas.Organization) { id = Int(organization.id) name = organization.name - plan = Plan(rawValue: organization.plan.rawValue) + plan = Plan(organization.plan) members = organization.members.map(Member.init) invitations = organization.invitations.map(CloudInvitation.init) if let ssoProvider = organization.sso_provider, @@ -132,7 +130,7 @@ extension CloudOrganization.Member { public static func test( id: Int = 0, name: String = "test", - plan: Plan = .team, + plan: Plan = .air, members: [Member] = [], invitations: [CloudInvitation] = [], ssoOrganization: SSOOrganization? = nil diff --git a/Sources/TuistServer/OpenAPI/Types.swift b/Sources/TuistServer/OpenAPI/Types.swift index 772d68cda42..e78584964a0 100644 --- a/Sources/TuistServer/OpenAPI/Types.swift +++ b/Sources/TuistServer/OpenAPI/Types.swift @@ -902,22 +902,31 @@ public enum Components { public enum planPayload: RawRepresentable, Codable, Equatable, Hashable, Sendable, _AutoLosslessStringConvertible, CaseIterable { - case team + case air + case pro + case enterprise + case none /// Parsed a raw value that was not defined in the OpenAPI document. case undocumented(String) public init?(rawValue: String) { switch rawValue { - case "team": self = .team + case "air": self = .air + case "pro": self = .pro + case "enterprise": self = .enterprise + case "none": self = .none default: self = .undocumented(rawValue) } } public var rawValue: String { switch self { case let .undocumented(string): return string - case .team: return "team" + case .air: return "air" + case .pro: return "pro" + case .enterprise: return "enterprise" + case .none: return "none" } } - public static var allCases: [planPayload] { [.team] } + public static var allCases: [planPayload] { [.air, .pro, .enterprise, .none] } } /// The plan associated with the organization /// diff --git a/Sources/TuistServer/OpenAPI/cloud.yml b/Sources/TuistServer/OpenAPI/cloud.yml index 169362a5b35..b6f0e7b61fb 100644 --- a/Sources/TuistServer/OpenAPI/cloud.yml +++ b/Sources/TuistServer/OpenAPI/cloud.yml @@ -285,7 +285,10 @@ components: plan: description: The plan associated with the organization enum: - - team + - air + - pro + - enterprise + - none type: string sso_organization_id: description: The organization ID associated with the SSO provider diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift index 7720cca3cde..bde9ed0a7c6 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift @@ -46,7 +46,7 @@ final class CloudOrganizationShowServiceTests: TuistUnitTestCase { .willReturn( .test( name: "test-one", - plan: .team, + plan: .air, members: [ .test( name: "name-one", @@ -83,7 +83,7 @@ final class CloudOrganizationShowServiceTests: TuistUnitTestCase { XCTAssertPrinterOutputContains(""" \(TerminalStyle.bold.open)Organization\(TerminalStyle.reset.open) Name: test-one - Plan: Team + Plan: Air \(TerminalStyle.bold.open)Usage\(TerminalStyle.reset.open) (current calendar month) Remote cache hits: 210 @@ -106,7 +106,7 @@ final class CloudOrganizationShowServiceTests: TuistUnitTestCase { .willReturn( .test( name: "test-one", - plan: .team, + plan: .pro, ssoOrganization: .google("tuist.io") ) ) @@ -126,7 +126,7 @@ final class CloudOrganizationShowServiceTests: TuistUnitTestCase { """ \(TerminalStyle.bold.open)Organization\(TerminalStyle.reset.open) Name: test-one - Plan: Team + Plan: Pro SSO: Google (tuist.io) """ ) From 3599c41d300a5ccf2c877dfe79800c9ca1d3b18e Mon Sep 17 00:00:00 2001 From: Jaewon-Yun Date: Tue, 2 Jul 2024 07:45:23 +0900 Subject: [PATCH 394/509] Add missing target settings `MERGED_BINARY_TYPE` and `MERGEABLE_LIBRARY` (#6447) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add missing target settings * Fix failed acceptance test case * Lint * Update Sources/TuistGenerator/Generator/ConfigGenerator.swift Co-authored-by: Marek Fořt * Update Sources/TuistGenerator/Generator/ConfigGenerator.swift Co-authored-by: Marek Fořt --------- Co-authored-by: Marek Fořt --- .../Generator/ConfigGenerator.swift | 14 +++ .../Generator/ConfigGeneratorTests.swift | 90 +++++++++++++++++++ 2 files changed, 104 insertions(+) diff --git a/Sources/TuistGenerator/Generator/ConfigGenerator.swift b/Sources/TuistGenerator/Generator/ConfigGenerator.swift index c1c5a1dc82a..3ef7c072672 100644 --- a/Sources/TuistGenerator/Generator/ConfigGenerator.swift +++ b/Sources/TuistGenerator/Generator/ConfigGenerator.swift @@ -285,6 +285,20 @@ final class ConfigGenerator: ConfigGenerating { settings["PRODUCT_NAME"] = .string(target.productName) + if target.mergeable { + settings["MERGEABLE_LIBRARY"] = .string("YES") + } + + switch target.mergedBinaryType { + case .disabled: + // When `MERGED_BINARY_TYPE` is disabled, `MERGED_BINARY_TYPE` value should be left empty + break + case .automatic: + settings["MERGED_BINARY_TYPE"] = .string("automatic") + case .manual: + settings["MERGED_BINARY_TYPE"] = .string("manual") + } + return settings } diff --git a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift index aadafaa7b3b..7d9683d4a8d 100644 --- a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift @@ -900,6 +900,96 @@ final class ConfigGeneratorTests: TuistUnitTestCase { XCTAssertEqual(targetSettingsResult, "$(MY_CUSTOM_VARIABLE)") } + func test_generateTargetConfig_when_mergedBinaryTypeIsAutomatic_defaultSettingsIsEssential() throws { + // Given + let settings = Settings.test(defaultSettings: .essential) + let appTarget = Target.test(settings: settings, mergedBinaryType: .automatic) + let project = Project.test(targets: [appTarget]) + let graph = Graph.test(path: project.path, projects: [project.path: project]) + let graphTraverser = GraphTraverser(graph: graph) + + // When + try subject.generateTargetConfig( + appTarget, + project: project, + pbxTarget: pbxTarget, + pbxproj: pbxproj, + projectSettings: .test(), + fileElements: ProjectFileElements(), + graphTraverser: graphTraverser, + sourceRootPath: try AbsolutePath(validating: "/project") + ) + + // Then + let targetSettingsResult = try pbxTarget + .buildConfigurationList? + .buildConfigurations + .first { $0.name == "Debug" }? + .buildSettings + .toSettings()["MERGED_BINARY_TYPE"] + XCTAssertEqual(targetSettingsResult, "automatic") + } + + func test_generateTargetConfig_when_mergedBinaryTypeIsManual_defaultSettingsIsEssential() throws { + // Given + let settings = Settings.test(defaultSettings: .essential) + let appTarget = Target.test(settings: settings, mergedBinaryType: .manual(mergeableDependencies: [])) + let project = Project.test(targets: [appTarget]) + let graph = Graph.test(path: project.path, projects: [project.path: project]) + let graphTraverser = GraphTraverser(graph: graph) + + // When + try subject.generateTargetConfig( + appTarget, + project: project, + pbxTarget: pbxTarget, + pbxproj: pbxproj, + projectSettings: .test(), + fileElements: ProjectFileElements(), + graphTraverser: graphTraverser, + sourceRootPath: try AbsolutePath(validating: "/project") + ) + + // Then + let targetSettingsResult = try pbxTarget + .buildConfigurationList? + .buildConfigurations + .first { $0.name == "Debug" }? + .buildSettings + .toSettings()["MERGED_BINARY_TYPE"] + XCTAssertEqual(targetSettingsResult, "manual") + } + + func test_generateTargetConfig_when_mergeableIsTrue_defaultSettingsIsEssential() throws { + // Given + let settings = Settings.test(defaultSettings: .essential) + let frameworkTarget = Target.test(product: .framework, settings: settings, mergeable: true) + let project = Project.test(targets: [frameworkTarget]) + let graph = Graph.test(path: project.path, projects: [project.path: project]) + let graphTraverser = GraphTraverser(graph: graph) + + // When + try subject.generateTargetConfig( + frameworkTarget, + project: project, + pbxTarget: pbxTarget, + pbxproj: pbxproj, + projectSettings: .test(), + fileElements: ProjectFileElements(), + graphTraverser: graphTraverser, + sourceRootPath: try AbsolutePath(validating: "/project") + ) + + // Then + let targetSettingsResult = try pbxTarget + .buildConfigurationList? + .buildConfigurations + .first { $0.name == "Debug" }? + .buildSettings + .toSettings()["MERGEABLE_LIBRARY"] + XCTAssertEqual(targetSettingsResult, "YES") + } + // MARK: - Helpers private func generateProjectConfig(config _: BuildConfiguration) throws { From 54fbf21759e64817290978243c2fc615f0d0dab6 Mon Sep 17 00:00:00 2001 From: fortmarek Date: Tue, 2 Jul 2024 10:29:01 +0200 Subject: [PATCH 395/509] Update release date --- .../Client/CloudClientCLIMetadataHeadersMiddleware.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift b/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift index 4e1726e35ae..4effb268950 100644 --- a/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift +++ b/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift @@ -5,7 +5,7 @@ import TuistSupport /// This middleware includes the release date of the CLI in the headers so that we can show /// warnings if the on-premise installation is too old. struct CloudClientCLIMetadataHeadersMiddleware: ClientMiddleware { - let releaseDate = "2024.06.25" + let releaseDate = "2024.07.02" func intercept( _ request: Request, From dbd982b92336a3fed348ce93cccaefa701b9c169 Mon Sep 17 00:00:00 2001 From: Tuist Date: Tue, 2 Jul 2024 11:04:08 +0000 Subject: [PATCH 396/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.20.0 --- .mise.toml | 2 +- CHANGELOG.md | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 3b88fb90d7d..5894cdaf4a3 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.19.0" +tuist = "4.20.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index d95da4fd919..f86c02009e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## 4.20.0 - 2024-07-02 + +### Tuist + +#### Added + +- Add support for enabling explicit modules for Xcode 16 [#6405](https://github.com/tuist/tuist/pull/6405) by [@waltflanagan](https://github.com/waltflanagan) + +#### Fixed + +- Print only JSON string for dump and when --json flag is present [#6440](https://github.com/tuist/tuist/pull/6440) by [@fortmarek](https://github.com/fortmarek) +- Handle unauthorized server errors [#6451](https://github.com/tuist/tuist/pull/6451) by [@fortmarek](https://github.com/fortmarek) +- Fix generation of Quick's SPM QuickObjcRuntime target [#6445](https://github.com/tuist/tuist/pull/6445) by [@simpers](https://github.com/simpers) +- Provide better error message for a missing Tuist server token [#6450](https://github.com/tuist/tuist/pull/6450) by [@fortmarek](https://github.com/fortmarek) +- Fix deleting Tuist project and organization [#6455](https://github.com/tuist/tuist/pull/6455) by [@fortmarek](https://github.com/fortmarek) +- Add missing target settings `MERGED_BINARY_TYPE` and `MERGEABLE_LIBRARY` [#6447](https://github.com/tuist/tuist/pull/6447) by [@woin2ee](https://github.com/woin2ee) + +### Tuist Cloud + +- no changes + ## 4.19.0 - 2024-06-25 ### Tuist From cacaa53962fe06686a8bf15b3fc2d7cead9d1647 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 2 Jul 2024 17:58:37 +0200 Subject: [PATCH 397/509] Fix generate failing due to duplicate keys (#6469) --- Package.resolved | 6 +- Package.swift | 2 +- .../Utils/RootDirectoryLocator.swift | 2 + .../Utils/MockRootDirectoryLocator.swift | 15 -- .../TuistLoader/Loaders/ManifestLoader.swift | 2 + .../Workspace+ManifestMapper.swift | 1 - .../Utils/ProjectDescription+TestData.swift | 224 ++++++++++++++++++ .../Loaders/Mocks/MockManifestLoader.swift | 101 -------- .../ProjectDescription+TestData.swift | 222 ----------------- .../Linter/EnvironmentLinterTests.swift | 13 +- .../Services/CleanServiceTests.swift | 20 +- .../Services/EditServiceTests.swift | 4 +- .../Plugin/PluginArchiveServiceTests.swift | 15 +- .../Loaders/CachedManifestLoaderTests.swift | 86 ++++--- .../Loaders/ConfigLoaderTests.swift | 32 ++- .../Loaders/ManifestModelConverterTests.swift | 71 +++--- .../Loaders/PackageSettingsLoaderTests.swift | 16 +- .../RecursiveManifestLoaderTests.swift | 69 +++--- .../Loaders/TemplateLoaderTests.swift | 39 +-- .../Workspace+ManifestMapperTests.swift | 70 ++++++ .../Models/GeneratorPathsTests.swift | 21 +- .../TuistPluginTests/PluginServiceTests.swift | 105 ++++---- .../AnalyticsArtifactUploadServiceTests.swift | 8 + .../Session/CloudSessionControllerTests.swift | 10 + 24 files changed, 624 insertions(+), 530 deletions(-) delete mode 100644 Sources/TuistCoreTesting/Utils/MockRootDirectoryLocator.swift create mode 100644 Sources/TuistLoader/Utils/ProjectDescription+TestData.swift delete mode 100644 Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift delete mode 100644 Sources/TuistLoaderTesting/Loaders/TestData/ProjectDescription+TestData.swift create mode 100644 Tests/TuistLoaderTests/Models+ManifestMappers/Workspace+ManifestMapperTests.swift diff --git a/Package.resolved b/Package.resolved index 272f1efd4ad..bd1d7bf2c6b 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "4080d161ed0c091cdaef55ea652849f51665b8794ae236477b94e919ff68eb09", + "originHash" : "dc4a35b9ed535c9d2a720826820ddba97515ea7aae953fc69429768c6acc657a", "pins" : [ { "identity" : "aexml", @@ -78,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/Kolos65/Mockable.git", "state" : { - "revision" : "7af00c08880d375f2742ca55705abd69837fe6c3", - "version" : "0.0.2" + "revision" : "81ccaead99a3c038c09345caa2888ae74b644ee9", + "version" : "0.0.9" } }, { diff --git a/Package.swift b/Package.swift index baaa97b9c2e..d990e4e544d 100644 --- a/Package.swift +++ b/Package.swift @@ -417,7 +417,7 @@ let package = Package( .package(url: "https://github.com/tuist/XcodeProj", exact: "8.19.0"), .package(url: "https://github.com/cpisciotta/xcbeautify", from: "2.4.0"), .package(url: "https://github.com/krzysztofzablocki/Difference.git", from: "1.0.2"), - .package(url: "https://github.com/Kolos65/Mockable.git", from: "0.0.2"), + .package(url: "https://github.com/Kolos65/Mockable.git", from: "0.0.9"), .package(url: "https://github.com/tuist/swift-openapi-runtime", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/swift-openapi-urlsession", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/Path", .upToNextMajor(from: "0.3.0")), diff --git a/Sources/TuistCore/Utils/RootDirectoryLocator.swift b/Sources/TuistCore/Utils/RootDirectoryLocator.swift index 332ecd499df..abe35c507f7 100644 --- a/Sources/TuistCore/Utils/RootDirectoryLocator.swift +++ b/Sources/TuistCore/Utils/RootDirectoryLocator.swift @@ -1,7 +1,9 @@ import Foundation +import Mockable import Path import TuistSupport +@Mockable public protocol RootDirectoryLocating { /// Given a path, it finds the root directory by traversing up the hierarchy. /// diff --git a/Sources/TuistCoreTesting/Utils/MockRootDirectoryLocator.swift b/Sources/TuistCoreTesting/Utils/MockRootDirectoryLocator.swift deleted file mode 100644 index 7611537892e..00000000000 --- a/Sources/TuistCoreTesting/Utils/MockRootDirectoryLocator.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation -import Path -@testable import TuistCore - -public final class MockRootDirectoryLocator: RootDirectoryLocating { - public init() {} - - public var locateArgs: [AbsolutePath] = [] - public var locateStub: AbsolutePath? - - public func locate(from path: AbsolutePath) -> AbsolutePath? { - locateArgs.append(path) - return locateStub - } -} diff --git a/Sources/TuistLoader/Loaders/ManifestLoader.swift b/Sources/TuistLoader/Loaders/ManifestLoader.swift index 03a0c09dce4..a31f568d1fd 100644 --- a/Sources/TuistLoader/Loaders/ManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/ManifestLoader.swift @@ -1,4 +1,5 @@ import Foundation +import Mockable import Path import ProjectDescription import TuistCore @@ -50,6 +51,7 @@ public enum ManifestLoaderError: FatalError, Equatable { } } +@Mockable public protocol ManifestLoading { /// Loads the Config.swift in the given directory. /// diff --git a/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift index 6b97ac59649..99767a9aacc 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Workspace+ManifestMapper.swift @@ -19,7 +19,6 @@ extension XcodeGraph.Workspace { func globProjects(_ path: Path) throws -> [AbsolutePath] { let resolvedPath = try generatorPaths.resolve(path: path) let projects = FileHandler.shared.glob(AbsolutePath.root, glob: String(resolvedPath.pathString.dropFirst())) - .lazy .filter(FileHandler.shared.isFolder) .filter { $0.basename != Constants.tuistDirectoryName && !$0.pathString.contains(".build/checkouts") } .filter { diff --git a/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift b/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift new file mode 100644 index 00000000000..da0b58977e5 --- /dev/null +++ b/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift @@ -0,0 +1,224 @@ +import Foundation +@testable import ProjectDescription + +#if DEBUG + extension Config { + public static func test( + generationOptions: Config.GenerationOptions = .options(), + plugins: [PluginLocation] = [] + ) -> Config { + Config(plugins: plugins, generationOptions: generationOptions) + } + } + + extension Template { + public static func test( + description: String = "Template", + attributes: [Attribute] = [], + items: [Template.Item] = [] + ) -> Template { + Template( + description: description, + attributes: attributes, + items: items + ) + } + } + + extension Workspace { + public static func test( + name: String = "Workspace", + projects: [Path] = [], + schemes: [Scheme] = [], + additionalFiles: [FileElement] = [] + ) -> Workspace { + Workspace( + name: name, + projects: projects, + schemes: schemes, + additionalFiles: additionalFiles + ) + } + } + + extension Project { + public static func test( + name: String = "Project", + organizationName: String? = nil, + settings: Settings? = nil, + targets: [Target] = [], + additionalFiles: [FileElement] = [] + ) -> Project { + Project( + name: name, + organizationName: organizationName, + settings: settings, + targets: targets, + additionalFiles: additionalFiles + ) + } + } + + extension Target { + public static func test( + name: String = "Target", + destinations: Destinations = .iOS, + product: Product = .framework, + productName: String? = nil, + bundleId: String = "com.some.bundle.id", + infoPlist: InfoPlist = .file(path: "Info.plist"), + sources: SourceFilesList = "Sources/**", + resources: ResourceFileElements = "Resources/**", + headers: Headers? = nil, + entitlements: Entitlements = .file(path: "Entitlements.entitlements"), + scripts: [TargetScript] = [], + dependencies: [TargetDependency] = [], + settings: Settings? = nil, + coreDataModels: [CoreDataModel] = [], + environment: [String: String] = [:] + ) -> Target { + .target( + name: name, + destinations: destinations, + product: product, + productName: productName, + bundleId: bundleId, + infoPlist: infoPlist, + sources: sources, + resources: resources, + headers: headers, + entitlements: entitlements, + scripts: scripts, + dependencies: dependencies, + settings: settings, + coreDataModels: coreDataModels, + environmentVariables: environment.mapValues { .init(stringLiteral: $0) } + ) + } + } + + extension TargetScript { + public static func test( + name: String = "Action", + tool: String = "", + order: Order = .pre, + arguments: [String] = [], + inputPaths: [FileListGlob] = [], + inputFileListPaths: [Path] = [], + outputPaths: [Path] = [], + outputFileListPaths: [Path] = [], + dependencyFile: Path? = nil + ) -> TargetScript { + TargetScript( + name: name, + script: .tool(path: tool, args: arguments), + order: order, + inputPaths: inputPaths, + inputFileListPaths: inputFileListPaths, + outputPaths: outputPaths, + outputFileListPaths: outputFileListPaths, + dependencyFile: dependencyFile + ) + } + } + + extension Scheme { + public static func test( + name: String = "Scheme", + shared: Bool = false, + buildAction: BuildAction? = nil, + testAction: TestAction? = nil, + runAction: RunAction? = nil + ) -> Scheme { + .scheme( + name: name, + shared: shared, + buildAction: buildAction, + testAction: testAction, + runAction: runAction + ) + } + } + + extension BuildAction { + public static func test(targets: [TargetReference] = []) -> BuildAction { + .buildAction( + targets: targets, + preActions: [ExecutionAction.test()], + postActions: [ExecutionAction.test()] + ) + } + } + + extension TestAction { + public static func test( + targets: [TestableTarget] = [], + arguments: Arguments? = nil, + configuration: ConfigurationName = .debug, + coverage: Bool = true + ) -> TestAction { + TestAction.targets( + targets, + arguments: arguments, + configuration: configuration, + preActions: [ExecutionAction.test()], + postActions: [ExecutionAction.test()], + options: .options(coverage: coverage) + ) + } + } + + extension RunAction { + public static func test( + configuration: ConfigurationName = .debug, + executable: TargetReference? = nil, + arguments: Arguments? = nil, + options: RunActionOptions = .options() + ) -> RunAction { + RunAction( + configuration: configuration, + executable: executable, + arguments: arguments, + options: options + ) + } + } + + extension ExecutionAction { + public static func test( + title: String = "Test Script", + scriptText: String = "echo Test", + target: TargetReference? = .target("Target") + ) -> ExecutionAction { + ExecutionAction( + title: title, + scriptText: scriptText, + target: target + ) + } + } + + extension Arguments { + public static func test( + environment: [String: String] = [:], + launchArguments: [LaunchArgument] = [] + ) -> Arguments { + Arguments( + environmentVariables: environment.mapValues { .init(stringLiteral: $0) }, + launchArguments: launchArguments + ) + } + } + + extension Plugin { + public static func test(name: String = "Plugin") -> Plugin { + Plugin(name: name) + } + } + + extension PackageSettings { + public static func test() -> PackageSettings { + PackageSettings() + } + } +#endif diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift deleted file mode 100644 index ab9a0cf1df8..00000000000 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockManifestLoader.swift +++ /dev/null @@ -1,101 +0,0 @@ -import Foundation -import Path -import ProjectDescription -import struct TuistCore.Plugins -import TuistSupport -@testable import TuistLoader -@testable import TuistSupportTesting - -public final class MockManifestLoader: ManifestLoading { - public var loadProjectCount: UInt = 0 - public var loadProjectStub: ((AbsolutePath) throws -> Project)? - - public var loadWorkspaceCount: UInt = 0 - public var loadWorkspaceStub: ((AbsolutePath) throws -> Workspace)? - - public var manifestsAtCount: UInt = 0 - public var manifestsAtStub: ((AbsolutePath) -> Set)? - - public var manifestPathCount: UInt = 0 - public var manifestPathStub: ((AbsolutePath, Manifest) throws -> AbsolutePath)? - - public var loadConfigCount: UInt = 0 - public var loadConfigStub: ((AbsolutePath) throws -> Config)? - - public var loadTemplateCount: UInt = 0 - public var loadTemplateStub: ((AbsolutePath) throws -> Template)? - - public var loadPackageCount: UInt = 0 - public var loadPackageStub: ((AbsolutePath) throws -> PackageInfo)? - - public var loadPackageSettingsCount: UInt = 0 - public var loadPackageSettingsStub: ((AbsolutePath) throws -> PackageSettings)? - - public var loadPluginCount: UInt = 0 - public var loadPluginStub: ((AbsolutePath) throws -> Plugin)? - - public init() {} - - public func loadProject(at path: AbsolutePath) throws -> Project { - try loadProjectStub?(path) ?? Project.test() - } - - public func loadWorkspace(at path: AbsolutePath) throws -> Workspace { - try loadWorkspaceStub?(path) ?? Workspace.test() - } - - public func manifests(at path: AbsolutePath) -> Set { - manifestsAtCount += 1 - return manifestsAtStub?(path) ?? Set() - } - - public func validateHasRootManifest(at path: AbsolutePath) throws { - let manifests = manifests(at: path) - let rootManifests: Set = [.workspace, .project, .package] - guard !manifests.isDisjoint(with: rootManifests) else { - throw ManifestLoaderError.manifestNotFound(path) - } - } - - func manifestPath(at path: AbsolutePath, manifest: Manifest) throws -> AbsolutePath { - manifestPathCount += 1 - return try manifestPathStub?(path, manifest) ?? TemporaryDirectory(removeTreeOnDeinit: true).path - } - - public func loadConfig(at path: AbsolutePath) throws -> Config { - loadConfigCount += 1 - return try loadConfigStub?(path) ?? Config.test() - } - - public func loadTemplate(at path: AbsolutePath) throws -> Template { - loadTemplateCount += 1 - return try loadTemplateStub?(path) ?? Template.test() - } - - public func loadPackage(at path: AbsolutePath) throws -> PackageInfo { - loadPackageCount += 1 - return try loadPackageStub?(path) ?? .test() - } - - public func loadPackageSettings(at path: AbsolutePath) throws -> PackageSettings { - loadPackageSettingsCount += 1 - return try loadPackageSettingsStub?(path) ?? .test() - } - - public func loadPlugin(at path: AbsolutePath) throws -> Plugin { - loadPluginCount += 1 - return try loadPluginStub?(path) ?? Plugin.test() - } - - public var taskLoadArgumentsStub: ((AbsolutePath) throws -> [String])? - public func taskLoadArguments(at path: AbsolutePath) throws -> [String] { - try taskLoadArgumentsStub?(path) ?? [] - } - - public var registerPluginsCount: UInt = 0 - public var registerPluginsStub: ((Plugins) throws -> Void)? - public func register(plugins: Plugins) throws { - registerPluginsCount += 1 - try registerPluginsStub?(plugins) - } -} diff --git a/Sources/TuistLoaderTesting/Loaders/TestData/ProjectDescription+TestData.swift b/Sources/TuistLoaderTesting/Loaders/TestData/ProjectDescription+TestData.swift deleted file mode 100644 index e5d25802301..00000000000 --- a/Sources/TuistLoaderTesting/Loaders/TestData/ProjectDescription+TestData.swift +++ /dev/null @@ -1,222 +0,0 @@ -import Foundation -@testable import ProjectDescription - -extension Config { - public static func test( - generationOptions: Config.GenerationOptions = .options(), - plugins: [PluginLocation] = [] - ) -> Config { - Config(plugins: plugins, generationOptions: generationOptions) - } -} - -extension Template { - public static func test( - description: String = "Template", - attributes: [Attribute] = [], - items: [Template.Item] = [] - ) -> Template { - Template( - description: description, - attributes: attributes, - items: items - ) - } -} - -extension Workspace { - public static func test( - name: String = "Workspace", - projects: [Path] = [], - schemes: [Scheme] = [], - additionalFiles: [FileElement] = [] - ) -> Workspace { - Workspace( - name: name, - projects: projects, - schemes: schemes, - additionalFiles: additionalFiles - ) - } -} - -extension Project { - public static func test( - name: String = "Project", - organizationName: String? = nil, - settings: Settings? = nil, - targets: [Target] = [], - additionalFiles: [FileElement] = [] - ) -> Project { - Project( - name: name, - organizationName: organizationName, - settings: settings, - targets: targets, - additionalFiles: additionalFiles - ) - } -} - -extension Target { - public static func test( - name: String = "Target", - destinations: Destinations = .iOS, - product: Product = .framework, - productName: String? = nil, - bundleId: String = "com.some.bundle.id", - infoPlist: InfoPlist = .file(path: "Info.plist"), - sources: SourceFilesList = "Sources/**", - resources: ResourceFileElements = "Resources/**", - headers: Headers? = nil, - entitlements: Entitlements = .file(path: "Entitlements.entitlements"), - scripts: [TargetScript] = [], - dependencies: [TargetDependency] = [], - settings: Settings? = nil, - coreDataModels: [CoreDataModel] = [], - environment: [String: String] = [:] - ) -> Target { - .target( - name: name, - destinations: destinations, - product: product, - productName: productName, - bundleId: bundleId, - infoPlist: infoPlist, - sources: sources, - resources: resources, - headers: headers, - entitlements: entitlements, - scripts: scripts, - dependencies: dependencies, - settings: settings, - coreDataModels: coreDataModels, - environmentVariables: environment.mapValues { .init(stringLiteral: $0) } - ) - } -} - -extension TargetScript { - public static func test( - name: String = "Action", - tool: String = "", - order: Order = .pre, - arguments: [String] = [], - inputPaths: [FileListGlob] = [], - inputFileListPaths: [Path] = [], - outputPaths: [Path] = [], - outputFileListPaths: [Path] = [], - dependencyFile: Path? = nil - ) -> TargetScript { - TargetScript( - name: name, - script: .tool(path: tool, args: arguments), - order: order, - inputPaths: inputPaths, - inputFileListPaths: inputFileListPaths, - outputPaths: outputPaths, - outputFileListPaths: outputFileListPaths, - dependencyFile: dependencyFile - ) - } -} - -extension Scheme { - public static func test( - name: String = "Scheme", - shared: Bool = false, - buildAction: BuildAction? = nil, - testAction: TestAction? = nil, - runAction: RunAction? = nil - ) -> Scheme { - .scheme( - name: name, - shared: shared, - buildAction: buildAction, - testAction: testAction, - runAction: runAction - ) - } -} - -extension BuildAction { - public static func test(targets: [TargetReference] = []) -> BuildAction { - .buildAction( - targets: targets, - preActions: [ExecutionAction.test()], - postActions: [ExecutionAction.test()] - ) - } -} - -extension TestAction { - public static func test( - targets: [TestableTarget] = [], - arguments: Arguments? = nil, - configuration: ConfigurationName = .debug, - coverage: Bool = true - ) -> TestAction { - TestAction.targets( - targets, - arguments: arguments, - configuration: configuration, - preActions: [ExecutionAction.test()], - postActions: [ExecutionAction.test()], - options: .options(coverage: coverage) - ) - } -} - -extension RunAction { - public static func test( - configuration: ConfigurationName = .debug, - executable: TargetReference? = nil, - arguments: Arguments? = nil, - options: RunActionOptions = .options() - ) -> RunAction { - RunAction( - configuration: configuration, - executable: executable, - arguments: arguments, - options: options - ) - } -} - -extension ExecutionAction { - public static func test( - title: String = "Test Script", - scriptText: String = "echo Test", - target: TargetReference? = .target("Target") - ) -> ExecutionAction { - ExecutionAction( - title: title, - scriptText: scriptText, - target: target - ) - } -} - -extension Arguments { - public static func test( - environment: [String: String] = [:], - launchArguments: [LaunchArgument] = [] - ) -> Arguments { - Arguments( - environmentVariables: environment.mapValues { .init(stringLiteral: $0) }, - launchArguments: launchArguments - ) - } -} - -extension Plugin { - public static func test(name: String = "Plugin") -> Plugin { - Plugin(name: name) - } -} - -extension PackageSettings { - public static func test() -> PackageSettings { - PackageSettings() - } -} diff --git a/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift b/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift index bc7c6ed5a0b..2eada9b48cf 100644 --- a/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift @@ -1,4 +1,5 @@ import Foundation +import MockableTest import Path import TuistCore import TuistSupport @@ -9,13 +10,13 @@ import XCTest @testable import TuistSupportTesting final class EnvironmentLinterTests: TuistUnitTestCase { - private var rootDirectoryLocator: MockRootDirectoryLocator! + private var rootDirectoryLocator: MockRootDirectoryLocating! var subject: EnvironmentLinter! override func setUp() { super.setUp() - rootDirectoryLocator = MockRootDirectoryLocator() + rootDirectoryLocator = .init() subject = EnvironmentLinter(rootDirectoryLocator: rootDirectoryLocator) } @@ -108,7 +109,9 @@ final class EnvironmentLinterTests: TuistUnitTestCase { func test_lintConfigPath_returnsALintingIssue_when_configManifestIsNotLocatedAtTuistDirectory() throws { // Given let fakeRoot = try! AbsolutePath(validating: "/root") - rootDirectoryLocator.locateStub = fakeRoot + given(rootDirectoryLocator) + .locate(from: .any) + .willReturn(fakeRoot) let configPath = fakeRoot.appending(try RelativePath(validating: "Config.swift")) let config = Config.test(path: configPath) @@ -124,7 +127,9 @@ final class EnvironmentLinterTests: TuistUnitTestCase { func test_lintConfigPath_doesntReturnALintingIssue_when_configManifestIsLocatedAtTuistDirectory() throws { // Given let fakeRoot = try! AbsolutePath(validating: "/root") - rootDirectoryLocator.locateStub = fakeRoot + given(rootDirectoryLocator) + .locate(from: .any) + .willReturn(fakeRoot) let configPath = fakeRoot .appending(try RelativePath(validating: "\(Constants.tuistDirectoryName)")) diff --git a/Tests/TuistKitTests/Services/CleanServiceTests.swift b/Tests/TuistKitTests/Services/CleanServiceTests.swift index dafd8c570eb..6c5b9ceb0f2 100644 --- a/Tests/TuistKitTests/Services/CleanServiceTests.swift +++ b/Tests/TuistKitTests/Services/CleanServiceTests.swift @@ -13,13 +13,13 @@ import XCTest final class CleanServiceTests: TuistUnitTestCase { private var subject: CleanService! - private var rootDirectoryLocator: MockRootDirectoryLocator! + private var rootDirectoryLocator: MockRootDirectoryLocating! private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! private var manifestFilesLocator: MockManifestFilesLocating! override func setUpWithError() throws { super.setUp() - rootDirectoryLocator = MockRootDirectoryLocator() + rootDirectoryLocator = .init() cacheDirectoriesProvider = .init() manifestFilesLocator = MockManifestFilesLocating() @@ -47,7 +47,9 @@ final class CleanServiceTests: TuistUnitTestCase { given(cacheDirectoriesProvider) .cacheDirectory() .willReturn(cachePath) - rootDirectoryLocator.locateStub = cachePath + given(rootDirectoryLocator) + .locate(from: .any) + .willReturn(cachePath) given(manifestFilesLocator) .locatePackageManifest(at: .any) .willReturn(nil) @@ -64,7 +66,9 @@ final class CleanServiceTests: TuistUnitTestCase { // Given let localPaths = try createFolders(["Tuist/.build", "Tuist/ProjectDescriptionHelpers"]) - rootDirectoryLocator.locateStub = localPaths[0].parentDirectory + given(rootDirectoryLocator) + .locate(from: .any) + .willReturn(localPaths[0].parentDirectory) given(manifestFilesLocator) .locatePackageManifest(at: .any) .willReturn( @@ -89,7 +93,9 @@ final class CleanServiceTests: TuistUnitTestCase { // Given let localPaths = try createFolders([".build", "Tuist/ProjectDescriptionHelpers"]) - rootDirectoryLocator.locateStub = localPaths[0].parentDirectory + given(rootDirectoryLocator) + .locate(from: .any) + .willReturn(localPaths[0].parentDirectory) given(manifestFilesLocator) .locatePackageManifest(at: .any) .willReturn( @@ -120,7 +126,9 @@ final class CleanServiceTests: TuistUnitTestCase { .willReturn(cachePath) let projectPath = try temporaryPath() - rootDirectoryLocator.locateStub = projectPath + given(rootDirectoryLocator) + .locate(from: .any) + .willReturn(projectPath) given(manifestFilesLocator) .locatePackageManifest(at: .any) .willReturn( diff --git a/Tests/TuistKitTests/Services/EditServiceTests.swift b/Tests/TuistKitTests/Services/EditServiceTests.swift index 8a936451c8e..7105735b0ac 100644 --- a/Tests/TuistKitTests/Services/EditServiceTests.swift +++ b/Tests/TuistKitTests/Services/EditServiceTests.swift @@ -74,7 +74,7 @@ final class EditServiceTests: XCTestCase { verify(projectEditor) .edit(at: .value(path), in: .value(projectDirectory), onlyCurrentDirectory: .value(false), plugins: .any) - .called(count: 1) + .called(1) } func test_edit_permanent_does_not_open_workspace() async throws { @@ -96,6 +96,6 @@ final class EditServiceTests: XCTestCase { verify(projectEditor) .edit(at: .value(path), in: .value(path), onlyCurrentDirectory: .value(true), plugins: .any) - .called(count: 1) + .called(1) } } diff --git a/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift b/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift index db773805cda..8315dc5bdc0 100644 --- a/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift +++ b/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift @@ -1,6 +1,6 @@ import MockableTest import Path -import TuistLoaderTesting +import TuistLoader import TuistSupport import TuistSupportTesting import XCTest @@ -9,13 +9,13 @@ import XCTest final class PluginArchiveServiceTests: TuistUnitTestCase { private var subject: PluginArchiveService! private var swiftPackageManagerController: MockSwiftPackageManagerController! - private var manifestLoader: MockManifestLoader! + private var manifestLoader: MockManifestLoading! private var fileArchiverFactory: MockFileArchivingFactorying! override func setUp() { super.setUp() swiftPackageManagerController = MockSwiftPackageManagerController() - manifestLoader = MockManifestLoader() + manifestLoader = .init() fileArchiverFactory = MockFileArchivingFactorying() subject = PluginArchiveService( swiftPackageManagerController: swiftPackageManagerController, @@ -88,9 +88,9 @@ final class PluginArchiveServiceTests: TuistUnitTestCase { ] ) } - manifestLoader.loadPluginStub = { _ in - .test(name: "TestPlugin") - } + given(manifestLoader) + .loadPlugin(at: .any) + .willReturn(.test(name: "TestPlugin")) var builtProducts: [String] = [] swiftPackageManagerController.loadBuildFatReleaseBinaryStub = { _, product, _, _ in @@ -100,6 +100,9 @@ final class PluginArchiveServiceTests: TuistUnitTestCase { given(fileArchiverFactory).makeFileArchiver(for: .any).willReturn(fileArchiver) let zipPath = path.appending(components: "test-zip") given(fileArchiver).zip(name: .any).willReturn(zipPath) + given(fileArchiver) + .delete() + .willReturn() try fileHandler.createFolder(zipPath) // When diff --git a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift index 5778cb7e325..ab676328b14 100644 --- a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift @@ -14,7 +14,7 @@ import XCTest final class CachedManifestLoaderTests: TuistUnitTestCase { private var cacheDirectory: AbsolutePath! - private var manifestLoader = MockManifestLoader() + private var manifestLoader = MockManifestLoading() private var projectDescriptionHelpersHasher = MockProjectDescriptionHelpersHasher() private var helpersDirectoryLocator = MockHelpersDirectoryLocator() private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! @@ -49,37 +49,45 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { subject = createSubject() - manifestLoader.loadWorkspaceStub = { [unowned self] path in - guard let manifest = workspaceManifests[path] else { - throw ManifestLoaderError.manifestNotFound(.workspace, path) + given(manifestLoader) + .loadWorkspace(at: .any) + .willProduce { [unowned self] path in + guard let manifest = workspaceManifests[path] else { + throw ManifestLoaderError.manifestNotFound(.workspace, path) + } + recordedLoadWorkspaceCalls += 1 + return manifest } - recordedLoadWorkspaceCalls += 1 - return manifest - } - manifestLoader.loadProjectStub = { [unowned self] path in - guard let manifest = projectManifests[path] else { - throw ManifestLoaderError.manifestNotFound(.project, path) + given(manifestLoader) + .loadProject(at: .any) + .willProduce { [unowned self] path in + guard let manifest = projectManifests[path] else { + throw ManifestLoaderError.manifestNotFound(.project, path) + } + recordedLoadProjectCalls += 1 + return manifest } - recordedLoadProjectCalls += 1 - return manifest - } - manifestLoader.loadConfigStub = { [unowned self] path in - guard let manifest = configManifests[path] else { - throw ManifestLoaderError.manifestNotFound(.config, path) + given(manifestLoader) + .loadConfig(at: .any) + .willProduce { [unowned self] path in + guard let manifest = configManifests[path] else { + throw ManifestLoaderError.manifestNotFound(.config, path) + } + recordedLoadConfigCalls += 1 + return manifest } - recordedLoadConfigCalls += 1 - return manifest - } - manifestLoader.loadPluginStub = { [unowned self] path in - guard let manifest = pluginManifests[path] else { - throw ManifestLoaderError.manifestNotFound(.plugin, path) + given(manifestLoader) + .loadPlugin(at: .any) + .willProduce { [unowned self] path in + guard let manifest = pluginManifests[path] else { + throw ManifestLoaderError.manifestNotFound(.plugin, path) + } + recordedLoadPluginCalls += 1 + return manifest } - recordedLoadPluginCalls += 1 - return manifest - } } override func tearDown() { @@ -161,6 +169,9 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { let path = try temporaryPath().appending(component: "App") let project = Project.test(name: "App") try stubProject(project, at: path) + given(manifestLoader) + .register(plugins: .any) + .willReturn() try stubPlugins(withHash: "hash") _ = try subject.loadProject(at: path) @@ -270,28 +281,37 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { func test_validate_projectExists() throws { // Given let path = try temporaryPath().appending(component: "App") + given(manifestLoader) + .manifests(at: .any) + .willReturn([.project]) + given(manifestLoader) + .validateHasRootManifest(at: .value(path)) + .willReturn() - // When - manifestLoader.manifestsAtStub = { _ in [.project] } - - // Then + // When / Then try subject.validateHasRootManifest(at: path) } func test_validate_workspaceExists() throws { // Given let path = try temporaryPath().appending(component: "App") + given(manifestLoader) + .validateHasRootManifest(at: .value(path)) + .willReturn() + given(manifestLoader) + .manifests(at: .any) + .willReturn([.workspace]) - // When - manifestLoader.manifestsAtStub = { _ in [.workspace] } - - // Then + // When / Then try subject.validateHasRootManifest(at: path) } func test_validate_manifestDoesNotExist() throws { // Given let path = try temporaryPath().appending(component: "App") + given(manifestLoader) + .validateHasRootManifest(at: .value(path)) + .willThrow(ManifestLoaderError.manifestNotFound(path)) // When / Then XCTAssertThrowsSpecific( diff --git a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift index c43dfe642d6..3113ac3af76 100644 --- a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift @@ -1,4 +1,5 @@ import Foundation +import MockableTest import Path import ProjectDescription import TuistCore @@ -11,14 +12,16 @@ import XCTest @testable import TuistSupportTesting final class ConfigLoaderTests: TuistUnitTestCase { - private var rootDirectoryLocator = MockRootDirectoryLocator() - private var manifestLoader = MockManifestLoader() + private var rootDirectoryLocator: MockRootDirectoryLocating! + private var manifestLoader: MockManifestLoading! private var subject: ConfigLoader! private var registeredPaths: [AbsolutePath: Bool] = [:] private var registeredConfigs: [AbsolutePath: Result] = [:] override func setUp() { super.setUp() + rootDirectoryLocator = .init() + manifestLoader = .init() subject = ConfigLoader( manifestLoader: manifestLoader, rootDirectoryLocator: rootDirectoryLocator, @@ -27,19 +30,21 @@ final class ConfigLoaderTests: TuistUnitTestCase { fileHandler.stubExists = { [weak self] path in self?.registeredPaths[path] == true } - manifestLoader.loadConfigStub = { [weak self] path in - guard let self, - let config = registeredConfigs[path] - else { - throw ManifestLoaderError.manifestNotFound(.config, path) + given(manifestLoader) + .loadConfig(at: .any) + .willProduce { [weak self] path in + guard let self, + let config = registeredConfigs[path] + else { + throw ManifestLoaderError.manifestNotFound(.config, path) + } + return try config.get() } - return try config.get() - } } override func tearDown() { subject = nil - manifestLoader.loadConfigStub = nil + manifestLoader = nil fileHandler.stubExists = nil super.tearDown() } @@ -50,6 +55,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { // Given let path: AbsolutePath = "/some/random/path" stub(path: path, exists: false) + stub(rootDirectory: "/project") // When let result = try subject.loadConfig(path: path) @@ -66,6 +72,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { config: .test(), at: path.parentDirectory ) + stub(rootDirectory: "/project") // When let result = try subject.loadConfig(path: path) @@ -86,6 +93,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { let path: AbsolutePath = "/project/Tuist/Config.swift" stub(path: path, exists: true) stub(configError: TestError.testError, at: "/project/Tuist") + stub(rootDirectory: "/project") // When / Then XCTAssertThrowsSpecific(try subject.loadConfig(path: path), TestError.testError) @@ -136,7 +144,9 @@ final class ConfigLoaderTests: TuistUnitTestCase { } private func stub(rootDirectory: AbsolutePath) { - rootDirectoryLocator.locateStub = rootDirectory + given(rootDirectoryLocator) + .locate(from: .any) + .willReturn(rootDirectory) } private enum TestError: Error, Equatable { diff --git a/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift b/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift index e997070d9b0..8ef1e45f92a 100644 --- a/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ManifestModelConverterTests.swift @@ -1,4 +1,5 @@ import Foundation +import MockableTest import Path import TuistCore import TuistSupport @@ -320,30 +321,36 @@ class ManifestModelConverterTests: TuistUnitTestCase { with projects: [AbsolutePath: ProjectDescription.Project], configs: [AbsolutePath: ProjectDescription.Config] = [:] ) -> ManifestLoading { - let manifestLoader = MockManifestLoader() - manifestLoader.loadProjectStub = { path in - guard let manifest = projects[path] else { - throw ManifestLoaderError.manifestNotFound(path) + let manifestLoader = MockManifestLoading() + given(manifestLoader) + .loadProject(at: .any) + .willProduce { path in + guard let manifest = projects[path] else { + throw ManifestLoaderError.manifestNotFound(path) + } + return manifest } - return manifest - } - manifestLoader.loadConfigStub = { path in - guard let manifest = configs[path] else { - throw ManifestLoaderError.manifestNotFound(path) + given(manifestLoader) + .loadConfig(at: .any) + .willProduce { path in + guard let manifest = configs[path] else { + throw ManifestLoaderError.manifestNotFound(path) + } + return manifest } - return manifest - } - manifestLoader.manifestsAtStub = { path in - var manifests = Set() - if projects[path] != nil { - manifests.insert(.project) + given(manifestLoader) + .manifests(at: .any) + .willProduce { path in + var manifests = Set() + if projects[path] != nil { + manifests.insert(.project) + } + + if configs[path] != nil { + manifests.insert(.config) + } + return manifests } - - if configs[path] != nil { - manifests.insert(.config) - } - return manifests - } return manifestLoader } @@ -351,16 +358,20 @@ class ManifestModelConverterTests: TuistUnitTestCase { with workspaces: [AbsolutePath: ProjectDescription.Workspace], projects: [AbsolutePath] = [] ) -> ManifestLoading { - let manifestLoader = MockManifestLoader() - manifestLoader.loadWorkspaceStub = { path in - guard let manifest = workspaces[path] else { - throw ManifestLoaderError.manifestNotFound(path) + let manifestLoader = MockManifestLoading() + given(manifestLoader) + .loadWorkspace(at: .any) + .willProduce { path in + guard let manifest = workspaces[path] else { + throw ManifestLoaderError.manifestNotFound(path) + } + return manifest + } + given(manifestLoader) + .manifests(at: .any) + .willProduce { path in + projects.contains(path) ? Set([.project]) : Set([]) } - return manifest - } - manifestLoader.manifestsAtStub = { path in - projects.contains(path) ? Set([.project]) : Set([]) - } return manifestLoader } diff --git a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift index fa8ba2e949e..e2674eac908 100644 --- a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift @@ -14,7 +14,7 @@ import XCTest @testable import TuistSupportTesting final class PackageSettingsLoaderTests: TuistUnitTestCase { - private var manifestLoader: MockManifestLoader! + private var manifestLoader: MockManifestLoading! private var swiftPackageManagerController: MockSwiftPackageManagerController! private var manifestFilesLocator: MockManifestFilesLocating! private var subject: PackageSettingsLoader! @@ -22,7 +22,7 @@ final class PackageSettingsLoaderTests: TuistUnitTestCase { override func setUp() { super.setUp() - manifestLoader = MockManifestLoader() + manifestLoader = .init() swiftPackageManagerController = MockSwiftPackageManagerController() manifestFilesLocator = MockManifestFilesLocating() subject = PackageSettingsLoader( @@ -49,6 +49,14 @@ final class PackageSettingsLoaderTests: TuistUnitTestCase { .locatePackageManifest(at: .any) .willReturn(temporaryPath) + given(manifestLoader) + .register(plugins: .any) + .willReturn(()) + + given(manifestLoader) + .loadPackageSettings(at: .any) + .willReturn(.test()) + swiftPackageManagerController.getToolsVersionStub = { _ in TSCUtility.Version("5.4.9") } @@ -72,7 +80,9 @@ final class PackageSettingsLoaderTests: TuistUnitTestCase { targetSettings: [:], swiftToolsVersion: Version(stringLiteral: "5.4.9") ) - XCTAssertEqual(manifestLoader.registerPluginsCount, 1) + verify(manifestLoader) + .register(plugins: .any) + .called(1) XCTAssertEqual(got, expected) } } diff --git a/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift index d6484c31a05..4c567019d61 100644 --- a/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift @@ -6,12 +6,11 @@ import TuistSupport import XCTest @testable import TuistLoader -@testable import TuistLoaderTesting @testable import TuistSupportTesting final class RecursiveManifestLoaderTests: TuistUnitTestCase { private var path: AbsolutePath! - private var manifestLoader: MockManifestLoader! + private var manifestLoader: MockManifestLoading! private var packageInfoMapper: MockPackageInfoMapping! private var projectManifests: [AbsolutePath: Project] = [:] private var workspaceManifests: [AbsolutePath: Workspace] = [:] @@ -393,42 +392,50 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { packageManifests[manifestPath.parentDirectory] = manifest } - private func createManifestLoader() -> MockManifestLoader { - let manifestLoader = MockManifestLoader() - manifestLoader.loadProjectStub = { [unowned self] path in - guard let manifest = projectManifests[path] else { - throw ManifestLoaderError.manifestNotFound(.project, path) + private func createManifestLoader() -> MockManifestLoading { + let manifestLoader = MockManifestLoading() + given(manifestLoader) + .loadProject(at: .any) + .willProduce { [unowned self] path in + guard let manifest = projectManifests[path] else { + throw ManifestLoaderError.manifestNotFound(.project, path) + } + return manifest } - return manifest - } - manifestLoader.loadWorkspaceStub = { [unowned self] path in - guard let manifest = workspaceManifests[path] else { - throw ManifestLoaderError.manifestNotFound(.workspace, path) + given(manifestLoader) + .loadWorkspace(at: .any) + .willProduce { [unowned self] path in + guard let manifest = workspaceManifests[path] else { + throw ManifestLoaderError.manifestNotFound(.workspace, path) + } + return manifest } - return manifest - } - manifestLoader.loadPackageStub = { [unowned self] path in - guard let manifest = packageManifests[path] else { - throw ManifestLoaderError.manifestNotFound(.workspace, path) + given(manifestLoader) + .loadPackage(at: .any) + .willProduce { [unowned self] path in + guard let manifest = packageManifests[path] else { + throw ManifestLoaderError.manifestNotFound(.workspace, path) + } + return manifest } - return manifest - } - manifestLoader.manifestsAtStub = { [unowned self] path in - var manifests = Set() - if let _ = projectManifests[path] { - manifests.insert(.project) + given(manifestLoader) + .manifests(at: .any) + .willProduce { [unowned self] path in + var manifests = Set() + if let _ = projectManifests[path] { + manifests.insert(.project) + } + if let _ = workspaceManifests[path] { + manifests.insert(.workspace) + } + if let _ = packageManifests[path] { + manifests.insert(.package) + } + return manifests } - if let _ = workspaceManifests[path] { - manifests.insert(.workspace) - } - if let _ = packageManifests[path] { - manifests.insert(.package) - } - return manifests - } return manifestLoader } } diff --git a/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift index ca308d6b93c..950a5172918 100644 --- a/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift @@ -1,3 +1,4 @@ +import MockableTest import Path import TuistCore import TuistSupport @@ -5,16 +6,15 @@ import XCTest @testable import ProjectDescription @testable import TuistLoader -@testable import TuistLoaderTesting @testable import TuistSupportTesting final class TemplateLoaderTests: TuistUnitTestCase { var subject: TemplateLoader! - var manifestLoader: MockManifestLoader! + var manifestLoader: MockManifestLoading! override func setUp() { super.setUp() - manifestLoader = MockManifestLoader() + manifestLoader = .init() subject = TemplateLoader(manifestLoader: manifestLoader) } @@ -27,9 +27,14 @@ final class TemplateLoaderTests: TuistUnitTestCase { func test_loadTemplate_when_not_found() throws { // Given let temporaryPath = try temporaryPath() - manifestLoader.loadTemplateStub = { path in - throw ManifestLoaderError.manifestNotFound(path) - } + given(manifestLoader) + .loadTemplate(at: .any) + .willProduce { path in + throw ManifestLoaderError.manifestNotFound(path) + } + given(manifestLoader) + .register(plugins: .any) + .willReturn(()) // Then XCTAssertThrowsSpecific( @@ -41,15 +46,21 @@ final class TemplateLoaderTests: TuistUnitTestCase { func test_loadTemplate_files() throws { // Given let temporaryPath = try temporaryPath() - manifestLoader.loadTemplateStub = { _ in - ProjectDescription.Template( - description: "desc", - items: [ProjectDescription.Template.Item( - path: "generateOne", - contents: .file("fileOne") - )] + given(manifestLoader) + .loadTemplate(at: .any) + .willReturn( + ProjectDescription.Template( + description: "desc", + items: [ProjectDescription.Template.Item( + path: "generateOne", + contents: .file("fileOne") + )] + ) ) - } + + given(manifestLoader) + .register(plugins: .any) + .willReturn(()) // When let got = try subject.loadTemplate(at: temporaryPath, plugins: .none) diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Workspace+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Workspace+ManifestMapperTests.swift new file mode 100644 index 00000000000..c036b53e9ea --- /dev/null +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Workspace+ManifestMapperTests.swift @@ -0,0 +1,70 @@ +import Foundation +import MockableTest +import TuistCore +import TuistLoader +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistLoader + +final class WorkspaceManifestMapperTests: TuistUnitTestCase { + private var manifestLoader: MockManifestLoading! + private var rootDirectoryLocator: MockRootDirectoryLocating! + + override func setUp() { + super.setUp() + + manifestLoader = .init() + rootDirectoryLocator = .init() + } + + override func tearDown() { + manifestLoader = nil + rootDirectoryLocator = nil + super.tearDown() + } + + func test_from_when_using_glob_for_projects() throws { + // Given + given(manifestLoader) + .manifests(at: .any) + .willReturn([.project]) + + let workspacePath = try temporaryPath() + + given(rootDirectoryLocator) + .locate(from: .any) + .willReturn(workspacePath) + + try fileHandler.createFolder(workspacePath.appending(components: ".build", "checkouts")) + + // When + let got = try XcodeGraph.Workspace.from( + manifest: .test( + projects: [ + "**", + ] + ), + path: workspacePath, + generatorPaths: .init( + manifestDirectory: workspacePath, + rootDirectoryLocator: rootDirectoryLocator + ), + manifestLoader: manifestLoader + ) + + // Then + XCTAssertBetterEqual( + got, + XcodeGraph.Workspace( + path: workspacePath, + xcWorkspacePath: workspacePath.appending(component: "Workspace.xcworkspace"), + name: "Workspace", + projects: [ + workspacePath, + ] + ) + ) + } +} diff --git a/Tests/TuistLoaderTests/Models/GeneratorPathsTests.swift b/Tests/TuistLoaderTests/Models/GeneratorPathsTests.swift index 5aa1539bd26..9321c17dc8e 100644 --- a/Tests/TuistLoaderTests/Models/GeneratorPathsTests.swift +++ b/Tests/TuistLoaderTests/Models/GeneratorPathsTests.swift @@ -1,3 +1,4 @@ +import MockableTest import Path import TuistCore import TuistSupport @@ -9,7 +10,7 @@ import XCTest @testable import TuistLoaderTesting @testable import TuistSupportTesting -class GeneratorPathsErrorTests: TuistUnitTestCase { +final class GeneratorPathsErrorTests: TuistUnitTestCase { func test_type_when_rootDirectoryNotFound() { // Given let path = try! AbsolutePath(validating: "/") @@ -35,13 +36,12 @@ class GeneratorPathsErrorTests: TuistUnitTestCase { class GeneratorPathsTests: TuistUnitTestCase { var subject: GeneratorPaths! var path: AbsolutePath! - var rootDirectoryLocator: MockRootDirectoryLocator! + var rootDirectoryLocator: MockRootDirectoryLocating! override func setUp() { super.setUp() path = try! temporaryPath() - rootDirectoryLocator = MockRootDirectoryLocator() - rootDirectoryLocator.locateStub = path.appending(component: "Root") + rootDirectoryLocator = .init() subject = GeneratorPaths( manifestDirectory: path, rootDirectoryLocator: rootDirectoryLocator @@ -62,6 +62,9 @@ class GeneratorPathsTests: TuistUnitTestCase { type: .relativeToCurrentFile, callerPath: path.pathString ) + given(rootDirectoryLocator) + .locate(from: .any) + .willReturn(path.appending(component: "Root")) // When let got = try subject.resolve(path: filePath) @@ -73,6 +76,9 @@ class GeneratorPathsTests: TuistUnitTestCase { func test_resolve_when_relative_to_manifest() throws { // Given let filePath = Path.relativeToManifest("file.swift") + given(rootDirectoryLocator) + .locate(from: .any) + .willReturn(path.appending(component: "Root")) // When let got = try subject.resolve(path: filePath) @@ -84,6 +90,9 @@ class GeneratorPathsTests: TuistUnitTestCase { func test_resolve_when_relative_to_root_directory() throws { // Given let filePath = Path.relativeToRoot("file.swift") + given(rootDirectoryLocator) + .locate(from: .any) + .willReturn(path.appending(component: "Root")) // When let got = try subject.resolve(path: filePath) @@ -95,7 +104,9 @@ class GeneratorPathsTests: TuistUnitTestCase { func test_resolve_throws_when_the_root_directory_cant_be_found() throws { // Given let filePath = Path.relativeToRoot("file.swift") - rootDirectoryLocator.locateStub = nil + given(rootDirectoryLocator) + .locate(from: .any) + .willReturn(nil) // When XCTAssertThrowsSpecific(try subject.resolve(path: filePath), GeneratorPathsError.rootDirectoryNotFound(path)) diff --git a/Tests/TuistPluginTests/PluginServiceTests.swift b/Tests/TuistPluginTests/PluginServiceTests.swift index f6ead93f450..c3c951b6e30 100644 --- a/Tests/TuistPluginTests/PluginServiceTests.swift +++ b/Tests/TuistPluginTests/PluginServiceTests.swift @@ -6,7 +6,6 @@ import TSCBasic import TuistCore import TuistCoreTesting import TuistLoader -import TuistLoaderTesting import TuistScaffold import TuistScaffoldTesting import TuistSupport @@ -16,7 +15,7 @@ import XCTest @testable import TuistPlugin final class PluginServiceTests: TuistUnitTestCase { - private var manifestLoader: MockManifestLoader! + private var manifestLoader: MockManifestLoading! private var templatesDirectoryLocator: MockTemplatesDirectoryLocator! private var gitHandler: MockGitHandler! private var subject: PluginService! @@ -27,7 +26,7 @@ final class PluginServiceTests: TuistUnitTestCase { override func setUp() { super.setUp() - manifestLoader = MockManifestLoader() + manifestLoader = .init() templatesDirectoryLocator = MockTemplatesDirectoryLocator() gitHandler = MockGitHandler() let mockCacheDirectoriesProvider = MockCacheDirectoriesProviding() @@ -245,13 +244,17 @@ final class PluginServiceTests: TuistUnitTestCase { let pluginPath = try temporaryPath().appending(component: "Plugin") let pluginName = "TestPlugin" - manifestLoader.loadConfigStub = { _ in - .test(plugins: [.local(path: .relativeToRoot(pluginPath.pathString))]) - } + given(manifestLoader) + .loadConfig(at: .any) + .willReturn( + .test(plugins: [.local(path: .relativeToRoot(pluginPath.pathString))]) + ) - manifestLoader.loadPluginStub = { _ in - ProjectDescription.Plugin(name: pluginName) - } + given(manifestLoader) + .loadPlugin(at: .any) + .willReturn( + ProjectDescription.Plugin(name: pluginName) + ) let config = mockConfig(plugins: [TuistCore.PluginLocation.local(path: pluginPath.pathString)]) @@ -283,13 +286,17 @@ final class PluginServiceTests: TuistUnitTestCase { .appending(components: pluginFingerprint, PluginServiceConstants.repository) let pluginName = "TestPlugin" - manifestLoader.loadConfigStub = { _ in - .test(plugins: [ProjectDescription.PluginLocation.git(url: pluginGitUrl, tag: pluginGitReference)]) - } + given(manifestLoader) + .loadConfig(at: .any) + .willReturn( + .test(plugins: [ProjectDescription.PluginLocation.git(url: pluginGitUrl, tag: pluginGitReference)]) + ) - manifestLoader.loadPluginStub = { _ in - ProjectDescription.Plugin(name: pluginName) - } + given(manifestLoader) + .loadPlugin(at: .any) + .willReturn( + ProjectDescription.Plugin(name: pluginName) + ) try fileHandler.createFolder(cachedPluginPath.appending(component: Constants.helpersDirectoryName)) @@ -323,13 +330,17 @@ final class PluginServiceTests: TuistUnitTestCase { try makeDirectories(.init(validating: resourceTemplatesPath.pathString)) - manifestLoader.loadConfigStub = { _ in - .test(plugins: [.local(path: .relativeToRoot(pluginPath.pathString))]) - } + given(manifestLoader) + .loadConfig(at: .any) + .willReturn( + .test(plugins: [.local(path: .relativeToRoot(pluginPath.pathString))]) + ) - manifestLoader.loadPluginStub = { _ in - ProjectDescription.Plugin(name: pluginName) - } + given(manifestLoader) + .loadPlugin(at: .any) + .willReturn( + ProjectDescription.Plugin(name: pluginName) + ) let config = mockConfig(plugins: [TuistCore.PluginLocation.local(path: pluginPath.pathString)]) @@ -358,13 +369,16 @@ final class PluginServiceTests: TuistUnitTestCase { try makeDirectories(.init(validating: resourceTemplatesPath.pathString)) - manifestLoader.loadConfigStub = { _ in - .test(plugins: [ProjectDescription.PluginLocation.git(url: pluginGitUrl, tag: pluginGitReference)]) - } - - manifestLoader.loadPluginStub = { _ in - ProjectDescription.Plugin(name: pluginName) - } + given(manifestLoader) + .loadConfig(at: .any) + .willReturn( + .test(plugins: [ProjectDescription.PluginLocation.git(url: pluginGitUrl, tag: pluginGitReference)]) + ) + given(manifestLoader) + .loadPlugin(at: .any) + .willReturn( + ProjectDescription.Plugin(name: pluginName) + ) let config = mockConfig(plugins: [ @@ -400,13 +414,16 @@ final class PluginServiceTests: TuistUnitTestCase { try makeDirectories(.init(validating: templatePath.pathString)) // When - manifestLoader.loadConfigStub = { _ in - .test(plugins: [.local(path: .relativeToRoot(pluginPath.pathString))]) - } - - manifestLoader.loadPluginStub = { _ in - ProjectDescription.Plugin(name: pluginName) - } + given(manifestLoader) + .loadConfig(at: .any) + .willReturn( + .test(plugins: [.local(path: .relativeToRoot(pluginPath.pathString))]) + ) + given(manifestLoader) + .loadPlugin(at: .any) + .willReturn( + ProjectDescription.Plugin(name: pluginName) + ) let config = mockConfig(plugins: [TuistCore.PluginLocation.local(path: pluginPath.pathString)]) @@ -437,13 +454,17 @@ final class PluginServiceTests: TuistUnitTestCase { try makeDirectories(.init(validating: templatePath.pathString)) // When - manifestLoader.loadConfigStub = { _ in - .test(plugins: [ProjectDescription.PluginLocation.git(url: pluginGitUrl, tag: pluginGitReference)]) - } - - manifestLoader.loadPluginStub = { _ in - ProjectDescription.Plugin(name: pluginName) - } + given(manifestLoader) + .loadConfig(at: .any) + .willReturn( + .test(plugins: [ProjectDescription.PluginLocation.git(url: pluginGitUrl, tag: pluginGitReference)]) + ) + + given(manifestLoader) + .loadPlugin(at: .any) + .willReturn( + ProjectDescription.Plugin(name: pluginName) + ) let config = mockConfig(plugins: [ diff --git a/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift b/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift index a9d76d5fcc1..8ec50c2bcfd 100644 --- a/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift +++ b/Tests/TuistServerTests/Services/AnalyticsArtifactUploadServiceTests.swift @@ -132,6 +132,14 @@ final class AnalyticsArtifactUploadServiceTests: TuistTestCase { ) .willReturn("upload-id") + given(completeAnalyticsArtifactsUploadsService) + .completeAnalyticsArtifactsUploads( + modules: .any, + commandEventId: .any, + serverURL: .value(serverURL) + ) + .willReturn() + given(multipartUploadArtifactService) .multipartUploadArtifact( artifactPath: .value(resultBundle.parentDirectory.appending(component: "\(testResultBundleObjectId).json")), diff --git a/Tests/TuistServerTests/Session/CloudSessionControllerTests.swift b/Tests/TuistServerTests/Session/CloudSessionControllerTests.swift index 50521b884cd..c8cba5356b1 100644 --- a/Tests/TuistServerTests/Session/CloudSessionControllerTests.swift +++ b/Tests/TuistServerTests/Session/CloudSessionControllerTests.swift @@ -55,6 +55,9 @@ final class CloudSessionControllerTests: TuistUnitTestCase { given(credentialsStore) .read(serverURL: .value(serverURL)) .willReturn(CloudCredentials(token: "token")) + given(credentialsStore) + .store(credentials: .any, serverURL: .value(serverURL)) + .willReturn() // When try await subject.authenticate(serverURL: serverURL) @@ -107,8 +110,15 @@ final class CloudSessionControllerTests: TuistUnitTestCase { func test_logout_deletesTheCredentials() throws { // Given let credentials = CloudCredentials(token: "token") + given(credentialsStore) + .store(credentials: .value(credentials), serverURL: .value(serverURL)) + .willReturn() try credentialsStore.store(credentials: credentials, serverURL: serverURL) + given(credentialsStore) + .delete(serverURL: .value(serverURL)) + .willReturn() + // When try subject.logout(serverURL: serverURL) From 2a0d93c370a6d068b38b83f5c6a06f8adcd34e21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 3 Jul 2024 00:14:54 +0200 Subject: [PATCH 398/509] Change tuist project subcommands to accept full handle (#6472) * tuist project subcommands accept full handle instead of project handle with an organization as an option * Fix failing tests * Remove CloudInitServiceTests --- .../Commands/Cloud/CloudInitCommand.swift | 14 +- .../Cloud/CloudProjectCreateCommand.swift | 16 +-- .../Cloud/CloudProjectDeleteCommand.swift | 16 +-- .../Cloud/CloudProjectTokenCommand.swift | 16 +-- Sources/TuistKit/Commands/EnvKey/EnvKey.swift | 7 +- .../Services/Cloud/CloudInitService.swift | 9 +- .../Cloud/CloudProjectCreateService.swift | 9 +- .../Cloud/CloudProjectDeleteService.swift | 11 +- .../Cloud/CloudProjectTokenService.swift | 11 +- Sources/TuistServer/OpenAPI/Types.swift | 17 ++- Sources/TuistServer/OpenAPI/cloud.yml | 8 +- .../Services/CreateProjectService.swift | 9 +- .../Services/GetProjectService.swift | 23 +++- .../ServerAcceptanceTests.swift | 15 ++- .../Cloud/CloudInitServiceTests.swift | 126 ------------------ .../CloudProjectDeleteServiceTests.swift | 7 +- .../CommandEnvironmentVariableTests.swift | 54 ++------ docs/docs/cloud/get-started.md | 6 +- 18 files changed, 95 insertions(+), 279 deletions(-) delete mode 100644 Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift diff --git a/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift index d3075793f75..78ae651b939 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift @@ -13,18 +13,11 @@ struct CloudInitCommand: AsyncParsableCommand { } @Argument( - help: "The name of the project to create.", + help: "The project to initialize the Tuist project with. Must be in the format of account-handle/project-handle.", completion: .directory, envKey: .cloudInitName ) - var name: String - - @Option( - name: .shortAndLong, - help: "Organization to initialize the Cloud project with. If not specified, the project is created with your personal Cloud account.", - envKey: .cloudInitOrganization - ) - var organization: String? + var fullHandle: String @Option( name: .shortAndLong, @@ -36,8 +29,7 @@ struct CloudInitCommand: AsyncParsableCommand { func run() async throws { try await CloudInitService().createProject( - name: name, - organization: organization, + fullHandle: fullHandle, directory: path ) } diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift index 0063f07684d..3193b01885e 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift @@ -13,18 +13,11 @@ struct CloudProjectCreateCommand: AsyncParsableCommand { } @Argument( - help: "The name of the project to create.", + help: "The project to create. The full handle must be in the format of account-handle/project-handle.", completion: .directory, - envKey: .cloudProjectCreateName + envKey: .projectCreateFullHandle ) - var name: String - - @Option( - name: .shortAndLong, - help: "Organization to create the project with. If not specified, the project is created with your personal cloud account.", - envKey: .cloudProjectCreateOrganization - ) - var organization: String? + var fullHandle: String @Option( name: .shortAndLong, @@ -36,8 +29,7 @@ struct CloudProjectCreateCommand: AsyncParsableCommand { func run() async throws { try await CloudProjectCreateService().run( - name: name, - organization: organization, + fullHandle: fullHandle, directory: path ) } diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift index eff308c873a..7b35a1eaa5b 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift @@ -12,18 +12,11 @@ struct CloudProjectDeleteCommand: AsyncParsableCommand { } @Argument( - help: "The project to delete.", + help: "The project to delete. Must be in the format of account-handle/project-handle.", completion: .directory, - envKey: .cloudProjectDeleteProject + envKey: .projectDeleteFullHandle ) - var project: String - - @Option( - name: .shortAndLong, - help: "The organization that the project belongs to. By default, this is your personal Tuist Cloud account.", - envKey: .cloudProjectDeleteOrganization - ) - var organization: String + var fullHandle: String @Option( name: .shortAndLong, @@ -35,8 +28,7 @@ struct CloudProjectDeleteCommand: AsyncParsableCommand { func run() async throws { try await CloudProjectDeleteService().run( - projectName: project, - organizationName: organization, + fullHandle: fullHandle, directory: path ) } diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift index f8003f51fec..94f6dc9d201 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift +++ b/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift @@ -13,18 +13,11 @@ struct CloudProjectTokenCommand: AsyncParsableCommand { } @Argument( - help: "The name of the project to get the token for.", + help: "The project to get the token for. Must be in the format of account-handle/project-handle.", completion: .directory, - envKey: .cloudProjectTokenProjectName + envKey: .projectTokenFullHandle ) - var projectName: String - - @Option( - name: .shortAndLong, - help: "Organization of the project. If not specified, it defaults to your user account.", - envKey: .cloudProjectTokenOrganizationName - ) - var organizationName: String + var fullHandle: String @Option( name: .shortAndLong, @@ -36,8 +29,7 @@ struct CloudProjectTokenCommand: AsyncParsableCommand { func run() async throws { try await CloudProjectTokenService().run( - projectName: projectName, - organizationName: organizationName, + fullHandle: fullHandle, directory: path ) } diff --git a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift index bd8076ca043..a81600585af 100644 --- a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift +++ b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift @@ -141,9 +141,8 @@ public enum EnvKey: String, CaseIterable { case cloudOrganizationDeletePath = "TUIST_CLOUD_ORGANIZATION_DELETE_PATH" // CLOUD PROJECT TOKEN - case cloudProjectTokenProjectName = "TUIST_CLOUD_PROJECT_TOKEN_PROJECT_NAME" - case cloudProjectTokenOrganizationName = "TUIST_CLOUD_PROJECT_TOKEN_ORGANIZATION_NAME" case cloudProjectTokenPath = "TUIST_CLOUD_PROJECT_TOKEN_PATH" + case projectTokenFullHandle = "TUIST_PROJECT_TOKEN_FULL_HANDLE" // CLOUD ORGANIZATION LIST case cloudOrganizationListJson = "TUIST_CLOUD_ORGANIZATION_LIST_JSON" @@ -170,12 +169,12 @@ public enum EnvKey: String, CaseIterable { case cloudOrganizationUpdateSSOPath = "TUIST_CLOUD_ORGANIZATION_UPDATE_SSO_PATH" // CLOUD PROJECT DELETE - case cloudProjectDeleteProject = "TUIST_CLOUD_PROJECT_DELETE_PROJECT" + case projectDeleteFullHandle = "TUIST_PROJECT_DELETE_FULL_HANDLE" case cloudProjectDeleteOrganization = "TUIST_CLOUD_PROJECT_DELETE_ORGANIZATION" case cloudProjectDeletePath = "TUIST_CLOUD_PROJECT_DELETE_PATH" // CLOUD PROJECT CREATE - case cloudProjectCreateName = "TUIST_CLOUD_PROJECT_CREATE_NAME" + case projectCreateFullHandle = "TUIST_PROJECT_CREATE_FULL_HANDLE" case cloudProjectCreateOrganization = "TUIST_CLOUD_PROJECT_CREATE_ORGANIZATION" case cloudProjectCreatePath = "TUIST_CLOUD_PROJECT_CREATE_PATH" diff --git a/Sources/TuistKit/Services/Cloud/CloudInitService.swift b/Sources/TuistKit/Services/Cloud/CloudInitService.swift index 9937a4f6d77..280ecdf9e55 100644 --- a/Sources/TuistKit/Services/Cloud/CloudInitService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudInitService.swift @@ -6,8 +6,7 @@ import TuistSupport protocol CloudInitServicing { func createProject( - name: String, - organization: String?, + fullHandle: String, directory: String? ) async throws } @@ -51,8 +50,7 @@ final class CloudInitService: CloudInitServicing { } func createProject( - name: String, - organization: String?, + fullHandle: String, directory: String? ) async throws { let directoryPath: AbsolutePath @@ -69,8 +67,7 @@ final class CloudInitService: CloudInitServicing { } let project = try await createProjectService.createProject( - name: name, - organization: organization, + fullHandle: fullHandle, serverURL: cloudURL ) diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift b/Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift index f2f9998b6f6..c70eefd567b 100644 --- a/Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift @@ -6,8 +6,7 @@ import TuistSupport protocol CloudProjectCreateServicing { func run( - name: String, - organization: String?, + fullHandle: String, directory: String? ) async throws } @@ -28,8 +27,7 @@ final class CloudProjectCreateService: CloudProjectCreateServicing { } func run( - name: String, - organization: String?, + fullHandle: String, directory: String? ) async throws { let directoryPath: AbsolutePath @@ -43,8 +41,7 @@ final class CloudProjectCreateService: CloudProjectCreateServicing { let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) let project = try await createProjectService.createProject( - name: name, - organization: organization, + fullHandle: fullHandle, serverURL: cloudURL ) diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift b/Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift index af895bc37d5..5f1ca968ef7 100644 --- a/Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift @@ -6,8 +6,7 @@ import TuistSupport protocol CloudProjectDeleteServicing { func run( - projectName: String, - organizationName: String, + fullHandle: String, directory: String? ) async throws } @@ -34,8 +33,7 @@ final class CloudProjectDeleteService: CloudProjectDeleteServicing { } func run( - projectName: String, - organizationName: String, + fullHandle: String, directory: String? ) async throws { let directoryPath: AbsolutePath @@ -47,11 +45,8 @@ final class CloudProjectDeleteService: CloudProjectDeleteServicing { let config = try configLoader.loadConfig(path: directoryPath) let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) - let accountName: String = organizationName - let project = try await getProjectService.getProject( - accountName: accountName, - projectName: projectName, + fullHandle: fullHandle, serverURL: cloudURL ) diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift b/Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift index 2f4ae3224db..661d203b498 100644 --- a/Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift +++ b/Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift @@ -6,8 +6,7 @@ import TuistSupport protocol CloudProjectTokenServicing { func run( - projectName: String, - organizationName: String, + fullHandle: String, directory: String? ) async throws } @@ -31,8 +30,7 @@ final class CloudProjectTokenService: CloudProjectTokenServicing { } func run( - projectName: String, - organizationName: String, + fullHandle: String, directory: String? ) async throws { let directoryPath: AbsolutePath @@ -44,11 +42,8 @@ final class CloudProjectTokenService: CloudProjectTokenServicing { let config = try configLoader.loadConfig(path: directoryPath) let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) - let accountName: String = organizationName - let project = try await getProjectService.getProject( - accountName: accountName, - projectName: projectName, + fullHandle: fullHandle, serverURL: cloudURL ) diff --git a/Sources/TuistServer/OpenAPI/Types.swift b/Sources/TuistServer/OpenAPI/Types.swift index e78584964a0..a3edbd890b2 100644 --- a/Sources/TuistServer/OpenAPI/Types.swift +++ b/Sources/TuistServer/OpenAPI/Types.swift @@ -5686,24 +5686,35 @@ public enum Operations { /// /// - Remark: Generated from `#/paths/api/projects/POST/json`. public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// The full handle of the project that should be created. + /// + /// - Remark: Generated from `#/paths/api/projects/POST/json/full_handle`. + public var full_handle: Swift.String? /// The name of the project that should be created. /// /// - Remark: Generated from `#/paths/api/projects/POST/json/name`. - public var name: Swift.String + @available(*, deprecated) public var name: Swift.String? /// Organization to create the project with. If not specified, the project will be created with the current user's personal account. /// /// - Remark: Generated from `#/paths/api/projects/POST/json/organization`. - public var organization: Swift.String? + @available(*, deprecated) public var organization: Swift.String? /// Creates a new `jsonPayload`. /// /// - Parameters: + /// - full_handle: The full handle of the project that should be created. /// - name: The name of the project that should be created. /// - organization: Organization to create the project with. If not specified, the project will be created with the current user's personal account. - public init(name: Swift.String, organization: Swift.String? = nil) { + public init( + full_handle: Swift.String? = nil, + name: Swift.String? = nil, + organization: Swift.String? = nil + ) { + self.full_handle = full_handle self.name = name self.organization = organization } public enum CodingKeys: String, CodingKey { + case full_handle case name case organization } diff --git a/Sources/TuistServer/OpenAPI/cloud.yml b/Sources/TuistServer/OpenAPI/cloud.yml index b6f0e7b61fb..cb636e398ff 100644 --- a/Sources/TuistServer/OpenAPI/cloud.yml +++ b/Sources/TuistServer/OpenAPI/cloud.yml @@ -1510,14 +1510,18 @@ paths: application/json: schema: properties: + full_handle: + description: The full handle of the project that should be created. + example: tuist/tuist + type: string name: + deprecated: true description: The name of the project that should be created. type: string organization: + deprecated: true description: Organization to create the project with. If not specified, the project will be created with the current user's personal account. type: string - required: - - name type: object description: Projects params required: false diff --git a/Sources/TuistServer/Services/CreateProjectService.swift b/Sources/TuistServer/Services/CreateProjectService.swift index 8e0f4af41ab..7ffcb1d70ee 100644 --- a/Sources/TuistServer/Services/CreateProjectService.swift +++ b/Sources/TuistServer/Services/CreateProjectService.swift @@ -6,8 +6,7 @@ import TuistSupport @Mockable public protocol CreateProjectServicing { func createProject( - name: String, - organization: String?, + fullHandle: String, serverURL: URL ) async throws -> CloudProject } @@ -41,8 +40,7 @@ public final class CreateProjectService: CreateProjectServicing { public init() {} public func createProject( - name: String, - organization: String?, + fullHandle: String, serverURL: URL ) async throws -> CloudProject { let client = Client.cloud(serverURL: serverURL) @@ -51,8 +49,7 @@ public final class CreateProjectService: CreateProjectServicing { .init( body: .json( .init( - name: name, - organization: organization + full_handle: fullHandle ) ) ) diff --git a/Sources/TuistServer/Services/GetProjectService.swift b/Sources/TuistServer/Services/GetProjectService.swift index a7e36b40890..b37643053c5 100644 --- a/Sources/TuistServer/Services/GetProjectService.swift +++ b/Sources/TuistServer/Services/GetProjectService.swift @@ -6,8 +6,7 @@ import TuistSupport @Mockable public protocol GetProjectServicing { func getProject( - accountName: String, - projectName: String, + fullHandle: String, serverURL: URL ) async throws -> CloudProject } @@ -17,12 +16,13 @@ enum GetProjectServiceError: FatalError { case notFound(String) case forbidden(String) case unauthorized(String) + case invalidHandle(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .forbidden, .notFound, .unauthorized: + case .forbidden, .notFound, .unauthorized, .invalidHandle: return .abort } } @@ -31,6 +31,8 @@ enum GetProjectServiceError: FatalError { switch self { case let .unknownError(statusCode): return "We could not get the project due to an unknown cloud response of \(statusCode)." + case let .invalidHandle(fullHandle): + return "The project full handle \(fullHandle) is not in the format of account-handle/project-handle." case let .forbidden(message), let .notFound(message), let .unauthorized(message): return message } @@ -41,17 +43,24 @@ public final class GetProjectService: GetProjectServicing { public init() {} public func getProject( - accountName: String, - projectName: String, + fullHandle: String, serverURL: URL ) async throws -> CloudProject { let client = Client.cloud(serverURL: serverURL) + let components = fullHandle.components(separatedBy: "/") + guard components.count == 2 + else { + throw GetProjectServiceError.invalidHandle(fullHandle) + } + + let accountHandle = components[0] + let projectHandle = components[1] let response = try await client.showProject( .init( path: .init( - account_name: accountName, - project_name: projectName + account_name: accountHandle, + project_name: projectHandle ) ) ) diff --git a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift index 05867514b95..79844a7bae5 100644 --- a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift @@ -8,14 +8,15 @@ import XCTest final class ServerAcceptanceTestProjects: TuistAcceptanceTestCase { func test_create_and_delete_organization_with_project() async throws { try setUpFixture(.iosAppWithFrameworks) - let organizationName = String(UUID().uuidString.prefix(12).lowercased()) - let projectName = String(UUID().uuidString.prefix(12).lowercased()) - try await run(CloudOrganizationCreateCommand.self, organizationName) - try await run(CloudProjectCreateCommand.self, projectName, "--organization", organizationName) + let organizationHandle = String(UUID().uuidString.prefix(12).lowercased()) + let projectHandle = String(UUID().uuidString.prefix(12).lowercased()) + let fullHandle = "\(organizationHandle)/\(projectHandle)" + try await run(CloudOrganizationCreateCommand.self, organizationHandle) + try await run(CloudProjectCreateCommand.self, fullHandle) try await run(CloudProjectListCommand.self) - try await run(CloudProjectDeleteCommand.self, projectName, "--organization", organizationName) - try await run(CloudOrganizationDeleteCommand.self, organizationName) + try await run(CloudProjectDeleteCommand.self, fullHandle) + try await run(CloudOrganizationDeleteCommand.self, organizationHandle) XCTAssertStandardOutput(pattern: "Listing all your projects:") - XCTAssertStandardOutput(pattern: "• \(organizationName)/\(projectName)") + XCTAssertStandardOutput(pattern: "• \(fullHandle)") } } diff --git a/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift deleted file mode 100644 index 204865c9f6f..00000000000 --- a/Tests/TuistKitTests/Cloud/CloudInitServiceTests.swift +++ /dev/null @@ -1,126 +0,0 @@ -import MockableTest -import Path -import TuistCore -import TuistLoader -import TuistServer -import TuistSupport -import XcodeGraph -import XCTest - -@testable import TuistKit -@testable import TuistSupportTesting - -final class CloudInitServiceTests: TuistUnitTestCase { - private var cloudSessionController: MockCloudSessionControlling! - private var createProjectService: MockCreateProjectServicing! - private var configLoader: MockConfigLoading! - private var cloudURL: URL! - private var subject: CloudInitService! - - override func setUp() { - super.setUp() - cloudSessionController = MockCloudSessionControlling() - createProjectService = .init() - configLoader = MockConfigLoading() - cloudURL = URL(string: "https://test.cloud.tuist.io")! - subject = CloudInitService( - cloudSessionController: cloudSessionController, - createProjectService: createProjectService, - configLoader: configLoader - ) - } - - override func tearDown() { - cloudSessionController = nil - createProjectService = nil - configLoader = nil - subject = nil - super.tearDown() - } - - func test_cloud_init_when_config_exists() async throws { - // Given - given(createProjectService) - .createProject( - name: .value("tuist"), - organization: .value("tuist-org"), - serverURL: .value(URL(string: Constants.URLs.production)!) - ) - .willReturn(.test(fullName: "tuist/test")) - given(configLoader) - .loadConfig(path: .any) - .willReturn(Config.test(cloud: nil)) - given(configLoader) - .locateConfig(at: .any) - .willReturn(AbsolutePath("/some-path")) - - // When - try await subject.createProject( - name: "tuist", - organization: "tuist-org", - directory: nil - ) - - // Then - XCTAssertPrinterOutputContains(""" - Put the following line into your Tuist/Config.swift (see the docs for more: https://docs.tuist.io/manifests/config/): - cloud: .cloud(projectId: "tuist/test") - """) - } - - func test_cloud_init_when_config_does_not_exist() async throws { - // Given - var content: String? - given(configLoader) - .locateConfig(at: .any) - .willReturn(nil) - given(configLoader) - .loadConfig(path: .any) - .willReturn(.default) - fileHandler.stubWrite = { stubContent, _, _ in content = stubContent } - given(createProjectService) - .createProject( - name: .value("tuist"), - organization: .value("tuist-org"), - serverURL: .value(URL(string: Constants.URLs.production)!) - ) - .willReturn(.test(fullName: "tuist/test")) - - // When - try await subject.createProject( - name: "tuist", - organization: "tuist-org", - directory: nil - ) - - // Then - XCTAssertEqual(""" - import ProjectDescription - - let config = Config( - cloud: .cloud(projectId: "tuist/test") - ) - - """, content) - XCTAssertPrinterOutputContains("Tuist Cloud was successfully initialized.") - } - - func test_cloud_init_when_cloud_exists() async throws { - // Given - given(configLoader) - .loadConfig(path: .any) - .willReturn( - Config.test(cloud: Cloud.test(url: cloudURL)) - ) - - // When / Then - await XCTAssertThrowsSpecific( - try await subject.createProject( - name: "tuist", - organization: "tuist-org", - directory: nil - ), - CloudInitServiceError.cloudAlreadySetUp - ) - } -} diff --git a/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift index b5231896588..c8db8bcd6dc 100644 --- a/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift +++ b/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift @@ -49,12 +49,11 @@ final class CloudProjectDeleteServiceTests: TuistUnitTestCase { // Given given(getProjectService) .getProject( - accountName: .value("tuist"), - projectName: .value("project"), + fullHandle: .value("tuist-org/tuist"), serverURL: .value(cloudURL) ) .willReturn( - .test(id: 0, fullName: "tuist/tuist") + .test(id: 0, fullName: "tuist-org/tuist") ) given(deleteProjectService) .deleteProject( @@ -68,6 +67,6 @@ final class CloudProjectDeleteServiceTests: TuistUnitTestCase { .willReturn(.init(token: "token")) // When / Then - try await subject.run(projectName: "project", organizationName: "tuist", directory: nil) + try await subject.run(fullHandle: "tuist-org/tuist", directory: nil) } } diff --git a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift index 2466d46e197..700a173f8ae 100644 --- a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift +++ b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift @@ -623,22 +623,18 @@ final class CommandEnvironmentVariableTests: XCTestCase { } func testCloudProjectTokenCommandUsesEnvVars() throws { - setVariable(.cloudProjectTokenProjectName, value: "ProjectName") - setVariable(.cloudProjectTokenOrganizationName, value: "OrganizationName") + setVariable(.projectTokenFullHandle, value: "tuist-org/tuist") setVariable(.cloudProjectTokenPath, value: "/path/to/token") let commandWithEnvVars = try CloudProjectTokenCommand.parse([]) - XCTAssertEqual(commandWithEnvVars.projectName, "ProjectName") - XCTAssertEqual(commandWithEnvVars.organizationName, "OrganizationName") + XCTAssertEqual(commandWithEnvVars.fullHandle, "tuist-org/tuist") XCTAssertEqual(commandWithEnvVars.path, "/path/to/token") let commandWithArgs = try CloudProjectTokenCommand.parse([ - "NewProjectName", - "--organization-name", "NewOrganizationName", + "new-org/new-project", "--path", "/new/token/path", ]) - XCTAssertEqual(commandWithArgs.projectName, "NewProjectName") - XCTAssertEqual(commandWithArgs.organizationName, "NewOrganizationName") + XCTAssertEqual(commandWithArgs.fullHandle, "new-org/new-project") XCTAssertEqual(commandWithArgs.path, "/new/token/path") } @@ -739,65 +735,39 @@ final class CommandEnvironmentVariableTests: XCTestCase { } func testCloudProjectDeleteCommandUsesEnvVars() throws { - setVariable(.cloudProjectDeleteProject, value: "MyProject") + setVariable(.projectDeleteFullHandle, value: "tuist-org/tuist") setVariable(.cloudProjectDeleteOrganization, value: "MyOrganization") setVariable(.cloudProjectDeletePath, value: "/path/to/delete") let commandWithEnvVars = try CloudProjectDeleteCommand.parse([]) - XCTAssertEqual(commandWithEnvVars.project, "MyProject") - XCTAssertEqual(commandWithEnvVars.organization, "MyOrganization") + XCTAssertEqual(commandWithEnvVars.fullHandle, "tuist-org/tuist") XCTAssertEqual(commandWithEnvVars.path, "/path/to/delete") let commandWithArgs = try CloudProjectDeleteCommand.parse([ - "NewProject", - "--organization", "NewOrganization", + "new-org/new-project", "--path", "/new/delete/path", ]) - XCTAssertEqual(commandWithArgs.project, "NewProject") - XCTAssertEqual(commandWithArgs.organization, "NewOrganization") + XCTAssertEqual(commandWithArgs.fullHandle, "new-org/new-project") XCTAssertEqual(commandWithArgs.path, "/new/delete/path") } func testCloudProjectCreateCommandUsesEnvVars() throws { - setVariable(.cloudProjectCreateName, value: "MyProject") + setVariable(.projectCreateFullHandle, value: "tuist-org/tuist") setVariable(.cloudProjectCreateOrganization, value: "MyOrganization") setVariable(.cloudProjectCreatePath, value: "/path/to/create") let commandWithEnvVars = try CloudProjectCreateCommand.parse([]) - XCTAssertEqual(commandWithEnvVars.name, "MyProject") - XCTAssertEqual(commandWithEnvVars.organization, "MyOrganization") + XCTAssertEqual(commandWithEnvVars.fullHandle, "tuist-org/tuist") XCTAssertEqual(commandWithEnvVars.path, "/path/to/create") let commandWithArgs = try CloudProjectCreateCommand.parse([ - "NewProject", - "--organization", "NewOrganization", + "new-org/new-project", "--path", "/new/create/path", ]) - XCTAssertEqual(commandWithArgs.name, "NewProject") - XCTAssertEqual(commandWithArgs.organization, "NewOrganization") + XCTAssertEqual(commandWithArgs.fullHandle, "new-org/new-project") XCTAssertEqual(commandWithArgs.path, "/new/create/path") } - func testCloudInitCommandUsesEnvVars() throws { - setVariable(.cloudInitName, value: "InitName") - setVariable(.cloudInitOrganization, value: "InitOrganization") - setVariable(.cloudInitPath, value: "/path/to/init") - - let commandWithEnvVars = try CloudInitCommand.parse([]) - XCTAssertEqual(commandWithEnvVars.name, "InitName") - XCTAssertEqual(commandWithEnvVars.organization, "InitOrganization") - XCTAssertEqual(commandWithEnvVars.path, "/path/to/init") - - let commandWithArgs = try CloudInitCommand.parse([ - "NewInitName", - "--organization", "NewInitOrganization", - "--path", "/new/init/path", - ]) - XCTAssertEqual(commandWithArgs.name, "NewInitName") - XCTAssertEqual(commandWithArgs.organization, "NewInitOrganization") - XCTAssertEqual(commandWithArgs.path, "/new/init/path") - } - func testCloudOrganizationInviteCommandUsesEnvVars() throws { setVariable(.cloudOrganizationInviteOrganizationName, value: "InviteOrganization") setVariable(.cloudOrganizationInviteEmail, value: "email@example.com") diff --git a/docs/docs/cloud/get-started.md b/docs/docs/cloud/get-started.md index e67456a4966..a1bbdada192 100644 --- a/docs/docs/cloud/get-started.md +++ b/docs/docs/cloud/get-started.md @@ -60,10 +60,10 @@ The next step is to create a project. You can easily do that with the following ::: code-group ```bash [Project under user account] -tuist cloud project create my-project +tuist cloud project create my-account/my-project ``` ```bash [Project under organization] -tuist cloud project create my-project -o my-organization +tuist cloud project create my-organization/my-project ``` ::: @@ -89,7 +89,7 @@ For CI environments, authentication is managed differently; it's done using **pr ```bash -tuist cloud project token my-project -o my-organization +tuist cloud project token my-organization/my-project ``` You will then need to set the token as an environment variable named `TUIST_CONFIG_CLOUD_TOKEN` to make it accessible. From 423a67a88786810d39bafebbcf8805736e1341a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 3 Jul 2024 11:07:23 +0200 Subject: [PATCH 399/509] Flatten cloud commands to tuist (#6473) --- Sources/ProjectDescription/Cloud.swift | 4 +- .../Utilities/TuistAnalyticsDispatcher.swift | 2 +- ...csCommand.swift => AnalyticsCommand.swift} | 11 +- ...oudAuthCommand.swift => AuthCommand.swift} | 9 +- Sources/TuistKit/Commands/CleanCommand.swift | 13 +- .../Commands/Cloud/CloudCleanCommand.swift | 28 --- .../Commands/Cloud/CloudInitCommand.swift | 36 ---- .../Cloud/CloudOrganizationCommand.swift | 23 -- .../Commands/Cloud/CloudProjectCommand.swift | 19 -- Sources/TuistKit/Commands/CloudCommand.swift | 24 --- Sources/TuistKit/Commands/EnvKey/EnvKey.swift | 127 +++++------ ...ogoutCommand.swift => LogoutCommand.swift} | 9 +- .../OrganizationBillingCommand.swift} | 8 +- .../OrganizationCreateCommand.swift} | 8 +- .../OrganizationDeleteCommand.swift} | 8 +- .../OrganizationInviteCommand.swift} | 10 +- .../OrganizationListCommand.swift} | 8 +- .../OrganizationRemoveCommand.swift} | 8 +- .../OrganizationRemoveInviteCommand.swift} | 10 +- .../OrganizationRemoveMemberCommand.swift} | 10 +- .../OrganizationRemoveSSOCommand.swift} | 8 +- .../OrganizationShowCommand.swift} | 10 +- .../OrganizationUpdateCommand.swift} | 6 +- .../OrganizationUpdateMemberCommand.swift} | 12 +- .../OrganizationUpdateSSOCommand.swift} | 12 +- .../Commands/OrganizationCommand.swift | 22 ++ .../ProjectCreateCommand.swift} | 6 +- .../ProjectDeleteCommand.swift} | 8 +- .../ProjectListCommand.swift} | 8 +- .../ProjectTokenCommand.swift} | 6 +- .../TuistKit/Commands/ProjectCommand.swift | 18 ++ ...sionCommand.swift => SessionCommand.swift} | 9 +- Sources/TuistKit/Commands/TuistCommand.swift | 14 +- ...csService.swift => AnalyticsService.swift} | 26 ++- ...oudAuthService.swift => AuthService.swift} | 20 +- Sources/TuistKit/Services/CleanService.swift | 30 ++- .../Services/Cloud/CloudCleanService.swift | 74 ------- .../Services/Cloud/CloudInitService.swift | 105 --------- ...ogoutService.swift => LogoutService.swift} | 20 +- .../OrganizationBillingService.swift} | 12 +- .../OrganizationCreateService.swift} | 14 +- .../OrganizationDeleteService.swift} | 14 +- .../OrganizationInviteService.swift} | 12 +- .../OrganizationListService.swift} | 14 +- .../OrganizationRemoveInviteService.swift} | 12 +- .../OrganizationRemoveMemberService.swift} | 12 +- .../OrganizationRemoveSSOService.swift} | 12 +- .../OrganizationShowService.swift} | 12 +- .../OrganizationUpdateMemberService.swift} | 14 +- .../OrganizationUpdateService.swift} | 12 +- .../ProjectCreateService.swift} | 14 +- .../ProjectDeleteService.swift} | 16 +- .../ProjectListService.swift} | 14 +- .../ProjectTokenService.swift} | 16 +- ...sionService.swift => SessionService.swift} | 20 +- ...wift => TuistAnalyticsServerBackend.swift} | 2 +- .../Cloud+ManifestMapper.swift | 14 +- Sources/TuistServer/Client/Client+Cloud.swift | 35 --- .../TuistServer/Client/Client+Server.swift | 35 +++ ...erverClientAuthenticationMiddleware.swift} | 10 +- ...rClientCLIMetadataHeadersMiddleware.swift} | 2 +- ...erverClientOutputWarningsMiddleware.swift} | 6 +- ... => ServerClientRequestIdMiddleware.swift} | 2 +- ...erverClientVerboseLoggingMiddleware.swift} | 6 +- ...tifact.swift => ServerCacheArtifact.swift} | 12 +- ...ndEvent.swift => ServerCommandEvent.swift} | 12 +- ...nvitation.swift => ServerInvitation.swift} | 16 +- .../{CloudModule.swift => ServerModule.swift} | 6 +- ...ization.swift => ServerOrganization.swift} | 20 +- ...ge.swift => ServerOrganizationUsage.swift} | 8 +- ...CloudProject.swift => ServerProject.swift} | 8 +- .../{CloudUser.swift => ServerUser.swift} | 8 +- ...on+Cloud.swift => URLSession+Server.swift} | 8 +- .../AnalyticsArtifactUploadService.swift | 10 +- .../Services/CacheExistsService.swift | 4 +- .../CancelOrganizationInviteService.swift | 4 +- .../Services/CleanCacheService.swift | 4 +- .../Services/CloudURLService.swift | 40 ---- .../CompleteAnalyticsArtifactsUploads.swift | 8 +- .../Services/CreateCommandEventService.swift | 10 +- .../CreateOrganizationInviteService.swift | 10 +- .../Services/CreateOrganizationService.swift | 10 +- .../Services/CreateProjectService.swift | 8 +- .../Services/DeleteOrganizationService.swift | 4 +- .../Services/DeleteProjectService.swift | 4 +- .../Services/GetAuthTokenService.swift | 4 +- .../Services/GetCacheService.swift | 10 +- .../Services/GetOrganizationService.swift | 10 +- .../Services/GetOrganizationUsage.swift | 10 +- .../Services/GetProjectService.swift | 10 +- .../Services/ListOrganizationsService.swift | 4 +- .../Services/ListProjectsService.swift | 14 +- .../MultipartUploadArtifactService.swift | 2 +- ...tipartUploadCompleteAnalyticsService.swift | 8 +- .../MultipartUploadCompleteCacheService.swift | 4 +- ...artUploadGenerateURLAnalyticsService.swift | 6 +- ...ltipartUploadGenerateURLCacheService.swift | 4 +- ...MultipartUploadStartAnalyticsService.swift | 8 +- .../MultipartUploadStartCacheService.swift | 4 +- .../RemoveOrganizationMemberService.swift | 4 +- .../Services/ServerURLService.swift | 42 ++++ .../UpdateOrganizationMemberService.swift | 14 +- .../Services/UpdateOrganizationService.swift | 10 +- ...er.swift => ServerSessionController.swift} | 24 +-- ...t => ServerAuthenticationController.swift} | 18 +- ...ore.swift => ServerCredentialsStore.swift} | 32 +-- .../Credentials/CredentialsStore.swift | 2 +- .../ServerAcceptanceTests.swift | 10 +- .../Cloud/CloudCleanServiceTests.swift | 66 ------ .../CommandEnvironmentVariableTests.swift | 204 ++++++++---------- .../AuthServiceTests.swift} | 16 +- .../Services/CleanServiceTests.swift | 99 ++++++++- .../LogoutServiceTests.swift} | 16 +- .../OrganizationInviteServiceTests.swift} | 6 +- .../OrganizationListServiceTests.swift} | 8 +- .../OrganizationRemoveSSOServiceTests.swift} | 6 +- .../OrganizationShowServiceTests.swift} | 6 +- .../OrganizationUpdateSSOService.swift} | 6 +- .../Project/ProjectDeleteServiceTests.swift} | 8 +- .../Project/ProjectListServiceTests.swift} | 8 +- .../SessionServiceTests.swift} | 16 +- .../Utils/TuistAnalyticsDispatcherTests.swift | 2 +- ...=> TuistAnalyticsServerBackendTests.swift} | 6 +- ...ClientOutputWarningsMiddlewareTests.swift} | 6 +- ...ift => ServerSessionControllerTests.swift} | 26 +-- ...wift => ServerCredentialsStoreTests.swift} | 8 +- docs/docs/cloud/get-started.md | 17 +- 127 files changed, 952 insertions(+), 1167 deletions(-) rename Sources/TuistKit/Commands/{Cloud/CloudAnalyticsCommand.swift => AnalyticsCommand.swift} (56%) rename Sources/TuistKit/Commands/{Cloud/CloudAuthCommand.swift => AuthCommand.swift} (61%) delete mode 100644 Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift delete mode 100644 Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift delete mode 100644 Sources/TuistKit/Commands/Cloud/CloudOrganizationCommand.swift delete mode 100644 Sources/TuistKit/Commands/Cloud/CloudProjectCommand.swift delete mode 100644 Sources/TuistKit/Commands/CloudCommand.swift rename Sources/TuistKit/Commands/{Cloud/CloudLogoutCommand.swift => LogoutCommand.swift} (66%) rename Sources/TuistKit/Commands/{Cloud/CloudOrganizationBillingCommand.swift => Organization/OrganizationBillingCommand.swift} (77%) rename Sources/TuistKit/Commands/{Cloud/CloudOrganizationCreateCommand.swift => Organization/OrganizationCreateCommand.swift} (76%) rename Sources/TuistKit/Commands/{Cloud/CloudOrganizationDeleteCommand.swift => Organization/OrganizationDeleteCommand.swift} (77%) rename Sources/TuistKit/Commands/{Cloud/CloudOrganizationInviteCommand.swift => Organization/OrganizationInviteCommand.swift} (76%) rename Sources/TuistKit/Commands/{Cloud/CloudOrganizationListCommand.swift => Organization/OrganizationListCommand.swift} (77%) rename Sources/TuistKit/Commands/{Cloud/CloudOrganizationRemoveCommand.swift => Organization/OrganizationRemoveCommand.swift} (61%) rename Sources/TuistKit/Commands/{Cloud/CloudOrganizationRemoveInviteCommand.swift => Organization/OrganizationRemoveInviteCommand.swift} (74%) rename Sources/TuistKit/Commands/{Cloud/CloudOrganizationRemoveMemberCommand.swift => Organization/OrganizationRemoveMemberCommand.swift} (75%) rename Sources/TuistKit/Commands/{Cloud/CloudOrganizationRemoveSSOCommand.swift => Organization/OrganizationRemoveSSOCommand.swift} (76%) rename Sources/TuistKit/Commands/{Cloud/CloudOrganizationShowCommand.swift => Organization/OrganizationShowCommand.swift} (77%) rename Sources/TuistKit/Commands/{Cloud/CloudOrganizationUpdateCommand.swift => Organization/OrganizationUpdateCommand.swift} (66%) rename Sources/TuistKit/Commands/{Cloud/CloudOrganizationUpdateMemberCommand.swift => Organization/OrganizationUpdateMemberCommand.swift} (75%) rename Sources/TuistKit/Commands/{Cloud/CloudOrganizationUpdateSSOCommand.swift => Organization/OrganizationUpdateSSOCommand.swift} (78%) create mode 100644 Sources/TuistKit/Commands/OrganizationCommand.swift rename Sources/TuistKit/Commands/{Cloud/CloudProjectCreateCommand.swift => Project/ProjectCreateCommand.swift} (84%) rename Sources/TuistKit/Commands/{Cloud/CloudProjectDeleteCommand.swift => Project/ProjectDeleteCommand.swift} (79%) rename Sources/TuistKit/Commands/{Cloud/CloudProjectListCommand.swift => Project/ProjectListCommand.swift} (78%) rename Sources/TuistKit/Commands/{Cloud/CloudProjectTokenCommand.swift => Project/ProjectTokenCommand.swift} (86%) create mode 100644 Sources/TuistKit/Commands/ProjectCommand.swift rename Sources/TuistKit/Commands/{Cloud/CloudSessionCommand.swift => SessionCommand.swift} (66%) rename Sources/TuistKit/Services/{Cloud/CloudAnalyticsService.swift => AnalyticsService.swift} (62%) rename Sources/TuistKit/Services/{Cloud/CloudAuthService.swift => AuthService.swift} (56%) delete mode 100644 Sources/TuistKit/Services/Cloud/CloudCleanService.swift delete mode 100644 Sources/TuistKit/Services/Cloud/CloudInitService.swift rename Sources/TuistKit/Services/{Cloud/CloudLogoutService.swift => LogoutService.swift} (56%) rename Sources/TuistKit/Services/{Cloud/CloudOrganizationBillingService.swift => Organization/OrganizationBillingService.swift} (74%) rename Sources/TuistKit/Services/{Cloud/CloudOrganizationCreateService.swift => Organization/OrganizationCreateService.swift} (73%) rename Sources/TuistKit/Services/{Cloud/CloudOrganizationDeleteService.swift => Organization/OrganizationDeleteService.swift} (73%) rename Sources/TuistKit/Services/{Cloud/CloudOrganizationInviteService.swift => Organization/OrganizationInviteService.swift} (82%) rename Sources/TuistKit/Services/{Cloud/CloudOrganizationListService.swift => Organization/OrganizationListService.swift} (79%) rename Sources/TuistKit/Services/{Cloud/CloudOrganizationRemoveInviteService.swift => Organization/OrganizationRemoveInviteService.swift} (79%) rename Sources/TuistKit/Services/{Cloud/CloudOrganizationRemoveMemberService.swift => Organization/OrganizationRemoveMemberService.swift} (78%) rename Sources/TuistKit/Services/{Cloud/CloudOrganizationRemoveSSOService.swift => Organization/OrganizationRemoveSSOService.swift} (77%) rename Sources/TuistKit/Services/{Cloud/CloudOrganizationShowService.swift => Organization/OrganizationShowService.swift} (92%) rename Sources/TuistKit/Services/{Cloud/CloudOrganizationUpdateMemberService.swift => Organization/OrganizationUpdateMemberService.swift} (76%) rename Sources/TuistKit/Services/{Cloud/CloudOrganizationUpdateService.swift => Organization/OrganizationUpdateService.swift} (82%) rename Sources/TuistKit/Services/{Cloud/CloudProjectCreateService.swift => Project/ProjectCreateService.swift} (71%) rename Sources/TuistKit/Services/{Cloud/CloudProjectDeleteService.swift => Project/ProjectDeleteService.swift} (76%) rename Sources/TuistKit/Services/{Cloud/CloudProjectListService.swift => Project/ProjectListService.swift} (76%) rename Sources/TuistKit/Services/{Cloud/CloudProjectTokenService.swift => Project/ProjectTokenService.swift} (71%) rename Sources/TuistKit/Services/{Cloud/CloudSessionService.swift => SessionService.swift} (59%) rename Sources/TuistKit/Utils/{TuistAnalyticsCloudBackend.swift => TuistAnalyticsServerBackend.swift} (97%) delete mode 100644 Sources/TuistServer/Client/Client+Cloud.swift create mode 100644 Sources/TuistServer/Client/Client+Server.swift rename Sources/TuistServer/Client/{CloudClientAuthenticationMiddleware.swift => ServerClientAuthenticationMiddleware.swift} (72%) rename Sources/TuistServer/Client/{CloudClientCLIMetadataHeadersMiddleware.swift => ServerClientCLIMetadataHeadersMiddleware.swift} (91%) rename Sources/TuistServer/Client/{CloudClientOutputWarningsMiddleware.swift => ServerClientOutputWarningsMiddleware.swift} (88%) rename Sources/TuistServer/Client/{CloudClientRequestIdMiddleware.swift => ServerClientRequestIdMiddleware.swift} (90%) rename Sources/TuistServer/Client/{CloudClientVerboseLoggingMiddleware.swift => ServerClientVerboseLoggingMiddleware.swift} (88%) rename Sources/TuistServer/Models/{CloudCacheArtifact.swift => ServerCacheArtifact.swift} (79%) rename Sources/TuistServer/Models/{CloudCommandEvent.swift => ServerCommandEvent.swift} (86%) rename Sources/TuistServer/Models/{CloudInvitation.swift => ServerInvitation.swift} (79%) rename Sources/TuistServer/Models/{CloudModule.swift => ServerModule.swift} (85%) rename Sources/TuistServer/Models/{CloudOrganization.swift => ServerOrganization.swift} (90%) rename Sources/TuistServer/Models/{CloudOrganizationUsage.swift => ServerOrganizationUsage.swift} (80%) rename Sources/TuistServer/Models/{CloudProject.swift => ServerProject.swift} (86%) rename Sources/TuistServer/Models/{CloudUser.swift => ServerUser.swift} (87%) rename Sources/TuistServer/Network/{URLSession+Cloud.swift => URLSession+Server.swift} (79%) delete mode 100644 Sources/TuistServer/Services/CloudURLService.swift create mode 100644 Sources/TuistServer/Services/ServerURLService.swift rename Sources/TuistServer/Session/{CloudSessionController.swift => ServerSessionController.swift} (81%) rename Sources/TuistServer/Utilities/{CloudAuthenticationController.swift => ServerAuthenticationController.swift} (71%) rename Sources/TuistServer/Utilities/{CloudCredentialsStore.swift => ServerCredentialsStore.swift} (81%) delete mode 100644 Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift rename Tests/TuistKitTests/{Cloud/CloudAuthServiceTests.swift => Services/AuthServiceTests.swift} (73%) rename Tests/TuistKitTests/{Cloud/CloudLogoutServiceTests.swift => Services/LogoutServiceTests.swift} (71%) rename Tests/TuistKitTests/{Cloud/CloudOrganizationInviteServiceTests.swift => Services/Organization/OrganizationInviteServiceTests.swift} (91%) rename Tests/TuistKitTests/{Cloud/CloudOrganizationListServiceTests.swift => Services/Organization/OrganizationListServiceTests.swift} (89%) rename Tests/TuistKitTests/{Cloud/CloudOrganizationRemoveSSOServiceTests.swift => Services/Organization/OrganizationRemoveSSOServiceTests.swift} (88%) rename Tests/TuistKitTests/{Cloud/CloudOrganizationShowServiceTests.swift => Services/Organization/OrganizationShowServiceTests.swift} (96%) rename Tests/TuistKitTests/{Cloud/CloudOrganizationUpdateSSOService.swift => Services/Organization/OrganizationUpdateSSOService.swift} (90%) rename Tests/TuistKitTests/{Cloud/CloudProjectDeleteServiceTests.swift => Services/Project/ProjectDeleteServiceTests.swift} (89%) rename Tests/TuistKitTests/{Cloud/CloudProjectListServiceTests.swift => Services/Project/ProjectListServiceTests.swift} (87%) rename Tests/TuistKitTests/{Cloud/CloudSessionServiceTests.swift => Services/SessionServiceTests.swift} (71%) rename Tests/TuistKitTests/Utils/{TuistAnalyticsCloudBackendTests.swift => TuistAnalyticsServerBackendTests.swift} (96%) rename Tests/TuistServerTests/Client/{CloudClientOutputWarningsMiddlewareTests.swift => ServerClientOutputWarningsMiddlewareTests.swift} (90%) rename Tests/TuistServerTests/Session/{CloudSessionControllerTests.swift => ServerSessionControllerTests.swift} (79%) rename Tests/TuistServerTests/Utilities/{CloudCredentialsStoreTests.swift => ServerCredentialsStoreTests.swift} (79%) diff --git a/Sources/ProjectDescription/Cloud.swift b/Sources/ProjectDescription/Cloud.swift index 96cd9704555..7e7a75ab48f 100644 --- a/Sources/ProjectDescription/Cloud.swift +++ b/Sources/ProjectDescription/Cloud.swift @@ -4,8 +4,8 @@ import Foundation public struct Cloud: Codable, Equatable, Sendable { /// Options for cloud configuration. public enum Option: String, Codable, Equatable, Sendable { - /// Marks whether Tuist Cloud authentication is optional. - /// If present, the interaction with Tuist Cloud will be skipped (instead of failing) if a user is not authenticated. + /// Marks whether the Tuist server authentication is optional. + /// If present, the interaction with the Tuist server will be skipped (instead of failing) if a user is not authenticated. case optional } diff --git a/Sources/TuistAnalytics/Utilities/TuistAnalyticsDispatcher.swift b/Sources/TuistAnalytics/Utilities/TuistAnalyticsDispatcher.swift index d3382ddd1be..e26588ab81b 100644 --- a/Sources/TuistAnalytics/Utilities/TuistAnalyticsDispatcher.swift +++ b/Sources/TuistAnalytics/Utilities/TuistAnalyticsDispatcher.swift @@ -4,7 +4,7 @@ import TuistCore import TuistSupport import XcodeGraph -/// `TuistAnalyticsTagger` is responsible to send analytics events that gets stored and reported to the cloud backend (if defined) +/// `TuistAnalyticsTagger` is responsible to send analytics events that gets stored and reported to the Tuist server (if defined) public struct TuistAnalyticsDispatcher: AsyncQueueDispatching { public static let dispatcherId = "TuistAnalytics" diff --git a/Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift b/Sources/TuistKit/Commands/AnalyticsCommand.swift similarity index 56% rename from Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift rename to Sources/TuistKit/Commands/AnalyticsCommand.swift index e4f139da07f..89621b34f8f 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudAnalyticsCommand.swift +++ b/Sources/TuistKit/Commands/AnalyticsCommand.swift @@ -3,25 +3,24 @@ import Foundation import Path import TuistSupport -struct CloudAnalyticsCommand: AsyncParsableCommand { +struct AnalyticsCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "analytics", - _superCommandName: "cloud", - abstract: "Open Tuist Cloud analytics dashboard." + abstract: "Open the Tuist analytics dashboard." ) } @Option( name: .shortAndLong, - help: "The path to the Tuist Cloud project.", + help: "The path to the Tuist project.", completion: .directory, - envKey: .cloudAnalyticsPath + envKey: .analyticsPath ) var path: String? func run() async throws { - try await CloudAnalyticsService().run( + try await AnalyticsService().run( path: path ) } diff --git a/Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift b/Sources/TuistKit/Commands/AuthCommand.swift similarity index 61% rename from Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift rename to Sources/TuistKit/Commands/AuthCommand.swift index f7422880f6a..9feb36e37a2 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudAuthCommand.swift +++ b/Sources/TuistKit/Commands/AuthCommand.swift @@ -2,12 +2,11 @@ import ArgumentParser import Foundation import Path -struct CloudAuthCommand: AsyncParsableCommand { +struct AuthCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "auth", - _superCommandName: "cloud", - abstract: "Authenticates the user for using Cloud" + abstract: "Authenticates the user" ) } @@ -15,11 +14,11 @@ struct CloudAuthCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudAuthPath + envKey: .authPath ) var path: String? func run() async throws { - try await CloudAuthService().authenticate(directory: path) + try await AuthService().authenticate(directory: path) } } diff --git a/Sources/TuistKit/Commands/CleanCommand.swift b/Sources/TuistKit/Commands/CleanCommand.swift index 559e2b1316c..9f668386131 100644 --- a/Sources/TuistKit/Commands/CleanCommand.swift +++ b/Sources/TuistKit/Commands/CleanCommand.swift @@ -2,7 +2,7 @@ import ArgumentParser import Foundation import TuistCore -public struct CleanCommand: ParsableCommand { +public struct CleanCommand: AsyncParsableCommand { public init() {} public static var configuration: CommandConfiguration { @@ -18,6 +18,12 @@ public struct CleanCommand: ParsableCommand { ) var cleanCategories: [TuistCleanCategory] = TuistCleanCategory.allCases.map { $0 } + @Flag( + help: "Clean the remote cache", + envKey: .cleanRemote + ) + var remote: Bool = false + @Option( name: .shortAndLong, help: "The path to the directory that contains the project that should be cleaned.", @@ -26,9 +32,10 @@ public struct CleanCommand: ParsableCommand { ) var path: String? - public func run() throws { - try CleanService().run( + public func run() async throws { + try await CleanService().run( categories: cleanCategories, + remote: remote, path: path ) } diff --git a/Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift deleted file mode 100644 index 164142e7c7d..00000000000 --- a/Sources/TuistKit/Commands/Cloud/CloudCleanCommand.swift +++ /dev/null @@ -1,28 +0,0 @@ -import ArgumentParser -import Foundation -import Path -import TuistSupport - -struct CloudCleanCommand: AsyncParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "clean", - _superCommandName: "cloud", - abstract: "Cleans the remote cache." - ) - } - - @Option( - name: .shortAndLong, - help: "The path to the Tuist Cloud project.", - completion: .directory, - envKey: .cloudCleanPath - ) - var path: String? - - func run() async throws { - try await CloudCleanService().clean( - path: path - ) - } -} diff --git a/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift deleted file mode 100644 index 78ae651b939..00000000000 --- a/Sources/TuistKit/Commands/Cloud/CloudInitCommand.swift +++ /dev/null @@ -1,36 +0,0 @@ -import ArgumentParser -import Foundation -import Path -import TuistSupport - -struct CloudInitCommand: AsyncParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "init", - _superCommandName: "cloud", - abstract: "Creates a new tuist cloud project." - ) - } - - @Argument( - help: "The project to initialize the Tuist project with. Must be in the format of account-handle/project-handle.", - completion: .directory, - envKey: .cloudInitName - ) - var fullHandle: String - - @Option( - name: .shortAndLong, - help: "The path to the directory or a subdirectory of the project.", - completion: .directory, - envKey: .cloudInitPath - ) - var path: String? - - func run() async throws { - try await CloudInitService().createProject( - fullHandle: fullHandle, - directory: path - ) - } -} diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudOrganizationCommand.swift deleted file mode 100644 index 75c6a90d31f..00000000000 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationCommand.swift +++ /dev/null @@ -1,23 +0,0 @@ -import ArgumentParser -import Foundation -import Path - -struct CloudOrganizationCommand: ParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "organization", - _superCommandName: "cloud", - abstract: "A set of commands to manage your Cloud organizations.", - subcommands: [ - CloudOrganizationCreateCommand.self, - CloudOrganizationListCommand.self, - CloudOrganizationDeleteCommand.self, - CloudOrganizationShowCommand.self, - CloudOrganizationInviteCommand.self, - CloudOrganizationRemoveCommand.self, - CloudOrganizationUpdateCommand.self, - CloudOrganizationBillingCommand.self, - ] - ) - } -} diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectCommand.swift b/Sources/TuistKit/Commands/Cloud/CloudProjectCommand.swift deleted file mode 100644 index 16300130840..00000000000 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectCommand.swift +++ /dev/null @@ -1,19 +0,0 @@ -import ArgumentParser -import Foundation -import Path - -struct CloudProjectCommand: ParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "project", - _superCommandName: "cloud", - abstract: "A set of commands to manage your cloud projects.", - subcommands: [ - CloudProjectCreateCommand.self, - CloudProjectListCommand.self, - CloudProjectDeleteCommand.self, - CloudProjectTokenCommand.self, - ] - ) - } -} diff --git a/Sources/TuistKit/Commands/CloudCommand.swift b/Sources/TuistKit/Commands/CloudCommand.swift deleted file mode 100644 index 647c4a6559f..00000000000 --- a/Sources/TuistKit/Commands/CloudCommand.swift +++ /dev/null @@ -1,24 +0,0 @@ -import ArgumentParser -import Foundation -import Path - -struct CloudCommand: ParsableCommand { - static var configuration: CommandConfiguration { - var subcommands: [ParsableCommand.Type] = [] - subcommands = [ - CloudAuthCommand.self, - CloudSessionCommand.self, - CloudLogoutCommand.self, - CloudInitCommand.self, - CloudCleanCommand.self, - CloudProjectCommand.self, - CloudOrganizationCommand.self, - CloudAnalyticsCommand.self, - ] - return CommandConfiguration( - commandName: "cloud", - abstract: "A set of commands to interact with the cloud.", - subcommands: subcommands - ) - } -} diff --git a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift index a81600585af..e2a5f05fac4 100644 --- a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift +++ b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift @@ -24,6 +24,7 @@ public enum EnvKey: String, CaseIterable { // CLEAN case cleanCleanCategories = "TUIST_CLEAN_CLEAN_CATEGORIES" case cleanPath = "TUIST_CLEAN_PATH" + case cleanRemote = "TUIST_CLEAN_REMOTE" // DUMP case dumpPath = "TUIST_DUMP_PATH" @@ -128,95 +129,85 @@ public enum EnvKey: String, CaseIterable { case testBinaryCache = "TUIST_TEST_BINARY_CACHE" case testSelectiveTesting = "TUIST_TEST_SELECTIVE_TESTING" - // CLOUD ORGANIZATION BILLING - case cloudOrganizationBillingOrganizationName = "TUIST_CLOUD_ORGANIZATION_BILLING_ORGANIZATION_NAME" - case cloudOrganizationBillingPath = "TUIST_CLOUD_ORGANIZATION_BILLING_PATH" + // ORGANIZATION BILLING + case organizationBillingOrganizationName = "TUIST_ORGANIZATION_BILLING_ORGANIZATION_NAME" + case organizationBillingPath = "TUIST_ORGANIZATION_BILLING_PATH" - // CLOUD ORGANIZATION CREATE - case cloudOrganizationCreateOrganizationName = "TUIST_CLOUD_ORGANIZATION_CREATE_ORGANIZATION_NAME" - case cloudOrganizationCreatePath = "TUIST_CLOUD_ORGANIZATION_CREATE_PATH" + // ORGANIZATION CREATE + case organizationCreateOrganizationName = "TUIST_ORGANIZATION_CREATE_ORGANIZATION_NAME" + case organizationCreatePath = "TUIST_ORGANIZATION_CREATE_PATH" - // CLOUD ORGANIZATION DELETE - case cloudOrganizationDeleteOrganizationName = "TUIST_CLOUD_ORGANIZATION_DELETE_ORGANIZATION_NAME" - case cloudOrganizationDeletePath = "TUIST_CLOUD_ORGANIZATION_DELETE_PATH" + // ORGANIZATION DELETE + case organizationDeleteOrganizationName = "TUIST_ORGANIZATION_DELETE_ORGANIZATION_NAME" + case organizationDeletePath = "TUIST_ORGANIZATION_DELETE_PATH" - // CLOUD PROJECT TOKEN - case cloudProjectTokenPath = "TUIST_CLOUD_PROJECT_TOKEN_PATH" + // PROJECT TOKEN case projectTokenFullHandle = "TUIST_PROJECT_TOKEN_FULL_HANDLE" + case projectTokenPath = "TUIST_PROJECT_TOKEN_PATH" - // CLOUD ORGANIZATION LIST - case cloudOrganizationListJson = "TUIST_CLOUD_ORGANIZATION_LIST_JSON" - case cloudOrganizationListPath = "TUIST_CLOUD_ORGANIZATION_LIST_PATH" + // ORGANIZATION LIST + case organizationListJson = "TUIST_ORGANIZATION_LIST_JSON" + case organizationListPath = "TUIST_ORGANIZATION_LIST_PATH" - // CLOUD ORGANIZATION REMOVE INVITE - case cloudOrganizationRemoveInviteOrganizationName = "TUIST_CLOUD_ORGANIZATION_REMOVE_INVITE_ORGANIZATION_NAME" - case cloudOrganizationRemoveInviteEmail = "TUIST_CLOUD_ORGANIZATION_REMOVE_INVITE_EMAIL" - case cloudOrganizationRemoveInvitePath = "TUIST_CLOUD_ORGANIZATION_REMOVE_INVITE_PATH" + // ORGANIZATION REMOVE INVITE + case organizationRemoveInviteOrganizationName = "TUIST_ORGANIZATION_REMOVE_INVITE_ORGANIZATION_NAME" + case organizationRemoveInviteEmail = "TUIST_ORGANIZATION_REMOVE_INVITE_EMAIL" + case organizationRemoveInvitePath = "TUIST_ORGANIZATION_REMOVE_INVITE_PATH" - // CLOUD ORGANIZATION REMOVE MEMBER - case cloudOrganizationRemoveMemberOrganizationName = "TUIST_CLOUD_ORGANIZATION_REMOVE_MEMBER_ORGANIZATION_NAME" - case cloudOrganizationRemoveMemberUsername = "TUIST_CLOUD_ORGANIZATION_REMOVE_MEMBER_USERNAME" - case cloudOrganizationRemoveMemberPath = "TUIST_CLOUD_ORGANIZATION_REMOVE_MEMBER_PATH" + // ORGANIZATION REMOVE MEMBER + case organizationRemoveMemberOrganizationName = "TUIST_ORGANIZATION_REMOVE_MEMBER_ORGANIZATION_NAME" + case organizationRemoveMemberUsername = "TUIST_ORGANIZATION_REMOVE_MEMBER_USERNAME" + case organizationRemoveMemberPath = "TUIST_ORGANIZATION_REMOVE_MEMBER_PATH" - // CLOUD ORGANIZATION REMOVE SSO - case cloudOrganizationRemoveSSOOrganizationName = "TUIST_CLOUD_ORGANIZATION_REMOVE_SSO_ORGANIZATION_NAME" - case cloudOrganizationRemoveSSOPath = "TUIST_CLOUD_ORGANIZATION_REMOVE_SSO_PATH" + // ORGANIZATION REMOVE SSO + case organizationRemoveSSOOrganizationName = "TUIST_ORGANIZATION_REMOVE_SSO_ORGANIZATION_NAME" + case organizationRemoveSSOPath = "TUIST_ORGANIZATION_REMOVE_SSO_PATH" - // CLOUD ORGANIZATION UPDATE SSO - case cloudOrganizationUpdateSSOOrganizationName = "TUIST_CLOUD_ORGANIZATION_UPDATE_SSO_ORGANIZATION_NAME" - case cloudOrganizationUpdateSSOProvider = "TUIST_CLOUD_ORGANIZATION_UPDATE_SSO_PROVIDER" - case cloudOrganizationUpdateSSOOrganizationId = "TUIST_CLOUD_ORGANIZATION_UPDATE_SSO_ORGANIZATION_ID" - case cloudOrganizationUpdateSSOPath = "TUIST_CLOUD_ORGANIZATION_UPDATE_SSO_PATH" + // ORGANIZATION UPDATE SSO + case organizationUpdateSSOOrganizationName = "TUIST_ORGANIZATION_UPDATE_SSO_ORGANIZATION_NAME" + case organizationUpdateSSOProvider = "TUIST_ORGANIZATION_UPDATE_SSO_PROVIDER" + case organizationUpdateSSOOrganizationId = "TUIST_ORGANIZATION_UPDATE_SSO_ORGANIZATION_ID" + case organizationUpdateSSOPath = "TUIST_ORGANIZATION_UPDATE_SSO_PATH" - // CLOUD PROJECT DELETE + // PROJECT DELETE case projectDeleteFullHandle = "TUIST_PROJECT_DELETE_FULL_HANDLE" - case cloudProjectDeleteOrganization = "TUIST_CLOUD_PROJECT_DELETE_ORGANIZATION" - case cloudProjectDeletePath = "TUIST_CLOUD_PROJECT_DELETE_PATH" + case projectDeletePath = "TUIST_PROJECT_DELETE_PATH" - // CLOUD PROJECT CREATE + // PROJECT CREATE case projectCreateFullHandle = "TUIST_PROJECT_CREATE_FULL_HANDLE" - case cloudProjectCreateOrganization = "TUIST_CLOUD_PROJECT_CREATE_ORGANIZATION" - case cloudProjectCreatePath = "TUIST_CLOUD_PROJECT_CREATE_PATH" + case projectCreatePath = "TUIST_PROJECT_CREATE_PATH" - // CLOUD INIT - case cloudInitName = "TUIST_CLOUD_INIT_NAME" - case cloudInitOrganization = "TUIST_CLOUD_INIT_ORGANIZATION" - case cloudInitPath = "TUIST_CLOUD_INIT_PATH" + // ORGANIZATION INVITE + case organizationInviteOrganizationName = "TUIST_ORGANIZATION_INVITE_ORGANIZATION_NAME" + case organizationInviteEmail = "TUIST_ORGANIZATION_INVITE_EMAIL" + case organizationInvitePath = "TUIST_ORGANIZATION_INVITE_PATH" - // CLOUD ORGANIZATION INVITE - case cloudOrganizationInviteOrganizationName = "TUIST_CLOUD_ORGANIZATION_INVITE_ORGANIZATION_NAME" - case cloudOrganizationInviteEmail = "TUIST_CLOUD_ORGANIZATION_INVITE_EMAIL" - case cloudOrganizationInvitePath = "TUIST_CLOUD_ORGANIZATION_INVITE_PATH" + // ORGANIZATION SHOW + case organizationShowOrganizationName = "TUIST_ORGANIZATION_SHOW_ORGANIZATION_NAME" + case organizationShowJson = "TUIST_ORGANIZATION_SHOW_JSON" + case organizationShowPath = "TUIST_ORGANIZATION_SHOW_PATH" - // CLOUD ORGANIZATION SHOW - case cloudOrganizationShowOrganizationName = "TUIST_CLOUD_ORGANIZATION_SHOW_ORGANIZATION_NAME" - case cloudOrganizationShowJson = "TUIST_CLOUD_ORGANIZATION_SHOW_JSON" - case cloudOrganizationShowPath = "TUIST_CLOUD_ORGANIZATION_SHOW_PATH" + // PROJECT LIST + case projectListJson = "TUIST_PROJECT_LIST_JSON" + case projectListPath = "TUIST_PROJECT_LIST_PATH" - // CLOUD PROJECT LIST - case cloudProjectListJson = "TUIST_CLOUD_PROJECT_LIST_JSON" - case cloudProjectListPath = "TUIST_CLOUD_PROJECT_LIST_PATH" + // ORGANIZATION UPDATE MEMBER + case organizationUpdateMemberOrganizationName = "TUIST_ORGANIZATION_UPDATE_MEMBER_ORGANIZATION_NAME" + case organizationUpdateMemberUsername = "TUIST_ORGANIZATION_UPDATE_MEMBER_USERNAME" + case organizationUpdateMemberRole = "TUIST_ORGANIZATION_UPDATE_MEMBER_ROLE" + case organizationUpdateMemberPath = "TUIST_ORGANIZATION_UPDATE_MEMBER_PATH" - // CLOUD ORGANIZATION UPDATE MEMBER - case cloudOrganizationUpdateMemberOrganizationName = "TUIST_CLOUD_ORGANIZATION_UPDATE_MEMBER_ORGANIZATION_NAME" - case cloudOrganizationUpdateMemberUsername = "TUIST_CLOUD_ORGANIZATION_UPDATE_MEMBER_USERNAME" - case cloudOrganizationUpdateMemberRole = "TUIST_CLOUD_ORGANIZATION_UPDATE_MEMBER_ROLE" - case cloudOrganizationUpdateMemberPath = "TUIST_CLOUD_ORGANIZATION_UPDATE_MEMBER_PATH" + // AUTH + case authPath = "TUIST_AUTH_PATH" - // CLOUD AUTH - case cloudAuthPath = "TUIST_CLOUD_AUTH_PATH" + // SESSION + case sessionPath = "TUIST_SESSION_PATH" - // CLOUD SESSION - case cloudSessionPath = "TUIST_CLOUD_SESSION_PATH" + // LOGOUT + case logoutPath = "TUIST_LOGOUT_PATH" - // CLOUD LOGOUT - case cloudLogoutPath = "TUIST_CLOUD_LOGOUT_PATH" - - // CLOUD ANALYTICS - case cloudAnalyticsPath = "TUIST_CLOUD_ANALYTICS_PATH" - - // CLOUD CLEAN - case cloudCleanPath = "TUIST_CLOUD_CLEAN_PATH" + // ANALYTICS + case analyticsPath = "TUIST_ANALYTICS_PATH" } extension EnvKey { diff --git a/Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift b/Sources/TuistKit/Commands/LogoutCommand.swift similarity index 66% rename from Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift rename to Sources/TuistKit/Commands/LogoutCommand.swift index 2329a129049..7815bf50c17 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudLogoutCommand.swift +++ b/Sources/TuistKit/Commands/LogoutCommand.swift @@ -2,12 +2,11 @@ import ArgumentParser import Foundation import Path -struct CloudLogoutCommand: ParsableCommand { +struct LogoutCommand: ParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "logout", - _superCommandName: "cloud", - abstract: "Removes an existing Cloud session." + abstract: "Removes an existing Tuist session." ) } @@ -15,12 +14,12 @@ struct CloudLogoutCommand: ParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudLogoutPath + envKey: .logoutPath ) var path: String? func run() throws { - try CloudLogoutService().logout( + try LogoutService().logout( directory: path ) } diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift b/Sources/TuistKit/Commands/Organization/OrganizationBillingCommand.swift similarity index 77% rename from Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift rename to Sources/TuistKit/Commands/Organization/OrganizationBillingCommand.swift index fac07ea3445..a3ca6391bcb 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationBillingCommand.swift +++ b/Sources/TuistKit/Commands/Organization/OrganizationBillingCommand.swift @@ -3,7 +3,7 @@ import Foundation import Path import TuistSupport -struct CloudOrganizationBillingCommand: AsyncParsableCommand { +struct OrganizationBillingCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "billing", @@ -14,7 +14,7 @@ struct CloudOrganizationBillingCommand: AsyncParsableCommand { @Argument( help: "The name of the organization to show billing dashboard for.", - envKey: .cloudOrganizationBillingOrganizationName + envKey: .organizationBillingOrganizationName ) var organizationName: String @@ -22,12 +22,12 @@ struct CloudOrganizationBillingCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudOrganizationBillingPath + envKey: .organizationBillingPath ) var path: String? func run() async throws { - try await CloudOrganizationBillingService().run( + try await OrganizationBillingService().run( organizationName: organizationName, directory: path ) diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift b/Sources/TuistKit/Commands/Organization/OrganizationCreateCommand.swift similarity index 76% rename from Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift rename to Sources/TuistKit/Commands/Organization/OrganizationCreateCommand.swift index dc0d251295a..7fbf6dc1971 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationCreateCommand.swift +++ b/Sources/TuistKit/Commands/Organization/OrganizationCreateCommand.swift @@ -3,7 +3,7 @@ import Foundation import Path import TuistSupport -struct CloudOrganizationCreateCommand: AsyncParsableCommand { +struct OrganizationCreateCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "create", @@ -14,7 +14,7 @@ struct CloudOrganizationCreateCommand: AsyncParsableCommand { @Argument( help: "The name of the organization to create.", - envKey: .cloudOrganizationCreateOrganizationName + envKey: .organizationCreateOrganizationName ) var organizationName: String @@ -22,12 +22,12 @@ struct CloudOrganizationCreateCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudOrganizationCreatePath + envKey: .organizationCreatePath ) var path: String? func run() async throws { - try await CloudOrganizationCreateService().run( + try await OrganizationCreateService().run( organizationName: organizationName, directory: path ) diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift b/Sources/TuistKit/Commands/Organization/OrganizationDeleteCommand.swift similarity index 77% rename from Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift rename to Sources/TuistKit/Commands/Organization/OrganizationDeleteCommand.swift index 339d20fab47..5dfdde20253 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationDeleteCommand.swift +++ b/Sources/TuistKit/Commands/Organization/OrganizationDeleteCommand.swift @@ -3,7 +3,7 @@ import Foundation import Path import TuistSupport -struct CloudOrganizationDeleteCommand: AsyncParsableCommand { +struct OrganizationDeleteCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "delete", @@ -15,7 +15,7 @@ struct CloudOrganizationDeleteCommand: AsyncParsableCommand { @Argument( help: "The name of the organization to delete.", completion: .directory, - envKey: .cloudOrganizationDeleteOrganizationName + envKey: .organizationDeleteOrganizationName ) var organizationName: String @@ -23,12 +23,12 @@ struct CloudOrganizationDeleteCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudOrganizationDeletePath + envKey: .organizationDeletePath ) var path: String? func run() async throws { - try await CloudOrganizationDeleteService().run( + try await OrganizationDeleteService().run( organizationName: organizationName, directory: path ) diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift b/Sources/TuistKit/Commands/Organization/OrganizationInviteCommand.swift similarity index 76% rename from Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift rename to Sources/TuistKit/Commands/Organization/OrganizationInviteCommand.swift index 54f594183e9..1503a1ec440 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationInviteCommand.swift +++ b/Sources/TuistKit/Commands/Organization/OrganizationInviteCommand.swift @@ -3,7 +3,7 @@ import Foundation import Path import TuistSupport -struct CloudOrganizationInviteCommand: AsyncParsableCommand { +struct OrganizationInviteCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "invite", @@ -14,13 +14,13 @@ struct CloudOrganizationInviteCommand: AsyncParsableCommand { @Argument( help: "The name of the organization to invite the user to.", - envKey: .cloudOrganizationInviteOrganizationName + envKey: .organizationInviteOrganizationName ) var organizationName: String @Argument( help: "The email of the user to invite.", - envKey: .cloudOrganizationInviteEmail + envKey: .organizationInviteEmail ) var email: String @@ -28,12 +28,12 @@ struct CloudOrganizationInviteCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudOrganizationInvitePath + envKey: .organizationInvitePath ) var path: String? func run() async throws { - try await CloudOrganizationInviteService().run( + try await OrganizationInviteService().run( organizationName: organizationName, email: email, directory: path diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift b/Sources/TuistKit/Commands/Organization/OrganizationListCommand.swift similarity index 77% rename from Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift rename to Sources/TuistKit/Commands/Organization/OrganizationListCommand.swift index 9fce3010523..dc8aebda770 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationListCommand.swift +++ b/Sources/TuistKit/Commands/Organization/OrganizationListCommand.swift @@ -3,7 +3,7 @@ import Foundation import Path import TuistSupport -struct CloudOrganizationListCommand: AsyncParsableCommand { +struct OrganizationListCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "list", @@ -14,7 +14,7 @@ struct CloudOrganizationListCommand: AsyncParsableCommand { @Flag( help: "The output in JSON format.", - envKey: .cloudOrganizationListJson + envKey: .organizationListJson ) var json: Bool = false @@ -22,12 +22,12 @@ struct CloudOrganizationListCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudOrganizationListPath + envKey: .organizationListPath ) var path: String? func run() async throws { - try await CloudOrganizationListService().run( + try await OrganizationListService().run( json: json, directory: path ) diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveCommand.swift b/Sources/TuistKit/Commands/Organization/OrganizationRemoveCommand.swift similarity index 61% rename from Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveCommand.swift rename to Sources/TuistKit/Commands/Organization/OrganizationRemoveCommand.swift index 2cefd925617..a346595eb2c 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveCommand.swift +++ b/Sources/TuistKit/Commands/Organization/OrganizationRemoveCommand.swift @@ -2,16 +2,16 @@ import ArgumentParser import Foundation import Path -struct CloudOrganizationRemoveCommand: ParsableCommand { +struct OrganizationRemoveCommand: ParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "remove", _superCommandName: "organization", abstract: "A set of commands to remove members or cancel pending invitations.", subcommands: [ - CloudOrganizationRemoveInviteCommand.self, - CloudOrganizationRemoveMemberCommand.self, - CloudOrganizationRemoveSSOCommand.self, + OrganizationRemoveInviteCommand.self, + OrganizationRemoveMemberCommand.self, + OrganizationRemoveSSOCommand.self, ] ) } diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift b/Sources/TuistKit/Commands/Organization/OrganizationRemoveInviteCommand.swift similarity index 74% rename from Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift rename to Sources/TuistKit/Commands/Organization/OrganizationRemoveInviteCommand.swift index 1a473abd515..d8ccb7cae59 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveInviteCommand.swift +++ b/Sources/TuistKit/Commands/Organization/OrganizationRemoveInviteCommand.swift @@ -3,7 +3,7 @@ import Foundation import Path import TuistSupport -struct CloudOrganizationRemoveInviteCommand: AsyncParsableCommand { +struct OrganizationRemoveInviteCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "invite", @@ -14,13 +14,13 @@ struct CloudOrganizationRemoveInviteCommand: AsyncParsableCommand { @Argument( help: "The name of the organization to cancel the invitation for.", - envKey: .cloudOrganizationRemoveInviteOrganizationName + envKey: .organizationRemoveInviteOrganizationName ) var organizationName: String @Argument( help: "The email of the user to cancel the invitation for.", - envKey: .cloudOrganizationRemoveInviteEmail + envKey: .organizationRemoveInviteEmail ) var email: String @@ -28,12 +28,12 @@ struct CloudOrganizationRemoveInviteCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudOrganizationRemoveInvitePath + envKey: .organizationRemoveInvitePath ) var path: String? func run() async throws { - try await CloudOrganizationRemoveInviteService().run( + try await OrganizationRemoveInviteService().run( organizationName: organizationName, email: email, directory: path diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift b/Sources/TuistKit/Commands/Organization/OrganizationRemoveMemberCommand.swift similarity index 75% rename from Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift rename to Sources/TuistKit/Commands/Organization/OrganizationRemoveMemberCommand.swift index 5c7f748c9b9..23b7ea35744 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveMemberCommand.swift +++ b/Sources/TuistKit/Commands/Organization/OrganizationRemoveMemberCommand.swift @@ -3,7 +3,7 @@ import Foundation import Path import TuistSupport -struct CloudOrganizationRemoveMemberCommand: AsyncParsableCommand { +struct OrganizationRemoveMemberCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "member", @@ -14,13 +14,13 @@ struct CloudOrganizationRemoveMemberCommand: AsyncParsableCommand { @Argument( help: "The name of the organization to remove the organization member from.", - envKey: .cloudOrganizationRemoveMemberOrganizationName + envKey: .organizationRemoveMemberOrganizationName ) var organizationName: String @Argument( help: "The username of the member you want to remove from the organization.", - envKey: .cloudOrganizationRemoveMemberUsername + envKey: .organizationRemoveMemberUsername ) var username: String @@ -28,12 +28,12 @@ struct CloudOrganizationRemoveMemberCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudOrganizationRemoveMemberPath + envKey: .organizationRemoveMemberPath ) var path: String? func run() async throws { - try await CloudOrganizationRemoveMemberService().run( + try await OrganizationRemoveMemberService().run( organizationName: organizationName, username: username, directory: path diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift b/Sources/TuistKit/Commands/Organization/OrganizationRemoveSSOCommand.swift similarity index 76% rename from Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift rename to Sources/TuistKit/Commands/Organization/OrganizationRemoveSSOCommand.swift index a78146d9ef4..08a20a4be83 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationRemoveSSOCommand.swift +++ b/Sources/TuistKit/Commands/Organization/OrganizationRemoveSSOCommand.swift @@ -3,7 +3,7 @@ import Foundation import Path import TuistSupport -struct CloudOrganizationRemoveSSOCommand: AsyncParsableCommand { +struct OrganizationRemoveSSOCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "sso", @@ -14,7 +14,7 @@ struct CloudOrganizationRemoveSSOCommand: AsyncParsableCommand { @Argument( help: "The name of the organization for which you want to update the SSO provider for.", - envKey: .cloudOrganizationRemoveSSOOrganizationName + envKey: .organizationRemoveSSOOrganizationName ) var organizationName: String @@ -22,12 +22,12 @@ struct CloudOrganizationRemoveSSOCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudOrganizationRemoveSSOPath + envKey: .organizationRemoveSSOPath ) var path: String? func run() async throws { - try await CloudOrganizationRemoveSSOService().run( + try await OrganizationRemoveSSOService().run( organizationName: organizationName, directory: path ) diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift b/Sources/TuistKit/Commands/Organization/OrganizationShowCommand.swift similarity index 77% rename from Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift rename to Sources/TuistKit/Commands/Organization/OrganizationShowCommand.swift index 95130ee83ee..c1570748778 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationShowCommand.swift +++ b/Sources/TuistKit/Commands/Organization/OrganizationShowCommand.swift @@ -3,7 +3,7 @@ import Foundation import Path import TuistSupport -struct CloudOrganizationShowCommand: AsyncParsableCommand { +struct OrganizationShowCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "show", @@ -14,13 +14,13 @@ struct CloudOrganizationShowCommand: AsyncParsableCommand { @Argument( help: "The name of the organization to show.", - envKey: .cloudOrganizationShowOrganizationName + envKey: .organizationShowOrganizationName ) var organizationName: String @Flag( help: "The output in JSON format.", - envKey: .cloudOrganizationShowJson + envKey: .organizationShowJson ) var json: Bool = false @@ -28,12 +28,12 @@ struct CloudOrganizationShowCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudOrganizationShowPath + envKey: .organizationShowPath ) var path: String? func run() async throws { - try await CloudOrganizationShowService().run( + try await OrganizationShowService().run( organizationName: organizationName, json: json, directory: path diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateCommand.swift b/Sources/TuistKit/Commands/Organization/OrganizationUpdateCommand.swift similarity index 66% rename from Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateCommand.swift rename to Sources/TuistKit/Commands/Organization/OrganizationUpdateCommand.swift index ff37a85beda..8e59b032ec4 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateCommand.swift +++ b/Sources/TuistKit/Commands/Organization/OrganizationUpdateCommand.swift @@ -2,15 +2,15 @@ import ArgumentParser import Foundation import Path -struct CloudOrganizationUpdateCommand: ParsableCommand { +struct OrganizationUpdateCommand: ParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "update", _superCommandName: "organization", abstract: "A set of commands to update the organization.", subcommands: [ - CloudOrganizationUpdateMemberCommand.self, - CloudOrganizationUpdateSSOCommand.self, + OrganizationUpdateMemberCommand.self, + OrganizationUpdateSSOCommand.self, ] ) } diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift b/Sources/TuistKit/Commands/Organization/OrganizationUpdateMemberCommand.swift similarity index 75% rename from Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift rename to Sources/TuistKit/Commands/Organization/OrganizationUpdateMemberCommand.swift index 29269e8cb4b..fac57670cd3 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateMemberCommand.swift +++ b/Sources/TuistKit/Commands/Organization/OrganizationUpdateMemberCommand.swift @@ -3,7 +3,7 @@ import Foundation import Path import TuistSupport -struct CloudOrganizationUpdateMemberCommand: AsyncParsableCommand { +struct OrganizationUpdateMemberCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "member", @@ -14,20 +14,20 @@ struct CloudOrganizationUpdateMemberCommand: AsyncParsableCommand { @Argument( help: "The name of the organization for which you want to update the member for.", - envKey: .cloudOrganizationUpdateMemberOrganizationName + envKey: .organizationUpdateMemberOrganizationName ) var organizationName: String @Argument( help: "The username of the member you want to update.", - envKey: .cloudOrganizationUpdateMemberUsername + envKey: .organizationUpdateMemberUsername ) var username: String @Option( help: "The new member role", completion: .list(["admin", "user"]), - envKey: .cloudOrganizationUpdateMemberRole + envKey: .organizationUpdateMemberRole ) var role: String @@ -35,12 +35,12 @@ struct CloudOrganizationUpdateMemberCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudOrganizationUpdateMemberPath + envKey: .organizationUpdateMemberPath ) var path: String? func run() async throws { - try await CloudOrganizationUpdateMemberService().run( + try await OrganizationUpdateMemberService().run( organizationName: organizationName, username: username, role: role, diff --git a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift b/Sources/TuistKit/Commands/Organization/OrganizationUpdateSSOCommand.swift similarity index 78% rename from Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift rename to Sources/TuistKit/Commands/Organization/OrganizationUpdateSSOCommand.swift index a450deff330..69ed284a1f1 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudOrganizationUpdateSSOCommand.swift +++ b/Sources/TuistKit/Commands/Organization/OrganizationUpdateSSOCommand.swift @@ -7,7 +7,7 @@ enum SSOProvider: String, ExpressibleByArgument, CaseIterable { case google } -struct CloudOrganizationUpdateSSOCommand: AsyncParsableCommand { +struct OrganizationUpdateSSOCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "sso", @@ -18,20 +18,20 @@ struct CloudOrganizationUpdateSSOCommand: AsyncParsableCommand { @Argument( help: "The name of the organization for which you want to update the SSO provider for.", - envKey: .cloudOrganizationUpdateSSOOrganizationName + envKey: .organizationUpdateSSOOrganizationName ) var organizationName: String @Option( help: "The SSO provider to use.", - envKey: .cloudOrganizationUpdateSSOProvider + envKey: .organizationUpdateSSOProvider ) var provider: SSOProvider @Option( name: .shortAndLong, help: "Organization ID for your SSO provider. For Google, this is your Google domain (for example, if your email is tuist@tuist.io, the domain would be tuist.io)", - envKey: .cloudOrganizationUpdateSSOOrganizationId + envKey: .organizationUpdateSSOOrganizationId ) var organizationId: String @@ -39,12 +39,12 @@ struct CloudOrganizationUpdateSSOCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudOrganizationUpdateSSOPath + envKey: .organizationUpdateSSOPath ) var path: String? func run() async throws { - try await CloudOrganizationUpdateSSOService().run( + try await OrganizationUpdateSSOService().run( organizationName: organizationName, provider: provider, organizationId: organizationId, diff --git a/Sources/TuistKit/Commands/OrganizationCommand.swift b/Sources/TuistKit/Commands/OrganizationCommand.swift new file mode 100644 index 00000000000..a446ec92d5c --- /dev/null +++ b/Sources/TuistKit/Commands/OrganizationCommand.swift @@ -0,0 +1,22 @@ +import ArgumentParser +import Foundation +import Path + +struct OrganizationCommand: ParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "organization", + abstract: "A set of commands to manage your Tuist organizations.", + subcommands: [ + OrganizationCreateCommand.self, + OrganizationListCommand.self, + OrganizationDeleteCommand.self, + OrganizationShowCommand.self, + OrganizationInviteCommand.self, + OrganizationRemoveCommand.self, + OrganizationUpdateCommand.self, + OrganizationBillingCommand.self, + ] + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift b/Sources/TuistKit/Commands/Project/ProjectCreateCommand.swift similarity index 84% rename from Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift rename to Sources/TuistKit/Commands/Project/ProjectCreateCommand.swift index 3193b01885e..eda00c3cef0 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectCreateCommand.swift +++ b/Sources/TuistKit/Commands/Project/ProjectCreateCommand.swift @@ -3,7 +3,7 @@ import Foundation import Path import TuistSupport -struct CloudProjectCreateCommand: AsyncParsableCommand { +struct ProjectCreateCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "create", @@ -23,12 +23,12 @@ struct CloudProjectCreateCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudProjectCreatePath + envKey: .projectCreatePath ) var path: String? func run() async throws { - try await CloudProjectCreateService().run( + try await ProjectCreateService().run( fullHandle: fullHandle, directory: path ) diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift b/Sources/TuistKit/Commands/Project/ProjectDeleteCommand.swift similarity index 79% rename from Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift rename to Sources/TuistKit/Commands/Project/ProjectDeleteCommand.swift index 7b35a1eaa5b..77a1980ec8e 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectDeleteCommand.swift +++ b/Sources/TuistKit/Commands/Project/ProjectDeleteCommand.swift @@ -2,12 +2,12 @@ import ArgumentParser import Foundation import TuistSupport -struct CloudProjectDeleteCommand: AsyncParsableCommand { +struct ProjectDeleteCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "delete", _superCommandName: "project", - abstract: "Delete a Cloud project." + abstract: "Delete a Tuist project." ) } @@ -22,12 +22,12 @@ struct CloudProjectDeleteCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudProjectDeletePath + envKey: .projectDeletePath ) var path: String? func run() async throws { - try await CloudProjectDeleteService().run( + try await ProjectDeleteService().run( fullHandle: fullHandle, directory: path ) diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift b/Sources/TuistKit/Commands/Project/ProjectListCommand.swift similarity index 78% rename from Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift rename to Sources/TuistKit/Commands/Project/ProjectListCommand.swift index 233bf296166..e41c788a606 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectListCommand.swift +++ b/Sources/TuistKit/Commands/Project/ProjectListCommand.swift @@ -3,7 +3,7 @@ import Foundation import Path import TuistSupport -struct CloudProjectListCommand: AsyncParsableCommand { +struct ProjectListCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "list", @@ -14,7 +14,7 @@ struct CloudProjectListCommand: AsyncParsableCommand { @Flag( help: "The output in JSON format.", - envKey: .cloudProjectListJson + envKey: .projectListJson ) var json: Bool = false @@ -22,12 +22,12 @@ struct CloudProjectListCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudProjectListPath + envKey: .projectListPath ) var path: String? func run() async throws { - try await CloudProjectListService().run( + try await ProjectListService().run( json: json, directory: path ) diff --git a/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift b/Sources/TuistKit/Commands/Project/ProjectTokenCommand.swift similarity index 86% rename from Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift rename to Sources/TuistKit/Commands/Project/ProjectTokenCommand.swift index 94f6dc9d201..1ac5f03275d 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudProjectTokenCommand.swift +++ b/Sources/TuistKit/Commands/Project/ProjectTokenCommand.swift @@ -3,7 +3,7 @@ import Foundation import Path import TuistSupport -struct CloudProjectTokenCommand: AsyncParsableCommand { +struct ProjectTokenCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "token", @@ -23,12 +23,12 @@ struct CloudProjectTokenCommand: AsyncParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudProjectTokenPath + envKey: .projectTokenPath ) var path: String? func run() async throws { - try await CloudProjectTokenService().run( + try await ProjectTokenService().run( fullHandle: fullHandle, directory: path ) diff --git a/Sources/TuistKit/Commands/ProjectCommand.swift b/Sources/TuistKit/Commands/ProjectCommand.swift new file mode 100644 index 00000000000..d511ed66d58 --- /dev/null +++ b/Sources/TuistKit/Commands/ProjectCommand.swift @@ -0,0 +1,18 @@ +import ArgumentParser +import Foundation +import Path + +struct ProjectCommand: ParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "project", + abstract: "A set of commands to manage your Tuist projects.", + subcommands: [ + ProjectCreateCommand.self, + ProjectListCommand.self, + ProjectDeleteCommand.self, + ProjectTokenCommand.self, + ] + ) + } +} diff --git a/Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift b/Sources/TuistKit/Commands/SessionCommand.swift similarity index 66% rename from Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift rename to Sources/TuistKit/Commands/SessionCommand.swift index 17c739838fd..58da8c49ebe 100644 --- a/Sources/TuistKit/Commands/Cloud/CloudSessionCommand.swift +++ b/Sources/TuistKit/Commands/SessionCommand.swift @@ -2,12 +2,11 @@ import ArgumentParser import Foundation import Path -struct CloudSessionCommand: ParsableCommand { +struct SessionCommand: ParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "session", - _superCommandName: "cloud", - abstract: "Prints the current Cloud session" + abstract: "Prints the current Tuist session" ) } @@ -15,12 +14,12 @@ struct CloudSessionCommand: ParsableCommand { name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", completion: .directory, - envKey: .cloudSessionPath + envKey: .sessionPath ) var path: String? func run() throws { - try CloudSessionService().printSession( + try SessionService().printSession( directory: path ) } diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index 1e4b2136658..ff92f5cdbe4 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -28,7 +28,13 @@ public struct TuistCommand: AsyncParsableCommand { RunCommand.self, ScaffoldCommand.self, TestCommand.self, - CloudCommand.self, + AuthCommand.self, + SessionCommand.self, + LogoutCommand.self, + CleanCommand.self, + ProjectCommand.self, + OrganizationCommand.self, + AnalyticsCommand.self, ] ) } @@ -47,7 +53,7 @@ public struct TuistCommand: AsyncParsableCommand { let backend: TuistAnalyticsBackend? let config = try ConfigLoader().loadConfig(path: path) if let cloud = config.cloud { - backend = TuistAnalyticsCloudBackend( + backend = TuistAnalyticsServerBackend( config: cloud ) } else { @@ -89,10 +95,10 @@ public struct TuistCommand: AsyncParsableCommand { WarningController.shared.flush() errorHandler.fatal(error: error) _exit(exitCode(for: error).rawValue) - } catch let error as ClientError where error.underlyingError is CloudClientAuthenticationError { + } catch let error as ClientError where error.underlyingError is ServerClientAuthenticationError { WarningController.shared.flush() // swiftlint:disable:next force_cast - logger.error("\((error.underlyingError as! CloudClientAuthenticationError).description)") + logger.error("\((error.underlyingError as! ServerClientAuthenticationError).description)") _exit(exitCode(for: error).rawValue) } catch { WarningController.shared.flush() diff --git a/Sources/TuistKit/Services/Cloud/CloudAnalyticsService.swift b/Sources/TuistKit/Services/AnalyticsService.swift similarity index 62% rename from Sources/TuistKit/Services/Cloud/CloudAnalyticsService.swift rename to Sources/TuistKit/Services/AnalyticsService.swift index 395b2c69848..7e138c009de 100644 --- a/Sources/TuistKit/Services/Cloud/CloudAnalyticsService.swift +++ b/Sources/TuistKit/Services/AnalyticsService.swift @@ -3,13 +3,33 @@ import Path import TuistLoader import TuistSupport -protocol CloudAnalyticsServicing { +protocol AnalyticsServicing { func run( path: String? ) async throws } -final class CloudAnalyticsService: CloudAnalyticsServicing { +enum AnalyticsServiceError: FatalError, Equatable { + case cloudNotFound + + /// Error description. + var description: String { + switch self { + case .cloudNotFound: + return "You are missing Cloud configuration in your Config.swift." + } + } + + /// Error type. + var type: ErrorType { + switch self { + case .cloudNotFound: + return .abort + } + } +} + +final class AnalyticsService: AnalyticsServicing { private let configLoader: ConfigLoading private let opener: Opening @@ -27,7 +47,7 @@ final class CloudAnalyticsService: CloudAnalyticsServicing { let path: AbsolutePath = try self.path(path) let config = try configLoader.loadConfig(path: path) - guard let cloud = config.cloud else { throw CloudCleanServiceError.cloudNotFound } + guard let cloud = config.cloud else { throw AnalyticsServiceError.cloudNotFound } try opener.open( url: cloud.url .appendingPathComponent(cloud.projectId) diff --git a/Sources/TuistKit/Services/Cloud/CloudAuthService.swift b/Sources/TuistKit/Services/AuthService.swift similarity index 56% rename from Sources/TuistKit/Services/Cloud/CloudAuthService.swift rename to Sources/TuistKit/Services/AuthService.swift index 04843bebf24..baa484c7faa 100644 --- a/Sources/TuistKit/Services/Cloud/CloudAuthService.swift +++ b/Sources/TuistKit/Services/AuthService.swift @@ -7,24 +7,24 @@ import TuistServer import TuistSupport @Mockable -protocol CloudAuthServicing: AnyObject { +protocol AuthServicing: AnyObject { func authenticate( directory: String? ) async throws } -final class CloudAuthService: CloudAuthServicing { - private let cloudSessionController: CloudSessionControlling - private let cloudURLService: CloudURLServicing +final class AuthService: AuthServicing { + private let serverSessionController: ServerSessionControlling + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( - cloudSessionController: CloudSessionControlling = CloudSessionController(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverSessionController: ServerSessionControlling = ServerSessionController(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { - self.cloudSessionController = cloudSessionController - self.cloudURLService = cloudURLService + self.serverSessionController = serverSessionController + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -40,7 +40,7 @@ final class CloudAuthService: CloudAuthServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) - try await cloudSessionController.authenticate(serverURL: cloudURL) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + try await serverSessionController.authenticate(serverURL: cloudURL) } } diff --git a/Sources/TuistKit/Services/CleanService.swift b/Sources/TuistKit/Services/CleanService.swift index 5b11b58bfff..eabe19a0dce 100644 --- a/Sources/TuistKit/Services/CleanService.swift +++ b/Sources/TuistKit/Services/CleanService.swift @@ -2,6 +2,7 @@ import Foundation import Path import TuistCore import TuistLoader +import TuistServer import TuistSupport import XcodeGraph @@ -77,16 +78,25 @@ final class CleanService { private let rootDirectoryLocator: RootDirectoryLocating private let cacheDirectoriesProvider: CacheDirectoriesProviding private let manifestFilesLocator: ManifestFilesLocating + private let configLoader: ConfigLoading + private let serverURLService: ServerURLServicing + private let cleanCacheService: CleanCacheServicing init( fileHandler: FileHandling, rootDirectoryLocator: RootDirectoryLocating, cacheDirectoriesProvider: CacheDirectoriesProviding, - manifestFilesLocator: ManifestFilesLocating + manifestFilesLocator: ManifestFilesLocating, + configLoader: ConfigLoading, + serverURLService: ServerURLServicing, + cleanCacheService: CleanCacheServicing ) { self.fileHandler = fileHandler self.rootDirectoryLocator = rootDirectoryLocator self.cacheDirectoriesProvider = cacheDirectoriesProvider self.manifestFilesLocator = manifestFilesLocator + self.configLoader = configLoader + self.serverURLService = serverURLService + self.cleanCacheService = cleanCacheService } public convenience init() { @@ -94,14 +104,18 @@ final class CleanService { fileHandler: FileHandler.shared, rootDirectoryLocator: RootDirectoryLocator(), cacheDirectoriesProvider: CacheDirectoriesProvider(), - manifestFilesLocator: ManifestFilesLocator() + manifestFilesLocator: ManifestFilesLocator(), + configLoader: ConfigLoader(), + serverURLService: ServerURLService(), + cleanCacheService: CleanCacheService() ) } func run( categories: [some CleanCategory], + remote: Bool, path: String? - ) throws { + ) async throws { let resolvedPath = if let path { try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) } else { @@ -124,5 +138,15 @@ final class CleanService { logger.notice("There's nothing to clean for \(category.defaultValueDescription)") } } + + if remote, let cloud = try configLoader.loadConfig(path: resolvedPath).cloud { + let cloudURL = try serverURLService.url(configServerURL: cloud.url) + try await cleanCacheService.cleanCache( + serverURL: cloudURL, + fullName: cloud.projectId + ) + + logger.notice("Successfully cleaned the remote storage.") + } } } diff --git a/Sources/TuistKit/Services/Cloud/CloudCleanService.swift b/Sources/TuistKit/Services/Cloud/CloudCleanService.swift deleted file mode 100644 index 122efee76d3..00000000000 --- a/Sources/TuistKit/Services/Cloud/CloudCleanService.swift +++ /dev/null @@ -1,74 +0,0 @@ -import Foundation -import Path -import TuistLoader -import TuistServer -import TuistSupport - -protocol CloudCleanServicing { - func clean( - path: String? - ) async throws -} - -enum CloudCleanServiceError: FatalError, Equatable { - case cloudNotFound - - /// Error description. - var description: String { - switch self { - case .cloudNotFound: - return "You are missing Cloud configuration in your Config.swift. Run `tuist cloud init` to set up Cloud." - } - } - - /// Error type. - var type: ErrorType { - switch self { - case .cloudNotFound: - return .abort - } - } -} - -final class CloudCleanService: CloudCleanServicing { - private let cloudSessionController: CloudSessionControlling - private let cleanCacheService: CleanCacheServicing - private let configLoader: ConfigLoading - private let cloudURLService: CloudURLServicing - - init( - cloudSessionController: CloudSessionControlling = CloudSessionController(), - cleanCacheService: CleanCacheServicing = CleanCacheService(), - configLoader: ConfigLoading = ConfigLoader(), - cloudURLService: CloudURLServicing = CloudURLService() - ) { - self.cloudSessionController = cloudSessionController - self.cleanCacheService = cleanCacheService - self.configLoader = configLoader - self.cloudURLService = cloudURLService - } - - func clean(path: String?) async throws { - let path: AbsolutePath = try self.path(path) - let config = try configLoader.loadConfig(path: path) - - guard let cloud = config.cloud else { throw CloudCleanServiceError.cloudNotFound } - let cloudURL = try cloudURLService.url(configCloudURL: cloud.url) - try await cleanCacheService.cleanCache( - serverURL: cloudURL, - fullName: cloud.projectId - ) - - logger.info("Project was successfully cleaned.") - } - - // MARK: - Helpers - - private func path(_ path: String?) throws -> AbsolutePath { - if let path { - return try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) - } else { - return FileHandler.shared.currentPath - } - } -} diff --git a/Sources/TuistKit/Services/Cloud/CloudInitService.swift b/Sources/TuistKit/Services/Cloud/CloudInitService.swift deleted file mode 100644 index 280ecdf9e55..00000000000 --- a/Sources/TuistKit/Services/Cloud/CloudInitService.swift +++ /dev/null @@ -1,105 +0,0 @@ -import Foundation -import Path -import TuistLoader -import TuistServer -import TuistSupport - -protocol CloudInitServicing { - func createProject( - fullHandle: String, - directory: String? - ) async throws -} - -enum CloudInitServiceError: FatalError, Equatable { - case cloudAlreadySetUp - - /// Error description. - var description: String { - switch self { - case .cloudAlreadySetUp: - return "The project is already set up with Tuist Cloud." - } - } - - /// Error type. - var type: ErrorType { - switch self { - case .cloudAlreadySetUp: - return .abort - } - } -} - -final class CloudInitService: CloudInitServicing { - private let cloudSessionController: CloudSessionControlling - private let createProjectService: CreateProjectServicing - private let configLoader: ConfigLoading - private let cloudURLService: CloudURLServicing - - init( - cloudSessionController: CloudSessionControlling = CloudSessionController(), - createProjectService: CreateProjectServicing = CreateProjectService(), - configLoader: ConfigLoading = ConfigLoader(), - cloudURLService: CloudURLServicing = CloudURLService() - ) { - self.cloudSessionController = cloudSessionController - self.createProjectService = createProjectService - self.configLoader = configLoader - self.cloudURLService = cloudURLService - } - - func createProject( - fullHandle: String, - directory: String? - ) async throws { - let directoryPath: AbsolutePath - if let directory { - directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) - } else { - directoryPath = FileHandler.shared.currentPath - } - let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) - - if config.cloud != nil { - throw CloudInitServiceError.cloudAlreadySetUp - } - - let project = try await createProjectService.createProject( - fullHandle: fullHandle, - serverURL: cloudURL - ) - - if configLoader.locateConfig(at: directoryPath) == nil { - let tuistDirectoryPath = directoryPath.appending(component: Constants.tuistDirectoryName) - if !FileHandler.shared.exists(tuistDirectoryPath) { - try FileHandler.shared.createFolder(tuistDirectoryPath) - } - try FileHandler.shared.write( - """ - import ProjectDescription - - let config = Config( - cloud: .cloud(projectId: "\(project.fullName)") - ) - - """, - path: tuistDirectoryPath.appending(component: Manifest.config.fileName(directoryPath)), - atomically: true - ) - logger.info( - """ - Tuist Cloud was successfully initialized. - """ - ) - } else { - logger.info( - """ - Put the following line into your Tuist/Config.swift (see the docs for more: https://docs.tuist.io/manifests/config/): - cloud: .cloud(projectId: "\(project.fullName)") - """ - ) - } - } -} diff --git a/Sources/TuistKit/Services/Cloud/CloudLogoutService.swift b/Sources/TuistKit/Services/LogoutService.swift similarity index 56% rename from Sources/TuistKit/Services/Cloud/CloudLogoutService.swift rename to Sources/TuistKit/Services/LogoutService.swift index ac3382ff76a..ecc2af535b1 100644 --- a/Sources/TuistKit/Services/Cloud/CloudLogoutService.swift +++ b/Sources/TuistKit/Services/LogoutService.swift @@ -5,7 +5,7 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudLogoutServicing: AnyObject { +protocol LogoutServicing: AnyObject { /// It removes any session associated to that domain from /// the keychain func logout( @@ -13,18 +13,18 @@ protocol CloudLogoutServicing: AnyObject { ) throws } -final class CloudLogoutService: CloudLogoutServicing { - private let cloudSessionController: CloudSessionControlling - private let cloudURLService: CloudURLServicing +final class LogoutService: LogoutServicing { + private let serverSessionController: ServerSessionControlling + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( - cloudSessionController: CloudSessionControlling = CloudSessionController(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverSessionController: ServerSessionControlling = ServerSessionController(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { - self.cloudSessionController = cloudSessionController - self.cloudURLService = cloudURLService + self.serverSessionController = serverSessionController + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -38,7 +38,7 @@ final class CloudLogoutService: CloudLogoutServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) - try cloudSessionController.logout(serverURL: cloudURL) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + try serverSessionController.logout(serverURL: cloudURL) } } diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationBillingService.swift b/Sources/TuistKit/Services/Organization/OrganizationBillingService.swift similarity index 74% rename from Sources/TuistKit/Services/Cloud/CloudOrganizationBillingService.swift rename to Sources/TuistKit/Services/Organization/OrganizationBillingService.swift index 01fcefd4f13..00de6ea091a 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationBillingService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationBillingService.swift @@ -4,24 +4,24 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudOrganizationBillingServicing { +protocol OrganizationBillingServicing { func run( organizationName: String, directory: String? ) async throws } -final class CloudOrganizationBillingService: CloudOrganizationBillingServicing { - private let cloudURLService: CloudURLServicing +final class OrganizationBillingService: OrganizationBillingServicing { + private let serverURLService: ServerURLServicing private let opener: Opening private let configLoader: ConfigLoading init( - cloudURLService: CloudURLServicing = CloudURLService(), + serverURLService: ServerURLServicing = ServerURLService(), opener: Opening = Opener(), configLoader: ConfigLoading = ConfigLoader() ) { - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.opener = opener self.configLoader = configLoader } @@ -37,7 +37,7 @@ final class CloudOrganizationBillingService: CloudOrganizationBillingServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) try opener.open( url: cloudURL .appendingPathComponent(organizationName) diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationCreateService.swift b/Sources/TuistKit/Services/Organization/OrganizationCreateService.swift similarity index 73% rename from Sources/TuistKit/Services/Cloud/CloudOrganizationCreateService.swift rename to Sources/TuistKit/Services/Organization/OrganizationCreateService.swift index 9a64a950c99..435696d49a5 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationCreateService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationCreateService.swift @@ -4,25 +4,25 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudOrganizationCreateServicing { +protocol OrganizationCreateServicing { func run( organizationName: String, directory: String? ) async throws } -final class CloudOrganizationCreateService: CloudOrganizationCreateServicing { +final class OrganizationCreateService: OrganizationCreateServicing { private let createOrganizationService: CreateOrganizationServicing - private let cloudURLService: CloudURLServicing + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( createOrganizationService: CreateOrganizationServicing = CreateOrganizationService(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.createOrganizationService = createOrganizationService - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -37,13 +37,13 @@ final class CloudOrganizationCreateService: CloudOrganizationCreateServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) let organization = try await createOrganizationService.createOrganization( name: organizationName, serverURL: cloudURL ) - logger.info("Cloud organization \(organization.name) was successfully created 🎉") + logger.info("Tuist organization \(organization.name) was successfully created 🎉") } } diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationDeleteService.swift b/Sources/TuistKit/Services/Organization/OrganizationDeleteService.swift similarity index 73% rename from Sources/TuistKit/Services/Cloud/CloudOrganizationDeleteService.swift rename to Sources/TuistKit/Services/Organization/OrganizationDeleteService.swift index dc73b9fdaa2..0b32c67b088 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationDeleteService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationDeleteService.swift @@ -4,25 +4,25 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudOrganizationDeleteServicing { +protocol OrganizationDeleteServicing { func run( organizationName: String, directory: String? ) async throws } -final class CloudOrganizationDeleteService: CloudOrganizationDeleteServicing { +final class OrganizationDeleteService: OrganizationDeleteServicing { private let deleteOrganizationService: DeleteOrganizationServicing - private let cloudURLService: CloudURLServicing + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( deleteOrganizationService: DeleteOrganizationServicing = DeleteOrganizationService(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.deleteOrganizationService = deleteOrganizationService - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -37,13 +37,13 @@ final class CloudOrganizationDeleteService: CloudOrganizationDeleteServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) try await deleteOrganizationService.deleteOrganization( name: organizationName, serverURL: cloudURL ) - logger.info("Cloud organization \(organizationName) was successfully deleted.") + logger.info("Tuist organization \(organizationName) was successfully deleted.") } } diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationInviteService.swift b/Sources/TuistKit/Services/Organization/OrganizationInviteService.swift similarity index 82% rename from Sources/TuistKit/Services/Cloud/CloudOrganizationInviteService.swift rename to Sources/TuistKit/Services/Organization/OrganizationInviteService.swift index 03d8a332bfb..343ac2b7c27 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationInviteService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationInviteService.swift @@ -4,7 +4,7 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudOrganizationInviteServicing { +protocol OrganizationInviteServicing { func run( organizationName: String, email: String, @@ -12,18 +12,18 @@ protocol CloudOrganizationInviteServicing { ) async throws } -final class CloudOrganizationInviteService: CloudOrganizationInviteServicing { +final class OrganizationInviteService: OrganizationInviteServicing { private let createOrganizationInviteService: CreateOrganizationInviteServicing - private let cloudURLService: CloudURLServicing + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( createOrganizationInviteService: CreateOrganizationInviteServicing = CreateOrganizationInviteService(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.createOrganizationInviteService = createOrganizationInviteService - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -39,7 +39,7 @@ final class CloudOrganizationInviteService: CloudOrganizationInviteServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) let invitation = try await createOrganizationInviteService.createOrganizationInvite( organizationName: organizationName, diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift b/Sources/TuistKit/Services/Organization/OrganizationListService.swift similarity index 79% rename from Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift rename to Sources/TuistKit/Services/Organization/OrganizationListService.swift index f59364b8046..471cf17da01 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationListService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationListService.swift @@ -4,25 +4,25 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudOrganizationListServicing { +protocol OrganizationListServicing { func run( json: Bool, directory: String? ) async throws } -final class CloudOrganizationListService: CloudOrganizationListServicing { +final class OrganizationListService: OrganizationListServicing { private let listOrganizationsService: ListOrganizationsServicing - private let cloudURLService: CloudURLServicing + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( listOrganizationsService: ListOrganizationsServicing = ListOrganizationsService(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.listOrganizationsService = listOrganizationsService - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -37,7 +37,7 @@ final class CloudOrganizationListService: CloudOrganizationListServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) let organizations = try await listOrganizationsService.listOrganizations( serverURL: cloudURL @@ -50,7 +50,7 @@ final class CloudOrganizationListService: CloudOrganizationListServicing { } if organizations.isEmpty { - logger.info("You currently have no Cloud organizations. Create one by running `tuist cloud organization create`.") + logger.info("You currently have no Cloud organizations. Create one by running `tuist organization create`.") return } diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveInviteService.swift b/Sources/TuistKit/Services/Organization/OrganizationRemoveInviteService.swift similarity index 79% rename from Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveInviteService.swift rename to Sources/TuistKit/Services/Organization/OrganizationRemoveInviteService.swift index 049e7de2003..1d4682c394e 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveInviteService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationRemoveInviteService.swift @@ -4,7 +4,7 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudOrganizationRemoveInviteServicing { +protocol OrganizationRemoveInviteServicing { func run( organizationName: String, email: String, @@ -12,18 +12,18 @@ protocol CloudOrganizationRemoveInviteServicing { ) async throws } -final class CloudOrganizationRemoveInviteService: CloudOrganizationRemoveInviteServicing { +final class OrganizationRemoveInviteService: OrganizationRemoveInviteServicing { private let cancelOrganizationRemoveInviteService: CancelOrganizationInviteServicing - private let cloudURLService: CloudURLServicing + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( cancelOrganizationRemoveInviteService: CancelOrganizationInviteServicing = CancelOrganizationInviteService(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.cancelOrganizationRemoveInviteService = cancelOrganizationRemoveInviteService - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -39,7 +39,7 @@ final class CloudOrganizationRemoveInviteService: CloudOrganizationRemoveInviteS directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) try await cancelOrganizationRemoveInviteService.cancelOrganizationInvite( organizationName: organizationName, diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveMemberService.swift b/Sources/TuistKit/Services/Organization/OrganizationRemoveMemberService.swift similarity index 78% rename from Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveMemberService.swift rename to Sources/TuistKit/Services/Organization/OrganizationRemoveMemberService.swift index da21a40b48d..d37cc164f48 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveMemberService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationRemoveMemberService.swift @@ -4,7 +4,7 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudOrganizationRemoveMemberServicing { +protocol OrganizationRemoveMemberServicing { func run( organizationName: String, username: String, @@ -12,18 +12,18 @@ protocol CloudOrganizationRemoveMemberServicing { ) async throws } -final class CloudOrganizationRemoveMemberService: CloudOrganizationRemoveMemberServicing { +final class OrganizationRemoveMemberService: OrganizationRemoveMemberServicing { private let removeOrganizationMemberService: RemoveOrganizationMemberServicing - private let cloudURLService: CloudURLServicing + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( removeOrganizationMemberService: RemoveOrganizationMemberServicing = RemoveOrganizationMemberService(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.removeOrganizationMemberService = removeOrganizationMemberService - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -39,7 +39,7 @@ final class CloudOrganizationRemoveMemberService: CloudOrganizationRemoveMemberS directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) try await removeOrganizationMemberService.removeOrganizationMember( organizationName: organizationName, diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveSSOService.swift b/Sources/TuistKit/Services/Organization/OrganizationRemoveSSOService.swift similarity index 77% rename from Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveSSOService.swift rename to Sources/TuistKit/Services/Organization/OrganizationRemoveSSOService.swift index 62086f47deb..2c0100fa865 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationRemoveSSOService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationRemoveSSOService.swift @@ -4,25 +4,25 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudOrganizationRemoveSSOServicing { +protocol OrganizationRemoveSSOServicing { func run( organizationName: String, directory: String? ) async throws } -final class CloudOrganizationRemoveSSOService: CloudOrganizationRemoveSSOServicing { +final class OrganizationRemoveSSOService: OrganizationRemoveSSOServicing { private let updateOrganizationService: UpdateOrganizationServicing - private let cloudURLService: CloudURLServicing + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( updateOrganizationService: UpdateOrganizationServicing = UpdateOrganizationService(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.updateOrganizationService = updateOrganizationService - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -38,7 +38,7 @@ final class CloudOrganizationRemoveSSOService: CloudOrganizationRemoveSSOServici } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) _ = try await updateOrganizationService.updateOrganization( organizationName: organizationName, serverURL: cloudURL, diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift b/Sources/TuistKit/Services/Organization/OrganizationShowService.swift similarity index 92% rename from Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift rename to Sources/TuistKit/Services/Organization/OrganizationShowService.swift index 6f3b4fe8a6e..d0791d469c3 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationShowService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationShowService.swift @@ -4,7 +4,7 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudOrganizationShowServicing { +protocol OrganizationShowServicing { func run( organizationName: String, json: Bool, @@ -12,21 +12,21 @@ protocol CloudOrganizationShowServicing { ) async throws } -final class CloudOrganizationShowService: CloudOrganizationShowServicing { +final class OrganizationShowService: OrganizationShowServicing { private let getOrganizationService: GetOrganizationServicing private let getOrganizationUsageService: GetOrganizationUsageServicing - private let cloudURLService: CloudURLServicing + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( getOrganizationService: GetOrganizationServicing = GetOrganizationService(), getOrganizationUsageService: GetOrganizationUsageServicing = GetOrganizationUsageService(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.getOrganizationService = getOrganizationService self.getOrganizationUsageService = getOrganizationUsageService - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -42,7 +42,7 @@ final class CloudOrganizationShowService: CloudOrganizationShowServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) let organization = try await getOrganizationService.getOrganization( organizationName: organizationName, diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateMemberService.swift b/Sources/TuistKit/Services/Organization/OrganizationUpdateMemberService.swift similarity index 76% rename from Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateMemberService.swift rename to Sources/TuistKit/Services/Organization/OrganizationUpdateMemberService.swift index 9ae3c7f1f8f..61c780b6bd9 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateMemberService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationUpdateMemberService.swift @@ -4,7 +4,7 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudOrganizationUpdateMemberServicing { +protocol OrganizationUpdateMemberServicing { func run( organizationName: String, username: String, @@ -13,18 +13,18 @@ protocol CloudOrganizationUpdateMemberServicing { ) async throws } -final class CloudOrganizationUpdateMemberService: CloudOrganizationUpdateMemberServicing { +final class OrganizationUpdateMemberService: OrganizationUpdateMemberServicing { private let updateOrganizationMemberService: UpdateOrganizationMemberServicing - private let cloudURLService: CloudURLServicing + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( updateOrganizationMemberService: UpdateOrganizationMemberServicing = UpdateOrganizationMemberService(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.updateOrganizationMemberService = updateOrganizationMemberService - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -42,11 +42,11 @@ final class CloudOrganizationUpdateMemberService: CloudOrganizationUpdateMemberS } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) let member = try await updateOrganizationMemberService.updateOrganizationMember( organizationName: organizationName, username: username, - role: CloudOrganization.Member.Role(rawValue: role) ?? .user, + role: ServerOrganization.Member.Role(rawValue: role) ?? .user, serverURL: cloudURL ) diff --git a/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateService.swift b/Sources/TuistKit/Services/Organization/OrganizationUpdateService.swift similarity index 82% rename from Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateService.swift rename to Sources/TuistKit/Services/Organization/OrganizationUpdateService.swift index bd89ba78282..e8042333c9d 100644 --- a/Sources/TuistKit/Services/Cloud/CloudOrganizationUpdateService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationUpdateService.swift @@ -4,7 +4,7 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudOrganizationUpdateSSOServicing { +protocol OrganizationUpdateSSOServicing { func run( organizationName: String, provider: SSOProvider, @@ -13,18 +13,18 @@ protocol CloudOrganizationUpdateSSOServicing { ) async throws } -final class CloudOrganizationUpdateSSOService: CloudOrganizationUpdateSSOServicing { +final class OrganizationUpdateSSOService: OrganizationUpdateSSOServicing { private let updateOrganizationService: UpdateOrganizationServicing - private let cloudURLService: CloudURLServicing + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( updateOrganizationService: UpdateOrganizationServicing = UpdateOrganizationService(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.updateOrganizationService = updateOrganizationService - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -48,7 +48,7 @@ final class CloudOrganizationUpdateSSOService: CloudOrganizationUpdateSSOServici ssoOrganization = .google(organizationId) } - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) _ = try await updateOrganizationService.updateOrganization( organizationName: organizationName, serverURL: cloudURL, diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift b/Sources/TuistKit/Services/Project/ProjectCreateService.swift similarity index 71% rename from Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift rename to Sources/TuistKit/Services/Project/ProjectCreateService.swift index c70eefd567b..b2bf00210dd 100644 --- a/Sources/TuistKit/Services/Cloud/CloudProjectCreateService.swift +++ b/Sources/TuistKit/Services/Project/ProjectCreateService.swift @@ -4,25 +4,25 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudProjectCreateServicing { +protocol ProjectCreateServicing { func run( fullHandle: String, directory: String? ) async throws } -final class CloudProjectCreateService: CloudProjectCreateServicing { +final class ProjectCreateService: ProjectCreateServicing { private let createProjectService: CreateProjectServicing - private let cloudURLService: CloudURLServicing + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( createProjectService: CreateProjectServicing = CreateProjectService(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.createProjectService = createProjectService - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -38,13 +38,13 @@ final class CloudProjectCreateService: CloudProjectCreateServicing { } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) let project = try await createProjectService.createProject( fullHandle: fullHandle, serverURL: cloudURL ) - logger.info("Tuist Cloud project \(project.fullName) was successfully created 🎉") + logger.info("Tuist project \(project.fullName) was successfully created 🎉") } } diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift b/Sources/TuistKit/Services/Project/ProjectDeleteService.swift similarity index 76% rename from Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift rename to Sources/TuistKit/Services/Project/ProjectDeleteService.swift index 5f1ca968ef7..72bc97b8205 100644 --- a/Sources/TuistKit/Services/Cloud/CloudProjectDeleteService.swift +++ b/Sources/TuistKit/Services/Project/ProjectDeleteService.swift @@ -4,31 +4,31 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudProjectDeleteServicing { +protocol ProjectDeleteServicing { func run( fullHandle: String, directory: String? ) async throws } -final class CloudProjectDeleteService: CloudProjectDeleteServicing { +final class ProjectDeleteService: ProjectDeleteServicing { private let deleteProjectService: DeleteProjectServicing private let getProjectService: GetProjectServicing - private let credentialsStore: CloudCredentialsStoring - private let cloudURLService: CloudURLServicing + private let credentialsStore: ServerCredentialsStoring + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( deleteProjectService: DeleteProjectServicing = DeleteProjectService(), getProjectService: GetProjectServicing = GetProjectService(), - credentialsStore: CloudCredentialsStoring = CloudCredentialsStore(), - cloudURLService: CloudURLServicing = CloudURLService(), + credentialsStore: ServerCredentialsStoring = ServerCredentialsStore(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.deleteProjectService = deleteProjectService self.getProjectService = getProjectService self.credentialsStore = credentialsStore - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -43,7 +43,7 @@ final class CloudProjectDeleteService: CloudProjectDeleteServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) let project = try await getProjectService.getProject( fullHandle: fullHandle, diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectListService.swift b/Sources/TuistKit/Services/Project/ProjectListService.swift similarity index 76% rename from Sources/TuistKit/Services/Cloud/CloudProjectListService.swift rename to Sources/TuistKit/Services/Project/ProjectListService.swift index 5e8288f7ba1..67accd55ea5 100644 --- a/Sources/TuistKit/Services/Cloud/CloudProjectListService.swift +++ b/Sources/TuistKit/Services/Project/ProjectListService.swift @@ -4,25 +4,25 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudProjectListServicing { +protocol ProjectListServicing { func run( json: Bool, directory: String? ) async throws } -final class CloudProjectListService: CloudProjectListServicing { +final class ProjectListService: ProjectListServicing { private let listProjectsService: ListProjectsServicing - private let cloudURLService: CloudURLServicing + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( listProjectsService: ListProjectsServicing = ListProjectsService(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.listProjectsService = listProjectsService - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -37,7 +37,7 @@ final class CloudProjectListService: CloudProjectListServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) let projects = try await listProjectsService.listProjects( serverURL: cloudURL @@ -50,7 +50,7 @@ final class CloudProjectListService: CloudProjectListServicing { } if projects.isEmpty { - logger.info("You currently have no Cloud projects. Create one by running `tuist cloud project create`.") + logger.info("You currently have no Tuist projects. Create one by running `tuist project create`.") return } diff --git a/Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift b/Sources/TuistKit/Services/Project/ProjectTokenService.swift similarity index 71% rename from Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift rename to Sources/TuistKit/Services/Project/ProjectTokenService.swift index 661d203b498..5a150d0d74b 100644 --- a/Sources/TuistKit/Services/Cloud/CloudProjectTokenService.swift +++ b/Sources/TuistKit/Services/Project/ProjectTokenService.swift @@ -4,28 +4,28 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudProjectTokenServicing { +protocol ProjectTokenServicing { func run( fullHandle: String, directory: String? ) async throws } -final class CloudProjectTokenService: CloudProjectTokenServicing { +final class ProjectTokenService: ProjectTokenServicing { private let getProjectService: GetProjectServicing - private let credentialsStore: CloudCredentialsStoring - private let cloudURLService: CloudURLServicing + private let credentialsStore: ServerCredentialsStoring + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( getProjectService: GetProjectServicing = GetProjectService(), - credentialsStore: CloudCredentialsStoring = CloudCredentialsStore(), - cloudURLService: CloudURLServicing = CloudURLService(), + credentialsStore: ServerCredentialsStoring = ServerCredentialsStore(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { self.getProjectService = getProjectService self.credentialsStore = credentialsStore - self.cloudURLService = cloudURLService + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -40,7 +40,7 @@ final class CloudProjectTokenService: CloudProjectTokenServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) let project = try await getProjectService.getProject( fullHandle: fullHandle, diff --git a/Sources/TuistKit/Services/Cloud/CloudSessionService.swift b/Sources/TuistKit/Services/SessionService.swift similarity index 59% rename from Sources/TuistKit/Services/Cloud/CloudSessionService.swift rename to Sources/TuistKit/Services/SessionService.swift index 536e236cf2d..7c4efbb6829 100644 --- a/Sources/TuistKit/Services/Cloud/CloudSessionService.swift +++ b/Sources/TuistKit/Services/SessionService.swift @@ -5,7 +5,7 @@ import TuistLoader import TuistServer import TuistSupport -protocol CloudSessionServicing: AnyObject { +protocol SessionServicing: AnyObject { /// It prints any existing session in the keychain to authenticate /// on a server identified by that URL. func printSession( @@ -13,20 +13,20 @@ protocol CloudSessionServicing: AnyObject { ) throws } -final class CloudSessionService: CloudSessionServicing { - private let cloudSessionController: CloudSessionControlling - private let cloudURLService: CloudURLServicing +final class SessionService: SessionServicing { + private let serverSessionController: ServerSessionControlling + private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading // MARK: - Init init( - cloudSessionController: CloudSessionControlling = CloudSessionController(), - cloudURLService: CloudURLServicing = CloudURLService(), + serverSessionController: ServerSessionControlling = ServerSessionController(), + serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { - self.cloudSessionController = cloudSessionController - self.cloudURLService = cloudURLService + self.serverSessionController = serverSessionController + self.serverURLService = serverURLService self.configLoader = configLoader } @@ -42,7 +42,7 @@ final class CloudSessionService: CloudSessionServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try cloudURLService.url(configCloudURL: config.cloud?.url) - try cloudSessionController.printSession(serverURL: cloudURL) + let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + try serverSessionController.printSession(serverURL: cloudURL) } } diff --git a/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift b/Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift similarity index 97% rename from Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift rename to Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift index 51eaab30a37..69695449557 100644 --- a/Sources/TuistKit/Utils/TuistAnalyticsCloudBackend.swift +++ b/Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift @@ -7,7 +7,7 @@ import TuistServer import TuistSupport import XcodeGraph -public class TuistAnalyticsCloudBackend: TuistAnalyticsBackend { +public class TuistAnalyticsServerBackend: TuistAnalyticsBackend { private let config: Cloud private let createCommandEventService: CreateCommandEventServicing private let fileHandler: FileHandling diff --git a/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift index 037a2ed9440..6aa23a69c42 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift @@ -7,20 +7,20 @@ import XcodeGraph enum CloudManifestMapperError: FatalError { /// Thrown when the cloud URL is invalid. - case invalidCloudURL(String) + case invalidServerURL(String) /// Error type. var type: ErrorType { switch self { - case .invalidCloudURL: return .abort + case .invalidServerURL: return .abort } } /// Error description. var description: String { switch self { - case let .invalidCloudURL(url): - return "The cloud URL '\(url)' is not a valid URL" + case let .invalidServerURL(url): + return "The server URL '\(url)' is not a valid URL" } } } @@ -28,10 +28,10 @@ enum CloudManifestMapperError: FatalError { extension TuistCore.Cloud { static func from(manifest: ProjectDescription.Cloud) throws -> TuistCore.Cloud { var cloudURL: URL! - if let manifestCloudURL = URL(string: manifest.url.dropSuffix("/")) { - cloudURL = manifestCloudURL + if let manifestServerURL = URL(string: manifest.url.dropSuffix("/")) { + cloudURL = manifestServerURL } else { - throw CloudManifestMapperError.invalidCloudURL(manifest.url) + throw CloudManifestMapperError.invalidServerURL(manifest.url) } let options = manifest.options.compactMap(TuistCore.Cloud.Option.from) return TuistCore.Cloud(url: cloudURL, projectId: manifest.projectId, options: options) diff --git a/Sources/TuistServer/Client/Client+Cloud.swift b/Sources/TuistServer/Client/Client+Cloud.swift deleted file mode 100644 index e145c44fb39..00000000000 --- a/Sources/TuistServer/Client/Client+Cloud.swift +++ /dev/null @@ -1,35 +0,0 @@ -import Foundation -import OpenAPIRuntime -import OpenAPIURLSession - -extension Client { - private static let commonMiddlewares: [any ClientMiddleware] = [ - CloudClientRequestIdMiddleware(), - CloudClientVerboseLoggingMiddleware(), - CloudClientOutputWarningsMiddleware(), - ] - - /// Tuist Cloud client for authenticated sessions - static func cloud(serverURL: URL) -> Client { - .init( - serverURL: serverURL, - transport: URLSessionTransport(configuration: .init(session: .sharedCloud)), - middlewares: commonMiddlewares + [ - CloudClientRequestIdMiddleware(), - CloudClientCLIMetadataHeadersMiddleware(), - CloudClientAuthenticationMiddleware(), - CloudClientVerboseLoggingMiddleware(), - CloudClientOutputWarningsMiddleware(), - ] - ) - } - - /// Tuist Cloud client for unauthenticated sessions - static func unauthenticatedCloud(serverURL: URL) -> Client { - .init( - serverURL: serverURL, - transport: URLSessionTransport(configuration: .init(session: .sharedCloud)), - middlewares: commonMiddlewares - ) - } -} diff --git a/Sources/TuistServer/Client/Client+Server.swift b/Sources/TuistServer/Client/Client+Server.swift new file mode 100644 index 00000000000..695be59d755 --- /dev/null +++ b/Sources/TuistServer/Client/Client+Server.swift @@ -0,0 +1,35 @@ +import Foundation +import OpenAPIRuntime +import OpenAPIURLSession + +extension Client { + private static let commonMiddlewares: [any ClientMiddleware] = [ + ServerClientRequestIdMiddleware(), + ServerClientVerboseLoggingMiddleware(), + ServerClientOutputWarningsMiddleware(), + ] + + /// Tuist client for authenticated sessions + static func authenticated(serverURL: URL) -> Client { + .init( + serverURL: serverURL, + transport: URLSessionTransport(configuration: .init(session: .shared)), + middlewares: commonMiddlewares + [ + ServerClientRequestIdMiddleware(), + ServerClientCLIMetadataHeadersMiddleware(), + ServerClientAuthenticationMiddleware(), + ServerClientVerboseLoggingMiddleware(), + ServerClientOutputWarningsMiddleware(), + ] + ) + } + + /// Tuist client for unauthenticated sessions + static func unauthenticated(serverURL: URL) -> Client { + .init( + serverURL: serverURL, + transport: URLSessionTransport(configuration: .init(session: .shared)), + middlewares: commonMiddlewares + ) + } +} diff --git a/Sources/TuistServer/Client/CloudClientAuthenticationMiddleware.swift b/Sources/TuistServer/Client/ServerClientAuthenticationMiddleware.swift similarity index 72% rename from Sources/TuistServer/Client/CloudClientAuthenticationMiddleware.swift rename to Sources/TuistServer/Client/ServerClientAuthenticationMiddleware.swift index 41ca8f192cb..af29622d2c8 100644 --- a/Sources/TuistServer/Client/CloudClientAuthenticationMiddleware.swift +++ b/Sources/TuistServer/Client/ServerClientAuthenticationMiddleware.swift @@ -2,7 +2,7 @@ import Foundation import OpenAPIRuntime import TuistSupport -public enum CloudClientAuthenticationError: FatalError { +public enum ServerClientAuthenticationError: FatalError { case notAuthenticated public var type: ErrorType { @@ -15,13 +15,13 @@ public enum CloudClientAuthenticationError: FatalError { public var description: String { switch self { case .notAuthenticated: - return "No Tuist authentication token found. Authenticate by running `tuist cloud auth`." + return "No Tuist authentication token found. Authenticate by running `tuist auth`." } } } /// Injects an authorization header to every request. -struct CloudClientAuthenticationMiddleware: ClientMiddleware { +struct ServerClientAuthenticationMiddleware: ClientMiddleware { func intercept( _ request: Request, baseURL: URL, @@ -29,9 +29,9 @@ struct CloudClientAuthenticationMiddleware: ClientMiddleware { next: (Request, URL) async throws -> Response ) async throws -> Response { var request = request - guard let token = try CloudAuthenticationController().authenticationToken(serverURL: baseURL) + guard let token = try ServerAuthenticationController().authenticationToken(serverURL: baseURL) else { - throw CloudClientAuthenticationError.notAuthenticated + throw ServerClientAuthenticationError.notAuthenticated } request.headerFields.append(.init( diff --git a/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift b/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift similarity index 91% rename from Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift rename to Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift index 4effb268950..c46ea8bce94 100644 --- a/Sources/TuistServer/Client/CloudClientCLIMetadataHeadersMiddleware.swift +++ b/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift @@ -4,7 +4,7 @@ import TuistSupport /// This middleware includes the release date of the CLI in the headers so that we can show /// warnings if the on-premise installation is too old. -struct CloudClientCLIMetadataHeadersMiddleware: ClientMiddleware { +struct ServerClientCLIMetadataHeadersMiddleware: ClientMiddleware { let releaseDate = "2024.07.02" func intercept( diff --git a/Sources/TuistServer/Client/CloudClientOutputWarningsMiddleware.swift b/Sources/TuistServer/Client/ServerClientOutputWarningsMiddleware.swift similarity index 88% rename from Sources/TuistServer/Client/CloudClientOutputWarningsMiddleware.swift rename to Sources/TuistServer/Client/ServerClientOutputWarningsMiddleware.swift index b721cb61596..4643e3b4299 100644 --- a/Sources/TuistServer/Client/CloudClientOutputWarningsMiddleware.swift +++ b/Sources/TuistServer/Client/ServerClientOutputWarningsMiddleware.swift @@ -15,9 +15,9 @@ enum CloudClientOutputWarningsMiddlewareError: FatalError { var description: String { switch self { case .couldntConvertToData: - "We couldn't convert Tuist Cloud warnings into a data instance" + "We couldn't convert Tuist warnings into a data instance" case .invalidSchema: - "The Tuist Cloud warnings returned by the server have an unexpected schema" + "The Tuist warnings returned by the server have an unexpected schema" } } @@ -27,7 +27,7 @@ enum CloudClientOutputWarningsMiddlewareError: FatalError { /// A middleware that gets any warning returned in a "x-cloud-warning" header /// and outputs it to the user. -struct CloudClientOutputWarningsMiddleware: ClientMiddleware { +struct ServerClientOutputWarningsMiddleware: ClientMiddleware { let warningController: WarningControlling init(warningController: WarningControlling = WarningController.shared) { diff --git a/Sources/TuistServer/Client/CloudClientRequestIdMiddleware.swift b/Sources/TuistServer/Client/ServerClientRequestIdMiddleware.swift similarity index 90% rename from Sources/TuistServer/Client/CloudClientRequestIdMiddleware.swift rename to Sources/TuistServer/Client/ServerClientRequestIdMiddleware.swift index fd30adba85d..1afede18068 100644 --- a/Sources/TuistServer/Client/CloudClientRequestIdMiddleware.swift +++ b/Sources/TuistServer/Client/ServerClientRequestIdMiddleware.swift @@ -4,7 +4,7 @@ import TuistSupport /// A middleware that gets any warning returned in a "x-cloud-warning" header /// and outputs it to the user. -struct CloudClientRequestIdMiddleware: ClientMiddleware { +struct ServerClientRequestIdMiddleware: ClientMiddleware { func intercept( _ request: Request, baseURL: URL, diff --git a/Sources/TuistServer/Client/CloudClientVerboseLoggingMiddleware.swift b/Sources/TuistServer/Client/ServerClientVerboseLoggingMiddleware.swift similarity index 88% rename from Sources/TuistServer/Client/CloudClientVerboseLoggingMiddleware.swift rename to Sources/TuistServer/Client/ServerClientVerboseLoggingMiddleware.swift index 4fd8cb92b6f..d27dfad46c5 100644 --- a/Sources/TuistServer/Client/CloudClientVerboseLoggingMiddleware.swift +++ b/Sources/TuistServer/Client/ServerClientVerboseLoggingMiddleware.swift @@ -3,7 +3,7 @@ import OpenAPIRuntime import TuistSupport /// A middleware that outputs in debug mode the request and responses sent and received from the server -struct CloudClientVerboseLoggingMiddleware: ClientMiddleware { +struct ServerClientVerboseLoggingMiddleware: ClientMiddleware { func intercept( _ request: Request, baseURL: URL, @@ -17,7 +17,7 @@ struct CloudClientVerboseLoggingMiddleware: ClientMiddleware { } logger.debug(""" - Sending HTTP request to Tuist Cloud: + Sending HTTP request to Tuist: - Method: \(request.method.rawValue) - URL: \(baseURL.absoluteString) - Path: \(request.path) @@ -31,7 +31,7 @@ struct CloudClientVerboseLoggingMiddleware: ClientMiddleware { let responseJsonBody: Any? = try? JSONSerialization.jsonObject(with: response.body) logger.debug(""" - Received HTTP response from Tuist Cloud: + Received HTTP response from Tuist: - Status: \(response.statusCode) - Body: \(responseJsonBody ?? "") - Headers: \(response.headerFields) diff --git a/Sources/TuistServer/Models/CloudCacheArtifact.swift b/Sources/TuistServer/Models/ServerCacheArtifact.swift similarity index 79% rename from Sources/TuistServer/Models/CloudCacheArtifact.swift rename to Sources/TuistServer/Models/ServerCacheArtifact.swift index 3a6e2fbc81c..59665ac8ed0 100644 --- a/Sources/TuistServer/Models/CloudCacheArtifact.swift +++ b/Sources/TuistServer/Models/ServerCacheArtifact.swift @@ -1,7 +1,7 @@ import Foundation import TuistSupport -enum CloudCacheArtifactError: FatalError, Equatable { +enum ServerCacheArtifactError: FatalError, Equatable { case invalidURL(String) var description: String { @@ -19,8 +19,8 @@ enum CloudCacheArtifactError: FatalError, Equatable { } } -/// Cloud cache artifact -public struct CloudCacheArtifact: Codable { +/// Server cache artifact +public struct ServerCacheArtifact: Codable { public init( url: URL, expiresAt: Int @@ -33,17 +33,17 @@ public struct CloudCacheArtifact: Codable { public let expiresAt: Int } -extension CloudCacheArtifact { +extension ServerCacheArtifact { init(_ cacheArtifact: Components.Schemas.CacheArtifactDownloadURL) throws { guard let url = URL(string: cacheArtifact.data.url) - else { throw CloudCacheArtifactError.invalidURL(cacheArtifact.data.url) } + else { throw ServerCacheArtifactError.invalidURL(cacheArtifact.data.url) } self.url = url expiresAt = Int(cacheArtifact.data.expires_at) } } #if MOCKING - extension CloudCacheArtifact { + extension ServerCacheArtifact { public static func test( url: URL = URL(string: Constants.URLs.production)!, expiresAt: Int = 0 diff --git a/Sources/TuistServer/Models/CloudCommandEvent.swift b/Sources/TuistServer/Models/ServerCommandEvent.swift similarity index 86% rename from Sources/TuistServer/Models/CloudCommandEvent.swift rename to Sources/TuistServer/Models/ServerCommandEvent.swift index 8fdbd239105..0d6feaf3d38 100644 --- a/Sources/TuistServer/Models/CloudCommandEvent.swift +++ b/Sources/TuistServer/Models/ServerCommandEvent.swift @@ -1,7 +1,7 @@ import Foundation -/// Cloud command event -public struct CloudCommandEvent: Codable { +/// Server command event +public struct ServerCommandEvent: Codable { public let id: Int public let name: String public let url: URL @@ -34,7 +34,7 @@ public struct CloudCommandEvent: Codable { } } -extension CloudCommandEvent { +extension ServerCommandEvent { init(_ commandEvent: Components.Schemas.CommandEvent) { id = Int(commandEvent.id) name = commandEvent.name @@ -43,13 +43,13 @@ extension CloudCommandEvent { } extension Components.Schemas.CommandEventArtifact { - init(_ artifact: CloudCommandEvent.Artifact) { + init(_ artifact: ServerCommandEvent.Artifact) { self = .init(name: artifact.name, _type: .init(artifact.type)) } } extension Components.Schemas.CommandEventArtifact._typePayload { - init(_ type: CloudCommandEvent.Artifact.ArtifactType) { + init(_ type: ServerCommandEvent.Artifact.ArtifactType) { switch type { case .resultBundle: self = .result_bundle @@ -62,7 +62,7 @@ extension Components.Schemas.CommandEventArtifact._typePayload { } #if MOCKING - extension CloudCommandEvent { + extension ServerCommandEvent { public static func test( id: Int = 0, name: String = "generate", diff --git a/Sources/TuistServer/Models/CloudInvitation.swift b/Sources/TuistServer/Models/ServerInvitation.swift similarity index 79% rename from Sources/TuistServer/Models/CloudInvitation.swift rename to Sources/TuistServer/Models/ServerInvitation.swift index 4b6c387b769..30d67679ea7 100644 --- a/Sources/TuistServer/Models/CloudInvitation.swift +++ b/Sources/TuistServer/Models/ServerInvitation.swift @@ -1,11 +1,11 @@ import Foundation -/// Cloud invitation -public struct CloudInvitation: Codable { +/// Server invitation +public struct ServerInvitation: Codable { public init( id: Int, inviteeEmail: String, - inviter: CloudUser, + inviter: ServerUser, organizationId: Int, token: String ) { @@ -18,27 +18,27 @@ public struct CloudInvitation: Codable { public let id: Int public let inviteeEmail: String - public let inviter: CloudUser + public let inviter: ServerUser public let organizationId: Int public let token: String } -extension CloudInvitation { +extension ServerInvitation { init(_ invitation: Components.Schemas.Invitation) { id = Int(invitation.id) inviteeEmail = invitation.invitee_email - inviter = CloudUser(invitation.inviter) + inviter = ServerUser(invitation.inviter) organizationId = Int(invitation.organization_id) token = invitation.token } } #if MOCKING - extension CloudInvitation { + extension ServerInvitation { public static func test( id: Int = 0, inviteeEmail: String = "test@tuist.io", - inviter: CloudUser = .test(), + inviter: ServerUser = .test(), organizationId: Int = 0, token: String = "token" ) -> Self { diff --git a/Sources/TuistServer/Models/CloudModule.swift b/Sources/TuistServer/Models/ServerModule.swift similarity index 85% rename from Sources/TuistServer/Models/CloudModule.swift rename to Sources/TuistServer/Models/ServerModule.swift index 65e1af1a6ce..ffbbbda70a2 100644 --- a/Sources/TuistServer/Models/CloudModule.swift +++ b/Sources/TuistServer/Models/ServerModule.swift @@ -1,8 +1,8 @@ import Foundation import Path -/// Cloud module -public struct CloudModule: Codable { +/// Server module +public struct ServerModule: Codable { public init( hash: String, projectRelativePath: RelativePath, @@ -19,7 +19,7 @@ public struct CloudModule: Codable { } extension Components.Schemas.Module { - init(_ module: CloudModule) { + init(_ module: ServerModule) { hash = module.hash project_identifier = module.projectRelativePath.pathString name = module.name diff --git a/Sources/TuistServer/Models/CloudOrganization.swift b/Sources/TuistServer/Models/ServerOrganization.swift similarity index 90% rename from Sources/TuistServer/Models/CloudOrganization.swift rename to Sources/TuistServer/Models/ServerOrganization.swift index 6983cb507bf..2c2b024228f 100644 --- a/Sources/TuistServer/Models/CloudOrganization.swift +++ b/Sources/TuistServer/Models/ServerOrganization.swift @@ -1,7 +1,7 @@ import Foundation -/// Cloud organization -public struct CloudOrganization: Codable { +/// Server organization +public struct ServerOrganization: Codable { public enum Plan: String, Codable { case air case pro @@ -69,7 +69,7 @@ public struct CloudOrganization: Codable { public let name: String public let plan: Plan public let members: [Member] - public let invitations: [CloudInvitation] + public let invitations: [ServerInvitation] public let ssoOrganization: SSOOrganization? public init( @@ -77,7 +77,7 @@ public struct CloudOrganization: Codable { name: String, plan: Plan, members: [Member], - invitations: [CloudInvitation], + invitations: [ServerInvitation], ssoOrganization: SSOOrganization? ) { self.id = id @@ -89,13 +89,13 @@ public struct CloudOrganization: Codable { } } -extension CloudOrganization { +extension ServerOrganization { init(_ organization: Components.Schemas.Organization) { id = Int(organization.id) name = organization.name plan = Plan(organization.plan) members = organization.members.map(Member.init) - invitations = organization.invitations.map(CloudInvitation.init) + invitations = organization.invitations.map(ServerInvitation.init) if let ssoProvider = organization.sso_provider, let ssoOrganizationId = organization.sso_organization_id { @@ -111,7 +111,7 @@ extension CloudOrganization { } } -extension CloudOrganization.Member { +extension ServerOrganization.Member { init(_ organizationMember: Components.Schemas.OrganizationMember) { id = Int(organizationMember.id) name = organizationMember.name @@ -126,13 +126,13 @@ extension CloudOrganization.Member { } #if MOCKING - extension CloudOrganization { + extension ServerOrganization { public static func test( id: Int = 0, name: String = "test", plan: Plan = .air, members: [Member] = [], - invitations: [CloudInvitation] = [], + invitations: [ServerInvitation] = [], ssoOrganization: SSOOrganization? = nil ) -> Self { .init( @@ -146,7 +146,7 @@ extension CloudOrganization.Member { } } - extension CloudOrganization.Member { + extension ServerOrganization.Member { public static func test( id: Int = 0, name: String = "test", diff --git a/Sources/TuistServer/Models/CloudOrganizationUsage.swift b/Sources/TuistServer/Models/ServerOrganizationUsage.swift similarity index 80% rename from Sources/TuistServer/Models/CloudOrganizationUsage.swift rename to Sources/TuistServer/Models/ServerOrganizationUsage.swift index 3d1a3c24739..e352bfa46ca 100644 --- a/Sources/TuistServer/Models/CloudOrganizationUsage.swift +++ b/Sources/TuistServer/Models/ServerOrganizationUsage.swift @@ -1,8 +1,8 @@ import Foundation import Path -/// Cloud organization usage -public struct CloudOrganizationUsage: Codable { +/// Server organization usage +public struct ServerOrganizationUsage: Codable { public init( currentMonthRemoteCacheHits: Int ) { @@ -12,14 +12,14 @@ public struct CloudOrganizationUsage: Codable { public let currentMonthRemoteCacheHits: Int } -extension CloudOrganizationUsage { +extension ServerOrganizationUsage { init(_ organizationUsage: Components.Schemas.OrganizationUsage) { currentMonthRemoteCacheHits = Int(organizationUsage.current_month_remote_cache_hits) } } #if DEBUG - extension CloudOrganizationUsage { + extension ServerOrganizationUsage { public static func test( currentMonthRemoteCacheHits: Int = 100 ) -> Self { diff --git a/Sources/TuistServer/Models/CloudProject.swift b/Sources/TuistServer/Models/ServerProject.swift similarity index 86% rename from Sources/TuistServer/Models/CloudProject.swift rename to Sources/TuistServer/Models/ServerProject.swift index 42fc8664819..ab08fe7010c 100644 --- a/Sources/TuistServer/Models/CloudProject.swift +++ b/Sources/TuistServer/Models/ServerProject.swift @@ -1,7 +1,7 @@ import Foundation -/// Cloud project -public struct CloudProject: Codable { +/// Server project +public struct ServerProject: Codable { public init( id: Int, fullName: String, @@ -17,7 +17,7 @@ public struct CloudProject: Codable { public let token: String } -extension CloudProject { +extension ServerProject { init(_ project: Components.Schemas.Project) { id = Int(project.id) fullName = project.full_name @@ -26,7 +26,7 @@ extension CloudProject { } #if MOCKING - extension CloudProject { + extension ServerProject { public static func test( id: Int = 0, fullName: String = "test/test", diff --git a/Sources/TuistServer/Models/CloudUser.swift b/Sources/TuistServer/Models/ServerUser.swift similarity index 87% rename from Sources/TuistServer/Models/CloudUser.swift rename to Sources/TuistServer/Models/ServerUser.swift index 75204a8a2ef..f02dcb0cfec 100644 --- a/Sources/TuistServer/Models/CloudUser.swift +++ b/Sources/TuistServer/Models/ServerUser.swift @@ -1,7 +1,7 @@ import Foundation -/// Cloud user -public struct CloudUser: Codable { +/// Server user +public struct ServerUser: Codable { public let id: Int public let name: String public let email: String @@ -17,7 +17,7 @@ public struct CloudUser: Codable { } } -extension CloudUser { +extension ServerUser { init(_ user: Components.Schemas.User) { id = Int(user.id) name = user.name @@ -26,7 +26,7 @@ extension CloudUser { } #if MOCKING - extension CloudUser { + extension ServerUser { public static func test( id: Int = 0, name: String = "test", diff --git a/Sources/TuistServer/Network/URLSession+Cloud.swift b/Sources/TuistServer/Network/URLSession+Server.swift similarity index 79% rename from Sources/TuistServer/Network/URLSession+Cloud.swift rename to Sources/TuistServer/Network/URLSession+Server.swift index 4b6f6cae669..37b94ab357a 100644 --- a/Sources/TuistServer/Network/URLSession+Cloud.swift +++ b/Sources/TuistServer/Network/URLSession+Server.swift @@ -1,6 +1,6 @@ import Foundation -private func cloudURLSessionConfiguration() -> URLSessionConfiguration { +private func tuistURLSessionConfiguration() -> URLSessionConfiguration { let configuration: URLSessionConfiguration = .ephemeral /** Our API design leads to an inefficient usage of the transport layer, which leads to Fly having to spin @@ -18,10 +18,10 @@ private func cloudURLSessionConfiguration() -> URLSessionConfiguration { return configuration } -private var _cloudURLSession: URLSession = .init(configuration: cloudURLSessionConfiguration()) +private var _tuistURLSession: URLSession = .init(configuration: tuistURLSessionConfiguration()) extension URLSession { - public static var sharedCloud: URLSession { - _cloudURLSession + public static var shared: URLSession { + _tuistURLSession } } diff --git a/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift b/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift index 15cf834f663..f2da1e6826c 100644 --- a/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift +++ b/Sources/TuistServer/Services/AnalyticsArtifactUploadService.swift @@ -72,7 +72,7 @@ public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServic serverURL: URL ) async throws { try await uploadAnalyticsArtifact( - CloudCommandEvent.Artifact( + ServerCommandEvent.Artifact( type: .resultBundle ), artifactPath: resultBundle, @@ -98,7 +98,7 @@ public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServic let resultBundleObjectPath = resultBundle.parentDirectory.appending(component: filename) try fileHandler.write(resultBundleObjectString, path: resultBundleObjectPath, atomically: true) try await uploadAnalyticsArtifact( - CloudCommandEvent.Artifact( + ServerCommandEvent.Artifact( type: .resultBundleObject, name: id ), @@ -109,7 +109,7 @@ public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServic } try await uploadAnalyticsArtifact( - CloudCommandEvent.Artifact( + ServerCommandEvent.Artifact( type: .invocationRecord ), artifactPath: invocationRecordPath, @@ -118,7 +118,7 @@ public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServic ) let modules = targetHashes.map { key, value in - CloudModule( + ServerModule( hash: value, projectRelativePath: key.project.xcodeProjPath.relative(to: graphPath), @@ -134,7 +134,7 @@ public final class AnalyticsArtifactUploadService: AnalyticsArtifactUploadServic } private func uploadAnalyticsArtifact( - _ artifact: CloudCommandEvent.Artifact, + _ artifact: ServerCommandEvent.Artifact, artifactPath: AbsolutePath, name: String? = nil, commandEventId: Int, diff --git a/Sources/TuistServer/Services/CacheExistsService.swift b/Sources/TuistServer/Services/CacheExistsService.swift index a834317afd1..b5948e7d206 100644 --- a/Sources/TuistServer/Services/CacheExistsService.swift +++ b/Sources/TuistServer/Services/CacheExistsService.swift @@ -33,7 +33,7 @@ public enum CacheExistsServiceError: FatalError, Equatable { public var description: String { switch self { case let .unknownError(statusCode): - return "The remote cache could not be used due to an unknown Tuist Cloud response of \(statusCode)." + return "The remote cache could not be used due to an unknown Tuist response of \(statusCode)." case let .notFound(message), let .paymentRequired(message), let .forbidden(message), let .unauthorized(message): return message } @@ -50,7 +50,7 @@ public final class CacheExistsService: CacheExistsServicing { name: String, cacheCategory: CacheCategory.App ) async throws { - let client = Client.cloud(serverURL: serverURL) + let client = Client.authenticated(serverURL: serverURL) let response = try await client.cacheArtifactExists( .init(query: .init(cache_category: .init(cacheCategory), project_id: projectId, hash: hash, name: name)) diff --git a/Sources/TuistServer/Services/CancelOrganizationInviteService.swift b/Sources/TuistServer/Services/CancelOrganizationInviteService.swift index 70a4469faf0..a26d73cb6b1 100644 --- a/Sources/TuistServer/Services/CancelOrganizationInviteService.swift +++ b/Sources/TuistServer/Services/CancelOrganizationInviteService.swift @@ -28,7 +28,7 @@ enum CancelOrganizationInviteServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "The invitation could not be cancelled due to an unknown cloud response of \(statusCode)." + return "The invitation could not be cancelled due to an unknown Tuist response of \(statusCode)." case let .notFound(message), let .forbidden(message), let .unauthorized(message): return message } @@ -43,7 +43,7 @@ public final class CancelOrganizationInviteService: CancelOrganizationInviteServ email: String, serverURL: URL ) async throws { - let client = Client.cloud(serverURL: serverURL) + let client = Client.authenticated(serverURL: serverURL) let response = try await client.cancelInvitation( .init( diff --git a/Sources/TuistServer/Services/CleanCacheService.swift b/Sources/TuistServer/Services/CleanCacheService.swift index dfa8bc196bf..fdd5918c7c1 100644 --- a/Sources/TuistServer/Services/CleanCacheService.swift +++ b/Sources/TuistServer/Services/CleanCacheService.swift @@ -28,7 +28,7 @@ enum CleanCacheServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "The project clean failed due to an unknown cloud response of \(statusCode)." + return "The project clean failed due to an unknown Tuist response of \(statusCode)." case let .notFound(message), let .forbidden(message), let .unauthorized(message): return message } @@ -42,7 +42,7 @@ public final class CleanCacheService: CleanCacheServicing { serverURL: URL, fullName: String ) async throws { - let client = Client.cloud(serverURL: serverURL) + let client = Client.authenticated(serverURL: serverURL) let components = fullName.components(separatedBy: "/") let response = try await client.cleanCache( diff --git a/Sources/TuistServer/Services/CloudURLService.swift b/Sources/TuistServer/Services/CloudURLService.swift deleted file mode 100644 index 55330db5271..00000000000 --- a/Sources/TuistServer/Services/CloudURLService.swift +++ /dev/null @@ -1,40 +0,0 @@ -import Foundation -import TuistSupport - -enum CloudURLServiceError: FatalError { - case invalidCloudURL - - /// Error description. - var description: String { - switch self { - case .invalidCloudURL: - return "The cloud URL is invalid." - } - } - - /// Error type. - var type: ErrorType { - switch self { - case .invalidCloudURL: - return .bug - } - } -} - -public protocol CloudURLServicing { - func url(configCloudURL: URL?) throws -> URL -} - -public final class CloudURLService: CloudURLServicing { - public init() {} - - public func url(configCloudURL: URL?) throws -> URL { - guard let cloudURL = ProcessInfo.processInfo.environment["TUIST_CLOUD_URL"] - .map(URL.init(string:)) ?? configCloudURL ?? URL(string: Constants.URLs.production) - else { - throw CloudURLServiceError.invalidCloudURL - } - - return cloudURL - } -} diff --git a/Sources/TuistServer/Services/CompleteAnalyticsArtifactsUploads.swift b/Sources/TuistServer/Services/CompleteAnalyticsArtifactsUploads.swift index cad274c6928..0f3c30db5c3 100644 --- a/Sources/TuistServer/Services/CompleteAnalyticsArtifactsUploads.swift +++ b/Sources/TuistServer/Services/CompleteAnalyticsArtifactsUploads.swift @@ -6,7 +6,7 @@ import TuistSupport @Mockable public protocol CompleteAnalyticsArtifactsUploadsServicing { func completeAnalyticsArtifactsUploads( - modules: [CloudModule], + modules: [ServerModule], commandEventId: Int, serverURL: URL ) async throws @@ -30,7 +30,7 @@ public enum CompleteAnalyticsArtifactsUploadsServiceError: FatalError, Equatable public var description: String { switch self { case let .unknownError(statusCode): - return "The analytics artifacts uploads could not get completed due to an unknown Tuist Cloud response of \(statusCode)." + return "The analytics artifacts uploads could not get completed due to an unknown Tuist response of \(statusCode)." case let .notFound(message), let .forbidden(message), let .unauthorized(message): return message } @@ -41,11 +41,11 @@ public final class CompleteAnalyticsArtifactsUploadsService: CompleteAnalyticsAr public init() {} public func completeAnalyticsArtifactsUploads( - modules: [CloudModule], + modules: [ServerModule], commandEventId: Int, serverURL: URL ) async throws { - let client = Client.cloud(serverURL: serverURL) + let client = Client.authenticated(serverURL: serverURL) let response = try await client.completeAnalyticsArtifactsUploads( .init( path: .init(run_id: commandEventId), diff --git a/Sources/TuistServer/Services/CreateCommandEventService.swift b/Sources/TuistServer/Services/CreateCommandEventService.swift index d42a979b341..f644b51364b 100644 --- a/Sources/TuistServer/Services/CreateCommandEventService.swift +++ b/Sources/TuistServer/Services/CreateCommandEventService.swift @@ -10,7 +10,7 @@ public protocol CreateCommandEventServicing { commandEvent: CommandEvent, projectId: String, serverURL: URL - ) async throws -> CloudCommandEvent + ) async throws -> ServerCommandEvent } enum CreateCommandEventServiceError: FatalError { @@ -30,7 +30,7 @@ enum CreateCommandEventServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "The organization could not be created due to an unknown cloud response of \(statusCode)." + return "The organization could not be created due to an unknown Tuist response of \(statusCode)." case let .forbidden(message), let .unauthorized(message): return message } @@ -44,8 +44,8 @@ public final class CreateCommandEventService: CreateCommandEventServicing { commandEvent: CommandEvent, projectId: String, serverURL: URL - ) async throws -> CloudCommandEvent { - let client = Client.cloud(serverURL: serverURL) + ) async throws -> ServerCommandEvent { + let client = Client.authenticated(serverURL: serverURL) let errorMessage: String? let status: Operations.createCommandEvent.Input.Body.jsonPayload.statusPayload? switch commandEvent.status { @@ -91,7 +91,7 @@ public final class CreateCommandEventService: CreateCommandEventServicing { case let .ok(okResponse): switch okResponse.body { case let .json(commandEvent): - return CloudCommandEvent(commandEvent) + return ServerCommandEvent(commandEvent) } case let .undocumented(statusCode: statusCode, _): throw CreateCommandEventServiceError.unknownError(statusCode) diff --git a/Sources/TuistServer/Services/CreateOrganizationInviteService.swift b/Sources/TuistServer/Services/CreateOrganizationInviteService.swift index f5c4adcd6c3..6a71dfae764 100644 --- a/Sources/TuistServer/Services/CreateOrganizationInviteService.swift +++ b/Sources/TuistServer/Services/CreateOrganizationInviteService.swift @@ -9,7 +9,7 @@ public protocol CreateOrganizationInviteServicing { organizationName: String, email: String, serverURL: URL - ) async throws -> CloudInvitation + ) async throws -> ServerInvitation } enum CreateOrganizationInviteServiceError: FatalError { @@ -31,7 +31,7 @@ enum CreateOrganizationInviteServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "The user could not be invited due to an unknown cloud response of \(statusCode)." + return "The user could not be invited due to an unknown Tuist response of \(statusCode)." case let .notFound(message), let .forbidden(message), let .badRequest(message), let .unauthorized(message): return message } @@ -45,8 +45,8 @@ public final class CreateOrganizationInviteService: CreateOrganizationInviteServ organizationName: String, email: String, serverURL: URL - ) async throws -> CloudInvitation { - let client = Client.cloud(serverURL: serverURL) + ) async throws -> ServerInvitation { + let client = Client.authenticated(serverURL: serverURL) let response = try await client.createInvitation( .init( @@ -58,7 +58,7 @@ public final class CreateOrganizationInviteService: CreateOrganizationInviteServ case let .ok(okResponse): switch okResponse.body { case let .json(invitation): - return CloudInvitation(invitation) + return ServerInvitation(invitation) } case let .notFound(notFoundResponse): switch notFoundResponse.body { diff --git a/Sources/TuistServer/Services/CreateOrganizationService.swift b/Sources/TuistServer/Services/CreateOrganizationService.swift index 340849de6e8..25fee43068d 100644 --- a/Sources/TuistServer/Services/CreateOrganizationService.swift +++ b/Sources/TuistServer/Services/CreateOrganizationService.swift @@ -8,7 +8,7 @@ public protocol CreateOrganizationServicing { func createOrganization( name: String, serverURL: URL - ) async throws -> CloudOrganization + ) async throws -> ServerOrganization } enum CreateOrganizationServiceError: FatalError { @@ -27,7 +27,7 @@ enum CreateOrganizationServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "The organization could not be created due to an unknown cloud response of \(statusCode)." + return "The organization could not be created due to an unknown Tuist response of \(statusCode)." case let .badRequest(message): return message } @@ -40,8 +40,8 @@ public final class CreateOrganizationService: CreateOrganizationServicing { public func createOrganization( name: String, serverURL: URL - ) async throws -> CloudOrganization { - let client = Client.cloud(serverURL: serverURL) + ) async throws -> ServerOrganization { + let client = Client.authenticated(serverURL: serverURL) let response = try await client.createOrganization( .init( @@ -56,7 +56,7 @@ public final class CreateOrganizationService: CreateOrganizationServicing { case let .ok(okResponse): switch okResponse.body { case let .json(organization): - return CloudOrganization(organization) + return ServerOrganization(organization) } case let .badRequest(badRequestResponse): switch badRequestResponse.body { diff --git a/Sources/TuistServer/Services/CreateProjectService.swift b/Sources/TuistServer/Services/CreateProjectService.swift index 7ffcb1d70ee..b65e0236ca9 100644 --- a/Sources/TuistServer/Services/CreateProjectService.swift +++ b/Sources/TuistServer/Services/CreateProjectService.swift @@ -8,7 +8,7 @@ public protocol CreateProjectServicing { func createProject( fullHandle: String, serverURL: URL - ) async throws -> CloudProject + ) async throws -> ServerProject } enum CreateProjectServiceError: FatalError { @@ -42,8 +42,8 @@ public final class CreateProjectService: CreateProjectServicing { public func createProject( fullHandle: String, serverURL: URL - ) async throws -> CloudProject { - let client = Client.cloud(serverURL: serverURL) + ) async throws -> ServerProject { + let client = Client.authenticated(serverURL: serverURL) let response = try await client.createProject( .init( @@ -58,7 +58,7 @@ public final class CreateProjectService: CreateProjectServicing { case let .ok(okResponse): switch okResponse.body { case let .json(project): - return CloudProject(project) + return ServerProject(project) } case let .forbidden(forbiddenResponse): switch forbiddenResponse.body { diff --git a/Sources/TuistServer/Services/DeleteOrganizationService.swift b/Sources/TuistServer/Services/DeleteOrganizationService.swift index a429068d067..d771884dcfe 100644 --- a/Sources/TuistServer/Services/DeleteOrganizationService.swift +++ b/Sources/TuistServer/Services/DeleteOrganizationService.swift @@ -27,7 +27,7 @@ enum DeleteOrganizationServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "The organization could not be deleted due to an unknown cloud response of \(statusCode)." + return "The organization could not be deleted due to an unknown Tuist response of \(statusCode)." case let .forbidden(message), let .unauthorized(message), let .notFound(message): return message } @@ -41,7 +41,7 @@ public final class DeleteOrganizationService: DeleteOrganizationServicing { name: String, serverURL: URL ) async throws { - let client = Client.cloud(serverURL: serverURL) + let client = Client.authenticated(serverURL: serverURL) let response = try await client.deleteOrganization( .init( diff --git a/Sources/TuistServer/Services/DeleteProjectService.swift b/Sources/TuistServer/Services/DeleteProjectService.swift index 52d85e2eaf0..4f8cb619424 100644 --- a/Sources/TuistServer/Services/DeleteProjectService.swift +++ b/Sources/TuistServer/Services/DeleteProjectService.swift @@ -29,7 +29,7 @@ enum DeleteProjectServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "The project could not be deleted due to an unknown cloud response of \(statusCode)." + return "The project could not be deleted due to an unknown Tuist response of \(statusCode)." case let .forbidden(message), let .unauthorized(message), let .notFound(message): return message } @@ -43,7 +43,7 @@ public final class DeleteProjectService: DeleteProjectServicing { projectId: Int, serverURL: URL ) async throws { - let client = Client.cloud(serverURL: serverURL) + let client = Client.authenticated(serverURL: serverURL) let response = try await client.deleteProject( .init( diff --git a/Sources/TuistServer/Services/GetAuthTokenService.swift b/Sources/TuistServer/Services/GetAuthTokenService.swift index 5a1ebfe8c41..5b8f549ccb2 100644 --- a/Sources/TuistServer/Services/GetAuthTokenService.swift +++ b/Sources/TuistServer/Services/GetAuthTokenService.swift @@ -27,7 +27,7 @@ public enum GetAuthTokenServiceError: FatalError, Equatable { public var description: String { switch self { case let .unknownError(statusCode): - return "The CLI authentication failed due to an unknown Tuist Cloud response of \(statusCode)." + return "The CLI authentication failed due to an unknown Tuist response of \(statusCode)." case let .badRequest(message): return message } @@ -41,7 +41,7 @@ public final class GetAuthTokenService: GetAuthTokenServicing { serverURL: URL, deviceCode: String ) async throws -> String? { - let client = Client.unauthenticatedCloud(serverURL: serverURL) + let client = Client.unauthenticated(serverURL: serverURL) let response = try await client.getDeviceCode( .init(path: .init(device_code: deviceCode)) diff --git a/Sources/TuistServer/Services/GetCacheService.swift b/Sources/TuistServer/Services/GetCacheService.swift index e5328daec5f..29d2fd70ddf 100644 --- a/Sources/TuistServer/Services/GetCacheService.swift +++ b/Sources/TuistServer/Services/GetCacheService.swift @@ -11,7 +11,7 @@ public protocol GetCacheServicing { hash: String, name: String, cacheCategory: CacheCategory.App - ) async throws -> CloudCacheArtifact + ) async throws -> ServerCacheArtifact } public enum GetCacheServiceError: FatalError, Equatable { @@ -33,7 +33,7 @@ public enum GetCacheServiceError: FatalError, Equatable { public var description: String { switch self { case let .unknownError(statusCode): - return "The remote cache could not be used due to an unknown Tuist Cloud response of \(statusCode)." + return "The remote cache could not be used due to an unknown Tuist response of \(statusCode)." case let .notFound(message), let .paymentRequired(message), let .forbidden(message), let .unauthorized(message): return message } @@ -49,8 +49,8 @@ public final class GetCacheService: GetCacheServicing { hash: String, name: String, cacheCategory: CacheCategory.App - ) async throws -> CloudCacheArtifact { - let client = Client.cloud(serverURL: serverURL) + ) async throws -> ServerCacheArtifact { + let client = Client.authenticated(serverURL: serverURL) let response = try await client.downloadCacheArtifact( .init(query: .init(cache_category: .init(cacheCategory), project_id: projectId, hash: hash, name: name)) @@ -60,7 +60,7 @@ public final class GetCacheService: GetCacheServicing { case let .ok(okResponse): switch okResponse.body { case let .json(cacheArtifact): - return try CloudCacheArtifact(cacheArtifact) + return try ServerCacheArtifact(cacheArtifact) } case let .paymentRequired(paymentRequiredResponse): switch paymentRequiredResponse.body { diff --git a/Sources/TuistServer/Services/GetOrganizationService.swift b/Sources/TuistServer/Services/GetOrganizationService.swift index 1ffa2b315c3..407fb674647 100644 --- a/Sources/TuistServer/Services/GetOrganizationService.swift +++ b/Sources/TuistServer/Services/GetOrganizationService.swift @@ -8,7 +8,7 @@ public protocol GetOrganizationServicing { func getOrganization( organizationName: String, serverURL: URL - ) async throws -> CloudOrganization + ) async throws -> ServerOrganization } enum GetOrganizationServiceError: FatalError { @@ -29,7 +29,7 @@ enum GetOrganizationServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "We could not get the organization due to an unknown cloud response of \(statusCode)." + return "We could not get the organization due to an unknown Tuist response of \(statusCode)." case let .forbidden(message), let .notFound(message), let .unauthorized(message): return message } @@ -42,8 +42,8 @@ public final class GetOrganizationService: GetOrganizationServicing { public func getOrganization( organizationName: String, serverURL: URL - ) async throws -> CloudOrganization { - let client = Client.cloud(serverURL: serverURL) + ) async throws -> ServerOrganization { + let client = Client.authenticated(serverURL: serverURL) let response = try await client.showOrganization( .init( @@ -56,7 +56,7 @@ public final class GetOrganizationService: GetOrganizationServicing { case let .ok(okResponse): switch okResponse.body { case let .json(project): - return CloudOrganization(project) + return ServerOrganization(project) } case let .notFound(notFound): switch notFound.body { diff --git a/Sources/TuistServer/Services/GetOrganizationUsage.swift b/Sources/TuistServer/Services/GetOrganizationUsage.swift index f3e9a3c6fd3..f4999c93688 100644 --- a/Sources/TuistServer/Services/GetOrganizationUsage.swift +++ b/Sources/TuistServer/Services/GetOrganizationUsage.swift @@ -8,7 +8,7 @@ public protocol GetOrganizationUsageServicing { func getOrganizationUsage( organizationName: String, serverURL: URL - ) async throws -> CloudOrganizationUsage + ) async throws -> ServerOrganizationUsage } enum GetOrganizationUsageServiceError: FatalError { @@ -29,7 +29,7 @@ enum GetOrganizationUsageServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "We could not get the OrganizationUsage due to an unknown cloud response of \(statusCode)." + return "We could not get the OrganizationUsage due to an unknown Tuist response of \(statusCode)." case let .forbidden(message), let .notFound(message), let .unauthorized(message): return message } @@ -42,8 +42,8 @@ public final class GetOrganizationUsageService: GetOrganizationUsageServicing { public func getOrganizationUsage( organizationName: String, serverURL: URL - ) async throws -> CloudOrganizationUsage { - let client = Client.cloud(serverURL: serverURL) + ) async throws -> ServerOrganizationUsage { + let client = Client.authenticated(serverURL: serverURL) let response = try await client.showOrganizationUsage( .init( @@ -56,7 +56,7 @@ public final class GetOrganizationUsageService: GetOrganizationUsageServicing { case let .ok(okResponse): switch okResponse.body { case let .json(organizationUsage): - return CloudOrganizationUsage(organizationUsage) + return ServerOrganizationUsage(organizationUsage) } case let .notFound(notFound): switch notFound.body { diff --git a/Sources/TuistServer/Services/GetProjectService.swift b/Sources/TuistServer/Services/GetProjectService.swift index b37643053c5..4b0dbbeeeca 100644 --- a/Sources/TuistServer/Services/GetProjectService.swift +++ b/Sources/TuistServer/Services/GetProjectService.swift @@ -8,7 +8,7 @@ public protocol GetProjectServicing { func getProject( fullHandle: String, serverURL: URL - ) async throws -> CloudProject + ) async throws -> ServerProject } enum GetProjectServiceError: FatalError { @@ -30,7 +30,7 @@ enum GetProjectServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "We could not get the project due to an unknown cloud response of \(statusCode)." + return "We could not get the project due to an unknown Tuist response of \(statusCode)." case let .invalidHandle(fullHandle): return "The project full handle \(fullHandle) is not in the format of account-handle/project-handle." case let .forbidden(message), let .notFound(message), let .unauthorized(message): @@ -45,8 +45,8 @@ public final class GetProjectService: GetProjectServicing { public func getProject( fullHandle: String, serverURL: URL - ) async throws -> CloudProject { - let client = Client.cloud(serverURL: serverURL) + ) async throws -> ServerProject { + let client = Client.authenticated(serverURL: serverURL) let components = fullHandle.components(separatedBy: "/") guard components.count == 2 else { @@ -68,7 +68,7 @@ public final class GetProjectService: GetProjectServicing { case let .ok(okResponse): switch okResponse.body { case let .json(project): - return CloudProject(project) + return ServerProject(project) } case let .notFound(notFound): switch notFound.body { diff --git a/Sources/TuistServer/Services/ListOrganizationsService.swift b/Sources/TuistServer/Services/ListOrganizationsService.swift index c35fec797e5..f47a9a0a12d 100644 --- a/Sources/TuistServer/Services/ListOrganizationsService.swift +++ b/Sources/TuistServer/Services/ListOrganizationsService.swift @@ -27,7 +27,7 @@ enum ListOrganizationsServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "The organizations could not be listed due to an unknown cloud response of \(statusCode)." + return "The organizations could not be listed due to an unknown Tuist response of \(statusCode)." case let .forbidden(message), let .unauthorized(message): return message } @@ -40,7 +40,7 @@ public final class ListOrganizationsService: ListOrganizationsServicing { public func listOrganizations( serverURL: URL ) async throws -> [String] { - let client = Client.cloud(serverURL: serverURL) + let client = Client.authenticated(serverURL: serverURL) let response = try await client.listOrganizations( .init( diff --git a/Sources/TuistServer/Services/ListProjectsService.swift b/Sources/TuistServer/Services/ListProjectsService.swift index 425c72dacf0..1c12d7d98a9 100644 --- a/Sources/TuistServer/Services/ListProjectsService.swift +++ b/Sources/TuistServer/Services/ListProjectsService.swift @@ -7,13 +7,13 @@ import TuistSupport public protocol ListProjectsServicing { func listProjects( serverURL: URL - ) async throws -> [CloudProject] + ) async throws -> [ServerProject] func listProjects( serverURL: URL, accountName: String?, projectName: String? - ) async throws -> [CloudProject] + ) async throws -> [ServerProject] } enum ListProjectsServiceError: FatalError { @@ -32,7 +32,7 @@ enum ListProjectsServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "The project could not be listed due to an unknown cloud response of \(statusCode)." + return "The project could not be listed due to an unknown Tuist response of \(statusCode)." case let .unauthorized(message): return message } @@ -44,7 +44,7 @@ public final class ListProjectsService: ListProjectsServicing { public func listProjects( serverURL: URL - ) async throws -> [CloudProject] { + ) async throws -> [ServerProject] { try await listProjects( serverURL: serverURL, accountName: nil, @@ -56,8 +56,8 @@ public final class ListProjectsService: ListProjectsServicing { serverURL: URL, accountName _: String?, projectName _: String? - ) async throws -> [CloudProject] { - let client = Client.cloud(serverURL: serverURL) + ) async throws -> [ServerProject] { + let client = Client.authenticated(serverURL: serverURL) let response = try await client.listProjects( .init() @@ -66,7 +66,7 @@ public final class ListProjectsService: ListProjectsServicing { case let .ok(okResponse): switch okResponse.body { case let .json(json): - return json.projects.map(CloudProject.init) + return json.projects.map(ServerProject.init) } case let .undocumented(statusCode: statusCode, _): throw ListProjectsServiceError.unknownError(statusCode) diff --git a/Sources/TuistServer/Services/MultipartUploadArtifactService.swift b/Sources/TuistServer/Services/MultipartUploadArtifactService.swift index a0ce25ef3d8..d39d4518ed1 100644 --- a/Sources/TuistServer/Services/MultipartUploadArtifactService.swift +++ b/Sources/TuistServer/Services/MultipartUploadArtifactService.swift @@ -48,7 +48,7 @@ public protocol MultipartUploadArtifactServicing { public final class MultipartUploadArtifactService: MultipartUploadArtifactServicing { private let urlSession: URLSession - public init(urlSession: URLSession = .sharedCloud) { + public init(urlSession: URLSession = .shared) { self.urlSession = urlSession } diff --git a/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift b/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift index f7895822804..1a821dc046a 100644 --- a/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift +++ b/Sources/TuistServer/Services/MultipartUploadCompleteAnalyticsService.swift @@ -6,7 +6,7 @@ import TuistSupport @Mockable public protocol MultipartUploadCompleteAnalyticsServicing { func uploadAnalyticsArtifact( - _ artifact: CloudCommandEvent.Artifact, + _ artifact: ServerCommandEvent.Artifact, commandEventId: Int, uploadId: String, parts: [(etag: String, partNumber: Int)], @@ -32,7 +32,7 @@ public enum MultipartUploadCompleteAnalyticsServiceError: FatalError, Equatable public var description: String { switch self { case let .unknownError(statusCode): - return "The multi-part upload could not get completed due to an unknown Tuist Cloud response of \(statusCode)." + return "The multi-part upload could not get completed due to an unknown Tuist response of \(statusCode)." case let .notFound(message), let .forbidden(message), let .unauthorized(message): return message } @@ -43,13 +43,13 @@ public final class MultipartUploadCompleteAnalyticsService: MultipartUploadCompl public init() {} public func uploadAnalyticsArtifact( - _ artifact: CloudCommandEvent.Artifact, + _ artifact: ServerCommandEvent.Artifact, commandEventId: Int, uploadId: String, parts: [(etag: String, partNumber: Int)], serverURL: URL ) async throws { - let client = Client.cloud(serverURL: serverURL) + let client = Client.authenticated(serverURL: serverURL) let response = try await client.completeAnalyticsArtifactMultipartUpload( .init( path: .init(run_id: commandEventId), diff --git a/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift b/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift index c0fb7bd2acb..b8d2eaf3f64 100644 --- a/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift +++ b/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift @@ -36,7 +36,7 @@ public enum MultipartUploadCompleteCacheServiceError: FatalError, Equatable { public var description: String { switch self { case let .unknownError(statusCode): - return "The multi-part upload could not get completed due to an unknown Tuist Cloud response of \(statusCode)." + return "The multi-part upload could not get completed due to an unknown Tuist response of \(statusCode)." case let .notFound(message), let .paymentRequired(message), let .forbidden(message), let .unauthorized(message): return message } @@ -55,7 +55,7 @@ public final class MultipartUploadCompleteCacheService: MultipartUploadCompleteC uploadId: String, parts: [(etag: String, partNumber: Int)] ) async throws { - let client = Client.cloud(serverURL: serverURL) + let client = Client.authenticated(serverURL: serverURL) let response = try await client.completeCacheArtifactMultipartUpload(.init(query: .init( cache_category: .init(cacheCategory), project_id: projectId, diff --git a/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift b/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift index 36f72876739..296a218e9b4 100644 --- a/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift +++ b/Sources/TuistServer/Services/MultipartUploadGenerateURLAnalyticsService.swift @@ -5,7 +5,7 @@ import TuistSupport @Mockable public protocol MultipartUploadGenerateURLAnalyticsServicing { func uploadAnalytics( - _ artifact: CloudCommandEvent.Artifact, + _ artifact: ServerCommandEvent.Artifact, commandEventId: Int, partNumber: Int, uploadId: String, @@ -42,13 +42,13 @@ public final class MultipartUploadGenerateURLAnalyticsService: MultipartUploadGe public init() {} public func uploadAnalytics( - _ artifact: CloudCommandEvent.Artifact, + _ artifact: ServerCommandEvent.Artifact, commandEventId: Int, partNumber: Int, uploadId: String, serverURL: URL ) async throws -> String { - let client = Client.cloud(serverURL: serverURL) + let client = Client.authenticated(serverURL: serverURL) let response = try await client.generateAnalyticsArtifactMultipartUploadURL( .init( path: .init(run_id: commandEventId), diff --git a/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift b/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift index 2b138d7d2c2..e3830f309c4 100644 --- a/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift +++ b/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift @@ -35,7 +35,7 @@ public enum MultipartUploadGenerateURLCacheServiceError: FatalError, Equatable { public var description: String { switch self { case let .unknownError(statusCode): - return "The generation of a multi-part upload URL failed due to an unknown Tuist Cloud response of \(statusCode)." + return "The generation of a multi-part upload URL failed due to an unknown Tuist response of \(statusCode)." case let .notFound(message), let .paymentRequired(message), let .forbidden(message), let .unauthorized(message): return message } @@ -54,7 +54,7 @@ public final class MultipartUploadGenerateURLCacheService: MultipartUploadGenera uploadId: String, partNumber: Int ) async throws -> String { - let client = Client.cloud(serverURL: serverURL) + let client = Client.authenticated(serverURL: serverURL) let response = try await client.generateCacheArtifactMultipartUploadURL(.init(query: .init( cache_category: .init(cacheCategory), project_id: projectId, diff --git a/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift b/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift index cb2bb063b6a..e579b9d9af8 100644 --- a/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift +++ b/Sources/TuistServer/Services/MultipartUploadStartAnalyticsService.swift @@ -5,7 +5,7 @@ import TuistSupport @Mockable public protocol MultipartUploadStartAnalyticsServicing { func uploadAnalyticsArtifact( - _ artifact: CloudCommandEvent.Artifact, + _ artifact: ServerCommandEvent.Artifact, commandEventId: Int, serverURL: URL ) async throws -> String @@ -30,7 +30,7 @@ public enum MultipartUploadStartAnalyticsServiceError: FatalError, Equatable { public var description: String { switch self { case let .unknownError(statusCode): - return "The remote cache artifact could not be uploaded due to an unknown Tuist Cloud response of \(statusCode)." + return "The remote cache artifact could not be uploaded due to an unknown Tuist response of \(statusCode)." case let .notFound(message), let .paymentRequired(message), let .forbidden(message), let .unauthorized(message): return message } @@ -41,11 +41,11 @@ public final class MultipartUploadStartAnalyticsService: MultipartUploadStartAna public init() {} public func uploadAnalyticsArtifact( - _ artifact: CloudCommandEvent.Artifact, + _ artifact: ServerCommandEvent.Artifact, commandEventId: Int, serverURL: URL ) async throws -> String { - let client = Client.cloud(serverURL: serverURL) + let client = Client.authenticated(serverURL: serverURL) let response = try await client.startAnalyticsArtifactMultipartUpload( .init( path: .init(run_id: commandEventId), diff --git a/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift b/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift index d1299d860d4..aafd1e6de99 100644 --- a/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift +++ b/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift @@ -33,7 +33,7 @@ public enum MultipartUploadStartCacheServiceError: FatalError, Equatable { public var description: String { switch self { case let .unknownError(statusCode): - return "The remote cache artifact could not be uploaded due to an unknown Tuist Cloud response of \(statusCode)." + return "The remote cache artifact could not be uploaded due to an unknown Tuist response of \(statusCode)." case let .notFound(message), let .paymentRequired(message), let .forbidden(message), let .unauthorized(message): return message } @@ -50,7 +50,7 @@ public final class MultipartUploadStartCacheService: MultipartUploadStartCacheSe name: String, cacheCategory: CacheCategory.App ) async throws -> String { - let client = Client.cloud(serverURL: serverURL) + let client = Client.authenticated(serverURL: serverURL) let response = try await client.startCacheArtifactMultipartUpload(.init(query: .init( cache_category: .init(cacheCategory), project_id: projectId, diff --git a/Sources/TuistServer/Services/RemoveOrganizationMemberService.swift b/Sources/TuistServer/Services/RemoveOrganizationMemberService.swift index 605fcd0fdac..74964f39d6a 100644 --- a/Sources/TuistServer/Services/RemoveOrganizationMemberService.swift +++ b/Sources/TuistServer/Services/RemoveOrganizationMemberService.swift @@ -29,7 +29,7 @@ enum RemoveOrganizationMemberServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "The member could not be removed due to an unknown cloud response of \(statusCode)." + return "The member could not be removed due to an unknown Tuist response of \(statusCode)." case let .notFound(message), let .forbidden(message), let .badRequest(message), let .unauthorized(message): return message } @@ -44,7 +44,7 @@ public final class RemoveOrganizationMemberService: RemoveOrganizationMemberServ username: String, serverURL: URL ) async throws { - let client = Client.cloud(serverURL: serverURL) + let client = Client.authenticated(serverURL: serverURL) let response = try await client.removeOrganizationMember( .init( diff --git a/Sources/TuistServer/Services/ServerURLService.swift b/Sources/TuistServer/Services/ServerURLService.swift new file mode 100644 index 00000000000..d10d29a7447 --- /dev/null +++ b/Sources/TuistServer/Services/ServerURLService.swift @@ -0,0 +1,42 @@ +import Foundation +import Mockable +import TuistSupport + +enum ServerURLServiceError: FatalError { + case invalidServerURL + + /// Error description. + var description: String { + switch self { + case .invalidServerURL: + return "The server URL is invalid." + } + } + + /// Error type. + var type: ErrorType { + switch self { + case .invalidServerURL: + return .bug + } + } +} + +@Mockable +public protocol ServerURLServicing { + func url(configServerURL: URL?) throws -> URL +} + +public final class ServerURLService: ServerURLServicing { + public init() {} + + public func url(configServerURL: URL?) throws -> URL { + guard let cloudURL = ProcessInfo.processInfo.environment["TUIST_URL"] + .map(URL.init(string:)) ?? configServerURL ?? URL(string: Constants.URLs.production) + else { + throw ServerURLServiceError.invalidServerURL + } + + return cloudURL + } +} diff --git a/Sources/TuistServer/Services/UpdateOrganizationMemberService.swift b/Sources/TuistServer/Services/UpdateOrganizationMemberService.swift index a888dd4651e..594c3683630 100644 --- a/Sources/TuistServer/Services/UpdateOrganizationMemberService.swift +++ b/Sources/TuistServer/Services/UpdateOrganizationMemberService.swift @@ -6,9 +6,9 @@ public protocol UpdateOrganizationMemberServicing { func updateOrganizationMember( organizationName: String, username: String, - role: CloudOrganization.Member.Role, + role: ServerOrganization.Member.Role, serverURL: URL - ) async throws -> CloudOrganization.Member + ) async throws -> ServerOrganization.Member } enum UpdateOrganizationMemberServiceError: FatalError { @@ -30,7 +30,7 @@ enum UpdateOrganizationMemberServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "The member could not be updated due to an unknown cloud response of \(statusCode)." + return "The member could not be updated due to an unknown Tuist response of \(statusCode)." case let .notFound(message), let .forbidden(message), let .unauthorized(message), let .badRequest(message): return message } @@ -43,10 +43,10 @@ public final class UpdateOrganizationMemberService: UpdateOrganizationMemberServ public func updateOrganizationMember( organizationName: String, username: String, - role: CloudOrganization.Member.Role, + role: ServerOrganization.Member.Role, serverURL: URL - ) async throws -> CloudOrganization.Member { - let client = Client.cloud(serverURL: serverURL) + ) async throws -> ServerOrganization.Member { + let client = Client.authenticated(serverURL: serverURL) let response = try await client.updateOrganizationMember( .init( @@ -61,7 +61,7 @@ public final class UpdateOrganizationMemberService: UpdateOrganizationMemberServ case let .ok(okResponse): switch okResponse.body { case let .json(organizationMember): - return CloudOrganization.Member(organizationMember) + return ServerOrganization.Member(organizationMember) } case let .notFound(notFoundResponse): switch notFoundResponse.body { diff --git a/Sources/TuistServer/Services/UpdateOrganizationService.swift b/Sources/TuistServer/Services/UpdateOrganizationService.swift index 873af2f45c4..50875e58eaf 100644 --- a/Sources/TuistServer/Services/UpdateOrganizationService.swift +++ b/Sources/TuistServer/Services/UpdateOrganizationService.swift @@ -9,7 +9,7 @@ public protocol UpdateOrganizationServicing { organizationName: String, serverURL: URL, ssoOrganization: SSOOrganization? - ) async throws -> CloudOrganization + ) async throws -> ServerOrganization } enum UpdateOrganizationServiceError: FatalError { @@ -31,7 +31,7 @@ enum UpdateOrganizationServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "We could not get the organization due to an unknown cloud response of \(statusCode)." + return "We could not get the organization due to an unknown Tuist response of \(statusCode)." case let .forbidden(message), let .notFound(message), let .badRequest(message), let .unauthorized(message): return message } @@ -45,8 +45,8 @@ public final class UpdateOrganizationService: UpdateOrganizationServicing { organizationName: String, serverURL: URL, ssoOrganization: SSOOrganization? - ) async throws -> CloudOrganization { - let client = Client.cloud(serverURL: serverURL) + ) async throws -> ServerOrganization { + let client = Client.authenticated(serverURL: serverURL) let ssoProvider: Operations.updateOrganization .Input.Body.jsonPayload.sso_providerPayload let ssoOrganizationId: String? @@ -79,7 +79,7 @@ public final class UpdateOrganizationService: UpdateOrganizationServicing { case let .ok(okResponse): switch okResponse.body { case let .json(project): - return CloudOrganization(project) + return ServerOrganization(project) } case let .notFound(notFound): switch notFound.body { diff --git a/Sources/TuistServer/Session/CloudSessionController.swift b/Sources/TuistServer/Session/ServerSessionController.swift similarity index 81% rename from Sources/TuistServer/Session/CloudSessionController.swift rename to Sources/TuistServer/Session/ServerSessionController.swift index 56a28bb953e..496f18c6448 100644 --- a/Sources/TuistServer/Session/CloudSessionController.swift +++ b/Sources/TuistServer/Session/ServerSessionController.swift @@ -3,7 +3,7 @@ import Mockable import TuistSupport @Mockable -public protocol CloudSessionControlling: AnyObject { +public protocol ServerSessionControlling: AnyObject { /// It authenticates the user for the server with the given URL. /// - Parameter serverURL: Server URL. func authenticate(serverURL: URL) async throws @@ -17,45 +17,45 @@ public protocol CloudSessionControlling: AnyObject { func logout(serverURL: URL) throws } -public final class CloudSessionController: CloudSessionControlling { +public final class ServerSessionController: ServerSessionControlling { static let port: UInt16 = 4545 - private let credentialsStore: CloudCredentialsStoring + private let credentialsStore: ServerCredentialsStoring private let ciChecker: CIChecking private let opener: Opening private let getAuthTokenService: GetAuthTokenServicing private let uniqueIDGenerator: UniqueIDGenerating - private let cloudAuthenticationController: CloudAuthenticationControlling + private let serverAuthenticationController: ServerAuthenticationControlling public convenience init() { - let credentialsStore = CloudCredentialsStore() + let credentialsStore = ServerCredentialsStore() self.init( credentialsStore: credentialsStore, ciChecker: CIChecker(), opener: Opener(), getAuthTokenService: GetAuthTokenService(), uniqueIDGenerator: UniqueIDGenerator(), - cloudAuthenticationController: CloudAuthenticationController(credentialsStore: credentialsStore) + serverAuthenticationController: ServerAuthenticationController(credentialsStore: credentialsStore) ) } init( - credentialsStore: CloudCredentialsStoring, + credentialsStore: ServerCredentialsStoring, ciChecker: CIChecking, opener: Opening, getAuthTokenService: GetAuthTokenServicing, uniqueIDGenerator: UniqueIDGenerating, - cloudAuthenticationController: CloudAuthenticationControlling + serverAuthenticationController: ServerAuthenticationControlling ) { self.credentialsStore = credentialsStore self.ciChecker = ciChecker self.opener = opener self.getAuthTokenService = getAuthTokenService self.uniqueIDGenerator = uniqueIDGenerator - self.cloudAuthenticationController = cloudAuthenticationController + self.serverAuthenticationController = serverAuthenticationController } - // MARK: - CloudSessionControlling + // MARK: - ServerSessionControlling public func authenticate(serverURL: URL) async throws { var components = URLComponents(url: serverURL, resolvingAgainstBaseURL: false)! @@ -72,13 +72,13 @@ public final class CloudSessionController: CloudSessionControlling { serverURL: serverURL, deviceCode: deviceCode ) - let credentials = CloudCredentials(token: token) + let credentials = ServerCredentials(token: token) try credentialsStore.store(credentials: credentials, serverURL: serverURL) logger.notice("Credentials stored successfully", metadata: .success) } public func printSession(serverURL: URL) throws { - if let token = try cloudAuthenticationController.authenticationToken(serverURL: serverURL) { + if let token = try serverAuthenticationController.authenticationToken(serverURL: serverURL) { switch token { case let .user(userToken): logger.notice(""" diff --git a/Sources/TuistServer/Utilities/CloudAuthenticationController.swift b/Sources/TuistServer/Utilities/ServerAuthenticationController.swift similarity index 71% rename from Sources/TuistServer/Utilities/CloudAuthenticationController.swift rename to Sources/TuistServer/Utilities/ServerAuthenticationController.swift index d6696cc5931..324bbc03afe 100644 --- a/Sources/TuistServer/Utilities/CloudAuthenticationController.swift +++ b/Sources/TuistServer/Utilities/ServerAuthenticationController.swift @@ -3,11 +3,11 @@ import Mockable import TuistSupport @Mockable -public protocol CloudAuthenticationControlling { - func authenticationToken(serverURL: URL) throws -> CloudAuthenticationToken? +public protocol ServerAuthenticationControlling { + func authenticationToken(serverURL: URL) throws -> ServerAuthenticationToken? } -public enum CloudAuthenticationToken: CustomStringConvertible { +public enum ServerAuthenticationToken: CustomStringConvertible { /// The token represents a user session. User sessions are typically used in /// local environments where the user can be guided through an interactive /// authentication workflow @@ -30,20 +30,20 @@ public enum CloudAuthenticationToken: CustomStringConvertible { public var description: String { switch self { case let .user(token): - return "tuist cloud user token: \(token)" + return "tuist user token: \(token)" case let .project(token): - return "tuist cloud project token: \(token)" + return "tuist project token: \(token)" } } } -public final class CloudAuthenticationController: CloudAuthenticationControlling { - private let credentialsStore: CloudCredentialsStoring +public final class ServerAuthenticationController: ServerAuthenticationControlling { + private let credentialsStore: ServerCredentialsStoring private let ciChecker: CIChecking private let environmentVariables: () -> [String: String] public init( - credentialsStore: CloudCredentialsStoring = CloudCredentialsStore(), + credentialsStore: ServerCredentialsStoring = ServerCredentialsStore(), ciChecker: CIChecking = CIChecker(), environmentVariables: @escaping () -> [String: String] = { ProcessInfo.processInfo.environment } ) { @@ -52,7 +52,7 @@ public final class CloudAuthenticationController: CloudAuthenticationControlling self.environmentVariables = environmentVariables } - public func authenticationToken(serverURL: URL) throws -> CloudAuthenticationToken? { + public func authenticationToken(serverURL: URL) throws -> ServerAuthenticationToken? { if ciChecker.isCI() { let environment = environmentVariables() return environment[Constants.EnvironmentVariables.token].map { .project($0) } diff --git a/Sources/TuistServer/Utilities/CloudCredentialsStore.swift b/Sources/TuistServer/Utilities/ServerCredentialsStore.swift similarity index 81% rename from Sources/TuistServer/Utilities/CloudCredentialsStore.swift rename to Sources/TuistServer/Utilities/ServerCredentialsStore.swift index 516a492585b..aac481c07b6 100644 --- a/Sources/TuistServer/Utilities/CloudCredentialsStore.swift +++ b/Sources/TuistServer/Utilities/ServerCredentialsStore.swift @@ -3,7 +3,7 @@ import Mockable import Path import TuistSupport -public struct CloudCredentials: Codable, Equatable { +public struct ServerCredentials: Codable, Equatable { /// Authentication token. public let token: String @@ -17,28 +17,28 @@ public struct CloudCredentials: Codable, Equatable { } @Mockable -public protocol CloudCredentialsStoring { +public protocol ServerCredentialsStoring { /// It stores the credentials for the server with the given URL. /// - Parameters: /// - credentials: Credentials to be stored. /// - serverURL: Server URL (without path). - func store(credentials: CloudCredentials, serverURL: URL) throws + func store(credentials: ServerCredentials, serverURL: URL) throws /// Gets the credentials to authenticate the user against the server with the given URL. Throws an error if credentials are /// not found. /// - Parameter serverURL: Server URL (without path). - func get(serverURL: URL) throws -> CloudCredentials + func get(serverURL: URL) throws -> ServerCredentials /// Reads the credentials to authenticate the user against the server with the given URL. /// - Parameter serverURL: Server URL (without path). - func read(serverURL: URL) throws -> CloudCredentials? + func read(serverURL: URL) throws -> ServerCredentials? /// Deletes the credentials for the server with the given URL. /// - Parameter serverURL: Server URL (without path). func delete(serverURL: URL) throws } -enum CloudCredentialsStoreError: FatalError { +enum ServerCredentialsStoreError: FatalError { case credentialsNotFound case xcdgHomePathNotAbsolute(String) case invalidServerURL(String) @@ -46,7 +46,7 @@ enum CloudCredentialsStoreError: FatalError { var description: String { switch self { case .credentialsNotFound: - return "You are not authenticated. Authenticate by running `tuist cloud auth`." + return "You are not authenticated. Authenticate by running `tuist auth`." case let .xcdgHomePathNotAbsolute(path): return "We expected the value of the XDG_CONFIG_HOME environment variable, \(path), to be an absolute path but it's not." case let .invalidServerURL(url): @@ -66,7 +66,7 @@ enum CloudCredentialsStoreError: FatalError { } } -public final class CloudCredentialsStore: CloudCredentialsStoring { +public final class ServerCredentialsStore: ServerCredentialsStoring { private let fileHandler: FileHandling private let configDirectory: AbsolutePath? @@ -82,7 +82,7 @@ public final class CloudCredentialsStore: CloudCredentialsStoring { // MARK: - CredentialsStoring - public func store(credentials: CloudCredentials, serverURL: URL) throws { + public func store(credentials: ServerCredentials, serverURL: URL) throws { let path = try credentialsFilePath(serverURL: serverURL) let data = try JSONEncoder().encode(credentials) if !fileHandler.exists(path.parentDirectory) { @@ -91,7 +91,7 @@ public final class CloudCredentialsStore: CloudCredentialsStoring { try data.write(to: path.url, options: .atomic) } - public func read(serverURL: URL) throws -> CloudCredentials? { + public func read(serverURL: URL) throws -> ServerCredentials? { let path = try credentialsFilePath(serverURL: serverURL) guard fileHandler.exists(path) else { return nil } let data = try fileHandler.readFile(path) @@ -101,13 +101,13 @@ public final class CloudCredentialsStore: CloudCredentialsStoring { and the new schema doesn't align with the one that we expect. We could add logic to handle those gracefully, but since the user can recover from it by signing in again, I think it's ok not to add more complexity here. */ - return try? JSONDecoder().decode(CloudCredentials.self, from: data) + return try? JSONDecoder().decode(ServerCredentials.self, from: data) } - public func get(serverURL: URL) throws -> CloudCredentials { + public func get(serverURL: URL) throws -> ServerCredentials { guard let credentials = try read(serverURL: serverURL) else { - throw CloudCredentialsStoreError.credentialsNotFound + throw ServerCredentialsStoreError.credentialsNotFound } return credentials @@ -129,7 +129,7 @@ public final class CloudCredentialsStore: CloudCredentialsStoring { do { directory = try AbsolutePath(validating: xdgConfigHomeString) } catch { - throw CloudCredentialsStoreError.xcdgHomePathNotAbsolute(xdgConfigHomeString) + throw ServerCredentialsStoreError.xcdgHomePathNotAbsolute(xdgConfigHomeString) } } @@ -141,12 +141,12 @@ public final class CloudCredentialsStore: CloudCredentialsStoring { fileprivate func credentialsFilePath(serverURL: URL) throws -> AbsolutePath { guard let components = URLComponents(url: serverURL, resolvingAgainstBaseURL: false), let host = components.host else { - throw CloudCredentialsStoreError.invalidServerURL(serverURL.absoluteString) + throw ServerCredentialsStoreError.invalidServerURL(serverURL.absoluteString) } let directory = if let configDirectory { configDirectory } else { - try CloudCredentialsStore.configDirectory() + try ServerCredentialsStore.configDirectory() } // swiftlint:disable:next force_try return directory.appending(try! RelativePath(validating: "credentials/\(host).json")) diff --git a/Sources/TuistSupport/Credentials/CredentialsStore.swift b/Sources/TuistSupport/Credentials/CredentialsStore.swift index 0887e4b168d..b8468edd808 100644 --- a/Sources/TuistSupport/Credentials/CredentialsStore.swift +++ b/Sources/TuistSupport/Credentials/CredentialsStore.swift @@ -28,7 +28,7 @@ enum CredentialsStoreError: FatalError { var description: String { switch self { case .credentialsNotFound: - return "You are not authenticated. Authenticate by running `tuist cloud auth`." + return "You are not authenticated. Authenticate by running `tuist auth`." } } diff --git a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift index 79844a7bae5..865fdeb064e 100644 --- a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift @@ -11,11 +11,11 @@ final class ServerAcceptanceTestProjects: TuistAcceptanceTestCase { let organizationHandle = String(UUID().uuidString.prefix(12).lowercased()) let projectHandle = String(UUID().uuidString.prefix(12).lowercased()) let fullHandle = "\(organizationHandle)/\(projectHandle)" - try await run(CloudOrganizationCreateCommand.self, organizationHandle) - try await run(CloudProjectCreateCommand.self, fullHandle) - try await run(CloudProjectListCommand.self) - try await run(CloudProjectDeleteCommand.self, fullHandle) - try await run(CloudOrganizationDeleteCommand.self, organizationHandle) + try await run(OrganizationCreateCommand.self, organizationHandle) + try await run(ProjectCreateCommand.self, fullHandle) + try await run(ProjectListCommand.self) + try await run(ProjectDeleteCommand.self, fullHandle) + try await run(OrganizationDeleteCommand.self, organizationHandle) XCTAssertStandardOutput(pattern: "Listing all your projects:") XCTAssertStandardOutput(pattern: "• \(fullHandle)") } diff --git a/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift b/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift deleted file mode 100644 index ab99e2998e1..00000000000 --- a/Tests/TuistKitTests/Cloud/CloudCleanServiceTests.swift +++ /dev/null @@ -1,66 +0,0 @@ -import MockableTest -import TuistCore -import TuistLoader -import TuistServer -import TuistSupport -import XcodeGraph -import XCTest - -@testable import TuistKit -@testable import TuistSupportTesting - -final class CloudCleanServiceTests: TuistUnitTestCase { - private var cloudSessionController: MockCloudSessionControlling! - private var cleanCacheService: MockCleanCacheServicing! - private var configLoader: MockConfigLoading! - private var subject: CloudCleanService! - - override func setUp() { - super.setUp() - cloudSessionController = .init() - cleanCacheService = .init() - configLoader = MockConfigLoading() - subject = CloudCleanService( - cloudSessionController: cloudSessionController, - cleanCacheService: cleanCacheService, - configLoader: configLoader - ) - } - - override func tearDown() { - cloudSessionController = nil - cleanCacheService = nil - configLoader = nil - subject = nil - super.tearDown() - } - - func test_cloud_clean() async throws { - // Given - let url = URL(string: "https://cloud.com")! - - given(configLoader) - .loadConfig(path: .any) - .willReturn( - Config.test( - cloud: Cloud.test( - url: url, - projectId: "project/slug" - ) - ) - ) - - given(cleanCacheService) - .cleanCache( - serverURL: .value(url), - fullName: .value("project/slug") - ) - .willReturn(()) - - // When - try await subject.clean(path: "/some-path") - - // Then - XCTAssertPrinterOutputContains("Project was successfully cleaned.") - } -} diff --git a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift index 700a173f8ae..760cbee6172 100644 --- a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift +++ b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift @@ -574,15 +574,15 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertFalse(testCommandWithArgs.selectiveTesting) } - func testCloudOrganizationBillingCommandUsesEnvVars() throws { - setVariable(.cloudOrganizationBillingOrganizationName, value: "MyOrganization") - setVariable(.cloudOrganizationBillingPath, value: "/path/to/billing") + func testOrganizationBillingCommandUsesEnvVars() throws { + setVariable(.organizationBillingOrganizationName, value: "MyOrganization") + setVariable(.organizationBillingPath, value: "/path/to/billing") - let commandWithEnvVars = try CloudOrganizationBillingCommand.parse([]) + let commandWithEnvVars = try OrganizationBillingCommand.parse([]) XCTAssertEqual(commandWithEnvVars.organizationName, "MyOrganization") XCTAssertEqual(commandWithEnvVars.path, "/path/to/billing") - let commandWithArgs = try CloudOrganizationBillingCommand.parse([ + let commandWithArgs = try OrganizationBillingCommand.parse([ "AnotherOrganization", "--path", "/new/billing/path", ]) @@ -590,15 +590,15 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/billing/path") } - func testCloudOrganizationCreateCommandUsesEnvVars() throws { - setVariable(.cloudOrganizationCreateOrganizationName, value: "MyNewOrganization") - setVariable(.cloudOrganizationCreatePath, value: "/path/to/create") + func testOrganizationCreateCommandUsesEnvVars() throws { + setVariable(.organizationCreateOrganizationName, value: "MyNewOrganization") + setVariable(.organizationCreatePath, value: "/path/to/create") - let commandWithEnvVars = try CloudOrganizationCreateCommand.parse([]) + let commandWithEnvVars = try OrganizationCreateCommand.parse([]) XCTAssertEqual(commandWithEnvVars.organizationName, "MyNewOrganization") XCTAssertEqual(commandWithEnvVars.path, "/path/to/create") - let commandWithArgs = try CloudOrganizationCreateCommand.parse([ + let commandWithArgs = try OrganizationCreateCommand.parse([ "AnotherNewOrganization", "--path", "/new/create/path", ]) @@ -606,15 +606,15 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/create/path") } - func testCloudOrganizationDeleteCommandUsesEnvVars() throws { - setVariable(.cloudOrganizationDeleteOrganizationName, value: "OrganizationToDelete") - setVariable(.cloudOrganizationDeletePath, value: "/path/to/delete") + func testOrganizationDeleteCommandUsesEnvVars() throws { + setVariable(.organizationDeleteOrganizationName, value: "OrganizationToDelete") + setVariable(.organizationDeletePath, value: "/path/to/delete") - let commandWithEnvVars = try CloudOrganizationDeleteCommand.parse([]) + let commandWithEnvVars = try OrganizationDeleteCommand.parse([]) XCTAssertEqual(commandWithEnvVars.organizationName, "OrganizationToDelete") XCTAssertEqual(commandWithEnvVars.path, "/path/to/delete") - let commandWithArgs = try CloudOrganizationDeleteCommand.parse([ + let commandWithArgs = try OrganizationDeleteCommand.parse([ "AnotherOrganizationToDelete", "--path", "/new/delete/path", ]) @@ -624,13 +624,13 @@ final class CommandEnvironmentVariableTests: XCTestCase { func testCloudProjectTokenCommandUsesEnvVars() throws { setVariable(.projectTokenFullHandle, value: "tuist-org/tuist") - setVariable(.cloudProjectTokenPath, value: "/path/to/token") + setVariable(.projectTokenPath, value: "/path/to/token") - let commandWithEnvVars = try CloudProjectTokenCommand.parse([]) + let commandWithEnvVars = try ProjectTokenCommand.parse([]) XCTAssertEqual(commandWithEnvVars.fullHandle, "tuist-org/tuist") XCTAssertEqual(commandWithEnvVars.path, "/path/to/token") - let commandWithArgs = try CloudProjectTokenCommand.parse([ + let commandWithArgs = try ProjectTokenCommand.parse([ "new-org/new-project", "--path", "/new/token/path", ]) @@ -638,15 +638,15 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/token/path") } - func testCloudOrganizationListCommandUsesEnvVars() throws { - setVariable(.cloudOrganizationListJson, value: "true") - setVariable(.cloudOrganizationListPath, value: "/path/to/list") + func testOrganizationListCommandUsesEnvVars() throws { + setVariable(.organizationListJson, value: "true") + setVariable(.organizationListPath, value: "/path/to/list") - let commandWithEnvVars = try CloudOrganizationListCommand.parse([]) + let commandWithEnvVars = try OrganizationListCommand.parse([]) XCTAssertTrue(commandWithEnvVars.json) XCTAssertEqual(commandWithEnvVars.path, "/path/to/list") - let commandWithArgs = try CloudOrganizationListCommand.parse([ + let commandWithArgs = try OrganizationListCommand.parse([ "--no-json", "--path", "/new/list/path", ]) @@ -654,17 +654,17 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/list/path") } - func testCloudOrganizationRemoveInviteCommandUsesEnvVars() throws { - setVariable(.cloudOrganizationRemoveInviteOrganizationName, value: "MyOrganization") - setVariable(.cloudOrganizationRemoveInviteEmail, value: "email@example.com") - setVariable(.cloudOrganizationRemoveInvitePath, value: "/path/to/invite") + func testOrganizationRemoveInviteCommandUsesEnvVars() throws { + setVariable(.organizationRemoveInviteOrganizationName, value: "MyOrganization") + setVariable(.organizationRemoveInviteEmail, value: "email@example.com") + setVariable(.organizationRemoveInvitePath, value: "/path/to/invite") - let commandWithEnvVars = try CloudOrganizationRemoveInviteCommand.parse([]) + let commandWithEnvVars = try OrganizationRemoveInviteCommand.parse([]) XCTAssertEqual(commandWithEnvVars.organizationName, "MyOrganization") XCTAssertEqual(commandWithEnvVars.email, "email@example.com") XCTAssertEqual(commandWithEnvVars.path, "/path/to/invite") - let commandWithArgs = try CloudOrganizationRemoveInviteCommand.parse([ + let commandWithArgs = try OrganizationRemoveInviteCommand.parse([ "NewOrganization", "newemail@example.com", "--path", "/new/invite/path", @@ -674,17 +674,17 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/invite/path") } - func testCloudOrganizationRemoveMemberCommandUsesEnvVars() throws { - setVariable(.cloudOrganizationRemoveMemberOrganizationName, value: "MyOrganization") - setVariable(.cloudOrganizationRemoveMemberUsername, value: "username") - setVariable(.cloudOrganizationRemoveMemberPath, value: "/path/to/member") + func testOrganizationRemoveMemberCommandUsesEnvVars() throws { + setVariable(.organizationRemoveMemberOrganizationName, value: "MyOrganization") + setVariable(.organizationRemoveMemberUsername, value: "username") + setVariable(.organizationRemoveMemberPath, value: "/path/to/member") - let commandWithEnvVars = try CloudOrganizationRemoveMemberCommand.parse([]) + let commandWithEnvVars = try OrganizationRemoveMemberCommand.parse([]) XCTAssertEqual(commandWithEnvVars.organizationName, "MyOrganization") XCTAssertEqual(commandWithEnvVars.username, "username") XCTAssertEqual(commandWithEnvVars.path, "/path/to/member") - let commandWithArgs = try CloudOrganizationRemoveMemberCommand.parse([ + let commandWithArgs = try OrganizationRemoveMemberCommand.parse([ "NewOrganization", "newusername", "--path", "/new/member/path", @@ -694,15 +694,15 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/member/path") } - func testCloudOrganizationRemoveSSOCommandUsesEnvVars() throws { - setVariable(.cloudOrganizationRemoveSSOOrganizationName, value: "MyOrganization") - setVariable(.cloudOrganizationRemoveSSOPath, value: "/path/to/sso") + func testOrganizationRemoveSSOCommandUsesEnvVars() throws { + setVariable(.organizationRemoveSSOOrganizationName, value: "MyOrganization") + setVariable(.organizationRemoveSSOPath, value: "/path/to/sso") - let commandWithEnvVars = try CloudOrganizationRemoveSSOCommand.parse([]) + let commandWithEnvVars = try OrganizationRemoveSSOCommand.parse([]) XCTAssertEqual(commandWithEnvVars.organizationName, "MyOrganization") XCTAssertEqual(commandWithEnvVars.path, "/path/to/sso") - let commandWithArgs = try CloudOrganizationRemoveSSOCommand.parse([ + let commandWithArgs = try OrganizationRemoveSSOCommand.parse([ "NewOrganization", "--path", "/new/sso/path", ]) @@ -710,19 +710,19 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/sso/path") } - func testCloudOrganizationUpdateSSOCommandUsesEnvVars() throws { - setVariable(.cloudOrganizationUpdateSSOOrganizationName, value: "MyOrganization") - setVariable(.cloudOrganizationUpdateSSOProvider, value: "google") - setVariable(.cloudOrganizationUpdateSSOOrganizationId, value: "1234") - setVariable(.cloudOrganizationUpdateSSOPath, value: "/path/to/update/sso") + func testOrganizationUpdateSSOCommandUsesEnvVars() throws { + setVariable(.organizationUpdateSSOOrganizationName, value: "MyOrganization") + setVariable(.organizationUpdateSSOProvider, value: "google") + setVariable(.organizationUpdateSSOOrganizationId, value: "1234") + setVariable(.organizationUpdateSSOPath, value: "/path/to/update/sso") - let commandWithEnvVars = try CloudOrganizationUpdateSSOCommand.parse([]) + let commandWithEnvVars = try OrganizationUpdateSSOCommand.parse([]) XCTAssertEqual(commandWithEnvVars.organizationName, "MyOrganization") XCTAssertEqual(commandWithEnvVars.provider, .google) XCTAssertEqual(commandWithEnvVars.organizationId, "1234") XCTAssertEqual(commandWithEnvVars.path, "/path/to/update/sso") - let commandWithArgs = try CloudOrganizationUpdateSSOCommand.parse([ + let commandWithArgs = try OrganizationUpdateSSOCommand.parse([ "NewOrganization", "--provider", "google", "--organization-id", "5678", @@ -734,16 +734,15 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/update/sso/path") } - func testCloudProjectDeleteCommandUsesEnvVars() throws { + func testProjectDeleteCommandUsesEnvVars() throws { setVariable(.projectDeleteFullHandle, value: "tuist-org/tuist") - setVariable(.cloudProjectDeleteOrganization, value: "MyOrganization") - setVariable(.cloudProjectDeletePath, value: "/path/to/delete") + setVariable(.projectDeletePath, value: "/path/to/delete") - let commandWithEnvVars = try CloudProjectDeleteCommand.parse([]) + let commandWithEnvVars = try ProjectDeleteCommand.parse([]) XCTAssertEqual(commandWithEnvVars.fullHandle, "tuist-org/tuist") XCTAssertEqual(commandWithEnvVars.path, "/path/to/delete") - let commandWithArgs = try CloudProjectDeleteCommand.parse([ + let commandWithArgs = try ProjectDeleteCommand.parse([ "new-org/new-project", "--path", "/new/delete/path", ]) @@ -751,16 +750,15 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/delete/path") } - func testCloudProjectCreateCommandUsesEnvVars() throws { + func testProjectCreateCommandUsesEnvVars() throws { setVariable(.projectCreateFullHandle, value: "tuist-org/tuist") - setVariable(.cloudProjectCreateOrganization, value: "MyOrganization") - setVariable(.cloudProjectCreatePath, value: "/path/to/create") + setVariable(.projectCreatePath, value: "/path/to/create") - let commandWithEnvVars = try CloudProjectCreateCommand.parse([]) + let commandWithEnvVars = try ProjectCreateCommand.parse([]) XCTAssertEqual(commandWithEnvVars.fullHandle, "tuist-org/tuist") XCTAssertEqual(commandWithEnvVars.path, "/path/to/create") - let commandWithArgs = try CloudProjectCreateCommand.parse([ + let commandWithArgs = try ProjectCreateCommand.parse([ "new-org/new-project", "--path", "/new/create/path", ]) @@ -768,17 +766,17 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/create/path") } - func testCloudOrganizationInviteCommandUsesEnvVars() throws { - setVariable(.cloudOrganizationInviteOrganizationName, value: "InviteOrganization") - setVariable(.cloudOrganizationInviteEmail, value: "email@example.com") - setVariable(.cloudOrganizationInvitePath, value: "/path/to/invite") + func testOrganizationInviteCommandUsesEnvVars() throws { + setVariable(.organizationInviteOrganizationName, value: "InviteOrganization") + setVariable(.organizationInviteEmail, value: "email@example.com") + setVariable(.organizationInvitePath, value: "/path/to/invite") - let commandWithEnvVars = try CloudOrganizationInviteCommand.parse([]) + let commandWithEnvVars = try OrganizationInviteCommand.parse([]) XCTAssertEqual(commandWithEnvVars.organizationName, "InviteOrganization") XCTAssertEqual(commandWithEnvVars.email, "email@example.com") XCTAssertEqual(commandWithEnvVars.path, "/path/to/invite") - let commandWithArgs = try CloudOrganizationInviteCommand.parse([ + let commandWithArgs = try OrganizationInviteCommand.parse([ "NewInviteOrganization", "newemail@example.com", "--path", "/new/invite/path", @@ -788,17 +786,17 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/invite/path") } - func testCloudOrganizationShowCommandUsesEnvVars() throws { - setVariable(.cloudOrganizationShowOrganizationName, value: "MyOrganization") - setVariable(.cloudOrganizationShowJson, value: "true") - setVariable(.cloudOrganizationShowPath, value: "/path/to/show") + func testOrganizationShowCommandUsesEnvVars() throws { + setVariable(.organizationShowOrganizationName, value: "MyOrganization") + setVariable(.organizationShowJson, value: "true") + setVariable(.organizationShowPath, value: "/path/to/show") - let commandWithEnvVars = try CloudOrganizationShowCommand.parse([]) + let commandWithEnvVars = try OrganizationShowCommand.parse([]) XCTAssertEqual(commandWithEnvVars.organizationName, "MyOrganization") XCTAssertTrue(commandWithEnvVars.json) XCTAssertEqual(commandWithEnvVars.path, "/path/to/show") - let commandWithArgs = try CloudOrganizationShowCommand.parse([ + let commandWithArgs = try OrganizationShowCommand.parse([ "NewOrganization", "--no-json", "--path", "/new/show/path", @@ -808,15 +806,15 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/show/path") } - func testCloudProjectListCommandUsesEnvVars() throws { - setVariable(.cloudProjectListJson, value: "true") - setVariable(.cloudProjectListPath, value: "/path/to/list") + func testProjectListCommandUsesEnvVars() throws { + setVariable(.projectListJson, value: "true") + setVariable(.projectListPath, value: "/path/to/list") - let commandWithEnvVars = try CloudProjectListCommand.parse([]) + let commandWithEnvVars = try ProjectListCommand.parse([]) XCTAssertTrue(commandWithEnvVars.json) XCTAssertEqual(commandWithEnvVars.path, "/path/to/list") - let commandWithArgs = try CloudProjectListCommand.parse([ + let commandWithArgs = try ProjectListCommand.parse([ "--no-json", "--path", "/new/list/path", ]) @@ -824,19 +822,19 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/list/path") } - func testCloudOrganizationUpdateMemberCommandUsesEnvVars() throws { - setVariable(.cloudOrganizationUpdateMemberOrganizationName, value: "MyOrganization") - setVariable(.cloudOrganizationUpdateMemberUsername, value: "username") - setVariable(.cloudOrganizationUpdateMemberRole, value: "admin") - setVariable(.cloudOrganizationUpdateMemberPath, value: "/path/to/member") + func testOrganizationUpdateMemberCommandUsesEnvVars() throws { + setVariable(.organizationUpdateMemberOrganizationName, value: "MyOrganization") + setVariable(.organizationUpdateMemberUsername, value: "username") + setVariable(.organizationUpdateMemberRole, value: "admin") + setVariable(.organizationUpdateMemberPath, value: "/path/to/member") - let commandWithEnvVars = try CloudOrganizationUpdateMemberCommand.parse([]) + let commandWithEnvVars = try OrganizationUpdateMemberCommand.parse([]) XCTAssertEqual(commandWithEnvVars.organizationName, "MyOrganization") XCTAssertEqual(commandWithEnvVars.username, "username") XCTAssertEqual(commandWithEnvVars.role, "admin") XCTAssertEqual(commandWithEnvVars.path, "/path/to/member") - let commandWithArgs = try CloudOrganizationUpdateMemberCommand.parse([ + let commandWithArgs = try OrganizationUpdateMemberCommand.parse([ "NewOrganization", "newusername", "--role", "user", @@ -848,63 +846,51 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/member/path") } - func testCloudAuthCommandUsesEnvVars() throws { - setVariable(.cloudAuthPath, value: "/path/to/auth") + func testAuthCommandUsesEnvVars() throws { + setVariable(.authPath, value: "/path/to/auth") - let commandWithEnvVars = try CloudAuthCommand.parse([]) + let commandWithEnvVars = try AuthCommand.parse([]) XCTAssertEqual(commandWithEnvVars.path, "/path/to/auth") - let commandWithArgs = try CloudAuthCommand.parse([ + let commandWithArgs = try AuthCommand.parse([ "--path", "/new/auth/path", ]) XCTAssertEqual(commandWithArgs.path, "/new/auth/path") } - func testCloudSessionCommandUsesEnvVars() throws { - setVariable(.cloudSessionPath, value: "/path/to/session") + func testSessionCommandUsesEnvVars() throws { + setVariable(.sessionPath, value: "/path/to/session") - let commandWithEnvVars = try CloudSessionCommand.parse([]) + let commandWithEnvVars = try SessionCommand.parse([]) XCTAssertEqual(commandWithEnvVars.path, "/path/to/session") - let commandWithArgs = try CloudSessionCommand.parse([ + let commandWithArgs = try SessionCommand.parse([ "--path", "/new/session/path", ]) XCTAssertEqual(commandWithArgs.path, "/new/session/path") } - func testCloudLogoutCommandUsesEnvVars() throws { - setVariable(.cloudLogoutPath, value: "/path/to/logout") + func testLogoutCommandUsesEnvVars() throws { + setVariable(.logoutPath, value: "/path/to/logout") - let commandWithEnvVars = try CloudLogoutCommand.parse([]) + let commandWithEnvVars = try LogoutCommand.parse([]) XCTAssertEqual(commandWithEnvVars.path, "/path/to/logout") - let commandWithArgs = try CloudLogoutCommand.parse([ + let commandWithArgs = try LogoutCommand.parse([ "--path", "/new/logout/path", ]) XCTAssertEqual(commandWithArgs.path, "/new/logout/path") } - func testCloudAnalyticsCommandUsesEnvVars() throws { - setVariable(.cloudAnalyticsPath, value: "/path/to/analytics") + func testAnalyticsCommandUsesEnvVars() throws { + setVariable(.analyticsPath, value: "/path/to/analytics") - let commandWithEnvVars = try CloudAnalyticsCommand.parse([]) + let commandWithEnvVars = try AnalyticsCommand.parse([]) XCTAssertEqual(commandWithEnvVars.path, "/path/to/analytics") - let commandWithArgs = try CloudAnalyticsCommand.parse([ + let commandWithArgs = try AnalyticsCommand.parse([ "--path", "/new/analytics/path", ]) XCTAssertEqual(commandWithArgs.path, "/new/analytics/path") } - - func testCloudCleanCommandUsesEnvVars() throws { - setVariable(.cloudCleanPath, value: "/path/to/clean") - - let commandWithEnvVars = try CloudCleanCommand.parse([]) - XCTAssertEqual(commandWithEnvVars.path, "/path/to/clean") - - let commandWithArgs = try CloudCleanCommand.parse([ - "--path", "/new/clean/path", - ]) - XCTAssertEqual(commandWithArgs.path, "/new/clean/path") - } } diff --git a/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift b/Tests/TuistKitTests/Services/AuthServiceTests.swift similarity index 73% rename from Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift rename to Tests/TuistKitTests/Services/AuthServiceTests.swift index f5a8958e96f..9d86bfb902c 100644 --- a/Tests/TuistKitTests/Cloud/CloudAuthServiceTests.swift +++ b/Tests/TuistKitTests/Services/AuthServiceTests.swift @@ -12,29 +12,29 @@ import XCTest @testable import TuistKit @testable import TuistSupportTesting -final class CloudAuthServiceTests: TuistUnitTestCase { - private var cloudSessionController: MockCloudSessionControlling! +final class AuthServiceTests: TuistUnitTestCase { + private var serverSessionController: MockServerSessionControlling! private var configLoader: MockConfigLoading! private var cloudURL: URL! - private var subject: CloudAuthService! + private var subject: AuthService! override func setUp() { super.setUp() - cloudSessionController = .init() + serverSessionController = .init() configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! given(configLoader) .loadConfig(path: .any) .willReturn(.test(cloud: .test(url: cloudURL))) - subject = CloudAuthService( - cloudSessionController: cloudSessionController, + subject = AuthService( + serverSessionController: serverSessionController, configLoader: configLoader ) } override func tearDown() { - cloudSessionController = nil + serverSessionController = nil configLoader = nil cloudURL = nil subject = nil @@ -43,7 +43,7 @@ final class CloudAuthServiceTests: TuistUnitTestCase { func test_authenticate() async throws { // Given - given(cloudSessionController) + given(serverSessionController) .authenticate(serverURL: .value(cloudURL)) .willReturn(()) diff --git a/Tests/TuistKitTests/Services/CleanServiceTests.swift b/Tests/TuistKitTests/Services/CleanServiceTests.swift index 6c5b9ceb0f2..e7da14cb44c 100644 --- a/Tests/TuistKitTests/Services/CleanServiceTests.swift +++ b/Tests/TuistKitTests/Services/CleanServiceTests.swift @@ -5,6 +5,7 @@ import TuistCore import TuistCoreTesting import TuistLoader import TuistLoaderTesting +import TuistServer import TuistSupport import XCTest @@ -16,18 +17,27 @@ final class CleanServiceTests: TuistUnitTestCase { private var rootDirectoryLocator: MockRootDirectoryLocating! private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! private var manifestFilesLocator: MockManifestFilesLocating! + private var configLoader: MockConfigLoading! + private var serverURLService: MockServerURLServicing! + private var cleanCacheService: MockCleanCacheServicing! override func setUpWithError() throws { super.setUp() rootDirectoryLocator = .init() cacheDirectoriesProvider = .init() manifestFilesLocator = MockManifestFilesLocating() + configLoader = .init() + serverURLService = .init() + cleanCacheService = .init() subject = CleanService( fileHandler: FileHandler.shared, rootDirectoryLocator: rootDirectoryLocator, cacheDirectoriesProvider: cacheDirectoriesProvider, - manifestFilesLocator: manifestFilesLocator + manifestFilesLocator: manifestFilesLocator, + configLoader: configLoader, + serverURLService: serverURLService, + cleanCacheService: cleanCacheService ) } @@ -35,11 +45,14 @@ final class CleanServiceTests: TuistUnitTestCase { rootDirectoryLocator = nil cacheDirectoriesProvider = nil manifestFilesLocator = nil + configLoader = nil + serverURLService = nil + cleanCacheService = nil subject = nil super.tearDown() } - func test_run_with_category_cleans_category() throws { + func test_run_with_category_cleans_category() async throws { // Given let cachePaths = try createFolders(["tuist/Manifests", "tuist/ProjectDescriptionHelpers"]) @@ -55,14 +68,18 @@ final class CleanServiceTests: TuistUnitTestCase { .willReturn(nil) // When - try subject.run(categories: [TuistCleanCategory.global(.manifests)], path: nil) + try await subject.run( + categories: [TuistCleanCategory.global(.manifests)], + remote: false, + path: nil + ) // Then XCTAssertFalse(FileHandler.shared.exists(cachePaths[0])) XCTAssertTrue(FileHandler.shared.exists(cachePaths[1])) } - func test_run_with_dependencies_cleans_dependencies() throws { + func test_run_with_dependencies_cleans_dependencies() async throws { // Given let localPaths = try createFolders(["Tuist/.build", "Tuist/ProjectDescriptionHelpers"]) @@ -82,14 +99,18 @@ final class CleanServiceTests: TuistUnitTestCase { .willReturn(cachePath) // When - try subject.run(categories: [TuistCleanCategory.dependencies], path: nil) + try await subject.run( + categories: [TuistCleanCategory.dependencies], + remote: false, + path: nil + ) // Then XCTAssertFalse(FileHandler.shared.exists(localPaths[0])) XCTAssertTrue(FileHandler.shared.exists(localPaths[1])) } - func test_run_with_dependencies_cleans_dependencies_when_package_is_in_root() throws { + func test_run_with_dependencies_cleans_dependencies_when_package_is_in_root() async throws { // Given let localPaths = try createFolders([".build", "Tuist/ProjectDescriptionHelpers"]) @@ -109,14 +130,18 @@ final class CleanServiceTests: TuistUnitTestCase { .willReturn(cachePath) // When - try subject.run(categories: [TuistCleanCategory.dependencies], path: nil) + try await subject.run( + categories: [TuistCleanCategory.dependencies], + remote: false, + path: nil + ) // Then XCTAssertFalse(FileHandler.shared.exists(localPaths[0])) XCTAssertTrue(FileHandler.shared.exists(localPaths[1])) } - func test_run_without_category_cleans_all() throws { + func test_run_without_category_cleans_all() async throws { // Given let cachePaths = try createFolders(["tuist/Manifests"]) let cachePath = cachePaths[0].parentDirectory.parentDirectory @@ -141,10 +166,66 @@ final class CleanServiceTests: TuistUnitTestCase { try fileHandler.createFolder(swiftPackageManagerBuildPath) // When - try subject.run(categories: TuistCleanCategory.allCases, path: nil) + try await subject.run( + categories: TuistCleanCategory.allCases, + remote: false, + path: nil + ) // Then XCTAssertFalse(FileHandler.shared.exists(cachePaths[0])) XCTAssertFalse(FileHandler.shared.exists(swiftPackageManagerBuildPath)) } + + func test_run_with_remote() async throws { + // Given + let url = URL(string: "https://cloud.com")! + + given(configLoader) + .loadConfig(path: .any) + .willReturn( + Config.test( + cloud: Cloud.test( + url: url, + projectId: "tuist/tuist" + ) + ) + ) + + given(serverURLService) + .url(configServerURL: .any) + .willReturn(url) + + given(cleanCacheService) + .cleanCache( + serverURL: .value(url), + fullName: .value("tuist/tuist") + ) + .willReturn(()) + + given(cacheDirectoriesProvider) + .cacheDirectory() + .willReturn(try temporaryPath()) + + let projectPath = try temporaryPath() + given(rootDirectoryLocator) + .locate(from: .any) + .willReturn(projectPath) + given(manifestFilesLocator) + .locatePackageManifest(at: .any) + .willReturn(nil) + + // When + try await subject.run( + categories: TuistCleanCategory.allCases, + remote: true, + path: nil + ) + + // Then + verify(cleanCacheService) + .cleanCache(serverURL: .any, fullName: .any) + .called(1) + XCTAssertStandardOutput(pattern: "Successfully cleaned the remote storage.") + } } diff --git a/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift b/Tests/TuistKitTests/Services/LogoutServiceTests.swift similarity index 71% rename from Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift rename to Tests/TuistKitTests/Services/LogoutServiceTests.swift index 1bc48d40305..a200e6b3239 100644 --- a/Tests/TuistKitTests/Cloud/CloudLogoutServiceTests.swift +++ b/Tests/TuistKitTests/Services/LogoutServiceTests.swift @@ -13,26 +13,26 @@ import XCTest @testable import TuistKit @testable import TuistSupportTesting -final class CloudLogoutServiceTests: TuistUnitTestCase { - private var cloudSessionController: MockCloudSessionControlling! - private var subject: CloudLogoutService! +final class LogoutServiceTests: TuistUnitTestCase { + private var serverSessionController: MockServerSessionControlling! + private var subject: LogoutService! private var configLoader: MockConfigLoading! private var cloudURL: URL! override func setUp() { super.setUp() - cloudSessionController = MockCloudSessionControlling() + serverSessionController = MockServerSessionControlling() configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) - subject = CloudLogoutService( - cloudSessionController: cloudSessionController, + subject = LogoutService( + serverSessionController: serverSessionController, configLoader: configLoader ) } override func tearDown() { - cloudSessionController = nil + serverSessionController = nil cloudURL = nil configLoader = nil subject = nil @@ -41,7 +41,7 @@ final class CloudLogoutServiceTests: TuistUnitTestCase { func test_logout() throws { // Given - given(cloudSessionController) + given(serverSessionController) .logout(serverURL: .value(cloudURL)) .willReturn(()) diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift b/Tests/TuistKitTests/Services/Organization/OrganizationInviteServiceTests.swift similarity index 91% rename from Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift rename to Tests/TuistKitTests/Services/Organization/OrganizationInviteServiceTests.swift index 713be05f1ed..5beda92e3be 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationInviteServiceTests.swift +++ b/Tests/TuistKitTests/Services/Organization/OrganizationInviteServiceTests.swift @@ -8,9 +8,9 @@ import XcodeGraph import XCTest @testable import TuistKit -final class CloudOrganizationInviteServiceTests: TuistUnitTestCase { +final class OrganizationInviteServiceTests: TuistUnitTestCase { private var createOrganizationInviteService: MockCreateOrganizationInviteServicing! - private var subject: CloudOrganizationInviteService! + private var subject: OrganizationInviteService! private var configLoader: MockConfigLoading! private var cloudURL: URL! @@ -21,7 +21,7 @@ final class CloudOrganizationInviteServiceTests: TuistUnitTestCase { configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) - subject = CloudOrganizationInviteService( + subject = OrganizationInviteService( createOrganizationInviteService: createOrganizationInviteService, configLoader: configLoader ) diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift b/Tests/TuistKitTests/Services/Organization/OrganizationListServiceTests.swift similarity index 89% rename from Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift rename to Tests/TuistKitTests/Services/Organization/OrganizationListServiceTests.swift index 50b5344379c..a53685b5235 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationListServiceTests.swift +++ b/Tests/TuistKitTests/Services/Organization/OrganizationListServiceTests.swift @@ -8,9 +8,9 @@ import XcodeGraph import XCTest @testable import TuistKit -final class CloudOrganizationListServiceTests: TuistUnitTestCase { +final class OrganizationListServiceTests: TuistUnitTestCase { private var listOrganizationsService: MockListOrganizationsServicing! - private var subject: CloudOrganizationListService! + private var subject: OrganizationListService! private var configLoader: MockConfigLoading! private var cloudURL: URL! @@ -22,7 +22,7 @@ final class CloudOrganizationListServiceTests: TuistUnitTestCase { cloudURL = URL(string: "https://test.cloud.tuist.io")! given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) - subject = CloudOrganizationListService( + subject = OrganizationListService( listOrganizationsService: listOrganizationsService, configLoader: configLoader ) @@ -66,7 +66,7 @@ final class CloudOrganizationListServiceTests: TuistUnitTestCase { // Then XCTAssertPrinterOutputContains( - "You currently have no Cloud organizations. Create one by running `tuist cloud organization create`." + "You currently have no Cloud organizations. Create one by running `tuist organization create`." ) } } diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift b/Tests/TuistKitTests/Services/Organization/OrganizationRemoveSSOServiceTests.swift similarity index 88% rename from Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift rename to Tests/TuistKitTests/Services/Organization/OrganizationRemoveSSOServiceTests.swift index 6f1db9f2956..8d34c08eb77 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationRemoveSSOServiceTests.swift +++ b/Tests/TuistKitTests/Services/Organization/OrganizationRemoveSSOServiceTests.swift @@ -8,9 +8,9 @@ import XcodeGraph import XCTest @testable import TuistKit -final class CloudOrganizationRemoveSSOServiceTests: TuistUnitTestCase { +final class OrganizationRemoveSSOServiceTests: TuistUnitTestCase { private var updateOrganizationService: MockUpdateOrganizationServicing! - private var subject: CloudOrganizationRemoveSSOService! + private var subject: OrganizationRemoveSSOService! private var configLoader: MockConfigLoading! private var cloudURL: URL! @@ -22,7 +22,7 @@ final class CloudOrganizationRemoveSSOServiceTests: TuistUnitTestCase { cloudURL = URL(string: "https://test.cloud.tuist.io")! given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) - subject = CloudOrganizationRemoveSSOService( + subject = OrganizationRemoveSSOService( updateOrganizationService: updateOrganizationService, configLoader: configLoader ) diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift b/Tests/TuistKitTests/Services/Organization/OrganizationShowServiceTests.swift similarity index 96% rename from Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift rename to Tests/TuistKitTests/Services/Organization/OrganizationShowServiceTests.swift index bde9ed0a7c6..a30b2b53b71 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationShowServiceTests.swift +++ b/Tests/TuistKitTests/Services/Organization/OrganizationShowServiceTests.swift @@ -8,10 +8,10 @@ import XcodeGraph import XCTest @testable import TuistKit -final class CloudOrganizationShowServiceTests: TuistUnitTestCase { +final class OrganizationShowServiceTests: TuistUnitTestCase { private var getOrganizationService: MockGetOrganizationServicing! private var getOrganizationUsageService: MockGetOrganizationUsageServicing! - private var subject: CloudOrganizationShowService! + private var subject: OrganizationShowService! private var configLoader: MockConfigLoading! private var cloudURL: URL! @@ -22,7 +22,7 @@ final class CloudOrganizationShowServiceTests: TuistUnitTestCase { configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) - subject = CloudOrganizationShowService( + subject = OrganizationShowService( getOrganizationService: getOrganizationService, getOrganizationUsageService: getOrganizationUsageService, configLoader: configLoader diff --git a/Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift b/Tests/TuistKitTests/Services/Organization/OrganizationUpdateSSOService.swift similarity index 90% rename from Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift rename to Tests/TuistKitTests/Services/Organization/OrganizationUpdateSSOService.swift index 17a94660d93..2f66dacb4f9 100644 --- a/Tests/TuistKitTests/Cloud/CloudOrganizationUpdateSSOService.swift +++ b/Tests/TuistKitTests/Services/Organization/OrganizationUpdateSSOService.swift @@ -8,9 +8,9 @@ import XcodeGraph import XCTest @testable import TuistKit -final class CloudOrganizationUpdateSSOServiceTests: TuistUnitTestCase { +final class OrganizationUpdateSSOServiceTests: TuistUnitTestCase { private var updateOrganizationService: MockUpdateOrganizationServicing! - private var subject: CloudOrganizationUpdateSSOService! + private var subject: OrganizationUpdateSSOService! private var configLoader: MockConfigLoading! private var cloudURL: URL! @@ -22,7 +22,7 @@ final class CloudOrganizationUpdateSSOServiceTests: TuistUnitTestCase { cloudURL = URL(string: "https://test.cloud.tuist.io")! given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) - subject = CloudOrganizationUpdateSSOService( + subject = OrganizationUpdateSSOService( updateOrganizationService: updateOrganizationService, configLoader: configLoader ) diff --git a/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift b/Tests/TuistKitTests/Services/Project/ProjectDeleteServiceTests.swift similarity index 89% rename from Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift rename to Tests/TuistKitTests/Services/Project/ProjectDeleteServiceTests.swift index c8db8bcd6dc..3b4be12360b 100644 --- a/Tests/TuistKitTests/Cloud/CloudProjectDeleteServiceTests.swift +++ b/Tests/TuistKitTests/Services/Project/ProjectDeleteServiceTests.swift @@ -9,13 +9,13 @@ import XCTest @testable import TuistKit -final class CloudProjectDeleteServiceTests: TuistUnitTestCase { +final class ProjectDeleteServiceTests: TuistUnitTestCase { private var getProjectService: MockGetProjectServicing! private var deleteProjectService: MockDeleteProjectServicing! - private var credentialsStore: MockCloudCredentialsStoring! + private var credentialsStore: MockServerCredentialsStoring! private var configLoader: MockConfigLoading! private var cloudURL: URL! - private var subject: CloudProjectDeleteService! + private var subject: ProjectDeleteService! override func setUp() { super.setUp() @@ -26,7 +26,7 @@ final class CloudProjectDeleteServiceTests: TuistUnitTestCase { configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) - subject = CloudProjectDeleteService( + subject = ProjectDeleteService( deleteProjectService: deleteProjectService, getProjectService: getProjectService, credentialsStore: credentialsStore, diff --git a/Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift b/Tests/TuistKitTests/Services/Project/ProjectListServiceTests.swift similarity index 87% rename from Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift rename to Tests/TuistKitTests/Services/Project/ProjectListServiceTests.swift index 21d238df0e4..d310968af78 100644 --- a/Tests/TuistKitTests/Cloud/CloudProjectListServiceTests.swift +++ b/Tests/TuistKitTests/Services/Project/ProjectListServiceTests.swift @@ -7,9 +7,9 @@ import XcodeGraph import XCTest @testable import TuistKit -final class CloudProjectListServiceTests: TuistUnitTestCase { +final class ProjectListServiceTests: TuistUnitTestCase { private var listProjectsService: MockListProjectsServicing! - private var subject: CloudProjectListService! + private var subject: ProjectListService! private var configLoader: MockConfigLoading! private var cloudURL: URL! @@ -19,7 +19,7 @@ final class CloudProjectListServiceTests: TuistUnitTestCase { configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) - subject = CloudProjectListService( + subject = ProjectListService( listProjectsService: listProjectsService, configLoader: configLoader ) @@ -67,7 +67,7 @@ final class CloudProjectListServiceTests: TuistUnitTestCase { // Then XCTAssertPrinterOutputContains( - "You currently have no Cloud projects. Create one by running `tuist cloud project create`." + "You currently have no Tuist projects. Create one by running `tuist project create`." ) } } diff --git a/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift b/Tests/TuistKitTests/Services/SessionServiceTests.swift similarity index 71% rename from Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift rename to Tests/TuistKitTests/Services/SessionServiceTests.swift index dfbd6a6a039..ba4be883f7c 100644 --- a/Tests/TuistKitTests/Cloud/CloudSessionServiceTests.swift +++ b/Tests/TuistKitTests/Services/SessionServiceTests.swift @@ -13,26 +13,26 @@ import XCTest @testable import TuistKit @testable import TuistSupportTesting -final class CloudSessionServiceTests: TuistUnitTestCase { - private var cloudSessionController: MockCloudSessionControlling! - private var subject: CloudSessionService! +final class SessionServiceTests: TuistUnitTestCase { + private var serverSessionController: MockServerSessionControlling! + private var subject: SessionService! private var configLoader: MockConfigLoading! private var cloudURL: URL! override func setUp() { super.setUp() - cloudSessionController = MockCloudSessionControlling() + serverSessionController = MockServerSessionControlling() configLoader = MockConfigLoading() cloudURL = URL(string: "https://test.cloud.tuist.io")! given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) - subject = CloudSessionService( - cloudSessionController: cloudSessionController, + subject = SessionService( + serverSessionController: serverSessionController, configLoader: configLoader ) } override func tearDown() { - cloudSessionController = nil + serverSessionController = nil configLoader = nil cloudURL = nil subject = nil @@ -41,7 +41,7 @@ final class CloudSessionServiceTests: TuistUnitTestCase { func test_printSession() throws { // Given - given(cloudSessionController) + given(serverSessionController) .printSession(serverURL: .value(cloudURL)) .willReturn(()) diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift index 45ea8b68b7f..61f22d9eb54 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift @@ -39,7 +39,7 @@ final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { let projectID = "project" let cloudURL = URL.test() let cloud = Cloud(url: cloudURL, projectId: projectID, options: []) - let backend = TuistAnalyticsCloudBackend( + let backend = TuistAnalyticsServerBackend( config: cloud, createCommandEventService: createCommandEventService, fileHandler: fileHandler, diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift similarity index 96% rename from Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift rename to Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift index e746f182451..74b08ace4b7 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsCloudBackendTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift @@ -9,14 +9,14 @@ import XCTest @testable import TuistKit @testable import TuistSupportTesting -final class TuistAnalyticsCloudBackendTests: TuistUnitTestCase { +final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { private var config: Cloud! private var createCommandEventService: MockCreateCommandEventServicing! private var ciChecker: MockCIChecker! private var cacheDirectoriesProviderFactory: MockCacheDirectoriesProviderFactoring! private var analyticsArtifactUploadService: MockAnalyticsArtifactUploadServicing! private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! - private var subject: TuistAnalyticsCloudBackend! + private var subject: TuistAnalyticsServerBackend! override func setUpWithError() throws { super.setUp() @@ -32,7 +32,7 @@ final class TuistAnalyticsCloudBackendTests: TuistUnitTestCase { given(cacheDirectoriesProviderFactory) .cacheDirectories() .willReturn(cacheDirectoriesProvider) - subject = TuistAnalyticsCloudBackend( + subject = TuistAnalyticsServerBackend( config: config, createCommandEventService: createCommandEventService, fileHandler: fileHandler, diff --git a/Tests/TuistServerTests/Client/CloudClientOutputWarningsMiddlewareTests.swift b/Tests/TuistServerTests/Client/ServerClientOutputWarningsMiddlewareTests.swift similarity index 90% rename from Tests/TuistServerTests/Client/CloudClientOutputWarningsMiddlewareTests.swift rename to Tests/TuistServerTests/Client/ServerClientOutputWarningsMiddlewareTests.swift index 2b807f8997c..fb73e690d15 100644 --- a/Tests/TuistServerTests/Client/CloudClientOutputWarningsMiddlewareTests.swift +++ b/Tests/TuistServerTests/Client/ServerClientOutputWarningsMiddlewareTests.swift @@ -16,14 +16,14 @@ private class MockWarningController: WarningControlling { } } -final class CloudClientOutputWarningsMiddlewareTests: TuistUnitTestCase { +final class ServerClientOutputWarningsMiddlewareTests: TuistUnitTestCase { fileprivate var warningController: MockWarningController! - var subject: CloudClientOutputWarningsMiddleware! + var subject: ServerClientOutputWarningsMiddleware! override func setUp() { super.setUp() warningController = MockWarningController() - subject = CloudClientOutputWarningsMiddleware(warningController: warningController) + subject = ServerClientOutputWarningsMiddleware(warningController: warningController) } override func tearDown() { diff --git a/Tests/TuistServerTests/Session/CloudSessionControllerTests.swift b/Tests/TuistServerTests/Session/ServerSessionControllerTests.swift similarity index 79% rename from Tests/TuistServerTests/Session/CloudSessionControllerTests.swift rename to Tests/TuistServerTests/Session/ServerSessionControllerTests.swift index c8cba5356b1..518f7e040be 100644 --- a/Tests/TuistServerTests/Session/CloudSessionControllerTests.swift +++ b/Tests/TuistServerTests/Session/ServerSessionControllerTests.swift @@ -8,15 +8,15 @@ import XCTest @testable import TuistServer @testable import TuistSupportTesting -final class CloudSessionControllerTests: TuistUnitTestCase { - private var credentialsStore: MockCloudCredentialsStoring! +final class ServerSessionControllerTests: TuistUnitTestCase { + private var credentialsStore: MockServerCredentialsStoring! private var ciChecker: MockCIChecker! private var opener: MockOpener! private var serverURL: URL! private var getAuthTokenService: MockGetAuthTokenServicing! private var uniqueIDGenerator: MockUniqueIDGenerating! - private var cloudAuthenticationController: MockCloudAuthenticationControlling! - private var subject: CloudSessionController! + private var serverAuthenticationController: MockServerAuthenticationControlling! + private var subject: ServerSessionController! override func setUp() { super.setUp() @@ -26,14 +26,14 @@ final class CloudSessionControllerTests: TuistUnitTestCase { serverURL = URL.test() getAuthTokenService = MockGetAuthTokenServicing() uniqueIDGenerator = MockUniqueIDGenerating() - cloudAuthenticationController = MockCloudAuthenticationControlling() - subject = CloudSessionController( + serverAuthenticationController = MockServerAuthenticationControlling() + subject = ServerSessionController( credentialsStore: credentialsStore, ciChecker: ciChecker, opener: opener, getAuthTokenService: getAuthTokenService, uniqueIDGenerator: uniqueIDGenerator, - cloudAuthenticationController: cloudAuthenticationController + serverAuthenticationController: serverAuthenticationController ) } @@ -43,7 +43,7 @@ final class CloudSessionControllerTests: TuistUnitTestCase { opener = nil serverURL = nil uniqueIDGenerator = nil - cloudAuthenticationController = nil + serverAuthenticationController = nil subject = nil super.tearDown() } @@ -54,7 +54,7 @@ final class CloudSessionControllerTests: TuistUnitTestCase { given(uniqueIDGenerator).uniqueID().willReturn("id") given(credentialsStore) .read(serverURL: .value(serverURL)) - .willReturn(CloudCredentials(token: "token")) + .willReturn(ServerCredentials(token: "token")) given(credentialsStore) .store(credentials: .any, serverURL: .value(serverURL)) .willReturn() @@ -72,7 +72,7 @@ final class CloudSessionControllerTests: TuistUnitTestCase { func test_printSession_when_userToken() throws { // When - given(cloudAuthenticationController).authenticationToken(serverURL: .value(serverURL)).willReturn(.user("token")) + given(serverAuthenticationController).authenticationToken(serverURL: .value(serverURL)).willReturn(.user("token")) try subject.printSession(serverURL: serverURL) // Then @@ -84,7 +84,7 @@ final class CloudSessionControllerTests: TuistUnitTestCase { func test_printSession_when_projectToken() throws { // When - given(cloudAuthenticationController).authenticationToken(serverURL: .value(serverURL)).willReturn(.project("token")) + given(serverAuthenticationController).authenticationToken(serverURL: .value(serverURL)).willReturn(.project("token")) try subject.printSession(serverURL: serverURL) // Then @@ -96,7 +96,7 @@ final class CloudSessionControllerTests: TuistUnitTestCase { func test_printSession_when_credentialsDontExist() throws { // Given - given(cloudAuthenticationController).authenticationToken(serverURL: .value(serverURL)).willReturn(nil) + given(serverAuthenticationController).authenticationToken(serverURL: .value(serverURL)).willReturn(nil) // When try subject.printSession(serverURL: serverURL) @@ -109,7 +109,7 @@ final class CloudSessionControllerTests: TuistUnitTestCase { func test_logout_deletesTheCredentials() throws { // Given - let credentials = CloudCredentials(token: "token") + let credentials = ServerCredentials(token: "token") given(credentialsStore) .store(credentials: .value(credentials), serverURL: .value(serverURL)) .willReturn() diff --git a/Tests/TuistServerTests/Utilities/CloudCredentialsStoreTests.swift b/Tests/TuistServerTests/Utilities/ServerCredentialsStoreTests.swift similarity index 79% rename from Tests/TuistServerTests/Utilities/CloudCredentialsStoreTests.swift rename to Tests/TuistServerTests/Utilities/ServerCredentialsStoreTests.swift index cfd36c5ac40..ddc406a6082 100644 --- a/Tests/TuistServerTests/Utilities/CloudCredentialsStoreTests.swift +++ b/Tests/TuistServerTests/Utilities/ServerCredentialsStoreTests.swift @@ -5,8 +5,8 @@ import XCTest @testable import TuistServer @testable import TuistSupportTesting -final class CloudCredentialsStoreTests: TuistUnitTestCase { - var subject: CloudCredentialsStore! +final class ServerCredentialsStoreTests: TuistUnitTestCase { + var subject: ServerCredentialsStore! override func setUp() { super.setUp() @@ -20,11 +20,11 @@ final class CloudCredentialsStoreTests: TuistUnitTestCase { func test_crud() throws { // Given let temporaryDirectory = try temporaryPath() - let subject = CloudCredentialsStore( + let subject = ServerCredentialsStore( fileHandler: FileHandler.shared, configDirectory: temporaryDirectory ) - let credentials = CloudCredentials(token: "token") + let credentials = ServerCredentials(token: "token") let serverURL = URL(string: "https://tuist.io")! // When/Then diff --git a/docs/docs/cloud/get-started.md b/docs/docs/cloud/get-started.md index a1bbdada192..7274dd03be9 100644 --- a/docs/docs/cloud/get-started.md +++ b/docs/docs/cloud/get-started.md @@ -28,7 +28,7 @@ The first to start using Tuist Cloud is to **sign up**. For that, you can run the following command: ```bash -tuist cloud auth +tuist auth ``` > [!TIP] ORGANIZATION AND USERS @@ -42,14 +42,14 @@ If you are part of an organization to which you want to invite other members, yo > This is not necessary if you are working by yourself because you can create projects under your personal account. ```bash -tuist cloud organization create my-organization # Create organization +tuist organization create my-organization # Create organization ``` ### Organization SSO If you have a Google Workspace organization and you want any developer who signs in with the same Google hosted domain to be added to your Tuist organization, you can set it up with: ```bash -tuist cloud organization update sso my-organization --provider google --organization-id my-domain.com +tuist organization update sso my-organization --provider google --organization-id my-domain.com ``` > [!IMPORTANT] @@ -60,10 +60,17 @@ The next step is to create a project. You can easily do that with the following ::: code-group ```bash [Project under user account] +<<<<<<< HEAD tuist cloud project create my-account/my-project ``` ```bash [Project under organization] tuist cloud project create my-organization/my-project +======= +tuist project create my-project +``` +```bash [Project under organization] +tuist project create my-project -o my-organization +>>>>>>> e5897c3c7 (Flatten cloud commands to tuist) ``` ::: @@ -82,14 +89,14 @@ let config = Config(cloud: .cloud(projectId: "my-organization/my-project")) ### As user -Developers on your team can access Tuist Cloud if they are authenticated and added as members of the organization, which you can do using the `tuist cloud organization invite` command. +Developers on your team can access Tuist Cloud if they are authenticated and added as members of the organization, which you can do using the `tuist organization invite` command. ### As project (e.g. for CI) For CI environments, authentication is managed differently; it's done using **project-scoped tokens**. These tokens possess restricted permissions compared to those of the organization, including the ability to warm the cache with binaries. To obtain this token, you can execute the following command: ```bash -tuist cloud project token my-organization/my-project +tuist project token my-organization/my-project ``` You will then need to set the token as an environment variable named `TUIST_CONFIG_CLOUD_TOKEN` to make it accessible. From 4022b2bbfd5c7614dfaa7cf0996e7f266cc38f4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 3 Jul 2024 11:41:04 +0200 Subject: [PATCH 400/509] Flatten the tuist-cloud cache directory into the tuist cache directory (#6474) --- Sources/TuistCore/Cache/CacheCategory.swift | 27 +++++----- .../Cache/CacheDirectoriesProvider.swift | 39 ++------------- .../CacheDirectoriesProviderFactory.swift | 2 +- .../ProjectEditor/ProjectEditor.swift | 2 +- Sources/TuistKit/Services/CleanService.swift | 49 +++++++------------ Sources/TuistKit/Services/EditService.swift | 2 +- Sources/TuistKit/Services/TestService.swift | 2 +- .../Utils/TuistAnalyticsServerBackend.swift | 2 +- .../Loaders/CachedManifestLoader.swift | 2 +- .../TuistLoader/Loaders/ManifestLoader.swift | 2 +- Sources/TuistPlugin/PluginService.swift | 2 +- Sources/TuistServer/Cache/CacheStoring.swift | 8 +-- .../TuistServer/Cache/EmptyCacheStorage.swift | 4 +- .../CacheCategoryParameter+Extras.swift | 2 +- .../Services/CacheExistsService.swift | 4 +- .../Services/GetCacheService.swift | 4 +- .../MultipartUploadCompleteCacheService.swift | 4 +- ...ltipartUploadGenerateURLCacheService.swift | 4 +- .../MultipartUploadStartCacheService.swift | 4 +- .../Services/CleanServiceTests.swift | 14 +++--- .../Services/EditServiceTests.swift | 6 +-- .../Services/TestServiceTests.swift | 6 +-- .../Utils/TuistAnalyticsDispatcherTests.swift | 2 +- .../TuistAnalyticsServerBackendTests.swift | 8 +-- .../Loaders/CachedManifestLoaderTests.swift | 2 +- .../TuistPluginTests/PluginServiceTests.swift | 38 +++++++------- 26 files changed, 98 insertions(+), 143 deletions(-) diff --git a/Sources/TuistCore/Cache/CacheCategory.swift b/Sources/TuistCore/Cache/CacheCategory.swift index 7382771cd39..4835628af8b 100644 --- a/Sources/TuistCore/Cache/CacheCategory.swift +++ b/Sources/TuistCore/Cache/CacheCategory.swift @@ -18,6 +18,12 @@ public enum CacheCategory: String, CaseIterable, RawRepresentable { /// The Tuist Runs cache case runs + /// The Tuist Binaries cache + case binaries + + /// The Tuist Selective Tests cache + case selectiveTests + public var directoryName: String { switch self { case .plugins: @@ -32,20 +38,15 @@ public enum CacheCategory: String, CaseIterable, RawRepresentable { return "EditProjects" case .runs: return "Runs" + case .binaries: + return "Binaries" + case .selectiveTests: + return "SelectiveTests" } } +} - public enum App: String, CaseIterable { - case binaries - case selectiveTests - - public var directoryName: String { - switch self { - case .binaries: - return "BinaryCache" - case .selectiveTests: - return "SelectiveTests" - } - } - } +public enum RemoteCacheCategory { + case binaries + case selectiveTests } diff --git a/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift b/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift index e46d25702e6..909e12d4438 100644 --- a/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift +++ b/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift @@ -7,13 +7,7 @@ import XcodeGraph @Mockable public protocol CacheDirectoriesProviding { /// Returns the cache directory for a Tuist cache category - func tuistCacheDirectory(for category: CacheCategory) throws -> AbsolutePath - - func tuistCloudCacheDirectory(for category: CacheCategory.App) throws -> AbsolutePath - func tuistCloudSelectiveTestsDirectory() throws -> AbsolutePath - func tuistCloudBinaryCacheDirectory() throws -> AbsolutePath - func tuistCloudCacheDirectory() throws -> AbsolutePath - + func cacheDirectory(for category: CacheCategory) throws -> AbsolutePath func cacheDirectory() throws -> AbsolutePath } @@ -28,12 +22,8 @@ public final class CacheDirectoriesProvider: CacheDirectoriesProviding { self.init(fileHandler: FileHandler.shared) } - public func tuistCacheDirectory(for category: CacheCategory) throws -> AbsolutePath { - return CacheDirectoriesProvider.tuistCacheDirectory(for: category, cacheDirectory: try cacheDirectory()) - } - - public static func tuistCacheDirectory(for category: CacheCategory, cacheDirectory: AbsolutePath) -> AbsolutePath { - return cacheDirectory.appending(components: ["tuist", category.directoryName]) + public func cacheDirectory(for category: CacheCategory) throws -> AbsolutePath { + try cacheDirectory().appending(components: ["tuist", category.directoryName]) } public func cacheDirectory() throws -> Path.AbsolutePath { @@ -43,27 +33,4 @@ public final class CacheDirectoriesProvider: CacheDirectoriesProviding { return FileHandler.shared.homeDirectory.appending(components: ".cache") } } - - public static func tuistCloudCacheDirectory(for category: CacheCategory.App, cacheDirectory: AbsolutePath) -> AbsolutePath { - cacheDirectory.appending(components: ["tuist-cloud", category.directoryName]) - } - - public func tuistCloudCacheDirectory(for category: CacheCategory.App) throws -> AbsolutePath { - switch category { - case .binaries: return try tuistCloudBinaryCacheDirectory() - case .selectiveTests: return try tuistCloudSelectiveTestsDirectory() - } - } - - public func tuistCloudSelectiveTestsDirectory() throws -> AbsolutePath { - try tuistCloudCacheDirectory().appending(component: CacheCategory.App.selectiveTests.directoryName) - } - - public func tuistCloudBinaryCacheDirectory() throws -> AbsolutePath { - try tuistCloudCacheDirectory().appending(component: CacheCategory.App.binaries.directoryName) - } - - public func tuistCloudCacheDirectory() throws -> AbsolutePath { - try cacheDirectory().appending(components: ["tuist-cloud"]) - } } diff --git a/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift b/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift index 384b55ea8af..fcc59c1a825 100644 --- a/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift +++ b/Sources/TuistCore/Cache/CacheDirectoriesProviderFactory.swift @@ -13,7 +13,7 @@ public final class CacheDirectoriesProviderFactory: CacheDirectoriesProviderFact public func cacheDirectories() throws -> CacheDirectoriesProviding { let provider = CacheDirectoriesProvider() for category in CacheCategory.allCases { - let directory = try provider.tuistCacheDirectory(for: category) + let directory = try provider.cacheDirectory(for: category) if !FileHandler.shared.exists(directory) { try FileHandler.shared.createFolder(directory) } diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditor.swift b/Sources/TuistKit/ProjectEditor/ProjectEditor.swift index dc549fcfec1..5365d6d3dfd 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditor.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditor.swift @@ -135,7 +135,7 @@ final class ProjectEditor: ProjectEditing { let configPath = manifestFilesLocator.locateConfig(at: editingPath) let cacheDirectory = try cacheDirectoryProviderFactory.cacheDirectories() let projectDescriptionHelpersBuilder = projectDescriptionHelpersBuilderFactory.projectDescriptionHelpersBuilder( - cacheDirectory: try cacheDirectory.tuistCacheDirectory(for: .projectDescriptionHelpers) + cacheDirectory: try cacheDirectory.cacheDirectory(for: .projectDescriptionHelpers) ) let packageManifestPath = manifestFilesLocator.locatePackageManifest(at: editingPath) diff --git a/Sources/TuistKit/Services/CleanService.swift b/Sources/TuistKit/Services/CleanService.swift index eabe19a0dce..b2b54196157 100644 --- a/Sources/TuistKit/Services/CleanService.swift +++ b/Sources/TuistKit/Services/CleanService.swift @@ -6,27 +6,17 @@ import TuistServer import TuistSupport import XcodeGraph -protocol CleanCategory: ExpressibleByArgument & CaseIterable { - func directory( - packageDirectory: AbsolutePath?, - cacheDirectory: AbsolutePath - ) throws -> AbsolutePath? -} - -enum TuistCleanCategory: CleanCategory, Equatable { - static let allCases = CacheCategory.App.allCases.map { .cloud($0) } + CacheCategory.allCases +enum TuistCleanCategory: ExpressibleByArgument, CaseIterable, Equatable { + static let allCases = CacheCategory.allCases .map { .global($0) } + [Self.dependencies] static var allValueStrings: [String] { TuistCleanCategory.allCases.map(\.defaultValueDescription) } - /// The global cache + /// The local global cache case global(CacheCategory) - /// The global cloud cache - case cloud(CacheCategory.App) - /// The local dependencies cache case dependencies @@ -34,8 +24,6 @@ enum TuistCleanCategory: CleanCategory, Equatable { switch self { case let .global(cacheCategory): return cacheCategory.rawValue - case let .cloud(cacheCategory): - return cacheCategory.rawValue case .dependencies: return "dependencies" } @@ -44,8 +32,6 @@ enum TuistCleanCategory: CleanCategory, Equatable { init?(argument: String) { if let cacheCategory = CacheCategory(rawValue: argument) { self = .global(cacheCategory) - } else if let cacheCategory = CacheCategory.App(rawValue: argument) { - self = .cloud(cacheCategory) } else if argument == "dependencies" { self = .dependencies } else { @@ -54,17 +40,11 @@ enum TuistCleanCategory: CleanCategory, Equatable { } func directory( - packageDirectory: AbsolutePath?, - cacheDirectory: AbsolutePath + packageDirectory: AbsolutePath? ) throws -> Path.AbsolutePath? { switch self { case let .global(category): - return CacheDirectoriesProvider.tuistCacheDirectory(for: category, cacheDirectory: cacheDirectory) - case let .cloud(category): - return CacheDirectoriesProvider.tuistCloudCacheDirectory( - for: category, - cacheDirectory: cacheDirectory - ) + return try CacheDirectoriesProvider().cacheDirectory(for: category) case .dependencies: return packageDirectory?.appending( component: Constants.SwiftPackageManager.packageBuildDirectoryName @@ -112,7 +92,7 @@ final class CleanService { } func run( - categories: [some CleanCategory], + categories: [TuistCleanCategory], remote: Bool, path: String? ) async throws { @@ -122,15 +102,20 @@ final class CleanService { FileHandler.shared.currentPath } - let cacheDirectory = try cacheDirectoriesProvider.cacheDirectory() let packageDirectory = manifestFilesLocator.locatePackageManifest(at: resolvedPath)?.parentDirectory for category in categories { - if let directory = try category.directory( - packageDirectory: packageDirectory, - cacheDirectory: cacheDirectory - ), - fileHandler.exists(directory) + let directory: AbsolutePath? + switch category { + case let .global(category): + directory = try cacheDirectoriesProvider.cacheDirectory(for: category) + case .dependencies: + directory = packageDirectory?.appending( + component: Constants.SwiftPackageManager.packageBuildDirectoryName + ) + } + if let directory, + fileHandler.exists(directory) { try FileHandler.shared.delete(directory) logger.notice("Successfully cleaned artifacts at path \(directory.pathString)", metadata: .success) diff --git a/Sources/TuistKit/Services/EditService.swift b/Sources/TuistKit/Services/EditService.swift index 4cd03ebe2a0..565bcf8ee7d 100644 --- a/Sources/TuistKit/Services/EditService.swift +++ b/Sources/TuistKit/Services/EditService.swift @@ -56,7 +56,7 @@ final class EditService { if !permanent { let cacheDirectoryProvider = try cacheDirectoryProviderFactory.cacheDirectories() - let cacheDirectory = try cacheDirectoryProvider.tuistCacheDirectory(for: .editProjects) + let cacheDirectory = try cacheDirectoryProvider.cacheDirectory(for: .editProjects) let cachedManifestDirectory = cacheDirectory.appending(component: path.pathString.md5) guard let selectedXcode = try XcodeController.shared.selected() else { diff --git a/Sources/TuistKit/Services/TestService.swift b/Sources/TuistKit/Services/TestService.swift index 0097944890a..70b2eea95c5 100644 --- a/Sources/TuistKit/Services/TestService.swift +++ b/Sources/TuistKit/Services/TestService.swift @@ -352,7 +352,7 @@ final class TestService { // swiftlint:disable:this type_body_length config: Config ) throws -> AbsolutePath? { let runResultBundlePath = try cacheDirectoryProviderFactory.cacheDirectories() - .tuistCacheDirectory(for: .runs) + .cacheDirectory(for: .runs) .appending(components: runId, Constants.resultBundleName) if config.cloud == nil { diff --git a/Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift b/Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift index 69695449557..fd6c31035d5 100644 --- a/Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift +++ b/Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift @@ -50,7 +50,7 @@ public class TuistAnalyticsServerBackend: TuistAnalyticsBackend { ) let runDirectory = try cacheDirectoriesProviderFactory.cacheDirectories() - .tuistCacheDirectory(for: .runs) + .cacheDirectory(for: .runs) .appending(component: commandEvent.runId) let resultBundle = runDirectory diff --git a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift index a8c7039bb31..270dbeaafc9 100644 --- a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift @@ -54,7 +54,7 @@ public class CachedManifestLoader: ManifestLoading { self.cacheDirectoryProviderFactory = cacheDirectoryProviderFactory self.tuistVersion = tuistVersion cacheDirectory = ThrowableCaching { - try cacheDirectoryProviderFactory.cacheDirectories().tuistCacheDirectory(for: .manifests) + try cacheDirectoryProviderFactory.cacheDirectories().cacheDirectory(for: .manifests) } } diff --git a/Sources/TuistLoader/Loaders/ManifestLoader.swift b/Sources/TuistLoader/Loaders/ManifestLoader.swift index a31f568d1fd..ec711faf02c 100644 --- a/Sources/TuistLoader/Loaders/ManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/ManifestLoader.swift @@ -360,7 +360,7 @@ public class ManifestLoader: ManifestLoading { ] let projectDescriptionHelpersCacheDirectory = try cacheDirectoryProviderFactory .cacheDirectories() - .tuistCacheDirectory(for: .projectDescriptionHelpers) + .cacheDirectory(for: .projectDescriptionHelpers) let projectDescriptionHelperArguments: [String] = try { switch manifest { diff --git a/Sources/TuistPlugin/PluginService.swift b/Sources/TuistPlugin/PluginService.swift index 1f69570b9dd..8d90371ee14 100644 --- a/Sources/TuistPlugin/PluginService.swift +++ b/Sources/TuistPlugin/PluginService.swift @@ -239,7 +239,7 @@ public final class PluginService: PluginServicing { config _: Config ) throws -> AbsolutePath { let cacheDirectories = try cacheDirectoryProviderFactory.cacheDirectories() - let cacheDirectory = try cacheDirectories.tuistCacheDirectory(for: .plugins) + let cacheDirectory = try cacheDirectories.cacheDirectory(for: .plugins) let fingerprint = "\(url)-\(gitId)".md5 return cacheDirectory .appending(component: fingerprint) diff --git a/Sources/TuistServer/Cache/CacheStoring.swift b/Sources/TuistServer/Cache/CacheStoring.swift index ceb6c90346f..f5497fbbd5f 100644 --- a/Sources/TuistServer/Cache/CacheStoring.swift +++ b/Sources/TuistServer/Cache/CacheStoring.swift @@ -39,18 +39,18 @@ public struct CacheStorableItem: Hashable, Equatable { public protocol CacheStoring { func fetch( _ items: Set, - cacheCategory: CacheCategory.App + cacheCategory: RemoteCacheCategory ) async throws -> [CacheStorableItem: AbsolutePath] func store( _ items: [CacheStorableItem: [AbsolutePath]], - cacheCategory: CacheCategory.App + cacheCategory: RemoteCacheCategory ) async throws } extension CacheStoring { public func fetch( _ targets: Set, - cacheCategory: CacheCategory.App + cacheCategory: RemoteCacheCategory ) async throws -> [CacheStorableTarget: AbsolutePath] { Dictionary( uniqueKeysWithValues: try await fetch( @@ -66,7 +66,7 @@ extension CacheStoring { public func store( _ targets: [CacheStorableTarget: [AbsolutePath]], - cacheCategory: CacheCategory.App + cacheCategory: RemoteCacheCategory ) async throws { let items = Dictionary(uniqueKeysWithValues: targets.map { target, paths -> (CacheStorableItem, [AbsolutePath]) in (CacheStorableItem(name: target.name, hash: target.hash), paths) diff --git a/Sources/TuistServer/Cache/EmptyCacheStorage.swift b/Sources/TuistServer/Cache/EmptyCacheStorage.swift index 717682c651e..520c4d9178c 100644 --- a/Sources/TuistServer/Cache/EmptyCacheStorage.swift +++ b/Sources/TuistServer/Cache/EmptyCacheStorage.swift @@ -8,10 +8,10 @@ public final class EmptyCacheStorage: CacheStoring { public func fetch( _: Set, - cacheCategory _: CacheCategory.App + cacheCategory _: RemoteCacheCategory ) async throws -> [CacheStorableItem: AbsolutePath] { [:] } - public func store(_: [CacheStorableItem: [AbsolutePath]], cacheCategory _: CacheCategory.App) async throws {} + public func store(_: [CacheStorableItem: [AbsolutePath]], cacheCategory _: RemoteCacheCategory) async throws {} } diff --git a/Sources/TuistServer/OpenAPI/CacheCategoryParameter+Extras.swift b/Sources/TuistServer/OpenAPI/CacheCategoryParameter+Extras.swift index ca04a644b9e..88c4189a2a4 100644 --- a/Sources/TuistServer/OpenAPI/CacheCategoryParameter+Extras.swift +++ b/Sources/TuistServer/OpenAPI/CacheCategoryParameter+Extras.swift @@ -1,7 +1,7 @@ import TuistCore extension Components.Schemas.CacheCategory { - init(_ cacheCategory: CacheCategory.App) { + init(_ cacheCategory: RemoteCacheCategory) { switch cacheCategory { case .binaries: self = .builds diff --git a/Sources/TuistServer/Services/CacheExistsService.swift b/Sources/TuistServer/Services/CacheExistsService.swift index b5948e7d206..cc8dc114264 100644 --- a/Sources/TuistServer/Services/CacheExistsService.swift +++ b/Sources/TuistServer/Services/CacheExistsService.swift @@ -10,7 +10,7 @@ public protocol CacheExistsServicing { projectId: String, hash: String, name: String, - cacheCategory: CacheCategory.App + cacheCategory: RemoteCacheCategory ) async throws } @@ -48,7 +48,7 @@ public final class CacheExistsService: CacheExistsServicing { projectId: String, hash: String, name: String, - cacheCategory: CacheCategory.App + cacheCategory: RemoteCacheCategory ) async throws { let client = Client.authenticated(serverURL: serverURL) diff --git a/Sources/TuistServer/Services/GetCacheService.swift b/Sources/TuistServer/Services/GetCacheService.swift index 29d2fd70ddf..0eab6a40bc1 100644 --- a/Sources/TuistServer/Services/GetCacheService.swift +++ b/Sources/TuistServer/Services/GetCacheService.swift @@ -10,7 +10,7 @@ public protocol GetCacheServicing { projectId: String, hash: String, name: String, - cacheCategory: CacheCategory.App + cacheCategory: RemoteCacheCategory ) async throws -> ServerCacheArtifact } @@ -48,7 +48,7 @@ public final class GetCacheService: GetCacheServicing { projectId: String, hash: String, name: String, - cacheCategory: CacheCategory.App + cacheCategory: RemoteCacheCategory ) async throws -> ServerCacheArtifact { let client = Client.authenticated(serverURL: serverURL) diff --git a/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift b/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift index b8d2eaf3f64..d27f3938567 100644 --- a/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift +++ b/Sources/TuistServer/Services/MultipartUploadCompleteCacheService.swift @@ -11,7 +11,7 @@ public protocol MultipartUploadCompleteCacheServicing { projectId: String, hash: String, name: String, - cacheCategory: CacheCategory.App, + cacheCategory: RemoteCacheCategory, uploadId: String, parts: [(etag: String, partNumber: Int)] ) async throws @@ -51,7 +51,7 @@ public final class MultipartUploadCompleteCacheService: MultipartUploadCompleteC projectId: String, hash: String, name: String, - cacheCategory: CacheCategory.App, + cacheCategory: RemoteCacheCategory, uploadId: String, parts: [(etag: String, partNumber: Int)] ) async throws { diff --git a/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift b/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift index e3830f309c4..6c70a31f62d 100644 --- a/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift +++ b/Sources/TuistServer/Services/MultipartUploadGenerateURLCacheService.swift @@ -10,7 +10,7 @@ public protocol MultipartUploadGenerateURLCacheServicing { projectId: String, hash: String, name: String, - cacheCategory: CacheCategory.App, + cacheCategory: RemoteCacheCategory, uploadId: String, partNumber: Int ) async throws -> String @@ -50,7 +50,7 @@ public final class MultipartUploadGenerateURLCacheService: MultipartUploadGenera projectId: String, hash: String, name: String, - cacheCategory: CacheCategory.App, + cacheCategory: RemoteCacheCategory, uploadId: String, partNumber: Int ) async throws -> String { diff --git a/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift b/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift index aafd1e6de99..c0b31b6a7dc 100644 --- a/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift +++ b/Sources/TuistServer/Services/MultipartUploadStartCacheService.swift @@ -10,7 +10,7 @@ public protocol MultipartUploadStartCacheServicing { projectId: String, hash: String, name: String, - cacheCategory: CacheCategory.App + cacheCategory: RemoteCacheCategory ) async throws -> String } @@ -48,7 +48,7 @@ public final class MultipartUploadStartCacheService: MultipartUploadStartCacheSe projectId: String, hash: String, name: String, - cacheCategory: CacheCategory.App + cacheCategory: RemoteCacheCategory ) async throws -> String { let client = Client.authenticated(serverURL: serverURL) let response = try await client.startCacheArtifactMultipartUpload(.init(query: .init( diff --git a/Tests/TuistKitTests/Services/CleanServiceTests.swift b/Tests/TuistKitTests/Services/CleanServiceTests.swift index e7da14cb44c..f90e1c448ef 100644 --- a/Tests/TuistKitTests/Services/CleanServiceTests.swift +++ b/Tests/TuistKitTests/Services/CleanServiceTests.swift @@ -58,8 +58,11 @@ final class CleanServiceTests: TuistUnitTestCase { let cachePath = cachePaths[0].parentDirectory.parentDirectory given(cacheDirectoriesProvider) - .cacheDirectory() - .willReturn(cachePath) + .cacheDirectory(for: .value(.manifests)) + .willReturn(cachePaths[0]) + given(cacheDirectoriesProvider) + .cacheDirectory(for: .value(.projectDescriptionHelpers)) + .willReturn(cachePaths[1]) given(rootDirectoryLocator) .locate(from: .any) .willReturn(cachePath) @@ -144,11 +147,10 @@ final class CleanServiceTests: TuistUnitTestCase { func test_run_without_category_cleans_all() async throws { // Given let cachePaths = try createFolders(["tuist/Manifests"]) - let cachePath = cachePaths[0].parentDirectory.parentDirectory given(cacheDirectoriesProvider) - .cacheDirectory() - .willReturn(cachePath) + .cacheDirectory(for: .any) + .willReturn(cachePaths[0]) let projectPath = try temporaryPath() given(rootDirectoryLocator) @@ -204,7 +206,7 @@ final class CleanServiceTests: TuistUnitTestCase { .willReturn(()) given(cacheDirectoriesProvider) - .cacheDirectory() + .cacheDirectory(for: .any) .willReturn(try temporaryPath()) let projectPath = try temporaryPath() diff --git a/Tests/TuistKitTests/Services/EditServiceTests.swift b/Tests/TuistKitTests/Services/EditServiceTests.swift index 7105735b0ac..5054fbb2af9 100644 --- a/Tests/TuistKitTests/Services/EditServiceTests.swift +++ b/Tests/TuistKitTests/Services/EditServiceTests.swift @@ -34,7 +34,7 @@ final class EditServiceTests: XCTestCase { cacheDirectoriesProvider = mockCacheDirectoriesProvider given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .value(.editProjects)) + .cacheDirectory(for: .value(.editProjects)) .willReturn("/Users/tuist/cache/EditProjects") let cacheDirectoryProviderFactory = MockCacheDirectoriesProviderFactoring() @@ -55,7 +55,7 @@ final class EditServiceTests: XCTestCase { func test_edit_uses_caches_directory() async throws { let path: AbsolutePath = "/private/tmp" - let cacheDirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .editProjects) + let cacheDirectory = try cacheDirectoriesProvider.cacheDirectory(for: .editProjects) let projectDirectory = cacheDirectory.appending(component: path.pathString.md5) given(projectEditor!) @@ -79,7 +79,7 @@ final class EditServiceTests: XCTestCase { func test_edit_permanent_does_not_open_workspace() async throws { let path: AbsolutePath = "/private/tmp" - let cacheDirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .editProjects) + let cacheDirectory = try cacheDirectoriesProvider.cacheDirectory(for: .editProjects) let projectDirectory = cacheDirectory.appending(component: path.pathString.md5) given(projectEditor!) diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index a10372c77cf..276e8902495 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -44,7 +44,7 @@ final class TestServiceTests: TuistUnitTestCase { let runsCacheDirectory = try temporaryPath() given(mockCacheDirectoriesProvider) - .tuistCacheDirectory(for: .value(.runs)) + .cacheDirectory(for: .value(.runs)) .willReturn(runsCacheDirectory) configLoader = .init() @@ -924,7 +924,7 @@ final class TestServiceTests: TuistUnitTestCase { givenGenerator() var resultBundlePath: AbsolutePath? let expectedResultBundlePath = try cacheDirectoriesProvider - .tuistCacheDirectory(for: .runs) + .cacheDirectory(for: .runs) .appending(components: "run-id", Constants.resultBundleName) given(xcodebuildController) @@ -974,7 +974,7 @@ final class TestServiceTests: TuistUnitTestCase { let runsCacheDirectory = try temporaryPath() given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .value(.runs)) + .cacheDirectory(for: .value(.runs)) .willReturn(runsCacheDirectory) try fileHandler.createFolder(runsCacheDirectory) diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift index 61f22d9eb54..050d139aa0f 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift @@ -78,7 +78,7 @@ final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { .willReturn(cacheDirectoriesProvider) given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .value(.runs)) + .cacheDirectory(for: .value(.runs)) .willReturn(try temporaryPath()) // When diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift index 74b08ace4b7..272af60c81e 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift @@ -55,7 +55,7 @@ final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { func test_send_when_is_not_ci() async throws { // Given given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .value(.runs)) + .cacheDirectory(for: .value(.runs)) .willReturn(try temporaryPath()) ciChecker.isCIStub = false let event = CommandEvent.test() @@ -82,7 +82,7 @@ final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { func test_send_when_is_ci() async throws { // Given given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .value(.runs)) + .cacheDirectory(for: .value(.runs)) .willReturn(try temporaryPath()) ciChecker.isCIStub = true let event = CommandEvent.test() @@ -124,11 +124,11 @@ final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { ) given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .value(.runs)) + .cacheDirectory(for: .value(.runs)) .willReturn(try temporaryPath()) let resultBundle = try cacheDirectoriesProvider - .tuistCacheDirectory(for: .runs) + .cacheDirectory(for: .runs) .appending(components: event.runId, "\(Constants.resultBundleName).xcresult") try fileHandler.createFolder(resultBundle) diff --git a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift index ab676328b14..029c23e348d 100644 --- a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift @@ -41,7 +41,7 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { .cacheDirectories() .willReturn(cacheDirectoriesProvider) given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .value(.manifests)) + .cacheDirectory(for: .value(.manifests)) .willReturn(cacheDirectory) } catch { XCTFail("Failed to create temporary directory") diff --git a/Tests/TuistPluginTests/PluginServiceTests.swift b/Tests/TuistPluginTests/PluginServiceTests.swift index c3c951b6e30..c4b3cca88ce 100644 --- a/Tests/TuistPluginTests/PluginServiceTests.swift +++ b/Tests/TuistPluginTests/PluginServiceTests.swift @@ -86,13 +86,13 @@ final class PluginServiceTests: TuistUnitTestCase { ] ) given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .any) + .cacheDirectory(for: .any) .willReturn(try temporaryPath()) - let pluginADirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) + let pluginADirectory = try cacheDirectoriesProvider.cacheDirectory(for: .plugins) .appending(component: pluginAFingerprint) - let pluginBDirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) + let pluginBDirectory = try cacheDirectoriesProvider.cacheDirectory(for: .plugins) .appending(component: pluginBFingerprint) - let pluginCDirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) + let pluginCDirectory = try cacheDirectoriesProvider.cacheDirectory(for: .plugins) .appending(component: pluginCFingerprint) try fileHandler.touch( pluginBDirectory.appending(components: PluginServiceConstants.release) @@ -145,7 +145,7 @@ final class PluginServiceTests: TuistUnitTestCase { invokedCheckoutPath = path } given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .any) + .cacheDirectory(for: .any) .willReturn(try temporaryPath()) // When @@ -155,13 +155,13 @@ final class PluginServiceTests: TuistUnitTestCase { XCTAssertEqual(invokedCloneURL, pluginGitURL) XCTAssertEqual( invokedClonePath, - try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) + try cacheDirectoriesProvider.cacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) ) XCTAssertEqual(invokedCheckoutID, pluginGitSha) XCTAssertEqual( invokedCheckoutPath, - try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) + try cacheDirectoriesProvider.cacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) ) } @@ -189,7 +189,7 @@ final class PluginServiceTests: TuistUnitTestCase { invokedCheckoutPath = path } given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .any) + .cacheDirectory(for: .any) .willReturn(try temporaryPath()) // When @@ -199,13 +199,13 @@ final class PluginServiceTests: TuistUnitTestCase { XCTAssertEqual(invokedCloneURL, pluginGitURL) XCTAssertEqual( invokedClonePath, - try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) + try cacheDirectoriesProvider.cacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) ) XCTAssertEqual(invokedCheckoutID, pluginGitTag) XCTAssertEqual( invokedCheckoutPath, - try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) + try cacheDirectoriesProvider.cacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) ) } @@ -223,10 +223,10 @@ final class PluginServiceTests: TuistUnitTestCase { let temporaryDirectory = try temporaryPath() given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .any) + .cacheDirectory(for: .any) .willReturn(temporaryDirectory) - let pluginDirectory = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) + let pluginDirectory = try cacheDirectoriesProvider.cacheDirectory(for: .plugins) .appending(component: pluginFingerprint) try fileHandler.touch( pluginDirectory @@ -279,10 +279,10 @@ final class PluginServiceTests: TuistUnitTestCase { let pluginFingerprint = "\(pluginGitUrl)-\(pluginGitReference)".md5 given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .any) + .cacheDirectory(for: .any) .willReturn(try temporaryPath()) - let cachedPluginPath = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) + let cachedPluginPath = try cacheDirectoriesProvider.cacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) let pluginName = "TestPlugin" @@ -309,7 +309,7 @@ final class PluginServiceTests: TuistUnitTestCase { ), ]) given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .any) + .cacheDirectory(for: .any) .willReturn(try temporaryPath()) // When @@ -360,9 +360,9 @@ final class PluginServiceTests: TuistUnitTestCase { let pluginGitReference = "1.0.0" let pluginFingerprint = "\(pluginGitUrl)-\(pluginGitReference)".md5 given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .any) + .cacheDirectory(for: .any) .willReturn(try temporaryPath()) - let cachedPluginPath = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) + let cachedPluginPath = try cacheDirectoriesProvider.cacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) let pluginName = "TestPlugin" let resourceTemplatesPath = cachedPluginPath.appending(components: "ResourceSynthesizers") @@ -439,9 +439,9 @@ final class PluginServiceTests: TuistUnitTestCase { let pluginGitReference = "1.0.0" let pluginFingerprint = "\(pluginGitUrl)-\(pluginGitReference)".md5 given(cacheDirectoriesProvider) - .tuistCacheDirectory(for: .any) + .cacheDirectory(for: .any) .willReturn(try temporaryPath()) - let cachedPluginPath = try cacheDirectoriesProvider.tuistCacheDirectory(for: .plugins) + let cachedPluginPath = try cacheDirectoriesProvider.cacheDirectory(for: .plugins) .appending(components: pluginFingerprint, PluginServiceConstants.repository) let pluginName = "TestPlugin" let templatePath = cachedPluginPath.appending(components: "Templates", "custom") From d0c1ac1f1be0bfeb3886b15f115f330226d3525c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 3 Jul 2024 15:06:33 +0200 Subject: [PATCH 401/509] Rename shared tuist URLSession for disambiguation (#6478) --- Sources/TuistServer/Client/Client+Server.swift | 4 ++-- Sources/TuistServer/Network/URLSession+Server.swift | 2 +- .../TuistServer/Services/MultipartUploadArtifactService.swift | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/TuistServer/Client/Client+Server.swift b/Sources/TuistServer/Client/Client+Server.swift index 695be59d755..a3282402690 100644 --- a/Sources/TuistServer/Client/Client+Server.swift +++ b/Sources/TuistServer/Client/Client+Server.swift @@ -13,7 +13,7 @@ extension Client { static func authenticated(serverURL: URL) -> Client { .init( serverURL: serverURL, - transport: URLSessionTransport(configuration: .init(session: .shared)), + transport: URLSessionTransport(configuration: .init(session: .tuistShared)), middlewares: commonMiddlewares + [ ServerClientRequestIdMiddleware(), ServerClientCLIMetadataHeadersMiddleware(), @@ -28,7 +28,7 @@ extension Client { static func unauthenticated(serverURL: URL) -> Client { .init( serverURL: serverURL, - transport: URLSessionTransport(configuration: .init(session: .shared)), + transport: URLSessionTransport(configuration: .init(session: .tuistShared)), middlewares: commonMiddlewares ) } diff --git a/Sources/TuistServer/Network/URLSession+Server.swift b/Sources/TuistServer/Network/URLSession+Server.swift index 37b94ab357a..f206c16f3fa 100644 --- a/Sources/TuistServer/Network/URLSession+Server.swift +++ b/Sources/TuistServer/Network/URLSession+Server.swift @@ -21,7 +21,7 @@ private func tuistURLSessionConfiguration() -> URLSessionConfiguration { private var _tuistURLSession: URLSession = .init(configuration: tuistURLSessionConfiguration()) extension URLSession { - public static var shared: URLSession { + public static var tuistShared: URLSession { _tuistURLSession } } diff --git a/Sources/TuistServer/Services/MultipartUploadArtifactService.swift b/Sources/TuistServer/Services/MultipartUploadArtifactService.swift index d39d4518ed1..7f9551ba081 100644 --- a/Sources/TuistServer/Services/MultipartUploadArtifactService.swift +++ b/Sources/TuistServer/Services/MultipartUploadArtifactService.swift @@ -48,7 +48,7 @@ public protocol MultipartUploadArtifactServicing { public final class MultipartUploadArtifactService: MultipartUploadArtifactServicing { private let urlSession: URLSession - public init(urlSession: URLSession = .shared) { + public init(urlSession: URLSession = .tuistShared) { self.urlSession = urlSession } From 81c6f3cba7bc0b0e64b468fc389c2e3c7643642d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 3 Jul 2024 15:07:05 +0200 Subject: [PATCH 402/509] Deprecate cloud in Config in favor of fullHandle and url (#6475) * Deprecate cloud in Config in favor of new properties * Fix failing test_prints_the_manifest_when_config_manifest test --- Sources/ProjectDescription/Config.swift | 11 ++++ .../ConfigGenerationOptions.swift | 10 ++- Sources/TuistCore/Models/Cloud.swift | 41 ------------ Sources/TuistCore/Models/Config.swift | 26 +++++--- .../Models/ConfigGenerationOptions.swift | 5 +- Sources/TuistKit/Commands/TuistCommand.swift | 5 +- .../TuistKit/Services/AnalyticsService.swift | 14 ++--- Sources/TuistKit/Services/AuthService.swift | 4 +- Sources/TuistKit/Services/CleanService.swift | 10 +-- Sources/TuistKit/Services/LogoutService.swift | 4 +- .../OrganizationBillingService.swift | 4 +- .../OrganizationCreateService.swift | 4 +- .../OrganizationDeleteService.swift | 4 +- .../OrganizationInviteService.swift | 6 +- .../OrganizationListService.swift | 4 +- .../OrganizationRemoveInviteService.swift | 4 +- .../OrganizationRemoveMemberService.swift | 4 +- .../OrganizationRemoveSSOService.swift | 4 +- .../OrganizationShowService.swift | 6 +- .../OrganizationUpdateMemberService.swift | 4 +- .../OrganizationUpdateService.swift | 4 +- .../Project/ProjectCreateService.swift | 4 +- .../Project/ProjectDeleteService.swift | 6 +- .../Services/Project/ProjectListService.swift | 4 +- .../Project/ProjectTokenService.swift | 4 +- .../TuistKit/Services/SessionService.swift | 4 +- Sources/TuistKit/Services/TestService.swift | 4 +- .../Utils/TuistAnalyticsServerBackend.swift | 23 ++++--- .../Cloud+ManifestMapper.swift | 48 -------------- .../Config+ManifestMapper.swift | 39 ++++++++++-- .../Utils/ProjectDescription+TestData.swift | 10 ++- .../Models/ServerCacheArtifact.swift | 4 +- .../Services/ServerURLService.swift | 10 +-- Sources/TuistSupport/Constants.swift | 2 +- ...ltipleConfigurationsIntegrationTests.swift | 3 +- .../SwiftPackageManagerInteractorTests.swift | 6 +- .../DumpServiceIntegrationTests.swift | 7 ++- .../Services/AuthServiceTests.swift | 10 +-- .../Services/CleanServiceTests.swift | 6 +- .../Services/LogoutServiceTests.swift | 10 +-- .../OrganizationInviteServiceTests.swift | 12 ++-- .../OrganizationListServiceTests.swift | 6 +- .../OrganizationRemoveSSOServiceTests.swift | 8 +-- .../OrganizationShowServiceTests.swift | 8 +-- .../OrganizationUpdateSSOService.swift | 8 +-- .../Project/ProjectDeleteServiceTests.swift | 14 ++--- .../Project/ProjectListServiceTests.swift | 12 ++-- .../Services/SessionServiceTests.swift | 10 +-- .../Services/TestServiceTests.swift | 2 +- .../Utils/TuistAnalyticsDispatcherTests.swift | 14 ++--- .../TuistAnalyticsServerBackendTests.swift | 24 +++---- .../Loaders/ConfigLoaderTests.swift | 62 ++++++++++++++++++- .../Cloud+ManifestMapperTests.swift | 27 -------- .../TuistPluginTests/PluginServiceTests.swift | 3 +- docs/docs/cloud/get-started.md | 13 +--- .../Tuist/Config.swift | 8 +-- 56 files changed, 314 insertions(+), 299 deletions(-) delete mode 100644 Sources/TuistCore/Models/Cloud.swift delete mode 100644 Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift delete mode 100644 Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift diff --git a/Sources/ProjectDescription/Config.swift b/Sources/ProjectDescription/Config.swift index d3be5c6fabb..566963a7c06 100644 --- a/Sources/ProjectDescription/Config.swift +++ b/Sources/ProjectDescription/Config.swift @@ -38,8 +38,15 @@ public struct Config: Codable, Equatable, Sendable { public let plugins: [PluginLocation] /// Cloud configuration. + @available(*, deprecated, message: "Use the `fullHandle` and `url` properties directly in the `Config`") public let cloud: Cloud? + /// The full project handle such as tuist-org/tuist. + public let fullHandle: String? + + /// The base URL that points to the Tuist server. + public let url: String + /// The Swift tools versions that will be used by Tuist to fetch external dependencies. /// If `nil` is passed then Tuist will use the environment’s version. /// - Note: This **does not** control the `SWIFT_VERSION` build setting in regular generated projects, for this please use @@ -58,6 +65,8 @@ public struct Config: Codable, Equatable, Sendable { public init( compatibleXcodeVersions: CompatibleXcodeVersions = .all, cloud: Cloud? = nil, + fullHandle: String? = nil, + url: String = "https://cloud.tuist.io", swiftVersion: Version? = nil, plugins: [PluginLocation] = [], generationOptions: GenerationOptions = .options() @@ -66,6 +75,8 @@ public struct Config: Codable, Equatable, Sendable { self.plugins = plugins self.generationOptions = generationOptions self.cloud = cloud + self.fullHandle = fullHandle + self.url = url self.swiftVersion = swiftVersion dumpIfNeeded(self) } diff --git a/Sources/ProjectDescription/ConfigGenerationOptions.swift b/Sources/ProjectDescription/ConfigGenerationOptions.swift index aff6f82825f..6cf71078eaa 100644 --- a/Sources/ProjectDescription/ConfigGenerationOptions.swift +++ b/Sources/ProjectDescription/ConfigGenerationOptions.swift @@ -35,13 +35,18 @@ extension Config { /// If not specified, Tuist generates for the first (when alphabetically sorted) debug configuration. public var defaultConfiguration: String? + /// Marks whether the Tuist server authentication is optional. + /// If present, the interaction with the Tuist server will be skipped (instead of failing) if a user is not authenticated. + public var optionalAuthentication: Bool + public static func options( resolveDependenciesWithSystemScm: Bool = false, disablePackageVersionLocking: Bool = false, clonedSourcePackagesDirPath: Path? = nil, staticSideEffectsWarningTargets: StaticSideEffectsWarningTargets = .all, enforceExplicitDependencies: Bool = false, - defaultConfiguration: String? = nil + defaultConfiguration: String? = nil, + optionalAuthentication: Bool = false ) -> Self { self.init( resolveDependenciesWithSystemScm: resolveDependenciesWithSystemScm, @@ -49,7 +54,8 @@ extension Config { clonedSourcePackagesDirPath: clonedSourcePackagesDirPath, staticSideEffectsWarningTargets: staticSideEffectsWarningTargets, enforceExplicitDependencies: enforceExplicitDependencies, - defaultConfiguration: defaultConfiguration + defaultConfiguration: defaultConfiguration, + optionalAuthentication: optionalAuthentication ) } } diff --git a/Sources/TuistCore/Models/Cloud.swift b/Sources/TuistCore/Models/Cloud.swift deleted file mode 100644 index dcf42313f20..00000000000 --- a/Sources/TuistCore/Models/Cloud.swift +++ /dev/null @@ -1,41 +0,0 @@ -import Foundation - -/// Cloud represents the configuration to connect to the server. -public struct Cloud: Equatable, Hashable { - /// Cloud option. - public enum Option: String, Codable, Equatable { - case optional - } - - /// The base URL that points to the cloud server - public let url: URL - - /// The project unique identifier. - public let projectId: String - - /// Cloud options. - public let options: [Option] - - /// Initializes an instance of Cloud. - /// - Parameters: - /// - url: Cloud server base URL. - /// - projectId: Project unique identifier. - /// - options: Cloud options. - public init(url: URL, projectId: String, options: [Option]) { - self.url = url - self.projectId = projectId - self.options = options - } -} - -#if DEBUG - extension Cloud { - public static func test( - url: URL = URL(string: "https://test.tuist.io")!, - projectId: String = "123", - options: [Cloud.Option] = [] - ) -> Cloud { - Cloud(url: url, projectId: projectId, options: options) - } - } -#endif diff --git a/Sources/TuistCore/Models/Config.swift b/Sources/TuistCore/Models/Config.swift index a6833fb69f1..c6885e87786 100644 --- a/Sources/TuistCore/Models/Config.swift +++ b/Sources/TuistCore/Models/Config.swift @@ -1,5 +1,6 @@ import Foundation import Path +import TuistSupport import XcodeGraph /// This model allows to configure Tuist. @@ -13,8 +14,11 @@ public struct Config: Equatable, Hashable { /// List of Xcode versions the project or set of projects is compatible with. public let compatibleXcodeVersions: CompatibleXcodeVersions - /// Cloud configuration. - public let cloud: Cloud? + /// The full project handle such as tuist-org/tuist. + public let fullHandle: String? + + /// The base URL that points to the Tuist server. + public let url: URL /// The version of Swift that will be used by Tuist. /// If `nil` is passed then Tuist will use the environment’s version. @@ -27,7 +31,8 @@ public struct Config: Equatable, Hashable { public static var `default`: Config { Config( compatibleXcodeVersions: .all, - cloud: nil, + fullHandle: nil, + url: Constants.URLs.production, swiftVersion: nil, plugins: [], generationOptions: .init( @@ -50,14 +55,16 @@ public struct Config: Equatable, Hashable { /// - path: The path of the config file. public init( compatibleXcodeVersions: CompatibleXcodeVersions, - cloud: Cloud?, + fullHandle: String?, + url: URL, swiftVersion: Version?, plugins: [PluginLocation], generationOptions: GenerationOptions, path: AbsolutePath? ) { self.compatibleXcodeVersions = compatibleXcodeVersions - self.cloud = cloud + self.fullHandle = fullHandle + self.url = url self.swiftVersion = swiftVersion self.plugins = plugins self.generationOptions = generationOptions @@ -68,7 +75,8 @@ public struct Config: Equatable, Hashable { public func hash(into hasher: inout Hasher) { hasher.combine(generationOptions) - hasher.combine(cloud) + hasher.combine(fullHandle) + hasher.combine(url) hasher.combine(swiftVersion) hasher.combine(compatibleXcodeVersions) } @@ -78,7 +86,8 @@ public struct Config: Equatable, Hashable { extension Config { public static func test( compatibleXcodeVersions: CompatibleXcodeVersions = .all, - cloud: Cloud? = Cloud.test(), + fullHandle: String? = nil, + url: URL = Constants.URLs.production, swiftVersion: Version? = nil, plugins: [PluginLocation] = [], generationOptions: GenerationOptions = Config.default.generationOptions, @@ -86,7 +95,8 @@ public struct Config: Equatable, Hashable { ) -> Config { .init( compatibleXcodeVersions: compatibleXcodeVersions, - cloud: cloud, + fullHandle: fullHandle, + url: url, swiftVersion: swiftVersion, plugins: plugins, generationOptions: generationOptions, diff --git a/Sources/TuistCore/Models/ConfigGenerationOptions.swift b/Sources/TuistCore/Models/ConfigGenerationOptions.swift index b2eeba444dd..fe20e653f31 100644 --- a/Sources/TuistCore/Models/ConfigGenerationOptions.swift +++ b/Sources/TuistCore/Models/ConfigGenerationOptions.swift @@ -14,6 +14,7 @@ extension Config { public let staticSideEffectsWarningTargets: StaticSideEffectsWarningTargets public let enforceExplicitDependencies: Bool public let defaultConfiguration: String? + public var optionalAuthentication: Bool public init( resolveDependenciesWithSystemScm: Bool, @@ -21,7 +22,8 @@ extension Config { clonedSourcePackagesDirPath: AbsolutePath? = nil, staticSideEffectsWarningTargets: StaticSideEffectsWarningTargets = .all, enforceExplicitDependencies: Bool = false, - defaultConfiguration: String? = nil + defaultConfiguration: String? = nil, + optionalAuthentication: Bool = false ) { self.resolveDependenciesWithSystemScm = resolveDependenciesWithSystemScm self.disablePackageVersionLocking = disablePackageVersionLocking @@ -29,6 +31,7 @@ extension Config { self.staticSideEffectsWarningTargets = staticSideEffectsWarningTargets self.enforceExplicitDependencies = enforceExplicitDependencies self.defaultConfiguration = defaultConfiguration + self.optionalAuthentication = optionalAuthentication } } } diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index ff92f5cdbe4..dc7bdd1ff44 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -52,9 +52,10 @@ public struct TuistCommand: AsyncParsableCommand { let backend: TuistAnalyticsBackend? let config = try ConfigLoader().loadConfig(path: path) - if let cloud = config.cloud { + if let fullHandle = config.fullHandle { backend = TuistAnalyticsServerBackend( - config: cloud + fullHandle: fullHandle, + url: config.url ) } else { backend = nil diff --git a/Sources/TuistKit/Services/AnalyticsService.swift b/Sources/TuistKit/Services/AnalyticsService.swift index 7e138c009de..e08ddd57876 100644 --- a/Sources/TuistKit/Services/AnalyticsService.swift +++ b/Sources/TuistKit/Services/AnalyticsService.swift @@ -10,20 +10,20 @@ protocol AnalyticsServicing { } enum AnalyticsServiceError: FatalError, Equatable { - case cloudNotFound + case fullHandleNotFound /// Error description. var description: String { switch self { - case .cloudNotFound: - return "You are missing Cloud configuration in your Config.swift." + case .fullHandleNotFound: + return "You are missing `fullHandle` in your `Config.swift`." } } /// Error type. var type: ErrorType { switch self { - case .cloudNotFound: + case .fullHandleNotFound: return .abort } } @@ -47,10 +47,10 @@ final class AnalyticsService: AnalyticsServicing { let path: AbsolutePath = try self.path(path) let config = try configLoader.loadConfig(path: path) - guard let cloud = config.cloud else { throw AnalyticsServiceError.cloudNotFound } + guard let fullHandle = config.fullHandle else { throw AnalyticsServiceError.fullHandleNotFound } try opener.open( - url: cloud.url - .appendingPathComponent(cloud.projectId) + url: config.url + .appendingPathComponent(fullHandle) ) } diff --git a/Sources/TuistKit/Services/AuthService.swift b/Sources/TuistKit/Services/AuthService.swift index baa484c7faa..83539543f47 100644 --- a/Sources/TuistKit/Services/AuthService.swift +++ b/Sources/TuistKit/Services/AuthService.swift @@ -40,7 +40,7 @@ final class AuthService: AuthServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) - try await serverSessionController.authenticate(serverURL: cloudURL) + let serverURL = try serverURLService.url(configServerURL: config.url) + try await serverSessionController.authenticate(serverURL: serverURL) } } diff --git a/Sources/TuistKit/Services/CleanService.swift b/Sources/TuistKit/Services/CleanService.swift index b2b54196157..14cbd095d00 100644 --- a/Sources/TuistKit/Services/CleanService.swift +++ b/Sources/TuistKit/Services/CleanService.swift @@ -124,11 +124,13 @@ final class CleanService { } } - if remote, let cloud = try configLoader.loadConfig(path: resolvedPath).cloud { - let cloudURL = try serverURLService.url(configServerURL: cloud.url) + if remote { + let config = try configLoader.loadConfig(path: resolvedPath) + guard let fullHandle = config.fullHandle else { return } + let serverURL = try serverURLService.url(configServerURL: config.url) try await cleanCacheService.cleanCache( - serverURL: cloudURL, - fullName: cloud.projectId + serverURL: serverURL, + fullName: fullHandle ) logger.notice("Successfully cleaned the remote storage.") diff --git a/Sources/TuistKit/Services/LogoutService.swift b/Sources/TuistKit/Services/LogoutService.swift index ecc2af535b1..1b9ee43099e 100644 --- a/Sources/TuistKit/Services/LogoutService.swift +++ b/Sources/TuistKit/Services/LogoutService.swift @@ -38,7 +38,7 @@ final class LogoutService: LogoutServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) - try serverSessionController.logout(serverURL: cloudURL) + let serverURL = try serverURLService.url(configServerURL: config.url) + try serverSessionController.logout(serverURL: serverURL) } } diff --git a/Sources/TuistKit/Services/Organization/OrganizationBillingService.swift b/Sources/TuistKit/Services/Organization/OrganizationBillingService.swift index 00de6ea091a..d402b520b4c 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationBillingService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationBillingService.swift @@ -37,9 +37,9 @@ final class OrganizationBillingService: OrganizationBillingServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) try opener.open( - url: cloudURL + url: serverURL .appendingPathComponent(organizationName) .appendingPathComponent("billing") ) diff --git a/Sources/TuistKit/Services/Organization/OrganizationCreateService.swift b/Sources/TuistKit/Services/Organization/OrganizationCreateService.swift index 435696d49a5..3ea09291a3d 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationCreateService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationCreateService.swift @@ -37,11 +37,11 @@ final class OrganizationCreateService: OrganizationCreateServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) let organization = try await createOrganizationService.createOrganization( name: organizationName, - serverURL: cloudURL + serverURL: serverURL ) logger.info("Tuist organization \(organization.name) was successfully created 🎉") diff --git a/Sources/TuistKit/Services/Organization/OrganizationDeleteService.swift b/Sources/TuistKit/Services/Organization/OrganizationDeleteService.swift index 0b32c67b088..8e0f58f9df5 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationDeleteService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationDeleteService.swift @@ -37,11 +37,11 @@ final class OrganizationDeleteService: OrganizationDeleteServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) try await deleteOrganizationService.deleteOrganization( name: organizationName, - serverURL: cloudURL + serverURL: serverURL ) logger.info("Tuist organization \(organizationName) was successfully deleted.") diff --git a/Sources/TuistKit/Services/Organization/OrganizationInviteService.swift b/Sources/TuistKit/Services/Organization/OrganizationInviteService.swift index 343ac2b7c27..4b4669d3b58 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationInviteService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationInviteService.swift @@ -39,15 +39,15 @@ final class OrganizationInviteService: OrganizationInviteServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) let invitation = try await createOrganizationInviteService.createOrganizationInvite( organizationName: organizationName, email: email, - serverURL: cloudURL + serverURL: serverURL ) - let invitationURL = cloudURL + let invitationURL = serverURL .appendingPathComponent("auth") .appendingPathComponent("invitations") .appendingPathComponent(invitation.token) diff --git a/Sources/TuistKit/Services/Organization/OrganizationListService.swift b/Sources/TuistKit/Services/Organization/OrganizationListService.swift index 471cf17da01..63bc04dfb6d 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationListService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationListService.swift @@ -37,10 +37,10 @@ final class OrganizationListService: OrganizationListServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) let organizations = try await listOrganizationsService.listOrganizations( - serverURL: cloudURL + serverURL: serverURL ) if json { diff --git a/Sources/TuistKit/Services/Organization/OrganizationRemoveInviteService.swift b/Sources/TuistKit/Services/Organization/OrganizationRemoveInviteService.swift index 1d4682c394e..9b2ad3a1b96 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationRemoveInviteService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationRemoveInviteService.swift @@ -39,12 +39,12 @@ final class OrganizationRemoveInviteService: OrganizationRemoveInviteServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) try await cancelOrganizationRemoveInviteService.cancelOrganizationInvite( organizationName: organizationName, email: email, - serverURL: cloudURL + serverURL: serverURL ) logger.info("The invitation for \(email) to the \(organizationName) organization was successfully cancelled.") diff --git a/Sources/TuistKit/Services/Organization/OrganizationRemoveMemberService.swift b/Sources/TuistKit/Services/Organization/OrganizationRemoveMemberService.swift index d37cc164f48..eb9635f23fe 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationRemoveMemberService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationRemoveMemberService.swift @@ -39,12 +39,12 @@ final class OrganizationRemoveMemberService: OrganizationRemoveMemberServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) try await removeOrganizationMemberService.removeOrganizationMember( organizationName: organizationName, username: username, - serverURL: cloudURL + serverURL: serverURL ) logger.info("The member \(username) was successfully removed from the \(organizationName) organization.") diff --git a/Sources/TuistKit/Services/Organization/OrganizationRemoveSSOService.swift b/Sources/TuistKit/Services/Organization/OrganizationRemoveSSOService.swift index 2c0100fa865..c2506bae2cb 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationRemoveSSOService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationRemoveSSOService.swift @@ -38,10 +38,10 @@ final class OrganizationRemoveSSOService: OrganizationRemoveSSOServicing { } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) _ = try await updateOrganizationService.updateOrganization( organizationName: organizationName, - serverURL: cloudURL, + serverURL: serverURL, ssoOrganization: nil ) diff --git a/Sources/TuistKit/Services/Organization/OrganizationShowService.swift b/Sources/TuistKit/Services/Organization/OrganizationShowService.swift index d0791d469c3..b960667c1e5 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationShowService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationShowService.swift @@ -42,16 +42,16 @@ final class OrganizationShowService: OrganizationShowServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) let organization = try await getOrganizationService.getOrganization( organizationName: organizationName, - serverURL: cloudURL + serverURL: serverURL ) let organizationUsage = try await getOrganizationUsageService.getOrganizationUsage( organizationName: organizationName, - serverURL: cloudURL + serverURL: serverURL ) if json { diff --git a/Sources/TuistKit/Services/Organization/OrganizationUpdateMemberService.swift b/Sources/TuistKit/Services/Organization/OrganizationUpdateMemberService.swift index 61c780b6bd9..67589b3e218 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationUpdateMemberService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationUpdateMemberService.swift @@ -42,12 +42,12 @@ final class OrganizationUpdateMemberService: OrganizationUpdateMemberServicing { } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) let member = try await updateOrganizationMemberService.updateOrganizationMember( organizationName: organizationName, username: username, role: ServerOrganization.Member.Role(rawValue: role) ?? .user, - serverURL: cloudURL + serverURL: serverURL ) logger.info("The member \(username) role was successfully updated to \(member.role.rawValue).") diff --git a/Sources/TuistKit/Services/Organization/OrganizationUpdateService.swift b/Sources/TuistKit/Services/Organization/OrganizationUpdateService.swift index e8042333c9d..cb71ae9da94 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationUpdateService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationUpdateService.swift @@ -48,10 +48,10 @@ final class OrganizationUpdateSSOService: OrganizationUpdateSSOServicing { ssoOrganization = .google(organizationId) } - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) _ = try await updateOrganizationService.updateOrganization( organizationName: organizationName, - serverURL: cloudURL, + serverURL: serverURL, ssoOrganization: ssoOrganization ) diff --git a/Sources/TuistKit/Services/Project/ProjectCreateService.swift b/Sources/TuistKit/Services/Project/ProjectCreateService.swift index b2bf00210dd..a7b68d3f29a 100644 --- a/Sources/TuistKit/Services/Project/ProjectCreateService.swift +++ b/Sources/TuistKit/Services/Project/ProjectCreateService.swift @@ -38,11 +38,11 @@ final class ProjectCreateService: ProjectCreateServicing { } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) let project = try await createProjectService.createProject( fullHandle: fullHandle, - serverURL: cloudURL + serverURL: serverURL ) logger.info("Tuist project \(project.fullName) was successfully created 🎉") diff --git a/Sources/TuistKit/Services/Project/ProjectDeleteService.swift b/Sources/TuistKit/Services/Project/ProjectDeleteService.swift index 72bc97b8205..538a5acd435 100644 --- a/Sources/TuistKit/Services/Project/ProjectDeleteService.swift +++ b/Sources/TuistKit/Services/Project/ProjectDeleteService.swift @@ -43,16 +43,16 @@ final class ProjectDeleteService: ProjectDeleteServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) let project = try await getProjectService.getProject( fullHandle: fullHandle, - serverURL: cloudURL + serverURL: serverURL ) try await deleteProjectService.deleteProject( projectId: project.id, - serverURL: cloudURL + serverURL: serverURL ) logger.info("Successfully deleted the \(project.fullName) project.") diff --git a/Sources/TuistKit/Services/Project/ProjectListService.swift b/Sources/TuistKit/Services/Project/ProjectListService.swift index 67accd55ea5..dd58ead839a 100644 --- a/Sources/TuistKit/Services/Project/ProjectListService.swift +++ b/Sources/TuistKit/Services/Project/ProjectListService.swift @@ -37,10 +37,10 @@ final class ProjectListService: ProjectListServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) let projects = try await listProjectsService.listProjects( - serverURL: cloudURL + serverURL: serverURL ) if json { diff --git a/Sources/TuistKit/Services/Project/ProjectTokenService.swift b/Sources/TuistKit/Services/Project/ProjectTokenService.swift index 5a150d0d74b..6937257dcdc 100644 --- a/Sources/TuistKit/Services/Project/ProjectTokenService.swift +++ b/Sources/TuistKit/Services/Project/ProjectTokenService.swift @@ -40,11 +40,11 @@ final class ProjectTokenService: ProjectTokenServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) + let serverURL = try serverURLService.url(configServerURL: config.url) let project = try await getProjectService.getProject( fullHandle: fullHandle, - serverURL: cloudURL + serverURL: serverURL ) logger.info(.init(stringLiteral: project.token)) diff --git a/Sources/TuistKit/Services/SessionService.swift b/Sources/TuistKit/Services/SessionService.swift index 7c4efbb6829..333a269e7ef 100644 --- a/Sources/TuistKit/Services/SessionService.swift +++ b/Sources/TuistKit/Services/SessionService.swift @@ -42,7 +42,7 @@ final class SessionService: SessionServicing { directoryPath = FileHandler.shared.currentPath } let config = try configLoader.loadConfig(path: directoryPath) - let cloudURL = try serverURLService.url(configServerURL: config.cloud?.url) - try serverSessionController.printSession(serverURL: cloudURL) + let serverURL = try serverURLService.url(configServerURL: config.url) + try serverSessionController.printSession(serverURL: serverURL) } } diff --git a/Sources/TuistKit/Services/TestService.swift b/Sources/TuistKit/Services/TestService.swift index 70b2eea95c5..c3ae2ec0c3f 100644 --- a/Sources/TuistKit/Services/TestService.swift +++ b/Sources/TuistKit/Services/TestService.swift @@ -241,7 +241,7 @@ final class TestService { // swiftlint:disable:this type_body_length ) defer { - if let resultBundlePath, let passedResultBundlePath, config.cloud != nil { + if let resultBundlePath, let passedResultBundlePath, config.fullHandle != nil { if !FileHandler.shared.exists(resultBundlePath.parentDirectory) { try? FileHandler.shared.createFolder(resultBundlePath.parentDirectory) } @@ -355,7 +355,7 @@ final class TestService { // swiftlint:disable:this type_body_length .cacheDirectory(for: .runs) .appending(components: runId, Constants.resultBundleName) - if config.cloud == nil { + if config.fullHandle == nil { return passedResultBundlePath } else { return passedResultBundlePath ?? runResultBundlePath diff --git a/Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift b/Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift index fd6c31035d5..94bd7115588 100644 --- a/Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift +++ b/Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift @@ -8,16 +8,21 @@ import TuistSupport import XcodeGraph public class TuistAnalyticsServerBackend: TuistAnalyticsBackend { - private let config: Cloud + private let fullHandle: String + private let url: URL private let createCommandEventService: CreateCommandEventServicing private let fileHandler: FileHandling private let ciChecker: CIChecking private let cacheDirectoriesProviderFactory: CacheDirectoriesProviderFactoring private let analyticsArtifactUploadService: AnalyticsArtifactUploadServicing - public convenience init(config: Cloud) { + public convenience init( + fullHandle: String, + url: URL + ) { self.init( - config: config, + fullHandle: fullHandle, + url: url, createCommandEventService: CreateCommandEventService(), fileHandler: FileHandler.shared, ciChecker: CIChecker(), @@ -27,14 +32,16 @@ public class TuistAnalyticsServerBackend: TuistAnalyticsBackend { } public init( - config: Cloud, + fullHandle: String, + url: URL, createCommandEventService: CreateCommandEventServicing, fileHandler: FileHandling, ciChecker: CIChecking, cacheDirectoriesProviderFactory: CacheDirectoriesProviderFactoring, analyticsArtifactUploadService: AnalyticsArtifactUploadServicing ) { - self.config = config + self.fullHandle = fullHandle + self.url = url self.createCommandEventService = createCommandEventService self.fileHandler = fileHandler self.ciChecker = ciChecker @@ -45,8 +52,8 @@ public class TuistAnalyticsServerBackend: TuistAnalyticsBackend { public func send(commandEvent: CommandEvent) async throws { let cloudCommandEvent = try await createCommandEventService.createCommandEvent( commandEvent: commandEvent, - projectId: config.projectId, - serverURL: config.url + projectId: fullHandle, + serverURL: url ) let runDirectory = try cacheDirectoriesProviderFactory.cacheDirectories() @@ -65,7 +72,7 @@ public class TuistAnalyticsServerBackend: TuistAnalyticsBackend { targetHashes: targetHashes, graphPath: graphPath, commandEventId: cloudCommandEvent.id, - serverURL: config.url + serverURL: url ) } diff --git a/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift deleted file mode 100644 index 6aa23a69c42..00000000000 --- a/Sources/TuistLoader/Models+ManifestMappers/Cloud+ManifestMapper.swift +++ /dev/null @@ -1,48 +0,0 @@ -import Foundation -import Path -import ProjectDescription -import TuistCore -import TuistSupport -import XcodeGraph - -enum CloudManifestMapperError: FatalError { - /// Thrown when the cloud URL is invalid. - case invalidServerURL(String) - - /// Error type. - var type: ErrorType { - switch self { - case .invalidServerURL: return .abort - } - } - - /// Error description. - var description: String { - switch self { - case let .invalidServerURL(url): - return "The server URL '\(url)' is not a valid URL" - } - } -} - -extension TuistCore.Cloud { - static func from(manifest: ProjectDescription.Cloud) throws -> TuistCore.Cloud { - var cloudURL: URL! - if let manifestServerURL = URL(string: manifest.url.dropSuffix("/")) { - cloudURL = manifestServerURL - } else { - throw CloudManifestMapperError.invalidServerURL(manifest.url) - } - let options = manifest.options.compactMap(TuistCore.Cloud.Option.from) - return TuistCore.Cloud(url: cloudURL, projectId: manifest.projectId, options: options) - } -} - -extension TuistCore.Cloud.Option { - static func from(manifest: ProjectDescription.Cloud.Option) -> TuistCore.Cloud.Option? { - switch manifest { - case .optional: - return .optional - } - } -} diff --git a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift index d13f3599cc0..24ef17d0ccb 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift @@ -6,6 +6,26 @@ import TuistCore import TuistSupport import XcodeGraph +enum ConfigManifestMapperError: FatalError { + /// Thrown when the server URL is invalid. + case invalidServerURL(String) + + /// Error type. + var type: ErrorType { + switch self { + case .invalidServerURL: return .abort + } + } + + /// Error description. + var description: String { + switch self { + case let .invalidServerURL(url): + return "The server URL '\(url)' is not a valid URL" + } + } +} + extension TuistCore.Config { /// Maps a ProjectDescription.Config instance into a XcodeGraph.Config model. /// - Parameters: @@ -13,7 +33,7 @@ extension TuistCore.Config { /// - path: The path of the config file. static func from(manifest: ProjectDescription.Config, at path: AbsolutePath) throws -> TuistCore.Config { let generatorPaths = GeneratorPaths(manifestDirectory: path) - let generationOptions = try TuistCore.Config.GenerationOptions.from( + var generationOptions = try TuistCore.Config.GenerationOptions.from( manifest: manifest.generationOptions, generatorPaths: generatorPaths ) @@ -26,14 +46,25 @@ extension TuistCore.Config { swiftVersion = nil } - var cloud: TuistCore.Cloud? + let fullHandle: String? + let urlString: String if let manifestCloud = manifest.cloud { - cloud = try TuistCore.Cloud.from(manifest: manifestCloud) + fullHandle = manifestCloud.projectId + urlString = manifestCloud.url + generationOptions.optionalAuthentication = manifestCloud.options.contains(.optional) + } else { + fullHandle = manifest.fullHandle + urlString = manifest.url + } + + guard let url = URL(string: urlString.dropSuffix("/")) else { + throw ConfigManifestMapperError.invalidServerURL(manifest.url) } return TuistCore.Config( compatibleXcodeVersions: compatibleXcodeVersions, - cloud: cloud, + fullHandle: fullHandle, + url: url, swiftVersion: swiftVersion.map { .init(stringLiteral: $0.description) }, plugins: plugins, generationOptions: generationOptions, diff --git a/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift b/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift index da0b58977e5..2fa57c13bbf 100644 --- a/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift +++ b/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift @@ -1,13 +1,21 @@ import Foundation +import TuistSupport @testable import ProjectDescription #if DEBUG extension Config { public static func test( + fullHandle: String? = nil, + url: String = Constants.URLs.production.absoluteString, generationOptions: Config.GenerationOptions = .options(), plugins: [PluginLocation] = [] ) -> Config { - Config(plugins: plugins, generationOptions: generationOptions) + Config( + fullHandle: fullHandle, + url: url, + plugins: plugins, + generationOptions: generationOptions + ) } } diff --git a/Sources/TuistServer/Models/ServerCacheArtifact.swift b/Sources/TuistServer/Models/ServerCacheArtifact.swift index 59665ac8ed0..d79e1962b8e 100644 --- a/Sources/TuistServer/Models/ServerCacheArtifact.swift +++ b/Sources/TuistServer/Models/ServerCacheArtifact.swift @@ -42,10 +42,10 @@ extension ServerCacheArtifact { } } -#if MOCKING +#if DEBUG extension ServerCacheArtifact { public static func test( - url: URL = URL(string: Constants.URLs.production)!, + url: URL = Constants.URLs.production, expiresAt: Int = 0 ) -> Self { .init( diff --git a/Sources/TuistServer/Services/ServerURLService.swift b/Sources/TuistServer/Services/ServerURLService.swift index d10d29a7447..b8f2b13aa69 100644 --- a/Sources/TuistServer/Services/ServerURLService.swift +++ b/Sources/TuistServer/Services/ServerURLService.swift @@ -24,19 +24,19 @@ enum ServerURLServiceError: FatalError { @Mockable public protocol ServerURLServicing { - func url(configServerURL: URL?) throws -> URL + func url(configServerURL: URL) throws -> URL } public final class ServerURLService: ServerURLServicing { public init() {} - public func url(configServerURL: URL?) throws -> URL { - guard let cloudURL = ProcessInfo.processInfo.environment["TUIST_URL"] - .map(URL.init(string:)) ?? configServerURL ?? URL(string: Constants.URLs.production) + public func url(configServerURL: URL) throws -> URL { + guard let serverURL = ProcessInfo.processInfo.environment["TUIST_URL"] + .map(URL.init(string:)) ?? configServerURL else { throw ServerURLServiceError.invalidServerURL } - return cloudURL + return serverURL } } diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 6905de5b407..5f851c33d97 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -74,6 +74,6 @@ public enum Constants { } public enum URLs { - public static let production = "https://cloud.tuist.io/" + public static let production = URL(string: "https://cloud.tuist.io")! } } diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift index 8a6156aa34c..56316b7c37b 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift @@ -380,7 +380,8 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { private func createConfig() -> Config { Config( compatibleXcodeVersions: .all, - cloud: nil, + fullHandle: nil, + url: Constants.URLs.production, swiftVersion: nil, plugins: [], generationOptions: .test(), diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift index 1d1c96a3b65..9e538e07e36 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/SwiftPackageManagerInteractorTests.swift @@ -60,7 +60,8 @@ final class SwiftPackageManagerInteractorTests: TuistUnitTestCase { let temporaryPath = try temporaryPath() let config = Config( compatibleXcodeVersions: .all, - cloud: nil, + fullHandle: nil, + url: Constants.URLs.production, swiftVersion: nil, plugins: [], generationOptions: .test(resolveDependenciesWithSystemScm: true), @@ -183,7 +184,8 @@ final class SwiftPackageManagerInteractorTests: TuistUnitTestCase { let temporaryPath = try temporaryPath() let config = Config( compatibleXcodeVersions: .all, - cloud: nil, + fullHandle: nil, + url: Constants.URLs.production, swiftVersion: nil, plugins: [], generationOptions: .test(clonedSourcePackagesDirPath: temporaryPath.appending(component: "spm")), diff --git a/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift b/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift index d0fb950d114..1f8071d2e6d 100644 --- a/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift +++ b/Tests/TuistKitIntegrationTests/Commands/DumpServiceIntegrationTests.swift @@ -148,7 +148,7 @@ final class DumpServiceTests: TuistTestCase { let config = Config( compatibleXcodeVersions: .all, - cloud: nil, + fullHandle: "tuist/tuist", swiftVersion: nil, plugins: [], generationOptions: .options() @@ -168,9 +168,11 @@ final class DumpServiceTests: TuistTestCase { } }, + "fullHandle": "tuist/tuist", "generationOptions": { "disablePackageVersionLocking": false, "enforceExplicitDependencies": false, + "optionalAuthentication": false, "resolveDependenciesWithSystemScm": false, "staticSideEffectsWarningTargets": { "all": { @@ -180,7 +182,8 @@ final class DumpServiceTests: TuistTestCase { }, "plugins": [ - ] + ], + "url": "https://cloud.tuist.io" } """ diff --git a/Tests/TuistKitTests/Services/AuthServiceTests.swift b/Tests/TuistKitTests/Services/AuthServiceTests.swift index 9d86bfb902c..7f841cf2fb0 100644 --- a/Tests/TuistKitTests/Services/AuthServiceTests.swift +++ b/Tests/TuistKitTests/Services/AuthServiceTests.swift @@ -15,17 +15,17 @@ import XCTest final class AuthServiceTests: TuistUnitTestCase { private var serverSessionController: MockServerSessionControlling! private var configLoader: MockConfigLoading! - private var cloudURL: URL! + private var serverURL: URL! private var subject: AuthService! override func setUp() { super.setUp() serverSessionController = .init() configLoader = MockConfigLoading() - cloudURL = URL(string: "https://test.cloud.tuist.io")! + serverURL = URL(string: "https://test.cloud.tuist.io")! given(configLoader) .loadConfig(path: .any) - .willReturn(.test(cloud: .test(url: cloudURL))) + .willReturn(.test(url: serverURL)) subject = AuthService( serverSessionController: serverSessionController, @@ -36,7 +36,7 @@ final class AuthServiceTests: TuistUnitTestCase { override func tearDown() { serverSessionController = nil configLoader = nil - cloudURL = nil + serverURL = nil subject = nil super.tearDown() } @@ -44,7 +44,7 @@ final class AuthServiceTests: TuistUnitTestCase { func test_authenticate() async throws { // Given given(serverSessionController) - .authenticate(serverURL: .value(cloudURL)) + .authenticate(serverURL: .value(serverURL)) .willReturn(()) // When / Then diff --git a/Tests/TuistKitTests/Services/CleanServiceTests.swift b/Tests/TuistKitTests/Services/CleanServiceTests.swift index f90e1c448ef..56f67f943e0 100644 --- a/Tests/TuistKitTests/Services/CleanServiceTests.swift +++ b/Tests/TuistKitTests/Services/CleanServiceTests.swift @@ -187,10 +187,8 @@ final class CleanServiceTests: TuistUnitTestCase { .loadConfig(path: .any) .willReturn( Config.test( - cloud: Cloud.test( - url: url, - projectId: "tuist/tuist" - ) + fullHandle: "tuist/tuist", + url: url ) ) diff --git a/Tests/TuistKitTests/Services/LogoutServiceTests.swift b/Tests/TuistKitTests/Services/LogoutServiceTests.swift index a200e6b3239..79f44b9030d 100644 --- a/Tests/TuistKitTests/Services/LogoutServiceTests.swift +++ b/Tests/TuistKitTests/Services/LogoutServiceTests.swift @@ -17,14 +17,14 @@ final class LogoutServiceTests: TuistUnitTestCase { private var serverSessionController: MockServerSessionControlling! private var subject: LogoutService! private var configLoader: MockConfigLoading! - private var cloudURL: URL! + private var serverURL: URL! override func setUp() { super.setUp() serverSessionController = MockServerSessionControlling() configLoader = MockConfigLoading() - cloudURL = URL(string: "https://test.cloud.tuist.io")! - given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) + serverURL = URL(string: "https://test.cloud.tuist.io")! + given(configLoader).loadConfig(path: .any).willReturn(.test(url: serverURL)) subject = LogoutService( serverSessionController: serverSessionController, configLoader: configLoader @@ -33,7 +33,7 @@ final class LogoutServiceTests: TuistUnitTestCase { override func tearDown() { serverSessionController = nil - cloudURL = nil + serverURL = nil configLoader = nil subject = nil super.tearDown() @@ -42,7 +42,7 @@ final class LogoutServiceTests: TuistUnitTestCase { func test_logout() throws { // Given given(serverSessionController) - .logout(serverURL: .value(cloudURL)) + .logout(serverURL: .value(serverURL)) .willReturn(()) // When / Then diff --git a/Tests/TuistKitTests/Services/Organization/OrganizationInviteServiceTests.swift b/Tests/TuistKitTests/Services/Organization/OrganizationInviteServiceTests.swift index 5beda92e3be..829e7968d8c 100644 --- a/Tests/TuistKitTests/Services/Organization/OrganizationInviteServiceTests.swift +++ b/Tests/TuistKitTests/Services/Organization/OrganizationInviteServiceTests.swift @@ -12,15 +12,15 @@ final class OrganizationInviteServiceTests: TuistUnitTestCase { private var createOrganizationInviteService: MockCreateOrganizationInviteServicing! private var subject: OrganizationInviteService! private var configLoader: MockConfigLoading! - private var cloudURL: URL! + private var serverURL: URL! override func setUp() { super.setUp() createOrganizationInviteService = .init() configLoader = MockConfigLoading() - cloudURL = URL(string: "https://test.cloud.tuist.io")! - given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) + serverURL = URL(string: "https://test.cloud.tuist.io")! + given(configLoader).loadConfig(path: .any).willReturn(.test(url: serverURL)) subject = OrganizationInviteService( createOrganizationInviteService: createOrganizationInviteService, configLoader: configLoader @@ -30,7 +30,7 @@ final class OrganizationInviteServiceTests: TuistUnitTestCase { override func tearDown() { createOrganizationInviteService = nil configLoader = nil - cloudURL = nil + serverURL = nil subject = nil super.tearDown() } @@ -41,7 +41,7 @@ final class OrganizationInviteServiceTests: TuistUnitTestCase { .createOrganizationInvite( organizationName: .value("tuist"), email: .value("tuist@test.io"), - serverURL: .value(cloudURL) + serverURL: .value(serverURL) ) .willReturn( .test( @@ -61,7 +61,7 @@ final class OrganizationInviteServiceTests: TuistUnitTestCase { XCTAssertPrinterOutputContains(""" tuist@test.io was successfully invited to the tuist organization 🎉 - You can also share with them the invite link directly: \(cloudURL.absoluteString)/auth/invitations/invitation-token + You can also share with them the invite link directly: \(serverURL.absoluteString)/auth/invitations/invitation-token """) } } diff --git a/Tests/TuistKitTests/Services/Organization/OrganizationListServiceTests.swift b/Tests/TuistKitTests/Services/Organization/OrganizationListServiceTests.swift index a53685b5235..e4d922cac7e 100644 --- a/Tests/TuistKitTests/Services/Organization/OrganizationListServiceTests.swift +++ b/Tests/TuistKitTests/Services/Organization/OrganizationListServiceTests.swift @@ -12,15 +12,15 @@ final class OrganizationListServiceTests: TuistUnitTestCase { private var listOrganizationsService: MockListOrganizationsServicing! private var subject: OrganizationListService! private var configLoader: MockConfigLoading! - private var cloudURL: URL! + private var serverURL: URL! override func setUp() { super.setUp() listOrganizationsService = .init() configLoader = MockConfigLoading() - cloudURL = URL(string: "https://test.cloud.tuist.io")! - given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) + serverURL = URL(string: "https://test.cloud.tuist.io")! + given(configLoader).loadConfig(path: .any).willReturn(.test(url: serverURL)) subject = OrganizationListService( listOrganizationsService: listOrganizationsService, diff --git a/Tests/TuistKitTests/Services/Organization/OrganizationRemoveSSOServiceTests.swift b/Tests/TuistKitTests/Services/Organization/OrganizationRemoveSSOServiceTests.swift index 8d34c08eb77..77f81695669 100644 --- a/Tests/TuistKitTests/Services/Organization/OrganizationRemoveSSOServiceTests.swift +++ b/Tests/TuistKitTests/Services/Organization/OrganizationRemoveSSOServiceTests.swift @@ -12,15 +12,15 @@ final class OrganizationRemoveSSOServiceTests: TuistUnitTestCase { private var updateOrganizationService: MockUpdateOrganizationServicing! private var subject: OrganizationRemoveSSOService! private var configLoader: MockConfigLoading! - private var cloudURL: URL! + private var serverURL: URL! override func setUp() { super.setUp() updateOrganizationService = .init() configLoader = MockConfigLoading() - cloudURL = URL(string: "https://test.cloud.tuist.io")! - given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) + serverURL = URL(string: "https://test.cloud.tuist.io")! + given(configLoader).loadConfig(path: .any).willReturn(.test(url: serverURL)) subject = OrganizationRemoveSSOService( updateOrganizationService: updateOrganizationService, @@ -41,7 +41,7 @@ final class OrganizationRemoveSSOServiceTests: TuistUnitTestCase { given(updateOrganizationService) .updateOrganization( organizationName: .value("tuist"), - serverURL: .value(cloudURL), + serverURL: .value(serverURL), ssoOrganization: .value(nil) ) .willReturn(.test()) diff --git a/Tests/TuistKitTests/Services/Organization/OrganizationShowServiceTests.swift b/Tests/TuistKitTests/Services/Organization/OrganizationShowServiceTests.swift index a30b2b53b71..bbfc33a04e7 100644 --- a/Tests/TuistKitTests/Services/Organization/OrganizationShowServiceTests.swift +++ b/Tests/TuistKitTests/Services/Organization/OrganizationShowServiceTests.swift @@ -13,15 +13,15 @@ final class OrganizationShowServiceTests: TuistUnitTestCase { private var getOrganizationUsageService: MockGetOrganizationUsageServicing! private var subject: OrganizationShowService! private var configLoader: MockConfigLoading! - private var cloudURL: URL! + private var serverURL: URL! override func setUp() { super.setUp() getOrganizationService = .init() getOrganizationUsageService = .init() configLoader = MockConfigLoading() - cloudURL = URL(string: "https://test.cloud.tuist.io")! - given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) + serverURL = URL(string: "https://test.cloud.tuist.io")! + given(configLoader).loadConfig(path: .any).willReturn(.test(url: serverURL)) subject = OrganizationShowService( getOrganizationService: getOrganizationService, getOrganizationUsageService: getOrganizationUsageService, @@ -33,7 +33,7 @@ final class OrganizationShowServiceTests: TuistUnitTestCase { getOrganizationService = nil getOrganizationUsageService = nil configLoader = nil - cloudURL = nil + serverURL = nil subject = nil super.tearDown() diff --git a/Tests/TuistKitTests/Services/Organization/OrganizationUpdateSSOService.swift b/Tests/TuistKitTests/Services/Organization/OrganizationUpdateSSOService.swift index 2f66dacb4f9..b2f4e9932a9 100644 --- a/Tests/TuistKitTests/Services/Organization/OrganizationUpdateSSOService.swift +++ b/Tests/TuistKitTests/Services/Organization/OrganizationUpdateSSOService.swift @@ -12,15 +12,15 @@ final class OrganizationUpdateSSOServiceTests: TuistUnitTestCase { private var updateOrganizationService: MockUpdateOrganizationServicing! private var subject: OrganizationUpdateSSOService! private var configLoader: MockConfigLoading! - private var cloudURL: URL! + private var serverURL: URL! override func setUp() { super.setUp() updateOrganizationService = .init() configLoader = MockConfigLoading() - cloudURL = URL(string: "https://test.cloud.tuist.io")! - given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) + serverURL = URL(string: "https://test.cloud.tuist.io")! + given(configLoader).loadConfig(path: .any).willReturn(.test(url: serverURL)) subject = OrganizationUpdateSSOService( updateOrganizationService: updateOrganizationService, @@ -41,7 +41,7 @@ final class OrganizationUpdateSSOServiceTests: TuistUnitTestCase { given(updateOrganizationService) .updateOrganization( organizationName: .value("tuist"), - serverURL: .value(cloudURL), + serverURL: .value(serverURL), ssoOrganization: .value(.google("tuist.io")) ) .willReturn(.test()) diff --git a/Tests/TuistKitTests/Services/Project/ProjectDeleteServiceTests.swift b/Tests/TuistKitTests/Services/Project/ProjectDeleteServiceTests.swift index 3b4be12360b..5461963f3a1 100644 --- a/Tests/TuistKitTests/Services/Project/ProjectDeleteServiceTests.swift +++ b/Tests/TuistKitTests/Services/Project/ProjectDeleteServiceTests.swift @@ -14,7 +14,7 @@ final class ProjectDeleteServiceTests: TuistUnitTestCase { private var deleteProjectService: MockDeleteProjectServicing! private var credentialsStore: MockServerCredentialsStoring! private var configLoader: MockConfigLoading! - private var cloudURL: URL! + private var serverURL: URL! private var subject: ProjectDeleteService! override func setUp() { @@ -24,8 +24,8 @@ final class ProjectDeleteServiceTests: TuistUnitTestCase { deleteProjectService = .init() credentialsStore = .init() configLoader = MockConfigLoading() - cloudURL = URL(string: "https://test.cloud.tuist.io")! - given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) + serverURL = URL(string: "https://test.cloud.tuist.io")! + given(configLoader).loadConfig(path: .any).willReturn(.test(url: serverURL)) subject = ProjectDeleteService( deleteProjectService: deleteProjectService, getProjectService: getProjectService, @@ -39,7 +39,7 @@ final class ProjectDeleteServiceTests: TuistUnitTestCase { getProjectService = nil credentialsStore = nil configLoader = nil - cloudURL = nil + serverURL = nil subject = nil super.tearDown() @@ -50,7 +50,7 @@ final class ProjectDeleteServiceTests: TuistUnitTestCase { given(getProjectService) .getProject( fullHandle: .value("tuist-org/tuist"), - serverURL: .value(cloudURL) + serverURL: .value(serverURL) ) .willReturn( .test(id: 0, fullName: "tuist-org/tuist") @@ -58,12 +58,12 @@ final class ProjectDeleteServiceTests: TuistUnitTestCase { given(deleteProjectService) .deleteProject( projectId: .value(0), - serverURL: .value(cloudURL) + serverURL: .value(serverURL) ) .willReturn(()) given(credentialsStore) - .get(serverURL: .value(cloudURL)) + .get(serverURL: .value(serverURL)) .willReturn(.init(token: "token")) // When / Then diff --git a/Tests/TuistKitTests/Services/Project/ProjectListServiceTests.swift b/Tests/TuistKitTests/Services/Project/ProjectListServiceTests.swift index d310968af78..5b847363d3b 100644 --- a/Tests/TuistKitTests/Services/Project/ProjectListServiceTests.swift +++ b/Tests/TuistKitTests/Services/Project/ProjectListServiceTests.swift @@ -11,14 +11,14 @@ final class ProjectListServiceTests: TuistUnitTestCase { private var listProjectsService: MockListProjectsServicing! private var subject: ProjectListService! private var configLoader: MockConfigLoading! - private var cloudURL: URL! + private var serverURL: URL! override func setUp() { super.setUp() listProjectsService = .init() configLoader = MockConfigLoading() - cloudURL = URL(string: "https://test.cloud.tuist.io")! - given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) + serverURL = URL(string: "https://test.cloud.tuist.io")! + given(configLoader).loadConfig(path: .any).willReturn(.test(url: serverURL)) subject = ProjectListService( listProjectsService: listProjectsService, configLoader: configLoader @@ -28,7 +28,7 @@ final class ProjectListServiceTests: TuistUnitTestCase { override func tearDown() { listProjectsService = nil configLoader = nil - cloudURL = nil + serverURL = nil subject = nil super.tearDown() @@ -37,7 +37,7 @@ final class ProjectListServiceTests: TuistUnitTestCase { func test_project_list() async throws { // Given given(listProjectsService) - .listProjects(serverURL: .value(cloudURL)) + .listProjects(serverURL: .value(serverURL)) .willReturn( [ .test(id: 0, fullName: "tuist/test-one"), @@ -59,7 +59,7 @@ final class ProjectListServiceTests: TuistUnitTestCase { func test_project_list_when_none() async throws { // Given given(listProjectsService) - .listProjects(serverURL: .value(cloudURL)) + .listProjects(serverURL: .value(serverURL)) .willReturn([]) // When diff --git a/Tests/TuistKitTests/Services/SessionServiceTests.swift b/Tests/TuistKitTests/Services/SessionServiceTests.swift index ba4be883f7c..3a9b1debf42 100644 --- a/Tests/TuistKitTests/Services/SessionServiceTests.swift +++ b/Tests/TuistKitTests/Services/SessionServiceTests.swift @@ -17,14 +17,14 @@ final class SessionServiceTests: TuistUnitTestCase { private var serverSessionController: MockServerSessionControlling! private var subject: SessionService! private var configLoader: MockConfigLoading! - private var cloudURL: URL! + private var serverURL: URL! override func setUp() { super.setUp() serverSessionController = MockServerSessionControlling() configLoader = MockConfigLoading() - cloudURL = URL(string: "https://test.cloud.tuist.io")! - given(configLoader).loadConfig(path: .any).willReturn(.test(cloud: .test(url: cloudURL))) + serverURL = URL(string: "https://test.cloud.tuist.io")! + given(configLoader).loadConfig(path: .any).willReturn(.test(url: serverURL)) subject = SessionService( serverSessionController: serverSessionController, configLoader: configLoader @@ -34,7 +34,7 @@ final class SessionServiceTests: TuistUnitTestCase { override func tearDown() { serverSessionController = nil configLoader = nil - cloudURL = nil + serverURL = nil subject = nil super.tearDown() } @@ -42,7 +42,7 @@ final class SessionServiceTests: TuistUnitTestCase { func test_printSession() throws { // Given given(serverSessionController) - .printSession(serverURL: .value(cloudURL)) + .printSession(serverURL: .value(serverURL)) .willReturn(()) // When / Then diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index 276e8902495..c5f22ea66cb 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -968,7 +968,7 @@ final class TestServiceTests: TuistUnitTestCase { .loadConfig(path: .any) .willReturn( .test( - cloud: .test() + fullHandle: "tuist/tuist" ) ) diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift index 050d139aa0f..9a9c4d71b82 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift @@ -36,11 +36,11 @@ final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { func testDispatch_whenCloudAnalyticsIsEnabled_sendsToCloud() throws { // Given - let projectID = "project" - let cloudURL = URL.test() - let cloud = Cloud(url: cloudURL, projectId: projectID, options: []) + let fullHandle = "project" + let url = URL.test() let backend = TuistAnalyticsServerBackend( - config: cloud, + fullHandle: fullHandle, + url: url, createCommandEventService: createCommandEventService, fileHandler: fileHandler, ciChecker: ciChecker, @@ -56,8 +56,8 @@ final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { commandEvent: .matching { commandEvent in commandEvent.name == Self.commandEvent.name }, - projectId: .value(projectID), - serverURL: .value(cloudURL) + projectId: .value(fullHandle), + serverURL: .value(url) ) .willReturn(.test(id: 10)) @@ -67,7 +67,7 @@ final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { targetHashes: .any, graphPath: .any, commandEventId: .value(10), - serverURL: .value(cloudURL) + serverURL: .value(url) ) .willReturn(()) diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift index 272af60c81e..0497110bcee 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift @@ -10,7 +10,7 @@ import XCTest @testable import TuistSupportTesting final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { - private var config: Cloud! + private var fullHandle = "tuist-org/tuist" private var createCommandEventService: MockCreateCommandEventServicing! private var ciChecker: MockCIChecker! private var cacheDirectoriesProviderFactory: MockCacheDirectoriesProviderFactoring! @@ -20,10 +20,6 @@ final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { override func setUpWithError() throws { super.setUp() - config = Cloud.test( - url: URL(string: "https://cloud.tuist.io")!, - projectId: "tuist-org/tuist" - ) createCommandEventService = .init() ciChecker = .init() cacheDirectoriesProviderFactory = .init() @@ -33,7 +29,8 @@ final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { .cacheDirectories() .willReturn(cacheDirectoriesProvider) subject = TuistAnalyticsServerBackend( - config: config, + fullHandle: fullHandle, + url: Constants.URLs.production, createCommandEventService: createCommandEventService, fileHandler: fileHandler, ciChecker: ciChecker, @@ -43,7 +40,6 @@ final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { } override func tearDown() { - config = nil createCommandEventService = nil ciChecker = nil cacheDirectoriesProviderFactory = nil @@ -62,8 +58,8 @@ final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { given(createCommandEventService) .createCommandEvent( commandEvent: .value(event), - projectId: .value(config.projectId), - serverURL: .value(config.url) + projectId: .value(fullHandle), + serverURL: .value(Constants.URLs.production) ) .willReturn( .test( @@ -89,8 +85,8 @@ final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { given(createCommandEventService) .createCommandEvent( commandEvent: .value(event), - projectId: .value(config.projectId), - serverURL: .value(config.url) + projectId: .value(fullHandle), + serverURL: .value(Constants.URLs.production) ) .willReturn( .test( @@ -113,8 +109,8 @@ final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { given(createCommandEventService) .createCommandEvent( commandEvent: .value(event), - projectId: .value(config.projectId), - serverURL: .value(config.url) + projectId: .value(fullHandle), + serverURL: .value(Constants.URLs.production) ) .willReturn( .test( @@ -138,7 +134,7 @@ final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { targetHashes: .any, graphPath: .any, commandEventId: .value(10), - serverURL: .value(config.url) + serverURL: .value(Constants.URLs.production) ) .willReturn(()) diff --git a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift index 3113ac3af76..07e0aba29c9 100644 --- a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift @@ -80,7 +80,8 @@ final class ConfigLoaderTests: TuistUnitTestCase { // Then XCTAssertEqual(result, TuistCore.Config( compatibleXcodeVersions: .all, - cloud: nil, + fullHandle: nil, + url: Constants.URLs.production, swiftVersion: nil, plugins: [], generationOptions: .test(), @@ -121,7 +122,64 @@ final class ConfigLoaderTests: TuistUnitTestCase { // Then XCTAssertEqual(result, TuistCore.Config( compatibleXcodeVersions: .all, - cloud: nil, + fullHandle: nil, + url: Constants.URLs.production, + swiftVersion: nil, + plugins: [], + generationOptions: .test(), + path: "/project/Tuist/Config.swift" + )) + } + + func test_loadConfig_with_full_handle_and_url() throws { + // Given + stub(rootDirectory: "/project") + stub(path: "/project/Tuist/Config.swift", exists: true) + stub( + config: .test( + fullHandle: "tuist/tuist", + url: "https://test.cloud.tuist.io" + ), + at: "/project/Tuist" + ) + + // When + let result = try subject.loadConfig(path: "/project") + + // Then + XCTAssertBetterEqual(result, TuistCore.Config( + compatibleXcodeVersions: .all, + fullHandle: "tuist/tuist", + url: try XCTUnwrap(URL(string: "https://test.cloud.tuist.io")), + swiftVersion: nil, + plugins: [], + generationOptions: .test(), + path: "/project/Tuist/Config.swift" + )) + } + + func test_loadConfig_with_deprecated_cloud() throws { + // Given + stub(rootDirectory: "/project") + stub(path: "/project/Tuist/Config.swift", exists: true) + stub( + config: ProjectDescription.Config( + cloud: .cloud( + projectId: "tuist/tuist", + url: "https://test.cloud.tuist.io" + ) + ), + at: "/project/Tuist" + ) + + // When + let result = try subject.loadConfig(path: "/project") + + // Then + XCTAssertBetterEqual(result, TuistCore.Config( + compatibleXcodeVersions: .all, + fullHandle: "tuist/tuist", + url: try XCTUnwrap(URL(string: "https://test.cloud.tuist.io")), swiftVersion: nil, plugins: [], generationOptions: .test(), diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift deleted file mode 100644 index 96775125c38..00000000000 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Cloud+ManifestMapperTests.swift +++ /dev/null @@ -1,27 +0,0 @@ -import Foundation -import TuistCore -import XCTest - -@testable import TuistLoader -@testable import TuistSupportTesting - -final class CloudManifestMapperTests: TuistUnitTestCase { - func test_removes_trailing_back_slash_if_present_in_url() throws { - // When - let got = try TuistCore.Cloud.from( - manifest: .cloud( - projectId: "tuist/tuist", - url: "https://cloud.tuist.io/" - ) - ) - - // Then - XCTAssertEqual( - got, - .test( - url: URL(string: "https://cloud.tuist.io")!, - projectId: "tuist/tuist" - ) - ) - } -} diff --git a/Tests/TuistPluginTests/PluginServiceTests.swift b/Tests/TuistPluginTests/PluginServiceTests.swift index c4b3cca88ce..e3a7bfdbfb9 100644 --- a/Tests/TuistPluginTests/PluginServiceTests.swift +++ b/Tests/TuistPluginTests/PluginServiceTests.swift @@ -481,7 +481,8 @@ final class PluginServiceTests: TuistUnitTestCase { private func mockConfig(plugins: [TuistCore.PluginLocation]) -> TuistCore.Config { TuistCore.Config( compatibleXcodeVersions: .all, - cloud: nil, + fullHandle: nil, + url: Constants.URLs.production, swiftVersion: nil, plugins: plugins, generationOptions: .test(), diff --git a/docs/docs/cloud/get-started.md b/docs/docs/cloud/get-started.md index 7274dd03be9..0b5a0fbd2f1 100644 --- a/docs/docs/cloud/get-started.md +++ b/docs/docs/cloud/get-started.md @@ -60,17 +60,10 @@ The next step is to create a project. You can easily do that with the following ::: code-group ```bash [Project under user account] -<<<<<<< HEAD -tuist cloud project create my-account/my-project +tuist project create my-account/my-project ``` ```bash [Project under organization] -tuist cloud project create my-organization/my-project -======= -tuist project create my-project -``` -```bash [Project under organization] -tuist project create my-project -o my-organization ->>>>>>> e5897c3c7 (Flatten cloud commands to tuist) +tuist project create my-organization/my-project ``` ::: @@ -79,7 +72,7 @@ After creating the project, modify your `Tuist/Config.swift` file to reference t ```swift import ProjectDescription -let config = Config(cloud: .cloud(projectId: "my-organization/my-project")) +let config = Config(fullHandle: "my-organization/my-project") ``` > [!TIP] PROJECT IDENTIFIER diff --git a/fixtures/ios_app_with_frameworks/Tuist/Config.swift b/fixtures/ios_app_with_frameworks/Tuist/Config.swift index baac59c1e69..08971659be8 100644 --- a/fixtures/ios_app_with_frameworks/Tuist/Config.swift +++ b/fixtures/ios_app_with_frameworks/Tuist/Config.swift @@ -1,9 +1,9 @@ import ProjectDescription let config = Config( - cloud: .cloud( - projectId: "tuist/tuist-cloud-acceptance-tests", - url: "https://cloud-canary.tuist.io", - options: [.optional] + fullHandle: "tuist/tuist-cloud-acceptance-tests", + url: "https://cloud-canary.tuist.io", + generationOptions: .options( + optionalAuthentication: true ) ) From 8dfd327b1a0a74ec97aaff06de021b1a4564a745 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 3 Jul 2024 15:07:33 +0200 Subject: [PATCH 403/509] Deprecate the usage TUIST_CONFIG_CLOUD_TOKEN in favor of TUIST_CONFIG_TOKEN (#6476) --- Project.swift | 4 ++-- .../Commands/Project/ProjectTokenCommand.swift | 2 +- .../Utilities/ServerAuthenticationController.swift | 10 +++++++++- Sources/TuistSupport/Constants.swift | 4 +++- docs/docs/cloud/get-started.md | 2 +- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Project.swift b/Project.swift index 608b885c025..5ac45514722 100644 --- a/Project.swift +++ b/Project.swift @@ -45,7 +45,7 @@ func schemes() -> [Scheme] { "TUIST_CONFIG_SRCROOT": "$(SRCROOT)", "TUIST_FRAMEWORK_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", "CI": "true", - "TUIST_CONFIG_CLOUD_TOKEN": "i1932DHAyBwEtHCsRYyE2Ub6ReHNwQ", + "TUIST_CONFIG_TOKEN": "i1932DHAyBwEtHCsRYyE2Ub6ReHNwQ", ] ) ) @@ -97,7 +97,7 @@ func schemes() -> [Scheme] { "TUIST_CONFIG_SRCROOT": "$(SRCROOT)", "TUIST_FRAMEWORK_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", "CI": "true", - "TUIST_CONFIG_CLOUD_TOKEN": "i1932DHAyBwEtHCsRYyE2Ub6ReHNwQ", + "TUIST_CONFIG_TOKEN": "i1932DHAyBwEtHCsRYyE2Ub6ReHNwQ", ] ) ) diff --git a/Sources/TuistKit/Commands/Project/ProjectTokenCommand.swift b/Sources/TuistKit/Commands/Project/ProjectTokenCommand.swift index 1ac5f03275d..d22ce7a0f91 100644 --- a/Sources/TuistKit/Commands/Project/ProjectTokenCommand.swift +++ b/Sources/TuistKit/Commands/Project/ProjectTokenCommand.swift @@ -8,7 +8,7 @@ struct ProjectTokenCommand: AsyncParsableCommand { CommandConfiguration( commandName: "token", _superCommandName: "project", - abstract: "Get a project token. You can save this token in the `TUIST_CONFIG_CLOUD_TOKEN` environment variable to use the remote cache on the CI." + abstract: "Get a project token. You can save this token in the `TUIST_CONFIG_TOKEN` environment variable to use the remote cache on the CI." ) } diff --git a/Sources/TuistServer/Utilities/ServerAuthenticationController.swift b/Sources/TuistServer/Utilities/ServerAuthenticationController.swift index 324bbc03afe..c3b6e911980 100644 --- a/Sources/TuistServer/Utilities/ServerAuthenticationController.swift +++ b/Sources/TuistServer/Utilities/ServerAuthenticationController.swift @@ -55,7 +55,15 @@ public final class ServerAuthenticationController: ServerAuthenticationControlli public func authenticationToken(serverURL: URL) throws -> ServerAuthenticationToken? { if ciChecker.isCI() { let environment = environmentVariables() - return environment[Constants.EnvironmentVariables.token].map { .project($0) } + if let deprecatedToken = environment[Constants.EnvironmentVariables.deprecatedToken] { + logger + .warning( + "Use `TUIST_CONFIG_TOKEN` environment variable instead of `TUIST_CONFIG_CLOUD_TOKEN` to authenticate on the CI" + ) + return .project(deprecatedToken) + } else { + return environment[Constants.EnvironmentVariables.token].map { .project($0) } + } } else { return (try credentialsStore.read(serverURL: serverURL)?.token).map { .user($0) } } diff --git a/Sources/TuistSupport/Constants.swift b/Sources/TuistSupport/Constants.swift index 5f851c33d97..e166a4b0fb8 100644 --- a/Sources/TuistSupport/Constants.swift +++ b/Sources/TuistSupport/Constants.swift @@ -70,7 +70,9 @@ public enum Constants { public static let osLog = "TUIST_CONFIG_OS_LOG" /// `tuistBinaryPath` is used for specifying the exact tuist binary in tuist tasks. public static let tuistBinaryPath = "TUIST_CONFIG_BINARY_PATH" - public static let token = "TUIST_CONFIG_CLOUD_TOKEN" + public static let token = "TUIST_CONFIG_TOKEN" + @available(*, deprecated, message: "Use `token` instead") + public static let deprecatedToken = "TUIST_CONFIG_CLOUD_TOKEN" } public enum URLs { diff --git a/docs/docs/cloud/get-started.md b/docs/docs/cloud/get-started.md index 0b5a0fbd2f1..b61d16d42c6 100644 --- a/docs/docs/cloud/get-started.md +++ b/docs/docs/cloud/get-started.md @@ -92,7 +92,7 @@ For CI environments, authentication is managed differently; it's done using **pr tuist project token my-organization/my-project ``` -You will then need to set the token as an environment variable named `TUIST_CONFIG_CLOUD_TOKEN` to make it accessible. +You will then need to set the token as an environment variable named `TUIST_CONFIG_TOKEN` to make it accessible. > [!NOTE] EXPOSING SECRET ENVIRONMENT VARIABLES IN CI ENVIRONMENTS > How environment secret environment variables are exposed in CI environments varies depending on the CI provider. Ensure you follow the guidelines provided by your CI provider to securely manage these tokens. From 10ecf629bb66df43b2ccb0249593d9927247f40e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 3 Jul 2024 15:07:50 +0200 Subject: [PATCH 404/509] Rename CLI headers sent to the server (#6477) --- .../Client/ServerClientCLIMetadataHeadersMiddleware.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift b/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift index c46ea8bce94..e686b2a4cfd 100644 --- a/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift +++ b/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift @@ -14,8 +14,8 @@ struct ServerClientCLIMetadataHeadersMiddleware: ClientMiddleware { next: (Request, URL) async throws -> Response ) async throws -> Response { var request = request - request.headerFields.append(.init(name: "x-tuist-cloud-cli-release-date", value: releaseDate)) - request.headerFields.append(.init(name: "x-tuist-cloud-cli-version", value: Constants.version)) + request.headerFields.append(.init(name: "x-tuist-cli-release-date", value: releaseDate)) + request.headerFields.append(.init(name: "x-tuist-cli-version", value: Constants.version)) return try await next(request, baseURL) } } From 66c59fcf62533e668c04a0445314a97fe7509e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 3 Jul 2024 18:00:09 +0200 Subject: [PATCH 405/509] Remove invalid @testable annotation in ProjectDescription TestData (#6479) --- Sources/TuistLoader/Utils/ProjectDescription+TestData.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift b/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift index 2fa57c13bbf..74da7fb2d5c 100644 --- a/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift +++ b/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift @@ -1,6 +1,6 @@ import Foundation import TuistSupport -@testable import ProjectDescription +import ProjectDescription #if DEBUG extension Config { From abd0f7689673e46cfd8ba3f3eaec0192ef8db36d Mon Sep 17 00:00:00 2001 From: fortmarek Date: Wed, 3 Jul 2024 18:13:32 +0200 Subject: [PATCH 406/509] Fix compilation issue in ProjectDescription+TestData.swift --- Sources/TuistLoader/Utils/ProjectDescription+TestData.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift b/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift index 74da7fb2d5c..d0fddceee82 100644 --- a/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift +++ b/Sources/TuistLoader/Utils/ProjectDescription+TestData.swift @@ -1,8 +1,9 @@ import Foundation import TuistSupport -import ProjectDescription #if DEBUG + @testable import ProjectDescription + extension Config { public static func test( fullHandle: String? = nil, From 85d64c529ba2499a566c36e353103210232cb790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 4 Jul 2024 08:55:47 +0200 Subject: [PATCH 407/509] Fix Okta callback url (#6481) --- docs/docs/cloud/on-premise.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/cloud/on-premise.md b/docs/docs/cloud/on-premise.md index d45be442f82..322f51e4e88 100644 --- a/docs/docs/cloud/on-premise.md +++ b/docs/docs/cloud/on-premise.md @@ -108,7 +108,7 @@ You can enable authentication with Okta through the [OAuth 2.0](https://oauth.ne - **App integration name:** `Tuist Cloud` - **Grant type:** Enable *Authorization Code* for *Client acting on behalf of a user* -- **Sign-in redirect URL:** `{url}/users/auth/github/callback` where `url` is the public URL your service is accessed through. +- **Sign-in redirect URL:** `{url}/users/auth/okta/callback` where `url` is the public URL your service is accessed through. - **Assignments:** This configuration will depend on your security team requirements. If you'd like Tuist Cloud to detect when a user is removed from the application, you'll have to configure an [event hook](https://help.okta.com/en-us/content/topics/automation-hooks/event-hooks-main.htm). In your Okta organization, go to **Workflow > Event Hooks** and create a new event hook with the following data: From 6864dd791daa3b54996d92ed971e4c6b80314ad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 5 Jul 2024 09:26:01 +0200 Subject: [PATCH 408/509] Update Okta docs for on-premise (#6489) --- docs/docs/cloud/on-premise.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/docs/docs/cloud/on-premise.md b/docs/docs/cloud/on-premise.md index 322f51e4e88..1a7680473bb 100644 --- a/docs/docs/cloud/on-premise.md +++ b/docs/docs/cloud/on-premise.md @@ -111,14 +111,6 @@ You can enable authentication with Okta through the [OAuth 2.0](https://oauth.ne - **Sign-in redirect URL:** `{url}/users/auth/okta/callback` where `url` is the public URL your service is accessed through. - **Assignments:** This configuration will depend on your security team requirements. -If you'd like Tuist Cloud to detect when a user is removed from the application, you'll have to configure an [event hook](https://help.okta.com/en-us/content/topics/automation-hooks/event-hooks-main.htm). In your Okta organization, go to **Workflow > Event Hooks** and create a new event hook with the following data: - -- **Name:** Notify memberhip removal to Tuist Cloud -- **URL:** `{url}/webhooks/okta` where `url` is the public URL your service is accessed through. -- **Authentication field:** `Authorization` -- **Authentication secret:** A token that Tuist Cloud uses to validate the webhooks. -- **Subscribe to events** Include *User unassigned from app* - Once the app is created you'll need to set the following environment variables: | Environment variable | Description | Required | Default | Example | @@ -126,10 +118,6 @@ Once the app is created you'll need to set the following environment variables: | `TUIST_OKTA_SITE` | The URL of your Okta organization | Yes | | `https://your-org.okta.com` | | `TUIST_OKTA_CLIENT_ID` | The client ID to authenticate against Okta | Yes | | | | `TUIST_OKTA_CLIENT_SECRET` | The client secret to authenticate against Okta | Yes | | | -| `TUIST_OKTA_AUTHORIZE_URL` | The authorize URL | No | `{OKTA_SITE}/oauth2//v1/authorize` | | -| `TUIST_OKTA_TOKEN_URL` | The token URL | No | `{OKTA_SITE}/oauth2//v1/token` | | -| `TUIST_OKTA_USER_INFO_URL` | The token URL | No | `{OKTA_SITE}/oauth2//v1/userinfo` | | -| `TUIST_OKTA_EVENT_HOOK_SECRET` | A secret to validat event hooks delivered by Okta | No | | ### Storage environment configuration From 5deeef5e09306ff92df002d3239677a8d4476822 Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Mon, 8 Jul 2024 16:13:36 +0100 Subject: [PATCH 409/509] Update migrate-from-xcodeproj.md (#6493) --- .../introduction/adopting-tuist/migrate-from-xcodeproj.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md b/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md index 6896de4555b..c9c043fe23e 100644 --- a/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md +++ b/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md @@ -66,6 +66,12 @@ You can use a tool like [xcdiff](https://github.com/bloomberg/xcdiff) for that. They allow defining your own abstractions for defining your projects, and most importantly, they allow reusing content across all your manifest files. One of the most common use cases is defining functions that act as factories of templated projects. After migrating all your projects, go through the Project.swift files to identify common patterns and extract them into helpers. +## Manual Migration + +Now that you've extracted your settings into config files and cleaned up your exsisting project files you need to manually migrate your project over to Tuist. There are a couple of ways to do this; +- Create empty `Project.swift` and `Tuist/Config.swift` files, and run `tuist edit` to start filling them in. +- Run `tuist init` in a different directory and copy over the files created there for your own project. + ## Tools Here's a list of community-developed tools that can aid you on the migration process: From ca5b2e6896744a8b04d468f6b38a8f44ee447f48 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 17:15:54 +0200 Subject: [PATCH 410/509] add dansinclair25 as a contributor for doc (#6494) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 646ba35fc78..3796e491cd3 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1437,6 +1437,15 @@ "contributions": [ "code" ] + }, + { + "login": "dansinclair25", + "name": "Dan Sinclair", + "avatar_url": "https://avatars.githubusercontent.com/u/2573447?v=4", + "profile": "https://github.com/dansinclair25", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 3fd3538a710..2b747af5723 100644 --- a/README.md +++ b/README.md @@ -566,6 +566,7 @@ Thanks goes to these wonderful people:
    Binlogo

    Dmitry Serov

    Dariusz Rybicki
    +
    Dan Sinclair
    From 834051405f8969e79bd7c7312dc268621c26fba0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 10:56:31 +0200 Subject: [PATCH 411/509] add rofle100lvl as a contributor for code (#6498) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3796e491cd3..2dd5150d485 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1353,7 +1353,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/45801227?v=4", "profile": "https://github.com/rofle100lvl", "contributions": [ - "doc" + "doc", + "code" ] }, { From d54c27ae4d647acf1514fb76d929fe1f08192aa8 Mon Sep 17 00:00:00 2001 From: Jaewon-Yun Date: Thu, 11 Jul 2024 01:01:41 +0900 Subject: [PATCH 412/509] Fix not generating test targets on SPM package (#6483) * Fix not generating test targets on SPM package * Make more explicit --- .../PackageInfoMapper.swift | 10 +-- .../PackageInfoMapperTests.swift | 63 +++++++++++++++++++ fixtures/spm_package/Package.resolved | 9 +++ fixtures/spm_package/Package.swift | 3 + 4 files changed, 80 insertions(+), 5 deletions(-) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 0062d3fb40d..f7f35d3a399 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -468,11 +468,11 @@ public final class PackageInfoMapper: PackageInfoMapping { destinations = Set([.mac]) case .test: var testDestinations = Set(XcodeGraph.Destination.allCases) - let dependencyNames = target.dependencies.map(\.name) - for dependencyName in dependencyNames { - let dependencyProducts = targetToProducts[dependencyName] ?? Set() - let destinations = unionDestinationsOfProducts(dependencyProducts, in: productDestinations) - testDestinations.formIntersection(destinations) + for dependencyTarget in target.dependencies { + if let dependencyProducts = targetToProducts[dependencyTarget.name] { + let dependencyDestinations = unionDestinationsOfProducts(dependencyProducts, in: productDestinations) + testDestinations.formIntersection(dependencyDestinations) + } } destinations = ProjectDescription.Destinations.from(destinations: testDestinations) default: diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 0c064016cf7..a3e7898091d 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -3549,6 +3549,69 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ) ) } + + func testMap_whenSwiftPackageHasTestTargetWithExternalDependency() throws { + // Given + let basePath = try temporaryPath() + let sourcesPath = basePath.appending(components: ["Package", "Sources", "Target"]) + try fileHandler.createFolder(sourcesPath) + let testsPath = basePath.appending(components: ["Package", "Tests", "TargetTests"]) + try fileHandler.createFolder(testsPath) + + // When + let project = try subject.map( + package: "Package", + basePath: basePath, + packageType: .local, + packageInfos: [ + "Package": .test( + name: "Package", + products: [ + .init(name: "Product", type: .library(.automatic), targets: ["Target"]), + ], + targets: [ + .test(name: "Target"), + .test( + name: "TargetTests", + type: .test, + dependencies: [ + .target(name: "Target", condition: nil), + .product(name: "External", package: "External", moduleAliases: nil, condition: nil), + ] + ), + ] + ), + ] + ) + + // Then + XCTAssertBetterEqual( + project, + .test( + name: "Package", + options: .options( + automaticSchemesOptions: .enabled(), + disableSynthesizedResourceAccessors: true + ), + settings: .settings(), + targets: [ + .test("Target", basePath: basePath), + .test( + "TargetTests", + basePath: basePath, + product: .unitTests, + customSources: .custom(.sourceFilesList(globs: [ + "\(testsPath.pathString)/**", + ])), + dependencies: [ + .target(name: "Target"), + .external(name: "External", condition: nil), + ] + ), + ] + ) + ) + } } private func defaultSpmResources(_ target: String, customPath: String? = nil) -> ProjectDescription.ResourceFileElements { diff --git a/fixtures/spm_package/Package.resolved b/fixtures/spm_package/Package.resolved index 77cc37ca78a..aa5401102b4 100644 --- a/fixtures/spm_package/Package.resolved +++ b/fixtures/spm_package/Package.resolved @@ -8,6 +8,15 @@ "revision" : "b2fa556e4e48cbf06cf8c63def138c98f4b811fa", "version" : "5.8.0" } + }, + { + "identity" : "ohhttpstubs", + "kind" : "remoteSourceControl", + "location" : "https://github.com/AliSoftware/OHHTTPStubs.git", + "state" : { + "revision" : "12f19662426d0434d6c330c6974d53e2eb10ecd9", + "version" : "9.1.0" + } } ], "version" : 2 diff --git a/fixtures/spm_package/Package.swift b/fixtures/spm_package/Package.swift index 97c34238b4d..1a5afb74ea7 100644 --- a/fixtures/spm_package/Package.swift +++ b/fixtures/spm_package/Package.swift @@ -39,6 +39,7 @@ let package = Package( ], dependencies: [ .package(url: "https://github.com/Alamofire/Alamofire", exact: "5.8.0"), + .package(url: "https://github.com/AliSoftware/OHHTTPStubs.git", exact: "9.1.0"), ], targets: [ // Targets are the basic building blocks of a package, defining a module or a test suite. @@ -69,6 +70,8 @@ let package = Package( dependencies: [ "MyPackage", "MyCommonPackage", + .product(name: "OHHTTPStubs", package: "OHHTTPStubs"), + .product(name: "OHHTTPStubsSwift", package: "OHHTTPStubs"), ] ), .testTarget( From e1b6830b7068294e7b6892d19ad0d6c328c64b62 Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Wed, 10 Jul 2024 12:02:20 -0400 Subject: [PATCH 413/509] Remove `PrintableString` (#6496) * Remove `PrintableString` * Migrate ServerSessionController to `notice` * Linting --- Sources/TuistKit/Services/EditService.swift | 2 +- .../Session/ServerSessionController.swift | 7 +- .../TuistSupport/Utils/PrintableString.swift | 159 ------------------ .../Utils/PrintableStringTests.swift | 103 ------------ 4 files changed, 7 insertions(+), 264 deletions(-) delete mode 100644 Sources/TuistSupport/Utils/PrintableString.swift delete mode 100644 Tests/TuistSupportTests/Utils/PrintableStringTests.swift diff --git a/Sources/TuistKit/Services/EditService.swift b/Sources/TuistKit/Services/EditService.swift index 565bcf8ee7d..0b446252740 100644 --- a/Sources/TuistKit/Services/EditService.swift +++ b/Sources/TuistKit/Services/EditService.swift @@ -69,7 +69,7 @@ final class EditService { onlyCurrentDirectory: onlyCurrentDirectory, plugins: plugins ) - logger.pretty("Opening Xcode to edit the project.") + logger.notice("Opening Xcode to edit the project.", metadata: .pretty) try opener.open(path: workspacePath, application: selectedXcode.path, wait: false) } else { diff --git a/Sources/TuistServer/Session/ServerSessionController.swift b/Sources/TuistServer/Session/ServerSessionController.swift index 496f18c6448..0674ea4f341 100644 --- a/Sources/TuistServer/Session/ServerSessionController.swift +++ b/Sources/TuistServer/Session/ServerSessionController.swift @@ -67,7 +67,12 @@ public final class ServerSessionController: ServerSessionControlling { logger.notice("Opening \(authURL.absoluteString) to start the authentication flow") try opener.open(url: authURL) - logger.pretty("Press \(.keystroke("CTRL + C")) once to cancel the process.") + if Environment.shared.shouldOutputBeColoured { + logger.notice("Press \("CTRL + C".cyan()) once to cancel the process.", metadata: .pretty) + } else { + logger.notice("Press CTRL + C once to cancel the process.") + } + let token = try await getAuthToken( serverURL: serverURL, deviceCode: deviceCode diff --git a/Sources/TuistSupport/Utils/PrintableString.swift b/Sources/TuistSupport/Utils/PrintableString.swift deleted file mode 100644 index 070912ea519..00000000000 --- a/Sources/TuistSupport/Utils/PrintableString.swift +++ /dev/null @@ -1,159 +0,0 @@ -import Foundation - -public struct PrintableString: Encodable, Decodable, Equatable { - /// Contains a string that can be interpolated with options. - let rawString: String - let pretty: String -} - -extension PrintableString: ExpressibleByStringLiteral { - public init(stringLiteral: String) { - rawString = stringLiteral - pretty = stringLiteral - } -} - -extension PrintableString: CustomStringConvertible, CustomDebugStringConvertible { - public var description: String { - pretty - } - - public var debugDescription: String { - rawString - } -} - -extension PrintableString: ExpressibleByStringInterpolation { - public init(stringInterpolation: StringInterpolation) { - rawString = stringInterpolation.unformatted - pretty = stringInterpolation.string - } - - public struct StringInterpolation: StringInterpolationProtocol { - var unformatted: String - var string: String - - public init(literalCapacity _: Int, interpolationCount _: Int) { - string = "" - unformatted = "" - } - - public mutating func appendLiteral(_ literal: String) { - string.append(literal) - unformatted.append(literal) - } - - public mutating func appendInterpolation(_ token: PrintableString.Token) { - string.append(token.description) - unformatted.append(token.unformatted) - } - - public mutating func appendInterpolation(_ value: String) { - string.append(value) - unformatted.append(value) - } - - public mutating func appendInterpolation(_ value: CustomStringConvertible) { - string.append(value.description) - unformatted.append(value.description) - } - } -} - -extension PrintableString { - public indirect enum Token: ExpressibleByStringLiteral { - case raw(String) - case command(Token) - case keystroke(Token) - case bold(Token) - case error(Token) - case success(Token) - case warning(Token) - case info(Token) - - public init(stringLiteral: String) { - self = .raw(stringLiteral) - } - - public var unformatted: String { - switch self { - case let .raw(string): - return string - case let .command(token): - return token.description - case let .keystroke(token): - return token.description - case let .bold(token): - return token.description - case let .error(token): - return token.description - case let .success(token): - return token.description - case let .warning(token): - return token.description - case let .info(token): - return token.description - } - } - - public var description: String { - guard Environment.shared.shouldOutputBeColoured else { - return unformatted - } - - switch self { - case let .raw(string): - return string - case let .command(token), let .keystroke(token): - return token.description.cyan() - case let .bold(token): - return token.description.bold() - case let .error(token): - return token.description.red() - case let .success(token): - return token.description.green() - case let .warning(token): - return token.description.yellow() - case let .info(token): - return token.description.lightBlue() - } - } - } -} - -extension Logger { - /// Log a message passing with the `Logger.Level.notice` log level. - /// - /// `pretty` is always printed to the console, and is omitted to the logger as `notice`. - /// - /// - parameters: - /// - message: The message to be logged. `message` can be used with any string interpolation literal. - /// - metadata: One-off metadata to attach to this log message - /// - file: The file this log message originates from (there's usually no need to pass it explicitly as it - /// defaults to `#file`). - /// - function: The function this log message originates from (there's usually no need to pass it explicitly as - /// it defaults to `#function`). - /// - line: The line this log message originates from (there's usually no need to pass it explicitly as it - /// defaults to `#line`). - public func pretty( - _ message: @autoclosure () -> PrintableString, - metadata: @autoclosure () -> Logger.Metadata? = nil, - file: String = #file, function: String = #function, line: UInt = #line - ) { - let printableString = message() - - log( - level: .notice, Logger.Message(stringLiteral: printableString.rawString), - metadata: metadata().map { $0.merging(.pretty, uniquingKeysWith: { $1 }) } ?? .pretty, - file: file, - function: function, - line: line - ) - - if Environment.shared.shouldOutputBeColoured { - FileHandle.standardOutput.print(printableString.pretty) - } else { - FileHandle.standardOutput.print(printableString.rawString) - } - } -} diff --git a/Tests/TuistSupportTests/Utils/PrintableStringTests.swift b/Tests/TuistSupportTests/Utils/PrintableStringTests.swift deleted file mode 100644 index 747060c3b63..00000000000 --- a/Tests/TuistSupportTests/Utils/PrintableStringTests.swift +++ /dev/null @@ -1,103 +0,0 @@ -import Foundation -import XCTest - -@testable import TuistSupport -@testable import TuistSupportTesting - -final class PrintableStringTests: TuistUnitTestCase { - func test_raw_description_when_colored_output() { - environment.shouldOutputBeColoured = true - let value = PrintableString.Token.raw("test") - XCTAssertEqual(value.description, "test") - } - - func test_raw_description_when_not_colored_output() { - environment.shouldOutputBeColoured = false - let value = PrintableString.Token.raw("test") - XCTAssertEqual(value.description, "test") - } - - func test_command_description_when_colored_output() { - environment.shouldOutputBeColoured = true - let value = PrintableString.Token.command("test") - XCTAssertEqual(value.description, "test".cyan()) - } - - func test_command_description_when_not_colored_output() { - environment.shouldOutputBeColoured = false - let value = PrintableString.Token.command("test") - XCTAssertEqual(value.description, "test") - } - - func test_keystroke_description_when_colored_output() { - environment.shouldOutputBeColoured = true - let value = PrintableString.Token.keystroke("test") - XCTAssertEqual(value.description, "test".cyan()) - } - - func test_keystroke_description_when_not_colored_output() { - environment.shouldOutputBeColoured = false - let value = PrintableString.Token.keystroke("test") - XCTAssertEqual(value.description, "test") - } - - func test_bold_description_when_colored_output() { - environment.shouldOutputBeColoured = true - let value = PrintableString.Token.bold("test") - XCTAssertEqual(value.description, "test".bold()) - } - - func test_bold_description_when_not_colored_output() { - environment.shouldOutputBeColoured = false - let value = PrintableString.Token.bold("test") - XCTAssertEqual(value.description, "test") - } - - func test_error_description_when_colored_output() { - environment.shouldOutputBeColoured = true - let value = PrintableString.Token.error("test") - XCTAssertEqual(value.description, "test".red()) - } - - func test_error_description_when_not_colored_output() { - environment.shouldOutputBeColoured = false - let value = PrintableString.Token.error("test") - XCTAssertEqual(value.description, "test") - } - - func test_success_description_when_colored_output() { - environment.shouldOutputBeColoured = true - let value = PrintableString.Token.success("test") - XCTAssertEqual(value.description, "test".green()) - } - - func test_success_description_when_not_colored_output() { - environment.shouldOutputBeColoured = false - let value = PrintableString.Token.success("test") - XCTAssertEqual(value.description, "test") - } - - func test_warning_description_when_colored_output() { - environment.shouldOutputBeColoured = true - let value = PrintableString.Token.warning("test") - XCTAssertEqual(value.description, "test".yellow()) - } - - func test_warning_description_when_not_colored_output() { - environment.shouldOutputBeColoured = false - let value = PrintableString.Token.warning("test") - XCTAssertEqual(value.description, "test") - } - - func test_info_description_when_colored_output() { - environment.shouldOutputBeColoured = true - let value = PrintableString.Token.info("test") - XCTAssertEqual(value.description, "test".lightBlue()) - } - - func test_info_description_when_not_colored_output() { - environment.shouldOutputBeColoured = false - let value = PrintableString.Token.info("test") - XCTAssertEqual(value.description, "test") - } -} From 00a680640833d4657ca715e2bfb4d93fc4afd68d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 11 Jul 2024 15:57:58 +0200 Subject: [PATCH 414/509] Add support for new, more secure project and user tokens (#6500) * Use new token strategy * Update to align with the latest server changes * Update ProjectTokensCreateCommand abstract * Fix AsyncQueueTests --- .../TuistAcceptanceTestCase.swift | 4 +- Sources/TuistKit/Commands/EnvKey/EnvKey.swift | 1 + .../Project/ProjectTokenCommand.swift | 33 +- .../Project/ProjectTokensCreateCommand.swift | 35 + .../Project/ProjectTokensListCommand.swift | 35 + .../Project/ProjectTokensRevokeCommand.swift | 42 + .../TuistKit/Commands/ProjectCommand.swift | 2 +- Sources/TuistKit/Services/AuthService.swift | 2 +- Sources/TuistKit/Services/CleanService.swift | 2 +- .../Project/ProjectTokensCreateService.swift | 57 + .../Project/ProjectTokensListService.swift | 57 + ...swift => ProjectTokensRevokeService.swift} | 20 +- ...ServerClientAuthenticationMiddleware.swift | 73 +- .../Models/ServerAuthenticationTokens.swift | 6 + .../Models/ServerProjectToken.swift | 27 + Sources/TuistServer/OpenAPI/Client.swift | 329 +++++- Sources/TuistServer/OpenAPI/Types.swift | 982 +++++++++++++++++- Sources/TuistServer/OpenAPI/cloud.yml | 273 ++++- .../Services/CleanCacheService.swift | 27 +- .../Services/CreateProjectTokenService.swift | 94 ++ .../Services/FullHandleService.swift | 38 + .../Services/GetAuthTokenService.swift | 14 +- .../Services/GetProjectService.swift | 32 +- .../Services/ListProjectTokensService.swift | 94 ++ .../Services/RefreshAuthTokenService.swift | 65 ++ .../Services/RevokeProjectTokenService.swift | 95 ++ .../Session/ServerSessionController.swift | 18 +- Sources/TuistServer/Utilities/JWT.swift | 20 + .../ServerAuthenticationController.swift | 99 +- .../Utilities/ServerCredentialsStore.swift | 20 +- .../Credentials/CredentialsStore.swift | 2 + Sources/TuistSupport/Utils/CIChecker.swift | 4 +- Sources/TuistSupport/Utils/DateService.swift | 15 + .../Credentials/MockCredentialsStore.swift | 23 - .../Utils/MockCIChecker.swift | 10 - .../Utils/TestingLogHandler.swift | 2 +- .../AsyncQueueTests.swift | 41 +- .../ServerAcceptanceTests.swift | 50 +- .../CommandEnvironmentVariableTests.swift | 6 +- .../Services/CleanServiceTests.swift | 4 +- .../Services/FullHandleServiceTests.swift | 45 + .../Project/ProjectDeleteServiceTests.swift | 2 +- .../ProjectTokensCreateServiceTests.swift | 62 ++ .../ProjectTokensListServiceTests.swift | 98 ++ .../ProjectTokensRevokeServiceTests.swift | 67 ++ .../Utils/TuistAnalyticsDispatcherTests.swift | 7 +- .../TuistAnalyticsServerBackendTests.swift | 14 +- ...rClientAuthenticationMiddlewareTests.swift | 259 +++++ .../ServerSessionControllerTests.swift | 74 +- .../ServerAuthenticationControllerTests.swift | 151 +++ .../ServerCredentialsStoreTests.swift | 19 +- docs/docs/cloud/get-started.md | 2 +- 52 files changed, 3316 insertions(+), 237 deletions(-) create mode 100644 Sources/TuistKit/Commands/Project/ProjectTokensCreateCommand.swift create mode 100644 Sources/TuistKit/Commands/Project/ProjectTokensListCommand.swift create mode 100644 Sources/TuistKit/Commands/Project/ProjectTokensRevokeCommand.swift create mode 100644 Sources/TuistKit/Services/Project/ProjectTokensCreateService.swift create mode 100644 Sources/TuistKit/Services/Project/ProjectTokensListService.swift rename Sources/TuistKit/Services/Project/{ProjectTokenService.swift => ProjectTokensRevokeService.swift} (64%) create mode 100644 Sources/TuistServer/Models/ServerAuthenticationTokens.swift create mode 100644 Sources/TuistServer/Models/ServerProjectToken.swift create mode 100644 Sources/TuistServer/Services/CreateProjectTokenService.swift create mode 100644 Sources/TuistServer/Services/FullHandleService.swift create mode 100644 Sources/TuistServer/Services/ListProjectTokensService.swift create mode 100644 Sources/TuistServer/Services/RefreshAuthTokenService.swift create mode 100644 Sources/TuistServer/Services/RevokeProjectTokenService.swift create mode 100644 Sources/TuistServer/Utilities/JWT.swift create mode 100644 Sources/TuistSupport/Utils/DateService.swift delete mode 100644 Sources/TuistSupportTesting/Credentials/MockCredentialsStore.swift delete mode 100644 Sources/TuistSupportTesting/Utils/MockCIChecker.swift create mode 100644 Tests/TuistKitTests/Services/FullHandleServiceTests.swift create mode 100644 Tests/TuistKitTests/Services/Project/ProjectTokensCreateServiceTests.swift create mode 100644 Tests/TuistKitTests/Services/Project/ProjectTokensListServiceTests.swift create mode 100644 Tests/TuistKitTests/Services/Project/ProjectTokensRevokeServiceTests.swift create mode 100644 Tests/TuistServerTests/Client/ServerClientAuthenticationMiddlewareTests.swift create mode 100644 Tests/TuistServerTests/Utilities/ServerAuthenticationControllerTests.swift diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift index 835e7b2ef0b..db2982984a4 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift @@ -23,8 +23,8 @@ open class TuistAcceptanceTestCase: XCTestCase { private var derivedDataDirectory: TemporaryDirectory! private var fixtureTemporaryDirectory: TemporaryDirectory! - override open func setUp() { - super.setUp() + override open func setUp() async throws { + try await super.setUp() DispatchQueue.once(token: "io.tuist.test.logging") { LoggingSystem.bootstrap(AcceptanceTestCaseLogHandler.init) diff --git a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift index e2a5f05fac4..0937d4de651 100644 --- a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift +++ b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift @@ -144,6 +144,7 @@ public enum EnvKey: String, CaseIterable { // PROJECT TOKEN case projectTokenFullHandle = "TUIST_PROJECT_TOKEN_FULL_HANDLE" case projectTokenPath = "TUIST_PROJECT_TOKEN_PATH" + case projectTokenId = "TUIST_PROJECT_TOKEN_ID" // ORGANIZATION LIST case organizationListJson = "TUIST_ORGANIZATION_LIST_JSON" diff --git a/Sources/TuistKit/Commands/Project/ProjectTokenCommand.swift b/Sources/TuistKit/Commands/Project/ProjectTokenCommand.swift index d22ce7a0f91..29197a12cbe 100644 --- a/Sources/TuistKit/Commands/Project/ProjectTokenCommand.swift +++ b/Sources/TuistKit/Commands/Project/ProjectTokenCommand.swift @@ -3,34 +3,17 @@ import Foundation import Path import TuistSupport -struct ProjectTokenCommand: AsyncParsableCommand { +struct ProjectTokensCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( - commandName: "token", + commandName: "tokens", _superCommandName: "project", - abstract: "Get a project token. You can save this token in the `TUIST_CONFIG_TOKEN` environment variable to use the remote cache on the CI." - ) - } - - @Argument( - help: "The project to get the token for. Must be in the format of account-handle/project-handle.", - completion: .directory, - envKey: .projectTokenFullHandle - ) - var fullHandle: String - - @Option( - name: .shortAndLong, - help: "The path to the directory or a subdirectory of the project.", - completion: .directory, - envKey: .projectTokenPath - ) - var path: String? - - func run() async throws { - try await ProjectTokenService().run( - fullHandle: fullHandle, - directory: path + abstract: "Manage Tuist project tokens.", + subcommands: [ + ProjectTokensCreateCommand.self, + ProjectTokensListCommand.self, + ProjectTokensRevokeCommand.self, + ] ) } } diff --git a/Sources/TuistKit/Commands/Project/ProjectTokensCreateCommand.swift b/Sources/TuistKit/Commands/Project/ProjectTokensCreateCommand.swift new file mode 100644 index 00000000000..531b6934ac3 --- /dev/null +++ b/Sources/TuistKit/Commands/Project/ProjectTokensCreateCommand.swift @@ -0,0 +1,35 @@ +import ArgumentParser +import Foundation +import Path +import TuistSupport + +struct ProjectTokensCreateCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "create", + _superCommandName: "tokens", + abstract: "Create a new Tuist project token. You can save this token in the `TUIST_CONFIG_TOKEN` environment variable to authenticate requests against the Tuist API." + ) + } + + @Argument( + help: "The project to create the token for. Must be in the format of account-handle/project-handle.", + envKey: .projectTokenFullHandle + ) + var fullHandle: String + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory, + envKey: .projectTokenPath + ) + var path: String? + + func run() async throws { + try await ProjectTokensCreateService().run( + fullHandle: fullHandle, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Project/ProjectTokensListCommand.swift b/Sources/TuistKit/Commands/Project/ProjectTokensListCommand.swift new file mode 100644 index 00000000000..0a1f09bb8c5 --- /dev/null +++ b/Sources/TuistKit/Commands/Project/ProjectTokensListCommand.swift @@ -0,0 +1,35 @@ +import ArgumentParser +import Foundation +import Path +import TuistSupport + +struct ProjectTokensListCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "list", + _superCommandName: "tokens", + abstract: "List Tuist project tokens." + ) + } + + @Argument( + help: "The project to list the tokens for. Must be in the format of account-handle/project-handle.", + envKey: .projectTokenFullHandle + ) + var fullHandle: String + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory, + envKey: .projectTokenPath + ) + var path: String? + + func run() async throws { + try await ProjectTokensListService().run( + fullHandle: fullHandle, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Project/ProjectTokensRevokeCommand.swift b/Sources/TuistKit/Commands/Project/ProjectTokensRevokeCommand.swift new file mode 100644 index 00000000000..882a5ddefeb --- /dev/null +++ b/Sources/TuistKit/Commands/Project/ProjectTokensRevokeCommand.swift @@ -0,0 +1,42 @@ +import ArgumentParser +import Foundation +import Path +import TuistSupport + +struct ProjectTokensRevokeCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "revoke", + _superCommandName: "tokens", + abstract: "Revoke Tuist project tokens." + ) + } + + @Argument( + help: "The ID of the project token to revoke.", + envKey: .projectTokenId + ) + var projectTokenId: String + + @Argument( + help: "The project to revoke the token for. Must be in the format of account-handle/project-handle.", + envKey: .projectTokenFullHandle + ) + var fullHandle: String + + @Option( + name: .shortAndLong, + help: "The path to the directory or a subdirectory of the project.", + completion: .directory, + envKey: .projectTokenPath + ) + var path: String? + + func run() async throws { + try await ProjectTokensRevokeService().run( + projectTokenId: projectTokenId, + fullHandle: fullHandle, + directory: path + ) + } +} diff --git a/Sources/TuistKit/Commands/ProjectCommand.swift b/Sources/TuistKit/Commands/ProjectCommand.swift index d511ed66d58..70eedd3f13e 100644 --- a/Sources/TuistKit/Commands/ProjectCommand.swift +++ b/Sources/TuistKit/Commands/ProjectCommand.swift @@ -11,7 +11,7 @@ struct ProjectCommand: ParsableCommand { ProjectCreateCommand.self, ProjectListCommand.self, ProjectDeleteCommand.self, - ProjectTokenCommand.self, + ProjectTokensCommand.self, ] ) } diff --git a/Sources/TuistKit/Services/AuthService.swift b/Sources/TuistKit/Services/AuthService.swift index 83539543f47..324bd4d699c 100644 --- a/Sources/TuistKit/Services/AuthService.swift +++ b/Sources/TuistKit/Services/AuthService.swift @@ -28,7 +28,7 @@ final class AuthService: AuthServicing { self.configLoader = configLoader } - // MARK: - CloudAuthServicing + // MARK: - AuthServicing func authenticate( directory: String? diff --git a/Sources/TuistKit/Services/CleanService.swift b/Sources/TuistKit/Services/CleanService.swift index 14cbd095d00..85d52d78246 100644 --- a/Sources/TuistKit/Services/CleanService.swift +++ b/Sources/TuistKit/Services/CleanService.swift @@ -130,7 +130,7 @@ final class CleanService { let serverURL = try serverURLService.url(configServerURL: config.url) try await cleanCacheService.cleanCache( serverURL: serverURL, - fullName: fullHandle + fullHandle: fullHandle ) logger.notice("Successfully cleaned the remote storage.") diff --git a/Sources/TuistKit/Services/Project/ProjectTokensCreateService.swift b/Sources/TuistKit/Services/Project/ProjectTokensCreateService.swift new file mode 100644 index 00000000000..a6c5684ee02 --- /dev/null +++ b/Sources/TuistKit/Services/Project/ProjectTokensCreateService.swift @@ -0,0 +1,57 @@ +import Foundation +import Path +import TuistLoader +import TuistServer +import TuistSupport + +protocol ProjectTokensCreateServicing { + func run( + fullHandle: String, + directory: String? + ) async throws +} + +final class ProjectTokensCreateService: ProjectTokensCreateServicing { + private let createProjectTokenService: CreateProjectTokenServicing + private let serverURLService: ServerURLServicing + private let configLoader: ConfigLoading + + convenience init() { + self.init( + createProjectTokenService: CreateProjectTokenService(), + serverURLService: ServerURLService(), + configLoader: ConfigLoader() + ) + } + + init( + createProjectTokenService: CreateProjectTokenServicing, + serverURLService: ServerURLServicing, + configLoader: ConfigLoading + ) { + self.createProjectTokenService = createProjectTokenService + self.serverURLService = serverURLService + self.configLoader = configLoader + } + + func run( + fullHandle: String, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let serverURL = try serverURLService.url(configServerURL: config.url) + + let token = try await createProjectTokenService.createProjectToken( + fullHandle: fullHandle, + serverURL: serverURL + ) + + logger.info(.init(stringLiteral: token)) + } +} diff --git a/Sources/TuistKit/Services/Project/ProjectTokensListService.swift b/Sources/TuistKit/Services/Project/ProjectTokensListService.swift new file mode 100644 index 00000000000..bc4ef15b1c8 --- /dev/null +++ b/Sources/TuistKit/Services/Project/ProjectTokensListService.swift @@ -0,0 +1,57 @@ +import Foundation +import Path +import TuistLoader +import TuistServer +import TuistSupport + +protocol ProjectTokensListServicing { + func run( + fullHandle: String, + directory: String? + ) async throws +} + +final class ProjectTokensListService: ProjectTokensListServicing { + private let listProjectTokensService: ListProjectTokensServicing + private let serverURLService: ServerURLServicing + private let configLoader: ConfigLoading + + init( + listProjectTokensService: ListProjectTokensServicing = ListProjectTokensService(), + serverURLService: ServerURLServicing = ServerURLService(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.listProjectTokensService = listProjectTokensService + self.serverURLService = serverURLService + self.configLoader = configLoader + } + + func run( + fullHandle: String, + directory: String? + ) async throws { + let directoryPath: AbsolutePath + if let directory { + directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) + } else { + directoryPath = FileHandler.shared.currentPath + } + let config = try configLoader.loadConfig(path: directoryPath) + let serverURL = try serverURLService.url(configServerURL: config.url) + + let tokens = try await listProjectTokensService.listProjectTokens( + fullHandle: fullHandle, + serverURL: serverURL + ) + + if tokens.isEmpty { + logger.notice("No project tokens found. Create one by running `tuist project tokens create \(fullHandle).") + } else { + let textTable = TextTable { [ + TextTable.Column(title: "ID", value: $0.id), + TextTable.Column(title: "Created at", value: $0.insertedAt), + ] } + logger.notice("\(textTable.render(tokens))") + } + } +} diff --git a/Sources/TuistKit/Services/Project/ProjectTokenService.swift b/Sources/TuistKit/Services/Project/ProjectTokensRevokeService.swift similarity index 64% rename from Sources/TuistKit/Services/Project/ProjectTokenService.swift rename to Sources/TuistKit/Services/Project/ProjectTokensRevokeService.swift index 6937257dcdc..2a8c36a6b76 100644 --- a/Sources/TuistKit/Services/Project/ProjectTokenService.swift +++ b/Sources/TuistKit/Services/Project/ProjectTokensRevokeService.swift @@ -4,32 +4,31 @@ import TuistLoader import TuistServer import TuistSupport -protocol ProjectTokenServicing { +protocol ProjectTokensRevokeServicing { func run( + projectTokenId: String, fullHandle: String, directory: String? ) async throws } -final class ProjectTokenService: ProjectTokenServicing { - private let getProjectService: GetProjectServicing - private let credentialsStore: ServerCredentialsStoring +final class ProjectTokensRevokeService: ProjectTokensRevokeServicing { + private let revokeProjectTokenService: RevokeProjectTokenServicing private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading init( - getProjectService: GetProjectServicing = GetProjectService(), - credentialsStore: ServerCredentialsStoring = ServerCredentialsStore(), + revokeProjectTokenService: RevokeProjectTokenServicing = RevokeProjectTokenService(), serverURLService: ServerURLServicing = ServerURLService(), configLoader: ConfigLoading = ConfigLoader() ) { - self.getProjectService = getProjectService - self.credentialsStore = credentialsStore + self.revokeProjectTokenService = revokeProjectTokenService self.serverURLService = serverURLService self.configLoader = configLoader } func run( + projectTokenId: String, fullHandle: String, directory: String? ) async throws { @@ -42,11 +41,12 @@ final class ProjectTokenService: ProjectTokenServicing { let config = try configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) - let project = try await getProjectService.getProject( + try await revokeProjectTokenService.revokeProjectToken( + projectTokenId: projectTokenId, fullHandle: fullHandle, serverURL: serverURL ) - logger.info(.init(stringLiteral: project.token)) + logger.info("The project token \(projectTokenId) was successfully revoked.") } } diff --git a/Sources/TuistServer/Client/ServerClientAuthenticationMiddleware.swift b/Sources/TuistServer/Client/ServerClientAuthenticationMiddleware.swift index af29622d2c8..a324ff7df19 100644 --- a/Sources/TuistServer/Client/ServerClientAuthenticationMiddleware.swift +++ b/Sources/TuistServer/Client/ServerClientAuthenticationMiddleware.swift @@ -2,7 +2,7 @@ import Foundation import OpenAPIRuntime import TuistSupport -public enum ServerClientAuthenticationError: FatalError { +public enum ServerClientAuthenticationError: FatalError, Equatable { case notAuthenticated public var type: ErrorType { @@ -15,13 +15,39 @@ public enum ServerClientAuthenticationError: FatalError { public var description: String { switch self { case .notAuthenticated: - return "No Tuist authentication token found. Authenticate by running `tuist auth`." + return "No valid Tuist credentials found. Authenticate by running `tuist auth`." } } } /// Injects an authorization header to every request. struct ServerClientAuthenticationMiddleware: ClientMiddleware { + private let serverAuthenticationController: ServerAuthenticationControlling + private let serverCredentialsStore: ServerCredentialsStoring + private let refreshAuthTokenService: RefreshAuthTokenServicing + private let dateService: DateServicing + + init() { + self.init( + serverAuthenticationController: ServerAuthenticationController(), + serverCredentialsStore: ServerCredentialsStore(), + refreshAuthTokenService: RefreshAuthTokenService(), + dateService: DateService() + ) + } + + init( + serverAuthenticationController: ServerAuthenticationControlling, + serverCredentialsStore: ServerCredentialsStoring, + refreshAuthTokenService: RefreshAuthTokenServicing, + dateService: DateServicing + ) { + self.serverAuthenticationController = serverAuthenticationController + self.serverCredentialsStore = serverCredentialsStore + self.refreshAuthTokenService = refreshAuthTokenService + self.dateService = dateService + } + func intercept( _ request: Request, baseURL: URL, @@ -29,13 +55,52 @@ struct ServerClientAuthenticationMiddleware: ClientMiddleware { next: (Request, URL) async throws -> Response ) async throws -> Response { var request = request - guard let token = try ServerAuthenticationController().authenticationToken(serverURL: baseURL) + guard let token = try serverAuthenticationController.authenticationToken(serverURL: baseURL) else { throw ServerClientAuthenticationError.notAuthenticated } + let tokenValue: String + switch token { + case let .project(token): + tokenValue = token + case let .user(legacyToken: legacyToken, accessToken: accessToken, refreshToken: refreshToken): + if let legacyToken { + tokenValue = legacyToken + } else if let accessToken, let refreshToken { + // We consider a token to be expired if the expiration date is in the past or 30 seconds from now + let isExpired = accessToken.expiryDate + .timeIntervalSince(dateService.now()) < 30 + + if isExpired { + do { + let newTokens = try await refreshAuthTokenService.refreshTokens( + serverURL: baseURL, + refreshToken: refreshToken.token + ) + try serverCredentialsStore + .store( + credentials: ServerCredentials( + token: nil, + accessToken: newTokens.accessToken, + refreshToken: newTokens.refreshToken + ), + serverURL: baseURL + ) + tokenValue = newTokens.accessToken + } catch { + throw ServerClientAuthenticationError.notAuthenticated + } + } else { + tokenValue = accessToken.token + } + } else { + throw ServerClientAuthenticationError.notAuthenticated + } + } + request.headerFields.append(.init( - name: "Authorization", value: "Bearer \(token.value)" + name: "Authorization", value: "Bearer \(tokenValue)" )) return try await next(request, baseURL) } diff --git a/Sources/TuistServer/Models/ServerAuthenticationTokens.swift b/Sources/TuistServer/Models/ServerAuthenticationTokens.swift new file mode 100644 index 00000000000..8372ffa00f3 --- /dev/null +++ b/Sources/TuistServer/Models/ServerAuthenticationTokens.swift @@ -0,0 +1,6 @@ +import Foundation + +public struct ServerAuthenticationTokens { + public let accessToken: String + public let refreshToken: String +} diff --git a/Sources/TuistServer/Models/ServerProjectToken.swift b/Sources/TuistServer/Models/ServerProjectToken.swift new file mode 100644 index 00000000000..d4a59388221 --- /dev/null +++ b/Sources/TuistServer/Models/ServerProjectToken.swift @@ -0,0 +1,27 @@ +import Foundation + +public struct ServerProjectToken { + public let id: String + public let insertedAt: Date +} + +extension ServerProjectToken { + init(_ projectToken: Components.Schemas.ProjectToken) { + id = projectToken.id + insertedAt = projectToken.inserted_at + } +} + +#if DEBUG + extension ServerProjectToken { + public static func test( + id: String = "project-token-id", + insertedAt: Date = Date() + ) -> Self { + self.init( + id: id, + insertedAt: insertedAt + ) + } + } +#endif diff --git a/Sources/TuistServer/OpenAPI/Client.swift b/Sources/TuistServer/OpenAPI/Client.swift index 0a59c71e16e..79e2de19373 100644 --- a/Sources/TuistServer/OpenAPI/Client.swift +++ b/Sources/TuistServer/OpenAPI/Client.swift @@ -190,6 +190,78 @@ public struct Client: APIProtocol { } ) } + /// Request new tokens. + /// + /// This endpoint returns new tokens for a given refresh token if the refresh token is valid. + /// + /// - Remark: HTTP `POST /api/auth/refresh_token`. + /// - Remark: Generated from `#/paths//api/auth/refresh_token/post(refreshToken)`. + public func refreshToken(_ input: Operations.refreshToken.Input) async throws + -> Operations.refreshToken.Output + { + try await client.send( + input: input, + forOperation: Operations.refreshToken.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/auth/refresh_token", + parameters: [] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.refreshToken.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.refreshToken.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Operations.refreshToken.Output.Ok.Body.jsonPayload.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 401: + let headers: Operations.refreshToken.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.refreshToken.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } /// Downloads an artifact from the cache. /// /// This endpoint returns a signed URL that can be used to download an artifact from the cache. @@ -2044,8 +2116,8 @@ public struct Client: APIProtocol { } /// Returns a project based on the handle. /// - /// - Remark: HTTP `GET /api/projects/{account_name}/{project_name}`. - /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/get(showProject)`. + /// - Remark: HTTP `GET /api/projects/{account_handle}/{project_handle}`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/get(showProject)`. public func showProject(_ input: Operations.showProject.Input) async throws -> Operations.showProject.Output { @@ -2055,7 +2127,7 @@ public struct Client: APIProtocol { serializer: { input in let path = try converter.renderedRequestPath( template: "/api/projects/{}/{}", - parameters: [input.path.account_name, input.path.project_name] + parameters: [input.path.account_handle, input.path.project_handle] ) var request: OpenAPIRuntime.Request = .init(path: path, method: .get) suppressMutabilityWarning(&request) @@ -2127,8 +2199,8 @@ public struct Client: APIProtocol { } /// Cleans cache for a given project /// - /// - Remark: HTTP `PUT /api/projects/{account_name}/{project_name}/cache/clean`. - /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/cache/clean/put(cleanCache)`. + /// - Remark: HTTP `PUT /api/projects/{account_handle}/{project_handle}/cache/clean`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/cache/clean/put(cleanCache)`. public func cleanCache(_ input: Operations.cleanCache.Input) async throws -> Operations.cleanCache.Output { @@ -2138,7 +2210,7 @@ public struct Client: APIProtocol { serializer: { input in let path = try converter.renderedRequestPath( template: "/api/projects/{}/{}/cache/clean", - parameters: [input.path.account_name, input.path.project_name] + parameters: [input.path.account_handle, input.path.project_handle] ) var request: OpenAPIRuntime.Request = .init(path: path, method: .put) suppressMutabilityWarning(&request) @@ -2198,6 +2270,251 @@ public struct Client: APIProtocol { } ) } + /// List all project tokens. + /// + /// This endpoint returns all tokens for a given project. + /// + /// - Remark: HTTP `GET /api/projects/{account_handle}/{project_handle}/tokens`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)`. + public func listProjectTokens(_ input: Operations.listProjectTokens.Input) async throws + -> Operations.listProjectTokens.Output + { + try await client.send( + input: input, + forOperation: Operations.listProjectTokens.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/projects/{}/{}/tokens", + parameters: [input.path.account_handle, input.path.project_handle] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .get) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.listProjectTokens.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.listProjectTokens.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Operations.listProjectTokens.Output.Ok.Body.jsonPayload.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 401: + let headers: Operations.listProjectTokens.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.listProjectTokens.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) + case 403: + let headers: Operations.listProjectTokens.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.listProjectTokens.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.listProjectTokens.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.listProjectTokens.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Create a new project token. + /// + /// This endpoint returns a new project token. + /// + /// - Remark: HTTP `POST /api/projects/{account_handle}/{project_handle}/tokens`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)`. + public func createProjectToken(_ input: Operations.createProjectToken.Input) async throws + -> Operations.createProjectToken.Output + { + try await client.send( + input: input, + forOperation: Operations.createProjectToken.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/projects/{}/{}/tokens", + parameters: [input.path.account_handle, input.path.project_handle] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.createProjectToken.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createProjectToken.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Operations.createProjectToken.Output.Ok.Body.jsonPayload.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 401: + let headers: Operations.createProjectToken.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createProjectToken.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) + case 403: + let headers: Operations.createProjectToken.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createProjectToken.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.createProjectToken.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.createProjectToken.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Revokes a project token. + /// + /// - Remark: HTTP `DELETE /api/projects/{account_handle}/{project_handle}/tokens/{id}`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/{id}/delete(revokeProjectToken)`. + public func revokeProjectToken(_ input: Operations.revokeProjectToken.Input) async throws + -> Operations.revokeProjectToken.Output + { + try await client.send( + input: input, + forOperation: Operations.revokeProjectToken.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/projects/{}/{}/tokens/{}", + parameters: [ + input.path.account_handle, input.path.project_handle, input.path.id, + ] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .delete) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 204: + let headers: Operations.revokeProjectToken.Output.NoContent.Headers = .init() + return .noContent(.init(headers: headers, body: nil)) + case 401: + let headers: Operations.revokeProjectToken.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.revokeProjectToken.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) + case 403: + let headers: Operations.revokeProjectToken.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.revokeProjectToken.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.revokeProjectToken.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.revokeProjectToken.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } /// Deletes a project with a given id. /// /// - Remark: HTTP `DELETE /api/projects/{id}`. diff --git a/Sources/TuistServer/OpenAPI/Types.swift b/Sources/TuistServer/OpenAPI/Types.swift index a3edbd890b2..f8adfe33426 100644 --- a/Sources/TuistServer/OpenAPI/Types.swift +++ b/Sources/TuistServer/OpenAPI/Types.swift @@ -21,6 +21,14 @@ public protocol APIProtocol: Sendable { /// - Remark: Generated from `#/paths//api/auth/device_code/{device_code}/get(getDeviceCode)`. func getDeviceCode(_ input: Operations.getDeviceCode.Input) async throws -> Operations.getDeviceCode.Output + /// Request new tokens. + /// + /// This endpoint returns new tokens for a given refresh token if the refresh token is valid. + /// + /// - Remark: HTTP `POST /api/auth/refresh_token`. + /// - Remark: Generated from `#/paths//api/auth/refresh_token/post(refreshToken)`. + func refreshToken(_ input: Operations.refreshToken.Input) async throws + -> Operations.refreshToken.Output /// Downloads an artifact from the cache. /// /// This endpoint returns a signed URL that can be used to download an artifact from the cache. @@ -167,16 +175,38 @@ public protocol APIProtocol: Sendable { -> Operations.createProject.Output /// Returns a project based on the handle. /// - /// - Remark: HTTP `GET /api/projects/{account_name}/{project_name}`. - /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/get(showProject)`. + /// - Remark: HTTP `GET /api/projects/{account_handle}/{project_handle}`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/get(showProject)`. func showProject(_ input: Operations.showProject.Input) async throws -> Operations.showProject.Output /// Cleans cache for a given project /// - /// - Remark: HTTP `PUT /api/projects/{account_name}/{project_name}/cache/clean`. - /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/cache/clean/put(cleanCache)`. + /// - Remark: HTTP `PUT /api/projects/{account_handle}/{project_handle}/cache/clean`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/cache/clean/put(cleanCache)`. func cleanCache(_ input: Operations.cleanCache.Input) async throws -> Operations.cleanCache.Output + /// List all project tokens. + /// + /// This endpoint returns all tokens for a given project. + /// + /// - Remark: HTTP `GET /api/projects/{account_handle}/{project_handle}/tokens`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)`. + func listProjectTokens(_ input: Operations.listProjectTokens.Input) async throws + -> Operations.listProjectTokens.Output + /// Create a new project token. + /// + /// This endpoint returns a new project token. + /// + /// - Remark: HTTP `POST /api/projects/{account_handle}/{project_handle}/tokens`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)`. + func createProjectToken(_ input: Operations.createProjectToken.Input) async throws + -> Operations.createProjectToken.Output + /// Revokes a project token. + /// + /// - Remark: HTTP `DELETE /api/projects/{account_handle}/{project_handle}/tokens/{id}`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/{id}/delete(revokeProjectToken)`. + func revokeProjectToken(_ input: Operations.revokeProjectToken.Input) async throws + -> Operations.revokeProjectToken.Output /// Deletes a project with a given id. /// /// - Remark: HTTP `DELETE /api/projects/{id}`. @@ -470,20 +500,31 @@ public enum Components { case status } } - /// Token to authenticate the user with. + /// A new user access token to authenticate the user with. /// - /// - Remark: Generated from `#/components/schemas/AuthenticationToken`. - public struct AuthenticationToken: Codable, Equatable, Hashable, Sendable { - /// User authentication token + /// - Remark: Generated from `#/components/schemas/AuthenticationTokens`. + public struct AuthenticationTokens: Codable, Equatable, Hashable, Sendable { + /// User access token + /// + /// - Remark: Generated from `#/components/schemas/AuthenticationTokens/access_token`. + public var access_token: Swift.String + /// User refresh token /// - /// - Remark: Generated from `#/components/schemas/AuthenticationToken/token`. - public var token: Swift.String? - /// Creates a new `AuthenticationToken`. + /// - Remark: Generated from `#/components/schemas/AuthenticationTokens/refresh_token`. + public var refresh_token: Swift.String + /// Creates a new `AuthenticationTokens`. /// /// - Parameters: - /// - token: User authentication token - public init(token: Swift.String? = nil) { self.token = token } - public enum CodingKeys: String, CodingKey { case token } + /// - access_token: User access token + /// - refresh_token: User refresh token + public init(access_token: Swift.String, refresh_token: Swift.String) { + self.access_token = access_token + self.refresh_token = refresh_token + } + public enum CodingKeys: String, CodingKey { + case access_token + case refresh_token + } } /// The URL to download the artifact from the cache. /// @@ -1118,7 +1159,7 @@ public enum Components { /// The token that should be used to authenticate the project. For CI only. /// /// - Remark: Generated from `#/components/schemas/Project/token`. - public var token: Swift.String + @available(*, deprecated) public var token: Swift.String /// Creates a new `Project`. /// /// - Parameters: @@ -1136,6 +1177,60 @@ public enum Components { case token } } + /// A new project token. + /// + /// - Remark: Generated from `#/components/schemas/ProjectFullToken`. + public struct ProjectFullToken: Codable, Equatable, Hashable, Sendable { + /// The generated project token. + /// + /// - Remark: Generated from `#/components/schemas/ProjectFullToken/token`. + public var token: Swift.String + /// Creates a new `ProjectFullToken`. + /// + /// - Parameters: + /// - token: The generated project token. + public init(token: Swift.String) { self.token = token } + public enum CodingKeys: String, CodingKey { case token } + } + /// A token to authenticate API requests as a project. + /// + /// - Remark: Generated from `#/components/schemas/ProjectToken`. + public struct ProjectToken: Codable, Equatable, Hashable, Sendable { + /// The token unique identifier. + /// + /// - Remark: Generated from `#/components/schemas/ProjectToken/id`. + public var id: Swift.String + /// The timestamp of when the token was created. + /// + /// - Remark: Generated from `#/components/schemas/ProjectToken/inserted_at`. + public var inserted_at: Foundation.Date + /// Creates a new `ProjectToken`. + /// + /// - Parameters: + /// - id: The token unique identifier. + /// - inserted_at: The timestamp of when the token was created. + public init(id: Swift.String, inserted_at: Foundation.Date) { + self.id = id + self.inserted_at = inserted_at + } + public enum CodingKeys: String, CodingKey { + case id + case inserted_at + } + } + /// A list of project tokens. + /// + /// - Remark: Generated from `#/components/schemas/Tokens`. + public struct Tokens: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/Tokens/tokens`. + public var tokens: [Components.Schemas.ProjectToken] + /// Creates a new `Tokens`. + /// + /// - Parameters: + /// - tokens: + public init(tokens: [Components.Schemas.ProjectToken]) { self.tokens = tokens } + public enum CodingKeys: String, CodingKey { case tokens } + } /// A user. /// /// - Remark: Generated from `#/components/schemas/User`. @@ -1609,16 +1704,38 @@ public enum Operations { /// /// - Remark: Generated from `#/paths/api/auth/device_code/{device_code}/GET/json`. public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// A short-lived token to authenticate API requests as user. + /// + /// - Remark: Generated from `#/paths/api/auth/device_code/{device_code}/GET/json/access_token`. + public var access_token: Swift.String? + /// A token to generate new access tokens when they expire. + /// + /// - Remark: Generated from `#/paths/api/auth/device_code/{device_code}/GET/json/refresh_token`. + public var refresh_token: Swift.String? /// User authentication token /// /// - Remark: Generated from `#/paths/api/auth/device_code/{device_code}/GET/json/token`. - public var token: Swift.String? + @available(*, deprecated) public var token: Swift.String? /// Creates a new `jsonPayload`. /// /// - Parameters: + /// - access_token: A short-lived token to authenticate API requests as user. + /// - refresh_token: A token to generate new access tokens when they expire. /// - token: User authentication token - public init(token: Swift.String? = nil) { self.token = token } - public enum CodingKeys: String, CodingKey { case token } + public init( + access_token: Swift.String? = nil, + refresh_token: Swift.String? = nil, + token: Swift.String? = nil + ) { + self.access_token = access_token + self.refresh_token = refresh_token + self.token = token + } + public enum CodingKeys: String, CodingKey { + case access_token + case refresh_token + case token + } } case json(Operations.getDeviceCode.Output.Ok.Body.jsonPayload) } @@ -1711,6 +1828,171 @@ public enum Operations { case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) } } + /// Request new tokens. + /// + /// This endpoint returns new tokens for a given refresh token if the refresh token is valid. + /// + /// - Remark: HTTP `POST /api/auth/refresh_token`. + /// - Remark: Generated from `#/paths//api/auth/refresh_token/post(refreshToken)`. + public enum refreshToken { + public static let id: String = "refreshToken" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + /// Creates a new `Path`. + public init() {} + } + public var path: Operations.refreshToken.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.refreshToken.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.refreshToken.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.refreshToken.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Token params + /// + /// - Remark: Generated from `#/paths/api/auth/refresh_token/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// User refresh token + /// + /// - Remark: Generated from `#/paths/api/auth/refresh_token/POST/json/refresh_token`. + public var refresh_token: Swift.String + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - refresh_token: User refresh token + public init(refresh_token: Swift.String) { self.refresh_token = refresh_token } + public enum CodingKeys: String, CodingKey { case refresh_token } + } + case json(Operations.refreshToken.Input.Body.jsonPayload) + } + public var body: Operations.refreshToken.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.refreshToken.Input.Path = .init(), + query: Operations.refreshToken.Input.Query = .init(), + headers: Operations.refreshToken.Input.Headers = .init(), + cookies: Operations.refreshToken.Input.Cookies = .init(), + body: Operations.refreshToken.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.refreshToken.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + /// A new user access token to authenticate the user with. + /// + /// - Remark: Generated from `#/paths/api/auth/refresh_token/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// User access token + /// + /// - Remark: Generated from `#/paths/api/auth/refresh_token/POST/json/access_token`. + public var access_token: Swift.String + /// User refresh token + /// + /// - Remark: Generated from `#/paths/api/auth/refresh_token/POST/json/refresh_token`. + public var refresh_token: Swift.String + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - access_token: User access token + /// - refresh_token: User refresh token + public init(access_token: Swift.String, refresh_token: Swift.String) { + self.access_token = access_token + self.refresh_token = refresh_token + } + public enum CodingKeys: String, CodingKey { + case access_token + case refresh_token + } + } + case json(Operations.refreshToken.Output.Ok.Body.jsonPayload) + } + /// Received HTTP response body + public var body: Operations.refreshToken.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.refreshToken.Output.Ok.Headers = .init(), + body: Operations.refreshToken.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// A new a pair of tokens was generated + /// + /// - Remark: Generated from `#/paths//api/auth/refresh_token/post(refreshToken)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.refreshToken.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.refreshToken.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.refreshToken.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.refreshToken.Output.Unauthorized.Headers = .init(), + body: Operations.refreshToken.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to issue new tokens + /// + /// - Remark: Generated from `#/paths//api/auth/refresh_token/post(refreshToken)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.refreshToken.Output.Unauthorized) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } /// Downloads an artifact from the cache. /// /// This endpoint returns a signed URL that can be used to download an artifact from the cache. @@ -5877,22 +6159,22 @@ public enum Operations { } /// Returns a project based on the handle. /// - /// - Remark: HTTP `GET /api/projects/{account_name}/{project_name}`. - /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/get(showProject)`. + /// - Remark: HTTP `GET /api/projects/{account_handle}/{project_handle}`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/get(showProject)`. public enum showProject { public static let id: String = "showProject" public struct Input: Sendable, Equatable, Hashable { public struct Path: Sendable, Equatable, Hashable { - public var account_name: Swift.String - public var project_name: Swift.String + public var account_handle: Swift.String + public var project_handle: Swift.String /// Creates a new `Path`. /// /// - Parameters: - /// - account_name: - /// - project_name: - public init(account_name: Swift.String, project_name: Swift.String) { - self.account_name = account_name - self.project_name = project_name + /// - account_handle: + /// - project_handle: + public init(account_handle: Swift.String, project_handle: Swift.String) { + self.account_handle = account_handle + self.project_handle = project_handle } } public var path: Operations.showProject.Input.Path @@ -5963,7 +6245,7 @@ public enum Operations { } /// The project to show /// - /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/get(showProject)/responses/200`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/get(showProject)/responses/200`. /// /// HTTP response code: `200 ok`. case ok(Operations.showProject.Output.Ok) @@ -5994,7 +6276,7 @@ public enum Operations { } /// You need to be authenticated to access this resource /// - /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/get(showProject)/responses/401`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/get(showProject)/responses/401`. /// /// HTTP response code: `401 unauthorized`. case unauthorized(Operations.showProject.Output.Unauthorized) @@ -6025,7 +6307,7 @@ public enum Operations { } /// The authenticated subject is not authorized to perform this action /// - /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/get(showProject)/responses/403`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/get(showProject)/responses/403`. /// /// HTTP response code: `403 forbidden`. case forbidden(Operations.showProject.Output.Forbidden) @@ -6056,7 +6338,7 @@ public enum Operations { } /// The project was not found /// - /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/get(showProject)/responses/404`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/get(showProject)/responses/404`. /// /// HTTP response code: `404 notFound`. case notFound(Operations.showProject.Output.NotFound) @@ -6068,22 +6350,22 @@ public enum Operations { } /// Cleans cache for a given project /// - /// - Remark: HTTP `PUT /api/projects/{account_name}/{project_name}/cache/clean`. - /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/cache/clean/put(cleanCache)`. + /// - Remark: HTTP `PUT /api/projects/{account_handle}/{project_handle}/cache/clean`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/cache/clean/put(cleanCache)`. public enum cleanCache { public static let id: String = "cleanCache" public struct Input: Sendable, Equatable, Hashable { public struct Path: Sendable, Equatable, Hashable { - public var account_name: Swift.String - public var project_name: Swift.String + public var account_handle: Swift.String + public var project_handle: Swift.String /// Creates a new `Path`. /// /// - Parameters: - /// - account_name: - /// - project_name: - public init(account_name: Swift.String, project_name: Swift.String) { - self.account_name = account_name - self.project_name = project_name + /// - account_handle: + /// - project_handle: + public init(account_handle: Swift.String, project_handle: Swift.String) { + self.account_handle = account_handle + self.project_handle = project_handle } } public var path: Operations.cleanCache.Input.Path @@ -6152,7 +6434,7 @@ public enum Operations { } /// The cache has been successfully cleaned /// - /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/cache/clean/put(cleanCache)/responses/204`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/cache/clean/put(cleanCache)/responses/204`. /// /// HTTP response code: `204 noContent`. case noContent(Operations.cleanCache.Output.NoContent) @@ -6183,7 +6465,7 @@ public enum Operations { } /// You need to be authenticated to access this resource /// - /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/cache/clean/put(cleanCache)/responses/401`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/cache/clean/put(cleanCache)/responses/401`. /// /// HTTP response code: `401 unauthorized`. case unauthorized(Operations.cleanCache.Output.Unauthorized) @@ -6214,7 +6496,7 @@ public enum Operations { } /// The authenticated subject is not authorized to perform this action /// - /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/cache/clean/put(cleanCache)/responses/403`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/cache/clean/put(cleanCache)/responses/403`. /// /// HTTP response code: `403 forbidden`. case forbidden(Operations.cleanCache.Output.Forbidden) @@ -6245,7 +6527,7 @@ public enum Operations { } /// The project was not found /// - /// - Remark: Generated from `#/paths//api/projects/{account_name}/{project_name}/cache/clean/put(cleanCache)/responses/404`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/cache/clean/put(cleanCache)/responses/404`. /// /// HTTP response code: `404 notFound`. case notFound(Operations.cleanCache.Output.NotFound) @@ -6255,6 +6537,618 @@ public enum Operations { case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) } } + /// List all project tokens. + /// + /// This endpoint returns all tokens for a given project. + /// + /// - Remark: HTTP `GET /api/projects/{account_handle}/{project_handle}/tokens`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)`. + public enum listProjectTokens { + public static let id: String = "listProjectTokens" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var account_handle: Swift.String + public var project_handle: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - account_handle: + /// - project_handle: + public init(account_handle: Swift.String, project_handle: Swift.String) { + self.account_handle = account_handle + self.project_handle = project_handle + } + } + public var path: Operations.listProjectTokens.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.listProjectTokens.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.listProjectTokens.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.listProjectTokens.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.listProjectTokens.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.listProjectTokens.Input.Path, + query: Operations.listProjectTokens.Input.Query = .init(), + headers: Operations.listProjectTokens.Input.Headers = .init(), + cookies: Operations.listProjectTokens.Input.Cookies = .init(), + body: Operations.listProjectTokens.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.listProjectTokens.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + /// A list of project tokens. + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/tokens/GET/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/tokens/GET/json/tokens`. + public var tokens: [Components.Schemas.ProjectToken] + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - tokens: + public init(tokens: [Components.Schemas.ProjectToken]) { + self.tokens = tokens + } + public enum CodingKeys: String, CodingKey { case tokens } + } + case json(Operations.listProjectTokens.Output.Ok.Body.jsonPayload) + } + /// Received HTTP response body + public var body: Operations.listProjectTokens.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.listProjectTokens.Output.Ok.Headers = .init(), + body: Operations.listProjectTokens.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// A list of project tokens. + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.listProjectTokens.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.listProjectTokens.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.listProjectTokens.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.listProjectTokens.Output.Unauthorized.Headers = .init(), + body: Operations.listProjectTokens.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to list tokens + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.listProjectTokens.Output.Unauthorized) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.listProjectTokens.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.listProjectTokens.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.listProjectTokens.Output.Forbidden.Headers = .init(), + body: Operations.listProjectTokens.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authorized to list tokens + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.listProjectTokens.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.listProjectTokens.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.listProjectTokens.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.listProjectTokens.Output.NotFound.Headers = .init(), + body: Operations.listProjectTokens.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project was not found + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.listProjectTokens.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Create a new project token. + /// + /// This endpoint returns a new project token. + /// + /// - Remark: HTTP `POST /api/projects/{account_handle}/{project_handle}/tokens`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)`. + public enum createProjectToken { + public static let id: String = "createProjectToken" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var account_handle: Swift.String + public var project_handle: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - account_handle: + /// - project_handle: + public init(account_handle: Swift.String, project_handle: Swift.String) { + self.account_handle = account_handle + self.project_handle = project_handle + } + } + public var path: Operations.createProjectToken.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.createProjectToken.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.createProjectToken.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.createProjectToken.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.createProjectToken.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.createProjectToken.Input.Path, + query: Operations.createProjectToken.Input.Query = .init(), + headers: Operations.createProjectToken.Input.Headers = .init(), + cookies: Operations.createProjectToken.Input.Cookies = .init(), + body: Operations.createProjectToken.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createProjectToken.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + /// A new project token. + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/tokens/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// The generated project token. + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/tokens/POST/json/token`. + public var token: Swift.String + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - token: The generated project token. + public init(token: Swift.String) { self.token = token } + public enum CodingKeys: String, CodingKey { case token } + } + case json(Operations.createProjectToken.Output.Ok.Body.jsonPayload) + } + /// Received HTTP response body + public var body: Operations.createProjectToken.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createProjectToken.Output.Ok.Headers = .init(), + body: Operations.createProjectToken.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// A project token was generated + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.createProjectToken.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createProjectToken.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createProjectToken.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createProjectToken.Output.Unauthorized.Headers = .init(), + body: Operations.createProjectToken.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to issue new tokens + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.createProjectToken.Output.Unauthorized) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createProjectToken.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createProjectToken.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createProjectToken.Output.Forbidden.Headers = .init(), + body: Operations.createProjectToken.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authorized to issue new tokens + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.createProjectToken.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createProjectToken.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createProjectToken.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createProjectToken.Output.NotFound.Headers = .init(), + body: Operations.createProjectToken.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project was not found + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.createProjectToken.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Revokes a project token. + /// + /// - Remark: HTTP `DELETE /api/projects/{account_handle}/{project_handle}/tokens/{id}`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/{id}/delete(revokeProjectToken)`. + public enum revokeProjectToken { + public static let id: String = "revokeProjectToken" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var account_handle: Swift.String + public var project_handle: Swift.String + public var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - account_handle: + /// - project_handle: + /// - id: + public init( + account_handle: Swift.String, + project_handle: Swift.String, + id: Swift.String + ) { + self.account_handle = account_handle + self.project_handle = project_handle + self.id = id + } + } + public var path: Operations.revokeProjectToken.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.revokeProjectToken.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.revokeProjectToken.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.revokeProjectToken.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.revokeProjectToken.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.revokeProjectToken.Input.Path, + query: Operations.revokeProjectToken.Input.Query = .init(), + headers: Operations.revokeProjectToken.Input.Headers = .init(), + cookies: Operations.revokeProjectToken.Input.Cookies = .init(), + body: Operations.revokeProjectToken.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct NoContent: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.revokeProjectToken.Output.NoContent.Headers + @frozen public enum Body: Sendable, Equatable, Hashable {} + /// Received HTTP response body + public var body: Operations.revokeProjectToken.Output.NoContent.Body? + /// Creates a new `NoContent`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.revokeProjectToken.Output.NoContent.Headers = .init(), + body: Operations.revokeProjectToken.Output.NoContent.Body? = nil + ) { + self.headers = headers + self.body = body + } + } + /// The project token was revoked + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/{id}/delete(revokeProjectToken)/responses/204`. + /// + /// HTTP response code: `204 noContent`. + case noContent(Operations.revokeProjectToken.Output.NoContent) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.revokeProjectToken.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.revokeProjectToken.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.revokeProjectToken.Output.Unauthorized.Headers = .init(), + body: Operations.revokeProjectToken.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/{id}/delete(revokeProjectToken)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.revokeProjectToken.Output.Unauthorized) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.revokeProjectToken.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.revokeProjectToken.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.revokeProjectToken.Output.Forbidden.Headers = .init(), + body: Operations.revokeProjectToken.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/{id}/delete(revokeProjectToken)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.revokeProjectToken.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.revokeProjectToken.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.revokeProjectToken.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.revokeProjectToken.Output.NotFound.Headers = .init(), + body: Operations.revokeProjectToken.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project token was not found + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/{id}/delete(revokeProjectToken)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.revokeProjectToken.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } /// Deletes a project with a given id. /// /// - Remark: HTTP `DELETE /api/projects/{id}`. diff --git a/Sources/TuistServer/OpenAPI/cloud.yml b/Sources/TuistServer/OpenAPI/cloud.yml index cb636e398ff..d9c9f9c6eba 100644 --- a/Sources/TuistServer/OpenAPI/cloud.yml +++ b/Sources/TuistServer/OpenAPI/cloud.yml @@ -101,13 +101,19 @@ components: title: ArtifactUploadID type: object x-struct: Elixir.TuistCloudWeb.API.Schemas.ArtifactUploadId - AuthenticationToken: - description: Token to authenticate the user with. + AuthenticationTokens: + description: A new user access token to authenticate the user with. properties: - token: - description: User authentication token + access_token: + description: User access token + type: string + refresh_token: + description: User refresh token type: string - title: AuthenticationToken + required: + - access_token + - refresh_token + title: AuthenticationTokens type: object CacheArtifactDownloadURL: description: The URL to download the artifact from the cache. @@ -364,6 +370,7 @@ components: description: ID of the project type: number token: + deprecated: true description: The token that should be used to authenticate the project. For CI only. type: string required: @@ -373,6 +380,43 @@ components: title: Project type: object x-struct: Elixir.TuistCloudWeb.API.Schemas.Project + ProjectFullToken: + description: A new project token. + properties: + token: + description: The generated project token. + type: string + required: + - token + title: ProjectFullToken + type: object + ProjectToken: + description: A token to authenticate API requests as a project. + properties: + id: + description: The token unique identifier. + type: string + inserted_at: + description: The timestamp of when the token was created. + format: date-time + type: string + required: + - id + - inserted_at + title: ProjectToken + type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.ProjectToken + Tokens: + description: A list of project tokens. + properties: + tokens: + items: + $ref: '#/components/schemas/ProjectToken' + type: array + required: + - tokens + title: Tokens + type: object User: description: A user. properties: @@ -540,10 +584,17 @@ paths: schema: description: Token to authenticate the user with. properties: + access_token: + description: A short-lived token to authenticate API requests as user. + type: string + refresh_token: + description: A token to generate new access tokens when they expire. + type: string token: + deprecated: true description: User authentication token type: string - title: AuthenticationToken + title: AuthenticationTokens type: object description: The device code is authenticated 202: @@ -560,6 +611,52 @@ paths: description: The request was not accepted, e.g., when the device code is expired summary: Get a specific device code. tags: [] + /api/auth/refresh_token: + post: + callbacks: {} + description: This endpoint returns new tokens for a given refresh token if the refresh token is valid. + operationId: refreshToken + parameters: [] + requestBody: + content: + application/json: + schema: + properties: + refresh_token: + description: User refresh token + type: string + required: + - refresh_token + type: object + description: Token params + required: false + responses: + 200: + content: + application/json: + schema: + description: A new user access token to authenticate the user with. + properties: + access_token: + description: User access token + type: string + refresh_token: + description: User refresh token + type: string + required: + - access_token + - refresh_token + title: AuthenticationTokens + type: object + description: A new a pair of tokens was generated + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to issue new tokens + summary: Request new tokens. + tags: [] /api/cache: get: callbacks: {} @@ -1552,20 +1649,20 @@ paths: description: The authenticated subject is not authorized to perform this action summary: Create a new project. tags: [] - /api/projects/{account_name}/{project_name}: + /api/projects/{account_handle}/{project_handle}: get: callbacks: {} operationId: showProject parameters: - description: The name of the account that the project belongs to. in: path - name: account_name + name: account_handle required: true schema: type: string - description: The name of the project to show in: path - name: project_name + name: project_handle required: true schema: type: string @@ -1596,20 +1693,20 @@ paths: description: The project was not found summary: Returns a project based on the handle. tags: [] - /api/projects/{account_name}/{project_name}/cache/clean: + /api/projects/{account_handle}/{project_handle}/cache/clean: put: callbacks: {} operationId: cleanCache parameters: - description: The name of the account that the project belongs to. in: path - name: account_name + name: account_handle required: true schema: type: string - description: The name of the project to clean cache for in: path - name: project_name + name: project_handle required: true schema: type: string @@ -1636,6 +1733,158 @@ paths: description: The project was not found summary: Cleans cache for a given project tags: [] + /api/projects/{account_handle}/{project_handle}/tokens: + get: + callbacks: {} + description: This endpoint returns all tokens for a given project. + operationId: listProjectTokens + parameters: + - description: The account handle. + in: path + name: account_handle + required: true + schema: + type: string + - description: The project handle. + in: path + name: project_handle + required: true + schema: + type: string + responses: + 200: + content: + application/json: + schema: + description: A list of project tokens. + properties: + tokens: + items: + $ref: '#/components/schemas/ProjectToken' + type: array + required: + - tokens + title: Tokens + type: object + description: A list of project tokens. + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to list tokens + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authorized to list tokens + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project was not found + summary: List all project tokens. + tags: [] + post: + callbacks: {} + description: This endpoint returns a new project token. + operationId: createProjectToken + parameters: + - description: The account handle. + in: path + name: account_handle + required: true + schema: + type: string + - description: The project handle. + in: path + name: project_handle + required: true + schema: + type: string + responses: + 200: + content: + application/json: + schema: + description: A new project token. + properties: + token: + description: The generated project token. + type: string + required: + - token + title: ProjectFullToken + type: object + description: A project token was generated + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to issue new tokens + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authorized to issue new tokens + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project was not found + summary: Create a new project token. + tags: [] + /api/projects/{account_handle}/{project_handle}/tokens/{id}: + delete: + callbacks: {} + operationId: revokeProjectToken + parameters: + - description: The account handle. + in: path + name: account_handle + required: true + schema: + type: string + - description: The project handle. + in: path + name: project_handle + required: true + schema: + type: string + - description: The ID of the project token + in: path + name: id + required: true + schema: + type: string + responses: + 204: + description: The project token was revoked + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project token was not found + summary: Revokes a project token. + tags: [] /api/projects/{id}: delete: callbacks: {} diff --git a/Sources/TuistServer/Services/CleanCacheService.swift b/Sources/TuistServer/Services/CleanCacheService.swift index fdd5918c7c1..00df862badc 100644 --- a/Sources/TuistServer/Services/CleanCacheService.swift +++ b/Sources/TuistServer/Services/CleanCacheService.swift @@ -6,7 +6,7 @@ import TuistSupport public protocol CleanCacheServicing { func cleanCache( serverURL: URL, - fullName: String + fullHandle: String ) async throws } @@ -36,17 +36,34 @@ enum CleanCacheServiceError: FatalError { } public final class CleanCacheService: CleanCacheServicing { - public init() {} + private let fullHandleService: FullHandleServicing + + public convenience init() { + self.init( + fullHandleService: FullHandleService() + ) + } + + init( + fullHandleService: FullHandleServicing + ) { + self.fullHandleService = fullHandleService + } public func cleanCache( serverURL: URL, - fullName: String + fullHandle: String ) async throws { let client = Client.authenticated(serverURL: serverURL) - let components = fullName.components(separatedBy: "/") + let handles = try fullHandleService.parse(fullHandle) let response = try await client.cleanCache( - .init(path: .init(account_name: components[0], project_name: components[1])) + .init( + path: .init( + account_handle: handles.accountHandle, + project_handle: handles.projectHandle + ) + ) ) switch response { diff --git a/Sources/TuistServer/Services/CreateProjectTokenService.swift b/Sources/TuistServer/Services/CreateProjectTokenService.swift new file mode 100644 index 00000000000..354ae7d84c2 --- /dev/null +++ b/Sources/TuistServer/Services/CreateProjectTokenService.swift @@ -0,0 +1,94 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol CreateProjectTokenServicing { + func createProjectToken( + fullHandle: String, + serverURL: URL + ) async throws -> String +} + +enum CreateProjectTokenServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + case unauthorized(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .forbidden, .notFound, .unauthorized: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "We could not create a new project token due to an unknown Tuist response of \(statusCode)." + case let .forbidden(message), let .notFound(message), let .unauthorized(message): + return message + } + } +} + +public final class CreateProjectTokenService: CreateProjectTokenServicing { + private let fullHandleService: FullHandleServicing + + public convenience init() { + self.init( + fullHandleService: FullHandleService() + ) + } + + init( + fullHandleService: FullHandleServicing + ) { + self.fullHandleService = fullHandleService + } + + public func createProjectToken( + fullHandle: String, + serverURL: URL + ) async throws -> String { + let client = Client.authenticated(serverURL: serverURL) + let handles = try fullHandleService.parse(fullHandle) + + let response = try await client.createProjectToken( + .init( + path: .init( + account_handle: handles.accountHandle, + project_handle: handles.projectHandle + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(projectToken): + return projectToken.token + } + case let .notFound(notFound): + switch notFound.body { + case let .json(error): + throw CreateProjectTokenServiceError.notFound(error.message) + } + case let .forbidden(forbidden): + switch forbidden.body { + case let .json(error): + throw CreateProjectTokenServiceError.forbidden(error.message) + } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw CreateProjectTokenServiceError.unauthorized(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw CreateProjectTokenServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Services/FullHandleService.swift b/Sources/TuistServer/Services/FullHandleService.swift new file mode 100644 index 00000000000..fd99afe2f5a --- /dev/null +++ b/Sources/TuistServer/Services/FullHandleService.swift @@ -0,0 +1,38 @@ +import Foundation +import TuistSupport + +enum FullHandleServiceError: FatalError, Equatable { + case invalidHandle(String) + var type: ErrorType { + switch self { + case .invalidHandle: + return .abort + } + } + + var description: String { + switch self { + case let .invalidHandle(fullHandle): + return "The project full handle \(fullHandle) is not in the format of account-handle/project-handle." + } + } +} + +protocol FullHandleServicing { + func parse(_ fullHandle: String) throws -> (accountHandle: String, projectHandle: String) +} + +final class FullHandleService: FullHandleServicing { + func parse(_ fullHandle: String) throws -> (accountHandle: String, projectHandle: String) { + let components = fullHandle.components(separatedBy: "/") + guard components.count == 2 + else { + throw FullHandleServiceError.invalidHandle(fullHandle) + } + + let accountHandle = components[0] + let projectHandle = components[1] + + return (accountHandle: accountHandle, projectHandle: projectHandle) + } +} diff --git a/Sources/TuistServer/Services/GetAuthTokenService.swift b/Sources/TuistServer/Services/GetAuthTokenService.swift index 5b8f549ccb2..e563102d187 100644 --- a/Sources/TuistServer/Services/GetAuthTokenService.swift +++ b/Sources/TuistServer/Services/GetAuthTokenService.swift @@ -8,7 +8,7 @@ public protocol GetAuthTokenServicing { func getAuthToken( serverURL: URL, deviceCode: String - ) async throws -> String? + ) async throws -> ServerAuthenticationTokens? } public enum GetAuthTokenServiceError: FatalError, Equatable { @@ -40,7 +40,7 @@ public final class GetAuthTokenService: GetAuthTokenServicing { public func getAuthToken( serverURL: URL, deviceCode: String - ) async throws -> String? { + ) async throws -> ServerAuthenticationTokens? { let client = Client.unauthenticated(serverURL: serverURL) let response = try await client.getDeviceCode( @@ -51,7 +51,13 @@ public final class GetAuthTokenService: GetAuthTokenServicing { case let .ok(okResponse): switch okResponse.body { case let .json(token): - return token.token + guard let refreshToken = token.refresh_token, + let accessToken = token.access_token + else { return nil } + return ServerAuthenticationTokens( + accessToken: accessToken, + refreshToken: refreshToken + ) } case .accepted: return nil @@ -61,7 +67,7 @@ public final class GetAuthTokenService: GetAuthTokenServicing { throw GetAuthTokenServiceError.badRequest(error.message) } case let .undocumented(statusCode: statusCode, _): - throw CacheExistsServiceError.unknownError(statusCode) + throw GetAuthTokenServiceError.unknownError(statusCode) } } } diff --git a/Sources/TuistServer/Services/GetProjectService.swift b/Sources/TuistServer/Services/GetProjectService.swift index 4b0dbbeeeca..e8ed66c4419 100644 --- a/Sources/TuistServer/Services/GetProjectService.swift +++ b/Sources/TuistServer/Services/GetProjectService.swift @@ -16,13 +16,12 @@ enum GetProjectServiceError: FatalError { case notFound(String) case forbidden(String) case unauthorized(String) - case invalidHandle(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .forbidden, .notFound, .unauthorized, .invalidHandle: + case .forbidden, .notFound, .unauthorized: return .abort } } @@ -31,8 +30,6 @@ enum GetProjectServiceError: FatalError { switch self { case let .unknownError(statusCode): return "We could not get the project due to an unknown Tuist response of \(statusCode)." - case let .invalidHandle(fullHandle): - return "The project full handle \(fullHandle) is not in the format of account-handle/project-handle." case let .forbidden(message), let .notFound(message), let .unauthorized(message): return message } @@ -40,27 +37,32 @@ enum GetProjectServiceError: FatalError { } public final class GetProjectService: GetProjectServicing { - public init() {} + private let fullHandleService: FullHandleServicing + + public convenience init() { + self.init( + fullHandleService: FullHandleService() + ) + } + + init( + fullHandleService: FullHandleServicing + ) { + self.fullHandleService = fullHandleService + } public func getProject( fullHandle: String, serverURL: URL ) async throws -> ServerProject { let client = Client.authenticated(serverURL: serverURL) - let components = fullHandle.components(separatedBy: "/") - guard components.count == 2 - else { - throw GetProjectServiceError.invalidHandle(fullHandle) - } - - let accountHandle = components[0] - let projectHandle = components[1] + let handles = try fullHandleService.parse(fullHandle) let response = try await client.showProject( .init( path: .init( - account_name: accountHandle, - project_name: projectHandle + account_handle: handles.accountHandle, + project_handle: handles.projectHandle ) ) ) diff --git a/Sources/TuistServer/Services/ListProjectTokensService.swift b/Sources/TuistServer/Services/ListProjectTokensService.swift new file mode 100644 index 00000000000..e7a88847b70 --- /dev/null +++ b/Sources/TuistServer/Services/ListProjectTokensService.swift @@ -0,0 +1,94 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol ListProjectTokensServicing { + func listProjectTokens( + fullHandle: String, + serverURL: URL + ) async throws -> [ServerProjectToken] +} + +enum ListProjectTokensServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + case unauthorized(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .forbidden, .notFound, .unauthorized: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "We could not list the project tokens due to an unknown Tuist response of \(statusCode)." + case let .forbidden(message), let .notFound(message), let .unauthorized(message): + return message + } + } +} + +public final class ListProjectTokensService: ListProjectTokensServicing { + private let fullHandleService: FullHandleServicing + + public convenience init() { + self.init( + fullHandleService: FullHandleService() + ) + } + + init( + fullHandleService: FullHandleServicing + ) { + self.fullHandleService = fullHandleService + } + + public func listProjectTokens( + fullHandle: String, + serverURL: URL + ) async throws -> [ServerProjectToken] { + let client = Client.authenticated(serverURL: serverURL) + let handles = try fullHandleService.parse(fullHandle) + + let response = try await client.listProjectTokens( + .init( + path: .init( + account_handle: handles.accountHandle, + project_handle: handles.projectHandle + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(response): + return response.tokens.map(ServerProjectToken.init) + } + case let .notFound(notFound): + switch notFound.body { + case let .json(error): + throw ListProjectTokensServiceError.notFound(error.message) + } + case let .forbidden(forbidden): + switch forbidden.body { + case let .json(error): + throw ListProjectTokensServiceError.forbidden(error.message) + } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw ListProjectTokensServiceError.unauthorized(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw ListProjectTokensServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Services/RefreshAuthTokenService.swift b/Sources/TuistServer/Services/RefreshAuthTokenService.swift new file mode 100644 index 00000000000..e78b17c274b --- /dev/null +++ b/Sources/TuistServer/Services/RefreshAuthTokenService.swift @@ -0,0 +1,65 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol RefreshAuthTokenServicing: Sendable { + func refreshTokens( + serverURL: URL, + refreshToken: String + ) async throws -> ServerAuthenticationTokens +} + +public enum RefreshAuthTokenServiceError: FatalError, Equatable { + case unknownError(Int) + case unauthorized(String) + + public var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .unauthorized: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The CLI authentication failed due to an unknown Tuist response of \(statusCode)." + case let .unauthorized(message): + return message + } + } +} + +public final class RefreshAuthTokenService: RefreshAuthTokenServicing { + public init() {} + + public func refreshTokens( + serverURL: URL, + refreshToken: String + ) async throws -> ServerAuthenticationTokens { + let client = Client.unauthenticated(serverURL: serverURL) + + let response = try await client.refreshToken( + .init(body: .json(.init(refresh_token: refreshToken))) + ) + + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(tokens): + return ServerAuthenticationTokens(accessToken: tokens.access_token, refreshToken: tokens.refresh_token) + } + case let .unauthorized(unauthorizedResponse): + switch unauthorizedResponse.body { + case let .json(error): + throw RefreshAuthTokenServiceError.unauthorized(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw RefreshAuthTokenServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Services/RevokeProjectTokenService.swift b/Sources/TuistServer/Services/RevokeProjectTokenService.swift new file mode 100644 index 00000000000..ce38271cbc9 --- /dev/null +++ b/Sources/TuistServer/Services/RevokeProjectTokenService.swift @@ -0,0 +1,95 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol RevokeProjectTokenServicing { + func revokeProjectToken( + projectTokenId: String, + fullHandle: String, + serverURL: URL + ) async throws +} + +enum RevokeProjectTokenServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + case unauthorized(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .forbidden, .notFound, .unauthorized: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "We could not revoke the project token due to an unknown Tuist response of \(statusCode)." + case let .forbidden(message), let .notFound(message), let .unauthorized(message): + return message + } + } +} + +public final class RevokeProjectTokenService: RevokeProjectTokenServicing { + private let fullHandleService: FullHandleServicing + + public convenience init() { + self.init( + fullHandleService: FullHandleService() + ) + } + + init( + fullHandleService: FullHandleServicing + ) { + self.fullHandleService = fullHandleService + } + + public func revokeProjectToken( + projectTokenId: String, + fullHandle: String, + serverURL: URL + ) async throws { + let client = Client.authenticated(serverURL: serverURL) + let handles = try fullHandleService.parse(fullHandle) + + let response = try await client.revokeProjectToken( + .init( + path: .init( + account_handle: handles.accountHandle, + project_handle: handles.projectHandle, + id: projectTokenId + ) + ) + ) + switch response { + case .noContent: + // noop + break + case let .notFound(notFound): + switch notFound.body { + case let .json(error): + throw RevokeProjectTokenServiceError.notFound(error.message) + } + case let .forbidden(forbidden): + switch forbidden.body { + case let .json(error): + throw RevokeProjectTokenServiceError.forbidden(error.message) + } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw RevokeProjectTokenServiceError.unauthorized(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw RevokeProjectTokenServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistServer/Session/ServerSessionController.swift b/Sources/TuistServer/Session/ServerSessionController.swift index 0674ea4f341..91d7a780227 100644 --- a/Sources/TuistServer/Session/ServerSessionController.swift +++ b/Sources/TuistServer/Session/ServerSessionController.swift @@ -73,11 +73,15 @@ public final class ServerSessionController: ServerSessionControlling { logger.notice("Press CTRL + C once to cancel the process.") } - let token = try await getAuthToken( + let tokens = try await getAuthTokens( serverURL: serverURL, deviceCode: deviceCode ) - let credentials = ServerCredentials(token: token) + let credentials = ServerCredentials( + token: nil, + accessToken: tokens.accessToken, + refreshToken: tokens.refreshToken + ) try credentialsStore.store(credentials: credentials, serverURL: serverURL) logger.notice("Credentials stored successfully", metadata: .success) } @@ -85,10 +89,10 @@ public final class ServerSessionController: ServerSessionControlling { public func printSession(serverURL: URL) throws { if let token = try serverAuthenticationController.authenticationToken(serverURL: serverURL) { switch token { - case let .user(userToken): + case let .user(legacyToken: legacyToken, accessToken: accessToken, refreshToken: _): logger.notice(""" Requests against \(serverURL.absoluteString) will be authenticated as a user using the following token: - \(userToken) + \(accessToken?.token ?? legacyToken!) """) case let .project(projectToken): logger.notice(""" @@ -107,10 +111,10 @@ public final class ServerSessionController: ServerSessionControlling { logger.notice("Session deleted successfully", metadata: .success) } - private func getAuthToken( + private func getAuthTokens( serverURL: URL, deviceCode: String - ) async throws -> String { + ) async throws -> ServerAuthenticationTokens { if let token = try await getAuthTokenService.getAuthToken( serverURL: serverURL, deviceCode: deviceCode @@ -118,7 +122,7 @@ public final class ServerSessionController: ServerSessionControlling { return token } else { try await Task.sleep(nanoseconds: 1_000_000_000) - return try await getAuthToken(serverURL: serverURL, deviceCode: deviceCode) + return try await getAuthTokens(serverURL: serverURL, deviceCode: deviceCode) } } } diff --git a/Sources/TuistServer/Utilities/JWT.swift b/Sources/TuistServer/Utilities/JWT.swift new file mode 100644 index 00000000000..bac8c0df84b --- /dev/null +++ b/Sources/TuistServer/Utilities/JWT.swift @@ -0,0 +1,20 @@ +import Foundation + +public struct JWT: Equatable { + public let token: String + public let expiryDate: Date +} + +#if DEBUG + extension JWT { + public static func test( + token: String = "token", + expiryDate: Date = Date() + ) -> JWT { + .init( + token: token, + expiryDate: expiryDate + ) + } + } +#endif diff --git a/Sources/TuistServer/Utilities/ServerAuthenticationController.swift b/Sources/TuistServer/Utilities/ServerAuthenticationController.swift index c3b6e911980..1f623806cf0 100644 --- a/Sources/TuistServer/Utilities/ServerAuthenticationController.swift +++ b/Sources/TuistServer/Utilities/ServerAuthenticationController.swift @@ -3,15 +3,15 @@ import Mockable import TuistSupport @Mockable -public protocol ServerAuthenticationControlling { - func authenticationToken(serverURL: URL) throws -> ServerAuthenticationToken? +public protocol ServerAuthenticationControlling: Sendable { + func authenticationToken(serverURL: URL) throws -> AuthenticationToken? } -public enum ServerAuthenticationToken: CustomStringConvertible { +public enum AuthenticationToken: CustomStringConvertible, Equatable { /// The token represents a user session. User sessions are typically used in /// local environments where the user can be guided through an interactive /// authentication workflow - case user(String) + case user(legacyToken: String?, accessToken: JWT?, refreshToken: JWT?) /// The token represents a project session. Project sessions are typically used /// in CI environments where limited scopes are desired for security reasons. @@ -20,8 +20,12 @@ public enum ServerAuthenticationToken: CustomStringConvertible { /// It returns the value of the token public var value: String { switch self { - case let .user(token): - return token + case let .user(legacyToken: legacyToken, accessToken: accessToken, refreshToken: _): + if let accessToken { + return accessToken.token + } else { + return legacyToken! + } case let .project(token): return token } @@ -29,43 +33,106 @@ public enum ServerAuthenticationToken: CustomStringConvertible { public var description: String { switch self { - case let .user(token): - return "tuist user token: \(token)" + case .user: + return "tuist user token: \(value)" case let .project(token): return "tuist project token: \(token)" } } } +enum ServerAuthenticationControllerError: FatalError { + case invalidJWT(String) + + var description: String { + switch self { + case let .invalidJWT(token): + return "The access token \(token) is invalid. Try to reauthenticate by running `tuist auth`." + } + } + + var type: ErrorType { + switch self { + case .invalidJWT: + return .bug + } + } +} + public final class ServerAuthenticationController: ServerAuthenticationControlling { private let credentialsStore: ServerCredentialsStoring private let ciChecker: CIChecking - private let environmentVariables: () -> [String: String] + private let environment: Environmenting public init( credentialsStore: ServerCredentialsStoring = ServerCredentialsStore(), ciChecker: CIChecking = CIChecker(), - environmentVariables: @escaping () -> [String: String] = { ProcessInfo.processInfo.environment } + environment: Environmenting = Environment.shared ) { self.credentialsStore = credentialsStore self.ciChecker = ciChecker - self.environmentVariables = environmentVariables + self.environment = environment } - public func authenticationToken(serverURL: URL) throws -> ServerAuthenticationToken? { + public func authenticationToken(serverURL: URL) throws -> AuthenticationToken? { if ciChecker.isCI() { - let environment = environmentVariables() - if let deprecatedToken = environment[Constants.EnvironmentVariables.deprecatedToken] { + if let deprecatedToken = environment.tuistVariables[Constants.EnvironmentVariables.deprecatedToken] { logger .warning( "Use `TUIST_CONFIG_TOKEN` environment variable instead of `TUIST_CONFIG_CLOUD_TOKEN` to authenticate on the CI" ) return .project(deprecatedToken) } else { - return environment[Constants.EnvironmentVariables.token].map { .project($0) } + return environment.tuistVariables[Constants.EnvironmentVariables.token].map { .project($0) } + } + } else { + let credentials = try credentialsStore.read(serverURL: serverURL) + return try credentials.map { + if $0.token != nil { + logger.warning("You are using a deprecated user token. Please, reauthenticate by running `tuist auth`.") + } + + return .user( + legacyToken: $0.token, + accessToken: try $0.accessToken.map(parseJWT), + refreshToken: try $0.refreshToken.map(parseJWT) + ) } + } + } + + private func parseJWT(_ jwt: String) throws -> JWT { + let components = jwt.components(separatedBy: ".") + guard components.count == 3 + else { + throw ServerAuthenticationControllerError.invalidJWT(jwt) + } + let jwtEncodedPayload = components[1] + let remainder = jwtEncodedPayload.count % 4 + let paddedJWTEncodedPayload: String + if remainder > 0 { + paddedJWTEncodedPayload = jwtEncodedPayload.padding( + toLength: jwtEncodedPayload.count + 4 - remainder, + withPad: "=", + startingAt: 0 + ) } else { - return (try credentialsStore.read(serverURL: serverURL)?.token).map { .user($0) } + paddedJWTEncodedPayload = jwtEncodedPayload + } + guard let data = Data(base64Encoded: paddedJWTEncodedPayload) + else { + throw ServerAuthenticationControllerError.invalidJWT(jwtEncodedPayload) } + let jsonDecoder = JSONDecoder() + let payload = try jsonDecoder.decode(JWTPayload.self, from: data) + + return JWT( + token: jwt, + expiryDate: Date(timeIntervalSince1970: TimeInterval(payload.exp)) + ) + } + + private struct JWTPayload: Codable { + let exp: Int } } diff --git a/Sources/TuistServer/Utilities/ServerCredentialsStore.swift b/Sources/TuistServer/Utilities/ServerCredentialsStore.swift index aac481c07b6..f7e32b5a946 100644 --- a/Sources/TuistServer/Utilities/ServerCredentialsStore.swift +++ b/Sources/TuistServer/Utilities/ServerCredentialsStore.swift @@ -4,20 +4,32 @@ import Path import TuistSupport public struct ServerCredentials: Codable, Equatable { - /// Authentication token. - public let token: String + /// Deprecated authentication token. + public let token: String? + + /// JWT access token + public let accessToken: String? + + /// JWT refresh token + public let refreshToken: String? /// Initializes the credentials with its attributes. /// - Parameters: /// - token: Authentication token. /// - account: Account identifier. - public init(token: String) { + public init( + token: String?, + accessToken: String?, + refreshToken: String? + ) { self.token = token + self.accessToken = accessToken + self.refreshToken = refreshToken } } @Mockable -public protocol ServerCredentialsStoring { +public protocol ServerCredentialsStoring: Sendable { /// It stores the credentials for the server with the given URL. /// - Parameters: /// - credentials: Credentials to be stored. diff --git a/Sources/TuistSupport/Credentials/CredentialsStore.swift b/Sources/TuistSupport/Credentials/CredentialsStore.swift index b8468edd808..6a44dd4fe4c 100644 --- a/Sources/TuistSupport/Credentials/CredentialsStore.swift +++ b/Sources/TuistSupport/Credentials/CredentialsStore.swift @@ -1,6 +1,8 @@ import Foundation import KeychainAccess +import Mockable +@Mockable public protocol CredentialsStoring { /// It stores the credentials for the server with the given URL. /// - Parameters: diff --git a/Sources/TuistSupport/Utils/CIChecker.swift b/Sources/TuistSupport/Utils/CIChecker.swift index 3668757a6ad..0c3f79e48f6 100644 --- a/Sources/TuistSupport/Utils/CIChecker.swift +++ b/Sources/TuistSupport/Utils/CIChecker.swift @@ -1,6 +1,8 @@ import Foundation +import Mockable -public protocol CIChecking: AnyObject { +@Mockable +public protocol CIChecking: AnyObject, Sendable { /// Returns true when the environment in which the tuist process is running is a CI environment. func isCI() -> Bool } diff --git a/Sources/TuistSupport/Utils/DateService.swift b/Sources/TuistSupport/Utils/DateService.swift new file mode 100644 index 00000000000..434308e5ef4 --- /dev/null +++ b/Sources/TuistSupport/Utils/DateService.swift @@ -0,0 +1,15 @@ +import Foundation +import Mockable + +@Mockable +public protocol DateServicing: Sendable { + func now() -> Date +} + +public struct DateService: DateServicing { + public init() {} + + public func now() -> Date { + Date() + } +} diff --git a/Sources/TuistSupportTesting/Credentials/MockCredentialsStore.swift b/Sources/TuistSupportTesting/Credentials/MockCredentialsStore.swift deleted file mode 100644 index b6606c92187..00000000000 --- a/Sources/TuistSupportTesting/Credentials/MockCredentialsStore.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation -@testable import TuistSupport - -public final class MockCredentialsStore: CredentialsStoring { - public init() {} - public var credentials: [URL: Credentials] = [:] - - public func store(credentials: Credentials, serverURL: URL) throws { - self.credentials[serverURL] = credentials - } - - public func read(serverURL: URL) throws -> Credentials? { - credentials[serverURL] - } - - public func get(serverURL: URL) throws -> Credentials { - credentials[serverURL]! - } - - public func delete(serverURL: URL) throws { - credentials.removeValue(forKey: serverURL) - } -} diff --git a/Sources/TuistSupportTesting/Utils/MockCIChecker.swift b/Sources/TuistSupportTesting/Utils/MockCIChecker.swift deleted file mode 100644 index c55a68f9e8e..00000000000 --- a/Sources/TuistSupportTesting/Utils/MockCIChecker.swift +++ /dev/null @@ -1,10 +0,0 @@ -import Foundation -import TuistSupport - -public final class MockCIChecker: CIChecking { - var isCIStub: Bool = false - - public func isCI() -> Bool { - isCIStub - } -} diff --git a/Sources/TuistSupportTesting/Utils/TestingLogHandler.swift b/Sources/TuistSupportTesting/Utils/TestingLogHandler.swift index d4277a8db65..5a9edfe16cc 100644 --- a/Sources/TuistSupportTesting/Utils/TestingLogHandler.swift +++ b/Sources/TuistSupportTesting/Utils/TestingLogHandler.swift @@ -2,7 +2,7 @@ import Foundation import TuistSupport public struct TestingLogHandler: LogHandler { - static var collected: [Logger.Level: [String]] { + public static var collected: [Logger.Level: [String]] { collectionQueue.sync { collectedLogs } diff --git a/Tests/TuistAsyncQueueTests/AsyncQueueTests.swift b/Tests/TuistAsyncQueueTests/AsyncQueueTests.swift index 52f5bbb2fe5..b8b6d876fd1 100644 --- a/Tests/TuistAsyncQueueTests/AsyncQueueTests.swift +++ b/Tests/TuistAsyncQueueTests/AsyncQueueTests.swift @@ -1,4 +1,5 @@ import Foundation +import MockableTest import Queuer import TuistCore import TuistSupport @@ -9,20 +10,20 @@ import XCTest @testable import TuistSupportTesting final class AsyncQueueTests: TuistUnitTestCase { - var subject: AsyncQueue! + private var subject: AsyncQueue! - let dispatcher1ID = "Dispatcher1" - let dispatcher2ID = "Dispatcher2" + private let dispatcher1ID = "Dispatcher1" + private let dispatcher2ID = "Dispatcher2" - var mockAsyncQueueDispatcher1: MockAsyncQueueDispatcher! - var mockAsyncQueueDispatcher2: MockAsyncQueueDispatcher! + private var mockAsyncQueueDispatcher1: MockAsyncQueueDispatcher! + private var mockAsyncQueueDispatcher2: MockAsyncQueueDispatcher! - var mockCIChecker: MockCIChecker! + private var ciChecker: MockCIChecking! - var mockPersistor: MockAsyncQueuePersistor! - var mockQueuer: MockQueuer! + private var mockPersistor: MockAsyncQueuePersistor! + private var mockQueuer: MockQueuer! - let timeout = 3.0 + private let timeout = 3.0 override func setUp() { super.setUp() @@ -32,7 +33,7 @@ final class AsyncQueueTests: TuistUnitTestCase { mockAsyncQueueDispatcher2 = MockAsyncQueueDispatcher() mockAsyncQueueDispatcher2.stubbedIdentifier = dispatcher2ID - mockCIChecker = MockCIChecker() + ciChecker = .init() mockPersistor = MockAsyncQueuePersistor() mockQueuer = MockQueuer() } @@ -40,7 +41,7 @@ final class AsyncQueueTests: TuistUnitTestCase { override func tearDown() { mockAsyncQueueDispatcher1 = nil mockAsyncQueueDispatcher2 = nil - mockCIChecker = nil + ciChecker = nil mockPersistor = nil mockQueuer = nil subject = nil @@ -50,12 +51,11 @@ final class AsyncQueueTests: TuistUnitTestCase { func makeSubject( queue: Queuing? = nil, ciChecker: CIChecking? = nil, - persistor: AsyncQueuePersisting? = nil, - dispatchers _: [AsyncQueueDispatching]? = nil + persistor: AsyncQueuePersisting? = nil ) -> AsyncQueue { let asyncQueue = AsyncQueue( queue: queue ?? mockQueuer, - ciChecker: ciChecker ?? mockCIChecker, + ciChecker: ciChecker ?? self.ciChecker, persistor: persistor ?? mockPersistor ) asyncQueue.register(dispatcher: mockAsyncQueueDispatcher1) @@ -201,7 +201,9 @@ final class AsyncQueueTests: TuistUnitTestCase { // Given let eventTuple1: AsyncQueueEventTuple = makeEventTuple(id: 1) mockPersistor.stubbedReadAllResult = [eventTuple1] - mockCIChecker.isCIStub = true + given(ciChecker) + .isCI() + .willReturn(true) // When subject = makeSubject(queue: Queuer.shared) @@ -228,6 +230,9 @@ final class AsyncQueueTests: TuistUnitTestCase { func test_start_readsPersistedEventsInitialization() throws { // Given + given(ciChecker) + .isCI() + .willReturn(false) let eventTuple1: AsyncQueueEventTuple = makeEventTuple(id: 1) let eventTuple2: AsyncQueueEventTuple = makeEventTuple(id: 2) let eventTuple3: AsyncQueueEventTuple = makeEventTuple(id: 3) @@ -262,6 +267,9 @@ final class AsyncQueueTests: TuistUnitTestCase { func test_start_persistedEventIsDispatchedByTheRightDispatcher() throws { // Given + given(ciChecker) + .isCI() + .willReturn(false) let eventTuple1: AsyncQueueEventTuple = makeEventTuple(id: 1) mockPersistor.stubbedReadAllResult = [eventTuple1] @@ -287,6 +295,9 @@ final class AsyncQueueTests: TuistUnitTestCase { func test_start_sentPersistedEventIsThenDeleted() throws { // Given + given(ciChecker) + .isCI() + .willReturn(false) let id: UInt = 1 let eventTuple1: AsyncQueueEventTuple = makeEventTuple(id: id) mockPersistor.stubbedReadAllResult = [eventTuple1] diff --git a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift index 865fdeb064e..d9e1a93b541 100644 --- a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift @@ -1,22 +1,56 @@ import Foundation import TuistAcceptanceTesting +import TuistSupportTesting import XCTest @testable import TuistKit @testable import TuistServer -final class ServerAcceptanceTestProjects: TuistAcceptanceTestCase { - func test_create_and_delete_organization_with_project() async throws { +final class ServerAcceptanceTestProjects: ServerAcceptanceTestCase { + func test_list_project() async throws { + try await run(ProjectListCommand.self) + XCTAssertStandardOutput(pattern: "Listing all your projects:") + XCTAssertStandardOutput(pattern: "• \(fullHandle)") + } +} + +final class ServerAcceptanceTestProjectTokens: ServerAcceptanceTestCase { + func test_create_list_and_revoke_project_token() async throws { + try await run(ProjectTokensCreateCommand.self, fullHandle) + try await run(ProjectTokensListCommand.self, fullHandle) + let id = try XCTUnwrap( + TestingLogHandler.collected[.info, <=].components(separatedBy: .newlines).dropLast().last? + .components(separatedBy: .whitespaces).first + ) + try await run(ProjectTokensRevokeCommand.self, id, fullHandle) + TestingLogHandler.reset() + try await run(ProjectTokensListCommand.self, fullHandle) + XCTAssertStandardOutput( + pattern: "No project tokens found. Create one by running `tuist project tokens create \(fullHandle)." + ) + } +} + +// MARK: - Helpers + +class ServerAcceptanceTestCase: TuistAcceptanceTestCase { + var fullHandle: String = "" + var organizationHandle: String = "" + var projectHandle: String = "" + + override func setUp() async throws { + try await super.setUp() try setUpFixture(.iosAppWithFrameworks) - let organizationHandle = String(UUID().uuidString.prefix(12).lowercased()) - let projectHandle = String(UUID().uuidString.prefix(12).lowercased()) - let fullHandle = "\(organizationHandle)/\(projectHandle)" + organizationHandle = String(UUID().uuidString.prefix(12).lowercased()) + projectHandle = String(UUID().uuidString.prefix(12).lowercased()) + fullHandle = "\(organizationHandle)/\(projectHandle)" try await run(OrganizationCreateCommand.self, organizationHandle) try await run(ProjectCreateCommand.self, fullHandle) - try await run(ProjectListCommand.self) + } + + override func tearDown() async throws { try await run(ProjectDeleteCommand.self, fullHandle) try await run(OrganizationDeleteCommand.self, organizationHandle) - XCTAssertStandardOutput(pattern: "Listing all your projects:") - XCTAssertStandardOutput(pattern: "• \(fullHandle)") + try await super.tearDown() } } diff --git a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift index 760cbee6172..77fb684ad15 100644 --- a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift +++ b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift @@ -622,15 +622,15 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(commandWithArgs.path, "/new/delete/path") } - func testCloudProjectTokenCommandUsesEnvVars() throws { + func testProjectTokensCreateCommandUsesEnvVars() throws { setVariable(.projectTokenFullHandle, value: "tuist-org/tuist") setVariable(.projectTokenPath, value: "/path/to/token") - let commandWithEnvVars = try ProjectTokenCommand.parse([]) + let commandWithEnvVars = try ProjectTokensCreateCommand.parse([]) XCTAssertEqual(commandWithEnvVars.fullHandle, "tuist-org/tuist") XCTAssertEqual(commandWithEnvVars.path, "/path/to/token") - let commandWithArgs = try ProjectTokenCommand.parse([ + let commandWithArgs = try ProjectTokensCreateCommand.parse([ "new-org/new-project", "--path", "/new/token/path", ]) diff --git a/Tests/TuistKitTests/Services/CleanServiceTests.swift b/Tests/TuistKitTests/Services/CleanServiceTests.swift index 56f67f943e0..6aa3e119f02 100644 --- a/Tests/TuistKitTests/Services/CleanServiceTests.swift +++ b/Tests/TuistKitTests/Services/CleanServiceTests.swift @@ -199,7 +199,7 @@ final class CleanServiceTests: TuistUnitTestCase { given(cleanCacheService) .cleanCache( serverURL: .value(url), - fullName: .value("tuist/tuist") + fullHandle: .value("tuist/tuist") ) .willReturn(()) @@ -224,7 +224,7 @@ final class CleanServiceTests: TuistUnitTestCase { // Then verify(cleanCacheService) - .cleanCache(serverURL: .any, fullName: .any) + .cleanCache(serverURL: .any, fullHandle: .any) .called(1) XCTAssertStandardOutput(pattern: "Successfully cleaned the remote storage.") } diff --git a/Tests/TuistKitTests/Services/FullHandleServiceTests.swift b/Tests/TuistKitTests/Services/FullHandleServiceTests.swift new file mode 100644 index 00000000000..ce817f81a2e --- /dev/null +++ b/Tests/TuistKitTests/Services/FullHandleServiceTests.swift @@ -0,0 +1,45 @@ +import Foundation +import TuistSupportTesting +import XCTest + +@testable import TuistServer + +final class FullHandleServiceTests: TuistUnitTestCase { + private var subject: FullHandleServicing! + override func setUp() { + super.setUp() + + subject = FullHandleService() + } + + override func tearDown() { + subject = nil + + super.tearDown() + } + + func test_parsing_full_handle_when_valid() throws { + // When + let got = try subject.parse("tuist-org/tuist") + + // Then + XCTAssertEqual(got.accountHandle, "tuist-org") + XCTAssertEqual(got.projectHandle, "tuist") + } + + func test_parsing_full_handle_when_only_account_or_project_handle_is_present() throws { + // When / Then + XCTAssertThrowsSpecific( + try subject.parse("tuist"), + FullHandleServiceError.invalidHandle("tuist") + ) + } + + func test_parsing_full_handle_when_extra_components_are_present() throws { + // When / Then + XCTAssertThrowsSpecific( + try subject.parse("tuist-org/tuist/extra"), + FullHandleServiceError.invalidHandle("tuist-org/tuist/extra") + ) + } +} diff --git a/Tests/TuistKitTests/Services/Project/ProjectDeleteServiceTests.swift b/Tests/TuistKitTests/Services/Project/ProjectDeleteServiceTests.swift index 5461963f3a1..64014f1cae1 100644 --- a/Tests/TuistKitTests/Services/Project/ProjectDeleteServiceTests.swift +++ b/Tests/TuistKitTests/Services/Project/ProjectDeleteServiceTests.swift @@ -64,7 +64,7 @@ final class ProjectDeleteServiceTests: TuistUnitTestCase { given(credentialsStore) .get(serverURL: .value(serverURL)) - .willReturn(.init(token: "token")) + .willReturn(.init(token: nil, accessToken: "access-token", refreshToken: "refresh-token")) // When / Then try await subject.run(fullHandle: "tuist-org/tuist", directory: nil) diff --git a/Tests/TuistKitTests/Services/Project/ProjectTokensCreateServiceTests.swift b/Tests/TuistKitTests/Services/Project/ProjectTokensCreateServiceTests.swift new file mode 100644 index 00000000000..a98d4d29b64 --- /dev/null +++ b/Tests/TuistKitTests/Services/Project/ProjectTokensCreateServiceTests.swift @@ -0,0 +1,62 @@ +import Foundation +import MockableTest +import TuistLoader +import TuistServer +import TuistSupportTesting +import XCTest + +@testable import TuistKit + +final class ProjectTokensCreateServiceTests: TuistUnitTestCase { + private var createProjectTokenService: MockCreateProjectTokenServicing! + private var serverURLService: MockServerURLServicing! + private var configLoader: MockConfigLoading! + private var serverURL: URL! + private var subject: ProjectTokensCreateService! + + override func setUp() { + super.setUp() + + createProjectTokenService = .init() + serverURLService = .init() + configLoader = .init() + serverURL = URL(string: "https://test.cloud.tuist.io")! + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test(url: serverURL)) + given(serverURLService) + .url(configServerURL: .value(serverURL)) + .willReturn(serverURL) + subject = ProjectTokensCreateService( + createProjectTokenService: createProjectTokenService, + serverURLService: serverURLService, + configLoader: configLoader + ) + } + + override func tearDown() { + createProjectTokenService = nil + serverURLService = nil + configLoader = nil + serverURL = nil + subject = nil + + super.tearDown() + } + + func test_create_project_token() async throws { + // Given + given(createProjectTokenService) + .createProjectToken( + fullHandle: .value("tuist-org/tuist"), + serverURL: .any + ) + .willReturn("new-token") + + // When + try await subject.run(fullHandle: "tuist-org/tuist", directory: nil) + + // Then + XCTAssertStandardOutput(pattern: "new-token") + } +} diff --git a/Tests/TuistKitTests/Services/Project/ProjectTokensListServiceTests.swift b/Tests/TuistKitTests/Services/Project/ProjectTokensListServiceTests.swift new file mode 100644 index 00000000000..caad2da524b --- /dev/null +++ b/Tests/TuistKitTests/Services/Project/ProjectTokensListServiceTests.swift @@ -0,0 +1,98 @@ +import Foundation +import MockableTest +import TuistLoader +import TuistServer +import TuistSupportTesting +import XCTest + +@testable import TuistKit + +final class ProjectTokensListServiceTests: TuistUnitTestCase { + private var listProjectTokensService: MockListProjectTokensServicing! + private var serverURLService: MockServerURLServicing! + private var configLoader: MockConfigLoading! + private var serverURL: URL! + private var subject: ProjectTokensListService! + + override func setUp() { + super.setUp() + + listProjectTokensService = .init() + serverURLService = .init() + configLoader = .init() + serverURL = URL(string: "https://test.cloud.tuist.io")! + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test(url: serverURL)) + given(serverURLService) + .url(configServerURL: .value(serverURL)) + .willReturn(serverURL) + subject = ProjectTokensListService( + listProjectTokensService: listProjectTokensService, + serverURLService: serverURLService, + configLoader: configLoader + ) + } + + override func tearDown() { + listProjectTokensService = nil + serverURLService = nil + configLoader = nil + serverURL = nil + subject = nil + + super.tearDown() + } + + func test_list_project_tokens() async throws { + // Given + given(listProjectTokensService) + .listProjectTokens( + fullHandle: .value("tuist-org/tuist"), + serverURL: .any + ) + .willReturn( + [ + .test( + id: "project-token-one", + insertedAt: Date(timeIntervalSince1970: 0) + ), + .test( + id: "project-token-two", + insertedAt: Date(timeIntervalSince1970: 10) + ), + ] + ) + + // When + try await subject.run(fullHandle: "tuist-org/tuist", directory: nil) + + // Then + XCTAssertStandardOutput( + pattern: """ + ID Created at + ───────────────── ───────────────────────── + project-token-one 1970-01-01 00:00:00 +0000 + project-token-two 1970-01-01 00:00:10 +0000 + """ + ) + } + + func test_list_project_tokens_when_none_present() async throws { + // Given + given(listProjectTokensService) + .listProjectTokens( + fullHandle: .value("tuist-org/tuist"), + serverURL: .any + ) + .willReturn([]) + + // When + try await subject.run(fullHandle: "tuist-org/tuist", directory: nil) + + // Then + XCTAssertStandardOutput( + pattern: "No project tokens found. Create one by running `tuist project tokens create tuist-org/tuist." + ) + } +} diff --git a/Tests/TuistKitTests/Services/Project/ProjectTokensRevokeServiceTests.swift b/Tests/TuistKitTests/Services/Project/ProjectTokensRevokeServiceTests.swift new file mode 100644 index 00000000000..fcf5424a192 --- /dev/null +++ b/Tests/TuistKitTests/Services/Project/ProjectTokensRevokeServiceTests.swift @@ -0,0 +1,67 @@ +import Foundation +import MockableTest +import TuistLoader +import TuistServer +import TuistSupportTesting +import XCTest + +@testable import TuistKit + +final class ProjectTokensRevokeServiceTests: TuistUnitTestCase { + private var revokeProjectTokenService: MockRevokeProjectTokenServicing! + private var serverURLService: MockServerURLServicing! + private var configLoader: MockConfigLoading! + private var serverURL: URL! + private var subject: ProjectTokensRevokeService! + + override func setUp() { + super.setUp() + + revokeProjectTokenService = .init() + serverURLService = .init() + configLoader = .init() + serverURL = URL(string: "https://test.cloud.tuist.io")! + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test(url: serverURL)) + given(serverURLService) + .url(configServerURL: .value(serverURL)) + .willReturn(serverURL) + subject = ProjectTokensRevokeService( + revokeProjectTokenService: revokeProjectTokenService, + serverURLService: serverURLService, + configLoader: configLoader + ) + } + + override func tearDown() { + revokeProjectTokenService = nil + serverURLService = nil + configLoader = nil + serverURL = nil + subject = nil + + super.tearDown() + } + + func test_revoke_project_token() async throws { + // Given + given(revokeProjectTokenService) + .revokeProjectToken( + projectTokenId: .value("project-token-id"), + fullHandle: .value("tuist-org/tuist"), + serverURL: .any + ) + .willReturn() + + // When + try await subject.run( + projectTokenId: "project-token-id", + fullHandle: "tuist-org/tuist", + directory: nil + ) + + // Then + XCTAssertStandardOutput(pattern: "The project token project-token-id was successfully revoked.") + } +} diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift index 9a9c4d71b82..59a035e9c32 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift @@ -13,7 +13,7 @@ import XCTest final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { private var subject: TuistAnalyticsDispatcher! private var createCommandEventService: MockCreateCommandEventServicing! - private var ciChecker: MockCIChecker! + private var ciChecker: MockCIChecking! private var cacheDirectoriesProviderFactory: MockCacheDirectoriesProviderFactoring! private var analyticsArtifactUploadService: MockAnalyticsArtifactUploadServicing! @@ -34,7 +34,7 @@ final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { super.tearDown() } - func testDispatch_whenCloudAnalyticsIsEnabled_sendsToCloud() throws { + func testDispatch_whenAnalyticsIsEnabled_sendsToServer() throws { // Given let fullHandle = "project" let url = URL.test() @@ -51,6 +51,9 @@ final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { backend: backend ) + given(ciChecker) + .isCI() + .willReturn(false) given(createCommandEventService) .createCommandEvent( commandEvent: .matching { commandEvent in diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift index 0497110bcee..400ae4cecb1 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift @@ -12,7 +12,7 @@ import XCTest final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { private var fullHandle = "tuist-org/tuist" private var createCommandEventService: MockCreateCommandEventServicing! - private var ciChecker: MockCIChecker! + private var ciChecker: MockCIChecking! private var cacheDirectoriesProviderFactory: MockCacheDirectoriesProviderFactoring! private var analyticsArtifactUploadService: MockAnalyticsArtifactUploadServicing! private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! @@ -53,7 +53,9 @@ final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { given(cacheDirectoriesProvider) .cacheDirectory(for: .value(.runs)) .willReturn(try temporaryPath()) - ciChecker.isCIStub = false + given(ciChecker) + .isCI() + .willReturn(false) let event = CommandEvent.test() given(createCommandEventService) .createCommandEvent( @@ -80,7 +82,9 @@ final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { given(cacheDirectoriesProvider) .cacheDirectory(for: .value(.runs)) .willReturn(try temporaryPath()) - ciChecker.isCIStub = true + given(ciChecker) + .isCI() + .willReturn(true) let event = CommandEvent.test() given(createCommandEventService) .createCommandEvent( @@ -104,7 +108,9 @@ final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { func test_send_when_is_ci_and_result_bundle_exists() async throws { // Given - ciChecker.isCIStub = true + given(ciChecker) + .isCI() + .willReturn(true) let event = CommandEvent.test() given(createCommandEventService) .createCommandEvent( diff --git a/Tests/TuistServerTests/Client/ServerClientAuthenticationMiddlewareTests.swift b/Tests/TuistServerTests/Client/ServerClientAuthenticationMiddlewareTests.swift new file mode 100644 index 00000000000..128f92bdeb1 --- /dev/null +++ b/Tests/TuistServerTests/Client/ServerClientAuthenticationMiddlewareTests.swift @@ -0,0 +1,259 @@ +import Foundation +import MockableTest +import OpenAPIRuntime +import TuistSupport +import TuistSupportTesting +import XCTest + +@testable import TuistServer + +final class ServerClientAuthenticationMiddlewareTests: TuistUnitTestCase { + private var subject: ServerClientAuthenticationMiddleware! + private var serverAuthenticationController: MockServerAuthenticationControlling! + private var serverCredentialsStore: MockServerCredentialsStoring! + private var refreshAuthTokenService: MockRefreshAuthTokenServicing! + private var dateService: MockDateServicing! + + override func setUp() { + super.setUp() + + serverAuthenticationController = .init() + serverCredentialsStore = .init() + refreshAuthTokenService = .init() + dateService = .init() + subject = .init( + serverAuthenticationController: serverAuthenticationController, + serverCredentialsStore: serverCredentialsStore, + refreshAuthTokenService: refreshAuthTokenService, + dateService: dateService + ) + } + + override func tearDown() { + serverAuthenticationController = nil + serverCredentialsStore = nil + refreshAuthTokenService = nil + dateService = nil + subject = nil + super.tearDown() + } + + func test_when_authentication_token_is_nil() async throws { + let url = URL(string: "https://test.tuist.io")! + let request = Request(path: "/", method: .get) + let response = Response( + statusCode: 200 + ) + + given(serverAuthenticationController) + .authenticationToken(serverURL: .any) + .willReturn(nil) + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.intercept( + request, + baseURL: url, + operationID: "123" + ) { _, _ in + response + }, + ServerClientAuthenticationError.notAuthenticated + ) + } + + func test_when_using_project_token() async throws { + let url = URL(string: "https://test.tuist.io")! + let request = Request(path: "/", method: .get) + let response = Response( + statusCode: 200 + ) + + given(serverAuthenticationController) + .authenticationToken(serverURL: .any) + .willReturn(.project("project-token")) + + var gotRequest: Request! + + // When + let gotResponse = try await subject.intercept( + request, + baseURL: url, + operationID: "123" + ) { request, _ in + gotRequest = request + return response + } + + // Then + XCTAssertEqual(gotResponse, response) + XCTAssertEqual( + gotRequest.headerFields, + [ + HeaderField( + name: "Authorization", value: "Bearer project-token" + ), + ] + ) + } + + func test_when_using_legacy_token() async throws { + let url = URL(string: "https://test.tuist.io")! + let request = Request(path: "/", method: .get) + let response = Response( + statusCode: 200 + ) + + given(serverAuthenticationController) + .authenticationToken(serverURL: .any) + .willReturn(.user(legacyToken: "legacy-token", accessToken: nil, refreshToken: nil)) + + var gotRequest: Request! + + // When + let gotResponse = try await subject.intercept( + request, + baseURL: url, + operationID: "123" + ) { request, _ in + gotRequest = request + return response + } + + // Then + XCTAssertEqual(gotResponse, response) + XCTAssertEqual( + gotRequest.headerFields, + [ + HeaderField( + name: "Authorization", value: "Bearer legacy-token" + ), + ] + ) + } + + func test_when_using_valid_access_token() async throws { + let url = URL(string: "https://test.tuist.io")! + let request = Request(path: "/", method: .get) + let response = Response( + statusCode: 200 + ) + + given(serverAuthenticationController) + .authenticationToken(serverURL: .any) + .willReturn( + .user( + legacyToken: nil, + accessToken: .test( + token: "access-token", + expiryDate: Date(timeIntervalSince1970: 100) + ), + refreshToken: .test() + ) + ) + + var gotRequest: Request! + + given(dateService) + .now() + .willReturn(Date(timeIntervalSince1970: 0)) + + // When + let gotResponse = try await subject.intercept( + request, + baseURL: url, + operationID: "123" + ) { request, _ in + gotRequest = request + return response + } + + // Then + XCTAssertEqual(gotResponse, response) + XCTAssertEqual( + gotRequest.headerFields, + [ + HeaderField( + name: "Authorization", value: "Bearer access-token" + ), + ] + ) + } + + func test_when_access_token_is_expired() async throws { + let url = URL(string: "https://test.tuist.io")! + let request = Request(path: "/", method: .get) + let response = Response( + statusCode: 200 + ) + + given(serverAuthenticationController) + .authenticationToken(serverURL: .any) + .willReturn( + .user( + legacyToken: nil, + accessToken: .test( + token: "access-token", + expiryDate: Date(timeIntervalSince1970: 100) + ), + refreshToken: .test( + token: "refresh-token", + expiryDate: Date(timeIntervalSince1970: 1000) + ) + ) + ) + + var gotRequest: Request! + + given(dateService) + .now() + .willReturn(Date(timeIntervalSince1970: 90)) + + given(refreshAuthTokenService) + .refreshTokens(serverURL: .any, refreshToken: .value("refresh-token")) + .willReturn( + ServerAuthenticationTokens( + accessToken: "new-access-token", + refreshToken: "new-refresh-token" + ) + ) + + given(serverCredentialsStore) + .store(credentials: .any, serverURL: .any) + .willReturn() + + // When + let gotResponse = try await subject.intercept( + request, + baseURL: url, + operationID: "123" + ) { request, _ in + gotRequest = request + return response + } + + // Then + verify(serverCredentialsStore) + .store( + credentials: .value( + ServerCredentials( + token: nil, + accessToken: "new-access-token", + refreshToken: "new-refresh-token" + ) + ), + serverURL: .any + ) + .called(1) + + XCTAssertEqual(gotResponse, response) + XCTAssertEqual( + gotRequest.headerFields, + [ + HeaderField( + name: "Authorization", value: "Bearer new-access-token" + ), + ] + ) + } +} diff --git a/Tests/TuistServerTests/Session/ServerSessionControllerTests.swift b/Tests/TuistServerTests/Session/ServerSessionControllerTests.swift index 518f7e040be..367c6fd8b27 100644 --- a/Tests/TuistServerTests/Session/ServerSessionControllerTests.swift +++ b/Tests/TuistServerTests/Session/ServerSessionControllerTests.swift @@ -10,7 +10,7 @@ import XCTest final class ServerSessionControllerTests: TuistUnitTestCase { private var credentialsStore: MockServerCredentialsStoring! - private var ciChecker: MockCIChecker! + private var ciChecker: MockCIChecking! private var opener: MockOpener! private var serverURL: URL! private var getAuthTokenService: MockGetAuthTokenServicing! @@ -21,7 +21,7 @@ final class ServerSessionControllerTests: TuistUnitTestCase { override func setUp() { super.setUp() credentialsStore = .init() - ciChecker = MockCIChecker() + ciChecker = .init() opener = MockOpener() serverURL = URL.test() getAuthTokenService = MockGetAuthTokenServicing() @@ -50,11 +50,15 @@ final class ServerSessionControllerTests: TuistUnitTestCase { func test_authenticate_when_tokenAndAccountParametersAreIncluded() async throws { // Given - given(getAuthTokenService).getAuthToken(serverURL: .any, deviceCode: .any).willReturn("token") + given(getAuthTokenService) + .getAuthToken(serverURL: .any, deviceCode: .any) + .willReturn(ServerAuthenticationTokens(accessToken: "access-token", refreshToken: "refresh-token")) given(uniqueIDGenerator).uniqueID().willReturn("id") given(credentialsStore) .read(serverURL: .value(serverURL)) - .willReturn(ServerCredentials(token: "token")) + .willReturn( + ServerCredentials(token: nil, accessToken: "access-token", refreshToken: "refresh-token") + ) given(credentialsStore) .store(credentials: .any, serverURL: .value(serverURL)) .willReturn() @@ -70,15 +74,39 @@ final class ServerSessionControllerTests: TuistUnitTestCase { """) } + func test_printSession_when_legacyUserToken() throws { + // When + given(serverAuthenticationController) + .authenticationToken(serverURL: .value(serverURL)) + .willReturn( + .user(legacyToken: "legacy-token", accessToken: nil, refreshToken: nil) + ) + try subject.printSession(serverURL: serverURL) + + // Then + XCTAssertPrinterOutputContains(""" + Requests against \(serverURL.absoluteString) will be authenticated as a user using the following token: + legacy-token + """) + } + func test_printSession_when_userToken() throws { // When - given(serverAuthenticationController).authenticationToken(serverURL: .value(serverURL)).willReturn(.user("token")) + given(serverAuthenticationController) + .authenticationToken(serverURL: .value(serverURL)) + .willReturn( + .user( + legacyToken: nil, + accessToken: .test(token: "access-token"), + refreshToken: .test(token: "refresh-token") + ) + ) try subject.printSession(serverURL: serverURL) // Then XCTAssertPrinterOutputContains(""" Requests against \(serverURL.absoluteString) will be authenticated as a user using the following token: - token + access-token """) } @@ -107,9 +135,39 @@ final class ServerSessionControllerTests: TuistUnitTestCase { """) } - func test_logout_deletesTheCredentials() throws { + func test_logout_deletesLegacyCredentials() throws { + // Given + let credentials = ServerCredentials( + token: "token", + accessToken: nil, + refreshToken: nil + ) + given(credentialsStore) + .store(credentials: .value(credentials), serverURL: .value(serverURL)) + .willReturn() + try credentialsStore.store(credentials: credentials, serverURL: serverURL) + + given(credentialsStore) + .delete(serverURL: .value(serverURL)) + .willReturn() + + // When + try subject.logout(serverURL: serverURL) + + // Then + XCTAssertPrinterOutputContains(""" + Removing session for server with URL \(serverURL.absoluteString) + Session deleted successfully + """) + } + + func test_logout_deletesCredentials() throws { // Given - let credentials = ServerCredentials(token: "token") + let credentials = ServerCredentials( + token: nil, + accessToken: "access-token", + refreshToken: "refresh-token" + ) given(credentialsStore) .store(credentials: .value(credentials), serverURL: .value(serverURL)) .willReturn() diff --git a/Tests/TuistServerTests/Utilities/ServerAuthenticationControllerTests.swift b/Tests/TuistServerTests/Utilities/ServerAuthenticationControllerTests.swift new file mode 100644 index 00000000000..f925808c8e4 --- /dev/null +++ b/Tests/TuistServerTests/Utilities/ServerAuthenticationControllerTests.swift @@ -0,0 +1,151 @@ +import Foundation +import MockableTest +import TuistSupport +import TuistSupportTesting +import XCTest + +@testable import TuistServer + +final class ServerAuthenticationControllerTests: TuistUnitTestCase { + private var subject: ServerAuthenticationController! + private var credentialsStore: MockServerCredentialsStoring! + private var ciChecker: MockCIChecking! + + override func setUp() { + super.setUp() + + credentialsStore = .init() + ciChecker = .init() + subject = .init( + credentialsStore: credentialsStore, + ciChecker: ciChecker, + environment: environment + ) + } + + override func tearDown() { + credentialsStore = nil + ciChecker = nil + subject = nil + super.tearDown() + } + + func test_when_config_token_is_present_and_is_ci() throws { + // Given + environment.tuistVariables[ + Constants.EnvironmentVariables.token + ] = "project-token" + given(ciChecker) + .isCI() + .willReturn(true) + + // When + let got = try subject.authenticationToken(serverURL: .test()) + + // Then + XCTAssertEqual( + got, + .project("project-token") + ) + } + + func test_when_config_token_is_present_and_is_not_ci() throws { + // Given + environment.tuistVariables[ + Constants.EnvironmentVariables.token + ] = "project-token" + given(ciChecker) + .isCI() + .willReturn(false) + given(credentialsStore) + .read(serverURL: .any) + .willReturn(nil) + + // When + let got = try subject.authenticationToken(serverURL: .test()) + + // Then + XCTAssertNil(got) + } + + func test_when_deprecated_config_token_is_present_and_is_ci() throws { + // Given + environment.tuistVariables[ + Constants.EnvironmentVariables.deprecatedToken + ] = "project-token" + given(ciChecker) + .isCI() + .willReturn(true) + + // When + let got = try subject.authenticationToken(serverURL: .test()) + + // Then + XCTAssertEqual( + got, + .project("project-token") + ) + } + + func test_when_credentials_store_returns_legacy_token() throws { + // Given + given(ciChecker) + .isCI() + .willReturn(false) + + given(credentialsStore) + .read(serverURL: .any) + .willReturn(ServerCredentials(token: "legacy-token", accessToken: nil, refreshToken: nil)) + + // When + let got = try subject.authenticationToken(serverURL: .test()) + + // Then + XCTAssertEqual( + got, + .user(legacyToken: "legacy-token", accessToken: nil, refreshToken: nil) + ) + XCTAssertStandardOutput(pattern: "You are using a deprecated user token. Please, reauthenticate by running `tuist auth`.") + } + + func test_when_credentials_store_returns_jwt_tokens() throws { + // Given + given(ciChecker) + .isCI() + .willReturn(false) + + let accessToken = + "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ0dWlzdF9jbG91ZCIsImV4cCI6MTcyMDQyOTgxMiwiaWF0IjoxNzIwNDI5NzUyLCJpc3MiOiJ0dWlzdF9jbG91ZCIsImp0aSI6IjlmZGEwYmRmLTE0MjMtNDhmNi1iNWRmLWM2MDVjMGMwMzBiMiIsIm5iZiI6MTcyMDQyOTc1MSwicmVzb3VyY2UiOiJ1c2VyIiwic3ViIjoiMSIsInR5cCI6ImFjY2VzcyJ9.qsxjD51lHHaQo6NWs-gUxVUhQfyWEe3v3-okM0NIV72vDY-fGgzq9JU2F8DQbdOD8POqWkseCbtO66m_4J9uFw" + let refreshToken = + "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ0dWlzdF9jbG91ZCIsImV4cCI6MTcyMDQyOTgxMCwiaWF0IjoxNzIwNDI5NzUyLCJpc3MiOiJ0dWlzdF9jbG91ZCIsImp0aSI6IjlmZGEwYmRmLTE0MjMtNDhmNi1iNWRmLWM2MDVjMGMwMzBiMiIsIm5iZiI6MTcyMDQyOTc1MSwicmVzb3VyY2UiOiJ1c2VyIiwic3ViIjoiMSIsInR5cCI6ImFjY2VzcyJ9.UGMOA4nysabRCO0px9ixCW3JTCA6OgYSeVA6X--Xkc8b-YA8ui2SeCL8gV9WvOYeLJA5pvzKUSulVfV1qM4LKg" + + given(credentialsStore) + .read(serverURL: .any) + .willReturn( + ServerCredentials( + token: nil, + accessToken: accessToken, + refreshToken: refreshToken + ) + ) + + // When + let got = try subject.authenticationToken(serverURL: .test()) + + // Then + XCTAssertEqual( + got, + .user( + legacyToken: nil, + accessToken: JWT( + token: accessToken, + expiryDate: Date(timeIntervalSince1970: 1_720_429_812) + ), + refreshToken: JWT( + token: refreshToken, + expiryDate: Date(timeIntervalSince1970: 1_720_429_810) + ) + ) + ) + } +} diff --git a/Tests/TuistServerTests/Utilities/ServerCredentialsStoreTests.swift b/Tests/TuistServerTests/Utilities/ServerCredentialsStoreTests.swift index ddc406a6082..0ae38c67e8a 100644 --- a/Tests/TuistServerTests/Utilities/ServerCredentialsStoreTests.swift +++ b/Tests/TuistServerTests/Utilities/ServerCredentialsStoreTests.swift @@ -17,6 +17,23 @@ final class ServerCredentialsStoreTests: TuistUnitTestCase { super.tearDown() } + func test_crud_with_legacy_token() throws { + // Given + let temporaryDirectory = try temporaryPath() + let subject = ServerCredentialsStore( + fileHandler: FileHandler.shared, + configDirectory: temporaryDirectory + ) + let credentials = ServerCredentials(token: "token", accessToken: nil, refreshToken: nil) + let serverURL = URL(string: "https://tuist.io")! + + // When/Then + try subject.store(credentials: credentials, serverURL: serverURL) + XCTAssertEqual(try subject.read(serverURL: serverURL), credentials) + try subject.delete(serverURL: serverURL) + XCTAssertEqual(try subject.read(serverURL: serverURL), nil) + } + func test_crud() throws { // Given let temporaryDirectory = try temporaryPath() @@ -24,7 +41,7 @@ final class ServerCredentialsStoreTests: TuistUnitTestCase { fileHandler: FileHandler.shared, configDirectory: temporaryDirectory ) - let credentials = ServerCredentials(token: "token") + let credentials = ServerCredentials(token: nil, accessToken: "access-token", refreshToken: "refresh-token") let serverURL = URL(string: "https://tuist.io")! // When/Then diff --git a/docs/docs/cloud/get-started.md b/docs/docs/cloud/get-started.md index b61d16d42c6..5f61df77de7 100644 --- a/docs/docs/cloud/get-started.md +++ b/docs/docs/cloud/get-started.md @@ -89,7 +89,7 @@ For CI environments, authentication is managed differently; it's done using **pr ```bash -tuist project token my-organization/my-project +tuist project tokens create my-organization/my-project ``` You will then need to set the token as an environment variable named `TUIST_CONFIG_TOKEN` to make it accessible. From a2e1f2f9b7b366303a808160c92c4d136747efbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 12 Jul 2024 09:54:44 +0200 Subject: [PATCH 415/509] Fix missing TUIST_CONFIG_TOKEN in ServerAcceptanceTests (#6506) * Fix missing TUIST_CONFIG_TOKEN in ServerAcceptanceTests * Fix plucking out project token ID from logs --- Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift index d9e1a93b541..3ff61831dbc 100644 --- a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift @@ -1,5 +1,6 @@ import Foundation import TuistAcceptanceTesting +import TuistSupport import TuistSupportTesting import XCTest @@ -17,6 +18,7 @@ final class ServerAcceptanceTestProjects: ServerAcceptanceTestCase { final class ServerAcceptanceTestProjectTokens: ServerAcceptanceTestCase { func test_create_list_and_revoke_project_token() async throws { try await run(ProjectTokensCreateCommand.self, fullHandle) + TestingLogHandler.reset() try await run(ProjectTokensListCommand.self, fullHandle) let id = try XCTUnwrap( TestingLogHandler.collected[.info, <=].components(separatedBy: .newlines).dropLast().last? @@ -40,6 +42,8 @@ class ServerAcceptanceTestCase: TuistAcceptanceTestCase { override func setUp() async throws { try await super.setUp() + environment.tuistVariables[Constants.EnvironmentVariables.token] = ProcessInfo.processInfo + .environment[Constants.EnvironmentVariables.token] try setUpFixture(.iosAppWithFrameworks) organizationHandle = String(UUID().uuidString.prefix(12).lowercased()) projectHandle = String(UUID().uuidString.prefix(12).lowercased()) From 73bd81f733b671c8dd9443d3755abd9bedb5518c Mon Sep 17 00:00:00 2001 From: Gorbenko Roman <45801227+rofle100lvl@users.noreply.github.com> Date: Fri, 12 Jul 2024 12:31:03 +0200 Subject: [PATCH 416/509] Added lint operation on target references of scheme (#6491) * Added targets lintning * Fixed review issues * Fixed test * Changed path from absolute to relative Co-authored-by: Kas * Fix commit after changing to relative path --------- Co-authored-by: Kas --- .../TuistGenerator/Linter/GraphLinter.swift | 28 ++++ .../Linter/GraphLinterTests.swift | 125 ++++++++++++++++-- 2 files changed, 144 insertions(+), 9 deletions(-) diff --git a/Sources/TuistGenerator/Linter/GraphLinter.swift b/Sources/TuistGenerator/Linter/GraphLinter.swift index 6d43a57e40a..35d5eb6b71a 100644 --- a/Sources/TuistGenerator/Linter/GraphLinter.swift +++ b/Sources/TuistGenerator/Linter/GraphLinter.swift @@ -45,11 +45,39 @@ public class GraphLinter: GraphLinting { issues.append(contentsOf: lintMismatchingConfigurations(graphTraverser: graphTraverser)) issues.append(contentsOf: lintWatchBundleIndentifiers(graphTraverser: graphTraverser)) issues.append(contentsOf: lintCodeCoverageMode(graphTraverser: graphTraverser)) + issues.append(contentsOf: lintSchemesUnknownTargets(graphTraverser: graphTraverser)) return issues } // MARK: - Fileprivate + private func lintSchemesUnknownTargets(graphTraverser: GraphTraversing) -> [LintingIssue] { + let targets = graphTraverser.targets() + return graphTraverser.schemes().compactMap { scheme in + let unknownTargets = scheme + .targetDependencies() + .filter { targetReference in + if let target = targets[targetReference.projectPath], + target.keys.contains(targetReference.name) + { + return false + } + return true + } + + guard !unknownTargets.isEmpty else { return nil } + + let targetsDescriptionStrings = unknownTargets.map { target in + target.name + " " + "(\(target.projectPath.relative(to: graphTraverser.path).pathString))" + } + + return LintingIssue( + reason: "Cannot find targets \(targetsDescriptionStrings.joined(separator: ", ")) defined in \(scheme.name)", + severity: .warning + ) + } + } + private func lintCodeCoverageMode(graphTraverser: GraphTraversing) -> [LintingIssue] { switch graphTraverser.workspace.generationOptions.autogeneratedWorkspaceSchemes.codeCoverageMode { case .disabled, .all: return [] diff --git a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift index 85a4693fa40..58b6c93dd62 100644 --- a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift @@ -90,6 +90,105 @@ final class GraphLinterTests: TuistUnitTestCase { XCTAssertFalse(result.contains(LintingIssue(reason: reason, severity: .error))) } + func test_lint_when_scheme_has_unknown_target() throws { + // Given + let path: AbsolutePath = "/project" + let unknownBuildReferenceTarget = TargetReference(projectPath: "/project", name: "UnknownReferenceTarget") + + let scheme = Scheme.test( + name: "SomeScheme", + buildAction: .init(targets: [unknownBuildReferenceTarget]), + testAction: nil, + runAction: nil, + archiveAction: nil, + profileAction: nil, + analyzeAction: nil + ) + let project = Project.test( + path: path, + name: "TuistProject", + targets: [ + Target.test(name: "App"), + ] + ) + + let workspace = Workspace.test( + path: path, + name: "TuistWorkspace", + projects: [path], + schemes: [scheme] + ) + + let graph = Graph.test( + path: path, + workspace: workspace, + projects: [path: project] + ) + + let config = Config.test() + let graphTraverser = GraphTraverser(graph: graph) + + // When + let result = subject.lint(graphTraverser: graphTraverser, config: config) + + // Then + XCTAssertEqual( + result, + [LintingIssue( + reason: "Cannot find targets UnknownReferenceTarget (.) defined in SomeScheme", + severity: .warning + )] + ) + } + + func test_lint_when_scheme_has_known_target() throws { + // Given + let path: AbsolutePath = "/project" + let unknownBuildReferenceTarget = TargetReference(projectPath: "/project", name: "KnownReferenceTarget") + + let scheme = Scheme.test( + name: "SomeScheme", + buildAction: .init(targets: [unknownBuildReferenceTarget]), + testAction: nil, + runAction: nil, + archiveAction: nil, + profileAction: nil, + analyzeAction: nil + ) + let project = Project.test( + path: path, + name: "TuistProject", + targets: [ + Target.test(name: "KnownReferenceTarget"), + ] + ) + + let workspace = Workspace.test( + path: path, + name: "TuistWorkspace", + projects: [path], + schemes: [scheme] + ) + + let graph = Graph.test( + path: path, + workspace: workspace, + projects: [path: project] + ) + + let config = Config.test() + let graphTraverser = GraphTraverser(graph: graph) + + // When + let result = subject.lint(graphTraverser: graphTraverser, config: config) + + // Then + XCTAssertEqual( + result, + [] + ) + } + func test_lint_when_no_version_available() throws { // Given let path: AbsolutePath = "/project" @@ -1614,15 +1713,23 @@ final class GraphLinterTests: TuistUnitTestCase { path: temporaryPath, targets: [targetA, targetB], schemes: [ - .test(testAction: .test( - coverage: true, - codeCoverageTargets: [ - TargetReference( - projectPath: temporaryPath, - name: "TargetA" - ), - ] - )), + .test( + buildAction: nil, + testAction: .test( + targets: [], + coverage: true, + codeCoverageTargets: [ + TargetReference( + projectPath: temporaryPath, + name: "TargetA" + ), + ] + ), + runAction: nil, + archiveAction: nil, + profileAction: nil, + analyzeAction: nil + ), ] ) From ec98506623638ca95f4da370307abe16bab3a83b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 08:58:37 +0200 Subject: [PATCH 417/509] add KaiOelfke as a contributor for code (#6517) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2dd5150d485..deb0cf8a074 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1447,6 +1447,15 @@ "contributions": [ "doc" ] + }, + { + "login": "KaiOelfke", + "name": "Kai Oelfke", + "avatar_url": "https://avatars.githubusercontent.com/u/1190948?v=4", + "profile": "https://www.kaioelfke.de", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 2b747af5723..7343d5d21a6 100644 --- a/README.md +++ b/README.md @@ -567,6 +567,7 @@ Thanks goes to these wonderful people:
    Dmitry Serov

    Dariusz Rybicki

    Dan Sinclair
    +
    Kai Oelfke
    From 2d4fc701b8e3a185b104370c2ed6b0a803565ec0 Mon Sep 17 00:00:00 2001 From: Kai Oelfke Date: Mon, 15 Jul 2024 16:00:31 +0900 Subject: [PATCH 418/509] Escape header search paths for external dependencies from SPM (#6513) * Include whitespace in headerSearchPaths setting unit test * Use quotedIfContainsSpace for header search path setting --- .../SwiftPackageManager/SettingsMapper.swift | 2 +- .../PackageInfoMapperTests.swift | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift b/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift index 4e1dbf1468d..3a063b9f765 100644 --- a/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/SettingsMapper.swift @@ -70,7 +70,7 @@ struct SettingsMapper { for setting in settings { switch (setting.tool, setting.name) { case (.c, .headerSearchPath), (.cxx, .headerSearchPath): - headerSearchPaths.append("$(SRCROOT)/\(mainRelativePath.pathString)/\(setting.value[0])") + headerSearchPaths.append("$(SRCROOT)/\(mainRelativePath.pathString)/\(setting.value[0])".quotedIfContainsSpaces) case (.c, .define), (.cxx, .define): let (name, value) = setting.extractDefine defines[name] = value diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index a3e7898091d..6522b3f0510 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -1705,7 +1705,15 @@ final class PackageInfoMapperTests: TuistUnitTestCase { targets: [ .test( name: "Target1", - settings: [.init(tool: .c, name: .headerSearchPath, condition: nil, value: ["value"])] + settings: [ + .init(tool: .c, name: .headerSearchPath, condition: nil, value: ["value"]), + .init( + tool: .c, + name: .headerSearchPath, + condition: nil, + value: ["White Space Folder/value"] + ), + ] ), ], platforms: [.ios], @@ -1723,7 +1731,8 @@ final class PackageInfoMapperTests: TuistUnitTestCase { .test( "Target1", basePath: basePath, - customSettings: ["HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Target1/value"]] + customSettings: ["HEADER_SEARCH_PATHS": ["$(SRCROOT)/Sources/Target1/value", + "\"$(SRCROOT)/Sources/Target1/White Space Folder/value\""]] ), ] ) From 08cd2586f13fc68e17ff22b30189d29ebf2eaf06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 16 Jul 2024 09:08:27 +0200 Subject: [PATCH 419/509] Respect --verbose for machine readable commands (#6518) --- Sources/TuistSupport/Logging/Logger.swift | 2 +- Sources/tuist/TuistApp.swift | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Sources/TuistSupport/Logging/Logger.swift b/Sources/TuistSupport/Logging/Logger.swift index 0e658a7405d..cb1a5540edc 100644 --- a/Sources/TuistSupport/Logging/Logger.swift +++ b/Sources/TuistSupport/Logging/Logger.swift @@ -89,6 +89,6 @@ extension OSLogHandler: VerboseLogHandler { extension JSONLogHandler: VerboseLogHandler { public static func verbose(label: String) -> LogHandler { - JSONLogHandler(label: label, logLevel: .debug) + StandardLogHandler(label: label, logLevel: .debug) } } diff --git a/Sources/tuist/TuistApp.swift b/Sources/tuist/TuistApp.swift index 1197feadfde..87dfc7e0af7 100644 --- a/Sources/tuist/TuistApp.swift +++ b/Sources/tuist/TuistApp.swift @@ -18,7 +18,12 @@ private enum TuistServer { let isCommandMachineReadable = CommandLine.arguments.count > 1 && machineReadableCommands.map { $0._commandName }.contains(CommandLine.arguments[1]) // swiftformat:enable all if isCommandMachineReadable || CommandLine.arguments.contains("--json") { - TuistSupport.LogOutput.bootstrap(config: LoggingConfig(loggerType: .json, verbose: false)) + TuistSupport.LogOutput.bootstrap( + config: LoggingConfig( + loggerType: .json, + verbose: ProcessEnv.vars[Constants.EnvironmentVariables.verbose] != nil + ) + ) } else { TuistSupport.LogOutput.bootstrap() } From 7ff082271c9bc5203e2bfd60becd2c8f0b95a803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 16 Jul 2024 16:15:29 +0200 Subject: [PATCH 420/509] Fix linking static xcframeworks linked via dynamic xcframeworks (#6520) --- .../TuistAcceptanceFixtures.swift | 3 + Sources/TuistCore/Graph/GraphTraverser.swift | 29 ++++++-- .../Graph/GraphTraverserTests.swift | 55 ++++++++++++++- .../.gitignore | 70 +++++++++++++++++++ .../App/Sources/App.swift | 13 ++++ .../App/Sources/ContentView.swift | 21 ++++++ .../App/Tests/AppTests.swift | 8 +++ .../DynamicFrameworkA/DynamicFrameworkA.swift | 17 +++++ .../DynamicFrameworkA/Thing.swift | 9 +++ .../DynamicFrameworkB/Choice.swift | 7 ++ .../Project.swift | 57 +++++++++++++++ .../Tuist/Package.resolved | 50 +++++++++++++ .../Tuist/Package.swift | 21 ++++++ 13 files changed, 354 insertions(+), 6 deletions(-) create mode 100644 fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/.gitignore create mode 100644 fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/App/Sources/App.swift create mode 100644 fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/App/Sources/ContentView.swift create mode 100644 fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/App/Tests/AppTests.swift create mode 100644 fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/DynamicFrameworkA/DynamicFrameworkA.swift create mode 100644 fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/DynamicFrameworkA/Thing.swift create mode 100644 fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/DynamicFrameworkB/Choice.swift create mode 100644 fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/Project.swift create mode 100644 fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/Tuist/Package.resolved create mode 100644 fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/Tuist/Package.swift diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift index ec19021bb90..c940409e2e1 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift @@ -27,6 +27,7 @@ public enum TuistAcceptanceFixtures { case iosWppWithCustomResourceParserOptions case iosAppWithCustomScheme case iosAppWithExtensions + case iosAppWithDynamicFrameworksLinkingStaticFrameworks case iosAppWithFrameworkAndResources case iosAppWithFrameworkAndDisabledResources case iosAppWithFrameworkLinkingStaticFramework @@ -119,6 +120,8 @@ public enum TuistAcceptanceFixtures { return "ios_app_with_custom_configuration" case .iosAppWithCustomDevelopmentRegion: return "ios_app_with_custom_development_region" + case .iosAppWithDynamicFrameworksLinkingStaticFrameworks: + return "ios_app_with_dynamic_frameworks_linking_static_frameworks" case .iosWppWithCustomResourceParserOptions: return "ios_app_with_custom_resource_parser_options" case .iosAppWithCustomScheme: diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index 3af1f870f61..32db76221e3 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -366,14 +366,22 @@ public class GraphTraverser: GraphTraversing { .filter(\.isPrecompiled) let precompiledDependencies = precompiled - .flatMap { filterDependencies(from: $0) - } + .flatMap { filterDependencies(from: $0) } - let precompiledLibrariesAndFrameworks = Set(precompiled + precompiledDependencies) + let precompiledDynamicLibrariesAndFrameworks = Set(precompiled + precompiledDependencies) .filter(\.isPrecompiledDynamicAndLinkable) - .compactMap { dependencyReference(to: $0, from: targetGraphDependency) } - references.formUnion(precompiledLibrariesAndFrameworks) + let staticXCFrameworksLinkedByDynamicXCFrameworkDependencies = filterDependencies( + from: Set(precompiledDynamicLibrariesAndFrameworks).filter { $0.xcframeworkDependency != nil }, + test: { $0.xcframeworkDependency?.linking == .static }, + skip: { $0.xcframeworkDependency == nil } + ) + + let precompiledLibrariesAndFrameworks = + (precompiledDynamicLibrariesAndFrameworks + staticXCFrameworksLinkedByDynamicXCFrameworkDependencies) + .compactMap { dependencyReference(to: $0, from: targetGraphDependency) } + + references.formUnion(Set(precompiledLibrariesAndFrameworks)) // Static libraries and frameworks / Static libraries' dynamic libraries if target.target.canLinkStaticProducts() { @@ -1240,3 +1248,14 @@ public class GraphTraverser: GraphTraversing { } // swiftlint:enable type_body_length + +extension GraphDependency { + fileprivate var xcframeworkDependency: GraphDependency.XCFramework? { + switch self { + case let .xcframework(xcframework): + return xcframework + default: + return nil + } + } +} diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index cb44cae5686..f2fb10c2f61 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -1801,11 +1801,12 @@ final class GraphTraverserTests: TuistUnitTestCase { linking: .dynamic, architectures: [.arm64] ) + let dependencyPrecompiledXCFramework = GraphDependency.testXCFramework(linking: .static) let dependencies: [GraphDependency: Set] = [ .target(name: target.name, path: project.path): Set(arrayLiteral: dependencyPrecompiledDynamicBinaryA), dependencyPrecompiledDynamicBinaryA: - Set(arrayLiteral: dependencyPrecompiledDynamicBinaryB), + Set([dependencyPrecompiledDynamicBinaryB, dependencyPrecompiledXCFramework]), ] let graph = Graph.test( projects: [project.path: project], @@ -1832,6 +1833,58 @@ final class GraphTraverserTests: TuistUnitTestCase { ]) } + func test_linkableAndEmbeddableDependencies_when_appDependensOnPrecompiledDynamicXCFrameworkWithStaticXCFrameworkDependency( + ) throws { + // App ---(depends on)---> Dynamic XCFramework ----> Static XCFramework (A) ----> Static XCFramework (B) + + // Given + let target = Target.test(name: "Main") + let project = Project.test(targets: [target]) + + // Given: Value Graph + let dependencyDynamicXCFramework = GraphDependency.testXCFramework( + path: "/test/DynamicFramework.xcframework", + linking: .dynamic + ) + let dependencyStaticXCFrameworkA = GraphDependency.testXCFramework( + path: "/test/StaticFrameworkA.xcframework", + linking: .static + ) + let dependencyStaticXCFrameworkB = GraphDependency.testXCFramework( + path: "/test/StaticFrameworkB.xcframework", + linking: .static + ) + + let dependencies: [GraphDependency: Set] = [ + .target(name: target.name, path: project.path): Set(arrayLiteral: dependencyDynamicXCFramework), + dependencyDynamicXCFramework: Set(arrayLiteral: dependencyStaticXCFrameworkA), + dependencyStaticXCFrameworkA: Set(arrayLiteral: dependencyStaticXCFrameworkB), + ] + let graph = Graph.test( + projects: [project.path: project], + dependencies: dependencies + ) + let subject = GraphTraverser(graph: graph) + + // When + let got = try subject.linkableDependencies(path: project.path, name: target.name).sorted() + + // Then + XCTAssertEqual(got, [ + GraphDependencyReference(dependencyDynamicXCFramework), + GraphDependencyReference(dependencyStaticXCFrameworkA), + GraphDependencyReference(dependencyStaticXCFrameworkB), + ]) + + // When + let embeddable = subject.embeddableFrameworks(path: project.path, name: target.name) + + // Then + XCTAssertBetterEqual(embeddable, [ + GraphDependencyReference(dependencyDynamicXCFramework), + ]) + } + func test_linkableAndEmbeddableDependencies_when_appDependensOnPrecompiledStaticBinaryWithPrecompiledDynamicBinaryDependency( ) throws { // App ---(depends on)---> Precompiled static binary (A) ----> Precompiled dynamic binary (B) diff --git a/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/.gitignore b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/.gitignore new file mode 100644 index 00000000000..24b244f9c45 --- /dev/null +++ b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/.gitignore @@ -0,0 +1,70 @@ +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Xcode ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +### Xcode Patch ### +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcworkspace/contents.xcworkspacedata +/*.gcno + +### Projects ### +*.xcodeproj +*.xcworkspace + +### Tuist derived files ### +graph.dot +Derived/ + +### Tuist managed dependencies ### +Tuist/.build \ No newline at end of file diff --git a/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/App/Sources/App.swift b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/App/Sources/App.swift new file mode 100644 index 00000000000..356f48ca30e --- /dev/null +++ b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/App/Sources/App.swift @@ -0,0 +1,13 @@ +import DynamicFrameworkA +import SwiftUI + +@main +struct MyApp: App { + private var dynamicFramework = DynamicFrameworkA() + + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/App/Sources/ContentView.swift b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/App/Sources/ContentView.swift new file mode 100644 index 00000000000..70fa229464f --- /dev/null +++ b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/App/Sources/ContentView.swift @@ -0,0 +1,21 @@ +import DynamicFrameworkA +import SwiftUI + +public struct ContentView: View { + public init() {} + + public var body: some View { + let choice = Thing().choice + if choice.is(\.bluePill) { + Text("Blue") + } else { + Text("Red") + } + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/App/Tests/AppTests.swift b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/App/Tests/AppTests.swift new file mode 100644 index 00000000000..70c453ba3f3 --- /dev/null +++ b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/App/Tests/AppTests.swift @@ -0,0 +1,8 @@ +import Foundation +import XCTest + +final class AppTests: XCTestCase { + func test_twoPlusTwo_isFour() { + XCTAssertEqual(2 + 2, 4) + } +} diff --git a/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/DynamicFrameworkA/DynamicFrameworkA.swift b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/DynamicFrameworkA/DynamicFrameworkA.swift new file mode 100644 index 00000000000..b4688f7f3be --- /dev/null +++ b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/DynamicFrameworkA/DynamicFrameworkA.swift @@ -0,0 +1,17 @@ +import GoogleMobileAds +import UIKit + +public class DynamicFrameworkA: NSObject { + let googleAds = GADExtras() + override public init() { + super.init() + } +} + +extension DynamicFrameworkA: GADAdSizeDelegate { + public func adView(_ bannerView: GADBannerView, willChangeAdSizeTo size: GADAdSize) { + var frame = bannerView.frame + frame.size.height = CGSizeFromGADAdSize(size).height + print("new frame \(frame)") + } +} diff --git a/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/DynamicFrameworkA/Thing.swift b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/DynamicFrameworkA/Thing.swift new file mode 100644 index 00000000000..7c2ba4a4fdd --- /dev/null +++ b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/DynamicFrameworkA/Thing.swift @@ -0,0 +1,9 @@ +import DynamicFrameworkB + +public struct Thing { + public var choice: Choice + + public init() { + choice = .redPill + } +} diff --git a/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/DynamicFrameworkB/Choice.swift b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/DynamicFrameworkB/Choice.swift new file mode 100644 index 00000000000..e02411c278e --- /dev/null +++ b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/DynamicFrameworkB/Choice.swift @@ -0,0 +1,7 @@ +import CasePaths + +@CasePathable +public enum Choice { + case bluePill + case redPill +} diff --git a/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/Project.swift b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/Project.swift new file mode 100644 index 00000000000..d3096ee8388 --- /dev/null +++ b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/Project.swift @@ -0,0 +1,57 @@ +import ProjectDescription + +let project = Project( + name: "App", + targets: [ + .target( + name: "App", + destinations: .iOS, + product: .app, + bundleId: "io.tuist.App", + infoPlist: .extendingDefault( + with: [ + "UILaunchScreen": [ + "UIColorName": "", + "UIImageName": "", + ], + ] + ), + sources: ["App/Sources/**"], + resources: [], + dependencies: [ + .target(name: "DynamicFrameworkA"), + ] + ), + .target( + name: "AppTests", + destinations: .iOS, + product: .unitTests, + bundleId: "io.tuist.AppTests", + infoPlist: .default, + sources: ["App/Tests/**"], + resources: [], + dependencies: [.target(name: "App")] + ), + .target( + name: "DynamicFrameworkA", + destinations: .iOS, + product: .framework, + bundleId: "io.tuist.DynamicFrameworkA", + sources: ["DynamicFrameworkA/**"], + dependencies: [ + .external(name: "GoogleMobileAds"), + .target(name: "DynamicFrameworkB"), + ] + ), + .target( + name: "DynamicFrameworkB", + destinations: .iOS, + product: .framework, + bundleId: "io.tuist.DynamicFrameworkB", + sources: ["DynamicFrameworkB/**"], + dependencies: [ + .external(name: "CasePaths"), + ] + ), + ] +) diff --git a/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/Tuist/Package.resolved b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/Tuist/Package.resolved new file mode 100644 index 00000000000..66cffdd4bd9 --- /dev/null +++ b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/Tuist/Package.resolved @@ -0,0 +1,50 @@ +{ + "pins" : [ + { + "identity" : "swift-case-paths", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-case-paths", + "state" : { + "revision" : "b9ad2661b6e8fb411fef6a441c9955c3413afac0", + "version" : "1.5.0" + } + }, + { + "identity" : "swift-package-manager-google-mobile-ads", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/swift-package-manager-google-mobile-ads.git", + "state" : { + "revision" : "5ff977255c2ba5844e7e9da779f1f2a5a00e0028", + "version" : "11.2.0" + } + }, + { + "identity" : "swift-package-manager-google-user-messaging-platform", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/swift-package-manager-google-user-messaging-platform.git", + "state" : { + "revision" : "459949af1286c12487a6efd76f00f3e9d951c9ba", + "version" : "2.5.0" + } + }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swiftlang/swift-syntax", + "state" : { + "revision" : "4c6cc0a3b9e8f14b3ae2307c5ccae4de6167ac2c", + "version" : "600.0.0-prerelease-2024-06-12" + } + }, + { + "identity" : "xctest-dynamic-overlay", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", + "state" : { + "revision" : "6f30bdba373bbd7fbfe241dddd732651f2fbd1e2", + "version" : "1.1.2" + } + } + ], + "version" : 2 +} diff --git a/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/Tuist/Package.swift b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/Tuist/Package.swift new file mode 100644 index 00000000000..763b4827456 --- /dev/null +++ b/fixtures/ios_app_with_dynamic_frameworks_linking_static_frameworks/Tuist/Package.swift @@ -0,0 +1,21 @@ +// swift-tools-version: 5.9 +import PackageDescription + +#if TUIST + import ProjectDescription + + let packageSettings = PackageSettings( + // Customize the product types for specific package product + // Default is .staticFramework + // productTypes: ["Alamofire": .framework,] + productTypes: [:] + ) +#endif + +let package = Package( + name: "App", + dependencies: [ + .package(url: "https://github.com/googleads/swift-package-manager-google-mobile-ads.git", exact: "11.2.0"), + .package(url: "https://github.com/pointfreeco/swift-case-paths", from: "1.4.2"), + ] +) From 87c5621d24e237af54e169fba7f420b1e590fb16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 16 Jul 2024 16:27:35 +0200 Subject: [PATCH 421/509] Generate a `Tuist/Config.swift` by default when creating a new project (#6521) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Generate a Tuist/Config.swift by default * Update Templates/default/Config.stencil Co-authored-by: Marek Fořt * Update Templates/default/Config.stencil Co-authored-by: Marek Fořt * Incluse URL --------- Co-authored-by: Marek Fořt --- Templates/default/Config.stencil | 9 +++++++++ Templates/default/default.swift | 4 ++++ 2 files changed, 13 insertions(+) create mode 100644 Templates/default/Config.stencil diff --git a/Templates/default/Config.stencil b/Templates/default/Config.stencil new file mode 100644 index 00000000000..9123464874e --- /dev/null +++ b/Templates/default/Config.stencil @@ -0,0 +1,9 @@ +import ProjectDescription + +let config = Config( +// Create an account with "tuist auth" and a project with "tuist project create" +// then uncomment the section below and set the project full-handle. +// * Read more: https://docs.tuist.io/guides/quick-start/gather-insights +// +// fullHandle: "{account_handle}/{project_handle}", +) diff --git a/Templates/default/default.swift b/Templates/default/default.swift index fb6798db012..a3afd888d50 100644 --- a/Templates/default/default.swift +++ b/Templates/default/default.swift @@ -21,6 +21,10 @@ let template = Template( path: projectPath + "/Tuist/Package.swift", templatePath: "Package.stencil" ), + .file( + path: projectPath + "/Tuist/Config.swift", + templatePath: "Config.stencil" + ), .file( path: appPath + "/Sources/\(classNameAttribute)App.swift", templatePath: "app.stencil" From 0b701e876a5bf3a3ba81151b5e068bf7026fb2bb Mon Sep 17 00:00:00 2001 From: fortmarek Date: Tue, 16 Jul 2024 17:20:29 +0200 Subject: [PATCH 422/509] Update release date --- .../Client/ServerClientCLIMetadataHeadersMiddleware.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift b/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift index e686b2a4cfd..b63fbe78450 100644 --- a/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift +++ b/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift @@ -5,7 +5,7 @@ import TuistSupport /// This middleware includes the release date of the CLI in the headers so that we can show /// warnings if the on-premise installation is too old. struct ServerClientCLIMetadataHeadersMiddleware: ClientMiddleware { - let releaseDate = "2024.07.02" + let releaseDate = "2024.07.16" func intercept( _ request: Request, From 2fb37346841baa1db8da3cd75adf82c6a92ccc2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 16 Jul 2024 17:42:47 +0200 Subject: [PATCH 423/509] Documentation revamp (#6508) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Move 'cost of convenience' under projects and 'from v3 to v4' under a new section CLI * Move installation under CLI * Move adoption to the projects section * Introduce a Tuist section * Further improvements * More improvements * Adjust the commands * Some documentation changes * Some changes * Finish up the quickstart guide * More documentation changes * Create sub-categories inside build * Fix broken links * Revert redirects * Add redirects * Update dependencies * Delete the git-cliff dependency * Update the docs * Update docs/docs/guides/quick-start/optimize-workflows.md Co-authored-by: Marek Fořt * Update docs/docs/guides/start/swift-package.md Co-authored-by: Marek Fořt * Update docs/docs/guides/develop/projects.md Co-authored-by: Marek Fořt * Update docs/docs/guides/develop/projects.md Co-authored-by: Marek Fořt * Update docs/docs/guides/develop/projects.md Co-authored-by: Marek Fořt * Update docs/docs/guides/quick-start/gather-insights.md Co-authored-by: Marek Fořt * Update docs/docs/guides/quick-start/gather-insights.md Co-authored-by: Marek Fořt * Update docs/docs/guides/quick-start/gather-insights.md Co-authored-by: Marek Fořt * Update docs/docs/guides/quick-start/gather-insights.md Co-authored-by: Marek Fořt * Add log in button * Address feedback * Simplify the projects section --------- Co-authored-by: Marek Fořt --- README.md | 2 +- assets/header.jpg | Bin 64784 -> 129976 bytes docs/.vitepress/badges.mjs | 7 + docs/.vitepress/config.mjs | 312 +----- docs/.vitepress/icons.mjs | 71 ++ docs/.vitepress/sidebars.mjs | 326 ++++++ docs/.vitepress/theme/components/Button.vue | 33 + docs/.vitepress/theme/custom.css | 6 + docs/.vitepress/theme/index.js | 10 +- docs/docs/cloud/get-started.md | 102 -- docs/docs/cloud/what-is-cloud.md | 64 -- docs/docs/contributors/get-started.md | 4 +- docs/docs/guide/automation/build.md | 36 - docs/docs/guide/automation/clean.md | 30 - docs/docs/guide/automation/generate.md | 29 - docs/docs/guide/automation/graph.md | 43 - docs/docs/guide/automation/run.md | 25 - docs/docs/guide/automation/test.md | 37 - .../adopting-tuist/migrate-from-xcodeproj.md | 80 -- .../adopting-tuist/swift-package.md | 58 -- docs/docs/guide/scale/xcode.md | 1 - .../dashboard/on-premise/install.md} | 57 +- .../dashboard}/on-premise/metrics.md | 2 - docs/docs/guides/develop/build.md | 31 + .../develop/build/cache.md} | 33 +- docs/docs/guides/develop/projects.md | 39 + .../develop/projects}/code-sharing.md | 0 .../develop/projects}/cost-of-convenience.md | 2 - .../develop/projects}/dependencies.md | 6 +- .../develop/projects}/directory-structure.md | 10 +- .../projects}/dynamic-configuration.md | 2 +- .../develop/projects}/editing.md | 0 .../develop/projects}/hashing.md | 6 +- .../develop/projects}/manifests.md | 8 +- .../develop/projects}/plugins.md | 10 +- .../develop/projects}/synthesized-files.md | 0 .../develop/projects}/templates.md | 4 +- .../develop/projects}/tma-architecture.md | 2 +- docs/docs/guides/develop/test.md | 33 + docs/docs/guides/develop/test/flakiness.md | 21 + .../develop/test/images/flaky-test-case.png | Bin 0 -> 322567 bytes .../develop/test/smart-runner.md} | 12 +- .../guides/quick-start/add-dependencies.md | 123 +++ .../guides/quick-start/create-a-project.md | 50 + .../guides/quick-start/gather-insights.md | 47 + docs/docs/guides/quick-start/images/cache.png | Bin 0 -> 32839 bytes docs/docs/guides/quick-start/images/graph.png | Bin 0 -> 10550 bytes docs/docs/guides/quick-start/images/runs.png | Bin 0 -> 162788 bytes .../quick-start/install-tuist.md} | 24 +- .../guides/quick-start/optimize-workflows.md | 48 + .../start/migrate/bazel-project.md} | 7 +- .../migrate/images}/performance-table.webp | Bin .../start/migrate/swift-package.md} | 17 +- .../guides/start/migrate/xcode-project.md | 221 ++++ .../start/migrate/xcodegen-project.md} | 14 +- .../start}/new-project.md | 5 +- docs/docs/guides/start/swift-package.md | 38 + docs/docs/index.md | 129 +-- .../cli/[command].md | 0 .../cli/[command].paths.js | 0 .../cli/commands.data.js | 0 .../examples/[example].md | 0 .../examples/[example].paths.js | 0 .../examples/examples.data.js | 0 .../migrations}/from-v3-to-v4.md | 6 +- .../project-description/[identifier].md | 0 .../project-description/[identifier].paths.js | 0 .../project-description/types.data.js | 0 docs/package.json | 8 +- docs/pnpm-lock.yaml | 982 ++++++++++-------- 70 files changed, 1803 insertions(+), 1470 deletions(-) create mode 100644 docs/.vitepress/badges.mjs create mode 100644 docs/.vitepress/icons.mjs create mode 100644 docs/.vitepress/sidebars.mjs create mode 100644 docs/.vitepress/theme/components/Button.vue delete mode 100644 docs/docs/cloud/get-started.md delete mode 100644 docs/docs/cloud/what-is-cloud.md delete mode 100644 docs/docs/guide/automation/build.md delete mode 100644 docs/docs/guide/automation/clean.md delete mode 100644 docs/docs/guide/automation/generate.md delete mode 100644 docs/docs/guide/automation/graph.md delete mode 100644 docs/docs/guide/automation/run.md delete mode 100644 docs/docs/guide/automation/test.md delete mode 100644 docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md delete mode 100644 docs/docs/guide/introduction/adopting-tuist/swift-package.md delete mode 100644 docs/docs/guide/scale/xcode.md rename docs/docs/{cloud/on-premise.md => guides/dashboard/on-premise/install.md} (73%) rename docs/docs/{cloud => guides/dashboard}/on-premise/metrics.md (99%) create mode 100644 docs/docs/guides/develop/build.md rename docs/docs/{cloud/binary-caching.md => guides/develop/build/cache.md} (53%) create mode 100644 docs/docs/guides/develop/projects.md rename docs/docs/{guide/project => guides/develop/projects}/code-sharing.md (100%) rename docs/docs/{guide/introduction => guides/develop/projects}/cost-of-convenience.md (98%) rename docs/docs/{guide/project => guides/develop/projects}/dependencies.md (94%) rename docs/docs/{guide/project => guides/develop/projects}/directory-structure.md (76%) rename docs/docs/{guide/project => guides/develop/projects}/dynamic-configuration.md (83%) rename docs/docs/{guide/project => guides/develop/projects}/editing.md (100%) rename docs/docs/{cloud => guides/develop/projects}/hashing.md (82%) rename docs/docs/{guide/project => guides/develop/projects}/manifests.md (80%) rename docs/docs/{guide/project => guides/develop/projects}/plugins.md (92%) rename docs/docs/{guide/project => guides/develop/projects}/synthesized-files.md (100%) rename docs/docs/{guide/project => guides/develop/projects}/templates.md (82%) rename docs/docs/{guide/scale => guides/develop/projects}/tma-architecture.md (93%) create mode 100644 docs/docs/guides/develop/test.md create mode 100644 docs/docs/guides/develop/test/flakiness.md create mode 100644 docs/docs/guides/develop/test/images/flaky-test-case.png rename docs/docs/{cloud/selective-testing.md => guides/develop/test/smart-runner.md} (83%) create mode 100644 docs/docs/guides/quick-start/add-dependencies.md create mode 100644 docs/docs/guides/quick-start/create-a-project.md create mode 100644 docs/docs/guides/quick-start/gather-insights.md create mode 100644 docs/docs/guides/quick-start/images/cache.png create mode 100644 docs/docs/guides/quick-start/images/graph.png create mode 100644 docs/docs/guides/quick-start/images/runs.png rename docs/docs/{guide/introduction/installation.md => guides/quick-start/install-tuist.md} (78%) create mode 100644 docs/docs/guides/quick-start/optimize-workflows.md rename docs/docs/{guide/introduction/adopting-tuist/migrate-from-bazel.md => guides/start/migrate/bazel-project.md} (96%) rename docs/docs/{guide/introduction/adopting-tuist => guides/start/migrate/images}/performance-table.webp (100%) rename docs/docs/{guide/introduction/adopting-tuist/migrate-local-swift-packages.md => guides/start/migrate/swift-package.md} (79%) create mode 100644 docs/docs/guides/start/migrate/xcode-project.md rename docs/docs/{guide/introduction/adopting-tuist/migrate-from-xcodegen.md => guides/start/migrate/xcodegen-project.md} (88%) rename docs/docs/{guide/introduction/adopting-tuist => guides/start}/new-project.md (87%) create mode 100644 docs/docs/guides/start/swift-package.md rename docs/docs/{reference => references}/cli/[command].md (100%) rename docs/docs/{reference => references}/cli/[command].paths.js (100%) rename docs/docs/{reference => references}/cli/commands.data.js (100%) rename docs/docs/{reference => references}/examples/[example].md (100%) rename docs/docs/{reference => references}/examples/[example].paths.js (100%) rename docs/docs/{reference => references}/examples/examples.data.js (100%) rename docs/docs/{guide/introduction => references/migrations}/from-v3-to-v4.md (97%) rename docs/docs/{reference => references}/project-description/[identifier].md (100%) rename docs/docs/{reference => references}/project-description/[identifier].paths.js (100%) rename docs/docs/{reference => references}/project-description/types.data.js (100%) diff --git a/README.md b/README.md index 7343d5d21a6..eddb7a41f3b 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ tuist generate # Generates Xcode project & workspace tuist build # Builds your project ``` -Check out [the project "Adopting Tuist" guide](https://docs.tuist.io/guide/introduction/adopting-tuist/new-project) to learn more about Tuist and all its features. +Check out [the project "Create a new project" guide](https://docs.tuist.io/guides/start/new-project) to learn more about Tuist and all its features. ## 📝 Documentation diff --git a/assets/header.jpg b/assets/header.jpg index 7956b54cf2ba03c5be0219220b13e1793d84dc64..b16739d4fa9aea9dbf8e362e3f982180cc16c2ae 100644 GIT binary patch literal 129976 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%0A>&QR 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�ASy<%e zx|)J5d?>yVqtR;q6ZK~FBsnf?{>QyPufLq?oi4WvoHg+ET}s?`#VcK`PSN*Q#15(c zj_DxZp|Jp?Gos6ElhfMEHz*790s8i!6vgWHVDU4*{QP?p4S&r{{O@UpZ}G_&c2-&f zy@iN-z`TB#z2|*i6w|dG8zDIn1|t#J^2GG>9d#YYKT;U9iGD1>`AU^Ds{_)!$C`(m zX8lB0F3J7>%wE1{ z`LlS76Qv#&Q)oYDByOHvk?lX3c6k$0Yi#BznOqSM0Xg&+|2Mbm1b4$PcJ9}3S*`rf zx^}#tze-VM$ipnTfV9vIa}nj-kj9zqcFy?I2ES8*G+hlCSgkIVDDO#@QWFd~iPNB4o#^`-m_^6%Zs+aA!7DC^&T5h48ZrBgki%v<&8ID1y>w@u5dlhL;q zOKfD{*z--RE#hT_kJnEqLAgIozj;vZjX}okj2<_81C|P$GeW!3`<$Dbu z1hiN1$k1LTH?25uj}P-w)70){zm74}-Es6w|NiZUeA{?$ETVhhaI0!@xD_awOh`a= z8<7|L@pFa09+}7NfAvv78GP&fy83Qqk?u|GWP0;_J$ULrSOcX?od!IrOe%m?jVEHv zu4!Ypl51Qj4_@B+?w2hl92+BO$XsgfRE4q;%DosL9?b+ShFP7hyw z(>Kv&)!@dpcCS3tU{BJ72h#3l&;~CH(-cz~1d`^}<@a04^Dil>Oxy6j#a1#+S+=NzbJBs`z#4>nNLxH10gldxh|fR--s=r&5BaS8aRy zb3&-E>HHdB)R&ONjXH><2|)fE`*6l<@=~tY#tgm)WA6>1?1_Pk@PY1g=q7$$(c^U3H1YQ4oaa6A6hKEBka&_ih zkTvyfgS7LROwQ!ttvwUAcW@cn8|GZo^PIe@& zSCezn+={YL6(*T_#yHG}#PaIm!Akp$J{X7e@2TsLh@CcbItU z3wPYX&M5~PY#^e3s^an<`C3Oc#)TT=`vZ^dA%Nx7<$N%kI*?x5*O1ie5J?C$XHp=Oi#L+3(#% z2E7^T<+j5^Ty0IJ+?p0IE~TXtj*@?L6kzij+#C(8IYO>gauUUwg_}=o?IenL=f`dIU?N67wuJ^N%pmzCRP)g)|jZd92tBfn|h zClNqTkkyr#U4ZKQ4!X=8UN8@uwJSJ02B_H-4q!y$8v^G_GV^%nu=IgevsP_`*4L9z z;2Z>j0sKYzAOeVS8ujdti~QqB{xMzucqji&7M^oG&)4dj6Fp>~q-w$ok!S9cMVBlb zI55X^{ZGVzPeZf9vc0!%!e;Xei{a$EHE}aO@T2f6h+IWn;yb_O^dBuCMfrR94eb0Hn^PT@2-+8|~{yWBh?>&2D?`)E_SJs?st@+IPthpde5axjk8mj85 z01**DbdBg501y^{uPOnK4*@_+3lIbV;0!=cLgzu$Eo1MFQ~t$p0RICZ_;Ij@UIiAaOr zlO~e>u7d%*|L}(BKYsrW@!#tsegB5!@ApLWU^zfSOhQs#OhR5vhErTtUR*-{x&$Z> zW#1zo9}js^Q8#Z9Ydd!vdl6fASJ41#4^eRuF;PGP65wHN>um4CX=Cr;=%&cE(}?8a zbhK0CGLg~})AG1&|H$!fke9tdkhY<1kh86v9T!B2Qz1Y;z}3Um-p86Vz}3agTRuRM z>v!ey;Qgsop`=?HoIRAb8 zTLb^rz`r%{Zw>rg1OL{*|Nk`bA6}Wg8|aGpgFY8P*aGZyAG!Oudp~mb06j%9Kvr2@ zi}aU!2>{pFh|B>JR$etW(Dft+h}nphfHS|G88Hbl88%`FKrJpSF7ey-5EJ|T9PjVv zE@Z?ns8H)Mev3#UsGsFigA!T++A~D+r0+?HxBy~WA`)66LMOlhx~ybGzmMOKffpiT z5>hg9iZhf{)L;R`1%Q}{goK!sgpBN0lZZmW?*UR;GP*0`x5(-BtSPuW86=)0y* z=*(FR{e#0J%<;)Dxj@(Y53#`OACmo(T(qEE z#H6Goq!hp8A|m$xB{(f9*%fhex?6e_)}HiS5>L)BC?~zGYNO=7u8(50@fxJM$RoMH zi~c3rZ^{0eU{C*VN%p5;{~^~ja2t$hejUW%i-ee%nB~9D8?}Osk zapup109Nw524Z4T@I^^ZMo#%ZJ_s{lgrZ590?v{UfrE*J7JvYF0iw2k?el@92ZHS4 z&yIh6*;hx+KpsavoC&x+DRli85o#%ZzT54{Bdu~kt0*nSO5P;r01fT)Y z;6C{w=#`J2$^%_J6$aohoJ1oS+f%za6+GfgAHJ%ku)+N-tUU84a;*L}WK3pcY!5># zVJ<*81~ zWyC#V=z}2uW1=Gl@$)`-e*Q0!Kj(((&DTS8@E+#U=#uqFdj9eE|Hc zvtob-)_VumFdAu*!%hGaUl0J_G7Tsl{X|hIs6JKqqd14Lh%y3jg&8?3m203lAq;j+ z3DbY6LoE?9RnrV0FvO?0k3U6S1%MI0;rZ8Ywe^c@tH`&s@XOgmJF!Lkic!5juX0=G z_Ooc<=c#2|)SpapCk22}_zeO#z#n>%I+v z;KcDC-17*4`HCF@Fr71i76S_Ggi3%X!R06MQM=AK*{B>=6w_}lotP69Accf^q~VloW@=f`|5vc|tPH?j^% z-@-XLsZ!v$Mf~O4oSNk0?;44Pw1JQtu_x!97oCn3jv~d6E$t(}Jo=P1)%-5QZxm{k zuCp!Yys)kxf?#~5r^2}S%Rqu7%OHtejkcTm`UQZ5C*>Q_&2xFkeD}$5JS8tGMFXXk z1IONq$%a}rMe*i*WlgWCsS>H*CAoPgxq&`16syi;)cQH35gQC^lg3>~L0YRr95DQz z9#bkYoelB1zMR=xORqbfJxP1c_Fhi2WV(KCy6(XRh<86e{=3%GPgd?$S%La1o;q`} z{;p*fDrM@mjqEd49G&gywaLf65Ejrb;l$9y|1{(OzcI7L@}dR*oQeYPzzIz+9i&V0 z8cP-bC%P!#+_*`tdUHcBeZTl831JA&yADEsUeVjOuF(5_a(zyQa!kb~y&j{*^uJ)^ zhpd#8Nl9Dp8#2&N{|2c4G^Z=I{{aSSi%`Ak4RZ1Vc~t^`Hwgdg{o4@o2R9A2y)qyY zugnj61VR6+NALm9%3l)sm#krE5&G4yXJ^FP=d|2tA^^yXxi}kS3v$upBMkqf z^z<76_%TpN04xLufDn#mW0l8yC`GX=EEJra(n`X(JD35iy!sMN)YQ9-mO?4#X-|bR z7O@C{1-pBy#bVU#lkjhsXA6-97z;>#ru~SwAZ77Lbh3_5Zm?w-|2OL@r*cM>k;G&b zPM6qdydA_DI_-Q|h@#lyT@ob^fOKCnmbc0-{(KJ6aNFfGgT^H)>h>>cBN@ljzncvD za7Te4f(b(~T`+}*1VEE5h9aiySxIE+vbMI!r;AON+06uiyQ8d&!IuBhrJ|za+?F|% zA;+;qE+YXLcjYGl+Qy@}oblmVxzh>);79=C*jX|cdg4N~0xKNHw`h|GdY>KjQX*)LLo7?Lfi?!P3IjPX(j=Pg8zWBf=&`mS76h1wwBbTGi}O48b|smKd0)N z8ghlRZ1bZ_OK&Nbd({|s7c9(Ocr2ek&m?fy6 z>?+yb&oK>e+lgf-!>rCz)4V{^?C5WIA4)yc{WNTG&+t-RHbZuDw>GoRh}{L9ZVr?I zEWU*b=7KmYnu_lt5yH2!_@gO^8&L2XY5q>1HpKsUX6jgZ7at+}*=d@&Agjl#1_g`syxw0)clW>#zvjG3M zvl;l#MM#0P3~SOz>$OY5j$Pdbjmzp~(rIu%xZP~_h;{L2}#Yc4B|9y&HxjHR|b@!cGVke4fKVeA`E)NG4B!3jXf z1=fAI14&1HgrEY(i9Tb8sTN7 z;fX4q@~X?~q~slJbTo=(ad01u=sc3C10C7!-T!VjPo%n_%GO!HNY9s!e`$v@I8C|xE~2~FpT%WW)C#!b1IANghs$MqM|i4WYglPmj}m9~uyyjv z!}=jK+ub2K;zKTvQc792@e{{I$TOT&M6dYASP^pCEXV$?f>I~p!WM_0vbef)EZ04s zHowNz!oF1FVaWU0LC;&xp+nd&I^=3JsoXS+vCtqcc1iYX0_5PL@I4x4RgXIPs^d>u zZlKfV8T+rS>96mvqCt-mT3l$b1Uec>JuNp1twq>D;wkHiiLj*(=#Pxu-gjTSk8pm0 z`6KrDYi{~~7klg#|Mo4BrLf;Ih;D(w;sem9F8&>O=+gmjUlHjh>zD(Se93>up$t>1 z7gdtLEfuMQ>rcZA@tV-95T{`dSth$=SYiUuw}7F+x1R$Mb9ek;FKGzb7#0cLz4!cVr4a$u_PXCVi~L$LjLK|G%`)(&$)2M1y#Ic$Pj9V{$cwmTFcDH~C_B0mOmyTJ* ze>8)wg(5=BQpW!HlmpXF0N7UXp_{P%1y|@Ko(I-2y8E(`HKMbpJds}wdYon)yQ^r1qlDsM)+@CG+i9M0Y zpdlbn6pc?t%dAnp^r)4VGk7bQqAv6KQE}0SgE~zM*Wln+-?y_VgOx0Dr+BxrbMhT| zBl4+q+$B(b=<_^Q0#KI6g zDv3UZn`BSDlvci|_C)Af1b`-PJ`+|K8H49_I?AO`y5W>GbANg&v*LzfL%_nzJK;$@ zwb}3U)H>YNAaYdL7&eoQpO`1}(35kfuz5QO&M0`licP9#lCHx1YP*TmLFxkUVUa&F zM6}e&PuMZEc*6WsSz&9rb&gM5>jR1NLxJ#R8Zy~c(fQbE@lVxCjv5BBT=OY9N&S{H zW&B?Q6%j)~P zIi|)w)SkXMkMMqLP#0w2-=8M-zNq*E?Kz(uUu=z-9sXL@xRV-Fg9sO}j&qknv}m)CSx zXwMDVFZxa`+RUAPQ4Ha=%u~{>zQi!xx#8|(ub9^S@$o&0=cgNf= zEyp&(QFBo_m;s^lnS`OWHHOke!`&;!@wZc}6?%k67q; zD5Y0@Vqg|k_>D+~Va!AD{$pRUkCz1{I)@Aq-^qA#YEtzt5~sZ4AdKL7bQemUDrL(U z56-Oe-0l|C2-jvQtav$pHxi+)Thi9AWe8TGOBQ|gh1b>n-?XQR8AvnrvQOiQKzlvT zZ~3sA0B{DoV<_;?EDSJqnlo(Ke^q8s1mKb5KXGcKib8m0&^R{@$4+AAmNDTZ#rDqlqyN zqaz9$QctA~(Gn+GD>d{U))T~^X$%(MK1=|3;i((z1Jen3?WLZ%!;6{6!XZV_W&X>c zD)v|j0MrS#=7MR`LG!K;fNtmm=&=HXXbJ!HZ^*Tklz~@Ly9i$l zL)Jo`ifK8ZY}+r^34OR*V|n$mj*)#$?1iuhq}BX+B&%F z9Gz~k71ME~1!WoL(?8%^!j`t$uWzB)zr)(b-(f9s_$sWuk{U-t05tfO(pKrQl><^} zH5`NC>Y*rl;52xG0Q>^AlB~UWp~VD@Knca67`o@wqY9kVSSS1tnitmn2dKe7P`edV zf-MQUer%3$T++;qx7;u1@-48Ox${uRR3;X`)Oqvd+jF0!bAlAm?j+WgTC)1^l8?HXamK>j# z&7S7-6;wk?a=}4Fi6cT+x5+?h!gw9mN*vQwOuIF?dj!3bySOf_ak0m~^SCQV`s|nl zO^-j*^Y*?L?|6FxbH7v5X6>l!#U+%C^cF1u8>c^j7b-Es+CUR$pUc|D5GK^nghDI< zEH^exGS1;+6pK?`34oJI!gngHZ7Ts_#h(vR2Ma%^=#n?C+!?xIf#G`uxM3zGq$M&XC3 zd*x`oNR!()sL5aRNlk}0|MW2F;~d|fNmx{BzA>N6!5qQ`TbC*T$I5-*O=vB2b1)Dq zjI;lUQn;=-n-s{@JhaV2@+Eml)qavsc8|-~&PKeE=sgLb;5}c2dkLk4O*n%@%TVzK z#w(DIU-+vr2{XHS>Pm{0BfO(}Jt6ndjZx0N0aBajIfhh(%@_XwITU8h3)t{j8UZM% zGWn^rIlcBLp0 zdHs}lCt@#eT`_+CzlBE5Vhlj}1S2I+Rt6Xny~*;vdzbjFaK_7RlGl5!g?e}IUUp(@ z1Zsv_4eg@}M}Wo7;YT3PS3^V?#dELQ%Q2qQh>SHEVOwhJk+LZp`Q#;JH28Qui!FA9 zQIIYAJqL&|B;V$j#tKT8qTkCg|FP=ve}2%U&4IeR2L??=oFK@|{sNhbjeSflx$`a- zPss^eV&tW$tt*E8EDJhSI+p?lPHInM@Zt(cd~?sP5|Yf|NDl(~?$a@N?YX~WN(s~` z>^o%FuSJmnyf2?Sp&I{$!0UOg;u6G>2Zu%Ymjh{VG}2(5W1`6H*{#!Z1rnIo0xcrO zR3hl%&sUfBB#59B{!7q~^9f~6EaY(K$~6flxAMa10K3cjrl#^@1Nne6R`4`iNiM+o zFdU=y4yTR!5tCV*Cdz5hUx0HW>pV-t?aWpJ38bo1zJ8jvFS%&W-g7Bceahd6ZoA^M zP>@;ZYE`Q72M>iCcq&#DKNN$-%FO;$qK&Kc4P{xmY(6wYzS4#y|ejKgjocEz5HqQq&DK9RT?@04TEA3=_bxHwREN>YcNgKcZP5|VNL&kND zd49ZHWxY*%8fnpXF8hPIg}~iBqdR)v1Y-fEXVK^cR!sha$tDt&ppW*SsF2j6Q4L?Y zSgWhz$d;UVQPw72%5aZ2w7AKao1eH59*O76?G7XQhO_p*5MgPdQ{D7vB)NE8_gw*z zLSn&t$_=R2d|d<+J6-s_2C3#kzC43WMDwUGtFQ~a|KWk#X*r@zFYdCaU*N#jJ=hWx zo(uGJtKhIT(ox)_DOk@4bO*i%--I6)K7c*cdGV0|ymj~;ah735{sWo&k@t|tEb~YZ z8TRwPe&r41#um=xggP(6F#<)9s`Pkq0-$gWx!*F?^6lKS9t}(#o{A5)bhgO@vNqcT z(ydz?Se;JL>@uxb696kG(EidXmaFK@d>+j0SKI7BDGwaRVEPJiTn%H$_fUiQwY&yt zqzk)!4UN)(Xn*96p!9isbG-9`0iLZ)U>>KzfzcrVN9{-^CANS)D~#pR496mW1cyC7 z&i~wZIeur!YfSmJrLv#iZ@-JicZ3n)0#N*0w5XNOiyTkf7>DeQ>T5+|rx^tsD2 zT}j-R?GR!1Is;#D&xews(l6*%Jozf%y=Zfsj+C7}C!A`Rvh3fIUac0MuAeWtBvpbN z51T~3N4|jAS-8@h;HQ+hhNU8M`06d_?Sw0Bs6Nxfvt^ZR=z9InZo0|#VQ!fvJ$u{6 z_Ei3<5H=V+{up-|eZBn%q;9vf$;%360lvCynS58yvh(3)ro`p%7`Zv0L37OEI68wv zy%8z;&_^dTvGy^cIp>t6pA&~|J3KY>xM9Dy?!2a;e!^?BoZyRb?9%f);=O7mT9LWZ z5WKz(cQ)@@l<4UX3g)1LwOxZe+KFRg`B&raUvNxJ)^ zLA8fAmEz(33q&i(w-u8sEkPK1tXRm!(=5rg%@)QrYDdKhmHNh)Y9E_Ep7A32e1%6q zVe@85j^9diStmQ^H=J;uWk5n_x~HkB*_~k>&l@imB6ye|`pE)B(2e*^#=64K;)*U zjPJPjEI|`tVX0s)rY3YF&v7sgqG|G} zda8Z1+s`1b;(E2x8B&o^g^G~$!u3n$+WF*VHq-pINxX3lTLBXixvfv2D?KqG7U5q$ zBIz@%E!XzC`+arw;>O{^<0X3^8$KCj4W14ToEDHXZ)fJ62J2 z|3mS$kYf0oJ=XZ%cU6jy`C7^_I%uJrm}bvn-C}=Kb^LMyA zDi&rI&vYiv&0eEa&}}MizkZeI_G9I};=ds@7|1y{2pYl}xM!nuE>cLlq_i!hM!OHBNg^g&mPgMiKiEq=o|wS|YjO6Sjr)#Lz-Vzt1f z{vNmX-)@Gpv}28)F1R$Pe3Mxchy`OZl%{jFa zZU)MtRfhw)s9P0lA-^&M^#3O*I{&*f1OCX}pjbEA1lvePP5>fYFeaiP35dA^t3?hw zG-GuRizXpU3wj|)q0N-gIZ?TpuR&)`2IIiuMN?gB9adSe-VQLJ^jOE~qk2yIT4GL} zU#FbfhH8ZkreKb{>ix)HQd7h%7m+=x)Nt!_Eqms^^7WOi6WsUuNQ-QU76AzVjCO`% z3Jyg#=e9oAHDE=v4-@zUNZd0&C}MgnWA@>K;No=*M|@c{TtUk}u)khrrp|AFIIKsZ zz~7H?pJwwItA#T=eT}<^=fXG!m0a#MYW(ogKsasjYA;C1 zWjnA8flmvy#GHl-@{{PkFIv?iYFM;I?o z0?pBpf+7H$(CHINtjzXwy?3mggA```Y>r`>$n~0M3HMpz zqjv)aIu({)IJLL9TTE$C_3d^`Tb!mM>72$>4^kk$G`NdJ+#IM1$nF9G*zpa3Z-LXE z>@L{H$0&#U7!^=+GKV^cUp&+fky~&?ppsUn_v$AsgGKf7(oU>{;(HkHBY5qXmPDLw zY=>dHjd=R=;n?)*!pe8$qaz}fxmsEU@uj1gR0pu<5LUbZ?hINC?a)4B~y- z;gLYm75?yQwz9s~2cDyM6~l3ZpP41M6TXW^a-hsy z&1Z*%ATdhke7qh=n4G?q299qRIm{ zuX+GWgUQsGY#%!e!D2l|MrB?Y)R`#@pRNhvw!ikSFdC;rLUE4Zv#(Kc&DA}qjW!d1 z1F;)+Bb7^tJ8qp_K-R~@y-VvtyB&wmPd|j+2pjrvn%*<@>Y0Y>*$m5QMDx=RS!MDU z9nvBnrhSK_7F$g6S~O!7oEKdVQ#zK=qLa-_4EdKfKBeJZUmJB9X4L%3L^;;`8XAQa z37dvog4w@b9&VDb8I@!$QJCCsY@XH0xJhox1I=JQ1JFrSbT9J|Lric|U<;Em*L|HT zmT0J)jjyBAs+~1|w(Uf|)YOOVWZ?Y;;Nu@twWBjR??+;Ae;zQ?7griYEPv%ocGu{>gkd%G@Ua2!D$i(e=gV%qZ8u$m)y#6D- zOzPuhnW#S(`h1l@TFQ)O5Lw_gTFJd+*YV&l6MVHkU^*Vnk$F{_1K9nEkN?a!EGVrN zUFO(g`CM`C?>T0L!S5|V4pv``pKautm!nyAm&9W#Rau62^AF$f^Gluk4kQN+>FG84 zG18^As=Dm|3T7EONuTr;zpn1O!gBxuQna9SSbJJ)Ag6Efc1OS`}KczmI7?s0%xu)?XAU!{}-@;6Hq$UJrDUto9g$*!Mj)moa&2`ez0O#31 zX2RA&JM0d`e*SmawD1Oqwfl=)3dvk{s}Qc!HMo1p4{LA;$pXE0jk{O_qtoz~Ym;GP9ftF3qUq*y`Y<5^gf(NkGIvKt#VP2dGa({_k{scmBUM;S8AVIZ3I2HweR|Jboa^f z&DK(HMEoj;5GQoX@tP8E(dK&sP(4%IXfN9HS%*CG0XKz_ z8L@Tr9$E^F=FB2ytO_op%R(|*mgaH8Vf(DjTA4>C!6!!VzgHMUPT>@gUr<{@hnlBF zQb=miIGS-Y2bsqJ~X+r zPUA7-MC z!ZW)w<{l%aEhQu!d2+O*eQEFHd#ek&&an{nIp~VdHjz(FE$%MfxFI`bW^aGzj{eu} z9;(v(WOZ4<7mjFQ#?Q>v;3LtEI+&y~Oo!p90`{l*ZhLSE&+xYEkHo;*#Q{DB{eq`w zzA^QEdJui8`mN<`2m}KL`8aD#N#5FfO`4}oqMnO!5Q$PG;>lB=W^b4>{-{;%vWYUfW!uN;6<7)-L%NDiu`ey%Vdq05qu{t(_N7+0 zFBTNcem!EbpUM8x_^|Gx)+<_#>!g%S6P`8a(@yeBL*!6%@!)DSoMpRWFnM5y_?N}+Y zjHfru{Oo`9?fLwY*7g_yxQ-gzIn+5VELY&0m1{;_Y`mCS_1fHT*n#K@bY(mR zE3<|oa$kj3Kb;PuMxcnWG<4qFBEABv8gPE&RGhzlcp#nwD{TS2E@58rIz9*ueC~khymuVwe~>M#G)` zQ4sIeN}RhdV{CfjbRTbn)jeG`B45(Lc)OcrBil?HmcNwtP;`o8AtCZo7Xi4SaH(uf z-hxcn*V9(;_QgHKoq;-9y1RgSO-i@We%+xuCci8MTxxr2AEJSYS@>w1VqAs3Ms0nq z>e^>VfA5RA#Fl~|?e{p(TS?p^zKK}nKv@`Tae}FZ=pD6RWo|u&}KB*^I2*EV_1bWLZe^U zZO7iD!{Er4Z-;vi)&Zl&a|iTv9L)-$3L}F{92@KsRs6kOU3msAKKm@n(y89O>Bts- zYc#60!u=AC9#cOr%48Ozh=xUqZu-us%Gx7_XJ`6py z^@m|)!oJSc>?@HcsSG?n*a#M)%(}L6skS9~j5_=~)obe;_Hk7m#crdkb05??6Ig%3 zfH3i}Nj%@kc9Y5yjK<9LQG+7B$dfPMv#2s(x{oJei~Js0;NS>H`m$$S`TUw%M>(CT zlhk^jVHUr>pL(}=kzlmn2H%L{XklZcB1@avo!JVRHD}NnJziSMo%9FUNXLaajAm2t ze73E|FhI6ld5!n3^;ti77WVFolvX-do^dD^0*!%0BI&L`&KdM5`Nh>?wbCXq7Q_aJ zC}SDw)6M1cHY9#S^QWxX3t{6>c8Aj<1;qu(<$!d3v{KX}c4P>l2r+6%*G1$As~xdE zH>imYXHNU@*#6e-T{@wk@MmDEXbmh}B5Z==JWgJE?L<2cMpn8#Yg&hBn`dx{JV+EUea>Jx7qDWOx#?2bIYmnb7mu4CSa7Mfq}a(|YQYOd3zLj(Ou z|DF7i%2rL{we{!ZkFp~s0Ul!AM4`jXHpn?}84o!@(wZUKro$fKztCN@6a|;EbT%A4 z7}(UDK8QNJn@x*UEcheP z_kt?RT#LUq)#$=x0G zaMpYO)F%U6qVVMop-- zjqck{I?kz7Vdj<+fPkfi+!s8kqE2D1ojW6WL>W_uGg~WEbG}b|i3Dd}c?7d8Ux~1Y zGCsr56t7%b%=5wPOx5r$h95S)`a?~!@`PxJEd?RKKnOkGXd-w~O+lLe1AWm`g-B2c_ z>j7S4!4>ADBMLH*nAbltrq&siSdE%) zt4n9`kKFN%3p3lF4xD9We&v|%Pa7rt?ZvA*oA(}+Om=^_K^lC<$+v#%nJ+U6SJ5`g z*VZl0_Yaob|9O~d-e7TksOZUa2TIAUV6zF_E6fo}r+bd1g%cX!-jyMInBdIYzk29D z{q|AD$|vS2*=6Nccl|dZ9nY-17ih=>8W+it6yYJ~3N4*kvirD%EM(ai{d;(x$6kMM zUcDRmfws!Vss(IxJ*PEwqPpvxX7$;~dmvmuyN-7=AzFzK{}sxvbatYnG(;cuvgqy9 zeX+aSA{Cc~CwqH!WXMRCFq&=~J&e6LMT{kyWASSZ=q7zuZW)KCg>*-BPidydD}>MD zO>fZioa=v*b8ynN1fvX_;~>V91WaqAjrtS1;E^rd)yX$1?m7(zM4Xe1`zl&dr;*b6 z^9!%T?i8=RaoFo}7%S!o&b)#d3B=lW_Ki`4p*EZ9&sYuTZ zX`Jj#;Px@EQ6`JyZ58Z_GK)o#qWjDa18Ik!9m091aK~P>Rp>cK*>ar-j_RZCxi}$7 zBvpuTiSwX^m{~y$B9Jqxx7Q?-Sjt9@%0g*$KMlT>jiv@kT7}yv{>4T0r5lPyc^U0{ z2F)*>XV}*-$-ZQ^qiclgBz|}-BOvP~w4Oln6IQ1NE??Ut&ji5QgW}^*k*z^4I)|>R zu8uf4zK_Efx>r_iaerBu_Aa4jQQCam;mG!po%yrp$J|2`eGlCg&sYrQ!r|7k)pjnut^lntsLJrVmz5Ilku%V+6__>)KEGRTD-iTdGcqR zh=L2F)C$+pws@*^)Mr(6$W>qKLdA@qHXM_#$vK_*m}zxggi8OZ2?$ zj_ITd*BU#EGi7S*!(7)3JimHE6%q~8te*-U!8&#E<3UB;ukm7Q1fVAJvFl}b^Wada z5T7N@i0|sDHPXr)ym^%24?byzE^3C1qGfOlvmFb{_>sCCe$1`nwT!gL7cRn5LWM)_ z)-BaBdTH;Xmq`<^3-~>HUS34{TIPZb)$w`3`4A;~vTIhC`@H&8N_Me*vqK3&eh7s2 zVZ-Q#+kI^+u}B5?qF|0(Fm*5NLEzi}Ze!{H_D!WynIsI?iS+1GG60Qf5K4dVDK$+) zyvcF`z?n8$AR0xvX*hb`mofpXT5PnXgNH2tB5|DSP$L6=XPntU>II}`-d4Tnf1*2- zl9Hhju}S;~n=@4HP#|3m6q|i;{5lh^c9ZOiEOUW^Az6$*07j#{4Em|%M7LyD5)$kb?s++o!+9^a(vbZC+zVOw2U|1F6N&K6K;oWOfFT>?TUS%ZIZvXO8(Os+JU7H7&r{UC@#7hEERQIwE33@IFYA!G|)}o@AW-rShBm4 z>>Kqa>Wb`ibK6<}C#kw~G>`^_d?8vk&mQK3(4O=L38OYGjL@fjnh4?B6=0C_yt-&K|_ms6H5Yh4$%TrImiQ8 z5A#q(Td%RQmXxBtR}K^CFrHhL!n0%Ri=rY2`hlDl{(D1e$N3JOpI074wBkzhn#&vG z_s&XP9geNf%yPPVqh9r$^qGsAxq1mNyil`_nOqY^wVS>7f?~ruhuYBT;&;E?!PKs zKBdohTUkI23Iu_nzSUTctg zV^WvC8ul7)pl;y5i;e;?uqvlFEQeTi`#J#>*iJc*sqS>f@+0vYEBo&$_UcA9?;`YxY^thVx#zVg4r9P*9qFLxedthAT^)MKYGh&5 zq24!j_8sbs@;etE+UH8jKbZP{?8?G(H@1W@NmLB)HK|qUOH?y7^mQ`mS5lf>c?z5h z>r<11-XY|3qp$iYNJlgY)o%T{Z3FB3yE{IM=2e*EuVPuk23v?QdK}R$v?1=*IY+Hwkm~pWed#x>Wz37hKdh9`doR1& z+$8-W1awK)b)=f~4K8K*%1=0<>!g@I3XAqL%hg|@t=Sv9TazchVvsx!6| z{sGnof!Xaa@%Lm?^o-BZAwq@iGVcu947y3SrfV0<{%HL8(K7PWckP?XXU@{T00yv} znDP6V7%+Hx2QFTvn;^$(Xk6F@vGpWE}0(;#AF#Tj9N>Ctsn{+>5@*&2410 zT7-*aHvR1ksRZ4I_aDU8GfJ;T=!%MHzV}RdYQ&JnsxEjJVvyu{dd670LUyn~TZ+wE zOMOq?5k=G6(FR(ZiRK^>6$*(+kyd54pS6$bQoUGG4eFbq6Hs5KlQ=)JD zSdTh-QQj=QVi>YalQ;_3|XCp z=_>0Lls{|2%o3eovm{VGDd zZf=?dc_|4J#?=k?x)$ezGfbvVVeq7rxcRx*+-j4pt5|uA^E}5Eq|!3rIus?7c|LNH z$%R7?@v_}3e{)<+Sq4{HoWC8*Rg3bESip;6(hub^nkc%B`GnT=ghiTYsm$V{7PRYj z{I$67rfU_4u5xZhg)i#wi5onvBmg(;mBRuCji3q6qi_54<75m{Ql=!2kM);padpc_ zf%SnEBkaN-Ckukjf43@aN#_NquB~%edW>k>EI&FXz@i&Qy(ty2wLe)ixt%u_TUv2e z@4niLC5dBNfrk+8i{A@8M*9LF_fDTH$%U|@jv{fkm38ef)}MNa=7XO@+X#zuzOs}z z%0+iI5nhwxxG&#jyCJg0MF#Q9#-(LZ9R|7eOd9J}yU`jV>+0R=Dnf1Drv{CzT{E+K zI+`$ZyfNf1(wQa!O8(0y9gN!HBXHhu#D#>O9mrdk51mc(m-?_>Umd^My|~EBWTUsFJFUGH z9{uBS(PFevGMv?x-9c08sb02{5ktzd1|{!h3s*A>ePm$o=6kp1AqI_Jnp-Kz<=S@3E`vCmM5d?r13_lbiS^xQ*>Uo0Esh3th{sXIi(9wHT3PS7OqE2?iZ{c6@Hyot5v%Zp6YM? zLw$mdq`OD%?0p6!r4%$t545UhD-BiMnvu}C^CBI3UO|1n`Qn^f!}}D~`cao{ZUoiY zu^4xRVP9-Qt_Q183KbJx@9&xC&Ps|U>`po~T7#*Eq1o^9?fx(J-ZQMJZe14+ilQhW z0@96Aq=V9X^i@E*bfp*s5$PgDKp=<;(gmcKAVoTn-U%HA=^do^PN;zt&)_Y4y=(2g z_Sxsh`F?!Y@wy@cW@cn$&N1%!Ja;*Ytcp)~WjFD?ytr>D);u{k%E-os_zI?jem)h3 zEWTQcI}cdEZdm9m=W=f-M%Cnk&GHSL#bCtv6#J@3JDZV()k4z!_ngl{7!Am**mJS_ zI7ck|T|z1T3{J`OGO!kS_f`|g`o63j_QrCR?0&URt1UaV%02!nQe69X#@%V(7Yg2Y zwH}$tD*w2#rLIVIsPCw5GzyOxD;+k0st3Bi*NC^n+IpjG5ESU?Sb1?wQd`Ra_H)j2 z53%{h1H=XKx6a4!G)3G|RuuEry`)|9+E;F;1b=g^z_a4+Vuxp5h1Kz`8Ug_rf>P*x z&8<&+8OJ(7B4 zv)vXgv65P*S17yM&f@`qFPz`$Kf&L>!{I;M(Ea^+oYhIEF7CjROeCdbu8I9a0M;jK z^x3%4%vJj=kTxe)(c0ykFtiK5o4OfcWi1}aU2x~$!t9gRxh^^1H^3Q?LV6<70^i#% z!*(tKDVVu_7br4cC;5w6r>ZMi2iW_MTt4UgWw8WqaW0r4q~qj62;he6^)E=i@z{y**(|4;Wk}lPtpfYjFUZ^!!P;Yd zIce$_jl=^<-LfdOz0M3KS!^uNAnR3GiRK06;L90JHF<*1UaN! zE%MI9^J*3?Lw5mj^QzeQ>kTcchP*ikUmvbr8E$GyM`I6x<|0|Znd%7K_J%Rd^S*c~ zqPJmSS~wV_NjVpXz-$pqg+^s%enI4Z|M$yJS{pIow}i+h^e)gufdLswgj;RdFd3Jz zGmJS6hr(2LtJe14hTH%w@XC`W`PZzxJ1CD0Eqi}W9^^SS&--ey`_k&fca36FO zUHCtlg6s~fna-v|G!|2!5@>xg0n3N$=N)j8TpLo;2ZYbbA~V!(-jkdH^Oo(A>qPHK zPh^R^w}XR_t6QfR29Tbj{SU50&XW0st(T4QP7ng;aF#^sxpRGmRj@)koX{~WDNLqw z=cu*w=kT~tq<1-hz1Eg?JypS z&P;#Ve%ut^Z4mMIIZ_7PAilW_6N%UC|J@ta*@*f7-DmZG<8)nSGM2Vg1KLBo<~P-e z1io7vvT_xhk%_+`Co727KO5tfMrpdpT#nBCr_=hMuMz#nqpk}7?;`v6>r7tKh2Mr{ zwerTWPEF!YtI{ER*=I`g^Mo879Yy`Em1wp6Ub%9d(Ibtlrz6mU_QtmDFUUqdW=^vN zgW8~SvDpr4I%Jc&!m7xQn3XaOm+&_cq*w3(RZq@|W}543)N~@vt1PlJBarUwxxRTPR;|a7= zGu^VYaJ&Z!TW(Sn+Z@~+EU|}@ekC{_Ut7S{Z5~{(%FVfKVi@R=mi_OyMZQI_w+H9_ zf4Z~&-&m~&nBi0hC&(vVoCsxoN>G3KV}v0q;08FSecSZyYNS0n0I-2>r~hp#0I>1? zSJdz&0Zz3P0K=>J%GDgb&k2LQj^urNqDbj~YsGmQ7fK>35I^Ar{3?2Q*MMgKyX~Y`n-& zaY!t6R!CjInC2gdbVG4tL|>z5{fac%+k3E`6C?>PQC);(FB<(jB+Es95ix(GvtjUL zWYSGkr%w~_2F4_^ek=jd~_QJ=Hd+6)Wo9{l`&ETrq6jRfrY$dY$~NQ?aC*&skWhnc`Miy!G=7LRk!3TvmYxL z?iVCGea9KOMMM*7nNlMP&_o>+y*!JG|r`;*=E6lVeU9da$tQaOYnFZ3XRf zv(Y}}Yo(|oQoxCZoTypC|H%{YPoGN@2J^G&Is3w8HkbYXC!(Pf>hiz#6m<7c|6+e> zV}Tdf)S>*JduZnB>l;)>{q*ooxbV|htwEdn<9GJLWjfu<%6oLqEA1~I_*TEZp5aA} zo(bEJ^rAl=7U4Q>J&wou139Jz24?tSRi59igxUReV+Rh0Hhc2hsjvrKd2)O!Tfi;| zc22Z4(92`?7evZiE%K7ce(jx1KQ7NPsXpl3X+c zSc9nUjQVX?`SRND?KOLN2|QKX7~i2{H=vRr^SYjF|Ga1bTf0&5$$W()AD^3Bj=iw0 zI0^}CjDL(6D+*NedX+7P6Q??Ofw_mCyfwhSvcY-O$W=~7iGf=?;t}7WKF$Vvmyl=b zC^j0llS5x4z6tij{5Myq8sKkJfb+pSRmC>g?uF7;Dk*67#^Y2%g8Ssum@ayo5!AAq zr9npsM*p*WX*Q7P+XkNE4h|9$hC4I1v_dS11D2oW)1#b9?@H{EdlyQ&S6HDK^_nfB zpEG#AKmKmc)Go&B2hnR8wai7NMK|<^Vbk{<5ZI`(FhZsVxDv#+9e~j9ohlH3G?;ur z?3qv<*exOVgfjrC_y=s3RUatYgElR9R}>I;l%~rY>fN`K0}-3_R>1sd1vaDV$-3;x zmF5IWG65zj2i?b2u-OFnDZ<5U#Iy(%)?W|3G>ePFTb~X2%e}<_9#+HK zh>!Y^Ku1G%3Ns_X9NC6f$wy!({v7_v+b8?S@SmfW1-vhKGE23+E3rk42oA%Jg^sil zjnPlDW}Cf=HhK60rld z&V<#6`If5&$nsUg{|eHaw0|7I<3>d@J8+7diD0Hz37A{@#$ok3&-{w zU~D*Vh$ADOx4>P%(*q*qbUKn;%uBd^ma})?DffcY3yZQ{(FAt~b61-4(D?{Di>9zx za{O=@(bv=9qlH`WYysQ56|LY*J{4=@LiK8%J2%$L76;eeV~OWl9%S+sXj$1*0|TgI z0Ns3b5Dm~eGDL%@JnhPHYjNh7%@qAUpPrXPvv4zKMEj!w`u>vCX+rWC%ev(QjtbMq zztKOnI(EvNEQ#aSWbB459Sz&e%6y5KLB7)Vm}9F!=~Y0=v$w{@@Rt_nkJ3F;_2p>@ zr3f1&g!mnPArsRb*kLmH^HzDk=*UB_Ol|ZFmAedFZwAv{nayuMsxm|SqsCe&F;20CcSvETQP}c7(Y$}C&eXCWel{@At;#^ zqwrJ6Ida87{8+fEuq1H3BO&`IVWL6ybID6AE93_Hqky@=pcp~h%f>Ki(|*(VJAV;t z*XD#W?3**|nb&R)x$lTo-_Vwxuz57-sgS8zVB=KUInf`-8P)Y@1Pxz?OjDB4H5(e5 ztkMHv?7iJ?nLNifrkDt2mJK~U!OG;)?Hwu=R3zc-W=Z_Kl)4|WWY<- zU?1#{q+q(bM{l!L3z5H;6l7IlN;(n#C>_gpJ^A9kHVGld`B~RW2J#M z4}kgVy%V3E|MmeY)+d$|f0^`^pUwa_Mk940_?DOZ1HgsC7OqG%tMoWghMNC7WoYAE zDMU8WNvn9?QSGF9b)tIt{h@0=@&4lPO?BJnO7zp9Q*U#%)L9Wa20;{AHQ>IVU)LFA zmgoyR2(i@LP)#_}1kHQUmG8>mM{u3RxMzk-~>OU|g2mDeYH3-Y|*K}RXn=H@cHRa(~H1WnoYtwg`*(% zAq>M^_LsTxo|g(9 zjQV;3ZD!fiUtc(7Yh|_axsDg94#sO|@O=M`d?QJyk?L)-AhvTBwhp662|ZVqkXuQz zW0z*$Ac^aG;hG{PxlY1%o{iKhX%4nv9iO0kjOslqu9~r2^<)~jsG8c_< zea1R$?>3m%%f!5KBsrBiew8TE~s?*%S1r# z<7(r3xKH(7{`8PbF3-c9NhJ#oSHZa~obmXzZ=14RdXxk{uXg77qy7xq)h?m* zcwftuVq-;iV@}wsql{GVpjTMh8Y!^80F|b%&l+!jwi`md_mCv2W+F2>!;VZmhqQlm zOSp3T`Np|%1{Bp`jn^FNlCgU{u`~-Va#g)$zJGpizB+NS+Umt{pqqa;T&%Hg$B)Sg zIO?piMO|!#)7?kiM-L)P1%N*yfjIhf9vjo(dnnkI>ncq`Hhn|+eA z8%l<6+y$)uPg|UO-PfNTjdSdHW41KMuzA zh2sJk5rI1KX)lAl48t?;;+|bU=czhfI7R%82?eYPvNiF{`#6ipC=ATERZfi6;1?uH z539V$gKPVEezt_4W${58S%)WPV=otZ$}KbstaD6o>^<~Ristz+0BS(R7GUL#u%G>4 z#CY#f5)E+lBDb|{>xz}gUyz$QIw$YMdo=C>@OP5%1?yy%UoNs=1=V;>#pkDUZcm-9 z<>R)F!%fHG?Ns9nv%+B1elbL9A>wnYoVj0+rDM>jg5k^$`2n&*!^-ZnI|O)MIS1RL z9#sAX>DS{u`7yLir5qnzcLCxEO8l(4P=I18QH|P7q%5IR1dkdEsxKjF?49giiPZNh zXqqj4LBuG8@N95=4^$73Ji5WHh!5hRZ4-{adx*1GA}TtZH6O+)>HUH%n8=~0r_kd< zDHsXgZ*quP^PDh%(VBD6=k6i7A$z9-t6$>s1>RngH(*@p?MAC`)+e*yK+j$O>jOBw zTJZ~VL_}{>VYxQlK{3Z0ZQC~rJ{@F3>;~Xiu<9W389L}$D02L!3wRA|H*AclTpqbg zj%tL7n%ldPh3yX0c^{r~c>-)lQcovOf^Ll=Y(SG5<*@%B^JMXcw?y}Xav}|k z;kjW+-?B&PLPB2f-8)YF_nbyr8^2_dVk7A{E%%Ie8^(8x)jWMgx{O4|PAtLMyv?EX9NE$%WTAgOJPcXby>YbNVNCe!Dds-oCHM=X zHQ-$6<+xD$F6Nbo+>zf;lg7T=CZqCtRFR?52F*-l8}2y$WjhCpG*2~*N#1!jGwzx@ zSsbP`!K5_id#F@-Qtv)E6b2MMBH)gu7xaxo5j0pMoX6s}k`wKz4M72Cbu}fSarO{< z)|ek04&jvz>wMc&=~tMWgJEYEMR$!AFPE|Qdv4y$)kqCSchXJX6JWpCeJ^kez=y- zC|I)Jby?sp%cs-81g6tVS>l89#Ir^LBh`w~*~uBYv}o~*q5dCrvm3he5g#t64u3vk z1hqpnj?I&aP*!*8F`fUQlOnrV*`Q5c6_IyN3=j40L2N5^ zkLyf#x6W+)HxTJ+F*Wp)Pvf6uq>q#t{2t+|Pp0p3aLw?cXmJMny6Ek(rWd%ZT zcJaPw*#uE8ONZDLSs&|1qs{zGj*uhgrTvrkKfwQFU+@6lVv}vhZ?R1e#&qa zqb-9)!mzwC&6PDSxcizJO2QpBU-*umxN~pn^U#GAn3BF`!gr#S0gbu?$&6PU@>F*n zpIltn8J!9AeD7a;$q0iIF9-}>ZvoxJ2mf0s_P@%og#y4j*s|xa$QM(P28bqWX2%k{ zbR9z#VIh$ezW;O=&vSufDE=ucx_jj|)fajwD60)>&Bv=iw43|>15^THq|YhG&U@X- zXRe!Bl>pEO>LR-3y%3SPH-?5>cm$$e{i%LIsG|pLLUg5C83=60!cQIO5C@-KR?e*o zzj3U27^0PzS3-=_ceH|&q|3x-Yvy*r=|kI?7hz9Gg9L$d34QXSP;xLsm8jmw8^Qf69Z0q?;`|U*-*Xl8fO#XqYb{(~DIbaN-@;Ul8Em zf3`exyHF$+Xtb$MTDh0`rcDQ;9w)NCho~!DGqrjS`EP{rr-(6Ni9d-6dDRTtIf)6; z?gMW8zef#V|A-pMAKoVZA+7!2r|)o`7CSD-UG@|TYVtl8Gb^8Q31?rSa=ZDISy8~( zn~qVt##iiL=sh?%uuT5Lmp>it4)i1 zx!H`J?|)(os~13gMi=)tc|7t%1kCcQ*?%omp(lF8fbF&13=|~FBbU7nNi0@f7Cyv` zjt_!84&SYVeKjpahu6h)g>R4759NF1*$jVtWcXX=Rog>K_S?!cx-`+|jXn=Ql86zm zc!Rfn#ghkInz4i=(2FpKjRx+JVL#6@KitG?&C*8Pa(VVljb7We+a4d&w}8Hho2mgr5Byx z!AJ(8Ahu~PrbYeL>{eKTd~Yt+Z^!2QxKowlQy9lBhi81WJY|xRTu-fYgdwO+LAC}# z={c$S*rb>1)e(B^2R3FmDnFlh{>1ZJpW|qkva)DcB??+#Ho@abyWujaX|Y_se{)}G zgF<0w=fIJF$HAR5!orFpeEu2u!x_NEk(?o|O5oF8=Yi={w?O?ECTyY=HgpZ<=mqwB zc>W#M#P)g-r2$08!|w!!Av^pxL0#9;D^!`A!?5>ysu6vpTK&*&+LdVsd9=S%S>H;mzp zK9)-wHBQF^m8zp#J%;fD=GWBdKfFE}@}7l>B#c;tB+XKV6&7CrwO9oI97%$&CtBb&V>m>b* z=T+BPuqJFAi+d}2h0f)cxJ&+mL}#}RFK%=iMvpDze{Q;Q+ZHKChPjHAfcXQ9tC-yn z+Fm3q$;hQKl-m3w0BjV2Wt_-H3*v6OQ`Nx1W+zo)yTMk=4nUc@tO%%e;cGk5NWrCG z&v2^vhoIyKX%jFWjfK_@ylOiF+=*Jdsr#u5innlCZtEgUyDgMDi-yFjz5{)#j33Vm zF|7Q82$*lIMXu=YGrK=U$E$zS0Ov|{7M0G(N2R_>M>d~3*XF(+g436+z`FQ!R(I%~ z@G7YHYwedY!o$Zsf*n1h6;%OAX)-1rD(|+H)Wp1s!L?toT|1eJ^LAsx+CA+5rR_A!4?Hk3n?0N^(Yo(tVpfL&N+LT{MlyL~6Y-FP$8u^8Tc zM{KXhs5x%mLipyvU3e$3oy9-3dO>N!8&Pzi?m4b3lwft0jHZ2rH)b87HhHtO-({RH zL`26=CdjHc;{N=D)n&J9*<|eTL^!C&WkAcSyc=NSQ>Ot(j4`7iE$0#Am!h4}&k}y> zb7y?Uu5(<-O}StGW+!{6^V+!wsyJrQexfC$%bMfFy*rPQ%~1a`n^$?p#zs~{{r5%e zOb_2>*Hp0f(UHDi?k?0I;XovT`wcRiISS3$vJA}2)q^dgAnn03^Sc_0?u(TVsUKUt zvSgk}f7-2;OfrkEzgW!PGT1oK`dfl?N?)YPio|P^y%D^I=+oK7=ns|KX>(z%VWV5K zH89$ejn~@S{vi&V`bMe=L0e^T>%|@IO|g4+jSm+;@kxwPr^UD$U9*P`m9GP4${Dk5 ziH+Oap6u9R+N;#qh^!oeAliPH7&Cfl&xp&~+V^h^j#QEz+Fhe6#tv@}e=x;}B1T^g zUwXL4)S>F0YjYWu;Art2>B{{mE|90S$ElY3{_2#(Fcdf>th-riYrr)_!P_@I%!N?XTS8F=9z4k zR-q!_KB|Q&-GJVy6EemUeIe23e3#6#8cma0X2ah+z}mTFprUTejwjUIo!NNR=rJ+u zhgY`}cu)8gLVK|LIrL%rj>9GAQO^DaDX2%x3V9oGpydcUcU2S}FOerLENbQp(jPJdv*BwaUkXG3j;gH~V z?$nfz{|zws9W?xRFfE}uQ}~`Hi050h`74I4bGDG%>-sfai%wx5PC+u2Cjfi>OVrzS z;91j=JODYcb=0~HWGoOZfYnl;b*m&ynbIYE&00?9qNCLBg{05L_x4UnH1%8M`L^V$ zDuK>d@1E$2=Y35x3Z;ZmO`KkGXXqK@0XTgGB`(C0CfVAu8pLRTwwta`@aPIq!bGo= z00$Hv$@u|}`5`N~KH!+qCRCiE)w=&j)r;r+>B!p`fX@!CJ8}sh7`)pF0NW7pYE)s1 zDzHAW4Lp|OTXhNr!kI6<2K3G+hT~2RnSJwd6`v?eY^&Hl~YIov*qL~XyXo6FJTA(D&Hg|afTb=<(c;6S&t5LBn ze|->{{&UFPV;%043y`;cfhcXh;~vsa+Go##PTIdjFP?law1W5}{m=6*0C6DwZ%{yp z_=i*Z)}K!069}rsKl)(g|J4!x{xdn`fm8qWA$e&x`!1KC*)RLw5C`)#rJ)TU!R?gQ zO~ok;!xj;7JcwPvu|Et#hYrz`5lsZPIH5Y!LBRjnV4W(iVLZ$+9KPPYzTGh>NYOmY zG~}{y$gQJ_S%kr-$z2=TO%{&XkJ-xur>2p3=DnDzryCSgEke}gW3ijS44Uj+syP>x zUHUcl-q=@5N4wO9k>S!#-x<8!enDK(o@jecd9dvI@_TpHozwheZGc%#N4)+~hOSse ztbx#}qobUgBy&BKnx4D9FP#5A6;XjLq~@~U+1V%;D~eef{b(-mYw)JNV=MR>uPnGxdzsBiE9g^F_+l!bLyf(T zBykPwwxzD^d~W#0@^enidj^}*JEhB0B|`NuK!oRNk?DR5+E-?8#B3yOmk>oi1v;x+ zUfajqDsd8`6u(cx9#Zdff3e1|rFan#<@o0rpquf+_-?9@#wNyhS(zGED#H3!Ukc*A z;>lguC9@TlJG}J@ZG+x1%7^urTc0Fi`RcptPn{yl$U2?9D9hjv$%d{B2TRYvT+x(j zfoHo2VbGX;)EE-WS+WT8fwH*zo;Jp^!nU$Y6_KM8yTbv@0N zP)&y={Mt9PgWoPnCcofmUOypJFmv^ARTYG2D z@ZGUqf?C}{9>BLZ47dU(HUt`yZZ~<38<8!-)&m!sLbbXa@fBj9UAT@}3%QCB%g@lg z0do486IbFd7}Ff2%ejrs4Ue;~POM+qkoK#%cf>}d-(Y}F6!_0jHEvz;bijW8?0J2g zLs`6dmT!dL?uydR?B%X{vhZ!!RNqHkl(aN&9|zzRh(FM*uxBtjEIbJ=L{N!Sh+lQQ;poq6t%B=@gp&QTl6*X#T z2gUc--9GyEKpGd$v-;L)mQUoyC%#Zd+_W0FybE>@UCWw>kg@0;fq|Xm27Afa#Uod1WkgrfS$pN zS8LuN11H{7CtZ zXZMG>V1pZUIz&sX0OH$0_XlaJ_rz;%z)Y**v1FmYZl4Q7Jaewmr^`*E8aMUc?5&=g zzjUqvGQ1Op1BIFf9$BMpvmM-Q=K6e*&E#dqXs=s66V}q&rdy4drfkX{zZelt{m5#} zr-H~%x~ol|Ubuwk>)uyae>3K`E^}2riuk|{F)MH0G-$D}pP}NRky!d}_*wOM0YS__ zY0*vAOGRj6bhAnXPpAX9twCP?miNG8&a!^=GdJx=E*BcC@->~fM%SHUkaqb)z|O#@_vmJw3g@_tE;8)+l4h#Iv$AXcQvS>2i)g zm*xF$ZI_)!AX1n6VF*Q;%GOtJXDg;WtZT{?jY3e6Qy5oazzja&U>-VDsuE=h& zBOXlu!B&jkfCHX=TY$YLVl>@v&H%}!@n%@2nKxam<2r++#qF0Dd~ZG0Km<3L?UKg^ z*M${ja=BcXoETg$sonT8#$d+9sNPQg?N}Rk@V;MEPH>BO8{W_rzpjxbf`sGy21y8&z`#<<268$^W4imV30{oKJn^2rc@}LeYR)5M4yU<%ke}B{W!w`VvTPhS;+kbKagEH^_d^UjPc&)Q@W4X z>yo3e5ILaxoCdh(%g0Prh|4s5t56J%YbblL8Z4;zNI>~tADz}tUN_ zfnom@+aa3=XKnkRr$&06q-}ou53m7hYNwJr--PZ{{N4mc0QW-HKN_OFEqhWOw7Soy z8m(1~Zql+i>6{La_f5>ZlkZs{pBxfOAslG>FoQHSimA*^^ca%J5@_hd!j#Ce_a(^( z6w?Y&22ye5uN-Ep ze?ekHYgmNv|16%HWdGGVoC)2^9BnUd6~p1>xlFc?8idI?H82uQ=kWWecJxTgfu~8e z!}0r{h-I7y;qGqWDJ3bGKOJ%0>$Kffk}!f-_A#{Ng)ktnJkBEqg9*qEv&#hQi5TMP z8qWpWgr)-#JFQlY5VPiwngmfX{DDJ%z*r}D8?0%6DW3QSHl2SF7{vAB*iQG>2$*>U zBfecwSvoe@t$KE}BV0E@2FIY#$9&)GsDqJ)BS^yi91l+^;u=B&`~18jySHe)y?2ZEIYNqaEn?1~h2ZVQ-XPC_4s2bW(!3Y*Xke>A>r3F+h~%x?!8xkN z>QM}hxhzoxt14_<2KIHs+Zl-lb*AC^x(mUPgs3l@yF%x`?Yi)_-IzVlPCsjvSU~$k z@r)-KC<#;zM(Sf7F>^DG->a6^4bRq+-rJ_RKfqC5`H^xY6#Mke$_iYO8JS@HwVUxf z3XlnC`DTkL*;}3zlZQGlt6c4(y00Mp04X8ZW!x9B6g5_?wP2vs_KZ>o#Xay!dAZ6K zxz`;FKC!%b%A_o?w54Fbedq~sYTQawFFAE}tBL-lkw}C`@f}$fgflt*V-ZrF;zs`s z*>Z+!7ahB#P!pQt4tFXshj^NX(je{{T$ul3q0)+IHT=-A!H12VwQ&}Y zp-=O3Y42o1h^v}y3vIioDPmYsm%z8x7E~QZQF8+GYU9raJ*lX=gCm0SD(j(IaQ{|k=uIx!r4@K3 zVq1e-0llt;5z;1uKF3)4rK|)Wi5tG1_L4Z(N8k4-n+a$j`0o0`8?p617BE2V z3NfsTXj>n`)l5~5)N3`EC(l-jNYl+HdLfv4l8p_=O)VE}o%$CgQG3D;df5j*2$}$+ zDq#_7m4v(-*eH&I>}e{BHR5&hdJ>MpF@o>J%kvGpTjo#t7f%nNwLPUU=34!-VouwK zEoI_$Jli2ywynE^X7q-h$k$5&8ir#Q{Ewc!32%aoO44Dt@HEh-n8(zFPu>D}vx?#e z$?O9qROAmQko$pl_zeTC0IxuSf-U1Pm4m~o(H#Ibg%8PQ(0$p`~Q&TiM19GdfvK z=2_2~B9CH@<-md&$3Z=2Vk)qZeXijGwKQ*-h&zANPO-k11WwU(QGL?flH`7uyIk(U z8j+k1^%Dy}Am4_+w>W}bz^Em+CGr>Mz%&L88|-iw<0PHFDdt9?gMYhnWw zvW|ETHekixQqosFczMO*+?XAFv8CCv{uPRkQ_o}D&YPr1xk}b^Ae7LI@_cL29<|YL zrg6{rDG(;n7G10oj}Tp80f$uWrZb?$xIBEa;3?0vH#1s7IPzRb^)hFu z%Um$li6dCj4tO&xqjd(5tw$*`}i@8y2;(y;Os2F>z{5zJ~GS%TNG& zG2yB#zxab0nhv!ym#KZR5L4(U^EdFEscq$D2XAiA#~Ag^v`e9r{VH$l>>hY8jtRk@ z>oJ^8VU%QSGlf874E3Yx>!s$#<$n$zU)ZzXwhpC{XzBZrojsh!r0$~Sq-{TG{T;s9 zkEr-2{GKU7k8VDHr*a40)x3QO5;}-4}|dE zM+~6`5YnMY`pZ0rv_sR*b>Mt6qVGk=7Cf#BqXBZGpyjC_215UuoAibLbjHm}Q4$_g zUg3FQ`+WPX@|pteQ_7NrlYApJP)`dkl(TjrSs?Jdi~OFRCb_25Y3BpVSoyb*eQ8`` z0zR|z81+<;7<*eX(dj|4W#|A{*a11MzfVK3;Xo`JWFiqifpsx?M9i7Ual>GMflzQ~ z(>lZmEmiXoH>eU&Eq*iA*Rk`r&Wa&r@l(Z?fflqNVcO@Pup1SvuKiTg?TcJoq9<}t z&~H333}#(U4Lm-b$ZKJ0&Gg`flc9j~DGzRzT?Oix+Z>7;+JG!>B+Jx8HqbuGko7#} z0_}n=Q;3nQPS&Y<;5efWE}Z5fDv+!C);On-uHV{{$l3Edk!>=vHy~DJWO^WF{#kCH zuae69f+nui_&f^fY}E>KhR~>MFFXcx^+?PD-`%3SX6lwg_BWIUNeS;ur<57ceQ?I- z&WgfqN=oYo^*yJvQdoL_A2lbs8dlfxM-lCAqXV)VD5dl$hkd$$c%+@t8p zGCAhP(PG45FVZFZQ~rOVI0>BZzUAI~aHU!$pF>Y4B8s31SMXRPP4>llD2A<%AdMT| zt#YtE_tP$bWk0+wiU43rgK?}7o+jwvHrV)npq_vw{U$5-ZjZrkGAF~&OiY^xt~<38 zJ$Me(dV~sL$Kkqr6^@7^6i9PbTjQ!N!pT)DL#};p<=`M$l<=hTwvMaqCmxROkV)-Q z+248;^Kx-$JXy`|C=S|}eg1>CQ8Gc=U{6%Qd}2X*d~N*B%hN_zIL#X<-HvGAVD%nu z*`9uTVE^vomRz?zg~h4}uW{~G`TL=-Ej!@(I-zz&5Xw93N1!varv1M1!AoR5a$DKX zwa;Pv)b32Y-J2Sh88q!OAG;Je=WF`fchvoHb~G&et$gdq(gj5gX;&D$56z4=p9&a4 zpF`Nf{gIbllrQQVDh2F)xBvN4zq6oM5KM8wMZ9Hl6wU#Y&@=?>K&odEq$Al^jx}-- zR_Dz9c1$argXbnrTANU8wa3r>fxKQ|M%czY}GJ z&6YPh1R_t1J^xbWa2czlliYYt__3XN)3{5*nK`aF0Y#Gy!-ac&VKdRF7%@^IeI70bGpoID1dV3ZN$zmJ3m!`+Ii~{mOoxf%Y^Fl?q zxf-SFx8L5h$*Cif;}m%x##7zOt+i6gMQd7d$sopa^pBv_8arVnUM{$OSu!GdZ+^MI z8TQt8=)oQ5D$BRyM%>U-JT;nGKYxBQm6iy<$Viq5c|H6MS*TR6N;SrJ;2)%pIrBNP z$&f@kx%j$yk?M2kp=-0_u8C?HzvXq+uedMe;Pc5P-s-7Q#<^kVl(%1hmrt09%yjdZ z(EQQvDU;cd`IDQm{(>xx^Ys1}+y$&Euo|On9d#_HknjN~b zrZpfWF!XRbQme8wT%czDmh9ISE30Rz&)z4C1Ewt9IN&yLfCyAar3K4K?_Ssy0kkE` z_b@&r?>izV>!#7Svr`)aW|;3*in@{kORg3akrWjVcgt>tEwHy;6-sEW+AHg8AMR<9 zEmnWowunZ@1yodfTFS(RGkhnHJq?*fE5WAI5l}9SW-z=#nt!CMm$WS0&H0^NXZ-JU&%kQ|i^$=MAK3dC@ZKp; z1^u7Db|gj;Uk}eD1pyP9)@Cjsjpur;r`Lj6ogkwK@IEzYXMU5j~g~y2##2^6K zfa1e=zfIEj^;zG!@;PaJxMg)N9P2(^%7;i+%JF=9pdkf9p^RwzK;qLi+Cs6k3`E=1 zw2gR42?~qDQ%I`wT(fvRg~dg#=>c$Nh&C0RKOSRo>hG z0F~hhr+k17?(*C{o=FFLKSte&bq}lyoGt0|M8D6hZZH_fg6U>b>t7EvaUT%L7ti8q~o<=uV z5(cMvESg;vF$zsV7K7?SSzHRriab8JaI_ z4wq)>ThMfPWo+1M%-x3-x2z3bopRpM{8X092(|Q^VoALn7{tKhla@IA1HP?`csEoh z?cX$2p83XZNCw8JB8s|lm;4F8>=Vn&F^N7o*;ljeugu&+PUcl7aF7$-wmU+Ld8Ini zlJyoJ)|#O<`?8`2B@cpA@{(f`1qrKp+eLU21^vOP7OZ?n`&8g&_xFTaGgU7|uv>ST>PFRO4iZArHJS=b$n8vIFRCm4%kmXBdAZ3tAw}{rM#A!#IV@G{)3|lhMZ1%bf+t!4I zraS?JtwvhxleUihRFFU*&({&XH(%!EPK+ADu1fMMt;^h49DD&PKv8FB)o8oP!t6_NY2ac!+-^otqRqlS zpjl7?X}DJ*E^-nLRd#K0MQ(Qdv8%_0_f~tq>9>o^24h+&5$Uq_o!d|eKa?^!E$#2&r!ZR4>C=E4DJ ze!b_Mp}KrGZC2f~*+YFO#G&+q+qD6eyDn@|3y(JNBbR&`)%>)OJns?L-9lpTl6;)a zwRHwI8*2~oFiWzjvF#B$ryv+Bh&_J&wKD;a{CNYYEk{i;7DN=J@ALeu`%vz05nup+~Ua z?=|Flu~TUo)yBN&86&xT)`O(Saja(Y`2K=6JZY5FrOlg)j%bfT(3*)PwicKNV!!N} zutkRl?gVSAeupNR@wMkoC~y9P@T%!#@t1acHu;+q_H~!<))?zxc;+BsB|lC?Zgi@!0D_u^jR6v$b@F>h74ou1q)j*+*-PG2R*3>I(I$z?>u6(u{xQiPt zuIxJ(59fNp`KV1s>(o))4Ru*>@o4g}7AbC2Lg9O9L8k{MD)MX?IuHhG=iB6(y7KZV>xE-oVfDC6p$Gp=6 z8nP(js2jXtPk5b^;J0s)FCWyB?maT}=-LsW_H=S?^VFXHPY))M_p@5;ZD?*N~;*co0HV2UOO=64& z@%p0tSMbyaFuvKTBZk2v@B3i;Cfdut_|LmIV03|eZo+$|e>Ba0Z=n6v+KeDGqz0Et z#Y#Ay_z9HAygBWPTJ~UFl`ot33nH8I<5G_SqU*GR&pvH41u&7GkM^Vz){0OGj?hro zNRdTn9-WlIlobS@mO)bEjVXEAng=9aa0>n}=H5IW%J*#_SCo`c$ZmupOGNf%l4Rer z%M>AGC;N;LWt$MnHc|FH`#ScWu@hyNov{zbynmP8@8|RRe4pp}{qg(+lPN_k1Lyu1G63By-+u!sK2SNJO?NxCAu0*H8(>O> ztCLQbxj|d-vc%ZE2mEG3Ok&R{<&9n~j0VR7!$icJ+>E@Dh5+2}P0jo#xd!O%L$1-B zVfEEBE3*Gc2Z{mO2~>yrCnf0rU2E{~JR$Ha`!|9+qYrJy$!I}+XYSAlQvS)jpVsvO z1)6!;8KwMjpx94gj)Y=%@~N(mDQ4B*$GH+PfDoIJSb2Ie!!@({pN4EoGW4IrFLAKP zeF0feHsAfcHYKu)-zX@JLqmy*6&^B&eiXbvR76RxAT2Iq%fqvoG6Qm%<%u=&RQ{FL{a+MnXUAm2Ph-cqTDs$)dlV=D;pAXn=9FItcrh~* z(6Mk&cn^s{OBm2tX&r4(q9hql)_9%BK0dw=$=xH#j**zi-{qgr)4U9z4&zY1ysg7Hr-v`9-+3{Ne8 zASPN|GT-Fwb@NI2G%jzSK-jNt9K99{D#1MXhGG@Ha_gtIV#=f_*NbKfI&E zr;6ft`UDcL@2V(^R_7LEW=1rf7;DgtWfp3-oHkT?4r4of+=mtqh=V4ukNoQ3f>QLBvzTdB@_^cN9JL^G*OC>=SyGYHKg zWinUh+5%@06I%`CEB5KWs%3V$Cx*!GbkDT@pwU;Ky}t;Hp|1JTMQS~0_3d%Egds&` z9TqOyx{ccSmpz*0Pp;>2zsV1(DiV_Bzit-zR-dkm3=q^2F;GFoOUhvAb>O9sjF9ET z-Pyj$I%JI9-zzWS>Rqf3tY(EzRVQ!T1Hh1LS#Cjrh|j|)7x2cCl*u8FzH zt(<6evFbCE1^tV6OgV1RY8Q{ zHFG>I%!;>fhloY_Wn!+5)cU)`m~?#SfRmpq#FQje%?s+LKh}3KTdz^|?DUorS#}x? zk!Dn!8!h2_?<H>TBIn~neVwcDDR^I@GbNrH)kH@}Zd8DG zoI85c=R&PHU_QT6I@STf>Y;<=s3>#o+ob4 zQgBIEd~nfuuznb4V&M!h7I1*LR=R9qH+>EF+gDWX2&NIj$&7HNJr-ki7Lgv}=qm2l zKNw-3SU-)>pTo}$Y4)-Pi&5ohr;Cgb!rM)vE0NNW=3|4etH@i2>#8RYj2>!sfANGn zDU$f1S|;pbj;w0s3cp>ckdRT#_X!F78gG0Whj^(jLDkXTK=9NO()>{tAuC4!s)D0F zw-J%YUr$7`pw(rfUi-;auq4ENgiL&(~jv_m17m z^B^!|SJxyPpld@W+a`C@UCDpUyWQBZr`o#``IvVbc|eZ40@=87Vv3`i4SCP5R4Nsr z;8+$?%}@J%xmrbpkY3ktBv)Dy`y}aV%lXGHP%T+WUqjT~Rx9SZuWF4f?4b3uwdW;t zF}6m6>XFRXcRZA!9Zjuik3O$>(_;Tb_){Z9sKHs-d+T8ANVvb3%ey$E+U^kK6?^dt zb9PrrRTA}wAuj|Ydc0%CdERtdiJw#C{2)2D=-5)o`V=?RBF4&DFJT({R%}xb;<4Dt zVN0GCwG%hZM%=?*XE%S?Dx3#u51KgA)fDop_=P$A4oI@4$!A>NW1g-nb~72Y8)szP zdRDwh`BDkB)1d!U44afREU!pofs7wFlKKEx+zu8T;j9oqI6LB6OJ_H+|}Sr*MVJt z_#GF%^*hFYUVC8(vwN?ZHhi!}Zu)a`VzA=4O6u^E*P+M?qeHqMV*rj*ncuidC z&P7K|)7+SQ2sEXd6Yk5xuN489;XOi8z6ngxlwh7`ak+3NFv7m7OCLUKTAcVPg&F7F zakU|QZhdT*eJDWH71b__N7>?+nr&{)(Oow=azY$Cq;|(Ep4MD*+=QzgT{$Q)w;qfi zymPXIn=g#aUE7*S?uoH^5e{EPv@b>0%N6ckS$VZJcf(?h@>GO)2YwfZ{c5oIHzn6{ z)bJk!4-o)J>f}y5*Oeu{kP2I$HJSL2L@3ab^`9TM($oa1bwF)>xzH(N1MZeQSXRbA zSWjJ05(2OuNO~fYUEK$85h00xD7wWTeNK1A>^oyvLQ2kQ$62VS6;~@CUI|{V5nwQesXBulLreybknj@2aGAU#1@UgJ#AQe*WBC z%tH(fE820l;|27I!NbFjq84| zVCwYJWyV21Q|E7=jz~JloR$408{^2i6 z3Aq5#M!|}+mUF<^uixYnXsz?BamE5qpvA)0=T2nVep2_nvSLN;Ofa4x zdX{PYD8Ze9cqn1=CKV*Ac;GKj3*R7q(&e5-IDAhEP*^q0c<-lqS?VFMT@Di~E#bFe zyMe@s$eNPJVuzD$Z z;dV{0ce4?;pu%ewO=TjJk(!C&FYB!hD_63vaAhv8_{w{SbP9d__EY0_-O%GU82ig0 zN}BhQ?d-~ocSm(AspJ?)Sbvb#A>>nTZtp?L9oMHb2;-8j9JuBOqTX~ZQc9u1pn{Ue z%i9WF#%X?YI8}~0PhZ3&>zAIP=sbSD{l|Tmov@GXBtNb#h0%9A<0thNeT`hrnwNZ> zx{TiXet$Eucvo`TW*qAE^jqZf(|l=RXgdtYrH`8Txp)5<({SoJ`SZe)Ysf3O+C@$m z%}>9lb^UqXH1Rj$Wtbl8W+ECvPKqh8p}rOuCZ?eopC?aA=u}*f$i*2v!F~3_n#>9F z;4J1|$NS9ktLQV;_f=QFEveR0I=4}%LnaTYrb&t{8}>EC8oaNkBs3yQFpY&wZT#-Y ztD4()`;OT>_&l^cb6#3r_K6r^W)+gUyz5*QmI@<_s*Afb5`yD-zI|7J(kFO=GX}#{#Tcn2? ze3SHb-N*2kM>Pa8bm~uE&eM1}FMPNneYS2}FmU!D=;T`L+hx^LZ_UKmNoyLd5VK%& z@r~WXw!-)QIH+7SuaUE>(1uo?-Uy7%{`tVq0Gfqoq|V7fkP4_RlRfmn8Rt49@PqN! zJlAYWXowM2*Z24MrvB?%Vm9_y+`be zq+6Pf-0LVzW};tcLdCmVagT*6g_K;zNl89jBwEiQ(qr*&cknU^8!?xYz`&i6O_h}* zIDvRK`x>rH23p>ypE;S7+ntyF(2}68C(-^F>U_NXYrFCf*FD>3P0NdYiyrKV3Rcah zRBq^+J}s7T?B6ys*(QD}YAhf0ysBOscPjDi>iF)dbtHYC zO27-q=2(WO!?1}7+XAZu^Vrqde4dwSLwTN*9Qi+IiWqDt*y*`A-yK1=#)@7ZKkYmx zn1mQo!nNZsqX#L|kfeOK_4X&irt`M`B68S(>>i=MI2BOF#h3b&4EWwPRQbUv7AwFY z4dJgIQznnz;Q2Ol*mu=(+1szhMRX&nT|ilDUp^AA-y-QZkukrR;>r5T4|=0;kMwr< za~8}1cUuSH3v^~YH;}6hsP#gmDJhIx0kZ%NIVK<5z2R^fOM$@b6s~j=t_GJSKq8^E zYHytXBD%B@cfO+lI=?%hyawy;?zzOp!IjB1y*7nr#IB}+O0BmojwhASQ!%Zb@B4&b zUvTDOpKgf$@$VA@@oU+eNMrL&QoJ zB*qzm56{7)Ie|e0LINfFw@(BB7eO;R!+fn-=g2U(qeHntUhtn6P+~oTNna*%6_tGQ z0tmVOz%C7aqEu!w8lTX2^`10}gkpGF`rR2fS&n}vK2x_zk2~svt5&ObfNECi!u?8` zQFznW0++XE@F~cj`<$&1;bW8X{f~gdx?e;?v>N_jWSY{2KPLY=OXKH5A2vKu=*(6w z;{2mKyFbBg&+iWithi0E@#_%f9y{WF2^X{UPQ?haiv1%)xDQlQi1zMN+cG1tmm=ej zM{IR}ouM)|8eN9sh78A7=KjpR<4@fF){LF$#{TmK0iI|qZ#sJUALfT9)cY^}4^HW$ z?3vIj8|K8P|ND!p1tp&J$Uu@gk{6Eq-F9=2pqDR0P0aZ5x}=V_Rt8CG*#E7rqx@EWEc#7VrIQFe2&|B8W51jg&O1vMCvN^kstdT21nYS z(o+Xt9gNEba2l>;lG%|v$1m<( z-FY$C@fxjPMoFX!WEZstyM`xb^W5|W)=Ej}kS+7V;)Dm8oEAj{KfBZLV``P3lz%g1 z_A}5UxED+u_-rhtgK)3@DDT^r0pW zu*~a*gBrzmu#riRPZuD#%+kn2VuM|7^Kxdt0xHE5p>V`}EXdV7w#|0>W^gLof>=2Y z$!u0Vjad>ny^~0{!!t3#Okv>wkcK*B2+tGHcR2~Q7Pz5fmR?*@{>zK1#lF)>(3Qir z$!)2UMbe{i7;<*e2K2>MGm$Z1Qh*7kYR&fKn%UDoMvi|oBJm!3UtpN=HiP+7*v(2^ zcL{Aass{Z>ytm*LEqGnUJKZ@JYqyVHt9mKdJigMWW6N{=bS-tw-1%~>7=VRO<9qgy zfKY0L$O>09MF_yKj_=$y?B)VjZcL2kV;9XmrRAPym_BCwIVn}8+Kpx-bKr}$NTIbn z_kxpnhihH)M9X%%c&xo7*Rw`5UJKin%hDD&cY0ZGX9AFy)sA;puOkCldTY+z=im9R zPR~G81hv9t&W$1QPq%pv=QfLTO%Y9se%{An(~7+EP8E(^pE%#o-~2ib|2-&5bbjWX z+4g)PHM|#A!5?ZfU4ARq6W0Eo+1c3l@c>^-JZJ{Wr#z>AS14+_jrf9?U{K8!#yeI_ z@A2%?>Ywvi)F9X8*Y5LVV%FzvhR{l_Mt#>#?n3J$Von#5$3pf)Ya{7nd+F*bV87!v z>N6ZSn6RM&0dQ#(nTt3(Guko!)R9`T-1Z*hg7=*RCZ=EiU=#9&rK~mY$(V;KH*=;H`vppR!Ep(gmFH6kQ zXiLgQl0`q=z9wz(3>|mUO&Q>81e6}vJegX?rpUJ~za_lRPyeZE=V32C$tT>@%K4Zz zrT;QWq%%@qt{Mhe=zK8C0OpmHU z%#hvpa#ja_!jH9DX_{C!Ria=xInNUkvNT%U zQ6UCdR9vU zZ=2_3f?E8b5bxWj_`X*0zNN{&7NVM{4n3|i=j{U03-7v$X@u!)?+Sd*XGA_#E8d%3 zx7>i$*lXT8EtHkQ1-2TGrf02=<-6wD#furx=`Jlr&#ipk%n)ywkx-y-TjG5FmG-DC zN0B1iYE;+3aDo0vV^Au9GE1Bz+&l28Kseq=EKFKXHqWT``|F3CZ0P83A54h1>Q$@S z`IHNRrQbA7PQpiio+r(ik&OJZl*IvEbc8tDtF7J7j*KpS9q#>@SE(?1 zV{{!K&k*Lm+LgP8yZi2KTlQ>s@lrYNM^Ov~v2|KydsoBB%s#0!#kATsqghtxkv}ta z8yuLDtZ9sCRSZ9S`H9qkL`aa7Z96~;gr0*{{E7;7LujwBT*)_N4ZGjEJx_Z6zEO85 zCMq&h+SjaIEJlXir~F!UCVD8}v;6zoTp``$%g9Ck`P<6lOV?WIr#Y?*56G=Nwcp2A z>xW+54T+{7F+H%>?qm@c?{!C&JgLrnyDz`ZKEa()UmZ1HBK-K4VU*lOr=aJb4FeM2 zF!^&*3HrSXipq%g|nV=}4yBG}VX=expv zKJ9roah|S*07|w%n9ECJpm{0WAKunaMMzg?eu@q&kFD?j-uAf7;G|3IO$F&v+((&$qQo{!mmf+-k2rBUV#n zMXj*wPjg{SWfgpoYv&>1iOuWsfv)w6Yen}|1aFwh%42?RjDCv4QXcufJAG8iuym4) zHYPMSi%_qpQXfYF4?r^%ltq>|c!`zy`?3pS9(&?scjUQSzI*7u4}DX(N=>->`jKWN znzlB3&;r1{#rVt27N>&qTRg`HBKTsj#RrfUzhgoy4jSSvFh_X}y*UHK8^7e6y9bX6 z9D|S;+1ICEU+i)YO%gr>UM@A=w+5yP@8=_r;~11cK$0a26YTKa#|AaHH=n$l!6w*% zj}M0~SpFBEHh%Qw4Ag!3AUU8dY#mBu!})KgGJyX8i}mmUEt$D@|M?QD#6JmBk;L=q z-D&4k&yA*8{Zi8K`j%dvcOC^fZaogQ7)S zBk72U7?yxgp4+}y-s>U4kt4K#tpN@jA3pG0Z|NuQJ_Z0xxfB37P$kgWS;V3pFGKow zB2}Z);d~6poNDVV{6TpC1w;QJJ!EPQEkYgOx~RRg(g6}N-=FBwT)i+f?g){c6Mp*k z&Srz(W6byyue5LH|6!Z{x1W^25shhOwSk<`l6H?&LhzZ*h*^eyFOlSbKc}LMI1Fgt zpT-n$Cagwm;8M%=DXFCU^6o3?7fH72A@T*{+@dh$({B%TA9g$y7NA4 z0C>B}UKYC42Rmh=_46G3kmzk)FJ;gUy$c22yJxO(JPCZ{iogjI$qxU*88-e>L3k)8(CV{TA+f?QVmr>4+Lyz@l8jIA8Gft zS`iw6mo^+L2a?eMEqH77x4c<)Y(44{&l|$?FE%-feCXYtv0bVcgL?0UdM61+g^;7` z_0!7(IzM^R4)uy5$MDn@ET9A|kGjEptYQ}`%gZ|3H-E;g-$E?Ha?x1L>4}or2RO%U zcr&E5XM5R2h;NDzeL8uJk`@oPKM5x~3Vq^WiBGPv=YLkV zYZ>!yl0JfrP3Z>)GYpYmdGe_GF=DhwdF5R^3XfQUmQuEBcU6p^RvjUD{Y`LkIpvL{M-CK;$mwDGeR z^-b)SXzvuMZMYuI#Uj^yo;2q43vn!v67GYBS3K?OH79UiSr~~SymPv|)S&t=qUOnG zsBy`~QdNO>(pN-UY#B{%^BJ#cxX}Du*@)T+384th-+;0ptfm=!Zj!T{T8bGhEB zez5#|#sX5YaylwFD8u{>jF~*5xgKgJr7Ie58hcliQJC;J7$I5e!sh@-g`f&jaF4qkL(D~WkWxY-d|G_DmnAvP@{-VcDUA^`AJ^n zK-nN-OsLvk#46p+mA^E0&_=}SEgy@Rw%+0);CW%$gLOmV92tH#7glMznTe4tr*_F= z%)-3Rn4*KV2gx5d9Hup}qeWNyh5}qs z*p)T~1H0s}uRU3+5h*r;i()U(6G_{VKf!Z7!q?nP83;d@EZ~)tR!2Ek8?E5)s`I-&K-3Gn;(z($?CY$3qvoT5t)@E1sS^DTzoAic%B)- zr_U(h2g}r4>sTz~HNZU`u%o>$pQDzWem3!bx)E%J4d9Wq`eo2$c{r3 zhV+7u&Ud^{Nt#E!N})VD$cZ2P@p6>BpDp-4LsLP&;6+L2q0raV;%MsAl9uEB%)mX= z=gmc}@%7AXs76M84^|dwLtfnY3_6fEuXMBhVKLUwqTqKYX1DM&oMJ_cI)AH$smOON zQ#9_;K2yln3$uA!?4_+EgO&L8X~6VB>C0{p;34ErM&pW0tH$XIX=BQReEm0~SC2Oc zO6HIB%{6--Cg-$=65_DL!7Gg;n0xk*uMP5V{QirGv;O6=14~oB9mb*-Cx%^WgHq!y zGd+oC35lZFdA8AfqNC+&)yfc(XdfP)fX(%XX#qVC1MHR|6I=6J&0GEu;xfdz=8WHd z;rlX8DpNyK&qG)kog`wy?X%iw!sDnK-tU9v#y(}|7JSo+)UtK}DFhs##hMX;tT(Dp zfvUwqs%kM&PoZQR63IyIh{$W|skcI=6QbsAZ*W_H5}0<@?68aZmmL3s#W7}ide6t}n)gJW8nAqDH7pc)x8T4Mv6O^9W^{!~jP=8q7RV1mr5-Kqx)-AC z@V&?SDtN>vk*Txd%LQhD(Ksa00-b;$f?>FNK~9j*^}*%daoztE7(H|nmIGd5pBDPh zUk82_XR>)7QC}w>ruqh6QE?zh*LDLi=ge8GvxpW|^bL7xeySi;%}=SAs8gjh&%lXX zG9LK0#QVs`)T$08Bz?@-z{NZ^I86^fhu6kEr9eSjG$~fSsfO8Y@)4!4xW1pLnZkD< zGSoe0iak}#NaLdnw|nJ76VlS`tH)J(Ko= zbs;xiLYLx?@VS>mWlH^j5k`S!HIOEEp-$83@Vf-qtm&zQ35}15lal&BO-{&AVxY0`}@L8;(W}^>YA#8wVSsL(Fiz*`GA^4KBb1k$rCzYYM@w4y^wnh&+R zRb;pfE&Fmdy0nvd)tvHZ5sz*v;!ZWcHO%J*nY;lm)qaF{DdP7X?u*@N|k#^ZFyV5L_HU%_=UDg_tiQ&iMw)X%(TGTc(%m5z8OT5m-@VC zM~B%EZW_z7*Tt#s&~KO7tzv)bnWbDbRKS)ypNIV==>%?ZjQ4+7|_^8tL{iXG6y3ug4G>e?uxNgk+QrjG#jC!@{8pMa`W zY=K6oY>D84A`qngYb>4hW|_1f>g?-3Ia@h)N#Gu_=6Ey9ezo4<%;!Cw~78ybE{(Z9yH zf!%!Q5W(*+BJd~WQh*qJa^cAPkFo!4(z(9UV_y)Aa^%`xR))W|hm!8D!&PC*i72%c z&G~k3+_Xff+Rkk>o{Hl@8y7>`d*iboMR=doeSNWmaXdwe;w-Ft6P8a){x@0Jm!dNnn50_z7sld6GCw5(1f#2gFOR+JLZbnO#|XgT&# zQ|D3Ve$??&FMRuQp&jHwd{kjh-_>bT_$sr{@0&wI>3$w3x8PF{Cg=;FwO;Bb7vnX; z)v?eB$ENDx#{gg-*LpH{ziOc`xOlPqozbm_q&-h)p{%PO)rQqt_6wYfbjtqoU8c@O zyQh9UAH|Nfq7;8Dl5!ACkg($=Gkv>{vnAxbO%^tHn)It*ABhx1$mkkp<`l=8-sh2z zcCLn|p)Y&NA84JHEqI|V{Jf-@<}+U#$+CDB9E)34CB16Gd6;}kuiFvs{Lbr>5xg8^ zbu;)UzG9nncB_Rlh`@zvgi`O>{UX*c$9%T&b2u0xav=_Ky29~n!?LSFOX)ZIrU=uo zdm<7oACxPV@b4Qse|q~SS+Bt|5a)qrC>O!%%P@Na2}Cih=hX{%GTx4)-$T*|4_g(7 zcwRkC%()9{_75yAeh5Df{Pw~b_F=w~OSC&))I`8h_2~A7w!r4_1Y9LeXG=SU#k9Ok z#zxli$JUM?9O32r^A0^%Aq3Vl6f|>Pn1GNxrjy5Ig3LkfY1*8To4|ED^toDjP7jI+ zk9YZ~R%5&j&y?4cp=Ym@?LORXeWqKWjKhz1Eu!DsK=WePm z8wS7N-f$^sjCEV^($ELV-L3u+WdT94ds_|j5aX3vN9@>KNV5^4b(^|5AtUha`m15L zlf>KP;vDu(H!;TBsB3G^E5~lppGnjj{FgrXpYPdNy(Z^6#6~4ifNz#+n#H=dYuNp0 zl@LuHiLT)(^VH2)?OZOCzH;EdJqRl0m?VV8Og_vkQMLRdg|i6m~blL{=h&C+nYd)%CfZP97C<{98-j4bDqY-N9o@?Ni1I3YBESYHe8D1 zOetHsLEv~@8GDzS=$=l{1`exLtTr%k*!|Pbb+Wd_TOor#) ze7c;6qjjFiN5@akVl8L;kFy&aK`ct;ZNTJKF+t71c_D@*H>=~ryg1v7;Q377?VprU z5{Y7L*sULBoRzyCpfSRiC1<$*Jpx-5Co84eUgwhZlQFZK!+Cg)Z;J&2oMiq=;#{ci z{MRusW&8B^`^`$1a}tdV ztozfki|)>!5W4MpoS~SZ4mDux4 z>7#&z1jhn2ez$PnwF!2)sLG!4a^cpk3+Wp#>$f9;qRDH@xaNK`a@<8N<^ETu)q#rH z^{XmBDCPL9WiEPLu4Qr2L-s=)clXl=3htvfq@KlX(s$F7_K}i0wLQkHsoDLazXvPn z&_qlVLH8(k2hq8L&dw`G5POy62*102V|NubZ^JbiPA6SMdv?7@T!8u!dg|_@fgTLn zxwNqWsfw5Q$c*HF4{-(B9OJJC8=NzKDe@_q82V$2?t(L{~a zJt)UDignTj`(CrZ=ZXhyL&DM!=j>rUs;2WdH6B1y5CV&^VbIW4(vNNiY!}FbV%%ZA zNw*Cow0>yz-3!+kDb38*Op}kZE@|@yJW3rMj`GOGcPcHkuZSc4>QU)%hS?W!9HHVN z5ZbS~D#`ejfrzor&eJ8#;=SLkbGCO^{03mZy&$dj55@OiGK@JXiCtT(>mbA~&cjOE zMgJn|s>Zx835zhFx532Hs354pR&3SlrH+V0DTNP=&A;mUW;Vi%z%nWBL8<1l@B9`) zCD(6IWUU?4U8p?0gPI(j-fjK^u?A-h=Kdlw`n-#Ow@Uer-yk1-2HPC*ocgHUEwJ}j zJyc#8{MV+R4_%rDr*YvqZ-fw@f`&Yx$N3+yfW|5DLzgCxbT#T;{^{HaP=@i}C`0?S z&TaxAFq)yliO3=ZIPeUZs>H-3$QH9LoVBtcyYL5>@H`*Or^FYX0k}GvST9l@NyNq) z><<75ECAr@4~pw~^6JNozC&%|cZx@DnNLeePZiJRD_<}%{|--wc+9!N1mmJ`&PBBM9PH-bpdk0F=bl*0^ z%h6LFk$SxC?A1kH5h{AL3e`N6vA-aLqb;SVc>xPf`g*v?1MpK*AtzySRgw@Hwd-w9-+WG@t={4;=xDQE(TA~ zL;n9C5U^ttg_eTIB?Ykr!Ymbmqa^}@r@bSCuKhf!`~#DsZV>qqI0PV@-Jf}577fp| z97uaM5QY5{lH}f~7%){YrnYG}<4wrt=OqB-NvwA{zvdj=?=gM)%L(ZZ&M7qot({!O9$y^i}(a#YXbh$1Qre5bpHNYf5JWJKjB}VB=`R#qrm8qY59*+5D0&X z&R(WT=HCoh{^sPrf@1U(dPX8Z!~0(zulqy$gA_pVn)%_sqQgKKlSr z7Jrfb8~Igv1+(xgG*6zN+NuQ(W}|fZ7$B zFEhVW_1iC|e<5r9qc|xC9^4;?iYW9OvvcZXOqdym{InRot?`If0yfwC5FbQ&lB;(g zgZqmp>~vOtf9vQH!m(>q|$CoU%@{X zaI@;)WI7x*707-Y`DC9!9kqN>#_j~QEYV(yHEQEvFXZKW^dyxaZnol8Sq|c#p*_r1 zVez3B%`4EdoP8J;%5gjovSgkFPEYyycz?Jk&Ur_wPoHFwlkvNP_mL4}bby3+A*|!@SR(3N#78EF){~|Jt zuhS0D8suJ zC3hwyI75F=SOS{WDPGtC^Xg%7i5EcPTCD9f0q`@OEh`Z~UC)@{%*eXsn3 z%hGRb#dX&H%G2+|8_i!g%>}*YS*Hm(71=AVC!**`7m_IGDXLhQ$sLF*B$#J*Tq8gd zPb>m${nThbncs3)`o0OP16f>uRfBSIq;P}Ny$({6@b+2Qjd8oUwfjQkABfET#2Yc* ze-Yj0;9Wk1QiWFwB^h{BD|7}gU;1gmn-t8N<=nA?(f(;2y0*TrByh;5zN=W_$r4B* zA>*yPwVp4+tzOsVL^0zUkU66103~;NOm;Eo#(_8g$8h?Tyq>yI2eYXHPcjd>A)pGc`L5)|nQgj~-1$p`BXA5rio$FiY z(vej|)@kF#<4^8R8sdiFsrAi-kc^8A2Ix;z-w3)3#$;a2vX~i0E4oK~PIR`i zdZ5hZVP<#yb-B3#!w{L`Xe_%fGk&~}xRu$9dfsH@QJS^Zoza#bN^yx9VZ2#*QH1v` zb0A0L^pr@S(G(X`ej4;}8sRrpHazgeFDV|v| zNwrXLe`-9;N}5bZ2$J;U$^4X>h=!`vd|M?u&3=Wpe(Rx1|C9KH<4cO{;S-rk;V0aMn@7A4Bu{7 z}uwS3Sv&d`xg=x-Q|6Qg#Zox{VOTbIl8cZYaefNORVM z0l8Q6Sae|REr)7k(EZ7D%lZ)kQ$*UTsw3}t4`H5_;;3pHLk-cEs9F^19Q55MGv@B} zh=Qt&4MryztqM}93A8kwn&hnyNlvhGY8rIsEI3fj^}8+!#qlOpd*G=j31r$>RRWn! z#;=RpR;6?;a9)L|+jqX(+|5LK^W;7}&RYk%%iB_X5M6vK-~3lrgdEOb7+OKO@diBD zCs7B9+t3ZJZ6YsfJCAd(@_aEuGQz4Ar@vyuU(pg@VkeRcf{8xdpge67u|J*BxFDxMyTI`FUrNv?8b9XzuO)(do-;e< z3@M8@TGNltgNh?if^&895$L~mQJrMQ3RD5TIDg}hR5qjJ++Y-FcpvJ2-nCa&mPNBN zLpNp%nU&!`IR+h7+!Mi+SiCVYo}}7-vut-hr?BNrduw^e@HzM>8)f4BGowRigL7nO zdW`GwkAUvs36QM*Ta>A*dQR>c4fik|QP??C7uJVO)8V41fd59Mc*xL^ zei6=)0eqVmVAB7t&rzW-R8ip>u0HoiS@F$a{iXBz8T=5(R8ktqtQrI5M7uHi!R<3a zDw1t4?bD4rUE^8We>x6pYx7zJ>WnaC#qWPzh6DCy!MYq$(x zz^**p7LA=_LO|6%3O}QZsC45hp+Efyiv;1uQ^6xxq;yIfzknlsz$d@M(KJv=EW z$9*B_Aka?0bZNFkg|(^L^k7t=Fo95jT%T`&T?PzZG+^1yj3^`O$vp$0{=giGHM?H5 z_r{*Wfx4^qr_xB@=x4zMCR6hi&+Ptsr3n*b zrF$8(rtrekRAbrGY6WHGTf-Z{M&V5-m6Gqg3>cl&y@sA)R`hBbD9s{EEI$Q*b_ekxocZA4?;#_%+D%|%xt>A^nn!C6s6^Xs-9IK+(praT4kCUd7ek)7h)8_^bha~w)OjNzQ67OyGWPe{ zrJk%jHrNN@|20GWBgfAK65MlS*042Z!G5KgKv9ef5{I0t6(m~$zHxUzk6Fel;9=2Jidh4gYIl-nB8=q*9Wa*4G6SDpy}ep zUFmMZ8^n$~L2;*e){%1Bv$^H9EaT9d-NM^SZ`xi5Lxqzp-ZEIMUxkmpWMn~wxP?8X zXnj37@hIx?=e`>vmxY{!hhl!7j7`)-!NxU+2cRk-5PxeFPWRMTdeE0Pv(eo`q_;0w zI$qa|oq_YlbnRQwtSIvj8&dD}Sjb2_W^jIAmLX*O(C{hA(Y*V;qPYbYyO2O9T?Ea#+cn+k~pwdz12P|6O`qsuC7;`5u>pkYOq)qT~}~2 zj<1LiPQc}CH}^3Y$NM7-w}_&Y<{w8%}$WAN^wdPOMB=o=kXxC04Er z`Cy*VrF4aRgL&}M57PslmJ`<4y`|=9=9g%iJy@yywP3xD=-W3F#MB%gHW0Nq=v-pX zy>nBU8{JdYCKuk=tJ|&}E8(US7KYc66{=@U7qgAB8!^O_W340eY87AcZ$hXANT>r* zg|yafuG3HJDuUh8g`UEc-i1YK%$=W)3`WbNZIR=-3fm-N2x>TMN40DPk+5o8x7{Fg zDGgb}%Sv20#YIlxL3soB6kCeZoxOHiTF+TmrAo%X*DI`Kq!hQN#jPCm$)AQw)n2`a zM(UaUQXpwS{`-7pe(ot38v&^(m88sD7lw~OSE(4Imt%|`O?3=`#yA(DyA0l{Sv|z2 z_m+~A*gCq3oTsV=sEpzZk1G+vjAQFt%@7>FS=9`S5R2r{tW}tJIOXT9TO`K_V1H%e zX+og5zYPzd>&6Mst~f_l2Q`3b#$lfjfwK>uGmSr|dLf{5cvzn>b**Ogz^6`g^t-oV z4$bhL{yKDR6nEaIV zjU(2wyNH?9tw`*dbj3=R&9OJihBt`a zaTq=s5rxP2^5bl_x#p0e`EHcKaMs~k1>d1Z7wY3JoU=4snjzH{%1kLg4VI@HU^sS4 zJPimy-;C6Ee)Z)U@fEh^1g(j-A6YazJ@`%~c4ROom8~b&?UzEPwAXjRZ)FZl6-l^! zE$_i7XyJ)@Q+ny06e|m_R%J4RVV@3YJf?H-pu}?;JcJv-&GZHDTka>^3b`S|&)OQu zU5>>&d3xGA2kR$lL^6fw2)9HR6+XshI>y3&LRd{Zd@Xw$9*9=jSsKcW+ge1=~=Ss^1C7SjVP@sxW9IywACxr*86e$jwC8 zC%fyWTt9R4RF`DT9wgo41uNsMP|~BynD_UP*WL#p>at%x{OFzIgtIBw+|^oiZnwNg9Ryy2=ZX)p-Kq~0wSS@7UzT}zFD(oX07=Uk}tWOyRz>-`|R@j zgBYY>4LAt;Gawp3fzBYY5sV=j9xt!cA%IZR5+(O^5FcI53`Vb52jcH0z#p;51E#kK zB>lt{KeZyzRlC#CS$YGbb3bM7{Ouh*852%tu zNpuk(s}C@L04gYnX^mjaXYC3rDIrw_UI3Cb1Jmz93BQd)v8{!db?ezcQ+>)AQ$|MY zwF=23=Q8LL=_Z&HwQl8uoB9tOw~hZU(qu%OfYoi$);lr8)4xPye(BCdn+&GXjk8tu zu^X?9ew&;DG3M$$|9Y4E&eB@l*Fw6Sn2o#?(Y_TBwWp9GHRXzCxCF&#(_fuPN!%zv z`i5^&{Q2`W@zJyl>=>;EU^;3o$7W>>#?}lIR#2;im!x$u3Gr-_#*aG z;vsys@@@Mfg6mY&gN(n(?s@8SY;O+IUMqXJ4wc@CZ-uAozq!L1l6a}PWz>!9e&_cy z71?K{jE_&{eG*c_s|+K2bBnqt_wGt*jDN*<_zeqa2=|JKl$*) zy}P+FZsvh34=IsHmJ;IMz?XLf?VIgh*eweiMIV z6Qmr{(2Wzgr9BhfM`Z7C&f-?ub9(pHV=7UTRby5Y_2`M-P{5DoXm#JmXBrq_PmXpG zF{8x8@IPFn6=Zc~tS^RkF^eh~TtMfWR!R!@SK&wq4zF;(CejC0+2{TNmNrtVYy>7> z5w32j?kLEz!9?3Ea}h1;83F1gzoh0VA$GJ_%-Jc=7`kQO_jBe~Z|p}|#2VfZfmGjr zmli<{A%0wl^*LI3WbEk3= z_LRC}dogtQ0;3c@+4@#3r>n+B2;=s~E?OtzO%J(KJ@#5zjKFLSwnw$yG{mlqsyQAk z1C$IyXS9_t%qL+574DKPi4XDclAxMhe<&B$CTq-vLFx5Ab!CP8!PJU(uKK(II*qpx z)@Xwkp@@B_OdjuamO7N-rY3-wpTFvQ-}ZW$#0_=j(#wd6XJxzk`44ahg}`-{irUhH z-II93$kB~%D$u=e}~pQuGLdb;Uje`{)t1}K7HmmbVO-=0g9e+tgMG>(?=QSalUo;(9$ z*ieqk4J|isK}LZL@OiEwG$@-f)?u(5x&>6eu`{FH!1AfJhR-*w);$j@mXnzWoM`xT zH(iqYfm0_ww2U85gjMgsFppDQ0-gN4hA=^}3aCp2?UnH|<~@&AfMTVYt_oCH@-`ha z{gq-~aO1s|z0uU|CQNgW_PEa1Jc_fdR!jfhxw4iYBm}NAifrAGb51P@kB%$&9^mVf zM)Zqwnb9T`jZDc+@_)bS_l@Js>3e(sv_kQ+K!1qO7l*wyqeuxxO(mi-_C9-9!8W|V z!~QdIo^UAs8tpA;gtSY*ywrc?a5SaQEiDDNM4k9YG2JGw0@O`&)!#H%1!3#wi1-|$ z+qBRTAW|R*HnTmDPf3tRY-jcKblHMe*d1WNBu)tu*k_vzL>sa@gshjk9w>TlWoasbQWU9 z#9{HCwcX7m4?6(Jd%t5@HYGbYB|bO+Xzy=@CC2Wy{u1{DF~`IGV1~rZxHuDA6@tDu znPWxGm&tl}KfUn+lY*taLy5BD_!$O{k1>k7`6a~cubLJ0lG8u(;7xO9)@gZ`FR0P(Vx!^8X~>GutO-MAw%eMp5e=*rrOXC>1=mw6Yws+X z)T)IJpWvmsn}*nIm#o~F3fQR4g7g%;PLp0xn*Ned{=lLDB!4W=uiX)o!^eej-M3-% z_iE6F{HyK?V(-h&l(PGD^Hupu_BWBL-26|PT%D|}OnhZ489OO(&%?Dxo4G16jLqlI zM$@gN{EN$zXqqVDU8}{dgwX?Lfl~bEnjPIao*2X4fkX4Qm_U}X7mIB*h@zKE&_#;I zn0DVH*1u<4zWx?3_SPm%iNn|1%(EMvIs}($pt3{}_Xp~q+ppPQFo>D_fisGT9vHL& z8Myl^zgqea^N<3D7Rsq+<@zZ)QUeJQ-58s4Crn9z?!ECg;Y%i1N_^G)Vrva~rl%+H z1Nd%vQs#w1t@BRN9wRR<|AYC22j~zsgrpZ*p09g> z5*UhKv6b~_0I3bQkSURAmYlA4CT5_WNNkS?e@dZwKAe;>-^?GBPsChUoLJsrO(vz; z%P|bT{5OM-t(8G;@3ustHrvt0=glahvVn0bW1@;}jTi3Fx|&RUk-=E&W8X#h6H`8pe0)xW@5-%KkBS!`XtI7lT}SxEaL z_c8$G7lDvpKzMw$bwHTIb=MQ;jiL(7ON`6oaUvN!*EtgphO{u2k-7ETQ`X(#+MA63 zX!^71BnntxDpwU;a3c_P=LgY@g>)k}F4sYSCUgegM7y%=ScatAzRp6BPqvV!XuHKd zWWlZetLpLDa`&gU<&+eFI$%2T$OCjHGgNmvH-Q&c0SqjeKo;vJIQ{v&_8vhDf&><# zH`naZDRS!@Z|>a=V8Tw6x3J2=$(r$a$usHLRzWG{D1iuaGA45?63VZb8JWw>jSEZ! zTu{e&r$5+^DDb8UA8cX8+d%{(0J#(j0c3=xsDy)_nfA^gjcXX0&4k>`E$_8A-V|b6 z&kRnVWa$y8A_8vbk31KvE6;cqwF z9>e~`Y#gZ$d?J8T#aF5TNLNtEi(f~Km0wy!0M!R{f10E69p;!Fz)|H7K&nr)Y4l6W zNbFJ9n7eziHG!whH+xK(P^5l(WH$Szhkkx;6m?7b7G<1wQL}Mtfsu)tgn>b-2V790 znCa-tD?o_|03328TbTr*2B^p7fYfCe#GVXJDI%F_;hFnXze-j=GN5qTyYJ<7wPQZpcSCcKYw9OtBr`LKBW5}sbSiC_JeYad^tq`Vplg$M zzDV?PK@5$X9@P{U0$_J)52MCnLLxRd#DemPSo@*_@Q0|m0^+uJiW>*Zp>f73Dqk_RXq(4J&}kquZ~Y6>n3 zY~m|cXJpT?J(Og5+v;8qcXSw%y4OxVeF=RZIJ{LqBAR_&^aCXcJWdeqRkQw^wQRVR J|C{6M_$ShtHqHP5 diff --git a/docs/.vitepress/badges.mjs b/docs/.vitepress/badges.mjs new file mode 100644 index 00000000000..9d720a037fc --- /dev/null +++ b/docs/.vitepress/badges.mjs @@ -0,0 +1,7 @@ +export function comingSoonBadge() { + return `

    `; +} + +export function requiresAccount() { + return `
    Account required
    `; +} diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index a03f0d2826c..f4fac2c59ba 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -1,221 +1,12 @@ import { defineConfig } from "vitepress"; -import projectDescriptionTypesDataLoader from "../docs/reference/project-description/types.data"; -import examplesDataLoader from "../docs/reference/examples/examples.data"; -import cliDataLoader from "../docs/reference/cli/commands.data"; import * as path from "node:path"; import * as fs from "node:fs/promises"; +import { + guidesSidebar, + contributorsSidebar, + referencesSidebar, +} from "./sidebars.mjs"; -const projectDescriptionTypesData = projectDescriptionTypesDataLoader.load(); - -const projectDescriptionSidebar = { - text: "Project Description", - items: [], -}; - -function capitalize(text) { - return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase(); -} - -["structs", "enums", "extensions", "typealiases"].forEach((category) => { - if (projectDescriptionTypesData.find((item) => item.category === category)) { - projectDescriptionSidebar.items.push({ - text: capitalize(category), - collapsed: true, - items: projectDescriptionTypesData - .filter((item) => item.category === category) - .map((item) => ({ - text: item.title, - link: `/reference/project-description/${item.identifier}`, - })), - }); - } -}); - -function generateNestedSidebarItems(items) { - const nestedItems = {}; - - items.forEach((item) => { - const category = item.category; - if (!nestedItems[category]) { - nestedItems[category] = { - text: capitalize(category), - collapsed: true, - items: [], - }; - } - nestedItems[category].items.push({ - text: item.title, - link: `/reference/cli/${item.command}`, - }); - }); - - function isLinkItem(item) { - return typeof item.link === "string"; - } - - function convertToArray(obj) { - return Object.values(obj).reduce((acc, item) => { - if (Array.isArray(item.items) && item.items.every(isLinkItem)) { - acc.push(item); - } else { - acc.push({ - text: item.text, - collapsed: true, - items: convertToArray(item.items), - }); - } - return acc; - }, []); - } - - return convertToArray(nestedItems); -} - -const cliData = cliDataLoader.load(); - -const cliSidebar = { - text: "CLI", - items: generateNestedSidebarItems(cliData), -}; - -const guideSidebar = [ - { - text: "Introduction", - items: [ - { - text: "What is Tuist?", - link: "/", - }, - { - text: "The cost of convenience", - link: "/guide/introduction/cost-of-convenience", - }, - { - text: "Installation", - link: "/guide/introduction/installation", - }, - { - text: "Adopting Tuist", - collapsed: true, - items: [ - { - text: "Create a project", - link: "/guide/introduction/adopting-tuist/new-project", - }, - { - text: "Use it with a Swift Package", - link: "/guide/introduction/adopting-tuist/swift-package", - }, - { - text: "Migrate from .xcodeproj", - link: "/guide/introduction/adopting-tuist/migrate-from-xcodeproj", - }, - { - text: "Migrate local Swift Packages", - link: "/guide/introduction/adopting-tuist/migrate-local-swift-packages", - }, - { - text: "Migrate from XcodeGen", - link: "/guide/introduction/adopting-tuist/migrate-from-xcodegen", - }, - { - text: "Migrate from Bazel", - link: "/guide/introduction/adopting-tuist/migrate-from-bazel", - }, - ], - }, - { - text: "From v3 to v4", - link: "/guide/introduction/from-v3-to-v4", - }, - ], - }, - { - text: "Tuist Projects", - items: [ - { - text: "Manifests", - link: "/guide/project/manifests", - }, - { - text: "Directory structure", - link: "/guide/project/directory-structure", - }, - { text: "Editing", link: "/guide/project/editing" }, - { text: "Dependencies", link: "/guide/project/dependencies" }, - { text: "Code sharing", link: "/guide/project/code-sharing" }, - { - text: "Synthesized files", - link: "/guide/project/synthesized-files", - }, - { - text: "Dynamic configuration", - link: "/guide/project/dynamic-configuration", - }, - { - text: "Templates", - link: "/guide/project/templates", - }, - { - text: "Plugins", - link: "/guide/project/plugins", - }, - { - text: "Commands", - collapsed: true, - items: [ - { text: "Generate", link: "/guide/automation/generate" }, - { text: "Build", link: "/guide/automation/build" }, - { text: "Test", link: "/guide/automation/test" }, - { text: "Run", link: "/guide/automation/run" }, - { text: "Graph", link: "/guide/automation/graph" }, - { text: "Clean", link: "/guide/automation/clean" }, - ], - }, - { - text: "The Modular Architecture", - link: "/guide/scale/tma-architecture", - }, - ], - }, - { - text: "Tuist Cloud", - items: [ - { - text: "What is Tuist Cloud?", - link: "/cloud/what-is-cloud", - }, - { - text: "Get started", - link: "/cloud/get-started", - }, - { - text: "Binary caching", - link: "/cloud/binary-caching", - }, - { - text: "Selective testing", - link: "/cloud/selective-testing", - }, - { - text: "Hashing", - link: "/cloud/hashing", - }, - { - text: "On-premise", - link: "/cloud/on-premise", - items: [ - { - text: "Metrics", - link: "/cloud/on-premise/metrics", - }, - ], - }, - ], - }, -]; - -// https://vitepress.dev/reference/site-config export default defineConfig({ title: "Tuist", titleTemplate: ":title | Tuist", @@ -281,6 +72,42 @@ export default defineConfig({ /documentation/tuist/championing-projects /contributors/get-started 301 /guide/scale/ufeatures-architecture.html /guide/scale/tma-architecture.html 301 /guide/scale/ufeatures-architecture /guide/scale/tma-architecture 301 + +/guide/introduction/cost-of-convenience /guides/develop/projects/cost-of-convenience 301 +/guide/introduction/installation /guides/quick-start/install-tuist 301 +/guide/introduction/adopting-tuist/new-project /guides/start/new-project 301 +/guide/introduction/adopting-tuist/swift-package /guides/start/swift-package 301 +/guide/introduction/adopting-tuist/migrate-from-xcodeproj /guides/start/migrate/xcode-project 301 +/guide/introduction/adopting-tuist/migrate-local-swift-packages /guides/start/migrate/swift-package 301 +/guide/introduction/adopting-tuist/migrate-from-xcodegen /guides/start/migrate/xcodegen-project 301 +/guide/introduction/adopting-tuist/migrate-from-bazel /guides/start/migrate/bazel-project 301 +/guide/introduction/from-v3-to-v4 /references/migrations/from-v3-to-v4 301 +/guide/project/manifests /guides/develop/projects/manifests 301 +/guide/project/directory-structure /guides/develop/projects/directory-structure 301 +/guide/project/editing /guides/develop/projects/editing 301 +/guide/project/dependencies /guides/develop/projects/dependencies 301 +/guide/project/code-sharing /guides/develop/projects/code-sharing 301 +/guide/project/synthesized-files /guides/develop/projects/synthesized-files 301 +/guide/project/dynamic-configuration /guides/develop/projects/dynamic-configuration 301 +/guide/project/templates /guides/develop/projects/templates 301 +/guide/project/plugins /guides/develop/projects/plugins 301 +/guide/automation/generate / 301 +/guide/automation/build /guides/develop/build 301 +/guide/automation/test /guides/develop/test 301 +/guide/automation/run / 301 +/guide/automation/graph / 301 +/guide/automation/clean / 301 +/guide/scale/tma-architecture /guides/develop/projects/tma-architecture 301 +/cloud/what-is-cloud / 301 +/cloud/get-started / 301 +/cloud/binary-caching /guides/develop/build/cache 301 +/cloud/selective-testing /guides/develop/test/smart-runner 301 +/cloud/hashing /guides/develop/projects/hashing 301 +/cloud/on-premise /guides/dashboard/on-premise/install 301 +/cloud/on-premise/metrics /guides/dashboard/on-premise/metrics 301 +/reference/project-description/* /references/project-description/:splat 301 +/reference/examples/* /references/examples/:splat 301 + /documentation/tuist/* / 301 `; fs.writeFile(redirectsPath, redirects); @@ -291,61 +118,26 @@ export default defineConfig({ provider: "local", }, nav: [ - { text: "Guide", link: "/" }, + { text: "Guides", link: "/" }, { - text: "Reference", - link: "/reference/project-description/structs/project", + text: "References", + link: "/references/project-description/structs/project", }, { text: "Contributors", link: "/contributors/get-started" }, { text: "Changelog", link: "https://github.com/tuist/tuist/releases" }, + { + component: "Button", + props: { title: "Log in", href: "https://cloud.tuist.io/users/log_in" }, + }, ], editLink: { pattern: "https://github.com/tuist/tuist/edit/main/docs/docs/:path", }, sidebar: { - "/contributors": [ - { - text: "Contributors", - items: [ - { - text: "Get started", - link: "/contributors/get-started", - }, - { - text: "Issue reporting", - link: "/contributors/issue-reporting", - }, - { - text: "Code reviews", - link: "/contributors/code-reviews", - }, - { - text: "Principles", - link: "/contributors/principles", - }, - ], - }, - ], - "/guide/": guideSidebar, - "/": guideSidebar, - "/reference/": [ - { - text: "Reference", - items: [ - cliSidebar, - projectDescriptionSidebar, - { - text: "Examples", - items: examplesDataLoader.load().map((item) => { - return { - text: item.title, - link: `/reference/examples/${item.name}`, - }; - }), - }, - ], - }, - ], + "/contributors": contributorsSidebar, + "/guides/": guidesSidebar, + "/": guidesSidebar, + "/references/": referencesSidebar, }, socialLinks: [ { icon: "github", link: "https://github.com/tuist/tuist" }, diff --git a/docs/.vitepress/icons.mjs b/docs/.vitepress/icons.mjs new file mode 100644 index 00000000000..d060bd077bf --- /dev/null +++ b/docs/.vitepress/icons.mjs @@ -0,0 +1,71 @@ +export function cubeOutlineIcon(size = 15) { + return ` + + +`; +} + +export function cube02Icon(size = 15) { + return ` + + +`; +} + +export function cube01Icon(size = 15) { + return ` + + + + `; +} + +export function barChartSquare02Icon(size = 15) { + return ` + + + `; +} + +export function code02Icon(size = 15) { + return ` + + +`; +} + +export function dataIcon(size = 15) { + return ` + + + + +`; +} + +export function checkCircleIcon(size = 15) { + return ` + + +`; +} + +export function tuistIcon(size = 15) { + return ` + +`; +} + +export function cloudBlank02Icon(size = 15) { + return ` + + +`; +} + +export function server04Icon(size = 15) { + return ` + + +`; +} diff --git a/docs/.vitepress/sidebars.mjs b/docs/.vitepress/sidebars.mjs new file mode 100644 index 00000000000..65963e2737e --- /dev/null +++ b/docs/.vitepress/sidebars.mjs @@ -0,0 +1,326 @@ +import { comingSoonBadge } from "./badges.mjs"; +import { + cubeOutlineIcon, + cube02Icon, + cube01Icon, + barChartSquare02Icon, + code02Icon, + dataIcon, + checkCircleIcon, + tuistIcon, + cloudBlank02Icon, + server04Icon, +} from "./icons.mjs"; +import examplesDataLoader from "../docs/references/examples/examples.data"; +import projectDescriptionTypesDataLoader from "../docs/references/project-description/types.data"; +import cliDataLoader from "../docs/references/cli/commands.data"; + +const projectDescriptionTypesData = projectDescriptionTypesDataLoader.load(); + +const projectDescriptionSidebar = { + text: "Project Description", + collapsed: true, + items: [], +}; + +function capitalize(text) { + return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase(); +} + +["structs", "enums", "extensions", "typealiases"].forEach((category) => { + if (projectDescriptionTypesData.find((item) => item.category === category)) { + projectDescriptionSidebar.items.push({ + text: capitalize(category), + collapsed: true, + items: projectDescriptionTypesData + .filter((item) => item.category === category) + .map((item) => ({ + text: item.title, + link: `/references/project-description/${item.identifier}`, + })), + }); + } +}); + +function generateNestedSidebarItems(items) { + const nestedItems = {}; + + items.forEach((item) => { + const category = item.category; + if (!nestedItems[category]) { + nestedItems[category] = { + text: capitalize(category), + collapsed: true, + items: [], + }; + } + nestedItems[category].items.push({ + text: item.title, + link: `/references/cli/${item.command}`, + }); + }); + + function isLinkItem(item) { + return typeof item.link === "string"; + } + + function convertToArray(obj) { + return Object.values(obj).reduce((acc, item) => { + if (Array.isArray(item.items) && item.items.every(isLinkItem)) { + acc.push(item); + } else { + acc.push({ + text: item.text, + collapsed: true, + items: convertToArray(item.items), + }); + } + return acc; + }, []); + } + + return convertToArray(nestedItems); +} + +const cliData = cliDataLoader.load(); + +const cliSidebar = { + text: "CLI", + items: generateNestedSidebarItems(cliData), +}; + +export const referencesSidebar = [ + { + text: "Reference", + items: [ + cliSidebar, + projectDescriptionSidebar, + { + text: "Examples", + collapsed: true, + items: examplesDataLoader.load().map((item) => { + return { + text: item.title, + link: `/references/examples/${item.name}`, + }; + }), + }, + { + text: "Migrations", + collapsed: true, + items: [ + { + text: "From v3 to v4", + link: "/references/migrations/from-v3-to-v4", + }, + ], + }, + ], + }, +]; + +export const contributorsSidebar = [ + { + text: "Contributors", + items: [ + { + text: "Get started", + link: "/contributors/get-started", + }, + { + text: "Issue reporting", + link: "/contributors/issue-reporting", + }, + { + text: "Code reviews", + link: "/contributors/code-reviews", + }, + { + text: "Principles", + link: "/contributors/principles", + }, + ], + }, +]; + +export const guidesSidebar = [ + { + text: `
    Quick start ${tuistIcon()}
    `, + link: "/", + items: [ + { + text: "Install Tuist", + link: "/guides/quick-start/install-tuist", + }, + { + text: "Create a project", + link: "/guides/quick-start/create-a-project", + }, + { + text: "Add dependencies", + link: "/guides/quick-start/add-dependencies", + }, + { + text: "Gather insights", + link: "/guides/quick-start/gather-insights", + }, + { + text: "Optimize workflows", + link: "/guides/quick-start/optimize-workflows", + }, + ], + }, + { + text: `
    Start ${cubeOutlineIcon()}
    `, + items: [ + { + text: "Create a new project", + link: "/guides/start/new-project", + }, + { + text: "Try with a Swift Pacakge", + link: "/guides/start/swift-package", + }, + { + text: "Migrate", + collapsed: true, + items: [ + { + text: "An Xcode project", + link: "/guides/start/migrate/xcode-project", + }, + { + text: "A Swift Package", + link: "/guides/start/migrate/swift-package", + }, + { + text: "An XcodeGen project", + link: "/guides/start/migrate/xcodegen-project", + }, + { + text: "A Bazel project", + link: "/guides/start/migrate/bazel-project", + }, + ], + }, + ], + }, + { + text: `
    Develop ${cube02Icon()}
    `, + items: [ + { + text: `
    Projects ${code02Icon()}
    `, + collapsed: true, + link: "guides/develop/projects", + items: [ + { + text: "Manifests", + link: "guides/develop/projects/manifests", + }, + { + text: "Directory structure", + link: "guides/develop/projects/directory-structure", + }, + { + text: "Editing", + link: "guides/develop/projects/editing", + }, + { + text: "Dependencies", + link: "guides/develop/projects/dependencies", + }, + { + text: "Code sharing", + link: "guides/develop/projects/code-sharing", + }, + { + text: "Synthesized files", + link: "guides/develop/projects/synthesized-files", + }, + { + text: "Dynamic configuration", + link: "guides/develop/projects/dynamic-configuration", + }, + { + text: "Templates", + link: "guides/develop/projects/templates", + }, + { + text: "Plugins", + link: "guides/develop/projects/plugins", + }, + { + text: "Hashing", + link: "guides/develop/projects/hashing", + }, + { + text: "The cost of convenience", + link: "guides/develop/projects/cost-of-convenience", + }, + { + text: "Modular architecture", + link: "guides/develop/projects/tma-architecture", + }, + ], + }, + { + text: `
    Build ${dataIcon()}
    `, + link: "guides/develop/build", + collapsed: true, + items: [ + { + text: "Cache", + link: "guides/develop/build/cache", + }, + ], + }, + { + text: `
    Test ${checkCircleIcon()}
    `, + link: "guides/develop/test", + collapsed: true, + items: [ + { + text: "Smart runner", + link: "guides/develop/test/smart-runner", + }, + { + text: "Flakiness", + link: "guides/develop/test/flakiness", + }, + ], + }, + { + text: `
    Integrate ${cloudBlank02Icon()} ${comingSoonBadge()}
    `, + items: [], + }, + ], + }, + { + text: `
    Share ${cube01Icon()} ${comingSoonBadge()}
    `, + items: [], + }, + { + text: `
    Measure ${barChartSquare02Icon()} ${comingSoonBadge()}
    `, + items: [], + }, + { + text: `
    Dashboard ${server04Icon()}
    `, + collapsed: true, + items: [ + { + text: "On-premise", + collapsed: true, + items: [ + { + text: "Install", + link: "guides/dashboard/on-premise/install", + }, + { + text: "Metrics", + link: "guides/dashboard/on-premise/metrics", + }, + ], + }, + ], + }, +]; diff --git a/docs/.vitepress/theme/components/Button.vue b/docs/.vitepress/theme/components/Button.vue new file mode 100644 index 00000000000..48a6c079de8 --- /dev/null +++ b/docs/.vitepress/theme/components/Button.vue @@ -0,0 +1,33 @@ + + + + + \ No newline at end of file diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index e69de29bb2d..19a9b67f3c5 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -0,0 +1,6 @@ + +:root { + --vp-c-brand-1: #5023B5; + --vp-c-brand-2: #6E3CD9; + --vp-c-brand-3: #8756FD; + } \ No newline at end of file diff --git a/docs/.vitepress/theme/index.js b/docs/.vitepress/theme/index.js index c495bc1b8dc..49d5222068a 100644 --- a/docs/.vitepress/theme/index.js +++ b/docs/.vitepress/theme/index.js @@ -1,4 +1,10 @@ import DefaultTheme from "vitepress/theme"; import "./custom.css"; - -export default DefaultTheme; +import Button from "./components/Button.vue"; +/** @type {import('vitepress').Theme} */ +export default { + extends: DefaultTheme, + enhanceApp({ app }) { + app.component("Button", Button); + }, +}; diff --git a/docs/docs/cloud/get-started.md b/docs/docs/cloud/get-started.md deleted file mode 100644 index 5f61df77de7..00000000000 --- a/docs/docs/cloud/get-started.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: Get started with Tuist Cloud -titleTemplate: ':title - Tuist Cloud' -description: Get started with Tuist Cloud, a Tuist extension that ensures your projects are healthy and productive. ---- - -# Get started with Tuist Cloud - -To start using Tuist Cloud, you need to have a project that you managed through the Tuist. If you don't have one, we recommend starting from the [installation guide](/guide/introduction/installation). - - - -Tuist Cloud is CLI-first, meaning that the actions you'd traditionally do on the web, you can do them from the command line. -The first to start using Tuist Cloud is to **sign up**. -For that, you can run the following command: - -```bash -tuist auth -``` - -> [!TIP] ORGANIZATION AND USERS -> Like [GitHub](https://github.com) you projects (repositories in the context of GitHub) can be part of an organizations or your personal account. Account and organizations have handles, which are unique across the platform. For example, the Tuist organization uses the `tuist` handle. - -## Create an organization Optional - -If you are part of an organization to which you want to invite other members, you can create an organization. - -> [!NOTE] -> This is not necessary if you are working by yourself because you can create projects under your personal account. - -```bash -tuist organization create my-organization # Create organization -``` - -### Organization SSO - -If you have a Google Workspace organization and you want any developer who signs in with the same Google hosted domain to be added to your Tuist organization, you can set it up with: -```bash -tuist organization update sso my-organization --provider google --organization-id my-domain.com -``` - -> [!IMPORTANT] -> You must be authenticated with Google using an email tied to the organization whose domain you are setting up. -## Create a project - -The next step is to create a project. You can easily do that with the following command: - -::: code-group -```bash [Project under user account] -tuist project create my-account/my-project -``` -```bash [Project under organization] -tuist project create my-organization/my-project -``` -::: - -After creating the project, modify your `Tuist/Config.swift` file to reference the new project: - -```swift -import ProjectDescription - -let config = Config(fullHandle: "my-organization/my-project") -``` - -> [!TIP] PROJECT IDENTIFIER -> The project identifier is formed by concatenating the organization or user handle and the project handle with a slash. For example, the Tuist organization uses the `tuist` handle, and the project is named `tuist`. The project identifier would be `tuist/tuist`. - -## Authentication - -### As user - -Developers on your team can access Tuist Cloud if they are authenticated and added as members of the organization, which you can do using the `tuist organization invite` command. - -### As project (e.g. for CI) -For CI environments, authentication is managed differently; it's done using **project-scoped tokens**. These tokens possess restricted permissions compared to those of the organization, including the ability to warm the cache with binaries. To obtain this token, you can execute the following command: - - -```bash -tuist project tokens create my-organization/my-project -``` - -You will then need to set the token as an environment variable named `TUIST_CONFIG_TOKEN` to make it accessible. - -> [!NOTE] EXPOSING SECRET ENVIRONMENT VARIABLES IN CI ENVIRONMENTS -> How environment secret environment variables are exposed in CI environments varies depending on the CI provider. Ensure you follow the guidelines provided by your CI provider to securely manage these tokens. - -## Tuist and Tuist Cloud integration - -When the Tuist Cloud configuration is set up, and there's a valid session, either as a user or project, Tuist Cloud features will be available automatically without any additional configuration or actions. This is the beauty of Tuist Cloud's setup–it doesn't require the installation of additional tools, plumbing, or configuration. It just works™. \ No newline at end of file diff --git a/docs/docs/cloud/what-is-cloud.md b/docs/docs/cloud/what-is-cloud.md deleted file mode 100644 index 34659a678a6..00000000000 --- a/docs/docs/cloud/what-is-cloud.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: What is Tuist Cloud -titleTemplate: ':title - Tuist Cloud' -description: Learn about Tuist Cloud, a service that provides a set of features to enhance the development experience with Tuist. ---- - -# Tuist Cloud - -Utilizing a graph of dependencies for representing projects and converting them into Xcode projects showed that this approach could be **foundational for optimizing workflows**, thereby preventing unnecessary time wastage for organization's developers. Key features that leverage this foundational approach include [binary caching](/cloud/binary-caching), which enables the generation of projects with some targets replaced by their pre-compiled binary counterparts, and [selective testing](/cloud/selective-testing), which allows running tests only for the targets impacted by changes. - -As we advanced towards enhancing productivity, it became evident that **certain solutions necessitated an HTTP server for state storage and building integrations with other HTTP services** like [GitHub](https://github.com), [Slack](https://slack.com), or [Apple Store Connect](https://appstoreconnect.apple.com/). For instance, caching could leverage a server to share binaries across local and CI environments, thereby accelerating build and test times. This realization led to the creation of Tuist Cloud. - -Tuist Cloud, a closed-source paid service, enhances Tuist by adding server-requisite functionalities. Integration of Tuist projects with Tuist Cloud not only augments existing functionalities but also introduces new ones. This service encapsulates years of experience in developing tools for mobile developers at [Shopify](https://shopify.com) (e.g., [Mobile Tophat](https://shopify.engineering/mobile-tophatting-at-shopify-1), [Mobile Release Engineering at Scale](https://shopify.engineering/mobile-release-engineering-scale-shipit-mobile), [Scaling iOS CI with Anka](https://shopify.engineering/scaling-ios-ci-with-anka)) and is envisioned as **the copilot for your platform teams**. Our objective is to help organizations cultivate a productive development environment. - -> [!IMPORTANT] PROJECT ONBOARDING -> Due to [Xcode's default to convenience](/guide/introduction/cost-of-convenience) your project might contain implicit configurations that can prevent some Tuist Cloud features from working as expected, and therefore require manual adjustments. - -## Features - -### Binary caching across environments - -Tuist Cloud offers a robust storage solution for Tuist, enabling the sharing of cache artifacts between local and remote settings, such as continuous integration. This ensures that developers avoid recompiling targets they don't intend to modify, provided they've already been compiled by a teammate or in a CI setting. Leveraging this caching can yield efficiency [rates up to 90%](https://builders.travelperk.com/tuist-ing-travelperks-ios-app-for-faster-build-times-4796dcfa7809), leading to significant time and cost savings for both local development and CI processes. - -> [!TIP] RETURN OF INVESTMENT (ROI) -> To assist organizations in evaluating their return on investment (ROI), we've developed an [**ROI calculator**](https://tuist.io/cloud). For instance, consider an organization with approximately 20 developers. If their clean builds take 10 minutes and they achieve a 70% cache effectiveness, they could potentially reduce development time by 24,000 hours and recover up to $6.4 million a year. - -> [!NOTE] CI CACHE -> CI built-in caches either don't provide hash-based caching or they do, but they don't support the artifact-level hashing granularity that's required for an efficient cache. Therefore, they are not a suitable solution for Tuist's caching requirements. - - -### Selective testing across environments - -Once teams reach a certain scale, they often grapple with optimizing their CI process to maintain quick turnaround times. While **testing everything** continually might work for smaller teams, it becomes impractical on a larger scale. At this juncture, many teams resort to investing in superior hardware, creating custom tools, complicating their CI pipelines, or worse, accepting slower development cycles. But there's a better way. - -**Tuist Cloud utilizes graph knowledge and fingerprinting technology—essential for binary caching—to discern which targets to test based on file modifications.** Not only that, as your tests will also be able to use binary caching, massively reducing the time it takes to both _build_ and _run_ your tests. - -### Analytics - -While optimizing workflows based on our project insights is beneficial, it's crucial to ensure that your project's evolution doesn't lead to regressions, adversely affecting the developer experience. While our ultimate goal is to harness AI technologies to offer you a virtual co-pilot, we currently provide foundational insights to enhance your understanding of your project and workflows. This allows you to identify optimization opportunities and make data-driven decisions. We firmly believe this is data that Xcode ought to supply. However, recognizing the clear demand from teams, we're stepping up to deliver it. - -> [!INFO] AN INTEGRATED SOLUTION -> You might be familiar with Spotify's open-source tool, [XCMetrics](https://xcmetrics.io/). While it shares a similar objective, its integration demands extra tool installations in developers' settings, and it lacks the ability to correlate data with project specifics. In contrast, Tuist offers enhanced analytics, drawing from the synergy between data and the project graph, and is seamlessly integrated without needing any extra installations. - -### Advanced actionable insights In progress - -Regressions can easily compromise the health of a project, build, or test suites. This is primarily because CI workflows focus on ensuring successful compilation and test suite outcomes. As a result, developers tend to merge pull requests (PRs) once they're approved and both the compilation and test runs are successful. Yet, such PRs might inadvertently affect other vital aspects that directly influence developer productivity. For instance, they could: - -- Introduce instability in the test suite. -- Modify build settings, causing a target's compilation time to double. -- Add a new static target to the graph, leading to a substantial increase in the final app size. - -In a conventional setup, these issues often go unnoticed until they've become significant problems. By the time they're detected, teams face the daunting task of tracing back to find the root cause before implementing a fix. This becomes especially challenging in dynamic environments where changes are constantly integrated. However, there's a more efficient approach. - -We aim to **gather data from builds, including build times, binary sizes, and test outcomes, and integrate this with graph information.** This consolidated data will then be transmitted to our server. From there, developers can **visually track performance trends over time**. Our goal is to not only make this information easily accessible but also **actionable**. By identifying potential deviations that might hinder productivity, we can flag them directly in PRs. This proactive approach ensures that potential regressions are intercepted before merging into the primary repository branch. In essence, Tuist Cloud is designed to serve as a vigilant co-pilot, ensuring a **consistently healthy and efficient development environment**. An optimal development environment is pivotal for maintaining developers' enthusiasm and commitment to the project. - -### Test quality Planned - -A common source of productivity loss is the time spent debugging flaky tests. Flaky tests can happen easily due to the non-functional nature of Swift, and Apple provides no tools to help developers prevent, identify, or fix them. Imagine a developer waiting for 30 minutes to get feedback on a PR, only to find out that the test failure was due to a flaky test. A retry then leads to a not-ready-to-merge green PR because someone had merged a PR that introduced conflicts. After solving the conflicts, the developer waits another 30 minutes to get feedback. This cycle can be frustrating and significantly impacts productivity. - -We plan to track flakiness server-side from Tuist Cloud, and extend `tuist test` to dynamically skip the tests that are flaky based on the information provided by Tuist Cloud. Organizations will get a clear view of the sources of flakiness in the dashboard, and have tools to set up tripwires, for example to prevent the introduction of new flaky tests by making PRs fail if they introduce flaky tests. - -### Team-scoped metrics Planned - -We plan to give organizations an API to declare ownership of various parts of the project graph. For example, they'll be able to indicate which team is the owner of a given target. Thanks to this information, platform teams can make teams accountable for various health metrics, such as build times, binary sizes, and test outcomes. This will help organizations to foster a culture of ownership and accountability, and to make data-driven decisions to improve the health of their projects. \ No newline at end of file diff --git a/docs/docs/contributors/get-started.md b/docs/docs/contributors/get-started.md index ca72ddd202d..948c015cb56 100644 --- a/docs/docs/contributors/get-started.md +++ b/docs/docs/contributors/get-started.md @@ -37,7 +37,7 @@ To start working on the project, we can follow the steps below: ## Edit the project -If you needed to edit the project, for example to add dependencies or adjust targets, you can use the [`tuist edit` command](/guide/project/editing). This is barely used, but it's good to know that it exists. +If you needed to edit the project, for example to add dependencies or adjust targets, you can use the [`tuist edit` command](/guides/develop/projects/editing). This is barely used, but it's good to know that it exists. ## Run Tuist @@ -56,7 +56,7 @@ You'll also have to set the working directory to the root of the project being g ### From the terminal -Although `tuist` provides a [run command](/guide/automation/run) it does not support CLIs yet. Therefore, you'll have to use the Swift Package Manager to run the tool. To do that, you can run the following command: +Although `tuist` provides a `tuist run` it does not support CLIs yet. Therefore, you'll have to use the Swift Package Manager to run the tool. To do that, you can run the following command: ```bash swift build --product ProjectDescription diff --git a/docs/docs/guide/automation/build.md b/docs/docs/guide/automation/build.md deleted file mode 100644 index 850c03a0ac5..00000000000 --- a/docs/docs/guide/automation/build.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Build -description: Learn how to build projects and workspaces with Tuist ---- - -# Build - -Xcode projects are usually built through Xcode's GUI or the `xcodebuild` command-line tool. Tuist provides a command, `tuist build`, to generate the project if needed, and then build it with the `xcodebuild` command-line tool. - -## Why Tuist over xcodebuild - -You might wonder what's the value of using `tuist build` over generating the project with `tuist generate` and building it with raw `xcodebuild`. - -- **Single command:** `tuist build` ensures the project is generated if needed before compiling the project. -- **Beautified output:** Tuist enriches the `xcodebuild` output using [xcbeautify](https://github.com/cpisciotta/xcbeautify) -- [**Binary caching:**](/cloud/binary-caching) If you are using Tuist Cloud, Tuist can reuse the binaries from the cache, speeding up the build process. - -### Tuist Cloud Analytics - -Understanding the build process is crucial to optimize the build times. Unfortunately, Xcode doesn't provide a lot of insights into the build process. Therefore, we are working on a set of features that will allow you to understand the build process better. This will require the usage of `tuist build`, so if you are not using it yet, we recommend you start using it. - -## Building schemes - -To build schemes of a project, you can use the `tuist build` command. This command will generate the project if needed, and then build it using the `xcodebuild` command-line tool. We support the use of the `--` terminator to forward all subsequent arguments directly to `xcodebuild. Arguments such as `-workspace` or `-project` cannot be used because tuist takes care of them. - -::: code-group -```bash [Build a scheme] -tuist build MyScheme -``` -```bash [Build a specific configuration] -tuist build MyScheme -- -configuration Debug -``` -```bash [Build all schemes without binary cache] -tuist build --no-binary-cache -``` -::: diff --git a/docs/docs/guide/automation/clean.md b/docs/docs/guide/automation/clean.md deleted file mode 100644 index 294cf8b0234..00000000000 --- a/docs/docs/guide/automation/clean.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Clean -description: Tuist provides a command to clean global caches and local caches ---- - -# Clean - -Tuist relies on project-scoped and global caches to speed up some of its workflows. If for any reason you want to clean these caches, you can use the `tuist clean` command. When no argument is passed, the command cleans all the cache categories. Otherwise, you can pass the cache category you want to clean. - -## Categories - -The following are the categories of caches that Tuist manages: - -| Category | Content | Scope | -| ---- | ---- | ---- | -| `binaries` | Binaries for [Tuist Cloud binary cache](/cloud/binary-caching) | Global | -| `selectiveTests` | State for [Tuist Cloud selective tests cache](/cloud/selective-testing) | Global | -| `plugins` | Pre-compiled plugins | Global | -| `generatedAutomationProjects` | Projects generated for automation tasks like `build` | Global | -| `projectDescriptionHelpers` | Pre-compiled modules for project description helpers | Global | -| `manifests` | JSON-serialized manifest files to speed up project generation | Global | -| `dependencies` | SPM dependencies fetched by Tuist | Project | - -You can pass one or multiple categories to the `tuist clean` command. For example, to clean the `binaries` and `plugins` categories, you can run: - -::: code-group -```bash [Clean plugins and binaries] -tuist clean plugins binaries -``` -::: \ No newline at end of file diff --git a/docs/docs/guide/automation/generate.md b/docs/docs/guide/automation/generate.md deleted file mode 100644 index 8994fc0dda2..00000000000 --- a/docs/docs/guide/automation/generate.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Generate -description: Learn how to generate projects and workspaces with Tuist ---- - -# Generate - -Project generation is the core feature of Tuist upon which all other features are built. Once the project is defined following the [directory structure](/guide/project/directory-structure) and manifest files, you can generate the project using the `tuist generate` command. This command reads the manifest files, generates the Xcode projects and workspace, writes it to the disk, and opens it in Xcode. - -> [!NOTE] WORKSPACE GENERATION -> Tuist always generates a workspace, even if you have a single `Project.swift`. This is by design to ensure that the project is always generated in a consistent way. - -## Generating a project - -To generate a project, you can use the `tuist generate` command. This command will read the manifest files, generate the Xcode projects and workspace, write them to the disk, and open them in Xcode. - -::: code-group -```bash [Generate and open] -tuist generate -``` - -```bash [Generate without opening] -tuist generate --no-open -``` - -```bash [Generate without cache binaries] -tuist generate --no-binary-cache -``` -::: \ No newline at end of file diff --git a/docs/docs/guide/automation/graph.md b/docs/docs/guide/automation/graph.md deleted file mode 100644 index 6273b9e7f00..00000000000 --- a/docs/docs/guide/automation/graph.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Graph -description: Tuist provides a command to output and visualize a project graph ---- - -# Graph - -One of the advantages of extracting the project graph from its implicitly codified form in Xcode projects and workspaces, is that Tuist knows it ahead of time and can provide useful features to developers. One of those features is the ability to export and visualize the graph through the `tuist graph` command. - -## Graph image - -By default, `tuist graph` outputs and opens the image `graph.png` at the root of the project: - -::: code-group -```bash [Opening it] -tuist graph -``` -```bash [Without opening it] -tuist graph --no-open -``` -```bash [In a different directory] -tuist graph --output-path /tmp/graphs -``` -::: - -## Algorithms and formats - -When the dependency graph is large, the generated image might be hard to visually parse. -In those scenarios, we recommend playing with other formats and algorithms and using interactive tools to work with them: - -- **Formats:** `.dot`, `.json`, `.png`, and `.svg` -- **Algorithms:** `dot`, `neato`, `twoapi`, `circo`, `fdp`, `sfdp`, and `patchwork`. - -## Filtering - -You can use some flags to filter nodes from the graph: - -- `--skip-test-targets`: Skip Test targets during graph rendering. -- `--skip-external-dependencies` Skip external dependencies. -- `--platform`: A platform to filter. Only targets for this platform will be showed in the graph. Available platforms: `ios`, `macos`, `tvos`, `watchos` - -> [!NOTE] PLANNED IMPROVEMENTS -> The filtering options are not flexible enough and can grow into an inconsistent filtering interface. We are aware of that and we have plans to come up with a language that's universal across various commands. diff --git a/docs/docs/guide/automation/run.md b/docs/docs/guide/automation/run.md deleted file mode 100644 index e6592117206..00000000000 --- a/docs/docs/guide/automation/run.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Graph -description: Tuist provides a command to run xcodebuild-compiled artifacts such as iOS apps ---- - -# Run - -Unlike Xcode's GUI, Xcode's CLI, `xcodebuild`, doesn't provide a way to run the compiled artifacts of your project. Tuist provides a command to run the compiled artifacts of your project, such as iOS apps. - -> [!TIP] ONLY IOS APPS SUPPORTED -> We currently only support running iOS apps. Support for other platforms is planned. - -## Run an iOS app - -The `tuist run` command generates the project if needed, then compiles it with `xcodebuild`, and launches the built artifact from the derived data directory in the specified simulator. - -::: code-group - -```bash [Run on iPhone 15 with iOS 17.4.1] -tuist run MyApp --device "iPhone 15" --os "17.4.1" -``` -::: - -> [!NOTE] EXISTING SIMULATORS -> If Tuist can't find a destination that matches the specified device and OS or none is provided, it will ask in which available simulator to run, in case of many available, or pick the only one available otherwise. diff --git a/docs/docs/guide/automation/test.md b/docs/docs/guide/automation/test.md deleted file mode 100644 index 80522a0a140..00000000000 --- a/docs/docs/guide/automation/test.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Test -description: Learn how to use Tuist to run tests for your projects ---- - -# Test - -Tuist projects can declare test targets that run tests for the project. Traditionally, teams execute them using Xcode's GUI, the `xcodebuild` command-line tool, or higher-level abstraction tools like [Fastlane Scan](https://docs.fastlane.tools/actions/scan/). Tuist provides a command, `tuist test` to generate the project if needed, and then run the tests with the `xcodebuild` command-line tool. - -## Why Tuist over xcodebuild - -You might wonder what's the value of using `tuist test` over generating the project with `tuist generate` and running the tests with raw `xcodebuild`. - -- **Single command:** `tuist test` ensures the project is generated if needed before compiling the project. -- **Beautified output:** Tuist enriches the `xcodebuild` output using [xcbeautify](https://github.com/cpisciotta/xcbeautify) -- [**Selective testing:**](/cloud/selective-testing) If you are using Tuist Cloud, Tuist can selectively run tests based on previous runs. - -### Tuist Cloud Test - -Test flakiness is a tremendous source of frustration for developers and loss of productivity. Therefore, we are working on a set of features that will allow preventing, detecting, and fixing flaky tests. This will require the usage of `tuist test`, so if you are not using it yet, we recommend you start using it. - -## Running scheme tests - -To run the tests of a project, you can use the `tuist test` command. This command will generate the project if needed, and then run the tests using the `xcodebuild` command-line tool. We support the use of the `--` terminator to forward all subsequent arguments directly to `xcodebuild`. Arguments such as `-workspace` or `-project` cannot be used because tuist takes care of them. - -::: code-group -```bash [Running scheme tests] -tuist test MyScheme -``` -```bash [Running all tests without binary cache] -tuist test --no-binary-cache -``` - -```bash [Running all tests without selective testing] -tuist test --no-selective-testing -``` -::: diff --git a/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md b/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md deleted file mode 100644 index c9c043fe23e..00000000000 --- a/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodeproj.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Migrate from .xcodeproj -description: Assess the impact of Tuist and Tuist Cloud in your projects by using it with an existing Swift Package. -next: - text: "Directory structure" - link: /guide/project/directory-structure ---- - -# Migrate from .xcodeproj - -Unless you [create a new project using Tuist](/guide/introduction/adopting-tuist/new-project), in which case you get everything configured automatically, you'll have to define your Xcode projects using Tuist's primitives. **How tedious this process is, depends on how complex your projects are.** - -As you probably know, Xcode projects can become messy and complex over time: *groups that don't match the directory structure, files that are shared across targets, or file references that point to nonexisting files (to mention some).* All that accumulated complexity makes it hard for us to provide a command that reliably migrates project. - -Moreover, **manual migration is an excellent exercise to clean up and simplify your projects.** Not only the developers in your project will be thankful for that, but Xcode, who will be faster processing and indexing them. Once you have fully adopted Tuist, it will make sure that projects are consistently defined and that they remain simple. - -In the aim of easing that work, we are giving you some guidelines based on the feedback that we have received from the users. - -> [!TIP] SCALING A MATURE IOS CODEBASE WITH TUIST -> You won't be the first one to migrate a mature iOS codebase to Tuist. You can read how [Asana](https://asana.com/inside-asana/scaling-a-mature-ios-codebase-with-tuist) migrated theirs and the impact that it had on their development workflows, or how [Bumble](https://medium.com/bumble-tech/scaling-ios-at-bumble-76754fa874f7) evaluated Bazel, Tuist, and SPM and ultimately chose Tuist. - -## Extract your build settings into `.xcconfig` files - -The leaner the projects, the easier they are to migrate. To make them thinner, you can extract information like build settings that can be defined outside Xcode projects. You must prevent developers from defining settings using build settings. - -You can use this snippet for that: - -```bash -# Extract target build settings -tuist migration settings-to-xcconfig -p Project.xcodeproj -t MyApp -x MyApp.xcconfig - -# Extract project build settings -tuist migration settings-to-xcconfig -p Project.xcodeproj -x MyAppProject.xcconfig -``` - -After extracting the build settings into .xcconfig files, we recommend adding a check in continuous integration to ensure that build settings are not set to the project: - -```bash -tuist migration check-empty-settings -p Project.xcodeproj -t MyApp -``` - -## Migrate the most independent targets first - -Those are usually simpler since they contain fewer dependencies than the rest. That makes them good candidates from which we can start the migration. Use this command to list the targets of a project, sorted by number of dependencies. We recommend starting from the top, with the target that has the lowest number of dependencies. - -```bash -tuist migration list-targets -p Project.xcodeproj -``` - -## Remove broken references - - -Go through your target sources and resources build phases, and delete references to files that are missing. Although Xcode's build system ignores them, they might complicate the migration. - -## Remove files that are not used by any target - -There might be files that were once part of the project, but that they are no longer needed. Find and remove them. Otherwise, you might run into compilation issues because your glob patterns (e.g. `**/*.swift`) ended up matching them, and adding them as sources of your targets. - -## Prevent modifications of Xcode projects after they've been migrated - -After the migration of each project, add a script that fails CI if someone modifies the Xcode project directly, and lets developers know that they should change the manifest files instead. - -You can use a tool like [xcdiff](https://github.com/bloomberg/xcdiff) for that. - -## Use project description helpers - -They allow defining your own abstractions for defining your projects, and most importantly, they allow reusing content across all your manifest files. One of the most common use cases is defining functions that act as factories of templated projects. After migrating all your projects, go through the Project.swift files to identify common patterns and extract them into helpers. - -## Manual Migration - -Now that you've extracted your settings into config files and cleaned up your exsisting project files you need to manually migrate your project over to Tuist. There are a couple of ways to do this; -- Create empty `Project.swift` and `Tuist/Config.swift` files, and run `tuist edit` to start filling them in. -- Run `tuist init` in a different directory and copy over the files created there for your own project. - -## Tools - -Here's a list of community-developed tools that can aid you on the migration process: - -- [xcdiff](https://github.com/bloomberg/xcdiff): A tool which helps you diff xcodeproj files. -- [Xcode Build Settings](https://developer.apple.com/documentation/xcode/build-settings-reference): A reference for all the build settings available and their meaning. diff --git a/docs/docs/guide/introduction/adopting-tuist/swift-package.md b/docs/docs/guide/introduction/adopting-tuist/swift-package.md deleted file mode 100644 index 5bf543bbce6..00000000000 --- a/docs/docs/guide/introduction/adopting-tuist/swift-package.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: Use Tuist with a Swift Package -description: Assess the impact of Tuist and Tuist Cloud in your projects by using it with an existing Swift Package. -next: - text: "Directory structure" - link: /guide/project/directory-structure ---- - -# Using Tuist with a Swift Package - -Tuist supports using `Package.swift` as a DSL for your projects–It converts your package targets into a native Xcode project and targets. - -> [!WARNING] -> The aim of this feature is to provide an easy way for developers to assess the impact of adopting Tuist and [Tuist Cloud](/cloud/what-is-cloud) in their Swift Packages. Therefore, we don't plan to support the full range of Swift Package Manager features nor to bring every Tuist's unique features like [project description helpers](/guide/project/code-sharing) to the packages world. - -> [!NOTE] ROOT DIRECTORY -> Tuist commands expect a certain [directory structure](/guide/project/directory-structure.html#standard-tuist-projects) whose root is identified by a `Tuist` or a `.git` directory. - -## Using Tuist with a Swift Package - -We are going to use Tuist with the [Swift Composable Architecture](https://github.com/pointfreeco/swift-composable-architecture) repository, which contains a Swift Package. The first thing that we need to do is to clone the repository: - -```bash -git clone https://github.com/pointfreeco/swift-composable-architecture -cd swift-composable-architecture -``` - -Once in the repository's directory, we need to install the Swift Package Manager dependencies: - -```bash -tuist install -``` - -Under the hood `tuist install` uses the Swift Package Manager to resolve and pull the dependencies of the package. -After the resolution completes, you can then generate the project: - -```bash -tuist generate -``` - -Voilà! You have a native Xcode project that you can open and start working on. - -## Caching the dependencies as binaries - -One of the advantages of using native Xcode projects through Tuist over Xcode's standard integration is that you can use [binary caching](/cloud/binary-caching) to turn the package dependencies into binaries and speed up your workflows. To do that, you need to run the following command: - -```bash -tuist cache -``` - -It'll then build the dependencies and store them in the cache. The next time you generate the project, Tuist will fetch the dependencies from the cache instead of building them from source. - -```bash -tuist generate -``` - -> [!NOTE] -> Binary caching is part of [Tuist Cloud](/cloud/what-is-cloud) and is available for free within the same environment. If you want to share the artifacts across different environments, you'll need to upgrade to a paid plan. \ No newline at end of file diff --git a/docs/docs/guide/scale/xcode.md b/docs/docs/guide/scale/xcode.md deleted file mode 100644 index 11e9654142b..00000000000 --- a/docs/docs/guide/scale/xcode.md +++ /dev/null @@ -1 +0,0 @@ -# Using Xcode at scale \ No newline at end of file diff --git a/docs/docs/cloud/on-premise.md b/docs/docs/guides/dashboard/on-premise/install.md similarity index 73% rename from docs/docs/cloud/on-premise.md rename to docs/docs/guides/dashboard/on-premise/install.md index 1a7680473bb..78919948890 100644 --- a/docs/docs/cloud/on-premise.md +++ b/docs/docs/guides/dashboard/on-premise/install.md @@ -1,33 +1,31 @@ --- -title: On premise -titleTemplate: ':title - Tuist Cloud' -description: Learn how to host Tuist Cloud on your own infrastructure. +title: On-premise installation +description: Learn how to install Tuist on your infrastructure. --- -# On premise +# On-premise installation -We offer a self-hosted version of Tuist Cloud for organizations that require more control over their infrastructure. This version allows you to host Tuist Cloud on your own infrastructure, ensuring that your data remains secure and private. +We offer a self-hosted version of the Tuist server for organizations that require more control over their infrastructure. This version allows you to host Tuist on your own infrastructure, ensuring that your data remains secure and private. -If you signed an agreement with us to use Tuist Cloud on-premise, you can follow the instructions below to set up your environment. +> [!IMPORTANT] ENTERPRISE CUSTOMERS ONLY +> The on-premise version of Tuist is available only for organizations on the Enterprise plan. If you are interested in this version, please reach out to [contact@tuist.io](mailto:contact@tuist.io). ## Release cadence -Tuist Cloud is **released every Monday** and the version name follows the convention name `{MAJOR}.YY.MM.DD`. The date component is used to warn the CLI user if their hosted version is 60 days older than the release date of the CLI. It's crucial that on-premise organizations keep up with Tuist Cloud updates to ensure their developers benefit from the most recent improvements and that we can drop deprecated features with the confidence that we are not breaking any of the on-premise setups. +The Tuist server is **released every Monday** and the version name follows the convention name `{MAJOR}.YY.MM.DD`. The date component is used to warn the CLI user if their hosted version is 60 days older than the release date of the CLI. It's crucial that on-premise organizations keep up with Tuist updates to ensure their developers benefit from the most recent improvements and that we can drop deprecated features with the confidence that we are not breaking any of the on-premise setups. -The major component of the CLI is used to flag breaking changes in Tuist Cloud that will require coordination with the on-premise users. You should not expect us to use it, and in case we needed, rest asure we'll work with you in making the transition smooth. +The major component of the CLI is used to flag breaking changes in the Tuist server that will require coordination with the on-premise users. You should not expect us to use it, and in case we needed, rest asure we'll work with you in making the transition smooth. > [!NOTE] RELEASE NOTES -> You'll be given access to a `tuist/cloud-on-premise` repository associated with the registry where images are published. Every new released will be published in that repository as a GitHub release and will contain release notes to inform you about what changes come with it. +> You'll be given access to a `tuist/registry` repository associated with the registry where images are published. Every new released will be published in that repository as a GitHub release and will contain release notes to inform you about what changes come with it. ## Runtime requirements -This section outlines the requirements for hosting Tuist Cloud on your infrastructure. +This section outlines the requirements for hosting the Tuist server on your infrastructure. ### Running Docker-virtualized images -We distribute Tuist Cloud as a [Docker](https://www.docker.com/) image via [GitHub’s Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry). - - +We distribute the server as a [Docker](https://www.docker.com/) image via [GitHub’s Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry). To run it, your infrastructure must support running Docker images. Note that most infrastructure providers support it because it’s become the standard container for distributing and running software in production environments. @@ -46,7 +44,7 @@ You’ll also need a solution to store files (e.g. framework and library binarie ## Configuration -The configuration of the service is done at runtime through environment variables. Given the sensitive nature of these variables, we advise encrypting and storing them in secure password management solutions. Rest assured, Tuist Cloud handles these variables with utmost care, ensuring they are never displayed in logs. +The configuration of the service is done at runtime through environment variables. Given the sensitive nature of these variables, we advise encrypting and storing them in secure password management solutions. Rest assured, Tuist handles these variables with utmost care, ensuring they are never displayed in logs. > [!NOTE] LAUNCH CHECKS > The necessary variables are verified at startup. If any are missing, the launch will fail and the error message will detail the absent variables. @@ -60,7 +58,7 @@ As an on-premise user, you'll receive a license key that you'll need to expose a | `TUIST_LICENSE` | The license provided after signing the service level agreement | Yes | | `******` | > [!IMPORTANT] EXPIRATION DATE -> Licenses have an expiration date. Users will receive a warning while using Tuist commands that interact with Tuist Cloud if the license expires in less than 30 days. If you are interested in renewing your license, please reach out to [contact@tuist.io](mailto:contact@tuist.io). +> Licenses have an expiration date. Users will receive a warning while using Tuist commands that interact with the server if the license expires in less than 30 days. If you are interested in renewing your license, please reach out to [contact@tuist.io](mailto:contact@tuist.io). ### Base environment configuration @@ -77,18 +75,18 @@ As an on-premise user, you'll receive a license key that you'll need to expose a ### Authentication environment configuration -We facilitate authentication through [identity providers (IdP)](https://en.wikipedia.org/wiki/Identity_provider). To utilize this, ensure all necessary environment variables for the chosen provider are present in the Tuist Cloud’s operating environment. **Missing variables** will result in Tuist Cloud bypassing that provider. +We facilitate authentication through [identity providers (IdP)](https://en.wikipedia.org/wiki/Identity_provider). To utilize this, ensure all necessary environment variables for the chosen provider are present in the server's environment. **Missing variables** will result in Tuist bypassing that provider. #### GitHub -We recommend authenticating using a [GitHub App](https://docs.github.com/en/apps/creating-github-apps/about-creating-github-apps/about-creating-github-apps) but you can also use the [OAuth App](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app). Make sure to include all essential environment variables specified by GitHub in the Tuist Cloud environment. Absent variables will cause Tuist Cloud to overlook the GitHub authentication. To properly set up the GitHub app: +We recommend authenticating using a [GitHub App](https://docs.github.com/en/apps/creating-github-apps/about-creating-github-apps/about-creating-github-apps) but you can also use the [OAuth App](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app). Make sure to include all essential environment variables specified by GitHub in the server environment. Absent variables will cause Tuist to overlook the GitHub authentication. To properly set up the GitHub app: - In the GitHub app's general settings: - Copy the `Client ID` and set it as `TUIST_GITHUB_OAUTH_ID` - Create and copy a new `client secret` and set it as `TUIST_GITHUB_OAUTH_SECRET` - Set the `Callback URL` as `http://YOUR_APP_URL/users/auth/github/callback`. `YOUR_APP_URL` can also be your server's IP address. - In the `Permissions and events`'s `Account permissions` section, set the `Email addresses` permission to `Read-only`. -You'll then need to expose the following environment variables in the environment where Tuist Cloud runs: +You'll then need to expose the following environment variables in the environment where the Tuist server runs: | Environment variable | Description | Required | Default | Example | | --- | --- | --- | --- | --- | @@ -97,7 +95,7 @@ You'll then need to expose the following environment variables in the environmen #### Google -You can set up authentication with Google using [OAuth 2](https://developers.google.com/identity/protocols/oauth2). For that, you'll need to [create a new credential](https://console.cloud.google.com/apis/credentials?project=tuist-cloud-staging) of type OAuth client ID. When creating the credentials, select "Web Application" as application type, name it `Tuist Cloud`, and set the redirect URI to `{base_url}/users/auth/google/callback` where `base_url` is the URL your hosted-service is running at. Once you create the app, copy the client ID and secret and set them as environment variables `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` respectively. +You can set up authentication with Google using [OAuth 2](https://developers.google.com/identity/protocols/oauth2). For that, you'll need to create a new credential of type OAuth client ID. When creating the credentials, select "Web Application" as application type, name it `Tuist`, and set the redirect URI to `{base_url}/users/auth/google/callback` where `base_url` is the URL your hosted-service is running at. Once you create the app, copy the client ID and secret and set them as environment variables `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` respectively. > [!NOTE] CONSENT SCREEN SCOPES > You might need to create a consent screen. When you do so, make sure to add the `userinfo.email` and `openid` scopes and mark the app as internal. @@ -106,7 +104,7 @@ You can set up authentication with Google using [OAuth 2](https://developers.goo You can enable authentication with Okta through the [OAuth 2.0](https://oauth.net/2/) protocol. You'll have to [create an app](https://developer.okta.com/docs/guides/implement-oauth-for-okta/main/#create-an-oauth-2-0-app-in-okta) on Okta with the following configuration: -- **App integration name:** `Tuist Cloud` +- **App integration name:** `Tuist` - **Grant type:** Enable *Authorization Code* for *Client acting on behalf of a user* - **Sign-in redirect URL:** `{url}/users/auth/okta/callback` where `url` is the public URL your service is accessed through. - **Assignments:** This configuration will depend on your security team requirements. @@ -121,7 +119,7 @@ Once the app is created you'll need to set the following environment variables: ### Storage environment configuration - Tuist Cloud needs storage to house artifacts uploaded through the API. It's **essential to configure one of the supported storage solutions** for Tuist Cloud to operate effectively. + Tuist needs storage to house artifacts uploaded through the API. It's **essential to configure one of the supported storage solutions** for Tuist to operate effectively. #### S3-compliant storages @@ -135,7 +133,7 @@ For Google Cloud Storage, follow [these docs](https://cloud.google.com/storage/d ## Deployment -On-premise users are granted access to the repository located at [tuist/cloud-on-premise](https://github.com/cloud/cloud-on-premise) which has a linked container registry for pulling images. Currently, the container registry allows authentication only as an individual user. Therefore, users with repository access must generate a **personal access token** within the Tuist organization, ensuring they have the necessary permissions to read packages. After submission, we will promptly approve this token. +On-premise users are granted access to the repository located at [tuist/registry](https://github.com/cloud/registry) which has a linked container registry for pulling images. Currently, the container registry allows authentication only as an individual user. Therefore, users with repository access must generate a **personal access token** within the Tuist organization, ensuring they have the necessary permissions to read packages. After submission, we will promptly approve this token. > [!IMPORTANT] USER VS ORGANIZATION-SCOPED TOKENS > Using a personal access token presents a challenge because it's associated with an individual who might eventually depart from the enterprise organization. GitHub recognizes this limitation and is actively developing a solution to allow GitHub apps to authenticate with app-generated tokens. @@ -146,7 +144,7 @@ After generating the token, you can retrieve the image by executing the followin ```bash echo $TOKEN | docker login ghcr.io -u USERNAME --password-stdin -docker pull ghcr.io/tuist/cloud-on-premise:latest +docker pull ghcr.io/tuist/tuist:latest ``` ### Deploying the Docker image @@ -163,7 +161,7 @@ We recommend establishing a deployment pipeline that that runs **every Tuesday** To deploy the app on [Fly](https://fly.io/), you'll require a `fly.toml` configuration file. Consider generating it dynamically within your Continuous Deployment (CD) pipeline. Below is a reference example for your use: ```toml -app = "tuist-cloud" +app = "tuist" primary_region = "fra" kill_signal = "SIGINT" kill_timeout = "5s" @@ -253,8 +251,8 @@ services: - db tuist: - image: ghcr.io/tuist/cloud-on-premise:latest - container_name: tuist_cloud + image: ghcr.io/tuist/tuist:latest + container_name: tuist depends_on: - db ports: @@ -266,21 +264,20 @@ services: - "8080" - "443:443" environment: - # Base Tuist Env - https://docs.tuist.io/cloud/on-premise#base-environment-configuration + # Base Tuist Env - https://docs.tuist.io/guides/dashboard/on-premise/install#base-environment-configuration TUIST_USE_SSL_FOR_DATABASE: "0" TUIST_LICENSE: # ... - TUIST_CLOUD_HOSTED: "0" DATABASE_URL: postgres://postgres:postgres@db:5432/postgres?sslmode=disable TUIST_APP_URL: https://localhost:8080 TUIST_SECRET_KEY_BASE: # ... WEB_CONCURRENCY: 80 # Auth - one method - # GitHub Auth - https://docs.tuist.io/cloud/on-premise#github + # GitHub Auth - https://docs.tuist.io/guides/dashboard/on-premise/install#github TUIST_GITHUB_OAUTH_ID: TUIST_GITHUB_OAUTH_SECRET: - # Okta Auth - https://docs.tuist.io/cloud/on-premise#okta + # Okta Auth - https://docs.tuist.io/guides/dashboard/on-premise/install#okta TUIST_OKTA_SITE: TUIST_OKTA_CLIENT_ID: TUIST_OKTA_CLIENT_SECRET: diff --git a/docs/docs/cloud/on-premise/metrics.md b/docs/docs/guides/dashboard/on-premise/metrics.md similarity index 99% rename from docs/docs/cloud/on-premise/metrics.md rename to docs/docs/guides/dashboard/on-premise/metrics.md index 1fa0f0047b0..d48cd5fe47c 100644 --- a/docs/docs/cloud/on-premise/metrics.md +++ b/docs/docs/guides/dashboard/on-premise/metrics.md @@ -1,10 +1,8 @@ --- title: On-premise metrics -titleTemplate: ':title - Tuist Cloud' description: Optimize your build times by caching compiled binaries and sharing them across different environments. --- - # Metrics You can ingest metrics gathered by the Tuist server using [Prometheus](https://prometheus.io/) and a visualization tool such as [Grafana](https://grafana.com/) to create a custom dashboard tailored to your needs. The Prometheus metrics are served via the `/metrics` endpoint. The Prometheus' [scrape_interval](https://prometheus.io/docs/introduction/first_steps/#configuring-prometheus) should be set as less than 10_000 seconds (we recommend keeping the default of 15 seconds). diff --git a/docs/docs/guides/develop/build.md b/docs/docs/guides/develop/build.md new file mode 100644 index 00000000000..a7422f18e47 --- /dev/null +++ b/docs/docs/guides/develop/build.md @@ -0,0 +1,31 @@ +--- +title: Build +description: Learn how to use Tuist to build your projects efficiently. +--- + +# Build + +Projects are usually built through a build-system-provided CLI (e.g. `xcodebuild`). Tuist wraps them to improve the user experience and integrate the workflows with the platform to provide optimizations and analytics. + +You might wonder what's the value of using `tuist build` over generating the project with `tuist generate` (if needed) and building it with the platform-specific CLI. Here are some reasons: + +- **Single command:** `tuist build` ensures the project is generated if needed before compiling the project. +- **Beautified output:** Tuist enriches the output using tools like [xcbeautify](https://github.com/cpisciotta/xcbeautify) that make the output more user-friendly. +- [**Cache:**](/guides/develop/build/cache) It optimizes the build by deterministically reusing the build artifacts from a remote cache. +- **Analytics:** It collects and reports metrics that are correlated with other data points to provide you with actionable information to make informed decisions. + +## Usage + +`tuist build` generates the project if needed, and then build it using the platform-specific build tool. We support the use of the `--` terminator to forward all subsequent arguments directly to the underlying build tool. This is useful when you need to pass arguments that are not supported by `tuist build` but are supported by the underlying build tool. + +::: code-group +```bash [Build a scheme] +tuist build MyScheme +``` +```bash [Build a specific configuration] +tuist build MyScheme -- -configuration Debug +``` +```bash [Build all schemes without binary cache] +tuist build --no-binary-cache +``` +::: diff --git a/docs/docs/cloud/binary-caching.md b/docs/docs/guides/develop/build/cache.md similarity index 53% rename from docs/docs/cloud/binary-caching.md rename to docs/docs/guides/develop/build/cache.md index e6ed0dd16d7..8d091c64a49 100644 --- a/docs/docs/cloud/binary-caching.md +++ b/docs/docs/guides/develop/build/cache.md @@ -1,23 +1,22 @@ --- -title: Binary Caching -titleTemplate: ':title - Tuist Cloud' +title: Cache description: Optimize your build times by caching compiled binaries and sharing them across different environments. --- -# Binary Caching +# Cache -Xcode's build system is designed for [incremental builds](https://en.wikipedia.org/wiki/Incremental_build_model), enhancing efficiency under normal circumstances. However, this feature falls short in [Continuous Integration (CI) environments](https://en.wikipedia.org/wiki/Continuous_integration), where data essential for incremental builds is not shared across different builds. Additionally, **developers often reset this data locally to troubleshoot complex compilation problems**, leading to more frequent clean builds. This results in teams spending excessive time waiting for local builds to finish or for Continuous Integration pipelines to provide feedback on pull requests. Furthermore, the frequent context switching in such an environment compounds this unproductiveness. +> [!IMPORTANT] REQUIRES AN ACCOUNT +> You need to be authenticated and have and [a project set up](/guides/quick-start/gather-insights) to persist and share the cache across environments. -Tuist addresses these challenges effectively with its binary caching feature. This tool optimizes the build process by caching compiled binaries, significantly reducing build times both in local development and CI environments. This approach not only accelerates feedback loops but also minimizes the need for context switching, ultimately boosting productivity. +Xcode's build system provides [incremental builds](https://en.wikipedia.org/wiki/Incremental_build_model), enhancing efficiency under normal circumstances. However, this feature falls short in [Continuous Integration (CI) environments](https://en.wikipedia.org/wiki/Continuous_integration), where data essential for incremental builds is not shared across different builds. Additionally, **developers often reset this data locally to troubleshoot complex compilation problems**, leading to more frequent clean builds. This results in teams spending excessive time waiting for local builds to finish or for Continuous Integration pipelines to provide feedback on pull requests. Furthermore, the frequent context switching in such an environment compounds this unproductiveness. -> [!NOTE] BINARY CACHING AND TUIST SUSTAINABILITY -> Be aware that sharing binaries across environments is not possible without Tuist Cloud. We've designed this feature to secure funding for the Tuist projct, which we couldn't achieve with the traditional open-source model. Attempts to work around this limitation may impact the sustainability of the project, which might impact your ability to use Tuist in the future. +Tuist addresses these challenges effectively with its caching feature. This tool optimizes the build process by caching compiled binaries, significantly reducing build times both in local development and CI environments. This approach not only accelerates feedback loops but also minimizes the need for context switching, ultimately boosting productivity. -## Cache warming +## Warming -Tuist efficiently utilizes **hashes** for each target in the dependency graph to detect changes. Utilizing this data, it builds and assigns unique identifiers to binaries derived from these targets. At the time of graph generation, Tuist then seamlessly substitutes the original targets with their corresponding binary versions. +Tuist efficiently [utilizes hashes](/guides/develop/projects/hashing) for each target in the dependency graph to detect changes. Utilizing this data, it builds and assigns unique identifiers to binaries derived from these targets. At the time of graph generation, Tuist then seamlessly substitutes the original targets with their corresponding binary versions. -This operation, known as *"warming,"* produces binaries for local use or for sharing with teammates and CI environments via Tuist Cloud. The process of warming the cache is straightforward and can be initiated with a simple command: +This operation, known as *"warming,"* produces binaries for local use or for sharing with teammates and CI environments via Tuist. The process of warming the cache is straightforward and can be initiated with a simple command: ```bash @@ -26,7 +25,7 @@ tuist cache The command re-uses binaries to speed up the process. -## Using the cache binaries +## Usage By default, when Tuist commands necessitate project generation, they automatically substitute dependencies with their binary equivalents from the cache, if available. Additionally, if you specify a list of targets to focus on, Tuist will also replace any dependent targets with their cached binaries, provided they are available. For those who prefer a different approach, there is an option to opt out of this behavior entirely by using a specific flag: @@ -46,7 +45,7 @@ tuist test > [!WARNING] > Binary caching is a feature designed for development workflows such as running the app on a simulator or device, or running tests. It is not intended for release builds. When archiving the app, generate a project with the sources by using the `--no-binary-cache` flag. -## Cacheable products +## Supported products Only the following target products are cacheable by Tuist: @@ -59,15 +58,15 @@ We are working on supporting libraries and targets that depend on XCTest. > [!NOTE] UPSTREAM DEPENDENCIES > When a target is non-cacheable it makes the upstream targets non-cacheable too. For example, if you have the dependency graph `A > B`, where A depends on B, if B is non-cacheable, A will also be non-cacheable. -## Cache effectiveness +## Efficiency -The level of effectiveness that can be achieved with binary caching depends strongly on the graph structure. To achieve the best results, we recommend the following: +The level of efficiency that can be achieved with binary caching depends strongly on the graph structure. To achieve the best results, we recommend the following: 1. Avoid very nested dependency graphs. The shallower the graph, the better. 2. Define dependencies with protocol/interface targets instead of implementation ones, and dependency-inject implementations from the top-most targets. 3. Split frequently-modified targets into smaller ones whose likelihood of change is lower. -The above suggestions are part of the [The Modular Architecture](/guide/scale/tma-architecture), which we propose as a way to structure your projects to maximize the benefits not only of binary caching but also of Xcode's capabilities. +The above suggestions are part of the [The Modular Architecture](/guides/develop/projects/tma-architecture), which we propose as a way to structure your projects to maximize the benefits not only of binary caching but also of Xcode's capabilities. ## Recommended setup @@ -94,6 +93,6 @@ The following are some examples of common workflows: ### It doesn't use binaries for my targets -Ensure that the [hashes are deterministic](/cloud/hashing.html#debugging) across environments and runs. This might happen if the project has references to the environment, for example through absolute paths. You can use the `diff` command to compare the projects generated by two consecutive invocations of `tuist generate` or across environments or runs. +Ensure that the [hashes are deterministic](/guides/develop/projects/hashing#debugging) across environments and runs. This might happen if the project has references to the environment, for example through absolute paths. You can use the `diff` command to compare the projects generated by two consecutive invocations of `tuist generate` or across environments or runs. -Also make sure that the target doesn't depend either directly or indirectly on a [non-cacheable target](/cloud/binary-caching.html#cacheable-products). \ No newline at end of file +Also make sure that the target doesn't depend either directly or indirectly on a [non-cacheable target](/guides/develop/build/cache.html#cacheable-products). \ No newline at end of file diff --git a/docs/docs/guides/develop/projects.md b/docs/docs/guides/develop/projects.md new file mode 100644 index 00000000000..89fa4659922 --- /dev/null +++ b/docs/docs/guides/develop/projects.md @@ -0,0 +1,39 @@ +--- +title: Projects +description: Learn about Tuist's DSL for defining Xcode projects. +--- + +# Projects + +Tuist Projects is a viable alternative that helps to overcome these challenges while keeping complexity and costs at an acceptable level. It considers Xcode projects as a fundamental element, ensuring resilience against future Xcode updates, and leverages Xcode project generation to provide teams with a modularization-focused declarative API. Tuist uses the project declaration to simplify the complexities of modularization**, optimize workflows like build or test across various environments, and facilitate and democratize the evolution of Xcode projects. + +## How does it work? + +To get started with Tuist Projects, all you need is to define your project using **Tuist's Domain Specific Language (DSL)**. This entails using manifest files such as `Workspace.swift` or `Project.swift`. If you've worked with the Swift Package Manager before, the approach is very similar. + +Once you've defined your project, Tuist offers various workflows to manage and interact with it: + +- **Generate:** This is a foundational workflow. Use it to create an Xcode project that's compatible with Xcode. +- **[Build](/guides/develop/build):** This workflow not only generates the Xcode project but also employs `xcodebuild` to compile it. +- **[Test](/guides/develop/test):** Operating much like the build workflow, this not only generates the Xcode project but utilizes `xcodebuild` to test it. + +## Challenges with Xcode projects + +As Xcode projects grow, **organizations may face a decline in productivity** due to several factors, including unreliable incremental builds, frequent clearing of Xcode's global cache by developers encountering issues, and fragile project configurations. To maintain rapid feature development, organizations typically explore various strategies. + +Some organizations choose to bypass the compiler by abstracting the platform using JavaScript-based dynamic runtimes, such as [React Native](https://reactnative.dev/). While this approach may be effective, it [complicates access to the platform's native features](https://shopify.engineering/building-app-clip-react-native). Other organizations opt for **modularizing the codebase**, which helps establish clear boundaries, making the codebase easier to work with and improving the reliability of build times. However, the Xcode project format is not designed for modularity and results in implicit configurations that few understand and frequent conflicts. This leads to a bad bus factor, and although incremental builds may improve, developers might still frequently clear Xcode's build cache (i.e., derived data) when builds fail. To address this, some organizations choose to **abandon Xcode's build system** and adopt alternatives like [Buck](https://buck.build/) or [Bazel](https://bazel.build/). However, this comes with a [high complexity and maintenance burden](https://bazel.build/migrate/xcode). + + +## Alternatives + +### Swift Package Manager + +While the Swift Package Manager (SPM) primarily focuses on dependencies, Tuist offers a different approach. With Tuist, you don't just define packages for SPM integration; you shape your projects using familiar concepts like projects, workspaces, targets, and schemes. + +### XcodeGen + +[XcodeGen](https://github.com/yonaskolb/XcodeGen) is a dedicated project generator designed to reduce conflicts in collaborative Xcode projects and simplify some complexities of Xcode's internal workings. However, projects are defined using serializable formats like [YAML](https://yaml.org/). Unlike Swift, this doesn't allow developers to build upon abstractions or checks without incorporating additional tools. While XcodeGen does offer a way to map dependencies to an internal representation for validation and optimization, it still exposes developers to the nuances of Xcode. This might make XcodeGen a suitable foundation for [building tools](https://github.com/MobileNativeFoundation/rules_xcodeproj), as seen in the Bazel community, but it's not optimal for inclusive project evolution that aims to maintain a healthy and productive environment. + +### Bazel + +[Bazel](https://bazel.build) is an advanced build system renowned for its remote caching features, gaining popularity within the Swift community primarily for this capability. However, given the limited extensibility of Xcode and its build system, substituting it with Bazel's system demands significant effort and maintenance. Only a few companies with abundant resources can bear this overhead, as evident from the select list of firms investing heavily to integrate Bazel with Xcode. Interestingly, the community created a [tool](https://github.com/MobileNativeFoundation/rules_xcodeproj) that employs Bazel's XcodeGen to generate an Xcode project. This results in a convoluted chain of conversions: from Bazel files to XcodeGen YAML and finally to Xcode Projects. Such layered indirection often complicates troubleshooting, making issues more challenging to diagnose and resolve. \ No newline at end of file diff --git a/docs/docs/guide/project/code-sharing.md b/docs/docs/guides/develop/projects/code-sharing.md similarity index 100% rename from docs/docs/guide/project/code-sharing.md rename to docs/docs/guides/develop/projects/code-sharing.md diff --git a/docs/docs/guide/introduction/cost-of-convenience.md b/docs/docs/guides/develop/projects/cost-of-convenience.md similarity index 98% rename from docs/docs/guide/introduction/cost-of-convenience.md rename to docs/docs/guides/develop/projects/cost-of-convenience.md index 7d99fd406d4..935d25bd6ab 100644 --- a/docs/docs/guide/introduction/cost-of-convenience.md +++ b/docs/docs/guides/develop/projects/cost-of-convenience.md @@ -5,8 +5,6 @@ description: Learn about the cost of convenience in Xcode and how Tuist helps yo # The cost of convenience -Before continuing, let's take a moment to consider the cost of convenience in [Xcode](https://developer.apple.com/xcode). - Designing a code editor that the spectrum **from small to large-scale projects can use** is a challenging task. Many tools approach the problem by layering their solution and providing extensibility. The bottom-most layer is very low-level and close to the underlying build system, and the top-most layer is a high-level abstraction that's convenient to use but less flexible. By doing so, they make the simple things easy, and everything else possible. diff --git a/docs/docs/guide/project/dependencies.md b/docs/docs/guides/develop/projects/dependencies.md similarity index 94% rename from docs/docs/guide/project/dependencies.md rename to docs/docs/guides/develop/projects/dependencies.md index feccc97fe18..ed9ce91e273 100644 --- a/docs/docs/guide/project/dependencies.md +++ b/docs/docs/guides/develop/projects/dependencies.md @@ -71,7 +71,7 @@ You can integrate them using Xcode's default integration mechanism or using Tuis Xcode's default integration while being the most convenient one, lacks flexibility and control that's required for medium and large projects. To overcome this, Tuist offers an XcodeProj-based integration that allows you to integrate Swift Packages in your project using XcodeProj's targets. -Thanks to that, we can not only give you more control over the integration but also make it compatible with workflows like [binary caching](/cloud/binary-caching) and [selective testing](/cloud/selective-testing). +Thanks to that, we can not only give you more control over the integration but also make it compatible with workflows like [caching](/guides/develop/build/cache) and [smart test runs](/guides/develop/test/smart-runner). XcodeProj's integration is more likely to take more time to support new Swift Package features or handle more package configurations. However, the mapping logic between Swift Packages and XcodeProj targets is open-source and can be contributed to by the community. This is contrary to Xcode's default integration, which is closed-source and maintained by Apple. @@ -252,7 +252,7 @@ The **general rule of thumb** is that you want as many things as possible to be The challenge with changing between static and dynamic linking in a project graph is that is not trivial in Xcode because a change has cascading effect on the entire graph (e.g. libraries can't contain resources, static frameworks don't need to be embedded). Apple tried to solve the problem with compile time solutions like Swift Package Manager's automatic decision between static and dynamic linking, or [Mergeable Libraries](https://developer.apple.com/documentation/xcode/configuring-your-project-to-use-mergeable-libraries). However, this adds new dynamic variables to the compilation graph, adding new sources of non-determinism, and potentially causing some features like Swift Previews that rely on the compilation graph to become unreliable. -Luckily, Tuist conceptually compresses the complexity associated with changing between static and dynamic and synthesizes [bundle accessors](/guide/project/synthesized-files#bundle-accessors) that are standard across linking types. In combination with [dynamic configurations via environment variables](/guide/project/dynamic-configuration), you can pass the linking type at invocation time, and use the value in your manifests to set the product type of your targets. +Luckily, Tuist conceptually compresses the complexity associated with changing between static and dynamic and synthesizes [bundle accessors](/guides/develop/projects/synthesized-files#bundle-accessors) that are standard across linking types. In combination with [dynamic configurations via environment variables](/guides/develop/projects/dynamic-configuration), you can pass the linking type at invocation time, and use the value in your manifests to set the product type of your targets. ```swift // Use the value returned by this function to set the product type of your targets. @@ -265,7 +265,7 @@ func productType() -> Product { } ``` -Note that Tuist [does not default to convenience through implicit configuration due to its costs](/guide/introduction/cost-of-convenience). What this means is that we rely on you setting the linking type and any additional build settings that are sometimes required, like the [`-ObjC` linker flag](https://github.com/pointfreeco/swift-composable-architecture/discussions/1657#discussioncomment-4119184), to ensure the resulting binaries are correct. Therefore, the stance that we take is providing you with the resources, usually in the shape of documentation, to make the right decisions. +Note that Tuist [does not default to convenience through implicit configuration due to its costs](/guides/develop/projects/cost-of-convenience). What this means is that we rely on you setting the linking type and any additional build settings that are sometimes required, like the [`-ObjC` linker flag](https://github.com/pointfreeco/swift-composable-architecture/discussions/1657#discussioncomment-4119184), to ensure the resulting binaries are correct. Therefore, the stance that we take is providing you with the resources, usually in the shape of documentation, to make the right decisions. > [!TIP] EXAMPLE: COMPOSABLE ARCHITECTURE > A Swift Package that many projects integrate is [Composable Architecture](https://github.com/pointfreeco/swift-composable-architecture). As described [here](https://github.com/pointfreeco/swift-composable-architecture/discussions/1657#discussioncomment-4119184) and the [troubleshooting section](#troubleshooting), you'll need to set the `OTHER_LDFLAGS` build setting to `$(inherited) -ObjC` when linking the packages statically, which is Tuist's default linking type. Alternatively, you can override the product type for the package to be dynamic. diff --git a/docs/docs/guide/project/directory-structure.md b/docs/docs/guides/develop/projects/directory-structure.md similarity index 76% rename from docs/docs/guide/project/directory-structure.md rename to docs/docs/guides/develop/projects/directory-structure.md index 9bad1b88be2..66bc674acd1 100644 --- a/docs/docs/guide/project/directory-structure.md +++ b/docs/docs/guides/develop/projects/directory-structure.md @@ -25,13 +25,13 @@ Workspace.swift ``` - **Tuist directory:** This directory has two purposes. First, it signals **where the root of the project is**. This allows constructing paths relative to the root of the project, and also also running Tuist commands from any directory within the project. Second, it's the container for the following files: - - [**Config.swift:**](/guide/project/manifests.html#config-swift) This file contains configuration for Tuist that's shared across all the projects, workspaces, and environments. For example, it can be used to disable automatic generation of schemes, or to define the deployment target of the projects. + - [**Config.swift:**](/guides/develop/projects/manifests#config-swift) This file contains configuration for Tuist that's shared across all the projects, workspaces, and environments. For example, it can be used to disable automatic generation of schemes, or to define the deployment target of the projects. - **ProjectDescriptionHelpers:** This directory contains Swift code that's shared across all the manifest files. Manifest files can `import ProjectDescriptionHelpers` to use the code defined in this directory. Sharing code is useful to avoid duplications and ensure consistency across the projects. - - **Package.swift:** This file contains Swift Package dependencies for Tuist to integrate them using Xcode projects and targets (like [CocoaPods](https://cococapods)) that are configurable and optimizable. Learn more [here](/guide/project/dependencies). + - **Package.swift:** This file contains Swift Package dependencies for Tuist to integrate them using Xcode projects and targets (like [CocoaPods](https://cococapods)) that are configurable and optimizable. Learn more [here](/guides/develop/projects/dependencies). - **Root directory**: The root directory of your project that also contains the `Tuist` directory. - - [**Workspace.swift:**](/guide/project/manifests.html#workspace-swift) This manifest represents an Xcode workspace. It's used to group other projects and can also add additional files and schemes. - - [**Project.swift:**](/guide/project/manifests.html#project-swift) This manifest represents an Xcode project. It's used to define the targets that are part of the project, and their dependencies. + - [**Workspace.swift:**](/guides/develop/projects/manifests#workspace-swift) This manifest represents an Xcode workspace. It's used to group other projects and can also add additional files and schemes. + - [**Project.swift:**](/guides/develop/projects/manifests#project-swift) This manifest represents an Xcode project. It's used to define the targets that are part of the project, and their dependencies. When interacting with the above project, commands expect to find either a `Workspace.swift` or a `Project.swift` file in the working directory or the directory indicated via the `--path` flag. The manifest should be in a directory or subdirectory of a directory containing a `Tuist` directory, which represents the root of the project. @@ -42,4 +42,4 @@ When interacting with the above project, commands expect to find either a `Works Tuist also supports SPM package projects. If you are working on an SPM package, you shouldn't need to update anything. Tuist automatically picks up on your root `Package.swift` and all the features of Tuist work as if it was a `Project.swift` manifest. -To get started, run `tuist install` and `tuist generate` in your SPM package. Your project should now have all the same schemes and files that you would see in the vanilla Xcode SPM integration. However, now you can also run [`tuist cache`](/cloud/binary-caching) and have majority of your SPM dependencies and modules precompiled, making subsequent builds extremely fast. +To get started, run `tuist install` and `tuist generate` in your SPM package. Your project should now have all the same schemes and files that you would see in the vanilla Xcode SPM integration. However, now you can also run [`tuist cache`](/guides/develop/build/cache) and have majority of your SPM dependencies and modules precompiled, making subsequent builds extremely fast. diff --git a/docs/docs/guide/project/dynamic-configuration.md b/docs/docs/guides/develop/projects/dynamic-configuration.md similarity index 83% rename from docs/docs/guide/project/dynamic-configuration.md rename to docs/docs/guides/develop/projects/dynamic-configuration.md index 4619b2f80c2..141c2823360 100644 --- a/docs/docs/guide/project/dynamic-configuration.md +++ b/docs/docs/guides/develop/projects/dynamic-configuration.md @@ -23,7 +23,7 @@ TUIST_APP_NAME=MyApp TUIST_APP_LOCALE=pl tuist generate ## Reading the environment variables from manifests -Variables can be accessed using the [`Environment`](/reference/project-description/enums/environment) type. Any variables following the convention `TUIST_XXX` defined in the environment or passed to Tuist when running commands will be accessible using the `Environment` type. The following example shows how we access the `TUIST_APP_NAME` variable: +Variables can be accessed using the [`Environment`](/references/project-description/enums/environment) type. Any variables following the convention `TUIST_XXX` defined in the environment or passed to Tuist when running commands will be accessible using the `Environment` type. The following example shows how we access the `TUIST_APP_NAME` variable: ```swift func appName() -> String { diff --git a/docs/docs/guide/project/editing.md b/docs/docs/guides/develop/projects/editing.md similarity index 100% rename from docs/docs/guide/project/editing.md rename to docs/docs/guides/develop/projects/editing.md diff --git a/docs/docs/cloud/hashing.md b/docs/docs/guides/develop/projects/hashing.md similarity index 82% rename from docs/docs/cloud/hashing.md rename to docs/docs/guides/develop/projects/hashing.md index cfe28175390..a3e5a1b66de 100644 --- a/docs/docs/cloud/hashing.md +++ b/docs/docs/guides/develop/projects/hashing.md @@ -5,15 +5,15 @@ description: Learn about Tuist's hashing logic upon which features like binary c # Hashing -To determine if a target has changed, Tuist **calculates a hash for each target** in the dependency graph. [Binary caching](/cloud/binary-caching) leverages that information to determine whether binaries should be used for a particular target, or if the tests of a target should be run. The hash is calculated based on the following attributes: +Features like [caching](/guides/develop/build/cache) or smart test execution require a way to determine whether a target has changed. Tuist calculates a hash for each target in the dependency graph to determine if a target has changed. The hash is calculated based on the following attributes: - The target's attributes (e.g., name, platform, product, etc.) - The target's files - The hash of the target's dependencies -### Binary caching +### Cache attributes -Additionally, when calculating the hash for [binary caching](/cloud/binary-caching), we also hash the following attributes. +Additionally, when calculating the hash for [caching](/guides/develop/build/cache), we also hash the following attributes. #### Swift version diff --git a/docs/docs/guide/project/manifests.md b/docs/docs/guides/develop/projects/manifests.md similarity index 80% rename from docs/docs/guide/project/manifests.md rename to docs/docs/guides/develop/projects/manifests.md index b7a42fd9bd3..1984d9f8060 100644 --- a/docs/docs/guide/project/manifests.md +++ b/docs/docs/guides/develop/projects/manifests.md @@ -14,7 +14,7 @@ The decision of using Swift was inspired by the [Swift Package Manager](https:// ## Project.swift -The [`Project.swift`](/reference/project-description/structs/project) manifest declares an Xcode project. The project gets generated in the same directory where the manifest file is located with the name indicated in the `name` property. +The [`Project.swift`](/references/project-description/structs/project) manifest declares an Xcode project. The project gets generated in the same directory where the manifest file is located with the name indicated in the `name` property. ```swift // Project.swift @@ -32,7 +32,7 @@ let project = Project( ## Workspace.swift -By default, Tuist generates an [Xcode Workspace](https://developer.apple.com/documentation/xcode/projects-and-workspaces) containing the project being generated and the projects of its dependencies. If for any reason you'd like to customize the workspace to add additional projects or include files and groups, you can do so by defining a [`Workspace.swift`](/reference/project-description/structs/workspace) manifest. +By default, Tuist generates an [Xcode Workspace](https://developer.apple.com/documentation/xcode/projects-and-workspaces) containing the project being generated and the projects of its dependencies. If for any reason you'd like to customize the workspace to add additional projects or include files and groups, you can do so by defining a [`Workspace.swift`](/references/project-description/structs/workspace) manifest. ```swift // Workspace.swift @@ -53,11 +53,11 @@ let workspace = Workspace( A question that often comes up is whether to use a single project or multiple projects in a workspace. In a world without Tuist where a mono-project setup would lead to frequent Git conflicts the usage of workspaces is encouraged. However, since we don't recommend including the Tuist-generated Xcode projects in the Git repository, Git conflicts are not an issue. Therefore, the decision of using a single project or multiple projects in a workspace is up to you. -In the Tuist project we lean on mono-projects because the cold generation time is faster (fewer manifest files to compile) and we leverage [project description helpers](/guide/project/code-sharing) as a unit of encapsulation. However, you might want to use Xcode projects as a unit of encapsulation to represent different domains of your application, which aligns more closely with the Xcode's recommended project structure. +In the Tuist project we lean on mono-projects because the cold generation time is faster (fewer manifest files to compile) and we leverage [project description helpers](/guides/develop/projects/code-sharing) as a unit of encapsulation. However, you might want to use Xcode projects as a unit of encapsulation to represent different domains of your application, which aligns more closely with the Xcode's recommended project structure. ## Config.swift -Tuist provides [sensible defaults](/contributors/principles.html#default-to-conventions) to simplify project configuration. However, you can customize the configuration by defining a [`Config.swift`](/reference/project-description/structs/config) manifest under the `Tuist` directory, which is used by Tuist to determine the root of the project. +Tuist provides [sensible defaults](/contributors/principles.html#default-to-conventions) to simplify project configuration. However, you can customize the configuration by defining a [`Config.swift`](/references/project-description/structs/config) manifest under the `Tuist` directory, which is used by Tuist to determine the root of the project. ```swift import ProjectDescription diff --git a/docs/docs/guide/project/plugins.md b/docs/docs/guides/develop/projects/plugins.md similarity index 92% rename from docs/docs/guide/project/plugins.md rename to docs/docs/guides/develop/projects/plugins.md index 68faec90539..da67fb35d64 100644 --- a/docs/docs/guide/project/plugins.md +++ b/docs/docs/guides/develop/projects/plugins.md @@ -7,10 +7,10 @@ description: Learn how to create and use plugins in Tuist to extend its function Plugins are a tool to share and reuse Tuist artifacts across multiple projects. The following artifacts are supported: -- [Project description helpers](/guide/project/code-sharing) across multiple projects. -- [Templates](/guide/project/templates) across multiple projects. +- [Project description helpers](/guides/develop/projects/code-sharing) across multiple projects. +- [Templates](/guides/develop/projects/templates) across multiple projects. - Tasks across multiple projects. -- [Resource accessor](/guide/project/synthesized-files) template across multiple projects +- [Resource accessor](/guides/develop/projects/synthesized-files) template across multiple projects Note that plugins are designed to be a simple way to extend Tuist's functionality. Therefore there are **some limitations to consider**: @@ -46,7 +46,7 @@ let plugin = Plugin(name: "MyPlugin") ### Resource accessor templates plugin -If you need to share [synthesized resource accessors](/guide/project/synthesized-files.html#resource-accessors) you can use +If you need to share [synthesized resource accessors](/guides/develop/projects/synthesized-files#resource-accessors) you can use this type of plugin. The plugin is represented by a directory containing a `Plugin.swift` manifest file that declares the plugin's name and a `ResourceSynthesizers` directory containing the resource accessor template files. @@ -101,7 +101,7 @@ If you were using Tuist for distributing tasks, we recommend building your ## Using plugins -To use a plugin, you'll have to add it to your project's [`Config.swift`](/reference/project-description/structs/config) manifest file: +To use a plugin, you'll have to add it to your project's [`Config.swift`](/references/project-description/structs/config) manifest file: ```swift import ProjectDescription diff --git a/docs/docs/guide/project/synthesized-files.md b/docs/docs/guides/develop/projects/synthesized-files.md similarity index 100% rename from docs/docs/guide/project/synthesized-files.md rename to docs/docs/guides/develop/projects/synthesized-files.md diff --git a/docs/docs/guide/project/templates.md b/docs/docs/guides/develop/projects/templates.md similarity index 82% rename from docs/docs/guide/project/templates.md rename to docs/docs/guides/develop/projects/templates.md index 6a45db50bee..73064427064 100644 --- a/docs/docs/guide/project/templates.md +++ b/docs/docs/guides/develop/projects/templates.md @@ -15,7 +15,7 @@ In projects with an established architecture, developers might want to bootstrap ## Defining a template -To define templates, you can run [`tuist edit`](/guide/project/editing) and then create a directory called `name_of_template` under `Tuist/Templates` that represents your template. Templates need a manifest file, `name_of_template.swift` that describes the template. So if you are creating a template called `framework`, you should create a new directory `framework` at `Tuist/Templates` with a manifest file called `framework.swift` that could look like this: +To define templates, you can run [`tuist edit`](/guides/develop/projects/editing) and then create a directory called `name_of_template` under `Tuist/Templates` that represents your template. Templates need a manifest file, `name_of_template.swift` that describes the template. So if you are creating a template called `framework`, you should create a new directory `framework` at `Tuist/Templates` with a manifest file called `framework.swift` that could look like this: ```swift @@ -64,4 +64,4 @@ Using string interpolation, `\(nameAttribute)` above would resolve to `{{ name } You can also use `.directory` which gives the possibility to copy entire folders to a given path. > [!TIP] PROJECT DESCRIPTION HELPERS -> Templates support the use of [project description helpers](/guide/project/code-sharing) to reuse code across templates. \ No newline at end of file +> Templates support the use of [project description helpers](/guides/develop/projects/code-sharing) to reuse code across templates. \ No newline at end of file diff --git a/docs/docs/guide/scale/tma-architecture.md b/docs/docs/guides/develop/projects/tma-architecture.md similarity index 93% rename from docs/docs/guide/scale/tma-architecture.md rename to docs/docs/guides/develop/projects/tma-architecture.md index 9f7d7c20047..76600945cf5 100644 --- a/docs/docs/guide/scale/tma-architecture.md +++ b/docs/docs/guides/develop/projects/tma-architecture.md @@ -62,7 +62,7 @@ Depending on interfaces requires apps to build the graph of implementations at r When building a module, you can choose between **libraries and frameworks**, and **static and dynamic linking** for the targets. Without Tuist, making this decision is a bit more complex because you need to configure the dependency graph manually. However, thanks to Tuist Projects, this is no longer a problem. -We recommend using dynamic libraries or frameworks during development using [bundle accessors](/guide/project/synthesized-files#bundle-accessors) to decouple the bundle-accessing logic from the library or framework nature of the target. This is key for fast compilation times and to ensure [SwiftUI Previews](https://developer.apple.com/documentation/swiftui/previews-in-xcode) work reliably. And static libraries or frameworks for the release builds to ensure the app boots fast. You can leverage [dynamic configuration](/guide/project/dynamic-configuration#configuration-through-environment-variables) to change the product type at generation-time: +We recommend using dynamic libraries or frameworks during development using [bundle accessors](/guides/develop/projects/synthesized-files#bundle-accessors) to decouple the bundle-accessing logic from the library or framework nature of the target. This is key for fast compilation times and to ensure [SwiftUI Previews](https://developer.apple.com/documentation/swiftui/previews-in-xcode) work reliably. And static libraries or frameworks for the release builds to ensure the app boots fast. You can leverage [dynamic configuration](/guides/develop/projects/dynamic-configuration#configuration-through-environment-variables) to change the product type at generation-time: ```bash # You'll have to read the value of the variable from the manifest diff --git a/docs/docs/guides/develop/test.md b/docs/docs/guides/develop/test.md new file mode 100644 index 00000000000..cf53d796df7 --- /dev/null +++ b/docs/docs/guides/develop/test.md @@ -0,0 +1,33 @@ +--- +title: tuist test +description: Learn how to run tests efficiently with Tuist. +--- + +# Test + +Tuist provides a command, `tuist test` to generate the project if needed, and then run the tests with the the platform-specific build tool (e.g. `xcodebuild` for Apple platforms). + +You might wonder what's the value of using `tuist test` over generating the project with `tuist generate` and running the tests with the platform-specific build tool. + +- **Single command:** `tuist test` ensures the project is generated if needed before compiling the project. +- **Beautified output:** Tuist enriches the output using tools like [xcbeautify](https://github.com/cpisciotta/xcbeautify) that make the output more user-friendly. +- [**Cache:**](/guides/develop/build/cache) It optimizes the build by deterministically reusing the build artifacts from a remote cache. +- [**Smart runner:**](/guides/develop/test/smart-runner) It runs only the tests that need to be run, saving time and resources. +- [**Flakiness:**](/guides/develop/test/flakiness) Prevent, detect, and fix flaky tests. + +## Usage + +To run the tests of a project, you can use the `tuist test` command. This command will generate the project if needed, and then run the tests using the platform-specific build tool. We support the use of the `--` terminator to forward all subsequent arguments directly to the build tool. + +::: code-group +```bash [Running scheme tests] +tuist test MyScheme +``` +```bash [Running all tests without binary cache] +tuist test --no-binary-cache +``` + +```bash [Running all tests without selective testing] +tuist test --no-selective-testing +``` +::: diff --git a/docs/docs/guides/develop/test/flakiness.md b/docs/docs/guides/develop/test/flakiness.md new file mode 100644 index 00000000000..c4cc0d482d6 --- /dev/null +++ b/docs/docs/guides/develop/test/flakiness.md @@ -0,0 +1,21 @@ +--- +title: Test flakiness +description: Prevent, detect, and fix flaky tests with Tuist. +--- + +# Test flakiness + +> [!IMPORTANT] REQUIRES AN ACCOUNT +> You need to be authenticated and have and [a project set up](/guides/quick-start/gather-insights) to persist and analyze test results across runs. + +It's common in test suite to have flaky tests. Those are tests that sometimes pass and sometimes fail, even though the code under test hasn't changed. Flaky tests are a problem because **they reduce the trust in the test suite and make it harder to detect real regressions.** Moreover, they might slow down the development process because developers might need to rerun the tests multiple times until they pass. + +Luckily, Tuist provides a solution to detect flay tests. + +## Detecting flakiness + +When running tests with [`tuist test`](/guides/develop/test), Tuist persists the result of each test case along with a unique hash that identifies the test state. The unique hash changes if either the module containing the test or any of its dependencies change. Thanks to the unique hash and the results, Tuist can determine if a test is flaky. A test case is flaky if it has yielded different results for the same hash. + +In the project dashboard, you can see a list of flaky tests along with the test runs whose result bundles you can download to investigate the flakiness. For example, the image below shows a test case, `test_create_list_and_revoke_project_token`, that has been flagged as flaky: + +An image that shows the Tuist dashboard where one can see a test case named test_create_list_and_revoke_project_token and all their test runs where one of them shows as failing. \ No newline at end of file diff --git a/docs/docs/guides/develop/test/images/flaky-test-case.png b/docs/docs/guides/develop/test/images/flaky-test-case.png new file mode 100644 index 0000000000000000000000000000000000000000..a53d5d5c706cc60185e4753f16a7cf289802fa1c GIT binary patch literal 322567 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

    !Fb`{6pGBGJV!If0}5 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 ST0TVzeB3_49ISCZp8j8e?kZFO literal 0 HcmV?d00001 diff --git a/docs/docs/cloud/selective-testing.md b/docs/docs/guides/develop/test/smart-runner.md similarity index 83% rename from docs/docs/cloud/selective-testing.md rename to docs/docs/guides/develop/test/smart-runner.md index 3a8a55e3d2c..e746ee77fc3 100644 --- a/docs/docs/cloud/selective-testing.md +++ b/docs/docs/guides/develop/test/smart-runner.md @@ -1,10 +1,12 @@ --- -title: Selective testing -titleTemplate: ':title - Tuist Cloud' -description: Speed up your test runs by running only the tests that have changed since the last successful test run. +title: Smart test runner +description: Use smart test selection to run only the tests that need to be run. --- -# Selective testing +# Smart test runner + +> [!IMPORTANT] REQUIRES AN ACCOUNT +> You need to be authenticated and have and [a project set up](/guides/quick-start/gather-insights) to use the smart test runner across environments. As your project grows, so does the amount of your tests. For a long time, running all tests on every PR or push to `main` takes tens of seconds. But this solution does not scale to thousands of tests your team might have. @@ -12,7 +14,7 @@ On every test run on the CI, you probably build a project with cleaned derived d ## Running tests selectively -To run tests selectively, use the `tuist test` command. The command hashes your project the same way it does for [warming the cache](/cloud/binary-caching#cache-warming), and on success, it persists the hashes on Tuist Cloud to determine what has changed in future runs. +To run tests selectively, use the `tuist test` command. The command hashes your project the same way it does for [warming the cache](/guides/develop/build/cache#cache-warming), and on success, it persists the hashes on to determine what has changed in future runs. In future runs `tuist test` transparently uses the hashes to filter down the tests to run only the ones that have changed since the last successful test run. diff --git a/docs/docs/guides/quick-start/add-dependencies.md b/docs/docs/guides/quick-start/add-dependencies.md new file mode 100644 index 00000000000..333f0721548 --- /dev/null +++ b/docs/docs/guides/quick-start/add-dependencies.md @@ -0,0 +1,123 @@ +--- +title: Add dependencies +description: Learn how to add dependencies to your first Swift project +--- + +# Add dependencies + +It's common for projects to depend on third-party libraries to provide additional functionality. To do so, run the following command to have the best experience editing your project: + +```bash +tuist edit +``` + +An Xcode project will open containing your project files. Edit the `Package.swift` and add the + +```swift +// swift-tools-version: 5.9 +import PackageDescription + +#if TUIST + import ProjectDescription + + let packageSettings = PackageSettings( + // Customize the product types for specific package product + // Default is .staticFramework + // productTypes: ["Alamofire": .framework,] + productTypes: [:] + ) +#endif + +let package = Package( + name: "MyApp", + dependencies: [ + // Add your own dependencies here: + // .package(url: "https://github.com/Alamofire/Alamofire", from: "5.0.0"), + // You can read more about dependencies here: https://docs.tuist.io/documentation/tuist/dependencies + .package(url: "https://github.com/onevcat/Kingfisher", .upToNextMajor(from: "7.12.0")) // [!code ++] + ] +) +``` + +Then edit the application target in your project to declare `Kingfisher` as a dependency: + +```swift +import ProjectDescription + +let project = Project( + name: "MyApp", + targets: [ + .target( + name: "MyApp", + destinations: .iOS, + product: .app, + bundleId: "io.tuist.MyApp", + infoPlist: .extendingDefault( + with: [ + "UILaunchStoryboardName": "LaunchScreen.storyboard", + ] + ), + sources: ["MyApp/Sources/**"], + resources: ["MyApp/Resources/**"], + dependencies: [ + .external(name: "Kingfisher") // [!code ++] + ] + ), + .target( + name: "MyAppTests", + destinations: .iOS, + product: .unitTests, + bundleId: "io.tuist.MyAppTests", + infoPlist: .default, + sources: ["MyApp/Tests/**"], + resources: [], + dependencies: [.target(name: "MyApp")] + ), + ] +) +``` + +Then run `tuist install` to resolve and pull the dependencies using the [Swift Package Manager](https://www.swift.org/documentation/package-manager/). + +> [!NOTE] SPM AS A DEPENDENCY RESOLVER +> Tuist recommended approach to dependencies uses the Swift Package Manager (SPM) only to resolve dependencies. Tuist then converts them into Xcode projects and targets for maximum configurability and control. + +## Visualize the project + +You can visualize the project structure by running: + +```bash +tuist graph +``` + +The command will output and open a `graph.png` file in the project's directory: + +![Project graph](./images/graph.png) + +## Use the dependency + +Run `tuist generate` to open the project in Xcode, and make the following changes to the `ContentView.swift` file: + +```swift +import SwiftUI +import Kingfisher // [!code ++] + +public struct ContentView: View { + public init() {} + + public var body: some View { + Text("Hello, World!") // [!code --] + .padding() // [!code --] + KFImage(URL(string: "https://cloud.tuist.io/images/tuist_logo_32x32@2x.png")!) // [!code ++] + } +} + + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} +``` + +Run the app from Xcode, and you should see the image loaded from the URL. \ No newline at end of file diff --git a/docs/docs/guides/quick-start/create-a-project.md b/docs/docs/guides/quick-start/create-a-project.md new file mode 100644 index 00000000000..37c9b7fb6b0 --- /dev/null +++ b/docs/docs/guides/quick-start/create-a-project.md @@ -0,0 +1,50 @@ +--- +title: Create a project +description: Learn how to create your first project with Tuist. +--- + +# Create a project + +Once you've installed Tuist, you can create a new project by running the following command: + +```bash +mkdir MyApp +cd MyApp +tuist init --name MyApp +``` + +By default it creates a project that represents an **iOS application.** The project directory will contain a `Project.swift`, which describes the project, a `Tuist/Config.swift`, which contains project-scoped Tuist configuration, and a `MyApp/` directory, which contains the source code of the application. + +To work on it in Xcode, you can generate an Xcode project by running: + +```bash +tuist generate +``` + +Note that unlike Xcode projects, which you can open and edit directly, Tuist projects are generated from a manifest file. This means that you should not edit the generated Xcode project directly. + +> [!TIP] A CONFLICT-FREE AND USER-FRIENDLY EXPERIENCE +> Xcode projects are prone to conflicts and expose a lot of intricacies to users. Tuist abstracts those away, specially in the area of managing the project's dependency graph. + +## Build the app + +Tuist provides commands for the most common tasks you'll need to perform on your project. To build the app, run: + +```bash +tuist build +``` + +Under the hood, this command uses the platform's build system (e.g. `xcodebuild`), enriching it with Tuist's features. + +## Test the app + +Similarly, you can run tests with: + +```bash +tuist test +``` + +Like the `build` command, `test` uses the platform's test runner (e.g. `xcodebuild test`), but with the added benefits of Tuist's test features and optimizations. + +> [!TIP] PASSING ARGUMENTS TO THE UNDERLYING BUILD SYSTEM +> Both `build` and `test` can take extra arguments after `--` which are forwarded to the underlying build system. \ No newline at end of file diff --git a/docs/docs/guides/quick-start/gather-insights.md b/docs/docs/guides/quick-start/gather-insights.md new file mode 100644 index 00000000000..6021b7ea18e --- /dev/null +++ b/docs/docs/guides/quick-start/gather-insights.md @@ -0,0 +1,47 @@ +--- +title: Gather insights +description: Learn how to gather insights about your project. +--- + +# Gather insights + +Tuist can integrate with a server to extend its capabilities. One of those capabilities is gathering insights about your project and builds. All you need is to have an account with a project in the server. + +First of all, you'll need to authenticate by running: + +```bash +tuist auth +``` + +## Create a project + +You can then create a project by running: + +```bash +tuist project create my-handle/MyApp + +# Tuist project my-handle/MyApp was successfully created 🎉 +``` + +Copy `my-handle/MyApp`, which represents the full handle of the project. + +## Connect projects + +After creating the project on the server, you'll have to connect it to your local project. Run `tuist edit` and edit the `Config.swift` file to include the full handle of the project: + +```swift +import ProjectDescription + +let config = Config(fullHandle: "my-handle/MyApp") +``` + +Voilà! You're now ready to gather insights about your project and builds. Run `tuist test` to run the tests reporting the results to the server. + +> [!NOTE] +> Tuist enqueues the results locally and tries to send them without blocking the command. Therefore, they might not be sent immediately after the command finishes. In CI, the results are sent immediately. + + +![An image that shows a list of runs in the server](./images/runs.png) + +Having data from your projects and builds is crucial in making informed decisions. +Tuist will continue to extend its capabilities, and you'll benefit from them without having to change your project configuration. Magic, right? 🪄 \ No newline at end of file diff --git a/docs/docs/guides/quick-start/images/cache.png b/docs/docs/guides/quick-start/images/cache.png new file mode 100644 index 0000000000000000000000000000000000000000..f9c5103fbbfed4481c5d5b3f8dadf104296127c1 GIT binary patch literal 32839 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 w%i#iWQAAMx`v(~N^# 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

    9Z5ogWSj7eRBus&D@LAL^b50H&gN{KeUt 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 HCb#|{Yh8QH literal 0 HcmV?d00001 diff --git a/docs/docs/guide/introduction/installation.md b/docs/docs/guides/quick-start/install-tuist.md similarity index 78% rename from docs/docs/guide/introduction/installation.md rename to docs/docs/guides/quick-start/install-tuist.md index b21730a9272..3cbe14b0684 100644 --- a/docs/docs/guide/introduction/installation.md +++ b/docs/docs/guides/quick-start/install-tuist.md @@ -1,11 +1,11 @@ --- -title: Installation -description: Learn how to install Tuist in local and CI environments. +title: Install Tuist +description: Learn how to install Tuist in your environment. --- -# Installation +# Install Tuist -Tuist is a [command-line application](https://en.wikipedia.org/wiki/Command-line_interface) that you need to install in your environment before you can use it. The installation consists of an executable, dynamic frameworks, and a set of resources (for example, templates). Although you could manually build Tuist from the sources, **we recommend using one of the following installation methods to ensure a valid installation.** +The Tuist CLI consists of an executable, dynamic frameworks, and a set of resources (for example, templates). Although you could manually build Tuist from [the sources](https://github.com/tuist/tuist), **we recommend using one of the following installation methods to ensure a valid installation.** ### Recommended: [Mise](https://github.com/jdx/mise) @@ -152,18 +152,4 @@ Without bash-completion, you'll need to source the completion script directly. C ```bash source ~/.bash_completions/example.bash -``` - -## Next steps - -Once the installation is complete, you can start using Tuist to manage your projects. Here are some paths you might want to explore: - -- [**Create a new project**](/guide/introduction/adopting-tuist/new-project): If you are new to Tuist and don't have a project to migrate, you can start by creating a new project. We recommend introducing Tuist as early as possible in your project's lifecycle to be prepared for future growth and avoid laborious migrations. -- [**Use it with an existing Swift Package**](/guide/introduction/adopting-tuist/swift-package): If you have a project already declared using the Swift Package Manager, you might consider this option to explore how Tuist optimizations such as [binary caching](/cloud/binary-caching) or [selective testing](/cloud/binary-caching) might impact your workflows. - - \ No newline at end of file +``` \ No newline at end of file diff --git a/docs/docs/guides/quick-start/optimize-workflows.md b/docs/docs/guides/quick-start/optimize-workflows.md new file mode 100644 index 00000000000..a3f28d804ac --- /dev/null +++ b/docs/docs/guides/quick-start/optimize-workflows.md @@ -0,0 +1,48 @@ +--- +title: Optimize workflows +description: Learn how to optimize workflows with Tuist. +--- + +# Optimize workflows + +Because Tuist knows your project through your description and the insights it collects, it can optimize your workflows to make them more efficient. Let's see some examples. + +## Smart test runs + +Let's run `tuist test` again. You'll notice the following message: + +```bash +There are no tests to run, finishing early +``` + +Tuist detected that you didn't change anything in your project since last time you ran the tests, and therefore re-running the tests is not needed. And the best of all is that this works across different machines and CI environments. + +## Cache + +If you clean build the project, which you usually do on CI or after cleaning the global cache in the hope of fixing cryptic compilation issues, you have to compile the whole project from scratch. When the project becomes large, this can take a long time. + +Tuist solves that by re-using binaries from previous builds. Run the following command: + +```bash +tuist cache +``` + +The command will build and share all the cacheable targets in your project in a local and remote cache. After it completes, try generating the project: + +```bash +tuist generate +``` + +You'll notice your project groups includes a new group `Cache` containing the binaries from the cache. + +An screenshot of a project group structure where you can see XCFrameworks in a cache group + +If you push your changes upstream to a remote repository, other developers can clone the project, and run the following commands: + +```bash +tuist install +tuist auth +tuist generate +``` + +And they'll suddenly get a project with the dependencies as binaries. \ No newline at end of file diff --git a/docs/docs/guide/introduction/adopting-tuist/migrate-from-bazel.md b/docs/docs/guides/start/migrate/bazel-project.md similarity index 96% rename from docs/docs/guide/introduction/adopting-tuist/migrate-from-bazel.md rename to docs/docs/guides/start/migrate/bazel-project.md index 201d86987cb..f89637f2eb1 100644 --- a/docs/docs/guide/introduction/adopting-tuist/migrate-from-bazel.md +++ b/docs/docs/guides/start/migrate/bazel-project.md @@ -1,12 +1,9 @@ --- -title: Migrate from Bazel +title: Migrate a Bazel project description: Learn how to migrate your projects from Bazel to Tuist. -next: - text: "Directory structure" - link: /guide/project/directory-structure --- -# Migrate from Bazel +# Migrate a Bazel project [Bazel](https://bazel.build) is a build system that Google open-sourced in 2015. It's a powerful tool that allows you to build and test software of any size, quickly and reliably. Some large organizations like [Spotify](https://engineering.atspotify.com/2023/10/switching-build-systems-seamlessly/), [Tinder](https://medium.com/tinder/bazel-hermetic-toolchain-and-tooling-migration-c244dc0d3ae), or [Lyft](https://semaphoreci.com/blog/keith-smiley-bazel) use it, however, it requires an upfront (i.e., learning the technology) and ongoing investment (i.e., keeping up with Xcode updates) to introduce and maintain. While this works for some organizations that treat it as a cross-cutting concern, it might not be the best fit for others that want to focus on their product development. For instance, we've seen organizations whose iOS platform team introduced Bazel and had to drop it after the engineers that led the effort left the company. Apple's stance on the strong coupling between Xcode and the build system is another factor that makes it hard to maintain Bazel projects over time. diff --git a/docs/docs/guide/introduction/adopting-tuist/performance-table.webp b/docs/docs/guides/start/migrate/images/performance-table.webp similarity index 100% rename from docs/docs/guide/introduction/adopting-tuist/performance-table.webp rename to docs/docs/guides/start/migrate/images/performance-table.webp diff --git a/docs/docs/guide/introduction/adopting-tuist/migrate-local-swift-packages.md b/docs/docs/guides/start/migrate/swift-package.md similarity index 79% rename from docs/docs/guide/introduction/adopting-tuist/migrate-local-swift-packages.md rename to docs/docs/guides/start/migrate/swift-package.md index fde9ccc0b8d..1251de3e358 100644 --- a/docs/docs/guide/introduction/adopting-tuist/migrate-local-swift-packages.md +++ b/docs/docs/guides/start/migrate/swift-package.md @@ -1,22 +1,17 @@ --- -title: Migrate local Swift Packages +title: Migrate a Swift Package description: Learn how to migrate from Swift Package Manager as a solution for managing your projects to Tuist projects. -next: - text: "Directory structure" - link: /guide/project/directory-structure --- -# Migrate local Swift Packages - -## Using SPM as a project management +# Migrate a Swift Package Swift Package Manager emerged as a dependency manager for Swift code that uninentionally found itself solving the problem of managing projects and supporting other programming languages like Objective-C. Because the tool was designed with a different purpose in mind, it can be challenging to use it to manage projects at scale because it lacks flexibility, performance, and power that Tuist provides. This is well captured in the [Scaling iOS at Bumble](https://medium.com/bumble-tech/scaling-ios-at-bumble-239e0fa009f2) article, which includes the following table comparing the performance of Swift Package Manager and native Xcode projects: -![A table that compares the regression in performance when using SPM over native Xcode projects](./performance-table.webp) +A table that compares the regression in performance when using SPM over native Xcode projects We often come across developers and organizations that challenge the need for Tuist considering that Swift Package Manager can take a similar project management role. Some venture into a migration to later on realize that their developer experience has degraded signicantly. For instance, the rename of a file might take up to 15 seconds to re-index. 15 seconds! -**Whether Apple will make Swift Package Manager a built-for-scale project manager is uncertain.** However, we are not seeing any signs that it's happening. In fact, we are seeing quite the opposite. They are making Xcode-inspired decisions, like achieving convenience through implicit configurations, which [as you might know,](/guide/introduction/cost-of-convenience) is the source of complications at scale. We believe it'd take Apple to go to first principles and revisit some decisions that made sense as a dependency manager but not as a project manager, for example the usage of a compiled language as an interface to define projects. +**Whether Apple will make Swift Package Manager a built-for-scale project manager is uncertain.** However, we are not seeing any signs that it's happening. In fact, we are seeing quite the opposite. They are making Xcode-inspired decisions, like achieving convenience through implicit configurations, which [as you might know,](/guides/develop/projects/cost-of-convenience) is the source of complications at scale. We believe it'd take Apple to go to first principles and revisit some decisions that made sense as a dependency manager but not as a project manager, for example the usage of a compiled language as an interface to define projects. > [!TIP] SPM AS JUST A DEPENDENCY MANAGER > Tuist treats Swift Package Manager as a dependency manager, and it's a great one. We use it to resolve dependencies and to build them. We don't use it to define projects because it's not designed for that. @@ -58,11 +53,11 @@ import ProjectDescription let config = Config() ``` -The `Config.swift` contains the configuration for your project and its directory, `Tuist`, serves as a reference to determine the root of your project. You can check out the [directory structure](/guide/project/directory-structure) document to learn more about the structure of Tuist projects. +The `Config.swift` contains the configuration for your project and its directory, `Tuist`, serves as a reference to determine the root of your project. You can check out the [directory structure](/guides/develop/projects/directory-structure) document to learn more about the structure of Tuist projects. ## Editing the project -You can use [`tuist edit`](/guide/project/editing) to edit the project in Xcode. The command will generate an Xcode project that you can open and start working on. +You can use [`tuist edit`](/guides/develop/projects/editing) to edit the project in Xcode. The command will generate an Xcode project that you can open and start working on. ```bash tuist edit diff --git a/docs/docs/guides/start/migrate/xcode-project.md b/docs/docs/guides/start/migrate/xcode-project.md new file mode 100644 index 00000000000..ff62bc4849f --- /dev/null +++ b/docs/docs/guides/start/migrate/xcode-project.md @@ -0,0 +1,221 @@ +--- +title: Migrate an Xcode project +description: Learn how to migrate an Xcode project to a Tuist project. +--- + +# Migrate an Xcode project + +Unless you [create a new project using Tuist](/guides/start/new-project), in which case you get everything configured automatically, you'll have to define your Xcode projects using Tuist's primitives. How tedious this process is, depends on how complex your projects are. + +As you probably know, Xcode projects can become messy and complex over time: groups that don't match the directory structure, files that are shared across targets, or file references that point to nonexisting files (to mention some). All that accumulated complexity makes it hard for us to provide a command that reliably migrates project. + +Moreover, manual migration is an excellent exercise to clean up and simplify your projects. Not only the developers in your project will be thankful for that, but Xcode, who will be faster processing and indexing them. Once you have fully adopted Tuist, it will make sure that projects are consistently defined and that they remain simple. + +In the aim of easing that work, we are giving you some guidelines based on the feedback that we have received from the users. + +## Create project scaffold + +First of all, create a scaffold for your project with the following Tuist files: + +::: code-group + +```js [Tuist/Config.swift] +import ProjectDescription + +let config = Config() +``` + +```js [Project.swift] +import ProjectDescription + +import ProjectDescription + +let project = Project( + name: "MyApp-Tuist", + targets: [ + /** Targets will go here **/ + ] +) +``` + +```js [Tuist/Package.swift] +// swift-tools-version: 5.9 +import PackageDescription + +#if TUIST + import ProjectDescription + + let packageSettings = PackageSettings( + // Customize the product types for specific package product + // Default is .staticFramework + // productTypes: ["Alamofire": .framework,] + productTypes: [:] + ) +#endif + +let package = Package( + name: "MyApp", + dependencies: [ + // Add your own dependencies here: + // .package(url: "https://github.com/Alamofire/Alamofire", from: "5.0.0"), + // You can read more about dependencies here: https://docs.tuist.io/documentation/tuist/dependencies + ] +) +``` +::: + +`Project.swift` is the manifest file where you'll define your project, and `Package.swift` is the manifest file where you'll define your dependencies. The `Config.swift` file is where you can define project-scoped Tuist settings for your project. + +> [!TIP] PROJECT NAME WITH -TUIST SUFFIX +> To prevent conflicts with the existing Xcode project, we recommend adding the `-Tuist` suffix to the project name. You can drop it once you've fully migrated your project to Tuist. + +## Build and test the Tuist project in CI + +To ensure the migration of each change is valid, we recommend extending your continuous integration to build and test the project generated by Tuist from your manifest file: + +```bash +tuist install +tuist generate +tuist build -- ...{xcodebuild flags} # or tuist test +``` + +## Extract the project build settings into `.xcconfig` files + +Extract the build settings from the project into an `.xcconfig` file to make the project leaner and easier to migrate. You can use the following command to extract the build settings from the project into an `.xcconfig` file: + + +```bash +mkdir -p xcconfigs/ +tuist migration settings-to-xcconfig -p MyApp.xcodeproj -x xcconfigs/MyApp-Project.xcconfig +``` + +Then update your `Project.swift` file to point to the `.xcconfig` file you've just created: + +```swift +import ProjectDescription + +let project = Project( + name: "MyApp", + settings: .settings(configurations: [ + .debug(name: "Debug", xcconfig: "./xcconfigs/MyApp-Project.xcconfig"), // [!code ++] + .debug(name: "Release", xcconfig: "./xcconfigs/MyApp-Project.xcconfig"), // [!code ++] + ]), + targets: [ + /** Targets will go here **/ + ] +) +``` + +Then extend your continuous integration pipeline to run the following command to ensure that changes to build settings are made directly to the `.xcconfig` files: + +```bash +tuist migration check-empty-settings -p Project.xcodeproj +``` + +## Extract package dependencies + +Extract all your project's dependencies into the `Tuist/Package.swift` file: + +```swift +// swift-tools-version: 5.9 +import PackageDescription + +#if TUIST + import ProjectDescription + + let packageSettings = PackageSettings( + // Customize the product types for specific package product + // Default is .staticFramework + // productTypes: ["Alamofire": .framework,] + productTypes: [:] + ) +#endif + +let package = Package( + name: "MyApp", + dependencies: [ + // Add your own dependencies here: + // .package(url: "https://github.com/Alamofire/Alamofire", from: "5.0.0"), + // You can read more about dependencies here: https://docs.tuist.io/documentation/tuist/dependencies + .package(url: "https://github.com/onevcat/Kingfisher", .upToNextMajor(from: "7.12.0")) // [!code ++] + ] +) +``` + +> [!TIP] PRODUCT TYPES +> You can override the product type for a specific package by adding it to the `productTypes` dictionary in the `PackageSettings` struct. By default, Tuist assumes that all packages are static frameworks. + + +## Determine the migration order + +We recommend migrating the targets from the one that is the most dependent upon to the least. You can use the following command to list the targets of a project, sorted by the number of dependencies: + +```bash +tuist migration list-targets -p Project.xcodeproj +``` + +Start migrating the targets from the top of the list, as they are the ones that are the most depended upon. + + +## Migrate targets + +Migrate the targets one by one. We recommend doing a pull request for each target to ensure that the changes are reviewed and tested before merging them. + +### Extract the target build settings into `.xcconfig` files + +Like you did with the project build settings, extract the target build settings into an `.xcconfig` file to make the target leaner and easier to migrate. You can use the following command to extract the build settings from the target into an `.xcconfig` file: + +```bash +tuist migration settings-to-xcconfig -p MyApp.xcodeproj -t TargetX -x xcconfigs/TargetX.xcconfig +``` + +### Define the target in the `Project.swift` file + +Define the target in `Project.targets`: + +```swift +import ProjectDescription + +let project = Project( + name: "MyApp", + settings: .settings(configurations: [ + .debug(name: "Debug", xcconfig: "./xcconfigs/Project.xcconfig"), + .debug(name: "Release", xcconfig: "./xcconfigs/Project.xcconfig"), + ]), + targets: [ + .target( // [!code ++] + name: "TargetX", // [!code ++] + destinations: .iOS, // [!code ++] + product: .framework, // [!code ++] // or .staticFramework, .staticLibrary... + bundleId: "io.tuist.targetX", // [!code ++] + sources: ["Sources/TargetX/**"], // [!code ++] + dependencies: [ // [!code ++] + /** Dependencies go here **/ // [!code ++] + /** .external(name: "Kingfisher") **/ // [!code ++] + /** .target(name: "OtherProjectTarget") **/ // [!code ++] + ], // [!code ++] + settings: .settings(configurations: [ // [!code ++] + .debug(name: "Debug", xcconfig: "./xcconfigs/TargetX.xcconfig"), // [!code ++] + .debug(name: "Release", xcconfig: "./xcconfigs/TargetX.xcconfig"), // [!code ++] + ]) // [!code ++] + ), // [!code ++] + ] +) +``` + +> [!NOTE] TEST TARGETS +> If the target has an associated test target, you should define it in the `Project.swift` file as well repeating the same steps. + +### Validate the target migration + +Run `tuist build` and `tuist test` to ensure the project builds and tests pass. Additionally, you can use [xcdiff](https://github.com/bloomberg/xcdiff) to compare the generated Xcode project with the existing one to ensure that the changes are correct. + +### Repeat + +Repeat until all the targets are fully migrated. Once you are done, we recommend updating your CI and CD pipelines to build and test the project using `tuist build` and `tuist test` commands to benefit from the speed and reliability that Tuist provides. + +## Troubleshooting + +### Compilation errors due to missing files. + +If the files associated to your Xcode project targets were not all contained in a file-system directory representing the target, you might end up with a project that doesn't compile. Make sure the list of files after generating the project with Tuist matches the list of files in the Xcode project, and take the opportunity to align the file structure with the target structure. diff --git a/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodegen.md b/docs/docs/guides/start/migrate/xcodegen-project.md similarity index 88% rename from docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodegen.md rename to docs/docs/guides/start/migrate/xcodegen-project.md index 31ba7ecccc3..754cc1cc3de 100644 --- a/docs/docs/guide/introduction/adopting-tuist/migrate-from-xcodegen.md +++ b/docs/docs/guides/start/migrate/xcodegen-project.md @@ -1,12 +1,9 @@ --- -title: Migrate from XcodeGen +title: Migrate an XcodeGen project description: Learn how to migrate your projects from XcodeGen to Tuist. -next: - text: "Directory structure" - link: /guide/project/directory-structure --- -# Migrate from XcodeGen +# Migrate an XcodeGen project [XcodeGen](https://github.com/yonaskolb/XcodeGen) is a project-generation tool that uses YAML as [a configuration format](https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md) to define Xcode projects. Many organizations **adopted it trying to escape from the frequent Git conflicts that arise when working with Xcode projects.** However, frequent Git conflicts is just one of the many problems that organizations experience. Xcode exposes developers with a lot of intricacies and implicit configurations that make it hard to maintain and optimize projects at scale. XcodeGen falls short there by design because it's a tool that generates Xcode projects, not a project manager. If you need a tool that helps you beyond generating Xcode projects, you might want to consider Tuist. @@ -57,7 +54,7 @@ XcodeGen's `project.yaml` description file becomes `Project.swift`. Moreover, yo ## Spec templates -One of the disadvantages of YAML as a language for project configuration is that it doesn't support reusability across YAML files out of the box. This is a common need when describing projects, which XcodeGen had to solve with their own propietary solution named *"templates"*. With Tuist's re-usability is built into the language itself, Swift, and through a Swift module named [project description helpers](/guide/project/code-sharing), which allow reusing code across all your manifest files. +One of the disadvantages of YAML as a language for project configuration is that it doesn't support reusability across YAML files out of the box. This is a common need when describing projects, which XcodeGen had to solve with their own propietary solution named *"templates"*. With Tuist's re-usability is built into the language itself, Swift, and through a Swift module named [project description helpers](/guides/develop/projects/code-sharing), which allow reusing code across all your manifest files. ::: code-group ```swift [Tuist/ProjectDescriptionHelpers/Target+Features.swift] @@ -78,7 +75,4 @@ import ProjectDescriptionHelpers // [!code highlight] let project = Project(name: "MyProject", targets: Target.featureTargets(name: "MyFeature")) // [!code highlight] -``` - -> [!NOTE] XCODEPROJGENERATOR -> We have plans to extract the project generation logic from Tuist into its own Swift Package, `XcodeProjGenerator`, which anyone can build their own generation tool on top of. +``` \ No newline at end of file diff --git a/docs/docs/guide/introduction/adopting-tuist/new-project.md b/docs/docs/guides/start/new-project.md similarity index 87% rename from docs/docs/guide/introduction/adopting-tuist/new-project.md rename to docs/docs/guides/start/new-project.md index 916e04c43f2..1ff3f61a8f1 100644 --- a/docs/docs/guide/introduction/adopting-tuist/new-project.md +++ b/docs/docs/guides/start/new-project.md @@ -1,9 +1,6 @@ --- title: Create a new project description: Learn how to create a new project with Tuist. -next: - text: "Directory structure" - link: /guide/project/directory-structure --- # Create a new project @@ -30,7 +27,7 @@ tuist init --platform macos ``` ::: -The command will initialize the project in the current directory. You can then [edit the project](/guide/project/editing) running `tuist edit`, and Xcode will open a project where you can edit the project. One of the files that are generated is the `Project.swift`, which contains the definition of your project. If you are familiar with the Swift Package Manager, think of it as the `Package.swift` but with the lingo of Xcode projects. +The command will initialize the project in the current directory. You can then [edit the project](/guides/develop/projects/editing) running `tuist edit`, and Xcode will open a project where you can edit the project. One of the files that are generated is the `Project.swift`, which contains the definition of your project. If you are familiar with the Swift Package Manager, think of it as the `Package.swift` but with the lingo of Xcode projects. ::: code-group diff --git a/docs/docs/guides/start/swift-package.md b/docs/docs/guides/start/swift-package.md new file mode 100644 index 00000000000..9b8b5de79bf --- /dev/null +++ b/docs/docs/guides/start/swift-package.md @@ -0,0 +1,38 @@ +--- +title: Use Tuist with a Swift Package +description: Learn how to use Tuist with a Swift Package. +--- + +# Using Tuist with a Swift Package + +Tuist supports using `Package.swift` as a DSL for your projects and it converts your package targets into a native Xcode project and targets. + +> [!WARNING] +> The aim of this feature is to provide an easy way for developers to assess the impact of adopting Tuist in their Swift Packages. Therefore, we don't plan to support the full range of Swift Package Manager features nor to bring every Tuist's unique features like [project description helpers](/guides/develop/projects/code-sharing) to the packages world. + +> [!NOTE] ROOT DIRECTORY +> Tuist commands expect a certain [directory structure](/guides/develop/projects/directory-structure#standard-tuist-projects) whose root is identified by a `Tuist` or a `.git` directory. + +## Using Tuist with a Swift Package + +We are going to use Tuist with the [TootSDK Package](https://github.com/TootSDK/TootSDK) repository, which contains a Swift Package. The first thing that we need to do is to clone the repository: + +```bash +git clone https://github.com/TootSDK/TootSDK +cd TootSDK +``` + +Once in the repository's directory, we need to install the Swift Package Manager dependencies: + +```bash +tuist install +``` + +Under the hood `tuist install` uses the Swift Package Manager to resolve and pull the dependencies of the package. +After the resolution completes, you can then generate the project: + +```bash +tuist generate +``` + +Voilà! You have a native Xcode project that you can open and start working on. \ No newline at end of file diff --git a/docs/docs/index.md b/docs/docs/index.md index 7ef878d4bfd..1398962f512 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -1,128 +1,25 @@ --- -title: What is Tuist? +title: Tuist description: Learn about Tuist, a tool that simplifies the complexities of modularization, optimizes workflows, and democratizes the evolution of Xcode projects. --- - +# Tuist -

    +In the world of app development, particularly for platforms like Apple's, organizations often encounter **productivity roadblocks.** These can include sluggish compilation times, unreliable tests, and intricate automation workflows that drain resources. Traditionally, companies address these issues by forming dedicated platform teams. These specialists maintain codebase health and integrity, freeing other developers to focus on feature creation. However, this approach can be expensive and risky, as the departure of key team members can severely impact productivity. -As Xcode projects expand, **organizations may face a decline in productivity** due to several factors, including unreliable incremental builds, frequent clearing of Xcode's global cache by developers encountering issues, and fragile project configurations. To maintain rapid feature development, organizations typically explore various strategies. +**Tuist is a toolchain designed to accelerate and enhance app development.** We integrate seamlessly with official tools and systems, meeting developers in familiar territory. By shouldering the burden of tool and system integration, we enable teams to channel their energy into feature development and improving the overall developer experience. In essence, Tuist serves as your virtual platform team. We're with you every step of the way - from the spark of an app idea to its user launch - tackling challenges as they arise. -Some organizations choose to bypass the compiler by abstracting the platform using JavaScript-based dynamic runtimes, such as [React Native](https://reactnative.dev/). While this approach may be effective, it [complicates access to the platform's native features](https://shopify.engineering/building-app-clip-react-native). Other organizations opt for **modularizing the codebase**, which helps establish clear boundaries, making the codebase easier to work with and improving the reliability of build times. However, the Xcode project format is not designed for modularity and results in implicit configurations that few understand and frequent conflicts. This leads to a bad bus factor, and although incremental builds may improve, developers might still frequently clear Xcode's build cache (i.e., derived data) when builds fail. To address this, some organizations choose to **abandon Xcode's build system** and adopt alternatives like [Buck](https://buck.build/) or [Bazel](https://bazel.build/). However, this comes with a [high complexity and maintenance burden](https://bazel.build/migrate/xcode) (e.g., Xcode updates might disrupt the integration with Bazel, which is ultimately a hack). +Tuist is comprised of **a [CLI](https://github.com/tuist/tuist)**, which is the main entry point for developers, and a server that the CLI integrates with to persist state and integrate with other publicly available services. Note that the features that require with the server might require a subscription. -::: tip The cost of convenience -Xcode's design optimizes for the convenience of small projects and often achieves this through implicit configurations. Implicitness resolved at build-time, while great at small scale, lead to unpredictable and unreliable builds and Xcode behavior at scale, and difficult optimizations. -::: -## Tuist +## Why would I use Tuist? -[Tuist](https://tuist.io) is a viable alternative that aids in surmounting these challenges while maintaining complexity and costs at an acceptable level. It considers Xcode projects as a fundamental element, ensuring resilience against future Xcode updates, and utilizes Xcode project generation to offer teams a modularization-focused declarative API. Tuist uses the project declaration to **simplify the complexities of modularization**, **optimize workflows** like build or test across various environments, and facilitate and **democratize the evolution of Xcode projects**. +Why choose Tuist? Here are compelling reasons: -## Project generation as a foundation +- **Simplify modularization:** As projects grow and span multiple platforms, modularization becomes crucial. Tuist streamlines this complexity, offering tools to optimize and better understand your project's structure. +- **Optimize workflows:** Leveraging project information, Tuist enhances efficiency through selective test execution and deterministic binary reuse across builds. +- **Foster healthy project evolution:** We provide insights into your project's dynamics and expert guidance for informed decision-making. This approach prevents the frustration and productivity loss associated with unhealthy projects, which can lead to developer attrition and missed business goals. +- **Replace costly platform teams:** Instead of investing in expensive, potentially risky in-house platform teams, let Tuist be your virtual expert. We offer consistent support without the vulnerabilities of relying on key individuals. +- **Break down silos:** Unlike platform-specific ecosystems (e.g., Xcode's contained environment), Tuist offers web-centric experiences and integrates seamlessly with popular tools like Slack, Prometheus, and GitHub, enhancing cross-tool collaboration. -Xcode, its underlying build system, and the structure of Xcode projects are closely intertwined, often leading to inflexibility. This intrinsic design leaves developers with few avenues to address the inherent challenges presented by Apple. One such solution has been **project generation**, a method initially pioneered by [CocoaPods](https://cocoapods.org) to introduce dependency management into the Objective-C ecosystem. - -Tuist also adopts project generation, which might suggest that this approach is its primary objective. Indeed, many development teams have turned to project generation to mitigate the long-standing issue of team collaboration-induced conflicts. But for Tuist, **project generation isn't the endgame**. Instead, it serves as a foundational tool to tackle a broader range of challenges, including: - -- How can developers modify the modular structure of a project with assurance against runtime errors, ensuring it aligns with team best practices? -- What's the best way to add or remove targets from the dependency graph without worrying about the ripple effects on the graph, such as dynamically copying frameworks into bundles? -- How can developers decouple the time of tasks—like coding, building, and testing—from the overall size of the project? -- How can teams ensure the sustained health and integrity of the project, cultivating a conducive environment for developers? - -Tuist offers answers to these questions, leveraging the power of project generation. It encapsulates years of insights gathered from diverse Xcode projects, positioning itself as an invaluable ally for your platform team. - -## How does it work? - -To get started with Tuist, all you need is to define your project using **Tuist's Domain Specific Language (DSL)**. This entails using manifest files such as `Workspace.swift` or `Project.swift`. If you've worked with the Swift Package Manager before, the approach is very similar. - -Once you've defined your project, Tuist offers various workflows to manage and interact with it: - -- **Generate:** This is a foundational workflow. Use it to create an Xcode project that's compatible with Xcode. -- **Build:** This workflow not only generates the Xcode project but also employs `xcodebuild` to compile it. -- **Test:** Operating much like the build workflow, this not only generates the Xcode project but utilizes `xcodebuild` to test it. - -Additionally, Tuist offers a suite of optimizations, [Tuist Cloud](/cloud/what-is-cloud). These include **target-focused project generation**, the ability to swap out targets and dependencies with their **binary** equivalents, and ensuring build and test incrementality across different environments (e.g., local machine vs. CI). Plus, it provides actionable insights to guide teams in making informed choices. - -> [!TIP] -> Tuist's optimizations and insights stem from the knowledge gained from your project's manifest files. To ensure teams remain productive, data-backed decisions are essential—something Xcode doesn't offer. As a result, teams often operate without clear insights, unsure if their choices benefit the project. - -## Frequently asked questions - -### How does Tuist compare to... -
    - -#### Swift Package Manager - -While the Swift Package Manager (SPM) primarily focuses on dependencies, Tuist offers a different approach. With Tuist, you don't just define packages for SPM integration; you shape your projects using familiar concepts like projects, workspaces, targets, and schemes. - -#### XcodeGen - -[XcodeGen](https://github.com/yonaskolb/XcodeGen) is a dedicated project generator designed to reduce conflicts in collaborative Xcode projects and simplify some complexities of Xcode's internal workings. However, projects are defined using serializable formats like [YAML](https://yaml.org/). Unlike Swift, this doesn't allow developers to build upon abstractions or checks without incorporating additional tools. While XcodeGen does offer a way to map dependencies to an internal representation for validation and optimization, it still exposes developers to the nuances of Xcode. This might make XcodeGen a suitable foundation for [building tools](https://github.com/MobileNativeFoundation/rules_xcodeproj), as seen in the Bazel community, but it's not optimal for inclusive project evolution that aims to maintain a healthy and productive environment. - -#### Bazel - -[Bazel](https://bazel.build) is an advanced build system renowned for its remote caching features, gaining popularity within the Swift community primarily for this capability. However, given the limited extensibility of Xcode and its build system, substituting it with Bazel's system demands significant effort and maintenance. Only a few companies with abundant resources can bear this overhead, as evident from the select list of firms investing heavily to integrate Bazel with Xcode. Interestingly, the community created a [tool](https://github.com/MobileNativeFoundation/rules_xcodeproj) that employs Bazel's XcodeGen to generate an Xcode project. This results in a convoluted chain of conversions: from Bazel files to XcodeGen YAML and finally to Xcode Projects. Such layered indirection often complicates troubleshooting, making issues more challenging to diagnose and resolve. - -### What if the tool is deprecated at some point? - -Rest assured, if any issues arise, you can simply add the Xcode projects and workspaces to the version control system to resolve them. One of Tuist's core design principles is to align closely with Xcode and industry standards. Notably, the generated projects are independent, with no ties or references to Tuist. - -### Should I gitignore my projects? - -The choice is yours. By adding .xcodeproj and .xcworkspace files to your .gitignore, you can avoid many git conflicts. We suggest initially migrating the project to Tuist. After ensuring everything functions smoothly, guide your team on using tuist generate before they start working on a project. Once this becomes a routine, you can safely add those projects to .gitignore without any issues. - - +If you want to know more about Tuist, the project, and the company, you can check out our [handbook](https://handbook.tuist.io/), which contains detailed information about our vision, values, and the team behind Tuist. diff --git a/docs/docs/reference/cli/[command].md b/docs/docs/references/cli/[command].md similarity index 100% rename from docs/docs/reference/cli/[command].md rename to docs/docs/references/cli/[command].md diff --git a/docs/docs/reference/cli/[command].paths.js b/docs/docs/references/cli/[command].paths.js similarity index 100% rename from docs/docs/reference/cli/[command].paths.js rename to docs/docs/references/cli/[command].paths.js diff --git a/docs/docs/reference/cli/commands.data.js b/docs/docs/references/cli/commands.data.js similarity index 100% rename from docs/docs/reference/cli/commands.data.js rename to docs/docs/references/cli/commands.data.js diff --git a/docs/docs/reference/examples/[example].md b/docs/docs/references/examples/[example].md similarity index 100% rename from docs/docs/reference/examples/[example].md rename to docs/docs/references/examples/[example].md diff --git a/docs/docs/reference/examples/[example].paths.js b/docs/docs/references/examples/[example].paths.js similarity index 100% rename from docs/docs/reference/examples/[example].paths.js rename to docs/docs/references/examples/[example].paths.js diff --git a/docs/docs/reference/examples/examples.data.js b/docs/docs/references/examples/examples.data.js similarity index 100% rename from docs/docs/reference/examples/examples.data.js rename to docs/docs/references/examples/examples.data.js diff --git a/docs/docs/guide/introduction/from-v3-to-v4.md b/docs/docs/references/migrations/from-v3-to-v4.md similarity index 97% rename from docs/docs/guide/introduction/from-v3-to-v4.md rename to docs/docs/references/migrations/from-v3-to-v4.md index 10393e69046..3ef76f3e0b3 100644 --- a/docs/docs/guide/introduction/from-v3-to-v4.md +++ b/docs/docs/references/migrations/from-v3-to-v4.md @@ -1,6 +1,6 @@ --- title: From v3 to v4 -description: This page documents how to migrate your project from using Tuist 3 to Tuist 4 +description: This page documents how to migrate the Tuist CLI from the version 3 to version 4. --- # From Tuist v3 to v4 @@ -22,7 +22,7 @@ curl -Ls https://uninstall.tuist.io | bash > If you decide to embrace the determinism that Mise brings across the board, we recommend checking out the documentation for how to use Mise in [CI environments](https://mise.jdx.dev/continuous-integration.html) and [Xcode projects](https://mise.jdx.dev/ide-integration.html#xcode). > [!NOTE] HOMEBREW IS SUPPORTED -> Note that you can still install Tuist using Homebrew, which is a popular package manager for macOS. You can find the instructions on how to install Tuist using Homebrew in the [installation guide](/guide/introduction/installation#alternative-homebrew). +> Note that you can still install Tuist using Homebrew, which is a popular package manager for macOS. You can find the instructions on how to install Tuist using Homebrew in the [installation guide](/guides/quick-start/install-tuist#alternative-homebrew). ### Dropped `init` constructors from `ProjectDescription` models @@ -41,7 +41,7 @@ We renamed the `tuist fetch` command to `tuist install` to align with the indust ### [Adopt `Package.swift` as the DSL for dependencies](https://github.com/tuist/tuist/pull/5862) -Before Tuist 4, you could define dependencies in a `Dependencies.swift` file. This proprietary format broke the support in tools like [Dependabot](https://github.com/dependabot) or [Renovatebot](https://github.com/renovatebot/renovate) to automatically update dependencies. Moreover, it introduced unnecessary indirections for users. Therefore, we decided to embrace `Package.swift` as the only way to define dependencies in Tuist. If you were using the `Dependencies.swift` file, you'll have to move the content from your `Tuist/Dependencies.swift` to a `Package.swift` at the root, and use the `#if TUIST` directive to configure the integration. You can read more about how to integrate Swift Package dependencies [here](/guide/project/dependencies.html#swift-packages) +Before Tuist 4, you could define dependencies in a `Dependencies.swift` file. This proprietary format broke the support in tools like [Dependabot](https://github.com/dependabot) or [Renovatebot](https://github.com/renovatebot/renovate) to automatically update dependencies. Moreover, it introduced unnecessary indirections for users. Therefore, we decided to embrace `Package.swift` as the only way to define dependencies in Tuist. If you were using the `Dependencies.swift` file, you'll have to move the content from your `Tuist/Dependencies.swift` to a `Package.swift` at the root, and use the `#if TUIST` directive to configure the integration. You can read more about how to integrate Swift Package dependencies [here](/guides/develop/projects/dependencies#swift-packages) ### Renamed `tuist cache warm` to `tuist cache` diff --git a/docs/docs/reference/project-description/[identifier].md b/docs/docs/references/project-description/[identifier].md similarity index 100% rename from docs/docs/reference/project-description/[identifier].md rename to docs/docs/references/project-description/[identifier].md diff --git a/docs/docs/reference/project-description/[identifier].paths.js b/docs/docs/references/project-description/[identifier].paths.js similarity index 100% rename from docs/docs/reference/project-description/[identifier].paths.js rename to docs/docs/references/project-description/[identifier].paths.js diff --git a/docs/docs/reference/project-description/types.data.js b/docs/docs/references/project-description/types.data.js similarity index 100% rename from docs/docs/reference/project-description/types.data.js rename to docs/docs/references/project-description/types.data.js diff --git a/docs/package.json b/docs/package.json index 52eae3b1613..4bfd55e1c7a 100644 --- a/docs/package.json +++ b/docs/package.json @@ -6,9 +6,9 @@ "devDependencies": { "execa": "^8.0.1", "fast-glob": "^3.3.2", - "vitepress": "^1.0.1", - "vue": "^3.4.27", - "wrangler": "^3.37.0" + "vitepress": "^1.3.1", + "vue": "^3.4.31", + "wrangler": "^3.64.0" }, "scripts": { "dev": "vitepress dev", @@ -16,4 +16,4 @@ "preview": "vitepress preview", "deploy": "vitepress build && wrangler pages deploy .vitepress/dist --project-name tuist-docs-next --branch main" } -} \ No newline at end of file +} diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index cf9220b5fde..56b507fc734 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -12,202 +12,203 @@ devDependencies: specifier: ^3.3.2 version: 3.3.2 vitepress: - specifier: ^1.0.1 - version: 1.0.2(@algolia/client-search@4.23.2)(search-insights@2.13.0) + specifier: ^1.3.1 + version: 1.3.1(@algolia/client-search@4.24.0)(search-insights@2.15.0) vue: - specifier: ^3.4.27 - version: 3.4.27 + specifier: ^3.4.31 + version: 3.4.31 wrangler: - specifier: ^3.37.0 - version: 3.43.0 + specifier: ^3.64.0 + version: 3.64.0 packages: - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)(search-insights@2.13.0): + /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.15.0): resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)(search-insights@2.13.0) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2) + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.15.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights dev: true - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)(search-insights@2.13.0): + /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.15.0): resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} peerDependencies: search-insights: '>= 1 < 3' dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2) - search-insights: 2.13.0 + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) + search-insights: 2.15.0 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch dev: true - /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2): + /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0): resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2) - '@algolia/client-search': 4.23.2 - algoliasearch: 4.23.2 + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) + '@algolia/client-search': 4.24.0 + algoliasearch: 4.24.0 dev: true - /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2): + /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0): resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/client-search': 4.23.2 - algoliasearch: 4.23.2 + '@algolia/client-search': 4.24.0 + algoliasearch: 4.24.0 dev: true - /@algolia/cache-browser-local-storage@4.23.2: - resolution: {integrity: sha512-PvRQdCmtiU22dw9ZcTJkrVKgNBVAxKgD0/cfiqyxhA5+PHzA2WDt6jOmZ9QASkeM2BpyzClJb/Wr1yt2/t78Kw==} + /@algolia/cache-browser-local-storage@4.24.0: + resolution: {integrity: sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==} dependencies: - '@algolia/cache-common': 4.23.2 + '@algolia/cache-common': 4.24.0 dev: true - /@algolia/cache-common@4.23.2: - resolution: {integrity: sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw==} + /@algolia/cache-common@4.24.0: + resolution: {integrity: sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==} dev: true - /@algolia/cache-in-memory@4.23.2: - resolution: {integrity: sha512-rfbi/SnhEa3MmlqQvgYz/9NNJ156NkU6xFxjbxBtLWnHbpj+qnlMoKd+amoiacHRITpajg6zYbLM9dnaD3Bczw==} + /@algolia/cache-in-memory@4.24.0: + resolution: {integrity: sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==} dependencies: - '@algolia/cache-common': 4.23.2 + '@algolia/cache-common': 4.24.0 dev: true - /@algolia/client-account@4.23.2: - resolution: {integrity: sha512-VbrOCLIN/5I7iIdskSoSw3uOUPF516k4SjDD4Qz3BFwa3of7D9A0lzBMAvQEJJEPHWdVraBJlGgdJq/ttmquJQ==} + /@algolia/client-account@4.24.0: + resolution: {integrity: sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==} dependencies: - '@algolia/client-common': 4.23.2 - '@algolia/client-search': 4.23.2 - '@algolia/transporter': 4.23.2 + '@algolia/client-common': 4.24.0 + '@algolia/client-search': 4.24.0 + '@algolia/transporter': 4.24.0 dev: true - /@algolia/client-analytics@4.23.2: - resolution: {integrity: sha512-lLj7irsAztGhMoEx/SwKd1cwLY6Daf1Q5f2AOsZacpppSvuFvuBrmkzT7pap1OD/OePjLKxicJS8wNA0+zKtuw==} + /@algolia/client-analytics@4.24.0: + resolution: {integrity: sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==} dependencies: - '@algolia/client-common': 4.23.2 - '@algolia/client-search': 4.23.2 - '@algolia/requester-common': 4.23.2 - '@algolia/transporter': 4.23.2 + '@algolia/client-common': 4.24.0 + '@algolia/client-search': 4.24.0 + '@algolia/requester-common': 4.24.0 + '@algolia/transporter': 4.24.0 dev: true - /@algolia/client-common@4.23.2: - resolution: {integrity: sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g==} + /@algolia/client-common@4.24.0: + resolution: {integrity: sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==} dependencies: - '@algolia/requester-common': 4.23.2 - '@algolia/transporter': 4.23.2 + '@algolia/requester-common': 4.24.0 + '@algolia/transporter': 4.24.0 dev: true - /@algolia/client-personalization@4.23.2: - resolution: {integrity: sha512-vwPsgnCGhUcHhhQG5IM27z8q7dWrN9itjdvgA6uKf2e9r7vB+WXt4OocK0CeoYQt3OGEAExryzsB8DWqdMK5wg==} + /@algolia/client-personalization@4.24.0: + resolution: {integrity: sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==} dependencies: - '@algolia/client-common': 4.23.2 - '@algolia/requester-common': 4.23.2 - '@algolia/transporter': 4.23.2 + '@algolia/client-common': 4.24.0 + '@algolia/requester-common': 4.24.0 + '@algolia/transporter': 4.24.0 dev: true - /@algolia/client-search@4.23.2: - resolution: {integrity: sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw==} + /@algolia/client-search@4.24.0: + resolution: {integrity: sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==} dependencies: - '@algolia/client-common': 4.23.2 - '@algolia/requester-common': 4.23.2 - '@algolia/transporter': 4.23.2 + '@algolia/client-common': 4.24.0 + '@algolia/requester-common': 4.24.0 + '@algolia/transporter': 4.24.0 dev: true - /@algolia/logger-common@4.23.2: - resolution: {integrity: sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw==} + /@algolia/logger-common@4.24.0: + resolution: {integrity: sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==} dev: true - /@algolia/logger-console@4.23.2: - resolution: {integrity: sha512-oo+lnxxEmlhTBTFZ3fGz1O8PJ+G+8FiAoMY2Qo3Q4w23xocQev6KqDTA1JQAGPDxAewNA2VBwWOsVXeXFjrI/Q==} + /@algolia/logger-console@4.24.0: + resolution: {integrity: sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==} dependencies: - '@algolia/logger-common': 4.23.2 + '@algolia/logger-common': 4.24.0 dev: true - /@algolia/recommend@4.23.2: - resolution: {integrity: sha512-Q75CjnzRCDzgIlgWfPnkLtrfF4t82JCirhalXkSSwe/c1GH5pWh4xUyDOR3KTMo+YxxX3zTlrL/FjHmUJEWEcg==} + /@algolia/recommend@4.24.0: + resolution: {integrity: sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==} dependencies: - '@algolia/cache-browser-local-storage': 4.23.2 - '@algolia/cache-common': 4.23.2 - '@algolia/cache-in-memory': 4.23.2 - '@algolia/client-common': 4.23.2 - '@algolia/client-search': 4.23.2 - '@algolia/logger-common': 4.23.2 - '@algolia/logger-console': 4.23.2 - '@algolia/requester-browser-xhr': 4.23.2 - '@algolia/requester-common': 4.23.2 - '@algolia/requester-node-http': 4.23.2 - '@algolia/transporter': 4.23.2 + '@algolia/cache-browser-local-storage': 4.24.0 + '@algolia/cache-common': 4.24.0 + '@algolia/cache-in-memory': 4.24.0 + '@algolia/client-common': 4.24.0 + '@algolia/client-search': 4.24.0 + '@algolia/logger-common': 4.24.0 + '@algolia/logger-console': 4.24.0 + '@algolia/requester-browser-xhr': 4.24.0 + '@algolia/requester-common': 4.24.0 + '@algolia/requester-node-http': 4.24.0 + '@algolia/transporter': 4.24.0 dev: true - /@algolia/requester-browser-xhr@4.23.2: - resolution: {integrity: sha512-TO9wLlp8+rvW9LnIfyHsu8mNAMYrqNdQ0oLF6eTWFxXfxG3k8F/Bh7nFYGk2rFAYty4Fw4XUtrv/YjeNDtM5og==} + /@algolia/requester-browser-xhr@4.24.0: + resolution: {integrity: sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==} dependencies: - '@algolia/requester-common': 4.23.2 + '@algolia/requester-common': 4.24.0 dev: true - /@algolia/requester-common@4.23.2: - resolution: {integrity: sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q==} + /@algolia/requester-common@4.24.0: + resolution: {integrity: sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==} dev: true - /@algolia/requester-node-http@4.23.2: - resolution: {integrity: sha512-SVzgkZM/malo+2SB0NWDXpnT7nO5IZwuDTaaH6SjLeOHcya1o56LSWXk+3F3rNLz2GVH+I/rpYKiqmHhSOjerw==} + /@algolia/requester-node-http@4.24.0: + resolution: {integrity: sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==} dependencies: - '@algolia/requester-common': 4.23.2 + '@algolia/requester-common': 4.24.0 dev: true - /@algolia/transporter@4.23.2: - resolution: {integrity: sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q==} + /@algolia/transporter@4.24.0: + resolution: {integrity: sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==} dependencies: - '@algolia/cache-common': 4.23.2 - '@algolia/logger-common': 4.23.2 - '@algolia/requester-common': 4.23.2 + '@algolia/cache-common': 4.24.0 + '@algolia/logger-common': 4.24.0 + '@algolia/requester-common': 4.24.0 dev: true - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + /@babel/helper-string-parser@7.24.8: + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + /@babel/helper-validator-identifier@7.24.7: + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} dev: true - /@babel/parser@7.24.6: - resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + /@babel/parser@7.24.8: + resolution: {integrity: sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.9 dev: true - /@babel/types@7.24.0: - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + /@babel/types@7.24.9: + resolution: {integrity: sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 dev: true - /@cloudflare/kv-asset-handler@0.3.1: - resolution: {integrity: sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA==} + /@cloudflare/kv-asset-handler@0.3.4: + resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} + engines: {node: '>=16.13'} dependencies: mime: 3.0.0 dev: true - /@cloudflare/workerd-darwin-64@1.20240329.0: - resolution: {integrity: sha512-/raHmsHrYjoC5am84wqyiZIDCRrrYN6YDFb4zchwWQzJ0ZHleUeY6IzNdjujrS/gYey/+Db9oyl2PD1xAZt4gA==} + /@cloudflare/workerd-darwin-64@1.20240701.0: + resolution: {integrity: sha512-XAZa4ZP+qyTn6JQQACCPH09hGZXP2lTnWKkmg5mPwT8EyRzCKLkczAf98vPP5bq7JZD/zORdFWRY0dOTap8zTQ==} engines: {node: '>=16'} cpu: [x64] os: [darwin] @@ -215,8 +216,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-darwin-arm64@1.20240329.0: - resolution: {integrity: sha512-3wnwVdfFDt+JUhlA6NWW+093ryGNF0HMuBmkOh0PG6j4GMRH8Y+EDsqzqrzT3ZoGGXbI9x1H7k15VKb3LAN/KA==} + /@cloudflare/workerd-darwin-arm64@1.20240701.0: + resolution: {integrity: sha512-w80ZVAgfH4UwTz7fXZtk7KmS2FzlXniuQm4ku4+cIgRTilBAuKqjpOjwUCbx5g13Gqcm9NuiHce+IDGtobRTIQ==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] @@ -224,8 +225,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-64@1.20240329.0: - resolution: {integrity: sha512-E909ZIXgjdr2iuq5bF/vq02elizDlPQoYRiKojdvODC7w8rbnpwnuptajS4xK5kmKh4XBiU2o9NDhut/W1kfyw==} + /@cloudflare/workerd-linux-64@1.20240701.0: + resolution: {integrity: sha512-UWLr/Anxwwe/25nGv451MNd2jhREmPt/ws17DJJqTLAx6JxwGWA15MeitAIzl0dbxRFAJa+0+R8ag2WR3F/D6g==} engines: {node: '>=16'} cpu: [x64] os: [linux] @@ -233,8 +234,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-arm64@1.20240329.0: - resolution: {integrity: sha512-PELA3FVW75pKchsSI5o40oiClFY2Uiq+KUx/f/srwz2pIJoM5YWLmFrv+s8feKoEwuabxIGSzHxy7QA++HyprQ==} + /@cloudflare/workerd-linux-arm64@1.20240701.0: + resolution: {integrity: sha512-3kCnF9kYgov1ggpuWbgpXt4stPOIYtVmPCa7MO2xhhA0TWP6JDUHRUOsnmIgKrvDjXuXqlK16cdg3v+EWsaPJg==} engines: {node: '>=16'} cpu: [arm64] os: [linux] @@ -242,8 +243,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-windows-64@1.20240329.0: - resolution: {integrity: sha512-/T+AcjVqTuqAeGBQmjAF4TOTm8sv3BSO/NtUPa1ghCvsp1sb03L6/c3wFc9ZonSdRYeBb0XDX7PnenGCvjr/Tw==} + /@cloudflare/workerd-windows-64@1.20240701.0: + resolution: {integrity: sha512-6IPGITRAeS67j3BH1rN4iwYWDt47SqJG7KlZJ5bB4UaNAia4mvMBSy/p2p4vA89bbXoDRjMtEvRu7Robu6O7hQ==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -262,11 +263,11 @@ packages: resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} dev: true - /@docsearch/js@3.6.0(@algolia/client-search@4.23.2)(search-insights@2.13.0): + /@docsearch/js@3.6.0(@algolia/client-search@4.24.0)(search-insights@2.15.0): resolution: {integrity: sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==} dependencies: - '@docsearch/react': 3.6.0(@algolia/client-search@4.23.2)(search-insights@2.13.0) - preact: 10.20.1 + '@docsearch/react': 3.6.0(@algolia/client-search@4.24.0)(search-insights@2.15.0) + preact: 10.22.1 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -275,7 +276,7 @@ packages: - search-insights dev: true - /@docsearch/react@3.6.0(@algolia/client-search@4.23.2)(search-insights@2.13.0): + /@docsearch/react@3.6.0(@algolia/client-search@4.24.0)(search-insights@2.15.0): resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' @@ -292,11 +293,11 @@ packages: search-insights: optional: true dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)(search-insights@2.13.0) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2) + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.15.0) + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) '@docsearch/css': 3.6.0 - algoliasearch: 4.23.2 - search-insights: 2.13.0 + algoliasearch: 4.24.0 + search-insights: 2.15.0 transitivePeerDependencies: - '@algolia/client-search' dev: true @@ -319,8 +320,8 @@ packages: rollup-plugin-node-polyfills: 0.2.1 dev: true - /@esbuild/aix-ppc64@0.20.2: - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + /@esbuild/aix-ppc64@0.21.5: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -337,8 +338,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.20.2: - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + /@esbuild/android-arm64@0.21.5: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -355,8 +356,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.20.2: - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + /@esbuild/android-arm@0.21.5: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -373,8 +374,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.20.2: - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + /@esbuild/android-x64@0.21.5: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -391,8 +392,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.20.2: - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + /@esbuild/darwin-arm64@0.21.5: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -409,8 +410,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.20.2: - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + /@esbuild/darwin-x64@0.21.5: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -427,8 +428,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.20.2: - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + /@esbuild/freebsd-arm64@0.21.5: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -445,8 +446,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.20.2: - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + /@esbuild/freebsd-x64@0.21.5: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -463,8 +464,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.20.2: - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + /@esbuild/linux-arm64@0.21.5: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -481,8 +482,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.20.2: - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + /@esbuild/linux-arm@0.21.5: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -499,8 +500,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.20.2: - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + /@esbuild/linux-ia32@0.21.5: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -517,8 +518,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.20.2: - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + /@esbuild/linux-loong64@0.21.5: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -535,8 +536,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.20.2: - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + /@esbuild/linux-mips64el@0.21.5: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -553,8 +554,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.20.2: - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + /@esbuild/linux-ppc64@0.21.5: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -571,8 +572,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.20.2: - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + /@esbuild/linux-riscv64@0.21.5: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -589,8 +590,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.20.2: - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + /@esbuild/linux-s390x@0.21.5: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -607,8 +608,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.20.2: - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + /@esbuild/linux-x64@0.21.5: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -625,8 +626,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.20.2: - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + /@esbuild/netbsd-x64@0.21.5: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -643,8 +644,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.20.2: - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + /@esbuild/openbsd-x64@0.21.5: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -661,8 +662,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.20.2: - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + /@esbuild/sunos-x64@0.21.5: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -679,8 +680,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.20.2: - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + /@esbuild/win32-arm64@0.21.5: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -697,8 +698,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.20.2: - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + /@esbuild/win32-ia32@0.21.5: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -715,8 +716,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.20.2: - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + /@esbuild/win32-x64@0.21.5: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -734,15 +735,15 @@ packages: engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} dev: true /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 dev: true /@nodelib/fs.scandir@2.1.5: @@ -766,309 +767,327 @@ packages: fastq: 1.17.1 dev: true - /@rollup/rollup-android-arm-eabi@4.13.2: - resolution: {integrity: sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==} + /@rollup/rollup-android-arm-eabi@4.18.1: + resolution: {integrity: sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.13.2: - resolution: {integrity: sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==} + /@rollup/rollup-android-arm64@4.18.1: + resolution: {integrity: sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.13.2: - resolution: {integrity: sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==} + /@rollup/rollup-darwin-arm64@4.18.1: + resolution: {integrity: sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.13.2: - resolution: {integrity: sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==} + /@rollup/rollup-darwin-x64@4.18.1: + resolution: {integrity: sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.13.2: - resolution: {integrity: sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==} + /@rollup/rollup-linux-arm-gnueabihf@4.18.1: + resolution: {integrity: sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.18.1: + resolution: {integrity: sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.13.2: - resolution: {integrity: sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==} + /@rollup/rollup-linux-arm64-gnu@4.18.1: + resolution: {integrity: sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.13.2: - resolution: {integrity: sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==} + /@rollup/rollup-linux-arm64-musl@4.18.1: + resolution: {integrity: sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.13.2: - resolution: {integrity: sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==} - cpu: [ppc64le] + /@rollup/rollup-linux-powerpc64le-gnu@4.18.1: + resolution: {integrity: sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==} + cpu: [ppc64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.13.2: - resolution: {integrity: sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==} + /@rollup/rollup-linux-riscv64-gnu@4.18.1: + resolution: {integrity: sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.13.2: - resolution: {integrity: sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==} + /@rollup/rollup-linux-s390x-gnu@4.18.1: + resolution: {integrity: sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==} cpu: [s390x] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.13.2: - resolution: {integrity: sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==} + /@rollup/rollup-linux-x64-gnu@4.18.1: + resolution: {integrity: sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.13.2: - resolution: {integrity: sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==} + /@rollup/rollup-linux-x64-musl@4.18.1: + resolution: {integrity: sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.13.2: - resolution: {integrity: sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==} + /@rollup/rollup-win32-arm64-msvc@4.18.1: + resolution: {integrity: sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.13.2: - resolution: {integrity: sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==} + /@rollup/rollup-win32-ia32-msvc@4.18.1: + resolution: {integrity: sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.13.2: - resolution: {integrity: sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==} + /@rollup/rollup-win32-x64-msvc@4.18.1: + resolution: {integrity: sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /@shikijs/core@1.2.3: - resolution: {integrity: sha512-SM+aiQVaEK2P53dEcsvhq9+LJPr0rzwezHbMQhHaSrPN4OlOB4vp1qTdhVEKfMg6atdq8s9ZotWW/CSCzWftwg==} + /@shikijs/core@1.10.3: + resolution: {integrity: sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==} + dependencies: + '@types/hast': 3.0.4 dev: true - /@shikijs/transformers@1.2.3: - resolution: {integrity: sha512-7m63LXtBW9feqH4+dafLe92oXm/vs05e6qaN1w5/Byozaf+RCqzOj3/b2/wu7OzTgLe3O9PzIrO3FebkGJK26g==} + /@shikijs/transformers@1.10.3: + resolution: {integrity: sha512-MNjsyye2WHVdxfZUSr5frS97sLGe6G1T+1P41QjyBFJehZphMcr4aBlRLmq6OSPBslYe9byQPVvt/LJCOfxw8Q==} dependencies: - shiki: 1.2.3 + shiki: 1.10.3 dev: true /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true - /@types/linkify-it@3.0.5: - resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + dependencies: + '@types/unist': 3.0.2 + dev: true + + /@types/linkify-it@5.0.0: + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} dev: true - /@types/markdown-it@13.0.7: - resolution: {integrity: sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==} + /@types/markdown-it@14.1.1: + resolution: {integrity: sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==} dependencies: - '@types/linkify-it': 3.0.5 - '@types/mdurl': 1.0.5 + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 dev: true - /@types/mdurl@1.0.5: - resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} + /@types/mdurl@2.0.0: + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} dev: true /@types/node-forge@1.3.11: resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} dependencies: - '@types/node': 20.12.2 + '@types/node': 20.14.10 dev: true - /@types/node@20.12.2: - resolution: {integrity: sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==} + /@types/node@20.14.10: + resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} dependencies: undici-types: 5.26.5 dev: true + /@types/unist@3.0.2: + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + dev: true + /@types/web-bluetooth@0.0.20: resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} dev: true - /@vitejs/plugin-vue@5.0.4(vite@5.2.7)(vue@3.4.27): - resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} + /@vitejs/plugin-vue@5.0.5(vite@5.3.4)(vue@3.4.31): + resolution: {integrity: sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 vue: ^3.2.25 dependencies: - vite: 5.2.7 - vue: 3.4.27 + vite: 5.3.4 + vue: 3.4.31 dev: true - /@vue/compiler-core@3.4.27: - resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} + /@vue/compiler-core@3.4.31: + resolution: {integrity: sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==} dependencies: - '@babel/parser': 7.24.6 - '@vue/shared': 3.4.27 + '@babel/parser': 7.24.8 + '@vue/shared': 3.4.31 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.0 dev: true - /@vue/compiler-dom@3.4.27: - resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} + /@vue/compiler-dom@3.4.31: + resolution: {integrity: sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==} dependencies: - '@vue/compiler-core': 3.4.27 - '@vue/shared': 3.4.27 + '@vue/compiler-core': 3.4.31 + '@vue/shared': 3.4.31 dev: true - /@vue/compiler-sfc@3.4.27: - resolution: {integrity: sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==} + /@vue/compiler-sfc@3.4.31: + resolution: {integrity: sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==} dependencies: - '@babel/parser': 7.24.6 - '@vue/compiler-core': 3.4.27 - '@vue/compiler-dom': 3.4.27 - '@vue/compiler-ssr': 3.4.27 - '@vue/shared': 3.4.27 + '@babel/parser': 7.24.8 + '@vue/compiler-core': 3.4.31 + '@vue/compiler-dom': 3.4.31 + '@vue/compiler-ssr': 3.4.31 + '@vue/shared': 3.4.31 estree-walker: 2.0.2 magic-string: 0.30.10 - postcss: 8.4.38 + postcss: 8.4.39 source-map-js: 1.2.0 dev: true - /@vue/compiler-ssr@3.4.27: - resolution: {integrity: sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==} + /@vue/compiler-ssr@3.4.31: + resolution: {integrity: sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==} dependencies: - '@vue/compiler-dom': 3.4.27 - '@vue/shared': 3.4.27 + '@vue/compiler-dom': 3.4.31 + '@vue/shared': 3.4.31 dev: true - /@vue/devtools-api@7.0.25(vue@3.4.27): - resolution: {integrity: sha512-fL6DlRp4MSXCLYcqYvKU7QhQZWE3Hfu7X8pC25BS74coJi7uJeSWs4tmrITcwFihNmC9S5GPiffkMdckkeWjzg==} + /@vue/devtools-api@7.3.6: + resolution: {integrity: sha512-z6cKyxdXrIGgA++eyGBfquj6dCplRdgjt+I18fJx8hjWTXDTIyeQvryyEBMchnfZVyvUTjK3QjGjDpLCnJxPjw==} dependencies: - '@vue/devtools-kit': 7.0.25(vue@3.4.27) - transitivePeerDependencies: - - vue + '@vue/devtools-kit': 7.3.6 dev: true - /@vue/devtools-kit@7.0.25(vue@3.4.27): - resolution: {integrity: sha512-wbLkSnOTsKHPb1mB9koFHUoSAF8Dp6Ii/ocR2+DeXFY4oKqIjCeJb/4Lihk4rgqEhCy1WwxLfTgNDo83VvDYkQ==} - peerDependencies: - vue: ^3.0.0 + /@vue/devtools-kit@7.3.6: + resolution: {integrity: sha512-5Ym9V3fkJenEoptqKoo+cgY5RTVwrSssFdzRsuyIgaeiskCT+rRJeQdwoo81tyrQ1mfS7Er1rYZlSzr3Y3L/ew==} dependencies: - '@vue/devtools-shared': 7.0.25 + '@vue/devtools-shared': 7.3.6 + birpc: 0.2.17 hookable: 5.5.3 mitt: 3.0.1 perfect-debounce: 1.0.0 speakingurl: 14.0.1 - vue: 3.4.27 + superjson: 2.2.1 dev: true - /@vue/devtools-shared@7.0.25: - resolution: {integrity: sha512-5+XYhcHSXuJSguYnNwL6/e6VTmXwCfryWQOkffh9ZU2zMByybqqqBrMWqvBkqTmMFCjPdzulo66xXbVbwLaElQ==} + /@vue/devtools-shared@7.3.6: + resolution: {integrity: sha512-R/FOmdJV+hhuwcNoxp6e87RRkEeDMVhWH+nOsnHUrwjjsyeXJ2W1475Ozmw+cbZhejWQzftkHVKO28Fuo1yqCw==} dependencies: - rfdc: 1.3.1 + rfdc: 1.4.1 dev: true - /@vue/reactivity@3.4.27: - resolution: {integrity: sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==} + /@vue/reactivity@3.4.31: + resolution: {integrity: sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==} dependencies: - '@vue/shared': 3.4.27 + '@vue/shared': 3.4.31 dev: true - /@vue/runtime-core@3.4.27: - resolution: {integrity: sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==} + /@vue/runtime-core@3.4.31: + resolution: {integrity: sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==} dependencies: - '@vue/reactivity': 3.4.27 - '@vue/shared': 3.4.27 + '@vue/reactivity': 3.4.31 + '@vue/shared': 3.4.31 dev: true - /@vue/runtime-dom@3.4.27: - resolution: {integrity: sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==} + /@vue/runtime-dom@3.4.31: + resolution: {integrity: sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==} dependencies: - '@vue/runtime-core': 3.4.27 - '@vue/shared': 3.4.27 + '@vue/reactivity': 3.4.31 + '@vue/runtime-core': 3.4.31 + '@vue/shared': 3.4.31 csstype: 3.1.3 dev: true - /@vue/server-renderer@3.4.27(vue@3.4.27): - resolution: {integrity: sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==} + /@vue/server-renderer@3.4.31(vue@3.4.31): + resolution: {integrity: sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==} peerDependencies: - vue: 3.4.27 + vue: 3.4.31 dependencies: - '@vue/compiler-ssr': 3.4.27 - '@vue/shared': 3.4.27 - vue: 3.4.27 + '@vue/compiler-ssr': 3.4.31 + '@vue/shared': 3.4.31 + vue: 3.4.31 dev: true - /@vue/shared@3.4.27: - resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} + /@vue/shared@3.4.31: + resolution: {integrity: sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==} dev: true - /@vueuse/core@10.9.0(vue@3.4.27): - resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==} + /@vueuse/core@10.11.0(vue@3.4.31): + resolution: {integrity: sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==} dependencies: '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 10.9.0 - '@vueuse/shared': 10.9.0(vue@3.4.27) - vue-demi: 0.14.7(vue@3.4.27) + '@vueuse/metadata': 10.11.0 + '@vueuse/shared': 10.11.0(vue@3.4.31) + vue-demi: 0.14.8(vue@3.4.31) transitivePeerDependencies: - '@vue/composition-api' - vue dev: true - /@vueuse/integrations@10.9.0(focus-trap@7.5.4)(vue@3.4.27): - resolution: {integrity: sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==} + /@vueuse/integrations@10.11.0(focus-trap@7.5.4)(vue@3.4.31): + resolution: {integrity: sha512-Pp6MtWEIr+NDOccWd8j59Kpjy5YDXogXI61Kb1JxvSfVBO8NzFQkmrKmSZz47i+ZqHnIzxaT38L358yDHTncZg==} peerDependencies: - async-validator: '*' - axios: '*' - change-case: '*' - drauu: '*' - focus-trap: '*' - fuse.js: '*' - idb-keyval: '*' - jwt-decode: '*' - nprogress: '*' - qrcode: '*' - sortablejs: '*' - universal-cookie: '*' + async-validator: ^4 + axios: ^1 + change-case: ^4 + drauu: ^0.3 + focus-trap: ^7 + fuse.js: ^6 + idb-keyval: ^6 + jwt-decode: ^3 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^6 peerDependenciesMeta: async-validator: optional: true @@ -1095,57 +1114,59 @@ packages: universal-cookie: optional: true dependencies: - '@vueuse/core': 10.9.0(vue@3.4.27) - '@vueuse/shared': 10.9.0(vue@3.4.27) + '@vueuse/core': 10.11.0(vue@3.4.31) + '@vueuse/shared': 10.11.0(vue@3.4.31) focus-trap: 7.5.4 - vue-demi: 0.14.7(vue@3.4.27) + vue-demi: 0.14.8(vue@3.4.31) transitivePeerDependencies: - '@vue/composition-api' - vue dev: true - /@vueuse/metadata@10.9.0: - resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==} + /@vueuse/metadata@10.11.0: + resolution: {integrity: sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==} dev: true - /@vueuse/shared@10.9.0(vue@3.4.27): - resolution: {integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==} + /@vueuse/shared@10.11.0(vue@3.4.31): + resolution: {integrity: sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==} dependencies: - vue-demi: 0.14.7(vue@3.4.27) + vue-demi: 0.14.8(vue@3.4.31) transitivePeerDependencies: - '@vue/composition-api' - vue dev: true - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + /acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.12.1 dev: true - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + /acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /algoliasearch@4.23.2: - resolution: {integrity: sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ==} + /algoliasearch@4.24.0: + resolution: {integrity: sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==} dependencies: - '@algolia/cache-browser-local-storage': 4.23.2 - '@algolia/cache-common': 4.23.2 - '@algolia/cache-in-memory': 4.23.2 - '@algolia/client-account': 4.23.2 - '@algolia/client-analytics': 4.23.2 - '@algolia/client-common': 4.23.2 - '@algolia/client-personalization': 4.23.2 - '@algolia/client-search': 4.23.2 - '@algolia/logger-common': 4.23.2 - '@algolia/logger-console': 4.23.2 - '@algolia/recommend': 4.23.2 - '@algolia/requester-browser-xhr': 4.23.2 - '@algolia/requester-common': 4.23.2 - '@algolia/requester-node-http': 4.23.2 - '@algolia/transporter': 4.23.2 + '@algolia/cache-browser-local-storage': 4.24.0 + '@algolia/cache-common': 4.24.0 + '@algolia/cache-in-memory': 4.24.0 + '@algolia/client-account': 4.24.0 + '@algolia/client-analytics': 4.24.0 + '@algolia/client-common': 4.24.0 + '@algolia/client-personalization': 4.24.0 + '@algolia/client-search': 4.24.0 + '@algolia/logger-common': 4.24.0 + '@algolia/logger-console': 4.24.0 + '@algolia/recommend': 4.24.0 + '@algolia/requester-browser-xhr': 4.24.0 + '@algolia/requester-common': 4.24.0 + '@algolia/requester-node-http': 4.24.0 + '@algolia/transporter': 4.24.0 dev: true /anymatch@3.1.3: @@ -1167,22 +1188,26 @@ packages: engines: {node: '>=8'} dev: true + /birpc@0.2.17: + resolution: {integrity: sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==} + dev: true + /blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 dev: true /capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} dependencies: - debug: 4.3.4 - tslib: 2.6.2 + debug: 4.3.5 + tslib: 2.6.3 transitivePeerDependencies: - supports-color dev: true @@ -1192,7 +1217,7 @@ packages: engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -1202,11 +1227,23 @@ packages: fsevents: 2.3.3 dev: true + /consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + dev: true + /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} dev: true + /copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + dependencies: + is-what: 4.1.16 + dev: true + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1224,8 +1261,12 @@ packages: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + /date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + dev: true + + /debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1236,6 +1277,10 @@ packages: ms: 2.1.2 dev: true + /defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + dev: true + /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1271,35 +1316,35 @@ packages: '@esbuild/win32-x64': 0.17.19 dev: true - /esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + /esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 dev: true /escape-string-regexp@4.0.0: @@ -1343,7 +1388,7 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 dev: true /fastq@1.17.1: @@ -1352,8 +1397,8 @@ packages: reusify: 1.0.4 dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 @@ -1423,8 +1468,9 @@ packages: binary-extensions: 2.3.0 dev: true - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + /is-core-module@2.14.0: + resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} + engines: {node: '>= 0.4'} dependencies: hasown: 2.0.2 dev: true @@ -1451,6 +1497,11 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true + /is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + dev: true + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true @@ -1464,7 +1515,7 @@ packages: /magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 dev: true /mark.js@8.11.1: @@ -1480,11 +1531,11 @@ packages: engines: {node: '>= 8'} dev: true - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 dev: true @@ -1499,31 +1550,31 @@ packages: engines: {node: '>=12'} dev: true - /miniflare@3.20240329.0: - resolution: {integrity: sha512-kdHlMwhV241kck5oh8uyKPIhCusP1BL4+iOSeJZgcJ46EATA6crWtYqlARNU9t/iYXhzKhXOlOPJjjlCJuOgTA==} + /miniflare@3.20240701.0: + resolution: {integrity: sha512-m9+I+7JNyqDGftCMKp9cK9pCZkK72hAL2mM9IWwhct+ZmucLBA8Uu6+rHQqA5iod86cpwOkrB2PrPA3wx9YNgw==} engines: {node: '>=16.13'} hasBin: true dependencies: '@cspotcode/source-map-support': 0.8.1 - acorn: 8.11.3 - acorn-walk: 8.3.2 + acorn: 8.12.1 + acorn-walk: 8.3.3 capnp-ts: 0.7.0 exit-hook: 2.2.1 glob-to-regexp: 0.4.1 stoppable: 1.1.0 undici: 5.28.4 - workerd: 1.20240329.0 - ws: 8.16.0 + workerd: 1.20240701.0 + ws: 8.18.0 youch: 3.3.3 - zod: 3.22.4 + zod: 3.23.8 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /minisearch@6.3.0: - resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} + /minisearch@7.0.1: + resolution: {integrity: sha512-xLeX/AwTJLzgBF2/bdUI7MEePwXtzaLExkRwu8YFGfLDwSe06KYkplqPodLANsqvfc5Ks/r5ItFUSjIp7+9xtw==} dev: true /mitt@3.0.1: @@ -1545,6 +1596,10 @@ packages: hasBin: true dev: true + /node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + dev: true + /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} @@ -1583,16 +1638,20 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + /path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + dev: true + + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true /perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} dev: true - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} dev: true /picomatch@2.3.1: @@ -1600,17 +1659,17 @@ packages: engines: {node: '>=8.6'} dev: true - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + /postcss@8.4.39: + resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 dev: true - /preact@10.20.1: - resolution: {integrity: sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==} + /preact@10.22.1: + resolution: {integrity: sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==} dev: true /printable-characters@1.0.42: @@ -1637,7 +1696,7 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.13.1 + is-core-module: 2.14.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -1647,8 +1706,8 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + /rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} dev: true /rollup-plugin-inject@3.0.2: @@ -1672,28 +1731,29 @@ packages: estree-walker: 0.6.1 dev: true - /rollup@4.13.2: - resolution: {integrity: sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==} + /rollup@4.18.1: + resolution: {integrity: sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.13.2 - '@rollup/rollup-android-arm64': 4.13.2 - '@rollup/rollup-darwin-arm64': 4.13.2 - '@rollup/rollup-darwin-x64': 4.13.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.13.2 - '@rollup/rollup-linux-arm64-gnu': 4.13.2 - '@rollup/rollup-linux-arm64-musl': 4.13.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.13.2 - '@rollup/rollup-linux-riscv64-gnu': 4.13.2 - '@rollup/rollup-linux-s390x-gnu': 4.13.2 - '@rollup/rollup-linux-x64-gnu': 4.13.2 - '@rollup/rollup-linux-x64-musl': 4.13.2 - '@rollup/rollup-win32-arm64-msvc': 4.13.2 - '@rollup/rollup-win32-ia32-msvc': 4.13.2 - '@rollup/rollup-win32-x64-msvc': 4.13.2 + '@rollup/rollup-android-arm-eabi': 4.18.1 + '@rollup/rollup-android-arm64': 4.18.1 + '@rollup/rollup-darwin-arm64': 4.18.1 + '@rollup/rollup-darwin-x64': 4.18.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.1 + '@rollup/rollup-linux-arm-musleabihf': 4.18.1 + '@rollup/rollup-linux-arm64-gnu': 4.18.1 + '@rollup/rollup-linux-arm64-musl': 4.18.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.1 + '@rollup/rollup-linux-riscv64-gnu': 4.18.1 + '@rollup/rollup-linux-s390x-gnu': 4.18.1 + '@rollup/rollup-linux-x64-gnu': 4.18.1 + '@rollup/rollup-linux-x64-musl': 4.18.1 + '@rollup/rollup-win32-arm64-msvc': 4.18.1 + '@rollup/rollup-win32-ia32-msvc': 4.18.1 + '@rollup/rollup-win32-x64-msvc': 4.18.1 fsevents: 2.3.3 dev: true @@ -1703,8 +1763,8 @@ packages: queue-microtask: 1.2.3 dev: true - /search-insights@2.13.0: - resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} + /search-insights@2.15.0: + resolution: {integrity: sha512-ch2sPCUDD4sbPQdknVl9ALSi9H7VyoeVbsxznYz6QV55jJ8CI3EtwpO1i84keN4+hF5IeHWIeGvc08530JkVXQ==} dev: true /selfsigned@2.4.1: @@ -1727,10 +1787,11 @@ packages: engines: {node: '>=8'} dev: true - /shiki@1.2.3: - resolution: {integrity: sha512-+v7lO5cJMeV2N2ySK4l+51YX3wTh5I49SLjAOs1ch1DbUfeEytU1Ac9KaZPoZJCVBGycDZ09OBQN5nbcPFc5FQ==} + /shiki@1.10.3: + resolution: {integrity: sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==} dependencies: - '@shikijs/core': 1.2.3 + '@shikijs/core': 1.10.3 + '@types/hast': 3.0.4 dev: true /signal-exit@4.1.0: @@ -1775,6 +1836,13 @@ packages: engines: {node: '>=12'} dev: true + /superjson@2.2.1: + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + engines: {node: '>=16'} + dependencies: + copy-anything: 3.0.5 + dev: true + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -1796,8 +1864,12 @@ packages: is-number: 7.0.0 dev: true - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + dev: true + + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} dev: true /undici-types@5.26.5: @@ -1811,8 +1883,19 @@ packages: '@fastify/busboy': 2.1.1 dev: true - /vite@5.2.7: - resolution: {integrity: sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==} + /unenv-nightly@1.10.0-1717606461.a117952: + resolution: {integrity: sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==} + dependencies: + consola: 3.2.3 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.4 + pathe: 1.1.2 + ufo: 1.5.3 + dev: true + + /vite@5.3.4: + resolution: {integrity: sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -1839,15 +1922,15 @@ packages: terser: optional: true dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.13.2 + esbuild: 0.21.5 + postcss: 8.4.39 + rollup: 4.18.1 optionalDependencies: fsevents: 2.3.3 dev: true - /vitepress@1.0.2(@algolia/client-search@4.23.2)(search-insights@2.13.0): - resolution: {integrity: sha512-bEj9yTEdWyewJFOhEREZF+mXuAgOq27etuJZT6DZSp+J3XpQstXMJc5piSVwhZBtuj8OfA0iXy+jdP1c71KMYQ==} + /vitepress@1.3.1(@algolia/client-search@4.24.0)(search-insights@2.15.0): + resolution: {integrity: sha512-soZDpg2rRVJNIM/IYMNDPPr+zTHDA5RbLDHAxacRu+Q9iZ2GwSR0QSUlLs+aEZTkG0SOX1dc8RmUYwyuxK8dfQ==} hasBin: true peerDependencies: markdown-it-mathjax3: ^4 @@ -1859,20 +1942,21 @@ packages: optional: true dependencies: '@docsearch/css': 3.6.0 - '@docsearch/js': 3.6.0(@algolia/client-search@4.23.2)(search-insights@2.13.0) - '@shikijs/core': 1.2.3 - '@shikijs/transformers': 1.2.3 - '@types/markdown-it': 13.0.7 - '@vitejs/plugin-vue': 5.0.4(vite@5.2.7)(vue@3.4.27) - '@vue/devtools-api': 7.0.25(vue@3.4.27) - '@vueuse/core': 10.9.0(vue@3.4.27) - '@vueuse/integrations': 10.9.0(focus-trap@7.5.4)(vue@3.4.27) + '@docsearch/js': 3.6.0(@algolia/client-search@4.24.0)(search-insights@2.15.0) + '@shikijs/core': 1.10.3 + '@shikijs/transformers': 1.10.3 + '@types/markdown-it': 14.1.1 + '@vitejs/plugin-vue': 5.0.5(vite@5.3.4)(vue@3.4.31) + '@vue/devtools-api': 7.3.6 + '@vue/shared': 3.4.31 + '@vueuse/core': 10.11.0(vue@3.4.31) + '@vueuse/integrations': 10.11.0(focus-trap@7.5.4)(vue@3.4.31) focus-trap: 7.5.4 mark.js: 8.11.1 - minisearch: 6.3.0 - shiki: 1.2.3 - vite: 5.2.7 - vue: 3.4.27 + minisearch: 7.0.1 + shiki: 1.10.3 + vite: 5.3.4 + vue: 3.4.31 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -1901,8 +1985,8 @@ packages: - universal-cookie dev: true - /vue-demi@0.14.7(vue@3.4.27): - resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} + /vue-demi@0.14.8(vue@3.4.31): + resolution: {integrity: sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==} engines: {node: '>=12'} hasBin: true requiresBuild: true @@ -1913,22 +1997,22 @@ packages: '@vue/composition-api': optional: true dependencies: - vue: 3.4.27 + vue: 3.4.31 dev: true - /vue@3.4.27: - resolution: {integrity: sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==} + /vue@3.4.31: + resolution: {integrity: sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@vue/compiler-dom': 3.4.27 - '@vue/compiler-sfc': 3.4.27 - '@vue/runtime-dom': 3.4.27 - '@vue/server-renderer': 3.4.27(vue@3.4.27) - '@vue/shared': 3.4.27 + '@vue/compiler-dom': 3.4.31 + '@vue/compiler-sfc': 3.4.31 + '@vue/runtime-dom': 3.4.31 + '@vue/server-renderer': 3.4.31(vue@3.4.31) + '@vue/shared': 3.4.31 dev: true /which@2.0.2: @@ -1939,42 +2023,44 @@ packages: isexe: 2.0.0 dev: true - /workerd@1.20240329.0: - resolution: {integrity: sha512-6wWuMOwWsp3K6447XsI/MZYFq0KlpV2zVbbNFEkv3N7UgJJKaHGwL/hilr6RlS4UFLU4co8nrF2lc5uR781HKg==} + /workerd@1.20240701.0: + resolution: {integrity: sha512-qSgNVqauqzNCij9MaJLF2c2ko3AnFioVSIxMSryGbRK+LvtGr9BKBt6JOxCb24DoJASoJDx3pe3DJHBVydUiBg==} engines: {node: '>=16'} hasBin: true requiresBuild: true optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20240329.0 - '@cloudflare/workerd-darwin-arm64': 1.20240329.0 - '@cloudflare/workerd-linux-64': 1.20240329.0 - '@cloudflare/workerd-linux-arm64': 1.20240329.0 - '@cloudflare/workerd-windows-64': 1.20240329.0 + '@cloudflare/workerd-darwin-64': 1.20240701.0 + '@cloudflare/workerd-darwin-arm64': 1.20240701.0 + '@cloudflare/workerd-linux-64': 1.20240701.0 + '@cloudflare/workerd-linux-arm64': 1.20240701.0 + '@cloudflare/workerd-windows-64': 1.20240701.0 dev: true - /wrangler@3.43.0: - resolution: {integrity: sha512-v+uJmSVmxdv3aVRQsJLPHXgI5nhOBvJaZ5yUcSO8rJ+m5X2l9HzFQzFlUi1GtYIOejFSr8kcCuLm3YY6JbQruQ==} + /wrangler@3.64.0: + resolution: {integrity: sha512-q2VQADJXzuOkXs9KIfPSx7UCZHBoxsqSNbJDLkc2pHpGmsyNQXsJRqjMoTg/Kls7O3K9A7EGnzGr7+Io2vE6AQ==} engines: {node: '>=16.17.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20240320.1 + '@cloudflare/workers-types': ^4.20240620.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true dependencies: - '@cloudflare/kv-asset-handler': 0.3.1 + '@cloudflare/kv-asset-handler': 0.3.4 '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) blake3-wasm: 2.1.5 chokidar: 3.6.0 + date-fns: 3.6.0 esbuild: 0.17.19 - miniflare: 3.20240329.0 + miniflare: 3.20240701.0 nanoid: 3.3.7 - path-to-regexp: 6.2.1 + path-to-regexp: 6.2.2 resolve: 1.22.8 resolve.exports: 2.0.2 selfsigned: 2.4.1 source-map: 0.6.1 + unenv: /unenv-nightly@1.10.0-1717606461.a117952 xxhash-wasm: 1.0.2 optionalDependencies: fsevents: 2.3.3 @@ -1984,8 +2070,8 @@ packages: - utf-8-validate dev: true - /ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + /ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2009,6 +2095,6 @@ packages: stacktracey: 2.1.8 dev: true - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + /zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} dev: true From 870c852281b577bb4d5b22a2576bd4be25c98a1e Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 16 Jul 2024 17:50:37 +0200 Subject: [PATCH 424/509] Update main documentation page title --- docs/docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/index.md b/docs/docs/index.md index 1398962f512..65323d36ae0 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -1,5 +1,5 @@ --- -title: Tuist +title: What is Tuist? description: Learn about Tuist, a tool that simplifies the complexities of modularization, optimizes workflows, and democratizes the evolution of Xcode projects. --- From 24325bdce12b88f3b908fc32032f5075d9109ce1 Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 16 Jul 2024 17:51:24 +0200 Subject: [PATCH 425/509] Update the description --- docs/docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/index.md b/docs/docs/index.md index 65323d36ae0..495fbcb4892 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -1,6 +1,6 @@ --- title: What is Tuist? -description: Learn about Tuist, a tool that simplifies the complexities of modularization, optimizes workflows, and democratizes the evolution of Xcode projects. +description: Learn about Tuist, a toolchain to empower teams to build better apps faster. --- # Tuist From 266f4fdfb01898d6a22a67f223c48d1acabdb72b Mon Sep 17 00:00:00 2001 From: Tuist Date: Tue, 16 Jul 2024 16:04:15 +0000 Subject: [PATCH 426/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.21.0 --- .mise.toml | 2 +- CHANGELOG.md | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 5894cdaf4a3..5d571492a65 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.20.0" +tuist = "4.21.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index f86c02009e0..2000ee785ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,35 @@ # Changelog +## 4.21.0 - 2024-07-16 + +### Tuist + +#### Changed + +- Flatten cloud commands to tuist [#6473](https://github.com/tuist/tuist/pull/6473) by [@fortmarek](https://github.com/fortmarek) +- Flatten the tuist-cloud cache directory into the tuist cache directory [#6474](https://github.com/tuist/tuist/pull/6474) by [@fortmarek](https://github.com/fortmarek) +- Deprecate cloud in Config in favor of fullHandle and url [#6475](https://github.com/tuist/tuist/pull/6475) by [@fortmarek](https://github.com/fortmarek) +- Deprecate the usage TUIST_CONFIG_CLOUD_TOKEN in favor of TUIST_CONFIG_TOKEN [#6476](https://github.com/tuist/tuist/pull/6476) by [@fortmarek](https://github.com/fortmarek) +- Add support for new, more secure project and user tokens [#6500](https://github.com/tuist/tuist/pull/6500) by [@fortmarek](https://github.com/fortmarek) + +#### Added + +- Lint target references in a scheme [#6491](https://github.com/tuist/tuist/pull/6491) by [@rofle100lvl](https://github.com/rofle100lvl) +- Generate a `Tuist/Config.swift` by default when creating a new project [#6521](https://github.com/tuist/tuist/pull/6521) by [@pepicrft](https://github.com/pepicrft) + +#### Fixed + +- Fix generate failing due to duplicate keys [#6469](https://github.com/tuist/tuist/pull/6469) by [@fortmarek](https://github.com/fortmarek) +- Change tuist project subcommands to accept full handle [#6472](https://github.com/tuist/tuist/pull/6472) by [@fortmarek](https://github.com/fortmarek) +- Fix missing test targets when generating an SPM package [#6483](https://github.com/tuist/tuist/pull/6483) by [@woin2ee](https://github.com/woin2ee) +- Escape header search paths for external dependencies from SPM [#6513](https://github.com/tuist/tuist/pull/6513) by [@KaiOelfke](https://github.com/KaiOelfke) +- Respect --verbose for machine readable commands [#6518](https://github.com/tuist/tuist/pull/6518) by [@fortmarek](https://github.com/fortmarek) +- Fix linking static xcframeworks linked via dynamic xcframeworks [#6520](https://github.com/tuist/tuist/pull/6520) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +- no changes + ## 4.20.0 - 2024-07-02 ### Tuist From 4cd8bf79afbce68ea05d71923fa209312d33b4be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 16 Jul 2024 18:09:58 +0200 Subject: [PATCH 427/509] Add necessary PGDATA variable (#6522) --- docs/docs/guides/dashboard/on-premise/install.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/guides/dashboard/on-premise/install.md b/docs/docs/guides/dashboard/on-premise/install.md index 78919948890..c6f832c399e 100644 --- a/docs/docs/guides/dashboard/on-premise/install.md +++ b/docs/docs/guides/dashboard/on-premise/install.md @@ -227,6 +227,7 @@ services: environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres + - PGDATA=/var/lib/postgresql/data/pgdata ports: - '5432:5432' volumes: From 01c54492fb905496a1e3d4fe2ffbc33c58364d35 Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 16 Jul 2024 18:06:35 +0200 Subject: [PATCH 428/509] Fix documentation --- docs/.vitepress/sidebars.mjs | 12 +++++++----- docs/docs/guides/develop/workflows.md | 9 +++++++++ docs/docs/guides/share.md | 9 +++++++++ 3 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 docs/docs/guides/develop/workflows.md create mode 100644 docs/docs/guides/share.md diff --git a/docs/.vitepress/sidebars.mjs b/docs/.vitepress/sidebars.mjs index 65963e2737e..4af2e0d7083 100644 --- a/docs/.vitepress/sidebars.mjs +++ b/docs/.vitepress/sidebars.mjs @@ -290,19 +290,21 @@ export const guidesSidebar = [ ], }, { - text: `
    Integrate ${cloudBlank02Icon()} ${comingSoonBadge()}
    `, + text: `
    Workflows ${cloudBlank02Icon()} ${comingSoonBadge()}
    `, + link: "guides/develop/workflows", items: [], }, ], }, { text: `
    Share ${cube01Icon()} ${comingSoonBadge()}
    `, + link: "guides/share", items: [], }, - { - text: `
    Measure ${barChartSquare02Icon()} ${comingSoonBadge()}
    `, - items: [], - }, + // { + // text: `
    Measure ${barChartSquare02Icon()} ${comingSoonBadge()}
    `, + // items: [], + // }, { text: `
    Dashboard ${server04Icon()}
    `, collapsed: true, diff --git a/docs/docs/guides/develop/workflows.md b/docs/docs/guides/develop/workflows.md new file mode 100644 index 00000000000..6a337e5be43 --- /dev/null +++ b/docs/docs/guides/develop/workflows.md @@ -0,0 +1,9 @@ +--- +title: tuist workflows +description: Integrate your changes through workflows. +--- + +# Workflows + +> [!WARNING] COMING SOON +> This feature is not available yet. We are working on it and it will be available soon. \ No newline at end of file diff --git a/docs/docs/guides/share.md b/docs/docs/guides/share.md new file mode 100644 index 00000000000..b1ab49c3122 --- /dev/null +++ b/docs/docs/guides/share.md @@ -0,0 +1,9 @@ +--- +title: Share +description: Share your artifacts with people and Apple. +--- + +# Share + +> [!WARNING] COMING SOON +> This feature is not available yet. We are working on it and it will be available soon. \ No newline at end of file From e3e4cd7e5ad2785b6777e2b93908b2fc6a27098e Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 16 Jul 2024 18:31:52 +0200 Subject: [PATCH 429/509] Remove the coming soon badge --- docs/.vitepress/sidebars.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/.vitepress/sidebars.mjs b/docs/.vitepress/sidebars.mjs index 4af2e0d7083..f45e143925e 100644 --- a/docs/.vitepress/sidebars.mjs +++ b/docs/.vitepress/sidebars.mjs @@ -290,14 +290,14 @@ export const guidesSidebar = [ ], }, { - text: `
    Workflows ${cloudBlank02Icon()} ${comingSoonBadge()}
    `, + text: `
    Workflows ${cloudBlank02Icon()}
    `, link: "guides/develop/workflows", items: [], }, ], }, { - text: `
    Share ${cube01Icon()} ${comingSoonBadge()}
    `, + text: `
    Share ${cube01Icon()}
    `, link: "guides/share", items: [], }, From 2a50dfb1069e002d7a9c96493ed11d0b407f69ee Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 16 Jul 2024 18:38:21 +0200 Subject: [PATCH 430/509] Another attempt to fix the docs --- docs/.vitepress/sidebars.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/.vitepress/sidebars.mjs b/docs/.vitepress/sidebars.mjs index f45e143925e..56ad6cbc6b2 100644 --- a/docs/.vitepress/sidebars.mjs +++ b/docs/.vitepress/sidebars.mjs @@ -292,6 +292,7 @@ export const guidesSidebar = [ { text: `
    Workflows ${cloudBlank02Icon()}
    `, link: "guides/develop/workflows", + collapsed: true, items: [], }, ], @@ -299,6 +300,7 @@ export const guidesSidebar = [ { text: `
    Share ${cube01Icon()}
    `, link: "guides/share", + collapsed: true, items: [], }, // { From 181ac91183ef5b74d972113b9357513b032eec7e Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 16 Jul 2024 18:46:19 +0200 Subject: [PATCH 431/509] Fix documentation (again) --- docs/.vitepress/sidebars.mjs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/.vitepress/sidebars.mjs b/docs/.vitepress/sidebars.mjs index 56ad6cbc6b2..405dc605fa2 100644 --- a/docs/.vitepress/sidebars.mjs +++ b/docs/.vitepress/sidebars.mjs @@ -145,7 +145,7 @@ export const contributorsSidebar = [ export const guidesSidebar = [ { - text: `
    Quick start ${tuistIcon()}
    `, + text: `Quick start ${tuistIcon()}`, link: "/", items: [ { @@ -171,7 +171,7 @@ export const guidesSidebar = [ ], }, { - text: `
    Start ${cubeOutlineIcon()}
    `, + text: `Start ${cubeOutlineIcon()}`, items: [ { text: "Create a new project", @@ -206,10 +206,10 @@ export const guidesSidebar = [ ], }, { - text: `
    Develop ${cube02Icon()}
    `, + text: `Develop ${cube02Icon()}`, items: [ { - text: `
    Projects ${code02Icon()}
    `, + text: `Projects ${code02Icon()}`, collapsed: true, link: "guides/develop/projects", items: [ @@ -264,7 +264,7 @@ export const guidesSidebar = [ ], }, { - text: `
    Build ${dataIcon()}
    `, + text: `Build ${dataIcon()}`, link: "guides/develop/build", collapsed: true, items: [ @@ -275,7 +275,7 @@ export const guidesSidebar = [ ], }, { - text: `
    Test ${checkCircleIcon()}
    `, + text: `Test ${checkCircleIcon()}`, link: "guides/develop/test", collapsed: true, items: [ @@ -290,7 +290,7 @@ export const guidesSidebar = [ ], }, { - text: `
    Workflows ${cloudBlank02Icon()}
    `, + text: `Workflows ${cloudBlank02Icon()} ${comingSoonBadge()}`, link: "guides/develop/workflows", collapsed: true, items: [], @@ -298,17 +298,17 @@ export const guidesSidebar = [ ], }, { - text: `
    Share ${cube01Icon()}
    `, + text: `Share ${cube01Icon()} ${comingSoonBadge()}`, link: "guides/share", collapsed: true, items: [], }, - // { - // text: `
    Measure ${barChartSquare02Icon()} ${comingSoonBadge()}
    `, - // items: [], - // }, { - text: `
    Dashboard ${server04Icon()}
    `, + text: `Measure ${barChartSquare02Icon()} ${comingSoonBadge()}`, + items: [], + }, + { + text: `Dashboard ${server04Icon()}`, collapsed: true, items: [ { From 7983477fb135636b7bfa65c66a79a9d4f3428d92 Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 16 Jul 2024 18:57:42 +0200 Subject: [PATCH 432/509] Hide measure --- docs/.vitepress/sidebars.mjs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/docs/.vitepress/sidebars.mjs b/docs/.vitepress/sidebars.mjs index 405dc605fa2..f297755ee00 100644 --- a/docs/.vitepress/sidebars.mjs +++ b/docs/.vitepress/sidebars.mjs @@ -292,21 +292,17 @@ export const guidesSidebar = [ { text: `Workflows ${cloudBlank02Icon()} ${comingSoonBadge()}`, link: "guides/develop/workflows", - collapsed: true, - items: [], }, ], }, { text: `Share ${cube01Icon()} ${comingSoonBadge()}`, link: "guides/share", - collapsed: true, - items: [], - }, - { - text: `Measure ${barChartSquare02Icon()} ${comingSoonBadge()}`, - items: [], }, + // { + // text: `Measure ${barChartSquare02Icon()} ${comingSoonBadge()}`, + // items: [], + // }, { text: `Dashboard ${server04Icon()}`, collapsed: true, From d8c552904b3e709d438085c1add87c01b0e4f508 Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 16 Jul 2024 20:11:14 +0200 Subject: [PATCH 433/509] Remove custom css --- docs/.vitepress/theme/custom.css | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index 19a9b67f3c5..8b137891791 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -1,6 +1 @@ -:root { - --vp-c-brand-1: #5023B5; - --vp-c-brand-2: #6E3CD9; - --vp-c-brand-3: #8756FD; - } \ No newline at end of file From 30cb9e8233e9adfe89e521fc50157d191d873b1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 17 Jul 2024 09:20:26 +0200 Subject: [PATCH 434/509] Add note about tuist auth during set up for contributors (#6523) --- docs/docs/contributors/get-started.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/contributors/get-started.md b/docs/docs/contributors/get-started.md index 948c015cb56..1702d43b2a4 100644 --- a/docs/docs/contributors/get-started.md +++ b/docs/docs/contributors/get-started.md @@ -28,6 +28,7 @@ To start working on the project, we can follow the steps below: - [Install](https://mise.jdx.dev/getting-started.html) Mise to provision the development environment. - Run `mise install` to install the system dependencies needed by Tuist - Run `tuist install` to install the external dependencies needed by Tuist +- (Optional) Run `tuist auth` to get access to the [Tuist Cache](/guides/develop/build/cache) - Run `tuist generate` to generate the Tuist Xcode project using Tuist itself **The generated project opens automatically**. If you need to open again without generating it, run open `Tuist.xcworkspace` (or use Finder). From 01d36c732320e0933616ae9d51cabc484c9e0079 Mon Sep 17 00:00:00 2001 From: Tuist Date: Wed, 17 Jul 2024 09:11:12 +0000 Subject: [PATCH 435/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.21.1 --- .mise.toml | 2 +- CHANGELOG.md | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 5d571492a65..ae4555920db 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.21.0" +tuist = "4.21.1" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index 2000ee785ee..4d1d8dbb593 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 4.21.1 - 2024-07-17 + +### Tuist + +- no changes + +### Tuist Cloud + +- no changes + ## 4.21.0 - 2024-07-16 ### Tuist From 074cbd7f13de9d2942323e95dbffefca8bfa57f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 17 Jul 2024 11:58:03 +0200 Subject: [PATCH 436/509] Documentation fixes (#6524) * Improve the log in button and add a link to the API documentation * Fix the color of icons * Make long symbols scrollable --- docs/.vitepress/badges.mjs | 4 +-- docs/.vitepress/config.mjs | 13 ++++++-- docs/.vitepress/icons.mjs | 26 ++++++++-------- docs/.vitepress/theme/components/Button.vue | 33 --------------------- docs/.vitepress/theme/custom.css | 9 ++++++ docs/.vitepress/theme/index.js | 5 +--- 6 files changed, 36 insertions(+), 54 deletions(-) delete mode 100644 docs/.vitepress/theme/components/Button.vue diff --git a/docs/.vitepress/badges.mjs b/docs/.vitepress/badges.mjs index 9d720a037fc..0674a6fcf79 100644 --- a/docs/.vitepress/badges.mjs +++ b/docs/.vitepress/badges.mjs @@ -1,7 +1,7 @@ export function comingSoonBadge() { - return `
    Coming soon
    `; + return `Coming soon`; } export function requiresAccount() { - return `
    Account required
    `; + return `Account required`; } diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index f4fac2c59ba..72d87dea105 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -126,8 +126,17 @@ export default defineConfig({ { text: "Contributors", link: "/contributors/get-started" }, { text: "Changelog", link: "https://github.com/tuist/tuist/releases" }, { - component: "Button", - props: { title: "Log in", href: "https://cloud.tuist.io/users/log_in" }, + text: "Server", + items: [ + { + text: "Dashboard", + link: "https://cloud.tuist.io", + }, + { + text: "API Documentation", + link: "https://cloud.tuist.io/api/docs", + }, + ], }, ], editLink: { diff --git a/docs/.vitepress/icons.mjs b/docs/.vitepress/icons.mjs index d060bd077bf..d5925308b8a 100644 --- a/docs/.vitepress/icons.mjs +++ b/docs/.vitepress/icons.mjs @@ -1,20 +1,20 @@ export function cubeOutlineIcon(size = 15) { return ` - + `; } export function cube02Icon(size = 15) { return ` - + `; } export function cube01Icon(size = 15) { return ` - + `; @@ -22,50 +22,50 @@ export function cube01Icon(size = 15) { export function barChartSquare02Icon(size = 15) { return ` - + `; } export function code02Icon(size = 15) { return ` - + `; } export function dataIcon(size = 15) { return ` - - - - + + + + `; } export function checkCircleIcon(size = 15) { return ` - + `; } export function tuistIcon(size = 15) { return ` - + `; } export function cloudBlank02Icon(size = 15) { return ` - + `; } export function server04Icon(size = 15) { return ` - + `; } diff --git a/docs/.vitepress/theme/components/Button.vue b/docs/.vitepress/theme/components/Button.vue deleted file mode 100644 index 48a6c079de8..00000000000 --- a/docs/.vitepress/theme/components/Button.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - - - \ No newline at end of file diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index 8b137891791..865c25d2663 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -1 +1,10 @@ +.VPLink { + overflow: scroll; + scrollbar-width: none; /* Firefox */ + &::-webkit-scrollbar { + /* WebKit */ + width: 0; + height: 0; + } +} diff --git a/docs/.vitepress/theme/index.js b/docs/.vitepress/theme/index.js index 49d5222068a..e8c2960a070 100644 --- a/docs/.vitepress/theme/index.js +++ b/docs/.vitepress/theme/index.js @@ -1,10 +1,7 @@ import DefaultTheme from "vitepress/theme"; import "./custom.css"; -import Button from "./components/Button.vue"; /** @type {import('vitepress').Theme} */ export default { extends: DefaultTheme, - enhanceApp({ app }) { - app.component("Button", Button); - }, + enhanceApp({ app }) {}, }; From 6de5bf8d2e8c1a357477ed8b4202ff1b79600df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 18 Jul 2024 11:10:23 +0200 Subject: [PATCH 437/509] Add email and password auth options for non-interactive login (#6507) * Add email and password flags to auth command for non-interactive login * Address PR feedback --- Project.swift | 28 +-- .../ServerAcceptanceTestCase.swift | 30 +++ Sources/TuistKit/Commands/AuthCommand.swift | 18 +- Sources/TuistKit/Commands/EnvKey/EnvKey.swift | 2 + Sources/TuistKit/Services/AuthService.swift | 55 +++- .../Models/ServerAuthenticationTokens.swift | 5 + Sources/TuistServer/OpenAPI/Client.swift | 71 +++++- Sources/TuistServer/OpenAPI/Types.swift | 235 +++++++++++++++--- Sources/TuistServer/OpenAPI/cloud.yml | 180 ++++++++++---- .../Services/AuthenticateService.swift | 76 ++++++ Sources/TuistSupport/UserInputReader.swift | 24 +- .../ServerAcceptanceTests.swift | 33 +-- .../Services/AuthServiceTests.swift | 156 +++++++++++- .../Utils/UserInputReaderTests.swift | 13 + 14 files changed, 792 insertions(+), 134 deletions(-) create mode 100644 Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift create mode 100644 Sources/TuistServer/Services/AuthenticateService.swift diff --git a/Project.swift b/Project.swift index 5ac45514722..4bedb211f3e 100644 --- a/Project.swift +++ b/Project.swift @@ -13,6 +13,15 @@ func releaseSettings() -> SettingsDictionary { baseSettings } +func acceptanceTestsEnvironmentVariables() -> [String: EnvironmentVariable] { + [ + "TUIST_CONFIG_SRCROOT": "$(SRCROOT)", + "TUIST_FRAMEWORK_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", + "TUIST_AUTH_EMAIL": "tuist@tuist.io", + "TUIST_AUTH_PASSWORD": "tuistrocks", + ] +} + func schemes() -> [Scheme] { var schemes: [Scheme] = [ .scheme( @@ -23,10 +32,7 @@ func schemes() -> [Scheme] { ), runAction: .runAction( arguments: .arguments( - environmentVariables: [ - "TUIST_CONFIG_SRCROOT": "$(SRCROOT)", - "TUIST_FRAMEWORK_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", - ] + environmentVariables: acceptanceTestsEnvironmentVariables() ) ) ), @@ -41,12 +47,7 @@ func schemes() -> [Scheme] { ), runAction: .runAction( arguments: .arguments( - environmentVariables: [ - "TUIST_CONFIG_SRCROOT": "$(SRCROOT)", - "TUIST_FRAMEWORK_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", - "CI": "true", - "TUIST_CONFIG_TOKEN": "i1932DHAyBwEtHCsRYyE2Ub6ReHNwQ", - ] + environmentVariables: acceptanceTestsEnvironmentVariables() ) ) ), @@ -93,12 +94,7 @@ func schemes() -> [Scheme] { testAction: .targets([.testableTarget(target: .target($0))]), runAction: .runAction( arguments: .arguments( - environmentVariables: [ - "TUIST_CONFIG_SRCROOT": "$(SRCROOT)", - "TUIST_FRAMEWORK_SEARCH_PATHS": "$(FRAMEWORK_SEARCH_PATHS)", - "CI": "true", - "TUIST_CONFIG_TOKEN": "i1932DHAyBwEtHCsRYyE2Ub6ReHNwQ", - ] + environmentVariables: acceptanceTestsEnvironmentVariables() ) ) ) diff --git a/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift b/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift new file mode 100644 index 00000000000..2174246373d --- /dev/null +++ b/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift @@ -0,0 +1,30 @@ +import Foundation +import XCTest + +@testable import TuistKit + +open class ServerAcceptanceTestCase: TuistAcceptanceTestCase { + public var fullHandle: String = "" + public var organizationHandle: String = "" + public var projectHandle: String = "" + + override open func setUp() async throws { + try await super.setUp() + try setUpFixture(.iosAppWithFrameworks) + organizationHandle = String(UUID().uuidString.prefix(12).lowercased()) + projectHandle = String(UUID().uuidString.prefix(12).lowercased()) + fullHandle = "\(organizationHandle)/\(projectHandle)" + let email = try XCTUnwrap(ProcessInfo.processInfo.environment[EnvKey.authEmail.rawValue]) + let password = try XCTUnwrap(ProcessInfo.processInfo.environment[EnvKey.authPassword.rawValue]) + try await run(AuthCommand.self, "--email", email, "--password", password) + try await run(OrganizationCreateCommand.self, organizationHandle) + try await run(ProjectCreateCommand.self, fullHandle) + } + + override open func tearDown() async throws { + try await run(ProjectDeleteCommand.self, fullHandle) + try await run(OrganizationDeleteCommand.self, organizationHandle) + try run(LogoutCommand.self) + try await super.tearDown() + } +} diff --git a/Sources/TuistKit/Commands/AuthCommand.swift b/Sources/TuistKit/Commands/AuthCommand.swift index 9feb36e37a2..dea4440f516 100644 --- a/Sources/TuistKit/Commands/AuthCommand.swift +++ b/Sources/TuistKit/Commands/AuthCommand.swift @@ -10,6 +10,18 @@ struct AuthCommand: AsyncParsableCommand { ) } + @Option( + help: "Email to authenticate with.", + envKey: .authEmail + ) + var email: String? + + @Option( + help: "Password to authenticate with.", + envKey: .authPassword + ) + var password: String? + @Option( name: .shortAndLong, help: "The path to the directory or a subdirectory of the project.", @@ -19,6 +31,10 @@ struct AuthCommand: AsyncParsableCommand { var path: String? func run() async throws { - try await AuthService().authenticate(directory: path) + try await AuthService().authenticate( + email: email, + password: password, + directory: path + ) } } diff --git a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift index 0937d4de651..6361184963b 100644 --- a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift +++ b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift @@ -200,6 +200,8 @@ public enum EnvKey: String, CaseIterable { // AUTH case authPath = "TUIST_AUTH_PATH" + case authEmail = "TUIST_AUTH_EMAIL" + case authPassword = "TUIST_AUTH_PASSWORD" // SESSION case sessionPath = "TUIST_SESSION_PATH" diff --git a/Sources/TuistKit/Services/AuthService.swift b/Sources/TuistKit/Services/AuthService.swift index 324bd4d699c..373a8a7223e 100644 --- a/Sources/TuistKit/Services/AuthService.swift +++ b/Sources/TuistKit/Services/AuthService.swift @@ -9,6 +9,8 @@ import TuistSupport @Mockable protocol AuthServicing: AnyObject { func authenticate( + email: String?, + password: String?, directory: String? ) async throws } @@ -17,20 +19,31 @@ final class AuthService: AuthServicing { private let serverSessionController: ServerSessionControlling private let serverURLService: ServerURLServicing private let configLoader: ConfigLoading + private let userInputReader: UserInputReading + private let authenticateService: AuthenticateServicing + private let serverCredentialsStore: ServerCredentialsStoring init( serverSessionController: ServerSessionControlling = ServerSessionController(), serverURLService: ServerURLServicing = ServerURLService(), - configLoader: ConfigLoading = ConfigLoader() + configLoader: ConfigLoading = ConfigLoader(), + userInputReader: UserInputReading = UserInputReader(), + authenticateService: AuthenticateServicing = AuthenticateService(), + serverCredentialsStore: ServerCredentialsStoring = ServerCredentialsStore() ) { self.serverSessionController = serverSessionController self.serverURLService = serverURLService self.configLoader = configLoader + self.userInputReader = userInputReader + self.authenticateService = authenticateService + self.serverCredentialsStore = serverCredentialsStore } // MARK: - AuthServicing func authenticate( + email: String?, + password: String?, directory: String? ) async throws { let directoryPath: AbsolutePath @@ -41,6 +54,46 @@ final class AuthService: AuthServicing { } let config = try configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) + + if email != nil || password != nil { + try await authenticateWithEmailAndPassword( + email: email, + password: password, + serverURL: serverURL + ) + } else { + try await authenticateWithBrowserLogin(serverURL: serverURL) + } + } + + private func authenticateWithEmailAndPassword( + email: String?, + password: String?, + serverURL: URL + ) async throws { + let email = email ?? userInputReader.readString(asking: "Email:") + let password = password ?? userInputReader.readString(asking: "Password:") + + let authenticationTokens = try await authenticateService.authenticate( + email: email, + password: password, + serverURL: serverURL + ) + + try serverCredentialsStore.store( + credentials: ServerCredentials( + token: nil, + accessToken: authenticationTokens.accessToken, + refreshToken: authenticationTokens.refreshToken + ), + serverURL: serverURL + ) + logger.notice("Credentials stored successfully.", metadata: .success) + } + + private func authenticateWithBrowserLogin( + serverURL: URL + ) async throws { try await serverSessionController.authenticate(serverURL: serverURL) } } diff --git a/Sources/TuistServer/Models/ServerAuthenticationTokens.swift b/Sources/TuistServer/Models/ServerAuthenticationTokens.swift index 8372ffa00f3..a7a1a6f6d63 100644 --- a/Sources/TuistServer/Models/ServerAuthenticationTokens.swift +++ b/Sources/TuistServer/Models/ServerAuthenticationTokens.swift @@ -1,6 +1,11 @@ import Foundation public struct ServerAuthenticationTokens { + public init(accessToken: String, refreshToken: String) { + self.accessToken = accessToken + self.refreshToken = refreshToken + } + public let accessToken: String public let refreshToken: String } diff --git a/Sources/TuistServer/OpenAPI/Client.swift b/Sources/TuistServer/OpenAPI/Client.swift index 79e2de19373..9738d636fcd 100644 --- a/Sources/TuistServer/OpenAPI/Client.swift +++ b/Sources/TuistServer/OpenAPI/Client.swift @@ -118,6 +118,75 @@ public struct Client: APIProtocol { } ) } + /// Authenticate with email and password. + /// + /// This endpoint returns API tokens for a given email and password. + /// + /// - Remark: HTTP `POST /api/auth`. + /// - Remark: Generated from `#/paths//api/auth/post(authenticate)`. + public func authenticate(_ input: Operations.authenticate.Input) async throws + -> Operations.authenticate.Output + { + try await client.send( + input: input, + forOperation: Operations.authenticate.id, + serializer: { input in + let path = try converter.renderedRequestPath(template: "/api/auth", parameters: []) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.authenticate.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.authenticate.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.AuthenticationTokens.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 401: + let headers: Operations.authenticate.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.authenticate.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } /// Get a specific device code. /// /// This endpoint returns a token for a given device code if the device code is authenticated. @@ -239,7 +308,7 @@ public struct Client: APIProtocol { ) let body: Operations.refreshToken.Output.Ok.Body = try converter.getResponseBodyAsJSON( - Operations.refreshToken.Output.Ok.Body.jsonPayload.self, + Components.Schemas.AuthenticationTokens.self, from: response.body, transforming: { value in .json(value) } ) diff --git a/Sources/TuistServer/OpenAPI/Types.swift b/Sources/TuistServer/OpenAPI/Types.swift index f8adfe33426..aa1e6091dff 100644 --- a/Sources/TuistServer/OpenAPI/Types.swift +++ b/Sources/TuistServer/OpenAPI/Types.swift @@ -13,6 +13,14 @@ public protocol APIProtocol: Sendable { /// - Remark: Generated from `#/paths//api/analytics/post(createCommandEvent)`. func createCommandEvent(_ input: Operations.createCommandEvent.Input) async throws -> Operations.createCommandEvent.Output + /// Authenticate with email and password. + /// + /// This endpoint returns API tokens for a given email and password. + /// + /// - Remark: HTTP `POST /api/auth`. + /// - Remark: Generated from `#/paths//api/auth/post(authenticate)`. + func authenticate(_ input: Operations.authenticate.Input) async throws + -> Operations.authenticate.Output /// Get a specific device code. /// /// This endpoint returns a token for a given device code if the device code is authenticated. @@ -500,23 +508,23 @@ public enum Components { case status } } - /// A new user access token to authenticate the user with. + /// API tokens to authenticate with. /// /// - Remark: Generated from `#/components/schemas/AuthenticationTokens`. public struct AuthenticationTokens: Codable, Equatable, Hashable, Sendable { - /// User access token + /// API access token. /// /// - Remark: Generated from `#/components/schemas/AuthenticationTokens/access_token`. public var access_token: Swift.String - /// User refresh token + /// API refresh token. /// /// - Remark: Generated from `#/components/schemas/AuthenticationTokens/refresh_token`. public var refresh_token: Swift.String /// Creates a new `AuthenticationTokens`. /// /// - Parameters: - /// - access_token: User access token - /// - refresh_token: User refresh token + /// - access_token: API access token. + /// - refresh_token: API refresh token. public init(access_token: Swift.String, refresh_token: Swift.String) { self.access_token = access_token self.refresh_token = refresh_token @@ -823,6 +831,43 @@ public enum Components { case _type = "type" } } + /// Token to authenticate the user with. + /// + /// - Remark: Generated from `#/components/schemas/DeviceCodeAuthenticationTokens`. + public struct DeviceCodeAuthenticationTokens: Codable, Equatable, Hashable, Sendable { + /// A short-lived token to authenticate API requests as user. + /// + /// - Remark: Generated from `#/components/schemas/DeviceCodeAuthenticationTokens/access_token`. + public var access_token: Swift.String? + /// A token to generate new access tokens when they expire. + /// + /// - Remark: Generated from `#/components/schemas/DeviceCodeAuthenticationTokens/refresh_token`. + public var refresh_token: Swift.String? + /// User authentication token + /// + /// - Remark: Generated from `#/components/schemas/DeviceCodeAuthenticationTokens/token`. + @available(*, deprecated) public var token: Swift.String? + /// Creates a new `DeviceCodeAuthenticationTokens`. + /// + /// - Parameters: + /// - access_token: A short-lived token to authenticate API requests as user. + /// - refresh_token: A token to generate new access tokens when they expire. + /// - token: User authentication token + public init( + access_token: Swift.String? = nil, + refresh_token: Swift.String? = nil, + token: Swift.String? = nil + ) { + self.access_token = access_token + self.refresh_token = refresh_token + self.token = token + } + public enum CodingKeys: String, CodingKey { + case access_token + case refresh_token + case token + } + } /// - Remark: Generated from `#/components/schemas/Error`. public struct _Error: Codable, Equatable, Hashable, Sendable { /// The error message @@ -1634,6 +1679,156 @@ public enum Operations { case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) } } + /// Authenticate with email and password. + /// + /// This endpoint returns API tokens for a given email and password. + /// + /// - Remark: HTTP `POST /api/auth`. + /// - Remark: Generated from `#/paths//api/auth/post(authenticate)`. + public enum authenticate { + public static let id: String = "authenticate" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + /// Creates a new `Path`. + public init() {} + } + public var path: Operations.authenticate.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.authenticate.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.authenticate.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.authenticate.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Authentication params. + /// + /// - Remark: Generated from `#/paths/api/auth/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// The email to authenticate with. + /// + /// - Remark: Generated from `#/paths/api/auth/POST/json/email`. + public var email: Swift.String + /// The password to authenticate with. + /// + /// - Remark: Generated from `#/paths/api/auth/POST/json/password`. + public var password: Swift.String + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - email: The email to authenticate with. + /// - password: The password to authenticate with. + public init(email: Swift.String, password: Swift.String) { + self.email = email + self.password = password + } + public enum CodingKeys: String, CodingKey { + case email + case password + } + } + case json(Operations.authenticate.Input.Body.jsonPayload) + } + public var body: Operations.authenticate.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.authenticate.Input.Path = .init(), + query: Operations.authenticate.Input.Query = .init(), + headers: Operations.authenticate.Input.Headers = .init(), + cookies: Operations.authenticate.Input.Cookies = .init(), + body: Operations.authenticate.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.authenticate.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.AuthenticationTokens) + } + /// Received HTTP response body + public var body: Operations.authenticate.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.authenticate.Output.Ok.Headers = .init(), + body: Operations.authenticate.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// Successfully authenticated and returned new API tokens. + /// + /// - Remark: Generated from `#/paths//api/auth/post(authenticate)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.authenticate.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.authenticate.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.authenticate.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.authenticate.Output.Unauthorized.Headers = .init(), + body: Operations.authenticate.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// Invalid email or password. + /// + /// - Remark: Generated from `#/paths//api/auth/post(authenticate)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.authenticate.Output.Unauthorized) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } /// Get a specific device code. /// /// This endpoint returns a token for a given device code if the device code is authenticated. @@ -1907,33 +2102,7 @@ public enum Operations { /// Received HTTP response headers public var headers: Operations.refreshToken.Output.Ok.Headers @frozen public enum Body: Sendable, Equatable, Hashable { - /// A new user access token to authenticate the user with. - /// - /// - Remark: Generated from `#/paths/api/auth/refresh_token/POST/json`. - public struct jsonPayload: Codable, Equatable, Hashable, Sendable { - /// User access token - /// - /// - Remark: Generated from `#/paths/api/auth/refresh_token/POST/json/access_token`. - public var access_token: Swift.String - /// User refresh token - /// - /// - Remark: Generated from `#/paths/api/auth/refresh_token/POST/json/refresh_token`. - public var refresh_token: Swift.String - /// Creates a new `jsonPayload`. - /// - /// - Parameters: - /// - access_token: User access token - /// - refresh_token: User refresh token - public init(access_token: Swift.String, refresh_token: Swift.String) { - self.access_token = access_token - self.refresh_token = refresh_token - } - public enum CodingKeys: String, CodingKey { - case access_token - case refresh_token - } - } - case json(Operations.refreshToken.Output.Ok.Body.jsonPayload) + case json(Components.Schemas.AuthenticationTokens) } /// Received HTTP response body public var body: Operations.refreshToken.Output.Ok.Body @@ -1950,7 +2119,7 @@ public enum Operations { self.body = body } } - /// A new a pair of tokens was generated + /// Succcessfully generated new API tokens. /// /// - Remark: Generated from `#/paths//api/auth/refresh_token/post(refreshToken)/responses/200`. /// diff --git a/Sources/TuistServer/OpenAPI/cloud.yml b/Sources/TuistServer/OpenAPI/cloud.yml index d9c9f9c6eba..940eba217dd 100644 --- a/Sources/TuistServer/OpenAPI/cloud.yml +++ b/Sources/TuistServer/OpenAPI/cloud.yml @@ -102,19 +102,20 @@ components: type: object x-struct: Elixir.TuistCloudWeb.API.Schemas.ArtifactUploadId AuthenticationTokens: - description: A new user access token to authenticate the user with. + description: API tokens to authenticate with. properties: access_token: - description: User access token + description: API access token. type: string refresh_token: - description: User refresh token + description: API refresh token. type: string required: - access_token - refresh_token title: AuthenticationTokens type: object + x-struct: Elixir.TuistCloudWeb.API.Schemas.AuthenticationTokens CacheArtifactDownloadURL: description: The URL to download the artifact from the cache. properties: @@ -216,6 +217,21 @@ components: - type title: CommandEventArtifact x-struct: Elixir.TuistCloudWeb.API.Schemas.CommandEventArtifact + DeviceCodeAuthenticationTokens: + description: Token to authenticate the user with. + properties: + access_token: + description: A short-lived token to authenticate API requests as user. + type: string + refresh_token: + description: A token to generate new access tokens when they expire. + type: string + token: + deprecated: true + description: User authentication token + type: string + title: DeviceCodeAuthenticationTokens + type: object Error: properties: message: @@ -440,9 +456,16 @@ components: authorization: scheme: bearer type: http + cookie: + in: cookie + name: _tuist_cloud_key + type: apiKey info: title: Tuist version: 0.1.0 + x-logo: + altText: Tuist logo + url: http://localhost:8080/ openapi: 3.0.0 paths: /api/analytics: @@ -564,7 +587,47 @@ paths: $ref: '#/components/schemas/Error' description: You don't have permission to create command events for the project. summary: Create a a new command analytics event - tags: [] + tags: + - Analytics + /api/auth: + post: + callbacks: {} + description: This endpoint returns API tokens for a given email and password. + operationId: authenticate + parameters: [] + requestBody: + content: + application/json: + schema: + properties: + email: + description: The email to authenticate with. + type: string + password: + description: The password to authenticate with. + type: string + required: + - email + - password + type: object + description: Authentication params. + required: false + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/AuthenticationTokens' + description: Successfully authenticated and returned new API tokens. + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: Invalid email or password. + summary: Authenticate with email and password. + tags: + - Authentication /api/auth/device_code/{device_code}: get: callbacks: {} @@ -594,7 +657,7 @@ paths: deprecated: true description: User authentication token type: string - title: AuthenticationTokens + title: DeviceCodeAuthenticationTokens type: object description: The device code is authenticated 202: @@ -610,7 +673,8 @@ paths: $ref: '#/components/schemas/Error' description: The request was not accepted, e.g., when the device code is expired summary: Get a specific device code. - tags: [] + tags: + - Authentication /api/auth/refresh_token: post: callbacks: {} @@ -635,20 +699,8 @@ paths: content: application/json: schema: - description: A new user access token to authenticate the user with. - properties: - access_token: - description: User access token - type: string - refresh_token: - description: User refresh token - type: string - required: - - access_token - - refresh_token - title: AuthenticationTokens - type: object - description: A new a pair of tokens was generated + $ref: '#/components/schemas/AuthenticationTokens' + description: Succcessfully generated new API tokens. 401: content: application/json: @@ -656,7 +708,8 @@ paths: $ref: '#/components/schemas/Error' description: You need to be authenticated to issue new tokens summary: Request new tokens. - tags: [] + tags: + - Authentication /api/cache: get: callbacks: {} @@ -719,7 +772,8 @@ paths: $ref: '#/components/schemas/Error' description: The project or the cache artifact doesn't exist summary: Downloads an artifact from the cache. - tags: [] + tags: + - Cache /api/cache/exists: get: callbacks: {} @@ -806,7 +860,8 @@ paths: type: object description: The artifact doesn't exist summary: It checks if an artifact exists in the cache. - tags: [] + tags: + - Cache /api/cache/multipart/complete: post: callbacks: {} @@ -905,7 +960,8 @@ paths: $ref: '#/components/schemas/Error' description: The project doesn't exist summary: It completes a multi-part upload. - tags: [] + tags: + - Cache /api/cache/multipart/generate-url: post: callbacks: {} @@ -980,7 +1036,8 @@ paths: $ref: '#/components/schemas/Error' description: The project doesn't exist summary: It generates a signed URL for uploading a part. - tags: [] + tags: + - Cache /api/cache/multipart/start: post: callbacks: {} @@ -1043,7 +1100,8 @@ paths: $ref: '#/components/schemas/Error' description: The project doesn't exist summary: It initiates a multipart upload in the cache. - tags: [] + tags: + - Cache /api/organizations: get: callbacks: {} @@ -1079,7 +1137,8 @@ paths: $ref: '#/components/schemas/Error' description: The authenticated subject is not authorized to perform this action summary: Lists the organizations - tags: [] + tags: + - Organizations post: callbacks: {} description: Creates an organization with the given name. @@ -1112,7 +1171,8 @@ paths: $ref: '#/components/schemas/Error' description: The organization could not be created due to a validation error summary: Creates an organization - tags: [] + tags: + - Organizations /api/organizations/{organization_name}: delete: callbacks: {} @@ -1147,7 +1207,8 @@ paths: $ref: '#/components/schemas/Error' description: The organization with the given name was not found summary: Deletes an organization - tags: [] + tags: + - Organizations get: callbacks: {} description: Returns the organization with the given identifier. @@ -1185,7 +1246,8 @@ paths: $ref: '#/components/schemas/Error' description: The organization with the given name was not found summary: Shows an organization - tags: [] + tags: + - Organizations patch: callbacks: {} description: Updates an organization with given parameters. @@ -1247,7 +1309,8 @@ paths: $ref: '#/components/schemas/Error' description: The organization with the given name was not found summary: Updates an organization - tags: [] + tags: + - Organizations put: callbacks: {} description: Updates an organization with given parameters. @@ -1309,7 +1372,8 @@ paths: $ref: '#/components/schemas/Error' description: The organization with the given name was not found summary: Updates an organization - tags: [] + tags: + - Organizations /api/organizations/{organization_name}/invitations: delete: callbacks: {} @@ -1359,7 +1423,8 @@ paths: $ref: '#/components/schemas/Error' description: The invitation with the given invitee email and organization name was not found summary: Cancels an invitation - tags: [] + tags: + - Invitations post: callbacks: {} description: Invites a user with a given email to a given organization. @@ -1416,7 +1481,8 @@ paths: $ref: '#/components/schemas/Error' description: The organization was not found summary: Creates an invitation - tags: [] + tags: + - Invitations /api/organizations/{organization_name}/members/{user_name}: delete: callbacks: {} @@ -1465,7 +1531,8 @@ paths: $ref: '#/components/schemas/Error' description: The organization or the user with the given name was not found summary: Removes a member from an organization - tags: [] + tags: + - Organizations put: callbacks: {} description: Updates a member in a given organization @@ -1531,7 +1598,8 @@ paths: $ref: '#/components/schemas/Error' description: The organization or the user with the given name was not found summary: Updates a member in an organization - tags: [] + tags: + - Organizations /api/organizations/{organization_name}/usage: get: callbacks: {} @@ -1570,7 +1638,8 @@ paths: $ref: '#/components/schemas/Error' description: The organization with the given name was not found summary: Shows the usage of an organization - tags: [] + tags: + - Organizations /api/projects: get: callbacks: {} @@ -1597,7 +1666,8 @@ paths: $ref: '#/components/schemas/Error' description: You need to be authenticated to access this resource summary: List projects the authenticated user has access to. - tags: [] + tags: + - Projects post: callbacks: {} operationId: createProject @@ -1648,7 +1718,8 @@ paths: $ref: '#/components/schemas/Error' description: The authenticated subject is not authorized to perform this action summary: Create a new project. - tags: [] + tags: + - Projects /api/projects/{account_handle}/{project_handle}: get: callbacks: {} @@ -1692,7 +1763,8 @@ paths: $ref: '#/components/schemas/Error' description: The project was not found summary: Returns a project based on the handle. - tags: [] + tags: + - Projects /api/projects/{account_handle}/{project_handle}/cache/clean: put: callbacks: {} @@ -1732,7 +1804,8 @@ paths: $ref: '#/components/schemas/Error' description: The project was not found summary: Cleans cache for a given project - tags: [] + tags: + - Cache /api/projects/{account_handle}/{project_handle}/tokens: get: callbacks: {} @@ -1786,7 +1859,8 @@ paths: $ref: '#/components/schemas/Error' description: The project was not found summary: List all project tokens. - tags: [] + tags: + - Project tokens post: callbacks: {} description: This endpoint returns a new project token. @@ -1838,7 +1912,8 @@ paths: $ref: '#/components/schemas/Error' description: The project was not found summary: Create a new project token. - tags: [] + tags: + - Project tokens /api/projects/{account_handle}/{project_handle}/tokens/{id}: delete: callbacks: {} @@ -1884,7 +1959,8 @@ paths: $ref: '#/components/schemas/Error' description: The project token was not found summary: Revokes a project token. - tags: [] + tags: + - Project tokens /api/projects/{id}: delete: callbacks: {} @@ -1918,7 +1994,8 @@ paths: $ref: '#/components/schemas/Error' description: The project was not found summary: Deletes a project with a given id. - tags: [] + tags: + - Projects /api/runs/{run_id}/complete: post: callbacks: {} @@ -1968,7 +2045,8 @@ paths: $ref: '#/components/schemas/Error' description: The project doesn't exist summary: It completes a multi-part upload. - tags: [] + tags: + - Analytics /api/runs/{run_id}/complete_artifacts_uploads: put: callbacks: {} @@ -2018,7 +2096,8 @@ paths: $ref: '#/components/schemas/Error' description: The command event doesn't exist summary: Completes artifacts uploads for a given command event - tags: [] + tags: + - Analytics /api/runs/{run_id}/generate-url: post: callbacks: {} @@ -2072,7 +2151,8 @@ paths: $ref: '#/components/schemas/Error' description: The project doesn't exist summary: It generates a signed URL for uploading a part. - tags: [] + tags: + - Analytics /api/runs/{run_id}/start: post: callbacks: {} @@ -2118,9 +2198,11 @@ paths: $ref: '#/components/schemas/Error' description: The command event doesn't exist summary: It initiates a multipart upload for a command event artifact. - tags: [] + tags: + - Analytics security: - authorization: [] + - cookie: [] servers: - url: http://localhost:8080 variables: {} diff --git a/Sources/TuistServer/Services/AuthenticateService.swift b/Sources/TuistServer/Services/AuthenticateService.swift new file mode 100644 index 00000000000..f85c90b027d --- /dev/null +++ b/Sources/TuistServer/Services/AuthenticateService.swift @@ -0,0 +1,76 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol AuthenticateServicing { + func authenticate( + email: String, + password: String, + serverURL: URL + ) async throws -> ServerAuthenticationTokens +} + +enum AuthenticateServiceError: FatalError { + case unknownError(Int) + case unauthorized(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .unauthorized: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "We failed to authenticate you due to an unknown Tuist response of \(statusCode)." + case let .unauthorized(message): + return message + } + } +} + +public final class AuthenticateService: AuthenticateServicing { + public init() {} + + public func authenticate( + email: String, + password: String, + serverURL: URL + ) async throws -> ServerAuthenticationTokens { + let client = Client.unauthenticated(serverURL: serverURL) + + let response = try await client.authenticate( + .init( + body: .json( + .init( + email: email, + password: password + ) + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(authenticationTokens): + return ServerAuthenticationTokens( + accessToken: authenticationTokens.access_token, + refreshToken: authenticationTokens.refresh_token + ) + } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw AuthenticateServiceError.unauthorized(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw AuthenticateServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistSupport/UserInputReader.swift b/Sources/TuistSupport/UserInputReader.swift index 43f32be3580..0b80a152d93 100644 --- a/Sources/TuistSupport/UserInputReader.swift +++ b/Sources/TuistSupport/UserInputReader.swift @@ -1,11 +1,18 @@ import Foundation +import Mockable +@Mockable public protocol UserInputReading { - /// Reads an integer from the user + /// Reads an integer from the user. /// - Parameters: - /// - prompt: The prompt to be shown to the user providing context and the allowed options - /// - maxValueAllowed: The max value allowed given the list of options provided in the prompt + /// - prompt: The prompt to be shown to the user providing context and the allowed options. + /// - maxValueAllowed: The max value allowed given the list of options provided in the prompt. func readInt(asking prompt: String, maxValueAllowed: Int) -> Int + + /// Reads a string from the user. + /// - Parameters: + /// - prompt: The prompt to be shown to the user providing context and the allowed options. + func readString(asking prompt: String) -> String } public struct UserInputReader: UserInputReading { @@ -25,4 +32,15 @@ public struct UserInputReader: UserInputReading { } } } + + public func readString(asking prompt: String) -> String { + while true { + logger.notice("\(prompt)") + if let input = reader(true), !input.isEmpty { + return input + } else { + logger.notice("The value is empty. Please, enter a non-empty value.") + } + } + } } diff --git a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift index 3ff61831dbc..958a6ec5fb3 100644 --- a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift @@ -21,8 +21,11 @@ final class ServerAcceptanceTestProjectTokens: ServerAcceptanceTestCase { TestingLogHandler.reset() try await run(ProjectTokensListCommand.self, fullHandle) let id = try XCTUnwrap( - TestingLogHandler.collected[.info, <=].components(separatedBy: .newlines).dropLast().last? - .components(separatedBy: .whitespaces).first + TestingLogHandler.collected[.info, <=] + .components(separatedBy: .newlines) + .dropLast().last? + .components(separatedBy: .whitespaces) + .first ) try await run(ProjectTokensRevokeCommand.self, id, fullHandle) TestingLogHandler.reset() @@ -32,29 +35,3 @@ final class ServerAcceptanceTestProjectTokens: ServerAcceptanceTestCase { ) } } - -// MARK: - Helpers - -class ServerAcceptanceTestCase: TuistAcceptanceTestCase { - var fullHandle: String = "" - var organizationHandle: String = "" - var projectHandle: String = "" - - override func setUp() async throws { - try await super.setUp() - environment.tuistVariables[Constants.EnvironmentVariables.token] = ProcessInfo.processInfo - .environment[Constants.EnvironmentVariables.token] - try setUpFixture(.iosAppWithFrameworks) - organizationHandle = String(UUID().uuidString.prefix(12).lowercased()) - projectHandle = String(UUID().uuidString.prefix(12).lowercased()) - fullHandle = "\(organizationHandle)/\(projectHandle)" - try await run(OrganizationCreateCommand.self, organizationHandle) - try await run(ProjectCreateCommand.self, fullHandle) - } - - override func tearDown() async throws { - try await run(ProjectDeleteCommand.self, fullHandle) - try await run(OrganizationDeleteCommand.self, organizationHandle) - try await super.tearDown() - } -} diff --git a/Tests/TuistKitTests/Services/AuthServiceTests.swift b/Tests/TuistKitTests/Services/AuthServiceTests.swift index 7f841cf2fb0..c8778318606 100644 --- a/Tests/TuistKitTests/Services/AuthServiceTests.swift +++ b/Tests/TuistKitTests/Services/AuthServiceTests.swift @@ -16,6 +16,10 @@ final class AuthServiceTests: TuistUnitTestCase { private var serverSessionController: MockServerSessionControlling! private var configLoader: MockConfigLoading! private var serverURL: URL! + private var authenticateService: MockAuthenticateServicing! + private var serverCredentialsStore: MockServerCredentialsStoring! + private var serverURLService: MockServerURLServicing! + private var userInputReader: MockUserInputReading! private var subject: AuthService! override func setUp() { @@ -23,13 +27,25 @@ final class AuthServiceTests: TuistUnitTestCase { serverSessionController = .init() configLoader = MockConfigLoading() serverURL = URL(string: "https://test.cloud.tuist.io")! + authenticateService = .init() + serverCredentialsStore = .init() + serverURLService = .init() + userInputReader = .init() given(configLoader) .loadConfig(path: .any) .willReturn(.test(url: serverURL)) + given(serverURLService) + .url(configServerURL: .any) + .willReturn(serverURL) + subject = AuthService( serverSessionController: serverSessionController, - configLoader: configLoader + serverURLService: serverURLService, + configLoader: configLoader, + userInputReader: userInputReader, + authenticateService: authenticateService, + serverCredentialsStore: serverCredentialsStore ) } @@ -37,6 +53,10 @@ final class AuthServiceTests: TuistUnitTestCase { serverSessionController = nil configLoader = nil serverURL = nil + authenticateService = nil + serverCredentialsStore = nil + serverURLService = nil + userInputReader = nil subject = nil super.tearDown() } @@ -48,6 +68,138 @@ final class AuthServiceTests: TuistUnitTestCase { .willReturn(()) // When / Then - try await subject.authenticate(directory: nil) + try await subject.authenticate( + email: nil, + password: nil, + directory: nil + ) + } + + func test_authenticate_when_password_is_provided() async throws { + // Given + given(userInputReader) + .readString(asking: .value("Email:")) + .willReturn("email@tuist.io") + + given(serverCredentialsStore) + .store( + credentials: .value( + ServerCredentials( + token: nil, + accessToken: "access-token", + refreshToken: "refresh-token" + ) + ), + serverURL: .any + ) + .willReturn() + + given(authenticateService) + .authenticate( + email: .value("email@tuist.io"), + password: .value("password"), + serverURL: .value(serverURL) + ) + .willReturn( + ServerAuthenticationTokens( + accessToken: "access-token", + refreshToken: "refresh-token" + ) + ) + + // When + try await subject.authenticate( + email: nil, + password: "password", + directory: nil + ) + + // Then + XCTAssertStandardOutput(pattern: "Credentials stored successfully.") + } + + func test_authenticate_when_email_is_provided() async throws { + // Given + given(userInputReader) + .readString(asking: .value("Password:")) + .willReturn("password") + + given(serverCredentialsStore) + .store( + credentials: .value( + ServerCredentials( + token: nil, + accessToken: "access-token", + refreshToken: "refresh-token" + ) + ), + serverURL: .any + ) + .willReturn() + + given(authenticateService) + .authenticate( + email: .value("email@tuist.io"), + password: .value("password"), + serverURL: .value(serverURL) + ) + .willReturn( + ServerAuthenticationTokens( + accessToken: "access-token", + refreshToken: "refresh-token" + ) + ) + + // When + try await subject.authenticate( + email: "email@tuist.io", + password: nil, + directory: nil + ) + + // Then + XCTAssertStandardOutput(pattern: "Credentials stored successfully.") + } + + func test_authenticate_when_email_and_password_are_provided() async throws { + // Given + given(serverCredentialsStore) + .store( + credentials: .value( + ServerCredentials( + token: nil, + accessToken: "access-token", + refreshToken: "refresh-token" + ) + ), + serverURL: .any + ) + .willReturn() + + given(authenticateService) + .authenticate( + email: .value("email@tuist.io"), + password: .value("password"), + serverURL: .value(serverURL) + ) + .willReturn( + ServerAuthenticationTokens( + accessToken: "access-token", + refreshToken: "refresh-token" + ) + ) + + // When + try await subject.authenticate( + email: "email@tuist.io", + password: "password", + directory: nil + ) + + // Then + XCTAssertStandardOutput(pattern: "Credentials stored successfully.") + verify(userInputReader) + .readString(asking: .any) + .called(0) } } diff --git a/Tests/TuistSupportTests/Utils/UserInputReaderTests.swift b/Tests/TuistSupportTests/Utils/UserInputReaderTests.swift index 971e5841679..df16e1d4946 100644 --- a/Tests/TuistSupportTests/Utils/UserInputReaderTests.swift +++ b/Tests/TuistSupportTests/Utils/UserInputReaderTests.swift @@ -29,6 +29,19 @@ class UserInputReaderTests: XCTestCase { // Then XCTAssertEqual(result, Int(String(fakeReadLine.input.last!))) } + + func test_read_string() { + // Given + let reader: UserInputReader = .init { _ in + return "string-value" + } + + // When + let result = reader.readString(asking: "prompt") + + // Then + XCTAssertEqual(result, "string-value") + } } // Custom string reader to simulate user input From c0704cea28389029d8e8f84fb4060f1cf1437482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 19 Jul 2024 09:48:06 +0200 Subject: [PATCH 438/509] Fix token not found when using TUIST_CONFIG_TOKEN environment variable (#6528) --- .../TuistLoader/Loaders/ManifestLoaderFactory.swift | 2 +- Sources/TuistSupport/Utils/Environment.swift | 10 +--------- .../TuistSupportTesting/Utils/MockEnvironment.swift | 1 - .../Loaders/ManifestLoaderFactoryTests.swift | 2 +- 4 files changed, 3 insertions(+), 12 deletions(-) diff --git a/Sources/TuistLoader/Loaders/ManifestLoaderFactory.swift b/Sources/TuistLoader/Loaders/ManifestLoaderFactory.swift index 9ea7ff0e573..0c8d047d62c 100644 --- a/Sources/TuistLoader/Loaders/ManifestLoaderFactory.swift +++ b/Sources/TuistLoader/Loaders/ManifestLoaderFactory.swift @@ -4,7 +4,7 @@ import TuistSupport public final class ManifestLoaderFactory { private let useCache: Bool public convenience init(environment: Environmenting = Environment.shared) { - let cacheSetting = environment.tuistConfigVariables[Constants.EnvironmentVariables.cacheManifests, default: "1"] + let cacheSetting = environment.tuistVariables[Constants.EnvironmentVariables.cacheManifests, default: "1"] self.init(useCache: cacheSetting == "1") } diff --git a/Sources/TuistSupport/Utils/Environment.swift b/Sources/TuistSupport/Utils/Environment.swift index e8cd38e5c7f..79f0be50879 100644 --- a/Sources/TuistSupport/Utils/Environment.swift +++ b/Sources/TuistSupport/Utils/Environment.swift @@ -21,9 +21,6 @@ public protocol Environmenting: AnyObject, Sendable { /// Returns all the environment variables that are specific to Tuist (prefixed with TUIST_) var tuistVariables: [String: String] { get } - /// Returns all the environment variables that are specific to Tuist configuration (prefixed with TUIST_CONFIG_) - var tuistConfigVariables: [String: String] { get } - /// Returns all the environment variables that can be included during the manifest loading process var manifestLoadingVariables: [String: String] { get } @@ -167,12 +164,7 @@ public final class Environment: Environmenting { /// Returns all the environment variables that are specific to Tuist (prefixed with TUIST_) public var tuistVariables: [String: String] { - ProcessInfo.processInfo.environment.filter { $0.key.hasPrefix("TUIST_") }.filter { !$0.key.hasPrefix("TUIST_CONFIG_") } - } - - /// Returns all the environment variables that are specific to Tuist config (prefixed with TUIST_CONFIG_) - public var tuistConfigVariables: [String: String] { - ProcessInfo.processInfo.environment.filter { $0.key.hasPrefix("TUIST_CONFIG_") } + ProcessInfo.processInfo.environment.filter { $0.key.hasPrefix("TUIST_") } } public var manifestLoadingVariables: [String: String] { diff --git a/Sources/TuistSupportTesting/Utils/MockEnvironment.swift b/Sources/TuistSupportTesting/Utils/MockEnvironment.swift index fba6246d5ae..c1a132fad5e 100644 --- a/Sources/TuistSupportTesting/Utils/MockEnvironment.swift +++ b/Sources/TuistSupportTesting/Utils/MockEnvironment.swift @@ -22,7 +22,6 @@ public class MockEnvironment: Environmenting { public var shouldOutputBeColoured: Bool = false public var isStandardOutputInteractive: Bool = false public var tuistVariables: [String: String] = [:] - public var tuistConfigVariables: [String: String] = [:] public var manifestLoadingVariables: [String: String] = [:] public var isStatsEnabled: Bool = true public var isGitHubActions: Bool = false diff --git a/Tests/TuistLoaderTests/Loaders/ManifestLoaderFactoryTests.swift b/Tests/TuistLoaderTests/Loaders/ManifestLoaderFactoryTests.swift index b154032493b..8c4dc6ab93e 100644 --- a/Tests/TuistLoaderTests/Loaders/ManifestLoaderFactoryTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ManifestLoaderFactoryTests.swift @@ -25,7 +25,7 @@ final class ManifestLoaderFactoryTests: TuistUnitTestCase { func test_create_non_cached_manifest_loader_when_explicitely_configured_via_enviromentvariable() { // Given - environment.tuistConfigVariables[Constants.EnvironmentVariables.cacheManifests] = "0" + environment.tuistVariables[Constants.EnvironmentVariables.cacheManifests] = "0" let sut = ManifestLoaderFactory() // When let result = sut.createManifestLoader() From 44eda876ea8a46dda8b20a9596e04d8907358d57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 19 Jul 2024 10:35:02 +0200 Subject: [PATCH 439/509] Fix optionalAuthentication generation option in Config.swift (#6530) --- Sources/TuistCore/Models/Config.swift | 6 ++- .../Config+ManifestMapper.swift | 3 +- .../Loaders/ConfigLoaderTests.swift | 40 +++++++++++++++++-- 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/Sources/TuistCore/Models/Config.swift b/Sources/TuistCore/Models/Config.swift index c6885e87786..70f6c78c757 100644 --- a/Sources/TuistCore/Models/Config.swift +++ b/Sources/TuistCore/Models/Config.swift @@ -112,7 +112,8 @@ public struct Config: Equatable, Hashable { clonedSourcePackagesDirPath: AbsolutePath? = nil, staticSideEffectsWarningTargets: TuistCore.Config.GenerationOptions.StaticSideEffectsWarningTargets = .all, enforceExplicitDependencies: Bool = false, - defaultConfiguration: String? = nil + defaultConfiguration: String? = nil, + optionalAuthentication: Bool = false ) -> Self { .init( resolveDependenciesWithSystemScm: resolveDependenciesWithSystemScm, @@ -120,7 +121,8 @@ public struct Config: Equatable, Hashable { clonedSourcePackagesDirPath: clonedSourcePackagesDirPath, staticSideEffectsWarningTargets: staticSideEffectsWarningTargets, enforceExplicitDependencies: enforceExplicitDependencies, - defaultConfiguration: defaultConfiguration + defaultConfiguration: defaultConfiguration, + optionalAuthentication: optionalAuthentication ) } } diff --git a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift index 24ef17d0ccb..2b1edf83669 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Config+ManifestMapper.swift @@ -96,7 +96,8 @@ extension TuistCore.Config.GenerationOptions { staticSideEffectsWarningTargets: TuistCore.Config.GenerationOptions.StaticSideEffectsWarningTargets .from(manifest: manifest.staticSideEffectsWarningTargets), enforceExplicitDependencies: manifest.enforceExplicitDependencies, - defaultConfiguration: manifest.defaultConfiguration + defaultConfiguration: manifest.defaultConfiguration, + optionalAuthentication: manifest.optionalAuthentication ) } } diff --git a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift index 07e0aba29c9..4e5a11faa62 100644 --- a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift @@ -138,7 +138,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { stub( config: .test( fullHandle: "tuist/tuist", - url: "https://test.cloud.tuist.io" + url: "https://test.tuist.io" ), at: "/project/Tuist" ) @@ -150,7 +150,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { XCTAssertBetterEqual(result, TuistCore.Config( compatibleXcodeVersions: .all, fullHandle: "tuist/tuist", - url: try XCTUnwrap(URL(string: "https://test.cloud.tuist.io")), + url: try XCTUnwrap(URL(string: "https://test.tuist.io")), swiftVersion: nil, plugins: [], generationOptions: .test(), @@ -158,6 +158,38 @@ final class ConfigLoaderTests: TuistUnitTestCase { )) } + func test_loadConfig_with_full_handle_and_url_and_optional_authentication() throws { + // Given + stub(rootDirectory: "/project") + stub(path: "/project/Tuist/Config.swift", exists: true) + stub( + config: .test( + fullHandle: "tuist/tuist", + url: "https://test.tuist.io", + generationOptions: .options( + optionalAuthentication: true + ) + ), + at: "/project/Tuist" + ) + + // When + let result = try subject.loadConfig(path: "/project") + + // Then + XCTAssertBetterEqual(result, TuistCore.Config( + compatibleXcodeVersions: .all, + fullHandle: "tuist/tuist", + url: try XCTUnwrap(URL(string: "https://test.tuist.io")), + swiftVersion: nil, + plugins: [], + generationOptions: .test( + optionalAuthentication: true + ), + path: "/project/Tuist/Config.swift" + )) + } + func test_loadConfig_with_deprecated_cloud() throws { // Given stub(rootDirectory: "/project") @@ -166,7 +198,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { config: ProjectDescription.Config( cloud: .cloud( projectId: "tuist/tuist", - url: "https://test.cloud.tuist.io" + url: "https://test.tuist.io" ) ), at: "/project/Tuist" @@ -179,7 +211,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { XCTAssertBetterEqual(result, TuistCore.Config( compatibleXcodeVersions: .all, fullHandle: "tuist/tuist", - url: try XCTUnwrap(URL(string: "https://test.cloud.tuist.io")), + url: try XCTUnwrap(URL(string: "https://test.tuist.io")), swiftVersion: nil, plugins: [], generationOptions: .test(), From 16d5da57262f9469a4f8d34d6daa2b2119a06354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 19 Jul 2024 10:35:25 +0200 Subject: [PATCH 440/509] Mark the Cloud static initializer as deprecated (#6531) --- Sources/ProjectDescription/Cloud.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/ProjectDescription/Cloud.swift b/Sources/ProjectDescription/Cloud.swift index 7e7a75ab48f..d85052920a4 100644 --- a/Sources/ProjectDescription/Cloud.swift +++ b/Sources/ProjectDescription/Cloud.swift @@ -24,6 +24,7 @@ public struct Cloud: Codable, Equatable, Sendable { /// - url: Base URL to the Cloud server. /// - options: Cloud options. /// - Returns: A Cloud instance. + @available(*, deprecated, message: "Use the `fullHandle` and `url` properties directly in the `Config`") public static func cloud(projectId: String, url: String = "https://cloud.tuist.io", options: [Option] = []) -> Cloud { Cloud(url: url, projectId: projectId, options: options) } From bcf09ddb6a702ecbf4958a0be8255b8be6435d15 Mon Sep 17 00:00:00 2001 From: fortmarek Date: Fri, 19 Jul 2024 10:36:14 +0200 Subject: [PATCH 441/509] Update release date --- .../Client/ServerClientCLIMetadataHeadersMiddleware.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift b/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift index b63fbe78450..06fb11e9e2e 100644 --- a/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift +++ b/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift @@ -5,7 +5,7 @@ import TuistSupport /// This middleware includes the release date of the CLI in the headers so that we can show /// warnings if the on-premise installation is too old. struct ServerClientCLIMetadataHeadersMiddleware: ClientMiddleware { - let releaseDate = "2024.07.16" + let releaseDate = "2024.07.19" func intercept( _ request: Request, From 090f95d2134a24b76a6f498c7282d1df3d11a015 Mon Sep 17 00:00:00 2001 From: Tuist Date: Fri, 19 Jul 2024 09:22:03 +0000 Subject: [PATCH 442/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.21.2 --- .mise.toml | 2 +- CHANGELOG.md | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index ae4555920db..49cd7141615 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.21.1" +tuist = "4.21.2" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d1d8dbb593..cd91050403c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## 4.21.2 - 2024-07-19 + +### Tuist + +#### Changed + +- Mark the Cloud static initializer as deprecated [#6531](https://github.com/tuist/tuist/pull/6531) by [@fortmarek](https://github.com/fortmarek) + +#### Added + +- Add email and password auth options for non-interactive login [#6507](https://github.com/tuist/tuist/pull/6507) by [@fortmarek](https://github.com/fortmarek) + +#### Fixed + +- Fix token not found when using TUIST_CONFIG_TOKEN environment variable [#6528](https://github.com/tuist/tuist/pull/6528) by [@fortmarek](https://github.com/fortmarek) +- Fix optionalAuthentication generation option in Config.swift [#6530](https://github.com/tuist/tuist/pull/6530) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +- no changes + ## 4.21.1 - 2024-07-17 ### Tuist From 9b016c52f0e387dbdb52fe32a8268865f6ff2ec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 19 Jul 2024 11:36:16 +0200 Subject: [PATCH 443/509] Mark the Cloud static initializer as deprecated (#6529) --- Sources/ProjectDescription/Config.swift | 1 - Tuist/Config.swift | 12 ++++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Sources/ProjectDescription/Config.swift b/Sources/ProjectDescription/Config.swift index 566963a7c06..dfb1dde5008 100644 --- a/Sources/ProjectDescription/Config.swift +++ b/Sources/ProjectDescription/Config.swift @@ -38,7 +38,6 @@ public struct Config: Codable, Equatable, Sendable { public let plugins: [PluginLocation] /// Cloud configuration. - @available(*, deprecated, message: "Use the `fullHandle` and `url` properties directly in the `Config`") public let cloud: Cloud? /// The full project handle such as tuist-org/tuist. diff --git a/Tuist/Config.swift b/Tuist/Config.swift index 2246a831dd2..5ea567db25f 100644 --- a/Tuist/Config.swift +++ b/Tuist/Config.swift @@ -1,10 +1,10 @@ import ProjectDescription let config = Config( - cloud: .cloud( - projectId: "tuist/tuist", - url: "https://cloud.tuist.io", - options: [.optional] - ), - swiftVersion: .init("5.10") + fullHandle: "tuist/tuist", + url: "https://cloud.tuist.io", + swiftVersion: .init("5.10"), + generationOptions: .options( + optionalAuthentication: true + ) ) From 8dccd2d87f1f5247e462faf867d834b2ec1d1b49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 19 Jul 2024 12:19:54 +0200 Subject: [PATCH 444/509] Generate Config.swift to isolate the project (#6526) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Generate Config.swift to isolate the project * Address PR feedback * Update Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift Co-authored-by: Pedro Piñera Buendía <663605+pepicrft@users.noreply.github.com> * Update url in ios_app_with_frameworks fixture --------- Co-authored-by: Pedro Piñera Buendía <663605+pepicrft@users.noreply.github.com> --- .../ServerAcceptanceTestCase.swift | 13 ++ .../TuistAcceptanceTestCase.swift | 49 +++++- .../Cache/CacheDirectoriesProvider.swift | 22 ++- Sources/TuistSupport/Utils/Environment.swift | 11 ++ .../Utils/MockEnvironment.swift | 4 + .../ios_app_with_frameworks/App/Project.swift | 124 ++++++++++++++- .../Framework1/Project.swift | 45 ------ .../Framework2/Project.swift | 50 ------ .../Framework3/Project.swift | 18 --- .../Framework4/Project.swift | 18 --- .../Framework5/Project.swift | 18 --- .../ios_app_with_frameworks/Project.swift | 150 ++++++++++++++++++ .../Tuist/Config.swift | 2 +- .../ios_app_with_frameworks/Workspace.swift | 6 - 14 files changed, 359 insertions(+), 171 deletions(-) delete mode 100644 fixtures/ios_app_with_frameworks/Framework1/Project.swift delete mode 100644 fixtures/ios_app_with_frameworks/Framework2/Project.swift delete mode 100644 fixtures/ios_app_with_frameworks/Framework3/Project.swift delete mode 100644 fixtures/ios_app_with_frameworks/Framework4/Project.swift delete mode 100644 fixtures/ios_app_with_frameworks/Framework5/Project.swift create mode 100644 fixtures/ios_app_with_frameworks/Project.swift delete mode 100644 fixtures/ios_app_with_frameworks/Workspace.swift diff --git a/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift b/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift index 2174246373d..19ba5cf42a3 100644 --- a/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift +++ b/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift @@ -1,4 +1,5 @@ import Foundation +import TuistSupport import XCTest @testable import TuistKit @@ -19,6 +20,18 @@ open class ServerAcceptanceTestCase: TuistAcceptanceTestCase { try await run(AuthCommand.self, "--email", email, "--password", password) try await run(OrganizationCreateCommand.self, organizationHandle) try await run(ProjectCreateCommand.self, fullHandle) + try FileHandler.shared.write( + """ + import ProjectDescription + + let config = Config( + fullHandle: "\(fullHandle)", + url: "\(ProcessInfo.processInfo.environment["TUIST_URL"] ?? "https://canary.tuist.io")" + ) + """, + path: fixturePath.appending(components: "Tuist", "Config.swift"), + atomically: true + ) } override open func tearDown() async throws { diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift index db2982984a4..66827ddeca6 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift @@ -3,6 +3,7 @@ import Path import TuistCore @_exported import TuistKit import XcodeGraph +import XcodeProj import XCTest @testable import TuistSupport @@ -30,10 +31,10 @@ open class TuistAcceptanceTestCase: XCTestCase { LoggingSystem.bootstrap(AcceptanceTestCaseLogHandler.init) } - derivedDataDirectory = try! TemporaryDirectory(removeTreeOnDeinit: true) - fixtureTemporaryDirectory = try! TemporaryDirectory(removeTreeOnDeinit: true) + derivedDataDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) + fixtureTemporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) - sourceRootPath = try! AbsolutePath( + sourceRootPath = try AbsolutePath( validating: ProcessInfo.processInfo.environment[ "TUIST_CONFIG_SRCROOT" ]! @@ -190,6 +191,48 @@ open class TuistAcceptanceTestCase: XCTestCase { contents += "\n" try FileHandler.shared.write(contents, path: filePath, atomically: true) } + + public func XCTAssertXCFrameworkLinked( + _ framework: String, + by targetName: String, + file: StaticString = #file, + line: UInt = #line + ) throws { + let xcodeproj = try XcodeProj(pathString: xcodeprojPath.pathString) + let target = try XCTUnwrapTarget(targetName, in: xcodeproj) + + guard try target.frameworksBuildPhase()?.files? + .contains(where: { $0.file?.nameOrPath == "\(framework).xcframework" }) == true + else { + XCTFail( + "Target \(targetName) doesn't link the xcframework \(framework)", + file: file, + line: line + ) + return + } + } + + public func XCTAssertXCFrameworkNotLinked( + _ framework: String, + by targetName: String, + file: StaticString = #file, + line: UInt = #line + ) throws { + let xcodeproj = try XcodeProj(pathString: xcodeprojPath.pathString) + let target = try XCTUnwrapTarget(targetName, in: xcodeproj) + + if try target.frameworksBuildPhase()?.files? + .contains(where: { $0.file?.nameOrPath == "\(framework).xcframework" }) == true + { + XCTFail( + "Target \(targetName) links the xcframework \(framework)", + file: file, + line: line + ) + return + } + } } // swiftlint:enable force_try diff --git a/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift b/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift index 909e12d4438..05b680d2dbb 100644 --- a/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift +++ b/Sources/TuistCore/Cache/CacheDirectoriesProvider.swift @@ -8,27 +8,35 @@ import XcodeGraph public protocol CacheDirectoriesProviding { /// Returns the cache directory for a Tuist cache category func cacheDirectory(for category: CacheCategory) throws -> AbsolutePath - func cacheDirectory() throws -> AbsolutePath + func cacheDirectory() -> AbsolutePath } public final class CacheDirectoriesProvider: CacheDirectoriesProviding { private let fileHandler: FileHandling + private let environment: Environmenting - init(fileHandler: FileHandling) { + init( + fileHandler: FileHandling, + environment: Environmenting + ) { self.fileHandler = fileHandler + self.environment = environment } public convenience init() { - self.init(fileHandler: FileHandler.shared) + self.init( + fileHandler: FileHandler.shared, + environment: Environment.shared + ) } public func cacheDirectory(for category: CacheCategory) throws -> AbsolutePath { - try cacheDirectory().appending(components: ["tuist", category.directoryName]) + cacheDirectory().appending(components: ["tuist", category.directoryName]) } - public func cacheDirectory() throws -> Path.AbsolutePath { - if let xdgCacheHome = ProcessInfo.processInfo.environment["XDG_CACHE_HOME"] { - return try AbsolutePath(validating: xdgCacheHome) + public func cacheDirectory() -> Path.AbsolutePath { + if let cacheDirectory = environment.cacheDirectory { + return cacheDirectory } else { return FileHandler.shared.homeDirectory.appending(components: ".cache") } diff --git a/Sources/TuistSupport/Utils/Environment.swift b/Sources/TuistSupport/Utils/Environment.swift index 79f0be50879..93e3037b460 100644 --- a/Sources/TuistSupport/Utils/Environment.swift +++ b/Sources/TuistSupport/Utils/Environment.swift @@ -27,6 +27,9 @@ public protocol Environmenting: AnyObject, Sendable { /// Returns true if Tuist is running with verbose mode enabled. var isVerbose: Bool { get } + /// Returns the path to the cache directory. Configurable via the `XDG_CACHE_HOME` environment variable + var cacheDirectory: AbsolutePath? { get } + /// Returns the path to the directory where the async queue events are persisted. var queueDirectory: AbsolutePath { get } @@ -149,6 +152,14 @@ public final class Environment: Environmenting { } } + public var cacheDirectory: AbsolutePath? { + if let cacheDirectoryPathString = ProcessInfo.processInfo.environment["XDG_CACHE_HOME"] { + return try? AbsolutePath(validating: cacheDirectoryPathString) + } else { + return nil + } + } + public var automationPath: AbsolutePath? { ProcessInfo.processInfo.environment[Constants.EnvironmentVariables.automationPath] .map { try! AbsolutePath(validating: $0) } // swiftlint:disable:this force_try diff --git a/Sources/TuistSupportTesting/Utils/MockEnvironment.swift b/Sources/TuistSupportTesting/Utils/MockEnvironment.swift index c1a132fad5e..73f1c637cfb 100644 --- a/Sources/TuistSupportTesting/Utils/MockEnvironment.swift +++ b/Sources/TuistSupportTesting/Utils/MockEnvironment.swift @@ -38,6 +38,10 @@ public class MockEnvironment: Environmenting { nil } + public var cacheDirectory: AbsolutePath? { + directory.path.appending(components: ".cache") + } + public var queueDirectory: AbsolutePath { queueDirectoryStub ?? directory.path.appending(component: Constants.AsyncQueue.directoryName) } diff --git a/fixtures/ios_app_with_frameworks/App/Project.swift b/fixtures/ios_app_with_frameworks/App/Project.swift index ccfbd8d5caf..e4ab68289fe 100644 --- a/fixtures/ios_app_with_frameworks/App/Project.swift +++ b/fixtures/ios_app_with_frameworks/App/Project.swift @@ -14,11 +14,11 @@ let project = Project( product: .app, bundleId: "io.tuist.App", infoPlist: .extendingDefault(with: [:]), - sources: "Sources/**", - resources: "Sources/Main.storyboard", + sources: "App/Sources/**", + resources: "App/Sources/Main.storyboard", dependencies: [ - .project(target: "Framework1", path: "../Framework1"), - .project(target: "Framework2-iOS", path: "../Framework2"), + .target(name: "Framework1") + .target(name: "Framework2-iOS"), ] ), .target( @@ -27,10 +27,124 @@ let project = Project( product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: .extendingDefault(with: [:]), - sources: "Tests/**", + sources: "App/Tests/**", dependencies: [ .target(name: "App"), ] ), + .target( + name: "Framework1", + destinations: .iOS, + product: .framework, + productName: "Framework1", + bundleId: "io.tuist.Framework1", + infoPlist: .dictionary( + [ + "CFBundleDevelopmentRegion": "$(DEVELOPMENT_LANGUAGE)", + "CFBundleExecutable": "$(EXECUTABLE_NAME)", + "CFBundleIdentifier": "$(PRODUCT_BUNDLE_IDENTIFIER)", + "CFBundleInfoDictionaryVersion": "6.0", + "CFBundleName": "$(PRODUCT_NAME)", + "CFBundlePackageType": "APPL", + "CFBundleShortVersionString": "1.0", + "CFBundleVersion": "1", + "LSRequiresIPhoneOS": true, + "NSHumanReadableCopyright": "Copyright ©. All rights reserved.", + "Test": "Value", + ] + ), + sources: "Framework1/Sources/**", + dependencies: [ + .target(name: "Framework2-iOS"), + ] + ), + .target( + name: "Framework1Tests", + destinations: .iOS, + product: .unitTests, + productName: "Framework1Tests", + bundleId: "io.tuist.Framework1Tests", + infoPlist: "Config/Framework1Tests-Info.plist", + sources: "Framework1/Tests/**", + dependencies: [ + .target(name: "Framework1"), + ] + ), + .target( + name: "Framework2-iOS", + destinations: .iOS, + product: .framework, + productName: "Framework2", + bundleId: "io.tuist.Framework2", + infoPlist: "Config/Framework2-Info.plist", + sources: "Sources/**", + headers: .headers( + public: "Sources/Public/**", + private: "Sources/Private/**", + project: "Sources/Project/**" + ), + dependencies: [ + .target(name: "Framework3"), + ] + ), + .target( + name: "Framework2-macOS", + destinations: [.mac], + product: .framework, + productName: "Framework2", + bundleId: "io.tuist.Framework2", + infoPlist: "Config/Framework2-Info.plist", + sources: "Framework2/Sources/**", + headers: .headers( + public: "Framework2/Sources/Public/**", + private: "Framework2/Sources/Private/**", + project: "Framework2/Sources/Project/**" + ), + dependencies: [] + ), + .target( + name: "Framework2Tests", + destinations: .iOS, + product: .unitTests, + bundleId: "io.tuist.Framework2Tests", + infoPlist: "Config/Framework2Tests-Info.plist", + sources: "Framework2/Tests/**", + dependencies: [ + .target(name: "Framework2-iOS"), + ] + ), + .target( + name: "Framework3", + destinations: .iOS, + product: .framework, + bundleId: "io.tuist.Framework3", + infoPlist: "Config/Framework3-Info.plist", + sources: "Framework3/Sources/**", + dependencies: [ + .target(name: "Framework4"), + ] + ), + .target( + name: "Framework4", + destinations: .iOS, + product: .framework, + bundleId: "io.tuist.Framework4", + infoPlist: "Config/Framework4-Info.plist", + sources: "Framework4/Sources/**", + dependencies: [ + .target(name: "Framework5"), + ] + ), + .target( + name: "Framework5", + destinations: .iOS, + product: .framework, + bundleId: "io.tuist.Framework5", + infoPlist: "Config/Framework5-Info.plist", + sources: "Framework5/Sources/**", + dependencies: [ + .sdk(name: "ARKit", type: .framework), + ] + ), ] ) diff --git a/fixtures/ios_app_with_frameworks/Framework1/Project.swift b/fixtures/ios_app_with_frameworks/Framework1/Project.swift deleted file mode 100644 index 92f452c33ea..00000000000 --- a/fixtures/ios_app_with_frameworks/Framework1/Project.swift +++ /dev/null @@ -1,45 +0,0 @@ -import ProjectDescription - -let infoPlist: [String: Plist.Value] = [ - "CFBundleDevelopmentRegion": "$(DEVELOPMENT_LANGUAGE)", - "CFBundleExecutable": "$(EXECUTABLE_NAME)", - "CFBundleIdentifier": "$(PRODUCT_BUNDLE_IDENTIFIER)", - "CFBundleInfoDictionaryVersion": "6.0", - "CFBundleName": "$(PRODUCT_NAME)", - "CFBundlePackageType": "APPL", - "CFBundleShortVersionString": "1.0", - "CFBundleVersion": "1", - "LSRequiresIPhoneOS": true, - "NSHumanReadableCopyright": "Copyright ©. All rights reserved.", - "Test": "Value", -] - -let project = Project( - name: "Framework1", - targets: [ - .target( - name: "Framework1", - destinations: .iOS, - product: .framework, - productName: "Framework1", - bundleId: "io.tuist.Framework1", - infoPlist: .dictionary(infoPlist), - sources: "Sources/**", - dependencies: [ - .project(target: "Framework2-iOS", path: "../Framework2"), - ] - ), - .target( - name: "Framework1Tests", - destinations: .iOS, - product: .unitTests, - productName: "Framework1Tests", - bundleId: "io.tuist.Framework1Tests", - infoPlist: "Config/Framework1Tests-Info.plist", - sources: "Tests/**", - dependencies: [ - .target(name: "Framework1"), - ] - ), - ] -) diff --git a/fixtures/ios_app_with_frameworks/Framework2/Project.swift b/fixtures/ios_app_with_frameworks/Framework2/Project.swift deleted file mode 100644 index 2d11b748939..00000000000 --- a/fixtures/ios_app_with_frameworks/Framework2/Project.swift +++ /dev/null @@ -1,50 +0,0 @@ -import ProjectDescription - -let project = Project( - name: "Framework2", - targets: [ - .target( - name: "Framework2-iOS", - destinations: .iOS, - product: .framework, - productName: "Framework2", - bundleId: "io.tuist.Framework2", - infoPlist: "Config/Framework2-Info.plist", - sources: "Sources/**", - headers: .headers( - public: "Sources/Public/**", - private: "Sources/Private/**", - project: "Sources/Project/**" - ), - dependencies: [ - .project(target: "Framework3", path: "../Framework3"), - ] - ), - .target( - name: "Framework2-macOS", - destinations: [.mac], - product: .framework, - productName: "Framework2", - bundleId: "io.tuist.Framework2", - infoPlist: "Config/Framework2-Info.plist", - sources: "Sources/**", - headers: .headers( - public: "Sources/Public/**", - private: "Sources/Private/**", - project: "Sources/Project/**" - ), - dependencies: [] - ), - .target( - name: "Framework2Tests", - destinations: .iOS, - product: .unitTests, - bundleId: "io.tuist.Framework2Tests", - infoPlist: "Config/Framework2Tests-Info.plist", - sources: "Tests/**", - dependencies: [ - .target(name: "Framework2-iOS"), - ] - ), - ] -) diff --git a/fixtures/ios_app_with_frameworks/Framework3/Project.swift b/fixtures/ios_app_with_frameworks/Framework3/Project.swift deleted file mode 100644 index 6d415edb0ea..00000000000 --- a/fixtures/ios_app_with_frameworks/Framework3/Project.swift +++ /dev/null @@ -1,18 +0,0 @@ -import ProjectDescription - -let project = Project( - name: "Framework3", - targets: [ - .target( - name: "Framework3", - destinations: .iOS, - product: .framework, - bundleId: "io.tuist.Framework3", - infoPlist: "Config/Framework3-Info.plist", - sources: "Sources/**", - dependencies: [ - .project(target: "Framework4", path: "../Framework4"), - ] - ), - ] -) diff --git a/fixtures/ios_app_with_frameworks/Framework4/Project.swift b/fixtures/ios_app_with_frameworks/Framework4/Project.swift deleted file mode 100644 index 8dabf9cd5f5..00000000000 --- a/fixtures/ios_app_with_frameworks/Framework4/Project.swift +++ /dev/null @@ -1,18 +0,0 @@ -import ProjectDescription - -let project = Project( - name: "Framework4", - targets: [ - .target( - name: "Framework4", - destinations: .iOS, - product: .framework, - bundleId: "io.tuist.Framework4", - infoPlist: "Config/Framework4-Info.plist", - sources: "Sources/**", - dependencies: [ - .project(target: "Framework5", path: "../Framework5"), - ] - ), - ] -) diff --git a/fixtures/ios_app_with_frameworks/Framework5/Project.swift b/fixtures/ios_app_with_frameworks/Framework5/Project.swift deleted file mode 100644 index c0add1a782e..00000000000 --- a/fixtures/ios_app_with_frameworks/Framework5/Project.swift +++ /dev/null @@ -1,18 +0,0 @@ -import ProjectDescription - -let project = Project( - name: "Framework5", - targets: [ - .target( - name: "Framework5", - destinations: .iOS, - product: .framework, - bundleId: "io.tuist.Framework5", - infoPlist: "Config/Framework5-Info.plist", - sources: "Sources/**", - dependencies: [ - .sdk(name: "ARKit", type: .framework), - ] - ), - ] -) diff --git a/fixtures/ios_app_with_frameworks/Project.swift b/fixtures/ios_app_with_frameworks/Project.swift new file mode 100644 index 00000000000..0b3f7f9bb3b --- /dev/null +++ b/fixtures/ios_app_with_frameworks/Project.swift @@ -0,0 +1,150 @@ +import ProjectDescription + +let settings: Settings = .settings(base: [ + "HEADER_SEARCH_PATHS": "path/to/lib/include", +]) + +let project = Project( + name: "MainApp", + settings: settings, + targets: [ + .target( + name: "App", + destinations: .iOS, + product: .app, + bundleId: "io.tuist.App", + infoPlist: .extendingDefault(with: [:]), + sources: "App/Sources/**", + resources: "App/Sources/Main.storyboard", + dependencies: [ + .target(name: "Framework1"), + .target(name: "Framework2-iOS"), + ] + ), + .target( + name: "AppTests", + destinations: .iOS, + product: .unitTests, + bundleId: "io.tuist.AppTests", + infoPlist: .extendingDefault(with: [:]), + sources: "App/Tests/**", + dependencies: [ + .target(name: "App"), + ] + ), + .target( + name: "Framework1", + destinations: .iOS, + product: .framework, + productName: "Framework1", + bundleId: "io.tuist.Framework1", + infoPlist: .dictionary( + [ + "CFBundleDevelopmentRegion": "$(DEVELOPMENT_LANGUAGE)", + "CFBundleExecutable": "$(EXECUTABLE_NAME)", + "CFBundleIdentifier": "$(PRODUCT_BUNDLE_IDENTIFIER)", + "CFBundleInfoDictionaryVersion": "6.0", + "CFBundleName": "$(PRODUCT_NAME)", + "CFBundlePackageType": "APPL", + "CFBundleShortVersionString": "1.0", + "CFBundleVersion": "1", + "LSRequiresIPhoneOS": true, + "NSHumanReadableCopyright": "Copyright ©. All rights reserved.", + "Test": "Value", + ] + ), + sources: "Framework1/Sources/**", + dependencies: [ + .target(name: "Framework2-iOS"), + ] + ), + .target( + name: "Framework1Tests", + destinations: .iOS, + product: .unitTests, + productName: "Framework1Tests", + bundleId: "io.tuist.Framework1Tests", + infoPlist: "Framework1/Config/Framework1Tests-Info.plist", + sources: "Framework1/Tests/**", + dependencies: [ + .target(name: "Framework1"), + ] + ), + .target( + name: "Framework2-iOS", + destinations: .iOS, + product: .framework, + productName: "Framework2", + bundleId: "io.tuist.Framework2", + infoPlist: "Framework2/Config/Framework2-Info.plist", + sources: "Framework2/Sources/**", + headers: .headers( + public: "Framework2/Sources/Public/**", + private: "Framework2/Sources/Private/**", + project: "Framework2/Sources/Project/**" + ), + dependencies: [ + .target(name: "Framework3"), + ] + ), + .target( + name: "Framework2-macOS", + destinations: [.mac], + product: .framework, + productName: "Framework2", + bundleId: "io.tuist.Framework2", + infoPlist: "Framework2/Config/Framework2-Info.plist", + sources: "Framework2/Sources/**", + headers: .headers( + public: "Framework2/Sources/Public/**", + private: "Framework2/Sources/Private/**", + project: "Framework2/Sources/Project/**" + ), + dependencies: [] + ), + .target( + name: "Framework2Tests", + destinations: .iOS, + product: .unitTests, + bundleId: "io.tuist.Framework2Tests", + infoPlist: "Framework2/Config/Framework2Tests-Info.plist", + sources: "Framework2/Tests/**", + dependencies: [ + .target(name: "Framework2-iOS"), + ] + ), + .target( + name: "Framework3", + destinations: .iOS, + product: .framework, + bundleId: "io.tuist.Framework3", + infoPlist: "Framework3/Config/Framework3-Info.plist", + sources: "Framework3/Sources/**", + dependencies: [ + .target(name: "Framework4"), + ] + ), + .target( + name: "Framework4", + destinations: .iOS, + product: .framework, + bundleId: "io.tuist.Framework4", + infoPlist: "Framework4/Config/Framework4-Info.plist", + sources: "Framework4/Sources/**", + dependencies: [ + .target(name: "Framework5"), + ] + ), + .target( + name: "Framework5", + destinations: .iOS, + product: .framework, + bundleId: "io.tuist.Framework5", + infoPlist: "Framework5/Config/Framework5-Info.plist", + sources: "Framework5/Sources/**", + dependencies: [ + .sdk(name: "ARKit", type: .framework), + ] + ), + ] +) diff --git a/fixtures/ios_app_with_frameworks/Tuist/Config.swift b/fixtures/ios_app_with_frameworks/Tuist/Config.swift index 08971659be8..31337706949 100644 --- a/fixtures/ios_app_with_frameworks/Tuist/Config.swift +++ b/fixtures/ios_app_with_frameworks/Tuist/Config.swift @@ -2,7 +2,7 @@ import ProjectDescription let config = Config( fullHandle: "tuist/tuist-cloud-acceptance-tests", - url: "https://cloud-canary.tuist.io", + url: "https://canary.tuist.io", generationOptions: .options( optionalAuthentication: true ) diff --git a/fixtures/ios_app_with_frameworks/Workspace.swift b/fixtures/ios_app_with_frameworks/Workspace.swift deleted file mode 100644 index 929bf3b53aa..00000000000 --- a/fixtures/ios_app_with_frameworks/Workspace.swift +++ /dev/null @@ -1,6 +0,0 @@ -import ProjectDescription - -let workspace = Workspace( - name: "Workspace", - projects: ["App", "Framework1", "Framework2"] -) From d0b904c3f352956c54a2f70537566c4216b8b50d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Mon, 22 Jul 2024 14:49:41 +0200 Subject: [PATCH 445/509] Migrate `FileHandler.shared.delete` to `await FileSystem().remove` (#6533) * Declare dependency * Add dependencies * Remove the usage from TuistAsyncQueue * Use FileSystem.remove from TuistAutomation * Remove the usages of FileHandler.delete from TuistServer * Update TuistGenerator to use FileSystem.remove * Update usages of FileHandler.delete in TuistSupport to use FileSystem.remove * Update TuistKit to use FileSystem.remove * More updates * Some final fixes * Fix issue after rebase * Fix the linting error * Remove usages of Task.detached * Set FileSystem product to staticFramework * Fix Package.swift * Add missing dependencies * Fix linting issue --- Package.resolved | 42 +++++++++- Package.swift | 14 +++- .../ServerAcceptanceTestCase.swift | 2 +- Sources/TuistAnalytics/TuistAnalytics.swift | 4 +- .../Utilities/TuistAnalyticsDispatcher.swift | 8 +- Sources/TuistAsyncQueue/AsyncQueue.swift | 22 +++--- .../TuistAsyncQueue/AsyncQueuePersistor.swift | 25 +++--- .../MockAsyncQueueDispatcher.swift | 18 ++++- .../Utilities/TargetBuilder.swift | 27 +++---- .../AsyncQueue/AsyncQueueDispatching.swift | 4 +- .../SideEffectDescriptorExecutor.swift | 23 +++--- .../Writers/XcodeProjWriter.swift | 49 ++++++------ Sources/TuistKit/Commands/InitCommand.swift | 10 +-- Sources/TuistKit/Commands/LogoutCommand.swift | 6 +- .../Plugin/PluginArchiveCommand.swift | 6 +- .../TuistKit/Commands/SessionCommand.swift | 6 +- Sources/TuistKit/Commands/TuistCommand.swift | 10 +-- Sources/TuistKit/Generator/Generator.swift | 12 +-- .../ProjectEditor/ProjectEditor.swift | 12 +-- .../TuistKit/Services/AnalyticsService.swift | 2 +- Sources/TuistKit/Services/AuthService.swift | 2 +- Sources/TuistKit/Services/BuildService.swift | 2 +- Sources/TuistKit/Services/CleanService.swift | 14 +++- Sources/TuistKit/Services/DumpService.swift | 12 +-- Sources/TuistKit/Services/EditService.swift | 6 +- .../TuistKit/Services/GenerateService.swift | 2 +- Sources/TuistKit/Services/GraphService.swift | 8 +- Sources/TuistKit/Services/InitService.swift | 18 ++--- .../TuistKit/Services/InstallService.swift | 2 +- Sources/TuistKit/Services/ListService.swift | 6 +- Sources/TuistKit/Services/LogoutService.swift | 8 +- .../OrganizationBillingService.swift | 2 +- .../OrganizationCreateService.swift | 2 +- .../OrganizationDeleteService.swift | 2 +- .../OrganizationInviteService.swift | 2 +- .../OrganizationListService.swift | 2 +- .../OrganizationRemoveInviteService.swift | 2 +- .../OrganizationRemoveMemberService.swift | 2 +- .../OrganizationRemoveSSOService.swift | 2 +- .../OrganizationShowService.swift | 2 +- .../OrganizationUpdateMemberService.swift | 2 +- .../OrganizationUpdateService.swift | 2 +- .../Plugin/PluginArchiveService.swift | 20 +++-- .../Project/ProjectCreateService.swift | 2 +- .../Project/ProjectDeleteService.swift | 2 +- .../Services/Project/ProjectListService.swift | 2 +- .../Project/ProjectTokensCreateService.swift | 2 +- .../Project/ProjectTokensListService.swift | 2 +- .../Project/ProjectTokensRevokeService.swift | 2 +- Sources/TuistKit/Services/RunService.swift | 2 +- .../TuistKit/Services/ScaffoldService.swift | 8 +- .../TuistKit/Services/SessionService.swift | 6 +- Sources/TuistKit/Services/TestService.swift | 2 +- Sources/TuistKit/Services/TuistService.swift | 4 +- .../TuistKit/Utils/ManifestGraphLoader.swift | 10 +-- .../Utils/TuistAnalyticsServerBackend.swift | 11 ++- .../Loaders/CachedManifestLoader.swift | 48 ++++++------ .../TuistLoader/Loaders/ConfigLoader.swift | 6 +- .../TuistLoader/Loaders/ManifestLoader.swift | 52 ++++++------- .../Loaders/PackageSettingsLoader.swift | 6 +- .../Loaders/RecursiveManifestLoader.swift | 28 +++---- .../SwiftPackageManagerGraphLoader.swift | 8 +- .../Loaders/TemplateGitLoader.swift | 20 +++-- .../TuistLoader/Loaders/TemplateLoader.swift | 6 +- .../ProjectDescriptionHelpersBuilder.swift | 42 +++++----- .../Loaders/Mocks/MockTemplateGitLoader.swift | 4 +- Sources/TuistPlugin/PluginService.swift | 75 ++++++++++-------- Sources/TuistScaffold/TemplateGenerator.swift | 17 ++-- .../Session/ServerSessionController.swift | 6 +- .../Utilities/ServerCredentialsStore.swift | 11 ++- .../Extensions/Array+ExecutionContext.swift | 39 ++++++++++ Sources/TuistSupport/Utils/FileArchiver.swift | 12 ++- Sources/TuistSupport/Utils/FileHandler.swift | 7 -- .../TuistSupport/Utils/FileUnarchiver.swift | 12 ++- .../Extensions/XCTestCase+Extras.swift | 18 +++++ .../AsyncQueuePersistorTests.swift | 16 ++-- .../AsyncQueueTests.swift | 16 ++-- .../BuildAcceptanceTests.swift | 4 +- ...ltipleConfigurationsIntegrationTests.swift | 48 ++++++------ .../StableStructureIntegrationTests.swift | 4 +- .../Generator/XcodeProjWriterTests.swift | 36 ++++----- .../InitAcceptanceTests.swift | 12 ++- .../ProjectEditor/ProjectEditorTests.swift | 30 ++++---- .../Services/CleanServiceTests.swift | 4 +- .../Services/InitServiceTests.swift | 33 ++++---- .../Services/LogoutServiceTests.swift | 4 +- .../Plugin/PluginArchiveServiceTests.swift | 8 +- .../Services/SessionServiceTests.swift | 4 +- .../Services/TuistServiceTests.swift | 22 +++--- .../Utils/TuistAnalyticsDispatcherTests.swift | 4 +- .../TuistAnalyticsServerBackendTests.swift | 4 +- .../Loaders/ManifestLoaderTests.swift | 77 +++++++++---------- ...iptionHelpersBuilderIntegrationTests.swift | 20 +++-- .../Loaders/CachedManifestLoaderTests.swift | 72 ++++++++--------- .../Loaders/ConfigLoaderTests.swift | 56 +++----------- .../Loaders/PackageSettingsLoaderTests.swift | 4 +- .../RecursiveManifestLoaderTests.swift | 36 ++++----- .../Loaders/TemplateGitLoaderTests.swift | 4 +- .../Loaders/TemplateLoaderTests.swift | 10 +-- .../PackageInfoMapperTests.swift | 10 ++- .../TemplateGeneratorTests.swift | 36 ++++----- .../ServerSessionControllerTests.swift | 8 +- .../ServerCredentialsStoreTests.swift | 8 +- Tuist/ProjectDescriptionHelpers/Module.swift | 8 ++ 104 files changed, 838 insertions(+), 656 deletions(-) diff --git a/Package.resolved b/Package.resolved index bd1d7bf2c6b..8f96e639aad 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "dc4a35b9ed535c9d2a720826820ddba97515ea7aae953fc69429768c6acc657a", + "originHash" : "72762ee5d0c1c6693d240f855baa564f33c1989e012f95666662934d0ad27a2d", "pins" : [ { "identity" : "aexml", @@ -37,6 +37,15 @@ "version" : "1.0.2" } }, + { + "identity" : "filesystem", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tuist/FileSystem.git", + "state" : { + "revision" : "0cbe28158a51ca6234dd00da59be88de2b7b22be", + "version" : "0.2.0" + } + }, { "identity" : "graphviz", "kind" : "remoteSourceControl", @@ -163,13 +172,40 @@ "version" : "1.4.0" } }, + { + "identity" : "swift-atomics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-atomics.git", + "state" : { + "revision" : "cd142fd2f64be2100422d658e7411e39489da985", + "version" : "1.2.0" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections.git", + "state" : { + "revision" : "3d2dc41a01f9e49d84f0a3925fb858bed64f702d", + "version" : "1.1.2" + } + }, { "identity" : "swift-log", "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-log.git", "state" : { - "revision" : "532d8b529501fb73a2455b179e0bbb6d49b652ed", - "version" : "1.5.3" + "revision" : "9cb486020ebf03bfa5b5df985387a14a98744537", + "version" : "1.6.1" + } + }, + { + "identity" : "swift-nio", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio", + "state" : { + "revision" : "fc79798d5a150d61361a27ce0c51169b889e23de", + "version" : "2.68.0" } }, { diff --git a/Package.swift b/Package.swift index d990e4e544d..89a2ef5d6ea 100644 --- a/Package.swift +++ b/Package.swift @@ -70,6 +70,7 @@ var targets: [Target] = [ "XcodeGraph", "Mockable", "TuistServer", + "FileSystem", .product(name: "OpenAPIRuntime", package: "swift-openapi-runtime"), ], swiftSettings: [ @@ -102,6 +103,7 @@ var targets: [Target] = [ "ZIPFoundation", "ProjectDescription", "Mockable", + "FileSystem", ], swiftSettings: [ .define("MOCKING", .when(configuration: .debug)), @@ -141,6 +143,7 @@ var targets: [Target] = [ swiftGenKitDependency, "StencilSwiftKit", "Mockable", + "FileSystem", ], swiftSettings: [ .define("MOCKING", .when(configuration: .debug)), @@ -164,6 +167,7 @@ var targets: [Target] = [ "StencilSwiftKit", "Stencil", "Mockable", + "FileSystem", ], swiftSettings: [ .define("MOCKING", .when(configuration: .debug)), @@ -179,6 +183,7 @@ var targets: [Target] = [ "XcodeGraph", "TuistSupport", "Mockable", + "FileSystem", ], swiftSettings: [ .define("MOCKING", .when(configuration: .debug)), @@ -223,6 +228,7 @@ var targets: [Target] = [ "Mockable", pathDependency, "Queuer", + "FileSystem", ], swiftSettings: [ .define("MOCKING", .when(configuration: .debug)), @@ -277,6 +283,7 @@ var targets: [Target] = [ "TuistSupport", "TuistScaffold", "Mockable", + "FileSystem", pathDependency, ], swiftSettings: [ @@ -288,6 +295,7 @@ var targets: [Target] = [ dependencies: [ "TuistCore", "TuistSupport", + "FileSystem", pathDependency, .product(name: "OpenAPIRuntime", package: "swift-openapi-runtime"), .product(name: "OpenAPIURLSession", package: "swift-openapi-urlsession"), @@ -304,7 +312,7 @@ var targets: [Target] = [ let packageSettings = PackageSettings( productTypes: [ - "SystemPackage": .staticFramework, + "FileSystem": .staticFramework, "TSCBasic": .staticFramework, "TSCUtility": .staticFramework, "TSCclibc": .staticFramework, @@ -312,7 +320,8 @@ var targets: [Target] = [ "ArgumentParser": .staticFramework, "Mockable": .staticFramework, "MockableTest": .staticFramework, - ] + ], + baseSettings: .settings(base: ["GENERATE_MASTER_OBJECT_FILE": "YES"]) ) #endif @@ -422,6 +431,7 @@ let package = Package( .package(url: "https://github.com/tuist/swift-openapi-urlsession", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/Path", .upToNextMajor(from: "0.3.0")), .package(url: "https://github.com/tuist/XcodeGraph.git", .upToNextMajor(from: "0.5.0")), + .package(url: "https://github.com/tuist/FileSystem.git", .upToNextMajor(from: "0.2.0")), ], targets: targets ) diff --git a/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift b/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift index 19ba5cf42a3..b360b458eeb 100644 --- a/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift +++ b/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift @@ -37,7 +37,7 @@ open class ServerAcceptanceTestCase: TuistAcceptanceTestCase { override open func tearDown() async throws { try await run(ProjectDeleteCommand.self, fullHandle) try await run(OrganizationDeleteCommand.self, organizationHandle) - try run(LogoutCommand.self) + try await run(LogoutCommand.self) try await super.tearDown() } } diff --git a/Sources/TuistAnalytics/TuistAnalytics.swift b/Sources/TuistAnalytics/TuistAnalytics.swift index 968a5273215..3f401aa670c 100644 --- a/Sources/TuistAnalytics/TuistAnalytics.swift +++ b/Sources/TuistAnalytics/TuistAnalytics.swift @@ -7,8 +7,8 @@ import XcodeGraph public enum TuistAnalytics { public static func bootstrap(dispatcher: TuistAnalyticsDispatcher) throws { AsyncQueue.sharedInstance.register(dispatcher: dispatcher) - Task.detached(priority: .background) { - AsyncQueue.sharedInstance.start() // Re-try to send all events that got persisted and haven't been sent yet + Task { + await AsyncQueue.sharedInstance.start() // Re-try to send all events that got persisted and haven't been sent yet } } } diff --git a/Sources/TuistAnalytics/Utilities/TuistAnalyticsDispatcher.swift b/Sources/TuistAnalytics/Utilities/TuistAnalyticsDispatcher.swift index e26588ab81b..5c4bb45abae 100644 --- a/Sources/TuistAnalytics/Utilities/TuistAnalyticsDispatcher.swift +++ b/Sources/TuistAnalytics/Utilities/TuistAnalyticsDispatcher.swift @@ -18,16 +18,16 @@ public struct TuistAnalyticsDispatcher: AsyncQueueDispatching { public var identifier = TuistAnalyticsDispatcher.dispatcherId - public func dispatch(event: AsyncQueueEvent, completion: @escaping () throws -> Void) throws { + public func dispatch(event: AsyncQueueEvent, completion: @escaping () async throws -> Void) throws { guard let commandEvent = event as? CommandEvent else { return } - Task.detached { + Task { _ = try? await backend?.send(commandEvent: commandEvent) - try completion() + try await completion() } } - public func dispatchPersisted(data: Data, completion: @escaping () throws -> Void) throws { + public func dispatchPersisted(data: Data, completion: @escaping () async throws -> Void) throws { let decoder = JSONDecoder() let commandEvent = try decoder.decode(CommandEvent.self, from: data) return try dispatch(event: commandEvent, completion: completion) diff --git a/Sources/TuistAsyncQueue/AsyncQueue.swift b/Sources/TuistAsyncQueue/AsyncQueue.swift index 8f6323fc393..88ffe2a8fa6 100644 --- a/Sources/TuistAsyncQueue/AsyncQueue.swift +++ b/Sources/TuistAsyncQueue/AsyncQueue.swift @@ -51,8 +51,8 @@ public class AsyncQueue: AsyncQueuing { // MARK: - AsyncQueuing - public func start() { - loadEvents() + public func start() async { + await loadEvents() queue.resume() waitIfCI() } @@ -83,7 +83,7 @@ public class AsyncQueue: AsyncQueuing { logger.debug("Dispatching event with ID '\(event.id.uuidString)' to '\(dispatcher.identifier)'") do { try dispatcher.dispatch(event: event) { - try self.persistor.delete(event: event) + try await self.persistor.delete(event: event) operation.finish(success: true) } } catch { @@ -96,9 +96,9 @@ public class AsyncQueue: AsyncQueuing { } } - private func dispatchPersisted(eventTuple: AsyncQueueEventTuple) throws { + private func dispatchPersisted(eventTuple: AsyncQueueEventTuple) async throws { guard let dispatcher = dispatchers.first(where: { $0.key == eventTuple.dispatcherId })?.value else { - try deletePersistedEvent(filename: eventTuple.filename) + try await deletePersistedEvent(filename: eventTuple.filename) logger.error("Couldn't find dispatcher for persisted event with id: \(eventTuple.dispatcherId)") return } @@ -115,7 +115,7 @@ public class AsyncQueue: AsyncQueuing { do { logger.debug("Dispatching persisted event with ID '\(event.id.uuidString)' to '\(dispatcher.identifier)'") try dispatcher.dispatchPersisted(data: event.data) { - try self.deletePersistedEvent(filename: event.filename) + try await self.deletePersistedEvent(filename: event.filename) } } catch { logger.debug("Failed to dispatch persisted event with ID '\(event.id.uuidString)' to '\(dispatcher.identifier)'") @@ -123,18 +123,18 @@ public class AsyncQueue: AsyncQueuing { } } - private func loadEvents() { + private func loadEvents() async { do { - let events = try persistor.readAll() + let events = try await persistor.readAll() for event in events { - try dispatchPersisted(eventTuple: event) + try await dispatchPersisted(eventTuple: event) } } catch { logger.debug("Error loading persisted events: \(error)") } } - private func deletePersistedEvent(filename: String) throws { - try persistor.delete(filename: filename) + private func deletePersistedEvent(filename: String) async throws { + try await persistor.delete(filename: filename) } } diff --git a/Sources/TuistAsyncQueue/AsyncQueuePersistor.swift b/Sources/TuistAsyncQueue/AsyncQueuePersistor.swift index ead9a03ea6e..8585e4ba769 100644 --- a/Sources/TuistAsyncQueue/AsyncQueuePersistor.swift +++ b/Sources/TuistAsyncQueue/AsyncQueuePersistor.swift @@ -1,3 +1,4 @@ +import FileSystem import Foundation import Path import TuistCore @@ -8,7 +9,7 @@ public typealias AsyncQueueEventTuple = (dispatcherId: String, id: UUID, date: D public protocol AsyncQueuePersisting { /// Reads all the persisted events and returns them. - func readAll() throws -> [AsyncQueueEventTuple] + func readAll() async throws -> [AsyncQueueEventTuple] /// Persiss a given event. /// - Parameter event: Event to be persisted. @@ -16,11 +17,11 @@ public protocol AsyncQueuePersisting { /// Deletes the given event from disk. /// - Parameter event: Event to be deleted. - func delete(event: T) throws + func delete(event: T) async throws /// Deletes the given file name from disk. /// - Parameter filename: Name of the file to be deleted. - func delete(filename: String) throws + func delete(filename: String) async throws } final class AsyncQueuePersistor: AsyncQueuePersisting { @@ -28,11 +29,13 @@ final class AsyncQueuePersistor: AsyncQueuePersisting { let directory: AbsolutePath let jsonEncoder = JSONEncoder() + let fileSystem: FileSystem // MARK: - Init - init(directory: AbsolutePath = Environment.shared.queueDirectory) { + init(directory: AbsolutePath = Environment.shared.queueDirectory, fileSystem: FileSystem = FileSystem()) { self.directory = directory + self.fileSystem = fileSystem } func write(event: some AsyncQueueEvent) throws { @@ -42,17 +45,17 @@ final class AsyncQueuePersistor: AsyncQueuePersisting { try data.write(to: path.url) } - func delete(event: some AsyncQueueEvent) throws { - try delete(filename: filename(event: event)) + func delete(event: some AsyncQueueEvent) async throws { + try await delete(filename: filename(event: event)) } - func delete(filename: String) throws { + func delete(filename: String) async throws { let path = directory.appending(component: filename) guard FileHandler.shared.exists(path) else { return } - try FileHandler.shared.delete(path) + try await fileSystem.remove(path) } - func readAll() throws -> [AsyncQueueEventTuple] { + func readAll() async throws -> [AsyncQueueEventTuple] { let paths = FileHandler.shared.glob(directory, glob: "*.json") var events: [AsyncQueueEventTuple] = [] for eventPath in paths { @@ -64,7 +67,7 @@ final class AsyncQueuePersistor: AsyncQueuePersisting { else { /// Changing the naming convention is a breaking change. When detected /// we delete the event. - try? FileHandler.shared.delete(eventPath) + try? await fileSystem.remove(eventPath) continue } do { @@ -78,7 +81,7 @@ final class AsyncQueuePersistor: AsyncQueuePersisting { ) events.append(event) } catch { - try? FileHandler.shared.delete(eventPath) + try? await fileSystem.remove(eventPath) } } return events diff --git a/Sources/TuistAsyncQueueTesting/MockAsyncQueueDispatcher.swift b/Sources/TuistAsyncQueueTesting/MockAsyncQueueDispatcher.swift index 42fa5f23860..a2cd56033d7 100644 --- a/Sources/TuistAsyncQueueTesting/MockAsyncQueueDispatcher.swift +++ b/Sources/TuistAsyncQueueTesting/MockAsyncQueueDispatcher.swift @@ -26,7 +26,7 @@ public class MockAsyncQueueDispatcher: AsyncQueueDispatching { public var invokedDispatchParametersEventsList = [AsyncQueueEvent]() public var stubbedDispatchError: Error? - public func dispatch(event: AsyncQueueEvent, completion: @escaping () throws -> Void) throws { + public func dispatch(event: AsyncQueueEvent, completion: @escaping () async throws -> Void) throws { invokedDispatch = true invokedDispatchCount += 1 invokedDispatchParameterEvent = event @@ -36,7 +36,12 @@ public class MockAsyncQueueDispatcher: AsyncQueueDispatching { throw error } invokedDispatchCallBack() - try completion() + let semaphore = DispatchSemaphore(value: 0) + Task { + try await completion() + semaphore.signal() + } + semaphore.wait() } public var invokedDispatchPersisted = false @@ -46,7 +51,7 @@ public class MockAsyncQueueDispatcher: AsyncQueueDispatching { public var invokedDispatchPersistedParametersDataList = [Data]() public var stubbedDispatchPersistedError: Error? - public func dispatchPersisted(data: Data, completion: @escaping () throws -> Void) throws { + public func dispatchPersisted(data: Data, completion: @escaping () async throws -> Void) throws { invokedDispatchPersisted = true invokedDispatchPersistedCount += 1 invokedDispatchPersistedDataParameter = data @@ -56,6 +61,11 @@ public class MockAsyncQueueDispatcher: AsyncQueueDispatching { throw error } invokedDispatchPersistedCallBack() - try completion() + let semaphore = DispatchSemaphore(value: 0) + Task { + try await completion() + semaphore.signal() + } + semaphore.wait() } } diff --git a/Sources/TuistAutomation/Utilities/TargetBuilder.swift b/Sources/TuistAutomation/Utilities/TargetBuilder.swift index c1db35f9de3..2cb396887d2 100644 --- a/Sources/TuistAutomation/Utilities/TargetBuilder.swift +++ b/Sources/TuistAutomation/Utilities/TargetBuilder.swift @@ -1,3 +1,4 @@ +import FileSystem import Path import TSCUtility import TuistCore @@ -64,17 +65,19 @@ public final class TargetBuilder: TargetBuilding { private let xcodeBuildController: XcodeBuildControlling private let xcodeProjectBuildDirectoryLocator: XcodeProjectBuildDirectoryLocating private let simulatorController: SimulatorControlling - + private let fileSystem: FileSystem public init( buildGraphInspector: BuildGraphInspecting = BuildGraphInspector(), xcodeBuildController: XcodeBuildControlling = XcodeBuildController(), xcodeProjectBuildDirectoryLocator: XcodeProjectBuildDirectoryLocating = XcodeProjectBuildDirectoryLocator(), - simulatorController: SimulatorControlling = SimulatorController() + simulatorController: SimulatorControlling = SimulatorController(), + fileSystem: FileSystem = FileSystem() ) { self.buildGraphInspector = buildGraphInspector self.xcodeBuildController = xcodeBuildController self.xcodeProjectBuildDirectoryLocator = xcodeProjectBuildDirectoryLocator self.simulatorController = simulatorController + self.fileSystem = fileSystem } public func buildTarget( @@ -126,7 +129,7 @@ public final class TargetBuilder: TargetBuilding { if let buildOutputPath { let configuration = configuration ?? target.project.settings.defaultDebugBuildConfiguration()? .name ?? BuildConfiguration.debug.name - try copyBuildProducts( + try await copyBuildProducts( to: buildOutputPath, projectPath: workspacePath, derivedDataPath: derivedDataPath, @@ -142,7 +145,7 @@ public final class TargetBuilder: TargetBuilding { derivedDataPath: AbsolutePath?, platform: XcodeGraph.Platform, configuration: String - ) throws { + ) async throws { let xcodeSchemeBuildPath = try xcodeProjectBuildDirectoryLocator.locate( platform: platform, projectPath: projectPath, @@ -159,15 +162,13 @@ public final class TargetBuilder: TargetBuilding { } logger.log(level: .notice, "Copying build products to \(buildOutputPath.pathString)", metadata: .subsection) - try FileHandler.shared - .contentsOfDirectory(xcodeSchemeBuildPath) - .forEach { product in - let productOutputPath = buildOutputPath.appending(component: product.basename) - if FileHandler.shared.exists(productOutputPath) { - try FileHandler.shared.delete(productOutputPath) - } - - try FileHandler.shared.copy(from: product, to: productOutputPath) + for product in try FileHandler.shared.contentsOfDirectory(xcodeSchemeBuildPath) { + let productOutputPath = buildOutputPath.appending(component: product.basename) + if FileHandler.shared.exists(productOutputPath) { + try await fileSystem.remove(productOutputPath) } + + try FileHandler.shared.copy(from: product, to: productOutputPath) + } } } diff --git a/Sources/TuistCore/AsyncQueue/AsyncQueueDispatching.swift b/Sources/TuistCore/AsyncQueue/AsyncQueueDispatching.swift index 56386145239..c9427f97c2e 100644 --- a/Sources/TuistCore/AsyncQueue/AsyncQueueDispatching.swift +++ b/Sources/TuistCore/AsyncQueue/AsyncQueueDispatching.swift @@ -7,9 +7,9 @@ public protocol AsyncQueueDispatching { /// Dispatches a given event. /// - Parameter event: Event to be dispatched. - func dispatch(event: AsyncQueueEvent, completion: @escaping () throws -> Void) throws + func dispatch(event: AsyncQueueEvent, completion: @escaping () async throws -> Void) throws /// Dispatch a persisted event. /// - Parameter data: Serialized data of the event. - func dispatchPersisted(data: Data, completion: @escaping () throws -> Void) throws + func dispatchPersisted(data: Data, completion: @escaping () async throws -> Void) throws } diff --git a/Sources/TuistGenerator/Descriptors/SideEffectDescriptorExecutor.swift b/Sources/TuistGenerator/Descriptors/SideEffectDescriptorExecutor.swift index e0278ccc6c3..6adb1261821 100644 --- a/Sources/TuistGenerator/Descriptors/SideEffectDescriptorExecutor.swift +++ b/Sources/TuistGenerator/Descriptors/SideEffectDescriptorExecutor.swift @@ -1,3 +1,4 @@ +import FileSystem import Foundation import TuistCore import TuistSupport @@ -6,31 +7,35 @@ import TuistSupport public protocol SideEffectDescriptorExecuting: AnyObject { /// Executes the given side effects sequentially. /// - Parameter sideEffects: Side effects to be executed. - func execute(sideEffects: [SideEffectDescriptor]) throws + func execute(sideEffects: [SideEffectDescriptor]) async throws } public final class SideEffectDescriptorExecutor: SideEffectDescriptorExecuting { - public init() {} + private let fileSystem: FileSystem + + public init(fileSystem: FileSystem = FileSystem()) { + self.fileSystem = fileSystem + } // MARK: - SideEffectDescriptorExecuting - public func execute(sideEffects: [SideEffectDescriptor]) throws { + public func execute(sideEffects: [SideEffectDescriptor]) async throws { for sideEffect in sideEffects { logger.debug("Side effect: \(sideEffect)") switch sideEffect { case let .command(commandDescriptor): try perform(command: commandDescriptor) case let .file(fileDescriptor): - try process(file: fileDescriptor) + try await process(file: fileDescriptor) case let .directory(directoryDescriptor): - try process(directory: directoryDescriptor) + try await process(directory: directoryDescriptor) } } } // MARK: - Fileprivate - private func process(file: FileDescriptor) throws { + private func process(file: FileDescriptor) async throws { switch file.state { case .present: try FileHandler.shared.createFolder(file.path.parentDirectory) @@ -40,11 +45,11 @@ public final class SideEffectDescriptorExecutor: SideEffectDescriptorExecuting { try FileHandler.shared.touch(file.path) } case .absent: - try FileHandler.shared.delete(file.path) + try await fileSystem.remove(file.path) } } - private func process(directory: DirectoryDescriptor) throws { + private func process(directory: DirectoryDescriptor) async throws { switch directory.state { case .present: if !FileHandler.shared.exists(directory.path) { @@ -52,7 +57,7 @@ public final class SideEffectDescriptorExecutor: SideEffectDescriptorExecuting { } case .absent: if FileHandler.shared.exists(directory.path) { - try FileHandler.shared.delete(directory.path) + try await fileSystem.remove(directory.path) } } } diff --git a/Sources/TuistGenerator/Writers/XcodeProjWriter.swift b/Sources/TuistGenerator/Writers/XcodeProjWriter.swift index bc30bd0920c..5875c67f7df 100644 --- a/Sources/TuistGenerator/Writers/XcodeProjWriter.swift +++ b/Sources/TuistGenerator/Writers/XcodeProjWriter.swift @@ -1,3 +1,4 @@ +import FileSystem import Foundation import Path import TuistCore @@ -5,8 +6,8 @@ import TuistSupport import XcodeProj public protocol XcodeProjWriting { - func write(project: ProjectDescriptor) throws - func write(workspace: WorkspaceDescriptor) throws + func write(project: ProjectDescriptor) async throws + func write(workspace: WorkspaceDescriptor) async throws } // MARK: - @@ -27,34 +28,37 @@ public final class XcodeProjWriter: XcodeProjWriting { private let config: Config private let sideEffectDescriptorExecutor: SideEffectDescriptorExecuting + private let fileSystem: FileSystem public init( sideEffectDescriptorExecutor: SideEffectDescriptorExecuting = SideEffectDescriptorExecutor(), - config: Config = .default + config: Config = .default, + fileSystem: FileSystem = FileSystem() ) { self.sideEffectDescriptorExecutor = sideEffectDescriptorExecutor self.config = config + self.fileSystem = fileSystem } - public func write(project: ProjectDescriptor) throws { - try write(project: project, schemesOrderHint: nil) + public func write(project: ProjectDescriptor) async throws { + try await write(project: project, schemesOrderHint: nil) } - public func write(workspace: WorkspaceDescriptor) throws { + public func write(workspace: WorkspaceDescriptor) async throws { let allSchemes = workspace.schemeDescriptors + workspace.projectDescriptors.flatMap(\.schemeDescriptors) let schemesOrderHint = schemesOrderHint(schemes: allSchemes) - try workspace.projectDescriptors.forEach(context: config.projectDescriptorWritingContext) { projectDescriptor in - try self.write(project: projectDescriptor, schemesOrderHint: schemesOrderHint) + try await workspace.projectDescriptors.forEach(context: config.projectDescriptorWritingContext) { projectDescriptor in + try await self.write(project: projectDescriptor, schemesOrderHint: schemesOrderHint) } try workspace.xcworkspace.write(path: workspace.xcworkspacePath.path, override: true) // Write all schemes (XCWorkspace doesn't manage any schemes like XcodeProj.sharedData) - try writeSchemes( + try await writeSchemes( schemeDescriptors: workspace.schemeDescriptors, xccontainerPath: workspace.xcworkspacePath, wipeSharedSchemesBeforeWriting: true ) - try writeXCSchemeManagement( + try await writeXCSchemeManagement( schemes: workspace.schemeDescriptors, xccontainerPath: workspace.xcworkspacePath, schemesOrderHint: schemesOrderHint @@ -66,14 +70,14 @@ public final class XcodeProjWriter: XcodeProjWriting { xccontainerPath: workspace.xcworkspacePath ) } else { - try deleteWorkspaceSettingsIfNeeded(xccontainerPath: workspace.xcworkspacePath) + try await deleteWorkspaceSettingsIfNeeded(xccontainerPath: workspace.xcworkspacePath) } - try sideEffectDescriptorExecutor.execute(sideEffects: workspace.sideEffectDescriptors) + try await sideEffectDescriptorExecutor.execute(sideEffects: workspace.sideEffectDescriptors) } // MARK: - Private - private func write(project: ProjectDescriptor, schemesOrderHint: [String: Int]?) throws { + private func write(project: ProjectDescriptor, schemesOrderHint: [String: Int]?) async throws { let schemesOrderHint = schemesOrderHint ?? self.schemesOrderHint(schemes: project.schemeDescriptors) // XcodeProj can manage writing of shared schemes, we have to manually manage the user schemes @@ -81,28 +85,28 @@ public final class XcodeProjWriter: XcodeProjWriting { try project.xcodeProj.write(path: project.xcodeprojPath.path) // Write user schemes only - try writeSchemes( + try await writeSchemes( schemeDescriptors: project.userSchemeDescriptors, xccontainerPath: project.xcodeprojPath, wipeSharedSchemesBeforeWriting: false // Since we are only writing user schemes ) - try writeXCSchemeManagement( + try await writeXCSchemeManagement( schemes: project.schemeDescriptors, xccontainerPath: project.xcodeprojPath, schemesOrderHint: schemesOrderHint ) - try sideEffectDescriptorExecutor.execute(sideEffects: project.sideEffectDescriptors) + try await sideEffectDescriptorExecutor.execute(sideEffects: project.sideEffectDescriptors) } private func writeSchemes( schemeDescriptors: [SchemeDescriptor], xccontainerPath: AbsolutePath, wipeSharedSchemesBeforeWriting: Bool - ) throws { + ) async throws { let sharedSchemesPath = try schemeDirectory(path: xccontainerPath, shared: true) if wipeSharedSchemesBeforeWriting, FileHandler.shared.exists(sharedSchemesPath) { - try FileHandler.shared.delete(sharedSchemesPath) + try await fileSystem.remove(sharedSchemesPath) } try schemeDescriptors.forEach { try write(scheme: $0, xccontainerPath: xccontainerPath) } } @@ -143,18 +147,17 @@ public final class XcodeProjWriter: XcodeProjWriting { .write(path: settingsPath.path, override: true) } - private func deleteWorkspaceSettingsIfNeeded(xccontainerPath: AbsolutePath) throws { + private func deleteWorkspaceSettingsIfNeeded(xccontainerPath: AbsolutePath) async throws { let settingsPath = WorkspaceSettingsDescriptor.xcsettingsFilePath(relativeToWorkspace: xccontainerPath) guard FileHandler.shared.exists(settingsPath) else { return } - - try FileHandler.shared.delete(settingsPath) + try await fileSystem.remove(settingsPath) } private func writeXCSchemeManagement( schemes: [SchemeDescriptor], xccontainerPath: AbsolutePath, schemesOrderHint: [String: Int] = [:] - ) throws { + ) async throws { let xcschememanagementPath = try schemeDirectory( path: xccontainerPath, shared: false @@ -168,7 +171,7 @@ public final class XcodeProjWriter: XcodeProjWriting { ) } if FileHandler.shared.exists(xcschememanagementPath) { - try FileHandler.shared.delete(xcschememanagementPath) + try await fileSystem.remove(xcschememanagementPath) } try FileHandler.shared.createFolder(xcschememanagementPath.parentDirectory) try XCSchemeManagement(schemeUserState: userStateSchemes, suppressBuildableAutocreation: nil) diff --git a/Sources/TuistKit/Commands/InitCommand.swift b/Sources/TuistKit/Commands/InitCommand.swift index a68d0abc190..b0e82e0c242 100644 --- a/Sources/TuistKit/Commands/InitCommand.swift +++ b/Sources/TuistKit/Commands/InitCommand.swift @@ -12,7 +12,7 @@ import XcodeGraph private typealias Platform = XcodeGraph.Platform private typealias Product = XcodeGraph.Product -public struct InitCommand: ParsableCommand, HasTrackableParameters { +public struct InitCommand: AsyncParsableCommand, HasTrackableParameters { public static var configuration: CommandConfiguration { CommandConfiguration( commandName: "init", @@ -78,13 +78,13 @@ public struct InitCommand: ParsableCommand, HasTrackableParameters { } } - public func run() throws { + public func run() async throws { InitCommand.analyticsDelegate?.addParameters( [ "platform": AnyCodable(platform ?? "unknown"), ] ) - try InitService().run( + try await InitService().run( name: name, platform: platform, path: path, @@ -102,7 +102,7 @@ extension InitCommand { static var optionalTemplateOptions: [(name: String, option: Option)] = [] /// We do not know template's option in advance -> we need to dynamically add them - static func preprocess(_ arguments: [String]? = nil) throws { + static func preprocess(_ arguments: [String]? = nil) async throws { guard let arguments, arguments.contains("--template") || arguments.contains("-t") @@ -125,7 +125,7 @@ extension InitCommand { templateName != "default" else { return } - let (required, optional) = try InitService().loadTemplateOptions( + let (required, optional) = try await InitService().loadTemplateOptions( templateName: templateName, path: command.path ) diff --git a/Sources/TuistKit/Commands/LogoutCommand.swift b/Sources/TuistKit/Commands/LogoutCommand.swift index 7815bf50c17..541ca5328da 100644 --- a/Sources/TuistKit/Commands/LogoutCommand.swift +++ b/Sources/TuistKit/Commands/LogoutCommand.swift @@ -2,7 +2,7 @@ import ArgumentParser import Foundation import Path -struct LogoutCommand: ParsableCommand { +struct LogoutCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "logout", @@ -18,8 +18,8 @@ struct LogoutCommand: ParsableCommand { ) var path: String? - func run() throws { - try LogoutService().logout( + func run() async throws { + try await LogoutService().logout( directory: path ) } diff --git a/Sources/TuistKit/Commands/Plugin/PluginArchiveCommand.swift b/Sources/TuistKit/Commands/Plugin/PluginArchiveCommand.swift index 4ea1c49278f..8614ea91aca 100644 --- a/Sources/TuistKit/Commands/Plugin/PluginArchiveCommand.swift +++ b/Sources/TuistKit/Commands/Plugin/PluginArchiveCommand.swift @@ -2,7 +2,7 @@ import ArgumentParser import Foundation import Path -struct PluginArchiveCommand: ParsableCommand { +struct PluginArchiveCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "archive", @@ -18,8 +18,8 @@ struct PluginArchiveCommand: ParsableCommand { ) var path: String? - func run() throws { - try PluginArchiveService().run( + func run() async throws { + try await PluginArchiveService().run( path: path ) } diff --git a/Sources/TuistKit/Commands/SessionCommand.swift b/Sources/TuistKit/Commands/SessionCommand.swift index 58da8c49ebe..e69f5a08a32 100644 --- a/Sources/TuistKit/Commands/SessionCommand.swift +++ b/Sources/TuistKit/Commands/SessionCommand.swift @@ -2,7 +2,7 @@ import ArgumentParser import Foundation import Path -struct SessionCommand: ParsableCommand { +struct SessionCommand: AsyncParsableCommand { static var configuration: CommandConfiguration { CommandConfiguration( commandName: "session", @@ -18,8 +18,8 @@ struct SessionCommand: ParsableCommand { ) var path: String? - func run() throws { - try SessionService().printSession( + func run() async throws { + try await SessionService().printSession( directory: path ) } diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index dc7bdd1ff44..143bf5638ad 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -51,7 +51,7 @@ public struct TuistCommand: AsyncParsableCommand { } let backend: TuistAnalyticsBackend? - let config = try ConfigLoader().loadConfig(path: path) + let config = try await ConfigLoader().loadConfig(path: path) if let fullHandle = config.fullHandle { backend = TuistAnalyticsServerBackend( fullHandle: fullHandle, @@ -72,7 +72,7 @@ public struct TuistCommand: AsyncParsableCommand { try await ScaffoldCommand.preprocess(processedArguments) } if processedArguments.first == InitCommand.configuration.commandName { - try InitCommand.preprocess(processedArguments) + try await InitCommand.preprocess(processedArguments) } let command = try parseAsRoot(processedArguments) executeCommand = { @@ -85,7 +85,7 @@ public struct TuistCommand: AsyncParsableCommand { } catch { parsedError = error executeCommand = { - try executeTask(with: processedArguments) + try await executeTask(with: processedArguments) } } @@ -116,8 +116,8 @@ public struct TuistCommand: AsyncParsableCommand { } } - private static func executeTask(with processedArguments: [String]) throws { - try TuistService().run( + private static func executeTask(with processedArguments: [String]) async throws { + try await TuistService().run( arguments: processedArguments, tuistBinaryPath: processArguments()!.first! ) diff --git a/Sources/TuistKit/Generator/Generator.swift b/Sources/TuistKit/Generator/Generator.swift index 7f0c338d189..448a61dd769 100644 --- a/Sources/TuistKit/Generator/Generator.swift +++ b/Sources/TuistKit/Generator/Generator.swift @@ -55,16 +55,16 @@ public class Generator: Generating { let graphTraverser = GraphTraverser(graph: graph) // Lint - try lint(graphTraverser: graphTraverser) + try await lint(graphTraverser: graphTraverser) // Generate let workspaceDescriptor = try generator.generateWorkspace(graphTraverser: graphTraverser) // Write - try writer.write(workspace: workspaceDescriptor) + try await writer.write(workspace: workspaceDescriptor) // Mapper side effects - try sideEffectDescriptorExecutor.execute(sideEffects: sideEffects) + try await sideEffectDescriptorExecutor.execute(sideEffects: sideEffects) // Post Generate Actions try await postGenerationActions( @@ -91,8 +91,8 @@ public class Generator: Generating { return (graph, sideEffectDescriptors) } - private func lint(graphTraverser: GraphTraversing) throws { - let config = try configLoader.loadConfig(path: graphTraverser.path) + private func lint(graphTraverser: GraphTraversing) async throws { + let config = try await configLoader.loadConfig(path: graphTraverser.path) let environmentIssues = try environmentLinter.lint(config: config) try environmentIssues.printAndThrowErrorsIfNeeded() @@ -104,7 +104,7 @@ public class Generator: Generating { } private func postGenerationActions(graphTraverser: GraphTraversing, workspaceName: String) async throws { - let config = try configLoader.loadConfig(path: graphTraverser.path) + let config = try await configLoader.loadConfig(path: graphTraverser.path) try await swiftPackageManagerInteractor.install( graphTraverser: graphTraverser, diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditor.swift b/Sources/TuistKit/ProjectEditor/ProjectEditor.swift index 5365d6d3dfd..021f651c731 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditor.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditor.swift @@ -40,7 +40,7 @@ protocol ProjectEditing: AnyObject { in destinationDirectory: AbsolutePath, onlyCurrentDirectory: Bool, plugins: Plugins - ) throws -> AbsolutePath + ) async throws -> AbsolutePath } final class ProjectEditor: ProjectEditing { @@ -107,7 +107,7 @@ final class ProjectEditor: ProjectEditing { in destinationDirectory: AbsolutePath, onlyCurrentDirectory: Bool, plugins: Plugins - ) throws -> AbsolutePath { + ) async throws -> AbsolutePath { let tuistIgnoreContent = (try? FileHandler.shared.readTextFile(editingPath.appending(component: ".tuistignore"))) ?? "" let tuistIgnoreEntries = try tuistIgnoreContent .split(separator: "\n") @@ -168,7 +168,7 @@ final class ProjectEditor: ProjectEditing { plugins: plugins, onlyCurrentDirectory: onlyCurrentDirectory ) - let builtPluginHelperModules = try buildRemotePluginModules( + let builtPluginHelperModules = try await buildRemotePluginModules( in: editingPath, projectDescriptionPath: projectDescriptionPath, plugins: plugins, @@ -206,7 +206,7 @@ final class ProjectEditor: ProjectEditing { let graphTraverser = GraphTraverser(graph: graph) let descriptor = try generator.generateWorkspace(graphTraverser: graphTraverser) - try writer.write(workspace: descriptor) + try await writer.write(workspace: descriptor) return descriptor.xcworkspacePath } @@ -237,9 +237,9 @@ final class ProjectEditor: ProjectEditing { projectDescriptionPath: AbsolutePath, plugins: Plugins, projectDescriptionHelpersBuilder: ProjectDescriptionHelpersBuilding - ) throws -> [ProjectDescriptionHelpersModule] { + ) async throws -> [ProjectDescriptionHelpersModule] { let loadedPluginHelpers = plugins.projectDescriptionHelpers.filter { $0.location == .remote } - return try projectDescriptionHelpersBuilder.buildPlugins( + return try await projectDescriptionHelpersBuilder.buildPlugins( at: path, projectDescriptionSearchPaths: ProjectDescriptionSearchPaths.paths(for: projectDescriptionPath), projectDescriptionHelperPlugins: loadedPluginHelpers diff --git a/Sources/TuistKit/Services/AnalyticsService.swift b/Sources/TuistKit/Services/AnalyticsService.swift index e08ddd57876..d36c3a53061 100644 --- a/Sources/TuistKit/Services/AnalyticsService.swift +++ b/Sources/TuistKit/Services/AnalyticsService.swift @@ -45,7 +45,7 @@ final class AnalyticsService: AnalyticsServicing { path: String? ) async throws { let path: AbsolutePath = try self.path(path) - let config = try configLoader.loadConfig(path: path) + let config = try await configLoader.loadConfig(path: path) guard let fullHandle = config.fullHandle else { throw AnalyticsServiceError.fullHandleNotFound } try opener.open( diff --git a/Sources/TuistKit/Services/AuthService.swift b/Sources/TuistKit/Services/AuthService.swift index 373a8a7223e..1ba927cbb0e 100644 --- a/Sources/TuistKit/Services/AuthService.swift +++ b/Sources/TuistKit/Services/AuthService.swift @@ -52,7 +52,7 @@ final class AuthService: AuthServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) if email != nil || password != nil { diff --git a/Sources/TuistKit/Services/BuildService.swift b/Sources/TuistKit/Services/BuildService.swift index a8e8533fe50..2587eeaeea3 100644 --- a/Sources/TuistKit/Services/BuildService.swift +++ b/Sources/TuistKit/Services/BuildService.swift @@ -74,7 +74,7 @@ public final class BuildService { passthroughXcodeBuildArguments: [String] ) async throws { let graph: Graph - let config = try configLoader.loadConfig(path: path) + let config = try await configLoader.loadConfig(path: path) let cacheStorage = try cacheStorageFactory.cacheStorage(config: config) let generator = generatorFactory.building( config: config, diff --git a/Sources/TuistKit/Services/CleanService.swift b/Sources/TuistKit/Services/CleanService.swift index 85d52d78246..01113df7e3d 100644 --- a/Sources/TuistKit/Services/CleanService.swift +++ b/Sources/TuistKit/Services/CleanService.swift @@ -1,3 +1,4 @@ +import FileSystem import Foundation import Path import TuistCore @@ -61,6 +62,8 @@ final class CleanService { private let configLoader: ConfigLoading private let serverURLService: ServerURLServicing private let cleanCacheService: CleanCacheServicing + private let fileSystem: FileSystem + init( fileHandler: FileHandling, rootDirectoryLocator: RootDirectoryLocating, @@ -68,7 +71,8 @@ final class CleanService { manifestFilesLocator: ManifestFilesLocating, configLoader: ConfigLoading, serverURLService: ServerURLServicing, - cleanCacheService: CleanCacheServicing + cleanCacheService: CleanCacheServicing, + fileSystem: FileSystem ) { self.fileHandler = fileHandler self.rootDirectoryLocator = rootDirectoryLocator @@ -77,6 +81,7 @@ final class CleanService { self.configLoader = configLoader self.serverURLService = serverURLService self.cleanCacheService = cleanCacheService + self.fileSystem = fileSystem } public convenience init() { @@ -87,7 +92,8 @@ final class CleanService { manifestFilesLocator: ManifestFilesLocator(), configLoader: ConfigLoader(), serverURLService: ServerURLService(), - cleanCacheService: CleanCacheService() + cleanCacheService: CleanCacheService(), + fileSystem: FileSystem() ) } @@ -117,7 +123,7 @@ final class CleanService { if let directory, fileHandler.exists(directory) { - try FileHandler.shared.delete(directory) + try await fileSystem.remove(directory) logger.notice("Successfully cleaned artifacts at path \(directory.pathString)", metadata: .success) } else { logger.notice("There's nothing to clean for \(category.defaultValueDescription)") @@ -125,7 +131,7 @@ final class CleanService { } if remote { - let config = try configLoader.loadConfig(path: resolvedPath) + let config = try await configLoader.loadConfig(path: resolvedPath) guard let fullHandle = config.fullHandle else { return } let serverURL = try serverURLService.url(configServerURL: config.url) try await cleanCacheService.cleanCache( diff --git a/Sources/TuistKit/Services/DumpService.swift b/Sources/TuistKit/Services/DumpService.swift index 90a40373ab4..307a81155a2 100644 --- a/Sources/TuistKit/Services/DumpService.swift +++ b/Sources/TuistKit/Services/DumpService.swift @@ -31,17 +31,17 @@ final class DumpService { let encoded: Encodable switch manifest { case .project: - encoded = try manifestLoader.loadProject(at: projectPath) + encoded = try await manifestLoader.loadProject(at: projectPath) case .workspace: - encoded = try manifestLoader.loadWorkspace(at: projectPath) + encoded = try await manifestLoader.loadWorkspace(at: projectPath) case .config: - encoded = try manifestLoader.loadConfig(at: projectPath.appending(component: Constants.tuistDirectoryName)) + encoded = try await manifestLoader.loadConfig(at: projectPath.appending(component: Constants.tuistDirectoryName)) case .template: - encoded = try manifestLoader.loadTemplate(at: projectPath) + encoded = try await manifestLoader.loadTemplate(at: projectPath) case .plugin: - encoded = try manifestLoader.loadPlugin(at: projectPath) + encoded = try await manifestLoader.loadPlugin(at: projectPath) case .package: - encoded = try manifestLoader.loadPackageSettings(at: projectPath) + encoded = try await manifestLoader.loadPackageSettings(at: projectPath) } let json: JSON = try encoded.toJSON() diff --git a/Sources/TuistKit/Services/EditService.swift b/Sources/TuistKit/Services/EditService.swift index 0b446252740..499405f11e2 100644 --- a/Sources/TuistKit/Services/EditService.swift +++ b/Sources/TuistKit/Services/EditService.swift @@ -63,7 +63,7 @@ final class EditService { throw EditServiceError.xcodeNotSelected } - let workspacePath = try projectEditor.edit( + let workspacePath = try await projectEditor.edit( at: path, in: cachedManifestDirectory, onlyCurrentDirectory: onlyCurrentDirectory, @@ -73,7 +73,7 @@ final class EditService { try opener.open(path: workspacePath, application: selectedXcode.path, wait: false) } else { - let workspacePath = try projectEditor.edit( + let workspacePath = try await projectEditor.edit( at: path, in: path, onlyCurrentDirectory: onlyCurrentDirectory, @@ -94,7 +94,7 @@ final class EditService { } private func loadPlugins(at path: AbsolutePath) async -> Plugins { - guard let config = try? configLoader.loadConfig(path: path) else { + guard let config = try? await configLoader.loadConfig(path: path) else { logger.warning("Unable to load Config.swift, fix any compiler errors and re-run for plugins to be loaded.") return .none } diff --git a/Sources/TuistKit/Services/GenerateService.swift b/Sources/TuistKit/Services/GenerateService.swift index 33b4689c268..2fab3fc3e76 100644 --- a/Sources/TuistKit/Services/GenerateService.swift +++ b/Sources/TuistKit/Services/GenerateService.swift @@ -47,7 +47,7 @@ final class GenerateService { ) async throws { let timer = clock.startTimer() let path = try self.path(path) - let config = try configLoader.loadConfig(path: path) + let config = try await configLoader.loadConfig(path: path) let cacheStorage = try cacheStorageFactory.cacheStorage(config: config) let generator = generatorFactory.generation( config: config, diff --git a/Sources/TuistKit/Services/GraphService.swift b/Sources/TuistKit/Services/GraphService.swift index a9c69ad8cc2..7ec6e0c955b 100644 --- a/Sources/TuistKit/Services/GraphService.swift +++ b/Sources/TuistKit/Services/GraphService.swift @@ -1,4 +1,5 @@ import DOT +import FileSystem import Foundation import GraphViz import Path @@ -14,6 +15,7 @@ import XcodeGraph final class GraphService { private let graphVizMapper: GraphToGraphVizMapping private let manifestGraphLoader: ManifestGraphLoading + private let fileSystem: FileSystem convenience init() { let manifestLoader = ManifestLoaderFactory() @@ -32,10 +34,12 @@ final class GraphService { init( graphVizGenerator: GraphToGraphVizMapping, - manifestGraphLoader: ManifestGraphLoading + manifestGraphLoader: ManifestGraphLoading, + fileSystem: FileSystem = FileSystem() ) { graphVizMapper = graphVizGenerator self.manifestGraphLoader = manifestGraphLoader + self.fileSystem = fileSystem } func run( @@ -54,7 +58,7 @@ final class GraphService { let filePath = outputPath.appending(component: "graph.\(format.rawValue)") if FileHandler.shared.exists(filePath) { logger.notice("Deleting existing graph at \(filePath.pathString)") - try FileHandler.shared.delete(filePath) + try await fileSystem.remove(filePath) } let filteredTargetsAndDependencies = graph.filter( diff --git a/Sources/TuistKit/Services/InitService.swift b/Sources/TuistKit/Services/InitService.swift index d302d7adabd..c92266cbe2d 100644 --- a/Sources/TuistKit/Services/InitService.swift +++ b/Sources/TuistKit/Services/InitService.swift @@ -63,7 +63,7 @@ class InitService { func loadTemplateOptions( templateName: String, path: String? - ) throws -> ( + ) async throws -> ( required: [String], optional: [String] ) { @@ -72,7 +72,7 @@ class InitService { var attributes: [Template.Attribute] = [] if templateName.isGitURL { - try templateGitLoader.loadTemplate(from: templateName) { template in + try await templateGitLoader.loadTemplate(from: templateName) { template in attributes = template.attributes } } else { @@ -81,7 +81,7 @@ class InitService { template: templateName ) - let template = try templateLoader.loadTemplate(at: templateDirectory, plugins: .none) + let template = try await templateLoader.loadTemplate(at: templateDirectory, plugins: .none) attributes = template.attributes } @@ -108,7 +108,7 @@ class InitService { templateName: String?, requiredTemplateOptions: [String: String], optionalTemplateOptions: [String: String?] - ) throws { + ) async throws { let platform = try self.platform(platform) let path = try self.path(path) let name = try self.name(name, path: path) @@ -117,8 +117,8 @@ class InitService { try verifyDirectoryIsEmpty(path: path) if templateName.isGitURL { - try templateGitLoader.loadTemplate(from: templateName, closure: { template in - let parsedAttributes = try parseAttributes( + try await templateGitLoader.loadTemplate(from: templateName, closure: { template in + let parsedAttributes = try self.parseAttributes( name: name, platform: platform, tuistVersion: tuistVersion, @@ -127,7 +127,7 @@ class InitService { template: template ) - try templateGenerator.generate( + try await self.templateGenerator.generate( template: template, to: path, attributes: parsedAttributes @@ -138,7 +138,7 @@ class InitService { guard let templateDirectory = directories.first(where: { $0.basename == templateName }) else { throw InitServiceError.templateNotFound(templateName) } - let template = try templateLoader.loadTemplate(at: templateDirectory, plugins: .none) + let template = try await templateLoader.loadTemplate(at: templateDirectory, plugins: .none) let parsedAttributes = try parseAttributes( name: name, platform: platform, @@ -148,7 +148,7 @@ class InitService { template: template ) - try templateGenerator.generate( + try await templateGenerator.generate( template: template, to: path, attributes: parsedAttributes diff --git a/Sources/TuistKit/Services/InstallService.swift b/Sources/TuistKit/Services/InstallService.swift index 64382e25dbf..a7af956dc06 100644 --- a/Sources/TuistKit/Services/InstallService.swift +++ b/Sources/TuistKit/Services/InstallService.swift @@ -54,7 +54,7 @@ final class InstallService { private func fetchPlugins(path: AbsolutePath) async throws { logger.notice("Resolving and fetching plugins.", metadata: .section) - let config = try configLoader.loadConfig(path: path) + let config = try await configLoader.loadConfig(path: path) _ = try await pluginService.loadPlugins(using: config) logger.notice("Plugins resolved and fetched successfully.", metadata: .success) diff --git a/Sources/TuistKit/Services/ListService.swift b/Sources/TuistKit/Services/ListService.swift index 434ff2a645f..ad2f8ded48e 100644 --- a/Sources/TuistKit/Services/ListService.swift +++ b/Sources/TuistKit/Services/ListService.swift @@ -37,8 +37,8 @@ class ListService { let plugins = try await loadPlugins(at: path) let templateDirectories = try locateTemplateDirectories(at: path, plugins: plugins) - let templates: [PrintableTemplate] = try templateDirectories.map { path in - let template = try templateLoader.loadTemplate(at: path, plugins: plugins) + let templates: [PrintableTemplate] = try await templateDirectories.concurrentMap { path in + let template = try await self.templateLoader.loadTemplate(at: path, plugins: plugins) return PrintableTemplate(name: path.basename, description: template.description) } @@ -74,7 +74,7 @@ class ListService { } private func loadPlugins(at path: AbsolutePath) async throws -> Plugins { - let config = try configLoader.loadConfig(path: path) + let config = try await configLoader.loadConfig(path: path) return try await pluginService.loadPlugins(using: config) } diff --git a/Sources/TuistKit/Services/LogoutService.swift b/Sources/TuistKit/Services/LogoutService.swift index 1b9ee43099e..ab7b5713481 100644 --- a/Sources/TuistKit/Services/LogoutService.swift +++ b/Sources/TuistKit/Services/LogoutService.swift @@ -10,7 +10,7 @@ protocol LogoutServicing: AnyObject { /// the keychain func logout( directory: String? - ) throws + ) async throws } final class LogoutService: LogoutServicing { @@ -30,15 +30,15 @@ final class LogoutService: LogoutServicing { func logout( directory: String? - ) throws { + ) async throws { let directoryPath: AbsolutePath if let directory { directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) - try serverSessionController.logout(serverURL: serverURL) + try await serverSessionController.logout(serverURL: serverURL) } } diff --git a/Sources/TuistKit/Services/Organization/OrganizationBillingService.swift b/Sources/TuistKit/Services/Organization/OrganizationBillingService.swift index d402b520b4c..2408db43b87 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationBillingService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationBillingService.swift @@ -36,7 +36,7 @@ final class OrganizationBillingService: OrganizationBillingServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) try opener.open( url: serverURL diff --git a/Sources/TuistKit/Services/Organization/OrganizationCreateService.swift b/Sources/TuistKit/Services/Organization/OrganizationCreateService.swift index 3ea09291a3d..1b8f456d20e 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationCreateService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationCreateService.swift @@ -36,7 +36,7 @@ final class OrganizationCreateService: OrganizationCreateServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) let organization = try await createOrganizationService.createOrganization( diff --git a/Sources/TuistKit/Services/Organization/OrganizationDeleteService.swift b/Sources/TuistKit/Services/Organization/OrganizationDeleteService.swift index 8e0f58f9df5..5db43eaf356 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationDeleteService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationDeleteService.swift @@ -36,7 +36,7 @@ final class OrganizationDeleteService: OrganizationDeleteServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) try await deleteOrganizationService.deleteOrganization( diff --git a/Sources/TuistKit/Services/Organization/OrganizationInviteService.swift b/Sources/TuistKit/Services/Organization/OrganizationInviteService.swift index 4b4669d3b58..f9c99ae0483 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationInviteService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationInviteService.swift @@ -38,7 +38,7 @@ final class OrganizationInviteService: OrganizationInviteServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) let invitation = try await createOrganizationInviteService.createOrganizationInvite( diff --git a/Sources/TuistKit/Services/Organization/OrganizationListService.swift b/Sources/TuistKit/Services/Organization/OrganizationListService.swift index 63bc04dfb6d..2a69e25cdb1 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationListService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationListService.swift @@ -36,7 +36,7 @@ final class OrganizationListService: OrganizationListServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) let organizations = try await listOrganizationsService.listOrganizations( diff --git a/Sources/TuistKit/Services/Organization/OrganizationRemoveInviteService.swift b/Sources/TuistKit/Services/Organization/OrganizationRemoveInviteService.swift index 9b2ad3a1b96..2baa7abe9c2 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationRemoveInviteService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationRemoveInviteService.swift @@ -38,7 +38,7 @@ final class OrganizationRemoveInviteService: OrganizationRemoveInviteServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) try await cancelOrganizationRemoveInviteService.cancelOrganizationInvite( diff --git a/Sources/TuistKit/Services/Organization/OrganizationRemoveMemberService.swift b/Sources/TuistKit/Services/Organization/OrganizationRemoveMemberService.swift index eb9635f23fe..7f77bd51f5c 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationRemoveMemberService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationRemoveMemberService.swift @@ -38,7 +38,7 @@ final class OrganizationRemoveMemberService: OrganizationRemoveMemberServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) try await removeOrganizationMemberService.removeOrganizationMember( diff --git a/Sources/TuistKit/Services/Organization/OrganizationRemoveSSOService.swift b/Sources/TuistKit/Services/Organization/OrganizationRemoveSSOService.swift index c2506bae2cb..f356c4fa97f 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationRemoveSSOService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationRemoveSSOService.swift @@ -36,7 +36,7 @@ final class OrganizationRemoveSSOService: OrganizationRemoveSSOServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) _ = try await updateOrganizationService.updateOrganization( diff --git a/Sources/TuistKit/Services/Organization/OrganizationShowService.swift b/Sources/TuistKit/Services/Organization/OrganizationShowService.swift index b960667c1e5..e0c4000deda 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationShowService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationShowService.swift @@ -41,7 +41,7 @@ final class OrganizationShowService: OrganizationShowServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) let organization = try await getOrganizationService.getOrganization( diff --git a/Sources/TuistKit/Services/Organization/OrganizationUpdateMemberService.swift b/Sources/TuistKit/Services/Organization/OrganizationUpdateMemberService.swift index 67589b3e218..050326abb01 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationUpdateMemberService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationUpdateMemberService.swift @@ -40,7 +40,7 @@ final class OrganizationUpdateMemberService: OrganizationUpdateMemberServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) let member = try await updateOrganizationMemberService.updateOrganizationMember( diff --git a/Sources/TuistKit/Services/Organization/OrganizationUpdateService.swift b/Sources/TuistKit/Services/Organization/OrganizationUpdateService.swift index cb71ae9da94..9dd598ff339 100644 --- a/Sources/TuistKit/Services/Organization/OrganizationUpdateService.swift +++ b/Sources/TuistKit/Services/Organization/OrganizationUpdateService.swift @@ -40,7 +40,7 @@ final class OrganizationUpdateSSOService: OrganizationUpdateSSOServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let ssoOrganization: SSOOrganization switch provider { diff --git a/Sources/TuistKit/Services/Plugin/PluginArchiveService.swift b/Sources/TuistKit/Services/Plugin/PluginArchiveService.swift index 1b3b494f04a..d1f40a238bf 100644 --- a/Sources/TuistKit/Services/Plugin/PluginArchiveService.swift +++ b/Sources/TuistKit/Services/Plugin/PluginArchiveService.swift @@ -1,3 +1,4 @@ +import FileSystem import Foundation import Path import ProjectDescription @@ -9,6 +10,7 @@ final class PluginArchiveService { private let swiftPackageManagerController: SwiftPackageManagerControlling private let manifestLoader: ManifestLoading private let fileArchiverFactory: FileArchivingFactorying + private let fileSystem: FileSystem init( swiftPackageManagerController: SwiftPackageManagerControlling = SwiftPackageManagerController( @@ -16,14 +18,16 @@ final class PluginArchiveService { fileHandler: FileHandler.shared ), manifestLoader: ManifestLoading = ManifestLoader(), - fileArchiverFactory: FileArchivingFactorying = FileArchivingFactory() + fileArchiverFactory: FileArchivingFactorying = FileArchivingFactory(), + fileSystem: FileSystem = FileSystem() ) { self.swiftPackageManagerController = swiftPackageManagerController self.manifestLoader = manifestLoader self.fileArchiverFactory = fileArchiverFactory + self.fileSystem = fileSystem } - func run(path: String?) throws { + func run(path: String?) async throws { let path = try self.path(path) let packageInfo = try swiftPackageManagerController.loadPackageInfo(at: path) @@ -45,10 +49,10 @@ final class PluginArchiveService { return } - let plugin = try manifestLoader.loadPlugin(at: path) + let plugin = try await manifestLoader.loadPlugin(at: path) - try FileHandler.shared.inTemporaryDirectory { temporaryDirectory in - try archiveProducts( + try await FileHandler.shared.inTemporaryDirectory { temporaryDirectory in + try await self.archiveProducts( taskProducts: taskProducts, path: path, plugin: plugin, @@ -72,7 +76,7 @@ final class PluginArchiveService { path: AbsolutePath, plugin: Plugin, in temporaryDirectory: AbsolutePath - ) throws { + ) async throws { let artifactsPath = temporaryDirectory.appending(component: "artifacts") for product in taskProducts { logger.notice("Building \(product)...") @@ -91,13 +95,13 @@ final class PluginArchiveService { let temporaryZipPath = try archiver.zip(name: zipName) let zipPath = path.appending(component: zipName) if FileHandler.shared.exists(zipPath) { - try FileHandler.shared.delete(zipPath) + try await fileSystem.remove(zipPath) } try FileHandler.shared.copy( from: temporaryZipPath, to: zipPath ) - try archiver.delete() + try await archiver.delete() logger.notice( "Plugin was successfully archived. Create a new Github release and attach the file \(zipPath.pathString) as an artifact.", diff --git a/Sources/TuistKit/Services/Project/ProjectCreateService.swift b/Sources/TuistKit/Services/Project/ProjectCreateService.swift index a7b68d3f29a..d7444338a98 100644 --- a/Sources/TuistKit/Services/Project/ProjectCreateService.swift +++ b/Sources/TuistKit/Services/Project/ProjectCreateService.swift @@ -36,7 +36,7 @@ final class ProjectCreateService: ProjectCreateServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) diff --git a/Sources/TuistKit/Services/Project/ProjectDeleteService.swift b/Sources/TuistKit/Services/Project/ProjectDeleteService.swift index 538a5acd435..0b40d0aae90 100644 --- a/Sources/TuistKit/Services/Project/ProjectDeleteService.swift +++ b/Sources/TuistKit/Services/Project/ProjectDeleteService.swift @@ -42,7 +42,7 @@ final class ProjectDeleteService: ProjectDeleteServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) let project = try await getProjectService.getProject( diff --git a/Sources/TuistKit/Services/Project/ProjectListService.swift b/Sources/TuistKit/Services/Project/ProjectListService.swift index dd58ead839a..4f6795d3922 100644 --- a/Sources/TuistKit/Services/Project/ProjectListService.swift +++ b/Sources/TuistKit/Services/Project/ProjectListService.swift @@ -36,7 +36,7 @@ final class ProjectListService: ProjectListServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) let projects = try await listProjectsService.listProjects( diff --git a/Sources/TuistKit/Services/Project/ProjectTokensCreateService.swift b/Sources/TuistKit/Services/Project/ProjectTokensCreateService.swift index a6c5684ee02..f869c678950 100644 --- a/Sources/TuistKit/Services/Project/ProjectTokensCreateService.swift +++ b/Sources/TuistKit/Services/Project/ProjectTokensCreateService.swift @@ -44,7 +44,7 @@ final class ProjectTokensCreateService: ProjectTokensCreateServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) let token = try await createProjectTokenService.createProjectToken( diff --git a/Sources/TuistKit/Services/Project/ProjectTokensListService.swift b/Sources/TuistKit/Services/Project/ProjectTokensListService.swift index bc4ef15b1c8..5c296a46666 100644 --- a/Sources/TuistKit/Services/Project/ProjectTokensListService.swift +++ b/Sources/TuistKit/Services/Project/ProjectTokensListService.swift @@ -36,7 +36,7 @@ final class ProjectTokensListService: ProjectTokensListServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) let tokens = try await listProjectTokensService.listProjectTokens( diff --git a/Sources/TuistKit/Services/Project/ProjectTokensRevokeService.swift b/Sources/TuistKit/Services/Project/ProjectTokensRevokeService.swift index 2a8c36a6b76..f740e6d0f95 100644 --- a/Sources/TuistKit/Services/Project/ProjectTokensRevokeService.swift +++ b/Sources/TuistKit/Services/Project/ProjectTokensRevokeService.swift @@ -38,7 +38,7 @@ final class ProjectTokensRevokeService: ProjectTokensRevokeServicing { } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) try await revokeProjectTokenService.revokeProjectToken( diff --git a/Sources/TuistKit/Services/RunService.swift b/Sources/TuistKit/Services/RunService.swift index 2318dc172e6..735df15b29d 100644 --- a/Sources/TuistKit/Services/RunService.swift +++ b/Sources/TuistKit/Services/RunService.swift @@ -79,7 +79,7 @@ final class RunService { } let graph: Graph - let config = try configLoader.loadConfig(path: runPath) + let config = try await configLoader.loadConfig(path: runPath) let generator = generatorFactory.defaultGenerator(config: config) if try (generate || buildGraphInspector.workspacePath(directory: runPath) == nil) { logger.notice("Generating project for running", metadata: .section) diff --git a/Sources/TuistKit/Services/ScaffoldService.swift b/Sources/TuistKit/Services/ScaffoldService.swift index 16ae55b4913..467668269b5 100644 --- a/Sources/TuistKit/Services/ScaffoldService.swift +++ b/Sources/TuistKit/Services/ScaffoldService.swift @@ -66,7 +66,7 @@ final class ScaffoldService { template: templateName ) - let template = try templateLoader.loadTemplate(at: templateDirectory, plugins: plugins) + let template = try await templateLoader.loadTemplate(at: templateDirectory, plugins: plugins) return template.attributes.reduce(into: (required: [], optional: [])) { currentValue, attribute in switch attribute { @@ -92,7 +92,7 @@ final class ScaffoldService { templateDirectories: templateDirectories, template: templateName ) - let template = try templateLoader.loadTemplate(at: templateDirectory, plugins: plugins) + let template = try await templateLoader.loadTemplate(at: templateDirectory, plugins: plugins) let parsedAttributes = try parseAttributes( requiredTemplateOptions: requiredTemplateOptions, @@ -100,7 +100,7 @@ final class ScaffoldService { template: template ) - try templateGenerator.generate( + try await templateGenerator.generate( template: template, to: path, attributes: parsedAttributes @@ -120,7 +120,7 @@ final class ScaffoldService { } private func loadPlugins(at path: AbsolutePath) async throws -> Plugins { - let config = try configLoader.loadConfig(path: path) + let config = try await configLoader.loadConfig(path: path) return try await pluginService.loadPlugins(using: config) } diff --git a/Sources/TuistKit/Services/SessionService.swift b/Sources/TuistKit/Services/SessionService.swift index 333a269e7ef..17cc18a3345 100644 --- a/Sources/TuistKit/Services/SessionService.swift +++ b/Sources/TuistKit/Services/SessionService.swift @@ -10,7 +10,7 @@ protocol SessionServicing: AnyObject { /// on a server identified by that URL. func printSession( directory: String? - ) throws + ) async throws } final class SessionService: SessionServicing { @@ -34,14 +34,14 @@ final class SessionService: SessionServicing { func printSession( directory: String? - ) throws { + ) async throws { let directoryPath: AbsolutePath if let directory { directoryPath = try AbsolutePath(validating: directory, relativeTo: FileHandler.shared.currentPath) } else { directoryPath = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: directoryPath) + let config = try await configLoader.loadConfig(path: directoryPath) let serverURL = try serverURLService.url(configServerURL: config.url) try serverSessionController.printSession(serverURL: serverURL) } diff --git a/Sources/TuistKit/Services/TestService.swift b/Sources/TuistKit/Services/TestService.swift index c3ae2ec0c3f..e108abee35a 100644 --- a/Sources/TuistKit/Services/TestService.swift +++ b/Sources/TuistKit/Services/TestService.swift @@ -188,7 +188,7 @@ final class TestService { // swiftlint:disable:this type_body_length ) } // Load config - let config = try configLoader.loadConfig(path: path) + let config = try await configLoader.loadConfig(path: path) let cacheStorage = try cacheStorageFactory.cacheStorage(config: config) let testsCacheTemporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) diff --git a/Sources/TuistKit/Services/TuistService.swift b/Sources/TuistKit/Services/TuistService.swift index 424cd9384ce..2c5f55d7dc3 100644 --- a/Sources/TuistKit/Services/TuistService.swift +++ b/Sources/TuistKit/Services/TuistService.swift @@ -24,7 +24,7 @@ final class TuistService: NSObject { func run( arguments: [String], tuistBinaryPath: String - ) throws { + ) async throws { var arguments = arguments let commandName = "tuist-\(arguments[0])" @@ -39,7 +39,7 @@ final class TuistService: NSObject { path = FileHandler.shared.currentPath } - let config = try configLoader.loadConfig(path: path) + let config = try await configLoader.loadConfig(path: path) var pluginPaths = try pluginService.remotePluginPaths(using: config) .compactMap(\.releasePath) diff --git a/Sources/TuistKit/Utils/ManifestGraphLoader.swift b/Sources/TuistKit/Utils/ManifestGraphLoader.swift index 24e9d8b02f4..29d1f6f9184 100644 --- a/Sources/TuistKit/Utils/ManifestGraphLoader.swift +++ b/Sources/TuistKit/Utils/ManifestGraphLoader.swift @@ -100,7 +100,7 @@ public final class ManifestGraphLoader: ManifestGraphLoading { let plugins = try await loadPlugins(at: path) // Load Workspace - var allManifests = try recursiveManifestLoader.loadWorkspace(at: path) + var allManifests = try await recursiveManifestLoader.loadWorkspace(at: path) let isSPMProjectOnly = allManifests.projects.isEmpty let hasExternalDependencies = allManifests.projects.values.contains { $0.containsExternalDependencies } @@ -113,12 +113,12 @@ public final class ManifestGraphLoader: ManifestGraphLoading { if let packagePath = manifestFilesLocator.locatePackageManifest(at: path), isSPMProjectOnly || hasExternalDependencies { - let loadedPackageSettings = try packageSettingsLoader.loadPackageSettings( + let loadedPackageSettings = try await packageSettingsLoader.loadPackageSettings( at: packagePath.parentDirectory, with: plugins ) - let manifest = try swiftPackageManagerGraphLoader.load( + let manifest = try await swiftPackageManagerGraphLoader.load( packagePath: packagePath, packageSettings: loadedPackageSettings ) @@ -131,7 +131,7 @@ public final class ManifestGraphLoader: ManifestGraphLoading { // Merge SPM graph if let packageSettings { - allManifests = try recursiveManifestLoader.loadAndMergePackageProjects( + allManifests = try await recursiveManifestLoader.loadAndMergePackageProjects( in: allManifests, packageSettings: packageSettings ) @@ -199,7 +199,7 @@ public final class ManifestGraphLoader: ManifestGraphLoading { @discardableResult func loadPlugins(at path: AbsolutePath) async throws -> Plugins { - let config = try configLoader.loadConfig(path: path) + let config = try await configLoader.loadConfig(path: path) let plugins = try await pluginsService.loadPlugins(using: config) try manifestLoader.register(plugins: plugins) return plugins diff --git a/Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift b/Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift index 94bd7115588..33f6680d6f6 100644 --- a/Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift +++ b/Sources/TuistKit/Utils/TuistAnalyticsServerBackend.swift @@ -1,3 +1,4 @@ +import FileSystem import Foundation import Path import TuistAnalytics @@ -15,6 +16,7 @@ public class TuistAnalyticsServerBackend: TuistAnalyticsBackend { private let ciChecker: CIChecking private let cacheDirectoriesProviderFactory: CacheDirectoriesProviderFactoring private let analyticsArtifactUploadService: AnalyticsArtifactUploadServicing + private let fileSystem: FileSystem public convenience init( fullHandle: String, @@ -27,7 +29,8 @@ public class TuistAnalyticsServerBackend: TuistAnalyticsBackend { fileHandler: FileHandler.shared, ciChecker: CIChecker(), cacheDirectoriesProviderFactory: CacheDirectoriesProviderFactory(), - analyticsArtifactUploadService: AnalyticsArtifactUploadService() + analyticsArtifactUploadService: AnalyticsArtifactUploadService(), + fileSystem: FileSystem() ) } @@ -38,7 +41,8 @@ public class TuistAnalyticsServerBackend: TuistAnalyticsBackend { fileHandler: FileHandling, ciChecker: CIChecking, cacheDirectoriesProviderFactory: CacheDirectoriesProviderFactoring, - analyticsArtifactUploadService: AnalyticsArtifactUploadServicing + analyticsArtifactUploadService: AnalyticsArtifactUploadServicing, + fileSystem: FileSystem ) { self.fullHandle = fullHandle self.url = url @@ -47,6 +51,7 @@ public class TuistAnalyticsServerBackend: TuistAnalyticsBackend { self.ciChecker = ciChecker self.cacheDirectoriesProviderFactory = cacheDirectoriesProviderFactory self.analyticsArtifactUploadService = analyticsArtifactUploadService + self.fileSystem = fileSystem } public func send(commandEvent: CommandEvent) async throws { @@ -77,7 +82,7 @@ public class TuistAnalyticsServerBackend: TuistAnalyticsBackend { } if fileHandler.exists(runDirectory) { - try fileHandler.delete(runDirectory) + try await fileSystem.remove(runDirectory) } if #available(macOS 13.0, *), ciChecker.isCI() { diff --git a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift index 270dbeaafc9..9bb2f49d4d4 100644 --- a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift @@ -58,46 +58,46 @@ public class CachedManifestLoader: ManifestLoading { } } - public func loadConfig(at path: AbsolutePath) throws -> ProjectDescription.Config { - try load(manifest: .config, at: path) { - let projectDescriptionConfig = try manifestLoader.loadConfig(at: path) + public func loadConfig(at path: AbsolutePath) async throws -> ProjectDescription.Config { + try await load(manifest: .config, at: path) { + let projectDescriptionConfig = try await manifestLoader.loadConfig(at: path) return projectDescriptionConfig } } - public func loadProject(at path: AbsolutePath) throws -> Project { - try load(manifest: .project, at: path) { - try manifestLoader.loadProject(at: path) + public func loadProject(at path: AbsolutePath) async throws -> Project { + try await load(manifest: .project, at: path) { + try await manifestLoader.loadProject(at: path) } } - public func loadWorkspace(at path: AbsolutePath) throws -> Workspace { - try load(manifest: .workspace, at: path) { - try manifestLoader.loadWorkspace(at: path) + public func loadWorkspace(at path: AbsolutePath) async throws -> Workspace { + try await load(manifest: .workspace, at: path) { + try await manifestLoader.loadWorkspace(at: path) } } - public func loadTemplate(at path: AbsolutePath) throws -> ProjectDescription.Template { - try load(manifest: .template, at: path) { - try manifestLoader.loadTemplate(at: path) + public func loadTemplate(at path: AbsolutePath) async throws -> ProjectDescription.Template { + try await load(manifest: .template, at: path) { + try await manifestLoader.loadTemplate(at: path) } } - public func loadPlugin(at path: AbsolutePath) throws -> ProjectDescription.Plugin { - try load(manifest: .plugin, at: path) { - try manifestLoader.loadPlugin(at: path) + public func loadPlugin(at path: AbsolutePath) async throws -> ProjectDescription.Plugin { + try await load(manifest: .plugin, at: path) { + try await manifestLoader.loadPlugin(at: path) } } - public func loadPackageSettings(at path: AbsolutePath) throws -> ProjectDescription.PackageSettings { - try load(manifest: .packageSettings, at: path) { - try manifestLoader.loadPackageSettings(at: path) + public func loadPackageSettings(at path: AbsolutePath) async throws -> ProjectDescription.PackageSettings { + try await load(manifest: .packageSettings, at: path) { + try await manifestLoader.loadPackageSettings(at: path) } } - public func loadPackage(at path: AbsolutePath) throws -> PackageInfo { - try load(manifest: .package, at: path) { - try manifestLoader.loadPackage(at: path) + public func loadPackage(at path: AbsolutePath) async throws -> PackageInfo { + try await load(manifest: .package, at: path) { + try await manifestLoader.loadPackage(at: path) } } @@ -116,7 +116,7 @@ public class CachedManifestLoader: ManifestLoading { // MARK: - Private - private func load(manifest: Manifest, at path: AbsolutePath, loader: () throws -> T) throws -> T { + private func load(manifest: Manifest, at path: AbsolutePath, loader: () async throws -> T) async throws -> T { let manifestPath = path.appending(component: manifest.fileName(path)) guard fileHandler.exists(manifestPath) else { throw ManifestLoaderError.manifestNotFound(manifest, path) @@ -130,7 +130,7 @@ public class CachedManifestLoader: ManifestLoading { guard let hashes = calculatedHashes else { logger.warning("Unable to calculate manifest hash at path: \(path)") - return try loader() + return try await loader() } let cachedManifestPath = try cachedPath(for: manifestPath) @@ -141,7 +141,7 @@ public class CachedManifestLoader: ManifestLoading { return cached } - let loadedManifest = try loader() + let loadedManifest = try await loader() try cacheManifest( manifest: manifest, diff --git a/Sources/TuistLoader/Loaders/ConfigLoader.swift b/Sources/TuistLoader/Loaders/ConfigLoader.swift index 83651cf11a8..535a34426a8 100644 --- a/Sources/TuistLoader/Loaders/ConfigLoader.swift +++ b/Sources/TuistLoader/Loaders/ConfigLoader.swift @@ -14,7 +14,7 @@ public protocol ConfigLoading { /// - Parameter path: Directory from which look up and load the Config. /// - Returns: Loaded Config object. /// - Throws: An error if the Config.swift can't be parsed. - func loadConfig(path: AbsolutePath) throws -> TuistCore.Config + func loadConfig(path: AbsolutePath) async throws -> TuistCore.Config /// Locates the Config.swift manifest from the given directory. func locateConfig(at: AbsolutePath) -> AbsolutePath? @@ -36,7 +36,7 @@ public final class ConfigLoader: ConfigLoading { self.fileHandler = fileHandler } - public func loadConfig(path: AbsolutePath) throws -> TuistCore.Config { + public func loadConfig(path: AbsolutePath) async throws -> TuistCore.Config { if let cached = cachedConfigs[path] { return cached } @@ -47,7 +47,7 @@ public final class ConfigLoader: ConfigLoading { return config } - let manifest = try manifestLoader.loadConfig(at: configPath.parentDirectory) + let manifest = try await manifestLoader.loadConfig(at: configPath.parentDirectory) let config = try TuistCore.Config.from(manifest: manifest, at: configPath) cachedConfigs[path] = config return config diff --git a/Sources/TuistLoader/Loaders/ManifestLoader.swift b/Sources/TuistLoader/Loaders/ManifestLoader.swift index ec711faf02c..18b0d31b3ab 100644 --- a/Sources/TuistLoader/Loaders/ManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/ManifestLoader.swift @@ -58,31 +58,31 @@ public protocol ManifestLoading { /// - Parameter path: Path to the directory that contains the Config.swift file. /// - Returns: Loaded Config.swift file. /// - Throws: An error if the file has a syntax error. - func loadConfig(at path: AbsolutePath) throws -> ProjectDescription.Config + func loadConfig(at path: AbsolutePath) async throws -> ProjectDescription.Config /// Loads the Project.swift in the given directory. /// - Parameter path: Path to the directory that contains the Project.swift. - func loadProject(at path: AbsolutePath) throws -> ProjectDescription.Project + func loadProject(at path: AbsolutePath) async throws -> ProjectDescription.Project /// Loads the Workspace.swift in the given directory. /// - Parameter path: Path to the directory that contains the Workspace.swift - func loadWorkspace(at path: AbsolutePath) throws -> ProjectDescription.Workspace + func loadWorkspace(at path: AbsolutePath) async throws -> ProjectDescription.Workspace /// Loads the name_of_template.swift in the given directory. /// - Parameter path: Path to the directory that contains the name_of_template.swift - func loadTemplate(at path: AbsolutePath) throws -> ProjectDescription.Template + func loadTemplate(at path: AbsolutePath) async throws -> ProjectDescription.Template /// Loads the `PackageSettings` from `Package.swift` in the given directory /// - path: Path to the directory that contains Package.swift - func loadPackageSettings(at path: AbsolutePath) throws -> ProjectDescription.PackageSettings + func loadPackageSettings(at path: AbsolutePath) async throws -> ProjectDescription.PackageSettings /// Loads `Package.swift` /// - path: Path to the directory that contains Package.swift - func loadPackage(at path: AbsolutePath) throws -> PackageInfo + func loadPackage(at path: AbsolutePath) async throws -> PackageInfo /// Loads the Plugin.swift in the given directory. /// - Parameter path: Path to the directory that contains Plugin.swift - func loadPlugin(at path: AbsolutePath) throws -> ProjectDescription.Plugin + func loadPlugin(at path: AbsolutePath) async throws -> ProjectDescription.Plugin /// List all the manifests in the given directory. /// - Parameter path: Path to the directory whose manifest files will be returned. @@ -160,20 +160,20 @@ public class ManifestLoader: ManifestLoading { } } - public func loadConfig(at path: AbsolutePath) throws -> ProjectDescription.Config { - try loadManifest(.config, at: path) + public func loadConfig(at path: AbsolutePath) async throws -> ProjectDescription.Config { + try await loadManifest(.config, at: path) } - public func loadProject(at path: AbsolutePath) throws -> ProjectDescription.Project { - try loadManifest(.project, at: path) + public func loadProject(at path: AbsolutePath) async throws -> ProjectDescription.Project { + try await loadManifest(.project, at: path) } - public func loadWorkspace(at path: AbsolutePath) throws -> ProjectDescription.Workspace { - try loadManifest(.workspace, at: path) + public func loadWorkspace(at path: AbsolutePath) async throws -> ProjectDescription.Workspace { + try await loadManifest(.workspace, at: path) } - public func loadTemplate(at path: AbsolutePath) throws -> ProjectDescription.Template { - try loadManifest(.template, at: path) + public func loadTemplate(at path: AbsolutePath) async throws -> ProjectDescription.Template { + try await loadManifest(.template, at: path) } public func loadPackage(at path: AbsolutePath) throws -> PackageInfo { @@ -182,9 +182,9 @@ public class ManifestLoader: ManifestLoading { ) } - public func loadPackageSettings(at path: AbsolutePath) throws -> ProjectDescription.PackageSettings { + public func loadPackageSettings(at path: AbsolutePath) async throws -> ProjectDescription.PackageSettings { do { - return try loadManifest(.packageSettings, at: path) + return try await loadManifest(.packageSettings, at: path) } catch let error as ManifestLoaderError { switch error { case let .manifestLoadingFailed(path: _, data: data, context: _): @@ -199,8 +199,8 @@ public class ManifestLoader: ManifestLoading { } } - public func loadPlugin(at path: AbsolutePath) throws -> ProjectDescription.Plugin { - try loadManifest(.plugin, at: path) + public func loadPlugin(at path: AbsolutePath) async throws -> ProjectDescription.Plugin { + try await loadManifest(.plugin, at: path) } public func register(plugins: Plugins) throws { @@ -213,13 +213,13 @@ public class ManifestLoader: ManifestLoading { private func loadManifest( _ manifest: Manifest, at path: AbsolutePath - ) throws -> T { + ) async throws -> T { let manifestPath = try manifestPath( manifest, at: path ) - let data = try loadDataForManifest(manifest, at: manifestPath) + let data = try await loadDataForManifest(manifest, at: manifestPath) do { return try decoder.decode(T.self, from: data) @@ -300,8 +300,8 @@ public class ManifestLoader: ManifestLoading { private func loadDataForManifest( _ manifest: Manifest, at path: AbsolutePath - ) throws -> Data { - let arguments = try buildArguments( + ) async throws -> Data { + let arguments = try await buildArguments( manifest, at: path ) + ["--tuist-dump"] @@ -334,7 +334,7 @@ public class ManifestLoader: ManifestLoading { private func buildArguments( _ manifest: Manifest, at path: AbsolutePath - ) throws -> [String] { + ) async throws -> [String] { let projectDescriptionPath = try resourceLocator.projectDescription() let searchPaths = ProjectDescriptionSearchPaths.paths(for: projectDescriptionPath) let frameworkName: String @@ -362,7 +362,7 @@ public class ManifestLoader: ManifestLoading { .cacheDirectories() .cacheDirectory(for: .projectDescriptionHelpers) - let projectDescriptionHelperArguments: [String] = try { + let projectDescriptionHelperArguments: [String] = try await { switch manifest { case .config, .plugin, .package: return [] @@ -370,7 +370,7 @@ public class ManifestLoader: ManifestLoading { .template, .workspace, .packageSettings: - return try projectDescriptionHelpersBuilderFactory.projectDescriptionHelpersBuilder( + return try await projectDescriptionHelpersBuilderFactory.projectDescriptionHelpersBuilder( cacheDirectory: projectDescriptionHelpersCacheDirectory ) .build( diff --git a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift index b46df11489f..ab69f4011b8 100644 --- a/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift +++ b/Sources/TuistLoader/Loaders/PackageSettingsLoader.swift @@ -12,7 +12,7 @@ public protocol PackageSettingsLoading { /// - Parameter path: The absolute path for the `PackageSettings` to load. /// - Parameter plugins: The plugins for the `PackageSettings` to load. /// - Returns: The `PackageSettings` loaded from the specified path. - func loadPackageSettings(at path: AbsolutePath, with plugins: Plugins) throws -> TuistCore.PackageSettings + func loadPackageSettings(at path: AbsolutePath, with plugins: Plugins) async throws -> TuistCore.PackageSettings } public final class PackageSettingsLoader: PackageSettingsLoading { @@ -36,10 +36,10 @@ public final class PackageSettingsLoader: PackageSettingsLoading { self.manifestFilesLocator = manifestFilesLocator } - public func loadPackageSettings(at path: AbsolutePath, with plugins: Plugins) throws -> TuistCore.PackageSettings { + public func loadPackageSettings(at path: AbsolutePath, with plugins: Plugins) async throws -> TuistCore.PackageSettings { let path = manifestFilesLocator.locatePackageManifest(at: path)?.parentDirectory ?? path try manifestLoader.register(plugins: plugins) - let manifest = try manifestLoader.loadPackageSettings(at: path) + let manifest = try await manifestLoader.loadPackageSettings(at: path) let generatorPaths = GeneratorPaths(manifestDirectory: path) let swiftToolsVersion = try swiftPackageManagerController.getToolsVersion( at: path diff --git a/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift b/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift index 72142f7c5a9..74772d59d60 100644 --- a/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/RecursiveManifestLoader.swift @@ -11,7 +11,7 @@ public protocol RecursiveManifestLoading { /// - Returns: Loaded manifest func loadWorkspace( at path: AbsolutePath - ) throws -> LoadedWorkspace + ) async throws -> LoadedWorkspace /// Load package projects and merge in the loaded manifest /// - Parameters: @@ -21,7 +21,7 @@ public protocol RecursiveManifestLoading { func loadAndMergePackageProjects( in loadedWorkspace: LoadedWorkspace, packageSettings: TuistCore.PackageSettings - ) throws -> LoadedWorkspace + ) async throws -> LoadedWorkspace } public struct LoadedProjects { @@ -49,10 +49,10 @@ public class RecursiveManifestLoader: RecursiveManifestLoading { self.packageInfoMapper = packageInfoMapper } - public func loadWorkspace(at path: AbsolutePath) throws -> LoadedWorkspace { + public func loadWorkspace(at path: AbsolutePath) async throws -> LoadedWorkspace { let loadedWorkspace: ProjectDescription.Workspace? do { - loadedWorkspace = try manifestLoader.loadWorkspace(at: path) + loadedWorkspace = try await manifestLoader.loadWorkspace(at: path) } catch ManifestLoaderError.manifestNotFound { loadedWorkspace = nil } @@ -69,7 +69,7 @@ public class RecursiveManifestLoader: RecursiveManifestLoading { manifestLoader.manifests(at: $0).contains(.project) } - let projects = LoadedProjects(projects: try loadProjects(paths: projectPaths).projects) + let projects = await LoadedProjects(projects: try loadProjects(paths: projectPaths).projects) let workspace: ProjectDescription.Workspace if let loadedWorkspace { workspace = loadedWorkspace @@ -86,7 +86,7 @@ public class RecursiveManifestLoader: RecursiveManifestLoading { } public func loadAndMergePackageProjects(in loadedWorkspace: LoadedWorkspace, packageSettings: TuistCore.PackageSettings) - throws -> LoadedWorkspace + async throws -> LoadedWorkspace { let generatorPaths = GeneratorPaths(manifestDirectory: loadedWorkspace.path) let projectSearchPaths = loadedWorkspace.workspace.projects.isEmpty ? ["."] : loadedWorkspace.workspace.projects @@ -102,7 +102,7 @@ public class RecursiveManifestLoader: RecursiveManifestLoading { .pathString.contains(".build/checkouts") } - let packageProjects = try loadPackageProjects(paths: packagePaths, packageSettings: packageSettings) + let packageProjects = try await loadPackageProjects(paths: packagePaths, packageSettings: packageSettings) let projects = loadedWorkspace.projects.merging( packageProjects.projects, @@ -121,16 +121,16 @@ public class RecursiveManifestLoader: RecursiveManifestLoading { private func loadPackageProjects( paths: [AbsolutePath], packageSettings: TuistCore.PackageSettings? - ) throws -> LoadedProjects { + ) async throws -> LoadedProjects { guard let packageSettings else { return LoadedProjects(projects: [:]) } var cache = [AbsolutePath: ProjectDescription.Project]() var paths = Set(paths) while !paths.isEmpty { paths.subtract(cache.keys) - let projects = try Array(paths).compactMap(context: ExecutionContext.concurrent) { - let packageInfo = try manifestLoader.loadPackage(at: $0) - return try packageInfoMapper.map( + let projects = try await Array(paths).concurrentCompactMap { + let packageInfo = try await self.manifestLoader.loadPackage(at: $0) + return try self.packageInfoMapper.map( packageInfo: packageInfo, path: $0, packageType: .local, @@ -148,14 +148,14 @@ public class RecursiveManifestLoader: RecursiveManifestLoading { return LoadedProjects(projects: cache) } - private func loadProjects(paths: [AbsolutePath]) throws -> LoadedProjects { + private func loadProjects(paths: [AbsolutePath]) async throws -> LoadedProjects { var cache = [AbsolutePath: ProjectDescription.Project]() var paths = Set(paths) while !paths.isEmpty { paths.subtract(cache.keys) - let projects = try Array(paths).map(context: ExecutionContext.concurrent) { - try manifestLoader.loadProject(at: $0) + let projects = try await Array(paths).concurrentMap { + try await self.manifestLoader.loadProject(at: $0) } var newDependenciesPaths = Set() for (path, project) in zip(paths, projects) { diff --git a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift index 6de7ef6d367..808c476623a 100644 --- a/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift +++ b/Sources/TuistLoader/Loaders/SwiftPackageManagerGraphLoader.swift @@ -49,7 +49,7 @@ public protocol SwiftPackageManagerGraphLoading { func load( packagePath: AbsolutePath, packageSettings: TuistCore.PackageSettings - ) throws -> TuistCore.DependenciesGraph + ) async throws -> TuistCore.DependenciesGraph } public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoading { @@ -77,7 +77,7 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi public func load( packagePath: AbsolutePath, packageSettings: TuistCore.PackageSettings - ) throws -> TuistCore.DependenciesGraph { + ) async throws -> TuistCore.DependenciesGraph { let path = packagePath.parentDirectory.appending( component: Constants.SwiftPackageManager.packageBuildDirectoryName ) @@ -101,7 +101,7 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi info: PackageInfo ) ] - packageInfos = try workspaceState.object.dependencies.map(context: .concurrent) { dependency in + packageInfos = try await workspaceState.object.dependencies.concurrentMap { dependency in let name = dependency.packageRef.name let packageFolder: AbsolutePath switch dependency.packageRef.kind { @@ -120,7 +120,7 @@ public final class SwiftPackageManagerGraphLoader: SwiftPackageManagerGraphLoadi throw SwiftPackageManagerGraphGeneratorError.unsupportedDependencyKind(dependency.packageRef.kind) } - let packageInfo = try manifestLoader.loadPackage(at: packageFolder) + let packageInfo = try await self.manifestLoader.loadPackage(at: packageFolder) let targetToArtifactPaths = try workspaceState.object.artifacts .filter { $0.packageRef.identity == dependency.packageRef.identity } .reduce(into: [:]) { result, artifact in diff --git a/Sources/TuistLoader/Loaders/TemplateGitLoader.swift b/Sources/TuistLoader/Loaders/TemplateGitLoader.swift index f8c8da4378f..69568cec4d7 100644 --- a/Sources/TuistLoader/Loaders/TemplateGitLoader.swift +++ b/Sources/TuistLoader/Loaders/TemplateGitLoader.swift @@ -7,7 +7,7 @@ public protocol TemplateGitLoading { /// - Parameters: /// - templateURL: Git repository url /// - closure: Closure to perform work on loaded template - func loadTemplate(from templateURL: String, closure: (TuistCore.Template) throws -> Void) throws + func loadTemplate(from templateURL: String, closure: @escaping (TuistCore.Template) async throws -> Void) async throws } public final class TemplateGitLoader: TemplateGitLoading { @@ -38,18 +38,22 @@ public final class TemplateGitLoader: TemplateGitLoading { self.templateLocationParser = templateLocationParser } - public func loadTemplate(from templateURL: String, closure: (TuistCore.Template) throws -> Void) throws { + public func loadTemplate( + from templateURL: String, + closure: @escaping (TuistCore.Template) async throws -> Void + ) async throws { let repoURL = templateLocationParser.parseRepositoryURL(from: templateURL) let repoBranch = templateLocationParser.parseRepositoryBranch(from: templateURL) - try fileHandler.inTemporaryDirectory { temporaryPath in + + try await fileHandler.inTemporaryDirectory { temporaryPath in let templatePath = temporaryPath.appending(component: "Template") - try fileHandler.createFolder(templatePath) - try gitHandler.clone(url: repoURL, to: templatePath) + try self.fileHandler.createFolder(templatePath) + try self.gitHandler.clone(url: repoURL, to: templatePath) if let repoBranch { - try gitHandler.checkout(id: repoBranch, in: templatePath) + try self.gitHandler.checkout(id: repoBranch, in: templatePath) } - let template = try templateLoader.loadTemplate(at: templatePath, plugins: .none) - try closure(template) + let template = try await self.templateLoader.loadTemplate(at: templatePath, plugins: .none) + try await closure(template) } } } diff --git a/Sources/TuistLoader/Loaders/TemplateLoader.swift b/Sources/TuistLoader/Loaders/TemplateLoader.swift index ce333a6f9c3..8b98669c721 100644 --- a/Sources/TuistLoader/Loaders/TemplateLoader.swift +++ b/Sources/TuistLoader/Loaders/TemplateLoader.swift @@ -11,7 +11,7 @@ public protocol TemplateLoading { /// - path: Path of template manifest file `name_of_template.swift` /// - plugins: List of available plugins. /// - Returns: Loaded `TuistCore.Template` - func loadTemplate(at path: AbsolutePath, plugins: Plugins) throws -> TuistCore.Template + func loadTemplate(at path: AbsolutePath, plugins: Plugins) async throws -> TuistCore.Template } public class TemplateLoader: TemplateLoading { @@ -26,9 +26,9 @@ public class TemplateLoader: TemplateLoading { self.manifestLoader = manifestLoader } - public func loadTemplate(at path: AbsolutePath, plugins: Plugins) throws -> TuistCore.Template { + public func loadTemplate(at path: AbsolutePath, plugins: Plugins) async throws -> TuistCore.Template { try manifestLoader.register(plugins: plugins) - let template = try manifestLoader.loadTemplate(at: path) + let template = try await manifestLoader.loadTemplate(at: path) let generatorPaths = GeneratorPaths(manifestDirectory: path) return try TuistCore.Template.from( manifest: template, diff --git a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift index 83fa112b9a8..317f5890fcf 100644 --- a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift +++ b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift @@ -1,3 +1,4 @@ +import FileSystem import Foundation import Path import TuistCore @@ -20,7 +21,7 @@ public protocol ProjectDescriptionHelpersBuilding: AnyObject { at path: AbsolutePath, projectDescriptionSearchPaths: ProjectDescriptionSearchPaths, projectDescriptionHelperPlugins: [TuistCore.ProjectDescriptionHelpersPlugin] - ) throws -> [ProjectDescriptionHelpersModule] + ) async throws -> [ProjectDescriptionHelpersModule] /// Builds all the plugin helpers module and returns the location to the built modules. /// @@ -34,13 +35,13 @@ public protocol ProjectDescriptionHelpersBuilding: AnyObject { at path: AbsolutePath, projectDescriptionSearchPaths: ProjectDescriptionSearchPaths, projectDescriptionHelperPlugins: [ProjectDescriptionHelpersPlugin] - ) throws -> [ProjectDescriptionHelpersModule] + ) async throws -> [ProjectDescriptionHelpersModule] } public final class ProjectDescriptionHelpersBuilder: ProjectDescriptionHelpersBuilding { /// A dictionary that keeps in memory the helpers (value of the dictionary) that have been built /// in the current process for helpers directories (key of the dictionary) - private var builtHelpers: [AbsolutePath: ProjectDescriptionHelpersModule] = [:] + private var builtHelpers: ThreadSafe<[AbsolutePath: ProjectDescriptionHelpersModule]> = ThreadSafe([:]) /// Path to the cache directory. private let cacheDirectory: AbsolutePath @@ -53,6 +54,7 @@ public final class ProjectDescriptionHelpersBuilder: ProjectDescriptionHelpersBu /// Clock for measuring build duration. private let clock: Clock + private let fileSystem: FileSystem /// The name of the default project description helpers module static let defaultHelpersName = "ProjectDescriptionHelpers" @@ -67,26 +69,28 @@ public final class ProjectDescriptionHelpersBuilder: ProjectDescriptionHelpersBu projectDescriptionHelpersHasher: ProjectDescriptionHelpersHashing = ProjectDescriptionHelpersHasher(), cacheDirectory: AbsolutePath, helpersDirectoryLocator: HelpersDirectoryLocating = HelpersDirectoryLocator(), - clock: Clock = WallClock() + clock: Clock = WallClock(), + fileSystem: FileSystem = FileSystem() ) { self.projectDescriptionHelpersHasher = projectDescriptionHelpersHasher self.cacheDirectory = cacheDirectory self.helpersDirectoryLocator = helpersDirectoryLocator self.clock = clock + self.fileSystem = fileSystem } public func build( at path: AbsolutePath, projectDescriptionSearchPaths: ProjectDescriptionSearchPaths, projectDescriptionHelperPlugins: [ProjectDescriptionHelpersPlugin] - ) throws -> [ProjectDescriptionHelpersModule] { - let pluginHelpers = try buildPlugins( + ) async throws -> [ProjectDescriptionHelpersModule] { + let pluginHelpers = try await buildPlugins( at: path, projectDescriptionSearchPaths: projectDescriptionSearchPaths, projectDescriptionHelperPlugins: projectDescriptionHelperPlugins ) - let defaultHelpers = try buildDefaultHelpers( + let defaultHelpers = try await buildDefaultHelpers( in: path, projectDescriptionSearchPaths: projectDescriptionSearchPaths, customProjectDescriptionHelperModules: pluginHelpers @@ -101,19 +105,21 @@ public final class ProjectDescriptionHelpersBuilder: ProjectDescriptionHelpersBu at _: AbsolutePath, projectDescriptionSearchPaths: ProjectDescriptionSearchPaths, projectDescriptionHelperPlugins: [ProjectDescriptionHelpersPlugin] - ) throws -> [ProjectDescriptionHelpersModule] { - let pluginHelpers = try projectDescriptionHelperPlugins.map { - try buildHelpers(name: $0.name, in: $0.path, projectDescriptionSearchPaths: projectDescriptionSearchPaths) + ) async throws -> [ProjectDescriptionHelpersModule] { + return try await projectDescriptionHelperPlugins.concurrentMap { plugin in + try await self.buildHelpers( + name: plugin.name, + in: plugin.path, + projectDescriptionSearchPaths: projectDescriptionSearchPaths + ) } - - return pluginHelpers } private func buildDefaultHelpers( in path: AbsolutePath, projectDescriptionSearchPaths: ProjectDescriptionSearchPaths, customProjectDescriptionHelperModules: [ProjectDescriptionHelpersModule] - ) throws -> ProjectDescriptionHelpersModule? { + ) async throws -> ProjectDescriptionHelpersModule? { guard let tuistHelpersDirectory = helpersDirectoryLocator.locate(at: path) else { return nil } #if DEBUG if let sourceRoot = ProcessInfo.processInfo.environment["TUIST_CONFIG_SRCROOT"], @@ -125,7 +131,7 @@ public final class ProjectDescriptionHelpersBuilder: ProjectDescriptionHelpersBu return nil } #endif - return try buildHelpers( + return try await buildHelpers( name: Self.defaultHelpersName, in: tuistHelpersDirectory, projectDescriptionSearchPaths: projectDescriptionSearchPaths, @@ -152,8 +158,8 @@ public final class ProjectDescriptionHelpersBuilder: ProjectDescriptionHelpersBu in path: AbsolutePath, projectDescriptionSearchPaths: ProjectDescriptionSearchPaths, customProjectDescriptionHelperModules: [ProjectDescriptionHelpersModule] = [] - ) throws -> ProjectDescriptionHelpersModule { - if let cachedModule = builtHelpers[path] { return cachedModule } + ) async throws -> ProjectDescriptionHelpersModule { + if let cachedModule = builtHelpers.withValue({ $0[path] }) { return cachedModule } let hash = try projectDescriptionHelpersHasher.hash(helpersDirectory: path) let prefixHash = projectDescriptionHelpersHasher.prefixHash(helpersDirectory: path) @@ -164,7 +170,7 @@ public final class ProjectDescriptionHelpersBuilder: ProjectDescriptionHelpersBu let modulePath = helpersModuleCachePath.appending(component: dylibName) let projectDescriptionHelpersModule = ProjectDescriptionHelpersModule(name: name, path: modulePath) - builtHelpers[path] = projectDescriptionHelpersModule + builtHelpers.mutate { $0[path] = projectDescriptionHelpersModule } if FileHandler.shared.exists(helpersModuleCachePath) { return projectDescriptionHelpersModule @@ -173,7 +179,7 @@ public final class ProjectDescriptionHelpersBuilder: ProjectDescriptionHelpersBu // If the same helpers directory has been previously compiled // we delete it before compiling the new changes. if FileHandler.shared.exists(helpersCachePath) { - try FileHandler.shared.delete(helpersCachePath) + try await fileSystem.remove(helpersCachePath) } try FileHandler.shared.createFolder(helpersModuleCachePath) diff --git a/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift b/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift index f9d5f615cda..da4ef5f2119 100644 --- a/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift +++ b/Sources/TuistLoaderTesting/Loaders/Mocks/MockTemplateGitLoader.swift @@ -5,8 +5,8 @@ import TuistLoader public final class MockTemplateGitLoader: TemplateGitLoading { public var loadTemplateStub: ((String) throws -> Template)? - public func loadTemplate(from templateURL: String, closure: (Template) throws -> Void) throws { + public func loadTemplate(from templateURL: String, closure: @escaping (Template) async throws -> Void) async throws { let template = try loadTemplateStub?(templateURL) ?? Template(description: "", attributes: [], items: []) - try closure(template) + try await closure(template) } } diff --git a/Sources/TuistPlugin/PluginService.swift b/Sources/TuistPlugin/PluginService.swift index 8d90371ee14..7c8c32c4a4a 100644 --- a/Sources/TuistPlugin/PluginService.swift +++ b/Sources/TuistPlugin/PluginService.swift @@ -1,3 +1,4 @@ +import FileSystem import Foundation import Path import TuistCore @@ -68,6 +69,7 @@ public final class PluginService: PluginServicing { private let cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring private let fileArchivingFactory: FileArchivingFactorying private let fileClient: FileClienting + private let fileSystem: FileSystem /// Creates a `PluginService`. /// - Parameters: @@ -85,7 +87,8 @@ public final class PluginService: PluginServicing { gitHandler: GitHandling = GitHandler(), cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring = CacheDirectoriesProviderFactory(), fileArchivingFactory: FileArchivingFactorying = FileArchivingFactory(), - fileClient: FileClienting = FileClient() + fileClient: FileClienting = FileClient(), + fileSystem: FileSystem = FileSystem() ) { self.manifestLoader = manifestLoader self.templatesDirectoryLocator = templatesDirectoryLocator @@ -94,6 +97,7 @@ public final class PluginService: PluginServicing { self.cacheDirectoryProviderFactory = cacheDirectoryProviderFactory self.fileArchivingFactory = fileArchivingFactory self.fileClient = fileClient + self.fileSystem = fileSystem } public func remotePluginPaths(using config: Config) throws -> [RemotePluginPaths] { @@ -149,12 +153,12 @@ public final class PluginService: PluginServicing { return nil } } - let localPluginManifests = try localPluginPaths.map(manifestLoader.loadPlugin) + let localPluginManifests = try await localPluginPaths.concurrentMap(manifestLoader.loadPlugin) let remotePluginPaths = try remotePluginPaths(using: config) let remotePluginRepositoryPaths = remotePluginPaths.map(\.repositoryPath) - let remotePluginManifests = try remotePluginRepositoryPaths - .map(manifestLoader.loadPlugin) + let remotePluginManifests = try await remotePluginRepositoryPaths + .concurrentMap(manifestLoader.loadPlugin) let pluginPaths = localPluginPaths + remotePluginRepositoryPaths let missingRemotePlugins = zip(remotePluginManifests, remotePluginRepositoryPaths) .filter { !FileHandler.shared.exists($0.1) } @@ -279,7 +283,7 @@ public final class PluginService: PluginServicing { return } - let plugin = try manifestLoader.loadPlugin(at: pluginRepositoryDirectory) + let plugin = try await manifestLoader.loadPlugin(at: pluginRepositoryDirectory) guard let releaseURL = getPluginDownloadUrl(gitUrl: url, gitTag: gitTag, pluginName: plugin.name, releaseUrl: releaseUrl) else { throw PluginServiceError.invalidURL(url) } @@ -289,37 +293,44 @@ public final class PluginService: PluginServicing { // Currently, we assume the release path exists. let downloadPath = try await self.fileClient.download(url: releaseURL) let downloadZipPath = downloadPath.removingLastComponent().appending(component: "release.zip") - defer { - try? FileHandler.shared.delete(downloadPath) - try? FileHandler.shared.delete(downloadZipPath) - } - if FileHandler.shared.exists(downloadZipPath) { - try FileHandler.shared.delete(downloadZipPath) - } - try FileHandler.shared.move(from: downloadPath, to: downloadZipPath) - - // Unzip let fileUnarchiver = try self.fileArchivingFactory.makeFileUnarchiver(for: downloadZipPath) - let unarchivedContents = try FileHandler.shared.contentsOfDirectory( - try fileUnarchiver.unzip() - ) - defer { - try? fileUnarchiver.delete() - } - try FileHandler.shared.createFolder(pluginReleaseDirectory) - for unarchivedContent in unarchivedContents { - try FileHandler.shared.move( - from: unarchivedContent, - to: pluginReleaseDirectory.appending(component: unarchivedContent.basename) + + var thrownError: Error? + + do { + if FileHandler.shared.exists(downloadZipPath) { + try await self.fileSystem.remove(downloadZipPath) + } + try FileHandler.shared.move(from: downloadPath, to: downloadZipPath) + + // Unzip + let unarchivedContents = try FileHandler.shared.contentsOfDirectory( + try fileUnarchiver.unzip() ) - } - // Mark files as executables (this information is lost during (un)archiving) - try FileHandler.shared.contentsOfDirectory(pluginReleaseDirectory) - .filter { $0.basename.hasPrefix("tuist-") } - .forEach { - try System.shared.chmod(.executable, path: $0, options: [.onlyFiles]) + try FileHandler.shared.createFolder(pluginReleaseDirectory) + for unarchivedContent in unarchivedContents { + try FileHandler.shared.move( + from: unarchivedContent, + to: pluginReleaseDirectory.appending(component: unarchivedContent.basename) + ) } + + // Mark files as executables (this information is lost during (un)archiving) + try FileHandler.shared.contentsOfDirectory(pluginReleaseDirectory) + .filter { $0.basename.hasPrefix("tuist-") } + .forEach { + try System.shared.chmod(.executable, path: $0, options: [.onlyFiles]) + } + } catch { + thrownError = error + } + + try? await fileUnarchiver.delete() + try? await self.fileSystem.remove(downloadPath) + try? await self.fileSystem.remove(downloadZipPath) + + if let thrownError { throw thrownError } } } diff --git a/Sources/TuistScaffold/TemplateGenerator.swift b/Sources/TuistScaffold/TemplateGenerator.swift index cbd05bca939..79313b14c1f 100644 --- a/Sources/TuistScaffold/TemplateGenerator.swift +++ b/Sources/TuistScaffold/TemplateGenerator.swift @@ -1,3 +1,4 @@ +import FileSystem import Foundation import Path import PathKit @@ -16,18 +17,22 @@ public protocol TemplateGenerating { template: Template, to destinationPath: AbsolutePath, attributes: [String: Template.Attribute.Value] - ) throws + ) async throws } public final class TemplateGenerator: TemplateGenerating { + private let fileSystem: FileSystem + // Public initializer - public init() {} + public init(fileSystem: FileSystem = FileSystem()) { + self.fileSystem = fileSystem + } public func generate( template: Template, to destinationPath: AbsolutePath, attributes: [String: Template.Attribute.Value] - ) throws { + ) async throws { let renderedItems = try renderItems( template: template, attributes: attributes @@ -37,7 +42,7 @@ public final class TemplateGenerator: TemplateGenerating { destinationPath: destinationPath ) - try generateItems( + try await generateItems( renderedItems: renderedItems, attributes: attributes, destinationPath: destinationPath @@ -104,7 +109,7 @@ public final class TemplateGenerator: TemplateGenerating { renderedItems: [Template.Item], attributes: [String: Template.Attribute.Value], destinationPath: AbsolutePath - ) throws { + ) async throws { let environment = stencilSwiftEnvironment() for renderedItem in renderedItems { let renderedContents: String? @@ -135,7 +140,7 @@ public final class TemplateGenerator: TemplateGenerating { try FileHandler.shared.createFolder(destinationDirectoryPath.parentDirectory) } if FileHandler.shared.exists(destinationDirectoryPath) { - try FileHandler.shared.delete(destinationDirectoryPath) + try await fileSystem.remove(destinationDirectoryPath) } try FileHandler.shared.copy(from: path, to: destinationDirectoryPath) renderedContents = nil diff --git a/Sources/TuistServer/Session/ServerSessionController.swift b/Sources/TuistServer/Session/ServerSessionController.swift index 91d7a780227..ee151e9d134 100644 --- a/Sources/TuistServer/Session/ServerSessionController.swift +++ b/Sources/TuistServer/Session/ServerSessionController.swift @@ -14,7 +14,7 @@ public protocol ServerSessionControlling: AnyObject { /// Removes the session for the server with the given URL. /// - Parameter serverURL: Server URL. - func logout(serverURL: URL) throws + func logout(serverURL: URL) async throws } public final class ServerSessionController: ServerSessionControlling { @@ -105,9 +105,9 @@ public final class ServerSessionController: ServerSessionControlling { } } - public func logout(serverURL: URL) throws { + public func logout(serverURL: URL) async throws { logger.notice("Removing session for server with URL \(serverURL.absoluteString)") - try credentialsStore.delete(serverURL: serverURL) + try await credentialsStore.delete(serverURL: serverURL) logger.notice("Session deleted successfully", metadata: .success) } diff --git a/Sources/TuistServer/Utilities/ServerCredentialsStore.swift b/Sources/TuistServer/Utilities/ServerCredentialsStore.swift index f7e32b5a946..82a3c51f944 100644 --- a/Sources/TuistServer/Utilities/ServerCredentialsStore.swift +++ b/Sources/TuistServer/Utilities/ServerCredentialsStore.swift @@ -1,3 +1,4 @@ +import FileSystem import Foundation import Mockable import Path @@ -47,7 +48,7 @@ public protocol ServerCredentialsStoring: Sendable { /// Deletes the credentials for the server with the given URL. /// - Parameter serverURL: Server URL (without path). - func delete(serverURL: URL) throws + func delete(serverURL: URL) async throws } enum ServerCredentialsStoreError: FatalError { @@ -80,6 +81,7 @@ enum ServerCredentialsStoreError: FatalError { public final class ServerCredentialsStore: ServerCredentialsStoring { private let fileHandler: FileHandling + private let fileSystem: FileSystem private let configDirectory: AbsolutePath? /// Default initializer. @@ -87,9 +89,10 @@ public final class ServerCredentialsStore: ServerCredentialsStoring { self.init(fileHandler: FileHandler.shared) } - init(fileHandler: FileHandling, configDirectory: AbsolutePath? = nil) { + init(fileHandler: FileHandling, fileSystem: FileSystem = FileSystem(), configDirectory: AbsolutePath? = nil) { self.fileHandler = fileHandler self.configDirectory = configDirectory + self.fileSystem = fileSystem } // MARK: - CredentialsStoring @@ -125,10 +128,10 @@ public final class ServerCredentialsStore: ServerCredentialsStoring { return credentials } - public func delete(serverURL: URL) throws { + public func delete(serverURL: URL) async throws { let path = try credentialsFilePath(serverURL: serverURL) if fileHandler.exists(path) { - try fileHandler.delete(path) + try await fileSystem.remove(path) } } diff --git a/Sources/TuistSupport/Extensions/Array+ExecutionContext.swift b/Sources/TuistSupport/Extensions/Array+ExecutionContext.swift index 091187c3872..e58dbc93803 100644 --- a/Sources/TuistSupport/Extensions/Array+ExecutionContext.swift +++ b/Sources/TuistSupport/Extensions/Array+ExecutionContext.swift @@ -80,6 +80,22 @@ extension Array where Element: Sendable { return try concurrentForEach(perform) } } + + /// For Each (with execution context) + /// + /// - Parameters: + /// - context: The execution context to perform the `perform` operation with + /// - perform: The perform closure to call on each element in the array + public func forEach(context: ExecutionContext, _ perform: @escaping (Element) async throws -> Void) async rethrows { + switch context.executionType { + case .serial: + for item in self { + try await perform(item) + } + case .concurrent: + return try await concurrentForEach(perform) + } + } } // MARK: - Private @@ -141,4 +157,27 @@ extension Array { throw $0 } } + + private func concurrentForEach(_ perform: @escaping (Element) async throws -> Void) async rethrows { + let result = ThreadSafe([Error?](repeating: nil, count: count)) + + await withTaskGroup(of: Void.self) { group in + for idx in 0 ..< count { + group.addTask { + let element = self[idx] + do { + try await perform(element) + } catch { + result.mutate { + $0[idx] = error + } + } + } + } + } + + try result.value.compactMap { $0 }.forEach { + throw $0 + } + } } diff --git a/Sources/TuistSupport/Utils/FileArchiver.swift b/Sources/TuistSupport/Utils/FileArchiver.swift index 85b9af3f476..32b806bfe09 100644 --- a/Sources/TuistSupport/Utils/FileArchiver.swift +++ b/Sources/TuistSupport/Utils/FileArchiver.swift @@ -1,3 +1,4 @@ +import FileSystem import Foundation import Mockable import Path @@ -10,20 +11,23 @@ public protocol FileArchiving { func zip(name: String) throws -> AbsolutePath /// Call this method to delete the temporary directory where the .zip file has been generated. - func delete() throws + func delete() async throws } public class FileArchiver: FileArchiving { /// Paths to be archived. private let paths: [AbsolutePath] + private let fileSystem: FileSystem + /// Temporary directory in which the .zip file will be generated. private var temporaryDirectory: AbsolutePath /// Initializes the archiver with a list of files to archive. /// - Parameter paths: Paths to archive - public init(paths: [AbsolutePath]) throws { + public init(paths: [AbsolutePath], fileSystem: FileSystem = FileSystem()) throws { self.paths = paths + self.fileSystem = fileSystem temporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: false).path } @@ -39,7 +43,7 @@ public class FileArchiver: FileArchiving { return destinationZipPath } - public func delete() throws { - try FileHandler.shared.delete(temporaryDirectory) + public func delete() async throws { + try await fileSystem.remove(temporaryDirectory) } } diff --git a/Sources/TuistSupport/Utils/FileHandler.swift b/Sources/TuistSupport/Utils/FileHandler.swift index a5f105dacc5..2caa9e587ca 100644 --- a/Sources/TuistSupport/Utils/FileHandler.swift +++ b/Sources/TuistSupport/Utils/FileHandler.swift @@ -71,7 +71,6 @@ public protocol FileHandling: AnyObject { func throwingGlob(_ path: Path.AbsolutePath, glob: String) throws -> [Path.AbsolutePath] func linkFile(atPath: Path.AbsolutePath, toPath: Path.AbsolutePath) throws func createFolder(_ path: Path.AbsolutePath) throws - func delete(_ path: Path.AbsolutePath) throws func isFolder(_ path: Path.AbsolutePath) -> Bool func touch(_ path: Path.AbsolutePath) throws func contentsOfDirectory(_ path: Path.AbsolutePath) throws -> [Path.AbsolutePath] @@ -293,12 +292,6 @@ public class FileHandler: FileHandling { ) } - public func delete(_ path: Path.AbsolutePath) throws { - if exists(path) { - try fileManager.removeItem(atPath: path.pathString) - } - } - public func touch(_ path: Path.AbsolutePath) throws { try fileManager.createDirectory( at: path.removingLastComponent().url, diff --git a/Sources/TuistSupport/Utils/FileUnarchiver.swift b/Sources/TuistSupport/Utils/FileUnarchiver.swift index 53b64cfd7e2..29e75ff8f39 100644 --- a/Sources/TuistSupport/Utils/FileUnarchiver.swift +++ b/Sources/TuistSupport/Utils/FileUnarchiver.swift @@ -1,3 +1,4 @@ +import FileSystem import Foundation import Mockable import Path @@ -8,7 +9,7 @@ public protocol FileUnarchiving { func unzip() throws -> AbsolutePath /// Call this method to delete the temporary directory where the .zip file has been generated. - func delete() throws + func delete() async throws } public class FileUnarchiver: FileUnarchiving { @@ -18,10 +19,13 @@ public class FileUnarchiver: FileUnarchiving { /// Temporary directory in which the .zip file will be generated. private var temporaryDirectory: AbsolutePath + private let fileSystem: FileSystem + /// Initializes the unarchiver with the path to the file to unarchive. /// - Parameter path: Path to the .zip file to unarchive. - public init(path: AbsolutePath) throws { + public init(path: AbsolutePath, fileSystem: FileSystem = FileSystem()) throws { self.path = path + self.fileSystem = fileSystem temporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: false).path } @@ -30,7 +34,7 @@ public class FileUnarchiver: FileUnarchiving { return temporaryDirectory } - public func delete() throws { - try FileHandler.shared.delete(temporaryDirectory) + public func delete() async throws { + try await fileSystem.remove(temporaryDirectory) } } diff --git a/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift b/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift index 22dfe313c65..36335f6d855 100644 --- a/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift +++ b/Sources/TuistSupportTesting/Extensions/XCTestCase+Extras.swift @@ -122,6 +122,24 @@ extension XCTestCase { XCTFail("No error was thrown", file: file, line: line) } + public func XCTAssertThrowsSpecific( + _ closure: () async throws -> some Any, + _ error: Error, + file: StaticString = #file, + line: UInt = #line + ) async { + do { + _ = try await closure() + } catch let closureError as Error { + XCTAssertEqual(closureError, error, file: file, line: line) + return + } catch let closureError { + XCTFail("\(error) is not equal to: \(closureError)", file: file, line: line) + return + } + XCTFail("No error was thrown", file: file, line: line) + } + public func XCTAssertThrowsSpecific( _ closure: @autoclosure () async throws -> some Any, _ error: Error, diff --git a/Tests/TuistAsyncQueueTests/AsyncQueuePersistorTests.swift b/Tests/TuistAsyncQueueTests/AsyncQueuePersistorTests.swift index f8f97b924f1..1d620be4085 100644 --- a/Tests/TuistAsyncQueueTests/AsyncQueuePersistorTests.swift +++ b/Tests/TuistAsyncQueueTests/AsyncQueuePersistorTests.swift @@ -21,7 +21,7 @@ final class AsyncQueuePersistorTests: TuistUnitTestCase { super.tearDown() } - func test_write() throws { + func test_write() async throws { // Given let event = AnyAsyncQueueEvent(dispatcherId: "dispatcher") @@ -29,7 +29,7 @@ final class AsyncQueuePersistorTests: TuistUnitTestCase { try subject.write(event: event) // Then - let got = try subject.readAll() + let got = try await subject.readAll() let gotEvent = try XCTUnwrap(got.first) XCTAssertEqual(gotEvent.dispatcherId, "dispatcher") XCTAssertEqual(gotEvent.id, event.id) @@ -37,7 +37,7 @@ final class AsyncQueuePersistorTests: TuistUnitTestCase { XCTAssertEqual(gotEvent.date, normalizedDate) } - func test_write_whenDirectoryDoesntExist_itCreatesDirectory() throws { + func test_write_whenDirectoryDoesntExist_itCreatesDirectory() async throws { let temporaryDirectory = try! temporaryPath() subject = AsyncQueuePersistor(directory: temporaryDirectory.appending(try RelativePath(validating: "test/"))) @@ -48,7 +48,7 @@ final class AsyncQueuePersistorTests: TuistUnitTestCase { try subject.write(event: event) // Then - let got = try subject.readAll() + let got = try await subject.readAll() let gotEvent = try XCTUnwrap(got.first) XCTAssertEqual(gotEvent.dispatcherId, "dispatcher") XCTAssertEqual(gotEvent.id, event.id) @@ -56,18 +56,18 @@ final class AsyncQueuePersistorTests: TuistUnitTestCase { XCTAssertEqual(gotEvent.date, normalizedDate) } - func test_delete() throws { + func test_delete() async throws { // Given let event = AnyAsyncQueueEvent(dispatcherId: "dispatcher") try subject.write(event: event) - var persistedEvents = try subject.readAll() + var persistedEvents = try await subject.readAll() XCTAssertEqual(persistedEvents.count, 1) // When - try subject.delete(event: event) + try await subject.delete(event: event) // Then - persistedEvents = try subject.readAll() + persistedEvents = try await subject.readAll() XCTAssertEqual(persistedEvents.count, 0) } } diff --git a/Tests/TuistAsyncQueueTests/AsyncQueueTests.swift b/Tests/TuistAsyncQueueTests/AsyncQueueTests.swift index b8b6d876fd1..9ec89372f89 100644 --- a/Tests/TuistAsyncQueueTests/AsyncQueueTests.swift +++ b/Tests/TuistAsyncQueueTests/AsyncQueueTests.swift @@ -197,7 +197,7 @@ final class AsyncQueueTests: TuistUnitTestCase { XCTAssertEqual(mockPersistor.invokedDeleteEventCount, 0) } - func test_waits_for_queue_to_finish_when_CI() throws { + func test_waits_for_queue_to_finish_when_CI() async throws { // Given let eventTuple1: AsyncQueueEventTuple = makeEventTuple(id: 1) mockPersistor.stubbedReadAllResult = [eventTuple1] @@ -207,7 +207,7 @@ final class AsyncQueueTests: TuistUnitTestCase { // When subject = makeSubject(queue: Queuer.shared) - subject.start() + await subject.start() // Then XCTAssertEqual(Queuer.shared.operationCount, 0) @@ -228,7 +228,7 @@ final class AsyncQueueTests: TuistUnitTestCase { // XCTAssertEqual(Queuer.shared.operationCount, 1) // } - func test_start_readsPersistedEventsInitialization() throws { + func test_start_readsPersistedEventsInitialization() async throws { // Given given(ciChecker) .isCI() @@ -240,7 +240,7 @@ final class AsyncQueueTests: TuistUnitTestCase { // When subject = makeSubject() - subject.start() + await subject.start() // Then let numberOfOperationsQueued = mockQueuer.invokedAddOperationCount @@ -265,7 +265,7 @@ final class AsyncQueueTests: TuistUnitTestCase { XCTAssertEqual(queuedOperation3.name, eventTuple3.id.uuidString) } - func test_start_persistedEventIsDispatchedByTheRightDispatcher() throws { + func test_start_persistedEventIsDispatchedByTheRightDispatcher() async throws { // Given given(ciChecker) .isCI() @@ -280,7 +280,7 @@ final class AsyncQueueTests: TuistUnitTestCase { // When subject = makeSubject(queue: Queuer.shared) - subject.start() + await subject.start() // Then wait(for: [expectation], timeout: timeout) @@ -293,7 +293,7 @@ final class AsyncQueueTests: TuistUnitTestCase { XCTAssertEqual(mockAsyncQueueDispatcher2.invokedDispatchPersistedCount, 0) } - func test_start_sentPersistedEventIsThenDeleted() throws { + func test_start_sentPersistedEventIsThenDeleted() async throws { // Given given(ciChecker) .isCI() @@ -309,7 +309,7 @@ final class AsyncQueueTests: TuistUnitTestCase { // When subject = makeSubject(queue: Queuer.shared) - subject.start() + await subject.start() // Then wait(for: [expectation], timeout: timeout) diff --git a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift index 4d0e96a2bf5..c5976f98157 100644 --- a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift +++ b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift @@ -8,7 +8,7 @@ import XCTest /// Build projects using Tuist build final class BuildAcceptanceTestWithTemplates: TuistAcceptanceTestCase { func test_with_templates() async throws { - try run(InitCommand.self, "--platform", "ios", "--name", "MyApp") + try await run(InitCommand.self, "--platform", "ios", "--name", "MyApp") try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self) @@ -20,7 +20,7 @@ final class BuildAcceptanceTestWithTemplates: TuistAcceptanceTestCase { final class BuildAcceptanceTestInvalidArguments: TuistAcceptanceTestCase { func test_with_invalid_arguments() async throws { - try run(InitCommand.self, "--platform", "ios", "--name", "MyApp") + try await run(InitCommand.self, "--platform", "ios", "--name", "MyApp") try await run(InstallCommand.self) try await run(GenerateCommand.self) await XCTAssertThrowsSpecific( diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift index 56316b7c37b..609be2085f6 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift @@ -25,18 +25,22 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { } } - func testGenerateThrowsLintingErrorWhenConfigurationsAreEmpty() throws { + func testGenerateThrowsLintingErrorWhenConfigurationsAreEmpty() async throws { // Given let projectSettings = Settings(configurations: [:]) let targetSettings: Settings? = nil // When / Then - XCTAssertThrowsError( - try generateWorkspace(projectSettings: projectSettings, targetSettings: targetSettings) - ) + var _error: Error? + do { + try await generateWorkspace(projectSettings: projectSettings, targetSettings: targetSettings) + } catch { + _error = error + } + XCTAssertNotNil(_error) } - func testGenerateWhenSingleDebugConfigurationInProject() throws { + func testGenerateWhenSingleDebugConfigurationInProject() async throws { // Given let projectSettings = Settings( base: ["A": "A"], @@ -44,7 +48,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { ) // When - try generateWorkspace(projectSettings: projectSettings, targetSettings: nil) + try await generateWorkspace(projectSettings: projectSettings, targetSettings: nil) // Then assertProject(expectedConfigurations: ["Debug"]) @@ -54,7 +58,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { XCTAssertTrue(debug.contains("A", "A")) // from base } - func testGenerateWhenConfigurationSettingsOverrideXCConfig() throws { + func testGenerateWhenConfigurationSettingsOverrideXCConfig() async throws { // Given let debugFilePath = try createFile(path: "Configs/debug.xcconfig", content: """ A=A_XCCONFIG @@ -67,7 +71,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { let projectSettings = Settings(configurations: [.debug: debugConfiguration]) // When - try generateWorkspace(projectSettings: projectSettings, targetSettings: nil) + try await generateWorkspace(projectSettings: projectSettings, targetSettings: nil) // Then assertProject(expectedConfigurations: ["Debug"]) @@ -79,7 +83,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { XCTAssertTrue(debug.contains("C", "C")) // from settings } - func testGenerateWhenConfigurationSettingsOverrideBase() throws { + func testGenerateWhenConfigurationSettingsOverrideBase() async throws { // Given let debugConfiguration = Configuration(settings: ["A": "A", "C": "C"]) let projectSettings = Settings( @@ -88,7 +92,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { ) // When - try generateWorkspace(projectSettings: projectSettings, targetSettings: nil) + try await generateWorkspace(projectSettings: projectSettings, targetSettings: nil) // Then assertProject(expectedConfigurations: ["Debug"]) @@ -100,7 +104,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { XCTAssertTrue(debug.contains("C", "C")) // from settings } - func testGenerateWhenBuildConfigurationWithCustomName() throws { + func testGenerateWhenBuildConfigurationWithCustomName() async throws { // Given let customConfiguration = Configuration(settings: ["A": "A", "C": "C"]) let projectSettings = Settings( @@ -112,7 +116,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { ) // When - try generateWorkspace(projectSettings: projectSettings, targetSettings: nil) + try await generateWorkspace(projectSettings: projectSettings, targetSettings: nil) // Then assertProject(expectedConfigurations: ["Custom", "Release"]) @@ -129,7 +133,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { XCTAssertFalse(release.contains("C", "C")) // non-existing, only defined in Custom } - func testGenerateWhenTargetSettingsOverrideTargetXCConfig() throws { + func testGenerateWhenTargetSettingsOverrideTargetXCConfig() async throws { // Given let debugFilePath = try createFile(path: "Configs/debug.xcconfig", content: """ A=A_XCCONFIG @@ -143,7 +147,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { let targetSettings = Settings(configurations: [.debug: debugConfiguration]) // When - try generateWorkspace(projectSettings: projectSettings, targetSettings: targetSettings) + try await generateWorkspace(projectSettings: projectSettings, targetSettings: targetSettings) // Then assertProject(expectedConfigurations: ["Debug"]) @@ -155,7 +159,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { XCTAssertTrue(debug.contains("C", "C")) // from target settings } - func testGenerateWhenMultipleConfigurations() throws { + func testGenerateWhenMultipleConfigurations() async throws { // Given let projectDebugConfiguration = Configuration(settings: [ "A": "A_PROJECT_DEBUG", @@ -179,7 +183,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { ]) // When - try generateWorkspace(projectSettings: projectSettings, targetSettings: targetSettings) + try await generateWorkspace(projectSettings: projectSettings, targetSettings: targetSettings) // Then assertProject(expectedConfigurations: ["Debug", "ProjectRelease"]) @@ -209,7 +213,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { - target base - target configuraiton settings */ - func testGenerateWhenTargetSettingsOverrideProjectBaseSettingsAndXCConfig() throws { + func testGenerateWhenTargetSettingsOverrideProjectBaseSettingsAndXCConfig() async throws { // Given let projectDebugFilePath = try createFile(path: "Configs/project_debug.xcconfig", content: """ A=A_PROJECT_XCCONFIG @@ -267,7 +271,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { ) // When - try generateWorkspace(projectSettings: projectSettings, targetSettings: targetSettings) + try await generateWorkspace(projectSettings: projectSettings, targetSettings: targetSettings) // Then assertProject(expectedConfigurations: ["Debug"]) @@ -288,7 +292,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { XCTAssertTrue(debug.contains("TARGET", "YES")) // from target settings } - func testGenerateWhenCustomConfigurations() throws { + func testGenerateWhenCustomConfigurations() async throws { // Given let projectDebugConfiguration = Configuration(settings: [ "A": "A_PROJECT_DEBUG", @@ -308,7 +312,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { ]) // When - try generateWorkspace(projectSettings: projectSettings, targetSettings: nil) + try await generateWorkspace(projectSettings: projectSettings, targetSettings: nil) // Then assertProject(expectedConfigurations: ["CustomDebug", "CustomRelease", "Debug", "Release"]) @@ -336,7 +340,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { // MARK: - Helpers - private func generateWorkspace(projectSettings: Settings, targetSettings: Settings?) throws { + private func generateWorkspace(projectSettings: Settings, targetSettings: Settings?) async throws { let models = try createModels(projectSettings: projectSettings, targetSettings: targetSettings) let subject = DescriptorGenerator() let writer = XcodeProjWriter() @@ -348,7 +352,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { let graphTraverser = GraphTraverser(graph: graph) try linter.lint(graphTraverser: graphTraverser, config: config).printAndThrowErrorsIfNeeded() let descriptor = try subject.generateWorkspace(graphTraverser: graphTraverser) - try writer.write(workspace: descriptor) + try await writer.write(workspace: descriptor) } private func setupTestProject() throws { diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/StableStructureIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/StableStructureIntegrationTests.swift index d480265ea5d..67ad0bfe0e8 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/StableStructureIntegrationTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/StableStructureIntegrationTests.swift @@ -12,7 +12,7 @@ import XCTest @testable import TuistSupportTesting final class StableXcodeProjIntegrationTests: TuistTestCase { - func testXcodeProjStructureDoesNotChangeAfterRegeneration() throws { + func testXcodeProjStructureDoesNotChangeAfterRegeneration() async throws { // Given let temporaryPath = try temporaryPath() var capturedProjects = [[XcodeProj]]() @@ -43,7 +43,7 @@ final class StableXcodeProjIntegrationTests: TuistTestCase { // Note: While we already have access to the `XcodeProj` models in `workspaceDescriptor` // unfortunately they are not equatable, however once serialized & deserialized back they are - try writer.write(workspace: workspaceDescriptor) + try await writer.write(workspace: workspaceDescriptor) let xcworkspace = try XCWorkspace(path: workspaceDescriptor.xcworkspacePath.path) let xcodeProjs = try findXcodeProjs(in: xcworkspace) let sharedSchemes = try findSharedSchemes(in: xcworkspace) diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/XcodeProjWriterTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/XcodeProjWriterTests.swift index 4cab00c7570..8a98586560f 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/XcodeProjWriterTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/XcodeProjWriterTests.swift @@ -22,20 +22,20 @@ final class XcodeProjWriterTests: TuistTestCase { super.tearDown() } - func test_writeProject() throws { + func test_writeProject() async throws { // Given let path = try temporaryPath() let xcodeProjPath = path.appending(component: "Project.xcodeproj") let descriptor = ProjectDescriptor.test(path: path, xcodeprojPath: xcodeProjPath) // When - try subject.write(project: descriptor) + try await subject.write(project: descriptor) // Then XCTAssertTrue(FileHandler.shared.exists(xcodeProjPath)) } - func test_writeProject_fileSideEffects() throws { + func test_writeProject_fileSideEffects() async throws { // Given let path = try temporaryPath() let xcodeProjPath = path.appending(component: "Project.xcodeproj") @@ -52,7 +52,7 @@ final class XcodeProjWriterTests: TuistTestCase { ) // When - try subject.write(project: descriptor) + try await subject.write(project: descriptor) // Then let fileHandler = FileHandler.shared @@ -60,7 +60,7 @@ final class XcodeProjWriterTests: TuistTestCase { XCTAssertEqual(try fileHandler.readFile(filePath), contents) } - func test_writeProject_deleteFileSideEffects() throws { + func test_writeProject_deleteFileSideEffects() async throws { // Given let path = try temporaryPath() let xcodeProjPath = path.appending(component: "Project.xcodeproj") @@ -76,13 +76,13 @@ final class XcodeProjWriterTests: TuistTestCase { ) // When - try subject.write(project: descriptor) + try await subject.write(project: descriptor) // Then XCTAssertFalse(fileHandler.exists(filePath)) } - func test_generate_doesNotWipeUserData() throws { + func test_generate_doesNotWipeUserData() async throws { // Given let path = try temporaryPath() let paths = try createFiles([ @@ -98,14 +98,14 @@ final class XcodeProjWriterTests: TuistTestCase { // When for _ in 0 ..< 2 { - try subject.write(project: descriptor) + try await subject.write(project: descriptor) } // Then XCTAssertTrue(paths.allSatisfy { FileHandler.shared.exists($0) }) } - func test_generate_replacesProjectSharedSchemes() throws { + func test_generate_replacesProjectSharedSchemes() async throws { // Given let path = try temporaryPath() let xcodeProjPath = path.appending(component: "Project.xcodeproj") @@ -125,7 +125,7 @@ final class XcodeProjWriterTests: TuistTestCase { xcodeprojPath: xcodeProjPath, schemes: schemes ) - try subject.write(project: descriptor) + try await subject.write(project: descriptor) } // Then @@ -137,7 +137,7 @@ final class XcodeProjWriterTests: TuistTestCase { ]) } - func test_generate_preservesProjectUserSchemes() throws { + func test_generate_preservesProjectUserSchemes() async throws { // Given let path = try temporaryPath() let xcodeProjPath = path.appending(component: "Project.xcodeproj") @@ -156,7 +156,7 @@ final class XcodeProjWriterTests: TuistTestCase { xcodeprojPath: xcodeProjPath, schemes: schemes ) - try subject.write(project: descriptor) + try await subject.write(project: descriptor) } // Then @@ -168,7 +168,7 @@ final class XcodeProjWriterTests: TuistTestCase { ]) } - func test_generate_replacesWorkspaceSharedSchemes() throws { + func test_generate_replacesWorkspaceSharedSchemes() async throws { // Given let path = try temporaryPath() let xcworkspacePath = path.appending(component: "Workspace.xcworkspace") @@ -188,7 +188,7 @@ final class XcodeProjWriterTests: TuistTestCase { xcworkspacePath: xcworkspacePath, schemes: schemes ) - try subject.write(workspace: descriptor) + try await subject.write(workspace: descriptor) } // Then @@ -200,7 +200,7 @@ final class XcodeProjWriterTests: TuistTestCase { ]) } - func test_generate_preservesWorkspaceUserSchemes() throws { + func test_generate_preservesWorkspaceUserSchemes() async throws { // Given let path = try temporaryPath() let xcworkspacePath = path.appending(component: "Workspace.xcworkspace") @@ -219,7 +219,7 @@ final class XcodeProjWriterTests: TuistTestCase { xcworkspacePath: xcworkspacePath, schemes: schemes ) - try subject.write(workspace: descriptor) + try await subject.write(workspace: descriptor) } // Then @@ -231,7 +231,7 @@ final class XcodeProjWriterTests: TuistTestCase { ]) } - func test_generate_local_scheme() throws { + func test_generate_local_scheme() async throws { // Given let path = try temporaryPath() let xcodeProjPath = path.appending(component: "Project.xcodeproj") @@ -239,7 +239,7 @@ final class XcodeProjWriterTests: TuistTestCase { let descriptor = ProjectDescriptor.test(path: path, xcodeprojPath: xcodeProjPath, schemes: [userScheme]) // When - try subject.write(project: descriptor) + try await subject.write(project: descriptor) // Then let fileHandler = FileHandler.shared diff --git a/Tests/TuistKitAcceptanceTests/InitAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/InitAcceptanceTests.swift index 3ff034dbcf4..e4166e507c0 100644 --- a/Tests/TuistKitAcceptanceTests/InitAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/InitAcceptanceTests.swift @@ -7,7 +7,7 @@ import XCTest final class InitAcceptanceTestmacOSApp: TuistAcceptanceTestCase { func test_init_macos_app() async throws { - try run(InitCommand.self, "--platform", "macos", "--name", "Test") + try await run(InitCommand.self, "--platform", "macos", "--name", "Test") try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self) @@ -16,7 +16,7 @@ final class InitAcceptanceTestmacOSApp: TuistAcceptanceTestCase { final class InitAcceptanceTestiOSApp: TuistAcceptanceTestCase { func test_init_ios_app() async throws { - try run(InitCommand.self, "--platform", "ios", "--name", "My-App") + try await run(InitCommand.self, "--platform", "ios", "--name", "My-App") try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self) @@ -33,7 +33,13 @@ final class InitAcceptanceTestiOSApp: TuistAcceptanceTestCase { final class InitAcceptanceTestCLIProjectWithTemplateInADifferentRepository: TuistAcceptanceTestCase { func test_cli_project_with_template_in_a_different_repository() async throws { - try run(InitCommand.self, "--template", "https://github.com/tuist/ExampleTuistTemplate-Tuist4.git", "--name", "MyApp") + try await run( + InitCommand.self, + "--template", + "https://github.com/tuist/ExampleTuistTemplate-Tuist4.git", + "--name", + "MyApp" + ) try await run(GenerateCommand.self) try await run(BuildCommand.self) } diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift index 6877e31d428..7ddfd2d064d 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorTests.swift @@ -78,7 +78,7 @@ final class ProjectEditorTests: TuistUnitTestCase { super.tearDown() } - func test_edit() throws { + func test_edit() async throws { // Given let directory = try temporaryPath() let projectDescriptionPath = directory.appending(component: "ProjectDescription.framework") @@ -131,7 +131,7 @@ final class ProjectEditorTests: TuistUnitTestCase { } // When - try _ = subject.edit(at: directory, in: directory, onlyCurrentDirectory: false, plugins: .test()) + try _ = await subject.edit(at: directory, in: directory, onlyCurrentDirectory: false, plugins: .test()) // Then XCTAssertEqual(projectEditorMapper.mapArgs.count, 1) @@ -144,7 +144,7 @@ final class ProjectEditorTests: TuistUnitTestCase { XCTAssertEqual(mapArgs?.packageManifestPath, packageManifestPath) } - func test_edit_when_there_are_no_editable_files() throws { + func test_edit_when_there_are_no_editable_files() async throws { // Given let directory = try temporaryPath() let projectDescriptionPath = directory.appending(component: "ProjectDescription.framework") @@ -172,14 +172,14 @@ final class ProjectEditorTests: TuistUnitTestCase { } // Then - XCTAssertThrowsSpecific( + await XCTAssertThrowsSpecific( // When - try subject.edit(at: directory, in: directory, onlyCurrentDirectory: false, plugins: .test()), + try await subject.edit(at: directory, in: directory, onlyCurrentDirectory: false, plugins: .test()), ProjectEditorError.noEditableFiles(directory) ) } - func test_edit_with_plugin() throws { + func test_edit_with_plugin() async throws { // Given let directory = try temporaryPath() let projectDescriptionPath = directory.appending(component: "ProjectDescription.framework") @@ -208,7 +208,7 @@ final class ProjectEditorTests: TuistUnitTestCase { } // When - try _ = subject.edit(at: directory, in: directory, onlyCurrentDirectory: false, plugins: .test()) + try _ = await subject.edit(at: directory, in: directory, onlyCurrentDirectory: false, plugins: .test()) // Then XCTAssertEqual(projectEditorMapper.mapArgs.count, 1) @@ -220,7 +220,7 @@ final class ProjectEditorTests: TuistUnitTestCase { XCTAssertEqual(mapArgs?.pluginProjectDescriptionHelpersModule, []) } - func test_edit_with_many_plugins() throws { + func test_edit_with_many_plugins() async throws { // Given let directory = try temporaryPath() let projectDescriptionPath = directory.appending(component: "ProjectDescription.framework") @@ -254,7 +254,7 @@ final class ProjectEditorTests: TuistUnitTestCase { } // When - try _ = subject.edit(at: directory, in: directory, onlyCurrentDirectory: false, plugins: .test()) + try _ = await subject.edit(at: directory, in: directory, onlyCurrentDirectory: false, plugins: .test()) // Then XCTAssertEqual(projectEditorMapper.mapArgs.count, 1) @@ -266,7 +266,7 @@ final class ProjectEditorTests: TuistUnitTestCase { XCTAssertEqual(mapArgs?.pluginProjectDescriptionHelpersModule, []) } - func test_edit_project_with_local_plugins() throws { + func test_edit_project_with_local_plugins() async throws { // Given let directory = try temporaryPath() let projectDescriptionPath = directory.appending(component: "ProjectDescription.framework") @@ -312,7 +312,7 @@ final class ProjectEditorTests: TuistUnitTestCase { let plugins = Plugins.test(projectDescriptionHelpers: [ .init(name: "LocalPlugin", path: pluginManifestPath, location: .local), ]) - try _ = subject.edit(at: directory, in: directory, onlyCurrentDirectory: false, plugins: plugins) + try _ = await subject.edit(at: directory, in: directory, onlyCurrentDirectory: false, plugins: plugins) // Then XCTAssertEqual(projectEditorMapper.mapArgs.count, 1) @@ -325,7 +325,7 @@ final class ProjectEditorTests: TuistUnitTestCase { XCTAssertEqual(mapArgs?.pluginProjectDescriptionHelpersModule, []) } - func test_edit_project_with_local_plugin_outside_editing_path() throws { + func test_edit_project_with_local_plugin_outside_editing_path() async throws { // Given let rootPath = try temporaryPath() let editingPath = rootPath.appending(component: "Editing") @@ -368,7 +368,7 @@ final class ProjectEditorTests: TuistUnitTestCase { .init(name: "LocalPlugin", path: pluginManifestPath, location: .local), ]) - try _ = subject.edit(at: editingPath, in: editingPath, onlyCurrentDirectory: false, plugins: plugins) + try _ = await subject.edit(at: editingPath, in: editingPath, onlyCurrentDirectory: false, plugins: plugins) // Then XCTAssertEqual(projectEditorMapper.mapArgs.count, 1) @@ -381,7 +381,7 @@ final class ProjectEditorTests: TuistUnitTestCase { XCTAssertEqual(mapArgs?.pluginProjectDescriptionHelpersModule, []) } - func test_edit_project_with_remote_plugin() throws { + func test_edit_project_with_remote_plugin() async throws { // Given let directory = try temporaryPath() let projectDescriptionPath = directory.appending(component: "ProjectDescription.framework") @@ -422,7 +422,7 @@ final class ProjectEditorTests: TuistUnitTestCase { let plugins = Plugins.test(projectDescriptionHelpers: [ .init(name: "RemotePlugin", path: try AbsolutePath(validating: "/Some/Path/To/Plugin"), location: .remote), ]) - try _ = subject.edit(at: directory, in: directory, onlyCurrentDirectory: false, plugins: plugins) + try _ = await subject.edit(at: directory, in: directory, onlyCurrentDirectory: false, plugins: plugins) // Then XCTAssertEqual(projectEditorMapper.mapArgs.count, 1) diff --git a/Tests/TuistKitTests/Services/CleanServiceTests.swift b/Tests/TuistKitTests/Services/CleanServiceTests.swift index 6aa3e119f02..b4a70ff67d0 100644 --- a/Tests/TuistKitTests/Services/CleanServiceTests.swift +++ b/Tests/TuistKitTests/Services/CleanServiceTests.swift @@ -1,3 +1,4 @@ +import FileSystem import Foundation import MockableTest import Path @@ -37,7 +38,8 @@ final class CleanServiceTests: TuistUnitTestCase { manifestFilesLocator: manifestFilesLocator, configLoader: configLoader, serverURLService: serverURLService, - cleanCacheService: cleanCacheService + cleanCacheService: cleanCacheService, + fileSystem: FileSystem() ) } diff --git a/Tests/TuistKitTests/Services/InitServiceTests.swift b/Tests/TuistKitTests/Services/InitServiceTests.swift index e3fea17b875..d82b6b54c54 100644 --- a/Tests/TuistKitTests/Services/InitServiceTests.swift +++ b/Tests/TuistKitTests/Services/InitServiceTests.swift @@ -43,21 +43,24 @@ final class InitServiceTests: TuistUnitTestCase { super.tearDown() } - func test_fails_when_directory_not_empty() throws { + func test_fails_when_directory_not_empty() async throws { // Given let path = FileHandler.shared.currentPath try FileHandler.shared.touch(path.appending(component: "dummy")) // Then - XCTAssertThrowsSpecific(try subject.testRun(), InitServiceError.nonEmptyDirectory(path)) + await XCTAssertThrowsSpecific({ try await self.subject.testRun() }, InitServiceError.nonEmptyDirectory(path)) } - func test_init_fails_when_template_not_found() throws { + func test_init_fails_when_template_not_found() async throws { let templateName = "template" - XCTAssertThrowsSpecific(try subject.testRun(templateName: templateName), InitServiceError.templateNotFound(templateName)) + await XCTAssertThrowsSpecific( + { try await self.subject.testRun(templateName: templateName) }, + InitServiceError.templateNotFound(templateName) + ) } - func test_init_default_when_no_template() throws { + func test_init_default_when_no_template() async throws { // Given let defaultTemplatePath = try temporaryPath().appending(component: "default") templatesDirectoryLocator.templateDirectoriesStub = { _ in @@ -80,13 +83,13 @@ final class InitServiceTests: TuistUnitTestCase { } // When - try subject.testRun(name: "Name", platform: "macos") + try await subject.testRun(name: "Name", platform: "macos") // Then XCTAssertEqual(expectedAttributes, generatorAttributes) } - func test_init_default_platform() throws { + func test_init_default_platform() async throws { // Given let defaultTemplatePath = try temporaryPath().appending(component: "default") templatesDirectoryLocator.templateDirectoriesStub = { _ in @@ -109,13 +112,13 @@ final class InitServiceTests: TuistUnitTestCase { } // When - try subject.testRun(name: "Name") + try await subject.testRun(name: "Name") // Then XCTAssertEqual(expectedAttributes, generatorAttributes) } - func test_init_default_with_unusual_name() throws { + func test_init_default_with_unusual_name() async throws { // Given let defaultTemplatePath = try temporaryPath().appending(component: "default") templatesDirectoryLocator.templateDirectoriesStub = { _ in @@ -137,7 +140,7 @@ final class InitServiceTests: TuistUnitTestCase { } // When - try subject.testRun(name: "unusual name") + try await subject.testRun(name: "unusual name") // Then XCTAssertEqual(expectedAttributes, generatorAttributes) @@ -174,7 +177,7 @@ final class InitServiceTests: TuistUnitTestCase { } // When - try subject.testRun( + try await subject.testRun( name: "Name", platform: "macos", templateName: "https://url/to/repo.git", @@ -223,7 +226,7 @@ final class InitServiceTests: TuistUnitTestCase { } // When - try subject.testRun(name: "Name") + try await subject.testRun(name: "Name") // Then XCTAssertEqual(expectedAttributes, generatorAttributes) @@ -262,7 +265,7 @@ final class InitServiceTests: TuistUnitTestCase { } // When - try subject.testRun(name: "Name") + try await subject.testRun(name: "Name") // Then XCTAssertEqual(expectedAttributes, generatorAttributes) @@ -277,8 +280,8 @@ extension InitService { templateName: String? = nil, requiredTemplateOptions: [String: String] = [:], optionalTemplateOptions: [String: String?] = [:] - ) throws { - try run( + ) async throws { + try await run( name: name, platform: platform, path: path, diff --git a/Tests/TuistKitTests/Services/LogoutServiceTests.swift b/Tests/TuistKitTests/Services/LogoutServiceTests.swift index 79f44b9030d..3f16a42a7c0 100644 --- a/Tests/TuistKitTests/Services/LogoutServiceTests.swift +++ b/Tests/TuistKitTests/Services/LogoutServiceTests.swift @@ -39,13 +39,13 @@ final class LogoutServiceTests: TuistUnitTestCase { super.tearDown() } - func test_logout() throws { + func test_logout() async throws { // Given given(serverSessionController) .logout(serverURL: .value(serverURL)) .willReturn(()) // When / Then - try subject.logout(directory: nil) + try await subject.logout(directory: nil) } } diff --git a/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift b/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift index 8315dc5bdc0..270da6c9367 100644 --- a/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift +++ b/Tests/TuistKitTests/Services/Plugin/PluginArchiveServiceTests.swift @@ -32,7 +32,7 @@ final class PluginArchiveServiceTests: TuistUnitTestCase { super.tearDown() } - func test_run_when_no_task_products_defined() throws { + func test_run_when_no_task_products_defined() async throws { // Given swiftPackageManagerController.loadPackageInfoStub = { _ in PackageInfo.test( @@ -47,7 +47,7 @@ final class PluginArchiveServiceTests: TuistUnitTestCase { } // When - try subject.run(path: nil) + try await subject.run(path: nil) // Then XCTAssertPrinterContains( @@ -57,7 +57,7 @@ final class PluginArchiveServiceTests: TuistUnitTestCase { ) } - func test_run() throws { + func test_run() async throws { // Given let path = try temporaryPath() var invokedPackagePath: AbsolutePath? @@ -106,7 +106,7 @@ final class PluginArchiveServiceTests: TuistUnitTestCase { try fileHandler.createFolder(zipPath) // When - try subject.run(path: path.pathString) + try await subject.run(path: path.pathString) // Then XCTAssertEqual(invokedPackagePath, path) diff --git a/Tests/TuistKitTests/Services/SessionServiceTests.swift b/Tests/TuistKitTests/Services/SessionServiceTests.swift index 3a9b1debf42..fe324ff9863 100644 --- a/Tests/TuistKitTests/Services/SessionServiceTests.swift +++ b/Tests/TuistKitTests/Services/SessionServiceTests.swift @@ -39,13 +39,13 @@ final class SessionServiceTests: TuistUnitTestCase { super.tearDown() } - func test_printSession() throws { + func test_printSession() async throws { // Given given(serverSessionController) .printSession(serverURL: .value(serverURL)) .willReturn(()) // When / Then - try subject.printSession(directory: nil) + try await subject.printSession(directory: nil) } } diff --git a/Tests/TuistKitTests/Services/TuistServiceTests.swift b/Tests/TuistKitTests/Services/TuistServiceTests.swift index af65f71b686..c0b29dd1e3e 100644 --- a/Tests/TuistKitTests/Services/TuistServiceTests.swift +++ b/Tests/TuistKitTests/Services/TuistServiceTests.swift @@ -31,20 +31,20 @@ final class TuistServiceTests: TuistUnitTestCase { super.tearDown() } - func test_run_when_command_not_found() throws { + func test_run_when_command_not_found() async throws { // Given given(configLoader) .loadConfig(path: .any) .willReturn(.default) // When / Then - XCTAssertThrowsSpecific( - try subject.run(arguments: ["my-command"], tuistBinaryPath: ""), + await XCTAssertThrowsSpecific( + { try await self.subject.run(arguments: ["my-command"], tuistBinaryPath: "") }, TuistServiceError.taskUnavailable ) } - func test_run_when_plugin_executable() throws { + func test_run_when_plugin_executable() async throws { // Given let path = try temporaryPath() let projectPath = path.appending(component: "Project") @@ -71,11 +71,11 @@ final class TuistServiceTests: TuistUnitTestCase { // When/Then XCTAssertNoThrow( - try subject.run(arguments: ["command-b", "--path", projectPath.pathString], tuistBinaryPath: "") + { try await self.subject.run(arguments: ["command-b", "--path", projectPath.pathString], tuistBinaryPath: "") } ) } - func test_run_when_command_is_global() throws { + func test_run_when_command_is_global() async throws { // Given var whichCommand: String? system.whichStub = { invokedWhichCommand in @@ -88,9 +88,13 @@ final class TuistServiceTests: TuistUnitTestCase { .willReturn(.default) // When/Then - XCTAssertNoThrow( - try subject.run(arguments: ["my-command", "argument-one"], tuistBinaryPath: "") - ) + var _error: Error? + do { + try await subject.run(arguments: ["my-command", "argument-one"], tuistBinaryPath: "") + } catch { + _error = error + } + XCTAssertNil(_error) XCTAssertEqual(whichCommand, "tuist-my-command") } } diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift index 59a035e9c32..a56042ba24c 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsDispatcherTests.swift @@ -1,3 +1,4 @@ +import FileSystem import Mockable import MockableTest import TuistCore @@ -45,7 +46,8 @@ final class TuistAnalyticsDispatcherTests: TuistUnitTestCase { fileHandler: fileHandler, ciChecker: ciChecker, cacheDirectoriesProviderFactory: cacheDirectoriesProviderFactory, - analyticsArtifactUploadService: analyticsArtifactUploadService + analyticsArtifactUploadService: analyticsArtifactUploadService, + fileSystem: FileSystem() ) subject = TuistAnalyticsDispatcher( backend: backend diff --git a/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift b/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift index 400ae4cecb1..471ca981da8 100644 --- a/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift +++ b/Tests/TuistKitTests/Utils/TuistAnalyticsServerBackendTests.swift @@ -1,3 +1,4 @@ +import FileSystem import MockableTest import TuistAnalytics import TuistCore @@ -35,7 +36,8 @@ final class TuistAnalyticsServerBackendTests: TuistUnitTestCase { fileHandler: fileHandler, ciChecker: ciChecker, cacheDirectoriesProviderFactory: cacheDirectoriesProviderFactory, - analyticsArtifactUploadService: analyticsArtifactUploadService + analyticsArtifactUploadService: analyticsArtifactUploadService, + fileSystem: FileSystem() ) } diff --git a/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift b/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift index 173610d67e9..49c95c40a65 100644 --- a/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift +++ b/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift @@ -19,7 +19,7 @@ final class ManifestLoaderTests: TuistTestCase { super.tearDown() } - func test_loadConfig() throws { + func test_loadConfig() async throws { // Given let temporaryPath = try temporaryPath() let content = """ @@ -35,10 +35,10 @@ final class ManifestLoaderTests: TuistTestCase { ) // When - _ = try subject.loadConfig(at: temporaryPath) + _ = try await subject.loadConfig(at: temporaryPath) } - func test_loadPlugin() throws { + func test_loadPlugin() async throws { // Given let temporaryPath = try temporaryPath() let content = """ @@ -50,10 +50,10 @@ final class ManifestLoaderTests: TuistTestCase { try content.write(to: manifestPath.url, atomically: true, encoding: .utf8) // When - _ = try subject.loadPlugin(at: temporaryPath) + _ = try await subject.loadPlugin(at: temporaryPath) } - func test_loadProject() throws { + func test_loadProject() async throws { // Given let temporaryPath = try temporaryPath() let content = """ @@ -69,7 +69,7 @@ final class ManifestLoaderTests: TuistTestCase { ) // When - let got = try subject.loadProject(at: temporaryPath) + let got = try await subject.loadProject(at: temporaryPath) // Then XCTAssertEqual(got.name, "tuist") @@ -148,7 +148,7 @@ final class ManifestLoaderTests: TuistTestCase { ) } - func test_loadPackageSettings() throws { + func test_loadPackageSettings() async throws { // Given let temporaryPath = try temporaryPath() let content = """ @@ -184,7 +184,7 @@ final class ManifestLoaderTests: TuistTestCase { ) // When - let got = try subject.loadPackageSettings(at: temporaryPath) + let got = try await subject.loadPackageSettings(at: temporaryPath) // Then XCTAssertEqual( @@ -199,7 +199,7 @@ final class ManifestLoaderTests: TuistTestCase { ) } - func test_loadPackageSettings_without_package_settings() throws { + func test_loadPackageSettings_without_package_settings() async throws { // Given let temporaryPath = try temporaryPath() let content = """ @@ -224,7 +224,7 @@ final class ManifestLoaderTests: TuistTestCase { ) // When - let got = try subject.loadPackageSettings(at: temporaryPath) + let got = try await subject.loadPackageSettings(at: temporaryPath) // Then XCTAssertEqual( @@ -233,7 +233,7 @@ final class ManifestLoaderTests: TuistTestCase { ) } - func test_loadWorkspace() throws { + func test_loadWorkspace() async throws { // Given let temporaryPath = try temporaryPath() let content = """ @@ -249,13 +249,13 @@ final class ManifestLoaderTests: TuistTestCase { ) // When - let got = try subject.loadWorkspace(at: temporaryPath) + let got = try await subject.loadWorkspace(at: temporaryPath) // Then XCTAssertEqual(got.name, "tuist") } - func test_loadTemplate() throws { + func test_loadTemplate() async throws { // Given let temporaryPath = try temporaryPath().appending(component: "folder") try fileHandler.createFolder(temporaryPath) @@ -276,13 +276,13 @@ final class ManifestLoaderTests: TuistTestCase { ) // When - let got = try subject.loadTemplate(at: temporaryPath) + let got = try await subject.loadTemplate(at: temporaryPath) // Then XCTAssertEqual(got.description, "Template description") } - func test_load_invalidFormat() throws { + func test_load_invalidFormat() async throws { // Given let temporaryPath = try temporaryPath() let content = """ @@ -298,18 +298,21 @@ final class ManifestLoaderTests: TuistTestCase { ) // When / Then - XCTAssertThrowsError( - try subject.loadProject(at: temporaryPath) - ) + var _error: Error? + do { + _ = try await subject.loadProject(at: temporaryPath) + } catch { + _error = error + } + XCTAssertNotNil(_error) } - func test_load_missingManifest() throws { + func test_load_missingManifest() async throws { let temporaryPath = try temporaryPath() - XCTAssertThrowsError( - try subject.loadProject(at: temporaryPath) - ) { error in - XCTAssertEqual(error as? ManifestLoaderError, ManifestLoaderError.manifestNotFound(.project, temporaryPath)) - } + await XCTAssertThrowsSpecific( + { try await self.subject.loadProject(at: temporaryPath) }, + ManifestLoaderError.manifestNotFound(.project, temporaryPath) + ) } func test_manifestsAt() throws { @@ -329,7 +332,7 @@ final class ManifestLoaderTests: TuistTestCase { XCTAssertTrue(got.contains(.config)) } - func test_manifestLoadError() throws { + func test_manifestLoadError() async throws { // Given let fileHandler = FileHandler() let temporaryPath = try temporaryPath() @@ -338,20 +341,16 @@ final class ManifestLoaderTests: TuistTestCase { let data = try fileHandler.readFile(configPath) // When - XCTAssertThrowsError( - try subject.loadConfig(at: temporaryPath) - ) { error in - XCTAssertEqual( - error as? ManifestLoaderError, - .manifestLoadingFailed( - path: temporaryPath.appending(component: "Config.swift"), - data: data, - context: """ - The encoded data for the manifest is corrupted. - The given data was not valid JSON. - """ - ) + await XCTAssertThrowsSpecific( + { try await self.subject.loadConfig(at: temporaryPath) }, + ManifestLoaderError.manifestLoadingFailed( + path: temporaryPath.appending(component: "Config.swift"), + data: data, + context: """ + The encoded data for the manifest is corrupted. + The given data was not valid JSON. + """ ) - } + ) } } diff --git a/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift b/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift index bebd3feb151..77462922842 100644 --- a/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift +++ b/Tests/TuistLoaderIntegrationTests/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilderIntegrationTests.swift @@ -25,7 +25,7 @@ final class ProjectDescriptionHelpersBuilderIntegrationTests: TuistTestCase { super.tearDown() } - func test_build_when_the_helpers_is_a_dylib() throws { + func test_build_when_the_helpers_is_a_dylib() async throws { // Given let path = try temporaryPath() subject = ProjectDescriptionHelpersBuilder( @@ -45,8 +45,12 @@ final class ProjectDescriptionHelpersBuilderIntegrationTests: TuistTestCase { let searchPaths = ProjectDescriptionSearchPaths.paths(for: projectDescriptionPath) // When - let paths = try (0 ..< 3).map { _ in - try subject.build(at: path, projectDescriptionSearchPaths: searchPaths, projectDescriptionHelperPlugins: []) + let paths = try await Array(0 ..< 3).concurrentMap { _ in + try await self.subject.build( + at: path, + projectDescriptionSearchPaths: searchPaths, + projectDescriptionHelperPlugins: [] + ) } // Then @@ -58,7 +62,7 @@ final class ProjectDescriptionHelpersBuilderIntegrationTests: TuistTestCase { XCTAssertTrue(FileHandler.shared.exists(helpersModule.path)) } - func test_build_when_the_helpers_is_a_plugin() throws { + func test_build_when_the_helpers_is_a_plugin() async throws { // Given let path = try temporaryPath() subject = ProjectDescriptionHelpersBuilder(cacheDirectory: path, helpersDirectoryLocator: helpersDirectoryLocator) @@ -76,8 +80,12 @@ final class ProjectDescriptionHelpersBuilderIntegrationTests: TuistTestCase { let plugins = [ProjectDescriptionHelpersPlugin(name: "Plugin", path: helpersPluginPath, location: .local)] // When - let paths = try (0 ..< 3).map { _ in - try subject.build(at: path, projectDescriptionSearchPaths: searchPaths, projectDescriptionHelperPlugins: plugins) + let paths = try await Array(0 ..< 3).concurrentMap { _ in + try await self.subject.build( + at: path, + projectDescriptionSearchPaths: searchPaths, + projectDescriptionHelperPlugins: plugins + ) } // Then diff --git a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift index 029c23e348d..2b4a54e9aaf 100644 --- a/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/CachedManifestLoaderTests.swift @@ -98,73 +98,73 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { // MARK: - Tests - func test_load_manifestNotCached() throws { + func test_load_manifestNotCached() async throws { // Given let path = try temporaryPath().appending(component: "App") let project = Project.test(name: "App") try stubProject(project, at: path) // When - let result = try subject.loadProject(at: path) + let result = try await subject.loadProject(at: path) // Then XCTAssertEqual(result, project) XCTAssertEqual(result.name, "App") } - func test_load_manifestCached() throws { + func test_load_manifestCached() async throws { // Given let path = try temporaryPath().appending(component: "App") let project = Project.test(name: "App") try stubProject(project, at: path) // When - _ = try subject.loadProject(at: path) - _ = try subject.loadProject(at: path) - _ = try subject.loadProject(at: path) - let result = try subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) + let result = try await subject.loadProject(at: path) // Then XCTAssertEqual(result, project) XCTAssertEqual(recordedLoadProjectCalls, 1) } - func test_load_manifestHashChanged() throws { + func test_load_manifestHashChanged() async throws { // Given let path = try temporaryPath().appending(component: "App") let originalProject = Project.test(name: "Original") try stubProject(originalProject, at: path) - _ = try subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) // When let modifiedProject = Project.test(name: "Modified") try stubProject(modifiedProject, at: path) - let result = try subject.loadProject(at: path) + let result = try await subject.loadProject(at: path) // Then XCTAssertEqual(result, modifiedProject) XCTAssertEqual(result.name, "Modified") } - func test_load_helpersHashChanged() throws { + func test_load_helpersHashChanged() async throws { // Given let path = try temporaryPath().appending(component: "App") let project = Project.test(name: "App") try stubProject(project, at: path) try stubHelpers(withHash: "hash") - _ = try subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) // When try stubHelpers(withHash: "updatedHash") subject = createSubject() // we need to re-create the subject as it internally caches hashes - _ = try subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) // Then XCTAssertEqual(recordedLoadProjectCalls, 2) } - func test_load_pluginsHashChanged() throws { + func test_load_pluginsHashChanged() async throws { // Given let path = try temporaryPath().appending(component: "App") let project = Project.test(name: "App") @@ -174,18 +174,18 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { .willReturn() try stubPlugins(withHash: "hash") - _ = try subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) // When try stubPlugins(withHash: "updatedHash") subject = createSubject() // we need to re-create the subject as it internally caches hashes - _ = try subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) // Then XCTAssertEqual(recordedLoadProjectCalls, 2) } - func test_load_environmentVariablesRemainTheSame() throws { + func test_load_environmentVariablesRemainTheSame() async throws { // Given let path = try temporaryPath().appending(component: "App") let project = Project.test(name: "App") @@ -193,87 +193,87 @@ final class CachedManifestLoaderTests: TuistUnitTestCase { environment.manifestLoadingVariables = ["NAME": "A"] // When - _ = try subject.loadProject(at: path) - _ = try subject.loadProject(at: path) - _ = try subject.loadProject(at: path) - let result = try subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) + let result = try await subject.loadProject(at: path) // Then XCTAssertEqual(result, project) XCTAssertEqual(recordedLoadProjectCalls, 1) } - func test_load_environmentVariablesChange() throws { + func test_load_environmentVariablesChange() async throws { // Given let path = try temporaryPath().appending(component: "App") let project = Project.test(name: "App") try stubProject(project, at: path) environment.manifestLoadingVariables = ["NAME": "A"] - _ = try subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) // When environment.manifestLoadingVariables = ["NAME": "B"] - _ = try subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) // Then XCTAssertEqual(recordedLoadProjectCalls, 2) } - func test_load_tuistVersionRemainsTheSame() throws { + func test_load_tuistVersionRemainsTheSame() async throws { // Given let path = try temporaryPath().appending(component: "App") let project = Project.test(name: "App") try stubProject(project, at: path) subject = createSubject(tuistVersion: "1.0") - _ = try subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) // When subject = createSubject(tuistVersion: "1.0") - _ = try subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) // Then XCTAssertEqual(recordedLoadProjectCalls, 1) } - func test_load_tuistVersionChanged() throws { + func test_load_tuistVersionChanged() async throws { // Given let path = try temporaryPath().appending(component: "App") let project = Project.test(name: "App") try stubProject(project, at: path) subject = createSubject(tuistVersion: "1.0") - _ = try subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) // When subject = createSubject(tuistVersion: "2.0") - _ = try subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) // Then XCTAssertEqual(recordedLoadProjectCalls, 2) } - func test_load_corruptedCache() throws { + func test_load_corruptedCache() async throws { // Given let path = try temporaryPath().appending(component: "App") let project = Project.test(name: "App") try stubProject(project, at: path) - _ = try subject.loadProject(at: path) + _ = try await subject.loadProject(at: path) // When try corruptFiles(at: cacheDirectory) - let result = try subject.loadProject(at: path) + let result = try await subject.loadProject(at: path) // Then XCTAssertEqual(result, project) XCTAssertEqual(recordedLoadProjectCalls, 2) } - func test_load_missingManifest() throws { + func test_load_missingManifest() async throws { // Given let path = try temporaryPath().appending(component: "App") // When / Then - XCTAssertThrowsSpecific( - try subject.loadProject(at: path), + await XCTAssertThrowsSpecific( + { try await self.subject.loadProject(at: path) }, ManifestLoaderError.manifestNotFound(.project, path) ) } diff --git a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift index 4e5a11faa62..1809e1b5eff 100644 --- a/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/ConfigLoaderTests.swift @@ -51,20 +51,20 @@ final class ConfigLoaderTests: TuistUnitTestCase { // MARK: - Tests - func test_loadConfig_defaultReturnedWhenPathDoesNotExist() throws { + func test_loadConfig_defaultReturnedWhenPathDoesNotExist() async throws { // Given let path: AbsolutePath = "/some/random/path" stub(path: path, exists: false) stub(rootDirectory: "/project") // When - let result = try subject.loadConfig(path: path) + let result = try await subject.loadConfig(path: path) // Then XCTAssertEqual(result, .default) } - func test_loadConfig_loadConfig() throws { + func test_loadConfig_loadConfig() async throws { // Given let path: AbsolutePath = "/project/Tuist/Config.swift" stub(path: path, exists: true) @@ -75,7 +75,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { stub(rootDirectory: "/project") // When - let result = try subject.loadConfig(path: path) + let result = try await subject.loadConfig(path: path) // Then XCTAssertEqual(result, TuistCore.Config( @@ -89,7 +89,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { )) } - func test_loadConfig_loadConfigError() throws { + func test_loadConfig_loadConfigError() async throws { // Given let path: AbsolutePath = "/project/Tuist/Config.swift" stub(path: path, exists: true) @@ -97,10 +97,10 @@ final class ConfigLoaderTests: TuistUnitTestCase { stub(rootDirectory: "/project") // When / Then - XCTAssertThrowsSpecific(try subject.loadConfig(path: path), TestError.testError) + await XCTAssertThrowsSpecific({ try await self.subject.loadConfig(path: path) }, TestError.testError) } - func test_loadConfig_loadConfigInRootDirectory() throws { + func test_loadConfig_loadConfigInRootDirectory() async throws { // Given stub(rootDirectory: "/project") let paths: [AbsolutePath] = [ @@ -117,7 +117,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { ) // When - let result = try subject.loadConfig(path: "/project/Module/A/") + let result = try await subject.loadConfig(path: "/project/Module/A/") // Then XCTAssertEqual(result, TuistCore.Config( @@ -131,7 +131,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { )) } - func test_loadConfig_with_full_handle_and_url() throws { + func test_loadConfig_with_full_handle_and_url() async throws { // Given stub(rootDirectory: "/project") stub(path: "/project/Tuist/Config.swift", exists: true) @@ -144,7 +144,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { ) // When - let result = try subject.loadConfig(path: "/project") + let result = try await subject.loadConfig(path: "/project") // Then XCTAssertBetterEqual(result, TuistCore.Config( @@ -158,39 +158,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { )) } - func test_loadConfig_with_full_handle_and_url_and_optional_authentication() throws { - // Given - stub(rootDirectory: "/project") - stub(path: "/project/Tuist/Config.swift", exists: true) - stub( - config: .test( - fullHandle: "tuist/tuist", - url: "https://test.tuist.io", - generationOptions: .options( - optionalAuthentication: true - ) - ), - at: "/project/Tuist" - ) - - // When - let result = try subject.loadConfig(path: "/project") - - // Then - XCTAssertBetterEqual(result, TuistCore.Config( - compatibleXcodeVersions: .all, - fullHandle: "tuist/tuist", - url: try XCTUnwrap(URL(string: "https://test.tuist.io")), - swiftVersion: nil, - plugins: [], - generationOptions: .test( - optionalAuthentication: true - ), - path: "/project/Tuist/Config.swift" - )) - } - - func test_loadConfig_with_deprecated_cloud() throws { + func test_loadConfig_with_deprecated_cloud() async throws { // Given stub(rootDirectory: "/project") stub(path: "/project/Tuist/Config.swift", exists: true) @@ -205,7 +173,7 @@ final class ConfigLoaderTests: TuistUnitTestCase { ) // When - let result = try subject.loadConfig(path: "/project") + let result = try await subject.loadConfig(path: "/project") // Then XCTAssertBetterEqual(result, TuistCore.Config( diff --git a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift index e2674eac908..e784f12c226 100644 --- a/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/PackageSettingsLoaderTests.swift @@ -41,7 +41,7 @@ final class PackageSettingsLoaderTests: TuistUnitTestCase { super.tearDown() } - func test_loadPackageSettings() throws { + func test_loadPackageSettings() async throws { // Given let temporaryPath = try temporaryPath() let plugins = Plugins.test() @@ -62,7 +62,7 @@ final class PackageSettingsLoaderTests: TuistUnitTestCase { } // When - let got = try subject.loadPackageSettings(at: temporaryPath, with: plugins) + let got = try await subject.loadPackageSettings(at: temporaryPath, with: plugins) // Then let expected: TuistCore.PackageSettings = .init( diff --git a/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift index 4c567019d61..fd7549d9db3 100644 --- a/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/RecursiveManifestLoaderTests.swift @@ -45,13 +45,13 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { // MARK: - Tests - func test_loadProject_loadingSingleProject() throws { + func test_loadProject_loadingSingleProject() async throws { // Given let projectA = createProject(name: "ProjectA") try stub(manifest: projectA, at: try RelativePath(validating: "Some/Path/A")) // When - let manifests = try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path/A"))) + let manifests = try await subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path/A"))) // Then XCTAssertEqual(withRelativePaths(manifests.projects), [ @@ -59,7 +59,7 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { ]) } - func test_loadProject_projectWithDependencies() throws { + func test_loadProject_projectWithDependencies() async throws { // Given let projectA = createProject( name: "ProjectA", @@ -87,7 +87,7 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { try stub(manifest: projectC, at: try RelativePath(validating: "Some/Path/C")) // When - let manifests = try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path/A"))) + let manifests = try await subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path/A"))) // Then XCTAssertEqual(withRelativePaths(manifests.projects), [ @@ -97,7 +97,7 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { ]) } - func test_loadProject_projectWithTransitiveDependencies() throws { + func test_loadProject_projectWithTransitiveDependencies() async throws { // Given let projectA = createProject( name: "ProjectA", @@ -139,7 +139,7 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { try stub(manifest: projectE, at: try RelativePath(validating: "Some/Path/E")) // When - let manifests = try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path/A"))) + let manifests = try await subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path/A"))) // Then XCTAssertEqual(withRelativePaths(manifests.projects), [ @@ -151,7 +151,7 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { ]) } - func test_loadProject_missingManifest() throws { + func test_loadProject_missingManifest() async throws { // Given let projectA = createProject( name: "ProjectA", @@ -164,13 +164,13 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { try stub(manifest: projectA, at: try RelativePath(validating: "Some/Path/A")) // When / Then - XCTAssertThrowsSpecific( - try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path/A"))), + await XCTAssertThrowsSpecific( + { try await self.subject.loadWorkspace(at: self.path.appending(try RelativePath(validating: "Some/Path/A"))) }, ManifestLoaderError.manifestNotFound(.project, path.appending(try RelativePath(validating: "Some/Path/B"))) ) } - func test_loadWorkspace() throws { + func test_loadWorkspace() async throws { // Given let workspace = Workspace.test( name: "Workspace", @@ -205,7 +205,7 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { try stub(manifest: workspace, at: try RelativePath(validating: "Some/Path")) // When - let manifests = try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path"))) + let manifests = try await subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path"))) // Then XCTAssertEqual(manifests.path, path.appending(try RelativePath(validating: "Some/Path"))) @@ -217,7 +217,7 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { ]) } - func test_loadWorkspace_withGlobPattern() throws { + func test_loadWorkspace_withGlobPattern() async throws { // Given let workspace = Workspace.test( name: "Workspace", @@ -251,7 +251,7 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { try stub(manifest: workspace, at: try RelativePath(validating: "Some/Path")) // When - let manifests = try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path"))) + let manifests = try await subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path"))) // Then XCTAssertEqual(manifests.path, path.appending(try RelativePath(validating: "Some/Path"))) @@ -263,7 +263,7 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { ]) } - func test_loadWorkspace_withSameProjectName() throws { + func test_loadWorkspace_withSameProjectName() async throws { // Given let workspace = Workspace.test( name: "MyWorkspace", @@ -286,7 +286,7 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { try stub(manifest: workspace, at: try RelativePath(validating: "Some/Path")) // When - let manifests = try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path"))) + let manifests = try await subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path"))) // Then XCTAssertEqual(manifests.path, path.appending(try RelativePath(validating: "Some/Path"))) @@ -296,7 +296,7 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { ]) } - func test_loadSPM_Package() throws { + func test_loadSPM_Package() async throws { // Given let packageA = createPackage(name: "PackageA") try stub(manifest: packageA, at: try RelativePath(validating: "Some/Path/A")) @@ -312,8 +312,8 @@ final class RecursiveManifestLoaderTests: TuistUnitTestCase { ) // When - var manifests = try subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path/A"))) - manifests = try subject.loadAndMergePackageProjects(in: manifests, packageSettings: .test()) + var manifests = try await subject.loadWorkspace(at: path.appending(try RelativePath(validating: "Some/Path/A"))) + manifests = try await subject.loadAndMergePackageProjects(in: manifests, packageSettings: .test()) // Then XCTAssertEqual(withRelativePaths(manifests.projects), [ diff --git a/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift index f01420076c8..ba5c089636b 100644 --- a/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/TemplateGitLoaderTests.swift @@ -32,7 +32,7 @@ final class TemplateGitLoaderTests: TuistUnitTestCase { super.tearDown() } - func test_loadTemplatePath_isSameWithClonedRepository() throws { + func test_loadTemplatePath_isSameWithClonedRepository() async throws { // Given var clonedRepositoryPath: AbsolutePath? gitHandler.cloneToStub = { _, path in @@ -48,7 +48,7 @@ final class TemplateGitLoaderTests: TuistUnitTestCase { } // When - try subject.loadTemplate(from: "https://url/to/repo.git", closure: { _ in }) + try await subject.loadTemplate(from: "https://url/to/repo.git", closure: { _ in }) // Then XCTAssertNotNil(pathToLoadTemplateFrom) diff --git a/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift b/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift index 950a5172918..e36fb4cf497 100644 --- a/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift +++ b/Tests/TuistLoaderTests/Loaders/TemplateLoaderTests.swift @@ -24,7 +24,7 @@ final class TemplateLoaderTests: TuistUnitTestCase { super.tearDown() } - func test_loadTemplate_when_not_found() throws { + func test_loadTemplate_when_not_found() async throws { // Given let temporaryPath = try temporaryPath() given(manifestLoader) @@ -37,13 +37,13 @@ final class TemplateLoaderTests: TuistUnitTestCase { .willReturn(()) // Then - XCTAssertThrowsSpecific( - try subject.loadTemplate(at: temporaryPath, plugins: .none), + await XCTAssertThrowsSpecific( + { try await self.subject.loadTemplate(at: temporaryPath, plugins: .none) }, ManifestLoaderError.manifestNotFound(temporaryPath) ) } - func test_loadTemplate_files() throws { + func test_loadTemplate_files() async throws { // Given let temporaryPath = try temporaryPath() given(manifestLoader) @@ -63,7 +63,7 @@ final class TemplateLoaderTests: TuistUnitTestCase { .willReturn(()) // When - let got = try subject.loadTemplate(at: temporaryPath, plugins: .none) + let got = try await subject.loadTemplate(at: temporaryPath, plugins: .none) // Then XCTAssertEqual(got, TuistCore.Template( diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 6522b3f0510..16d86b652d3 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -1,3 +1,4 @@ +import FileSystem import MockableTest import Path import ProjectDescription @@ -13,10 +14,11 @@ import XCTest final class PackageInfoMapperTests: TuistUnitTestCase { private var subject: PackageInfoMapper! + private var fileSystem: FileSystem! override func setUp() { super.setUp() - + fileSystem = FileSystem() given(swiftVersionProvider) .swiftVersion() .willReturn("5.9") @@ -25,7 +27,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { override func tearDown() { subject = nil - + fileSystem = nil super.tearDown() } @@ -520,7 +522,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ) } - func testMap_whenAlternativeDefaultSources() throws { + func testMap_whenAlternativeDefaultSources() async throws { for alternativeDefaultSource in ["Source", "src", "srcs"] { let basePath = try temporaryPath() let sourcesPath = basePath.appending(try RelativePath(validating: "Package/\(alternativeDefaultSource)/Target1")) @@ -566,7 +568,7 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ) ) - try fileHandler.delete(sourcesPath) + try await fileSystem.remove(sourcesPath) } } diff --git a/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift b/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift index b8bb4733f46..ffe8a621f2f 100644 --- a/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift +++ b/Tests/TuistScaffoldTests/TemplateGeneratorTests.swift @@ -22,7 +22,7 @@ final class TemplateGeneratorTests: TuistTestCase { super.tearDown() } - func test_directories_are_generated() throws { + func test_directories_are_generated() async throws { // Given let directories = [ try RelativePath(validating: "a"), @@ -38,7 +38,7 @@ final class TemplateGeneratorTests: TuistTestCase { let template = Template.test(items: items) // When - try subject.generate( + try await subject.generate( template: template, to: destinationPath, attributes: [:] @@ -48,7 +48,7 @@ final class TemplateGeneratorTests: TuistTestCase { XCTAssertTrue(expectedDirectories.allSatisfy(FileHandler.shared.exists)) } - func test_directories_with_attributes() throws { + func test_directories_with_attributes() async throws { // Given let directories = [ try RelativePath(validating: "{{ name|lowercase }}"), @@ -67,7 +67,7 @@ final class TemplateGeneratorTests: TuistTestCase { ].map(destinationPath.appending) // When - try subject.generate( + try await subject.generate( template: template, to: destinationPath, attributes: [ @@ -81,7 +81,7 @@ final class TemplateGeneratorTests: TuistTestCase { XCTAssertTrue(expectedDirectories.allSatisfy(FileHandler.shared.exists)) } - func test_files_are_generated() throws { + func test_files_are_generated() async throws { // Given let items: [Template.Item] = [ Template.Item(path: try RelativePath(validating: "a"), contents: .string("aContent")), @@ -104,7 +104,7 @@ final class TemplateGeneratorTests: TuistTestCase { } // When - try subject.generate( + try await subject.generate( template: template, to: destinationPath, attributes: [:] @@ -116,7 +116,7 @@ final class TemplateGeneratorTests: TuistTestCase { } } - func test_files_are_generated_with_attributes() throws { + func test_files_are_generated_with_attributes() async throws { // Given let sourcePath = try temporaryPath() let items = [ @@ -146,7 +146,7 @@ final class TemplateGeneratorTests: TuistTestCase { ] // When - try subject.generate( + try await subject.generate( template: template, to: destinationPath, attributes: [ @@ -164,7 +164,7 @@ final class TemplateGeneratorTests: TuistTestCase { } } - func test_rendered_files() throws { + func test_rendered_files() async throws { // Given let sourcePath = try temporaryPath() let destinationPath = try temporaryPath() @@ -190,7 +190,7 @@ final class TemplateGeneratorTests: TuistTestCase { ] // When - try subject.generate( + try await subject.generate( template: template, to: destinationPath, attributes: ["name": .string(name)] @@ -202,7 +202,7 @@ final class TemplateGeneratorTests: TuistTestCase { } } - func test_file_rendered_with_attributes() throws { + func test_file_rendered_with_attributes() async throws { // Given let sourcePath = try temporaryPath() let destinationPath = try temporaryPath() @@ -218,7 +218,7 @@ final class TemplateGeneratorTests: TuistTestCase { )]) // When - try subject.generate( + try await subject.generate( template: template, to: destinationPath, attributes: ["name": .string("attribute name")] @@ -231,7 +231,7 @@ final class TemplateGeneratorTests: TuistTestCase { ) } - func test_only_stencil_files_rendered() throws { + func test_only_stencil_files_rendered() async throws { // Given let sourcePath = try temporaryPath() let destinationPath = try temporaryPath() @@ -259,7 +259,7 @@ final class TemplateGeneratorTests: TuistTestCase { ]) // When - try subject.generate( + try await subject.generate( template: template, to: destinationPath, attributes: ["name": .string("attribute name")] @@ -276,7 +276,7 @@ final class TemplateGeneratorTests: TuistTestCase { ) } - func test_empty_stencil_files_are_skipped() throws { + func test_empty_stencil_files_are_skipped() async throws { // Given let sourcePath = try temporaryPath() let destinationPath = try temporaryPath() @@ -293,7 +293,7 @@ final class TemplateGeneratorTests: TuistTestCase { ]) // When - try subject.generate( + try await subject.generate( template: template, to: destinationPath, attributes: ["name": .string("attribute name")] @@ -303,7 +303,7 @@ final class TemplateGeneratorTests: TuistTestCase { XCTAssertFalse(FileHandler.shared.exists(destinationPath.appending(component: "ignore"))) } - func test_copy_directory() throws { + func test_copy_directory() async throws { // Given let sourcePath = try temporaryPath().appending(components: "folder") try FileHandler.shared.createFolder(sourcePath) @@ -325,7 +325,7 @@ final class TemplateGeneratorTests: TuistTestCase { ]) // When - try subject.generate( + try await subject.generate( template: template, to: destinationPath, attributes: [:] diff --git a/Tests/TuistServerTests/Session/ServerSessionControllerTests.swift b/Tests/TuistServerTests/Session/ServerSessionControllerTests.swift index 367c6fd8b27..afb32e6e168 100644 --- a/Tests/TuistServerTests/Session/ServerSessionControllerTests.swift +++ b/Tests/TuistServerTests/Session/ServerSessionControllerTests.swift @@ -135,7 +135,7 @@ final class ServerSessionControllerTests: TuistUnitTestCase { """) } - func test_logout_deletesLegacyCredentials() throws { + func test_logout_deletesLegacyCredentials() async throws { // Given let credentials = ServerCredentials( token: "token", @@ -152,7 +152,7 @@ final class ServerSessionControllerTests: TuistUnitTestCase { .willReturn() // When - try subject.logout(serverURL: serverURL) + try await subject.logout(serverURL: serverURL) // Then XCTAssertPrinterOutputContains(""" @@ -161,7 +161,7 @@ final class ServerSessionControllerTests: TuistUnitTestCase { """) } - func test_logout_deletesCredentials() throws { + func test_logout_deletesCredentials() async throws { // Given let credentials = ServerCredentials( token: nil, @@ -178,7 +178,7 @@ final class ServerSessionControllerTests: TuistUnitTestCase { .willReturn() // When - try subject.logout(serverURL: serverURL) + try await subject.logout(serverURL: serverURL) // Then XCTAssertPrinterOutputContains(""" diff --git a/Tests/TuistServerTests/Utilities/ServerCredentialsStoreTests.swift b/Tests/TuistServerTests/Utilities/ServerCredentialsStoreTests.swift index 0ae38c67e8a..27192e0c23a 100644 --- a/Tests/TuistServerTests/Utilities/ServerCredentialsStoreTests.swift +++ b/Tests/TuistServerTests/Utilities/ServerCredentialsStoreTests.swift @@ -17,7 +17,7 @@ final class ServerCredentialsStoreTests: TuistUnitTestCase { super.tearDown() } - func test_crud_with_legacy_token() throws { + func test_crud_with_legacy_token() async throws { // Given let temporaryDirectory = try temporaryPath() let subject = ServerCredentialsStore( @@ -30,11 +30,11 @@ final class ServerCredentialsStoreTests: TuistUnitTestCase { // When/Then try subject.store(credentials: credentials, serverURL: serverURL) XCTAssertEqual(try subject.read(serverURL: serverURL), credentials) - try subject.delete(serverURL: serverURL) + try await subject.delete(serverURL: serverURL) XCTAssertEqual(try subject.read(serverURL: serverURL), nil) } - func test_crud() throws { + func test_crud() async throws { // Given let temporaryDirectory = try temporaryPath() let subject = ServerCredentialsStore( @@ -47,7 +47,7 @@ final class ServerCredentialsStoreTests: TuistUnitTestCase { // When/Then try subject.store(credentials: credentials, serverURL: serverURL) XCTAssertEqual(try subject.read(serverURL: serverURL), credentials) - try subject.delete(serverURL: serverURL) + try await subject.delete(serverURL: serverURL) XCTAssertEqual(try subject.read(serverURL: serverURL), nil) } } diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index 10b0078ed4b..129dd8d8d4b 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -228,6 +228,7 @@ public enum Module: String, CaseIterable { case .support: [ .target(name: Module.projectDescription.targetName), + .external(name: "FileSystem"), .external(name: "SwiftToolsSupport"), .external(name: "AnyCodable"), .external(name: "XcodeProj"), @@ -251,6 +252,7 @@ public enum Module: String, CaseIterable { .target(name: Module.asyncQueue.targetName), .target(name: Module.analytics.targetName), .target(name: Module.plugin.targetName), + .external(name: "FileSystem"), .external(name: "SwiftToolsSupport"), .external(name: "XcodeGraph"), .external(name: "ArgumentParser"), @@ -270,6 +272,7 @@ public enum Module: String, CaseIterable { [ .target(name: Module.core.targetName), .target(name: Module.support.targetName), + .external(name: "FileSystem"), .external(name: "XcodeGraph"), .external(name: "SwiftGenKit"), .external(name: "PathKit"), @@ -282,6 +285,7 @@ public enum Module: String, CaseIterable { [ .target(name: Module.core.targetName), .target(name: Module.support.targetName), + .external(name: "FileSystem"), .external(name: "XcodeGraph"), .external(name: "PathKit"), .external(name: "StencilSwiftKit"), @@ -299,6 +303,7 @@ public enum Module: String, CaseIterable { [ .target(name: Module.core.targetName), .target(name: Module.support.targetName), + .external(name: "FileSystem"), .external(name: "XcodeGraph"), .external(name: "Queuer"), .external(name: "XcodeProj"), @@ -309,6 +314,7 @@ public enum Module: String, CaseIterable { .target(name: Module.loader.targetName), .target(name: Module.support.targetName), .target(name: Module.scaffold.targetName), + .external(name: "FileSystem"), .external(name: "SwiftToolsSupport"), ] case .analytics: @@ -340,6 +346,7 @@ public enum Module: String, CaseIterable { [ .target(name: Module.core.targetName), .target(name: Module.support.targetName), + .external(name: "FileSystem"), .external(name: "XcodeProj"), .external(name: "XcbeautifyLib"), .external(name: "XcodeGraph"), @@ -348,6 +355,7 @@ public enum Module: String, CaseIterable { [ .target(name: Module.core.targetName), .target(name: Module.support.targetName), + .external(name: "FileSystem"), .external(name: "OpenAPIRuntime"), .external(name: "OpenAPIURLSession"), ] From c4efb7e3985fc8e42b5530e0ac6835162fc8102d Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Tue, 23 Jul 2024 10:07:20 -0400 Subject: [PATCH 446/509] Update generated code templates to add `Sendable` Conformance (#6540) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Annotate Assets template with Sendable and remove mutation `name` in many cases was unnecessarily mutable Adjusted asset methods to be computed properties since the `init(named:…)` methods should * Add `Sendable` annotation to strings enums * Add `Sendable` annotation to Plists template * Add `Sendable` annotation to Fonts template * Add many asset types to fixture asset catalog for tests. * Make fixture framework enable complete strict concurrency checking * Removing header --- .../Templates/AssetsTemplate.swift | 38 +++++++------------ .../Templates/FontsTemplate.swift | 6 +-- .../Templates/PlistsTemplate.swift | 2 +- .../Templates/StringsTemplate.swift | 4 +- .../StaticFramework5/Project.swift | 3 +- .../Resources/Property List.plist | 8 ++++ .../Color.colorset/Contents.json | 38 +++++++++++++++++++ .../Cube Texture.cubetextureset/Contents.json | 38 +++++++++++++++++++ .../Universal +X.mipmapset/Contents.json | 11 ++++++ .../Universal +Y.mipmapset/Contents.json | 11 ++++++ .../Universal +Z.mipmapset/Contents.json | 11 ++++++ .../Universal -X.mipmapset/Contents.json | 11 ++++++ .../Universal -Y.mipmapset/Contents.json | 11 ++++++ .../Universal -Z.mipmapset/Contents.json | 11 ++++++ .../Data.dataset/Contents.json | 11 ++++++ .../Sprites.spriteatlas/Contents.json | 6 +++ .../Sprite.imageset/Contents.json | 20 ++++++++++ .../Symbol.symbolset/Contents.json | 11 ++++++ .../Texture.textureset/Contents.json | 12 ++++++ .../Universal.mipmapset/Contents.json | 11 ++++++ .../Resources/en.lproj/Localizable.strings | 1 + 21 files changed, 244 insertions(+), 31 deletions(-) create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/Property List.plist create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Color.colorset/Contents.json create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Contents.json create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal +X.mipmapset/Contents.json create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal +Y.mipmapset/Contents.json create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal +Z.mipmapset/Contents.json create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal -X.mipmapset/Contents.json create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal -Y.mipmapset/Contents.json create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal -Z.mipmapset/Contents.json create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Data.dataset/Contents.json create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Sprites.spriteatlas/Contents.json create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Sprites.spriteatlas/Sprite.imageset/Contents.json create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Symbol.symbolset/Contents.json create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Texture.textureset/Contents.json create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Texture.textureset/Universal.mipmapset/Contents.json create mode 100644 fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/en.lproj/Localizable.strings diff --git a/Sources/TuistGenerator/Templates/AssetsTemplate.swift b/Sources/TuistGenerator/Templates/AssetsTemplate.swift index 0f8c037f8c7..82e05de7b37 100644 --- a/Sources/TuistGenerator/Templates/AssetsTemplate.swift +++ b/Sources/TuistGenerator/Templates/AssetsTemplate.swift @@ -74,7 +74,7 @@ extension SynthesizedResourceInterfaceTemplates { {% elif asset.type == "symbol" %} {{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{imageType}}(name: "{{asset.value}}") {% elif asset.items and ( forceNamespaces == "true" or asset.isNamespaced == "true" ) %} - {{accessModifier}} enum {{asset.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} { + {{accessModifier}} enum {{asset.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}: Sendable { {% filter indent:2 %}{% call casesBlock asset.items %}{% endfilter %} } {% elif asset.items %} @@ -95,7 +95,7 @@ extension SynthesizedResourceInterfaceTemplates { {% endfor %} {% endmacro %} // swiftlint:disable identifier_name line_length nesting type_body_length type_name - {{accessModifier}} enum {{enumName}} { + {{accessModifier}} enum {{enumName}}: Sendable { {% if catalogs.count > 1 or param.forceFileNameEnum %} {% for catalog in catalogs %} {{accessModifier}} enum {{catalog.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} { @@ -111,8 +111,8 @@ extension SynthesizedResourceInterfaceTemplates { // MARK: - Implementation Details {% if resourceCount.arresourcegroup > 0 %} - {{accessModifier}} struct {{arResourceGroupType}} { - {{accessModifier}} fileprivate(set) var name: String + {{accessModifier}} struct {{arResourceGroupType}}: Sendable { + {{accessModifier}} let name: String #if os(iOS) @available(iOS 11.3, *) @@ -147,8 +147,8 @@ extension SynthesizedResourceInterfaceTemplates { {% endif %} {% if resourceCount.color > 0 %} - {{accessModifier}} final class {{colorType}} { - {{accessModifier}} fileprivate(set) var name: String + {{accessModifier}} final class {{colorType}}: Sendable { + {{accessModifier}} let name: String #if os(macOS) {{accessModifier}} typealias Color = NSColor @@ -157,27 +157,17 @@ extension SynthesizedResourceInterfaceTemplates { #endif @available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, visionOS 1.0, *) - {{accessModifier}} private(set) lazy var color: Color = { + {{accessModifier}} var color: Color { guard let color = Color(asset: self) else { fatalError("Unable to load color asset named \\(name).") } return color - }() + } #if canImport(SwiftUI) - private var _swiftUIColor: Any? = nil @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, visionOS 1.0, *) - {{accessModifier}} private(set) var swiftUIColor: SwiftUI.Color { - get { - if self._swiftUIColor == nil { - self._swiftUIColor = SwiftUI.Color(asset: self) - } - - return self._swiftUIColor as! SwiftUI.Color - } - set { - self._swiftUIColor = newValue - } + {{accessModifier}} var swiftUIColor: SwiftUI.Color { + return SwiftUI.Color(asset: self) } #endif @@ -212,8 +202,8 @@ extension SynthesizedResourceInterfaceTemplates { {% endif %} {% if resourceCount.data > 0 %} - {{accessModifier}} struct {{dataType}} { - {{accessModifier}} fileprivate(set) var name: String + {{accessModifier}} struct {{dataType}}: Sendable { + {{accessModifier}} let name: String #if os(iOS) || os(tvOS) || os(macOS) || os(visionOS) @available(iOS 9.0, macOS 10.11, visionOS 1.0, *) @@ -242,8 +232,8 @@ extension SynthesizedResourceInterfaceTemplates { {% endif %} {% if resourceCount.image > 0 or resourceCount.symbol > 0 %} - {{accessModifier}} struct {{imageType}} { - {{accessModifier}} fileprivate(set) var name: String + {{accessModifier}} struct {{imageType}}: Sendable { + {{accessModifier}} let name: String #if os(macOS) {{accessModifier}} typealias Image = NSImage diff --git a/Sources/TuistGenerator/Templates/FontsTemplate.swift b/Sources/TuistGenerator/Templates/FontsTemplate.swift index 5e2c2c09dfc..90f72615df0 100644 --- a/Sources/TuistGenerator/Templates/FontsTemplate.swift +++ b/Sources/TuistGenerator/Templates/FontsTemplate.swift @@ -30,9 +30,9 @@ extension SynthesizedResourceInterfaceTemplates { {{path|basename}} {% endif %} {% endfilter %}{% endmacro %} - {{accessModifier}} enum {{param.name}}FontFamily { + {{accessModifier}} enum {{param.name}}FontFamily: Sendable { {% for family in families %} - {{accessModifier}} enum {{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} { + {{accessModifier}} enum {{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}: Sendable { {% for font in family.fonts %} {{accessModifier}} static let {{font.style|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{fontType}}(name: "{{font.name}}", family: "{{family.name}}", path: "{% call transformPath font.path %}") {% endfor %} @@ -48,7 +48,7 @@ extension SynthesizedResourceInterfaceTemplates { // MARK: - Implementation Details - {{accessModifier}} struct {{fontType}} { + {{accessModifier}} struct {{fontType}}: Sendable { {{accessModifier}} let name: String {{accessModifier}} let family: String {{accessModifier}} let path: String diff --git a/Sources/TuistGenerator/Templates/PlistsTemplate.swift b/Sources/TuistGenerator/Templates/PlistsTemplate.swift index 2c1c61e1e12..dd50b073826 100644 --- a/Sources/TuistGenerator/Templates/PlistsTemplate.swift +++ b/Sources/TuistGenerator/Templates/PlistsTemplate.swift @@ -70,7 +70,7 @@ extension SynthesizedResourceInterfaceTemplates { // swiftlint:disable identifier_name line_length number_separator type_body_length {% for file in files %} - {{accessModifier}} enum {{file.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} { + {{accessModifier}} enum {{file.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}: Sendable { {% filter indent:2," ",true %}{% call fileBlock file %}{% endfilter %} } {% endfor %} diff --git a/Sources/TuistGenerator/Templates/StringsTemplate.swift b/Sources/TuistGenerator/Templates/StringsTemplate.swift index 92281a6d3d1..37029849a58 100644 --- a/Sources/TuistGenerator/Templates/StringsTemplate.swift +++ b/Sources/TuistGenerator/Templates/StringsTemplate.swift @@ -54,7 +54,7 @@ extension SynthesizedResourceInterfaceTemplates { {% endfor %} {% for child in item.children %} - {{accessModifier}} enum {{child.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} { + {{accessModifier}} enum {{child.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}: Sendable { {% filter indent:2 %}{% call recursiveBlock table child %}{% endfilter %} } {% endfor %} @@ -62,7 +62,7 @@ extension SynthesizedResourceInterfaceTemplates { // swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length // swiftlint:disable nesting type_body_length type_name {% set enumName %}{{param.name}}Strings{% endset %} - {{accessModifier}} enum {{enumName}} { + {{accessModifier}} enum {{enumName}}: Sendable { {% if tables.count > 1 or param.forceFileNameEnum %} {% for table in tables %} {{accessModifier}} enum {{table.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} { diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Project.swift b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Project.swift index 24a7d8120fa..605f1b0f8bd 100644 --- a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Project.swift +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Project.swift @@ -11,7 +11,8 @@ let project = Project( infoPlist: .default, resources: "Resources/**", dependencies: [ - ] + ], + settings: .settings(base: ["SWIFT_STRICT_CONCURRENCY": .string("complete")], defaultSettings: .recommended()) ), ] ) diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/Property List.plist b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/Property List.plist new file mode 100644 index 00000000000..44d117057aa --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/Property List.plist @@ -0,0 +1,8 @@ + + + + + Key + Value + + diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Color.colorset/Contents.json b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Color.colorset/Contents.json new file mode 100644 index 00000000000..22c4bb0a8d9 --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Color.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Contents.json b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Contents.json new file mode 100644 index 00000000000..78233b34938 --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Contents.json @@ -0,0 +1,38 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "textures" : [ + { + "cube-face" : "x-", + "filename" : "Universal -X.mipmapset", + "idiom" : "universal" + }, + { + "cube-face" : "y-", + "filename" : "Universal -Y.mipmapset", + "idiom" : "universal" + }, + { + "cube-face" : "z-", + "filename" : "Universal -Z.mipmapset", + "idiom" : "universal" + }, + { + "cube-face" : "x+", + "filename" : "Universal +X.mipmapset", + "idiom" : "universal" + }, + { + "cube-face" : "y+", + "filename" : "Universal +Y.mipmapset", + "idiom" : "universal" + }, + { + "cube-face" : "z+", + "filename" : "Universal +Z.mipmapset", + "idiom" : "universal" + } + ] +} diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal +X.mipmapset/Contents.json b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal +X.mipmapset/Contents.json new file mode 100644 index 00000000000..bdd33d560db --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal +X.mipmapset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "levels" : [ + { + "mipmap-level" : "base" + } + ] +} diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal +Y.mipmapset/Contents.json b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal +Y.mipmapset/Contents.json new file mode 100644 index 00000000000..bdd33d560db --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal +Y.mipmapset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "levels" : [ + { + "mipmap-level" : "base" + } + ] +} diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal +Z.mipmapset/Contents.json b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal +Z.mipmapset/Contents.json new file mode 100644 index 00000000000..bdd33d560db --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal +Z.mipmapset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "levels" : [ + { + "mipmap-level" : "base" + } + ] +} diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal -X.mipmapset/Contents.json b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal -X.mipmapset/Contents.json new file mode 100644 index 00000000000..bdd33d560db --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal -X.mipmapset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "levels" : [ + { + "mipmap-level" : "base" + } + ] +} diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal -Y.mipmapset/Contents.json b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal -Y.mipmapset/Contents.json new file mode 100644 index 00000000000..bdd33d560db --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal -Y.mipmapset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "levels" : [ + { + "mipmap-level" : "base" + } + ] +} diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal -Z.mipmapset/Contents.json b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal -Z.mipmapset/Contents.json new file mode 100644 index 00000000000..bdd33d560db --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Cube Texture.cubetextureset/Universal -Z.mipmapset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "levels" : [ + { + "mipmap-level" : "base" + } + ] +} diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Data.dataset/Contents.json b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Data.dataset/Contents.json new file mode 100644 index 00000000000..377a42c7902 --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Data.dataset/Contents.json @@ -0,0 +1,11 @@ +{ + "data" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Sprites.spriteatlas/Contents.json b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Sprites.spriteatlas/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Sprites.spriteatlas/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Sprites.spriteatlas/Sprite.imageset/Contents.json b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Sprites.spriteatlas/Sprite.imageset/Contents.json new file mode 100644 index 00000000000..a19a5492203 --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Sprites.spriteatlas/Sprite.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Symbol.symbolset/Contents.json b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Symbol.symbolset/Contents.json new file mode 100644 index 00000000000..2f415ce6e4c --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Symbol.symbolset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "symbols" : [ + { + "idiom" : "universal" + } + ] +} diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Texture.textureset/Contents.json b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Texture.textureset/Contents.json new file mode 100644 index 00000000000..cb0e052adba --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Texture.textureset/Contents.json @@ -0,0 +1,12 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "textures" : [ + { + "filename" : "Universal.mipmapset", + "idiom" : "universal" + } + ] +} diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Texture.textureset/Universal.mipmapset/Contents.json b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Texture.textureset/Universal.mipmapset/Contents.json new file mode 100644 index 00000000000..bdd33d560db --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/assets.xcassets/Texture.textureset/Universal.mipmapset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "levels" : [ + { + "mipmap-level" : "base" + } + ] +} diff --git a/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/en.lproj/Localizable.strings b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/en.lproj/Localizable.strings new file mode 100644 index 00000000000..7ecbdc9e767 --- /dev/null +++ b/fixtures/ios_app_with_framework_and_resources/StaticFramework5/Resources/en.lproj/Localizable.strings @@ -0,0 +1 @@ +"Test String" = "Test String"; From 193600c1d0cc08dcf5d9515db7683912ab51d2db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 24 Jul 2024 10:51:22 +0200 Subject: [PATCH 447/509] Fix init acceptance tests (#6546) --- .../TuistAcceptanceTestCase.swift | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift index 66827ddeca6..ab20190d136 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift @@ -80,6 +80,23 @@ open class TuistAcceptanceTestCase: XCTestCase { try await parsedCommand.run() } + public func run(_ command: InitCommand.Type, _ arguments: String...) async throws { + try await run(command, arguments) + } + + public func run(_ command: InitCommand.Type, _ arguments: [String] = []) async throws { + fixturePath = fixtureTemporaryDirectory.path.appending( + component: arguments[arguments.firstIndex(where: { $0 == "--name" })! + 1] + ) + + let arguments = [ + "--path", fixturePath.pathString, + ] + arguments + + let parsedCommand = try command.parse(arguments) + try await parsedCommand.run() + } + public func run(_ command: RunCommand.Type, _ arguments: String...) async throws { try await run(command, arguments) } @@ -169,11 +186,6 @@ open class TuistAcceptanceTestCase: XCTestCase { } public func run(_ command: (some ParsableCommand).Type, _ arguments: [String] = []) throws { - if String(describing: command) == "InitCommand" { - fixturePath = fixtureTemporaryDirectory.path.appending( - component: arguments[arguments.firstIndex(where: { $0 == "--name" })! + 1] - ) - } var parsedCommand = try command.parseAsRoot( arguments + ["--path", fixturePath.pathString] From c75735ef54523072811d067367e725b98b0c8798 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 24 Jul 2024 13:30:17 +0200 Subject: [PATCH 448/509] Update fullHandle of ios_app_with_frameworks fixture (#6547) --- fixtures/ios_app_with_frameworks/Tuist/Config.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fixtures/ios_app_with_frameworks/Tuist/Config.swift b/fixtures/ios_app_with_frameworks/Tuist/Config.swift index 31337706949..872d0fe9614 100644 --- a/fixtures/ios_app_with_frameworks/Tuist/Config.swift +++ b/fixtures/ios_app_with_frameworks/Tuist/Config.swift @@ -1,7 +1,7 @@ import ProjectDescription let config = Config( - fullHandle: "tuist/tuist-cloud-acceptance-tests", + fullHandle: "tuist/ios_app_with_frameworks", url: "https://canary.tuist.io", generationOptions: .options( optionalAuthentication: true From 30b20f0963007a3106bca11540c4f62e4cb8f411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 24 Jul 2024 15:08:01 +0200 Subject: [PATCH 449/509] Use clean urls in docs (#6548) --- docs/.vitepress/config.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 72d87dea105..6eef427da3d 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -19,6 +19,7 @@ export default defineConfig({ lange: "en", }, }, + cleanUrls: true, head: [ [ "script", From 6e0d9d5a26e5459e45be748b986261f536db8f2a Mon Sep 17 00:00:00 2001 From: "D.B" Date: Thu, 25 Jul 2024 00:08:12 -0700 Subject: [PATCH 450/509] Fix the deletion of cached ProjectDescriptionHelpers under the same helpersModule path (#6544) * Prevent the deletion of cached ProjectDescriptionHelpers under the same helpersModule path * fix * dummy commit to trigger tests * revert dummy commit --------- Co-authored-by: Daniel Bachar --- .../ProjectDescriptionHelpersBuilder.swift | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift index 317f5890fcf..4ded4ac070f 100644 --- a/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift +++ b/Sources/TuistLoader/ProjectDescriptionHelpers/ProjectDescriptionHelpersBuilder.swift @@ -176,12 +176,6 @@ public final class ProjectDescriptionHelpersBuilder: ProjectDescriptionHelpersBu return projectDescriptionHelpersModule } - // If the same helpers directory has been previously compiled - // we delete it before compiling the new changes. - if FileHandler.shared.exists(helpersCachePath) { - try await fileSystem.remove(helpersCachePath) - } - try FileHandler.shared.createFolder(helpersModuleCachePath) let command = createCommand( From f2501a9cb5bb9a416f19af97d605da447e705b8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 25 Jul 2024 10:43:29 +0200 Subject: [PATCH 451/509] Opensource DefaultConfigurationFetcher (#6554) --- .../Utils/DefaultConfigurationFetcher.swift | 81 +++++++++ .../DefaultConfigurationFetcherTests.swift | 156 ++++++++++++++++++ 2 files changed, 237 insertions(+) create mode 100644 Sources/TuistCore/Utils/DefaultConfigurationFetcher.swift create mode 100644 Tests/TuistCoreTests/Utils/DefaultConfigurationFetcherTests.swift diff --git a/Sources/TuistCore/Utils/DefaultConfigurationFetcher.swift b/Sources/TuistCore/Utils/DefaultConfigurationFetcher.swift new file mode 100644 index 00000000000..5e3f820f315 --- /dev/null +++ b/Sources/TuistCore/Utils/DefaultConfigurationFetcher.swift @@ -0,0 +1,81 @@ +import Foundation +import Mockable +import TuistSupport +import XcodeGraph + +@Mockable +public protocol DefaultConfigurationFetching { + func fetch( + configuration: String?, + config: TuistCore.Config, + graph: XcodeGraph.Graph + ) throws -> String +} + +enum DefaultConfigurationFetcherError: FatalError, Equatable { + case debugBuildConfigurationNotFound + case configurationNotFound(String, available: [String]) + case defaultConfigurationNotFound(String, available: [String]) + + var type: ErrorType { + switch self { + case .debugBuildConfigurationNotFound, .configurationNotFound, .defaultConfigurationNotFound: + return .abort + } + } + + var description: String { + switch self { + case .debugBuildConfigurationNotFound: + return "We couldn't find a build configuration of variant 'debug' for caching. Make sure one exists in the project." + case let .configurationNotFound(configuration, available): + return "We couldn't find the configuration \(configuration) in the project. The configurations available are: \(available.joined(separator: ", "))" + case let .defaultConfigurationNotFound(configuration, available): + return "We couldn't find the default configuration \(configuration) specified in your Config.swift in the project. The configurations available are: \(available.joined(separator: ", "))" + } + } +} + +public struct DefaultConfigurationFetcher: DefaultConfigurationFetching { + public init() {} + + public func fetch( + configuration: String?, + config: TuistCore.Config, + graph: XcodeGraph.Graph + ) throws -> String { + let allProjectConfigurations = Set(graph.projects.values.map(\.settings).flatMap(\.configurations.keys)).sorted() + + if let configuration { + if allProjectConfigurations.first(where: { $0.name == configuration }) != nil { + return configuration + } else { + throw DefaultConfigurationFetcherError.configurationNotFound( + configuration, + available: allProjectConfigurations.map(\.name) + ) + } + } + + if let defaultConfiguration = config.generationOptions.defaultConfiguration { + if allProjectConfigurations.first(where: { $0.name == defaultConfiguration }) != nil { + return defaultConfiguration + } else { + throw DefaultConfigurationFetcherError.defaultConfigurationNotFound( + defaultConfiguration, + available: allProjectConfigurations.map(\.name) + ) + } + } + + guard let debugConfigurationName = graph.projects.values.map(\.settings).flatMap(\.configurations.keys).sorted() + .first(where: { + $0.variant == .debug + })?.name + else { + throw DefaultConfigurationFetcherError.debugBuildConfigurationNotFound + } + + return debugConfigurationName + } +} diff --git a/Tests/TuistCoreTests/Utils/DefaultConfigurationFetcherTests.swift b/Tests/TuistCoreTests/Utils/DefaultConfigurationFetcherTests.swift new file mode 100644 index 00000000000..2a3be0e9b62 --- /dev/null +++ b/Tests/TuistCoreTests/Utils/DefaultConfigurationFetcherTests.swift @@ -0,0 +1,156 @@ +import Foundation +import Path +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistCore + +final class DefaultConfigurationFetcherTests: TuistUnitTestCase { + private var subject: DefaultConfigurationFetcher! + + override func setUp() { + super.setUp() + subject = DefaultConfigurationFetcher() + } + + override func tearDown() { + subject = nil + super.tearDown() + } + + func test_fetch_throws_an_error_when_debug_configuration_not_found() throws { + // Given + let graph = Graph.test(projects: [ + try AbsolutePath(validating: "/project-a"): Project.test(settings: Settings(configurations: [:])), + ]) + + // When/Then + XCTAssertThrowsSpecific( + try subject.fetch(configuration: nil, config: .test(), graph: graph), + DefaultConfigurationFetcherError.debugBuildConfigurationNotFound + ) + } + + func test_fetch_returns_the_first_debug_configuration_found() throws { + // Given + let graph = Graph.test(projects: [ + try AbsolutePath(validating: "/project-a"): Project + .test(settings: Settings(configurations: [BuildConfiguration(name: "Development", variant: .debug): .test()])), + ]) + + // When + let got = try subject.fetch(configuration: nil, config: .test(), graph: graph) + + // Then + XCTAssertEqual(got, "Development") + } + + func test_fetch_returns_the_configuration_if_the_configuration_exists_in_the_project() throws { + // Given + let graph = Graph.test(projects: [ + try AbsolutePath(validating: "/project-a"): Project + .test(settings: Settings(configurations: [BuildConfiguration(name: "Dev", variant: .debug): .test()])), + ]) + + // When + let got = try subject.fetch(configuration: "Dev", config: .test(), graph: graph) + + // Then + XCTAssertEqual(got, "Dev") + } + + func test_fetch_throws_an_error_when_the_configuration_passed_points_to_a_non_existing_configuration() throws { + // Given + let graph = Graph.test(projects: [ + try AbsolutePath(validating: "/project-a"): Project + .test(settings: Settings(configurations: [BuildConfiguration(name: "Dev", variant: .debug): .test()])), + ]) + + // When + XCTAssertThrowsSpecific( + try subject.fetch(configuration: "Debug", config: .test(), graph: graph), + DefaultConfigurationFetcherError.configurationNotFound("Debug", available: ["Dev"]) + ) + } + + func test_fetch_returns_the_default_configuration_if_the_configuration_exists_in_the_project() throws { + // Given + let graph = Graph.test(projects: [ + try AbsolutePath(validating: "/project-a"): Project + .test( + settings: Settings( + configurations: [ + BuildConfiguration(name: "Dev", variant: .debug): .test(), + BuildConfiguration(name: "Release", variant: .release): .test(), + ] + ) + ), + ]) + + // When + let got = try subject.fetch( + configuration: nil, + config: .test( + generationOptions: .test( + defaultConfiguration: "Release" + ) + ), + graph: graph + ) + + // Then + XCTAssertEqual(got, "Release") + } + + func test_fetch_returns_the_configuration_if_the_configuration_and_default_configuration_exist_in_the_project() throws { + // Given + let graph = Graph.test(projects: [ + try AbsolutePath(validating: "/project-a"): Project + .test( + settings: Settings( + configurations: [ + BuildConfiguration(name: "Dev", variant: .debug): .test(), + BuildConfiguration(name: "Release", variant: .release): .test(), + ] + ) + ), + ]) + + // When + let got = try subject.fetch( + configuration: "Dev", + config: .test( + generationOptions: .test( + defaultConfiguration: "Release" + ) + ), + graph: graph + ) + + // Then + XCTAssertEqual(got, "Dev") + } + + func test_fetch_throws_an_error_when_the_default_configuration_passed_points_to_a_non_existing_configuration() throws { + // Given + let graph = Graph.test(projects: [ + try AbsolutePath(validating: "/project-a"): Project + .test(settings: Settings(configurations: [BuildConfiguration(name: "Dev", variant: .debug): .test()])), + ]) + + // When + XCTAssertThrowsSpecific( + try subject.fetch( + configuration: nil, + config: .test( + generationOptions: .test( + defaultConfiguration: "Debug" + ) + ), + graph: graph + ), + DefaultConfigurationFetcherError.defaultConfigurationNotFound("Debug", available: ["Dev"]) + ) + } +} From 9ff4105d3aa64d6553a40069af340d21f29026f0 Mon Sep 17 00:00:00 2001 From: Andy Kolean Date: Thu, 25 Jul 2024 09:27:29 -0400 Subject: [PATCH 452/509] Validate target references in custom workspace schemes (#6536) * add workspace linting errors * add workspace linting tests * clean up code * Fix tests for ManifestLinter * add pre and post actions to manifest workspace lint --- .../TuistKit/Utils/ManifestGraphLoader.swift | 4 +- .../TuistLoader/Linter/ManifestLinter.swift | 146 +++++++++++- .../Linters/ManifestLinterTests.swift | 217 ++++++++++++++++++ .../Linters/Mocks/MockManifestLinter.swift | 6 + 4 files changed, 366 insertions(+), 7 deletions(-) diff --git a/Sources/TuistKit/Utils/ManifestGraphLoader.swift b/Sources/TuistKit/Utils/ManifestGraphLoader.swift index 29d1f6f9184..9e0d27fc0f5 100644 --- a/Sources/TuistKit/Utils/ManifestGraphLoader.swift +++ b/Sources/TuistKit/Utils/ManifestGraphLoader.swift @@ -143,7 +143,9 @@ public final class ManifestGraphLoader: ManifestGraphLoading { ) // Lint Manifests - let lintingIssues = manifestProjects.flatMap { manifestLinter.lint(project: $0.value) } + let workspaceLintingIssues = manifestLinter.lint(workspace: allManifests.workspace) + let projectLintingIssues = manifestProjects.flatMap { manifestLinter.lint(project: $0.value) } + let lintingIssues = workspaceLintingIssues + projectLintingIssues try lintingIssues.printAndThrowErrorsIfNeeded() // Convert to models diff --git a/Sources/TuistLoader/Linter/ManifestLinter.swift b/Sources/TuistLoader/Linter/ManifestLinter.swift index 0ca318bc37e..7b1a9821bf8 100644 --- a/Sources/TuistLoader/Linter/ManifestLinter.swift +++ b/Sources/TuistLoader/Linter/ManifestLinter.swift @@ -5,18 +5,32 @@ import TuistSupport public protocol ManifestLinting { func lint(project: ProjectDescription.Project) -> [LintingIssue] + func lint(workspace: ProjectDescription.Workspace) -> [LintingIssue] } public class AnyManifestLinter: ManifestLinting { - let lint: ((ProjectDescription.Project) -> [LintingIssue])? - - public init(lint: ((ProjectDescription.Project) -> [LintingIssue])? = nil) { - self.lint = lint + let lintProject: ((ProjectDescription.Project) -> [LintingIssue])? + let lintWorkspace: ((ProjectDescription.Workspace) -> [LintingIssue])? + + public init( + lintProject: ((ProjectDescription.Project) -> [LintingIssue])? = nil, + lintWorkspace: ((ProjectDescription.Workspace) -> [LintingIssue])? = nil + ) { + self.lintProject = lintProject + self.lintWorkspace = lintWorkspace } public func lint(project: ProjectDescription.Project) -> [LintingIssue] { - if let lint { - return lint(project) + if let lintProject { + return lintProject(project) + } else { + return [] + } + } + + public func lint(workspace: ProjectDescription.Workspace) -> [LintingIssue] { + if let lintWorkspace { + return lintWorkspace(workspace) } else { return [] } @@ -39,6 +53,126 @@ public class ManifestLinter: ManifestLinting { return issues } + public func lint(workspace: ProjectDescription.Workspace) -> [LintingIssue] { + var issues = [LintingIssue]() + + for scheme in workspace.schemes { + issues.append(contentsOf: lintSchemeActions( + buildAction: scheme.buildAction, + runAction: scheme.runAction, + profileAction: scheme.profileAction, + testAction: scheme.testAction, + scheme: scheme + )) + } + + return issues + } + + private func lintSchemeActions( + buildAction: BuildAction?, + runAction: RunAction?, + profileAction: ProfileAction?, + testAction: TestAction?, + scheme: Scheme + ) -> [LintingIssue] { + var issues = [LintingIssue]() + + if let buildAction { + issues.append(contentsOf: lintExecutionActionTargets( + buildAction.preActions, + actionType: "buildAction", + scheme: scheme + )) + issues.append(contentsOf: lintExecutionActionTargets( + buildAction.postActions, + actionType: "buildAction", + scheme: scheme + )) + issues.append(contentsOf: lintSchemeTargets(buildAction.targets, actionType: "buildAction", scheme: scheme)) + } + + if let runAction { + issues.append(contentsOf: lintExecutionActionTargets(runAction.preActions, actionType: "runAction", scheme: scheme)) + issues.append(contentsOf: lintExecutionActionTargets(runAction.postActions, actionType: "runAction", scheme: scheme)) + issues.append(contentsOf: lintSchemeTarget(runAction.executable, actionType: "runAction", scheme: scheme)) + issues.append(contentsOf: lintSchemeTarget( + runAction.expandVariableFromTarget, + actionType: "runAction", + scheme: scheme + )) + } + + if let profileAction { + issues.append(contentsOf: lintExecutionActionTargets( + profileAction.preActions, + actionType: "profileAction", + scheme: scheme + )) + issues.append(contentsOf: lintExecutionActionTargets( + profileAction.postActions, + actionType: "profileAction", + scheme: scheme + )) + issues.append(contentsOf: lintSchemeTarget(profileAction.executable, actionType: "profileAction", scheme: scheme)) + } + + if let testAction { + issues.append(contentsOf: lintExecutionActionTargets(testAction.preActions, actionType: "testAction", scheme: scheme)) + issues.append(contentsOf: lintExecutionActionTargets( + testAction.postActions, + actionType: "testAction", + scheme: scheme + )) + issues.append(contentsOf: lintSchemeTargets( + testAction.targets.map(\.target), + actionType: "testAction", + scheme: scheme + )) + } + + return issues + } + + private func lintExecutionActionTargets( + _ actions: [ExecutionAction], + actionType: String, + scheme: Scheme + ) -> [LintingIssue] { + let targets = actions.compactMap(\.target) + return lintSchemeTargets(targets, actionType: actionType, scheme: scheme) + } + + private func lintSchemeTargets( + _ targets: [TargetReference], + actionType: String, + scheme: Scheme + ) -> [LintingIssue] { + return targets.flatMap { lintSchemeTarget($0, actionType: actionType, scheme: scheme) } + } + + private func lintSchemeTarget( + _ targetReference: TargetReference?, + actionType: String, + scheme: Scheme + ) -> [LintingIssue] { + guard let targetReference else { return [] } + guard targetReference.projectPath == nil else { return [] } + + return [ + LintingIssue( + reason: """ + Workspace.swift: The target '\(targetReference.targetName)' in the \(actionType) of the scheme '\( + scheme + .name + )' is missing the project path. + Please specify the project path using .project(path:, target:). + """, + severity: .error + ), + ] + } + private func lintDuplicates(project: ProjectDescription.Project) -> [LintingIssue] { let targetsNames = project.targets.map(\.name) diff --git a/Tests/TuistLoaderTests/Linters/ManifestLinterTests.swift b/Tests/TuistLoaderTests/Linters/ManifestLinterTests.swift index 3a9eae92586..43b00ffa974 100644 --- a/Tests/TuistLoaderTests/Linters/ManifestLinterTests.swift +++ b/Tests/TuistLoaderTests/Linters/ManifestLinterTests.swift @@ -88,4 +88,221 @@ class ManifestLinterTests: XCTestCase { severity: .error ))) } + + func test_lint_workspace_scheme_missingProjectPathInBuildAction() { + // Given + + let buildAction = BuildAction.buildAction(targets: [.target("TargetA")]) + let scheme = Scheme.scheme(name: "MyScheme", buildAction: buildAction) + let workspace = Workspace.test(schemes: [scheme]) + + // When + let results = subject.lint(workspace: workspace) + + // Then + XCTAssertTrue(results.contains(LintingIssue( + reason: """ + Workspace.swift: The target 'TargetA' in the buildAction of the scheme 'MyScheme' is missing the project path. + Please specify the project path using .project(path:, target:). + """, + severity: .error + ))) + } + + func test_lint_workspace_scheme_missingProjectPathInRunAction() { + // Given + let runAction = RunAction.runAction(expandVariableFromTarget: .target("TargetA")) + let scheme = Scheme.scheme(name: "MyScheme", runAction: runAction) + let workspace = Workspace.test(schemes: [scheme]) + + // When + let results = subject.lint(workspace: workspace) + + // Then + XCTAssertTrue(results.contains(LintingIssue( + reason: """ + Workspace.swift: The target 'TargetA' in the runAction of the scheme 'MyScheme' is missing the project path. + Please specify the project path using .project(path:, target:). + """, + severity: .error + ))) + } + + func test_lint_workspace_scheme_missingProjectPathInProfileAction() { + // Given + let profileAction = ProfileAction.profileAction(executable: .target("TargetA")) + let scheme = Scheme.scheme(name: "MyScheme", profileAction: profileAction) + let workspace = Workspace.test(schemes: [scheme]) + + // When + let results = subject.lint(workspace: workspace) + + // Then + XCTAssertTrue(results.contains(LintingIssue( + reason: """ + Workspace.swift: The target 'TargetA' in the profileAction of the scheme 'MyScheme' is missing the project path. + Please specify the project path using .project(path:, target:). + """, + severity: .error + ))) + } + + func test_lint_workspace_scheme_missingProjectPathInTestAction() { + // Given + let testAction = TestAction.test(targets: [.testableTarget(target: .target("TargetA"))]) + let scheme = Scheme.scheme(name: "MyScheme", testAction: testAction) + let workspace = Workspace.test(schemes: [scheme]) + + // When + let results = subject.lint(workspace: workspace) + + // Then + XCTAssertTrue(results.contains(LintingIssue( + reason: """ + Workspace.swift: The target 'TargetA' in the testAction of the scheme 'MyScheme' is missing the project path. + Please specify the project path using .project(path:, target:). + """, + severity: .error + ))) + } + + func test_lint_workspace_scheme_missingProjectPathInBuildActionPreActions() { + // Given + let preActions = [ExecutionAction.executionAction(scriptText: "", target: .target("TargetA"))] + let buildAction = BuildAction.buildAction(targets: [], preActions: preActions) + let scheme = Scheme.scheme(name: "MyScheme", buildAction: buildAction) + let workspace = Workspace.test(schemes: [scheme]) + + // When + let results = subject.lint(workspace: workspace) + + // Then + XCTAssertTrue(results.contains(LintingIssue( + reason: """ + Workspace.swift: The target 'TargetA' in the buildAction of the scheme 'MyScheme' is missing the project path. + Please specify the project path using .project(path:, target:). + """, + severity: .error + ))) + } + + func test_lint_workspace_scheme_missingProjectPathInRunActionPreActions() { + // Given + let preActions = [ExecutionAction.executionAction(scriptText: "", target: .target("TargetA"))] + let runAction = RunAction.runAction(preActions: preActions) + let scheme = Scheme.scheme(name: "MyScheme", runAction: runAction) + let workspace = Workspace.test(schemes: [scheme]) + + // When + let results = subject.lint(workspace: workspace) + + // Then + XCTAssertTrue(results.contains(LintingIssue( + reason: """ + Workspace.swift: The target 'TargetA' in the runAction of the scheme 'MyScheme' is missing the project path. + Please specify the project path using .project(path:, target:). + """, + severity: .error + ))) + } + + func test_lint_workspace_scheme_missingProjectPathInProfileActionPreActions() { + // Given + let preActions = [ExecutionAction.executionAction(scriptText: "", target: .target("TargetA"))] + let profileAction = ProfileAction.profileAction(preActions: preActions) + let scheme = Scheme.scheme(name: "MyScheme", profileAction: profileAction) + let workspace = Workspace.test(schemes: [scheme]) + + // When + let results = subject.lint(workspace: workspace) + + // Then + XCTAssertTrue(results.contains(LintingIssue( + reason: """ + Workspace.swift: The target 'TargetA' in the profileAction of the scheme 'MyScheme' is missing the project path. + Please specify the project path using .project(path:, target:). + """, + severity: .error + ))) + } + + func test_lint_workspace_scheme_missingProjectPathInTestActionPreActions() { + // Given + let preActions = [ExecutionAction.executionAction(scriptText: "", target: .target("TargetA"))] + let testAction = TestAction.targets([], preActions: preActions) + let scheme = Scheme.scheme(name: "MyScheme", testAction: testAction) + let workspace = Workspace.test(schemes: [scheme]) + + // When + let results = subject.lint(workspace: workspace) + + // Then + XCTAssertTrue(results.contains(LintingIssue( + reason: """ + Workspace.swift: The target 'TargetA' in the testAction of the scheme 'MyScheme' is missing the project path. + Please specify the project path using .project(path:, target:). + """, + severity: .error + ))) + } + + func test_lint_workspace_scheme_missingProjectPathInRunActionPostActions() { + // Given + let postActions = [ExecutionAction.executionAction(scriptText: "", target: .target("TargetA"))] + let runAction = RunAction.runAction(postActions: postActions) + let scheme = Scheme.scheme(name: "MyScheme", runAction: runAction) + let workspace = Workspace.test(schemes: [scheme]) + + // When + let results = subject.lint(workspace: workspace) + + // Then + XCTAssertTrue(results.contains(LintingIssue( + reason: """ + Workspace.swift: The target 'TargetA' in the runAction of the scheme 'MyScheme' is missing the project path. + Please specify the project path using .project(path:, target:). + """, + severity: .error + ))) + } + + func test_lint_workspace_scheme_missingProjectPathInProfileActionPostActions() { + // Given + let postActions = [ExecutionAction.executionAction(scriptText: "", target: .target("TargetA"))] + let profileAction = ProfileAction.profileAction(postActions: postActions) + let scheme = Scheme.scheme(name: "MyScheme", profileAction: profileAction) + let workspace = Workspace.test(schemes: [scheme]) + + // When + let results = subject.lint(workspace: workspace) + + // Then + XCTAssertTrue(results.contains(LintingIssue( + reason: """ + Workspace.swift: The target 'TargetA' in the profileAction of the scheme 'MyScheme' is missing the project path. + Please specify the project path using .project(path:, target:). + """, + severity: .error + ))) + } + + func test_lint_workspace_scheme_missingProjectPathInTestActionPostActions() { + // Given + let postActions = [ExecutionAction.executionAction(scriptText: "", target: .target("TargetA"))] + let testAction = TestAction.targets([], preActions: postActions) + let scheme = Scheme.scheme(name: "MyScheme", testAction: testAction) + let workspace = Workspace.test(schemes: [scheme]) + + // When + let results = subject.lint(workspace: workspace) + + // Then + XCTAssertTrue(results.contains(LintingIssue( + reason: """ + Workspace.swift: The target 'TargetA' in the testAction of the scheme 'MyScheme' is missing the project path. + Please specify the project path using .project(path:, target:). + """, + severity: .error + ))) + } } diff --git a/Tests/TuistLoaderTests/Linters/Mocks/MockManifestLinter.swift b/Tests/TuistLoaderTests/Linters/Mocks/MockManifestLinter.swift index fe10ad0bcbc..a6a7163be25 100644 --- a/Tests/TuistLoaderTests/Linters/Mocks/MockManifestLinter.swift +++ b/Tests/TuistLoaderTests/Linters/Mocks/MockManifestLinter.swift @@ -6,7 +6,13 @@ import TuistSupport class MockManifestLinter: ManifestLinting { var stubLintProject: [LintingIssue] = [] + var stubLintWorkspace: [LintingIssue] = [] + func lint(project _: ProjectDescription.Project) -> [LintingIssue] { stubLintProject } + + func lint(workspace _: ProjectDescription.Workspace) -> [TuistCore.LintingIssue] { + stubLintWorkspace + } } From be8139caab0c1ad7bc4d7476dafe662f1a2110d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 25 Jul 2024 15:53:13 +0200 Subject: [PATCH 453/509] Opensource cache --print-hashes command (#6556) * Opensource cache --print-hashes command * Add missing products and targets to the root Package.swift * Move CacheGraphContentHasherTests * Move CachePrintHashesServiceTests * Fix SwiftPackageManagerModuleMapGeneratorTests * Move CacheGraphContentHasherIntegrationTests --- Package.swift | 36 ++ .../TuistCache/CacheGraphContentHasher.swift | 116 ++++ Sources/TuistCache/CacheVersionFetcher.swift | 26 + .../ContentHashing/ContentHashing.swift | 4 + .../Cache/MockContentHasher.swift | 45 -- Sources/TuistHasher/CachedContentHasher.swift | 41 ++ .../TuistHasher/CopyFilesContentHasher.swift | 30 ++ .../CoreDataModelsContentHasher.swift | 34 ++ .../DependenciesContentHasher.swift | 126 +++++ .../DeploymentTargetsContentHasher.swift | 29 + .../TuistHasher/Extensions/Plist+Extras.swift | 24 + Sources/TuistHasher/GraphContentHasher.swift | 112 ++++ Sources/TuistHasher/GraphHashedTarget.swift | 12 + .../TuistHasher/HeadersContentHasher.swift | 27 + Sources/TuistHasher/Log/Logger.swift | 3 + Sources/TuistHasher/PlistContentHasher.swift | 56 ++ .../PrivacyManifestContentHasher.swift | 36 ++ .../TuistHasher/ResourcesContentHasher.swift | 45 ++ .../TuistHasher/SettingsContentHasher.swift | 75 +++ .../SourceFilesContentHasher.swift | 42 ++ Sources/TuistHasher/TargetContentHasher.swift | 137 +++++ .../TargetScriptsContentHasher.swift | 61 +++ .../Cache/CachePrintHashesService.swift | 75 +++ .../Commands/Cache/CacheService.swift | 26 + Sources/TuistKit/Commands/CacheCommand.swift | 91 ++++ Sources/TuistKit/Commands/TuistCommand.swift | 1 + ...heGraphContentHasherIntegrationTests.swift | 507 ++++++++++++++++++ .../CacheGraphContentHasherTests.swift | 178 ++++++ .../TuistCacheTests/VersionFetcherTests.swift | 20 + .../ResourcesProjectMapperTests.swift | 14 +- .../CachedContentHasherTests.swift | 98 ++++ .../CopyFilesContentHasherTests.swift | 112 ++++ .../CoreDataModelsContentHasherTests.swift | 126 +++++ .../DependenciesContentHasherTests.swift | 289 ++++++++++ .../DeploymentTargetContentHasherTests.swift | 90 ++++ .../Extensions/Plist+ExtrasTests.swift | 16 + .../GraphContentHasherTests.swift | 105 ++++ .../HeadersContentHasherTests.swift | 72 +++ .../PlistContentHasherTests.swift | 115 ++++ .../PrivacyManifestContentHasherTests.swift | 41 ++ .../ResourcesContentHasherTests.swift | 116 ++++ .../SettingsContentHasherTests.swift | 84 +++ .../SourceFilesContentHasherTests.swift | 84 +++ .../TargetScriptsContentHasherTests.swift | 224 ++++++++ .../CacheAcceptanceTests.swift | 17 + .../Cache/CachePrintHashesServiceTests.swift | 188 +++++++ .../Services/TestServiceTests.swift | 8 +- ...ackageManagerModuleMapGeneratorTests.swift | 25 +- Tuist/ProjectDescriptionHelpers/Module.swift | 56 +- 49 files changed, 3809 insertions(+), 86 deletions(-) create mode 100644 Sources/TuistCache/CacheGraphContentHasher.swift create mode 100644 Sources/TuistCache/CacheVersionFetcher.swift delete mode 100644 Sources/TuistCoreTesting/Cache/MockContentHasher.swift create mode 100644 Sources/TuistHasher/CachedContentHasher.swift create mode 100644 Sources/TuistHasher/CopyFilesContentHasher.swift create mode 100644 Sources/TuistHasher/CoreDataModelsContentHasher.swift create mode 100644 Sources/TuistHasher/DependenciesContentHasher.swift create mode 100644 Sources/TuistHasher/DeploymentTargetsContentHasher.swift create mode 100644 Sources/TuistHasher/Extensions/Plist+Extras.swift create mode 100644 Sources/TuistHasher/GraphContentHasher.swift create mode 100644 Sources/TuistHasher/GraphHashedTarget.swift create mode 100644 Sources/TuistHasher/HeadersContentHasher.swift create mode 100644 Sources/TuistHasher/Log/Logger.swift create mode 100644 Sources/TuistHasher/PlistContentHasher.swift create mode 100644 Sources/TuistHasher/PrivacyManifestContentHasher.swift create mode 100644 Sources/TuistHasher/ResourcesContentHasher.swift create mode 100644 Sources/TuistHasher/SettingsContentHasher.swift create mode 100644 Sources/TuistHasher/SourceFilesContentHasher.swift create mode 100644 Sources/TuistHasher/TargetContentHasher.swift create mode 100644 Sources/TuistHasher/TargetScriptsContentHasher.swift create mode 100644 Sources/TuistKit/Commands/Cache/CachePrintHashesService.swift create mode 100644 Sources/TuistKit/Commands/Cache/CacheService.swift create mode 100644 Sources/TuistKit/Commands/CacheCommand.swift create mode 100644 Tests/TuistCacheIntegrationTests/CacheGraphContentHasherIntegrationTests.swift create mode 100644 Tests/TuistCacheTests/CacheGraphContentHasherTests.swift create mode 100644 Tests/TuistCacheTests/VersionFetcherTests.swift create mode 100644 Tests/TuistHasherTests/CachedContentHasherTests.swift create mode 100644 Tests/TuistHasherTests/CopyFilesContentHasherTests.swift create mode 100644 Tests/TuistHasherTests/CoreDataModelsContentHasherTests.swift create mode 100644 Tests/TuistHasherTests/DependenciesContentHasherTests.swift create mode 100644 Tests/TuistHasherTests/DeploymentTargetContentHasherTests.swift create mode 100644 Tests/TuistHasherTests/Extensions/Plist+ExtrasTests.swift create mode 100644 Tests/TuistHasherTests/GraphContentHasherTests.swift create mode 100644 Tests/TuistHasherTests/HeadersContentHasherTests.swift create mode 100644 Tests/TuistHasherTests/PlistContentHasherTests.swift create mode 100644 Tests/TuistHasherTests/PrivacyManifestContentHasherTests.swift create mode 100644 Tests/TuistHasherTests/ResourcesContentHasherTests.swift create mode 100644 Tests/TuistHasherTests/SettingsContentHasherTests.swift create mode 100644 Tests/TuistHasherTests/SourceFilesContentHasherTests.swift create mode 100644 Tests/TuistHasherTests/TargetScriptsContentHasherTests.swift create mode 100644 Tests/TuistKitAcceptanceTests/CacheAcceptanceTests.swift create mode 100644 Tests/TuistKitTests/Services/Cache/CachePrintHashesServiceTests.swift diff --git a/Package.swift b/Package.swift index 89a2ef5d6ea..227e8d11f6f 100644 --- a/Package.swift +++ b/Package.swift @@ -71,6 +71,7 @@ var targets: [Target] = [ "Mockable", "TuistServer", "FileSystem", + "TuistCache", .product(name: "OpenAPIRuntime", package: "swift-openapi-runtime"), ], swiftSettings: [ @@ -305,6 +306,33 @@ var targets: [Target] = [ .define("MOCKING", .when(configuration: .debug)), ] ), + .target( + name: "TuistHasher", + dependencies: [ + "TuistCore", + "TuistSupport", + "FileSystem", + pathDependency, + "XcodeGraph", + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), + ] + ), + .target( + name: "TuistCache", + dependencies: [ + "TuistCore", + "TuistSupport", + "FileSystem", + pathDependency, + "XcodeGraph", + "TuistHasher", + ], + swiftSettings: [ + .define("MOCKING", .when(configuration: .debug)), + ] + ), ] #if TUIST @@ -395,6 +423,14 @@ let package = Package( name: "TuistServer", targets: ["TuistServer"] ), + .library( + name: "TuistHasher", + targets: ["TuistHasher"] + ), + .library( + name: "TuistCache", + targets: ["TuistCache"] + ), /// TuistGenerator /// /// A high level Xcode generator library diff --git a/Sources/TuistCache/CacheGraphContentHasher.swift b/Sources/TuistCache/CacheGraphContentHasher.swift new file mode 100644 index 00000000000..9a685ee3755 --- /dev/null +++ b/Sources/TuistCache/CacheGraphContentHasher.swift @@ -0,0 +1,116 @@ +import Foundation +import Mockable +import Path +import TuistCore +import TuistHasher +import TuistSupport +import XcodeGraph + +@Mockable +public protocol CacheGraphContentHashing { + /// Hashes graph + /// - Parameters: + /// - graph: Graph to hash + /// - configuration: Configuration to hash. + /// - config: The `Config.swift` model + /// - excludedTargets: Targets to be excluded from hashes calculation + func contentHashes( + for graph: Graph, + configuration: String?, + config: TuistCore.Config, + excludedTargets: Set + ) throws -> [GraphTarget: String] +} + +public final class CacheGraphContentHasher: CacheGraphContentHashing { + private let graphContentHasher: GraphContentHashing + private let contentHasher: ContentHashing + private let versionFetcher: CacheVersionFetching + private static let cachableProducts: Set = [.framework, .staticFramework, .bundle, .macro] + private let defaultConfigurationFetcher: DefaultConfigurationFetching + private let xcodeController: XcodeControlling + private let swiftVersionProvider: SwiftVersionProviding + + public convenience init( + contentHasher: ContentHashing = ContentHasher() + ) { + self.init( + graphContentHasher: GraphContentHasher(contentHasher: contentHasher), + contentHasher: contentHasher, + versionFetcher: CacheVersionFetcher(), + defaultConfigurationFetcher: DefaultConfigurationFetcher(), + xcodeController: XcodeController.shared, + swiftVersionProvider: SwiftVersionProvider.shared + ) + } + + init( + graphContentHasher: GraphContentHashing, + contentHasher: ContentHashing, + versionFetcher: CacheVersionFetching, + defaultConfigurationFetcher: DefaultConfigurationFetching, + xcodeController: XcodeControlling, + swiftVersionProvider: SwiftVersionProviding + ) { + self.graphContentHasher = graphContentHasher + self.contentHasher = contentHasher + self.versionFetcher = versionFetcher + self.defaultConfigurationFetcher = defaultConfigurationFetcher + self.xcodeController = xcodeController + self.swiftVersionProvider = swiftVersionProvider + } + + public func contentHashes( + for graph: Graph, + configuration: String?, + config: TuistCore.Config, + excludedTargets: Set + ) throws -> [GraphTarget: String] { + let graphTraverser = GraphTraverser(graph: graph) + let version = versionFetcher.version() + let configuration = try defaultConfigurationFetcher.fetch( + configuration: configuration, + config: config, + graph: graph + ) + + let hashes = try graphContentHasher.contentHashes( + for: graph, + include: { + self.isGraphTargetHashable( + $0, + graphTraverser: graphTraverser, + excludedTargets: excludedTargets + ) + }, + additionalStrings: [ + configuration, + try swiftVersionProvider.swiftlangVersion(), + version.rawValue, + xcodeController.selectedVersion().xcodeStringValue, + ] + ) + return hashes + } + + private func isGraphTargetHashable( + _ target: GraphTarget, + graphTraverser: GraphTraversing, + excludedTargets: Set + ) -> Bool { + let product = target.target.product + let name = target.target.name + + /** The second condition is to exclude the resources bundle associated to the given target name */ + let isExcluded = excludedTargets.contains(name) || excludedTargets + .contains(target.target.name.dropPrefix("\(target.project.name)_")) + let dependsOnXCTest = graphTraverser.dependsOnXCTest(path: target.path, name: name) + let isHashableProduct = CacheGraphContentHasher.cachableProducts.contains(product) + + return isHashableProduct && !isExcluded && !dependsOnXCTest + } + + private func isMacro(_ target: GraphTarget, graphTraverser: GraphTraversing) -> Bool { + !graphTraverser.directSwiftMacroExecutables(path: target.path, name: target.target.name).isEmpty + } +} diff --git a/Sources/TuistCache/CacheVersionFetcher.swift b/Sources/TuistCache/CacheVersionFetcher.swift new file mode 100644 index 00000000000..9fad9975b28 --- /dev/null +++ b/Sources/TuistCache/CacheVersionFetcher.swift @@ -0,0 +1,26 @@ +import Foundation +import XcodeGraph + +protocol CacheVersionFetching { + func version() -> CacheVersion +} + +enum CacheVersion: String, Equatable, Hashable { + /** + This is the first version that we introduced that used frameworks, bundles, and xcframeworks when developers opted into it. + However: + - It did not support multi-platform targetes + - The solution to support multiple architectures, xcframeworks, was not suitable for this problem, causing compilation issues. + */ + case version1 = "1.0.0" + /** + This version was introduced to support multi-platform caching and drop support for xcframeworks. + */ + case version2 = "2" +} + +struct CacheVersionFetcher: CacheVersionFetching { + func version() -> CacheVersion { + .version2 + } +} diff --git a/Sources/TuistCore/ContentHashing/ContentHashing.swift b/Sources/TuistCore/ContentHashing/ContentHashing.swift index 8aae45e16f9..4a318319d5b 100644 --- a/Sources/TuistCore/ContentHashing/ContentHashing.swift +++ b/Sources/TuistCore/ContentHashing/ContentHashing.swift @@ -1,8 +1,12 @@ import Foundation +import Mockable +import Path +@Mockable public protocol ContentHashing: FileContentHashing { func hash(_ data: Data) throws -> String func hash(_ string: String) throws -> String func hash(_ strings: [String]) throws -> String func hash(_ dictionary: [String: String]) throws -> String + func hash(path filePath: AbsolutePath) throws -> String } diff --git a/Sources/TuistCoreTesting/Cache/MockContentHasher.swift b/Sources/TuistCoreTesting/Cache/MockContentHasher.swift deleted file mode 100644 index 9615eb3e827..00000000000 --- a/Sources/TuistCoreTesting/Cache/MockContentHasher.swift +++ /dev/null @@ -1,45 +0,0 @@ -import Foundation -import Path -import TuistCore - -public final class MockContentHasher: ContentHashing { - public init() {} - - public var hashDataSpy: Data? - public var hashDataCallCount = 0 - public func hash(_ data: Data) throws -> String { - hashDataSpy = data - hashDataCallCount += 1 - return hashDataSpy.map { "\(String(describing: $0.base64EncodedString()))-hash" } ?? "" - } - - public var hashStringCallCount: Int = 0 - public var hashStub: ((String) throws -> String)? - public func hash(_ string: String) throws -> String { - hashStringCallCount += 1 - return try hashStub?(string) ?? "\(string)-hash" - } - - public var hashStringsSpy: [String]? - public var hashStringsCallCount = 0 - public func hash(_ strings: [String]) throws -> String { - hashStringsSpy = strings - hashStringsCallCount += 1 - return strings.joined(separator: ";") - } - - public var stubHashForPath: [AbsolutePath: String] = [:] - public var hashPathCallCount = 0 - public func hash(path filePath: AbsolutePath) throws -> String { - hashPathCallCount += 1 - return stubHashForPath[filePath] ?? "" - } - - public var hashDictionarySpy: [String: String]? - public var hashDictionaryCallCount = 0 - public func hash(_ dictionary: [String: String]) throws -> String { - hashDictionaryCallCount += 1 - hashDictionarySpy = dictionary - return dictionary.map { "\($0):\($1)" }.joined(separator: "-") - } -} diff --git a/Sources/TuistHasher/CachedContentHasher.swift b/Sources/TuistHasher/CachedContentHasher.swift new file mode 100644 index 00000000000..0fc36533884 --- /dev/null +++ b/Sources/TuistHasher/CachedContentHasher.swift @@ -0,0 +1,41 @@ +import Foundation +import Path +import TuistCore + +/// `CachedContentHasher` +/// is a wrapper on top of `ContentHasher` that adds an in-memory cache to avoid re-computing the same hashes +public final class CachedContentHasher: ContentHashing { + private let contentHasher: ContentHashing + + // In memory cache for files that have already been hashed + private var hashesCache: [AbsolutePath: String] = [:] + + public init(contentHasher: ContentHashing = ContentHasher()) { + self.contentHasher = contentHasher + } + + public func hash(_ data: Data) throws -> String { + try contentHasher.hash(data) + } + + public func hash(_ string: String) throws -> String { + try contentHasher.hash(string) + } + + public func hash(_ strings: [String]) throws -> String { + try contentHasher.hash(strings) + } + + public func hash(_ dictionary: [String: String]) throws -> String { + try contentHasher.hash(dictionary) + } + + public func hash(path filePath: AbsolutePath) throws -> String { + if let cachedHash = hashesCache[filePath] { + return cachedHash + } + let hash = try contentHasher.hash(path: filePath) + hashesCache[filePath] = hash + return hash + } +} diff --git a/Sources/TuistHasher/CopyFilesContentHasher.swift b/Sources/TuistHasher/CopyFilesContentHasher.swift new file mode 100644 index 00000000000..8b17a595394 --- /dev/null +++ b/Sources/TuistHasher/CopyFilesContentHasher.swift @@ -0,0 +1,30 @@ +import Foundation +import TuistCore +import XcodeGraph + +public protocol CopyFilesContentHashing { + func hash(copyFiles: [CopyFilesAction]) throws -> String +} + +/// `CopyFilesContentHasher` +/// is responsible for computing a unique hash that identifies a list of CopyFilesAction models +public final class CopyFilesContentHasher: CopyFilesContentHashing { + private let contentHasher: ContentHashing + + // MARK: - Init + + public init(contentHasher: ContentHashing) { + self.contentHasher = contentHasher + } + + // MARK: - CopyFilesContentHashing + + public func hash(copyFiles: [CopyFilesAction]) throws -> String { + var stringsToHash: [String] = [] + for action in copyFiles { + let fileHashes = try action.files.map { try contentHasher.hash(path: $0.path) } + stringsToHash.append(contentsOf: fileHashes + [action.name, action.destination.rawValue, action.subpath ?? ""]) + } + return try contentHasher.hash(stringsToHash) + } +} diff --git a/Sources/TuistHasher/CoreDataModelsContentHasher.swift b/Sources/TuistHasher/CoreDataModelsContentHasher.swift new file mode 100644 index 00000000000..f61d079f63c --- /dev/null +++ b/Sources/TuistHasher/CoreDataModelsContentHasher.swift @@ -0,0 +1,34 @@ +import Foundation +import TuistCore +import XcodeGraph + +public protocol CoreDataModelsContentHashing { + func hash(coreDataModels: [CoreDataModel]) throws -> String +} + +/// `CoreDataModelsContentHasher` +/// is responsible for computing a unique hash that identifies a list of CoreData models +public final class CoreDataModelsContentHasher: CoreDataModelsContentHashing { + private let contentHasher: ContentHashing + + // MARK: - Init + + public init(contentHasher: ContentHashing) { + self.contentHasher = contentHasher + } + + // MARK: - CoreDataModelsContentHashing + + public func hash(coreDataModels: [CoreDataModel]) throws -> String { + var stringsToHash: [String] = [] + for cdModel in coreDataModels { + let contentHash = try contentHasher.hash(path: cdModel.path) + let currentVersionHash = try contentHasher.hash([cdModel.currentVersion]) + let cdModelHash = try contentHasher.hash([contentHash, currentVersionHash]) + let versionsHash = try contentHasher.hash(try cdModel.versions.sorted().map { try contentHasher.hash(path: $0) }) + stringsToHash.append(cdModelHash) + stringsToHash.append(versionsHash) + } + return try contentHasher.hash(stringsToHash) + } +} diff --git a/Sources/TuistHasher/DependenciesContentHasher.swift b/Sources/TuistHasher/DependenciesContentHasher.swift new file mode 100644 index 00000000000..b3ad4c617a8 --- /dev/null +++ b/Sources/TuistHasher/DependenciesContentHasher.swift @@ -0,0 +1,126 @@ +import Foundation +import Path +import TuistCore +import TuistSupport +import XcodeGraph + +public protocol DependenciesContentHashing { + func hash( + graphTarget: GraphTarget, + hashedTargets: inout [GraphHashedTarget: String], + hashedPaths: inout [AbsolutePath: String] + ) throws -> String +} + +enum DependenciesContentHasherError: FatalError, Equatable { + case missingTargetHash( + sourceTargetName: String, + dependencyProjectPath: AbsolutePath, + dependencyTargetName: String + ) + case missingProjectTargetHash( + sourceProjectPath: AbsolutePath, + sourceTargetName: String, + dependencyProjectPath: AbsolutePath, + dependencyTargetName: String + ) + + var description: String { + switch self { + case let .missingTargetHash(sourceTargetName, dependencyProjectPath, dependencyTargetName): + return "The target '\(sourceTargetName)' depends on the target '\(dependencyTargetName)' from the same project at path \(dependencyProjectPath.pathString) whose hash hasn't been previously calculated." + case let .missingProjectTargetHash(sourceProjectPath, sourceTargetName, dependencyProjectPath, dependencyTargetName): + return "The target '\(sourceTargetName)' from project at path \(sourceProjectPath.pathString) depends on the target '\(dependencyTargetName)' from the project at path \(dependencyProjectPath.pathString) whose hash hasn't been previously calculated." + } + } + + var type: ErrorType { + switch self { + case .missingTargetHash: return .bug + case .missingProjectTargetHash: return .bug + } + } +} + +/// `DependencyContentHasher` +/// is responsible for computing a hash that uniquely identifies a target dependency +public final class DependenciesContentHasher: DependenciesContentHashing { + private let contentHasher: ContentHashing + + // MARK: - Init + + public init(contentHasher: ContentHashing) { + self.contentHasher = contentHasher + } + + // MARK: - DependenciesContentHashing + + public func hash( + graphTarget: GraphTarget, + hashedTargets: inout [GraphHashedTarget: String], + hashedPaths: inout [AbsolutePath: String] + ) throws -> String { + let hashes = try graphTarget.target.dependencies + .map { try hash(graphTarget: graphTarget, dependency: $0, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths) } + return hashes.compactMap { $0 }.joined() + } + + // MARK: - Private + + private func hash( + graphTarget: GraphTarget, + dependency: TargetDependency, + hashedTargets: inout [GraphHashedTarget: String], + hashedPaths: inout [AbsolutePath: String] + ) throws -> String { + switch dependency { + case let .target(targetName, _): + guard let dependencyHash = hashedTargets[GraphHashedTarget(projectPath: graphTarget.path, targetName: targetName)] + else { + throw DependenciesContentHasherError.missingTargetHash( + sourceTargetName: graphTarget.target.name, + dependencyProjectPath: graphTarget.path, + dependencyTargetName: targetName + ) + } + return dependencyHash + case let .project(targetName, projectPath, _): + guard let dependencyHash = hashedTargets[GraphHashedTarget(projectPath: projectPath, targetName: targetName)] else { + throw DependenciesContentHasherError.missingProjectTargetHash( + sourceProjectPath: graphTarget.path, + sourceTargetName: graphTarget.target.name, + dependencyProjectPath: projectPath, + dependencyTargetName: targetName + ) + } + return dependencyHash + case let .framework(path, _, _), let .xcframework(path, _, _): + return try cachedHash(path: path, hashedPaths: &hashedPaths) + case let .library(path, publicHeaders, swiftModuleMap, _): + let libraryHash = try cachedHash(path: path, hashedPaths: &hashedPaths) + let publicHeadersHash = try contentHasher.hash(path: publicHeaders) + if let swiftModuleMap { + let swiftModuleHash = try contentHasher.hash(path: swiftModuleMap) + return try contentHasher.hash("library-\(libraryHash)-\(publicHeadersHash)-\(swiftModuleHash)") + } else { + return try contentHasher.hash("library-\(libraryHash)-\(publicHeadersHash)") + } + case let .package(product, type, _): + return try contentHasher.hash("package-\(product)-\(type.rawValue)") + case let .sdk(name, status, _): + return try contentHasher.hash("sdk-\(name)-\(status)") + case .xctest: + return try contentHasher.hash("xctest") + } + } + + private func cachedHash(path: AbsolutePath, hashedPaths: inout [AbsolutePath: String]) throws -> String { + if let pathHash = hashedPaths[path] { + return pathHash + } else { + let pathHash = try contentHasher.hash(path: path) + hashedPaths[path] = pathHash + return pathHash + } + } +} diff --git a/Sources/TuistHasher/DeploymentTargetsContentHasher.swift b/Sources/TuistHasher/DeploymentTargetsContentHasher.swift new file mode 100644 index 00000000000..855489296c5 --- /dev/null +++ b/Sources/TuistHasher/DeploymentTargetsContentHasher.swift @@ -0,0 +1,29 @@ +import Foundation +import TuistCore +import XcodeGraph + +public protocol DeploymentTargetsContentHashing { + func hash(deploymentTargets: DeploymentTargets) throws -> String +} + +/// `DeploymentTargetsContentHasher` +/// is responsible for computing a hash that uniquely identifies a `DeploymentTargets` +public final class DeploymentTargetsContentHasher: DeploymentTargetsContentHashing { + private let contentHasher: ContentHashing + + // MARK: - Init + + public init(contentHasher: ContentHashing) { + self.contentHasher = contentHasher + } + + // MARK: - DeploymentTargetsContentHashing + + public func hash(deploymentTargets: DeploymentTargets) throws -> String { + let stringToHash: String = deploymentTargets.configuredVersions.map { platform, version in + "\(platform.caseValue)-\(version)" + }.joined(separator: ",") + + return try contentHasher.hash(stringToHash) + } +} diff --git a/Sources/TuistHasher/Extensions/Plist+Extras.swift b/Sources/TuistHasher/Extensions/Plist+Extras.swift new file mode 100644 index 00000000000..b96c291f86d --- /dev/null +++ b/Sources/TuistHasher/Extensions/Plist+Extras.swift @@ -0,0 +1,24 @@ +import Foundation +import XcodeGraph + +extension Plist.Value { + /** + Normalizes `Plist.Value` into a type from the Swift standard library + */ + func normalize() -> Any { + switch self { + case let .array(array): + return array.map { $0.normalize() } + case let .boolean(boolean): + return boolean + case let .dictionary(dictionary): + return dictionary.mapValues { $0.normalize() } + case let .integer(integer): + return integer + case let .real(real): + return real + case let .string(string): + return string + } + } +} diff --git a/Sources/TuistHasher/GraphContentHasher.swift b/Sources/TuistHasher/GraphContentHasher.swift new file mode 100644 index 00000000000..faeb217cdb0 --- /dev/null +++ b/Sources/TuistHasher/GraphContentHasher.swift @@ -0,0 +1,112 @@ +import Foundation +import Mockable +import Path +import TuistCore +import TuistSupport +import XcodeGraph + +@Mockable +public protocol GraphContentHashing { + /// Hashes graph + /// - Parameters: + /// - graph: Graph to hash + /// - filter: If `true`, `TargetNode` is hashed, otherwise it is skipped + /// - additionalStrings: Additional strings to be used when hashing graph + func contentHashes( + for graph: Graph, + include: @escaping (GraphTarget) -> Bool, + additionalStrings: [String] + ) throws -> [GraphTarget: String] +} + +/// `GraphContentHasher` +/// is responsible for computing an hash that uniquely identifies a Tuist `Graph`. +/// It considers only targets that are considered cacheable: frameworks without dependencies on XCTest or on non-cacheable targets +public final class GraphContentHasher: GraphContentHashing { + private let targetContentHasher: TargetContentHashing + + // MARK: - Init + + public convenience init(contentHasher: ContentHashing) { + let targetContentHasher = TargetContentHasher(contentHasher: contentHasher) + self.init(targetContentHasher: targetContentHasher) + } + + public init(targetContentHasher: TargetContentHashing) { + self.targetContentHasher = targetContentHasher + } + + // MARK: - GraphContentHashing + + public func contentHashes( + for graph: Graph, + include: (GraphTarget) -> Bool, + additionalStrings: [String] + ) throws -> [GraphTarget: String] { + let graphTraverser = GraphTraverser(graph: graph) + var visitedIsHasheableNodes: [GraphTarget: Bool] = [:] + var hashedTargets: [GraphHashedTarget: String] = [:] + var hashedPaths: [AbsolutePath: String] = [:] + + let sortedCacheableTargets = try graphTraverser.allTargetsTopologicalSorted() + + let hashableTargets = sortedCacheableTargets.compactMap { target -> GraphTarget? in + if isHashable( + target, + graphTraverser: graphTraverser, + visited: &visitedIsHasheableNodes, + include: include + ) { + return target + } else { + return nil + } + } + + let hashes = try hashableTargets.map { (target: GraphTarget) -> String in + let hash = try targetContentHasher.contentHash( + for: target, + hashedTargets: &hashedTargets, + hashedPaths: &hashedPaths, + additionalStrings: additionalStrings + ) + hashedTargets[ + GraphHashedTarget( + projectPath: target.path, + targetName: target.target.name + ) + ] = hash + return hash + } + return Dictionary(uniqueKeysWithValues: zip(hashableTargets, hashes)) + } + + // MARK: - Private + + private func isHashable( + _ target: GraphTarget, + graphTraverser: GraphTraversing, + visited: inout [GraphTarget: Bool], + include: (GraphTarget) -> Bool + ) -> Bool { + guard include(target) else { + visited[target] = false + return false + } + if let visitedValue = visited[target] { return visitedValue } + let allTargetDependenciesAreHashable = graphTraverser.directTargetDependencies( + path: target.path, + name: target.target.name + ) + .allSatisfy { + isHashable( + $0.graphTarget, + graphTraverser: graphTraverser, + visited: &visited, + include: include + ) + } + visited[target] = allTargetDependenciesAreHashable + return allTargetDependenciesAreHashable + } +} diff --git a/Sources/TuistHasher/GraphHashedTarget.swift b/Sources/TuistHasher/GraphHashedTarget.swift new file mode 100644 index 00000000000..61e2009fd4d --- /dev/null +++ b/Sources/TuistHasher/GraphHashedTarget.swift @@ -0,0 +1,12 @@ +import Foundation +import Path +import XcodeGraph + +/// It represents a target that has been hashed. +public struct GraphHashedTarget: Equatable, Hashable { + /// Path to the directory containing the project. + let projectPath: AbsolutePath + + /// Name of the hashed target. + let targetName: String +} diff --git a/Sources/TuistHasher/HeadersContentHasher.swift b/Sources/TuistHasher/HeadersContentHasher.swift new file mode 100644 index 00000000000..f488a8ccbc1 --- /dev/null +++ b/Sources/TuistHasher/HeadersContentHasher.swift @@ -0,0 +1,27 @@ +import Foundation +import TuistCore +import XcodeGraph + +public protocol HeadersContentHashing { + func hash(headers: Headers) throws -> String +} + +/// `HeadersContentHashing` +/// is responsible for computing a hash that uniquely identifies a list of headers +public final class HeadersContentHasher: HeadersContentHashing { + private let contentHasher: ContentHashing + + // MARK: - Init + + public init(contentHasher: ContentHashing) { + self.contentHasher = contentHasher + } + + // MARK: - HeadersContentHashing + + public func hash(headers: Headers) throws -> String { + let allHeaders = headers.public + headers.private + headers.project + let headersContent = try allHeaders.map { try contentHasher.hash(path: $0) } + return try contentHasher.hash(headersContent) + } +} diff --git a/Sources/TuistHasher/Log/Logger.swift b/Sources/TuistHasher/Log/Logger.swift new file mode 100644 index 00000000000..a4d4e6e2f0a --- /dev/null +++ b/Sources/TuistHasher/Log/Logger.swift @@ -0,0 +1,3 @@ +import TuistSupport + +let logger = Logger(label: "io.tuist.analytics") diff --git a/Sources/TuistHasher/PlistContentHasher.swift b/Sources/TuistHasher/PlistContentHasher.swift new file mode 100644 index 00000000000..f377931d902 --- /dev/null +++ b/Sources/TuistHasher/PlistContentHasher.swift @@ -0,0 +1,56 @@ +import Foundation +import TuistCore +import XcodeGraph + +public protocol PlistContentHashing { + func hash(plist: Plist) throws -> String +} + +/// `PlistContentHasher` +/// is responsible for computing a hash that uniquely identifies a property-list file (e.g. `Info.plist` or `.entitlements`) +public final class PlistContentHasher: PlistContentHashing { + private let contentHasher: ContentHashing + + // MARK: - Init + + public init(contentHasher: ContentHashing) { + self.contentHasher = contentHasher + } + + // MARK: - PlistContentHashing + + public func hash(plist: Plist) throws -> String { + switch plist { + case let .infoPlist(infoPlist): + switch infoPlist { + case let .file(path): + return try contentHasher.hash(path: path) + case let .dictionary(dictionary), let .extendingDefault(dictionary): + var dictionaryString: String = "" + for key in dictionary.keys.sorted() { + let value = dictionary[key, default: "nil"] + dictionaryString += "\(key)=\(value);" + } + return try contentHasher.hash(dictionaryString) + case let .generatedFile(_, data): + return try contentHasher.hash(data) + } + case let .entitlements(entitlements): + switch entitlements { + case let .variable(variable): + return try contentHasher.hash(variable) + case let .file(path): + return try contentHasher.hash(path: path) + case let .dictionary(dictionary): + var dictionaryString: String = "" + for key in dictionary.keys.sorted() { + let value = dictionary[key, default: "nil"] + dictionaryString += "\(key)=\(value);" + } + return try contentHasher.hash(dictionaryString) + case let .generatedFile(_, data): + return try contentHasher.hash(data) + } + } + } +} diff --git a/Sources/TuistHasher/PrivacyManifestContentHasher.swift b/Sources/TuistHasher/PrivacyManifestContentHasher.swift new file mode 100644 index 00000000000..772ee49e949 --- /dev/null +++ b/Sources/TuistHasher/PrivacyManifestContentHasher.swift @@ -0,0 +1,36 @@ +import Foundation +import Path +import TuistCore +import XcodeGraph + +public protocol PrivacyManifestContentHashing { + func hash(_ privacyManifest: PrivacyManifest) throws -> String +} + +public final class PrivacyManifestContentHasher: PrivacyManifestContentHashing { + private let contentHasher: ContentHashing + + public init(contentHasher: ContentHashing) { + self.contentHasher = contentHasher + } + + public func hash(_ privacyManifest: PrivacyManifest) throws -> String { + var hashes: [String] = [] + + hashes.append(try contentHasher.hash(privacyManifest.tracking ? "1" : "0")) + hashes.append(try contentHasher.hash(privacyManifest.trackingDomains)) + hashes.append(try contentHasher.hash(privacyManifest.collectedDataTypes.asJSONString())) + hashes.append(try contentHasher.hash(privacyManifest.accessedApiTypes.asJSONString())) + + return try contentHasher.hash(hashes) + } +} + +extension [[String: Plist.Value]] { + fileprivate func asJSONString() throws -> String { + let normalized = map { dictionary in + dictionary.mapValues { $0.normalize() } + } + return String(data: try JSONSerialization.data(withJSONObject: normalized, options: .sortedKeys), encoding: .utf8)! + } +} diff --git a/Sources/TuistHasher/ResourcesContentHasher.swift b/Sources/TuistHasher/ResourcesContentHasher.swift new file mode 100644 index 00000000000..474863747d4 --- /dev/null +++ b/Sources/TuistHasher/ResourcesContentHasher.swift @@ -0,0 +1,45 @@ +import Foundation +import TuistCore +import XcodeGraph + +public protocol ResourcesContentHashing { + func hash(resources: ResourceFileElements) throws -> String +} + +/// `ResourcesContentHasher` +/// is responsible for computing a unique hash that identifies a list of resources +public final class ResourcesContentHasher: ResourcesContentHashing { + private let contentHasher: ContentHashing + private let privacyManifestContentHasher: PrivacyManifestContentHasher + + // MARK: - Init + + public convenience init(contentHasher: ContentHashing) { + self.init( + contentHasher: contentHasher, + privacyManifestContentHasher: PrivacyManifestContentHasher(contentHasher: contentHasher) + ) + } + + public init( + contentHasher: ContentHashing, + privacyManifestContentHasher: PrivacyManifestContentHasher + ) { + self.contentHasher = contentHasher + self.privacyManifestContentHasher = privacyManifestContentHasher + } + + // MARK: - ResourcesContentHashing + + public func hash(resources: ResourceFileElements) throws -> String { + var hashes = try resources.resources + .sorted(by: { $0.path < $1.path }) + .map { try contentHasher.hash(path: $0.path) } + + if let privacyManifest = resources.privacyManifest { + hashes.append(try privacyManifestContentHasher.hash(privacyManifest)) + } + + return try contentHasher.hash(hashes) + } +} diff --git a/Sources/TuistHasher/SettingsContentHasher.swift b/Sources/TuistHasher/SettingsContentHasher.swift new file mode 100644 index 00000000000..92b5df756b3 --- /dev/null +++ b/Sources/TuistHasher/SettingsContentHasher.swift @@ -0,0 +1,75 @@ +import Foundation +import TuistCore +import XcodeGraph + +public protocol SettingsContentHashing { + func hash(settings: Settings) throws -> String +} + +/// `SettingsContentHasher` +/// is responsible for computing a hash that uniquely identifies some `Settings` +public final class SettingsContentHasher: SettingsContentHashing { + private let contentHasher: ContentHashing + + // MARK: - Init + + public init(contentHasher: ContentHashing) { + self.contentHasher = contentHasher + } + + // MARK: - SettingsContentHashing + + public func hash(settings: Settings) throws -> String { + let baseSettingsHash = try hash(settings.base) + let configurationHash = try hash(settings.configurations) + let defaultSettingsHash = try hash(settings.defaultSettings) + return try contentHasher.hash([baseSettingsHash, configurationHash, defaultSettingsHash]) + } + + private func hash(_ configurations: [BuildConfiguration: Configuration?]) throws -> String { + var configurationHashes: [String] = [] + for buildConfiguration in configurations.keys.sorted() { + var configurationHash = buildConfiguration.name + buildConfiguration.variant.rawValue + if let configuration = configurations[buildConfiguration] { + if let configuration { + configurationHash += try hash(configuration) + } + } + configurationHashes.append(configurationHash) + } + return try contentHasher.hash(configurationHashes) + } + + private func hash(_ settingsDictionary: SettingsDictionary) throws -> String { + let sortedAndNormalizedSettings = settingsDictionary + .sorted(by: { $0.0 < $1.0 }) + .map { "\($0):\($1.normalize())" }.joined(separator: "-") + return try contentHasher.hash(sortedAndNormalizedSettings) + } + + private func hash(_ configuration: Configuration) throws -> String { + var configurationHash = try hash(configuration.settings) + if let xcconfigPath = configuration.xcconfig { + let xcconfigHash = try contentHasher.hash(path: xcconfigPath) + configurationHash += xcconfigHash + } + return configurationHash + } + + private func hash(_ defaultSettings: DefaultSettings) throws -> String { + var defaultSettingHash: String + switch defaultSettings { + case let .recommended(excludedKeys): + defaultSettingHash = "recommended" + let excludedKeysHash = try contentHasher.hash(excludedKeys.sorted()) + defaultSettingHash += excludedKeysHash + case let .essential(excludedKeys): + defaultSettingHash = "essential" + let excludedKeysHash = try contentHasher.hash(excludedKeys.sorted()) + defaultSettingHash += excludedKeysHash + case .none: + defaultSettingHash = "none" + } + return defaultSettingHash + } +} diff --git a/Sources/TuistHasher/SourceFilesContentHasher.swift b/Sources/TuistHasher/SourceFilesContentHasher.swift new file mode 100644 index 00000000000..c04f321c10b --- /dev/null +++ b/Sources/TuistHasher/SourceFilesContentHasher.swift @@ -0,0 +1,42 @@ +import Foundation +import TuistCore +import XcodeGraph + +public protocol SourceFilesContentHashing { + func hash(sources: [SourceFile]) throws -> String +} + +/// `SourceFilesContentHasher` +/// is responsible for computing a unique hash that identifies a list of source files, considering their content +public final class SourceFilesContentHasher: SourceFilesContentHashing { + private let contentHasher: ContentHashing + + // MARK: - Init + + public init(contentHasher: ContentHashing) { + self.contentHasher = contentHasher + } + + // MARK: - SourceFilesContentHashing + + /// Returns a unique hash that identifies an arry of sourceFiles + /// First it hashes the content of every file and append to every hash the compiler flags of the file. It assumes the files + /// are always sorted the same way. + /// Then it hashes again all partial hashes to get a unique identifier that represents a group of source files together with + /// their compiler flags + public func hash(sources: [SourceFile]) throws -> String { + var stringsToHash: [String] = [] + for source in sources.sorted(by: { $0.path < $1.path }) { + if let hash = source.contentHash { + stringsToHash.append(hash) + } else { + var sourceHash = try contentHasher.hash(path: source.path) + if let compilerFlags = source.compilerFlags { + sourceHash += try contentHasher.hash(compilerFlags) + } + stringsToHash.append(sourceHash) + } + } + return try contentHasher.hash(stringsToHash) + } +} diff --git a/Sources/TuistHasher/TargetContentHasher.swift b/Sources/TuistHasher/TargetContentHasher.swift new file mode 100644 index 00000000000..e0153b1fd20 --- /dev/null +++ b/Sources/TuistHasher/TargetContentHasher.swift @@ -0,0 +1,137 @@ +import Foundation +import Path +import TuistCore +import TuistSupport +import XcodeGraph + +public protocol TargetContentHashing { + func contentHash( + for target: GraphTarget, + hashedTargets: inout [GraphHashedTarget: String], + hashedPaths: inout [AbsolutePath: String], + additionalStrings: [String] + ) throws -> String +} + +/// `TargetContentHasher` +/// is responsible for computing a unique hash that identifies a target +public final class TargetContentHasher: TargetContentHashing { + private let contentHasher: ContentHashing + private let coreDataModelsContentHasher: CoreDataModelsContentHashing + private let sourceFilesContentHasher: SourceFilesContentHashing + private let targetScriptsContentHasher: TargetScriptsContentHashing + private let resourcesContentHasher: ResourcesContentHashing + private let copyFilesContentHasher: CopyFilesContentHashing + private let headersContentHasher: HeadersContentHashing + private let deploymentTargetContentHasher: DeploymentTargetsContentHashing + private let plistContentHasher: PlistContentHashing + private let settingsContentHasher: SettingsContentHashing + private let dependenciesContentHasher: DependenciesContentHashing + + // MARK: - Init + + public convenience init(contentHasher: ContentHashing) { + self.init( + contentHasher: contentHasher, + sourceFilesContentHasher: SourceFilesContentHasher(contentHasher: contentHasher), + targetScriptsContentHasher: TargetScriptsContentHasher(contentHasher: contentHasher), + coreDataModelsContentHasher: CoreDataModelsContentHasher(contentHasher: contentHasher), + resourcesContentHasher: ResourcesContentHasher(contentHasher: contentHasher), + copyFilesContentHasher: CopyFilesContentHasher(contentHasher: contentHasher), + headersContentHasher: HeadersContentHasher(contentHasher: contentHasher), + deploymentTargetContentHasher: DeploymentTargetsContentHasher(contentHasher: contentHasher), + plistContentHasher: PlistContentHasher(contentHasher: contentHasher), + settingsContentHasher: SettingsContentHasher(contentHasher: contentHasher), + dependenciesContentHasher: DependenciesContentHasher(contentHasher: contentHasher) + ) + } + + public init( + contentHasher: ContentHashing, + sourceFilesContentHasher: SourceFilesContentHashing, + targetScriptsContentHasher: TargetScriptsContentHashing, + coreDataModelsContentHasher: CoreDataModelsContentHashing, + resourcesContentHasher: ResourcesContentHashing, + copyFilesContentHasher: CopyFilesContentHashing, + headersContentHasher: HeadersContentHashing, + deploymentTargetContentHasher: DeploymentTargetsContentHashing, + plistContentHasher: PlistContentHashing, + settingsContentHasher: SettingsContentHashing, + dependenciesContentHasher: DependenciesContentHashing + ) { + self.contentHasher = contentHasher + self.sourceFilesContentHasher = sourceFilesContentHasher + self.coreDataModelsContentHasher = coreDataModelsContentHasher + self.targetScriptsContentHasher = targetScriptsContentHasher + self.resourcesContentHasher = resourcesContentHasher + self.copyFilesContentHasher = copyFilesContentHasher + self.headersContentHasher = headersContentHasher + self.deploymentTargetContentHasher = deploymentTargetContentHasher + self.plistContentHasher = plistContentHasher + self.settingsContentHasher = settingsContentHasher + self.dependenciesContentHasher = dependenciesContentHasher + } + + // MARK: - TargetContentHashing + + public func contentHash( + for graphTarget: GraphTarget, + hashedTargets: inout [GraphHashedTarget: String], + hashedPaths: inout [AbsolutePath: String], + additionalStrings: [String] = [] + ) throws -> String { + let sourcesHash = try sourceFilesContentHasher.hash(sources: graphTarget.target.sources) + let resourcesHash = try resourcesContentHasher.hash(resources: graphTarget.target.resources) + let copyFilesHash = try copyFilesContentHasher.hash(copyFiles: graphTarget.target.copyFiles) + let coreDataModelHash = try coreDataModelsContentHasher.hash(coreDataModels: graphTarget.target.coreDataModels) + let targetScriptsHash = try targetScriptsContentHasher.hash( + targetScripts: graphTarget.target.scripts, + sourceRootPath: graphTarget.project.sourceRootPath + ) + let dependenciesHash = try dependenciesContentHasher.hash( + graphTarget: graphTarget, + hashedTargets: &hashedTargets, + hashedPaths: &hashedPaths + ) + let environmentHash = try contentHasher.hash(graphTarget.target.environmentVariables.mapValues(\.value)) + var stringsToHash = [ + graphTarget.target.name, + graphTarget.target.product.rawValue, + graphTarget.target.bundleId, + graphTarget.target.productName, + dependenciesHash, + sourcesHash, + resourcesHash, + copyFilesHash, + coreDataModelHash, + targetScriptsHash, + environmentHash, + ] + + stringsToHash.append(contentsOf: graphTarget.target.destinations.map(\.rawValue).sorted()) + + if let headers = graphTarget.target.headers { + let headersHash = try headersContentHasher.hash(headers: headers) + stringsToHash.append(headersHash) + } + + let deploymentTargetHash = try deploymentTargetContentHasher.hash(deploymentTargets: graphTarget.target.deploymentTargets) + stringsToHash.append(deploymentTargetHash) + + if let infoPlist = graphTarget.target.infoPlist { + let infoPlistHash = try plistContentHasher.hash(plist: .infoPlist(infoPlist)) + stringsToHash.append(infoPlistHash) + } + if let entitlements = graphTarget.target.entitlements { + let entitlementsHash = try plistContentHasher.hash(plist: .entitlements(entitlements)) + stringsToHash.append(entitlementsHash) + } + if let settings = graphTarget.target.settings { + let settingsHash = try settingsContentHasher.hash(settings: settings) + stringsToHash.append(settingsHash) + } + stringsToHash += additionalStrings + + return try contentHasher.hash(stringsToHash) + } +} diff --git a/Sources/TuistHasher/TargetScriptsContentHasher.swift b/Sources/TuistHasher/TargetScriptsContentHasher.swift new file mode 100644 index 00000000000..c8d648c5ee4 --- /dev/null +++ b/Sources/TuistHasher/TargetScriptsContentHasher.swift @@ -0,0 +1,61 @@ +import Foundation +import Path +import TuistCore +import XcodeGraph + +public protocol TargetScriptsContentHashing { + func hash(targetScripts: [TargetScript], sourceRootPath: AbsolutePath) throws -> String +} + +/// `TargetScriptsContentHasher` +/// is responsible for computing a unique hash that identifies a list of target scripts +public final class TargetScriptsContentHasher: TargetScriptsContentHashing { + private let contentHasher: ContentHashing + + // MARK: - Init + + public init(contentHasher: ContentHashing) { + self.contentHasher = contentHasher + } + + // MARK: - TargetScriptsContentHashing + + /// Returns the hash that uniquely identifies an array of target scripts + /// The hash takes into consideration the content of the script to execute, the content of input/output files, the name of the + /// tool to execute, the order, the arguments and its name + public func hash(targetScripts: [TargetScript], sourceRootPath: AbsolutePath) throws -> String { + var stringsToHash: [String] = [] + for script in targetScripts { + var pathsToHash: [AbsolutePath] = [] + script.path.map { pathsToHash.append($0) } + + var dynamicPaths = script.inputPaths.compactMap { try? AbsolutePath(validating: $0) } + script.inputFileListPaths + if let dependencyFile = script.dependencyFile { + dynamicPaths += [dependencyFile] + } + + for path in dynamicPaths { + if path.pathString.contains("$") { + stringsToHash.append(path.relative(to: sourceRootPath).pathString) + logger.notice( + "The path of the file \'\(path.url.lastPathComponent)\' is hashed, not the content. Because it has a build variable." + ) + } else { + pathsToHash.append(path) + } + } + stringsToHash.append(contentsOf: try pathsToHash.map { try contentHasher.hash(path: $0) }) + stringsToHash.append( + contentsOf: (script.outputPaths.compactMap { try? AbsolutePath(validating: $0) } + script.outputFileListPaths) + .map { $0.relative(to: sourceRootPath).pathString } + ) + + stringsToHash.append(contentsOf: [ + script.name, + script.tool ?? "", + script.order.rawValue, + ] + script.arguments) + } + return try contentHasher.hash(stringsToHash) + } +} diff --git a/Sources/TuistKit/Commands/Cache/CachePrintHashesService.swift b/Sources/TuistKit/Commands/Cache/CachePrintHashesService.swift new file mode 100644 index 00000000000..89bde79c5ad --- /dev/null +++ b/Sources/TuistKit/Commands/Cache/CachePrintHashesService.swift @@ -0,0 +1,75 @@ +import Foundation +import Path +import TuistAutomation +import TuistCache +import TuistCore +import TuistHasher +import TuistLoader +import TuistSupport + +final class CachePrintHashesService { + private let generatorFactory: GeneratorFactorying + private let cacheGraphContentHasher: CacheGraphContentHashing + private let clock: Clock + private let configLoader: ConfigLoading + + convenience init( + contentHasher: ContentHashing = CachedContentHasher(), + generatorFactory: GeneratorFactorying + ) { + self.init( + generatorFactory: generatorFactory, + cacheGraphContentHasher: CacheGraphContentHasher(contentHasher: contentHasher), + clock: WallClock(), + configLoader: ConfigLoader(manifestLoader: ManifestLoader()) + ) + } + + init( + generatorFactory: GeneratorFactorying, + cacheGraphContentHasher: CacheGraphContentHashing, + clock: Clock, + configLoader: ConfigLoading + ) { + self.generatorFactory = generatorFactory + self.cacheGraphContentHasher = cacheGraphContentHasher + self.clock = clock + self.configLoader = configLoader + } + + private func absolutePath(_ path: String?) throws -> AbsolutePath { + if let path { + return try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) + } else { + return FileHandler.shared.currentPath + } + } + + func run( + path: String?, + configuration: String? + ) async throws { + let absolutePath = try absolutePath(path) + let timer = clock.startTimer() + let config = try await configLoader.loadConfig(path: absolutePath) + let generator = generatorFactory.defaultGenerator(config: config) + let graph = try await generator.load(path: absolutePath) + let hashes = try cacheGraphContentHasher.contentHashes( + for: graph, + configuration: configuration, + config: config, + excludedTargets: [] + ) + let duration = timer.stop() + let time = String(format: "%.3f", duration) + guard hashes.count > 0 else { + logger.notice("No cacheable targets were found") + return + } + let sortedHashes = hashes.sorted { $0.key.target.name < $1.key.target.name } + for (target, hash) in sortedHashes { + logger.info("\(target.target.name) - \(hash)") + } + logger.notice("Total time taken: \(time)s") + } +} diff --git a/Sources/TuistKit/Commands/Cache/CacheService.swift b/Sources/TuistKit/Commands/Cache/CacheService.swift new file mode 100644 index 00000000000..65f6871db51 --- /dev/null +++ b/Sources/TuistKit/Commands/Cache/CacheService.swift @@ -0,0 +1,26 @@ +import Foundation + +public protocol CacheServicing { + func run( + path directory: String?, + configuration: String?, + targetsToBinaryCache: Set, + externalOnly: Bool, + generateOnly: Bool + ) async throws +} + +final class EmptyCacheService: CacheServicing { + func run( + path _: String?, + configuration _: String?, + targetsToBinaryCache _: Set, + externalOnly _: Bool, + generateOnly _: Bool + ) async throws { + logger + .notice( + "Caching is currently not opensourced. Please, report issues with caching on GitHub and the Tuist team will take a look." + ) + } +} diff --git a/Sources/TuistKit/Commands/CacheCommand.swift b/Sources/TuistKit/Commands/CacheCommand.swift new file mode 100644 index 00000000000..48dbd28b6af --- /dev/null +++ b/Sources/TuistKit/Commands/CacheCommand.swift @@ -0,0 +1,91 @@ +import AnyCodable +import ArgumentParser +import Foundation +import Path +import TuistServer +import TuistSupport + +/// Command to cache targets as `.(xc)framework`s and speed up your and your peers' build times. +public struct CacheCommand: AsyncParsableCommand, HasTrackableParameters { + public init() {} + + public var runId = "" + public static var generatorFactory: GeneratorFactorying = GeneratorFactory() + public static var analyticsDelegate: TrackableParametersDelegate? + public static var cacheService: CacheServicing = EmptyCacheService() + + public static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "cache", + abstract: "Warms the local and remote cache." + ) + } + + @Option( + name: .shortAndLong, + help: "The path to the directory that contains the project whose targets will be cached.", + completion: .directory + ) + var path: String? + + @Option( + name: .shortAndLong, + help: "Configuration to use for binary caching." + ) + var configuration: String? + + @Argument(help: """ + A list of targets to cache. \ + Those and their dependant targets will be cached. \ + If no target is specified, all the project targets (excluding the external ones) and their dependencies will be cached. + """) + var targets: [String] = [] + + @Flag( + help: "If passed, the command doesn't cache the targets passed in the `--targets` argument, but only their dependencies" + ) + var externalOnly: Bool = false + + @Flag( + name: .long, + help: "When passed, it generates the project and skips warming the cache. This is useful for debugging purposes." + ) + var generateOnly: Bool = false + + @Flag( + name: .long, + help: "When passed, the hashes of the cacheable frameworks in the given project are printed." + ) + var printHashes: Bool = false + + public func run() async throws { + if printHashes { + try await CachePrintHashesService( + generatorFactory: Self.generatorFactory + ).run( + path: path, + configuration: configuration + ) + return + } + + try await Self.cacheService.run( + path: path, + configuration: configuration, + targetsToBinaryCache: Set(targets), + externalOnly: externalOnly, + generateOnly: generateOnly + ) + CacheCommand.analyticsDelegate?.addParameters( + [ + "n_targets": AnyCodable(targets.count), + "cacheable_targets": AnyCodable(CacheAnalyticsStore.shared.cacheableTargets), + "local_cache_target_hits": AnyCodable(CacheAnalyticsStore.shared.localCacheTargetsHits), + "remote_cache_target_hits": AnyCodable(CacheAnalyticsStore.shared.remoteCacheTargetsHits), + "test_targets": AnyCodable(CacheAnalyticsStore.shared.testTargets), + "local_test_target_hits": AnyCodable(CacheAnalyticsStore.shared.localTestTargetHits), + "remote_test_target_hits": AnyCodable(CacheAnalyticsStore.shared.remoteTestTargetHits), + ] + ) + } +} diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index 143bf5638ad..0ca6d9a9b70 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -35,6 +35,7 @@ public struct TuistCommand: AsyncParsableCommand { ProjectCommand.self, OrganizationCommand.self, AnalyticsCommand.self, + CacheCommand.self, ] ) } diff --git a/Tests/TuistCacheIntegrationTests/CacheGraphContentHasherIntegrationTests.swift b/Tests/TuistCacheIntegrationTests/CacheGraphContentHasherIntegrationTests.swift new file mode 100644 index 00000000000..a67dad44dee --- /dev/null +++ b/Tests/TuistCacheIntegrationTests/CacheGraphContentHasherIntegrationTests.swift @@ -0,0 +1,507 @@ +import Foundation +import MockableTest +import Path +import TuistCore +import TuistHasher +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistCache + +final class ContentHashingIntegrationTests: TuistUnitTestCase { + var subject: CacheGraphContentHasher! + var temporaryDirectoryPath: String! + var source1: SourceFile! + var source2: SourceFile! + var source3: SourceFile! + var source4: SourceFile! + var resourceFile1: ResourceFileElement! + var resourceFile2: ResourceFileElement! + var resourceFolderReference1: ResourceFileElement! + var resourceFolderReference2: ResourceFileElement! + var coreDataModel1: CoreDataModel! + var coreDataModel2: CoreDataModel! + + override func setUp() { + super.setUp() + do { + let temporaryDirectoryPath = try temporaryPath() + source1 = try createTemporarySourceFile(on: temporaryDirectoryPath, name: "1", content: "1") + source2 = try createTemporarySourceFile(on: temporaryDirectoryPath, name: "2", content: "2") + source3 = try createTemporarySourceFile(on: temporaryDirectoryPath, name: "3", content: "3") + source4 = try createTemporarySourceFile(on: temporaryDirectoryPath, name: "4", content: "4") + resourceFile1 = try createTemporaryResourceFile(on: temporaryDirectoryPath, name: "r1", content: "r1") + resourceFile2 = try createTemporaryResourceFile(on: temporaryDirectoryPath, name: "r2", content: "r2") + resourceFolderReference1 = try createTemporaryResourceFolderReference( + on: temporaryDirectoryPath, + name: "rf1", + content: "rf1" + ) + resourceFolderReference2 = try createTemporaryResourceFolderReference( + on: temporaryDirectoryPath, + name: "rf2", + content: "rf2" + ) + _ = try createTemporarySourceFile(on: temporaryDirectoryPath, name: "CoreDataModel1", content: "cd1") + _ = try createTemporarySourceFile(on: temporaryDirectoryPath, name: "CoreDataModel2", content: "cd2") + _ = try createTemporarySourceFile(on: temporaryDirectoryPath, name: "Info.plist", content: "plist") + coreDataModel1 = CoreDataModel( + path: temporaryDirectoryPath.appending(component: "CoreDataModel1"), + versions: [], + currentVersion: "1" + ) + coreDataModel2 = CoreDataModel( + path: temporaryDirectoryPath.appending(component: "CoreDataModel2"), + versions: [], + currentVersion: "2" + ) + } catch { + XCTFail("Error while creating files for stub project") + } + given(swiftVersionProvider).swiftlangVersion().willReturn("5.4.0") + subject = CacheGraphContentHasher(contentHasher: CachedContentHasher()) + } + + override func tearDown() { + subject = nil + source1 = nil + source2 = nil + source3 = nil + source4 = nil + resourceFile1 = nil + resourceFile2 = nil + resourceFolderReference1 = nil + resourceFolderReference2 = nil + coreDataModel1 = nil + coreDataModel2 = nil + super.tearDown() + } + + // MARK: - Sources + + func test_contentHashes_frameworksWithSameSources() throws { + // Given + let framework1Target = makeFramework(sources: [source1, source2]) + let framework2Target = makeFramework(sources: [source2, source1]) + let project1 = Project.test( + path: try temporaryPath().appending(component: "f1"), + settings: .default, + targets: [framework1Target] + ) + let project2 = Project.test( + path: try temporaryPath().appending(component: "f2"), + settings: .default, + targets: [framework2Target] + ) + let framework1 = GraphTarget(path: project1.path, target: framework1Target, project: project1) + let framework2 = GraphTarget(path: project2.path, target: framework2Target, project: project2) + + let graph = Graph.test( + projects: [ + project1.path: project1, + project2.path: project2, + ] + ) + + // When + let contentHash = try subject.contentHashes( + for: graph, + configuration: "Debug", + config: .test(), + excludedTargets: [] + ) + + // Then + XCTAssertEqual(contentHash[framework1], contentHash[framework2]) + } + + func test_contentHashes_frameworksWithDifferentSources() throws { + // Given + let framework1Target = makeFramework(sources: [source1, source2]) + let framework2Target = makeFramework(sources: [source3, source4]) + let project1 = Project.test( + path: try temporaryPath().appending(component: "f1"), + settings: .default, + targets: [framework1Target] + ) + let project2 = Project.test( + path: try temporaryPath().appending(component: "f2"), + settings: .default, + targets: [framework2Target] + ) + let framework1 = GraphTarget(path: project1.path, target: framework1Target, project: project1) + let framework2 = GraphTarget(path: project2.path, target: framework2Target, project: project2) + + let graph = Graph.test( + projects: [ + project1.path: project1, + project2.path: project2, + ] + ) + + // When + let contentHash = try subject.contentHashes( + for: graph, + configuration: "Debug", + config: .test(), + excludedTargets: [] + ) + + // Then + XCTAssertNotEqual(contentHash[framework1], contentHash[framework2]) + } + + func test_contentHashes_hashIsConsistent() throws { + // Given + let framework1Target = makeFramework(sources: [source1, source2]) + let framework2Target = makeFramework(sources: [source3, source4]) + let project1 = Project.test( + path: try temporaryPath().appending(component: "f1"), + settings: .default, + targets: [framework1Target] + ) + let project2 = Project.test( + path: try temporaryPath().appending(component: "f2"), + settings: .default, + targets: [framework2Target] + ) + let framework1 = GraphTarget(path: project1.path, target: framework1Target, project: project1) + let framework2 = GraphTarget(path: project2.path, target: framework2Target, project: project2) + + let graph = Graph.test( + projects: [ + project1.path: project1, + project2.path: project2, + ] + ) + + // When + let contentHash = try subject.contentHashes( + for: graph, + configuration: "Debug", + config: .test(), + excludedTargets: [] + ) + + // Then + XCTAssertEqual(contentHash[framework1], "733b86d9009e7e3d23cd9eb030fb635f") + XCTAssertEqual(contentHash[framework2], "644e0bd4ff2868a9c9f74c349df77163") + } + + // MARK: - Resources + + func test_contentHashes_differentResourceFiles() throws { + // Given + let framework1Target = makeFramework(resources: .init([resourceFile1])) + let framework2Target = makeFramework(resources: .init([resourceFile2])) + let project1 = Project.test( + path: try temporaryPath().appending(component: "f1"), + settings: .default, + targets: [framework1Target] + ) + let project2 = Project.test( + path: try temporaryPath().appending(component: "f2"), + settings: .default, + targets: [framework2Target] + ) + let framework1 = GraphTarget(path: project1.path, target: framework1Target, project: project1) + let framework2 = GraphTarget(path: project2.path, target: framework2Target, project: project2) + + let graph = Graph.test( + projects: [ + project1.path: project1, + project2.path: project2, + ] + ) + + // When + let contentHash = try subject.contentHashes( + for: graph, + configuration: "Debug", + config: .test(), + excludedTargets: [] + ) + + // Then + XCTAssertNotEqual(contentHash[framework1], contentHash[framework2]) + } + + func test_contentHashes_differentResourcesFolderReferences() throws { + // Given + let framework1Target = makeFramework(resources: .init([resourceFolderReference1])) + let framework2Target = makeFramework(resources: .init([resourceFolderReference2])) + let project1 = Project.test( + path: try temporaryPath().appending(component: "f1"), + settings: .default, + targets: [framework1Target] + ) + let project2 = Project.test( + path: try temporaryPath().appending(component: "f2"), + settings: .default, + targets: [framework2Target] + ) + let framework1 = GraphTarget(path: project1.path, target: framework1Target, project: project1) + let framework2 = GraphTarget(path: project2.path, target: framework2Target, project: project2) + + let graph = Graph.test( + projects: [ + project1.path: project1, + project2.path: project2, + ] + ) + + // When + let contentHash = try subject.contentHashes( + for: graph, + configuration: "Debug", + config: .test(), + excludedTargets: [] + ) + + // Then + XCTAssertNotEqual(contentHash[framework1], contentHash[framework2]) + } + + func test_contentHashes_sameResources() throws { + // Given + let resources: ResourceFileElements = .init([resourceFile1, resourceFolderReference1]) + let framework1Target = makeFramework(resources: resources) + let framework2Target = makeFramework(resources: resources) + let project1 = Project.test( + path: try temporaryPath().appending(component: "f1"), + settings: .default, + targets: [framework1Target] + ) + let project2 = Project.test( + path: try temporaryPath().appending(component: "f2"), + settings: .default, + targets: [framework2Target] + ) + let framework1 = GraphTarget(path: project1.path, target: framework1Target, project: project1) + let framework2 = GraphTarget(path: project2.path, target: framework2Target, project: project2) + + let graph = Graph.test( + projects: [ + project1.path: project1, + project2.path: project2, + ] + ) + + // When + let contentHash = try subject.contentHashes( + for: graph, + configuration: "Debug", + config: .test(), + excludedTargets: [] + ) + + // Then + XCTAssertEqual(contentHash[framework1], contentHash[framework2]) + } + + // MARK: - Core Data Models + + func test_contentHashes_differentCoreDataModels() throws { + // Given + let framework1Target = makeFramework(coreDataModels: [coreDataModel1]) + let framework2Target = makeFramework(coreDataModels: [coreDataModel2]) + let project1 = Project.test( + path: try temporaryPath().appending(component: "f1"), + settings: .default, + targets: [framework1Target] + ) + let project2 = Project.test( + path: try temporaryPath().appending(component: "f2"), + settings: .default, + targets: [framework2Target] + ) + let framework1 = GraphTarget(path: project1.path, target: framework1Target, project: project1) + let framework2 = GraphTarget(path: project2.path, target: framework2Target, project: project2) + + let graph = Graph.test( + projects: [ + project1.path: project1, + project2.path: project2, + ] + ) + + // When + let contentHash = try subject.contentHashes( + for: graph, + configuration: "Debug", + config: .test(), + excludedTargets: [] + ) + + // Then + XCTAssertNotEqual(contentHash[framework1], contentHash[framework2]) + } + + func test_contentHashes_sameCoreDataModels() throws { + // Given + let framework1Target = makeFramework(coreDataModels: [coreDataModel1]) + let framework2Target = makeFramework(coreDataModels: [coreDataModel1]) + let project1 = Project.test( + path: try temporaryPath().appending(component: "f1"), + settings: .default, + targets: [framework1Target] + ) + let project2 = Project.test( + path: try temporaryPath().appending(component: "f2"), + settings: .default, + targets: [framework2Target] + ) + let framework1 = GraphTarget(path: project1.path, target: framework1Target, project: project1) + let framework2 = GraphTarget(path: project2.path, target: framework2Target, project: project2) + + let graph = Graph.test( + projects: [ + project1.path: project1, + project2.path: project2, + ] + ) + + // When + let contentHash = try subject.contentHashes( + for: graph, + configuration: "Debug", + config: .test(), + excludedTargets: [] + ) + + // Then + XCTAssertEqual(contentHash[framework1], contentHash[framework2]) + } + + // MARK: - Target Actions + + // MARK: - Platform + + func test_contentHashes_differentPlatform() throws { + // Given + let framework1Target = makeFramework(platform: .iOS) + let framework2Target = makeFramework(platform: .macOS) + let project1 = Project.test( + path: try temporaryPath().appending(component: "f1"), + settings: .default, + targets: [framework1Target] + ) + let project2 = Project.test( + path: try temporaryPath().appending(component: "f2"), + settings: .default, + targets: [framework2Target] + ) + let framework1 = GraphTarget(path: project1.path, target: framework1Target, project: project1) + let framework2 = GraphTarget(path: project2.path, target: framework2Target, project: project2) + + let graph = Graph.test( + projects: [ + project1.path: project1, + project2.path: project2, + ] + ) + + // When + let contentHash = try subject.contentHashes( + for: graph, + configuration: "Debug", + config: .test(), + excludedTargets: [] + ) + + XCTAssertNotEqual(contentHash[framework1], contentHash[framework2]) + } + + // MARK: - ProductName + + func test_contentHashes_differentProductName() throws { + // Given + let framework1Target = makeFramework(productName: "1") + let framework2Target = makeFramework(productName: "2") + let project1 = Project.test( + path: try temporaryPath().appending(component: "f1"), + settings: .default, + targets: [framework1Target] + ) + let project2 = Project.test( + path: try temporaryPath().appending(component: "f2"), + settings: .default, + targets: [framework2Target] + ) + let framework1 = GraphTarget(path: project1.path, target: framework1Target, project: project1) + let framework2 = GraphTarget(path: project2.path, target: framework2Target, project: project2) + + let graph = Graph.test( + projects: [ + project1.path: project1, + project2.path: project2, + ] + ) + + // When + let contentHash = try subject.contentHashes( + for: graph, + configuration: "Debug", + config: .test(), + excludedTargets: [] + ) + + XCTAssertNotEqual(contentHash[framework1], contentHash[framework2]) + } + + // MARK: - Private helpers + + private func createTemporarySourceFile( + on temporaryDirectoryPath: AbsolutePath, + name: String, + content: String + ) throws -> SourceFile { + let filePath = temporaryDirectoryPath.appending(component: name) + try FileHandler.shared.touch(filePath) + try FileHandler.shared.write(content, path: filePath, atomically: true) + return SourceFile(path: filePath, compilerFlags: nil) + } + + private func createTemporaryResourceFile( + on temporaryDirectoryPath: AbsolutePath, + name: String, + content: String + ) throws -> ResourceFileElement { + let filePath = temporaryDirectoryPath.appending(component: name) + try FileHandler.shared.touch(filePath) + try FileHandler.shared.write(content, path: filePath, atomically: true) + return ResourceFileElement.file(path: filePath) + } + + private func createTemporaryResourceFolderReference( + on temporaryDirectoryPath: AbsolutePath, + name: String, + content: String + ) throws -> ResourceFileElement { + let filePath = temporaryDirectoryPath.appending(component: name) + try FileHandler.shared.touch(filePath) + try FileHandler.shared.write(content, path: filePath, atomically: true) + return ResourceFileElement.folderReference(path: filePath) + } + + private func makeFramework( + platform: Platform = .iOS, + productName: String? = nil, + sources: [SourceFile] = [], + resources: ResourceFileElements = .init([]), + coreDataModels: [CoreDataModel] = [], + targetScripts: [TargetScript] = [] + ) -> Target { + .test( + platform: platform, + product: .framework, + productName: productName, + sources: sources, + resources: resources, + coreDataModels: coreDataModels, + scripts: targetScripts + ) + } +} diff --git a/Tests/TuistCacheTests/CacheGraphContentHasherTests.swift b/Tests/TuistCacheTests/CacheGraphContentHasherTests.swift new file mode 100644 index 00000000000..d0a3256dc0c --- /dev/null +++ b/Tests/TuistCacheTests/CacheGraphContentHasherTests.swift @@ -0,0 +1,178 @@ +import Foundation +import Mockable +import MockableTest +import Path +import TuistCore +import TuistHasher +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistCache + +final class CacheGraphContentHasherTests: TuistUnitTestCase { + private var graphContentHasher: MockGraphContentHashing! + private var contentHasher: MockContentHashing! + private var defaultConfigurationFetcher: MockDefaultConfigurationFetching! + private var subject: CacheGraphContentHasher! + + override func setUp() { + super.setUp() + + graphContentHasher = .init() + contentHasher = .init() + defaultConfigurationFetcher = MockDefaultConfigurationFetching() + + subject = CacheGraphContentHasher( + graphContentHasher: graphContentHasher, + contentHasher: contentHasher, + versionFetcher: CacheVersionFetcher(), + defaultConfigurationFetcher: defaultConfigurationFetcher, + xcodeController: xcodeController, + swiftVersionProvider: swiftVersionProvider + ) + } + + override func tearDown() { + graphContentHasher = nil + contentHasher = nil + defaultConfigurationFetcher = nil + subject = nil + super.tearDown() + } + + func test_contentHashes_when_no_excluded_targets_all_hashes_are_computed() throws { + // Given + let includedTarget = GraphTarget( + path: "/Project/Path", + target: Target.test(name: "Included", product: .framework), + project: Project.test() + ) + given(graphContentHasher) + .contentHashes( + for: .any, + include: .any, + additionalStrings: .any + ) + .willReturn([:]) + given(defaultConfigurationFetcher) + .fetch(configuration: .any, config: .any, graph: .any) + .willReturn("Debug") + given(swiftVersionProvider).swiftlangVersion().willReturn("5.10.0") + + // When + _ = try subject.contentHashes( + for: Graph.test(), + configuration: "Debug", + config: .test(), + excludedTargets: [] + ) + + // Then + verify(graphContentHasher) + .contentHashes( + for: .any, + include: .matching { filter in + filter(includedTarget) + }, + additionalStrings: .any + ) + .called(1) + } + + func test_contentHashes_when_excluded_targets_excluded_hashes_are_not_computed() throws { + // Given + let excludedTarget = GraphTarget( + path: "/Project/Path", + target: Target.test(name: "Excluded", product: .framework), + project: Project.test() + ) + let includedTarget = GraphTarget( + path: "/Project/Path", + target: Target.test(name: "Included", product: .framework), + project: Project.test() + ) + given(graphContentHasher) + .contentHashes( + for: .any, + include: .any, + additionalStrings: .any + ) + .willReturn([:]) + given(defaultConfigurationFetcher) + .fetch(configuration: .any, config: .any, graph: .any) + .willReturn("Debug") + given(swiftVersionProvider).swiftlangVersion().willReturn("5.10.0") + + // When + _ = try subject.contentHashes( + for: Graph.test(), + configuration: "Debug", + config: .test(), + excludedTargets: ["Excluded"] + ) + + // Then + verify(graphContentHasher) + .contentHashes( + for: .any, + include: .matching { filter in + filter(includedTarget) && !filter(excludedTarget) + }, + additionalStrings: .any + ) + .called(1) + } + + func test_contentHashes_when_excluded_targets_resources_hashes_are_not_computed() throws { + // Given + let project = Project.test() + + let excludedTarget = GraphTarget( + path: "/Project/Path", + target: Target.test(name: "Excluded", product: .framework), + project: project + ) + let excludedTargetResource = GraphTarget( + path: "/Project/Path", + target: Target.test(name: "\(project.name)_Excluded", product: .bundle), + project: project + ) + let includedTarget = GraphTarget( + path: "/Project/Path", + target: Target.test(name: "Included", product: .framework), + project: Project.test() + ) + given(graphContentHasher) + .contentHashes( + for: .any, + include: .any, + additionalStrings: .any + ) + .willReturn([:]) + given(defaultConfigurationFetcher) + .fetch(configuration: .any, config: .any, graph: .any) + .willReturn("Debug") + given(swiftVersionProvider).swiftlangVersion().willReturn("5.10.0") + + // When + _ = try subject.contentHashes( + for: Graph.test(), + configuration: "Debug", + config: .test(), + excludedTargets: ["Excluded"] + ) + + // Then + verify(graphContentHasher) + .contentHashes( + for: .any, + include: .matching { filter in + filter(includedTarget) && !filter(excludedTarget) && !filter(excludedTargetResource) + }, + additionalStrings: .any + ) + .called(1) + } +} diff --git a/Tests/TuistCacheTests/VersionFetcherTests.swift b/Tests/TuistCacheTests/VersionFetcherTests.swift new file mode 100644 index 00000000000..a5efe14a338 --- /dev/null +++ b/Tests/TuistCacheTests/VersionFetcherTests.swift @@ -0,0 +1,20 @@ +import Foundation +import Path +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistCache + +final class CacheVersionFetcherTests: TuistUnitTestCase { + func test_return_the_right_version() { + // Given + let subject = CacheVersionFetcher() + + // When + let got = subject.version() + + // Then + XCTAssertEqual(got, .version2) + } +} diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 5976641f069..98912856020 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -1,13 +1,13 @@ import Foundation +import MockableTest import Path import TuistCore +import TuistSupport +import TuistSupportTesting import XcodeGraph import XCTest -@testable import TuistCoreTesting @testable import TuistGenerator -@testable import TuistSupport -@testable import TuistSupportTesting // Bundle name is irrelevant if the target supports resources. private let irrelevantBundleName = "" @@ -15,12 +15,16 @@ private let irrelevantBundleName = "" final class ResourcesProjectMapperTests: TuistUnitTestCase { var project: Project! var subject: ResourcesProjectMapper! - var contentHasher: MockContentHasher! + var contentHasher: MockContentHashing! override func setUp() { super.setUp() - contentHasher = MockContentHasher() + contentHasher = .init() subject = ResourcesProjectMapper(contentHasher: contentHasher) + + given(contentHasher) + .hash(Parameter.any) + .willProduce { String(data: $0, encoding: .utf8)! } } override func tearDown() { diff --git a/Tests/TuistHasherTests/CachedContentHasherTests.swift b/Tests/TuistHasherTests/CachedContentHasherTests.swift new file mode 100644 index 00000000000..f47d84cc627 --- /dev/null +++ b/Tests/TuistHasherTests/CachedContentHasherTests.swift @@ -0,0 +1,98 @@ +import MockableTest +import Path +import TuistCore +import TuistCoreTesting +import TuistSupport +import TuistSupportTesting +import XCTest + +@testable import TuistHasher + +final class CachedContentHasherTests: TuistUnitTestCase { + private var subject: CachedContentHasher! + private var contentHasher: MockContentHashing! + + override func setUp() { + super.setUp() + contentHasher = MockContentHashing() + subject = CachedContentHasher(contentHasher: contentHasher) + given(contentHasher) + .hash(Parameter<[String]>.any) + .willProduce { $0.joined(separator: ";") } + } + + override func tearDown() { + subject = nil + contentHasher = nil + super.tearDown() + } + + // MARK: - Tests + + func test_hashString_callsContentHasherWithExpectedString() throws { + // Given + given(contentHasher) + .hash(.value("foo")) + .willReturn("foo") + + // When + _ = try subject.hash("foo") + + // Then + verify(contentHasher) + .hash(Parameter.any) + .called(1) + } + + func test_hashStrings_callsContentHasherWithExpectedStrings() throws { + // Given + given(contentHasher) + .hash(.value("foo")) + .willReturn("foo") + given(contentHasher) + .hash(.value("bar")) + .willReturn("bar") + + // When + _ = try subject.hash(["foo", "bar"]) + + // Then + verify(contentHasher) + .hash(Parameter<[String]>.any) + .called(1) + } + + func test_hashpath_callsContentHasherWithExpectedPath() throws { + // Given + let path = try AbsolutePath(validating: "/foo") + given(contentHasher) + .hash(path: .value(path)) + .willReturn("foo-hash") + + // When + _ = try subject.hash(path: path) + + // Then + verify(contentHasher) + .hash(path: .any) + .called(1) + } + + func test_hashpath_secondTime_doesntCallContentHasher() throws { + // Given + let path = try AbsolutePath(validating: "/foo") + given(contentHasher) + .hash(path: .value(path)) + .willReturn("foo-hash") + + // When + let hash = try subject.hash(path: path) + let cachedHash = try subject.hash(path: path) + + // Then + verify(contentHasher) + .hash(path: .any) + .called(1) + XCTAssertEqual(hash, cachedHash) + } +} diff --git a/Tests/TuistHasherTests/CopyFilesContentHasherTests.swift b/Tests/TuistHasherTests/CopyFilesContentHasherTests.swift new file mode 100644 index 00000000000..a8b1eeb7ec9 --- /dev/null +++ b/Tests/TuistHasherTests/CopyFilesContentHasherTests.swift @@ -0,0 +1,112 @@ +import Foundation +import MockableTest +import Path +import TuistCore +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistHasher + +final class CopyFilesContentHasherTests: TuistUnitTestCase { + private var subject: CopyFilesContentHasher! + private var contentHasher: MockContentHashing! + private var temporaryDirectory: TemporaryDirectory! + + override func setUp() { + super.setUp() + contentHasher = .init() + subject = CopyFilesContentHasher(contentHasher: contentHasher) + + given(contentHasher) + .hash(Parameter<[String]>.any) + .willProduce { $0.joined(separator: ";") } + + do { + temporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) + } catch { + XCTFail("Error while creating temporary directory") + } + } + + override func tearDown() { + subject = nil + temporaryDirectory = nil + contentHasher = nil + + super.tearDown() + } + + private func makeCopyFilesAction( + name: String = "Copy Fonts", + destination: CopyFilesAction.Destination = .resources, + subpath: String? = "Fonts", + files: [CopyFileElement] = [.file(path: "/file1.ttf"), .file(path: "/file2.ttf")] + ) -> CopyFilesAction { + CopyFilesAction( + name: name, + destination: destination, + subpath: subpath, + files: files + ) + } + + // MARK: - Tests + + func test_hash_copyFilesAction_callsMockHasherWithExpectedStrings() throws { + // Given + let file1Hash = "file1-content-hash" + let file2Hash = "file2-content-hash" + let copyFilesAction = makeCopyFilesAction() + given(contentHasher) + .hash(path: .value(try AbsolutePath(validating: "/file1.ttf"))) + .willReturn(file1Hash) + given(contentHasher) + .hash(path: .value(try AbsolutePath(validating: "/file2.ttf"))) + .willReturn(file2Hash) + + // When + _ = try subject.hash(copyFiles: [copyFilesAction]) + + // Then + verify(contentHasher) + .hash(.value(["file1-content-hash", "file2-content-hash", "Copy Fonts", "resources", "Fonts"])) + .called(1) + verify(contentHasher) + .hash(Parameter<[String]>.any) + .called(1) + verify(contentHasher) + .hash(path: .any) + .called(2) + } + + func test_hash__copyFilesAction_valuesAreNotHarcoded() throws { + // Given + let file1Hash = "file1-content-hash" + let copyFilesAction = makeCopyFilesAction( + name: "Copy Templates", + destination: .sharedSupport, + subpath: "Templates", + files: [.file(path: "/file1.template")] + ) + + given(contentHasher) + .hash(path: .value(try AbsolutePath(validating: "/file1.template"))) + .willReturn(file1Hash) + + // When + _ = try subject.hash(copyFiles: [copyFilesAction]) + + // Then + verify(contentHasher) + .hash(.value(["file1-content-hash", "Copy Templates", "sharedSupport", "Templates"])) + .called(1) + verify(contentHasher) + .hash(Parameter<[String]>.any) + .called(1) + verify(contentHasher) + .hash(path: .any) + .called(1) + } +} diff --git a/Tests/TuistHasherTests/CoreDataModelsContentHasherTests.swift b/Tests/TuistHasherTests/CoreDataModelsContentHasherTests.swift new file mode 100644 index 00000000000..6f95032743a --- /dev/null +++ b/Tests/TuistHasherTests/CoreDataModelsContentHasherTests.swift @@ -0,0 +1,126 @@ +import Foundation +import MockableTest +import Path +import TuistCore +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistHasher + +final class CoreDataModelsContentHasherTests: TuistUnitTestCase { + private var subject: CoreDataModelsContentHasher! + private var coreDataModel: CoreDataModel! + private var contentHasher: MockContentHashing! + private let defaultValuesHash = + "05c9d517e2cf12b45786787dae929a23" // Expected hash for the CoreDataModel created with the buildCoreDataModel function + // using default values + + override func setUp() { + super.setUp() + contentHasher = .init() + subject = CoreDataModelsContentHasher(contentHasher: contentHasher) + do { + _ = try TemporaryDirectory(removeTreeOnDeinit: true) + } catch { + XCTFail("Error while creating temporary directory") + } + given(contentHasher) + .hash(Parameter<[String]>.any) + .willProduce { $0.joined(separator: ";") } + } + + override func tearDown() { + subject = nil + coreDataModel = nil + contentHasher = nil + super.tearDown() + } + + // MARK: - Tests + + func test_hash_returnsSameValue() throws { + // Given + coreDataModel = try buildCoreDataModel(versions: ["v1", "v2"], currentVersion: "currentV1") + given(contentHasher) + .hash(path: .any) + .willProduce { $0.basename } + + // When + let hash = try subject.hash(coreDataModels: [coreDataModel]) + + // Then + XCTAssertEqual(hash, "fixed-hash;currentV1;v1;v2") + } + + func test_hash_fileContentChangesHash() throws { + // Given + let name = "CoreDataModel" + coreDataModel = try buildCoreDataModel() + let fakePath = buildFakePath(from: name) + given(contentHasher) + .hash(path: .any) + .willProduce { $0.basename } + given(contentHasher) + .hash(path: .value(fakePath)) + .willReturn("different-hash") + + // When + let hash = try subject.hash(coreDataModels: [coreDataModel]) + + // Then + XCTAssertNotEqual(hash, defaultValuesHash) + } + + func test_hash_currentVersionChangesHash() throws { + // Given + coreDataModel = try buildCoreDataModel(currentVersion: "2") + given(contentHasher) + .hash(path: .any) + .willProduce { $0.basename } + + // When + let hash = try subject.hash(coreDataModels: [coreDataModel]) + + XCTAssertNotEqual(hash, defaultValuesHash) + } + + func test_hash_versionsChangeHash() throws { + // Given + coreDataModel = try buildCoreDataModel(versions: ["1", "2", "3"]) + given(contentHasher) + .hash(path: .any) + .willProduce { $0.basename } + + // When + let hash = try subject.hash(coreDataModels: [coreDataModel]) + + // Then + XCTAssertNotEqual(hash, defaultValuesHash) + } + + // MARK: - Private + + private func buildFakePath(from name: String) -> AbsolutePath { + try! AbsolutePath(validating: "/\(name)+path") + } + + private func buildCoreDataModel( + name: String = "CoreDataModel", + versions: [String] = ["1", "2"], + currentVersion: String = "1" + ) throws -> CoreDataModel { + let fakePath = buildFakePath(from: name) + + given(contentHasher) + .hash(path: .value(fakePath)) + .willReturn("fixed-hash") + let versionsAbsolutePaths = try versions.map { try AbsolutePath(validating: "/\($0)") } + return CoreDataModel( + path: fakePath, + versions: versionsAbsolutePaths, + currentVersion: currentVersion + ) + } +} diff --git a/Tests/TuistHasherTests/DependenciesContentHasherTests.swift b/Tests/TuistHasherTests/DependenciesContentHasherTests.swift new file mode 100644 index 00000000000..c06ed05b9df --- /dev/null +++ b/Tests/TuistHasherTests/DependenciesContentHasherTests.swift @@ -0,0 +1,289 @@ +import Foundation +import MockableTest +import Path +import TuistCore +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistHasher + +final class DependenciesContentHasherTests: TuistUnitTestCase { + private var subject: DependenciesContentHasher! + private var contentHasher: MockContentHashing! + private var filePath1: AbsolutePath! = try! AbsolutePath(validating: "/file1") + private var filePath2: AbsolutePath! = try! AbsolutePath(validating: "/file2") + private var filePath3: AbsolutePath! = try! AbsolutePath(validating: "/file3") + private var graphTarget: GraphTarget! + private var hashedTargets: [GraphHashedTarget: String]! + private var hashedPaths: [AbsolutePath: String]! + + override func setUp() { + super.setUp() + contentHasher = .init() + hashedTargets = [:] + hashedPaths = [:] + subject = DependenciesContentHasher(contentHasher: contentHasher) + + given(contentHasher) + .hash(Parameter.any) + .willProduce { $0 + "-hash" } + } + + override func tearDown() { + subject = nil + contentHasher = nil + hashedTargets = nil + hashedPaths = nil + graphTarget = nil + filePath1 = nil + filePath2 = nil + filePath3 = nil + super.tearDown() + } + + func test_hash_whenDependencyIsTarget_returnsTheRightHash() throws { + // Given + let dependency = TargetDependency.target(name: "foo") + + // When + let graphTarget = GraphTarget.test(target: Target.test(dependencies: [dependency])) + hashedTargets[ + GraphHashedTarget( + projectPath: graphTarget.path, + targetName: "foo" + ) + ] = "target-foo-hash" + let hash = try subject.hash(graphTarget: graphTarget, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths) + + // Then + XCTAssertEqual(hash, "target-foo-hash") + } + + func test_hash_whenDependencyIsTarget_throwsWhenTheDependencyHasntBeenHashed() throws { + // Given + let dependency = TargetDependency.target(name: "foo") + + // When/Then + let graphTarget = GraphTarget.test(target: Target.test(dependencies: [dependency])) + let expectedError = DependenciesContentHasherError.missingTargetHash( + sourceTargetName: graphTarget.target.name, + dependencyProjectPath: graphTarget.path, + dependencyTargetName: "foo" + ) + XCTAssertThrowsSpecific( + try subject.hash(graphTarget: graphTarget, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths), + expectedError + ) + } + + func test_hash_whenDependencyIsProject_returnsTheRightHash() throws { + // Given + let dependency = TargetDependency.project(target: "foo", path: filePath1) + + // When + let graphTarget = GraphTarget.test(target: Target.test(dependencies: [dependency])) + hashedTargets[ + GraphHashedTarget( + projectPath: filePath1, + targetName: "foo" + ) + ] = "project-file-hashed-foo-hash" + let hash = try subject.hash(graphTarget: graphTarget, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths) + + // Then + XCTAssertEqual(hash, "project-file-hashed-foo-hash") + } + + func test_hash_whenDependencyIsProjectWithACondition_returnsTheRightHash() throws { + // Given + let dependency = TargetDependency.project(target: "foo", path: filePath1, condition: .when([.ios])) + + // When + let graphTarget = GraphTarget.test(target: Target.test(dependencies: [dependency])) + hashedTargets[ + GraphHashedTarget( + projectPath: filePath1, + targetName: "foo" + ) + ] = "project-file-hashed-foo-hash" + let hash = try subject.hash(graphTarget: graphTarget, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths) + + // Then + XCTAssertEqual(hash, "project-file-hashed-foo-hash") + } + + func test_hash_whenDependencyIsProject_throwsAnErrorIfTheDependencyHashDoesntExist() throws { + // Given + let dependency = TargetDependency.project(target: "foo", path: filePath1) + + // When/Then + let graphTarget = GraphTarget.test(target: Target.test(dependencies: [dependency])) + let expectedError = DependenciesContentHasherError.missingProjectTargetHash( + sourceProjectPath: graphTarget.path, + sourceTargetName: graphTarget.target.name, + dependencyProjectPath: filePath1, + dependencyTargetName: "foo" + ) + XCTAssertThrowsSpecific( + try subject.hash(graphTarget: graphTarget, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths), + expectedError + ) + } + + func test_hash_whenDependencyIsFramework_callsContentHasherAsExpected() throws { + // Given + let dependency = TargetDependency.framework(path: filePath1, status: .required) + given(contentHasher) + .hash(path: .value(filePath1)) + .willReturn("file-hashed") + + // When + let graphTarget = GraphTarget.test(target: Target.test(dependencies: [dependency])) + let hash = try subject.hash(graphTarget: graphTarget, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths) + + // Then + XCTAssertEqual(hash, "file-hashed") + verify(contentHasher) + .hash(path: .any) + .called(1) + } + + func test_hash_whenDependencyIsXCFramework_callsContentHasherAsExpected() throws { + // Given + let dependency = TargetDependency.xcframework(path: filePath1, status: .required) + given(contentHasher) + .hash(path: .value(filePath1)) + .willReturn("file-hashed") + + // When + let graphTarget = GraphTarget.test(target: Target.test(dependencies: [dependency])) + let hash = try subject.hash(graphTarget: graphTarget, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths) + + // Then + XCTAssertEqual(hash, "file-hashed") + verify(contentHasher) + .hash(path: .any) + .called(1) + } + + func test_hash_whenDependencyIsLibrary_callsContentHasherAsExpected() throws { + // Given + let dependency = TargetDependency.library( + path: filePath1, + publicHeaders: filePath2, + swiftModuleMap: filePath3 + ) + given(contentHasher) + .hash(path: .value(filePath1)) + .willReturn("file1-hashed") + given(contentHasher) + .hash(path: .value(filePath2)) + .willReturn("file2-hashed") + given(contentHasher) + .hash(path: .value(filePath3)) + .willReturn("file3-hashed") + + // When + let graphTarget = GraphTarget.test(target: Target.test(dependencies: [dependency])) + let hash = try subject.hash(graphTarget: graphTarget, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths) + + // Then + XCTAssertEqual(hash, "library-file1-hashed-file2-hashed-file3-hashed-hash") + verify(contentHasher) + .hash(path: .any) + .called(3) + verify(contentHasher) + .hash(Parameter.any) + .called(1) + } + + func test_hash_whenDependencyIsLibrary_swiftModuleMapIsNil_callsContentHasherAsExpected() throws { + // Given + let dependency = TargetDependency.library( + path: filePath1, + publicHeaders: filePath2, + swiftModuleMap: nil + ) + given(contentHasher) + .hash(path: .value(filePath1)) + .willReturn("file1-hashed") + given(contentHasher) + .hash(path: .value(filePath2)) + .willReturn("file2-hashed") + + // When + let graphTarget = GraphTarget.test(target: Target.test(dependencies: [dependency])) + let hash = try subject.hash(graphTarget: graphTarget, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths) + + // Then + XCTAssertEqual(hash, "library-file1-hashed-file2-hashed-hash") + verify(contentHasher) + .hash(path: .any) + .called(2) + verify(contentHasher) + .hash(Parameter.any) + .called(1) + } + + func test_hash_whenDependencyIsPackage_callsContentHasherAsExpected() throws { + // Given + let dependency = TargetDependency.package(product: "foo", type: .runtime) + + // When + let graphTarget = GraphTarget.test(target: Target.test(dependencies: [dependency])) + let hash = try subject.hash(graphTarget: graphTarget, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths) + + // Then + XCTAssertEqual(hash, "package-foo-runtime-hash") + verify(contentHasher) + .hash(Parameter.any) + .called(1) + } + + func test_hash_whenDependencyIsOptionalSDK_callsContentHasherAsExpected() throws { + // Given + let dependency = TargetDependency.sdk(name: "foo", status: .optional) + + // When + let graphTarget = GraphTarget.test(target: Target.test(dependencies: [dependency])) + let hash = try subject.hash(graphTarget: graphTarget, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths) + + // Then + XCTAssertEqual(hash, "sdk-foo-optional-hash") + verify(contentHasher) + .hash(Parameter.any) + .called(1) + } + + func test_hash_whenDependencyIsRequiredSDK_callsContentHasherAsExpected() throws { + // Given + let dependency = TargetDependency.sdk(name: "foo", status: .required) + + // When + let graphTarget = GraphTarget.test(target: Target.test(dependencies: [dependency])) + let hash = try subject.hash(graphTarget: graphTarget, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths) + + // Then + XCTAssertEqual(hash, "sdk-foo-required-hash") + verify(contentHasher) + .hash(Parameter.any) + .called(1) + } + + func test_hash_whenDependencyIsXCTest_callsContentHasherAsExpected() throws { + // Given + let dependency = TargetDependency.xctest + + // When + let graphTarget = GraphTarget.test(target: Target.test(dependencies: [dependency])) + let hash = try subject.hash(graphTarget: graphTarget, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths) + + // Then + XCTAssertEqual(hash, "xctest-hash") + verify(contentHasher) + .hash(Parameter.any) + .called(1) + } +} diff --git a/Tests/TuistHasherTests/DeploymentTargetContentHasherTests.swift b/Tests/TuistHasherTests/DeploymentTargetContentHasherTests.swift new file mode 100644 index 00000000000..a64c5f7df4a --- /dev/null +++ b/Tests/TuistHasherTests/DeploymentTargetContentHasherTests.swift @@ -0,0 +1,90 @@ +import Foundation +import MockableTest +import Path +import TuistCore +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistHasher + +final class DeploymentTargetContentHasherTests: TuistUnitTestCase { + private var subject: DeploymentTargetsContentHasher! + private var contentHasher: MockContentHashing! + + override func setUp() { + super.setUp() + contentHasher = .init() + subject = DeploymentTargetsContentHasher(contentHasher: contentHasher) + given(contentHasher) + .hash(Parameter.any) + .willProduce { $0 + "-hash" } + } + + override func tearDown() { + subject = nil + contentHasher = nil + super.tearDown() + } + + func test_hash_whenIosIphoneV1_callsContentHasherWithExpectedStrings() throws { + // When + let deploymentTargets = DeploymentTargets.iOS("v1") + + // Then + let hash = try subject.hash(deploymentTargets: deploymentTargets) + XCTAssertEqual(hash, "iOS-v1-hash") + verify(contentHasher) + .hash(Parameter.any) + .called(1) + } + + func test_hash_whenIosIpadV2_callsContentHasherWithExpectedStrings() throws { + // When + let deploymentTargets = DeploymentTargets.iOS("v2") + + // Then + let hash = try subject.hash(deploymentTargets: deploymentTargets) + XCTAssertEqual(hash, "iOS-v2-hash") + verify(contentHasher) + .hash(Parameter.any) + .called(1) + } + + func test_hash_whenMacOSV2_callsContentHasherWithExpectedStrings() throws { + // When + let deploymentTargets = DeploymentTargets.macOS("v2") + + // Then + let hash = try subject.hash(deploymentTargets: deploymentTargets) + XCTAssertEqual(hash, "macOS-v2-hash") + verify(contentHasher) + .hash(Parameter.any) + .called(1) + } + + func test_hash_whenWatchOSV2_callsContentHasherWithExpectedStrings() throws { + // When + let deploymentTargets = DeploymentTargets.watchOS("v2") + + // Then + let hash = try subject.hash(deploymentTargets: deploymentTargets) + XCTAssertEqual(hash, "watchOS-v2-hash") + verify(contentHasher) + .hash(Parameter.any) + .called(1) + } + + func test_hash_whentvOSV2_callsContentHasherWithExpectedStrings() throws { + // When + let deploymentTargets = DeploymentTargets.tvOS("v2") + + // Then + let hash = try subject.hash(deploymentTargets: deploymentTargets) + XCTAssertEqual(hash, "tvOS-v2-hash") + verify(contentHasher) + .hash(Parameter.any) + .called(1) + } +} diff --git a/Tests/TuistHasherTests/Extensions/Plist+ExtrasTests.swift b/Tests/TuistHasherTests/Extensions/Plist+ExtrasTests.swift new file mode 100644 index 00000000000..8d79e8a2653 --- /dev/null +++ b/Tests/TuistHasherTests/Extensions/Plist+ExtrasTests.swift @@ -0,0 +1,16 @@ +import Path +import TuistCore +import XcodeGraph +import XCTest +@testable import TuistHasher + +class PlistrExtrasTests: XCTestCase { + func test_normalize() throws { + XCTAssertEqual(Plist.Value.string("test").normalize() as? String, "test") + XCTAssertEqual(Plist.Value.integer(1).normalize() as? Int, 1) + XCTAssertEqual(Plist.Value.real(1).normalize() as? Double, 1) + XCTAssertEqual(Plist.Value.boolean(true).normalize() as? Bool, true) + XCTAssertEqual(Plist.Value.array([.string("test")]).normalize() as? [String], ["test"]) + XCTAssertEqual(Plist.Value.dictionary(["test": .string("tuist")]).normalize() as? [String: String], ["test": "tuist"]) + } +} diff --git a/Tests/TuistHasherTests/GraphContentHasherTests.swift b/Tests/TuistHasherTests/GraphContentHasherTests.swift new file mode 100644 index 00000000000..8390380be3b --- /dev/null +++ b/Tests/TuistHasherTests/GraphContentHasherTests.swift @@ -0,0 +1,105 @@ +import Foundation +import Path +import TuistCore +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistHasher + +final class GraphContentHasherTests: TuistUnitTestCase { + private var subject: GraphContentHasher! + + override func setUp() { + super.setUp() + subject = GraphContentHasher(contentHasher: ContentHasher()) + } + + override func tearDown() { + subject = nil + super.tearDown() + } + + func test_contentHashes_emptyGraph() throws { + // Given + let graph = Graph.test() + + // When + let hashes = try subject.contentHashes(for: graph, include: { _ in true }, additionalStrings: []) + + // Then + XCTAssertEqual(hashes, Dictionary()) + } + + func test_contentHashes_returnsOnlyFrameworks() throws { + // Given + let path: AbsolutePath = "/project" + let frameworkATarget: Target = .test( + name: "FrameworkA", + product: .framework, + infoPlist: nil, + entitlements: nil + ) + let frameworkBTarget: Target = .test( + name: "FrameworkB", + product: .framework, + infoPlist: nil, + entitlements: nil + ) + let appTarget: Target = .test( + name: "App", + product: .app, + infoPlist: nil, + entitlements: nil + ) + let dynamicLibraryTarget: Target = .test( + name: "DynamicLibrary", + product: .dynamicLibrary, + infoPlist: nil, + entitlements: nil + ) + let staticFrameworkTarget: Target = .test( + name: "StaticFramework", + product: .staticFramework, + infoPlist: nil, + entitlements: nil + ) + + let project: Project = .test( + path: path, + targets: [frameworkATarget, frameworkBTarget, appTarget, dynamicLibraryTarget, staticFrameworkTarget] + ) + let frameworkTarget = GraphTarget.test( + path: path, + target: frameworkATarget, + project: project + ) + let secondFrameworkTarget = GraphTarget.test( + path: path, + target: frameworkBTarget, + project: project + ) + let graph = Graph.test( + path: path, + projects: [project.path: project] + ) + + let expectedCachableTargets = [frameworkTarget, secondFrameworkTarget].sorted(by: { $0.target.name < $1.target.name }) + + // When + let hashes = try subject.contentHashes( + for: graph, + include: { + $0.target.product == .framework + }, + additionalStrings: [] + ) + let hashedTargets: [GraphTarget] = hashes.keys.sorted { left, right -> Bool in + left.path.pathString < right.path.pathString + } + .sorted(by: { $0.target.name < $1.target.name }) + + // Then + XCTAssertEqual(hashedTargets, expectedCachableTargets) + } +} diff --git a/Tests/TuistHasherTests/HeadersContentHasherTests.swift b/Tests/TuistHasherTests/HeadersContentHasherTests.swift new file mode 100644 index 00000000000..609456654e5 --- /dev/null +++ b/Tests/TuistHasherTests/HeadersContentHasherTests.swift @@ -0,0 +1,72 @@ +import Foundation +import MockableTest +import Path +import TuistCore +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistHasher + +final class HeadersContentHasherTests: TuistUnitTestCase { + private var subject: HeadersContentHasher! + private var contentHasher: MockContentHashing! + private let filePath1 = try! AbsolutePath(validating: "/file1") + private let filePath2 = try! AbsolutePath(validating: "/file2") + private let filePath3 = try! AbsolutePath(validating: "/file3") + private let filePath4 = try! AbsolutePath(validating: "/file4") + private let filePath5 = try! AbsolutePath(validating: "/file5") + private let filePath6 = try! AbsolutePath(validating: "/file6") + + override func setUp() { + super.setUp() + contentHasher = .init() + subject = HeadersContentHasher(contentHasher: contentHasher) + } + + override func tearDown() { + subject = nil + contentHasher = nil + super.tearDown() + } + + func test_hash_callsContentHasherWithTheExpectedParameters() throws { + // Given + given(contentHasher) + .hash(path: .value(filePath1)) + .willReturn("1") + given(contentHasher) + .hash(path: .value(filePath2)) + .willReturn("2") + given(contentHasher) + .hash(path: .value(filePath3)) + .willReturn("3") + given(contentHasher) + .hash(path: .value(filePath4)) + .willReturn("4") + given(contentHasher) + .hash(path: .value(filePath5)) + .willReturn("5") + given(contentHasher) + .hash(path: .value(filePath6)) + .willReturn("6") + given(contentHasher) + .hash(Parameter<[String]>.any) + .willProduce { $0.joined(separator: ";") } + + // When + let headers = Headers( + public: [filePath1, filePath2], + private: [filePath3, filePath4], + project: [filePath5, filePath6] + ) + + // Then + let hash = try subject.hash(headers: headers) + XCTAssertEqual(hash, "1;2;3;4;5;6") + verify(contentHasher) + .hash(path: .any) + .called(6) + } +} diff --git a/Tests/TuistHasherTests/PlistContentHasherTests.swift b/Tests/TuistHasherTests/PlistContentHasherTests.swift new file mode 100644 index 00000000000..5a3ff202561 --- /dev/null +++ b/Tests/TuistHasherTests/PlistContentHasherTests.swift @@ -0,0 +1,115 @@ +import Foundation +import MockableTest +import Path +import TuistCore +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistHasher + +final class InfoPlistContentHasherTests: TuistUnitTestCase { + private var subject: PlistContentHasher! + private var contentHasher: MockContentHashing! + private let filePath1 = try! AbsolutePath(validating: "/file1") + + override func setUp() { + super.setUp() + contentHasher = .init() + subject = PlistContentHasher(contentHasher: contentHasher) + given(contentHasher) + .hash(Parameter.any) + .willProduce { $0 + "-hash" } + } + + override func tearDown() { + subject = nil + contentHasher = nil + super.tearDown() + } + + func test_hash_whenPlistIsFile_tellsContentHasherToHashFileContent() throws { + // Given + let infoPlist = InfoPlist.file(path: filePath1) + given(contentHasher) + .hash(path: .value(filePath1)) + .willReturn("stubHash") + + // When + let hash = try subject.hash(plist: .infoPlist(infoPlist)) + + // Then + verify(contentHasher) + .hash(path: .any) + .called(1) + XCTAssertEqual(hash, "stubHash") + } + + func test_hash_whenPlistIsGeneratedFile_tellsContentHasherToHashFileContent() throws { + // Given + let infoPlist = InfoPlist.generatedFile( + path: filePath1, + data: try XCTUnwrap(Data(base64Encoded: "stubHash")) + ) + given(contentHasher) + .hash(Parameter.any) + .willProduce { $0.base64EncodedString() + "-hash" } + + // When + let hash = try subject.hash(plist: .infoPlist(infoPlist)) + + // Then + verify(contentHasher) + .hash(Parameter.any) + .called(1) + XCTAssertEqual(hash, "stubHash-hash") + } + + func test_hash_whenPlistIsDictionary_allDictionaryValuesAreConsideredForHash() throws { + // Given + let infoPlist = InfoPlist.dictionary([ + "1": 23, + "2": "foo", + "3": true, + "4": false, + "5": ["5a", "5b"], + "6": ["6a": "6value"], + ]) + // When + let hash = try subject.hash(plist: .infoPlist(infoPlist)) + + // Then + verify(contentHasher) + .hash(Parameter.any) + .called(1) + XCTAssertEqual( + hash, + "1=integer(23);2=string(\"foo\");3=boolean(true);4=boolean(false);5=array([XcodeGraph.Plist.Value.string(\"5a\"), XcodeGraph.Plist.Value.string(\"5b\")]);6=dictionary([\"6a\": XcodeGraph.Plist.Value.string(\"6value\")]);-hash" + ) + } + + func test_hash_whenPlistIsExtendingDefault_allDictionaryValuesAreConsideredForHash() throws { + // Given + let infoPlist = InfoPlist.extendingDefault(with: [ + "1": 23, + "2": "foo", + "3": true, + "4": false, + "5": ["5a", "5b"], + "6": ["6a": "6value"], + ]) + + // When + let hash = try subject.hash(plist: .infoPlist(infoPlist)) + + // Then + verify(contentHasher) + .hash(Parameter.any) + .called(1) + XCTAssertEqual( + hash, + "1=integer(23);2=string(\"foo\");3=boolean(true);4=boolean(false);5=array([XcodeGraph.Plist.Value.string(\"5a\"), XcodeGraph.Plist.Value.string(\"5b\")]);6=dictionary([\"6a\": XcodeGraph.Plist.Value.string(\"6value\")]);-hash" + ) + } +} diff --git a/Tests/TuistHasherTests/PrivacyManifestContentHasherTests.swift b/Tests/TuistHasherTests/PrivacyManifestContentHasherTests.swift new file mode 100644 index 00000000000..71eb732a4a5 --- /dev/null +++ b/Tests/TuistHasherTests/PrivacyManifestContentHasherTests.swift @@ -0,0 +1,41 @@ +import Foundation +import Path +import TuistCore +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest +@testable import TuistHasher + +final class PrivacyManifestContentHasherTests: TuistUnitTestCase { + private var subject: PrivacyManifestContentHasher! + + override func setUp() { + super.setUp() + subject = PrivacyManifestContentHasher(contentHasher: ContentHasher()) + } + + override func tearDown() { + subject = nil + super.tearDown() + } + + func test_hash_isDeterministic() throws { + // Given + let privacyManifest = PrivacyManifest( + tracking: true, + trackingDomains: ["io.tuist"], + collectedDataTypes: [["test": .string("tuist")]], + accessedApiTypes: [["test": .string("tuist")]] + ) + var results: Set = Set() + + // When + for _ in 0 ... 100 { + results.insert(try subject.hash(privacyManifest)) + } + + // Then + XCTAssertEqual(results.count, 1) + } +} diff --git a/Tests/TuistHasherTests/ResourcesContentHasherTests.swift b/Tests/TuistHasherTests/ResourcesContentHasherTests.swift new file mode 100644 index 00000000000..6437f499d2e --- /dev/null +++ b/Tests/TuistHasherTests/ResourcesContentHasherTests.swift @@ -0,0 +1,116 @@ +import Foundation +import MockableTest +import Path +import TuistCore +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistHasher + +final class ResourcesContentHasherTests: TuistUnitTestCase { + private var subject: ResourcesContentHasher! + private var contentHasher: MockContentHashing! + private let filePath1 = try! AbsolutePath(validating: "/file1") + private let filePath2 = try! AbsolutePath(validating: "/file2") + + override func setUp() { + super.setUp() + contentHasher = .init() + subject = ResourcesContentHasher(contentHasher: contentHasher) + + given(contentHasher) + .hash(Parameter<[String]>.any) + .willProduce { $0.joined(separator: ";") } + } + + override func tearDown() { + subject = nil + contentHasher = nil + super.tearDown() + } + + // MARK: - Tests + + func test_hash_callsContentHasherWithTheExpectedParameter() throws { + // Given + let file1 = ResourceFileElement.file(path: filePath1) + let file2 = ResourceFileElement.file(path: filePath2) + given(contentHasher) + .hash(path: .value(filePath1)) + .willReturn("1") + given(contentHasher) + .hash(path: .value(filePath2)) + .willReturn("2") + + // When + let hash = try subject.hash(resources: .init([file1, file2])) + + // Then + verify(contentHasher) + .hash(path: .any) + .called(2) + XCTAssertEqual(hash, "1;2") + } + + func test_hash_includesFolderReference() throws { + // Given + let file1 = ResourceFileElement.file(path: filePath1) + let file2 = ResourceFileElement.folderReference(path: filePath2) + given(contentHasher) + .hash(path: .value(filePath1)) + .willReturn("1") + given(contentHasher) + .hash(path: .value(filePath2)) + .willReturn("2") + + // When + let hash = try subject.hash(resources: .init([file1, file2])) + + // Then + verify(contentHasher) + .hash(path: .any) + .called(2) + XCTAssertEqual(hash, "1;2") + } + + func test_hash_sortsTheResourcesBeforeCalculatingTheHash() throws { + // Given + let file1 = ResourceFileElement.file(path: filePath1) + let file2 = ResourceFileElement.folderReference(path: filePath2) + given(contentHasher) + .hash(path: .value(filePath1)) + .willReturn("1") + given(contentHasher) + .hash(path: .value(filePath2)) + .willReturn("2") + + // When/Then + XCTAssertEqual(try subject.hash(resources: .init([file1, file2])), try subject.hash(resources: .init([file2, file1]))) + } + + func test_hash_hashesThePrivacyManifestToo() throws { + // Given + let file1 = ResourceFileElement.file(path: filePath1) + given(contentHasher) + .hash(path: .value(filePath1)) + .willReturn("1") + given(contentHasher) + .hash(path: .value(filePath2)) + .willReturn("2") + given(contentHasher) + .hash(Parameter.any) + .willProduce { $0 } + + let resources = ResourceFileElements([file1, file1], privacyManifest: PrivacyManifest( + tracking: true, + trackingDomains: ["io.tuist"], + collectedDataTypes: [["test": .string("tuist")]], + accessedApiTypes: [["test": .string("tuist")]] + )) + + // When/Then + XCTAssertEqual(try subject.hash(resources: resources), try subject.hash(resources: resources)) + } +} diff --git a/Tests/TuistHasherTests/SettingsContentHasherTests.swift b/Tests/TuistHasherTests/SettingsContentHasherTests.swift new file mode 100644 index 00000000000..74969eb1163 --- /dev/null +++ b/Tests/TuistHasherTests/SettingsContentHasherTests.swift @@ -0,0 +1,84 @@ +import Foundation +import MockableTest +import Path +import TuistCore +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistHasher + +final class SettingsContentHasherTests: TuistUnitTestCase { + private var subject: SettingsContentHasher! + private var contentHasher: MockContentHashing! + private let filePath1 = try! AbsolutePath(validating: "/file1") + + override func setUp() { + super.setUp() + contentHasher = .init() + subject = SettingsContentHasher(contentHasher: contentHasher) + + given(contentHasher) + .hash(Parameter<[String]>.any) + .willProduce { $0.joined(separator: ";") } + given(contentHasher) + .hash(Parameter.any) + .willProduce { $0 + "-hash" } + } + + override func tearDown() { + subject = nil + contentHasher = nil + super.tearDown() + } + + // MARK: - Tests + + func test_hash_whenRecommended_withXCConfig_callsContentHasherWithExpectedStrings() throws { + given(contentHasher) + .hash(path: .value(filePath1)) + .willReturn("xconfigHash") + + // Given + let settings = Settings( + base: ["CURRENT_PROJECT_VERSION": SettingValue.string("1")], + configurations: [ + BuildConfiguration + .debug("dev"): Configuration(settings: ["SWIFT_VERSION": SettingValue.string("5")], xcconfig: filePath1), + ], + defaultSettings: .recommended + ) + + // When + let hash = try subject.hash(settings: settings) + + // Then + XCTAssertEqual( + hash, + "CURRENT_PROJECT_VERSION:string(\"1\")-hash;devdebugSWIFT_VERSION:string(\"5\")-hashxconfigHash;recommended" + ) + } + + func test_hash_whenEssential_withoutXCConfig_callsContentHasherWithExpectedStrings() throws { + given(contentHasher) + .hash(path: .value(filePath1)) + .willReturn("xconfigHash") + + // Given + let settings = Settings( + base: ["CURRENT_PROJECT_VERSION": SettingValue.string("2")], + configurations: [ + BuildConfiguration + .release("prod"): Configuration(settings: ["SWIFT_VERSION": SettingValue.string("5")], xcconfig: nil), + ], + defaultSettings: .essential + ) + + // When + let hash = try subject.hash(settings: settings) + + // Then + XCTAssertEqual(hash, "CURRENT_PROJECT_VERSION:string(\"2\")-hash;prodreleaseSWIFT_VERSION:string(\"5\")-hash;essential") + } +} diff --git a/Tests/TuistHasherTests/SourceFilesContentHasherTests.swift b/Tests/TuistHasherTests/SourceFilesContentHasherTests.swift new file mode 100644 index 00000000000..8808b3943ec --- /dev/null +++ b/Tests/TuistHasherTests/SourceFilesContentHasherTests.swift @@ -0,0 +1,84 @@ +import Foundation +import MockableTest +import Path +import TuistCore +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistHasher + +final class SourceFilesContentHasherTests: TuistUnitTestCase { + private var subject: SourceFilesContentHasher! + private var contentHasher: MockContentHashing! + private let sourceFile1Path = try! AbsolutePath(validating: "/file1") + private let sourceFile2Path = try! AbsolutePath(validating: "/file2") + private var sourceFile1: SourceFile! + private var sourceFile2: SourceFile! + + override func setUp() { + super.setUp() + contentHasher = .init() + subject = SourceFilesContentHasher(contentHasher: contentHasher) + sourceFile1 = SourceFile(path: sourceFile1Path, compilerFlags: "-fno-objc-arc") + sourceFile2 = SourceFile(path: sourceFile2Path, compilerFlags: "-print-objc-runtime-info") + + given(contentHasher) + .hash(Parameter.any) + .willProduce { $0 + "-hash" } + given(contentHasher) + .hash(Parameter<[String]>.any) + .willProduce { $0.joined(separator: ";") } + } + + override func tearDown() { + subject = nil + contentHasher = nil + sourceFile1 = nil + sourceFile2 = nil + super.tearDown() + } + + // MARK: - Tests + + func test_hash_when_the_files_have_a_hash() throws { + // When + sourceFile1 = SourceFile(path: sourceFile1Path, contentHash: "first") + sourceFile2 = SourceFile(path: sourceFile2Path, contentHash: "second") + let hash = try subject.hash(sources: [sourceFile1, sourceFile2]) + + // Then + XCTAssertEqual(hash, "first;second") + } + + func test_hash_returnsSameValue() throws { + // When + given(contentHasher) + .hash(path: .value(sourceFile1Path)) + .willReturn("") + given(contentHasher) + .hash(path: .value(sourceFile2Path)) + .willReturn("") + let hash = try subject.hash(sources: [sourceFile1, sourceFile2]) + + // Then + XCTAssertEqual(hash, "-fno-objc-arc-hash;-print-objc-runtime-info-hash") + } + + func test_hash_includesFileContentHashAndCompilerFlags() throws { + // Given + given(contentHasher) + .hash(path: .value(sourceFile1Path)) + .willReturn("file1-content-hash") + given(contentHasher) + .hash(path: .value(sourceFile2Path)) + .willReturn("file2-content-hash") + + // When + let hash = try subject.hash(sources: [sourceFile1, sourceFile2]) + + // Then + XCTAssertEqual(hash, "file1-content-hash-fno-objc-arc-hash;file2-content-hash-print-objc-runtime-info-hash") + } +} diff --git a/Tests/TuistHasherTests/TargetScriptsContentHasherTests.swift b/Tests/TuistHasherTests/TargetScriptsContentHasherTests.swift new file mode 100644 index 00000000000..b1761c661e0 --- /dev/null +++ b/Tests/TuistHasherTests/TargetScriptsContentHasherTests.swift @@ -0,0 +1,224 @@ +import Foundation +import MockableTest +import Path +import TuistCore +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistHasher + +final class TargetScriptsContentHasherTests: TuistUnitTestCase { + private var subject: TargetScriptsContentHasher! + private var contentHasher: MockContentHashing! + private var temporaryDirectory: TemporaryDirectory! + + override func setUp() { + super.setUp() + contentHasher = .init() + subject = TargetScriptsContentHasher(contentHasher: contentHasher) + do { + temporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) + } catch { + XCTFail("Error while creating temporary directory") + } + given(contentHasher) + .hash(Parameter.any) + .willProduce { $0 + "-hash" } + given(contentHasher) + .hash(Parameter<[String]>.any) + .willProduce { $0.joined(separator: ";") } + } + + override func tearDown() { + subject = nil + temporaryDirectory = nil + contentHasher = nil + + super.tearDown() + } + + private func makeTargetScript( + name: String = "1", + order: TargetScript.Order = .pre, + tool: String = "tool1", + arguments: [String] = ["arg1", "arg2"], + inputPaths: [AbsolutePath] = [try! AbsolutePath(validating: "/inputPaths1")], + inputFileListPaths: [AbsolutePath] = [try! AbsolutePath(validating: "/inputFileListPaths1")], + outputPaths: [AbsolutePath] = [try! AbsolutePath(validating: "/outputPaths1")], + outputFileListPaths: [AbsolutePath] = [try! AbsolutePath(validating: "/outputFileListPaths1")], + dependencyFile: AbsolutePath = try! AbsolutePath(validating: "/dependencyFile1") + ) -> TargetScript { + TargetScript( + name: name, + order: order, + script: .tool(path: tool, args: arguments), + inputPaths: inputPaths.map(\.pathString), + inputFileListPaths: inputFileListPaths, + outputPaths: outputPaths.map(\.pathString), + outputFileListPaths: outputFileListPaths, + dependencyFile: dependencyFile + ) + } + + // MARK: - Tests + + func test_hash_targetAction_withBuildVariables_callsMockHasherWithOnlyPathWithoutBuildVariable() throws { + // Given + let inputFileListPaths1 = "inputFileListPaths1-hash" + given(contentHasher) + .hash(path: .value(try AbsolutePath(validating: "/inputFileListPaths1"))) + .willReturn(inputFileListPaths1) + let targetScript = makeTargetScript( + inputPaths: [try AbsolutePath(validating: "/$(SRCROOT)/inputPaths1")], + inputFileListPaths: [try AbsolutePath(validating: "/inputFileListPaths1")], + outputPaths: [try AbsolutePath(validating: "/$(DERIVED_FILE_DIR)/outputPaths1")], + outputFileListPaths: [try AbsolutePath(validating: "/outputFileListPaths1")], + dependencyFile: try AbsolutePath(validating: "/$(DERIVED_FILE_DIR)/file.d") + ) + + // When + _ = try subject.hash(targetScripts: [targetScript], sourceRootPath: "/") + + // Then + let expected = [ + "$(SRCROOT)/inputPaths1", + "$(DERIVED_FILE_DIR)/file.d", + inputFileListPaths1, + "$(DERIVED_FILE_DIR)/outputPaths1", + "outputFileListPaths1", + "1", + "tool1", + "pre", + "arg1", + "arg2", + ] + + verify(contentHasher) + .hash(.value(expected)) + .called(1) + } + + func test_hash_targetAction_callsMockHasherWithExpectedStrings() throws { + // Given + let inputPaths1Hash = "inputPaths1-hash" + let inputFileListPaths1 = "inputFileListPaths1-hash" + let dependencyFileHash = "dependencyFile1-hash" + given(contentHasher) + .hash(path: .value(try AbsolutePath(validating: "/inputPaths1"))) + .willReturn(inputPaths1Hash) + given(contentHasher) + .hash(path: .value(try AbsolutePath(validating: "/inputFileListPaths1"))) + .willReturn(inputFileListPaths1) + given(contentHasher) + .hash(path: .value(try AbsolutePath(validating: "/dependencyFile1"))) + .willReturn(dependencyFileHash) + let targetScript = makeTargetScript() + + // When + _ = try subject.hash(targetScripts: [targetScript], sourceRootPath: "/") + + // Then + let expected = [ + inputPaths1Hash, + inputFileListPaths1, + dependencyFileHash, + "outputPaths1", + "outputFileListPaths1", + "1", + "tool1", + "pre", + "arg1", + "arg2", + ] + verify(contentHasher) + .hash(.value(expected)) + .called(1) + } + + func test_hash_targetAction_when_path_nil_callsMockHasherWithExpectedStrings() throws { + // Given + let inputPaths1Hash = "inputPaths1-hash" + let inputFileListPaths1 = "inputFileListPaths1-hash" + let dependencyFileHash = "dependencyFile1-hash" + given(contentHasher) + .hash(path: .value(try AbsolutePath(validating: "/inputPaths1"))) + .willReturn(inputPaths1Hash) + given(contentHasher) + .hash(path: .value(try AbsolutePath(validating: "/inputFileListPaths1"))) + .willReturn(inputFileListPaths1) + given(contentHasher) + .hash(path: .value(try AbsolutePath(validating: "/dependencyFile1"))) + .willReturn(dependencyFileHash) + + let targetScript = makeTargetScript() + + // When + _ = try subject.hash(targetScripts: [targetScript], sourceRootPath: "/") + + // Then + let expected = [ + inputPaths1Hash, + inputFileListPaths1, + dependencyFileHash, + "outputPaths1", + "outputFileListPaths1", + "1", + "tool1", + "pre", + "arg1", + "arg2", + ] + verify(contentHasher) + .hash(.value(expected)) + .called(1) + } + + func test_hash_targetAction_valuesAreNotHarcoded() throws { + // Given + let inputPaths2Hash = "inputPaths2-hash" + let inputFileListPaths2 = "inputFileListPaths2-hash" + let dependencyFileHash = "/dependencyFilePath4-hash" + given(contentHasher) + .hash(path: .value(try AbsolutePath(validating: "/inputPaths2"))) + .willReturn(inputPaths2Hash) + given(contentHasher) + .hash(path: .value(try AbsolutePath(validating: "/inputFileListPaths2"))) + .willReturn(inputFileListPaths2) + given(contentHasher) + .hash(path: .value(try AbsolutePath(validating: "/dependencyFilePath4"))) + .willReturn(dependencyFileHash) + + let targetScript = makeTargetScript( + name: "2", + order: .post, + tool: "tool2", + inputPaths: [try AbsolutePath(validating: "/inputPaths2")], + inputFileListPaths: [try AbsolutePath(validating: "/inputFileListPaths2")], + outputPaths: [try AbsolutePath(validating: "/outputPaths2")], + outputFileListPaths: [try AbsolutePath(validating: "/outputFileListPaths2")], + dependencyFile: try AbsolutePath(validating: "/dependencyFilePath4") + ) + + // When + _ = try subject.hash(targetScripts: [targetScript], sourceRootPath: "/") + + // Then + let expected = [ + inputPaths2Hash, + inputFileListPaths2, + dependencyFileHash, + "outputPaths2", + "outputFileListPaths2", + "2", + "tool2", + "post", + "arg1", + "arg2", + ] + verify(contentHasher) + .hash(.value(expected)) + .called(1) + } +} diff --git a/Tests/TuistKitAcceptanceTests/CacheAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/CacheAcceptanceTests.swift new file mode 100644 index 00000000000..ed871400eef --- /dev/null +++ b/Tests/TuistKitAcceptanceTests/CacheAcceptanceTests.swift @@ -0,0 +1,17 @@ +import Foundation +import TuistAcceptanceTesting + +final class CacheAcceptanceTestiOSAppWithFrameworks: TuistAcceptanceTestCase { + func test_ios_app_with_frameworks() async throws { + try setUpFixture(.iosAppWithFrameworks) + try await run(CacheCommand.self, "--print-hashes") + XCTAssertStandardOutput(pattern: """ + Framework1 - 31b5dd46503cc78a7d84514b3a59e462 + Framework2-iOS - 75676dc68658f4996630a6eb070f3072 + Framework2-macOS - 965232ae7d0ef41aa39a5556dae4dc50 + Framework3 - 8e0d6b1a1fc70c0b9f27c41e1b0669d5 + Framework4 - 3657f4ec388cc692d6f18ed906838d71 + Framework5 - daf3deb97fcd2aef89d7f417bdccac0b + """) + } +} diff --git a/Tests/TuistKitTests/Services/Cache/CachePrintHashesServiceTests.swift b/Tests/TuistKitTests/Services/Cache/CachePrintHashesServiceTests.swift new file mode 100644 index 00000000000..3bb8248f7b0 --- /dev/null +++ b/Tests/TuistKitTests/Services/Cache/CachePrintHashesServiceTests.swift @@ -0,0 +1,188 @@ +import Foundation +import Mockable +import MockableTest +import Path +import TuistCache +import TuistCore +import TuistLoader +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistKit + +final class CachePrintHashesServiceTests: TuistUnitTestCase { + var subject: CachePrintHashesService! + var generator: MockGenerator! + var generatorFactory: MockGeneratorFactorying! + var cacheGraphContentHasher: MockCacheGraphContentHashing! + var clock: Clock! + var path: String! + var configLoader: MockConfigLoading! + + override func setUp() { + super.setUp() + path = "/Test" + generatorFactory = MockGeneratorFactorying() + generator = MockGenerator() + given(generatorFactory) + .defaultGenerator(config: .any) + .willReturn(generator) + + cacheGraphContentHasher = MockCacheGraphContentHashing() + clock = StubClock() + + configLoader = .init() + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) + + subject = CachePrintHashesService( + generatorFactory: generatorFactory, + cacheGraphContentHasher: cacheGraphContentHasher, + clock: clock, + configLoader: configLoader + ) + } + + override func tearDown() { + generator = nil + cacheGraphContentHasher = nil + clock = nil + subject = nil + super.tearDown() + } + + func test_run_withFullPath_loads_the_graph() async throws { + // Given + subject = CachePrintHashesService( + generatorFactory: generatorFactory, + cacheGraphContentHasher: cacheGraphContentHasher, + clock: clock, + configLoader: configLoader + ) + let fullPath = FileHandler.shared.currentPath.pathString + "/full/path" + given(cacheGraphContentHasher) + .contentHashes(for: .any, configuration: .any, config: .any, excludedTargets: .any) + .willReturn([:]) + + // When + _ = try await subject.run(path: fullPath, configuration: nil) + + // Then + XCTAssertEqual(generator.invokedLoadParameterPath, try AbsolutePath(validating: fullPath)) + } + + func test_run_withoutPath_loads_the_graph() async throws { + // Given + subject = CachePrintHashesService( + generatorFactory: generatorFactory, + cacheGraphContentHasher: cacheGraphContentHasher, + clock: clock, + configLoader: configLoader + ) + given(cacheGraphContentHasher) + .contentHashes(for: .any, configuration: .any, config: .any, excludedTargets: .any) + .willReturn([:]) + + // When + _ = try await subject.run(path: nil, configuration: nil) + + // Then + XCTAssertEqual(generator.invokedLoadParameterPath, FileHandler.shared.currentPath) + } + + func test_run_withRelativePath__loads_the_graph() async throws { + // Given + subject = CachePrintHashesService( + generatorFactory: generatorFactory, + cacheGraphContentHasher: cacheGraphContentHasher, + clock: clock, + configLoader: configLoader + ) + given(cacheGraphContentHasher) + .contentHashes(for: .any, configuration: .any, config: .any, excludedTargets: .any) + .willReturn([:]) + + // When + _ = try await subject.run(path: "RelativePath", configuration: nil) + + // Then + XCTAssertEqual( + generator.invokedLoadParameterPath, + try AbsolutePath(validating: "RelativePath", relativeTo: FileHandler.shared.currentPath) + ) + } + + func test_run_loads_the_graph() async throws { + // Given + subject = CachePrintHashesService( + generatorFactory: generatorFactory, + cacheGraphContentHasher: cacheGraphContentHasher, + clock: clock, + configLoader: configLoader + ) + given(cacheGraphContentHasher) + .contentHashes(for: .any, configuration: .any, config: .any, excludedTargets: .any) + .willReturn([:]) + + // When + _ = try await subject.run(path: path, configuration: nil) + + // Then + XCTAssertEqual(generator.invokedLoadParameterPath, "/Test") + } + + func test_run_content_hasher_gets_correct_graph() async throws { + // Given + subject = CachePrintHashesService( + generatorFactory: generatorFactory, + cacheGraphContentHasher: cacheGraphContentHasher, + clock: clock, + configLoader: configLoader + ) + let graph = Graph.test() + generator.loadStub = { _ in graph } + + given(cacheGraphContentHasher) + .contentHashes(for: .value(graph), configuration: .any, config: .any, excludedTargets: .any) + .willReturn([:]) + + // When / Then + _ = try await subject.run(path: path, configuration: nil) + } + + func test_run_outputs_correct_hashes() async throws { + // Given + let target1 = GraphTarget.test(target: .test(name: "ShakiOne")) + let target2 = GraphTarget.test(target: .test(name: "ShakiTwo")) + given(cacheGraphContentHasher) + .contentHashes(for: .any, configuration: .any, config: .any, excludedTargets: .any) + .willReturn([target1: "hash1", target2: "hash2"]) + + subject = CachePrintHashesService( + generatorFactory: generatorFactory, + cacheGraphContentHasher: cacheGraphContentHasher, + clock: clock, + configLoader: configLoader + ) + + // When + _ = try await subject.run(path: path, configuration: nil) + + // Then + XCTAssertPrinterOutputContains("ShakiOne - hash1") + XCTAssertPrinterOutputContains("ShakiTwo - hash2") + } + + func test_run_gives_correct_configuration_type_to_hasher() async throws { + // Given + given(cacheGraphContentHasher) + .contentHashes(for: .any, configuration: .value("Debug"), config: .any, excludedTargets: .any) + .willReturn([:]) + + // When / Then + _ = try await subject.run(path: path, configuration: "Debug") + } +} diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index c5f22ea66cb..fc06be8385d 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -20,7 +20,7 @@ final class TestServiceTests: TuistUnitTestCase { private var xcodebuildController: MockXcodeBuildControlling! private var buildGraphInspector: MockBuildGraphInspecting! private var simulatorController: MockSimulatorController! - private var contentHasher: MockContentHasher! + private var contentHasher: MockContentHashing! private var testsCacheTemporaryDirectory: TemporaryDirectory! private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! private var configLoader: MockConfigLoading! @@ -50,9 +50,9 @@ final class TestServiceTests: TuistUnitTestCase { configLoader = .init() automationStorage = .init() - contentHasher.hashStub = { _ in - "hash" - } + given(contentHasher) + .hash(Parameter.any) + .willReturn("hash") given(buildGraphInspector) .buildArguments(project: .any, target: .any, configuration: .any, skipSigning: .any) diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift index b37c161cdef..ec38e879510 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/SwiftPackageManagerModuleMapGeneratorTests.swift @@ -1,18 +1,24 @@ +import MockableTest import Path +import TuistCore import TuistCoreTesting import TuistSupportTesting import XCTest @testable import TuistLoader -class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { +final class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { private var subject: SwiftPackageManagerModuleMapGenerator! - private var hasher: MockContentHasher! + private var contentHasher: MockContentHashing! override func setUp() { super.setUp() - hasher = MockContentHasher() - subject = SwiftPackageManagerModuleMapGenerator(contentHasher: hasher) + contentHasher = MockContentHashing() + subject = SwiftPackageManagerModuleMapGenerator(contentHasher: contentHasher) + + given(contentHasher) + .hash(Parameter.any) + .willProduce { $0 } } override func tearDown() { @@ -94,6 +100,13 @@ class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { XCTAssertEqual(path, "/Absolute/PackageDir/Derived/Module.modulemap") XCTAssertTrue(atomically) } + + var hash: String? = nil + + given(contentHasher) + .hash(path: .any) + .willProduce { hash ?? $0.pathString } + let got = try subject.generate( packageDirectory: "/Absolute/PackageDir", moduleName: "Module", @@ -101,8 +114,8 @@ class SwiftPackageManagerModuleMapGeneratorTests: TuistTestCase { ) // Set hasher for path on disk - hasher.stubHashForPath["/Absolute/PackageDir/Derived/Module.modulemap"] = try hasher - .hash(expectedContent(for: moduleMap) ?? "") + hash = expectedContent(for: moduleMap) + // generate a 2nd time to validate that we dont write content that is already on disk let _ = try subject.generate( packageDirectory: "/Absolute/PackageDir", diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index 129dd8d8d4b..f69fa46a5c6 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -21,6 +21,8 @@ public enum Module: String, CaseIterable { case dependencies = "TuistDependencies" case automation = "TuistAutomation" case server = "TuistServer" + case hasher = "TuistHasher" + case cache = "TuistCache" public var isRunnable: Bool { switch self { @@ -127,7 +129,7 @@ public enum Module: String, CaseIterable { public var testingTargetName: String? { switch self { case .tuist, .tuistBenchmark, .tuistFixtureGenerator, .kit, .projectAutomation, .projectDescription, .analytics, - .dependencies, .acceptanceTesting, .server: + .dependencies, .acceptanceTesting, .server, .hasher, .cache: return nil default: return "\(rawValue)Testing" @@ -148,7 +150,7 @@ public enum Module: String, CaseIterable { switch self { case .tuist, .tuistBenchmark, .tuistFixtureGenerator, .projectAutomation, .projectDescription, .asyncQueue, - .plugin, .analytics, .dependencies, .acceptanceTesting, .server: + .plugin, .analytics, .dependencies, .acceptanceTesting, .server, .hasher: return nil default: return "\(rawValue)IntegrationTests" @@ -252,6 +254,7 @@ public enum Module: String, CaseIterable { .target(name: Module.asyncQueue.targetName), .target(name: Module.analytics.targetName), .target(name: Module.plugin.targetName), + .target(name: Module.cache.targetName), .external(name: "FileSystem"), .external(name: "SwiftToolsSupport"), .external(name: "XcodeGraph"), @@ -359,6 +362,19 @@ public enum Module: String, CaseIterable { .external(name: "OpenAPIRuntime"), .external(name: "OpenAPIURLSession"), ] + case .hasher: + [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), + .external(name: "XcodeGraph"), + ] + case .cache: + [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), + .target(name: Module.hasher.targetName), + .external(name: "XcodeGraph"), + ] } if self != .projectDescription, self != .projectAutomation { dependencies.append(contentsOf: sharedDependencies) @@ -460,6 +476,14 @@ public enum Module: String, CaseIterable { .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), ] + case .hasher: + [ + .target(name: Module.support.testingTargetName!), + ] + case .cache: + [ + .target(name: Module.support.testingTargetName!), + ] } dependencies = dependencies + sharedDependencies + [.target(name: targetName), .external(name: "MockableTest")] if let testingTargetName { @@ -470,14 +494,13 @@ public enum Module: String, CaseIterable { public var testingDependencies: [TargetDependency] { let dependencies: [TargetDependency] = switch self { - case .tuist, .projectAutomation, .projectDescription, .acceptanceTesting: + case .tuist, .projectAutomation, .projectDescription, .acceptanceTesting, .server, .hasher, .asyncQueue, .analytics, + .migration, .tuistFixtureGenerator, .cache: [] case .tuistBenchmark: [ .external(name: "ArgumentParser"), ] - case .tuistFixtureGenerator: - [] case .support: [ .target(name: Module.core.targetName), @@ -508,18 +531,10 @@ public enum Module: String, CaseIterable { .target(name: Module.support.testingTargetName!), .external(name: "XcodeGraph"), ] - case .asyncQueue: - [ - ] case .plugin: [ .external(name: "XcodeGraph"), ] - case .analytics: - [] - case .migration: - [ - ] case .dependencies: [ .target(name: Module.projectDescription.targetName), @@ -531,15 +546,14 @@ public enum Module: String, CaseIterable { .target(name: Module.projectDescription.targetName), .target(name: Module.support.testingTargetName!), ] - case .server: - [] } return dependencies + sharedDependencies + [.target(name: targetName)] } public var integrationTestsDependencies: [TargetDependency] { var dependencies: [TargetDependency] = switch self { - case .tuistBenchmark, .tuistFixtureGenerator, .support, .projectAutomation, .projectDescription, .acceptanceTesting: + case .tuistBenchmark, .tuistFixtureGenerator, .support, .projectAutomation, .projectDescription, .acceptanceTesting, + .asyncQueue, .plugin, .analytics, .dependencies, .server, .hasher, .cache: [] case .tuist: [ @@ -580,25 +594,15 @@ public enum Module: String, CaseIterable { .target(name: Module.support.testingTargetName!), .target(name: Module.projectDescription.targetName), ] - case .asyncQueue: - [] - case .plugin: - [] - case .analytics: - [] case .migration: [ .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), ] - case .dependencies: - [] case .automation: [ .target(name: Module.support.testingTargetName!), ] - case .server: - [] } dependencies.append(contentsOf: sharedDependencies) dependencies.append(.target(name: targetName)) From 801d676e41fca130f223769b87e2c4dc7a530e83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Thu, 25 Jul 2024 18:08:12 +0200 Subject: [PATCH 454/509] Point to the code of conduct in the handbook (#6542) --- CODE_OF_CONDUCT.md | 77 ++-------------------------------------------- 1 file changed, 2 insertions(+), 75 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index bba94f2e3d1..198832b7974 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,76 +1,3 @@ -# Contributor Covenant Code of Conduct +# Code of conduct -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or - advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at contact@tuist.io. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq +The code of conduct is available in [Tuist's handbook](https://handbook.tuist.io/people/code-of-conduct.html). \ No newline at end of file From c85b9ebf2e08cc71001754bf7eba68108e3d7b11 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 25 Jul 2024 18:52:31 +0200 Subject: [PATCH 455/509] Fix the header design --- assets/header.jpg | Bin 129976 -> 129449 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/header.jpg b/assets/header.jpg index b16739d4fa9aea9dbf8e362e3f982180cc16c2ae..58e637b8f49a1c2742a21e96e048219826f2dd5f 100644 GIT binary patch delta 20959 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

    |{^KyI%Y@L&QFOf2$rE= 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 +Acx2Lj3zgx_ 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 DB`P6a literal 0 HcmV?d00001 diff --git a/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png b/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..37713e854ed052312b50807f8f66678dd8b95972 GIT binary patch literal 7502 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 literal 0 HcmV?d00001 diff --git a/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512.png b/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..4808645b309fc8e1a2c4d27ea0e199b0832bcb6a GIT binary patch literal 301803 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

    |{^KyI%Y@L&QFOf2$rE= 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 +Acx2Lj3zgx_ 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

    Vnz+ML-@2MZ*<}K?0=cjG1m}*ad%wE zEme64`~5!TY+?Txun$J;!Pvjmm_dr%XM#B5mw0al`(bd0vi)R z({);h$@=)|lb@S^LiLeK7p{$--UoSTSB-F*%nmKb{moZCoxHd-{x_^2i#LJo`#$1x-;bV1eD}mIr=J@^7tDTXqFJ2H~Mu#&y%+AkWb#K zhMf%7RC?OGPgV9m5!*TYwO$xpZNnany&ErGBb?K~m7AZqp9=y`*?g9*4(m02o)h2r z9<=0Xi%aa8qGh`hx4IjGYwa7<4Cn(H+dB?On_0Cxr=Z0s+_}a=GrRx47@YjST z03Sc6?~519D|9cd2!_0XIQH#?)spo~|H4FB2Sz(d!vJ8 zaYY*J>{-p+w$VcD?p`bSmC+MlZ!RE;dnBFV?!5Z1d}X@$>6m)p^ux-{H;?nyS~$}j zM!w;q!tRetmTXrA`MG>E*eGBVggqQFtxaY#T*TPpq;eI!6XU1$Svu>+C~vFXl#BDj zAR`9ckY?HPnwO4ROM*-MstJ;OWw|ML;S%NW7orzC@?*xjbIg6Mzssc2$;l+gBsIQr z)UY9mw>7(H!{DiRLLR*s;#CvftO}qFOq)TM?-00s(|_{jN&fn5Lu!v8tEg(xvn1G_ zd$cl!Q_A9`q6fR8thJj)Rx0oIZ+U_ZLwIRpODbm$69qA2Dwp5GRKhlVHcc^4q+T{X zNaut$jpP(fG9L~~V+!iPc|Mqzd&|X=Y4O#5>#FtNiW{unG=Klp@WAI>1G*Hh=>)7@ zR$cxj9T(hr9he-j6lAzb=TT?U82Pxq?|Z=10`t!rrb~c~rGz79;@Q$h*1 zU-1PCuX~V~FnJ2*>$ldIU?*{(f(nunkMGhA2cM>V5a^BhL6g2XwmV6)diE$ma>rpU zDUoUM_+@P6fYd|Poi|O97fuBH_B^bz+Lr%7_nAe4`;&UlHMr;w;LWjC|K+;}pt=1p z@2QDSf_XRIE-l8v=^3mK>F;I-7;&#u(fcabS61L7R{tuP<^x;@Ii&?q`JP^x-rEgV z!QJw8Y(7ntiX0#Yvd>&4Z}>JjpLB`=%g)tyka>&rk}E23ag42nG_)(-^!Ql+)1T8- zh(&2@!{$FPRc;9%WqmG_oTyQ+smpZ3icaTC(bMXyaPq&N|JZwFoAH4lRtzQwxm+B4AU(;(a;Nl^ApM?jede}=l1??V=F?evF{a=<-Zt;wT^!+NrWW{Sy z*t^jLW3}z4ym#U)MTQAMNo`YSPwR)n$LQK`x@K}OR>*W8AUdWTI ze}1lVl0q>5@*zF+6s7;{;lBqpXlP3^xtzB*EcgpA!LMwv$e{bTp6aaq)#tx$mI>|c zEJ&+Vw2l(_0$+un(J5Tnf`v(8GQOuEEumi|`TaTFYx2;B@e0;_Y5Tpy2tTyLVYa_hSbbTXtC@s`pxc1b}|au9yM?Ch&t^m z0j7F80neWMiq6<*TuGtH1n+VyzY$5h0Pp!Nm>@DV&Kt<)3LO`&&tZzc-drp+quXDT zp;$hfA3-y@-Y$8L)I04F&(?`cEjR9rq0IpfuAejYDiJnHoe)35&il@Ionf?nV8h7S zBU6%&OK9+HHR$@+>Kvx!apie!8GaGJ2`(!c9tl2eCU*Dya*>~xYAR=2Uom;9$c1`C z#Zy%!&4c7hzI_nDkQd8!Ya0m?hXN1%=YE&}RGaHC{4xIN$xN}WM#vZ>GX@l=@%DzccEAy&e{d#9w|=h)PDSEAuZnaCXZ-axVRO@TnI zJkt!ZcMWV(r0Dj30^U{K7 z2s8#i$zs8AnvWRDQ8%wV=3VXR9kZE!ts0rWB1_>rRudr!l++FJ?F{Sspd5#0hJ7B^ zkK;tm{IbCUKzIU25a3J5HX&;`N}VzzSK~PW3~uJK91r8*KT@8}YOv-F*cr_D`83Zj z!(SAbpM*Q();~>!m=7)Z%|29JabB77-Sx*cd1`zrv6oz$M479?`W|p1-uhGm=Nw4Z zIlVXR(kf-SLZACK@!zklLO1lgk}6Iejt7~GdrZu+0C^==*ZRDU&5Ak9%erc(aUZV_ zX>uXEQ5o-diTWD+kNc8W>!;pj=KnWW$=tBcI%HW~6juU_)@2XkxVAgxmklbUP{{(V z(w-Os|6@(D(;vJ^t0_MCP`!pd!popubO)@_^5jPec@_JKNoaa;e-X5FF0^ZDXxfSf z)imuzTEI(!Y=eWqa$cC!LRkx)x$iS=yh^0nbyOsWf|So$+%Sf*ho>Y+ezxa`Dkh}8 zlp3(UKD6*wlR6mrb7ljEN{~}s9IOD5UJpIOkDsB0LkfrJ6cEaK6wlBhvjq!$9Jih4 zvU>B+Kwsql-p#HjRQC~GSnBNmaiZY9E;IcCfexfbkJBdzDuU|EEDI~XnXe}FIVW_* z=OZT_uJX#UccLAQw;Px<`HpT2b+y<@qB84DIBjV^|YEM-5x${my*xB_`<`ue9r zUn0jhOUAzEoB>GZg$hoOl4*?`(M0#iDWqB3OYf{NdL1HE6bu6 zRK#BA`y$}m`fvR|77{mNuafa({((|kad-pkREZF{g|s$zC<`R*9(Ia3_|83*Q}W!I z#e`;@?-b}L|My1F;}x=G_=ySb95PWUZ=B8VFX)9)sLUPNx%9&DF81eQt#p9C#X?&` zG@TNR2OM^m&CpO&>85DU9T~4vZZpPd-e4ztj@}q4+#T7_`a@e94io^_2?&nRQ~ z;X_U--=X!PRr;pYr7|a3sux#L!9NG;{aV8_3zZ+T0ejgZSPdyZ-H<(XJ(qIVPwE=* zmrUOd!$SF}m()b(cJIA(c2Wj3%u1*}07koS@lth8KOfb-=5?7R2tGb=c2}Dj=&bn; zUVZ;)T^CN&q8gca|3P@DyQx?omA5Zj zVEoNCir0K65Q(vm!rYeVWITHof^qUR5v|S?ce2`%1?cGlfNw74t0oJPU-yqj3F}8Z zvI4{H)x=Y0e{5}}dNz&{^qscbe6!IB!q~{#EO>K#^7dn;TGXUl@w(rP$CgNu&Z;K& zaK40O&Kkt}A1VJvy!2?ZdJn;sxcw6_6QM$G`-fPOtyTcl8!LT*=@xp*JS^<+weCY#mY*fNH8dSX$>ed$V|mS!L$u|7M7v1T@e*e|ZKuk+U_Q+2-aP za#NPdlzyXPkkK_+=)q9R-aPgNqPPz+M1R5R;h7~~{DPnVG(u5bbtJsxAM%KR#&akCoY{YwZC`%u>Z6VNHPl>0dvh9aLpw#wh)zpQExa(C=Q$CH(AE^Iv|s7Rug{E94{)*c^1H z9yCoLsRtbdE*ZlD#()vNCJ7+856-Ur8gw5C|uehz+zlG1_zszpg z999%dU}(#$;G`jZE}oMe@tPq!OtGjg@m&_rdb zlecBZum;Obqg7Mq=Ul-fF1W3V zEzM2czf-AWgI$)yy-#Jf^wq|u8%l{Fef0d_voRr3PCJhOYKrD_t~@50@MM}bEHVuL z+K0KC(^+^e8^xdTRw5U-h~YQ1P-2nI5?^NuPO~{Dm9fBkyq);UV>O(vn&PVbcii~(EVWk154OUMxTzKNAXIxiw-p>os@^(`?Jt8=Q^}rr)4y(m{cUWQh zufPjMUA4FkUycS>efkuzTTz)S~NTzN;@D9?c)k}^;**kecW&9C|IOgkEk=N39ThQI9iq~JvKBE(y=$nd!(kj|0{xXW18QVqL(;hBN4ddm| zn8tzogB66c5qBE$BdTIOnjq}c9HAguJntByPz^87%LcpwU#?T2cpUxn&qa@Vn0<&Djde-TxRG5z0hnO7`u_L z6<#7!eKx{Qy~{?%ujJvA`K;3Er_npMItyda33nZJvOtbBOS}0b`KyZ8a#BF^S|Z2i zvMX1Woglddtb%V9y;lJQLY*3pwV*&hOPn7s>q68UL0XR# zCh*{{x8!Cojq4OM0U7Q7JQKF6!t^wdgXwp&m{3SLD!BYZd)h-wlFNlOPb`NE!e>1j zv0YH+bb6WOIrG>)qKp&NYxbwiOK5NEr8}yh_e4_!$~Ca<49oZ0`5dR>{zgC`2&;0) zfOX*+KEXU5(DQ}HKhEX+mlF}Ixmd67+^cf%6=nl=F1fr}p(K^zM5phM4SMM>-+kVF zJ1>pDGt3 zo6(CkXH6~C8kw+`hOz(Eyc%joq=jycD4oDq7 z>a3H?(}Ta*MSs?W<=PaPk~anFoTl2`fb3aT8NFfb!7@B~^d&LMZSKW?9K}Hk2kIdk zD`hbgALPIS;;NS2nm^@J$JIR~1s}Q2@i*_xA8MbueqQi@=F8a0e4Y8~3Y`YcDFJBo zb);QPcX%pE;&Z&^@$Ny+`8Nr0I04cI&pH;Hm~ctC-c}(Ex<`sZ6q&IxReAfb&r*1w zTE73;dFjRrS5awcX;BM3(XVd`9Y1J|zd!AGqi4XYdG=QSU6e`6`%7#VmI>}xdA=CE z)qAt9wD!pCl5OokQ2h|;z{|H8fo?!7o%qn7A(blzXIh$$OopiblNFN|C&YR@&N_-TCS56&5puWRl5FXNG(2aI<0Z7Ao1E@Zu(+nYnV(j?(PU$>A+ zk(jAN=~GID7aDg1DK|0u<5mlPccEi7?XjuqeX$v6O*xQ>4%H|-P2V#n2`?6UAV*m!uO48>A%@9 zu2Z^cuJd~b^7F^*D@JpDnY6b%KXidw+`+Pty-ShWlXA(zsLv%CP&r~nYV8NS9#dX< z{Be1aoCQLv=zxwIiGtu~K~qBfkyRSUaO^wtk&E&kwyOp~GqqH2p?7Sb1Y1{jrevKI zFH5ydmwnsy!wTU3e^=$y4!5SVJ@+ZU`!d{RF;14U|MG=L>iL;ua6Xmw8qaFG6KN)0~%71 zx80@c`$i2EOKxtso4Jv0t&K^_U97i`RW(-wRef1RxX)TEz#Gg=m7xodwZa z)$PNnLTLBap=fU_tAk5xe#gb|;g5@dqRWzXG2tZwfB!MG#(MTT7GPJ0npl(xPnNrw zX~UOYz%mIjYu(+|OdcM*mn$c5&skHaxF~`P+7?w1#5_e4s#L6cG`$0gVM%U5Eu8ya z?sjul-;ivLT_rlCv>$@iW#?B(3r_|t4lxyVI79|N*=U^$I3b=>r5Q4} zEGGgb-K^yg==o>+ELvxCRdo)J7w)++ly z=P&Pm|LLKBkVn;bF|o~NHTvx@#$5SH~(ik-FJHL zkcXdfQU5}4u(pN6Qj=Q$p*(Tl`Dih4Xv?1Kx`&w0>Q7L2wUy1M%W%pgfa2+YbgQP# z$(jwXq@8Wv4Ne`*2n>>yhymHoRAyh?oerrWcZp=InHbfTEH^}Im-82wdlI~V1R$tQ ze$U0!>2m$CxnGHVf$Mf1^3}3|bu+=&)_QPaHzr0PbE=0xmMb=C7LG>~ahpD#w z&$$$zh43t)PhEo}*`l;*#ux19-8W55$)Qbhk?xyRCuQ4;t9!41PBm_RKr#^@Mnr%J zZvj`y^vDwGEJsH04unb^Lxxb014F<7wmTPDAu^?1>r*1WQD^!ko%{s57e7?ovR&;I zPM--Kj>?s#sE+q`^^VAj#k^U5o_j*J=YBPP1yZ(YdObLGbrJ=!Ys33+!CeQ%#WTJJ zk+ULnbX5+gf7D&N6<4)#V zey+>pB;Ju_ejupnP@#Qolpp!{KA2klM6s$!@GaU!Y&?&3VTNC#Cg)IETVa{o9=7sP zw$)_oL%Q!WILe1@JL^xUY50@+-Y!eMb?sD&E}|y(Pvw zFi=#P!wlj*F2}WU92P?@*Xzc7gFEz*XD5(!;>$Dk+q+-#UKF;1Qu}raJJ@wR<&`M` zQ8J3I%OkNocN+wv3N_;;RK!0isZUim&iBqmT4UooRprhTQYcw(P3JF-6t%5c{zd$2 z{#mz*exHoD`66N_e#!>pC1x>IGvb=gIx)b02mjCVe$i~VBRrcA*nczs_T+^2E*!q! z%gg~bGpBW#W>^ke7%z+4zUzZ9tx(Y6U`=NysSMAwa;1_+Hv?py+m)z#!kmDiK`rTB zPhUpAuHabFzrket9n6OydylJ@RN7A|fm0vD0CGEAFwe^zs*Rb ziZ`{c)>QMQjK_w6YpchqQC>!-E-p^Mxkzdg<(dU&$;f{r*OkeRiMaPeh@vqIDyOhy z`?Zq-4!FRYGY7gHyiv|nA$Ktc(l54A(Bjo0Ajqw`h%-l&Mzck4R5Wrqc(`H;&!#fO znaD-rk{J_p0}~xO+CWwQ2lMeS<^Lo4mx>T}-W? z6~9s@`u1CC9mA*a^$>$38Fju$-1 zmS=f02O8TG&hRXQcAi$X%7Z#v>Uu;u7NeKC9WLwU7wtgY3Le8Z)a?iY1?b_}fzr4T zo279Ri~$gRYg4%C@PnKTYvgexfMe;cw^KqNj7}BeIsL!UXY31l{3Yn0*|w zk{!vxS8y~-($jJ4YyV{4RILp^Z(9CV9NkmiV}u(sF#1&vt+d_{R)y}4`~_>_gWZJ{ z_LVp+#3Oj-)-;90OPYKdt2y$|FTs;4hTuq9Y3?~@LGNQAF?$1Q*I}BvPj4?s=i0wP z=wo#7uh*}DsmB}7_yEE>#Hy==>)Hz0r2O*@@!nPy+?j*a0-A=4{iymjau9RXzoeWXCj)itl_mS9pZbW3 zzW<~8u_cjB_`LNR%7S}_?`}`A6DDtnF`2dya$T`|e*G42CBTo?D>Q6!UMTy!^uJc- zeSk<2x)C-vEg+O{YKF!X0~{5F%wrUc>eMr)3EQqGw>bP5a1%_0HYXGO^Fm=$XR1|l zs86O#Qi8SoOyVNbP8^!pA7(gd!J zG3*{9Hrfy@6)LZpXnJRZVx6z;F6&w2@$VAr$~lbHi$iroSS5t|h~=Ri_Nzec7}Yvy zVKp`7v(qI-l*GqNphB&G_Irts-QPmzoaK|go)YWk@u zlCduZ;0ZL&zM{>b${p?t8dCB2_?JbY60`FBY!B+<7Q%&}ELuhmpy+D`xtHxOx zL+sCr($zsI$Q&GE_ZGkp3?J#fl!2KcI_!R>n(anLPP4mx_nr(*m*FhHaa2| zGR*OU^owB?1JK3o7APxfq?yTb^p%0&Z`CKmj)FVF*+p1F)eyUzMiXt4`=3?5b1NG) z*2x3^BPY!twBTrgx=pVKr}B*}LjFC`Lh|3#ald&ZgeHPJ=Vj7(nNE zeLO@3M*}8_U0)Xyz66y4GLX;VIu581Vl?iw9udB8Erl?;;8zw{O56#Sk}y4LSFPPD zZt1iTE#oaJp*ldQZD*v-gXExa_KAU;AP*(OrSOk&j?W!Y={is|w}0l{mQFQUVeN&r z4lVIV0&;ZWk|~;gf}8_Io`os35LE#?tGk!LVBDqm%6#WU_wCizv(HPxSQ3t!rL|s? zm?Zadm1T7v8+X$;j=|yDM@Fu&!R?xO=~Cdq9$M#Yxxf_>ylp-a61SVhGP{0vXS;BL zV0_qTs;cyQx_6izqpbLnWBv|SARfsg!W*U6VzQFI+`uB1tPuZ-lVO(J`-XxoOt(n- z$!}pBJ{KN~K8ca=i(S)GSBQ0W=~kbW(sXi7ud+MPU>b<#N6)%kF+LPnn9XE)Jtp_4 zzodEr@h42aJePO(?nBg$7_?OqTy92rce4E@V@>>6=Fvis147+MDBOuPaY*`>GTB7} z)K{UvNK9l{N>YQRKLQ)B*I-lLZhEa*;^J~DRC-)OSqb7ZhOjP?4l@-rp?*RaemEgK zm6aF(zA_!Y#S-JtI_&-B0k*gA7(M6*kpf=2?pMLNo+ z@`5*h9c{~6Su@$$YMwp0#fE8ps2%9VEk8W6mJX5JP}8_2KI=9)G{+e1-nv((Iwpm1 zh}WD(az950H(-+=59f_pczx_h7LePxrh8JYSnZT7I{|?f{j1^>klPKv*C4Uip3Kev zEzK%0SKP!CeV>fND^M?v6F;?-=ld3x(xn`%~4PM0bH8`juu z6)n|(3A;7y=FsK0|GE~NH>QS(;$;<=84K zzfTR;*oh6Ie6;OtG3#f+h$|9!0N1tBf^8%aD&K}f<+(0&evXo9#WU(iDoVPxMQINh zo7tABQ5vObAKScLcUiY8Q5IW4_inQs5@0|$e~r8Y`-U_Q=}|NO(zGj|Y9IWeW-wf= zj&!o}Fyp!SJLyPNFfgMCsx_?AUURWgWUt}E@&FP;@B;`rv>AgA?j1^8D%IF^cxGim ztsnH+%-`ydbt0E_uUAd??!5AR_Gbuz4M}F0zqj0UIQu0E#mU{)^2@=+BKm`MedqdN z*8@#m;5?&E=<(D!o-Qt1m%lzNXKmWc_5$ z`hDCyRp&$n%Qp?5dY(!EyKyMBrM-+I+iX^J7&*EEV|YZ|QTI?>Joe8VU9`KWr{)#C zM(RbDT>U!uEs{Ct76U2VxaKp`P%|2V2;OuE*(2dL6GL^66Qp)gpH<0F$V+$ZE* z@Y)(i_~c)3=WoN+hmRBm&A@J*_Zv)p8!NLG^*AJQW9h$Zl#%vG9|9Jk&r+1q^Cz`hRbku#T z9OR^#j&5)gU#r&me5>9M^LkT~W>5S%+2v3B+z~q-2IxJ!&ED?rxcsSDl`pw|lD#8< z7W%Gr_l5XdzEb(+0sUhvwy&=vzHdWv_@nP zGkaBcIfI(wZq;W6p)pZb#^m<83x7glkz42_Xcr40dwg()1FgsKT%l zU!A3SxY1@P`s<_laO?=q#5tlx26=ErLoi_Xqkbn^>xV~k?T!>yGvc8^v8sh1I;O37 zAYI&z+;IB0gD4d6&RcZu(_G^Vb=;3Z?~uL94;kB)D#f5Ubn)u(0~=g*Aq@iqqW|UrYDq|&((2sTLTJqW zK|`GbQ*~s=;&u{u%7l~E5%l~*!%s8()@*LLdUq+Sp!G>?32RXpPNxBJSN1hmyuae% zl?WYi?u_OB3ZIgJ3BtSFD$tV|c3PjoBFj|Dl&h)5jow5}Q-%Sdia z3)o1>(EtAE7bp|@&(;Z{bO7I#xEeOY(q%EvmVf*xlSPv>B5=ZJP}U<0svYtZ$A!f@ zisf}gBu;aHbrrt_md9DGall7J9vS)w&3F2r(l=8dDlt||XX*f63H2igIf^-kvRpz- zB7;3^`O$+?X%IXd3ZFUphhoIxz46&IJ#3q)bI~ERwd*opW_s)hFQsvozDh(e#Oz5) zMfAM<#rWjHmEmULMoe!K^tO(eoTtkVXyYh>V%6P)Wywk}S@#DDEU0~BXnX19 z&8DM_V0^@45M{Q7;7ip11oEJq4xN4Qq#JB;VY6uDa9yvfFH4e(i;XYd)$ze$)n4tB zqoctUe`MAYj@5`J_-T7N`T=RmJ z$%~@GU^#SLm#jb9;B(-yI1WHv1p1@5^Z{btabI5WE2gdYbH{Y%?ymXdmRSESp*`vV z2Ay~!A(VdIp=4^?eR0@WVtirze7q%>>jvUCm;Nia*>&S^iQEy-kh^~#Msh?9z$X$U0!$dn^v{Tx1 zfF*dh4fY0GqZGfQqS%t)OwD)QDl9gn{kgo)t>ww%=g$a{ey2*8^`yDC)D4Mpm;Ej< z>m*|6)T%1lF1_1FC;X2%iQ2Sw+CHzsOUB-k@a@9tL&r1Yxp71yre~TX_|4^rwvakMm4iSH(@)JUxEh)>@DelIZ1ow?OL-|n_z76n5 z0W^t|{zqip=qh^JNJZEugDhYlOp&?u|5*TVe(&OIbMVuDpu-vRQ`L;Mj^Ud`v)v!c zDi_g9fTFK}jG^pU8$V3lvN{Bs82MU>qpWjreyd5=huJJ71Dg*>f=9{;JMU*Ha(l0K z>oR1Iq==YW3q54I?*(dJL-*L1R7rm;SsUe1*3w>&9=hF5J{N;kV6;Hezk!28JnaZW z(ekAbtEaGgDl!VTA?4FgC)u+UiQU|3hCRte)qC!CQ&JygtJN5yojCugjm2}B|NGrP z76C5~M=cvw{#Kj)tU!JiWxsMRaaKcxbh&cbZx){Ryp;D+?|xcmi8y_1o7S-9v`ZAH zg9Pn34C*ol51s7?AxlE$=5&Qmmo;=+R^(~U`|c>%2{Cwc#ZzBI=8G5jdRDiu6DJT0 zbKqV5n$%j>HZ7sjRXvr^O&f7>{Ox+MtX~=RPIvQuC@g5##xwXRI?W$@M>l(Y>!xt& zzj(2;^|Y4bonYcJF?%ViyixI|&vtKZKU3M>5{ zq_lSDuTGygSH7i~)M0#wUV-dZsnHYOtwgMs(mGdI?0UBBo9is5zm!{js)`?VI-|PP zj8Cze}1gT zkO|!>plu$BdR$G^v;d_^G`;?l3R()XVajDq;WhFQxtGiA?Q&JfTI5%hnaKzyV>dD6 z8g9BWwJxlri%|*gK4N@2!MrEvZ>wuebv~Pg@DZ7$6axRl2nd)Dn+c$jDebsGa8=PE zHC0+clbfCLV|u*WYhrG^f+J&g0&8nc2(*B@J*;~6mXXQ4wx2&r!4g3vo~*-LqqN&) zSv91v%Xnd4dp!e$Ik8*B(okU#jM3)LyFciwyQrBe@y)!!C*ytPP^BN6DuPS^W?wxZ{GVs!~GT`DMtdUS8Ep`6`IdpQl_g_|oV-AH;EXx2=E{3~4Yh2bzyPVdfms;%qg%#_YMh?{3@i`EG2CbG#0vtU2xgf4BBkpq+@jie7Gj`wE>1vR<6e zX*quMUX*e^v52Ly2q_B z98>6kAqaa#NRwOj(F~j5!R$ndip%y0!T-$PEhlg{9M{8>X0i;LKcM65FM;C4V6_w7 z%|tz$_Y=_X0NC_Y^+BQyzkjD&wv}Xd;5)sBh5rQc4r{SNQ204XJ0EEYN{a;TLz8T=KE1RliM7H+qu6jbbk1?Hl>tBK8reFRYTMUCX)`s2M zsf|nGmG|^?N__CAs(J{5|D-R;TgB%>G(x(_kM6=J?L!p1DR4;RnW<%I2_1s7e&sIAT5*lr?3 zmk5KJcFciLir5lWx8gEBYmEDBQ>v%^sZdo2X)PsY&^8Yl!j*COfhj;}`)-M?%4J=p z{eDcVMUL}6%aiLqq%VUNx(0DbF68vD{F3j{4$X~eENB0&)dIYs{o&{* zY`ItH9O`~q+&B9VkAHj58xt}<8K8G={#o0z%??W%bnzay9QzWX>|px6rMCdX=`v@8s|MKDW6z{7Kb1+D!JppOtaHAMCsWpaw(k zQ}OCU3^#acMaAPLbUurV&tY3fU+>LciB8O|{)>I_z0DGg98f_DPbhK#0&kVaE1V|D znbjxn>DVjz&)1vJ2xgudt1g$rFBk0M&S9^9W9Cn);W zG3)H0)@4W1dhNEi)|#B+75$N=iDPhU=}^EgVyzkT=GMBV49V&5th+7yw%?P+1AiY- z$Zi*p@pZ2mYp^VN(559d!4Uh&P9J;1!sX~XVJfo-Dg*hp5 z4fnq)CccTFlucdmFr`Y@9|5N03MtD@_e=mZ5%g0rl>tmLSnKj2$s|5SLZOaei1^XZ z3}6Ab`Nj~1;S8Xpot!vQX2gg#LKp`|1K#D7iug-epzDhce@F66!a7{tp1Bt0lqpT? z&cBp8aOPxg66&j44F|j0(@R6$_S|}b7u;luJo)FRova$g&bw&y}y7B>TDk!Ugc5q z=?MJ05T7C*==0?fNC&aX%Wn*wjPZ`#wji{}eylK7|B>+ZgZJO>aX@3uS z7((x){}-|%)%D|*$lJY+KAH5==Dj|uLB_VaDyjJt2?*SdN(-Fdn1fTwq))R(&-z)C z39q4GXmrFZZ=#FWjctThBn=~X(1RUyKM3MF$?w9oLuYi)y2>JHLeHi}-}uAG$u%W6oJ7gXhR(p9J|wCzrhhOO!@+&-~j z@Vj;FmD=t<8QC=(^oR5|;^<+Z<25ZQnzXm)l>uhgWk|!3HV2sW-8!5Si^G05y*4-E zk*mZ~E+1{>nG-iN(zuk(Mqi(f=xZ4adA9OWzj*dZo19V2_=MIa4Cr^%_WHNED}33G zQHBYY9MbzkM#-DUIi}G2_tG~$@uOaiiQ8|M?u|FfjPAwPdWV0x@(nUOtJU59LUg-& z?~KK*=zLqrr|mp(ygzWcQ`_&uY-@Eto*%vhFy4ov;8^vc8UG`Nl6j#(pu4MSW_BQP zXpx+{3_Db-l$*j(yV1bzn;Zkxi9F>pbE%)lJ9`1B#q|bv?<$~5Z=8S?8@vDI0AR6z zHj3+4joxX*E$mH&j@J#dlXPwpp=S=vL>D`_0pce4o7ppf>9{Je`PiU0C zRfdCS%jy%yWoBTR9sJ(Of+HiaCR%^&OOCoy#Z=MJ@JW%zK=a>T%`z5*MJkKz2|n7E zlm=k!E%r}$j@sVs1OsU%DbqiDO9iBvw#WeAkUUuRsm|VUDRbK9G4IJ#+uK7OAy1K@ znfJddfhu^2sRP{8TqSaf!kl)VSW?${P`{g@EwQuboTVrqJ7Sxdb zHqcGGTv^;Js2ac#+V&EQc|o8+q&N zfN-2i6G41WyqI3MqKlXw_L5DtQ*kY+Hp{X%W04^Z+|_viv~;y%P0y=VylOro^MNRW zTehHzt~IV2)d@Zg!;;QvKX2%MAQ_{Nx}`{qU2>&HZU2@&Wr4l$RWofq#=1;AUX82tid&_{HQ%xy ztflN_m2&TE91jneXs_+o*%a)3z08bGqh^$x@r4cA-@kklh*e5r1s7qFj6Wd8u6D6S z>;isMoDF4KV<*Sbf4+c}kDu`Ki9=XQ)@^0SYdHPm+k_G_SqrIh%|FcnvjW1m!i2DqJJ{@loDR_g8UCH>y~yFYW3`G) zlGGl;8$>5pnww(+mJL^`>89v|P5bG_?Y|Fkhrp%uk_a_C0 zyyvX3_5_`s*>4E%zFx+XuD3bt8D^-azB#K>Vl^S;>XY1UcFr&gW{UDC2Rm554-in$ zZbU!Tm9X=;?enBKE>okSc_!ZQ2I-%RcsjZL^^yPA8?HGh5zobs8{I*nG-dBh$0n4y zi5V7rf`y!Z6XV%`3H>H7q?R@M!_Uv1a z=l(%gm<0^`{xQJJYhcHqDdkwvMFEAcNFQh3b-3uZG?c||{BJ;E^B5EwnXceQab0r` zbk-?A!TK*1!myoO3Pf%jBl`Hw_2n9KCkJG?!hZ98>6tbMnTam-oq5c^k|q9-H`O1# z@vKa`$&@Mdq=vQI5<9oihM_D`*l_P=6UiDDD)eh$gG2s+X-Pt=0JNzTPZRQg$4uzo z#u5mNBd7=bhL8FE*3{guqikNktS1s#HpAX63yae;^YF;XO||V(GSR}x&msSbLiMM% zFc)%Hj|{1Pe8NUrXYW7dRB`N&;EqBkr$Jr8MR9S8m&@$R8`y?Zlz`bDRSMJA`paB?$Wkw@dt1tM_BQ!Kf;AvKU>{);3^_Ua*A$`X1?4z< zvV5s8A4%;(xjv_)UF0!&nlN$$czxE_9iha0T%7_=HOg{9zmDY@F-)LJFGuCrBEtn|h`5_tQjc&K$mfC1qu}$v- z8*r#n?aIHYMm%2^wdJRa=p+t`--)>dF5~Bzj~dkYoMts&3)OFxPPNZ&!H67i<$vJ{ zu>YIxXNwihUCt8F2v*)nhs`5EoN0$M-@s+?QMJRAEg*>fsF1!2)B{k5H1#ZYli{#+ z7X*$sR;}BQyS`mIrJCJlC#;C^OnU?dOdx2T>tpt zXJnfH!u~4|&F;g(FxmyCd#}lh7I>zP<;?erEWu-B*DY!ouqso{K14;-{2+AqR1tI> zMZEPOE=it;$7{2fq6<|iFC&oa{D4+0I6Wz^(+V#|(z-U}cWj1Pd!3~mkMlKRyY!nY z?ARsYhzkx^?*{LQzF>3^yI_+CtyfP)9UacOQ+A85IIZ@cc*WJMxc`Y!^ZwfBBgxpA z3Rw~)P#w#%kPOF&(ZVQDfd6zlY-N8D*Q=o0uyj_F+V6GWqNhj_VZ)Ppw;*1*-*c1k z3Cl^6lY~(3Pjly1DYq~~o8sB1uZZ_E#?y|BlUkhqatwnRrCbsfEj2I9{P02X4+y7V z?oQ4=!|%vId*h4i&Cjb+OQhIj<=It^faY~ekGa#b*o0<@$BYti-#^jfDSLSyx#hBo zQui6v_wz2P+(?5~PW8ygEvjw?iPk5dQ@zpj4cYtbJc+b#X#uR|dSlIn9+a+3s=!1HRkG%t1Gbf0}e!gm|gl%t;`(iiDr&ZaXNm{8F<1{*&o-~HKIAR@wC{_ zaYb-d@qC(ZFfdDMQb}a32>dV9#=@~Sa0ZX z3t`3iPtye)J0(89Bc7@}x7}wEUD}1)#0-jSP>iIQ*E~eH9kC||2W{}o{301W1&^OaVkuph zAP4+LBHN}vKQ??7S1d&B#-%f*L@3eZ#FQ7L-wZqnu3y{RbFMuC0G_h!6$rw2>S7N2 zD~}b<&0<97c$EM-`t1X&sn$_n7yT45M~HwU{|L{z0`OR}iQnB!Z#%PU+)h4_Fw^+a zNk-9BHt_COQGm{-&yU@8=e@^kZT$StKgU1J^2&T9Qfqs~2_&DMGf4^;O0-t@3%PdB z3jZ=!z+kY`ahgA3(>KTSTZY>8T%4`+c{f}mi6A*(M{P*y(-G;EZ6;N+yZQ}`pVh}pv#&P9FOF-TcKxPQ z!V)h?9XOOnw-|1stMKzDQ|bVEuS1$bL(HVE5YPvKEfWO0k*bn2kitHZTBDqn>ioLICVdTiIOImV6p zWo&-WV9#l5QH=hNG|zLf!f|@Q(4WBYo_~UT?Kzig99oFqpe5Q_(ZeaIg-a*S);_Gd z3QpiSyT4}P%xDe*iAjH+>3ID#0K*JJqQ2gC*POHJ&RsV53z3>&HvaWnbbl2 zA0C5&%61HQ>b!3?k3MpA>kDzWdE~hLE8}faPrCE5fEm|w=heMo(?r5d^Q6*ev($eO zVo;SV_pMAht`q~awVPJ2B?;l-0*5<_?vHf z=7b&_$r%0PFY-sixh*nM+;AJ(u4# zV*W%0(S?9W=Y#b>lkO)U7E;xMfsn7v)u)%P=mbM3 z*TreOJO}j&@Sij2mbJ9;Kf3w*meyhgUS46Arm^B>rY7*OR8J+Wh%5V#yOsBN2Yvnl zv~eqoJrc)(vh3xSd@!TR(%9vMY&P?#93tM8qs%uU+LRhs~*on?2Ik5->3 zwrj@`hofJnQL2)>lSs+3-FQ|=U@4k|y{YaNR24!O*}B)n65X)twYAW>-7URrb}|!i zlJ;NgN;7b45-okAWFAeS^K`h_V!%a{K*m!?rO0#;LA@*lyhHBjV zOLI%h-O2XYn`}Pb?xs@# zGFo#ZSp+|iN>vQ7aYS@6f(it8dAQPliqLh}q!4K`0vzc7}V55ps19A@~u z{3h(7Axi+IFb$pJwLgWqk#2GsSB|al*j>Kapr|0xJmwmIsW9GpA+0d`FDjU9-c`=q(;Zxt$&X5| zo+!ds4kx9^g-7&>YFsw07*xmuI~GS;=!oq9?7RVEPIy2I3suGNIQ_`#4yDLUF{qgH zrj|!`ThRWb3LYq;B_rqK%S)$fxaHIU4Ch_m{6lP-pbd|drOmBCOUK=UswGF2gQlIn zAOA}9FUs+PadkiP%gv-uv`+Q7cX7G6d4AcyzzrjQyasV3n*~JKMq#hBF)M-wlsclu z<$h+j;X{Z<>AT^}p#!Z8`g4`{R8=R;DYh>lyB7iid5^|i09a#!Q81Tv)PZYi=$Zv=P%!3c{I&ESSL|X!^yQ8bICO0 zn`#BNC_TDbh7qz@SjzNH@|gdSr~KZN-E@xmsv_C3sLgaGwzBt+J@+HF`?TJroztxy zDGcT7z!*FRG*w0kG@+$lm}K$8SU{@nkB0LCFcQai-EV{M5zD6y?*lN8djWo4%cAL# zxZfNbTwW9EoE~nPD7OpMCBf?MoPlmqo9?-Sz>aq=Z#m3uNcJ@I=I@-M?xVMK7)??) zB2vVPZpdc)83`LZ3m=y0TT0%Vk=Yi0|I;D;;~qf>;XI^$9jJ&jI>3PV!Vf2X7C6~XUj5|vrh z`?GYiLM6@oEhqs}o88eV|6mI$J~vFdtwyEa2-ZUoTIRBBg-0qJ{UJg*`w6M1x1rPc^QWasc4=qK-zFvPXJ1G1H5oSxms3Hw_!CT4;F?w8F3v+bR;RhS= zHRy_(B4LLPX(BY9*|k<&fu~eyD1M)bzEZ3;bbU#o=4FAb~&zCA9 zXAz$s)w-hbEj(V#>O^yItErxT)7xdn6NX}n&fv3{NjAKe=DXhA6gsY52>qYGV|kd| zSKgOEkXH2xtZl)1PC=>^8#WbZPu5T7C}Oe#x^I3JoFw`HLR2CDb?YHDMZcE0E=)hg zFxab@VeRfd=pOlW__pkYYY0R+$>g`(y;Q`HqtcIIO-mz}9*JF!bE>#gpQ+xx$n#3) z{7_c#(%v+kbTC?cau_gtOQwy%)k>M$T4eN34BkNb2-`wAeGg!vn84S`Yw7Ta;wnW3 z^K{l7T`Av@{&x2`9kD{-(XfVWRZ>b}>Yb_iIEMa5|7ae!{^{g62G!LS>rU-CrHgtg z*(B9_&9g+M^4=_n&`Z*PBWfY`M)2s)ik=Y1w4G*=zWMOy3dU;J3nd*DIXRRH_L;!A zbMf)6i3m?t7TkqM-J!MYIjk{K$c!TI9>K&Ihu(bU;viUK?Uwc&^|VRGswGT7s71fX zMrCudJ3HRW=dZ3mq(OoI&#`p|r@H0AC4Qc=iHSC`Gf)n{=Yga2k1H>w3qGy>a7T|`Zz-qVhLB>+}lfeV~|!O!BEOj zyJt^gDJ#Hf*w^WYv(xS@mX~j4kBi@{P(Yl~%x*-+{Vsd5D_&QiojtAHsP4`OuCqsY z$mp2NQxH8}|JI8jM?97zZ5Gd^L6<(?5gitX>qB-^KDHW~n(h7p8e4_wKtE5k{(J|M z$?6z*+I?CW3_gKN8}EZl!Rl33IQ+n|GP|UNJ!7!pe5HPAY3-@iU z^o*S%^be+|IQCoP0M3;kt)7{O4;yt~7=LmVgjZy)Q_`ZZ>w$X;uH1R^cGg1&J?5OE z3s<#|jZe$rObkyrIvJ3<5cB%B2$dqa6Te63RJXczftDkJggoBe6eI3BJA9k39Na@| z|Ln3#enwOV3#va|`Q*|0fw6dn$@-@)&m z67){i#5QV8QEWYSFgd96{0RvB?=xHB>H{|&lu}o!Jk~r}ZKX{edtqJPOsRI4<=*?!>gN&f{v0P$#Wvl{j8s&S+V8bqBewN3 z+Mj4CW+C*HZy5rzIf$4wUYNvmyPlK6-BMi@_mE8ZX7CUKh+okP+7H{09rdo=3fx`E zlJy}+yryg(Df-$Za%_g2rTKn~L7^yCyx{hHJSD(mUOkWxv?3U8=JAIO1RJtG%g7m$ z1c1od!6CEb7uIfjaNn-NtzCNGNg!=MTb&YzJUp{m6WV;X(>43doU-8Hn+#js+db<0 zByn)DZ-<7_)tW;uc%bc8reVY8ev<3)&ryERab@ON9Y&hVH`A{G){e_OIVECrl%^?c7qNpt!$uibSc((!Qu4 zfK>ziNy{85TM=O41CGGcNjiWozkpim`QPZMDwP^|)cdXef8O4VfrF`8;2aSlO&@Eb zgpFvb8`(|aaSYP14?{k0a_2g}4UDob`6&J2wtWyJ#(TgyF%qq$xW<=Z8=e02-OQh# z75qaULKwex$xGdTUUYo0%0AMMm-ERA}dq;bVVnEt=YB`CMVNKf{ z%4{3^`ppNY)vU+QSsY~}C+-~JhYinPH2i3itc%1e} zrFJ?UpMx-!<7s09b1&EjH;P+uOaw~C=@EuW`=*=PHwomPyY$v^FtaGNGPn@eg1(r| zRUdy77&4Bz99hb-P)fM7HuT$FoWShA5Y06(VnxvFLOizrG5#!MJRD{h9e&00EdML> zDL?_Vw{)>?b<>8$Tj|mP=~_VKjg!_`Ae6)0(*JQQA{A5qxEamtn4VfOyq9!AcabC@ z<|wX;`TGpF`n4#~B)tmuk>~dp#%$9Mqoa>fzT0IV_Q*bGpXp(>q?}v2s7LP1SNl|D z&J%pV<>vI)-T~Tm=@Zp`=dB5*7``Db%Z~qGawdwlo> zwNDm-MvcPT`*CE!{ZKfT@h#^$Na#b5*<59IqCmmCBZJndS*_e%i#5oRi&O9&MIpQo zM<-K-=kB3!v&@MTeA6r(TSxw{k-SZ=?)vw2KqpPulz8TRm^{4BmCjVCcHhubZ?76N z_nt4-Fz$t{L9reuCWBidr_z5%b#Lc%zl9VZynOv&GYDPT<>3w4ef0sVa%}9Bnvw4hH1oF#B$usEv>A&s#$gB<#We`<~9TZkBe9{?D>)1NDhmn~luQICnM=wW3RL_nLl;2XA(T zZnf*LJZgiJF1v$@x17pC3isd2egl+1O!L#ZS3bf2ll31+g`O4!rnm!ZMkn8d+17O* zMYD~{e+KWaE97lLTigYw zP#IvPL`*zD1z!Gs(p0kPKv=1SqDk6c9H?KL^iB2EI>mMd^)Ibs9#$IeP48sVuFYN# za92PV{?p+MJ-b63Rgf%;?n$MUcRl&ljF)k+%CYy zD#gYc^2eqH>Bi+WpvCct80R0fYJj_9K6mc55O(pkioNxpsb4EZtZ^!gZ@40s@TI%i zbaqh9+RwE=Qtc|44rQsV5=u!WYgN}Ij8k98bG|ShjnPPGSf092$Aw6>tmUG9q#v6h zrKx7Rh+uwHK0#0Pu56um>nn!*e6KYaouCIlh*EX0JK!vnzo)w!NsV0|2b#on3MWLQ zTp>9@`UQEzMZKSDCa6txZjok^#y7^@Z7x2VuhBCC?nHXM6I?}z2KU`c-HTrNhBsjw zw2^>1w&}&*wdn@0r6MSvJ3GdKo`#;cx+P`!kJwK?41Rv&&J@6^c>t9l3EO*6oIy7k|#4ArM6UGf+xy%;4u`LHb(nq(n*8ekKYh?BS8- zKl*~&hnv!16J`0sUUM8 zi=y&9X9~4_EJpkZwP(^kx|FpjOz=pJKJ*52E)JWlmvEd_I*J;3kFEL28a242>m!CX zw=A8$2&hdC8+x~X2>qp|%CBK#@AS<*&|Y;2_)d`5QGfS+;=j$m^Uf_<5#^ELAot<- z#esLEWNq^m7g!Sw)fQ)v*%{Ydy(l6lIzU>B$$g$-LzV}mphf=%n!KpNhdbsbP-L;irPEiU8c5iNX?=rT?8^X zzpV6bmA^7ODgQEq*j^`Zu3BYAvJL%JAFk}?FSqCPNsNLmTP29#^syY<0^Y}4C4 zqaA6!4u}v(=wDY=Es>~i7pt_Of|OWIwVIaxXD?0%{QsL2LrerZM)Bf;oBW*`K^|1} z%0D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

    dPBkI)6hj3MZ2QtR?3bowIn5mNU2Wvh$K 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Ćs)5By-m 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

    yshg=ZIH5?%n|QpE+?C|+IebUdUB~_u7Kaj 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

    M5fbQw_oSChwL7(`}+l^eTrg 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

    Wg%P}f^tnqZ0slJ^u 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 vTR#uM-kry5yF)gQKo8V~!qjRVwpTCShk~Nsw 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 z z_U_#~{`{Z+;qlDV2gXy+J<2Ceudq>y9pnu&<6zmX78;3N_J7K)cad)F*~tq5ZTI{P zfW8FFJaKh{g}nMg1bc8d7`oYTOn)#om2c*yV#w{Lj`G?L>pX3hc#5pbQQru+z83#J zZD2pr&W;c2lsK4k_pg$5WpQ6*kZx>4jBpGTrw+7KCsK`#6%*5Tl((M-0KE&=7+?6p zNk(uU%Tk@)Z2F`5}P{4C}NqS zi*I@J@XCKr{?V!N2mkcw_<#QQ*ZG+rU&3(SgpNH{B=&+YKik)Smi}qGs{?csU*Kol znc0HM882X3X3N^2X6>&Zz#}%m-ohp}C@*$#4kcedSL#_B##J~*2jysZ^GP-rDS9Kf zao_%LyS4l+U&|zFWYSiX%$zEZZoQGd50ae(6`QZ7%-j7w+c!aBgni z`MT$R3czy9`p|RCd!9ekst>YBlcp)Rps%a8{=Qe)eEseG`@jOXHvrxTjr3;}(GJ<6 z>Q

    rR`vbPJF{!Q>3WK+#E94+DzH`c9U6-7tObdZN*p%TH|l7r*l77QXOvTW{=p zAVHr9=)hdTwy_E5PNcYWP;+vW9r2c!vy)&$SB4n_DnYn|szG?Rs52-N&};Co$MeOB zl+u|7M(G*EGl;@ic_3QKKtBTnf!P=RB@YiP-G~rZ-liUWoRBc&hIiL>U{~)MEJU0V z_)i%fXoL?<8929Kq9A!6Y5(0{e`);wZ@fD0xO-`Q?yug7>L#EZT%;cI3%f?jfw=IB1!y_c3bEkptUlznYLhN45REsj^A8R3S$R7vgxxJ9U7m zi;v{mM!Dlbn?xdzgb_Y=v(z@7XeeL%NYm6>nIuK78f=B}lUNF2os*<@&wF`E9(-kv8#+Zt`$r1Y77=Jtz-g@Jw}ZtOy3+QKtJNLOC~I55>7Wsk^>Ux=qY z-ac_=Jp0V^-z-LT>k--F#2p$Hz+!&yWs}@-g}d8+GwTa4%oJ zGESX5O`P4vBj}6yojqO>oiDK&aP8W)$={2{rp(o+mCG`lQyLZL5RCsRrJ~}=CcgF* zK6*~=uWnBG)g?S^Q*2X|<$@1TPlvY9GglPkr}yjiu$K@#xq8n3s-T9y?d| zLC1LQOZ9XK!-yUD>M_E|LUXsCo z=^wVQvcwO&+FRL+o~&#~utE!{$V8!}OP8t4m;+*P zql3tTsPZJ2y5l`uPYZN$Y{O}=z=LJKePx6(E)*tLT{ zBfu?WKeLzdpnRp;1u24?e%f&icx8(%$#2G%x@jS-spa?Df5FlJV-o;iY+k#X^nW*^ zyn&)j9!*1)%nKP`M3$mU0fm#w@ne5xV=Qsru(oz%JpIS##-IG3$GK_oIxhphl76a< zA`dYXSE)E0G5EtKg3107h8F2N(9BH-=3FNI!oG0>KDL2+cw}<|J>`-3$l{%f$&NKf zim&c1hj_*kf8EgSCyX-8+E+nI%3;5WRVTWU6S1sIib3>iZ-NkSjME&p)r_w`48F-a zlQg$tlh8xI>eJOm;$7W1{n}&K{?0EmcfKSV$NU1{{H=!pXZ~)#*NxY>UZ=S^PYUGP zvTBSv&*!On&(tvQS$Vtg{bPaK8vyU0w))qR)Q(!wr#kn1zUf(JKrr%oHek&Ah2_F{ zn76*K`%KY{k7b>bzcNl-eEh~2{{E-8f8po0-`xA4lSO}1RlDueqnZR$2X6ylP52lL zpyH;0fjxr*c>{NdTE;O8+~83OoFbBSaN@`W0}Lk<#%mXD63C<|JVR|3q?>+%HdVQ1 z#K?knqAmXXz@W?-6ej-SL`UQkufwZ6Jsi|~BI{tG1WrQ3i^0Slb0=sHD%!%|k~(=l z_WJqpTfcf?{N}GbGnQ6%jL-h~;qlqOa%g<-U%WGK1eT8rmg3`G7V2y0tu8}n@s zCz^dnxfXxYC|Q&zi8I4;)KFFr7Z^1VdNq$zxM@f15}n}J6Ep3`tcmLyoaL`9%DlW}LXhF>K@{G!dHhi3LL{EB-u%_mzy!ENBwqezIr>Hm!ElkN@cXIGA zhZ;#Rn8xu`_MB{j0I|s=t6ew~Kmao#5&<6mMPURGzWR}P@33oZs9!U|#XkC~ zNjoT$Wu7JJ!ccX!tNpb6tNN++Y0qF!?E$d1qJyN)yP_ujY}40lPhtZ0**3LRm;fg) z`3r07=4TubEP1NULJ&ap>bo~8t}M3qtbLRvI*swtD{qds-+FWGSzV2u_Sv*2e6oRr zGL|WT8%ZUr0!?uyvZ)wW26i?{#HXUJHb;h@APVR2$t~NpYuDJmyv!oj7ajslUtU_; zmEVmoE%V!A@|J6V9|<=vSn;7P(92k|jrv8N6v$#7`YXGa#~lav$4}OH)4q%T<8PlD zXHK7uF5+LgdUag5a3L`2mpfun1HniYucv;+T1K4oJM|$cQ~QO+Ky!h3e7+tL_pWE) z>|4{syKEr7E$9jV11D{YUvBd=c$9gqU#aUu4?SEj2Yl?yR*^ze&gVvPn068!UgTo(-e4A^xX+B|y}ys8)88N&03p z69QNlfZ_oaxmyO$DHop9{ZpBuk2+B&Yp*NbP4+@pgPH&Gr3DEH2cNC@<_(?_DSOvA zBOhgrjqn}w@{<=NX!DB0!ii`6Q5Wkg^ca)5mW_W%Eq`cJSTb9WjL-=Tf2@~@Jv3#| zH*R>RKREbO#qLz+&$$!V#-IG&vGK>h{nmKoi*K^|HXrMXTFa+S%IQC2Ncf?XXJI^g zypmsH7G;2hKYt1qom;20fn(%^U!qeF&5rBV+28O)bg`{CCcWk1OOCru6Wiuzy_2fS z+%g&i?T^t5+FEOiW5(3ZX)Eolb;1 z*|(<}iAlGpers7@cZW9+I0E$9@(vD`8(2(<$CaJsyR6R*H-T-Qu56sR^vLzU^~;}G z_@$rSwQ%sG21zGN{rk2Kgf+>898wq%GZ-)s_JSm#iUGysB1XWv!)6ez$YtQ24J6zV zbpYC$JJ{4a5E1+t3m9~mOj2h+&Ok6(#8W0}6Q3R=GJwD(0X~8NNUFeJ1K{k@SZFFx z1}p}lo;>@MLfCBn$#v6+zCBn=n2#`weEI+8C52=&0n_m0o}$lc?U zJQ?umA2~RdSEoT7S`OYm<|u6^585?!Xx-L5b^$gvpZJU8bx$^&e1e#TmE{WOAST`V zU9l}t?I!&sU>w{{^2l9RaIBZNU``UPtLrW=D=V+5CLol7AiQ@_lqRfix zqP$F!N93P+>bY_JtvAMY+T^S)b58K1r~;ca=?z-Q&)K2Y91Cd4ArYpPfH5* za2K%X#gIr^1=g9q;%Kk(Tf9*;l%*m(WeOObhz-~DG%4~#hK?o$Cy*!2MyLf#Rr zjXwLIe7w`|;-0(qJ{7=QZf@M@i9b5YH?(L^HW!RVmoHt!Pp$x08?NHw$o$7H{Io2=bkrt%l;hwd6L_QAK@+)vxW+_K20ag)dZ zZdu^9yF!xWZQl3`K$XKc zlzcaM*Y#Nl^ByJxf~oNhAo@s+8rD?mde5Doue-G@bq2OaHh$q(zHjG$`PX-C9Qs5B zP?*Er!QBai6VNU0>{>|b!0N!pEx80x%N;Zf!!?j{T~VGuil_!=f@%Ueg9Fo$f}>or z6~1diAT3i*ls)(0VtE3%XZ|^{7CVcvOcuFvAmMNj@kLLj3@|;g19y|(JXGx-lO7&eidqpS^Q@ z{QLHe@A&@xq|LQ2H056l-jc(23i!yg zF9h=wUc%Jmqb5Hg%Ad3^VzfO}O1f!2>4tB~V7tZ-v0=3bGNH>>+tsfuAcS;;+nj(^ z+5AhF=N9&GvBe*mtUP_a1!taSDGhaxK1_QS&sNKi`rAbuu&l=TEIlS^iN{tNxdX0gkJ>u){flYi*Mv^BgUKy*|VeW`q< zX}|pH(Q)LJSF#D@qOC}8_8*AM{MNhx${>F8m#^39N6L>bK&8w(`}*oe7Jgf~qra>( z;)ApicdYm9anZkv1*4k**T<<7r^eZH=lI?Jg=~O&Cse=i>|%ChWluH_T#$H&Re$jg zxQk?8%IGKQlt=sv7tW8HuaEH!?T%arcp=?A_ue)3?^_)o{pf?^uDcHMRKQ6#1K#F+ z1AL+mK3Acmejc@GsC<>Ff3<+sp zUG@0CG_z2)9c_2x7VWmYb6;p!SBuNyD~xnZS(s`ot`Q;UvQ@VUFvb?@LI+rr@Y+v1 zww=|hzFwkVy0{XJf8ixO*ObX$Cl^l|eT1-oG@8Js;1mzrD8>9Knl(-;SJNsa>AHDR zJgm!4k;DTaa+&d(i#kd!$KvQkdF(&wpdj+jq3lH|ab8lUNGv`6l^ui^$uW+;OZ&^q zew=X^xqbRcn8abuTZl24KZIY|M%uP#;u(5@9)FWo%c?lx6)BXcq$*pNZl$O3zv77T zTO94AucjV+Oc46=EgW-IR&yrlSyDcWXH4x~bma-T@#c${$McV#9nXIC%y{aLkB{dc zKLMU`tLUcBL}%I$rIbb6v`)pl+NX3Yyx_xI{7&gl+Yf*wa$O)Oh2b3u)8{y zZRJUIVACGdR}3IT@T7r&(orvI8VilbdGRQ1aCIDi_OZ3U^^dNN3w|O&m&cY5zuGxr6Z2#`9o{>K{m;2Q=jYVoqxYo-8&&~U%f9ZusNfCUx<5K$bU@> z*l~?_rp|X~w%p)QvxBPlx|4Zf3@Dz3^ZZ^1#VPkZpJq7g4`Jr#jl?p|HnVznzB9n7RN)M zIWRu<>DBR(@7_B;%5m2NyzQEof%$nKe`a8ELMBZgU$rH%W=NJk%3TX?1#RBSYrSq{ znTM0eUS!tYwrSvWLRlgKXLCEqJ1Hsm^IF|(3G)ub3eXc+%W5HutiA&vaGWMNYk{0r zj2zPP$bwt{aG^0JY3nmiq@~-kn^z|fc{i?TP9nU!ZB^;49e`D@v|j0CJ!C>xKP=d~ z!`2kNgs#Gv0#g$j?O?HR zwUFy_e9tFqf>QFe4MW&+=wveKIWFgBhPKr%HBlB*xnv@KFIvLW-*ST}jQW}aFELWX z%EPn;J!QLL`_1`@I;WmWbMmQnwEdW%^DlgC8vuI2*Yrg53WxK+{3#F_U_v|_OfW-cVK_Y{4KnPi*@BN`2@k$D_65{ zx8GbLe~m@_C0_h@`XrkPr%xxZ^p|;x;2Tdplg)yC`}U0wedzvi{{#1p19$8nZ@h7I z96fq0FCO&G^H;9alL}ePp?fV-X;0+SuKKQh+IGlB9kQei)t!v~=Z1#uBX94D3-5LJ ztG1W^nFOLSMW1n#*i?LM_iHJ)Uwp?WKEV?cE8~f8JTlJlsldgZJWb)^eHJ$nkfe>S zvtU;a>*arguLSrL02g^X_!@x8HsS-Mz|^MVB9r%R*r0XOhZbnNj0bE|D3i3kn_piY zV9YVjBAc=-^OFu=-k2}O=-ct7!r8W+PsnZCHQoKMextuiFPl8ZS@I^wi)?aEaYFg6 zY5xu0gln6agfYeLwu7GN*p>Dwx&h$N#72VQ-#!&AD&-Topc%ShUj3}bGJRq55XK|& zg?Gu5aXZYUC-;gA=Jl&QtwTO>pW2pnQy%F!W){pAzM5nEX^e~?YKhvlFq3}imiSIy z(^UMjX7UYkp$}c-kYljIDSv$4`UxgFkq@qgBz@Q9rvj}vS(f;2%t5bC+N13vPp@mt zX_$$q{e=2zGvwsIa;FCcM>^duP>(9u+x`Na$v77tlo=m=x69F&E;3g*GhTl3!g%2^ z7X6Q&;M2GDIZ5JxPG{H&RG_HKe&(m@&llO%iM;?EC{g-~7PyM;5myFJ%q6WS`T-eVa z^W~ivuMhEWJ*3@-b*8@VdNm!f>wj|XZ~jl;xAhB`SGPR;g9)0TWTFV?*@Te*Y04y-vlCBY z4a^D11l8*ds=+t70%N%;lSkpCL79}CpqVnzOmHdSk9Y>>S`0Z44ai7hS_i1`lllNUvx#Mhn53*ud}{JDO}0QT zJBc$bqM)rzHQ6be%IEL%C1yKor?e&f{Hj2HQxBj1DTFq$kzs^PQ+_;#vO@uAGx)J3fg^3Ym@=`X>HHn_WfHEi( z6}7>m{=zC-`AYOfX3xS(&(zl;4Q%=caPcQ;lCKm>GKybEhG~Kr+V*+t+Rw@BZ`wjp zTqq?u6(ZHbL3nD>x#bW}-Q?T6Q>Sea^4Re+6%gej-B?A|sODn76@cuh&;Bk!w{h3oI`8mNEK2NtR3!cZn{$w@>A9&#KIDGit z{A}Qb7hmEh0_XVoz~0cV$+K-&ZDm~4Mm^ETgK}+uvfQNKX|KMfB-g3rkL}uVO&AZ$ zTnJWM)rOko>gA@BV}q&U%+2xOgC80z%PZr_Z#+KUJoXChx6HztxA|jl@4DryGWffB zQ-0cjc>NfE+K9~oeP-Lj4xXG?r|o1BVe{#U$fQ7m2C$G+Kpu-iFt zGh8HFIxO&nR`IbPRoqfXW!vye3h;JZbPNY&Z1J5RR+5C5w>H;KWy|ubs;@pR-+tG? zY%vFbGGL~%9d2WA0$G zR9{uEYL~)KW$KESy0srz*L}x+CVk~H#%K?1E#-`H$kY7ogFuc`yqxci7cPyLzJ7MR z@{M!jwP(+dBhQ`V=Y+n;0vKpDj(X`3J%=ej2JL7_xPa?53kK@zr+$?uTv%+?G?LHM?ujh+c8ubEDwDeQ&^u;y;uMMKmbWZ zK~(38@)cJyN3Z|q{}gBgkzk$$>_z?jd42=Hyc-7Ao1Z^NbjqaHhsu`$-hHNO zR(EUOYg6Oa)$P9@2n*ca0Qf*O<9jM$hplM5S$%6+Uw7v=SU9@RpQorbBO=W{3_Pa3 z_FS`r6wm%xHlOgjjrFfy{l$Osscrx1g#%l^_s0n@+ypAH8VCs93`hpq1aShU=S~T} zTo_=@chK#Ct3u{`5aK0DxFyLw|h|Fx6j*+<@<$?4#@W9Py+c;C{v>%rx5?}vAf z`ySdo?*7p7xckASaquvArQ;Iw z7xck36@ThwMp0c`Q+D%r;IgPiQHn#WZB_QHiI!!Zl+8)0cC*~}Ro0S6{@6<0COO1Q zyZDU0|D%_3$s2ewZ7Zu3YM!6GoXBq4A9bMJB1vb1pM1FSW}$v{)88sj^h=MjZ)^#! zGH6TTg_CV~hBvhJ1L;!JvXqT&5B+pwJoD@;JaPQkxN!a)3m3jSubv)~K#tg(bH^AT-M7r20{B#cKIBset9uWO zd+xiB&4qijF|hxx`-odSDZoa8?e3=Hk=NfCM_zkw%Aav% ztl;7rkMD0|)4+Ib8>^2=J8yS0+RX&|Xf4X>?yh#Y%GU^l_pyKP_-6wESYI5t(>woc zBKX3%Y{(hE;bptIskB6!EHCZG*Rdgb%FDQ+-?*sO4i#_Xfx%TKWv|UzZ4VA``Z&&D zb!Zt|wOO|hWUC*T!8et|JHi>)C=%YM=@ia(Q;yO_7jLP2to6+C?^v1yW58eSXo&C6f8ZNJ1<;1i=J+gmSB zC{DDEEsibr8DyBs`)NJfS>DR%`TE+%IPu2i@%F1%#+xr)8gIRPX&im|;&|hwbK}&} zt9)v++F#8)Z9)6Sj=UoyX~I=}ZK@n@PUtgfAFe%X*Zim0u{`op zATQfSn;Q@Ho%#MzW3pmRu)=fLX4160llh)wrW{^wE~=-xMPGpBBMnPWZanh4Ph9_R zeurY6$-~BXF!4Np^uqtvGOw*`9M647&%9^Yz3Xh5sn2!w?(6r0Y1rH6_qhd}$=^;N zTnpH_H>1=$_3XO&vk)B+3>=w~a&8))4LY8?jO;hfTlZdRhWq6DfA>2dTli~d@80qk zesXMVW4&Dg+Oxax2321a=Cy&-WSK#}gY`TEgKrd|UK|GycU#T#C)(9uTmv4ns#$=y z-rzpN<61#8P(Vl8{0|K$WCn9#m7{{b!%L+EdGVV!#lnm4B0Lk&iM}M|t4@&K&l!-;+g7<_5xLY> z|0sD{t}=&&!!@|o&b9b}?8LwPqby%~iBtCUu43`EO#b!Tb=$|bn1lD)O&soImd=yk zF*#8`G|mLRUJO{1!L+l2l3XaXJcfI5H+Qt-r$UX*1b4_vpsGTIjM2t8q>Gr@SroosZ`CgQhWoj-qRJo@O9 z=L4;gn+m(OE(OlT|88Eg=!+KnX$1vWK9G%W*-Y87z=jZZ$Q^tfK|5w6fV}1Qr<5gc zysmzr8DpmjuG=GvZ7P*1)(@a|t^R9`cv+Z5ikLIJl&jM_@F{Fwfob0I;mBAv^}Eso z8{1A3eQD|&TiDQRpETx++jriDQSbN-d7tvo#x*Jyf3J-j;%#ST8Utc92H%G#~pSgG=>JS&*uGDzzfx zf{t8_axNc4CyISv4#KB>($>&h=XXJ;-nz<*_^yvL$JWNN*Dj9ZuU{T#k6-7wHjW)R zKTaOy`qY)kt53z2Q+%Q@alBEPQ!mNbuf`o|$TzwHuZ7L`{4DdPi7+lS z$yoY?zqH|}ywRI$^=a8+OYpB#?z}Dflh-%>7y9s(XVYmpV*|=VPyOJLacp7Bjn}XL z-amQa#{c+bU{&0s7w*olJ?8K3_Xa?p=j$3?eDh7O&l=mj=lO%nT+g4)-DJXd|9-Q&n+C$Qg_CC= zxcQSmv#@3RE`zCoRRr^%4ahy2r!dzE+VU`X^UvVwqj{zb3sVEOqa z;cC}CNM#V|ab$uit^)!AyeK1+bh!i6a9_=&}}_^R8o7Zr#kMyKG}5O z+LUtYFP*zSF7pDh*Pp*It8ii@f932+#qyr*WB;M0v3g+V*mGc!1%=m(DO=vlqt7e6 z^lX*Qf_*#KRM^gf$jt+PzpQPX0JOy`-xIj#%w5`^AoSpyc15C0m?0v5Hd>UD>-los zTzvVIoy#7%q(oXyE={4I_UQ>9uuS^3NbCcNEM6#4ww5#Y1TeC&uYh zCs^>-`uzsVLz20P96NYp|IO7s^+tZ~O#cDzO%3+-&UIh46rbS#+sZ<1?%ao_#-%GFD3LM*0D?VpGl9o*QtcKvGf+s?*7 z9`Q#B+uOGA(f$Mb53tDh>khSvq5g3kbqyTxZ+UNgtH-LzjImYQF}l;oj0f>)`>+O+ z4t9D0g>Vxu1Et&Q$pE^-zeZ@@% z<<(ZkklKilU-1n|Ns#P+MK0We7azqZ6SIM-F^PpRdFiQlWS1T`=`p6_WR!|5F$y@B z&a#cfPrW@~;PCDG=g+K-3uk!!+bLf1dF;x#c!oNT^QW)UAJ@1hPH5MOXZbtr8yz=q z9F#v{4a&8z_2Sj$n?6=;YFS`8$4BfpYJ#FM7YP24kL@VWhMqR2 z&$X|4P8-FqidOm%c}>)YoKxCL%+0DQn381?Mv9fw-m`LfP;KoHiTQ4w)7a5N2rjeg^~lXZXE z(XjJpc}nZXYd3!T*-JOy`0pRy`tv`#xOMelCP^(Bfi%Jqkdvl!1{(r#f#j#5})b}WDfPYQ$Ep%?$m3aoAB)kMkYFxJGe@-20sTt-Zaj82l{0~ zGu^>=cV2qZX#2~%_1LkCZmmbyu5JN*s;h!%Zr`N`_e);4Hj4!ZD#?qxC9*U zGFVw<^1;^@#8D?-rnR_)&5_ATnoljX-B!ToA~G!P;pK`h3c1#V+P}`~Q~t2D#|46u zqNxp$-3ddUOy+^`$DeEn*`kOWH&^gfou^AWuDY;ZHES9uV5JcuB{@-^}VK z(sENFZA^_*enbr|Wm0ZoD6M~SLw#Pp!fpDr{5E;oH@Z!L#jf!g@Oq<9Z2NU=2ySeI zO=$AaPa9#I^c`T+rqtO-LJM4ZD4ClHmYKf(1fTvp_U72TcYkQQU{GEKj=t)wPk?)a zveH5ORGY|Gne5k246pKA{$<|KfAF6B>D$}6lYe$xzj7(GrMGh@kBjq@fYW?}@7%eg zMw7dT)L1GFq&JlHM+_cE=(^q&;z&;kL{?7m9=bsoazwq=pc|_uYL6LWF%b3XUCn zJ9n%<{_%&$3opJnUV8auo|HHoKgi?!+lYIUe<^GGZ!enG*ULxryYgXVu`T##3{jtI zA5G3xxo>pIhAlccF;ANSn+-5^L|5U{j-bicw$V2a@fpWGyl>&@Z#*?#;%5|jK_Bg8 zY?s!$KUYAW4K~!)xf81#3p@PDhVKFZj;{wOmp{3%JzGENC&5d}v#4hA>1PPVQ~&+@ z_UEY%Wy?Z={^C0!Y%BYY8!FD;XO%JQ@t$QgGg`Sdr*+ot(ex;W&OEgwu# zm&jWSG~we5ZtT(yCjZ(7=3*BL>{HP{A{3l5Z|V$;{tx@B7x@EUudgrYA+b+7OUmq9Q7Q>+KdHH%Lw}7ewHx%bp}wh{u^+OipPFf(vTf-pd}1tTkh4f{*`=co zo5DkTbEs?VW5tZFHpV8<(1*2s({*eXPWtlq=TNqx$)AJtyg?a_?T!`pJ$={|eb7-^ zO&Nc%%Had%k#M!I?Mx5Bldh)STsFq(@x5XF#arQ9QNmtG;ww1Lv z6|{r+P|4gXdIFgk4KCd1*A)k4p*-3_8N~GuU}bmVkx%PdBv0d-Pl+f;TEQ|7ZIiR| zEL=VD}mqd0}xJTK?|sfAg;`Z9Vj{7RW$s@OB_Gd>NGtz#ctF80-_Q4a^2!0))e3Z+<-(w!8 z^%N!(T;O{GAfvW<~?+PK>&_~3|JI@Y8?8_Q39Vgu!KFs0muQDj11 zlX`irZH1K%~{s`8zEwzceyAmK1u)QyhKF7s8qP zi5F=^E^SB3U2V>>jXKM3y7t_DFORyzRlko_9_{L4*Hn}9vY`}OPs=koMV@SaP^nL< zE6}kU(2+ImN!~lEt(&wh@545TbHs3Ee_^`s=(oapt-P{nddgG__nI_%ZE~U?c>rF% z>&AHaCr^x*p8fi`o44(&r?NEv#_2Ngg$Ymat+zjTH`?;^=gyAReRqt*AO0xU8{_z! zukm8RtJtFMnC;_D{wGhL8?PRDZ5+PuuJPx->*Hhp{(Wo&@D#ww(>x*I9sZFw?|ZlZ z8lUp>=OEYkDS$FxV?pZXMc++V9&KcOlt&)@T6t=Nt8{L?q^&OcU*NHY|19%Gg=fzq z1N1-qk?$A}KlISpv$BLeujR=DeO_5#d;N{^*3qNm{`(K-?zgmk)ZKdRQ9f3EzZas) zKC|WIr(TCQ*XGj)^#^1(xuCEug(*7ri;4x(OB(_wUv(*;tiGe2vZ$i`m6u-{Uwi5+ z{BHUZ?_yY$TIkz`*LX5Ro7jhTu!v7P!`Dse#hrX*VaL+g!_PDJvZ%ju`Eq_Ha`xPb zya>=`fo;EwFFE+W0pr(xp6c*tBzt(0V(lv56JP_S7W(?4?*iam0#_Htm;RaGR>vmD zvcT`0BNI=NAW8CFuKSzU7WooNo;1;x#zNI7Uyda$6Pk0!=!R?ihmTxXyrzykCW_vH z0YAPPx>Rx&K$y07wOjEpug#RD=@pJNjpLhGCjq_e>yVwKx-n{eLB(C++Qg;vS=F@}LwTzaPKIIGHDUAu%I?LM5 zG(qv?Y(I0nu&&3RdD|r>s87oSta)iyY&TndzUA{e37$RwvMzE_=DB5#?gbq^n^wkD z%B}YuAeOt?sm-j*<`QSGr8m3fY5lE@-~Za)t>3Y{xaHveMAF&7;2^0W zJs2hM68sIm2Hak_b>KBXr<{OoURoK%p&~8IT=)rZl6D7fX_-R9a*kR6GFXrg4|z`q zfZ^XTJ@Cl0D1kKLiK7k;BaiTzcslr%oFGsqdn!tH zeqCp|w0mLZb?gT~(@;ijD@=GuD-`(C@YJ{Lk%w#PgfC#0nbg5aLNCsO1O2X3mJG1q z3adWy3O;4Z-UGLKwmk6#aI=61J{tq#PBKSc>LHO7-MGk^a+Cbz-QZwxzmy-TtDc(Uvk(=#cLTsAcg1&TSX@7R~xvf;wrFdMcvil3dw|b|ycg zG4%-hV9A7x(sSXdT<9W#8+YP+SUy|$Q|+}${NUxPWOoAD?GZc{9c`yS+v@LfLzmG2k?7*gP zzVS+42#BR-kF(oWZZI7@ct`AUOP?hot+rl^^t}=?Fje22ZneACTrp4OiN3{SQ<4)djuz&R+8!xBErAuefdq;5e zo3^0>BSqO3S(B)D5o%k=S6&w`p5to`=aFwKi~c2^q*%%e0Bzelc!A?xe7RvipK9F6 zoBvI=g}UW4fY`(Hi;wZN6urTW|I&;XHh)Vfl4k%cE?*NgIcm=$6eJS6h`2x)C+CWi}L$JyeTU`m5L2 zPQj(`Ka=*<{@_(iNngAuJLxH0;TCpeq)fWq@2oFd0R!!f z|IiXQV;y;Y4+gWoD|zv>ZTf}_XxhTm?Ucnc*NKnN>T3vxR>l|d#{P^^6K?35N0(W9 z2*c5_)^e|Vj8`_tK4p==G}6B0OR7zIEpNQY3N7)~SJ}uW@3puydh$~SXj>j17iN;v za+5NM8+j>ntdITX%H(f-!;711U^0GC5&j6HZOmtrVxoV>xoz!nf zauPgEU;rvTYM_$8a%OTu-a$}W+A&X4Q0pMr3&hq}y2{ams63T(-tG!CKd5pUnAWFZ zJ)8X7?We}#I!IdGcTHkH3es-Elh4Fw4qrUwD&6GiZ|V6A5jx2`G664-l40U6pUHm0 z`L8DnfCevba92-k)pr%8(L5DazTq=X;v?}{Z#~3sI?8Kuf$D@$7~3%a zCwsO$C2z^9-L(14-twGemv;G_Y)W2#TJnjX*cflT{w#NF`JF!a-UZ8@JoQX0QIcw> z$RU5_K}Hur=Djm?>f{OD;D2a*=5s%gJLxYy^AwMXUgNHCeGC3Nk2*i{wa3T3cO4x6 z!N33S@U+39arEfhxpVKE;x%@+lN$@(X>_sOPfw_?wrl_Jy5&(qam(MhYe>B4Cr31z zdZ-%+X+I~w)=MKiF|B=y>O5Vr$fp5USNHO$^X2jUi{IdV2J7R%9S3=9{m%5`E4)zf z4qja7Z--xc=_TG|zm(s*Yo}V^*w*w5<$`x&r25Td5K_sijX5Q?PU_it&&peEUw1^S zPM?y3YE^smIc*~i%HwbNgil@^y7M0H%JY)7Gsj{NU)CorlXgYI!$s6mj zIcE$>ef2GzH;+1}&rmLpt-Q#vue&b=K79;$eL+eS4NRSDl}WpsA+?VP=izU`6Q7Vx zSxjw1^I0TANow65(grD|WiA&;wKx<<9TOvj6AIe#KMa`mx0ocK=#V_}=NfouI}U_5 zdeuVRdMR5S!qGX4V=DAHHvrVhWIIZG7Go%Dz2fiDXX?ZH#})Eo5- z)Z+Cd%)!FsplRMC11Ks~UyCZ`nFc8JV36s7Rzf9vna+t-CL>HNtaIVei+~JZ;AYV?$2-@P zZqgR6Cl48$e>HTGIn0QviN|w1GnXwm`wUe%Oit0XR)I@a2n5iPug5G^ujUp z71#sVz$uUVb8fi!kM-!7iNwS=Z7I6)aY#?U5!dTXaH;P)ipzt9r93_{)hoX;#PUm_A0p)pxfB;rXLt2-2K4S zvG3t?3*(vb!G&XO*2!0& zHQ5KeyROf~Z|L_~?DubSv4KA99r^edc+xT126~kA^wsLm)t|)CCYI|XJ|gV(UOuh2 zgKyiva^$&j;`o`do8Q#$*|R$nZ@)CKpGCDlQ+V~rt7G5Zec@{xiJOH0w6vAVksL)`ej}gh<&ozhOFNGfAxv=ar)R*SSh>l(C@0-9%`sJ5r?ef$qV(` z%5TpXI4l>Zx)pYs7VKWA#4VqIs7oU<{zUt>;wdall@{2n7alC_q=nR~C2^U=L!V!4>#8-d` zUoeG@?SRSnTY#l&_&Fx&L((W8Erw;2nO%U5eY6pIwHJ@e;874>3a!H=CtJ~)fv;}T&0DPdE_nRtLQRp^L35+j zOc@lWe8u)!L>BK_U?@Wdc;FSj2g(dMT)TM9qBwL4$3aHC3|R7J0T?-ek+uV==iDJs z$1G-;@Jw<;HZYN!LAECwwOE-R83aa|o#cU*L0dfenv^yAX}b*6HBo6jMapB8oQ0d& zOMK0VtWFNqsv&sEoZPc`~3vKs|e+<_1C9P+G!iBmQNP zBps5rQ(l>+o_z6Uu%GU1Hk=spi45jlG}%UO-e?EwCK!F9I8?hzV>bDLr;A)Cc+zrW zlX_@KUj<_W+A`(P5?3C|ubc&EZ8+vyU+P6{CUlwjfU9kTIYGlizpBj*Y1D*7yFqB8 zHBEf1oyvM)t_-$`k_untTvY*u)$ZEE`q)bv)MVj+TvoY2^*V53O>Lq|oBGwHG7~D> zid4Q`JX$u(XOqaL6FHF6MJfO4cfk5|;cB_$Id^{wJz%S?l-CJt_37?IS*)wTgb$JN z;UC=?XD+|MZ@syji*4QbP%rg!@?M)F;TYS+SHR1Q?>OtLr%s&6Xa4@uzx{7Tm#=>5 z4_T_+%;J9+chcWJesVnh^wZ;~f9l^GpZ}51@wCBP+(o{^o#P#mKMVdjxqOuV#>8Je zV}ET3jMuhz_YeC)`~lz67Phf^n7j_MG{E&x{&{#8v#~OIv~Jp^eO?+q+P=DH?>K(q z&G81m``@#=pGVyfL|5fm<+tt^FJ2nQj~~y5K>dzbKP!I`CjBfjB0G1ro4)=YzR0V5 z%9j2DjwyKfor*-iNw(+~hzSp!rD%WZ78XHlF;$v&1i@bWu$|&qCg7;{}g6=Y0URA&|C-9XH1(+c=9%@i3G2 z_0WE`acBD(m-UIwg>GcPze~>=GsMw2jW0hfpEERr&vh1a8q)*1`n_^nF1@mk@a3oR zHQGaP|9BDrmOyF0r(>@EYtnyhvyhD}r4Irm-bWJ3jS(i>*gEACFB`sGD}%mLHmFzu zrNGNwxbnjZ4!^TLu{_d28@&=EpxyqdNXjPvDucg#>7O-5PknCkTltG4Z0dotO!=yv zoIBX&MhHpiuOwi!UHNsjU-U^;=^9x3i){;@`0~;k-KXVQ<4nmdK=?(T8lS@pebhlb z`(UTUJLHhIZ55r#%iH8x8)b}EW@v;5`8>(Ux!Ovdr#^{H%1f1}jB9eV?WHP@jJs48 z7fEWzsU2iYUS5gM$Sa&QdhV4AVW8P~%Bl?NVOe|`S;Wo!fin48Cw+ypkLz3Fi7&lP z-O*J>lzUQ7>0G|~*0Yb@_@!SxxADvg0CZFVJ$uYA`a3_rxc~oa@h{Id->qk=W_9K} zHC$icK7YV1P&0!MxRSTkdru1xvfh>E%R1j@f!`}XU-mA7Q^7pUeEwFN?}@*D^V0RB zH^2D!%GUcfRu=C4aH6vTnv~c}z8BaXoHKwBjGYu1@H2Qh$Z{>FkuIU1i%dQ&pMrl6 z7=fcaG;Q=_`XtUOlMPfL_-boWbn@Sy%vi585BKFb%;vW@xq>wr_% z_Dr3VqEwXZy|GY5b2f&Dy2vxWfNqi1G78&vsRKsZl;*#G6v+u=WONeDziKt{wV#xu zQ6@v7BVmsCqO}vxUJTFMvSCW!sjcMzj(oMHb+&mH9>ps1lpZipCV3{;@+r4{MLDY8 ze9_sQoGE*^XBH*dppj?UU^c;%cI;T%tKXLG>*J$;>FRjxhl@u!A%ooG~bW5 z%BOg$n|?w9S2)|tjfHNj*kFQ3tSpB2@*=#`XHJaQ-*`PQ#XG>u0K3oZ-m@}JpFYEj z4A13v@Z!f-&y;)%+^(0D1DT<+nUPB-c#%V-qbRxJ0K+gl+RdJ zPjD1$ZRWW6@|re9*X5O!arfQ#j>YXujnUNdhMD+o%2%x@Ul4P+EjFFJWwY2#{Uw#+=M82 z^|h_yC!rb0;0vR9Q}(#O7IBRfDBnYf`25jv(+SaT;2iv0dAERJ`ea-F&5IYM#-DB8zJwS~0%+ zRBy7je#WfGZ#&WM>QVixWG}kv0~~*C7dhGw8_#R$oBFSG6~b$IrIf zP?tN26ZM)j)FcCPC{zJoMKZ8Y14rT1;75`2OantOESL>u8H}LSGG%h5Jn+sSL|rdh z=LgX&`XrVZohPIR60s-gA}Cw3Bds<*BO zTkCr8bwZX!6>!$~z$p)9t^u%QQsB^#ei^C;T=SF(n>WGB3m$1Z2maX9Nrt+6c+$32 z)`PS(b0AYM0HZJE8JOkEzrvIRZ6;0x)2gPLP`ZFKDU-?esfm#GtG2eCau-NhCjH3* z8;ZzMc2d^xozBWA9H+=2k7_4%1roe&vs_1lvfX@pYHQ`v4$30EPDN*PQrwH0Fb1gF zuJ*#y(ucS7jU;ExQ)xU+{}Y$pcMrH#abfrZ#W7HEAs# zlGPS2N|dAQB3;X2iL92Foch`{p>tD;6kmp)lUt3HiFa_}H{k}5Kf<(+SeD5;u(qo_ z_I+$^tlWQ=&vl(;@xD@aw+|wpwo*Tnc9E}oTHeXG^ZUuZzwnp;>bU>G2gd*Xd%r(U zpM0C|&+p0S{EohLY`pON^W#7HkAG$yzW?6w=9_Pg9XomX9CXvar^oh{#Yb0jmlFCu z5s;?>VC3iNd}_nCU3Vj3k}E!fE}f*I?|Am*o1Ueo%*t*_y$SSSo>u=pJU%trC7vAE||32=3?@f&JX@*^V^Zreq5LoA~x4*ZSp18`O@0ilB zktLsgqrPKPZLlh)PEfv*Hc(&iO5aU|ozzR;eyI*okiW1a_B$4o-9#=q%6H@^Zuf29 zU2rGA*?)_lV_dmu#4+?N+3E-&v2 zUE4|=<A;kNO~$-;>kfwv8`iS;gYm2Wc^g*w-@NKHEd??3J2rhs|rm#kc+j}$-KrP^j1 z?|^GwwwAnwcRW$Vk`w;?qayw&d@a%}wY=c;!=|B5;&v?Qjb3@1v`hPFc!FtN+JpME zIc4^38MGW~(K>{_LQbi0Cm%)@leA6IS?Q+h?mxD(spa;nYyi*Hpqn<+PQ(@U%?2N3 z`o4OYl(Xzb9|lhO(|6#foYE|vfCXMLsviVFmpA^G zUwd`@##hnI!AZyRFz?~wzR$hbpI`i&?>GDlJ73qhP0MrBj~Ti4+9;q& z{K(!d-*I5qw*7Y*yd#bQ+(FYI&e=h-f;s3?AV_BrbwDOxlNKW5gy#U0MaDE3^dM5G zHP|@W$fO#A#aGfb@Tx>60in$W1rBUnW)R8%2Cqy^tacC+HlSh`4=O^(0kj5xWp&_V zK|r081Wv*7uYft~f`OqP6+@~&+f(*vR!-g1-e{ik3Zwdu zw8eL^naLjtiTjR6D=ky7*dW{kqfJcep1U4YRjFvFttiMsW#T1@wr`{mpmm?7S6FpKxh{hPAph6fugAWNxg*41U2?7`0%vvQQvs; z`YMa^o0KKCLkAZFr8AT#Ikk@|6Jca(Tj^ib2CZN9rD}_*zd>8Rwyov8AkZlH|Iqbu z_VSBkiO2MPL%*_G9^0r3;+t1~`=gKMmmSOYzVz=i-~YMs1E2rF@rVEN55~*SKf~Sc zgL&is$&;tX6Hh)le)d25566QK9v-i8=YMgRzcsJ7SVI`{HjMsSKB+y*Mr;U7n*ePy z>(Xy>t__0naoe?It~QwbTia_-_+?@{*-(8duGJz$7$29{KGKP;<15gOUss%Pf$p7b zZNAEH{m-5~#g_}-=56ZP zq!LH6ttzJ~u~jZt*&pJ{*Hq=RKf5ZfII1kJRBWrFB$dP|mlax~tdureR46W%M4BK# z02By-064$^n85%T05fyv&T`lMe*dSR_a0mfxY((D2yVak+|#G~+5744r~91uy!wsp z?3gMoakW+a$~>?=R-a_E=EXB-rq#=rr^9@&f0a!DeO>=Nz}@~slzHd>2u}d`wtv6U zaq{HJJmqlb9d}N*+;USkdz$`2ANw>itkaJAoyoiZubsU*-tKSTM*n=bUx^%hsw{W* zBckSj`8w|N=iq*+sN@*zJ*uwlz_sTY|lI? zK)z%hJf*=$|H-^G>eWVC+QBvjiM-T?PU6r$J;zWn;LYJ**vb^@%I3H*QhTEMnb%G| z##UR<4)#0kCk=U%ckGl-+Z5D=j0+zIK64s<5b)qBd+@yEu)?#nQy!!yzNuUVTE?>mAtjS%l6Li5)0HQ@h(wzPt6-zU<{vctDBea&O4~g%ie~3g972_gV7B@ z7DaQ~yK$EMslc;aU;57e>BPlj)4d-gu&U?2gk)f^iOK<5dQ4tfc+|vMAO;1Dp8zXfA8AP6 zto5Nap-@Vu+zB!P4GgpU4!nG_>pt)@@q!~-Ptra4DSPlZi=(W~ zOMan0=wy=YKqjr&Y!l%-KrGk_ zt_>GzL0@*&yjhqhh#?Pd?3!xl(wfk{i>^KQ^TIF#5Cek*2f*bH9E5V`6#fZN!0h%* z(5QYRz_&hukv3P4A#Y?;AP!-)d1wG-nL5R{gaJ=``>~x;L_Tfpf(-f6W}{uJ4U4XL zfj%_zC#JsF!rjo8%oBkmaj=<7?F0-U;0GHR{_oqGo|eVSHrND`y2vA)SB9 zt02*F6h~HYJ=<>fVcWW%7KvF3Ql7DIJ(Z&1%2R$*Z5TfUy7WO)^+3M1Q+QBc<3z#j zJG437{TD7wubh1@cmI2#sEolI?W7Pjo@nDbEIa=i-*>;`uIWGId;iaV@7d|w4}OC? z;y1BKJi<@JU7h~TH@`XkjlcfarjLK(V|?fTZ0?TtPvS|ZZBagg{oz~wT4((-wuV=I zC15R&wEN;cHwUEQ#)PsduYTt*3G}ZQXw%#!rM!JjJDKd?rsy^N0Fy0zEB&AH*cCej zcC?jwefS7^zQQ{JE?r#BPwXA#4md3j|NYa|tJnCdz?(cO&tvmE@z9Ht9=`@bU=Jo+ ze98|jP?uVK`l3a3wJq@t?!cRO<5K%*gK8^q!LvVlt!;hzUfWnWY6BzvvIBSa4;|(u zfE&}3Pd+id@1DES<>GYt$|dYpchQd?Iu;rInu5RN;8PBV!8y)`$4Op>=u-}U^&vLL z-jRFo*GGMi!?tJo?DZ>~(_>$&@BZgbx_8{MV?Dl)eEtdmpWJcJQvucAP-Vc`ht$KC zsy^C&R6aZCQKv5jGW|fgwA+|BXe0f?wvt~h=!<6TMb>_zy{p}T!hZHm&)P1Ff28nd z1iP;UcfeUzKBN@-OZQX9^Qu$E>Q`uFe#lxjDW2+SpRlj{#E5i4TN^v3fz)jo8HeA1 z5u1BfS2ttTNiC(H&BmEr^3JAH#@pf@ecl2iw)#{XC`ZP6WsLkaepxPVL8+SyNv>i8 zWtNw=-5J}Xhd9x%_;-61Ug@c>;w4FlWIxyM%NF(Iia5^QkvM|X{NMC@zNz|ZQ)xL) zBn|+l=)n)0+GepIJjGFl%tu^U5_=BWr6bFXr^qIqKn?vgK$ac`ocPKg95;q2t9VJDx_?W}oDDfNn5TlS)meX1(*}`5?|hwX9s@5M5ZiQioXAyRF}34;Ho~;D0$y- zo!}q=&InN8ncxY$f))+aaFO_L1U@w}RnXVpF_pKAQT5m+#y_CE3wUcw{|@{!VN%}{ zps)#|(Mh{z;eZ02Bz{8x06+jqL_t&r;o4Z9{ENLpiwWMd_#F_`VxM*aKK4M*;Mxv; zxQ@-3thEPM!MEH)zR@kTl^OfNlOKlU&Kb}KBpfE`CeTM;7e7=(lK_=+s1_dQrYn2` zoMBi`${xMAs33>J=veI)(4lwmfj6mn+jc?23Uz>w_0kbCG$>aN?OWIa;PB{@S$^QC zgK!BF4OYd0f_`GTGH4?$pxjckJ+t`{SSw0Ka#n`F{yHsd`_Wdoly7>MruHnG>gUxD zVw0fjd+4MONFSAaYq>hQFi${D`PTS;X)QYSJN1nKqfN`s(v_#jj^CAjRR_DE$;-B* z&6J(KrtacZb^RVaW=RUIL01_A7GB6tQl30rLYY2#{NC#Nnb-{(JrUbrz|#6Q$m%*S;IqL0UgDUB86fm-kJp z7dED~tJst=#)Xn?=+7H2@5gorxRZTkb2@ZldpdZSpQS!y&vGK0549DKK9u3xzGM=U>pZ-zwOrP!o^Fx{P0y4 z%MT2lv?Dr0E6IKbth_z)(mt=XJ?hOD0v*KL7@8+`1g86)GVd&cYV%Oq2Uz%8*X`N5 z<%yJy`lW=&AAg)h{lPra|Mb&O;cG4!mWN*)02kZkD*$}|pA7&vE$l0{U1UUd<;@tS zf7*KfGiQc6^*;T$F9UP|?0ljP^Z?F*6$X3o5hdd;c`Ma5WS~(C@**vM#(Lm;!-AUl zdF-6=ul!iL%}1D806Xf)t9)O5($9ePodi2}gRhk&nuxmbgmu!(Q(%XuusP~!WXkL_bSm{+D&EbRuI<)KMlDG)1mwp=>u zt?%wrM$RzIxSBQ_GP`g!>BsHMDd1nmb7*a(PJ0M5vjsdy6NR=mvq1W-p9Qw1bE{=p zm?IZ03{>&Wcuu}$0jy+^IH}>xC4NC>$64)QyE%rcTX+hutr(}=+^jiq@Ckg$RxsEl z&ZV6=K+AYZ#*bs2y!*&z#jsP+t+rPtk!{zEkBp<@C|`N%uo-2-?c>m&63-z2)vecF zcw+Nc|IatKzUzzr>{xy1M18opztJ&Y>|5WD{{Mfy_#dr>1bgXSX@R{BfOloHzfEZe z0>{7IX9yBsuf-t7~41l}wZ*<-GUFWrj1L*wRXNvRdCkmv&J{Q`uZSY!7`BALnD> zs5qVU8(2sGwx@M2p2HtGl{I}S!8E||-M24N2UmKwhlJJJ%{UjZDq5QtrAur@nKsXY z0806eEqDigyE=TV^XLCwKYwmI&g0w_^s7^~iM-TF+3H;5!umRQ;gR{`g$vUsKl8ci zo_p_`zVt8ufV;bwr(1Xvyg$9?WB<4CGPwWX=YK9g^C!Rfg*MPPxmL#VJLqFGESd4@~AKx^_XOtGWDHmH%j`BpfJH_0Ur8DaSS{7OAN2S{>JoEpZ;WY zv(9$O0w3zyOge}7T7w%D^+eEe+QfdOZG6-JA)Y2#W-O6U#wF;a|3k}mT)(tqDZ^%H4BL&i%fg#{+AtI#kKBNQiyiRkYzC$u6<>LWu6;qp z}IDL40b+8~e=kXmx+uHXj<1+yq|#TM&4TPJ3Kj=E3~zBP`kXZZ`@HO8AEDYJeoob3iw z3MJu{8>MLj?5r;?TOm^YhufM$hCx7_l#;<vQ8Yojx~@KC7aK*QUPid+ z%Z;$7{=xzo9v4?TnJ({h*Ldwfvb((N=jR@%8m9-KKF?u0->^T3KB3~)_G_CDKEE1CJiKU!svyXlZJ4aIEO?|3L+Tr zD0l@%OfKLF8$Q&F<045~E+`U2IRVRKOjzNS$;HXX;A1DLuoF(o4WzhE_!GVA+Ikm0 z;U#TpP+tK-EnXAAST^d*7A33PvJg-vaC6NBZBEr=rhFa{RbKZ_y6DUettW!gyo^+>w_%#O$< z-rN_02W-h!Fli@s3A{EK`U0%jS*(*Uo0MKqP~`+QW^LnaHbhSfgon3+h+jUE%g7$P z%4yievxoMPa%?iI>&3Wr?cdVvCs7g{QdhjB!6FEKEZ5GFZ}8B*`bPM87uRciF-g?QM8$09zD_?vlQphvqngrtf)h1B&A9;!|9g}jzkGWPC z=~cVaj)5rK*j9@`m~v@k^8&qOVtoa`)bQtZ(#QuM+CB+!*XPbpD;Hm$ZocIfg@-1Q~DdYED#Aj+2p74$P_9}=tE6V*~~U2La4)tK_4lPmsJeQ%~nBbd-tehdiA z7$ek|($tJG#QKa8(6`OgZV~`gIRmd=p(ii$95o&kud?H)lb;FHY(&DX`%d+rlBXBH z@nL}V-PA*Spof=q)Xnx(hSVWf&9627q+B@1O#IDjWm3kJac$e`bK0)^h;{)O2_r6b zg&Qv9O&Le6AF#@sJIyJp{+GUDIXunR*y}t{F-FZ_@a5x}--~o%O9qI+Pgz4tULGhf zP5Y;DO2+*Xi#ky%9%}nXMsV~O=K^gZ?@(IM#DA!lev{H(X$Q*Wuj(li#=M^aEHAH3 z@k1&kEt9l^fD~lTD&)XQMfvpeqEYbSM_uz5#zP)y!x`<+4>b$J5-8~`PuJLTePaDr z{@2r+zw@|UDE2TQ>~k;HJ@?|?d@t@j_tEw9^Bi_gvw8J-NPNS^KP(ohlvrFYGVfHr z0NBgCJ1nrb0r2i<=O0JQF$}*ArOW%=0A4$w>@J@VGF?9}YkbeU%f0ThA4GRfW4gBe z>Xnza{_x==%XeJiCjr@)=5J(1IJms!qvWIWBpj(X-lxhmD|F`;Fz?FK4)N9i*MU&_*>HrWbrYZfVpjf zV76s80Mx`LMPutI8!P(@ppB1i%Mho3341;Vw3Bv5#EdA+JS%XZw468Qy+c zZtwnoq8=H>PKvd1m_aw3Unb3%s-7#g|@W z6M}_0Fg|s0aNPN~|I|xXc^ZH=m9I|)96xb9KlLbY+cFCz&W>H{*VnT!d;RS7>ESQG zqQs?#n*c5tIjeVV3OH7&OZl1_Qj;=u@JbwgzWq5gC`ZlIq2Z#v%1%v7JB+akSYHw- z-?CxZOx(~zZ_BmWyj`q!leNb@?Hu0-fBVT8522q8Q)PyhawuQ=5^b$rLpS3{wPUWa zpM34}%3%_x$7Fd)%XUqki?n@k>>D;P_&EnXv?3!sZ69eX%v^@%B}U0r@|ib@-|*(U zpT$4X!LLOrC#=)sOJ~MIVX1#3S#fhSEhg z<)ZIuGwT*I0;^sUu*|tQyo9%1x7Mzo+x+9-|MuG7|E;Ur=X`WWgZ81Z`*1OD-g6(l z;D4u0fQFl&r7fNLS#R>%bLYt}uFadQGxfQycK*Lp`3}Th?pFzWyo9Bh|+JR+WexrQDiPP{7YV$O|o)1>$=ht(bS$=!_{MJJ+T$-MK?3R5Wx&7es zi92eNED$G$4E6(~g9s;|Opr_j3G^BG<(A2siNJ+$Pkh1})QOvkOITG0*H0b|1;^yX zm%xC!1TcU(nbqBm3h*J9$uB_(_`ZNnUOg!pXtiukjvZLG9!}8G>xo|Z)S<4Ch+slF zx_PA4@XA~8wJ@p)6S)mQ#vK9a_+4j{6EGt7Z*!b`7pmbdm2)v!E9~ z?IG0)-ee`LvKSzgJx8zxjJWZ!=sW@?%ENaA8VN?hm4*^8=)f;NM7gQ`BD~P2f*i}W zc<~fBwvAr;NigH1@+|$qp$-Y z=s~VG6%sU#>%vjj3huf+5QV?-!DjNVcB|l0->*e-O;5eBEIWm5`bXQy5@p@lFwmCj zqO8hR{U?0Xi;BoABK0?aWM$euc8&#}cXWM8UFoNd^_5C>Cs}&y^aY>nxO#P!@ADs@ zKKk)bPG??xaXRbd8pl}jtr&wcK587pjqJ`VU8zdCZn>@bLFq0L|Z zIo_Oka%=k9uU(kF{l$yZg;&P=8Cr0odO52RE4gN|D!J`uyqX>Xmh*u%D`hA2%5I`q7eK zL4wy<$ak#^c3<3AF9cNXvPZ@PU^DhmB)lp9JvJ2L3zpeGuz|i~8<*|q2iU=~qEYp> zo!8PSJb3VNPN@bjsl#mi6JENel531}&`+JdE{(AvllH)ljvv+sF9sZidKQxW#s(Ru=bAGNm=LhCHVDul)jstxid(qYz z=iwa-MK^NDuE>!;{_4|p#1CUm(Qk`q%~$fPv8VcZJ;6p<(^EbfD+{=s7JA5E+-%%a zuDwiiJ!3=4dV?VV7)-t`Q^sQ`t5@bw>N6JsEWa$0?N{)ZpJgUx%s3CNqOUI@FM8W3 z+Po;(LIv;m+%{1D*bcfiUON6dUZL@*Ta4$x^t{pjEuHu&Jfkz%J+?@%e7#~0>k+Q> zMqcGqe#>kyb-S{C=E=v`|It5rY3mQ3q|kt8e)Ph>&o1H}Bt34F???X|#fesBSMvXB3)ma?(w+rwWPuu?-&!*-o9Bh{+5u)> zKF%m)!(R0TD#L*;I3`IcJ-yrFFp#;+2c$1-?wk+;1PFo{bT~?oC(E2pMgFB z24zkj6`0q=AW@ZY(s5qs3CFyFL`^bKr9jx4K*z-91S2*yn~oEilT3I}pG6sECMQ*y zgf8crTq`)T-U-@zPvZ6D8(ad4)WOL~TY1!}17q_=gLwsf17-D3&<3o$qq{N{V9wzQ zL+vI%=^DI5lwr>hj$B1snXZ~;}h7c154#Hc#=ojifi%P_OYw>QYN`5JZYh? zHsJ^X;LM~w1me=7fs%~aS*#$Fwux;EIXsjv_CyAYJCITid3O6ne_+)~`U$=WctX>* z*6+NAj#3F1fZ)B;!@>e{^HL(0mh7Kr-A_H^gZ zT;S*4&gLhk%e>0kfzi_@R{CXb50c0IbqUbfw6 zuWAd&ocd(pVSub{5mW!Pf0x`l3mxIKPc0P2_yq!1i*8aA#}s_%T)D`v9Gv1sc>7OG z$M5j*;iP52_n&=s`uI=& zWaRXn3s&I>!?PyRxI@TKOkLDQ+e+P0!6 zjQ*>g%a>)KED~rM(vKfmo@5^oz%iu8sk9IBSiG<&B;}<%mMu1}p&?Ca$kjPX+m!^> zCejN$XK9)&6UTlcy_O+o>Mg57pC~(}PFl#B@np~_TIKt~Hh+0pr!e}NSszN*V0AD_3C+LTc!qh0B-Q|_kJR)mDNXz!_!ou^ic-Ht@ zbC&b!&X}zo!jMyBDJ~_0dF2k-vS)Yzt4@p92Y~1prHVkteB_o;VhCu+s>XEqqjTHG zddG^y5dg`~Hq#E9OIP1~Ve5B){kt3g@DHy~=U1t+)AZqFx%-&k!QZ|3pI^^62j)0) zddrU^Kzfpac?VaD{7TDVWc$YiC4^clu@Gh9$W%FzE4n*^^UFeHT z;pT&u6@5KFn{RquE^MdWWi3PMFKj>g>e;QYe(T6|&(ewg_uR{ZhPea~uxbusqGl45 zg~d*KP9oV+rql`EX|00F3V2*BCnz%*0?7qICY8YT1iv#eW&)JqJi$wTF2s`=b-hr{ zq!M?kdslbJx!$}o*aeDDqRDhQ^ zAAkDFV8EcmKuKK7f}c3MrdiOpGCPdfsBDla8dz`3k7BKFjcT8kD`?Y6BGhNyPB%qY5`k;9QqAi zZKvj;5EWFYdC@E#kq6yHsbH{znaGPA3G}e3fv>`6LqcGVY{-m_7VDK$S|O&Q!xqvK z)}%aj&M7#yoi>!ebQS?m;EQJhAg*H@NkBirU)s)>tr@3O;BIyMK=l#jO?7CeorkS0 z-_cv4D;bQ%?p#Vs9rPvnTW;HwOobzP4`Hp(!L@i?=2~2JjXi)<3Cj}PawP%r=gGEQ zKC(XD^zpNN|NlIX?w?3?+9g4xc=B^mtBnoNeHvzyySh9Yj?8!6^Zq<8e$f{Qg6~WE zUU=b!>EgvVr%!zRaC7s-!(>B{um|M<-G^7pTVZ{+52 z|M;6akl)-ihOG8V`|69@A$_UniHEq9*J8-CZNC97S}bhMh!Xx1a8qNGqpa@#>Z|En z*m~tWPd&VPa=PUXe&X-Y)$-S25e;Yk1zO>h!-zi z%J=(yKfqzWKi`Y^_^)jWP1`PQ>ezuO=1Yfad&;eiJp;LiW`@NpC1%$b+4^#+gkqc8S3u-~`-`#ovib->0&cq@Z# z$A-sY+Ryg^xCwA@JOR)=UwmeT9}IgsGT@c?1-$*ff9}+~fLGo+vVf*MUjcwGUJ4w( zQVkOySDt)bfb!_Qz;*o91_iGzD-FA#c=rQ0G&0|XR^jDq1*4x>FH`BK4WOyqCdF6A3N7PgHPw0H$MG;*DseyNQdALu*iA{~9I@wJip z#+i?O%F^v4-|lCSh;3~P^=h5vBaSi!*Sx@-)wB8$GzA%Q$8KC_9;Hy<6;>k36?)d2 z&&PIA-nv%5%!8tkq$jNM`ocwJbFP=ZqR2QtB@bi})|5>>%8HhHE2lPh1RJsd=VoZx zq@Dl?U6p}c$_Ko%`j>HF%x#$;0X0#TL;A`XyHn;9KS$f3N$nY+m1Z(vU}=o1bTS_TjauuREW@@z1*5 z=|*L{VfL=yg%+sM>s_e$p2|P61sqFnl;-90e8YBG4?cbF@;(dSb&c!U!LDKE^_}-T z&x>Q~GV{UTn$|X7+y46ZFKs>Zos-KSy#2s*{Pw;B>ZFoMb}UMqATp6>Qtbt!WwrRL z1vO-WlX@l;CjMGr){BIC(IbHM{aC7#mO-NuIx$MZ3DF5V6Pm(H)`?Q-n@6(3F+ovR z^hbcqM4ZVB3JHP&%Os3GPJE#yF=#1^=Uzw(Ujd*&M(YZH1X3m!fLu$b;>q>8Ew*V5IB`)wU-H z)i&4-oPPXSI+lAF2pQnWHMS$;wR%~v9bzNO7B~iX1V_rPj5bu-9$15%1Y-D#Fj)*s z8+}X(c(6?^=AaFq1R>F9_+9iX8O1@2@)hyFk1P8mR^Oel`G@U+unm7M{y5s`~V+Hr@ znKRQBz5?JKfBEVMwUCg8ZL?g9{_!M(^xW(@a)dK_#qY7l#q-yv-}+x3$NyA98EfIM zQFHe`=5_p|+{ON)Tt84`$B$|N|1W+nR&oL)*)Om?*IiU?OF8zZBJ`ENlk&;WRGSH* zUiL}(tgmIGV#qM$sksvx*i-q!FXBj7j+NTp8Eb><*xUV9-*xVBELHX$`OC)YUwlK5 zY+xYmd|{om!heBZ?I&Eu8(_=_He<9;e7T5CgQUFcmDs#Vcy$ULcw~Xj^@1m0wP9je zP@+d|HdP;VjIVyD&NXIB(}k^c@^lpXTjq7sYS6hBB!4$Y^5dnWFAs~=Z%sz@W2J08u^>5k8;hY<0^I4HbP{cgI@P# z=hxs4eH`CoW7|escnzK~0pVKR^xbSEG)(YDdkKqv;;K_(3C?L_iu9%EAC*U5*@gEE z?$zzHPk(RgfBGlSZ~lwNh#6g|*I-67kGuw?-T@9V~$U+?AjEU>V^&TOzK+RN-&;B6MDk^XJP8Q;6KVft*jc@GDw zc{!JFN!HH?vxe{TuG@W<$Q-t>J$Gsx2KZN2U)=bEN7uJ5KX-h(_wEDxj-AMYo{1uY zdggEv=|Hb1m0CPhu(42tjP;ptm|(<_p2WhUSe2@?2qMvuNT=+S$N;2PTC9j@x=s@u;!5K1S zf}QcJ-~rhv%jSl45X=Gx*`o`U&a=|4#a!uCwsnphb|I&(3AB`xYwf8l%I+Z@dA4no zM?1*hO6}{yuP&ugfk}cz_0t|K1bR`~?H_pR#Fw6YY@GyT%(jXBgajeH z#PtI$11GYvN4HhvRmLHU?HAtyED1WwW*gR~1tgRUy3s3g30ZoXYuXAetUMC<0xNiQ zS72q<2PjS8NG?90%mVUHTGB`ER(=Gf2o(n*K=I-T}&rTox$cOW2 zxc16|ki~Gzb%#I7pcWsss8`|g=kn2NOY_=Z`_O{%Y0n;F=olrAWiB!;UpY_V)f3Y#@8f6f zc;tVv$w{S8K?v)eaKHb4{`J?UJJ=|>85^10RJz7X@zmc(@V%QZQ8_sdndG6pgh^lG zEKR?2Z=DkPvF`|H>c_FISC4Kl>jR73GL~?iu?mL1sPXRizIXb-2R{&5rQ=418#!lb z$5mbodGH`_{%5SrIkF0+o_zm5n;5n5KT5tA|9R2_`d3yrrZ4=;pRr-YlLaiQ%jPu> zS38+kI%OP(ZIA`G=P?dgOPTE<4UaNJj8SyKw_a+s89*+y3P!(i^P!$TC|<%i#d$>@(kniWKQ(?uR$$VfqH~Q+ErU7;V;@7|-(o zYo4FOHoRrK^Sg0&Ux&`6?PuS3Y5R*09$Gqi>Bw~Vy#!!~dhu-#;B@0crGn=o;RNFD zvlDz4d18fEFEE`n}CGLFN-`TzXTA{0^VeO;3?}Jd$NUx98R>#oWKD18R!^otI5_wj9D!-sP9J^s;ieBbj8UgmdLwa~Q=eJZw~!164p zz;$7_&f;*5yY$CS-a1`ial5^KZMuoK+H0q0pM5rq`g`xYH}*Ti&%(JePDfwu|NiynNBGRm2w*6yExZ{Cdo^J+)!JV^5!~ zahgcnMHtDp&zKhc>JPc&Pn|M&=tnt#_2>GY=c^j8@l%bT{`997e57T6(I+onyvU0l zud+eG`x|^3iZTGtKrp|@llnP89`o;~I*`XU_Qi%rj?{Yql;!%B?dc2u<9DVvUiHP{ z>Lv9tF0u&rC;lw=_vcf|*^lMwZ9aY=j(QC+sZfx9*8bi8LTRdF%UM5Kw5N2zjekfp zq>5HurO49QwB=Zog5w5)^opjkf{DyMUx?d%R=jFQ;c^wcF3Um;nReh@l-706h1qyO zV9Om-9A7$hUryhrK4UI?GWHER!a4>Eqs-31p~ZE{RK9H+WN{dOFC9t`+oTrPwn>ev zRc1R2W4|eTsJ)7&Bw{XbC~w)b0Owj9-x-p)Aa)%6j(pmQ`aF%qS^tCVf{(=0Pr|Rt zwMT3VZ2Dr6qs?j@kBozMbf;b#mV20QUzbj8LKN*D*Dde1NRujuG?mXp-f`O0w#odI zk}(ga-VLehlj3(YN0mQBM&_-&P#HSa7uhV7FV`h^`L-p}qck=sAJ%leK~kF{ zTT5#zFK>SJ_a5E&<$u9XNV}z}(7TUb>^snS>|V&vultez-3xwU#GNnxZ5gk3^RwKt z(Ql_q2S=Qyd^9|#Vsdas#NYr-~9nUi_y05=G5QZgA-bbwMkLp`uUIN?=5RClj> z5jZ#_hvhqysljh1P=b?^X)M;9=v|mPaXLvt+)3V`S6Q4aYbU<~C1tMQpn|BH&`TG~ zBR4qOOFG)4^^j)o_FEP?vP&VS2ouUrUVJl>%dbUvH40kr}?i#9rz)=tV9AQSAw=)T0Br*b*5ER;{ZpbjT;D zgjNZQ?t$QPq_idNR)H@I^^wn=E$uQ3I2$*5AV_3}He#ino2K<8X_b^LBk-dpzJN%j zml^$nwvrGjzQI{IVLbHZ#V=f7i`HLtq~F1=K44O|`Jn}*Bagt3`q*diabZ)7XWMqC zEh4AwAzwZTcBz-XB*~6^$r``bF7T9>GVVV-O@}^wiUs`&i?`!h+{-&(d5{1{?4tG% zmA1aNvT_OHeD9lI09d=a!rS9nEMA{rHWv>yh8O zJAV4H&FKsO-HWu7ykd-;%f{NQ6wwCpO?4w4R2CQF-DV=$*X>LCwe|Hi0r7|3^;NNf z6F0QOvS3uVHdkDTS9{58lP3zi)^6hX=_LR4>-@CexkJ-!_wjX+O*a8Z{IjkX3|GgS z|NR<(kH}x;1$%A+EW0R2r$gLT*EZ(M=ALS?rp+y{zTn0s;~Ce=n>**qjYw&CWYcG} zDHR(Py!cA(BFp3^&f40>^bp_u|8smz<8FSc@EULZ*KY9*Vb=~$FFncE8xF5!gF+ta z)Zg*XnI|38(KgLH0C*Xo8%am?h1a*H-~82D{M&xsy@vuH$Go}=Z(hNy>%+3@(<-L4 z>Nn<-p;HwiFkNqI>P_KLnkU0(9o+G4JHm|w}37c-; z#t&axDS8Zkz{xK+8?dS3MK)lxPvnx|jIZ^|kba~tEvGrki~o+F*lum>%-!JUT`bZW zxUn~Rlk#|&sx7sHd|K9e(#k%nZM9JVILRmN$XPi>>bA6S3{XOFx z*WJEpbK6_lu#GseP2lAZp6x?<+jnVs`}!NxqhEP!{g?mQt6SeV4Uhu^z*%hTkbPJ_ zKY9V*3;bUE&lmpI^&|gXZ<%!Z+%)B5zIo5j=KCO<{QSH-?{z2f_R^jOey9cZHUNI8 ziS__?S-|oBMrmH&`92Hppfta}5sikM4}4wL=XqU650-WQMsV}8&UB(!gVXKrCD`8QB%;VpPEIm`Ws>ThdMBD*wEO6-lbu0&PtHzAmPscQ6RJDO zQWPs#?v6J;&*Lw?8`p_Nl!(5UZn%d&RB zh4pcGWsrs`v_`&pq^=03z7_<ouNpJ>U z+f17*f)b39z;6V4u{lKArtay{~S^KoV)E(u8sFmTrHc~JBqWCCB=~6($KY@cFMLV{#K6j9A zzC7LZ;Wu%zb$-T;4FF$ii5=vhpkBSfo%i{*>({w^%^h8Swk;;)yZn%9TaDn*eNT9pmovS$dVX!7HaT5<`86A5 zFZ-**Vo{@9wx>inFZ>pHvZySfqPGi?@+qGbU_+FJfIj2T^*!~}_oml*`~RnZ>eKjU z*;#uy-q=T;e{5}f{>h8e*6K;_>K~d89`k4X>IsDYnu6DEP8~T?kN&%fq%Pn8&g%5L z{|Ar#ukZ^FS@1hH*ZABEeK!F-+{91^e+IC8PrX!5e=eNf;H>)L*TYX$*PjTi1-B-# zUAjM4KhM|+e0Y8_ znQXE}n^G1yHw|o0v1*KQ>=3tPgl=m5S2_t96$>f0>&+o`kNyED*)xBLL@NHZsk|7M zhfF=53ZovaOOLPG!g*Ty8GGF9ATRxbq1=x?JH|S%{Yx_ISY*m678uv1ySz<3Pn);M zeqgeHD}!*-%9*_Uv_Z=*U*&2$#>U{=XS*+D)EIM}u! zv7kA0w3<Z?CMqI(_|_H-|Ec*cZieF6wLTdu}6A=M-8E&`m~oKP1@SSCa1)#9rrYtfUa z&xG3-oHG$ZJd-f;)%S3Dym81Bo(6UXS<2wV$VZu!LD~t@D2q-80&ECm@k3n)96b>y zP^Mh^O;d6DT7Hd_089Ho(<8D|AKnHPFb|($qXdz_C-@q{RRXJFm)IZt$S`msGjzl? zNRp=dHBWU;;@ox3w}T_V6D+mOq}7M*TkR%QKJt$a1~`K@rv>k!U-2&hY4{iX1h!sQ zkWzBbf^9+Pf!&}dr*cK9RO*ciX?JRSc&(gX+a4WcS?;6IUZm>DnXYi^78@Da>5hSpl)HaUnc0bz`Sbafz$=7pe zD+6d*(7O4QL;>)ovH`TA;SqnLycclWH=mo1y!YaC*q8M22zRwn(Ggx7xiF3|tKT*hr)=Uv-ndfu(o+~w)Ar-S>+);hg(azvM{NiU zn+CJ%i=F{?$t3&^4|Nvbw8+iuI-_VqR2 z191NJ^WZN}C)s@QWq@fmVAZQ0-?t6Mco<&g3-YTcKG2#zl?_uwcCn&8V^e78gTpM5 z(?zd*)_A|yLk~SX{lv#UlAkE_JO8bpk7F-y9-hAb2QLJ7+Ttr8D@WPc;2jTc1RSAX z@OzJ{?FNHw?85)p(G$~^*Y{7~`r@n8xBuh?=8Ce_&SKtvf*n~**OLp5_1aZhl!YR; z^@=j(u6{M%i69KNv1P<@p&s3Uucw)6ahf&(w)Lrv9gs+FteE6yz4T*q%Bn3Xqpf2@ z>O2drzX)67gPPOsQUTV~G^$K}hEq^y`;|=IT`vBP;n5oz;-l&Xky`xI|AuVg6yo)@ zHhC$x{vmwEEUsOwdYyXywZEo};0~pQviO*m z8MMki(jH^wfGHbVTsG4*J~idyRXa7ly4pW$UgClR?a}QNflKU^30J<4?1Q$vlq3Dz zjTB|D-H^LBV~Rj@8Dp+C3C`Ha5XU2PGjwe;`Dhz1i#PSk7a1rFjrhu_r_9B_z9){b z@eO@S`JiRHi>IvevaD?dllXVpqsC)(T==GXa>zflfsfq4#P_(Cas3Bx-_pj#?Wex^ z-Sz+BpS`&C`+r8PcMSjuE1k#gg}K+g=%43zFYxD!{f774v z8G;pO$!VF1uNF2yOU;QVrw$lu5_3_Mpo4lh4NOi@25kvKEWi@WTQzxm>14OGNuiS$ zu)?`0a&k0a=*eBW9@{KDI$&`@lS!LN+&aq_bBJyJO&}jb|s@ z$hTj!Altl*30xVa>33JH+u$RuOv=C~Fo1*sfPo&lz=a36SvL_ z`VJZsz(7Y>4`nnM6Q+Y4`MXd}@S+OXPq~Cud*J||ww5Y5N+H+c*{+bR$^oMO;f+k%!1nMuiw5NfhD)H!KJl?(@6dALJ)@)bgth&;og0Tx zEM-(z01t6#aG4|?!bQF?mJYIuugo6RC&a6^h)>zJ2&sKyZ+M$53r%2sVV*u1JY^=O zjbNz^(urLXbQVAHMUelon|OiW3*n9tM+}h>k=?nkOOOY+|qmA%cs6|J#1J{0I zA3)7G6G_GCiSjg{Czr<10(_D%C%hjQ7IpD=*Nux;daQ$c!_ z5~`1yQE4mKewtLMF!0{LQgReAu^H#e$7cfIcCi|aB z{jJMKo%zU5T|9U4y8FCkwv`~sgQL8e`=KY__@g#LZb}MJxD0rgHh%rf7q^~zLy{a?$YY-OT1Fo8yaR~W zo^?>`=lL${vvnR#tMg6M^ZaNTC|=0ZdFwj8Q@-mx&tc}}d-**JyrTv7HUQqyG_fRBHersoSoNq&F?-7*Jb9V;n_&Cuf_9_ zuSZ2%Rc86p#jU5`c<9>S{mm20AN->aF8}SnbjyK{{4|rx{%yb0sM^d}nT$q03)V5Q z)#MCet_=_jD6()OILRbM0Fl6g$;^+Fqm!MJm*rU?JI`6>PWt#b={eEKQcav>y)Zx! zHZ;MvJhTWhGs#P845izNfVINWC=mwgfF@UQ;Ss00|D<^7|;us$$d=5+XQmT zP(d5=7>FTrc*D1}ELmDcVOn2+gB!lUYghTIlSw$?UUW09002M$NklobpV-6bSGP z^Z<|C+5*1TCwK%#+XMy`ZC{h^F1&A5m#-TS;@Eb+O}o?- z^oZt>Rhg@e<}#`4vI~_md+DJZZSTQzANrW&gEYxUf9fM!Y^Z+&G5DtK4qd{|)eiN@ z>)3b;g<&`H?PqB(uI&S^zxTsd`>T;Ji@UydJ>UP9w|s3!zw_>ff-nC&dGf^c`M-B= zTD{0dQ1nn%7ofdh@LFBE9rgM06^pY;Kwa8zyZo#4w60LyRA{)oWKMD<{X)8FqrlQ1 zN4r+L+3#&j@cAT#sI;rDM5B&B+a_=Wv=El2*G{ib_ul-T>F`Z2*OLI)!G*ZCa|6J~ z{*N3z%r$nG2KYV=5Ze6f$MmgBdvzPe5anaGKdlm$(v`kCga)VJN*EdiYaiOm;{MXb zmFa~SUzmROr$0m690r%gJ|EjFB&bhLs?WooTS!MR4Y@r8XaUGMat9cJTgJ1f%x}`wAV&$J1 zlKLRWfKL&5W%G%%JZ28QbcM_20yy@&vT4a_zWQLnxo9`JDU?1D8pEcvcgEPUIWD*U zN>#?t=%$VgkP4P|DL;sPC9M6Zqcj_hWby*Y@+m2fzBzOW3OdA2m`>azOrbsfS`J#4 zT=+<6JC^aW-nOhhQEgmyt#%M5x@%VXMP{?bL;Ud2W_+aOIc*MXWTJ_*>9YQ3-*W?m zk9|Y?l}`dgTYK%iY92E6#2~P#)6Uoi%-~4V*g%@vF7Zog4sFn}h44P9BC)*ilXK=P z+X0xo8%3GM*dD$>moL~9@I&|XQ8KaJutDYne#X@#9{Oxt+J5Gt=eB?SE4%!T}qax`qy@!YhVU&}B*1GbRQymg)4Dc|*;=P>i~z5Jd9 zexL>Hk$Y*+0{^xaaNwEG^i5}8-hn%4mzVIH6yZhV&?fh)s zsHGSG`um)Qb@FL`O|#3ER<@pf+YR zxtnW1i1#bB$CNI*tqG1vZcM~kpbyoZh@J4ntvjLy zGj&H(5EqA9)hXFOVIvRxT!dt@H*kcuvPq+PyQm8qvgad=f)0Mx3E%SNyTue5EGA%3 z_TZ3#lrf?UwtWVe%AzgQk<bAE|TvN_m$F`$f`Le+<)htQM0x}+~>L0kd%hEIy{sqw>H1=`*bRtNRbCaSlcm-KZbg>3x;W>cSom-4B< zzSKGj6w1JuVyVD&9^aK$v`B4eG;rfqdlfBdE7zIFr|E;gaND%D{Bj1@CH3ddx_8^N zc{0THJqg#a+bUlV*uL#n9<3k!N!hWV{$yKee%siEYub^vl7#wb>-?%h1ViTZ8RP}N zUV>NcZvMc5gVVQo^#9gdZl3PrJq@d?EdI3%unc0;{zLnxhrjBL!qT_&F<;mA-%4dq zJTLa#v8na8I`CxEMk%o$Q3j8~DPIm<;X=oO(|qwtsck&2^}YBXMe$?XR`~dN`AGSx zysPciIg2jf;y2LR0=^di)z{i5$__5T^chppk%xRu`l&vtUc!5HQffUZ?L>L^8SAx= zux{=+4+d9T@+X|v$|+posSo+|Nfz{6ZMjiEdpA90X`K)(b=e>pGKGf>q%9tYUy0r+HH=L{N8j-kqN>(5-W_w#>8Fy$RrT z=lk5SyRW-k-n;2b)6{abe3qFv?LJrOPI+JVx#9bI@4RP$AK3zX8vsADsrCTh!2%9I z4B>A}yUY7}_u0X)X7(B|&G$elQQ7}w?v8z*`W)~0zNv#kgMZWZnAn}fTqrs588qc_RPNe2 zp)GOi&~hg~Cs?iLV|g`U8obq{E)8LNl61m#Vs!$yZa)E@xS8w;0$gzM&AJ4|PK+-8 z=M$t8s0(L8=HPhl317LwkIDQ1x`=0;JjLr2xn)Wc-Xu&W_#umW>?}N~HTWG?6{q=V z+2oB7I+0b!EQ+v^bGx$0(({531qK2MM8KCHzvl*(dQw5!1`UCy)U&)?%!`wS8#H1Q z%ZIL6Peo`soFJ_#jWpm6gA4bIa^K(vf!F z9f3bsu3u{>%hKkQ2M$}Cyt5cRN6@W=irI?<&peP&ejkjowF?X%@fFv_wt6&=dUC~p z7hR0Ri(q6kD6a*hZ3Qi=mC<%cJF4|)qow_9Bpj%h(DkB3p5ob8jokXX)!Nd#R_mK< zyf%t=03g%mCU>$Ao=9703*U6_=7zBH^6ZQ4w6lNbpWB}P&F}b~cNMJw*~js%^Sk{t zS#(f-yPLN5$XI~wUF=9RZLe=-BV;U4LbKXc91xMgzT+5F{Y|=F=Wf}shmu&ve-?(- zX3C>b%2^A=(I&{84Ta!R2fgx_S~N(X3ew~e;+5o60 zSNz$$YuB#xRKRt{s=5;#e8}YGq{u~2Es^ZMz{KxtCyZ2W4KsbnwjZ`vB^P~eBIrZ5 z|MBC8r}Mn@@1>Vsoc{7({EM-rnp&^m(p_IYI6eEsx$sjL{SYq~EV?;bS3gUuQi_qV zvq@OT7;6F(`_-HvUd99ajXF_hS=qS8;?SZrw5(guvW5@9*_aYw=&OwOH)*Xaq%eq`x568Cj{fw!D zw!9fjA}4uK9b1HtUm{BiQzzZ>3#iA2Jy(d6zBzo$`t(ikgt1NJopIeV=_2C-hU=7p zr_Fmjmrjqn);A4#wO*E+kN-Pw#0JBU;VU2MnXD7G?W5iMW`cY(CnB#jvzZH?@ksDM za;(jGPl;`*9O7lH$LGQuK9)lzyxK0>KwgnuTH0!(d?n*C?b7`PLJNC1pTx&hz;>ms z$GqIkfR}i}`Q%}AnAR?x-~9GBPHlYt8`q}uR|Y0V4~6;Jd>6X7|}au_BlnAkEJQO5vN9XY0GnXv4hc9&CFM_NUTH(;U6t;9RAt^`~KFaZks;y?;qWF$32;7LCWL{hg`QcIQK-I3DJOq z06vqy0RV>*HVw$cN~s@{xkZZ!)BJ4FC|m~{p+&tDWCdx8k5U9-mKo?ck#=z5WZv~1 zh`33RG6QPrvw%bn<&%B_JVZ7K>0m=DF8DflkXKLi362va>;zQewvB{M;v{}(l5hH% zYUkl9{_7W`b)CkPt4wk)E>2b2%m zZma~Ja~1-WTc5i_wpVc~+enL~Zo-BRJQunTn*C&jw#Y|#bXNvt%~`sXCm0<(tjirc zv8-dEP{CiB&4oujeqS`QSO-qnx(kQDU_Y5;!B6|SfKvx))keqgx7p9;Szj-lvK@TcvoHQL`JMOQ`^RsBTRxvQ>p<286)FCO3oE1iO>Q9ig1;<$&@+CiMYM;! z^hr|gd{VBw8~iGPaHha1tv*Frt~p0WA4lenx^>aXa_m*@RxsieZz;>y|3%jghO|py zfK)YfCBoMcP;Q; z_}kZqPL5xU3ybfT4|$Yb8osnK3lVsI_lYN__uqg2bnkudqrKQzqO2FkKB4iY-+n1= zt9<%ybXVb#pt!K@qD(kG%HzVg>{C8ci+J18x>ztYi;m-hV=`&*XnV^yXrcqOGrqaYNIsPVCSO6J{oBuCJH{OKEse-gpCmd}d4gc@5l^2LT3q|$d~OMm zA&WGWV=*67zOX4qbF+)0$YN$Lzt`FLO}k-FbXoWVO!O+}y6}szJ9ILyv<-$*%5Cg{ z>i}3AAkOdAuBFS8^e|+P`z?=r)H%KqUoTm#SHG5PaaK0?`BBd84ccn>tmWe6i7s^7 zTDD)8KUyxI#55?T9JTR_F~%4vz0Kv7Gv~Iy`KQmW|N5i+4vC9!&8TLcJMZ=UaL}|) zc=OhE-fQz7mb<|3>xSuTVf*O1=F@b&ZaL;>ibLPC<)+=|d07Bv{~C5yw3pqpz>jZ% zy$ygL-)4Il?`#1Frk+3NQ1kN6?;gY)ESY&01LmBLuzd*Ai+am?(4FVIzUw?&*4NJL z{nUW;I&ZmjEc5VMoWAyKJxkZe#Q*A1dkGh zR{|8u5+sO3ac@3|lYoCV@w#Nnf}crvsTW$|I|9rxIZIpFLUPcNo=1W%S&^5&cbkl$ zx?DU1AoVcci}&aPua;TMtGgfNZ~9zTp1K4H=w}k&V77yclqCoTf#hOGzNV%n{sCSz z=C!s+&{I+U2z zR_Ja!w#~#fMebpbUf3yOHLYPyJ1yNqu~S zie(ljE>N|Tf&E4{bnuC6cyKq>pc4AhYS|T0Avd8}d~C1sduv=|XYm3|><8VY@nlWx zfGGM)v{H{GWg$qkEoj@=!g82}HuR<2x|BTN9CBeT&+=hW^vB+OXqnUg0wPn&;Oi3r z>%6?q1&Z?ID-e|X0y$sy7oWE8avb4z;h%eOd3y64F(PCX+edzD;f*c4lTTsYp&ve| z-S~v9s>ojCP88_JK5eAGnyl>w(E^mhEHvT|T8#q#Bxv7a6w4+6ZE2C^oC2eu85@ul zQLrTe{_uYRl+VSbi?gzoGz!1l;N_>5raM1#9Q&|2LO*i><&zT96Q=z`yK95sDTo_e zoYSp2y9uzwp^Y}yfkQ-XoUcA9FG>2@7=Vtx*Vp#d1)`jX(XD zYv8E?e`aT{Q+dw%Sm!(~s*hRnkkNzUKWhVL9 z)*jWb;17PM=*WfRg|_qBuL?k%Hq#2_!`69(mj)wwtzRmyaE_hk)xkRZQ;!ejr{Xh? zfur7*Nl&=QiR_jugFY7=^`u<7;`LmiorQ58vd);nyZ?@1p^NO{uO0Z)fAp#N)!=D; z^n#8b|4ho@d{E;?jZN9?Q4Z^=3*OK%IuDa}TQu)Jw?9OW#7f&67dD=K;>_0n{U_(P zzIGb2a`(`<^SswxCYQc8-`9Ny-?|$;%0FN1ciyw`o|~3ud3Rm&@@(?lvdyo}Ti)rN z@?GzF4l^&`%kNp>$F=~Y&|ccJ!2hcjaDZa!cw3s6_aG)*mwWC3vu2DMV9j@V6Lp}q zym5Mf-CbrRV4a79wEk|s%RO5roi4LpI$pPIU1zz+T<&EiqUW8Aj&8l@*aQ3j)=%HO z{S!ZZVEN>oPP9&V2_mIr;_RfF$&h*gSme}qS$pCvu)+-v++=95ncz(;3g2^(?8`UJuVY~sYm!*WUwHA zWNUrZQGAbluafKFqla~baiMKqd>57m6Y}da?}&GxWx0BH09kUmkdi)dEJh7rl%qYv zphsHsuVQFVpMVg*fOi5OA5k=klO!$m>wu9BkzP!?@JGAS9kA%$cksCm4R8}EYd6b= zJ!P%V36^YA0ypp4w|!zm19{+u$tDNz>X#sGERZ_*@(z*ww2wZ}@+XLt{;*5a$yY~^ zr|4CnC{EhJyRnJvOGaf@-fe?at%fa3+D|#%Oj5?!2pR@~eOFcb@d3&ci~_GEv`PDn zGz|8I6IX+~V9*~-!sU>kAK=q=$YGv~(9{QPcgtJ|Sy+n*&Vz0UrXIPsuS|!a;p4~3 z8QRd0Z*&08HjQ4$SAC+sl5k~p6;kvg7W-}jWK#tBeYZju81!df`e$%`_|Wm`k$-hH zZQ`5M84V&v{6Zl~84K(Y2IZvEx6VS_rt-s5Lnn225ugWR&*aNad1>OfwvPcA+*)kS z?1$ad+f;T>mVZUZv$m`;qQF zvB#zlf9M0#$(v40D=Vv!*F|4#;w(>J{o)J3(OT7iN?Uyh^+?K#pU25;8~RJEuiM!Q z+ReVAZ|lb-i3QHS&Rg{P2q%4;rTR%QQ>G4C@M;_Mm7abbU8s{@^iPT7xC<)VQDPjH zo8_ad5b!c}R%i1f{PBCoOWRKRz^P~Y0f5SB831reG5Fd>W*oCK)?9(NuoTF+?Ab#no+GWQ& zm#rAc#)25$j5ErrO?^*?9MhN4J>xEXHAAcbEz5c#EbsbL7JZ?7KlH#edXR6%WO$^W zYsV8mkyAWv-}u(^(N5wimz#*O39|Nl4@mKz;c5fzx#2rO_yh+US^WE+B4}>vo6^^z zRhA?DRXX5i9Pw*(T`nW_P#)~M&eKK8V}Fc)XaeTM+)w~E{-_|}M=!j>UkF^PwwSXKMfsC!F~0=Ps*(6PE6mu}(S-WB#2Ev`!r-t@4(9m(9=SO~T$Ny;J#(VE4-QEbv1uu(tv5 zLrt^?@NZ!O2P&tj-D!7uU++FUpw`S@gJ$9j%7p7W%RG7kZ(YOfzN7EJZCMZc;+UVG zjoRjie1x&A``mR)SGLZrJihjiz6#9O?q2>&?|<*Uzx=Z&r}uw+Yjf#fCUhoQ zCuEZop`TVWfdP}Lle3ea6KHn74QNKNLvbFJW1l@Vgp-7mY2d*XC*{uLOrX^aaGJqs zr3y|esFAm8j6A|kuwby234X}wg2yAR4`O;rm&9`qTgE}Z< zc*;Z_hAmW59D_~UO4+Sn*b{N%1C%MDbfvFe!gU}S+e54ILZ5nZJrXn;yebELN|tI5 zMM{tsTR;mfZ`+DCM? zQS(`}vBpytebx^!xwdTvzw4VT(-CNyq$$M0$AK})M_-njer&t=#(L#-!Qi9I=3_r_ zmh;Fzy74g>_U`|w2dBLCzn+3A+vcvnIw%)3(kL*Al##V$j@_tL*KGccjesoHSjebX z7KxEiDGM*%-j=6G8n%sOh36_|+PY*<6M!ph>79%5uVpA3ievi}-N*}E=q~70TSF}A z+|%3BegEDOzUzNA_Ekyox}Upv*uUxGY{y5;yYbL3hSLXJ6lw!`Wx>nPoW)r9({G`p zj=t#c0DhH?3uHKY^yu{Hqu+tn^7P41eS*cvdNv|d!an3LNWAj>jp_WkOVKM+cOLH*sOd~ z?q!GaFE@55N{X$x2tSCbJL*K%ER+QdEnw6GISN&oQxe>vaPp4V)t^NuxD2tvE4S?v zeQIn_?@-6j6)e{Z!JqjqQw$GFY9o#ei_C&4*dA|$vNx331`PDIQ`t%zQ$F;uOzO&J zJ6We~GR9C7*vP^Ka2Ze8u+yJRkqKJz2N)3juG-$s=l1=~VJM+}LN5R83uSxfV*9t8SWsm-3T3><0pKp}e z$3tEW(7p37nbMh6EHCEFxQ-mYpC)n%ib!ChSuOarnf z^LR8g!&4mc5eInfMhoQHjl;#5(etzx+em@=1PX|d*W!3|oq1^q*YxCNUOB9ju4P_(HZ7ms`pR=0&mWv_{_Xqr{n96H z-TuUyb<*xd zRLUT?JT@KVlRyeF6I?j?RcREt3M#o)-O>Mc)nF>*1w84(=0TAaKI>+d1WaX4W3JG z%ltD*TW0dIyaT8NGL&&oIDv~i<&_}K?y$xkw66c@KJC zM-KoxAF=r7;wU;n!_5TkC4I{mI!c>V0ljRYGlIA(M>l-Kph`Y%SA)YWx}cRs7(u8q zE@Xj**9LlUCR@5?bAl@MGXR&LUt=*PK;|48l&eSN0#1~9QZEDPUU1lzv|-w92CTdZ zxSIlXF5(m}i+IlRiw^?f z+w1-P@alIveMkNhc4NTD&i!rs`5Wo?vlxBqkFUe0{5UcqMDG4umW6?RWM`A5_0xVu zzx+MErw+)Kek?xuwm}q(^lFLL%1_d+is@pp%M)Z<8SxG5?T^*Y!b-nnhQ2_KF`VPh z(DjoSDm{eRed6DYlo>%OykU(x6W8Y=;i06~Bt7OtWeilQh{vLwrqD9eiM(J0DH96LGo z#7>+UJNC>tGjTG`@tnjb@rlNs@yzjLGCoNZSsKZb8ET^_?kl)~3pQd0dT;dd_44)n zf4AQ4E1ZPeN}b0x^=7Gdv)v8tEXISD>GkaYbmA_bY^$+5yAp;M_rfcqjvMD-C=WXbW^9 zP)9qjfzki66Op#JAU*?0ki8~AUb5jMU|+jV2nOD+GvGL~Nlm}^#C{(8vg?E#JC`LZ zP8x|#*SFX%beQa^wayW{j=OA?N52F{&9DJ|hCa<}H`Ygl;Jg8EWh+I!=uhM^4&_)~ zL}Y2;lEp+L0b5d2D^{J6^NvYH5t)oy-B9dL1ZGRlOZ9836TFfK+;AovsgxDVuyay& z1CMTYUT6I~mFxDRGT0k>tC%9vTw^6vAZi<7R!1ufnDk|}lxQHa^IMw3N1LH9yp-v- zGTVyY>Y{QupR@bi%vkx$K9R!JkDvH-t#WMTI_nMh*=#yoyPN}!KDG2MJOz=~t9f!R9L;(7N=Vn0cWxB5U zxK=l?G3^zg=YZkKjalc%b`^= zIBu%kNbQ|#-Sqt_*`z)lX3Dv<&!C&~4Iru<1gd<-He z4|>uRVmEV*+$hfmxWfD3z;EpK)G;gHZu}aE*uYUR8-U>`NEOEsBN=|uHt?_#aCnqw z-~x#b8)!sTY~VoICR6rcAOXJ*Iwc^P1;e(cFW!xD@}dfM`S z^kvXxx=5Dr$mR(NWg_1OT$z68gab`%|JXtSyOMX^4R^KLH^Ob>jUk(J|I16=lnsvAB%bHUX5gK;I(G z`DM0Hk(B5CnSCpuq5gIVJu}1W7qNXsZ2g4&7@m0YsnEH+BW%BMTPVr-w;z{X+=Gkr;iG*hk6w=; z(=fA%iLtilIuy^z=zv3K=doh0Jzln5+f;|Bqcv?-X6zqkSLsL0WL|t?9oxfnq0gyL z#Cs3dRY?|%d_4c7^H2GdVfSFg)?XD9yf0E6_-&FBdqU47lKKIZilTy6^SL&_4ptxf zJ?)_`O0e>jM?QT7W@M!}*N1DW2ke9#_{@gV!S9K@CZNLjxBDIC+Vx-b@Ywy%w2k8f z+pmcJqzceSYV|cEv$e^H=PtIT&Es_--XCBgSba#quQs)bX_d+Om$li<*mTdEeKRk- zaANv<&z}tk{S$tej1Vhs5==4A6Z?V1p!e7vdhnz@2G8O6e4OH(HjTZ!G^SiXfTwyZ zJDYd7$KVM0e1ukqJHChu3tW^1iV1*=GGD>GNDFX*i+8Pa8S-$?=P!s{RGptRfxDf< z44|KsFTFr>0jIA6!@qMU-W~ijb{sMEl;ijm=ehzz59nMckDXtrP&-sUI5-r(`eUVk zyew?#TwizZ&i0w@J6dPfY}Q@9o`DRKeBi-NmB5XgG&f7q;5kU!5Q;&F{uyitWH)`_ z-273@2HU#vMyD&%#+xvM4He0NLSXRRthtGk_nSOcuyXWkg9Yj0`asVg{|3`eze-9D zWi#lBgFnEB2Vl$czU);gcBUWmnk-c{mo7!6bkUR3x7=kPX~|n6NYOxMDzhWdkphgU%Tq z{mrJCjyzeTvJ9w9C#mks^NmM(Kx)f087N5(wPRqVOst#WK9B=XT?mv-Sp+9RQqgUOsw#O+po1p(}ouRj)tO)ub z&R>J@lqC^5VxP9bDty8t$3hlUNBX)Ca^az^5RNlPuzn;RJRj|%_Gfj20(pWD%DvCb z!X+Ptyp6FbY1l|pJ{iikb5H$bM$7%Z4`SoyWx{28IfQcGmZfvF}>p1%A|F-m9IO>L(WVlRk`kobL z?PiXk&PVIpqJh|WjRxDs{$QrIGU*rMCzxQ;($VY`^~64rMzZMZDxbFQJ5dVPZ0rc7 z`T_0!-)Mc5UHEO%23t!W<@w>x7!z9RS(2gakz@gn*RuEu271t@oDcMS>WnOCT3cH6 z*}vX!{MhmE@sE8}lQMCy29fAoiPx`&hNke;_m7&&^lcn(9CrAvs_2zn(siaqI?BkN zjKgCl)^D^o*U!vuhEbXVmG(YI8?l_<`%W~eq=+t3=~v})fP>xA!qPsmj>x1x(#ElD z9BuOa#Xb}J24zP&5@|(`&0Pj`^kHjL*}%>_w2~^&_Wd9UX4hWPa4p9M|(@?sGFWrOVe%ha*5O-I#@Yqim1 zJ52yl=h^G0%8&@7cUxH2|4QT9w?uY z7bNP-Q={b*2M4ELedYM{_g)$f2L>`a)Z(Bc5MqazgE`LOjO~CCa{%|4iynDm#}j)# zALnUY7H}^&O@rrfoRXF%?}x*P3Bc2k&pWOf-0?+RSm2^9fMZjH!UC7W0$kAM?gn!u z`i0JMDV?XChBzC=*oBw0UxZ0>IE|;lJ01O&-y|KM!)ApKjL%TU_3`AjQ(2X^_ zks7n^pbY$Nu%@&PZWvK0_~68DwgPd(w!w!69dQ7leCFiggg6~HZU)ij;NbA6AO;Wo z@g&=B_R@!?knRY@L5_@|K?`^v5CGRuW44@F<5+R-{x+BsJ!M<@rnsqZc`H@rGqB)E z5BkS_1;i_14BWsmV4>O)8S70Q^dt{@%CLb6gAUQK8IcXnWJmtMQ9tU7ex#wJ4(vD% zEde{veiBbKW^3W0n^t-JQ3n9+KoY-V24rRf#c^Pk$;;@>v2dG9HauxSZ`+_xV0Yjd zblc!B(}#MYGkRGaBpW{Hae(a!Ok=E<4aTwp(2ElNb4ykaDy)A7(Xqd|HnOthV_#zA z&e}(1;fPSSO_WHl8Qx`uRi>6YI`ktrFmz*cMe8e)gRRVVnUmlp+7~C3F*@v}!&g?= zKwox1tep~+nK43#OzLBfnaU93Y#EM+oHR<-X)>v7&K{?%Y)v0fXliWA%81gbr*9Ny z^;J16Imc+|#!3L-Z1~5ygB})Zus%6b7f!!1VRB8Vc&IlAdLWx~llD?%c7hmtm+dKj z)M<9W9wmu38^~uCz!Ja+D#3oS1#-~E`o3A&&mmGI4%1bA9^d{PM!Ca zDZ%|~4cL#(1krCwyeP@JMu1+5n4X+7dtZ1VY}$BDShs#n7#$fCDR$SjL)WkdZOXUr zu_0|#IH58lziBMFVnvL8beIj$3wvaAf>R2?cqJDn5W54mekgh!SXcgmio9<`b_soLkgEa?n2VM4M0+t4hrAQwf|m@DnK0bo4y> zDwsWxr$1{uV*PO~!)_5qe~j&h3_q-o2=3P?vBomY{_z@v49cKeSXoN=mu*a6@z`}% zJbte;Ip{`x;MGBW&Cb}$>OvplX}1Zsa{W_&Tn{Xmsc5$>pXp`SXREvVug-J3mP-!p z!*$l{&AlBQ_dnG-G}bl7`v5v%KXjHHRvi)0)nK}|SzVQPI~oeT#cO>+gx;4;miVn7 zP-p4D{w5|*aQY@NCar0Yxw2z9v-Z(71l!E@cbH@U=lrMMp?2czP_=SyoS3ZDqcuMDKr}qmiBacdH=z)Xh;0{b4 zc#0#<&4LjFc@0|3(Wjb`4xBx0 zRm{KyJ_as0vfSJaKPz93r(lFyIn8D~(GxSsv-cB~w}FucA?8F0iQG5{ke&>3k*ye= zF_e(A0};K2ZumG*(cn?MrdKxTu;!9X<5$Tn-z50c5%j10ICzq&We;FH_2-EPX%1P% z%CslIk`rwdZNebV25Bk>JwzUDq(Kkmz-tbS>d2}E%9_re-l7Y#82B(rU=<|7hT>!3 zjJ?qTTSj}v@{!Ab#9?0@wk$ovGZ+*vlP_4^+Q)eWFJ}`8=!^~w7?nUJQDyCkO#MZ@ z&{KTsrA+)#XX{hw4xbL3vZ!ZlLk5@NkjhhR=*=buki1#@TCvvWtl!bbW_Mc9+em55 z!jBaf2fT3F1cQ}7XDf3uBZJ9B4)0gTiIphRCR9{8%Ca`3u1xT#jd1eOownnMy2hB( zl1U5R+ow;pv`|N6%ITo5Du*qmG;t9pA0jL+xfY#lhV#lK0FEg%7E~TJM#r85yc(kR z(*Qo!kHNFb&-9IU#fH&IL4V4JpFn+)X6;TJWOX5)3)n>UlfC2h0s43z%+k>g^u0_s zc#&;!R$k0u1G<5J^&fSOu`&qO#S1G%&9D=F(CDlVlo9F8j-p4F+kNO{ZCHL&lhp?e zup!Pr_(n~<#K}h{vQ!uS#dDlCQQtRh>C?LI=)5)s^@~#+^+6AGkLO-nTWdIS^jJ7M zJQO~1?}uicEZW-~9Z9UMX$nvN;AO>JqOot{1Pg{-;Pg3yN;fBlJar~`nds{dwIP%@ znf#jEcph<`;F5NYftm}DvIiiQ%f1N4S!ry?D{S~+R597zG`KuXm>LG`rpui z9x7WnG^5VEK7>B>nb;rHowB}RM35Uj^&|}^>PKCzA1NOvB4horlgUzCleGuB6YPAD zeEO8>tta73`XC40>{_8Btgpk9)s4d04+I*@hSzxLSb`y!SM9K!)e*RY>8mtNi)_2j z(q=-N?wOoOOWPuj{*+bR^+peK`03}uS+SYTXcNh#4Xj?$m1@&htUeNs&Yt(WQYP0a z`s}o>dFUG3FV>OvBhb#YH+CZU!~$uP#l4XFN_Xxb{1L=v^#azoeqz@NlC_Nl1vDBhp9%E_SkVKNg8;igMk5X=+Xn2JM;P2>2dy%T}cLT zz>=D?5VlAQaG{HL&vP040_eDu z&eI-q5!PMO0%>?0=Wvj~;$3a-LJl4t;NZ!-GtUK|bQ(Jz`t*PX95AOr5Au0^(mZ7n zfWb!~t)pCXvi#7Yli{Jm(%`}R(9yW2_Jfai;4U4FdED1W=SCIp!#f+H@D(>PuM~2w?{wC|aGUqYlc2&dO3+ z?0QNP2a3qC$roW67{P~+f}X~sp1^>bI&zqD;V>J*ja+sKj z_CpVGW%+cFOuKsC2bk7I;vjErhwQ9eYbS~0NntEY5h=;xomKimbUcmmC* zMy2|@aPuX zIoc@#thZZvMlT9$P0FAw1$!+(a)=4B?omE=5vkb+eM!StgG0@EK>x9VX@4E)AQ*bY z5YG!6`BS!NsZXSnCUTM~BifKU)P~YzNfRxt_Vk{9$kY3=v2iP=xw%=m7M**#UQDpM zL_Csb{8k70BqxPc(5_4FsKqvpbz~0+`W5})r59fcdv@;*Yu2m^Lqlh?{vP`>?ep{l zr=^4HstTzz`@<4ukF32wa$XQ)1}aG2>EhE*t~Xc^GP9)7bDk2w@$~>ptB-gewDVsi z_S7FXrRfV9n*rF*!Sm2#$9N9wqJoXN_L%MCiU?#FoyxTK%9yQ8;cPXPc&sqW)}(+> zC|G}#EI(f;%j{46t$MmvWDaHo#Jbp|hRK4SI>hspwt^oZG;wZ1Y3a?MFs_DeAZK?> zfw)#uCj!?YODjt|v%w}dw^cc^2iHsRHu-8rMPAc8>p$_@tMVilowznwn^Fe4>6q5x z?PBGs4yJpigY6ANIXWV*SfPoAG2IL1& zr9AZ`_-j|RJ$5q-sxNWBk@Ara8@b-t0!saJK44pL)N!^BlH>PtqgCF{dnV6i>v#`P zeb7&bozGUMXa^C;x}qQbR`!)msrs2N`yw&tTlZ2@ERuK5!gNW`i%` z;%q+EiAu5bnZblDNz~1rbgiDU+8`zyyfDDxhyxl`)3O@K=&6DYPSgxGK(gkDyb$rn zUWwZok;I@=X>4eEik4m3EiK+yJ~(U= z^%Zqy5Bi)+6qvHT42iQ7hhnU404P{Lv^vEBHN2p(M`~YaDc@wPtoqPwcykD-hjcY3 zUVPADCjz>HBY@|-^5DwTr7)&X+m$qlK%Lq6&*ZCYWcD0kteKUmVxtov0QHc3^b@1( zmpvT@!nv#9Wt%)ymJa-3cX1ex5lRFC<2hvzqcdp6V+D#YI+HNO`a$FEsDzcxIf%2v zvU7h8fOfIT1k)|*V7j9hGSr5aG}{7*G@J|OG?K!#Sw3_!7elFT7-JwP(*Rn`8h1Jrk7J zc0#XbJoE5D=}jAp&+0%uNLy`Gri7t;wvr_30VwuQc&R&o)}JAW5-cB?(HA<`JC-rq zf31kD9C1rU<25}fNjjjfohMEPk;<8!Y$R>4SVz*d7wyNjJ<6j0&25}$`XUBN(hd8W z2$hF!@Yn>5^7Wb&v}-fvV-w6wztyBA0a<1TmBsnSL0~ToDC`Rwnf%vQ3q40iXO14}FYh~gru?X`dZY1)dSr8E;z|dS zIibK+ih)%+=w!f&^J#bT-RXCl`C^yldQ>V?Ma}A2DeW*~0A&ke#I`!t4z^ThGQ z4ohQr$fq&-z)K9=b%c&|K6ZQ>i_GYVYjlGxohbic|B3K}{nE(j+QT(%-F0_vYOmS6 zv9)I1hUVJtwY4>k%WN>C8@oA48bMHDa|D%UfWkmyb`XYi046e1PL2!(SWYN-ET=d+ zOL1UjqZ1(*Y%pkmiO&K7Hy+gzdUI|SL%@K{pVXQze!oNp1CrUY;-HFhZQzkzvCP@# zM|@5@#ehuVCoTV2;5N140IP*egDn!+GF| z69Yy)nbYI}bY>A#gCEr!-GM5rQp~=#j9AM8(9@kYc&%WO0;e2!&?(j@4hm^QbE=IO zhdjR5ZH0-KwynvQMO(QP%|JepM;$2_-Qr+WczX4HiNFjZhs3mtuAT2JN8 zW(Jc(nbjQ_0XZD#3M{@p0EPjuU>uRq>gP5BWOk7b@L?;HV`=ijtIwF8)GdS4&aRvD zv+Uo>6OI&R5XV42i8eq+&2*FW$p*-(uj_ApObp0JVJ0{5dzd_;9BY5INojK2J}HMR zo=i6BJ$9vNz%bHRquu}KRvtv1B`+%nedt4!fri!=N?ZHjyh#RyWA|7$qY{0bFrpvg z1jXgTu^*!=?P&&sTX^K?*V43mlojh?)T$WuF^38P3ef0BFy-fr7vZL@k!3V04?f8t z_IjFKP2L==ePx3-=4+I*AK&*M*VF&AXU`fBPCI?A#Ke<=ou7*BTu|HVETux0XQIr4 z@^P7RRFZl$YjTFC{e1TCLm&KrCLZh6MyxWRj1{Nfv$Hb;xyhe!@ zKIqMP%XqOhn%Q0ficO||3D(}KC;bRsn%10PUDuG~5gZCi@MXfZ1BLLNe_n+bA!NHPY=gef;m0%IG?y7 z5d#P2yq@=R(TOy1ng&KlVaRYga4AhV8;%X1o&Neug1>BZ(xA0=U0Y|^v$nHl%bMot zwQC#0inT3uovU?IZ{l5c8(itv3Sp3;o4gIG1h65FVg?A&`HcgL_#`3@dTda{phAO| z=oqV_j4l+|fQl!9ER&|07*tS>4P2FGuy3uW!99Z@#v1@)`B2UUALuZ7KwyvqjH2vG ziePY{4{>y+B9K9i4Pq152F zP)~5ICa|UdE?WZWHw-e--6h4gqqL}ttYCDpFKJLK{bM_8pssmHYa$G+*#f)D)B z!3N;e9bNQiII}M{1%lpkT&5bsRB6VXcyxdldDMY&Ihdd_htqVy0j&uwTCUC$Yn<<~ zu~DmQLra6L%$SmcUSHoBhEJ5p;pfYXfY7X2trteIgj zj)KWD9b&suPdf)xCdP^Q zsPgE_YXRsI&jreiuWDJr%F#9+sE3s=WIS(?A^CP+h~+?Uc7#T9Yt>Gs19nx_Tc~FNhs9zp^1WYPD@6ds8QV&=Ik1;L0sE_#j>e8^ez+oiYc=LaH|t}rHxMM z>B)&%U9h*&*?lXXkG#TWfy<-JOg(5F+J_&TfYrUCR2_F`Wf@+MDpfQM_DO(Y=J`f@x!=h}~ZUYt1e>!eMnsx9UweqfH;Pfm@O zN;3neCu;{zPSl(^IW&FXR9|`T$AHmgYT;EXTXtG)A9PC(jcTpe1MY^!SWwSsr0dUz& zT@kvj^mWH^2q1mDGlkMPwWiqragST9NtjYVC;3iMPjM3=9~sFi^7roeik;gh7LxIM9(qv$lRTfQf@# zIP}MWM*j>5d0-Kp2$vNH?sW``Y%ryYXkcT@c#*9^31y-za7$Pb3~Duy=1&7J!-)nf z;FJj{j54!j%dF^5Ii{a*wq!NxhmJV%=)jsl@I{%(MlLWLfC^|j zDz*W%@HppIoYK^ta?ROMSGW(RW0rVC5+`n+iuv z-!mNjBkMmgFCO&H%5&U|bfl7XGp%8Aw9dXm@8#1Me6VcoD!SP2qF3LbkF@Gt^<^E) z!oXmk9L&*xGmGQN)90Cqnb6YK7EbTS!fpv^BOR!M^7N{5f0*Lj$Xl27%xvEo~ zsG%-6PKu?I?TwMuE83n$gN>iqCvgVcZaCgN-NoM61Kq4_vsu=DVzqvxevFJ6cixpI zM5jtP^&=)^kTIv5^fzZyLL?s@DTlU!rm0;U0Iq7)q|2yHo{Wu`!r;)5;TxJ-&3@>P z4RB`YXYkV&9P!-b(n-kl5uKg8R9&>~?QP-s@sr`iiR0nZpZ=7s{NcJn0IwglQDgY} z*Itr(VuDY9Bn_{atBAp^?{Y2+ulmYD1~P;L=i8#&$@(v|G z*Y9Z~p5k&%;5^9sxvmi=!{o-cbsBqrU$-37Uvf>d6_x2DPUJ&R+uFHk=LoW6Io9UF z5vWI;jLiCkL1h>8iE2k#l1Y}n$HZY=Zcp8*1ND|XU2kL0MhN{a9;T)266;ML;Tqw# z(hZij*EwQ#6wX!>NdkQUEjceJSK^G9vSR&pesTQ);UTj>S)2IH@Jt}k&$yoGGHSMg zk20t~HsK+?E$yc)@tfRC9_E18>L6X&be87l-T(~Q*uw5Ty5^;_y?@luk8}vB@}k~K znhta~O{)qeUX+i`L(1w-Su~lIuMFpUlpE!VNQMF)?MVA^?$dvft;vh&$(qr=iSl6o z#LQsNc==54*_orggVV2_84R!XSwZo#O7W&bl{m$vY1i2KJqAwNV^5P$k9ZN1Nh`pC zIozFocozeAzO*dTseYapc-Hc+Cos|;JneBF?)fy%)26s0U0C3gwWZ+HU3eT^ zVr*X{M=d&t479bYy^KD0cHFQa+FdXLb}G*|U0>O;k_Gq8;f&$OVr$f;<1f!1E_Ia~8n^i_4&uF%?wL zOfLFZJ1Dk*T%FRj(=Bq~v#0o~v)L6c@G9R{IH+!>1jVVn8nl62OLL3#DTl$qesg43 zYooc&&aN=g!&B{27$4$uf>OfTH?}vr;o$M^bnF`_Ns-bM=f?UpS=mys=qyHcscXcW z60%ct?#)grhqFPQkssr?a*b4FDA@bo!bjU7e~uOv)QV;+Q(39ZfUsJC&z%T#Hrwmh z>L_~h)+XvZ<}8ZK`h=CEr~hm8iiFO&`i5rfTcyFFFg!eLrM9;(3(J=;kLM`o47SMn z7v}^0gg$9?wtj{^qh59nYY8=do${Y~_Sta54O_#SwX0@7`v)cUV&lgB&z%jYPYl|1 z3mNnRsjdY56(>p;EiP=-31>-3Rxvqu1CP*r~l9;>l3r`I3F^HUVQ<3(QjCAf#Bj+CztkC;482M;x*CE=0`co&)ap^#S25EloQfKI`ZelhajhB00 zyygO<3_IuHkD?UCGr*P67Db8V)Vl%hsJ%+~9#GYo) z0q5uD=;@TkX~9vx=arnL2S)&(rd?mhrExx8DG$s8vWiex;B8}pVglf8(-egwi3R*Z zncWT(OuRq?a9m33>68H&v>bk6$Dt<8L7Ic$c}7ero-{WN;2dc>u`x~;CJxvjCLrM0fMSvmNDBA{uf=_A?={ornD8^4SA~I)Qa?Bagpv;^`bsgx0jP*wWiqhfb zFjyncst0tZaOy@K8TiM6sG1kJSh0)IDa{j7OCwVOT0(r9My)kSrV(BZg;EN!3x`n+XGF*f${B zgEKM?*rP*1VN86%WKXDRBBiCh>2As>7yDH_Z}1JNf%UQ2q>_(a=tBZX$LJ8!m$;?J z_CasV3XN)HGHnt9-Ap1VDQLOa52(Ahaiqa|YIps`iHArB4}H*97D%4c7&en{Z6Lml zH+5<9X*2zhAEaOiY!+vSsahdfzTt*jER2(P7sMNu^!*RH>lWCe+E=RC=1D zsrq$D?!JAmhe_=r@SgYFrms6_F9E}23$7{C+GMaL{O}vRB?UkISm#h|9HW7b1A9IW|*^TdQ&uQ5YHpx2Ap7U zf}@t{V(p`P2=09axLLqxBRzF94)qZ<@@tooWO+M}k*&P-UnXHxCj#wng_2SG!-uZ4 zy*bRLKmFaWeVlJ%5kK|ddg*(k*aWZIjK1WnOQ@GS-mz}64X{hpS8_?9pN`m`G;y?l zq{(ztx%P=kDd5*-YfrNQb%}LCce_SQ54+xE_W%mQf|NrYu%+ptx?l&}_eFhYdb%`T zDvysy^U+Wm9VyKW4o&KqDEAGWojKM&5{?dyPT9NpSWcCSk$%x8)5u`+rSmw? zdpvgmnUf37OY=0bryWOJ?OT7{3MPPu@^(eB)hioD-sNT+zu zI}I^66h<5lOY;sVPSY+Yg)>u49$l-&;GEaf#D0JyO(0EhI!_ZjE`_-aU>;IBU@m($ z%_{}GS|Gr2fC?#1w2pwE&$=H63l*n6SBKrm?x9+|pcM z*U}Wq^(}RRXLUmNsf}B!TjD*s@#cU}Z4~%+&UQCuP`b2@N1|!l)ZKoF(Eo*?`>m znubks=!qTjcsj-)(wqcjt2)sskAqPh32NvAS5aD7IAaoSx}hHfY8)}Er{K0(miVH5 zqRPBOOE70SbCRT@1?=EYC+%rm1jl+vPvk&j6F}tk=MIKVJS6n7z7m|32QP=&Bui6g z^srsX8T`wcA#XC(RyKJs-ew!ojgF3Ld3cNMP|s@$lx=pUA@pR82?ccEDJV{7XJ@CJ z&d$)&douK#>9JPEn2(v5eHZU5)(nsmDI<@tWSee55w!N|<8rq%uT0anh*+|5KWD>9~wvK&{ zwzF1N9(YuV{t;J~m@)$TJMeW)<*;$v%FuKCplrNS=UzGV_VvkOD%pMsD_5?R-5ac( zkZluV*jke-KJnxeV(3O2Sj|Pl`Okg~rP5@0`Q?|x9e3QOcInW{j3LwAloK8O{iz2} zX;nbU?17H6e{wo8B{quh%*XSPyd9#X?ac-mS1mI#vw^;XL!Id*xbexZ7@Iy#8*|-?dsV>cpi$Swp*G#nLG^(; zHW-2o#(Bc^%C19(rrz|MSdRB8%CK_+KCp^uAKC`l^jTjK#`OnBmokvc5uIRh(l4`~;R-r@1-(<5W$<0DgHJg(Pc z)NyW52^KtdY?@Eg;NuDIl&ZOsPUCS(=P>xvG&JNLPCCs4PjP4uzFG_|I1cCabP7*l z&XdN@o5m73D-$@ub@eoHic8`7G9qzH?oyKkB^v0b1RD* z4KK|&=6>|bK|@pRik8N5yY>t3Xx4K+4KdrBY^%At_J)S3mZtKIhG=Cy(vw@KMcEB? z(@l-_bxq1N)XNEN&^S6Y)HLW-$A-q}MAXza%;*JRjl}dcpJ8B=hM|G4V3%i9oSZzu zbXnhZXCN|_+mx*#TkeL zdW299v%S?f4%p*hUou5!@+6b;COvc)61uA5&);3vZHen%QgXGMsEp@HdUI909m$v;?$9Fy63cQXt#O!wV|tXMHm|$ z4(s0u zKTO&?`q&od{KSb9a>ypavi7d9dd(VZ=lIkfk;sg)DBH>hpg=#i)e}ln7Jarw`!78H z*b|{m@s1taY%&JBpgezQJ2hS(9(mw(<#6=a9m6_679*Md7VSXcB&{Bq6!7M(LZ?3* zUU&Sg9OZeM?)}xyNu$l|sPbrMbHbxp>>N=kNHf{U=e$9lhgg3cUAik1e_RXDLBVvy z-b%}1k8KupgU==$)P}TwtQyylY^gmgoY&%okAPePbui~zd0*)O9GhYzyB?`8+3Q5g zL$7Saxn0D|CV76{K_9!Gh~BO<@To0v#(`UzcHN^S1*yVB5%Acj;G+y_N!{%HiTaq0 zP#~j)Cr;wA=1CoozM$1!)7k)Mh6xpYW|Fd}nCMg4+L)rGmN6qt%}kWkc9t%e)j?&P zT73qwJTp0=em6~6mK9k!1U}8djds1ia)I`n5*i4PSLo+j8nwlA(R9aKb zL#65I$?1tOFg`UsI#~*RV^iTQOV+E0=;G6=9@4bKi1YAD`GsI9K6ZpTx#0YuygZ(~ zn?jwALoc&AHYDV((Pc$(PLm2k*(cp3|Q4xGHxdYTv>0yq!V(%@5^(|bH0 z&S{Fcu)r0yKrsPuMa^FnejXO!f*MCDZ)Ng}t>e>trLmh@nAGr*#-HfigWnlLpUw zoX1szr*xiv3#|r7rK$4SQnuyrxp;4-sJF|AaU3|!!QvOi=JNSr7q#c87V`W~m%`B} zU#`;;&nG{nn=d_A=lQ7450}@AI#jDio;J;==~RPi@Je;bw@WG~pROi1Pe(pqpHf1U z;ksL|*}Ss6;ct)WQ*ky~Vo!E6$3xCooZQg`z|x$qaRmt%gpOq$p+y_mjg9NQ^3$io zri~l*DZnN@-98qUbvA_lYyaK<_WJ%84#D%5u$X#OqRHE@63tr*%K+y?TTMm^&+C%n zvMX-AwtWA>PyfsR_T=FM%eq%|>Pc*!J^ep(=42QzjfE|nw}n-!x+AB~baOD}WZ@W^ za|TATd_n?;(m+gJ$Z>67-Vp}+2gBjRhr_2n`3YN{F|PK&DQs$DPluqT|4re?kN@c3 z?w|Uzxc=XuReqMrMtR$0_NY?o(t`8-K9!!Y-$MD6x0+mJW8jTgeFv_-nG zz!kGVF#&MJOkWgy0T%EJ>$#5MoS-~D%~wkMh2I_CG*6nt9q=>_40-6`cy3CbcE{gg zF~H1T|Cp-msBBkyVC5Xci8?rGQ6@eU^@r1TLoC#zCEmE(Ai zE6H-4$Mf+!O+LO5p1h1Ae-&GxG&$NUUvX+|Y`mTo7kZ07dm5|LL;pCLJoUpFwI`-N z?o)on$`zq=`O0wW%u#!yJuo<^Nr7d065XyRjFaK^JMXzm695OUV)HFnwU2+|3%57c z)-Icx7?(rdtS>H1g`-D~hKY$WIqOYfw4W0uyAvExUj(6!UDwvz}uo3 z3MJ0d0)C;b=H!7-aVdSJwBHEaF;4S-(*XyZm;?F5$aA>E-~s1OzVkQ?ywgJCc&GOm zxYIdJ3IpeOPglx2OyowN(#{71N1#j(@Op4Lo+nQ6|tZ-P_yCR{?gdUA=kr$`jS5=mW+r^Pd7?yTx5`e%& zKwDdD*ni-lHWVBRpZ!ey>|b0#pe6NME{_ao{`61(?O%w+ujj^J{1g^gzyfr%*x42! zTmW53MkN?xs=@PpH%~`Cg{A3~*Wpg@v6t<6r-L_zk~HRsST$|*jDRZ9Df!JXDL&yC4t0fz<|z)5p}=kPoWCsPMM#X$oO8mD(yo({Of zJkG-$PMlABUMMSz*y%i;50=M~C&23=m6O7-j|X(F7E)O$O(nT0KA)~8Cr`IfeyQXv zR8E1vf)=Q+tL+^hAMYN~Mu5E6AKzQn2$6TA)dO%kaZLH78mjdd|dOcJbJyEYs> zc0^wS7z&3D9tzj$iFRvitL+g`(h~Q(?z!(%U;7V#@+ViYdRMIIU;5?$?xX!ZJsr~% zB{|}4=H$Pze}5Pm8`7Q=4Poo`*N3jI<@WR+n-Z|8J^q*BZPP~WRYAb9=R)hN1K5a> z6#}nl$mo?)dJc}p;0RfPMf6w0XHH-f<2~<4U+Z%*!TDacRC%8kob=*x?R49|s>E=+VRFxK5rI zY8K~dXgp0^EuZ4@Y4QZ;jk&k}E`)z8M*%4;@HVkPF#+&4X^29N3$}n?fU7xdmGCL7 zQkt6!0ht_W9(sr2&~kt$22Ko(^Y{b-xcMdnQoPG?`T4w;mBJsm7P5t(L!7{%Udy_&dk~rHS!VrHQHSy}f;U zAAOZQX|}VJI^cL_2i=X=1hl!NCIRAW0c+N*4jVRX46nWZayZj>Dja_E&9H0d&d}P{ z9wz$x!-~$8JGNZ6^M(V5UV7ynWRi4j*)6H-}eK82@gW6FN2!RMn{3{T2mq~8S=I6FLiyt8vu zds^)dC|^fl*K-sD9Em)-*T^EIEZRAM!n6z*w{T~0m^+{X>1 z!RKjGe40*afjghac^Gi#cV4G)c$%+7lj7$~r#LScm^=NzND~~N#-0Z6vOG-;oOU{pleXqV2Zol;w z+w_hPfhlx-?4zIi+5h~#|M=%`b5ksddSCkTuiiU3Ikn@^8?R|&zHPP?|CN2O>fQg> zWY5WP-G&>(o;|zcC;jv)1yBC5DNFk8iGOxA;xmr6@Ly*k9|ENpTr&Gt+VZ=UWA?OM`C?){j0gY6sctIBM3wAX}t`a_l zc{*RX-*Ax2;d$s7zH)<0aloK)95Hz0JFml>27C%5O~}K1#Xu#T>)^7W@pOvww3p$s zQhHBAo2JuzhMKK=C0r%mJfG+DvFn+Kldo1*CE98*mr)I0z^_6JjGP@f+S=Sar6>IL zCr_OU>$PMZhmt4C1e{8~Jx`v4CFsOBtTi?Ia)4F{Y`S(+IC}g|J@FsZGWUI9_3G7O z{n|C5Q9Iw))J%kHH*fjK4O{o@ef^ES&s~KkoUPIwcYOG|Pk-kApa1%w|G%~}f_M4{ zhla!6y)S6z|8aeiuPxl7$r0ZD=amb-$IiYA=D5qSyb8b)e(Vd53#7iw9=`-2{IZUA zz4!lWXw*c&Js-L&jE;=iiVXG(V3R;r60~bF=R4o|?!Oaj`oYdw9g9R^fy@Hc?(d5+ zkn?(+=K)>~2W=(1!}5HduY|9Lb6Uz`jNx=X-bmq2>v5hw4|lxFO7m&j%Sd6!BA>#b zbGXOApdmP|>)|j%>c`>41dsFSO8IIq;2u(W4lClq0#}6viV1+Lq8W=y%wqvA;PW|m zet}PE@~|}TX^Ql;JI{X8LY5!Ez~|$11%S(e$DMrV_k0?YCd@|z-sw_a=OHGfIP#89 zah@h7xLnds?=dif%TM7cEK50k7 z|7b9#C$u#R$AyJl^;Ve5@r=Dt@G z1EsKk|ADZod!@Z1z^eljdWZdv_k8e|hX(rp(W#yzr>;hGu2`|I?H~Tu|L|)+c;JE1 z)!AW7|EJ`XKlj}8dcESPIr+PG+!}7$aib6$?SM@~8)!2Wo zP@Vj~OYv#CnmQ>>wRFmx(xhcL++*kQd>W_eln%Hb4)^f~c~3)=rd^($X%%oz?{O+C z<#9YQ2Lb$iG>%K@U5@itioFcy^B8#^97aA(SISp|0Z&6-PKqnig$3U67APhF-tkRX zRA3Pn@C*5Tj$S32JS@$pX}=L6p97qimFA%%pO1n0;SM=@LYfCwE$>cw8dsusnI3z& zX$;PJE2SOgvGbDm@<|g?T$%^&p<3GUd6~ddo=SP=trVxcX}S_^0lUgAFg7-NSnu<1 z>L2I}$4{IHD_5+@dTrc@4hJ3pPpW6KuLAI8fVkmYq}jUldO4*1;pE99dPn_8cw_%c zEmPlVyV*B{dO5|*oA3J2$A9a=zxvug7#bNEy_!r~SJzngPyhM9{;ek-d8~6{d^D_H zvqrB#G-`9i1K~Ao{HKi;!-}r8;R7G|fIbIUCrAFQO{Ub>>kA9K-)~=6U}HsH7?}ak z~KD;jN`j#K(k9`?9w3|Nh5+{C~=}rK`!l zMO`kb1-MsxNYf6h7Uya6dH8%>kjhBu@@evwU@5=LbXup+$Iv+}O{aXGc9|YKoY;9C zm&PgHd7M7Yqko$BbhS98hsN_BJIwP&pq~_;$5o?ocpB&Bq_`qoSm3I$KrsPu)ih;M zkwsX*FYNOL5!Q%9SBkwdy&Q1WNX~(;x?7W_L zd>W@XPrFQyq4zYg=Uq;Ub9{<(ddGR}aF6qH$fqIIFNHh5$BxVA9ZozSE~Q&+da30t zw%meli7YTtD!tL#+J1LiYkN3;?6@}a+oYxB?dFWiuZ$-lUM7J&Kn31i$6>9loe9f3 zmTPDG?cq$%$uK<9A6|Uvg|JLAuDy1no^H#D70AVQ z)E_-{uleu)@xT0?gKzBL+`(jfGeB+pCxcAs)r-2BI!zud4==p%a$rw|k9_oQeLAodoqk;v zXbV;kG-|@(^r@47@yO#pIPy-lWuf;4S-|hN7sOnFX+C**oaa5xi}QPV9!@^RIX`il zcD@vr(xh@yxYK(XeBaKr!=Os>Q91bi^SEEVcX_~S;?`e;Ld#IKMpW-Uf zJFHS%iMJA60V^zURal^y0Jtiev8cp(S|Gj9$I*Oc0Zy0F+QSqQ|4^qv=YpJ z*V*io0lW&ZZtdEz?S`Ae-WQ+N4)?u^U({3SWntCI6=7_AOp^e$Ve6Lbx6jOc?stFm z(6@i5?Y-ASQ(v$KN+^aR0Y!>Pu>sOVrMCpJQllV6I$}YJ^qvq<5m5mZ0hOwVsFZ-x z1X2J20U`8G5^CrPNgzNVxzXRb=i&YV_v!4ny`T14Yv!9--+XJ<4QcolOc8!;te29C zAg8j5(EUXZ^x?ZtH^GixOr`yx9N|=>oiDk4d2hrZ;%g0iYk}kbHN5bk^W8hQL-BWz zTeFx}H{{#5Zz}}=Zb0Jg+a$J=)qaXKq3Z9S1=UWrk7{_lB*90c5jGddjAta6KfOG?zLs9m$< zauM%xyfMuwCFs81&c>Q+feO4MNu3vFB99R6ZdY112op?1ql;)-x&uakXel91w`PCB zik{1LWy`b`Ra(z{&u+aFiRbK zki#cV4w0=_#ZFH?Qg+1e{)3x%e6^a40Zgw1a~B0B4IhxT(tle`$K>8&SFOXt^z(8 z0^T;l(CTQGQ6SogXD(wT>NoRMkwRV{hmZh9zE{fWJKnZ_-$fv|$;fJjYV)>}`|{De zCka&RtfG)eX^kg}g&KdW#Rfu$#JC(>(}OoXE2 zE=k}P$;F7TeCCCHwHZ{1p{?fLl(=eL)2o6jP4PUyRd@&s>mJcUwU5~>>j|% z`thuNWI==!<^-*;$~3869dfREN6g<8(~|{VsFT2hdi4%Ua4ssoU1So`R(W?(U3nfjOw>TxS2`-L(V?8C^uTC z@+o^JZ|iCJUTPNb`xtk$o2-XdYwMFb5<3&Yswc!Mjh6Rp_y@$(W3wHG$OPpEX;go7 zHdRke{z6&@C*hDbz{QNwe#L&$YpdVg_U7ChWCW29aLOn$4rjr@B0%!77C)y1=E+kNtp-vf@X>EoL2TL=x<*ih3i`~Es>Y=~OGTXrZ^tEEW zIXO8wIuE1S(5?~}wrpAxP9vp-8cnvYXTN_@KSaxkp67OK1%Zk(k{(`P4a8U)4q(`O z^8AokZxtECpYHB_k?q;zh7ankx&wcd@)92te$ra2itWSL@~OtuG{ojW2xLcu%-hed z!olVw*I)!Dduq|^$_72wAT%`mz85B1pE^gGwS^|anYn4QiX2L!<_VL`F42Lwd`5E7 zTV40=s489yoDi@q)AAnVy_t2p_c7NQzxt8_bs7C&BN?N}qq|+0Z3U(cc6931XgiM| zNMv)jF*TL~RVZ`Z39wg>&A@WULaZ<4h^RrGmGhc7!c4SFV$6O#c>~nhMw|K&7JWO) zAR#6ioK5?zh2`&-4!l+1Wr=`J3#Z@yy!BVa>3T1Imy79oFYaSg0-uCu zd`qs<;DSn{Bu|L+Eogn6vRcdB6o)g%0Sjc>IEy`aYXSBV8}(EmN-j}hm0jPLU3A8l*$DZK2KU!>4L@L))m_+oBQx>{DDtGrcQ|2uu9De5UmFVV zpkf{CKrghqPXS07X1w;?GQ)1%keyzUruP2C^Z*gv2N;EkhL{>fey8M2C1UY#$+^Q& z&L)#b#F)MZSvX=8yRzy%?OG2m-!2o0oz=B3TiK;tLm>5M8>m=SVX?ISsS2gs{YLL(Q6H7XvrgR)2oSGU zgw13T1m&3vsHqE#290dJsIdjVbC+Q~RAe%My^_gZbBHDINb}xS5uw_3j$l+r# zZ)azmA~bWJ7TFf{qCsml1un=*uVM@eX_Yg5dRB%xZOYyKDKxzVl4p8g&!=Nhp0a~} z;7AoRY=H{9gf7R{bBOFXhHLMiOA494xk(}DKUbUuYNX!w&w3%{DCV_?K&!W?)|siU z;6PKbh~EdZICGe?NTjLTrs?)?ZH5p$_a3M|aOqa0WQNFy+)vhyQzq5*4I%x?)Cm~y=tfHqSg%h6L}UT zacZkwmu?p)J~g&no#^}kee(!U_>;cK_6+Qg4v#w#4tk-Kt{)gwwR-dxYyJEH41zF9o?)n;aa^3uQO%A~Y(R#VUD_3>5qphMmuiPc)^GyR0} zlSvlI(kc6)#7-Ogi7*%A^&4yRmUH$r*?#0sjD++j$kh}mfNSDfUt!i z#nn=kQ0}HqIqv?Cclb;~Y-x+^ZAL5^&G9=q&G^4eU5CV%`K$Jy!ID0cn=U=h!BN{n za|d2RFt)iqi$)^BHcmLh5~u7UXFoKDhv48nf7z8kErgb)?4pCH8S46W&wSK#m}h)M zGT$=?F1)st>y1zWwU>BDiC_?^p!BhY=a*-@Mt_Qllp8>fYMG-pDqP&AD9bKtkzx0< zKmU;J!#Ab%z3fgjpEF6*sF(Hw>(!cnaC(>SEi_{12Y|m=%L+b6XiI~Gr-n}f8G{b) z!o?1y=ZZpuZyg^P(!OoI{04<^>+DDL&b*{{?Q8)IGb*78?d?v+!tSzbCRRnEnjj{eY2c?78~w!TKPlYaY}a7x$rjaZGsCokh)zbw-NpRw?Ddri(=&)X4x> zAwk=PZ|gRw9gVQIx1_28=5@e)Vu;&2M{!_O+a4gG>>H=p#b_m;1 z3uU(HhRW9Ic)n`?aTIKFtP5%ps+zL=7Egi%ZY2j!elDGYlVgzjIco#c`)OqcjWRb| zj2acUiUDf2r1tRV*>l(7^{jQJTz+K3&I_4EWz-3b`b1?&&Fz355@3b}m?=!cDn1@| zN943muv^c=FA`fI2Zh{ z?Hx(?NB_to>}|`VKW0R*-f>-XL`C1xi(I%GIjaN_z))2Yh9#~wiuC)#h>ShjSX?Rg zrQC{GJ{%~wOC@YIWolID3$Bx4LPRMyPG{OVqdeh zT$4|W;7GQI-5zLUupuanuYp8SNM)i$c757-)Pq0 zlQ}HJ;b3S{mWyXnZD|I7W)5Xi=li4TwDLO4`<1N<>DxW_)4=LO=f1U{COV98GvKo< z$eR-^n$f#^iQD+x+(7D|BnsXTA{y>Tc+kB!JNr27k(0kq5ou%|J0{3w+%m5jen+;S3ZvP6)%OxhyX$aC>!=`F9OM(%I+Ko+P zomX6Yzh>W*g7dBTqc3@_v_Yci-N@Jt5$nVGTgqx@?!^}d^5d>tHqZJ@(u(#~DYWQU zE^IaiyJz=vw(%f_R3wMPlrpm5gLX3Lw`P0{)G{#ns%qC9O(ah3`*BH^bF%clTHrC# z(5=Y%f}1`rG9MgjQZqS+I=)NG7_@OV!B#Y7D-M$`VXl!8P!TGW?m#5OOVl#fpaez6 z-gz0v@GT{9&~$D1n!E@Dwtz1WYUX4^Gn;q=Ye=_h1(N$I>|s)bDTs4%_2RMbkX%mS&oIKapYruzT^9YK*KP!NpbfDgClM=iy+`r9c1jE;2A@#JA(Myu^* zcXxJ$F2QJXBz_N=3yvgGXeb^O5=HMTAXOOxh~Ib1yfQ*ecGdfTbo~%=Rkfl?Xu=%(9gS zwWZ!eqq;9=S@xtMBBd+o2tPl%E^FC+w=eH_5q|<7r%e4kOit1wQv*C_(H~`iGfZv+ zL1%pQ5@WKdpBBwyfN^=LWE-MO(e~~CRROsFhj+Kiv!n{HN=VdRl&I~Y`BlJ#dR={X zO~v>g4Bbf8THVrehyZTm1dq8W~TeB+9dt_!Ww4eEE7NWMmJ^>MI*Zx3yWENJ}d;JLFpu;P=h3zV9F;EcrGCYX*3@GDy`}6W4yYGw|8}BVb0!=x$GhHpMtq)5Wt zJi><093c!z9(*9^zM}z=w_g4cKNEe2`_jwi$EJRX=hBo@Ve67>?8gEsv7GL7PC}d> z4KNnW-2JI;OVQ$X$CvpLL!4>wY3`{V#CMj(qn$<2m@( zk{$7U&UOFfE$=VXTMH5w(%uJDr0r8qEs|96J=V~v%;CfXDzHV6ZJNBSjNFdmq?}Sl zM2}LXTHYR)j@u7~iLhay>2okb_jFOsX=i-O%ySw}k~gyK$xKSW&v|HBRANqhTx;vT zn3c;DUmSQ+a`a?5^|7Cnv1OdE863H}ulAT9W_>u)H7YS|`e%q^W8PY0tJ&@vO%+4M^3`gyGMtYxo@#4jp z3ZJ6h$Wy2o&t?jnDz19L>$%Q$zwOq&+~{*gOggl(fc>HT?&?tBaw&OmSv10@%CshT zM}#A&OH=E0*gM&j!KS^DtKa_g)Oaz|ijGGQc)m7a@?6bKnd>yYHyo_aL>w(~`+0n~ zkFfo$^dwQ7e|FSO(1%BHzoXR$4G~T|{Gg?3!fuzlzLc=@F2@~8BpiPqbLEHReHYTF zMd4fCR7pwCp5|22w4SG@BcGEbouBke26@IeaZ7r}-^zy_XjOIm*vgvZ;*w7>yLkSF zkdRtDU&geIk^JGzXA-vAseZbX2^776!mV415-RPg9%NG?7&Xlu78&Wi6`t!vyDd|c zh2)aakJj^>tUECgKCb@Z{Fw;*px_|vGM{Sa)IHNUtXN>~EwTLbDRDZ}ceT0PrQi06 zQU4aFhY69!4ePB!!9A((f1qM;Ii8(E{+=_fzLh)q`fn~@p;w~av&4Lo(4iG`o3GuA z2LZhJD&1{!v7*kEpwId%VSM_-#QcE4eF?HTofjM;BE0>5MVe1|?Z`~MqU`>FCbY@L z9DR|yDl+Wy;{+$O0O_-9mT0lQ&2QWirKF_35AvirQBz6sdDON$I}4_+D45PF&5jEj zw3ej>X!_Oih=4ey)!vF(KZ4MG(cT^1(inPiU)DZqLc;5gr)fvR5adqx?Opjts+>ml zs<-25VFQvjG*eE``#F929g9oOT_BRJoAzP8hH?|nc%gEvjR;!9B;jG<-`8K<7Gc(I zPqT%l&Tk0K)jQ&U`Oy?LE@PtjB!3t8b2A9+^qA;wx{)YkRdV@v|K2gAS5X%QY>(F*yOI*D@~i3M%eJ_m`~ za3`{zI*OnK^B+Mimj(8hIX6`e`*YfDl?twws!xk}`rSUc-=_eKw)X&`b4xNus@#kD zPG#-wi(Kj!i?WxY)Nxxd$E$quy|$@6Wl9v-P~cVat~{9jIb#bWnj1ZRz=~@@mc8@2 z9KP)D$>^$il4BSkIQ(T|@oQ2~@!a;ks$j0|$7;v#+|SsYA-2u2dPgIQ@}y$Qk8uvB z8o=DU*>w7C4k5>i@KfMJ9=Gh6VkGfouzonj^$g*6iTB9t#k^|Ebz4Uw)sYyiS0riM znm~2qCnQjA_!Jhtwlxdqu*v@)uu=7hF9cuFu*bJhy_yPN2BEEj6grIDWrcQXUh#p~ zEAp6Y*dF2)Y3a%mchG}SznPQR3b8BAR=R5fH51>Jw3f}lodZ#JaYgLjsT>_CXj#1G z(%jdEehOXIKxdRAGGIEHpt8f@_n`HwsS9E;O3fcG0Gk?lkdOO|Kvzw?YGZ$F3XD{! zPL#v1I3l{n%6-Bj7T#!1P7HW-SCy*21X&tfZBUe1n%x>s*q6oiW!PqCv8Mn>&(RN4 zl+lN&HIy^-)z=X&X~G&7&10NBjH@TEt7cr4f7k~TpYeI;%sC^OCt+_YOXCL9_Jn8O z+UhRF`Rf&KYu$1g7hP5%s{K*CaFI}`!0yxntfR=ryjQlW+?fg$L*BGTz>n0`sC*^X zf{2Kipuc}94{C3(9-TAZ*mBjVlpi(EPgY5hIqrtnlY=Jgw^jC%5qOUfN{U~LZh{>VyjVJz|v<+v| z8hlHD@1U=Mli8V)h~1k@NZfIAZB$1-gs#|ikqcx1tkXPYX=>&# zT4uD>N!}&(eBRmHL0%!TU)YP+s&!x=G)!YZaU(?rbahx8I0UPRohG31H)KW$xjZNe z|Jv#76NNvXXd6sUH)?mZXVvCfe7C!$(_yP=d`;B z9spLpLHu?Dczgvzr$_l;nk8x*4FHz(>+j%`|B!eOo~wtd#*VY zv_Cu$vV+T&?Pcy2jyebg{t6;mX)Jb}%0u#TwXNSf&NDgl7+AljJ2J}?c5ed^iT1!g zZizrMJseAe5gV9o=kFIv{f|GT;bsB!pc#|)VO}2Ofy$a{R<9Cb9*t32=X83ZSXXit zbz=E0y>8FpBhvY%*Upo_sYs@)b4p20`D4QGDzAb$EZD;J=5!7>rtHkjY+eFvf}~^@gp9{5 zj)KGTo*fY~&vLw?e5a0>-)1Me@HBSrT=8M8#{8WFJ$dJP;_W~>6~~-5bsejs3uX2` zP#i>zq}FOz=PB;6#gMTYkBQBLCK6eD#}Ws*8!nr8kRN`Y|9mf&jo4FSBVr>abLdV3-U(CRbHdizm_@A21WCnyba^8IBW3q8XE1~V( z>Q7v7F0RUp%_bqbqf8+?R6l-~FWjozOoRd%{sB!e(&Z*y%HN7;iu!q2_dHj8*#Sp& z#HNFVVf}n^;W2Uvc5N~yz%Y9DH|^)JA!Es~Je*wp$UbvKUS2<=+V7`JGoTEbH83uV z8eQs5@fhuG;PHaj-h)IBq?-i3SxZ`j2?HC@pLx97>eu`k+Ph8%WSCzYFfOtE6u@c- zaTVL(67Lsf`5>{MzYq+ZS0OWQ z!+ZjIC0x&ON7S@4sM}??DL->-ajSAt3(%|@KXVRI8&5|Pwrl8Lp{(GYkv4Kq;Nyxf zZj><8&!tA^SNj7^FVa*jPphfNa`N%;`&1qsUi(t4k3c?W%nqvoywWKqH3F2>So~i;;u)_V;Ifu2BDN5vZ3CF{C;4q@!Fn!{zP#;y8j)tP5Zw4R~INb zhRp1;!|XWM{l&S7HvDx~i3thG8i+n#S8>B!&HO5%)Ic-czfoA=BpyXwu ztYocMTO0espbwtlQ}YcpAX|SquFRuhp_g$m!a{IKL=I+E%$se!5!(er!o|}`l7JZA z@k`tFDR!rjHZdYffpIzP$jCW>JSk5$?n*$c(e(+fXc7t%y^)D&T}Qv~R{jQ<=$?MR z_A|l;3yHyC81vuau3n|j9^*Kp z^m7_4zFixM^&R^`8WyK83e!#$g^7rG{%(JA%NlS(0=Kj+ybmbtJ{d*Y)Yx+4KtLQf zFI|$D)qUbb`9bcJT=u3pF~{SuhRP;3Q#k{(P65j00R)WY#O8DPJ^TRummClWdOVrs z%G=pHQuw<<{@^nwdbaszSVd@TL7 zqUCuaOdpUR^V3Q$i_9A*w(o2!MCA~*0SF!*F8$Kvd9{=2T6tb@40?AKIPqsrIF+`b;jCs=d*_qfNE8sxxiF~No)}?D}aqgtQUh;w|2l@l| zJINdRlqZ(0AP1=X#=koTbN1Q_Lo4yT@Y2pDBnbw9al@4PT=w_qN!Lr)EUBc>M|q7T zgEJ9i*h$Ikm7YD>_1W7dsjp?KDn0uz8x#D-Fl@{Kx+SzT5uf*{K!vM2N8RBv7st&Vy|^{d4P;2b z&+TSo%^#XIHC2{*JWJ>~1@04o{G$d<-hAW9mk~?kfKN#kwu>9X?$8;r{;y+>MHSRX z?RRJje1oT}*ogS;;5aguah;U-6m#SFD3P3Vn-XN!J8$Z@Ho&tX z#u$^chdtzu6D17GaiqCp+y*;;;CnCRK3^;S)`svt>VN(Cg|G4Sj$&Y6{IJNUVgfvB zC*3drO8&X?O)J{RvU7j;Vsz(lI5UjwnA>A^P~qh9>r?4`bW@aD%>A<)s|~d7)ECGK zf{GF7zY%lVS8(U65+tNKZq0wRr<60`O7gaU&6?C(@*l!VZZMFv)}9jQoV@u9?k0iz zF_Fnsk(MYw-NA+?=U%-6lDAIl|M9gK0~Q7e7e32ewLQ6VmV$rwJ%%xzm$R$EU>SO> zsm)d}6%=H%c`0DvNEt6>n4cQ<;ClMC8=x&;OIFb^%w@l8Ah)S}R8*7EWe9YW#Edd) zMBga=vX|^6EiL!LhP~Zl6TOPvB0*;0vyeVc>)a37qnh+<1UUKO%S|09i56*{}{N=xT#`p&mx zt=ibD0`X6ffp;wtHzY3pWCg!mbK9GxbU z^Pl3!r?pI6+6XOYtp&df$8K-Dk7gRjPhC#mM)nH=`$KZ*5TvYmqKLfNg-08qGs454 ze32-FTz{jEy$~T-?D|S)MQo+oYw-t}uaDzZ=K3t=eBh)M*&3N-S(xd+@o~k|j=yBL z1iC$FvHEYwj?UaMYw#5dpa^<>`)={OM*(~@pprdR4e_@m-oVrv#uaESYd+`QyP-DA zCA$Rd&Q$W^w+NJyYf#IaU>(yoz{zs;u4Y$_(|ZjM@Hg%o`pD(tZzk=Jk3S7>N0UH~ z*UH`Z0|PzeXEwrM*IyCwFo*qWU!py(O9ofPBd5rn=I4It3r^UjAkVRVZm8Yx+0eq2 ze{$Pv51swptEFq4{$#LP6*=*~+HdsGps>1d{L_1V8_ypnAXhJ%%4NJ{CruUd!I7WR z_htL_ls_fge_LJ~t6tqx8Xh9=%iZ^P5xL^mB##1m_Q(g+FaDi_g9^V1S>y)j&!d+Ti1fqc5jlDt&kuW0AK!c4bU z)o$TtPRKhO6G51KGai!GqKDx@Zow^MLrj^t*J3(XAeOvr_#5opP4+Nkuh_(9vfBdr zWJwjf)^fG#pdI6j$DW)xwG~ipxcDonH}uwRt>heOE1}i9(%v`vhe{=jZ9LB?9i{t$ z=s9X%7H&R|*@?a$pO1t)wP4ftSzA_WpZ$<{HL~`Cdm**UCu~u-I)H%RFADw}f;kw4 zjS@c!2z2}T^YFhnr$e=DmJ%5ZTj&{9R8sV@=8AmohCs}4xw;!E#kIB8>*56-2H%XY zbqhI4J~}22&~(zlg)kYuwb<5V=f0s%S9yptw(g*x@QCyJB(rr88u5&ef-OB6OG7jH_G=%v*ACa+A%g zeVI3q+N{X7ZvQ-Of&UkYOI~mZ#H9z3%KibfuO;zAA~>SIqM!|ZR!3)36SOqRvlchv zOdnDm3D=0SLal+a#Xq#YhJ%JC4a=6cGy%I4fBfFtkD`=#R%}Hfp}m*kem%Eg%_@x; zJz;mP5+dwq=BlbFa=950b@p9;%8(d~qQXFKL znp~OLmhBlnm4R-*V65txEGVm zc!%%Tnp_~%t3jUdFYL%Al8?gNF7O)}d0rMsun#$XP=wVkYfxhrp(wbEcY_{D)PpW)RnQSRpxrh z{{oFT#}dmw?oP=3LsE4?*j?OAOlqFg_60j0x?$kvEW%0W3^yEz!^^BNH9Rwi>pu}R z8H`PDQ)9l-mW$D4GJ#+4@5o;U(1(o4pc1bPMDljTBF5cT{rsCYXc$9n`j0B3zq1DVz)v&VR(i{u;O))(nf6X@7(fjAppcCPNxgSPA(=v$!#e3)^Jw`3r_5=zomM^*AT!S>XBK$N%-I@@if=II+F>ighaD4lHYhZA1?a&FCb_Q&W^w$jIZ}Zltl)H$+-v1xfNG1~=Y7$@c~GsZs;C%i zW1ePo%%fdlYb|+L+XYP?&e3|htf3@oWQm0^4K8tGQ9J48XMg5##{#L~%kpLX-da?1 z01J=&c^vD%@k9UY)X9W->B#E}Z1-#JY(i;i#G9h?{}A0{Luj@!shF)F$^94X0K9eP z9t0LSCw6X7o;6siipTwXsbf2h?G$|F9UqYign& zqx0XNit1%@r$SgQRz*-KSl?KGy}rL+Q&be{s_>hC3C!Lm$+%)lB6)kTaT^ljQZC(^)tR?&#xKYaie5CO{$xZH&gp zH^i)wjH?O8^f5`zRm1#YM659sor#IKw&oTKq_gITn1xXWDqDy$ufVs5O2s8T{y_u$ z0;AUSxsL-r(2SS}J5}y2ZL%+YSaL|1j_`UAJfA8TIg6L1+HJr1hw@z9lWH6j%_7K- zJ^5#%ihLXe^=$pPg@p*z(h_!;^VlAkFm%+2UY;x1)jrq^_ z*hX{=8wLB|aAv`M`0c>5J2KrI5lwi+XpoU4iT#Z@oWCg%1RUflp7#Iv>OW|{PJDGG zcg)Dpm{}|&^qisPTsoe<|Eho23OUk+`LTv@K6>ePAf4*LoXCj8&)re@f z72z;`nFUk1WS zNoqLeMXA{bJYpWxmvt2LmLxQDf$8>DFP9t~XQl3a;50uC0YE`qv`Svt2 zEea)lEQB<`G$1b9h4#hh=zq2$`Gpg-h3LtoiUWU<${vXogBlrX8IIT04h@GSaqp@N z-M?>JKPuO!!o3&$jg^~=e;vIcsf|XQH{MgFMGaB5^tPqOJGTLWZ`F_dnO4t5n)7{HXKLL4kG!4y6yR9n++m+Gfd4S>#yI zxgcLaSMh3khOkUio0L*PR;edns0~l_q zC9V-ADTyViR>?)FK#IZ0z{o_`z(Uu+G{n%z%GA=z)KuHRz{sJFcXuxeK$;?eHE=kNSz^y0WC9VXhhr!d;&t;ucLK6U~Sk8+8 literal 0 HcmV?d00001 diff --git a/app/TuistApp/Resources/Assets.xcassets/MenuBarIcon.imageset/Tuist-Filled@2x.png b/app/TuistApp/Resources/Assets.xcassets/MenuBarIcon.imageset/Tuist-Filled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9178abd408536dd582f3d1ad4bd7090f4c8d67f4 GIT binary patch literal 1023 zcmeAS@N?(olHy`uVBq!ia0vp^vOp}y!2%?!`0i=}DTQQ@AYUL)je((|g@NH0P^jSr z14F3+1H-EX1_rAc3=HB0b9M#V0411`yxm@PT2d8`#Z*7WTI z%0KpWaSX9I-8C=fnBc;)uxo8eLZN^NdlN^l zTF?p+nFvi0uB9TZzqKD7@N{(CAkwlZQ*dLb4(Bls6P8{t9Zf@%_4+5TAGF^2UR3$K z?XKVN_MVGMe_MRMHPSief#}zLtLN-(o$=hYt@41(rt{ez(<@I2P8IWIEL{0`X4cHB zGuLRYba8R;Q9EcdVRg*1pn`ele{|hiBE!AE6+x6$uPS@zKa5jrRHN7fa_ea=? z?7yyWOP_9DbJ>KUcMZp+OG_FxUPgEre+ZHcY_m&cSdmzIVsqm3!iZI^;SKCINn+P- zGptc|RegPi=h`IZcZSm(j!K^YHG}O|#+m{PF0<4M;fC8H3tKw1-L9UO*w8Z7(Ld8- z=Z4E>4pq+eF+zLh&Sl^+>Xx6V;S1vTIacFt|3Qo0^Wx!Tg`?AsESvP8*My069b@%P zo}N#vkB+bE`#mqRK5Xmx*1XU0q5Lzy?ODbAEcWe!Rm;yFJ)rrICCk!hULM1=ixW4b zWiFL%cMX59#=i{EmywMoxjTJRmUpfcY?23 zp8wq1zGl1jhLG<3HQO)C=N{DK_N%;?JFk-QLFo4CLxo@2|7h;1dBf_ynt?m+i(iG@ zp{-@=OJ8bTDEiy?UP+Jt-@b~N&4&%zhBt@ zwcR|&c~SZtU=C0%ag8WRNi0dVN-jzTQVd20Mkcxj7PH0bnT*0MIM|*b~cc^{^8!B+k0I zIs-rzL*Gi=f$3O+3wTjh8Vbk^jy;|L0I6!Mvm*)fy!N(V6v<2JdD?}fZAUq(iHn?z z+9mE?lILS*6=hZ7xpVr1na`4y-sb8?L-79cG>h(ti>XJ@iGdgK}U<^U(aWC1Oc?nb+Lut_;iiOt7Y6 zIqU6xPJ56#HT4p;jV-O&$#V7YO@r7bGdf*3W?CDL3^F~RuSbnX7jZ}(QrAo6qe?v7 zu}%DvH6mfr$Z8+JwAJk-t08spsHiYez|Wb<_1%SnUzo#Tv>_?FT&Jh3~Y_G*>A! z<%P)LkG*J*FhG$TREdaSje&-|kYk21o_L!-v?330^+7fSrd|l^z?$UzO2M~&n{Zw0 zbi-bS%D}A zE$;?J7(aHL!?}y6-&zI*eB!sK-FI73q-Y4uW(;#$Yi?QgzwA(UePKljpU+5_OI^w% zHs(ce83AT_g*R1VxX2ZXN&Ht0pL9L)r0(mUX<)qTL_e|!r6vKU8ZnbpQOX(SH1EuU z7I`yXhlrZm+Xu9C8)-%|%p??OuSABuJ(ta;j3(Y*mRxu5g9q)C^{)Db9^1o0Aa z4MY~TV}a&l8y7n+@;p(C;H1T+A+#H!w%w=ldYb{w@9H}5P_=$pMWp~?%<3^<4j#AJ zY>bX8-c0W1-{e84BID8_97W_10e8x1G9eFd`@V^EqDSX6kw5H6hWPlReEe+cbljna4GwtLp}k7gXqO)G(PvQr6%1vqDB zRQkTX2x5k(ZTVdVgOc1tApmqBj!jH$l6e*!foBs?tT=Ylc=6(AP&|962NP7S5egQ&4TcaF2v(!~ydbs;*} IIR#$+2hvr4GXMYp literal 0 HcmV?d00001 diff --git a/app/TuistApp/Resources/Preview Content/Preview Assets.xcassets/Contents.json b/app/TuistApp/Resources/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/app/TuistApp/Resources/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/app/TuistApp/Sources/AppDelegate.swift b/app/TuistApp/Sources/AppDelegate.swift new file mode 100644 index 00000000000..5433e192008 --- /dev/null +++ b/app/TuistApp/Sources/AppDelegate.swift @@ -0,0 +1,12 @@ +import AppKit +import Combine +import Foundation + +@MainActor +final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { + let onChangeOfURLs = PassthroughSubject<[URL], Never>() + + func application(_: NSApplication, open urls: [URL]) { + onChangeOfURLs.send(urls) + } +} diff --git a/app/TuistApp/Sources/Modifiers/HoverStyle.swift b/app/TuistApp/Sources/Modifiers/HoverStyle.swift new file mode 100644 index 00000000000..efe94629931 --- /dev/null +++ b/app/TuistApp/Sources/Modifiers/HoverStyle.swift @@ -0,0 +1,20 @@ +import Foundation +import SwiftUI + +private struct HoverStyle: ViewModifier { + @State private var hovering = false + + func body(content: Content) -> some View { + content + .onHover(perform: { hovering in + self.hovering = hovering + }) + .background(hovering ? .gray.opacity(0.2) : .clear) + } +} + +extension View { + func hoverStyle() -> some View { + modifier(HoverStyle()) + } +} diff --git a/app/TuistApp/Sources/Modifiers/MenuItemStyle.swift b/app/TuistApp/Sources/Modifiers/MenuItemStyle.swift new file mode 100644 index 00000000000..d962645465d --- /dev/null +++ b/app/TuistApp/Sources/Modifiers/MenuItemStyle.swift @@ -0,0 +1,19 @@ +import Foundation +import SwiftUI + +private struct MenuItemSyle: ViewModifier { + func body(content: Content) -> some View { + content + .buttonStyle(.plain) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(EdgeInsets(top: 2, leading: 6, bottom: 2, trailing: 6)) + .hoverStyle() + .cornerRadius(5.0) + } +} + +extension View { + func menuItemStyle() -> some View { + modifier(MenuItemSyle()) + } +} diff --git a/app/TuistApp/Sources/TuistApp.swift b/app/TuistApp/Sources/TuistApp.swift new file mode 100644 index 00000000000..016eb0dfc24 --- /dev/null +++ b/app/TuistApp/Sources/TuistApp.swift @@ -0,0 +1,13 @@ +import SwiftUI + +@main +struct TuistApp: App { + @NSApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate + + var body: some Scene { + MenuBarExtra("Tuist", image: "MenuBarIcon") { + MenuBarView(appDelegate: appDelegate) + } + .menuBarExtraStyle(.window) + } +} diff --git a/app/TuistApp/Sources/Utilities/AppStorage.swift b/app/TuistApp/Sources/Utilities/AppStorage.swift new file mode 100644 index 00000000000..3e0b567cc1f --- /dev/null +++ b/app/TuistApp/Sources/Utilities/AppStorage.swift @@ -0,0 +1,30 @@ +import Foundation +import Mockable +import TuistCore + +protocol AppStorageKey: Hashable { + associatedtype Value: Codable + static var defaultValue: Self.Value { get } + static var key: String { get } +} + +@Mockable +protocol AppStoring { + func get(_ key: Key.Type) throws -> Key.Value + func set(_ key: Key.Type, value: Key.Value) throws +} + +final class AppStorage: AppStoring { + func get(_ key: Key.Type) throws -> Key.Value { + guard let data = UserDefaults.standard.data(forKey: key.key) else { return key.defaultValue } + + let decoder = JSONDecoder() + return try decoder.decode(Key.Value.self, from: data) + } + + func set(_ key: Key.Type, value: Key.Value) throws { + let encoder = JSONEncoder() + let data = try encoder.encode(value) + UserDefaults.standard.setValue(data, forKey: key.key) + } +} diff --git a/app/TuistApp/Sources/Utilities/ErrorHandling.swift b/app/TuistApp/Sources/Utilities/ErrorHandling.swift new file mode 100644 index 00000000000..f1b933aef39 --- /dev/null +++ b/app/TuistApp/Sources/Utilities/ErrorHandling.swift @@ -0,0 +1,18 @@ +import AppKit +import Foundation +import TuistSupport + +final class ErrorHandling: ObservableObject, Sendable { + func handle(error: Error) { + DispatchQueue.main.async { + let alert = NSAlert() + if let error = error as? FatalError { + alert.messageText = error.description + } else { + alert.messageText = error.localizedDescription + } + alert.alertStyle = .warning + alert.runModal() + } + } +} diff --git a/app/TuistApp/Sources/Utilities/ErrorViewHandling.swift b/app/TuistApp/Sources/Utilities/ErrorViewHandling.swift new file mode 100644 index 00000000000..58a800104d7 --- /dev/null +++ b/app/TuistApp/Sources/Utilities/ErrorViewHandling.swift @@ -0,0 +1,26 @@ +import Foundation +import SwiftUI + +protocol ErrorViewHandling: View { + var errorHandling: ErrorHandling { get } +} + +extension ErrorViewHandling { + func tryWithErrorHandler(_ operation: @escaping () async throws -> Void) { + Task { + do { + try await operation() + } catch { + errorHandling.handle(error: error) + } + } + } + + func tryWithErrorErrorHandler(_ operation: @escaping () throws -> Void) { + do { + try operation() + } catch { + errorHandling.handle(error: error) + } + } +} diff --git a/app/TuistApp/Sources/Views/MenuBarView.swift b/app/TuistApp/Sources/Views/MenuBarView.swift new file mode 100644 index 00000000000..d3aab86d792 --- /dev/null +++ b/app/TuistApp/Sources/Views/MenuBarView.swift @@ -0,0 +1,41 @@ +import Foundation +import SwiftUI + +struct MenuBarView: View { + @State var isExpanded = false + @StateObject var errorHandling = ErrorHandling() + let simulatorsView: SimulatorsView + + init( + appDelegate: AppDelegate + ) { + simulatorsView = SimulatorsView(appDelegate: appDelegate) + } + + var body: some View { + VStack(alignment: .leading, spacing: 6) { + Text("Tuist") + .font(.title3) + .bold() + .background(Color.clear) + .padding([.leading, .trailing], 8) + + Divider() + .padding([.leading, .trailing], 8) + + simulatorsView + + Divider() + .padding([.leading, .trailing], 8) + + Button("Quit Tuist") { + NSApplication.shared.terminate(nil) + } + .buttonStyle(.plain) + .menuItemStyle() + .padding([.leading, .trailing], 8) + } + .padding([.top, .bottom], 8) + .environmentObject(errorHandling) + } +} diff --git a/app/TuistApp/Sources/Views/SimulatorRow/SimulatorRow.swift b/app/TuistApp/Sources/Views/SimulatorRow/SimulatorRow.swift new file mode 100644 index 00000000000..9f86b6d7c95 --- /dev/null +++ b/app/TuistApp/Sources/Views/SimulatorRow/SimulatorRow.swift @@ -0,0 +1,87 @@ +import class AppKit.NSPasteboard +import Foundation +import SwiftUI +import TuistCore +import TuistSupport + +struct SimulatorRow: View, ErrorViewHandling { + let simulator: SimulatorDeviceAndRuntime + let selected: Bool + let pinned: Bool + let onSelected: (SimulatorDeviceAndRuntime) -> Void + let onPinned: (SimulatorDeviceAndRuntime, Bool) -> Void + + @State var viewModel = SimulatorRowViewModel() + @EnvironmentObject var errorHandling: ErrorHandling + @State private var highlighted = false + + private func deviceImage() -> some View { + switch simulator.runtime.platform { + case .iOS, .none: + if simulator.device.name.contains("iPad") { + Image(systemName: "ipad") + } else { + Image(systemName: "iphone") + } + case .visionOS: + Image(systemName: "visionpro") + case .tvOS: + Image(systemName: "tv") + case .macOS: + Image(systemName: "macbook") + case .watchOS: + Image(systemName: "applewatch") + } + } + + var body: some View { + HStack(alignment: .center) { + ZStack { + Circle() + .fill(selected ? .blue : .gray.opacity(0.4)) + + deviceImage() + .foregroundColor(selected ? TuistAsset.Assets.light.swiftUIColor : TuistAsset.Assets.dark.swiftUIColor) + } + .frame(width: 24, height: 24) + VStack(alignment: .leading) { + Text(simulator.device.name) + .font(.title3) + Text("\(simulator.runtime.name)") + } + Spacer() + + Menu { + Button( + "Launch" + ) { + tryWithErrorHandler { + try await viewModel.launchSimulator(simulator) + } + } + Divider() + Button("Copy name") { + NSPasteboard.general.declareTypes([NSPasteboard.PasteboardType.string], owner: nil) + NSPasteboard.general.setString(simulator.device.name, forType: .string) + } + Button("Copy identifier") { + NSPasteboard.general.declareTypes([NSPasteboard.PasteboardType.string], owner: nil) + NSPasteboard.general.setString(simulator.device.udid, forType: .string) + } + Divider() + Button(pinned ? "Unpin" : "Pin") { + onPinned(simulator, !pinned) + } + } label: { + Image(systemName: "ellipsis.circle") + .font(.system(size: 16)) + .opacity(0.8) + } + .buttonStyle(.plain) + } + .menuItemStyle() + .onTapGesture { + onSelected(simulator) + } + } +} diff --git a/app/TuistApp/Sources/Views/SimulatorRow/SimulatorRowViewModel.swift b/app/TuistApp/Sources/Views/SimulatorRow/SimulatorRowViewModel.swift new file mode 100644 index 00000000000..8c369a7b59e --- /dev/null +++ b/app/TuistApp/Sources/Views/SimulatorRow/SimulatorRowViewModel.swift @@ -0,0 +1,23 @@ +import Command +import Foundation +import TuistCore +import TuistSupport + +@Observable +final class SimulatorRowViewModel { + private let simulatorController: SimulatorControlling + private let commandRunner: CommandRunning + + init( + simulatorController: SimulatorControlling = SimulatorController(), + commandRunner: CommandRunning = CommandRunner() + ) { + self.simulatorController = simulatorController + self.commandRunner = commandRunner + } + + func launchSimulator(_ simulator: SimulatorDeviceAndRuntime) async throws { + _ = try simulatorController.booted(device: simulator.device, forced: true) + _ = try await commandRunner.run(arguments: ["open", "-a", "Simulator"]).concatenatedString() + } +} diff --git a/app/TuistApp/Sources/Views/SimulatorsView/SimulatorsView.swift b/app/TuistApp/Sources/Views/SimulatorsView/SimulatorsView.swift new file mode 100644 index 00000000000..dcfffc6068e --- /dev/null +++ b/app/TuistApp/Sources/Views/SimulatorsView/SimulatorsView.swift @@ -0,0 +1,92 @@ +import Combine +import Path +import SwiftUI +import TuistCore +import TuistServer +import TuistSupport + +struct SimulatorsView: View, ErrorViewHandling { + @State var viewModel = SimulatorsViewModel() + @EnvironmentObject var errorHandling: ErrorHandling + @State var isExpanded = false + private var cancellables = Set() + + init(appDelegate: AppDelegate) { + // We can't rely on the SimulatorsView to be rendered before a deeplink is triggered. + // Instead, we listen to the deeplink URL through an `AppDelegate` callback + // that's eagerly set up in this `init` on startup. + let viewModel = viewModel + let errorHandling = ErrorHandling() + Task { + do { + try await viewModel.onAppear() + } catch { + errorHandling.handle(error: error) + } + } + appDelegate.onChangeOfURLs.sink { urls in + Task { + do { + try await viewModel.onChangeOfURL(urls.first) + } catch { + errorHandling.handle(error: error) + } + } + } + .store(in: &cancellables) + } + + var body: some View { + ScrollView { + LazyVStack(alignment: .leading, spacing: 4) { + if !viewModel.pinnedSimulators.isEmpty { + Text("Pinned simulators") + .font(.headline) + .fontWeight(.medium) + .padding(.leading, 4) + + simulators(viewModel.pinnedSimulators) + + Divider() + } + + HStack { + Text("Other simulators") + .font(.headline) + .fontWeight(.medium) + Spacer() + Image(systemName: "chevron.right") + .rotationEffect(.degrees(isExpanded ? 90 : 0)) + .frame(height: 16) + } + .contentShape(Rectangle()) + .onTapGesture { + isExpanded.toggle() + } + .menuItemStyle() + + if isExpanded { + VStack(spacing: 0) { + simulators(viewModel.unpinnedSimulators) + } + } + } + .padding([.leading, .trailing], 8) + } + .frame(height: isExpanded ? NSScreen.main.map { $0.visibleFrame.size.height - 300 } ?? 500 : nil) + } + + private func simulators(_ simulators: [SimulatorDeviceAndRuntime]) -> some View { + ForEach(simulators) { simulator in + SimulatorRow( + simulator: simulator, + selected: simulator.device.udid == viewModel.selectedSimulator?.device.udid, + pinned: viewModel.pinnedSimulators.contains(where: { $0.device.udid == simulator.device.udid }) + ) { simulator in + viewModel.selectSimulator(simulator) + } onPinned: { simulator, pinned in + viewModel.simulatorPinned(simulator, pinned: pinned) + } + } + } +} diff --git a/app/TuistApp/Sources/Views/SimulatorsView/SimulatorsViewModel.swift b/app/TuistApp/Sources/Views/SimulatorsView/SimulatorsViewModel.swift new file mode 100644 index 00000000000..caecddcbe05 --- /dev/null +++ b/app/TuistApp/Sources/Views/SimulatorsView/SimulatorsViewModel.swift @@ -0,0 +1,188 @@ +import Foundation +import PathKit +import SwiftUI +import TuistAutomation +import TuistCore +import TuistServer +import TuistSupport +import XcodeGraph + +enum SimulatorsViewModelError: FatalError, Equatable { + case noSelectedSimulator + case invalidDeeplink(String) + case invalidDownloadURL(String) + case appDownloadFailed(String) + case appNotFound(SimulatorDeviceAndRuntime, [Platform]) + + var description: String { + switch self { + case .noSelectedSimulator: + return "To run a preview, you must have a simulator selected." + case let .invalidDownloadURL(url): + return "The preview download url \(url) is invalid." + case let .appDownloadFailed(url): + return "The app at \(url) was not found." + case let .appNotFound(selectedSimulator, platforms): + return "Couldn't install the app for \(selectedSimulator.device.name). The \(selectedSimulator.device.name)'s platform is \(selectedSimulator.runtime.platform?.caseValue ?? selectedSimulator.runtime.name) and the app includes only the following platforms: \(platforms.map(\.caseValue).joined(separator: ", "))" + case let .invalidDeeplink(deeplink): + return "The preview deeplink \(deeplink) is invalid." + } + } + + var type: ErrorType { + switch self { + case .invalidDownloadURL: + return .bug + case .noSelectedSimulator, .appDownloadFailed, .appNotFound, .invalidDeeplink: + return .abort + } + } +} + +struct PinnedSimulatorsKey: AppStorageKey { + static let key = "pinnedSimulators" + static let defaultValue: [SimulatorDeviceAndRuntime] = [] +} + +struct SelectedSimulatorKey: AppStorageKey { + static let key = "selectedSimulator" + static let defaultValue: SimulatorDeviceAndRuntime? = nil +} + +@Observable +final class SimulatorsViewModel: Sendable { + private(set) var pinnedSimulators: [SimulatorDeviceAndRuntime] = [] + private(set) var unpinnedSimulators: [SimulatorDeviceAndRuntime] = [] + private(set) var selectedSimulator: SimulatorDeviceAndRuntime? + + private let simulatorController: SimulatorControlling + private let downloadPreviewService: DownloadPreviewServicing + private let fileArchiverFactory: FileArchivingFactorying + private let remoteArtifactDownloader: RemoteArtifactDownloading + private let fileHandler: FileHandling + private let appBundleLoader: AppBundleLoading + private let appStorage: AppStoring + + init( + simulatorController: SimulatorControlling = SimulatorController(), + downloadPreviewService: DownloadPreviewServicing = DownloadPreviewService(), + fileArchiverFactory: FileArchivingFactorying = FileArchivingFactory(), + remoteArtifactDownloader: RemoteArtifactDownloading = RemoteArtifactDownloader(), + fileHandler: FileHandling = FileHandler.shared, + appBundleLoader: AppBundleLoading = AppBundleLoader(), + appStorage: AppStoring = AppStorage() + ) { + self.simulatorController = simulatorController + self.downloadPreviewService = downloadPreviewService + self.fileArchiverFactory = fileArchiverFactory + self.remoteArtifactDownloader = remoteArtifactDownloader + self.fileHandler = fileHandler + self.appBundleLoader = appBundleLoader + self.appStorage = appStorage + } + + func selectSimulator(_ simulator: SimulatorDeviceAndRuntime) { + selectedSimulator = simulator + try? appStorage.set(SelectedSimulatorKey.self, value: simulator) + } + + func simulatorPinned(_ simulator: SimulatorDeviceAndRuntime, pinned: Bool) { + if pinned { + pinnedSimulators = (pinnedSimulators + [simulator]).sorted() + unpinnedSimulators = unpinnedSimulators.filter { $0.device.udid != simulator.device.udid } + } else { + pinnedSimulators = pinnedSimulators.filter { $0.device.udid != simulator.device.udid } + unpinnedSimulators = (unpinnedSimulators + [simulator]).sorted() + } + try? appStorage.set(PinnedSimulatorsKey.self, value: pinnedSimulators) + } + + func onAppear() async throws { + let simulators = try await simulatorController.devicesAndRuntimes() + .sorted() + + if let selectedSimulator = try appStorage.get(SelectedSimulatorKey.self) { + self.selectedSimulator = selectedSimulator + } else { + selectedSimulator = simulators.first(where: { !$0.device.isShutdown }) + } + + pinnedSimulators = try appStorage.get(PinnedSimulatorsKey.self) + + unpinnedSimulators = Set(simulators) + .subtracting(Set(pinnedSimulators)) + .map { $0 } + .sorted() + } + + func onChangeOfURL(_ url: URL?) async throws { + guard let previewURL = url else { return } + + guard let selectedSimulator else { throw SimulatorsViewModelError.noSelectedSimulator } + + let urlComponents = URLComponents(url: previewURL, resolvingAgainstBaseURL: false) + guard let previewId = urlComponents?.queryItems?.first(where: { $0.name == "preview_id" })?.value, + let fullHandle = urlComponents?.queryItems?.first(where: { $0.name == "full_handle" })?.value, + let serverURLString = urlComponents?.queryItems?.first(where: { $0.name == "server_url" })?.value, + let serverURL = URL(string: serverURLString) + else { throw SimulatorsViewModelError.invalidDeeplink(previewURL.absoluteString) } + + let downloadURL = try await downloadPreviewService.downloadPreview( + previewId, + fullHandle: fullHandle, + serverURL: serverURL + ) + + guard let downloadURL = URL(string: downloadURL) else { throw SimulatorsViewModelError.invalidDownloadURL(downloadURL) } + + guard let archivePath = try await remoteArtifactDownloader.download(url: downloadURL) + else { throw SimulatorsViewModelError.appDownloadFailed(previewURL.absoluteString) } + let fileUnarchiver = try fileArchiverFactory.makeFileUnarchiver(for: archivePath) + let unarchivedDirectory = try fileUnarchiver.unzip() + + let apps = try await fileHandler.glob(unarchivedDirectory, glob: "*.app").concurrentMap { + try await self.appBundleLoader.load($0) + } + + guard let app = apps.first( + where: { + $0.infoPlist.supportedPlatforms.contains( + where: { + switch $0 { + case .device: + return false + case let .simulator(platform): + return selectedSimulator.runtime.platform == platform + } + } + ) + } + ) + else { + throw SimulatorsViewModelError.appNotFound( + selectedSimulator, + apps.flatMap(\.infoPlist.supportedPlatforms).compactMap { + switch $0 { + case .device: + return nil + case let .simulator(platform): + return platform + } + } + ) + } + + let bootedDevice = try simulatorController.booted(device: selectedSimulator.device, forced: true) + try simulatorController.installApp(at: app.path, device: bootedDevice) + try simulatorController.launchApp(bundleId: app.infoPlist.bundleId, device: bootedDevice, arguments: []) + } +} + +extension [SimulatorDeviceAndRuntime] { + fileprivate func sorted() -> Self { + sorted(by: { + if $0.device.name == $1.device.name { return $0.runtime.name < $1.runtime.name } + else { return $0.device.name < $1.device.name } + }) + } +} diff --git a/app/TuistApp/Tests/SimulatorRowViewModelTests.swift b/app/TuistApp/Tests/SimulatorRowViewModelTests.swift new file mode 100644 index 00000000000..a0a6bfe5881 --- /dev/null +++ b/app/TuistApp/Tests/SimulatorRowViewModelTests.swift @@ -0,0 +1,63 @@ +import Command +import Foundation +import MockableTest +import TuistCore +import TuistSupport +import TuistSupportTesting + +@testable import Tuist + +final class SimulatorRowViewModelTests: TuistUnitTestCase { + private var subject: SimulatorRowViewModel! + private var simulatorController: MockSimulatorControlling! + private var commandRunner: MockCommandRunning! + + private let iPhone15: SimulatorDeviceAndRuntime = .test( + device: .test( + udid: "iphone-15-id", + name: "iPhone 15" + ) + ) + + override func setUp() { + super.setUp() + + simulatorController = .init() + commandRunner = .init() + subject = SimulatorRowViewModel( + simulatorController: simulatorController, + commandRunner: commandRunner + ) + } + + override func tearDown() { + simulatorController = nil + commandRunner = nil + subject = nil + + super.tearDown() + } + + func test_launchSimulator() async throws { + // Given + given(simulatorController) + .booted(device: .any, forced: .any) + .willReturn(.test()) + given(commandRunner) + .run( + arguments: .value(["open", "-a", "Simulator"]), + environment: .any, + workingDirectory: .any + ) + .willReturn( + .init( + unfolding: { + nil + } + ) + ) + + // When / Then + try await subject.launchSimulator(iPhone15) + } +} diff --git a/app/TuistApp/Tests/SimulatorsViewModelTests.swift b/app/TuistApp/Tests/SimulatorsViewModelTests.swift new file mode 100644 index 00000000000..3653921af6c --- /dev/null +++ b/app/TuistApp/Tests/SimulatorsViewModelTests.swift @@ -0,0 +1,533 @@ +import Foundation +import MockableTest +import TuistAutomation +import TuistCore +import TuistServer +import TuistSupport +import TuistSupportTesting +import XCTest + +@testable import Tuist + +final class SimulatorsViewModelTests: TuistUnitTestCase { + private var subject: SimulatorsViewModel! + private var simulatorController: MockSimulatorControlling! + private var downloadPreviewService: MockDownloadPreviewServicing! + private var fileArchiverFactory: MockFileArchivingFactorying! + private var remoteArtifactDownloader: MockRemoteArtifactDownloading! + private var appBundleLoader: MockAppBundleLoading! + private var appStorage: MockAppStoring! + + private let previewURL = + URL( + string: "tuist:open-preview?server_url=https://cloud.tuist.io&preview_id=01912892-3778-7297-8ca9-d66ac7ee2a53&full_handle=tuist/ios_app_with_frameworks" + )! + + private let iPhone15: SimulatorDeviceAndRuntime = .test( + device: .test( + udid: "iphone-15-id", + name: "iPhone 15" + ) + ) + private let iPhone15Pro: SimulatorDeviceAndRuntime = .test( + device: .test( + udid: "iphone-15-pro-id", + name: "iPhone 15 Pro" + ) + ) + private let appleTV: SimulatorDeviceAndRuntime = .test( + device: .test( + udid: "apple-tv-id", + name: "Apple TV" + ) + ) + + override func setUp() { + super.setUp() + + simulatorController = .init() + downloadPreviewService = .init() + fileArchiverFactory = .init() + remoteArtifactDownloader = .init() + appBundleLoader = .init() + appStorage = .init() + subject = SimulatorsViewModel( + simulatorController: simulatorController, + downloadPreviewService: downloadPreviewService, + fileArchiverFactory: fileArchiverFactory, + remoteArtifactDownloader: remoteArtifactDownloader, + fileHandler: fileHandler, + appBundleLoader: appBundleLoader, + appStorage: appStorage + ) + + Matcher.register(SimulatorDeviceAndRuntime?.self) + Matcher.register([SimulatorDeviceAndRuntime].self) + } + + override func tearDown() { + simulatorController = nil + downloadPreviewService = nil + fileArchiverFactory = nil + remoteArtifactDownloader = nil + appBundleLoader = nil + appStorage = nil + subject = nil + + Matcher.reset() + + super.tearDown() + } + + func test_onAppear_when_appStorage_is_empty_and_no_simulator_is_booted() async throws { + // Given + given(appStorage) + .get(.any as Parameter) + .willReturn([]) + + given(appStorage) + .get(.any as Parameter) + .willReturn(nil) + + let simulators: [SimulatorDeviceAndRuntime] = [ + .test( + device: .test( + name: "iPhone 15" + ) + ), + .test( + device: .test( + name: "iPhone 15 Pro" + ) + ), + ] + + given(simulatorController) + .devicesAndRuntimes() + .willReturn(simulators) + + // When + try await subject.onAppear() + + // Then + XCTAssertEqual(subject.selectedSimulator, nil) + XCTAssertEmpty(subject.pinnedSimulators) + XCTAssertEqual(subject.unpinnedSimulators, simulators) + } + + func test_onAppear_when_appStorage_is_empty_and_a_simulator_is_booted() async throws { + // Given + given(appStorage) + .get(.any as Parameter) + .willReturn([]) + + given(appStorage) + .get(.any as Parameter) + .willReturn(nil) + + let simulators: [SimulatorDeviceAndRuntime] = [ + .test( + device: .test( + name: "iPhone 15" + ) + ), + .test( + device: .test( + state: "Booted", + name: "iPhone 15 Pro" + ) + ), + ] + + given(simulatorController) + .devicesAndRuntimes() + .willReturn(simulators) + + // When + try await subject.onAppear() + + // Then + XCTAssertEqual(subject.selectedSimulator, simulators.last) + XCTAssertEmpty(subject.pinnedSimulators) + XCTAssertEqual(subject.unpinnedSimulators, simulators) + } + + func test_onAppear_when_appStorage_contains_selected_and_pinned_simulators() async throws { + // Given + given(appStorage) + .get(.any as Parameter) + .willReturn( + [ + appleTV, + iPhone15, + ] + ) + + given(appStorage) + .get(.any as Parameter) + .willReturn(appleTV) + + given(simulatorController) + .devicesAndRuntimes() + .willReturn( + [ + iPhone15, + iPhone15Pro, + appleTV, + ] + ) + + // When + try await subject.onAppear() + + // Then + XCTAssertEqual(subject.selectedSimulator, appleTV) + XCTAssertEqual(subject.pinnedSimulators, [appleTV, iPhone15]) + XCTAssertEqual(subject.unpinnedSimulators, [iPhone15Pro]) + } + + func test_selectSimulator() async throws { + // Given + given(appStorage) + .get(.any as Parameter) + .willReturn([]) + + given(appStorage) + .get(.any as Parameter) + .willReturn(appleTV) + + given(appStorage) + .set(.any as Parameter, value: .any) + .willReturn() + + given(simulatorController) + .devicesAndRuntimes() + .willReturn( + [ + iPhone15, + iPhone15Pro, + appleTV, + ] + ) + try await subject.onAppear() + + // When + subject.selectSimulator(iPhone15Pro) + + // Then + XCTAssertEqual(subject.selectedSimulator, iPhone15Pro) + verify(appStorage) + .set( + .any as Parameter, + value: .value(iPhone15Pro) + ) + .called(1) + } + + func test_pin_simulator() async throws { + // Given + given(appStorage) + .get(.any as Parameter) + .willReturn([iPhone15]) + + given(appStorage) + .get(.any as Parameter) + .willReturn(nil) + + given(appStorage) + .set(.any as Parameter, value: .any) + .willReturn() + + given(simulatorController) + .devicesAndRuntimes() + .willReturn( + [ + iPhone15, + iPhone15Pro, + appleTV, + ] + ) + try await subject.onAppear() + + // When + subject.simulatorPinned(iPhone15Pro, pinned: true) + + // Then + XCTAssertEqual(subject.pinnedSimulators, [iPhone15, iPhone15Pro]) + XCTAssertEqual(subject.unpinnedSimulators, [appleTV]) + verify(appStorage) + .set(.any as Parameter, value: .value([iPhone15, iPhone15Pro])) + .called(1) + } + + func test_unpin_simulator() async throws { + // Given + given(appStorage) + .get(.any as Parameter) + .willReturn([iPhone15]) + + given(appStorage) + .get(.any as Parameter) + .willReturn(nil) + + given(appStorage) + .set(.any as Parameter, value: .any) + .willReturn() + + given(simulatorController) + .devicesAndRuntimes() + .willReturn( + [ + iPhone15, + iPhone15Pro, + appleTV, + ] + ) + try await subject.onAppear() + + // When + subject.simulatorPinned(iPhone15, pinned: false) + + // Then + XCTAssertEqual(subject.pinnedSimulators, []) + XCTAssertEqual(subject.unpinnedSimulators, [appleTV, iPhone15, iPhone15Pro]) + verify(appStorage) + .set(.any as Parameter, value: .value([])) + .called(1) + } + + func test_onChangeOfURL() async throws { + // Given + given(appStorage) + .get(.any as Parameter) + .willReturn([iPhone15]) + + given(appStorage) + .get(.any as Parameter) + .willReturn(iPhone15) + + given(simulatorController) + .devicesAndRuntimes() + .willReturn( + [ + iPhone15, + iPhone15Pro, + appleTV, + ] + ) + try await subject.onAppear() + + given(downloadPreviewService) + .downloadPreview( + .value("01912892-3778-7297-8ca9-d66ac7ee2a53"), + fullHandle: .value("tuist/ios_app_with_frameworks"), + serverURL: .value(Constants.URLs.production) + ) + .willReturn("https://tuist.io/download-link") + + let downloadedArchive = try temporaryPath().appending(component: "archive") + + given(remoteArtifactDownloader) + .download(url: .any) + .willReturn(downloadedArchive) + + let fileUnarchiver = MockFileUnarchiving() + given(fileArchiverFactory) + .makeFileUnarchiver(for: .any) + .willReturn(fileUnarchiver) + + let unarchivedPath = try temporaryPath().appending(component: "unarchived") + + given(fileUnarchiver) + .unzip() + .willReturn(unarchivedPath) + + let appPath = unarchivedPath.appending(component: "App.app") + try fileHandler.touch(appPath) + + given(appBundleLoader) + .load(.any) + .willReturn( + .test( + path: appPath, + infoPlist: .test( + bundleId: "tuist.app", + supportedPlatforms: [ + .simulator(.iOS), + ] + ) + ) + ) + + given(simulatorController) + .booted(device: .any, forced: .any) + .willProduce { device, _ in device } + + given(simulatorController) + .installApp(at: .any, device: .any) + .willReturn() + + given(simulatorController) + .launchApp(bundleId: .any, device: .any, arguments: .any) + .willReturn() + + // When + try await subject.onChangeOfURL(previewURL) + + // Then + verify(simulatorController) + .installApp( + at: .value(appPath), + device: .value(iPhone15.device) + ) + .called(1) + verify(simulatorController) + .launchApp( + bundleId: .value("tuist.app"), + device: .value(iPhone15.device), + arguments: .value([]) + ) + .called(1) + } + + func test_onChangeOfURL_when_no_simulator_selected() async throws { + // When / Then + await XCTAssertThrowsSpecific( + try await subject.onChangeOfURL(previewURL), + SimulatorsViewModelError.noSelectedSimulator + ) + } + + func test_onChangeOfURL_when_deeplink_is_invalid() async throws { + // Given + given(appStorage) + .get(.any as Parameter) + .willReturn([iPhone15]) + + given(appStorage) + .get(.any as Parameter) + .willReturn(iPhone15) + + given(simulatorController) + .devicesAndRuntimes() + .willReturn( + [ + iPhone15, + iPhone15Pro, + appleTV, + ] + ) + try await subject.onAppear() + + let invalidDeeplinkURL = + "tuist:open-preview?server_url=https://cloud.tuist.io&preview_id=01912892-3778-7297-8ca9-d66ac7ee2a53" + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.onChangeOfURL( + try XCTUnwrap(URL(string: invalidDeeplinkURL)) + ), + SimulatorsViewModelError.invalidDeeplink(invalidDeeplinkURL) + ) + } + + func test_onChangeOfURL_when_appDownloadFailed() async throws { + // Given + given(appStorage) + .get(.any as Parameter) + .willReturn([iPhone15]) + + given(appStorage) + .get(.any as Parameter) + .willReturn(iPhone15) + + given(simulatorController) + .devicesAndRuntimes() + .willReturn( + [ + iPhone15, + iPhone15Pro, + appleTV, + ] + ) + try await subject.onAppear() + + given(downloadPreviewService) + .downloadPreview(.any, fullHandle: .any, serverURL: .any) + .willReturn("https://tuist.io/download-link") + + given(remoteArtifactDownloader) + .download(url: .any) + .willReturn(nil) + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.onChangeOfURL(previewURL), + SimulatorsViewModelError.appDownloadFailed(previewURL.absoluteString) + ) + } + + func test_onChangeOfURL_when_appNotFound() async throws { + // Given + given(appStorage) + .get(.any as Parameter) + .willReturn([iPhone15]) + + given(appStorage) + .get(.any as Parameter) + .willReturn(iPhone15) + + given(simulatorController) + .devicesAndRuntimes() + .willReturn( + [ + iPhone15, + iPhone15Pro, + appleTV, + ] + ) + try await subject.onAppear() + + given(downloadPreviewService) + .downloadPreview(.any, fullHandle: .any, serverURL: .any) + .willReturn("https://tuist.io/download-link") + + let downloadedArchive = try temporaryPath().appending(component: "archive") + + given(remoteArtifactDownloader) + .download(url: .any) + .willReturn(downloadedArchive) + + let fileUnarchiver = MockFileUnarchiving() + given(fileArchiverFactory) + .makeFileUnarchiver(for: .any) + .willReturn(fileUnarchiver) + + let unarchivedPath = try temporaryPath().appending(component: "unarchived") + + given(fileUnarchiver) + .unzip() + .willReturn(unarchivedPath) + + try fileHandler.touch(unarchivedPath.appending(component: "App.app")) + + given(appBundleLoader) + .load(.any) + .willReturn( + .test( + infoPlist: .test( + supportedPlatforms: [ + .device(.visionOS), + .simulator(.visionOS), + ] + ) + ) + ) + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.onChangeOfURL(previewURL), + SimulatorsViewModelError.appNotFound(iPhone15, [.visionOS]) + ) + } +} diff --git a/codemagic.yaml b/codemagic.yaml index f5e6bc109ad..79d2551869e 100644 --- a/codemagic.yaml +++ b/codemagic.yaml @@ -22,6 +22,13 @@ workflows: - pattern: '*' include: true cancel_previous_builds: true + triggering: &main_triggering + events: + - push + branch_patterns: + - pattern: 'main' + include: true + cancel_previous_builds: true spm_build: name: SPM Build max_build_duration: 60 @@ -111,7 +118,7 @@ workflows: - name: Cache script: mise x -- tuist cache triggering: - << : *branch_triggering + << : *main_triggering deploy_docs: name: Deploy Documentation @@ -261,4 +268,65 @@ workflows: - name: Run tests script: mise x -- tuist test TuistKitAcceptanceTests triggering: - << : *branch_triggering \ No newline at end of file + << : *branch_triggering + app_tests: + name: App tests + max_build_duration: 60 + environment: + xcode: 15.3 + groups: + - tuist-app + cache: + cache_paths: + - $CM_BUILD_DIR/app/.build + scripts: + - name: Set environment variables + script: | + echo "MISE_EXPERIMENTAL=1" >> $CM_ENV + - name: Install Mise + working_directory: $CM_BUILD_DIR/app + script: | + curl https://mise.run | sh + mise install + - name: Skip Xcode Macro Fingerprint Validation + script: defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES + - name: Skip Xcode Package Validation + script: defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES + - name: Install Tuist dependencies + working_directory: $CM_BUILD_DIR/app + script: mise x -- tuist install + - name: Run tests + working_directory: $CM_BUILD_DIR/app + script: mise x -- tuist test + triggering: + << : *branch_triggering + warm_app_cache: + name: Warm app cache + max_build_duration: 60 + environment: + xcode: 15.3 + groups: + - tuist-app + cache: + cache_paths: + - $CM_BUILD_DIR/app/.build + scripts: + - name: Set environment variables + script: | + echo "MISE_EXPERIMENTAL=1" >> $CM_ENV + - name: Install Mise + working_directory: $CM_BUILD_DIR/app + script: | + curl https://mise.run | sh + mise install + - name: Install Tuist dependencies + working_directory: $CM_BUILD_DIR/app + script: mise x -- tuist install + - name: Print hashes + working_directory: $CM_BUILD_DIR/app + script: mise x -- tuist cache --print-hashes + - name: Cache + working_directory: $CM_BUILD_DIR/app + script: mise x -- tuist cache + triggering: + << : *main_triggering \ No newline at end of file From 2e198e6812e7b2f065914b041bd2ddd1530b60b6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 21 Aug 2024 13:18:41 +0200 Subject: [PATCH 507/509] add vijaytholpadi as a contributor for code (#6653) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2260ea78363..085f7a63829 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1510,6 +1510,15 @@ "contributions": [ "code" ] + }, + { + "login": "vijaytholpadi", + "name": "Vijay Tholpadi", + "avatar_url": "https://avatars.githubusercontent.com/u/1171868?v=4", + "profile": "https://github.com/vijaytholpadi", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 923d17f48ae..13831ffc9d8 100644 --- a/README.md +++ b/README.md @@ -581,6 +581,7 @@ Thanks goes to these wonderful people:
    Barak Weiss

    Hilton Campbell

    Gabriel Liévano
    +
    Vijay Tholpadi
    From b8aaf84d0b2abc2f24baad27b693e8f67a2f5feb Mon Sep 17 00:00:00 2001 From: Vijay Tholpadi Date: Wed, 21 Aug 2024 19:19:11 +0800 Subject: [PATCH 508/509] Checks for CI env and defaults to no-open (#6652) --- Sources/TuistKit/Commands/GenerateCommand.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistKit/Commands/GenerateCommand.swift b/Sources/TuistKit/Commands/GenerateCommand.swift index a7e091bcb50..f2a9e5eacca 100644 --- a/Sources/TuistKit/Commands/GenerateCommand.swift +++ b/Sources/TuistKit/Commands/GenerateCommand.swift @@ -41,7 +41,7 @@ public struct GenerateCommand: AsyncParsableCommand, HasTrackableParameters { help: "Don't open the project after generating it.", envKey: .generateOpen ) - var open: Bool = true + var open: Bool = !CIChecker().isCI() @Flag( help: "Ignore binary cache and use sources only.", From f5847faa6c78eaceefec701caaf2827cf934f3d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 21 Aug 2024 13:40:23 +0200 Subject: [PATCH 509/509] feat: add a new 'Automate | Continuous Integration' section to the documentation (#6631) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add a new 'Develop | Integrate' documentation section * Document how to authenticate CI requests * Update docs/docs/guides/develop/integrate.md Co-authored-by: James Sherlock <15193942+Sherlouk@users.noreply.github.com> * Rename 'integrate' to 'automate' * Update docs/docs/guides/develop/automate/continuous-integration.md Co-authored-by: Marek Fořt --------- Co-authored-by: James Sherlock <15193942+Sherlouk@users.noreply.github.com> Co-authored-by: Marek Fořt --- docs/.vitepress/config.mjs | 1 + docs/.vitepress/sidebars.mjs | 14 +- .../automate/continuous-integration.md | 129 ++++++++++++++++++ .../develop/{ => automate}/workflows.md | 3 +- docs/docs/guides/develop/build.md | 1 + docs/docs/guides/develop/projects.md | 1 + docs/docs/guides/develop/test.md | 1 + docs/docs/guides/quick-start/install-tuist.md | 62 --------- 8 files changed, 147 insertions(+), 65 deletions(-) create mode 100644 docs/docs/guides/develop/automate/continuous-integration.md rename docs/docs/guides/develop/{ => automate}/workflows.md (72%) diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 6eef427da3d..348feb44f90 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -108,6 +108,7 @@ export default defineConfig({ /cloud/on-premise/metrics /guides/dashboard/on-premise/metrics 301 /reference/project-description/* /references/project-description/:splat 301 /reference/examples/* /references/examples/:splat 301 +/guides/develop/workflows /guides/develop/continuous-integration/workflows 301 /documentation/tuist/* / 301 `; diff --git a/docs/.vitepress/sidebars.mjs b/docs/.vitepress/sidebars.mjs index b22df3ab492..510afe6f23f 100644 --- a/docs/.vitepress/sidebars.mjs +++ b/docs/.vitepress/sidebars.mjs @@ -290,8 +290,18 @@ export const guidesSidebar = [ ], }, { - text: `Workflows ${cloudBlank02Icon()} ${comingSoonBadge()}`, - link: "guides/develop/workflows", + text: `Automate ${cloudBlank02Icon()}`, + collapsed: true, + items: [ + { + text: `Continuous Integration`, + link: "guides/develop/automate/continuous-integration", + }, + { + text: `Workflows ${comingSoonBadge()}`, + link: "guides/develop/automate/workflows", + }, + ], }, ], }, diff --git a/docs/docs/guides/develop/automate/continuous-integration.md b/docs/docs/guides/develop/automate/continuous-integration.md new file mode 100644 index 00000000000..8620f1fd7de --- /dev/null +++ b/docs/docs/guides/develop/automate/continuous-integration.md @@ -0,0 +1,129 @@ +--- +title: Continuous Integration (CI) +titleTemplate: ":title | Develop | Tuist" +description: Learn how to use Tuist in your CI workflows. +--- + +# Continuous Integration (CI) + +You can use Tuist in [continuous integration](https://en.wikipedia.org/wiki/Continuous_integration) environments. The following sections provide examples of how to do this on different CI platforms. + +## Examples + +To run Tuist commands in your CI workflows, you’ll need to install it in your CI environment. + +### Xcode Cloud + +In [Xcode Cloud](https://developer.apple.com/xcode-cloud/), which uses Xcode projects as the source of truth, you'll need to add a [post-clone](https://developer.apple.com/documentation/xcode/writing-custom-build-scripts#Create-a-custom-build-script) script to install Tuist and run the commands you need, for example `tuist generate`: + +:::code-group + +```bash [Mise] +#!/bin/sh +curl https://mise.jdx.dev/install.sh | sh +mise install # Installs the version from .mise.toml + +# Runs the version of Tuist indicated in the .mise.toml file +mise x tuist generate +``` +```bash [Homebrew] +#!/bin/sh +brew install --formula tuist@x.y.z + +tuist generate +``` +::: +### Codemagic + +In [Codemagic](https://codemagic.io), you can add an additional step to your workflow to install Tuist: + +::: code-group +```yaml [Mise] +workflows: + lint: + name: Build + max_build_duration: 30 + environment: + xcode: 15.0.1 + scripts: + - name: Install Mise + script: | + curl https://mise.jdx.dev/install.sh | sh + mise install # Installs the version from .mise.toml + - name: Build + script: mise x tuist build +``` +```yaml [Homebrew] +workflows: + lint: + name: Build + max_build_duration: 30 + environment: + xcode: 15.0.1 + scripts: + - name: Install Tuist + script: | + brew install --formula tuist@x.y.z + - name: Build + script: tuist build +``` +::: + +### GitHub Actions + +On [GitHub Actions](https://docs.github.com/en/actions) you can an additional step to install Tuist, and in the case of managing the installation of Mise, you can use the [mise-action](https://github.com/jdx/mise-action), which abstracts the installation of Mise and Tuist: + +::: code-group +```yaml [Mise] +name: Build Application +on: + pull_request: + branches: + - main + push: + branches: + - main +jobs: + build: + runs-on: macos-latest + steps: + - uses: actions/checkout@v3 + - uses: jdx/mise-action@v2 + - run: tuist build +``` +```yaml [Homebrew] +name: test +on: + pull_request: + branches: + - main + push: + branches: + - main +jobs: + lint: + runs-on: macos-latest + steps: + - uses: actions/checkout@v3 + - run: brew install --formula tuist@x.y.z + - run: tuist build +``` +::: + +::: tip +We recommend using `mise use --pin` in your Tuist projects to pin the version of Tuist across environments. The command will create a `.tool-versions` file containing the version of Tuist. +::: + +## Authentication + +When using server-side features such as [cache](/guides/develop/build/cache), you'll need a way to authenticate requests going from your CI workflows to the server. For that, you can generate a project-scoped token by running the following command: + +```bash +tuist project tokens create my-handle/MyApp +``` + +The command will generate a token for the project with full handle `my-account/my-project`. Set the value to the environment variable +`TUIST_CONFIG_TOKEN` in your CI environment ensuring it's configured as a secret so it's not exposed. + +> [!IMPORTANT] CI ENVIRONMENT DETECTION +> Tuist only uses the token when it detects it's running on a CI environment. If your CI environment is not detected, you can force the token usage by setting the environment variable `CI` to `1`. \ No newline at end of file diff --git a/docs/docs/guides/develop/workflows.md b/docs/docs/guides/develop/automate/workflows.md similarity index 72% rename from docs/docs/guides/develop/workflows.md rename to docs/docs/guides/develop/automate/workflows.md index 6a337e5be43..29f2fde858b 100644 --- a/docs/docs/guides/develop/workflows.md +++ b/docs/docs/guides/develop/automate/workflows.md @@ -1,5 +1,6 @@ --- -title: tuist workflows +title: Workflows +titleTemplate: ":title | Integrate | Develop | Tuist" description: Integrate your changes through workflows. --- diff --git a/docs/docs/guides/develop/build.md b/docs/docs/guides/develop/build.md index a7422f18e47..571cd1ba08b 100644 --- a/docs/docs/guides/develop/build.md +++ b/docs/docs/guides/develop/build.md @@ -1,5 +1,6 @@ --- title: Build +titleTemplate: ":title | Develop | Tuist" description: Learn how to use Tuist to build your projects efficiently. --- diff --git a/docs/docs/guides/develop/projects.md b/docs/docs/guides/develop/projects.md index 89fa4659922..e5225821a1c 100644 --- a/docs/docs/guides/develop/projects.md +++ b/docs/docs/guides/develop/projects.md @@ -1,5 +1,6 @@ --- title: Projects +titleTemplate: ":title | Develop | Tuist" description: Learn about Tuist's DSL for defining Xcode projects. --- diff --git a/docs/docs/guides/develop/test.md b/docs/docs/guides/develop/test.md index cf53d796df7..bcbf6bf14df 100644 --- a/docs/docs/guides/develop/test.md +++ b/docs/docs/guides/develop/test.md @@ -1,5 +1,6 @@ --- title: tuist test +titleTemplate: ":title | Develop | Tuist" description: Learn how to run tests efficiently with Tuist. --- diff --git a/docs/docs/guides/quick-start/install-tuist.md b/docs/docs/guides/quick-start/install-tuist.md index 21c4b7b823b..6485d1483d4 100644 --- a/docs/docs/guides/quick-start/install-tuist.md +++ b/docs/docs/guides/quick-start/install-tuist.md @@ -36,68 +36,6 @@ mise use -g tuist@x.y.z # Use tuist-x.y.z as the global default mise use -g tuist@system # Use the system's tuist as the global default ``` -#### Continuous integration - -If you are using Tuist in a continuous integration environment, the following sections show how to install Tuist in the most common ones: - -##### Xcode Cloud - -You'll need a [post-clone](https://developer.apple.com/documentation/xcode/writing-custom-build-scripts#Create-a-custom-build-script) script that installs Mise and Tuist: - -```bash -#!/bin/sh -curl https://mise.jdx.dev/install.sh | sh -mise install # Installs the version from .mise.toml - -# Runs the version of Tuist indicated in the .mise.toml file -mise x tuist generate -``` - -##### Codemagic - -To install and use Mise and Tuist in [Codemagic](https://codemagic.io), you can add an additional step to your workflow, and run Tuist through `mise x tuist` to ensure that the right version is used: - -```yaml -workflows: - lint: - name: Build - max_build_duration: 30 - environment: - xcode: 15.0.1 - scripts: - - name: Install Mise - script: | - curl https://mise.jdx.dev/install.sh | sh - mise install # Installs the version from .mise.toml - - name: Build - script: mise x tuist build -``` - -##### GitHub Actions - -On GitHub Actions you can use the [mise-action](https://github.com/jdx/mise-action), which abstracts the installation of Mise and Tuist and the configuration of the environment: - -```yaml -name: test -on: - pull_request: - branches: - - main - push: - branches: - - main -jobs: - lint: - runs-on: macos-latest - steps: - - uses: actions/checkout@v3 - - uses: jdx/mise-action@v2 -``` - -::: tip -We recommend using `mise use --pin` in your Tuist projects to pin the version of Tuist across environments. The command will create a `.tool-versions` file containing the version of Tuist. -::: - ### Alternative: [Homebrew](https://brew.sh) If version pinning across environments is not a concern for you,

    +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

    {ZvA_?+>iDbuE;yQQOiTV($~jI(ZB zKQHgD5+v^{ZjRG$Mptkf8Ye!cDCkb>x*fRN&uq_(lPd*+-{;DJuUWF1GFde621qEaDIH?K(a<`{+CkG_}5P z)mgC?%?@Ycvk4nYgXc(h4SBunyHi0$2E9%s=;s|I&i*8-hE={?3$pvY1Fkj>4^6k+ zuBNn65y_1r88BX;Q})1m$7r!*`xHd>f;Y52l#VwDDp&{V`#K?K9$|C7tQ+%fXFu9) zBLm9tl%c!F#DAPr^;E@V4mU^9>A}Z^CTcFp+@<50wRX?24z~PY%|a+g+>)pGkXTZ& zo&nl5wm4!rfx}XpE4#ZZz%EF{q@vhNhf|56kvU660h}zMJ-qr6%vA zq*GnG&Kdn>|0pAeYTgW%fAhv&@UCOQ8t{{lltp#>^EXN<%X$QOF}T}AMh?f&RmbXH>A+4wq3nf)lLg5yZ8uk%K92>IdWhyv zj`cY3wExs_EU|@Zs6%32ak@4k7O&z<%rU9mlf7dVQ9nM_yPJMpQwz0>7`$TyVEey6jP# zy?R`+xMFkJz=N$pF=8w=Ps4`@Zq&u?y$RkeNYR6gAb5a_&bh;w+=< ziTTQL!}q*E6uohe9ZFLx!Ttc~d`}C3MUuuOh~-Q&xF4e6s1jc9Z*?10{I2?E;?wpu zoIEX1mYj77NfB!S`Z9%l!UGwwHI^E4?Qj0P`&wLKN zg$ggcuhBXo%}gx6g_eBylg!z6#Szl3ImDu-dHKBm zAYg2gfYmOyYt*wp1!dB>$>s*7npG~v9q28n@E#bL{%D1eCJWNB%LCf&d6B(Zqa_{dSnI>yDe!MFqKJFAQTOV>K`E5MN zdT@sTC>Jo$D`;Lgsok;`Q3POdU3Ex{$3D-;iNv*E2yMH)J~+xYdA zJmrmO#*GASQ1nr1Vhm_5O)!dc9@e7oWH z_m^Xa8>o?zYNX#N;50nL_k?r_x5rC@;Q}K(!-VK4whybT#X|`u`M3vppxm9rRsjfv}I91e2FkVhgIT1u%*Nk>&@Ga z{>i%l^ql$8A5tdqHevV;y$5jAk#&xKE#9*X3u6rXDJU4;|1e&c6iZfz7h2Skl8d(p z0zVt}-fklTmJ)TBGVGapW)ki{#*!HY<(#aQMBfrrBnLIrhswweo6cr(B-*uJ!+l@O zi#aFYO}E*1cdTepy2en6dA5;Bf{%45kK)RP&fUWMTEi-Zwi4CpMVq}?o~V z2SKA?Et{dpmkVRXTor%5(-C6sBHlROYAp)(ONIE=_54rP1K4ypZfEY5vfafODZ^j? z^a%Yf{c|nrAHwG=u8^-1(4Ebn`?VxV{+S}}fR-9|)5E@N%G~diEBs9nxs z@m7_k_?Jh~^|5VfHk&o3nX6jB_LJTXLKvlaY-f#sjsBPZF7U4saMus;R|s(iN5s@| z_~)GGSp1JR!Dl#Z6+E^wqkzGEYXgYH;pt*=IEsJuaWx>P97QTvIxb03#oB+Jc!8ea zu{ca7U4g}6v1+AHtl}zR>(j3aaiw_Drsqy`jAuE@Q)=o_jX3C|QD5X=i@yYXZSWgV zlGnu0+<1rK?cK<>(mZG_oW7c5Wm|nS#n8r^H0z@yt-ZFW0@zeLoD) z!p|G^tX?AzLX``9Kde@#Nlv7+=3dfD{EGgK$6nt^_;daV*Z%+o3A(b)kL)Y^Ud|p{ za~rSh!|`-P>*ddu62F1gBA}J|_u+RAer|u$T${yT2r~Lq)n636JEqhn%%2=^@{)gk z<4cuhoY&FmYqRz|CT)?@issGoxcjz$@S%lIr$t)&p1r330KqtaX9knJ^h)#XA3QA583PC2C=W})}ANvCYfuY`0wNI#m^L5>AGi%zBGS$<3!W0 zE^PEDZZxeIOz`K!Zv{2psXu@`4Qg$#b&W$_*E~sibK}o3kA`_?6L`1celH6yEYC2Q zOa>Pu%kfVWg~{^lC)O+E+z-RG@eqYvb|$Vb5nmaeW~z+}IQ(>~W2J|~<(YOGGHb%n2 z3wFVfF8PS>EQfTM_S{GVu)weLLp#oK{70PTyg{1ORWlsxFvVtA$wQmj#Q*I&{;tQTUE86;~UH#A55a)x_4RT6Wn=a&qO3?`RCgH5jguNpv); z%Q?c6(E>`BAlw1FfA~{NAAbfGwV+ySF|V1r8<@fJZlb`EGu2K(4u`rhAlI*uaRz(BnYJH2;jGgY zljhiEDAUE^WfrGOcJ`QjO$w2o9~XwHW$iHdnpJ4YsL8{cF_P-R<8fJjA{eY4dC;#7 z6yVjIUhte`oF@m?6O5wTPS;5D>#quUg4u|MJA3pWc7I6bFiC;gqj2lEj<|3$&<@|# zd^_~Q&#;s!P~yG~!RFOrXw=NIJjz*Y=M{C$EUz1e#!{6@D|1SoVM3kn$wn!t$M3Ly zB4Qy3!ylJIw3V-03s=~;=IGRgMBk-YF40>W);izCEg}T8(=}ff>DJMJsc)xvit^3` zQPEN>dw=+mR19DR7{JB|uc)c?wcs2>=f!w?#5HO^ic-UH{vo&3^VG*iPX23M&iBXp zM75q-i*KuO!pZ&at>4VLd|&a5jDNySAx8hxD<5Tee0K^&X)Od%+ zkyy63sOolhR#ROi{-tjQv28Ajk= zK7S`T$}xHFJ2J;$s@0)Zoe1FY^Hie>T$G_sZmd0`rz^@baaWWi=Q&C$R=08R-%I$V z@XPjB_?xbLX3)*+-(OGRzXRwVA&9fy>l((NeQugP{iN|mo6=~m^?gd!nOJD{H}4@` zMNAWZQN-Ae56}3vg?=2#aoJW$RZyv$Wq;H@ttS}9vskHR(2gQ_dNHeq_H^mN)l^}K za&dx%;=C+e^88LZGr~}*LkjsFYEk5}YERmGB&6dWXxSxo6)kL$`R3Pu6{WkjyEl4{ zm@M?I8%DIV@a^CB7M*Qjp=p-7O^QQfrq69|vc0{c&wFxE-0B*H_j--&vtC_KGk^a8 zPH+#4J{j;PS%=E7d=12P@bo8Aqn&y=E+)NNm1gHT)vH?`r71S-wo!tNB9vm0_E}zk zlI4`6Mj3u8P>XKzjvi8NySCe@egLvM=LaZh7>_#nhuxmkjVCqh3nX zvAOUg|sVN|Y0q{(ldT%;`w9NUXCYPpsolALgOXvR2v zyDgMP}sJd?2kO_Q+F!IRJeC4V{(4S27_J`dDWR`A}fd8A*Wlou9r zJTB3(Qqj3aUGX_p-y3BgYVHRDxiMHAE;S{Hq^9F_87C;tDfCi{PThH1alW=9P=x*^ zdu;Vj?^b6)#U%Y!2(m4Alw1FlkftAlOX6-lRy(ElNR(Vlg$E@mmu5$yOZz&gJl^cYb;3~tKp&UUc? z|Jf)&lZ^lX From f2c636e3d0c2e89b0ba9e330f0ef6bee86fe691c Mon Sep 17 00:00:00 2001 From: Kai Oelfke Date: Fri, 26 Jul 2024 15:51:59 +0900 Subject: [PATCH 456/509] Update sentry to 8.32.0 to fix Xcode 16 issue (#6563) --- fixtures/app_with_spm_dependencies/Tuist/Package.resolved | 6 +++--- fixtures/app_with_spm_dependencies/Tuist/Package.swift | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.resolved b/fixtures/app_with_spm_dependencies/Tuist/Package.resolved index 8f44471b26c..41320f78ca3 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/Package.resolved +++ b/fixtures/app_with_spm_dependencies/Tuist/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "78f7dd0ebfab47739cc0e35c49d4996c86d420124374e3f4789e90b5a00daa6a", + "originHash" : "a18b44e37498cdc083fe1514666ea3bbc090f84d03b3b5888bf4d09314e4a1db", "pins" : [ { "identity" : "alamofire", @@ -204,8 +204,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/getsentry/sentry-cocoa", "state" : { - "revision" : "b847a202a517a90763e8fd0656d8028aeee7b78d", - "version" : "8.20.0" + "revision" : "5421f94cc859eb65f5ae3866165a053aa634431e", + "version" : "8.32.0" } }, { diff --git a/fixtures/app_with_spm_dependencies/Tuist/Package.swift b/fixtures/app_with_spm_dependencies/Tuist/Package.swift index 5fab2c02833..1f05b908ea2 100644 --- a/fixtures/app_with_spm_dependencies/Tuist/Package.swift +++ b/fixtures/app_with_spm_dependencies/Tuist/Package.swift @@ -22,7 +22,7 @@ let package = Package( .package(url: "https://github.com/ZipArchive/ZipArchive", .upToNextMajor(from: "2.5.5")), .package(url: "https://github.com/jpsim/Yams", .upToNextMajor(from: "5.0.6")), .package(url: "https://github.com/google/GoogleSignIn-iOS", .upToNextMajor(from: "7.0.0")), - .package(url: "https://github.com/getsentry/sentry-cocoa", .upToNextMajor(from: "8.20.0")), + .package(url: "https://github.com/getsentry/sentry-cocoa", .upToNextMajor(from: "8.32.0")), .package(url: "https://github.com/realm/realm-swift", .upToNextMajor(from: "10.46.0")), .package(url: "https://github.com/CocoaLumberjack/CocoaLumberjack", .upToNextMajor(from: "3.8.4")), .package(url: "https://github.com/facebook/zstd", exact: "1.5.5"), From 8c6ba3206fe1f9cde7cb5266b6e0ae40fbb5a15e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 26 Jul 2024 14:55:08 +0200 Subject: [PATCH 457/509] Fix integrating external static frameworks with resource bundles (#6565) * Fix integrating external static frameworks with resource bundles * Address PR feedback --- .../TuistAcceptanceFixtures.swift | 3 + Sources/TuistCore/Graph/GraphTraverser.swift | 28 +++++++- .../Graph/GraphTraverserTests.swift | 52 ++++++++++++++ .../GenerateAcceptanceTests.swift | 10 ++- .../CachedContentHasherTests.swift | 1 - fixtures/app_with_google_maps/.gitignore | 70 +++++++++++++++++++ fixtures/app_with_google_maps/.mise.toml | 2 + .../App/Sources/AppDelegate.swift | 24 +++++++ .../Sources/DynamicFramework.swift | 26 +++++++ fixtures/app_with_google_maps/Project.swift | 29 ++++++++ fixtures/app_with_google_maps/README.md | 3 + .../app_with_google_maps/Tuist/Config.swift | 9 +++ .../Tuist/Package.resolved | 14 ++++ .../app_with_google_maps/Tuist/Package.swift | 20 ++++++ 14 files changed, 287 insertions(+), 4 deletions(-) create mode 100644 fixtures/app_with_google_maps/.gitignore create mode 100644 fixtures/app_with_google_maps/.mise.toml create mode 100644 fixtures/app_with_google_maps/App/Sources/AppDelegate.swift create mode 100644 fixtures/app_with_google_maps/DynamicFramework/Sources/DynamicFramework.swift create mode 100644 fixtures/app_with_google_maps/Project.swift create mode 100644 fixtures/app_with_google_maps/README.md create mode 100644 fixtures/app_with_google_maps/Tuist/Config.swift create mode 100644 fixtures/app_with_google_maps/Tuist/Package.resolved create mode 100644 fixtures/app_with_google_maps/Tuist/Package.swift diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift index c940409e2e1..5aecd433766 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift @@ -4,6 +4,7 @@ public enum TuistAcceptanceFixtures { case appWithBuildRules case appWithCustomDefaultConfiguration case appWithFrameworkAndTests + case appWithGoogleMaps case appWithPlugins case appWithPreviews case appWithSpmDependencies @@ -80,6 +81,8 @@ public enum TuistAcceptanceFixtures { return "app_with_custom_default_configuration" case .appWithFrameworkAndTests: return "app_with_framework_and_tests" + case .appWithGoogleMaps: + return "app_with_google_maps" case .appWithPlugins: return "app_with_plugins" case .appWithPreviews: diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index 32db76221e3..e09e0513f1f 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -176,11 +176,27 @@ public class GraphTraverser: GraphTraversing { let bundles = filterDependencies( from: .target(name: name, path: path), - test: isDependencyResourceBundle, + test: { dependency in + isDependencyResourceBundle(dependency: dependency) && !isDependencyExternal(dependency) + }, skip: canHostResources ) + // External bundles are copied only to targets that can embed products to follow SPM logic. + // This prevents scenarios when a bundle is copied to a dynamic framework and the SPM targets then can't find it. + // See this issue for more detalis: https://github.com/tuist/tuist/pull/6565 + let externalBundles = filterDependencies( + from: .target(name: name, path: path), + test: { dependency in + isDependencyResourceBundle(dependency: dependency) && isDependencyExternal(dependency) && + canEmbedProducts(target: target) + }, + skip: canDependencyEmbedProducts + ) - return Set(bundles.compactMap { dependencyReference(to: $0, from: .target(name: name, path: path)) }) + return Set( + bundles.union(externalBundles) + .compactMap { dependencyReference(to: $0, from: .target(name: name, path: path)) } + ) } public func target(from dependency: GraphDependency) -> GraphTarget? { @@ -966,6 +982,13 @@ public class GraphTraverser: GraphTraversing { ) } + func isDependencyExternal(_ dependency: GraphDependency) -> Bool { + guard let targetDependency = dependency.targetDependency, + let project = graph.projects[targetDependency.path] + else { return false } + return project.isExternal + } + func isDependencyPrecompiledMacro(_ dependency: GraphDependency) -> Bool { switch dependency { case .macro: @@ -1113,6 +1136,7 @@ public class GraphTraverser: GraphTraversing { func canEmbedProducts(target: Target) -> Bool { let validProducts: [Product] = [ .app, + .watch2App, .appClip, .unitTests, .uiTests, diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index f2fb10c2f61..8117d98d8d9 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -331,6 +331,58 @@ final class GraphTraverserTests: TuistUnitTestCase { ]) } + func test_resourceBundleDependencies_when_app_depends_on_external_static_framework_with_resources_via_dynamic_framework() { + // Given + // App -> DynamicFramework -> StaticLibrary (External) -> Bundle + let app = Target.test(name: "App", product: .app) + let dynamicFramework = Target.test(name: "DynamicFramework", product: .framework) + let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary) + let bundle = Target.test(name: "Bundle", product: .bundle) + let project = Project.test(targets: [app, dynamicFramework]) + let externalProject = Project.test( + path: try! AbsolutePath(validating: "/ExternalProject"), + targets: [staticLibrary, bundle], + isExternal: true + ) + + let dependencies: [GraphDependency: Set] = [ + .target(name: app.name, path: project.path): Set([.target(name: dynamicFramework.name, path: project.path)]), + .target(name: dynamicFramework.name, path: project.path): Set([.target( + name: staticLibrary.name, + path: externalProject.path + )]), + .target(name: staticLibrary.name, path: externalProject.path): Set([.target( + name: bundle.name, + path: externalProject.path + )]), + .target(name: bundle.name, path: externalProject.path): Set([]), + ] + + // Given: Value Graph + let graph = Graph.test( + path: project.path, + projects: [ + project.path: project, + externalProject.path: externalProject, + ], + dependencies: dependencies + ) + let subject = GraphTraverser(graph: graph) + + // When + let appBundleDependencies = subject.resourceBundleDependencies(path: project.path, name: app.name).sorted() + let dynamicFrameworkBundleDependencies = subject.resourceBundleDependencies( + path: project.path, + name: dynamicFramework.name + ).sorted() + + // Then + XCTAssertEqual(appBundleDependencies, [ + .product(target: bundle.name, productName: bundle.productNameWithExtension), + ]) + XCTAssertEqual(dynamicFrameworkBundleDependencies, []) + } + func test_resourceBundleDependencies_when_the_target_doesnt_support_resources() { // Given // StaticLibrary -> Bundle diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index bf6bb770772..288e5e93871 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -5,7 +5,6 @@ import TuistSupportTesting import XcodeProj import XCTest -/// Generate a new project using Tuist (suite 1) final class GenerateAcceptanceTestiOSAppWithTests: TuistAcceptanceTestCase { func test_ios_app_with_tests() async throws { try setUpFixture(.iosAppWithTests) @@ -866,6 +865,15 @@ final class GenerateAcceptanceTestAppWithDefaultConfiguration: TuistAcceptanceTe } } +final class GenerateAcceptanceTestAppWithGoogleMaps: TuistAcceptanceTestCase { + func test_app_with_google_maps() async throws { + try setUpFixture(.appWithGoogleMaps) + try await run(InstallCommand.self) + try await run(GenerateCommand.self) + try await run(BuildCommand.self) + } +} + final class GenerateAcceptanceTestFrameworkWithMacroAndPluginPackages: TuistAcceptanceTestCase { func test_framework_with_macro_and_plugin_packages() async throws { try setUpFixture(.frameworkWithMacroAndPluginPackages) diff --git a/Tests/TuistHasherTests/CachedContentHasherTests.swift b/Tests/TuistHasherTests/CachedContentHasherTests.swift index f47d84cc627..99ecf438cd3 100644 --- a/Tests/TuistHasherTests/CachedContentHasherTests.swift +++ b/Tests/TuistHasherTests/CachedContentHasherTests.swift @@ -1,7 +1,6 @@ import MockableTest import Path import TuistCore -import TuistCoreTesting import TuistSupport import TuistSupportTesting import XCTest diff --git a/fixtures/app_with_google_maps/.gitignore b/fixtures/app_with_google_maps/.gitignore new file mode 100644 index 00000000000..24b244f9c45 --- /dev/null +++ b/fixtures/app_with_google_maps/.gitignore @@ -0,0 +1,70 @@ +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Xcode ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +### Xcode Patch ### +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcworkspace/contents.xcworkspacedata +/*.gcno + +### Projects ### +*.xcodeproj +*.xcworkspace + +### Tuist derived files ### +graph.dot +Derived/ + +### Tuist managed dependencies ### +Tuist/.build \ No newline at end of file diff --git a/fixtures/app_with_google_maps/.mise.toml b/fixtures/app_with_google_maps/.mise.toml new file mode 100644 index 00000000000..4645f47ab07 --- /dev/null +++ b/fixtures/app_with_google_maps/.mise.toml @@ -0,0 +1,2 @@ +[tools] +tuist = "4.21.2" diff --git a/fixtures/app_with_google_maps/App/Sources/AppDelegate.swift b/fixtures/app_with_google_maps/App/Sources/AppDelegate.swift new file mode 100644 index 00000000000..64d05f188cb --- /dev/null +++ b/fixtures/app_with_google_maps/App/Sources/AppDelegate.swift @@ -0,0 +1,24 @@ +import DynamicFramework +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application( + _: UIApplication, + didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + window = UIWindow(frame: UIScreen.main.bounds) + + Mapper.provide(key: "key_not_need_to_see_bundle_missing_crash") + + let viewController = UIViewController() + viewController.view.backgroundColor = .white + viewController.view.addSubview(Mapper(frame: viewController.view.bounds)) + window?.rootViewController = viewController + window?.makeKeyAndVisible() + + return true + } +} diff --git a/fixtures/app_with_google_maps/DynamicFramework/Sources/DynamicFramework.swift b/fixtures/app_with_google_maps/DynamicFramework/Sources/DynamicFramework.swift new file mode 100644 index 00000000000..a6094d24140 --- /dev/null +++ b/fixtures/app_with_google_maps/DynamicFramework/Sources/DynamicFramework.swift @@ -0,0 +1,26 @@ +import Foundation +import GoogleMaps +import UIKit + +public class Mapper: UIView { + public static func provide(key: String) { + GMSServices.provideAPIKey(key) + } + + override public init(frame: CGRect) { + super.init(frame: frame) + + let mapView = GMSMapView() + mapView.delegate = self + addSubview(mapView) + } + + @available(*, unavailable) + required init?(coder _: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension Mapper: GMSMapViewDelegate { + public func mapView(_: GMSMapView, didChange _: GMSCameraPosition) {} +} diff --git a/fixtures/app_with_google_maps/Project.swift b/fixtures/app_with_google_maps/Project.swift new file mode 100644 index 00000000000..31083c89377 --- /dev/null +++ b/fixtures/app_with_google_maps/Project.swift @@ -0,0 +1,29 @@ +import ProjectDescription + +let project = Project( + name: "App", + targets: [ + .target( + name: "App", + destinations: .iOS, + product: .app, + bundleId: "io.tuist.App", + sources: ["App/Sources/**"], + dependencies: [ + .target(name: "DynamicFramework"), + ] + ), + .target( + name: "DynamicFramework", + destinations: .iOS, + product: .framework, + bundleId: "io.tuist.DynamicFramework", + sources: ["DynamicFramework/Sources/**"], + dependencies: [ + .external(name: "GoogleMaps"), + .external(name: "GoogleMapsBase"), + .external(name: "GoogleMapsCore"), + ] + ), + ] +) diff --git a/fixtures/app_with_google_maps/README.md b/fixtures/app_with_google_maps/README.md new file mode 100644 index 00000000000..e2b39119880 --- /dev/null +++ b/fixtures/app_with_google_maps/README.md @@ -0,0 +1,3 @@ +# App with Google Maps + +An example of integrating an app with Google Maps. The `GoogleMaps` dependency is imported into the App through a dynamic framework. \ No newline at end of file diff --git a/fixtures/app_with_google_maps/Tuist/Config.swift b/fixtures/app_with_google_maps/Tuist/Config.swift new file mode 100644 index 00000000000..37390c94e35 --- /dev/null +++ b/fixtures/app_with_google_maps/Tuist/Config.swift @@ -0,0 +1,9 @@ +import ProjectDescription + +let config = Config( + // Create an account with "tuist auth" and a project with "tuist project create" +// then uncomment the section below and set the project full-handle. +// * Read more: https://docs.tuist.io/guides/quick-start/gather-insights +// +// fullHandle: "{account_handle}/{project_handle}", +) diff --git a/fixtures/app_with_google_maps/Tuist/Package.resolved b/fixtures/app_with_google_maps/Tuist/Package.resolved new file mode 100644 index 00000000000..f018ee54bd1 --- /dev/null +++ b/fixtures/app_with_google_maps/Tuist/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "ios-maps-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googlemaps/ios-maps-sdk", + "state" : { + "revision" : "bd392d7d844b49ec6795871a3c25edd01ab839f2", + "version" : "8.4.0" + } + } + ], + "version" : 2 +} diff --git a/fixtures/app_with_google_maps/Tuist/Package.swift b/fixtures/app_with_google_maps/Tuist/Package.swift new file mode 100644 index 00000000000..8b3eb7cc3f9 --- /dev/null +++ b/fixtures/app_with_google_maps/Tuist/Package.swift @@ -0,0 +1,20 @@ +// swift-tools-version: 5.9 +import PackageDescription + +#if TUIST + import ProjectDescription + + let packageSettings = PackageSettings( + // Customize the product types for specific package product + // Default is .staticFramework + // productTypes: ["Alamofire": .framework,] + productTypes: [:] + ) +#endif + +let package = Package( + name: "App", + dependencies: [ + .package(url: "https://github.com/googlemaps/ios-maps-sdk", exact: "8.4.0"), + ] +) From 1ef9353d65bd31dcb1329e07f7c53df673af40fe Mon Sep 17 00:00:00 2001 From: Andrii Moisol Date: Fri, 26 Jul 2024 19:21:58 +0300 Subject: [PATCH 458/509] Fix default product type mapping if automatic product type exists (#6559) --- .../PackageInfoMapper.swift | 13 ++++--- .../PackageInfoMapperTests.swift | 37 +++++++++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index f7f35d3a399..9adae32fc7a 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -708,13 +708,13 @@ extension ProjectDescription.Product { return ProjectDescription.Product.from(product: productType) } - var hasLibraryProducts = false + var hasAutomaticProduct = false let product: ProjectDescription.Product? = products.reduce(nil) { result, product in switch product.type { case let .library(type): - hasLibraryProducts = true switch type { case .automatic: + hasAutomaticProduct = true return result case .static: return .staticFramework @@ -731,11 +731,12 @@ extension ProjectDescription.Product { } } - if product != nil { - return product - } else if hasLibraryProducts { - // only automatic products, default to static framework + if hasAutomaticProduct { + // contains automatic product, default to static framework return .staticFramework + } else if product != nil { + // return found product if there is no automatic products + return product } else { // only executable, plugin, or test products, ignore it return nil diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 16d86b652d3..466927f1186 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -422,6 +422,43 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ) } + func testMap_whenDynamicAndAutomaticLibraryType_mapsToStaticFramework() throws { + let basePath = try temporaryPath() + let sourcesPath = basePath.appending(try RelativePath(validating: "Package/Sources/Target1")) + try fileHandler.createFolder(sourcesPath) + + let project = try subject.map( + package: "Package", + basePath: basePath, + packageInfos: [ + "Package": .init( + name: "Package", + products: [ + .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), + .init(name: "Product1Dynamic", type: .library(.dynamic), targets: ["Target1"]), + ], + targets: [ + .test(name: "Target1"), + ], + platforms: [.ios], + cLanguageStandard: nil, + cxxLanguageStandard: nil, + swiftLanguageVersions: nil + ), + ] + ) + + XCTAssertBetterEqual( + project, + .testWithDefaultConfigs( + name: "Package", + targets: [ + .test("Target1", basePath: basePath), + ] + ) + ) + } + func testMap_whenLegacySwift_usesLegacyIOSVersion() throws { // Reset is needed because `Mockable` was queueing the responses, the value in `setUp` would be emitted first and then // this one. From 53464907a7d50150253007c969b23f4d0ad0831e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 29 Jul 2024 09:38:49 +0200 Subject: [PATCH 459/509] add InderKumarRathore as a contributor for code (#6568) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index deb0cf8a074..8a7f034ada8 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1456,6 +1456,15 @@ "contributions": [ "code" ] + }, + { + "login": "InderKumarRathore", + "name": "Inder", + "avatar_url": "https://avatars.githubusercontent.com/u/352443?v=4", + "profile": "http://stackoverflow.com/users/468724/inder-kumar-rathore", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index eddb7a41f3b..e71ffd630fe 100644 --- a/README.md +++ b/README.md @@ -568,6 +568,7 @@ Thanks goes to these wonderful people:
    Dariusz Rybicki

    Dan Sinclair

    Kai Oelfke
    +
    Inder
    From d4a6a56482ee98581276bf53fe34d6335887cc45 Mon Sep 17 00:00:00 2001 From: fortmarek Date: Mon, 29 Jul 2024 10:01:39 +0200 Subject: [PATCH 460/509] Fix docs typo --- docs/.vitepress/sidebars.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/.vitepress/sidebars.mjs b/docs/.vitepress/sidebars.mjs index f297755ee00..20057c51ab2 100644 --- a/docs/.vitepress/sidebars.mjs +++ b/docs/.vitepress/sidebars.mjs @@ -178,7 +178,7 @@ export const guidesSidebar = [ link: "/guides/start/new-project", }, { - text: "Try with a Swift Pacakge", + text: "Try with a Swift Package", link: "/guides/start/swift-package", }, { From 97dd23103173a01f1d3726154ad806bad050c69f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 29 Jul 2024 11:20:20 +0200 Subject: [PATCH 461/509] Pin XcodeGraph to 0.5.0 (#6569) --- Package.resolved | 2 +- Package.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.resolved b/Package.resolved index 8f96e639aad..40f1e117f0e 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "72762ee5d0c1c6693d240f855baa564f33c1989e012f95666662934d0ad27a2d", + "originHash" : "860409f905f22a0d0832780098d0b02ddb05b588e08be4963e3a52e66bcd28c8", "pins" : [ { "identity" : "aexml", diff --git a/Package.swift b/Package.swift index 227e8d11f6f..43eee116e8d 100644 --- a/Package.swift +++ b/Package.swift @@ -466,7 +466,7 @@ let package = Package( .package(url: "https://github.com/tuist/swift-openapi-runtime", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/swift-openapi-urlsession", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/Path", .upToNextMajor(from: "0.3.0")), - .package(url: "https://github.com/tuist/XcodeGraph.git", .upToNextMajor(from: "0.5.0")), + .package(url: "https://github.com/tuist/XcodeGraph.git", .exact("0.5.0")), .package(url: "https://github.com/tuist/FileSystem.git", .upToNextMajor(from: "0.2.0")), ], targets: targets From d2d8d8914b444b101f95dde547709dee7fc3c9f5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 29 Jul 2024 11:20:35 +0200 Subject: [PATCH 462/509] add kyounh12 as a contributor for code (#6570) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 +++ 2 files changed, 12 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8a7f034ada8..7819c736580 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1465,6 +1465,15 @@ "contributions": [ "code" ] + }, + { + "login": "kyounh12", + "name": "kyounh12", + "avatar_url": "https://avatars.githubusercontent.com/u/25301615?v=4", + "profile": "https://github.com/kyounh12", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index e71ffd630fe..efee168cf8b 100644 --- a/README.md +++ b/README.md @@ -570,6 +570,9 @@ Thanks goes to these wonderful people:
    Kai Oelfke

    Inder
    + +
    kyounh12
    + From 17000fa7e556b6cad799ec4cee09aeb8c9340e87 Mon Sep 17 00:00:00 2001 From: Inder <352443+InderKumarRathore@users.noreply.github.com> Date: Mon, 29 Jul 2024 17:36:10 +0800 Subject: [PATCH 463/509] Add app extension and unit test combination for iOS app (#6561) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added unit test and app extension combination for ios app * Added fixture and acceptance test * formatted the code using mise run lint-fix * Added new app * removed old folder * Added test for graph linter and fixed acceptance test * Updated the readme * Updated the name of the test * Trigger Build --------- Co-authored-by: Marek Fořt --- .../TuistAcceptanceFixtures.swift | 3 ++ .../TuistGenerator/Linter/GraphLinter.swift | 1 + .../GenerateAcceptanceTests.swift | 15 ++++++ .../Linter/GraphLinterTests.swift | 38 +++++++++++++++ .../AccentColor.colorset/Contents.json | 11 +++++ .../AppIcon.appiconset/Contents.json | 13 +++++ .../Resources/Assets.xcassets/Contents.json | 6 +++ .../App/Sources/MainApp.swift | 10 ++++ .../ExtensionViewController.swift | 3 ++ .../AppExtensionTests/ExtensionTests.swift | 9 ++++ .../Project.swift | 47 +++++++++++++++++++ .../README.md | 3 ++ 12 files changed, 159 insertions(+) create mode 100644 fixtures/ios_app_with_extension_and_tests/App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 fixtures/ios_app_with_extension_and_tests/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 fixtures/ios_app_with_extension_and_tests/App/Resources/Assets.xcassets/Contents.json create mode 100644 fixtures/ios_app_with_extension_and_tests/App/Sources/MainApp.swift create mode 100644 fixtures/ios_app_with_extension_and_tests/AppExtension/ExtensionViewController.swift create mode 100644 fixtures/ios_app_with_extension_and_tests/AppExtensionTests/ExtensionTests.swift create mode 100644 fixtures/ios_app_with_extension_and_tests/Project.swift create mode 100644 fixtures/ios_app_with_extension_and_tests/README.md diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift index 5aecd433766..c9b86f1df35 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift @@ -28,6 +28,7 @@ public enum TuistAcceptanceFixtures { case iosWppWithCustomResourceParserOptions case iosAppWithCustomScheme case iosAppWithExtensions + case iosAppWithExtensionAndTests case iosAppWithDynamicFrameworksLinkingStaticFrameworks case iosAppWithFrameworkAndResources case iosAppWithFrameworkAndDisabledResources @@ -131,6 +132,8 @@ public enum TuistAcceptanceFixtures { return "ios_app_with_custom_scheme" case .iosAppWithExtensions: return "ios_app_with_extensions" + case .iosAppWithExtensionAndTests: + return "ios_app_with_extension_and_tests" case .iosAppWithFrameworkAndResources: return "ios_app_with_framework_and_resources" case .iosAppWithFrameworkAndDisabledResources: diff --git a/Sources/TuistGenerator/Linter/GraphLinter.swift b/Sources/TuistGenerator/Linter/GraphLinter.swift index 35d5eb6b71a..dc4a3c37cb0 100644 --- a/Sources/TuistGenerator/Linter/GraphLinter.swift +++ b/Sources/TuistGenerator/Linter/GraphLinter.swift @@ -455,6 +455,7 @@ public class GraphLinter: GraphLinting { LintableTarget(platform: .iOS, product: .bundle), LintableTarget(platform: .iOS, product: .appClip), LintableTarget(platform: .macOS, product: .macro), + LintableTarget(platform: .iOS, product: .appExtension), ], LintableTarget(platform: .iOS, product: .uiTests): [ LintableTarget(platform: .iOS, product: .app), diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index 288e5e93871..33daff0c1fa 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -490,6 +490,21 @@ final class GenerateAcceptanceTestiOSAppWithExtensions: TuistAcceptanceTestCase } } +final class GenerateAcceptanceTestiOSAppWithExtensionAndTests: TuistAcceptanceTestCase { + func test_ios_app_with_extension_and_tests() async throws { + try setUpFixture(.iosAppWithExtensionAndTests) + try await run(GenerateCommand.self) + try await run(BuildCommand.self) + + try await XCTAssertProductWithDestinationContainsExtension( + "App.app", + destination: "Debug-iphonesimulator", + extension: "AppExtension" + ) + try await run(TestCommand.self, "--test-targets", "AppExtensionTests/ExtensionTests") + } +} + // TODO: Fix – tvOS // final class GenerateAcceptanceTestTvOSAppWithExtensions: TuistAcceptanceTestCase { // func test_tvos_app_with_extensions() async throws { diff --git a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift index 58b6c93dd62..18479f91889 100644 --- a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift @@ -481,6 +481,44 @@ final class GraphLinterTests: TuistUnitTestCase { XCTAssertTrue(result.isEmpty) } + func test_lint_testTargetsDependsOnAppExtension() throws { + // Given + let path: AbsolutePath = "/project" + let appTarget = Target.test(name: "AppTarget", product: .app) + let appExtension = Target.test(name: "app_extension", platform: .iOS, product: .appExtension) + let appExtensionTests = Target.test(name: "unitTests", platform: .iOS, product: .unitTests) + + let project = Project.test(path: "/tmp/app", name: "App", targets: [ + appTarget, + appExtension, + appExtensionTests, + ]) + + let dependencies: [GraphDependency: Set] = [ + .target(name: appTarget.name, path: path): Set([ + .target(name: appExtension.name, path: path), + ]), + .target(name: appExtension.name, path: path): Set([]), + .target(name: appExtensionTests.name, path: path): Set([ + .target(name: appExtension.name, path: path), + ]), + ] + + let graph = Graph.test( + path: path, + projects: [path: project], + dependencies: dependencies + ) + let config = Config.test() + let graphTraverser = GraphTraverser(graph: graph) + + // When + let result = subject.lint(graphTraverser: graphTraverser, config: config) + + // Then + XCTAssertTrue(result.isEmpty) + } + func test_lint_staticProductsCanDependOnDynamicFrameworks() throws { // Given let path: AbsolutePath = "/project" diff --git a/fixtures/ios_app_with_extension_and_tests/App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/fixtures/ios_app_with_extension_and_tests/App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000000..eb878970081 --- /dev/null +++ b/fixtures/ios_app_with_extension_and_tests/App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_extension_and_tests/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/fixtures/ios_app_with_extension_and_tests/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..13613e3ee1a --- /dev/null +++ b/fixtures/ios_app_with_extension_and_tests/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_extension_and_tests/App/Resources/Assets.xcassets/Contents.json b/fixtures/ios_app_with_extension_and_tests/App/Resources/Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/ios_app_with_extension_and_tests/App/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/ios_app_with_extension_and_tests/App/Sources/MainApp.swift b/fixtures/ios_app_with_extension_and_tests/App/Sources/MainApp.swift new file mode 100644 index 00000000000..50d60d1239a --- /dev/null +++ b/fixtures/ios_app_with_extension_and_tests/App/Sources/MainApp.swift @@ -0,0 +1,10 @@ +import SwiftUI + +@main +struct MainApp: App { + var body: some Scene { + WindowGroup { + Text("App extension") + } + } +} diff --git a/fixtures/ios_app_with_extension_and_tests/AppExtension/ExtensionViewController.swift b/fixtures/ios_app_with_extension_and_tests/AppExtension/ExtensionViewController.swift new file mode 100644 index 00000000000..6b572f32cae --- /dev/null +++ b/fixtures/ios_app_with_extension_and_tests/AppExtension/ExtensionViewController.swift @@ -0,0 +1,3 @@ +import UIKit + +final class ExtensionViewController: UIViewController {} diff --git a/fixtures/ios_app_with_extension_and_tests/AppExtensionTests/ExtensionTests.swift b/fixtures/ios_app_with_extension_and_tests/AppExtensionTests/ExtensionTests.swift new file mode 100644 index 00000000000..b4959a7e4d2 --- /dev/null +++ b/fixtures/ios_app_with_extension_and_tests/AppExtensionTests/ExtensionTests.swift @@ -0,0 +1,9 @@ +import AppExtension +import Foundation +import XCTest + +final class ExtensionTests: XCTestCase { + func test_extension_is_working_fine() { + XCTAssertEqual(2 + 2, 4) + } +} diff --git a/fixtures/ios_app_with_extension_and_tests/Project.swift b/fixtures/ios_app_with_extension_and_tests/Project.swift new file mode 100644 index 00000000000..8c62ca69d19 --- /dev/null +++ b/fixtures/ios_app_with_extension_and_tests/Project.swift @@ -0,0 +1,47 @@ +import ProjectDescription + +let project = Project( + name: "App", + targets: [ + .target( + name: "App", + destinations: .iOS, + product: .app, + bundleId: "io.tuist.App", + infoPlist: .extendingDefault( + with: [ + "UILaunchScreen": [ + "UIColorName": "", + "UIImageName": "", + ], + ] + ), + sources: ["App/Sources/**"], + resources: ["App/Resources/**"], + dependencies: [.target(name: "AppExtension")] + ), + .target( + name: "AppExtension", + destinations: .iOS, + product: .appExtension, + bundleId: "io.tuist.App.AppExtension", + infoPlist: .extendingDefault(with: [ + "CFBundleDisplayName": "$(PRODUCT_NAME)", + "NSExtension": [ + "NSExtensionPrincipalClass": "ExtensionViewController", + ], + ]), + sources: ["AppExtension/**"], + dependencies: [] + ), + .target( + name: "AppExtensionTests", + destinations: .iOS, + product: .unitTests, + bundleId: "io.tuist.App.AppExtensionTests", + infoPlist: .default, + sources: ["AppExtensionTests/**"], + dependencies: [.target(name: "AppExtension")] + ), + ] +) diff --git a/fixtures/ios_app_with_extension_and_tests/README.md b/fixtures/ios_app_with_extension_and_tests/README.md new file mode 100644 index 00000000000..83ef21fc30d --- /dev/null +++ b/fixtures/ios_app_with_extension_and_tests/README.md @@ -0,0 +1,3 @@ +# iOS app with extensions having unit test target + +Sample iOS application with extension target and a unit test target. From c716e44a0aa73c4757fc1fe092f5f4cf2eb666ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Mon, 29 Jul 2024 14:20:15 +0200 Subject: [PATCH 464/509] Improve the Homebrew installation instructions (#6571) --- docs/docs/guides/quick-start/install-tuist.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/guides/quick-start/install-tuist.md b/docs/docs/guides/quick-start/install-tuist.md index 3cbe14b0684..21c4b7b823b 100644 --- a/docs/docs/guides/quick-start/install-tuist.md +++ b/docs/docs/guides/quick-start/install-tuist.md @@ -105,8 +105,8 @@ you can install Tuist using [Homebrew](https://brew.sh) and [our formulas](https ```bash brew tap tuist/tuist -brew install tuist -brew install tuist@x.y.z +brew install --formula tuist +brew install --formula tuist@x.y.z ``` ### Shell completions From e701cb545029a40331d1c55535bed05129fa2bb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Mon, 29 Jul 2024 15:21:54 +0200 Subject: [PATCH 465/509] Improve the help menu by grouping the flat list of commands and add `tuist project view` command (#6566) * Group subcommands * Point to the latest version of xcebautify * Remove the analytics command * Add project view command * Fix compilation error --- Package.resolved | 10 +-- Package.swift | 4 +- .../TuistKit/Commands/AnalyticsCommand.swift | 27 ------- Sources/TuistKit/Commands/EnvKey/EnvKey.swift | 7 +- .../Commands/Project/ProjectViewCommand.swift | 33 +++++++++ .../TuistKit/Commands/ProjectCommand.swift | 1 + Sources/TuistKit/Commands/TuistCommand.swift | 50 +++++++------ .../TuistKit/Services/AnalyticsService.swift | 66 ----------------- .../Services/Project/ProjectViewService.swift | 66 +++++++++++++++++ Sources/TuistSupport/Utils/Opener.swift | 2 + .../CommandEnvironmentVariableTests.swift | 12 --- .../Project/ProjectViewServiceTests.swift | 73 +++++++++++++++++++ 12 files changed, 214 insertions(+), 137 deletions(-) delete mode 100644 Sources/TuistKit/Commands/AnalyticsCommand.swift create mode 100644 Sources/TuistKit/Commands/Project/ProjectViewCommand.swift delete mode 100644 Sources/TuistKit/Services/AnalyticsService.swift create mode 100644 Sources/TuistKit/Services/Project/ProjectViewService.swift create mode 100644 Tests/TuistKitTests/Services/Project/ProjectViewServiceTests.swift diff --git a/Package.resolved b/Package.resolved index 40f1e117f0e..719f1b1d5c4 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "860409f905f22a0d0832780098d0b02ddb05b588e08be4963e3a52e66bcd28c8", + "originHash" : "496eb66a0f55545cb22bd11061994855c9e90bcb349dd79631b5f47e38e955a3", "pins" : [ { "identity" : "aexml", @@ -168,8 +168,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-argument-parser.git", "state" : { - "revision" : "0fbc8848e389af3bb55c182bc19ca9d5dc2f255b", - "version" : "1.4.0" + "revision" : "41982a3656a71c768319979febd796c6fd111d5c", + "version" : "1.5.0" } }, { @@ -267,8 +267,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/cpisciotta/xcbeautify", "state" : { - "revision" : "d9e8acfd22aa3133d95a4b998d31e0f77895c755", - "version" : "2.4.0" + "revision" : "d7c9ce7df96118aaa56096f4c2b94265c8e28a7c", + "version" : "2.5.0" } }, { diff --git a/Package.swift b/Package.swift index 43eee116e8d..91d2b8926ba 100644 --- a/Package.swift +++ b/Package.swift @@ -448,7 +448,7 @@ let package = Package( ), ], dependencies: [ - .package(url: "https://github.com/apple/swift-argument-parser", from: "1.2.3"), + .package(url: "https://github.com/apple/swift-argument-parser", from: "1.5.0"), .package(url: "https://github.com/apple/swift-log", from: "1.5.3"), .package(url: "https://github.com/apple/swift-tools-support-core", from: "0.6.1"), .package(url: "https://github.com/FabrizioBrancati/Queuer", from: "2.1.1"), @@ -460,7 +460,7 @@ let package = Package( .package(url: "https://github.com/SwiftGen/StencilSwiftKit", exact: "2.10.1"), .package(url: "https://github.com/SwiftGen/SwiftGen", exact: "6.6.2"), .package(url: "https://github.com/tuist/XcodeProj", exact: "8.19.0"), - .package(url: "https://github.com/cpisciotta/xcbeautify", from: "2.4.0"), + .package(url: "https://github.com/cpisciotta/xcbeautify", .upToNextMajor(from: "2.5.0")), .package(url: "https://github.com/krzysztofzablocki/Difference.git", from: "1.0.2"), .package(url: "https://github.com/Kolos65/Mockable.git", from: "0.0.9"), .package(url: "https://github.com/tuist/swift-openapi-runtime", branch: "swift-tools-version"), diff --git a/Sources/TuistKit/Commands/AnalyticsCommand.swift b/Sources/TuistKit/Commands/AnalyticsCommand.swift deleted file mode 100644 index 89621b34f8f..00000000000 --- a/Sources/TuistKit/Commands/AnalyticsCommand.swift +++ /dev/null @@ -1,27 +0,0 @@ -import ArgumentParser -import Foundation -import Path -import TuistSupport - -struct AnalyticsCommand: AsyncParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "analytics", - abstract: "Open the Tuist analytics dashboard." - ) - } - - @Option( - name: .shortAndLong, - help: "The path to the Tuist project.", - completion: .directory, - envKey: .analyticsPath - ) - var path: String? - - func run() async throws { - try await AnalyticsService().run( - path: path - ) - } -} diff --git a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift index 6361184963b..5ffe295a326 100644 --- a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift +++ b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift @@ -178,6 +178,10 @@ public enum EnvKey: String, CaseIterable { case projectCreateFullHandle = "TUIST_PROJECT_CREATE_FULL_HANDLE" case projectCreatePath = "TUIST_PROJECT_CREATE_PATH" + // PROJECT VIEW + case projectViewFullHandle = "TUIST_PROJECT_VIEW_FULL_HANDLE" + case projectViewPath = "TUIST_PROJECT_VIEW_PATH" + // ORGANIZATION INVITE case organizationInviteOrganizationName = "TUIST_ORGANIZATION_INVITE_ORGANIZATION_NAME" case organizationInviteEmail = "TUIST_ORGANIZATION_INVITE_EMAIL" @@ -208,9 +212,6 @@ public enum EnvKey: String, CaseIterable { // LOGOUT case logoutPath = "TUIST_LOGOUT_PATH" - - // ANALYTICS - case analyticsPath = "TUIST_ANALYTICS_PATH" } extension EnvKey { diff --git a/Sources/TuistKit/Commands/Project/ProjectViewCommand.swift b/Sources/TuistKit/Commands/Project/ProjectViewCommand.swift new file mode 100644 index 00000000000..07a2c772841 --- /dev/null +++ b/Sources/TuistKit/Commands/Project/ProjectViewCommand.swift @@ -0,0 +1,33 @@ +import ArgumentParser +import Foundation +import Path +import TuistSupport + +struct ProjectViewCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "view", + _superCommandName: "project", + abstract: "Open the project dashboard in the system default's browser." + ) + } + + @Argument( + help: "The project to view. The full handle must be in the format of account-handle/project-handle.", + completion: .directory, + envKey: .projectViewFullHandle + ) + var fullHandle: String? + + @Option( + name: .shortAndLong, + help: "The path to the Tuist project", + completion: .directory, + envKey: .projectViewPath + ) + var path: String? + + func run() async throws { + try await ProjectViewService().run(fullHandle: fullHandle, pathString: path) + } +} diff --git a/Sources/TuistKit/Commands/ProjectCommand.swift b/Sources/TuistKit/Commands/ProjectCommand.swift index 70eedd3f13e..9ff551ffeb1 100644 --- a/Sources/TuistKit/Commands/ProjectCommand.swift +++ b/Sources/TuistKit/Commands/ProjectCommand.swift @@ -8,6 +8,7 @@ struct ProjectCommand: ParsableCommand { commandName: "project", abstract: "A set of commands to manage your Tuist projects.", subcommands: [ + ProjectViewCommand.self, ProjectCreateCommand.self, ProjectListCommand.self, ProjectDeleteCommand.self, diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index 0ca6d9a9b70..95be8105e0c 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -14,28 +14,34 @@ public struct TuistCommand: AsyncParsableCommand { CommandConfiguration( commandName: "tuist", abstract: "Generate, build and test your Xcode projects.", - subcommands: [ - BuildCommand.self, - CleanCommand.self, - DumpCommand.self, - EditCommand.self, - InstallCommand.self, - GenerateCommand.self, - GraphCommand.self, - InitCommand.self, - MigrationCommand.self, - PluginCommand.self, - RunCommand.self, - ScaffoldCommand.self, - TestCommand.self, - AuthCommand.self, - SessionCommand.self, - LogoutCommand.self, - CleanCommand.self, - ProjectCommand.self, - OrganizationCommand.self, - AnalyticsCommand.self, - CacheCommand.self, + subcommands: [], + groupedSubcommands: [ + CommandGroup(name: "Start", subcommands: [ + InitCommand.self, + ]), + CommandGroup(name: "Develop", subcommands: [ + BuildCommand.self, + CleanCommand.self, + DumpCommand.self, + EditCommand.self, + InstallCommand.self, + GenerateCommand.self, + GraphCommand.self, + MigrationCommand.self, + PluginCommand.self, + RunCommand.self, + ScaffoldCommand.self, + TestCommand.self, + CleanCommand.self, + CacheCommand.self, + ]), + CommandGroup(name: "Account", subcommands: [ + ProjectCommand.self, + OrganizationCommand.self, + AuthCommand.self, + SessionCommand.self, + LogoutCommand.self, + ]), ] ) } diff --git a/Sources/TuistKit/Services/AnalyticsService.swift b/Sources/TuistKit/Services/AnalyticsService.swift deleted file mode 100644 index d36c3a53061..00000000000 --- a/Sources/TuistKit/Services/AnalyticsService.swift +++ /dev/null @@ -1,66 +0,0 @@ -import Foundation -import Path -import TuistLoader -import TuistSupport - -protocol AnalyticsServicing { - func run( - path: String? - ) async throws -} - -enum AnalyticsServiceError: FatalError, Equatable { - case fullHandleNotFound - - /// Error description. - var description: String { - switch self { - case .fullHandleNotFound: - return "You are missing `fullHandle` in your `Config.swift`." - } - } - - /// Error type. - var type: ErrorType { - switch self { - case .fullHandleNotFound: - return .abort - } - } -} - -final class AnalyticsService: AnalyticsServicing { - private let configLoader: ConfigLoading - private let opener: Opening - - init( - configLoader: ConfigLoading = ConfigLoader(), - opener: Opening = Opener() - ) { - self.configLoader = configLoader - self.opener = opener - } - - func run( - path: String? - ) async throws { - let path: AbsolutePath = try self.path(path) - let config = try await configLoader.loadConfig(path: path) - - guard let fullHandle = config.fullHandle else { throw AnalyticsServiceError.fullHandleNotFound } - try opener.open( - url: config.url - .appendingPathComponent(fullHandle) - ) - } - - // MARK: - Helpers - - private func path(_ path: String?) throws -> AbsolutePath { - if let path { - return try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) - } else { - return FileHandler.shared.currentPath - } - } -} diff --git a/Sources/TuistKit/Services/Project/ProjectViewService.swift b/Sources/TuistKit/Services/Project/ProjectViewService.swift new file mode 100644 index 00000000000..2acff7a2c45 --- /dev/null +++ b/Sources/TuistKit/Services/Project/ProjectViewService.swift @@ -0,0 +1,66 @@ +import Foundation +import Mockable +import Path +import TuistLoader +import TuistSupport + +@Mockable +protocol ProjectViewServicing { + func run(fullHandle: String?, pathString: String?) async throws +} + +enum ProjectViewServiceError: Equatable, FatalError { + case missingFullHandle + + var type: TuistSupport.ErrorType { + switch self { + case .missingFullHandle: .abort + } + } + + var description: String { + switch self { + case .missingFullHandle: return "We couldn't view the project because the full handle is missing. You can pass either its value or a path to a Tuist project." + } + } +} + +struct ProjectViewService: ProjectViewServicing { + private let opener: Opening + private let configLoader: ConfigLoading + + init( + opener: Opening = Opener(), + configLoader: ConfigLoading = ConfigLoader() + ) { + self.opener = opener + self.configLoader = configLoader + } + + func run(fullHandle: String?, pathString: String?) async throws { + var fullHandle: String! = fullHandle + var url: URL! + var path: AbsolutePath! + + if fullHandle != nil { + url = Constants.URLs.production + } else { + if let pathString { + path = try AbsolutePath(validating: pathString, relativeTo: FileHandler.shared.currentPath) + } else { + path = FileHandler.shared.currentPath + } + let config = try await configLoader.loadConfig(path: path) + url = config.url + fullHandle = config.fullHandle + } + + if fullHandle == nil { + throw ProjectViewServiceError.missingFullHandle + } + + var components = URLComponents(url: url, resolvingAgainstBaseURL: false)! + components.path = "/\(fullHandle!)" + try opener.open(url: components.url!) + } +} diff --git a/Sources/TuistSupport/Utils/Opener.swift b/Sources/TuistSupport/Utils/Opener.swift index 314ba0a507a..999b7d0d99d 100644 --- a/Sources/TuistSupport/Utils/Opener.swift +++ b/Sources/TuistSupport/Utils/Opener.swift @@ -1,4 +1,5 @@ import Foundation +import Mockable import Path enum OpeningError: FatalError, Equatable { @@ -19,6 +20,7 @@ enum OpeningError: FatalError, Equatable { } } +@Mockable public protocol Opening: AnyObject { func open(path: AbsolutePath, wait: Bool) throws func open(path: AbsolutePath) throws diff --git a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift index 77fb684ad15..113fa7f4e41 100644 --- a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift +++ b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift @@ -881,16 +881,4 @@ final class CommandEnvironmentVariableTests: XCTestCase { ]) XCTAssertEqual(commandWithArgs.path, "/new/logout/path") } - - func testAnalyticsCommandUsesEnvVars() throws { - setVariable(.analyticsPath, value: "/path/to/analytics") - - let commandWithEnvVars = try AnalyticsCommand.parse([]) - XCTAssertEqual(commandWithEnvVars.path, "/path/to/analytics") - - let commandWithArgs = try AnalyticsCommand.parse([ - "--path", "/new/analytics/path", - ]) - XCTAssertEqual(commandWithArgs.path, "/new/analytics/path") - } } diff --git a/Tests/TuistKitTests/Services/Project/ProjectViewServiceTests.swift b/Tests/TuistKitTests/Services/Project/ProjectViewServiceTests.swift new file mode 100644 index 00000000000..070c0226744 --- /dev/null +++ b/Tests/TuistKitTests/Services/Project/ProjectViewServiceTests.swift @@ -0,0 +1,73 @@ +import Foundation +import MockableTest +import TuistCore +import TuistLoader +import TuistSupport +import TuistSupportTesting +import XCTest + +@testable import TuistKit + +final class ProjectViewServiceTests: TuistUnitTestCase { + var opener: MockOpening! + var configLoader: MockConfigLoading! + var subject: ProjectViewService! + + override func setUp() { + super.setUp() + opener = MockOpening() + configLoader = MockConfigLoading() + subject = ProjectViewService(opener: opener, configLoader: configLoader) + } + + override func tearDown() { + opener = nil + configLoader = nil + subject = nil + super.tearDown() + } + + func test_run_when_theFullHandleIsProvided() async throws { + // Given + var expectedURLComponents = URLComponents(url: Constants.URLs.production, resolvingAgainstBaseURL: false)! + expectedURLComponents.path = "/tuist/tuist" + given(opener).open(url: .value(expectedURLComponents.url!)).willReturn() + + // When + try await subject.run(fullHandle: "tuist/tuist", pathString: nil) + + // Then + verify(opener).open(url: .value(expectedURLComponents.url!)).called(1) + } + + func test_run_when_theFullHandleIsNotProvided_and_aConfigWithFullHandleCanBeLoaded() async throws { + // Given + let path = try temporaryPath() + var expectedURLComponents = URLComponents(url: Constants.URLs.production, resolvingAgainstBaseURL: false)! + expectedURLComponents.path = "/tuist/tuist" + let config = Config.test(fullHandle: "tuist/tuist") + given(configLoader).loadConfig(path: .value(path)).willReturn(config) + given(opener).open(url: .value(expectedURLComponents.url!)).willReturn() + + // When + try await subject.run(fullHandle: nil, pathString: path.pathString) + + // Then + verify(opener).open(url: .value(expectedURLComponents.url!)).called(1) + } + + func test_run_when_theFullHandleIsNotProvided_and_aConfigWithoutFullHandleCanBeLoaded() async throws { + // Given + let path = try temporaryPath() + var expectedURLComponents = URLComponents(url: Constants.URLs.production, resolvingAgainstBaseURL: false)! + expectedURLComponents.path = "/tuist/tuist" + given(opener).open(url: .value(expectedURLComponents.url!)).willReturn() + let config = Config.test(fullHandle: nil) + given(configLoader).loadConfig(path: .value(path)).willReturn(config) + + // When/Then + await XCTAssertThrowsSpecific({ + try await subject.run(fullHandle: nil, pathString: path.pathString) + }, ProjectViewServiceError.missingFullHandle) + } +} From 972839e4586063dd5ad3d772e9296d381b4ecc10 Mon Sep 17 00:00:00 2001 From: kyounh12 Date: Mon, 29 Jul 2024 22:51:48 +0900 Subject: [PATCH 466/509] Fix globstar expansion logic to prevent infinite loop when file path contains `**` (#6174) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Use path components when expanding a globstar * Add tests for Glob * Update reference * use FileHandler instead of FileManager * remove abbreviations * uses throwing function * remove unused behaviors for Glob * make Glob internal * use AbsolutePath instead of URL * remove unnecessary Glob tests and use Tuist primitives * change to test AbsolutePath.glob instead of Glob itself * change expected result to match AbsolutePath.glob behavior * run lint --------- Co-authored-by: junseok.lee Co-authored-by: Marek Fořt --- Sources/TuistSupport/Utils/Glob.swift | 57 +++++---- Tests/TuistSupportTests/Utils/GlobTests.swift | 119 ++++++++++++++++++ 2 files changed, 149 insertions(+), 27 deletions(-) create mode 100644 Tests/TuistSupportTests/Utils/GlobTests.swift diff --git a/Sources/TuistSupport/Utils/Glob.swift b/Sources/TuistSupport/Utils/Glob.swift index e18fedd5596..145000d444a 100644 --- a/Sources/TuistSupport/Utils/Glob.swift +++ b/Sources/TuistSupport/Utils/Glob.swift @@ -7,32 +7,17 @@ import Foundation // swiftlint:disable:next identifier_name -public let GlobBehaviorBashV3 = Glob.Behavior( - supportsGlobstar: false, - includesFilesFromRootOfGlobstar: false, - includesDirectoriesInResults: true, - includesFilesInResultsIfTrailingSlash: false -) - -// swiftlint:disable:next identifier_name -public let GlobBehaviorBashV4 = Glob.Behavior( +let GlobBehaviorBashV4 = Glob.Behavior( supportsGlobstar: true, // Matches Bash v4 with "shopt -s globstar" option includesFilesFromRootOfGlobstar: true, includesDirectoriesInResults: true, includesFilesInResultsIfTrailingSlash: false ) -// swiftlint:disable:next identifier_name -public let GlobBehaviorGradle = Glob.Behavior( - supportsGlobstar: true, - includesFilesFromRootOfGlobstar: true, - includesDirectoriesInResults: false, - includesFilesInResultsIfTrailingSlash: true -) /** Finds files on the file system using pattern matching. */ -public class Glob: Collection { +final class Glob: Collection { /** * Different glob implementations have different behaviors, so the behavior of this * implementation is customizable. @@ -66,16 +51,12 @@ public class Glob: Collection { } } - public static let defaultBehavior = GlobBehaviorBashV4 - - public let behavior: Behavior + public let behavior: Behavior = GlobBehaviorBashV4 var paths = [String]() public var startIndex: Int { paths.startIndex } public var endIndex: Int { paths.endIndex } - public init(pattern: String, behavior: Behavior = Glob.defaultBehavior) { - self.behavior = behavior - + public init(pattern: String) { var adjustedPattern = pattern let hasTrailingGlobstarSlash = pattern.hasSuffix("**/") var includeFiles = !hasTrailingGlobstarSlash @@ -113,15 +94,37 @@ public class Glob: Collection { } private func expandGlobstar(pattern: String) -> [String] { - guard pattern.contains("**") else { + // Split pattern string by slash to find globstar. + let patternComponents = pattern.components(separatedBy: "/") + + // We are only interested in the first globstar since that is where we want to separate the pattern string. + guard let pivot = patternComponents.firstIndex(of: "**") else { return [pattern] } var results = [String]() - var parts = pattern.components(separatedBy: "**") - let firstPart = parts.removeFirst() - var lastPart = parts.joined(separator: "**") + // Part before the first globstar + let firstPartLowerBound = 0 + let firstPartUpperBound = pivot + let firstPartComponents: ArraySlice = if firstPartLowerBound < firstPartUpperBound { + patternComponents[firstPartLowerBound ..< firstPartUpperBound] + } else { + [] + } + let firstPart = firstPartComponents.joined(separator: "/") + + // Part after the first globstar + let lastPartLowerBound = pivot + 1 + let lastPartUpperBound = patternComponents.count + let lastPartComponents: ArraySlice = if lastPartLowerBound < lastPartUpperBound { + patternComponents[lastPartLowerBound ..< lastPartUpperBound] + } else { + [] + } + var lastPart = lastPartComponents.joined(separator: "/") + + // Find subdirectories let fileManager = FileManager.default var directories = fileManager.subdirectoriesResolvingSymbolicLinks(atPath: firstPart) diff --git a/Tests/TuistSupportTests/Utils/GlobTests.swift b/Tests/TuistSupportTests/Utils/GlobTests.swift new file mode 100644 index 00000000000..e854125a580 --- /dev/null +++ b/Tests/TuistSupportTests/Utils/GlobTests.swift @@ -0,0 +1,119 @@ +import Foundation +import Path +import XCTest +@testable import TuistSupport +@testable import TuistSupportTesting + +// Inspired by: https://gist.github.com/efirestone/ce01ae109e08772647eb061b3bb387c3 + +final class GlobTests: TuistTestCase { + let temporaryFiles = ["foo", "bar", "baz", "dir1/file1.ext", "dir1/dir2/dir3/file2.ext", "dir1/**(_:_:)/file3.ext"] + private var temporaryDirectory: AbsolutePath! + + override func setUpWithError() throws { + super.setUp() + + temporaryDirectory = try temporaryPath() + try createFiles(temporaryFiles, content: "") + } + + func testNothingMatches() { + let pattern = "nothing" + XCTAssertEmpty(temporaryDirectory.glob(pattern)) + } + + func testBraces() { + let pattern = "ba{r,y,z}" + XCTAssertEqual( + temporaryDirectory.glob(pattern), + [temporaryDirectory.appending(component: "bar"), temporaryDirectory.appending(component: "baz")] + ) + } + + // MARK: - Globstar - Bash v4 + + func testGlobstarNoSlash() { + // Should be the equivalent of "ls -d -1 /(temporaryDirectory)/**" + let expected: [String] = [ + ".", + "bar", + "baz", + "dir1", + "dir1/**(_:_:)", + "dir1/**(_:_:)/file3.ext", + "dir1/dir2", + "dir1/dir2/dir3", + "dir1/dir2/dir3/file2.ext", + "dir1/file1.ext", + "foo", + ] + + let result = temporaryDirectory.glob("**").map { $0.relative(to: temporaryDirectory).pathString } + XCTAssertEqual(result, expected) + } + + func testGlobstarWithSlash() { + // `**/` is treated as same as `**` with Tuist since it converts pattern string to RelativePath. + // This is not an expected behavior for bash glob but this should be kept to avoid unexpected source file drops. + let expected: [String] = [ + ".", + "bar", + "baz", + "dir1", + "dir1/**(_:_:)", + "dir1/**(_:_:)/file3.ext", + "dir1/dir2", + "dir1/dir2/dir3", + "dir1/dir2/dir3/file2.ext", + "dir1/file1.ext", + "foo", + ] + + let result = temporaryDirectory.glob("**/").map { $0.relative(to: temporaryDirectory).pathString } + XCTAssertEqual(result, expected) + } + + func testGlobstarWithSlashAndWildcard() { + // Should be the equivalent of "ls -d -1 /(temporaryDirectory)/**/*" + let expected: [String] = [ + "bar", + "baz", + "dir1", + "dir1/**(_:_:)", + "dir1/**(_:_:)/file3.ext", + "dir1/dir2", + "dir1/dir2/dir3", + "dir1/dir2/dir3/file2.ext", + "dir1/file1.ext", + "foo", + ] + + let result = temporaryDirectory.glob("**/*").map { $0.relative(to: temporaryDirectory).pathString } + XCTAssertEqual(result, expected) + } + + func testPatternEndsWithGlobstar() { + let expected: [String] = [ + "dir1", + "dir1/**(_:_:)", + "dir1/**(_:_:)/file3.ext", + "dir1/dir2", + "dir1/dir2/dir3", + "dir1/dir2/dir3/file2.ext", + "dir1/file1.ext", + ] + + let result = temporaryDirectory.glob("dir1/**").map { $0.relative(to: temporaryDirectory).pathString } + XCTAssertEqual(result, expected) + } + + func testDoubleGlobstar() { + let expected: [String] = [ + "dir1/dir2/dir3", + "dir1/dir2/dir3/file2.ext", + ] + + let result = temporaryDirectory.glob("**/dir2/**/*").map { $0.relative(to: temporaryDirectory).pathString } + XCTAssertEqual(result, expected) + } +} From 0c9edbe4c1dce421ac33b91c5d5e143f419dfc30 Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 30 Jul 2024 12:20:21 +0200 Subject: [PATCH 467/509] Remove TuistSigning leftovers --- .../Certificate/CertificateParser.swift | 154 ------------ Sources/TuistSigning/Log/Logger.swift | 3 - Sources/TuistSigning/SigningCipher.swift | 238 ------------------ Sources/TuistSigning/SigningInteractor.swift | 138 ---------- 4 files changed, 533 deletions(-) delete mode 100644 Sources/TuistSigning/Certificate/CertificateParser.swift delete mode 100644 Sources/TuistSigning/Log/Logger.swift delete mode 100644 Sources/TuistSigning/SigningCipher.swift delete mode 100644 Sources/TuistSigning/SigningInteractor.swift diff --git a/Sources/TuistSigning/Certificate/CertificateParser.swift b/Sources/TuistSigning/Certificate/CertificateParser.swift deleted file mode 100644 index 0307bb02e5b..00000000000 --- a/Sources/TuistSigning/Certificate/CertificateParser.swift +++ /dev/null @@ -1,154 +0,0 @@ -import Foundation -import TSCBasic -import TuistSupport - -enum CertificateParserError: FatalError, Equatable { - case nameParsingFailed(AbsolutePath, String) - case developmentTeamParsingFailed(AbsolutePath, String) - case fileParsingFailed(AbsolutePath) - - var type: ErrorType { - switch self { - case .nameParsingFailed, .developmentTeamParsingFailed, .fileParsingFailed: - return .abort - } - } - - var description: String { - switch self { - case let .nameParsingFailed(path, input): - return "We couldn't parse the name while parsing the following output from the file \(path.pathString): \(input)" - case let .developmentTeamParsingFailed(path, input): - return "We couldn't parse the development team while parsing the following output from the file \(path.pathString): \(input)" - case let .fileParsingFailed(path): - return "We couldn't parse the file \(path.pathString)" - } - } -} - -/// Used to parse and extract info from a certificate -protocol CertificateParsing { - /// Parse public-private key pair - /// - Returns: Parse `Certificate` - func parse(publicKey: AbsolutePath, privateKey: AbsolutePath) throws -> Certificate - - /// Retrieve fingerprint of a public key - func parseFingerPrint(developerCertificate: Data) throws -> String -} - -/// Subject attributes that are returnen with `openssl x509 -subject` -private enum SubjectAttribute: String { - case commonName = "CN" - case country = "C" - case description - case emailAddress - case locality = "L" - case organization = "O" - case organizationalUnit = "OU" - case state = "ST" - case uid = "UID" -} - -final class CertificateParser: CertificateParsing { - func parse(publicKey: AbsolutePath, privateKey: AbsolutePath) throws -> Certificate { - let subject = try subject(at: publicKey) - let fingerprint = try fingerprint(at: publicKey) - let isRevoked = subject.contains("REVOKED") - - let nameRegex = try NSRegularExpression( - pattern: SubjectAttribute.commonName.rawValue + " *= *(?:\"([^/,]+)\"|([^/,]+))", - options: [] - ) - guard let nameResult = nameRegex.firstMatch(in: subject, range: NSRange(location: 0, length: subject.count)), - nameResult.range(at: 1).length > 0 || nameResult.range(at: 2).length > 0 - else { throw CertificateParserError.nameParsingFailed(publicKey, subject) } - let nameResultRange = nameResult.range(at: nameResult.range(at: 1).length > 0 ? 1 : 2) - let name = NSString(string: subject).substring(with: nameResultRange).spm_chomp() - - let developmentTeamRegex = try NSRegularExpression( - pattern: SubjectAttribute.organizationalUnit.rawValue + " *= *(?:\"([^/,]+)\"|([^/,]+))", - options: [] - ) - guard let developmentTeamResult = developmentTeamRegex.firstMatch( - in: subject, - range: NSRange(location: 0, length: subject.count) - ), nameResult.range(at: 1).length > 0 || nameResult.range(at: 2).length > 0 - else { throw CertificateParserError.developmentTeamParsingFailed(publicKey, subject) } - let developmentTeamResultRange = developmentTeamResult.range(at: developmentTeamResult.range(at: 1).length > 0 ? 1 : 2) - let developmentTeam = NSString(string: subject).substring(with: developmentTeamResultRange).spm_chomp() - - return Certificate( - publicKey: publicKey, - privateKey: privateKey, - fingerprint: fingerprint, - developmentTeam: developmentTeam, - name: name.sanitizeEncoding(), - isRevoked: isRevoked - ) - } - - func parseFingerPrint(developerCertificate: Data) throws -> String { - let temporaryFile = try FileHandler.shared.temporaryDirectory().appending(component: "developerCertificate.cer") - try developerCertificate.write(to: temporaryFile.asURL) - - return try fingerprint(at: temporaryFile) - } - - // MARK: - Helpers - - private func subject(at path: AbsolutePath) throws -> String { - do { - return try System.shared - .capture(["/usr/bin/openssl", "x509", "-inform", "der", "-in", path.pathString, "-noout", "-subject"]) - } catch let TuistSupport.SystemError.terminated(_, _, standardError) { - if let string = String(data: standardError, encoding: .utf8) { - logger.warning("Parsing subject of \(path) failed with: \(string)") - } - throw CertificateParserError.fileParsingFailed(path) - } catch { - throw CertificateParserError.fileParsingFailed(path) - } - } - - private func fingerprint(at path: AbsolutePath) throws -> String { - do { - return try System.shared - .capture(["/usr/bin/openssl", "x509", "-inform", "der", "-in", path.pathString, "-noout", "-fingerprint"]) - .spm_chomp() - } catch let TuistSupport.SystemError.terminated(_, _, standardError) { - if let string = String(data: standardError, encoding: .utf8) { - logger.warning("Parsing fingerprint of \(path) failed with: \(string)") - } - throw CertificateParserError.fileParsingFailed(path) - } catch { - throw CertificateParserError.fileParsingFailed(path) - } - } -} - -extension String { - func sanitizeEncoding() -> String { - // Had some real life certificates where encoding in the name was broken - e.g. \\xC3\\xA4 instead of ä - guard let regex = try? NSRegularExpression(pattern: "(\\\\x([A-Za-z0-9]{2}))(\\\\x([A-Za-z0-9]{2}))", options: []) - else { return self } - let matches = regex.matches(in: self, options: [], range: NSRange(startIndex..., in: self)).reversed() - - var modifiableString = self - for result in matches { - guard let firstRange = Range(result.range(at: 2), in: modifiableString), - let secondRange = Range(result.range(at: 4), in: modifiableString), - let firstInt = UInt8(modifiableString[firstRange], radix: 16), - let secondInt = UInt8(modifiableString[secondRange], radix: 16) - else { - continue - } - let resultRange = Range(result.range, in: modifiableString)! - modifiableString.replaceSubrange( - resultRange, - with: String(decoding: [firstInt, secondInt] as [UTF8.CodeUnit], as: UTF8.self) - ) - } - - return modifiableString - } -} diff --git a/Sources/TuistSigning/Log/Logger.swift b/Sources/TuistSigning/Log/Logger.swift deleted file mode 100644 index 03bcaf3a40b..00000000000 --- a/Sources/TuistSigning/Log/Logger.swift +++ /dev/null @@ -1,3 +0,0 @@ -import TuistSupport - -let logger = Logger(label: "io.tuist.signing") diff --git a/Sources/TuistSigning/SigningCipher.swift b/Sources/TuistSigning/SigningCipher.swift deleted file mode 100644 index c6752bfa7f4..00000000000 --- a/Sources/TuistSigning/SigningCipher.swift +++ /dev/null @@ -1,238 +0,0 @@ -import CryptoSwift -import Foundation -import TSCBasic -import TuistCore -import TuistSupport - -enum SigningCipherError: FatalError, Equatable { - case failedToEncrypt - case failedToDecrypt(String) - case ivGenerationFailed(String) - case masterKeyNotFound(AbsolutePath) - case signingDirectoryNotFound(AbsolutePath) - - var type: ErrorType { - switch self { - case .failedToEncrypt, .failedToDecrypt, .ivGenerationFailed, - .masterKeyNotFound, .signingDirectoryNotFound: - return .abort - } - } - - var description: String { - switch self { - case .failedToEncrypt: - return "Unable to encrypt data" - case let .failedToDecrypt(reason): - return "Could not decrypt data: \(reason)" - case let .ivGenerationFailed(reason): - return "Generation of IV failed with error: \(reason)" - case let .masterKeyNotFound(masterKeyPath): - return "Could not find master.key at \(masterKeyPath.pathString)" - case let .signingDirectoryNotFound(fromPath): - return "Could not find signing directory from \(fromPath.pathString)" - } - } -} - -/// SigningCiphering handles all encryption/decryption of files needed for signing (certificates, profiles, etc.) -public protocol SigningCiphering { - /// Encrypts all signing files at `Tuist/Signing` - /// - Parameters: - /// - keepFiles: Keep unencrypted files - func encryptSigning(at path: AbsolutePath, keepFiles: Bool) throws - /// Decrypts all signing files at `Tuist/Signing - /// - Parameters: - /// - keepFiles: Keep encrypted files - func decryptSigning(at path: AbsolutePath, keepFiles: Bool) throws - func readMasterKey(at path: AbsolutePath) throws -> String -} - -public final class SigningCipher: SigningCiphering { - private let rootDirectoryLocator: RootDirectoryLocating - private let signingFilesLocator: SigningFilesLocating - - /// Public initializer - public convenience init() { - self.init( - rootDirectoryLocator: RootDirectoryLocator(), - signingFilesLocator: SigningFilesLocator() - ) - } - - init( - rootDirectoryLocator: RootDirectoryLocating, - signingFilesLocator: SigningFilesLocating - ) { - self.rootDirectoryLocator = rootDirectoryLocator - self.signingFilesLocator = signingFilesLocator - } - - public func encryptSigning(at path: AbsolutePath, keepFiles: Bool) throws { - let masterKey = try masterKey(at: path) - let signingKeyFiles = try locateUnencryptedSigningFiles(at: path) - guard !signingKeyFiles.isEmpty else { return } - - let correctlyEncryptedSigningFiles = try correctlyEncryptedSigningFiles(at: path, masterKey: masterKey) - - try locateEncryptedSigningFiles(at: path) - .filter { !correctlyEncryptedSigningFiles.map(\.encrypted).contains($0) } - .forEach(FileHandler.shared.delete) - - let cipheredKeys = try signingKeyFiles - .filter { !correctlyEncryptedSigningFiles.map(\.unencrypted).contains($0) } - .map(FileHandler.shared.readFile) - .map { try encryptData($0, masterKey: masterKey) } - - for (key, file) in zip(cipheredKeys, signingKeyFiles) { - logger.debug("Encrypting \(file.pathString)") - let encryptedPath = try AbsolutePath(validating: file.pathString + "." + Constants.encryptedExtension) - try key.write(to: encryptedPath.url) - } - - if !keepFiles { - try signingKeyFiles.forEach(FileHandler.shared.delete) - } - } - - public func decryptSigning(at path: AbsolutePath, keepFiles: Bool) throws { - let masterKey = try masterKey(at: path) - let signingKeyFiles = try locateEncryptedSigningFiles(at: path) - guard !signingKeyFiles.isEmpty else { return } - let decipheredKeys = try signingKeyFiles - .map(FileHandler.shared.readFile) - .map { - try decryptData($0, masterKey: masterKey) - } - - try locateUnencryptedSigningFiles(at: path) - .forEach(FileHandler.shared.delete) - - for (key, keyFile) in zip(decipheredKeys, signingKeyFiles) { - logger.debug("Decrypting \(keyFile.pathString)") - let decryptedPath = try AbsolutePath( - validating: keyFile.parentDirectory.pathString + "/" + keyFile - .basenameWithoutExt - ) - try key.write(to: decryptedPath.url) - } - - if !keepFiles { - try signingKeyFiles.forEach(FileHandler.shared.delete) - } - } - - /// - Returns: Master key data - public func readMasterKey(at path: AbsolutePath) throws -> String { - guard let rootDirectory = rootDirectoryLocator.locate(from: path) - else { throw SigningCipherError.signingDirectoryNotFound(path) } - let masterKeyFile = rootDirectory.appending(components: Constants.tuistDirectoryName, Constants.masterKey) - guard FileHandler.shared.exists(masterKeyFile) else { throw SigningCipherError.masterKeyNotFound(masterKeyFile) } - let plainMasterKey = try FileHandler.shared.readTextFile(masterKeyFile).trimmingCharacters(in: .newlines) - return plainMasterKey - } - - // MARK: - Helpers - - private func locateUnencryptedSigningFiles(at path: AbsolutePath) throws -> [AbsolutePath] { - try signingFilesLocator.locateUnencryptedCertificates(from: path) + signingFilesLocator - .locateUnencryptedPrivateKeys(from: path) - } - - private func locateEncryptedSigningFiles(at path: AbsolutePath) throws -> [AbsolutePath] { - try signingFilesLocator.locateEncryptedCertificates(from: path) + signingFilesLocator - .locateEncryptedPrivateKeys(from: path) - } - - /// - Returns: Files that are already correctly encrypted - private func correctlyEncryptedSigningFiles( - at path: AbsolutePath, - masterKey: Data - ) throws -> [(unencrypted: AbsolutePath, encrypted: AbsolutePath)] { - try locateUnencryptedSigningFiles(at: path).compactMap { unencryptedFile in - let encryptedFile = try AbsolutePath(validating: unencryptedFile.pathString + "." + Constants.encryptedExtension) - guard FileHandler.shared.exists(encryptedFile) else { return nil } - let isEncryptionNeeded: Bool = try self.isEncryptionNeeded( - encryptedFile: encryptedFile, - unencryptedFile: unencryptedFile, - masterKey: masterKey - ) - return isEncryptionNeeded ? nil : (unencrypted: unencryptedFile, encrypted: encryptedFile) - } - } - - /// Determines if encryption is needed - private func isEncryptionNeeded(encryptedFile: AbsolutePath, unencryptedFile: AbsolutePath, masterKey: Data) throws -> Bool { - guard let encodedString = String(data: try FileHandler.shared.readFile(encryptedFile), encoding: .utf8), - let dividerIndex = encodedString.firstIndex(of: "-"), - let iv = Data(base64Encoded: String(encodedString.prefix(upTo: dividerIndex))) - else { throw SigningCipherError.failedToDecrypt("corrupted data") } - - let aesCipher = try AES(key: masterKey.bytes, blockMode: CTR(iv: iv.bytes), padding: .noPadding) - let unencryptedData = try FileHandler.shared.readFile(unencryptedFile) - let encryptedBase64String = try aesCipher.encrypt(unencryptedData.bytes).toBase64() - guard let data = (iv.base64EncodedString() + "-" + encryptedBase64String).data(using: .utf8) else { - throw SigningCipherError.failedToEncrypt - } - - return try FileHandler.shared.readFile(encryptedFile) != data - } - - /// Encrypts `data` - /// - Parameters: - /// - data: Data to encrypt - /// - masterKey: Master key data - /// - Returns: Encrypted data - private func encryptData(_ data: Data, masterKey: Data) throws -> Data { - let iv = try generateIv() - let aesCipher = try AES(key: masterKey.bytes, blockMode: CTR(iv: iv.bytes), padding: .noPadding) - let encryptedBase64String = try aesCipher.encrypt(data.bytes).toBase64() - guard let data = (iv.base64EncodedString() + "-" + encryptedBase64String).data(using: .utf8) else { - throw SigningCipherError.failedToEncrypt - } - return data - } - - /// Decrypts `data` - /// - Parameters: - /// - data: Data to decrypt - /// - masterKey: Master key data - /// - Returns: Decrypted data - private func decryptData(_ data: Data, masterKey: Data) throws -> Data { - guard let encodedString = String(data: data, encoding: .utf8), - let dividerIndex = encodedString.firstIndex(of: "-"), - let iv = Data(base64Encoded: String(encodedString.prefix(upTo: dividerIndex))) - else { throw SigningCipherError.failedToDecrypt("corrupted data") } - - let dataToDecrypt = Data(base64Encoded: String(encodedString.suffix(from: dividerIndex).dropFirst())) - let aesCipher = try AES(key: masterKey.bytes, blockMode: CTR(iv: iv.bytes), padding: .noPadding) - guard let decryptedData = try dataToDecrypt?.decrypt(cipher: aesCipher) - else { throw SigningCipherError.failedToDecrypt("data is in wrong format") } - return decryptedData - } - - /// - Returns: Master key data - private func masterKey(at path: AbsolutePath) throws -> Data { - try readMasterKey(at: path).data(using: .utf8)!.sha256() - } - - /// - Returns: Data of generated initialization vector - private func generateIv() throws -> Data { - let blockSize = 16 - var iv = Data(repeating: 0, count: blockSize) - let result = try iv.withUnsafeMutableBytes { bytes -> Int32 in - guard let baseAddress = bytes.baseAddress - else { throw SigningCipherError.ivGenerationFailed("Base address not found") } - return SecRandomCopyBytes(kSecRandomDefault, blockSize, baseAddress) - } - if result == errSecSuccess { - return iv - } else { - if let errorMessage = SecCopyErrorMessageString(result, nil) { - throw SigningCipherError.ivGenerationFailed(String(errorMessage)) - } else { - throw SigningCipherError.ivGenerationFailed("code: \(result)") - } - } - } -} diff --git a/Sources/TuistSigning/SigningInteractor.swift b/Sources/TuistSigning/SigningInteractor.swift deleted file mode 100644 index 4bd41b1077a..00000000000 --- a/Sources/TuistSigning/SigningInteractor.swift +++ /dev/null @@ -1,138 +0,0 @@ -import Foundation -import TSCBasic -import TuistCore -import TuistSupport -import XcodeGraph - -/// Interacts with signing -public protocol SigningInteracting { - /// Install signing for a given graph - func install(graphTraverser: GraphTraversing) throws -> [LintingIssue] -} - -public final class SigningInteractor: SigningInteracting { - private let signingFilesLocator: SigningFilesLocating - private let rootDirectoryLocator: RootDirectoryLocating - private let signingMatcher: SigningMatching - private let signingInstaller: SigningInstalling - private let signingLinter: SigningLinting - private let securityController: SecurityControlling - private let signingCipher: SigningCiphering - - public convenience init() { - self.init( - signingFilesLocator: SigningFilesLocator(), - rootDirectoryLocator: RootDirectoryLocator(), - signingMatcher: SigningMatcher(), - signingInstaller: SigningInstaller(), - signingLinter: SigningLinter(), - securityController: SecurityController(), - signingCipher: SigningCipher() - ) - } - - init( - signingFilesLocator: SigningFilesLocating, - rootDirectoryLocator: RootDirectoryLocating, - signingMatcher: SigningMatching, - signingInstaller: SigningInstalling, - signingLinter: SigningLinting, - securityController: SecurityControlling, - signingCipher: SigningCiphering - ) { - self.signingFilesLocator = signingFilesLocator - self.rootDirectoryLocator = rootDirectoryLocator - self.signingMatcher = signingMatcher - self.signingInstaller = signingInstaller - self.signingLinter = signingLinter - self.securityController = securityController - self.signingCipher = signingCipher - } - - public func install(graphTraverser: GraphTraversing) throws -> [LintingIssue] { - let entryPath = graphTraverser.path - guard let signingDirectory = try signingFilesLocator.locateSigningDirectory(from: entryPath), - let derivedDirectory = rootDirectoryLocator.locate(from: entryPath)? - .appending(component: Constants.DerivedDirectory.name) - else { return [] } - - let keychainPath = derivedDirectory.appending(component: Constants.DerivedDirectory.signingKeychain) - - let masterKey = try signingCipher.readMasterKey(at: signingDirectory) - try FileHandler.shared.createFolder(derivedDirectory) - if !FileHandler.shared.exists(keychainPath) { - try securityController.createKeychain(at: keychainPath, password: masterKey) - } - try securityController.unlockKeychain(at: keychainPath, password: masterKey) - defer { try? securityController.lockKeychain(at: keychainPath, password: masterKey) } - - try signingCipher.decryptSigning(at: entryPath, keepFiles: true) - defer { try? signingCipher.encryptSigning(at: entryPath, keepFiles: false) } - - let (certificates, provisioningProfiles) = try signingMatcher.match(from: graphTraverser.path) - - return try graphTraverser.allTargets().sorted().flatMap { target in - try install( - target: target, - keychainPath: keychainPath, - certificates: certificates, - provisioningProfiles: provisioningProfiles - ) - } - } - - // MARK: - Helpers - - private func install( - target: GraphTarget, - keychainPath: AbsolutePath, - certificates: [Fingerprint: Certificate], - provisioningProfiles: [TargetName: [ConfigurationName: ProvisioningProfile]] - ) throws -> [LintingIssue] { - let targetConfigurations = target.target.settings?.configurations ?? [:] - /// Filtering certificate-provisioning profile pairs, so they are installed only when necessary (they correspond to some - /// configuration and target in the project) - let signingPairs = Set( - targetConfigurations - .merging( - target.project.settings.configurations, - uniquingKeysWith: { config, _ in config } - ) - .keys - ) - .compactMap { configuration -> (certificate: Certificate, provisioningProfile: ProvisioningProfile)? in - guard let provisioningProfile = provisioningProfiles[target.target.name]?[configuration.name], - let certificate = certificates.first(for: provisioningProfile) - else { - return nil - } - return (certificate: certificate, provisioningProfile: provisioningProfile) - } - - for signingPair in signingPairs.map(\.certificate) { - try signingInstaller.installCertificate(signingPair, keychainPath: keychainPath) - } - - let provisioningProfileInstallLintIssues = try signingPairs.map(\.provisioningProfile) - .flatMap(signingInstaller.installProvisioningProfile) - try provisioningProfileInstallLintIssues.printAndThrowErrorsIfNeeded() - - let provisioningProfileLintIssues = signingPairs.map(\.provisioningProfile).flatMap { - signingLinter.lint(provisioningProfile: $0, target: target.target) - } - try provisioningProfileLintIssues.printAndThrowErrorsIfNeeded() - - let signingPairLintIssues = signingPairs.flatMap(signingLinter.lint) - try signingPairLintIssues.printAndThrowErrorsIfNeeded() - - let certificateLintIssues = signingPairs.map(\.certificate).flatMap(signingLinter.lint) - try certificateLintIssues.printAndThrowErrorsIfNeeded() - - return [ - provisioningProfileInstallLintIssues, - provisioningProfileLintIssues, - signingPairLintIssues, - certificateLintIssues, - ].flatMap { $0 } - } -} From 633bddd56ad46a7e3d0f361428eac1b45b0446ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 30 Jul 2024 13:08:06 +0200 Subject: [PATCH 468/509] Fix storing test results of non-tested schemes (#6572) * Add context to GraphMapper * Fix selective test artifact name * Fix selective testing when targets are cached * Rename allTargetDependencies parameter --- .../TuistAcceptanceFixtures.swift | 3 + .../Utilities/AutomationStorage.swift | 18 - Sources/TuistCore/Graph/GraphTraverser.swift | 9 +- .../TuistCore/Graph/Mappers/GraphMapper.swift | 19 +- .../Graph/Mappers/MapperEnvironment.swift | 22 + .../Graph/Mappers/MapperEnvironmentKeys.swift | 25 + .../GraphTraverser/GraphTraversing.swift | 5 + .../GraphTraverser/MockGraphTraverser.swift | 702 ------------------ ...lProjectsPlatformNarrowerGraphMapper.swift | 9 +- ...runeOrphanExternalTargetsGraphMapper.swift | 7 +- .../ExplicitDependencyGraphMapper.swift | 10 +- .../Mappers/ModuleMapMapper.swift | 4 +- Sources/TuistKit/Generator/Generator.swift | 16 +- .../TuistKit/Generator/GeneratorFactory.swift | 11 +- .../Factories/GraphMapperFactory.swift | 2 - .../Mappers/FocusTargetsGraphMappers.swift | 4 +- .../UpdateWorkspaceProjectsGraphMapper.swift | 4 +- .../TreeShakePrunedTargetsGraphMapper.swift | 6 +- Sources/TuistKit/Services/GraphService.swift | 2 +- Sources/TuistKit/Services/TestService.swift | 135 +++- .../TuistKit/Utils/ManifestGraphLoader.swift | 12 +- .../TestAcceptanceTests.swift | 1 + .../Graph/Mappers/GraphMapperTests.swift | 11 +- ...ectsPlatformNarrowerGraphMapperTests.swift | 11 +- ...rphanExternalTargetsGraphMapperTests.swift | 5 +- .../Generator/LinkGeneratorTests.swift | 137 ++-- .../Linter/GraphLinterTests.swift | 9 +- .../ExplicitDependencyGraphMapperTests.swift | 5 +- .../ProjectMappers/ModuleMapMapperTests.swift | 10 +- .../ManifestGraphLoaderIntegrationTests.swift | 4 +- .../Generator/Mocks/MockGenerator.swift | 71 -- .../FocusTargetsGraphMappersTests.swift | 12 +- ...eeShakePrunedTargetsGraphMapperTests.swift | 16 +- ...ateWorkspaceProjectsGraphMapperTests.swift | 2 +- .../Mocks/MockManifestGraphLoader.swift | 12 - .../Cache/CachePrintHashesServiceTests.swift | 47 +- .../Services/GraphServiceTests.swift | 14 +- .../Services/RunServiceTests.swift | 4 +- .../Services/TestServiceTests.swift | 399 ++++++++-- 39 files changed, 765 insertions(+), 1030 deletions(-) delete mode 100644 Sources/TuistAutomation/Utilities/AutomationStorage.swift create mode 100644 Sources/TuistCore/Graph/Mappers/MapperEnvironment.swift create mode 100644 Sources/TuistCore/Graph/Mappers/MapperEnvironmentKeys.swift delete mode 100644 Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift delete mode 100644 Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift delete mode 100644 Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift index c9b86f1df35..c09ef980521 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift @@ -9,6 +9,7 @@ public enum TuistAcceptanceFixtures { case appWithPreviews case appWithSpmDependencies case appWithTestPlan + case appWithTests case commandLineToolBasic case commandLineToolWithDynamicFramework case commandLineToolWithDynamicLibrary @@ -92,6 +93,8 @@ public enum TuistAcceptanceFixtures { return "app_with_spm_dependencies" case .appWithTestPlan: return "app_with_test_plan" + case .appWithTests: + return "app_with_tests" case .commandLineToolBasic: return "command_line_tool_basic" case .commandLineToolWithDynamicFramework: diff --git a/Sources/TuistAutomation/Utilities/AutomationStorage.swift b/Sources/TuistAutomation/Utilities/AutomationStorage.swift deleted file mode 100644 index 2da8b625840..00000000000 --- a/Sources/TuistAutomation/Utilities/AutomationStorage.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation -import Mockable -import XcodeGraph - -@Mockable -/** - Store for automation-related metadata - */ -public protocol AutomationStoring: AnyObject { - /// Initial graph before automation mappers were applied - var initialGraph: Graph? { get set } -} - -public final class AutomationStorage: AutomationStoring { - public init() {} - - public var initialGraph: Graph? -} diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index e09e0513f1f..dc8f67d68c4 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -115,13 +115,18 @@ public class GraphTraverser: GraphTraversing { public func allTargetDependencies(path: Path.AbsolutePath, name: String) -> Set { guard let target = target(path: path, name: name) else { return [] } - return transitiveClosure([target]) { target in + return allTargetDependencies(traversingFromTargets: [target]) + } + + public func allTargetDependencies(traversingFromTargets: [GraphTarget]) -> Set { + return transitiveClosure(traversingFromTargets) { target in Array( directTargetDependencies( path: target.path, name: target.target.name ) - ).map(\.graphTarget) + ) + .map(\.graphTarget) } } diff --git a/Sources/TuistCore/Graph/Mappers/GraphMapper.swift b/Sources/TuistCore/Graph/Mappers/GraphMapper.swift index 100b96302de..2beeebd837c 100644 --- a/Sources/TuistCore/Graph/Mappers/GraphMapper.swift +++ b/Sources/TuistCore/Graph/Mappers/GraphMapper.swift @@ -6,21 +6,21 @@ import XcodeGraph public protocol GraphMapping { /// Given a value graph, it maps it into another value graph. /// - Parameter graph: Graph to be mapped. - func map(graph: Graph) async throws -> (Graph, [SideEffectDescriptor]) + func map(graph: Graph, environment: MapperEnvironment) async throws -> (Graph, [SideEffectDescriptor], MapperEnvironment) } /// A mapper that is initialized with a mapping function. public final class AnyGraphMapper: GraphMapping { /// A function to map the graph. - let mapper: (Graph) throws -> (Graph, [SideEffectDescriptor]) + let mapper: (Graph) throws -> (Graph, [SideEffectDescriptor], MapperEnvironment) /// Default initializer /// - Parameter mapper: Function to map the graph. - public init(mapper: @escaping (Graph) throws -> (Graph, [SideEffectDescriptor])) { + public init(mapper: @escaping (Graph) throws -> (Graph, [SideEffectDescriptor], MapperEnvironment)) { self.mapper = mapper } - public func map(graph: Graph) throws -> (Graph, [SideEffectDescriptor]) { + public func map(graph: Graph, environment _: MapperEnvironment) throws -> (Graph, [SideEffectDescriptor], MapperEnvironment) { try mapper(graph) } } @@ -35,14 +35,19 @@ public final class SequentialGraphMapper: GraphMapping { self.mappers = mappers } - public func map(graph: Graph) async throws -> (Graph, [SideEffectDescriptor]) { + public func map( + graph: Graph, + environment: MapperEnvironment + ) async throws -> (Graph, [SideEffectDescriptor], MapperEnvironment) { var graph = graph var sideEffects = [SideEffectDescriptor]() + var environment = environment for mapper in mappers { - let (mappedGraph, newSideEffects) = try await mapper.map(graph: graph) + let (mappedGraph, newSideEffects, newEnvironment) = try await mapper.map(graph: graph, environment: environment) sideEffects.append(contentsOf: newSideEffects) graph = mappedGraph + environment = newEnvironment } - return (graph, sideEffects) + return (graph, sideEffects, environment) } } diff --git a/Sources/TuistCore/Graph/Mappers/MapperEnvironment.swift b/Sources/TuistCore/Graph/Mappers/MapperEnvironment.swift new file mode 100644 index 00000000000..2768c8f5adf --- /dev/null +++ b/Sources/TuistCore/Graph/Mappers/MapperEnvironment.swift @@ -0,0 +1,22 @@ +import Foundation + +public protocol MapperEnvironmentKey: Hashable { + associatedtype Value + static var defaultValue: Self.Value { get } +} + +/// An environment dictionary that holds extra context in mappers +public struct MapperEnvironment { + private var environment: [ObjectIdentifier: Any] = [:] + + public init() {} + + public subscript(key: Key.Type) -> Key.Value { + get { + environment[ObjectIdentifier(key)] as? Key.Value ?? Key.defaultValue + } + set { + environment[ObjectIdentifier(key)] = newValue + } + } +} diff --git a/Sources/TuistCore/Graph/Mappers/MapperEnvironmentKeys.swift b/Sources/TuistCore/Graph/Mappers/MapperEnvironmentKeys.swift new file mode 100644 index 00000000000..d9d9326edbe --- /dev/null +++ b/Sources/TuistCore/Graph/Mappers/MapperEnvironmentKeys.swift @@ -0,0 +1,25 @@ +import Foundation +import XcodeGraph + +// Common MapperEnvironment keys that need to be shared with the closed source repository. + +private struct TestsCacheHashesKey: MapperEnvironmentKey { + static var defaultValue: [Target: String] = [:] +} + +private struct InitialGraphKey: MapperEnvironmentKey { + static var defaultValue: Graph? +} + +extension MapperEnvironment { + /// Hashes of targets that are missing in the remote storage + public var testsCacheUntestedHashes: [Target: String] { + get { self[TestsCacheHashesKey.self] } + set { self[TestsCacheHashesKey.self] = newValue } + } + + public var initialGraph: Graph? { + get { self[InitialGraphKey.self] } + set { self[InitialGraphKey.self] = newValue } + } +} diff --git a/Sources/TuistCore/GraphTraverser/GraphTraversing.swift b/Sources/TuistCore/GraphTraverser/GraphTraversing.swift index ae904ca902f..2bdd02c3503 100644 --- a/Sources/TuistCore/GraphTraverser/GraphTraversing.swift +++ b/Sources/TuistCore/GraphTraverser/GraphTraversing.swift @@ -1,7 +1,9 @@ import Foundation +import Mockable import Path import XcodeGraph +@Mockable public protocol GraphTraversing { /// Graph name var name: String { get } @@ -74,6 +76,9 @@ public protocol GraphTraversing { /// - Returns: All direct and transitive target dependencies func allTargetDependencies(path: AbsolutePath, name: String) -> Set + /// - Returns: All direct and transitive target dependencies, traversing from the passed targets + func allTargetDependencies(traversingFromTargets: [GraphTarget]) -> Set + /// Given a project directory and target name, it returns **all**l its direct target dependencies present in the same project. /// If you want only direct target dependencies present in the same project as the target, use `directLocalTargetDependencies` /// instead diff --git a/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift b/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift deleted file mode 100644 index 4d2573dafc3..00000000000 --- a/Sources/TuistCoreTesting/GraphTraverser/MockGraphTraverser.swift +++ /dev/null @@ -1,702 +0,0 @@ -import Foundation -import Path -import XcodeGraph -@testable import TuistCore - -// swiftlint:disable:next type_body_length -final class MockGraphTraverser: GraphTraversing { - var invokedNameGetter = false - var invokedNameGetterCount = 0 - var stubbedName: String! = "" - - var name: String { - invokedNameGetter = true - invokedNameGetterCount += 1 - return stubbedName - } - - var invokedHasPackagesGetter = false - var invokedHasPackagesGetterCount = 0 - var stubbedHasPackages: Bool! = false - - var hasPackages: Bool { - invokedHasPackagesGetter = true - invokedHasPackagesGetterCount += 1 - return stubbedHasPackages - } - - var invokedHasRemotePackagesGetter = false - var invokedHasRemotePackagesGetterCount = 0 - var stubbedHasRemotePackages: Bool! = false - - var hasRemotePackages: Bool { - invokedHasRemotePackagesGetter = true - invokedHasRemotePackagesGetterCount += 1 - return stubbedHasRemotePackages - } - - var invokedPathGetter = false - var invokedPathGetterCount = 0 - var stubbedPath: AbsolutePath! - - var path: AbsolutePath { - invokedPathGetter = true - invokedPathGetterCount += 1 - return stubbedPath - } - - var invokedWorkspaceGetter = false - var invokedWorkspaceGetterCount = 0 - var stubbedWorkspace: Workspace! - - var workspace: Workspace { - invokedWorkspaceGetter = true - invokedWorkspaceGetterCount += 1 - return stubbedWorkspace - } - - var invokedProjectsGetter = false - var invokedProjectsGetterCount = 0 - var stubbedProjects: [AbsolutePath: Project]! = [:] - - var projects: [AbsolutePath: Project] { - invokedProjectsGetter = true - invokedProjectsGetterCount += 1 - return stubbedProjects - } - - var invokedTargets = false - var invokedTargetsCount = 0 - var stubbedTargets: [AbsolutePath: [String: Target]]! = [:] - func targets() -> [Path.AbsolutePath: [String: XcodeGraph.Target]] { - invokedTargets = true - invokedTargetsCount += 1 - return stubbedTargets - } - - var invokedDependenciesGetter = false - var invokedDependenciesGetterCount = 0 - var stubbedDependencies: [GraphDependency: Set]! = [:] - - var dependencies: [GraphDependency: Set] { - invokedDependenciesGetter = true - invokedDependenciesGetterCount += 1 - return stubbedDependencies - } - - var invokedApps = false - var invokedAppsCount = 0 - var stubbedAppsResult: Set! = [] - - func apps() -> Set { - invokedApps = true - invokedAppsCount += 1 - return stubbedAppsResult - } - - var invokedRootTargets = false - var invokedRootTargetsCount = 0 - var stubbedRootTargetsResult: Set! = [] - - func rootTargets() -> Set { - invokedRootTargets = true - invokedRootTargetsCount += 1 - return stubbedRootTargetsResult - } - - var invokedRootProjects = false - var invokedRootProjectsCount = 0 - var stubbedRootProjectsResult: Set! = [] - - func rootProjects() -> Set { - invokedRootProjects = true - invokedRootProjectsCount += 1 - return stubbedRootProjectsResult - } - - var invokedAllTargets = false - var invokedAllTargetsCount = 0 - var stubbedAllTargetsResult: Set! = [] - - func allTargets() -> Set { - invokedAllTargets = true - invokedAllTargetsCount += 1 - return stubbedAllTargetsResult - } - - var invokedAllTargetsTopologicalSorted = false - var invokedAllTargetsTopologicalSortedCount = 0 - var stubbedAllTargetsTopologicalSortedResult: [GraphTarget]! = [] - - func allTargetsTopologicalSorted() throws -> [GraphTarget] { - invokedAllTargetsTopologicalSorted = true - invokedAllTargetsTopologicalSortedCount += 1 - return stubbedAllTargetsTopologicalSortedResult - } - - var invokedAllInternalTargets = false - var invokedAllInternalTargetsCount = 0 - var stubbedAllInternalTargetsResult: Set! = [] - - func allInternalTargets() -> Set { - invokedAllInternalTargets = true - invokedAllInternalTargetsCount += 1 - return stubbedAllInternalTargetsResult - } - - var invokedAllTestPlans = false - var invokedAllTestPlansCount = 0 - var stubbedAllTestPlansResult: Set! = [] - - func allTestPlans() -> Set { - invokedAllTestPlans = true - invokedAllTestPlansCount += 1 - return stubbedAllTestPlansResult - } - - var invokedTestPlan = false - var invokedTestPlanCount = 0 - var invokedTestPlanParameters: String? - var invokedTestPlanParametersList = [String]() - var stubbedTestPlanResult: TestPlan? - - func testPlan(name: String) -> TestPlan? { - invokedTestPlan = true - invokedTestPlanCount += 1 - invokedTestPlanParameters = name - invokedTestPlanParametersList.append(name) - return stubbedTestPlanResult - } - - var invokedPrecompiledFrameworksPaths = false - var invokedPrecompiledFrameworksPathsCount = 0 - var stubbedPrecompiledFrameworksPathsResult: Set! = [] - - func precompiledFrameworksPaths() -> Set { - invokedPrecompiledFrameworksPaths = true - invokedPrecompiledFrameworksPathsCount += 1 - return stubbedPrecompiledFrameworksPathsResult - } - - var invokedTargetsProduct = false - var invokedTargetsProductCount = 0 - var invokedTargetsProductParameters: (product: Product, Void)? - var invokedTargetsProductParametersList = [(product: Product, Void)]() - var stubbedTargetsProductResult: Set! = [] - - func targets(product: Product) -> Set { - invokedTargetsProduct = true - invokedTargetsProductCount += 1 - invokedTargetsProductParameters = (product, ()) - invokedTargetsProductParametersList.append((product, ())) - return stubbedTargetsProductResult - } - - var invokedBuildsForMacCatalyst = false - var invokedBuildsForMacCatalystCount = 0 - var invokedBuildsForMacCatalystParameters: (path: AbsolutePath, name: String)? - var invokedBuildsForMacCatalystParametersList = [(path: AbsolutePath, name: String)]() - var stubbedBuildsForMacCatalystResult: Bool! - - func buildsForMacCatalyst(path: Path.AbsolutePath, name: String) -> Bool { - invokedBuildsForMacCatalyst = true - invokedBuildsForMacCatalystCount += 1 - invokedBuildsForMacCatalystParameters = (path, name) - invokedBuildsForMacCatalystParametersList.append((path, name)) - return stubbedBuildsForMacCatalystResult - } - - var invokedTarget = false - var invokedTargetCount = 0 - var invokedTargetParameters: (path: AbsolutePath, name: String)? - var invokedTargetParametersList = [(path: AbsolutePath, name: String)]() - var stubbedTargetResult: GraphTarget! - - func target(path: AbsolutePath, name: String) -> GraphTarget? { - invokedTarget = true - invokedTargetCount += 1 - invokedTargetParameters = (path, name) - invokedTargetParametersList.append((path, name)) - return stubbedTargetResult - } - - var invokedTargetsAt = false - var invokedTargetsAtCount = 0 - var invokedTargetsAtParameters: (path: AbsolutePath, Void)? - var invokedTargetsAtParametersList = [(path: AbsolutePath, Void)]() - var stubbedTargetsAtResult: Set! = [] - - func targets(at path: AbsolutePath) -> Set { - invokedTargetsAt = true - invokedTargetsAtCount += 1 - invokedTargetsAtParameters = (path, ()) - invokedTargetsAtParametersList.append((path, ())) - return stubbedTargetsAtResult - } - - var invokedAllTargetDependencies = false - var invokedAllTargetDependenciesCount = 0 - var invokedAllTargetDependenciesParameters: ( - path: AbsolutePath, - name: String - )? - var invokedAllTargetDependenciesResult: Set = [] - func allTargetDependencies(path: Path.AbsolutePath, name: String) -> Set { - invokedAllTargetDependencies = true - invokedAllTargetDependenciesCount += 1 - invokedAllTargetDependenciesParameters = (path, name) - return invokedAllTargetDependenciesResult - } - - var invokedDirectLocalTargetDependencies = false - - var invokedDirectLocalTargetDependenciesCount = 0 - var invokedDirectLocalTargetDependenciesParameters: ( - path: AbsolutePath, - name: String - )? - var invokedDirectLocalTargetDependenciesParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedDirectLocalTargetDependenciesResult: Set! = [] - - func directLocalTargetDependencies(path: AbsolutePath, name: String) -> Set { - invokedDirectLocalTargetDependencies = true - invokedDirectLocalTargetDependenciesCount += 1 - invokedDirectLocalTargetDependenciesParameters = (path, name) - invokedDirectLocalTargetDependenciesParametersList.append((path, name)) - return stubbedDirectLocalTargetDependenciesResult - } - - var invokedDirectLocalTargetDependenciesWithConditions = false - - var invokedDirectLocalTargetDependenciesWithConditionsCount = 0 - var invokedDirectLocalTargetDependenciesWithConditionsParameters: ( - path: AbsolutePath, - name: String - )? - - var invokedDirectTargetDependencies = false - var invokedDirectTargetDependenciesCount = 0 - var invokedDirectTargetDependenciesParameters: (path: AbsolutePath, name: String)? - var invokedDirectTargetDependenciesParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedDirectTargetDependenciesResult: Set! = [] - - func directTargetDependencies(path: AbsolutePath, name: String) -> Set { - invokedDirectTargetDependencies = true - invokedDirectTargetDependenciesCount += 1 - invokedDirectTargetDependenciesParameters = (path, name) - invokedDirectTargetDependenciesParametersList.append((path, name)) - return stubbedDirectTargetDependenciesResult - } - - var invokedAppExtensionDependencies = false - var invokedAppExtensionDependenciesCount = 0 - var invokedAppExtensionDependenciesParameters: (path: AbsolutePath, name: String)? - var invokedAppExtensionDependenciesParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedAppExtensionDependenciesResult: Set! = [] - - func appExtensionDependencies(path: AbsolutePath, name: String) -> Set { - invokedAppExtensionDependencies = true - invokedAppExtensionDependenciesCount += 1 - invokedAppExtensionDependenciesParameters = (path, name) - invokedAppExtensionDependenciesParametersList.append((path, name)) - return stubbedAppExtensionDependenciesResult - } - - var invokedResourceBundleDependencies = false - var invokedResourceBundleDependenciesCount = 0 - var invokedResourceBundleDependenciesParameters: (path: AbsolutePath, name: String)? - var invokedResourceBundleDependenciesParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedResourceBundleDependenciesResult: Set! = [] - - func resourceBundleDependencies(path: AbsolutePath, name: String) -> Set { - invokedResourceBundleDependencies = true - invokedResourceBundleDependenciesCount += 1 - invokedResourceBundleDependenciesParameters = (path, name) - invokedResourceBundleDependenciesParametersList.append((path, name)) - return stubbedResourceBundleDependenciesResult - } - - var invokedDirectStaticDependencies = false - var invokedDirectStaticDependenciesCount = 0 - var invokedDirectStaticDependenciesParameters: (path: AbsolutePath, name: String)? - var invokedDirectStaticDependenciesParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedDirectStaticDependenciesResult: Set! = [] - - func directStaticDependencies(path: AbsolutePath, name: String) -> Set { - invokedDirectStaticDependencies = true - invokedDirectStaticDependenciesCount += 1 - invokedDirectStaticDependenciesParameters = (path, name) - invokedDirectStaticDependenciesParametersList.append((path, name)) - return stubbedDirectStaticDependenciesResult - } - - var invokedAppClipDependencies = false - var invokedAppClipDependenciesCount = 0 - var invokedAppClipDependenciesParameters: (path: AbsolutePath, name: String)? - var invokedAppClipDependenciesParametersList = [(path: AbsolutePath, name: String)]() - var stubbedAppClipDependenciesResult: GraphTargetReference! - - func appClipDependencies(path: AbsolutePath, name: String) -> GraphTargetReference? { - invokedAppClipDependencies = true - invokedAppClipDependenciesCount += 1 - invokedAppClipDependenciesParameters = (path, name) - invokedAppClipDependenciesParametersList.append((path, name)) - return stubbedAppClipDependenciesResult - } - - var invokedAppClipDependenciesWithConditions = false - var invokedAppClipDependenciesWithConditionsCount = 0 - var invokedAppClipDependenciesWithConditionsParameters: (path: AbsolutePath, name: String)? - var invokedAppClipDependenciesWithConditionsParametersList = [(path: AbsolutePath, name: String)]() - var stubbedAppClipDependenciesWithConditionsResult: (GraphTarget, PlatformCondition?)! - - func appClipDependenciesWithConditions(path: AbsolutePath, name: String) -> (GraphTarget, PlatformCondition?)? { - invokedAppClipDependenciesWithConditions = true - invokedAppClipDependenciesWithConditionsCount += 1 - invokedAppClipDependenciesWithConditionsParameters = (path, name) - invokedAppClipDependenciesWithConditionsParametersList.append((path, name)) - return stubbedAppClipDependenciesWithConditionsResult - } - - var invokedEmbeddableFrameworks = false - var invokedEmbeddableFrameworksCount = 0 - var invokedEmbeddableFrameworksParameters: (path: AbsolutePath, name: String)? - var invokedEmbeddableFrameworksParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedEmbeddableFrameworksResult: Set! = [] - - func embeddableFrameworks(path: AbsolutePath, name: String) -> Set { - invokedEmbeddableFrameworks = true - invokedEmbeddableFrameworksCount += 1 - invokedEmbeddableFrameworksParameters = (path, name) - invokedEmbeddableFrameworksParametersList.append((path, name)) - return stubbedEmbeddableFrameworksResult - } - - var invokedLinkableDependencies = false - var invokedLinkableDependenciesCount = 0 - var invokedLinkableDependenciesParameters: (path: AbsolutePath, name: String)? - var invokedLinkableDependenciesParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedLinkableDependenciesError: Error? - var stubbedLinkableDependenciesResult: Set! = [] - - func linkableDependencies(path: AbsolutePath, name: String) throws -> Set { - invokedLinkableDependencies = true - invokedLinkableDependenciesCount += 1 - invokedLinkableDependenciesParameters = (path, name) - invokedLinkableDependenciesParametersList.append((path, name)) - if let error = stubbedLinkableDependenciesError { - throw error - } - return stubbedLinkableDependenciesResult - } - - var invokedSearchablePathDependencies = false - var invokedSearchablePathDependenciesCount = 0 - var invokedSearchablePathDependenciesParameters: (path: AbsolutePath, name: String)? - var invokedSearchablePathDependenciesParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedSearchablePathDependenciesError: Error? - var stubbedSearchablePathDependenciesResult: Set! = [] - - func searchablePathDependencies(path: AbsolutePath, name: String) throws -> Set { - invokedSearchablePathDependencies = true - invokedSearchablePathDependenciesCount += 1 - invokedSearchablePathDependenciesParameters = (path, name) - invokedSearchablePathDependenciesParametersList.append((path, name)) - if let error = stubbedSearchablePathDependenciesError { - throw error - } - return stubbedSearchablePathDependenciesResult - } - - var invokedCopyProductDependencies = false - var invokedCopyProductDependenciesCount = 0 - var invokedCopyProductDependenciesParameters: (path: AbsolutePath, name: String)? - var invokedCopyProductDependenciesParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedCopyProductDependenciesResult: Set! = [] - - func copyProductDependencies(path: AbsolutePath, name: String) -> Set { - invokedCopyProductDependencies = true - invokedCopyProductDependenciesCount += 1 - invokedCopyProductDependenciesParameters = (path, name) - invokedCopyProductDependenciesParametersList.append((path, name)) - return stubbedCopyProductDependenciesResult - } - - var invokedLibrariesPublicHeadersFolders = false - var invokedLibrariesPublicHeadersFoldersCount = 0 - var invokedLibrariesPublicHeadersFoldersParameters: ( - path: AbsolutePath, - name: String - )? - var invokedLibrariesPublicHeadersFoldersParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedLibrariesPublicHeadersFoldersResult: Set! = [] - - func librariesPublicHeadersFolders(path: AbsolutePath, name: String) -> Set { - invokedLibrariesPublicHeadersFolders = true - invokedLibrariesPublicHeadersFoldersCount += 1 - invokedLibrariesPublicHeadersFoldersParameters = (path, name) - invokedLibrariesPublicHeadersFoldersParametersList.append((path, name)) - return stubbedLibrariesPublicHeadersFoldersResult - } - - var invokedLibrariesSearchPaths = false - var invokedLibrariesSearchPathsCount = 0 - var invokedLibrariesSearchPathsParameters: (path: AbsolutePath, name: String)? - var invokedLibrariesSearchPathsParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedLibrariesSearchPathsResult: Set! = [] - - func librariesSearchPaths(path: AbsolutePath, name: String) throws -> Set { - invokedLibrariesSearchPaths = true - invokedLibrariesSearchPathsCount += 1 - invokedLibrariesSearchPathsParameters = (path, name) - invokedLibrariesSearchPathsParametersList.append((path, name)) - return stubbedLibrariesSearchPathsResult - } - - var invokedLibrariesSwiftIncludePaths = false - var invokedLibrariesSwiftIncludePathsCount = 0 - var invokedLibrariesSwiftIncludePathsParameters: (path: AbsolutePath, name: String)? - var invokedLibrariesSwiftIncludePathsParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedLibrariesSwiftIncludePathsResult: Set! = [] - - func librariesSwiftIncludePaths(path: AbsolutePath, name: String) -> Set { - invokedLibrariesSwiftIncludePaths = true - invokedLibrariesSwiftIncludePathsCount += 1 - invokedLibrariesSwiftIncludePathsParameters = (path, name) - invokedLibrariesSwiftIncludePathsParametersList.append((path, name)) - return stubbedLibrariesSwiftIncludePathsResult - } - - var invokedRunPathSearchPaths = false - var invokedRunPathSearchPathsCount = 0 - var invokedRunPathSearchPathsParameters: (path: AbsolutePath, name: String)? - var invokedRunPathSearchPathsParametersList = [(path: AbsolutePath, name: String)]() - var stubbedRunPathSearchPathsResult: Set! = [] - - func runPathSearchPaths(path: AbsolutePath, name: String) -> Set { - invokedRunPathSearchPaths = true - invokedRunPathSearchPathsCount += 1 - invokedRunPathSearchPathsParameters = (path, name) - invokedRunPathSearchPathsParametersList.append((path, name)) - return stubbedRunPathSearchPathsResult - } - - var invokedHostTargetFor = false - var invokedHostTargetForCount = 0 - var invokedHostTargetForParameters: (path: AbsolutePath, name: String)? - var invokedHostTargetForParametersList = [(path: AbsolutePath, name: String)]() - var stubbedHostTargetForResult: GraphTarget! - - func hostTargetFor(path: AbsolutePath, name: String) -> GraphTarget? { - invokedHostTargetFor = true - invokedHostTargetForCount += 1 - invokedHostTargetForParameters = (path, name) - invokedHostTargetForParametersList.append((path, name)) - return stubbedHostTargetForResult - } - - var invokedAllProjectDependencies = false - var invokedAllProjectDependenciesCount = 0 - var invokedAllProjectDependenciesParameters: (path: AbsolutePath, Void)? - var invokedAllProjectDependenciesParametersList = [(path: AbsolutePath, Void)]() - var stubbedAllProjectDependenciesError: Error? - var stubbedAllProjectDependenciesResult: Set! = [] - - func allProjectDependencies(path: AbsolutePath) throws -> Set { - invokedAllProjectDependencies = true - invokedAllProjectDependenciesCount += 1 - invokedAllProjectDependenciesParameters = (path, ()) - invokedAllProjectDependenciesParametersList.append((path, ())) - if let error = stubbedAllProjectDependenciesError { - throw error - } - return stubbedAllProjectDependenciesResult - } - - var invokedDependsOnXCTest = false - var invokedDependsOnXCTestCount = 0 - var invokedDependsOnXCTestParameters: (path: AbsolutePath, name: String)? - var invokedDependsOnXCTestParametersList = [(path: AbsolutePath, name: String)]() - var stubbedDependsOnXCTestResult: Bool! = false - - func dependsOnXCTest(path: AbsolutePath, name: String) -> Bool { - invokedDependsOnXCTest = true - invokedDependsOnXCTestCount += 1 - invokedDependsOnXCTestParameters = (path, name) - invokedDependsOnXCTestParametersList.append((path, name)) - return stubbedDependsOnXCTestResult - } - - var invokedNeedsEnableTestingSearchPaths = false - var invokedNeedsEnableTestingSearchPathsCount = 0 - var invokedNeedsEnableTestingSearchPathsParameters: (path: AbsolutePath, name: String)? - var invokedNeedsEnableTestingSearchPathsParametersList = [(path: AbsolutePath, name: String)]() - var stubbedNeedsEnableTestingSearchPathsResult: Bool! = false - - func needsEnableTestingSearchPaths(path: AbsolutePath, name: String) -> Bool { - invokedNeedsEnableTestingSearchPaths = true - invokedNeedsEnableTestingSearchPathsCount += 1 - invokedNeedsEnableTestingSearchPathsParameters = (path, name) - invokedNeedsEnableTestingSearchPathsParametersList.append((path, name)) - return stubbedNeedsEnableTestingSearchPathsResult - } - - var schemesStub: (() -> [Scheme])? - func schemes() -> [Scheme] { - schemesStub?() ?? [] - } - - var invokedExtensionKitExtensionDependencies = false - var invokedExtensionKitExtensionDependenciesCount = 0 - var invokedExtensionKitExtensionDependenciesParameters: (path: AbsolutePath, name: String)? - var invokedExtensionKitExtensionDependenciesParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedExtensionKitExtensionDependenciesResult: Set! = [] - - func extensionKitExtensionDependencies(path: Path.AbsolutePath, name: String) -> Set { - invokedExtensionKitExtensionDependencies = true - invokedExtensionKitExtensionDependenciesCount += 1 - invokedExtensionKitExtensionDependenciesParameters = (path, name) - invokedExtensionKitExtensionDependenciesParametersList.append((path, name)) - return stubbedExtensionKitExtensionDependenciesResult - } - - var invokedExtensionKitExtensionDependenciesWithConditions = false - var invokedExtensionKitExtensionDependenciesWithConditionsCount = 0 - // swiftlint:disable:next identifier_name - var invokedExtensionKitExtensionDependenciesWithConditionsParameters: (path: AbsolutePath, name: String)? - // swiftlint:disable:next identifier_name - var invokedExtensionKitExtensionDependenciesWithConditionsParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedExtensionKitExtensionDependenciesWithConditionsResult: [(GraphTarget, PlatformCondition?)]! = [] - - func extensionKitExtensionDependenciesWithConditions(path: Path.AbsolutePath, name: String) -> [( - XcodeGraph.GraphTarget, - XcodeGraph.PlatformCondition? - )] { - invokedExtensionKitExtensionDependenciesWithConditions = true - invokedExtensionKitExtensionDependenciesWithConditionsCount += 1 - invokedExtensionKitExtensionDependenciesWithConditionsParameters = (path, name) - invokedExtensionKitExtensionDependenciesWithConditionsParametersList.append((path, name)) - return stubbedExtensionKitExtensionDependenciesWithConditionsResult - } - - var invokedDirectSwiftMacroExecutables = false - var invokedDirectSwiftMacroExecutablesCount = 0 - var invokedDirectSwiftMacroExecutablesParameters: (path: AbsolutePath, name: String)? - var invokedDirectSwiftMacroExecutablesParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedDirectSwiftMacroExecutablesResult: Set! = [] - - func directSwiftMacroExecutables(path: Path.AbsolutePath, name: String) -> Set { - invokedDirectSwiftMacroExecutables = true - invokedDirectSwiftMacroExecutablesCount += 1 - invokedDirectSwiftMacroExecutablesParameters = (path, name) - invokedDirectSwiftMacroExecutablesParametersList.append((path, name)) - return stubbedDirectSwiftMacroExecutablesResult - } - - var invokedDirectSwiftMacroTargets = false - var invokedDirectSwiftMacroTargetsCount = 0 - var invokedDirectSwiftMacroTargetsParameters: (path: AbsolutePath, name: String)? - var invokedDirectSwiftMacroTargetsParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedDirectSwiftMacroTargetsResult: Set! = [] - func directSwiftMacroTargets(path: Path.AbsolutePath, name: String) -> Set { - invokedDirectSwiftMacroTargets = true - invokedDirectSwiftMacroTargetsCount += 1 - invokedDirectSwiftMacroTargetsParameters = (path, name) - invokedDirectSwiftMacroTargetsParametersList.append((path, name)) - return stubbedDirectSwiftMacroTargetsResult - } - - var invokedAllSwiftMacroTargets = false - var invokedAllSwiftMacroTargetsCount = 0 - var invokedAllSwiftMacroTargetsParameters: (path: AbsolutePath, name: String)? - var invokedAllSwiftMacroTargetsParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedAllSwiftMacroTargetsResult: Set! = [] - func allSwiftMacroTargets(path: Path.AbsolutePath, name: String) -> Set { - invokedAllSwiftMacroTargets = true - invokedAllSwiftMacroTargetsCount += 1 - invokedAllSwiftMacroTargetsParameters = (path, name) - invokedAllSwiftMacroTargetsParametersList.append((path, name)) - return stubbedAllSwiftMacroTargetsResult - } - - var invokedAllOrphanExternalTargets = false - var invokedAllOrphanExternalTargetsCount = 0 - var stubbedAllOrphanExternalTargetsResult: Set! = [] - func allOrphanExternalTargets() -> Set { - invokedAllOrphanExternalTargets = true - invokedAllOrphanExternalTargetsCount += 1 - return stubbedAllOrphanExternalTargetsResult - } - - var invokedTargetsWithExternalDependencies = false - var invokedTargetsWithExternalDependenciesCount = 0 - var stubbedTargetsWithExternalDependenciesResult: Set! = [] - func targetsWithExternalDependencies() -> Set { - invokedTargetsWithExternalDependencies = true - invokedTargetsWithExternalDependenciesCount += 1 - return stubbedTargetsWithExternalDependenciesResult - } - - var invokedAllExternalTargets = false - var invokedAllExternalTargetsCount = 0 - var stubbedAllExternalTargetsResult: Set! = [] - func allExternalTargets() -> Set { - invokedAllExternalTargets = true - invokedAllExternalTargetsCount += 1 - return stubbedAllExternalTargetsResult - } - - var invokedExternalTargetSupportedPlatforms = false - var invokedExternalTargetSupportedPlatformsCount = 0 - var stubbedExternalTargetSupportedPlatformsResult: [GraphTarget: Set]! = [:] - func externalTargetSupportedPlatforms() -> [GraphTarget: Set] { - invokedExternalTargetSupportedPlatforms = true - invokedExternalTargetSupportedPlatformsCount += 1 - return stubbedExternalTargetSupportedPlatformsResult - } - - var invokedDirectTargetExternalDependencies = false - var invokedDirectTargetExternalDependenciesCount = 0 - var invokedDirectTargetExternalDependenciesParameters: (path: AbsolutePath, name: String)? - var invokedDirectTargetExternalDependenciesParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedDirectTargetExternalDependenciesResult: Set! = [] - func directTargetExternalDependencies(path: AbsolutePath, name: String) -> Set { - invokedDirectTargetExternalDependencies = true - invokedDirectTargetExternalDependenciesCount += 1 - invokedDirectTargetExternalDependenciesParameters = (path, name) - invokedDirectTargetExternalDependenciesParametersList.append((path, name)) - return stubbedDirectTargetExternalDependenciesResult - } - - var invokedAllSwiftPluginExecutables = false - var invokedAllSwiftPluginExecutablesCount = 0 - var invokedAllSwiftPluginExecutablesParameters: (path: AbsolutePath, name: String)? - var invokedAllSwiftPluginExecutablesParametersList = - [(path: AbsolutePath, name: String)]() - var stubbedAllSwiftPluginExecutablesResult: Set! = [] - func allSwiftPluginExecutables(path: Path.AbsolutePath, name: String) -> Set { - invokedAllSwiftPluginExecutables = true - invokedAllSwiftPluginExecutablesCount += 1 - invokedAllSwiftPluginExecutablesParameters = (path, name) - invokedAllSwiftPluginExecutablesParametersList.append((path, name)) - return stubbedAllSwiftPluginExecutablesResult - } -} diff --git a/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift b/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift index 3aed630baf3..ae17d879581 100644 --- a/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift +++ b/Sources/TuistDependencies/Mappers/ExternalProjectsPlatformNarrowerGraphMapper.swift @@ -12,12 +12,15 @@ import XcodeGraph public struct ExternalProjectsPlatformNarrowerGraphMapper: GraphMapping { // swiftlint:disable:this type_name public init() {} - public func map(graph: Graph) async throws -> (Graph, [TuistCore.SideEffectDescriptor]) { + public func map( + graph: Graph, + environment: MapperEnvironment + ) async throws -> (Graph, [TuistCore.SideEffectDescriptor], MapperEnvironment) { logger.debug("Transforming graph \(graph.name): Aligning external target platforms with locals'") // If the project has no external dependencies we skip this. if graph.projects.values.first(where: { $0.isExternal }) == nil { - return (graph, []) + return (graph, [], environment) } var graph = graph @@ -36,7 +39,7 @@ public struct ExternalProjectsPlatformNarrowerGraphMapper: GraphMapping { // swi return (projectPath, project) }) - return (graph, []) + return (graph, [], environment) } private func mapTarget( diff --git a/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift b/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift index ae96ac0014a..b3979879b16 100644 --- a/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift +++ b/Sources/TuistDependencies/Mappers/PruneOrphanExternalTargetsGraphMapper.swift @@ -10,7 +10,10 @@ import XcodeGraph public struct PruneOrphanExternalTargetsGraphMapper: GraphMapping { public init() {} - public func map(graph: XcodeGraph.Graph) async throws -> (XcodeGraph.Graph, [TuistCore.SideEffectDescriptor]) { + public func map( + graph: XcodeGraph.Graph, + environment: MapperEnvironment + ) async throws -> (XcodeGraph.Graph, [TuistCore.SideEffectDescriptor], MapperEnvironment) { logger.debug("Transforming graph \(graph.name): Tree-shaking orphan external targets (e.g. test targets)") let graphTraverser = GraphTraverser(graph: graph) @@ -32,6 +35,6 @@ public struct PruneOrphanExternalTargetsGraphMapper: GraphMapping { return (projectPath, project) }) - return (graph, []) + return (graph, [], environment) } } diff --git a/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift b/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift index 5d9dcbeae42..62317fd6c61 100644 --- a/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift +++ b/Sources/TuistGenerator/Mappers/ExplicitDependencyGraphMapper.swift @@ -8,11 +8,15 @@ import XcodeGraph public struct ExplicitDependencyGraphMapper: GraphMapping { public init() {} - public func map(graph: Graph) async throws -> (Graph, [SideEffectDescriptor]) { + public func map( + graph: Graph, + environment: MapperEnvironment + ) async throws -> (Graph, [SideEffectDescriptor], MapperEnvironment) { if !graph.packages.isEmpty { return ( graph, - [] + [], + environment ) } logger.debug("Transforming graph \(graph.name): Enforcing explicit dependencies") @@ -41,7 +45,7 @@ public struct ExplicitDependencyGraphMapper: GraphMapping { return (projectPath, project) }) - return (graph, []) + return (graph, [], environment) } // swiftlint:disable:next function_body_length diff --git a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift index f000863928f..0f00eefffe2 100644 --- a/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift +++ b/Sources/TuistGenerator/Mappers/ModuleMapMapper.swift @@ -26,7 +26,7 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ public init() {} // swiftlint:disable function_body_length - public func map(graph: Graph) throws -> (Graph, [SideEffectDescriptor]) { + public func map(graph: Graph, environment: MapperEnvironment) throws -> (Graph, [SideEffectDescriptor], MapperEnvironment) { logger .debug( "Transforming graph \(graph.name): Mapping MODULE_MAP build setting to -fmodule-map-file compiler flag" @@ -94,7 +94,7 @@ public final class ModuleMapMapper: GraphMapping { // swiftlint:disable:this typ return (projectPath, project) }) - return (graph, []) + return (graph, [], environment) } // swiftlint:enable function_body_length private static func makeProjectsByPathWithTargetsByName(workspace: WorkspaceWithProjects) diff --git a/Sources/TuistKit/Generator/Generator.swift b/Sources/TuistKit/Generator/Generator.swift index 448a61dd769..7c9b243b964 100644 --- a/Sources/TuistKit/Generator/Generator.swift +++ b/Sources/TuistKit/Generator/Generator.swift @@ -15,7 +15,7 @@ public protocol Generating { @discardableResult func load(path: AbsolutePath) async throws -> Graph func generate(path: AbsolutePath) async throws -> AbsolutePath - func generateWithGraph(path: AbsolutePath) async throws -> (AbsolutePath, Graph) + func generateWithGraph(path: AbsolutePath) async throws -> (AbsolutePath, Graph, MapperEnvironment) } public class Generator: Generating { @@ -44,12 +44,12 @@ public class Generator: Generating { } public func generate(path: AbsolutePath) async throws -> AbsolutePath { - let (generatedPath, _) = try await generateWithGraph(path: path) + let (generatedPath, _, _) = try await generateWithGraph(path: path) return generatedPath } - public func generateWithGraph(path: AbsolutePath) async throws -> (AbsolutePath, Graph) { - let (graph, sideEffects) = try await load(path: path) + public func generateWithGraph(path: AbsolutePath) async throws -> (AbsolutePath, Graph, MapperEnvironment) { + let (graph, sideEffects, environment) = try await load(path: path) // Load let graphTraverser = GraphTraverser(graph: graph) @@ -74,21 +74,21 @@ public class Generator: Generating { printAndFlushPendingLintWarnings() - return (workspaceDescriptor.xcworkspacePath, graph) + return (workspaceDescriptor.xcworkspacePath, graph, environment) } public func load(path: AbsolutePath) async throws -> Graph { try await load(path: path).0 } - func load(path: AbsolutePath) async throws -> (Graph, [SideEffectDescriptor]) { + func load(path: AbsolutePath) async throws -> (Graph, [SideEffectDescriptor], MapperEnvironment) { logger.notice("Loading and constructing the graph", metadata: .section) logger.notice("It might take a while if the cache is empty") - let (graph, sideEffectDescriptors, issues) = try await manifestGraphLoader.load(path: path) + let (graph, sideEffectDescriptors, environment, issues) = try await manifestGraphLoader.load(path: path) lintingIssues.append(contentsOf: issues) - return (graph, sideEffectDescriptors) + return (graph, sideEffectDescriptors, environment) } private func lint(graphTraverser: GraphTraversing) async throws { diff --git a/Sources/TuistKit/Generator/GeneratorFactory.swift b/Sources/TuistKit/Generator/GeneratorFactory.swift index 31cce4e9ba7..2b6951f4766 100644 --- a/Sources/TuistKit/Generator/GeneratorFactory.swift +++ b/Sources/TuistKit/Generator/GeneratorFactory.swift @@ -15,16 +15,13 @@ import XcodeGraph public protocol GeneratorFactorying { /// Returns the generator to generate a project to run tests on. /// - Parameter config: The project configuration - /// - Parameter testsCacheDirectory: The cache directory used for tests. /// - Parameter skipUITests: Whether UI tests should be skipped. /// - Parameter ignoreBinaryCache: True to not include binaries from the cache. /// - Parameter ignoreSelectiveTesting: True to run all tests /// - Parameter cacheStorage: The cache storage instance. - /// - Parameter automationStorage: The storage for automation. /// - Returns: A Generator instance. func testing( config: Config, - testsCacheDirectory: AbsolutePath, testPlan: String?, includedTargets: Set, excludedTargets: Set, @@ -32,8 +29,7 @@ public protocol GeneratorFactorying { configuration: String?, ignoreBinaryCache: Bool, ignoreSelectiveTesting: Bool, - cacheStorage: CacheStoring, - automationStorage: AutomationStoring + cacheStorage: CacheStoring ) -> Generating /// Returns the generator for focused projects. @@ -79,7 +75,6 @@ public class GeneratorFactory: GeneratorFactorying { public func testing( config: Config, - testsCacheDirectory: AbsolutePath, testPlan: String?, includedTargets: Set, excludedTargets: Set, @@ -87,8 +82,7 @@ public class GeneratorFactory: GeneratorFactorying { configuration _: String?, ignoreBinaryCache _: Bool, ignoreSelectiveTesting _: Bool, - cacheStorage _: CacheStoring, - automationStorage _: AutomationStoring + cacheStorage _: CacheStoring ) -> Generating { let contentHasher = ContentHasher() let projectMapperFactory = ProjectMapperFactory(contentHasher: contentHasher) @@ -98,7 +92,6 @@ public class GeneratorFactory: GeneratorFactorying { let graphMappers = graphMapperFactory.automation( config: config, - testsCacheDirectory: testsCacheDirectory, testPlan: testPlan, includedTargets: includedTargets, excludedTargets: excludedTargets diff --git a/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift b/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift index a2626549f0b..579db9b3a2d 100644 --- a/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift +++ b/Sources/TuistKit/Mappers/Factories/GraphMapperFactory.swift @@ -12,7 +12,6 @@ protocol GraphMapperFactorying { /// - Returns: A graph mapper. func automation( config: Config, - testsCacheDirectory: AbsolutePath, testPlan: String?, includedTargets: Set, excludedTargets: Set @@ -30,7 +29,6 @@ public final class GraphMapperFactory: GraphMapperFactorying { public func automation( config: Config, - testsCacheDirectory _: AbsolutePath, testPlan: String?, includedTargets: Set, excludedTargets: Set diff --git a/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift b/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift index 90f061bb94c..d45305515c3 100644 --- a/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift +++ b/Sources/TuistKit/Mappers/FocusTargetsGraphMappers.swift @@ -41,7 +41,7 @@ public final class FocusTargetsGraphMappers: GraphMapping { self.excludedTargets = excludedTargets } - public func map(graph: Graph) throws -> (Graph, [SideEffectDescriptor]) { + public func map(graph: Graph, environment: MapperEnvironment) throws -> (Graph, [SideEffectDescriptor], MapperEnvironment) { let graphTraverser = GraphTraverser(graph: graph) var graph = graph let userSpecifiedSourceTargets = graphTraverser.filterIncludedTargets( @@ -75,6 +75,6 @@ public final class FocusTargetsGraphMappers: GraphMapping { return project } - return (graph, []) + return (graph, [], environment) } } diff --git a/Sources/TuistKit/Mappers/Graph/UpdateWorkspaceProjectsGraphMapper.swift b/Sources/TuistKit/Mappers/Graph/UpdateWorkspaceProjectsGraphMapper.swift index 806861ddf26..3949adb0f51 100644 --- a/Sources/TuistKit/Mappers/Graph/UpdateWorkspaceProjectsGraphMapper.swift +++ b/Sources/TuistKit/Mappers/Graph/UpdateWorkspaceProjectsGraphMapper.swift @@ -7,7 +7,7 @@ import XcodeGraph public final class UpdateWorkspaceProjectsGraphMapper: GraphMapping { public init() {} - public func map(graph: Graph) throws -> (Graph, [SideEffectDescriptor]) { + public func map(graph: Graph, environment: MapperEnvironment) throws -> (Graph, [SideEffectDescriptor], MapperEnvironment) { logger.debug("Transforming graph \(graph.name): Aligning workspace projects with the graph's") var graph = graph @@ -16,6 +16,6 @@ public final class UpdateWorkspaceProjectsGraphMapper: GraphMapping { var workspace = graph.workspace workspace.projects = Array(workspaceProjects.union(graphProjects)) graph.workspace = workspace - return (graph, []) + return (graph, [], environment) } } diff --git a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift index 2b3dd817ceb..6e49b19d975 100644 --- a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift +++ b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift @@ -6,7 +6,7 @@ import XcodeGraph public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { public init() {} - public func map(graph: Graph) throws -> (Graph, [SideEffectDescriptor]) { + public func map(graph: Graph, environment: MapperEnvironment) throws -> (Graph, [SideEffectDescriptor], MapperEnvironment) { logger.debug("Transforming graph \(graph.name): Tree-shaking nodes") let sourceTargets: Set = Set(graph.projects.flatMap { projectPath, project -> [TargetReference] in return project.targets.compactMap { _, target -> TargetReference? in @@ -16,7 +16,7 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { }) // If the number of source targets matches the number of targets in the graph there's nothing to be pruned. - if sourceTargets.count == graph.projects.values.flatMap(\.targets.values).count { return (graph, []) } + if sourceTargets.count == graph.projects.values.flatMap(\.targets.values).count { return (graph, [], environment) } let projects = graph.projects.reduce(into: [AbsolutePath: Project]()) { acc, next in let targets = self.treeShake( @@ -48,7 +48,7 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { var graph = graph graph.workspace = workspace graph.projects = projects - return (graph, []) + return (graph, [], environment) } fileprivate func treeShake(workspace: Workspace, projects: [Project], sourceTargets: Set) -> Workspace { diff --git a/Sources/TuistKit/Services/GraphService.swift b/Sources/TuistKit/Services/GraphService.swift index 7ec6e0c955b..11b323922bb 100644 --- a/Sources/TuistKit/Services/GraphService.swift +++ b/Sources/TuistKit/Services/GraphService.swift @@ -53,7 +53,7 @@ final class GraphService { path: AbsolutePath, outputPath: AbsolutePath ) async throws { - let (graph, _, _) = try await manifestGraphLoader.load(path: path) + let (graph, _, _, _) = try await manifestGraphLoader.load(path: path) let filePath = outputPath.appending(component: "graph.\(format.rawValue)") if FileHandler.shared.exists(filePath) { diff --git a/Sources/TuistKit/Services/TestService.swift b/Sources/TuistKit/Services/TestService.swift index e108abee35a..13ed3293acb 100644 --- a/Sources/TuistKit/Services/TestService.swift +++ b/Sources/TuistKit/Services/TestService.swift @@ -65,10 +65,10 @@ final class TestService { // swiftlint:disable:this type_body_length private let buildGraphInspector: BuildGraphInspecting private let simulatorController: SimulatorControlling private let contentHasher: ContentHashing - private let automationStorage: AutomationStoring private let cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring private let configLoader: ConfigLoading + private let fileHandler: FileHandling public convenience init( generatorFactory: GeneratorFactorying, @@ -80,8 +80,7 @@ final class TestService { // swiftlint:disable:this type_body_length self.init( generatorFactory: generatorFactory, cacheStorageFactory: cacheStorageFactory, - configLoader: configLoader, - automationStorage: AutomationStorage() + configLoader: configLoader ) } @@ -94,7 +93,7 @@ final class TestService { // swiftlint:disable:this type_body_length contentHasher: ContentHashing = ContentHasher(), cacheDirectoryProviderFactory: CacheDirectoriesProviderFactoring = CacheDirectoriesProviderFactory(), configLoader: ConfigLoading, - automationStorage: AutomationStoring + fileHandler: FileHandling = FileHandler.shared ) { self.generatorFactory = generatorFactory self.cacheStorageFactory = cacheStorageFactory @@ -104,7 +103,7 @@ final class TestService { // swiftlint:disable:this type_body_length self.contentHasher = contentHasher self.cacheDirectoryProviderFactory = cacheDirectoryProviderFactory self.configLoader = configLoader - self.automationStorage = automationStorage + self.fileHandler = fileHandler } static func validateParameters( @@ -191,11 +190,8 @@ final class TestService { // swiftlint:disable:this type_body_length let config = try await configLoader.loadConfig(path: path) let cacheStorage = try cacheStorageFactory.cacheStorage(config: config) - let testsCacheTemporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) - let testGenerator = generatorFactory.testing( config: config, - testsCacheDirectory: testsCacheTemporaryDirectory.path, testPlan: testPlanConfiguration?.testPlan, includedTargets: Set(testTargets.map(\.target)), excludedTargets: Set(skipTestTargets.filter { $0.class == nil }.map(\.target)), @@ -203,14 +199,13 @@ final class TestService { // swiftlint:disable:this type_body_length configuration: configuration, ignoreBinaryCache: ignoreBinaryCache, ignoreSelectiveTesting: ignoreSelectiveTesting, - cacheStorage: cacheStorage, - automationStorage: automationStorage + cacheStorage: cacheStorage ) logger.notice("Generating project for testing", metadata: .section) - let graph = try await testGenerator.generateWithGraph( + let (_, graph, mapperEnvironment) = try await testGenerator.generateWithGraph( path: path - ).1 + ) if generateOnly { return @@ -249,10 +244,11 @@ final class TestService { // swiftlint:disable:this type_body_length } } + let testSchemes: [Scheme] if let schemeName { guard let scheme = graphTraverser.schemes().first(where: { $0.name == schemeName }) else { - let schemes = automationStorage.initialGraph.map(GraphTraverser.init)?.schemes() ?? graphTraverser.schemes() + let schemes = mapperEnvironment.initialGraph.map(GraphTraverser.init)?.schemes() ?? graphTraverser.schemes() if schemes.first(where: { $0.name == schemeName }) != nil { logger.log(level: .info, "The scheme \(schemeName)'s test action has no tests to run, finishing early.") return @@ -277,7 +273,13 @@ final class TestService { // swiftlint:disable:this type_body_length break } - let testSchemes: [Scheme] = [scheme] + testSchemes = [scheme] + + checkSkippedTargets( + for: testSchemes, + mapperEnvironment: mapperEnvironment, + graph: graph + ) for testScheme in testSchemes { try await self.testScheme( @@ -299,7 +301,8 @@ final class TestService { // swiftlint:disable:this type_body_length ) } } else { - let testSchemes: [Scheme] = buildGraphInspector.workspaceSchemes(graphTraverser: graphTraverser) + let allSchemes = buildGraphInspector.workspaceSchemes(graphTraverser: graphTraverser) + testSchemes = allSchemes .filter { $0.testAction.map { !$0.targets.isEmpty } ?? false } @@ -309,6 +312,12 @@ final class TestService { // swiftlint:disable:this type_body_length return } + checkSkippedTargets( + for: allSchemes, + mapperEnvironment: mapperEnvironment, + graph: graph + ) + for testScheme in testSchemes { try await self.testScheme( scheme: testScheme, @@ -330,20 +339,100 @@ final class TestService { // swiftlint:disable:this type_body_length } } + try await storeSuccessfulTestHashes( + for: testSchemes, + graph: graph, + mapperEnvironment: mapperEnvironment, + cacheStorage: cacheStorage + ) + logger.log(level: .notice, "The project tests ran successfully", metadata: .success) + } + + // MARK: - Helpers - // Saving hashes from `testsCacheTemporaryDirectory` to `testsCacheDirectory` after all the tests have run successfully - let cacheableItems: [CacheStorableItem: [AbsolutePath]] = try FileHandler.shared - .contentsOfDirectory(testsCacheTemporaryDirectory.path) - .reduce(into: [:]) { acc, hash in - guard let name = try FileHandler.shared.contentsOfDirectory(hash).first else { return } - acc[CacheStorableItem(name: name.basename, hash: hash.basename)] = [AbsolutePath]() + private func checkSkippedTargets( + for schemes: [Scheme], + mapperEnvironment: MapperEnvironment, + graph: Graph + ) { + let testActionTargets = testActionTargets(for: schemes, graph: graph) + .map(\.target) + guard let initialGraph = mapperEnvironment.initialGraph else { return } + let initialSchemes = GraphTraverser(graph: initialGraph).schemes() + let initialTestTargets = self.testActionTargets( + for: initialSchemes + .filter { initialScheme in + schemes.contains(where: { $0.name == initialScheme.name }) + }, + graph: initialGraph + ) + let skippedTestTargets = initialTestTargets + .map(\.target) + .filter { target in + !testActionTargets.contains(where: { + $0.bundleId == target.bundleId + }) } + .map(\.name) + if !skippedTestTargets.isEmpty { + logger + .notice( + "The following targets have not changed since the last successful run and will be skipped: \(skippedTestTargets.joined(separator: ", "))" + ) + } + } - try await cacheStorage.store(cacheableItems, cacheCategory: .selectiveTests) + private func testActionTargets( + for schemes: [Scheme], + graph: Graph + ) -> [GraphTarget] { + return schemes.flatMap { $0.testAction?.targets.map(\.target) ?? [] } + .compactMap { + guard let project = graph.projects[$0.projectPath], + let target = project.targets[$0.name] + else { + return nil + } + return GraphTarget(path: project.path, target: target, project: project) + } } - // MARK: - Helpers + private func storeSuccessfulTestHashes( + for schemes: [Scheme], + graph: Graph, + mapperEnvironment: MapperEnvironment, + cacheStorage: CacheStoring + ) async throws { + let targets: [GraphTarget] = testActionTargets( + for: schemes, + graph: graph + ) + guard let initialGraph = mapperEnvironment.initialGraph else { return } + let graphTraverser = GraphTraverser(graph: initialGraph) + + let testedGraphTargets: [GraphTarget] = targets.compactMap { + guard let project = initialGraph.projects[$0.path], + let target = project.targets[$0.target.name] else { return nil } + return GraphTarget(path: $0.path, target: target, project: project) + } + try await fileHandler.inTemporaryDirectory { _ in + let allTestedTargets: Set = Set( + graphTraverser.allTargetDependencies(traversingFromTargets: testedGraphTargets) + .union(testedGraphTargets).map(\.target) + ) + let hashes = mapperEnvironment.testsCacheUntestedHashes.filter { element in + allTestedTargets.contains(where: { $0.bundleId == element.key.bundleId }) + } + + let cacheableItems: [CacheStorableItem: [AbsolutePath]] = hashes + .reduce(into: [:]) { acc, element in + acc[CacheStorableItem(name: element.key.name, hash: element.value)] = [AbsolutePath]() + } + + try await cacheStorage.store(cacheableItems, cacheCategory: .selectiveTests) + } + } /// - Returns: Result bundle path to use. Either passed by the user or a path in the Tuist cache private func resultBundlePath( diff --git a/Sources/TuistKit/Utils/ManifestGraphLoader.swift b/Sources/TuistKit/Utils/ManifestGraphLoader.swift index 9e0d27fc0f5..5c474de4ca6 100644 --- a/Sources/TuistKit/Utils/ManifestGraphLoader.swift +++ b/Sources/TuistKit/Utils/ManifestGraphLoader.swift @@ -1,4 +1,5 @@ import Foundation +import Mockable import Path import ProjectDescription import TuistCore @@ -16,10 +17,11 @@ import XcodeGraph /// - A graph is loaded from the models /// /// - Note: This is a simplified implementation that loads a graph without applying any mappers or running any linters +@Mockable public protocol ManifestGraphLoading { /// Loads a Workspace or Project Graph at a given path based on manifest availability /// - Note: This will search for a Workspace manifest first, then fallback to searching for a Project manifest - func load(path: AbsolutePath) async throws -> (Graph, [SideEffectDescriptor], [LintingIssue]) + func load(path: AbsolutePath) async throws -> (Graph, [SideEffectDescriptor], MapperEnvironment, [LintingIssue]) // swiftlint:disable:previous large_tuple } @@ -93,7 +95,7 @@ public final class ManifestGraphLoader: ManifestGraphLoading { } // swiftlint:disable:next function_body_length large_tuple - public func load(path: AbsolutePath) async throws -> (Graph, [SideEffectDescriptor], [LintingIssue]) { + public func load(path: AbsolutePath) async throws -> (Graph, [SideEffectDescriptor], MapperEnvironment, [LintingIssue]) { try manifestLoader.validateHasRootManifest(at: path) // Load Plugins @@ -172,11 +174,15 @@ public final class ManifestGraphLoader: ManifestGraphLoading { ) // Apply graph mappers - let (mappedGraph, graphMapperSideEffects) = try await graphMapper.map(graph: graph) + let (mappedGraph, graphMapperSideEffects, environment) = try await graphMapper.map( + graph: graph, + environment: MapperEnvironment() + ) return ( mappedGraph, modelMapperSideEffects + graphMapperSideEffects, + environment, lintingIssues ) } diff --git a/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift b/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift index c167fba980d..ffbef5a2eb4 100644 --- a/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift +++ b/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift @@ -1,6 +1,7 @@ import Path import TuistAcceptanceTesting import TuistSupport +import TuistSupportTesting import XCTest @testable import TuistKit diff --git a/Tests/TuistCoreTests/Graph/Mappers/GraphMapperTests.swift b/Tests/TuistCoreTests/Graph/Mappers/GraphMapperTests.swift index 146aa22051a..0b60da406b2 100644 --- a/Tests/TuistCoreTests/Graph/Mappers/GraphMapperTests.swift +++ b/Tests/TuistCoreTests/Graph/Mappers/GraphMapperTests.swift @@ -1,7 +1,6 @@ import Foundation import Path import TuistCore -import TuistCoreTesting import XcodeGraph import XCTest @@ -14,11 +13,11 @@ final class AnyGraphMapperTests: TuistUnitTestCase { let output = Graph.test(name: "output") let subject = AnyGraphMapper(mapper: { graph in XCTAssertEqual(graph.name, input.name) - return (output, []) + return (output, [], MapperEnvironment()) }) // When - let (got, _) = try subject.map(graph: input) + let (got, _, _) = try subject.map(graph: input, environment: MapperEnvironment()) // Then XCTAssertEqual(got.name, output.name) @@ -32,17 +31,17 @@ final class SequentialGraphMapperTests: TuistUnitTestCase { let input = Graph.test(name: "0") let first = AnyGraphMapper(mapper: { graph in XCTAssertEqual(graph.name, "0") - return (Graph.test(name: "1"), [firstSideEffect]) + return (Graph.test(name: "1"), [firstSideEffect], MapperEnvironment()) }) let secondSideEffect = SideEffectDescriptor.file(.init(path: "/second")) let second = AnyGraphMapper(mapper: { graph in XCTAssertEqual(graph.name, "1") - return (Graph.test(name: "2"), [secondSideEffect]) + return (Graph.test(name: "2"), [secondSideEffect], MapperEnvironment()) }) let subject = SequentialGraphMapper([first, second]) // When - let (got, sideEffects) = try await subject.map(graph: input) + let (got, sideEffects, _) = try await subject.map(graph: input, environment: MapperEnvironment()) // Then XCTAssertEqual(got.name, "2") diff --git a/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift index a02716138f0..9c56f8c53c2 100644 --- a/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/ExternalProjectsPlatformNarrowerGraphMapperTests.swift @@ -1,9 +1,10 @@ import Foundation +import TuistCore +import TuistSupportTesting import XcodeGraph import XCTest @testable import TuistDependencies -@testable import TuistSupportTesting final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase { var subject: ExternalProjectsPlatformNarrowerGraphMapper! @@ -47,7 +48,7 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase ) // When - let (mappedGraph, _) = try await subject.map(graph: graph) + let (mappedGraph, _, _) = try await subject.map(graph: graph, environment: MapperEnvironment()) // Then @@ -97,7 +98,7 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase ) // When - let (mappedGraph, _) = try await subject.map(graph: graph) + let (mappedGraph, _, _) = try await subject.map(graph: graph, environment: MapperEnvironment()) // Then @@ -158,7 +159,7 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase ) // When - let (mappedGraph, _) = try await subject.map(graph: graph) + let (mappedGraph, _, _) = try await subject.map(graph: graph, environment: MapperEnvironment()) // Then @@ -221,7 +222,7 @@ final class ExternalProjectsPlatformNarrowerGraphMapperTests: TuistUnitTestCase ) // When - let (mappedGraph, _) = try await subject.map(graph: graph) + let (mappedGraph, _, _) = try await subject.map(graph: graph, environment: MapperEnvironment()) // Then XCTAssertEqual( diff --git a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift index 5596ce249eb..a3d61d12787 100644 --- a/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift +++ b/Tests/TuistDependenciesTests/Mappers/PruneOrphanExternalTargetsGraphMapperTests.swift @@ -1,10 +1,11 @@ import Foundation import Path +import TuistCore +import TuistSupportTesting import XcodeGraph import XCTest @testable import TuistDependencies -@testable import TuistSupportTesting final class PruneOrphanExternalTargetsGraphMapperTests: TuistUnitTestCase { var subject: PruneOrphanExternalTargetsGraphMapper! @@ -66,7 +67,7 @@ final class PruneOrphanExternalTargetsGraphMapperTests: TuistUnitTestCase { ) // When - let (gotGraph, _) = try await subject.map(graph: graph) + let (gotGraph, _, _) = try await subject.map(graph: graph, environment: MapperEnvironment()) // Then diff --git a/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift index e573a08b001..abcbaa8dfd0 100644 --- a/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/LinkGeneratorTests.swift @@ -1,12 +1,13 @@ import Foundation +import MockableTest import Path import TuistCore +import TuistSupportTesting import XcodeGraph import XcodeProj import XCTest -@testable import TuistCoreTesting + @testable import TuistGenerator -@testable import TuistSupportTesting final class LinkGeneratorPathTests: TuistUnitTestCase { func test_xcodeValue() { @@ -78,8 +79,10 @@ final class LinkGeneratorTests: XCTestCase { )) let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedEmbeddableFrameworksResult = dependencies + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .embeddableFrameworks(path: .any, name: .any) + .willReturn(dependencies) // When try subject.generateEmbedPhase( @@ -127,8 +130,10 @@ final class LinkGeneratorTests: XCTestCase { let sourceRootPath = try AbsolutePath(validating: "/") let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedEmbeddableFrameworksResult = dependencies + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .embeddableFrameworks(path: .any, name: .any) + .willReturn(dependencies) // When try subject.generateEmbedPhase( @@ -180,8 +185,10 @@ final class LinkGeneratorTests: XCTestCase { outputPaths: ["output/A.framework"] )) let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedEmbeddableFrameworksResult = dependencies + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .embeddableFrameworks(path: .any, name: .any) + .willReturn(dependencies) // When try subject.generateEmbedPhase( @@ -224,8 +231,10 @@ final class LinkGeneratorTests: XCTestCase { outputPaths: ["output/A.framework"] )) let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedEmbeddableFrameworksResult = dependencies + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .embeddableFrameworks(path: .any, name: .any) + .willReturn(dependencies) // When try subject.generateEmbedPhase( @@ -256,8 +265,10 @@ final class LinkGeneratorTests: XCTestCase { let fileElements = ProjectFileElements() let sourceRootPath = try AbsolutePath(validating: "/") let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedEmbeddableFrameworksResult = dependencies + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .embeddableFrameworks(path: .any, name: .any) + .willReturn(dependencies) XCTAssertThrowsError(try subject.generateEmbedPhase( target: target, @@ -286,8 +297,10 @@ final class LinkGeneratorTests: XCTestCase { let fileAbsolutePath = try AbsolutePath(validating: "/Frameworks/Test.xcframework") let fileElements = createFileElements(fileAbsolutePath: fileAbsolutePath) let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedEmbeddableFrameworksResult = dependencies + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .embeddableFrameworks(path: .any, name: .any) + .willReturn(dependencies) // When try subject.generateEmbedPhase( @@ -321,8 +334,10 @@ final class LinkGeneratorTests: XCTestCase { xcodeprojElements.config.buildSettings["LD_RUNPATH_SEARCH_PATHS"] = "my/custom/path" let target = Target.test() let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedRunPathSearchPathsResult = Set(paths) + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .runPathSearchPaths(path: .any, name: .any) + .willReturn(Set(paths)) // When try subject.setupRunPathSearchPaths( @@ -361,8 +376,10 @@ final class LinkGeneratorTests: XCTestCase { xcodeprojElements.config.buildSettings["FRAMEWORK_SEARCH_PATHS"] = "my/custom/path" let target = Target.test() let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedSearchablePathDependenciesResult = Set(dependencies) + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .searchablePathDependencies(path: .any, name: .any) + .willReturn(Set(dependencies)) // When try subject.setupFrameworkSearchPath( target: target, @@ -402,8 +419,10 @@ final class LinkGeneratorTests: XCTestCase { let sourceRootPath = try AbsolutePath(validating: "/") let target = Target.test() let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedLibrariesPublicHeadersFoldersResult = Set(headersFolders) + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .librariesPublicHeadersFolders(path: .any, name: .any) + .willReturn(Set(headersFolders)) try subject.setupHeadersSearchPath( target: target, @@ -428,8 +447,10 @@ final class LinkGeneratorTests: XCTestCase { xcodeprojElements.config.buildSettings["HEADER_SEARCH_PATHS"] = "my/custom/path" let target = Target.test() let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedLibrariesPublicHeadersFoldersResult = Set(searchPaths) + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .librariesPublicHeadersFolders(path: .any, name: .any) + .willReturn(Set(searchPaths)) // When try subject.setupHeadersSearchPath( @@ -461,8 +482,10 @@ final class LinkGeneratorTests: XCTestCase { let xcodeprojElements = createXcodeprojElements() let target = Target.test() let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedLibrariesPublicHeadersFoldersResult = Set(searchPaths) + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .librariesPublicHeadersFolders(path: .any, name: .any) + .willReturn(Set(searchPaths)) // When try subject.setupHeadersSearchPath( @@ -490,8 +513,10 @@ final class LinkGeneratorTests: XCTestCase { let sourceRootPath = try AbsolutePath(validating: "/") let target = Target.test() let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedLibrariesPublicHeadersFoldersResult = Set(headersFolders) + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .librariesPublicHeadersFolders(path: .any, name: .any) + .willReturn(Set(headersFolders)) XCTAssertThrowsError(try subject.setupHeadersSearchPath( target: target, @@ -514,8 +539,10 @@ final class LinkGeneratorTests: XCTestCase { let xcodeprojElements = createXcodeprojElements() let target = Target.test() let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedLibrariesSearchPathsResult = Set(searchPaths) + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .librariesSearchPaths(path: .any, name: .any) + .willReturn(Set(searchPaths)) // When try subject.setupLibrarySearchPaths( @@ -539,8 +566,10 @@ final class LinkGeneratorTests: XCTestCase { let xcodeprojElements = createXcodeprojElements() let target = Target.test() let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedLibrariesSearchPathsResult = Set(searchPaths) + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .librariesSearchPaths(path: .any, name: .any) + .willReturn(Set(searchPaths)) // When try subject.setupLibrarySearchPaths( @@ -566,8 +595,10 @@ final class LinkGeneratorTests: XCTestCase { let xcodeprojElements = createXcodeprojElements() let target = Target.test() let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedLibrariesSwiftIncludePathsResult = Set(searchPaths) + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .librariesSwiftIncludePaths(path: .any, name: .any) + .willReturn(Set(searchPaths)) // When try subject.setupSwiftIncludePaths( @@ -591,8 +622,10 @@ final class LinkGeneratorTests: XCTestCase { let xcodeprojElements = createXcodeprojElements() let target = Target.test() let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedLibrariesSwiftIncludePathsResult = Set(searchPaths) + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .librariesSwiftIncludePaths(path: .any, name: .any) + .willReturn(Set(searchPaths)) // When try subject.setupSwiftIncludePaths( @@ -625,8 +658,10 @@ final class LinkGeneratorTests: XCTestCase { fileElements.products["Test"] = wakaFile fileElements.elements[try AbsolutePath(validating: "/test.framework")] = testFile let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedLinkableDependenciesResult = dependencies + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .linkableDependencies(path: .any, name: .any) + .willReturn(dependencies) try subject.generateLinkingPhase( target: target, @@ -663,8 +698,10 @@ final class LinkGeneratorTests: XCTestCase { fileElements.products["Test"] = wakaFile fileElements.elements[try AbsolutePath(validating: "/test.framework")] = testFile let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedLinkableDependenciesResult = dependencies + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .linkableDependencies(path: .any, name: .any) + .willReturn(dependencies) try subject.generateLinkingPhase( target: target, @@ -689,8 +726,10 @@ final class LinkGeneratorTests: XCTestCase { let (pbxTarget, target) = createTargets(product: .framework) let fileElements = ProjectFileElements() let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedLinkableDependenciesResult = dependencies + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .linkableDependencies(path: .any, name: .any) + .willReturn(dependencies) XCTAssertThrowsError(try subject.generateLinkingPhase( target: target, @@ -717,8 +756,10 @@ final class LinkGeneratorTests: XCTestCase { let (pbxTarget, target) = createTargets(product: .framework) let fileElements = ProjectFileElements() let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedLinkableDependenciesResult = dependencies + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .linkableDependencies(path: .any, name: .any) + .willReturn(dependencies) XCTAssertThrowsError(try subject.generateLinkingPhase( target: target, @@ -753,8 +794,10 @@ final class LinkGeneratorTests: XCTestCase { fileElements.compiled["/Strong/Foo.framework"] = requiredFile fileElements.compiled["/Weak/Bar.framework"] = optionalFile let path = try AbsolutePath(validating: "/path/") - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedLinkableDependenciesResult = dependencies + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .linkableDependencies(path: .any, name: .any) + .willReturn(dependencies) // When try subject.generateLinkingPhase( @@ -788,8 +831,10 @@ final class LinkGeneratorTests: XCTestCase { .insert(GraphDependencyReference.testProduct(target: "StaticDependency", productName: "libStaticDependency.a")) let staticDependency = Target.test(name: "StaticDependency", product: .staticLibrary) let target = Target.test() - let graphTraverser = MockGraphTraverser() - graphTraverser.stubbedCopyProductDependenciesResult = dependencies + let graphTraverser = MockGraphTraversing() + given(graphTraverser) + .copyProductDependencies(path: .any, name: .any) + .willReturn(dependencies) let fileElements = createProjectFileElements(for: [staticDependency]) let xcodeProjElements = createXcodeprojElements() diff --git a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift index 18479f91889..ba2cec079ec 100644 --- a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift @@ -3,20 +3,19 @@ import Path import struct TSCUtility.Version import TuistCore import TuistSupport +import TuistSupportTesting import XcodeGraph import XCTest -@testable import TuistCoreTesting @testable import TuistGenerator -@testable import TuistSupportTesting final class GraphLinterTests: TuistUnitTestCase { - var subject: GraphLinter! - var graphTraverser: MockGraphTraverser! + private var subject: GraphLinter! + private var graphTraverser: MockGraphTraversing! override func setUp() { super.setUp() - graphTraverser = MockGraphTraverser() + graphTraverser = .init() subject = GraphLinter( projectLinter: MockProjectLinter(), staticProductsLinter: MockStaticProductsGraphLinter() diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift index 080025c62f8..32ad0a6bb2e 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ExplicitDependencyGraphMapperTests.swift @@ -1,4 +1,5 @@ import Foundation +import TuistCore import TuistSupport import TuistSupportTesting import XcodeGraph @@ -77,7 +78,7 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { ) // When - let got = try await subject.map(graph: graph) + let got = try await subject.map(graph: graph, environment: MapperEnvironment()) let copyScript = """ if [[ -d "$FILE" && ! -d "$DESTINATION_FILE" ]]; then ln -s "$FILE" "$DESTINATION_FILE" @@ -285,7 +286,7 @@ final class ExplicitDependencyGraphMapperTests: TuistUnitTestCase { ) // When - let got = try await subject.map(graph: graph) + let got = try await subject.map(graph: graph, environment: MapperEnvironment()) // Then let gotAProject = try XCTUnwrap(got.0.projects[projectAPath]) diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift index d07c0244541..f6a9121e2fc 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ModuleMapMapperTests.swift @@ -70,7 +70,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { ) // When - let (gotGraph, gotSideEffects) = try subject.map( + let (gotGraph, gotSideEffects, _) = try subject.map( graph: .test( workspace: workspace, projects: [ @@ -85,7 +85,8 @@ final class ModuleMapMapperTests: TuistUnitTestCase { .target(name: targetB2.name, path: projectBPath), ], ] - ) + ), + environment: MapperEnvironment() ) // Then @@ -204,7 +205,7 @@ final class ModuleMapMapperTests: TuistUnitTestCase { ) // When - let (gotGraph, gotSideEffects) = try subject.map( + let (gotGraph, gotSideEffects, _) = try subject.map( graph: .test( workspace: workspace, projects: [ @@ -216,7 +217,8 @@ final class ModuleMapMapperTests: TuistUnitTestCase { .target(name: targetB.name, path: projectBPath), ], ] - ) + ), + environment: MapperEnvironment() ) // Then diff --git a/Tests/TuistKitIntegrationTests/Utils/ManifestGraphLoaderIntegrationTests.swift b/Tests/TuistKitIntegrationTests/Utils/ManifestGraphLoaderIntegrationTests.swift index b86ed61bd7f..bc073b442f8 100644 --- a/Tests/TuistKitIntegrationTests/Utils/ManifestGraphLoaderIntegrationTests.swift +++ b/Tests/TuistKitIntegrationTests/Utils/ManifestGraphLoaderIntegrationTests.swift @@ -36,7 +36,7 @@ final class ManifestGraphLoaderIntegrationTests: TuistTestCase { let path = try temporaryFixture("WorkspaceWithPlugins") // When - let (result, _, _) = try await subject.load(path: path) + let (result, _, _, _) = try await subject.load(path: path) // Then XCTAssertEqual(result.workspace.name, "Workspace") @@ -53,7 +53,7 @@ final class ManifestGraphLoaderIntegrationTests: TuistTestCase { .appending(component: "App") // When - let (result, _, _) = try await subject.load(path: path) + let (result, _, _, _) = try await subject.load(path: path) // Then XCTAssertEqual(result.workspace.name, "App") diff --git a/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift b/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift deleted file mode 100644 index 7412f32b8a4..00000000000 --- a/Tests/TuistKitTests/Generator/Mocks/MockGenerator.swift +++ /dev/null @@ -1,71 +0,0 @@ -import Foundation -import Path -import TuistCore -import TuistGenerator -import XcodeGraph -@testable import TuistKit - -final class MockGenerator: Generating { - enum MockError: Error { - case stubNotImplemented - } - - var generateCalls: [AbsolutePath] = [] - var generateStub: ((AbsolutePath) throws -> AbsolutePath)? - func generate(path: AbsolutePath) throws -> AbsolutePath { - guard let generateStub else { - throw MockError.stubNotImplemented - } - - generateCalls.append(path) - return try generateStub(path) - } - - var generateWithGraphCalls: [AbsolutePath] = [] - var generateWithGraphStub: ((AbsolutePath) throws -> (AbsolutePath, Graph))? - func generateWithGraph(path: AbsolutePath) throws -> (AbsolutePath, Graph) { - guard let generateWithGraphStub else { - throw MockError.stubNotImplemented - } - generateWithGraphCalls.append(path) - return try generateWithGraphStub(path) - } - - var invokedGenerateProjectWorkspace = false - var invokedGenerateProjectWorkspaceCount = 0 - var invokedGenerateProjectWorkspaceParameters: (path: AbsolutePath, Void)? - var invokedGenerateProjectWorkspaceParametersList = [(path: AbsolutePath, Void)]() - var stubbedGenerateProjectWorkspaceError: Error? - var stubbedGenerateProjectWorkspaceResult: (AbsolutePath, Graph)! - - func generateProjectWorkspace(path: AbsolutePath) throws -> (AbsolutePath, Graph) { - invokedGenerateProjectWorkspace = true - invokedGenerateProjectWorkspaceCount += 1 - invokedGenerateProjectWorkspaceParameters = (path, ()) - invokedGenerateProjectWorkspaceParametersList.append((path, ())) - if let error = stubbedGenerateProjectWorkspaceError { - throw error - } - return stubbedGenerateProjectWorkspaceResult - } - - var invokedLoadParameterPath: AbsolutePath? - var loadStub: ((AbsolutePath) throws -> Graph)? - func load(path: AbsolutePath) throws -> Graph { - invokedLoadParameterPath = path - if let loadStub { - return try loadStub(path) - } else { - return Graph.test() - } - } - - var loadProjectStub: ((AbsolutePath) throws -> (Project, Graph, [SideEffectDescriptor]))? - func loadProject(path: AbsolutePath) throws -> (Project, Graph, [SideEffectDescriptor]) { - if let loadProjectStub { - return try loadProjectStub(path) - } else { - return (Project.test(), Graph.test(), []) - } - } -} diff --git a/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift b/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift index 8b4a917958a..5a45bba7e26 100644 --- a/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift +++ b/Tests/TuistKitTests/Mappers/FocusTargetsGraphMappersTests.swift @@ -30,7 +30,7 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { ) // When - let (gotGraph, gotSideEffects) = try subject.map(graph: graph) + let (gotGraph, gotSideEffects, _) = try subject.map(graph: graph, environment: MapperEnvironment()) let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) // Then @@ -67,7 +67,7 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { ) // When - let (gotGraph, gotSideEffects) = try subject.map(graph: graph) + let (gotGraph, gotSideEffects, _) = try subject.map(graph: graph, environment: MapperEnvironment()) let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) let expectingTargets = [dTarget, eTarget] @@ -101,7 +101,7 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { ) // When - let (gotGraph, gotSideEffects) = try subject.map(graph: graph) + let (gotGraph, gotSideEffects, _) = try subject.map(graph: graph, environment: MapperEnvironment()) let expectingTargets = [bTarget, cTarget] let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) @@ -136,7 +136,7 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { ) // When - let (gotGraph, gotSideEffects) = try subject.map(graph: graph) + let (gotGraph, gotSideEffects, _) = try subject.map(graph: graph, environment: MapperEnvironment()) let expectingTargets = [cTarget] let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) @@ -175,7 +175,7 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { ) // When - let (gotGraph, gotSideEffects) = try subject.map(graph: graph) + let (gotGraph, gotSideEffects, _) = try subject.map(graph: graph, environment: MapperEnvironment()) let expectingTargets = [bTarget, cTarget, aTestTarget] let pruningTargets = gotGraph.projects.values.flatMap(\.targets.values).sorted().filter(\.prune) @@ -211,7 +211,7 @@ final class FocusTargetsGraphMappersTests: TuistUnitTestCase { // When XCTAssertThrowsSpecific( - try subject.map(graph: graph), + try subject.map(graph: graph, environment: MapperEnvironment()), FocusTargetsGraphMappersError.targetsNotFound(["bar"]) ) } diff --git a/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift b/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift index 8f666182a5c..0a608d044ca 100644 --- a/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift +++ b/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift @@ -36,7 +36,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { ) // When - let (gotGraph, gotSideEffects) = try subject.map(graph: graph) + let (gotGraph, gotSideEffects, _) = try subject.map(graph: graph, environment: MapperEnvironment()) // Then XCTAssertEmpty(gotSideEffects) @@ -59,7 +59,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { ) // When - let (gotGraph, gotValueSideEffects) = try subject.map(graph: graph) + let (gotGraph, gotValueSideEffects, _) = try subject.map(graph: graph, environment: MapperEnvironment()) // Then XCTAssertEmpty(gotValueSideEffects) @@ -86,7 +86,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { ) // When - let (gotGraph, gotSideEffects) = try subject.map(graph: graph) + let (gotGraph, gotSideEffects, _) = try subject.map(graph: graph, environment: MapperEnvironment()) // Then XCTAssertEmpty(gotSideEffects) @@ -113,7 +113,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { ) // When - let (gotGraph, gotSideEffects) = try subject.map(graph: graph) + let (gotGraph, gotSideEffects, _) = try subject.map(graph: graph, environment: MapperEnvironment()) // Then XCTAssertEmpty(gotSideEffects) @@ -152,7 +152,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { ) // When - let (gotGraph, _) = try subject.map(graph: graph) + let (gotGraph, _, _) = try subject.map(graph: graph, environment: MapperEnvironment()) // Then XCTAssertFalse(gotGraph.workspace.projects.contains(removedProjectPath)) @@ -181,7 +181,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { ) // When - let (gotGraph, _) = try subject.map(graph: graph) + let (gotGraph, _, _) = try subject.map(graph: graph, environment: MapperEnvironment()) // Then XCTAssertEmpty(gotGraph.workspace.schemes) @@ -227,7 +227,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { ) // When - let (gotGraph, _) = try subject.map(graph: graph) + let (gotGraph, _, _) = try subject.map(graph: graph, environment: MapperEnvironment()) // Then XCTAssertEqual(gotGraph, expectedGraph) @@ -250,7 +250,7 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { let expectedProject = Project.test(targets: [firstTarget, secondTarget, thirdTarget]) // When - let (gotGraph, _) = try subject.map(graph: graph) + let (gotGraph, _, _) = try subject.map(graph: graph, environment: MapperEnvironment()) // Then XCTAssertEqual(gotGraph.projects.first?.value, expectedProject) diff --git a/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift b/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift index 5ba7abcf2b7..214f6998c79 100644 --- a/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift +++ b/Tests/TuistKitTests/Mappers/Graph/UpdateWorkspaceProjectsGraphMapperTests.swift @@ -37,7 +37,7 @@ final class UpdateWorkspaceProjectsGraphMapperTests: TuistUnitTestCase { ) // When - let (gotGraph, gotSideEffects) = try subject.map(graph: graph) + let (gotGraph, gotSideEffects, _) = try subject.map(graph: graph, environment: MapperEnvironment()) // Then XCTAssertEmpty(gotSideEffects) diff --git a/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift b/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift deleted file mode 100644 index 216a1eb5026..00000000000 --- a/Tests/TuistKitTests/Mocks/MockManifestGraphLoader.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation -import Path -import TuistCore -import XcodeGraph -@testable import TuistKit - -final class MockManifestGraphLoader: ManifestGraphLoading { - var stubLoadGraph: Graph? - func load(path _: AbsolutePath) async throws -> (Graph, [SideEffectDescriptor], [LintingIssue]) { - (stubLoadGraph ?? .test(), [], []) - } -} diff --git a/Tests/TuistKitTests/Services/Cache/CachePrintHashesServiceTests.swift b/Tests/TuistKitTests/Services/Cache/CachePrintHashesServiceTests.swift index 3bb8248f7b0..5966315e86c 100644 --- a/Tests/TuistKitTests/Services/Cache/CachePrintHashesServiceTests.swift +++ b/Tests/TuistKitTests/Services/Cache/CachePrintHashesServiceTests.swift @@ -14,7 +14,7 @@ import XCTest final class CachePrintHashesServiceTests: TuistUnitTestCase { var subject: CachePrintHashesService! - var generator: MockGenerator! + var generator: MockGenerating! var generatorFactory: MockGeneratorFactorying! var cacheGraphContentHasher: MockCacheGraphContentHashing! var clock: Clock! @@ -25,7 +25,7 @@ final class CachePrintHashesServiceTests: TuistUnitTestCase { super.setUp() path = "/Test" generatorFactory = MockGeneratorFactorying() - generator = MockGenerator() + generator = .init() given(generatorFactory) .defaultGenerator(config: .any) .willReturn(generator) @@ -66,12 +66,17 @@ final class CachePrintHashesServiceTests: TuistUnitTestCase { given(cacheGraphContentHasher) .contentHashes(for: .any, configuration: .any, config: .any, excludedTargets: .any) .willReturn([:]) + given(generator) + .load(path: .any) + .willReturn(.test()) // When _ = try await subject.run(path: fullPath, configuration: nil) // Then - XCTAssertEqual(generator.invokedLoadParameterPath, try AbsolutePath(validating: fullPath)) + verify(generator) + .load(path: .value(try AbsolutePath(validating: fullPath))) + .called(1) } func test_run_withoutPath_loads_the_graph() async throws { @@ -85,12 +90,17 @@ final class CachePrintHashesServiceTests: TuistUnitTestCase { given(cacheGraphContentHasher) .contentHashes(for: .any, configuration: .any, config: .any, excludedTargets: .any) .willReturn([:]) + given(generator) + .load(path: .any) + .willReturn(.test()) // When _ = try await subject.run(path: nil, configuration: nil) // Then - XCTAssertEqual(generator.invokedLoadParameterPath, FileHandler.shared.currentPath) + verify(generator) + .load(path: .value(FileHandler.shared.currentPath)) + .called(1) } func test_run_withRelativePath__loads_the_graph() async throws { @@ -104,15 +114,17 @@ final class CachePrintHashesServiceTests: TuistUnitTestCase { given(cacheGraphContentHasher) .contentHashes(for: .any, configuration: .any, config: .any, excludedTargets: .any) .willReturn([:]) + given(generator) + .load(path: .any) + .willReturn(.test()) // When _ = try await subject.run(path: "RelativePath", configuration: nil) // Then - XCTAssertEqual( - generator.invokedLoadParameterPath, - try AbsolutePath(validating: "RelativePath", relativeTo: FileHandler.shared.currentPath) - ) + verify(generator) + .load(path: .value(try AbsolutePath(validating: "RelativePath", relativeTo: FileHandler.shared.currentPath))) + .called(1) } func test_run_loads_the_graph() async throws { @@ -126,12 +138,17 @@ final class CachePrintHashesServiceTests: TuistUnitTestCase { given(cacheGraphContentHasher) .contentHashes(for: .any, configuration: .any, config: .any, excludedTargets: .any) .willReturn([:]) + given(generator) + .load(path: .any) + .willReturn(.test()) // When _ = try await subject.run(path: path, configuration: nil) // Then - XCTAssertEqual(generator.invokedLoadParameterPath, "/Test") + verify(generator) + .load(path: .value(try AbsolutePath(validating: "/Test"))) + .called(1) } func test_run_content_hasher_gets_correct_graph() async throws { @@ -143,7 +160,9 @@ final class CachePrintHashesServiceTests: TuistUnitTestCase { configLoader: configLoader ) let graph = Graph.test() - generator.loadStub = { _ in graph } + given(generator) + .load(path: .any) + .willReturn(graph) given(cacheGraphContentHasher) .contentHashes(for: .value(graph), configuration: .any, config: .any, excludedTargets: .any) @@ -161,6 +180,10 @@ final class CachePrintHashesServiceTests: TuistUnitTestCase { .contentHashes(for: .any, configuration: .any, config: .any, excludedTargets: .any) .willReturn([target1: "hash1", target2: "hash2"]) + given(generator) + .load(path: .any) + .willReturn(.test()) + subject = CachePrintHashesService( generatorFactory: generatorFactory, cacheGraphContentHasher: cacheGraphContentHasher, @@ -182,6 +205,10 @@ final class CachePrintHashesServiceTests: TuistUnitTestCase { .contentHashes(for: .any, configuration: .value("Debug"), config: .any, excludedTargets: .any) .willReturn([:]) + given(generator) + .load(path: .any) + .willReturn(.test()) + // When / Then _ = try await subject.run(path: path, configuration: "Debug") } diff --git a/Tests/TuistKitTests/Services/GraphServiceTests.swift b/Tests/TuistKitTests/Services/GraphServiceTests.swift index 874712e22b7..60c0d3c50f9 100644 --- a/Tests/TuistKitTests/Services/GraphServiceTests.swift +++ b/Tests/TuistKitTests/Services/GraphServiceTests.swift @@ -1,8 +1,10 @@ import DOT import Foundation import GraphViz +import MockableTest import Path import ProjectAutomation +import TuistCore import TuistPlugin import TuistSupport import XcodeGraph @@ -15,14 +17,14 @@ import XCTest @testable import TuistSupportTesting final class GraphServiceTests: TuistUnitTestCase { - var manifestGraphLoader: MockManifestGraphLoader! + var manifestGraphLoader: MockManifestGraphLoading! var graphVizMapper: MockGraphToGraphVizMapper! var subject: GraphService! override func setUp() { super.setUp() graphVizMapper = MockGraphToGraphVizMapper() - manifestGraphLoader = MockManifestGraphLoader() + manifestGraphLoader = MockManifestGraphLoading() subject = GraphService( graphVizGenerator: graphVizMapper, @@ -47,6 +49,10 @@ final class GraphServiceTests: TuistUnitTestCase { try FileHandler.shared.touch(projectManifestPath) graphVizMapper.stubMap = Graph() + given(manifestGraphLoader) + .load(path: .any) + .willReturn((.test(), [], MapperEnvironment(), [])) + // When try await subject.run( format: .dot, @@ -78,6 +84,10 @@ final class GraphServiceTests: TuistUnitTestCase { try FileHandler.shared.touch(graphPath) try FileHandler.shared.touch(projectManifestPath) + given(manifestGraphLoader) + .load(path: .any) + .willReturn((.test(), [], MapperEnvironment(), [])) + // When try await subject.run( format: .json, diff --git a/Tests/TuistKitTests/Services/RunServiceTests.swift b/Tests/TuistKitTests/Services/RunServiceTests.swift index 01a8482b3ad..104bf7cec90 100644 --- a/Tests/TuistKitTests/Services/RunServiceTests.swift +++ b/Tests/TuistKitTests/Services/RunServiceTests.swift @@ -78,7 +78,7 @@ final class RunServiceTests: TuistUnitTestCase { // Given given(generator) .generateWithGraph(path: .any) - .willReturn((try AbsolutePath(validating: "/path/to/project.xcworkspace"), .test())) + .willReturn((try AbsolutePath(validating: "/path/to/project.xcworkspace"), .test(), MapperEnvironment())) given(buildGraphInspector) .workspacePath(directory: .any) .willReturn(try! AbsolutePath(validating: "/path/to/project.xcworkspace")) @@ -97,7 +97,7 @@ final class RunServiceTests: TuistUnitTestCase { let workspacePath = try temporaryPath().appending(component: "App.xcworkspace") given(generator) .generateWithGraph(path: .any) - .willReturn((workspacePath, .test())) + .willReturn((workspacePath, .test(), MapperEnvironment())) given(generator) .load(path: .any) .willReturn(.test()) diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index fc06be8385d..4cabf6f17e5 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -4,6 +4,7 @@ import Path import TuistAutomation import TuistCore import TuistLoader +import TuistServer import TuistSupport import XcodeGraph import XCTest @@ -24,7 +25,7 @@ final class TestServiceTests: TuistUnitTestCase { private var testsCacheTemporaryDirectory: TemporaryDirectory! private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! private var configLoader: MockConfigLoading! - private var automationStorage: MockAutomationStoring! + private var cacheStorage: MockCacheStoring! override func setUpWithError() throws { try super.setUpWithError() @@ -35,6 +36,18 @@ final class TestServiceTests: TuistUnitTestCase { contentHasher = .init() testsCacheTemporaryDirectory = try TemporaryDirectory(removeTreeOnDeinit: true) generatorFactory = .init() + + cacheStorage = .init() + + let cacheStorageFactory = MockCacheStorageFactorying() + given(cacheStorageFactory) + .cacheStorage(config: .any) + .willReturn(cacheStorage) + + given(cacheStorage) + .store(.any, cacheCategory: .any) + .willReturn() + let mockCacheDirectoriesProvider = MockCacheDirectoriesProviding() cacheDirectoriesProvider = mockCacheDirectoriesProvider let cacheDirectoryProviderFactory = MockCacheDirectoriesProviderFactoring() @@ -48,7 +61,6 @@ final class TestServiceTests: TuistUnitTestCase { .willReturn(runsCacheDirectory) configLoader = .init() - automationStorage = .init() given(contentHasher) .hash(Parameter.any) @@ -60,13 +72,13 @@ final class TestServiceTests: TuistUnitTestCase { subject = TestService( generatorFactory: generatorFactory, + cacheStorageFactory: cacheStorageFactory, xcodebuildController: xcodebuildController, buildGraphInspector: buildGraphInspector, simulatorController: simulatorController, contentHasher: contentHasher, cacheDirectoryProviderFactory: cacheDirectoryProviderFactory, - configLoader: configLoader, - automationStorage: automationStorage + configLoader: configLoader ) } @@ -78,7 +90,6 @@ final class TestServiceTests: TuistUnitTestCase { testsCacheTemporaryDirectory = nil generatorFactory = nil contentHasher = nil - automationStorage = nil subject = nil super.tearDown() } @@ -192,7 +203,7 @@ final class TestServiceTests: TuistUnitTestCase { let path = try temporaryPath() given(generator) .generateWithGraph(path: .value(path)) - .willReturn((path, .test())) + .willReturn((path, .test(), MapperEnvironment())) given(buildGraphInspector) .testableSchemes(graphTraverser: .any) .willReturn([]) @@ -239,7 +250,7 @@ final class TestServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willProduce { path in - (path, .test(workspace: .test(schemes: [.test(name: "TestScheme")]))) + (path, .test(workspace: .test(schemes: [.test(name: "TestScheme")])), MapperEnvironment()) } given(xcodebuildController) .test( @@ -296,7 +307,7 @@ final class TestServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willProduce { path in - (path, .test(workspace: .test(schemes: [.test(name: "TestScheme")]))) + (path, .test(workspace: .test(schemes: [.test(name: "TestScheme")])), MapperEnvironment()) } var testedSchemes: [String] = [] given(xcodebuildController) @@ -356,7 +367,7 @@ final class TestServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willProduce { path in - (path, .test()) + (path, .test(), MapperEnvironment()) } var testedSchemes: [String] = [] given(xcodebuildController) @@ -427,7 +438,11 @@ final class TestServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willProduce { path in - (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOne"), .test(name: "ProjectSchemeTwo")]))) + ( + path, + .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOne"), .test(name: "ProjectSchemeTwo")])), + MapperEnvironment() + ) } var testedSchemes: [String] = [] given(xcodebuildController) @@ -484,7 +499,11 @@ final class TestServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willProduce { path in - (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOne", testAction: .test(targets: []))]))) + ( + path, + .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOne", testAction: .test(targets: []))])), + MapperEnvironment() + ) } var testedSchemes: [String] = [] given(xcodebuildController) @@ -536,9 +555,6 @@ final class TestServiceTests: TuistUnitTestCase { given(buildGraphInspector) .workspaceSchemes(graphTraverser: .any) .willReturn([]) - given(automationStorage) - .initialGraph - .willReturn(nil) given(generator) .generateWithGraph(path: .any) .willProduce { path in @@ -548,7 +564,8 @@ final class TestServiceTests: TuistUnitTestCase { projects: [ try self.temporaryPath(): .test(schemes: [.test(name: "ProjectSchemeTwo")]), ] - ) + ), + MapperEnvironment() ) } @@ -577,24 +594,22 @@ final class TestServiceTests: TuistUnitTestCase { given(buildGraphInspector) .workspaceSchemes(graphTraverser: .any) .willReturn([]) - given(automationStorage) - .initialGraph - .willReturn( - .test( - workspace: .test( - schemes: [.test(name: "ProjectSchemeTwo", testAction: .test(targets: []))] - ), - projects: [ - try temporaryPath(): .test(schemes: [.test(name: "ProjectSchemeTwo")]), - ] - ) - ) + var environment = MapperEnvironment() + environment.initialGraph = .test( + workspace: .test( + schemes: [.test(name: "ProjectSchemeTwo", testAction: .test(targets: []))] + ), + projects: [ + try temporaryPath(): .test(schemes: [.test(name: "ProjectSchemeTwo")]), + ] + ) given(generator) .generateWithGraph(path: .any) .willProduce { path in ( path, - .test() + .test(), + environment ) } @@ -643,32 +658,311 @@ final class TestServiceTests: TuistUnitTestCase { .willProduce { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in testedSchemes.append(scheme) } - given(automationStorage) - .initialGraph - .willReturn( - .test( - projects: [ - try temporaryPath(): .test(schemes: [.test(name: "ProjectSchemeOne")]), + var environment = MapperEnvironment() + environment.initialGraph = .test( + projects: [ + try temporaryPath(): .test(schemes: [.test(name: "ProjectSchemeOne")]), + ] + ) + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + ( + path, + .test(), + environment + ) + } + + // When + try await subject.testRun( + schemeName: "ProjectSchemeOne", + path: try temporaryPath() + ) + + // Then + XCTAssertEmpty(testedSchemes) + XCTAssertStandardOutput(pattern: "The scheme ProjectSchemeOne's test action has no tests to run, finishing early.") + } + + func test_run_tests_when_part_is_cached() async throws { + // Given + givenGenerator() + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn([]) + + let projectPathOne = try temporaryPath().appending(component: "ProjectOne") + let schemeOne = Scheme.test( + name: "ProjectSchemeOne", + testAction: .test( + targets: [ + .test(target: TargetReference(projectPath: projectPathOne, name: "TargetA")), + ] + ) + ) + let schemeTwo = Scheme.test( + name: "ProjectSchemeTwo", + testAction: .test( + targets: [] + ) + ) + + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn([schemeOne, schemeTwo]) + given(buildGraphInspector) + .testableTarget( + scheme: .any, + testPlan: .any, + testTargets: .any, + skipTestTargets: .any, + graphTraverser: .any + ) + .willReturn(.test()) + var testedSchemes: [String] = [] + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in + testedSchemes.append(scheme) + } + var environment = MapperEnvironment() + environment.initialGraph = .test( + projects: [ + projectPathOne: .test( + path: projectPathOne, + targets: [ + .test(name: "TargetA", bundleId: "io.tuist.TargetA"), + .test(name: "TargetB", bundleId: "io.tuist.TargetB"), + .test(name: "TargetC", bundleId: "io.tuist.TargetC"), + ], + schemes: [ + .test( + name: "ProjectSchemeOne", + testAction: .test( + targets: [ + .test(target: TargetReference(projectPath: projectPathOne, name: "TargetA")), + .test(target: TargetReference(projectPath: projectPathOne, name: "TargetB")), + ] + ) + ), + .test( + name: "ProjectSchemeTwo", + testAction: .test( + targets: [ + .test(target: TargetReference(projectPath: projectPathOne, name: "TargetC")), + ] + ) + ), ] + ), + ] + ) + environment.testsCacheUntestedHashes = [ + .test(name: "TargetA", bundleId: "io.tuist.TargetA"): "hash-a", + ] + given(generator) + .generateWithGraph(path: .any) + .willProduce { path in + ( + path, + .test( + projects: [ + projectPathOne: .test( + path: projectPathOne, + targets: [ + .test(name: "TargetA"), + .test(name: "TargetB"), + ], + schemes: [schemeOne, schemeTwo] + ), + ] + ), + environment ) + } + + // When + try await subject.testRun( + path: try temporaryPath() + ) + + // Then + XCTAssertEqual(testedSchemes, ["ProjectSchemeOne"]) + XCTAssertStandardOutput( + pattern: "The following targets have not changed since the last successful run and will be skipped: TargetB, TargetC" + ) + verify(cacheStorage) + .store( + .value( + [ + CacheStorableItem(name: "TargetA", hash: "hash-a"): [], + ] + ), + cacheCategory: .value(.selectiveTests) + ) + .called(1) + } + + func test_run_tests_when_part_is_cached_and_scheme_is_passed() async throws { + // Given + givenGenerator() + given(configLoader) + .loadConfig(path: .any) + .willReturn(.default) + given(buildGraphInspector) + .testableSchemes(graphTraverser: .any) + .willReturn([]) + + let projectPathOne = try temporaryPath().appending(component: "ProjectOne") + let schemeOne = Scheme.test( + name: "ProjectSchemeOne", + testAction: .test( + targets: [ + .test(target: TargetReference(projectPath: projectPathOne, name: "TargetA")), + ] ) + ) + let schemeTwo = Scheme.test( + name: "ProjectSchemeTwo", + testAction: .test( + targets: [ + .test(target: TargetReference(projectPath: projectPathOne, name: "TargetD")), + ] + ) + ) + + given(buildGraphInspector) + .workspaceSchemes(graphTraverser: .any) + .willReturn([schemeOne, schemeTwo]) + given(buildGraphInspector) + .testableTarget( + scheme: .any, + testPlan: .any, + testTargets: .any, + skipTestTargets: .any, + graphTraverser: .any + ) + .willReturn(.test()) + var testedSchemes: [String] = [] + given(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .any, + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .willProduce { _, scheme, _, _, _, _, _, _, _, _, _, _, _ in + testedSchemes.append(scheme) + } + var environment = MapperEnvironment() + environment.initialGraph = .test( + projects: [ + projectPathOne: .test( + path: projectPathOne, + targets: [ + .test(name: "TargetA", bundleId: "io.tuist.TargetA"), + .test(name: "TargetB", bundleId: "io.tuist.TargetB"), + .test(name: "TargetC", bundleId: "io.tuist.TargetC"), + .test(name: "TargetD", bundleId: "io.tuist.TargetD"), + ], + schemes: [ + .test( + name: "ProjectSchemeOne", + testAction: .test( + targets: [ + .test(target: TargetReference(projectPath: projectPathOne, name: "TargetA")), + .test(target: TargetReference(projectPath: projectPathOne, name: "TargetB")), + ] + ) + ), + .test( + name: "ProjectSchemeTwo", + testAction: .test( + targets: [ + .test(target: TargetReference(projectPath: projectPathOne, name: "TargetC")), + .test(target: TargetReference(projectPath: projectPathOne, name: "TargetD")), + ] + ) + ), + ] + ), + ] + ) + environment.testsCacheUntestedHashes = [ + .test(name: "TargetA", bundleId: "io.tuist.TargetA"): "hash-a", + .test(name: "TargetD", bundleId: "io.tuist.TargetD"): "hash-d", + ] given(generator) .generateWithGraph(path: .any) .willProduce { path in ( path, - .test() + .test( + projects: [ + projectPathOne: .test( + path: projectPathOne, + targets: [ + .test(name: "TargetA"), + .test(name: "TargetB"), + .test(name: "TargetC"), + .test(name: "TargetD"), + ], + schemes: [schemeOne, schemeTwo] + ), + ] + ), + environment ) } // When try await subject.testRun( - schemeName: "ProjectSchemeOne", + schemeName: "ProjectSchemeTwo", path: try temporaryPath() ) // Then - XCTAssertEmpty(testedSchemes) + XCTAssertEqual(testedSchemes, ["ProjectSchemeTwo"]) + XCTAssertStandardOutput( + pattern: "The following targets have not changed since the last successful run and will be skipped: TargetC" + ) + verify(cacheStorage) + .store( + .value( + [ + CacheStorableItem(name: "TargetD", hash: "hash-d"): [], + ] + ), + cacheCategory: .value(.selectiveTests) + ) + .called(1) } func test_run_tests_with_skipped_targets() async throws { @@ -676,7 +970,6 @@ final class TestServiceTests: TuistUnitTestCase { given(generatorFactory) .testing( config: .any, - testsCacheDirectory: .any, testPlan: .any, includedTargets: .any, excludedTargets: .value([]), @@ -684,8 +977,7 @@ final class TestServiceTests: TuistUnitTestCase { configuration: .any, ignoreBinaryCache: .any, ignoreSelectiveTesting: .any, - cacheStorage: .any, - automationStorage: .any + cacheStorage: .any ) .willReturn(generator) given(configLoader) @@ -704,7 +996,7 @@ final class TestServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willProduce { path in - (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOneTests")]))) + (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOneTests")])), MapperEnvironment()) } given(buildGraphInspector) .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) @@ -734,7 +1026,7 @@ final class TestServiceTests: TuistUnitTestCase { try await subject.testRun( schemeName: "ProjectSchemeOneTests", path: try temporaryPath(), - skipTestTargets: [.init(target: "ProjectSchemeOnTests", class: "TestClass")] + skipTestTargets: [.init(target: "ProjectSchemeOneTests", class: "TestClass")] ) // Then @@ -757,7 +1049,7 @@ final class TestServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willProduce { path in - (path, .test()) + (path, .test(), MapperEnvironment()) } given(buildGraphInspector) .testableSchemes(graphTraverser: .any) @@ -826,7 +1118,7 @@ final class TestServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willProduce { path in - (path, .test()) + (path, .test(), MapperEnvironment()) } var testedSchemes: [String] = [] given(xcodebuildController) @@ -890,7 +1182,7 @@ final class TestServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willProduce { path in - (path, .test()) + (path, .test(), MapperEnvironment()) } given(buildGraphInspector) .workspaceSchemes(graphTraverser: .any) @@ -949,7 +1241,7 @@ final class TestServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willProduce { path in - (path, .test()) + (path, .test(), MapperEnvironment()) } given(buildGraphInspector) .workspaceSchemes(graphTraverser: .any) @@ -1021,7 +1313,7 @@ final class TestServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willProduce { path in - (path, .test(workspace: .test(schemes: [.test(name: "ProjectScheme2")]))) + (path, .test(workspace: .test(schemes: [.test(name: "ProjectScheme2")])), MapperEnvironment()) } given(buildGraphInspector) .workspaceSchemes(graphTraverser: .any) @@ -1075,7 +1367,7 @@ final class TestServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willProduce { path in - (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOne")]))) + (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOne")])), MapperEnvironment()) } given(buildGraphInspector) .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) @@ -1136,7 +1428,7 @@ final class TestServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willProduce { path in - (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOne")]))) + (path, .test(workspace: .test(schemes: [.test(name: "ProjectSchemeOne")])), MapperEnvironment()) } given(buildGraphInspector) .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) @@ -1226,7 +1518,8 @@ final class TestServiceTests: TuistUnitTestCase { ), ] ) - ) + ), + MapperEnvironment() ) } var testedSchemes: [String] = [] @@ -1295,7 +1588,7 @@ final class TestServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willProduce { path in - (path, .test(workspace: .test(schemes: [.test(name: "TestScheme")]))) + (path, .test(workspace: .test(schemes: [.test(name: "TestScheme")])), MapperEnvironment()) } given(xcodebuildController) .test( @@ -1336,7 +1629,6 @@ final class TestServiceTests: TuistUnitTestCase { given(generatorFactory) .testing( config: .any, - testsCacheDirectory: .any, testPlan: .any, includedTargets: .any, excludedTargets: .any, @@ -1344,8 +1636,7 @@ final class TestServiceTests: TuistUnitTestCase { configuration: .any, ignoreBinaryCache: .any, ignoreSelectiveTesting: .any, - cacheStorage: .any, - automationStorage: .any + cacheStorage: .any ) .willReturn(generator) } From 4d0b8fa3045513f1776e29a85391759a0868857c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 30 Jul 2024 13:08:19 +0200 Subject: [PATCH 469/509] Update XcodeGraph to 0.8.0 (#6574) * Update XcodeGraph to 0.8.0 * run lint * Fix AutogeneratedSchemesProjectMapperTests --- Package.resolved | 6 +++--- Package.swift | 2 +- .../TuistKit/ProjectEditor/ProjectEditorMapper.swift | 2 ++ .../Project+ManifestMapper.swift | 1 + .../XCFrameworkMetadataProviderTests.swift | 12 ++++++++++++ .../MultipleConfigurationsIntegrationTests.swift | 1 + .../Generator/TestModelGenerator.swift | 1 + .../Generator/ProjectFileElementsTests.swift | 2 +- .../Generator/ProjectGroupsTests.swift | 1 + .../AutogeneratedSchemesProjectMapperTests.swift | 5 +++-- .../Project+ManifestMapperTests.swift | 1 + 11 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Package.resolved b/Package.resolved index 719f1b1d5c4..b2d67bf1837 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "496eb66a0f55545cb22bd11061994855c9e90bcb349dd79631b5f47e38e955a3", + "originHash" : "6fdbad66e96883b1e14d41ffecc35d4e27d22f9fdeb34d816fd7c61093fb5a49", "pins" : [ { "identity" : "aexml", @@ -276,8 +276,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/tuist/XcodeGraph.git", "state" : { - "revision" : "0e44220403553ce7f20a79e49873b492302b4650", - "version" : "0.5.0" + "revision" : "174f7881822100bf6781720c30086df0b8b5f859", + "version" : "0.8.1" } }, { diff --git a/Package.swift b/Package.swift index 91d2b8926ba..fd3121b0faa 100644 --- a/Package.swift +++ b/Package.swift @@ -466,7 +466,7 @@ let package = Package( .package(url: "https://github.com/tuist/swift-openapi-runtime", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/swift-openapi-urlsession", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/Path", .upToNextMajor(from: "0.3.0")), - .package(url: "https://github.com/tuist/XcodeGraph.git", .exact("0.5.0")), + .package(url: "https://github.com/tuist/XcodeGraph.git", .exact("0.8.1")), .package(url: "https://github.com/tuist/FileSystem.git", .upToNextMajor(from: "0.2.0")), ], targets: targets diff --git a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift index 125cabb882a..24dd48d0752 100644 --- a/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift +++ b/Sources/TuistKit/ProjectEditor/ProjectEditorMapper.swift @@ -335,6 +335,7 @@ final class ProjectEditorMapper: ProjectEditorMapping { xcodeProjPath: destinationDirectory.appending(component: "\(projectName).xcodeproj"), name: projectName, organizationName: nil, + classPrefix: nil, defaultKnownRegions: nil, developmentRegion: nil, options: .init( @@ -426,6 +427,7 @@ final class ProjectEditorMapper: ProjectEditorMapping { xcodeProjPath: destinationDirectory.appending(component: "\(projectName).xcodeproj"), name: projectName, organizationName: nil, + classPrefix: nil, defaultKnownRegions: nil, developmentRegion: nil, options: .init( diff --git a/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift index 2290fbc7891..fad70585416 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift @@ -58,6 +58,7 @@ extension XcodeGraph.Project { xcodeProjPath: generatorPaths.manifestDirectory.appending(component: "\(xcodeProjectName).xcodeproj"), name: name, organizationName: organizationName, + classPrefix: nil, defaultKnownRegions: defaultKnownRegions, developmentRegion: developmentRegion, options: options, diff --git a/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift index 145f8af6266..b91350101fb 100644 --- a/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift @@ -28,12 +28,14 @@ final class XCFrameworkMetadataProviderTests: TuistTestCase { identifier: "ios-x86_64-simulator", path: try RelativePath(validating: "MyFramework.framework"), mergeable: false, + platform: .iOS, architectures: [.x8664] ), .init( identifier: "ios-arm64", path: try RelativePath(validating: "MyFramework.framework"), mergeable: false, + platform: .iOS, architectures: [.arm64] ), ]) @@ -79,12 +81,14 @@ final class XCFrameworkMetadataProviderTests: TuistTestCase { identifier: "ios-x86_64-simulator", path: try RelativePath(validating: "libMyStaticLibrary.a"), mergeable: false, + platform: .iOS, architectures: [.x8664] ), .init( identifier: "ios-arm64", path: try RelativePath(validating: "libMyStaticLibrary.a"), mergeable: false, + platform: .iOS, architectures: [.arm64] ), ]) @@ -117,12 +121,14 @@ final class XCFrameworkMetadataProviderTests: TuistTestCase { identifier: "ios-x86_64-simulator", path: try RelativePath(validating: "MyFramework.framework"), mergeable: false, + platform: .iOS, architectures: [.x8664] ), .init( identifier: "ios-arm64", path: try RelativePath(validating: "MyFramework.framework"), mergeable: false, + platform: .iOS, architectures: [.arm64] ), ]) @@ -153,12 +159,14 @@ final class XCFrameworkMetadataProviderTests: TuistTestCase { identifier: "ios-x86_64-simulator", path: try RelativePath(validating: "MyMergeableFramework.framework"), mergeable: true, + platform: .iOS, architectures: [.x8664] ), .init( identifier: "ios-arm64", path: try RelativePath(validating: "MyMergeableFramework.framework"), mergeable: true, + platform: .iOS, architectures: [.arm64] ), ]) @@ -189,12 +197,14 @@ final class XCFrameworkMetadataProviderTests: TuistTestCase { identifier: "ios-x86_64-simulator", path: try RelativePath(validating: "libMyStaticLibrary.a"), mergeable: false, + platform: .iOS, architectures: [.x8664] ), .init( identifier: "ios-arm64", path: try RelativePath(validating: "libMyStaticLibrary.a"), mergeable: false, + platform: .iOS, architectures: [.arm64] ), ]) @@ -224,12 +234,14 @@ final class XCFrameworkMetadataProviderTests: TuistTestCase { identifier: "ios-x86_64-simulator", // Not present on disk path: try RelativePath(validating: "MyFrameworkMissingArch.framework"), mergeable: false, + platform: .iOS, architectures: [.x8664] ), .init( identifier: "ios-arm64", path: try RelativePath(validating: "MyFrameworkMissingArch.framework"), mergeable: false, + platform: .iOS, architectures: [.arm64] ), ]) diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift index 609be2085f6..cccb2505914 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift @@ -416,6 +416,7 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { xcodeProjPath: path.appending(component: "App.xcodeproj"), name: "App", organizationName: nil, + classPrefix: nil, defaultKnownRegions: nil, developmentRegion: nil, options: .test(), diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift b/Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift index 87d670f05ab..4d96b04dc94 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/TestModelGenerator.swift @@ -152,6 +152,7 @@ final class TestModelGenerator { xcodeProjPath: path.appending(component: "App.xcodeproj"), name: name, organizationName: nil, + classPrefix: nil, defaultKnownRegions: nil, developmentRegion: nil, options: .test(), diff --git a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift index c51234e0bc8..de128a6e404 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectFileElementsTests.swift @@ -870,7 +870,7 @@ final class ProjectFileElementsTests: TuistUnitTestCase { ) let groups = ProjectGroups.generate(project: project, pbxproj: pbxproj) - let frameworkPath = try cacheDirectoriesProvider.cacheDirectory().appending(component: "Test.framework") + let frameworkPath = cacheDirectoriesProvider.cacheDirectory().appending(component: "Test.framework") let binaryPath = frameworkPath.appending(component: "Test") let frameworkDependency = GraphDependencyReference.framework( diff --git a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift index edec22b6eb3..39717098017 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectGroupsTests.swift @@ -26,6 +26,7 @@ final class ProjectGroupsTests: XCTestCase { xcodeProjPath: path.appending(component: "Project.xcodeproj"), name: "Project", organizationName: nil, + classPrefix: nil, defaultKnownRegions: nil, developmentRegion: nil, options: .test(), diff --git a/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift index f3a2f52dd63..d3877c90b45 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/AutogeneratedSchemesProjectMapperTests.swift @@ -232,7 +232,7 @@ final class AutogeneratedSchemesProjectMapperTests: TuistUnitTestCase { ), ] - XCTAssertEqual(got.schemes, expected) + XCTAssertBetterEqual(got.schemes, expected) } func test_grouping_notGrouped() throws { @@ -1489,7 +1489,8 @@ final class AutogeneratedSchemesProjectMapperTests: TuistUnitTestCase { RunAction.test( executable: TargetReference(projectPath: projectPath, name: $0), arguments: runActionArguments, - options: runActionOptions ?? .init() + options: runActionOptions ?? .init(), + metalOptions: nil ) } ) diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift index 73a075ddcf2..e6b60c6a1d4 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift @@ -61,6 +61,7 @@ final class ProjectManifestMapperTests: TuistUnitTestCase { xcodeProjPath: "/XcodeName.xcodeproj", name: "Name", organizationName: "Organization", + classPrefix: nil, defaultKnownRegions: ["en-US", "Base"], developmentRegion: "us", options: .init( From 22c37f32b05e171daa6ff5345c6c6aebe8619eeb Mon Sep 17 00:00:00 2001 From: fortmarek Date: Tue, 30 Jul 2024 13:27:09 +0200 Subject: [PATCH 470/509] Update release date --- .../Client/ServerClientCLIMetadataHeadersMiddleware.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift b/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift index 06fb11e9e2e..1c6236b646d 100644 --- a/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift +++ b/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift @@ -5,7 +5,7 @@ import TuistSupport /// This middleware includes the release date of the CLI in the headers so that we can show /// warnings if the on-premise installation is too old. struct ServerClientCLIMetadataHeadersMiddleware: ClientMiddleware { - let releaseDate = "2024.07.19" + let releaseDate = "2024.07.30" func intercept( _ request: Request, From b4f4ef0d6fd43e9937f983eb94f3f70425626858 Mon Sep 17 00:00:00 2001 From: Tuist Date: Tue, 30 Jul 2024 13:11:00 +0000 Subject: [PATCH 471/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.22.0 --- .mise.toml | 2 +- CHANGELOG.md | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index 49cd7141615..df2052d0358 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.21.2" +tuist = "4.22.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index cd91050403c..78c66c5e4ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,30 @@ # Changelog +## 4.22.0 - 2024-07-30 + +### Tuist + +#### Changed + +- Update generated code templates to add `Sendable` Conformance [#6540](https://github.com/tuist/tuist/pull/6540) by [@waltflanagan](https://github.com/waltflanagan) +- Improve the help menu by grouping the flat list of commands and add `tuist project view` command [#6566](https://github.com/tuist/tuist/pull/6566) by [@pepicrft](https://github.com/pepicrft) + +#### Added + +- Validate target references in custom workspace schemes [#6536](https://github.com/tuist/tuist/pull/6536) by [@ajkolean](https://github.com/ajkolean) +- Support unit test depending on an app extension [#6561](https://github.com/tuist/tuist/pull/6561) by [@InderKumarRathore](https://github.com/InderKumarRathore) + +#### Fixed + +- Fix integrating external static frameworks with resource bundles [#6565](https://github.com/tuist/tuist/pull/6565) by [@fortmarek](https://github.com/fortmarek) +- Default to staticLibrary in product type mapping if automatic product type exists [#6559](https://github.com/tuist/tuist/pull/6559) by [@Arideno](https://github.com/Arideno) +- Fix the Homebrew installation instructions in the docs [#6571](https://github.com/tuist/tuist/pull/6571) by [@pepicrft](https://github.com/pepicrft) +- Fix storing test results of non-tested schemes [#6572](https://github.com/tuist/tuist/pull/6572) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +- no changes + ## 4.21.2 - 2024-07-19 ### Tuist From bd8e8dd82379c9c7f71261240746cc2fb9936da3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Tue, 30 Jul 2024 17:36:04 +0200 Subject: [PATCH 472/509] Fix clean being printed twice in --help (#6580) --- Sources/TuistKit/Commands/TuistCommand.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index 95be8105e0c..2b4812909a1 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -21,19 +21,18 @@ public struct TuistCommand: AsyncParsableCommand { ]), CommandGroup(name: "Develop", subcommands: [ BuildCommand.self, + CacheCommand.self, CleanCommand.self, DumpCommand.self, EditCommand.self, - InstallCommand.self, GenerateCommand.self, GraphCommand.self, + InstallCommand.self, MigrationCommand.self, PluginCommand.self, RunCommand.self, ScaffoldCommand.self, TestCommand.self, - CleanCommand.self, - CacheCommand.self, ]), CommandGroup(name: "Account", subcommands: [ ProjectCommand.self, From bc51502fddcebee8960a3c0c94497969348c3484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 31 Jul 2024 12:10:34 +0200 Subject: [PATCH 473/509] Generate SPM Objective-C resource accessor only when a bundle is generated (#6584) --- .../Mappers/ResourcesProjectMapper.swift | 3 ++- .../ResourcesProjectMapperTests.swift | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift index a11e5ea5d29..17e8d88ae98 100644 --- a/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift +++ b/Sources/TuistGenerator/Mappers/ResourcesProjectMapper.swift @@ -84,7 +84,8 @@ public class ResourcesProjectMapper: ProjectMapping { // swiftlint:disable:this if project.isExternal, target.supportsSources, target.sources.containsObjcFiles, - target.resources.containsBundleAccessedResources + target.resources.containsBundleAccessedResources, + !target.supportsResources { let (headerFilePath, headerData) = synthesizedObjcHeaderFile(bundleName: bundleName, target: target, project: project) diff --git a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift index 98912856020..ca4be38bcd2 100644 --- a/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift +++ b/Tests/TuistGeneratorTests/ProjectMappers/ResourcesProjectMapperTests.swift @@ -86,6 +86,20 @@ final class ResourcesProjectMapperTests: TuistUnitTestCase { ]) } + func test_map_when_an_external_objc_target_that_has_resources_and_supports_them() throws { + // Given + let resources: [ResourceFileElement] = [.file(path: "/image.png")] + let target = Target.test(product: .framework, sources: ["/Absolute/File.m"], resources: .init(resources)) + project = Project.test(targets: [target], isExternal: true) + + // Got + let (gotProject, gotSideEffects) = try subject.map(project: project) + + // Then + XCTAssertEmpty(gotSideEffects) + XCTAssertEqual(project, gotProject) + } + func testMap_whenDisableBundleAccessorsIsTrue_doesNotGenerateAccessors() throws { // Given let resources: [ResourceFileElement] = [.file(path: "/image.png")] From 4b185bad18b56c3871bdb84b95bb393a4c3b0bd4 Mon Sep 17 00:00:00 2001 From: Kai Oelfke Date: Thu, 1 Aug 2024 21:58:58 +0900 Subject: [PATCH 474/509] Feature/deduplicate symbolically linked resources (#6538) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Conform ResourceFileElement to Hashable and unique resources * exclude already included resource paths from default resource path candidates * add test for package with explicit resources and default resources * Update Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift Co-authored-by: Marek Fořt * use closure filter instead of directory filter * mise run lint-fix * Fix: only remove glob, if applicable Previously this took the parent directory Foo for Foo/resource.json but we should only exclude Foo/resource.json as default resource as there’s maybe more resources that should be default resources in Foo. * Add files(in) without filter to FileHandling protocol Default implementation is in protocol extension to pass nil as filter argument. --------- Co-authored-by: Marek Fořt --- .../ResourceFileElement.swift | 2 +- .../PackageInfoMapper.swift | 33 ++++++++-- Sources/TuistSupport/Utils/FileHandler.swift | 36 +++++++++-- .../TestCase/TuistTestCase.swift | 12 +++- .../WorkspaceStructureGeneratorTests.swift | 7 +- .../PackageInfoMapperTests.swift | 64 ++++++++++++++++++- 6 files changed, 138 insertions(+), 16 deletions(-) diff --git a/Sources/ProjectDescription/ResourceFileElement.swift b/Sources/ProjectDescription/ResourceFileElement.swift index 0cac8ab5820..5f10bb2b3ef 100644 --- a/Sources/ProjectDescription/ResourceFileElement.swift +++ b/Sources/ProjectDescription/ResourceFileElement.swift @@ -7,7 +7,7 @@ import Foundation /// /// Note: For convenience, an element can be represented as a string literal /// `"some/pattern/**"` is the equivalent of `ResourceFileElement.glob(pattern: "some/pattern/**")` -public enum ResourceFileElement: Codable, Equatable, Sendable { +public enum ResourceFileElement: Codable, Equatable, Sendable, Hashable { /// A glob pattern of files to include and ODR tags case glob(pattern: Path, excluding: [Path] = [], tags: [String] = [], inclusionCondition: PlatformCondition? = nil) diff --git a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift index 9adae32fc7a..15af3e61d69 100644 --- a/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift +++ b/Sources/TuistLoader/SwiftPackageManager/PackageInfoMapper.swift @@ -844,14 +844,29 @@ extension ProjectDescription.ResourceFileElements { // Add default resources path if necessary // They are handled like a `.process` rule if sources == nil { - resourceFileElements += try defaultResourcePaths(from: path) - .compactMap { try handleProcessResource(resourceAbsolutePath: $0) } + // Already included resources should not be added as default resource + let excludedPaths: Set = Set( + resourceFileElements.map { + switch $0 { + case let .folderReference(path: path, _, _): + AbsolutePath(stringLiteral: path.pathString) + case let .glob(pattern: path, _, _, _): + AbsolutePath(stringLiteral: path.pathString).upToLastNonGlob + } + } + ) + resourceFileElements += try defaultResourcePaths(from: path) { candidateURL in + let candidatePath = AbsolutePath(stringLiteral: candidateURL.path) + let candidateNotInExcludedDirectory = excludedPaths.allSatisfy { !$0.isAncestorOfOrEqual(to: candidatePath) } + return candidateNotInExcludedDirectory + } + .compactMap { try handleProcessResource(resourceAbsolutePath: $0) } } // Check for empty resource files guard !resourceFileElements.isEmpty else { return nil } - return .resources(resourceFileElements) + return .resources(resourceFileElements.uniqued()) } // These files are automatically added as resource if they are inside targets directory. @@ -865,8 +880,16 @@ extension ProjectDescription.ResourceFileElements { "strings", ]) - private static func defaultResourcePaths(from path: AbsolutePath) -> [AbsolutePath] { - Array(FileHandler.shared.files(in: path, nameFilter: nil, extensionFilter: defaultSpmResourceFileExtensions)) + private static func defaultResourcePaths( + from path: AbsolutePath, + filter: @escaping (Foundation.URL) -> Bool + ) -> [AbsolutePath] { + Array(FileHandler.shared.files( + in: path, + filter: filter, + nameFilter: nil, + extensionFilter: defaultSpmResourceFileExtensions + )) } } diff --git a/Sources/TuistSupport/Utils/FileHandler.swift b/Sources/TuistSupport/Utils/FileHandler.swift index 2caa9e587ca..5e5b8337f3d 100644 --- a/Sources/TuistSupport/Utils/FileHandler.swift +++ b/Sources/TuistSupport/Utils/FileHandler.swift @@ -66,7 +66,17 @@ public protocol FileHandling: AnyObject { func write(_ content: String, path: Path.AbsolutePath, atomically: Bool) throws func locateDirectoryTraversingParents(from: Path.AbsolutePath, path: String) -> Path.AbsolutePath? func locateDirectory(_ path: String, traversingFrom from: Path.AbsolutePath) throws -> Path.AbsolutePath? - func files(in path: Path.AbsolutePath, nameFilter: Set?, extensionFilter: Set?) -> Set + func files( + in path: Path.AbsolutePath, + filter: ((URL) -> Bool)?, + nameFilter: Set?, + extensionFilter: Set? + ) -> Set + func files( + in path: Path.AbsolutePath, + nameFilter: Set?, + extensionFilter: Set? + ) -> Set func glob(_ path: Path.AbsolutePath, glob: String) -> [Path.AbsolutePath] func throwingGlob(_ path: Path.AbsolutePath, glob: String) throws -> [Path.AbsolutePath] func linkFile(atPath: Path.AbsolutePath, toPath: Path.AbsolutePath) throws @@ -84,6 +94,16 @@ public protocol FileHandling: AnyObject { func unzipItem(at sourcePath: Path.AbsolutePath, to destinationPath: Path.AbsolutePath) throws } +extension FileHandling { + public func files( + in path: Path.AbsolutePath, + nameFilter: Set?, + extensionFilter: Set? + ) -> Set { + files(in: path, filter: nil, nameFilter: nameFilter, extensionFilter: extensionFilter) + } +} + public class FileHandler: FileHandling { // MARK: - Attributes @@ -238,6 +258,7 @@ public class FileHandler: FileHandling { public func files( in path: Path.AbsolutePath, + filter: ((URL) -> Bool)?, nameFilter: Set?, extensionFilter: Set? ) -> Set { @@ -249,14 +270,19 @@ public class FileHandler: FileHandling { options: [.skipsHiddenFiles, .skipsPackageDescendants] ) - func filter(candidateURL: URL) -> Bool { + func filterCandidate(with url: URL) -> Bool { if let extensionFilter { - guard extensionFilter.contains(candidateURL.pathExtension) else { + guard extensionFilter.contains(url.pathExtension) else { return false } } if let nameFilter { - guard nameFilter.contains(candidateURL.lastPathComponent) else { + guard nameFilter.contains(url.lastPathComponent) else { + return false + } + } + if let filter { + guard filter(url) else { return false } } @@ -264,7 +290,7 @@ public class FileHandler: FileHandling { } while let candidateURL = enumerator?.nextObject() as? Foundation.URL { - guard filter(candidateURL: candidateURL) else { + guard filterCandidate(with: candidateURL) else { continue } // Symlinks need to be resolved for resulting absolute URLs to point to the right place. diff --git a/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift b/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift index 02f2462da7f..07e0a26d806 100644 --- a/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift +++ b/Sources/TuistSupportTesting/TestCase/TuistTestCase.swift @@ -91,16 +91,22 @@ public final class MockFileHandler: FileHandler { try closure(temporaryDirectory()) } - public var stubFiles: ((AbsolutePath, Set?, Set?) -> Set)? + public var stubFiles: ((AbsolutePath, ((URL) -> Bool)?, Set?, Set?) -> Set)? override public func files( in path: AbsolutePath, + filter: ((URL) -> Bool)?, nameFilter: Set?, extensionFilter: Set? ) -> Set { guard let stubFiles else { - return super.files(in: path, nameFilter: nameFilter, extensionFilter: extensionFilter) + return super.files( + in: path, + filter: filter, + nameFilter: nameFilter, + extensionFilter: extensionFilter + ) } - return stubFiles(path, nameFilter, extensionFilter) + return stubFiles(path, filter, nameFilter, extensionFilter) } public var stubGlob: ((AbsolutePath, String) -> [AbsolutePath])? diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift index fb297be002b..27221b29f7f 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceStructureGeneratorTests.swift @@ -388,7 +388,12 @@ final class WorkspaceStructureGeneratorTests: XCTestCase { func inTemporaryDirectory(_: @escaping (AbsolutePath) async throws -> Void) async throws {} - func files(in _: AbsolutePath, nameFilter _: Set?, extensionFilter _: Set?) -> Set { + func files( + in _: AbsolutePath, + filter _: ((URL) -> Bool)?, + nameFilter _: Set?, + extensionFilter _: Set? + ) -> Set { [] } diff --git a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift index 466927f1186..8e37373cb62 100644 --- a/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift +++ b/Tests/TuistLoaderTests/SwiftPackageManager/PackageInfoMapperTests.swift @@ -1073,12 +1073,74 @@ final class PackageInfoMapperTests: TuistUnitTestCase { ) } + func testMap_whenHasAlreadyIncludedDefaultResources() throws { + let basePath = try temporaryPath() + let sourcesPath = basePath.appending(try RelativePath(validating: "Package/Sources/Target1")) + let resourcesPath = sourcesPath.appending(try RelativePath(validating: "Resources")) + let defaultResourcePath = resourcesPath.appending(try RelativePath(validating: "file.xib")) + try fileHandler.createFolder(sourcesPath) + fileHandler.stubFiles = { _, excludedPaths, _, _ in + if excludedPaths == nil { + [defaultResourcePath] + } else { + [] + } + } + fileHandler.stubExists = { path in + [basePath, sourcesPath, resourcesPath, defaultResourcePath].contains(path) + } + + let project = try subject.map( + package: "Package", + basePath: basePath, + packageInfos: [ + "Package": .init( + name: "Package", + products: [ + .init(name: "Product1", type: .library(.automatic), targets: ["Target1"]), + ], + targets: [ + .test( + name: "Target1", + resources: [ + .init(rule: .process, path: "Resources"), + ] + ), + ], + platforms: [.ios], + cLanguageStandard: nil, + cxxLanguageStandard: nil, + swiftLanguageVersions: nil + ), + ] + ) + XCTAssertBetterEqual( + project, + .testWithDefaultConfigs( + name: "Package", + targets: [ + .test( + "Target1", + basePath: basePath, + resources: [ + .glob( + pattern: .path(resourcesPath.appending(component: "**").pathString), + excluding: [], + tags: [] + ), + ] + ), + ] + ) + ) + } + func testMap_whenHasDefaultResources() throws { let basePath = try temporaryPath() let sourcesPath = basePath.appending(try RelativePath(validating: "Package/Sources/Target1")) let defaultResourcePath = sourcesPath.appending(try RelativePath(validating: "Resources/file.xib")) try fileHandler.createFolder(sourcesPath) - fileHandler.stubFiles = { _, _, _ in + fileHandler.stubFiles = { _, _, _, _ in return [defaultResourcePath] } From 79e9671a81e0036f1748c60733ba61526b79234f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Fri, 2 Aug 2024 12:17:47 +0200 Subject: [PATCH 475/509] Create tuist share command (#6527) * Create tuist share command * Fix warning in Package.swift * Rename app builds to previews * Move App.xcodeproj from xcode_app fixture * Address PR feedback * Run lint * Clean logger in tearDown * Use unique simulators for ShareAcceptanceTests * Preboot device before installing and launching app * Use distinct simulators * Comment out test_share_multiplatform_app_with_extension * Comment out test_share_ios_app_with_frameworks instead of test_share_multiplatform_app_with_extension * Remove multiplatform share acceptance tests due to it being flaky --- ...cloud-openapi-code => server-openapi-code} | 2 +- Package.swift | 4 +- .../ServerAcceptanceTestCase.swift | 7 +- .../TuistAcceptanceFixtures.swift | 3 + .../TuistAcceptanceTestCase.swift | 20 +- .../TuistAutomation/Utilities/AppBundle.swift | 133 ++ .../Utilities/AppBundleLoader.swift | 70 + .../TuistAutomation/Utilities/AppRunner.swift | 142 ++ .../Simulator/SimulatorController.swift | 37 +- .../TuistCore/Simulator/SimulatorDevice.swift | 2 +- .../Simulator/SimulatorDeviceAndRuntime.swift | 6 +- .../XcodeProjectBuildDirectoryLocator.swift | 2 + .../Simulator/MockSimulatorController.swift | 61 - .../Simulator/SimulatorDevice+TestData.swift | 3 +- .../SimulatorDeviceAndRuntime+TestData.swift | 2 +- .../Simulator/SimulatorRuntime+TestData.swift | 3 +- ...ockXcodeProjectBuildDirectoryLocator.swift | 25 - .../Generator/ProjectFileElements.swift | 2 +- Sources/TuistKit/Commands/EnvKey/EnvKey.swift | 9 + Sources/TuistKit/Commands/InitCommand.swift | 4 +- Sources/TuistKit/Commands/RunCommand.swift | 31 +- Sources/TuistKit/Commands/ShareCommand.swift | 58 + Sources/TuistKit/Commands/TuistCommand.swift | 65 +- Sources/TuistKit/Services/RunService.swift | 179 ++- Sources/TuistKit/Services/ShareService.swift | 269 ++++ .../Loaders/CachedManifestLoader.swift | 4 + .../TuistLoader/Loaders/ManifestLoader.swift | 13 +- .../TuistServer/Models/PreviewUpload.swift | 6 + Sources/TuistServer/OpenAPI/Client.swift | 400 +++++ Sources/TuistServer/OpenAPI/Types.swift | 1358 +++++++++++++++-- .../OpenAPI/{cloud.yml => server.yml} | 348 ++++- .../Services/DownloadPreviewService.swift | 95 ++ ...ltipartUploadCompletePreviewsService.swift | 117 ++ ...partUploadGenerateURLPreviewsService.swift | 107 ++ .../MultipartUploadStartPreviewsService.swift | 95 ++ .../Services/PreviewsUploadService.swift | 92 ++ .../Services/RevokeProjectTokenService.swift | 10 +- .../Utilities/RemoteArtifactDownloader.swift | 78 + Sources/TuistSupport/UserInputReader.swift | 48 + Tests/Fixtures/App.app/App | Bin 0 -> 77472 bytes Tests/Fixtures/App.app/Info.plist | Bin 0 -> 1144 bytes Tests/Fixtures/App.app/PkgInfo | 1 + .../PlugIns/WidgetExtension.appex/Info.plist | Bin 0 -> 854 bytes .../WidgetExtension.appex/WidgetExtension | Bin 0 -> 139568 bytes .../_CodeSignature/CodeResources | 101 ++ .../App.app/Watch/WatchApp.app/Info.plist | Bin 0 -> 987 bytes .../App.app/Watch/WatchApp.app/PkgInfo | 1 + .../App.app/Watch/WatchApp.app/WatchApp | Bin 0 -> 193712 bytes .../WatchApp.app/_CodeSignature/CodeResources | 105 ++ .../App.app/_CodeSignature/CodeResources | 183 +++ Tests/Fixtures/Info.plist | Bin 90 -> 0 bytes .../BuildAcceptanceTests.swift | 24 +- .../TestAcceptanceTests.swift | 6 +- .../Utilities/AppBundleLoaderTests.swift | 72 + .../Utilities/AppRunnerTests.swift | 447 ++++++ .../Utilities/BuildGraphInspectorTests.swift | 162 +- .../Utilities/TargetBuilderTests.swift | 172 ++- .../Utilities/TargetRunnerTests.swift | 184 ++- .../XcodeBuildControllerTests.swift | 72 +- .../DependenciesAcceptanceTests.swift | 6 +- .../GenerateAcceptanceTests.swift | 94 +- .../BuildRulesAcceptanceTests.swift | 2 +- .../CacheAcceptanceTests.swift | 2 +- .../EditAcceptanceTests.swift | 10 +- .../GraphAcceptanceTests.swift | 2 +- .../ListTargetsAcceptanceTests.swift | 2 +- .../PluginAcceptanceTests.swift | 4 +- .../PrecompiledAcceptanceTests.swift | 10 +- .../RunAcceptanceTests.swift | 2 +- .../ScaffoldAcceptanceTests.swift | 16 +- .../ServerAcceptanceTests.swift | 14 + .../ShareAcceptanceTests.swift | 89 ++ .../CommandEnvironmentVariableTests.swift | 4 +- .../Services/GraphServiceTests.swift | 2 +- .../Services/RunServiceTests.swift | 218 ++- .../Services/ShareServiceTests.swift | 540 +++++++ .../Services/TestServiceTests.swift | 34 +- .../Loaders/ManifestLoaderTests.swift | 85 ++ .../Services/PreviewsUploadServiceTests.swift | 106 ++ .../Utils/UserInputReaderTests.swift | 72 +- Tuist/ProjectDescriptionHelpers/Module.swift | 2 +- .../App/App.entitlements | 10 + .../Tuist/Config.swift | 8 +- fixtures/xcode_app/.gitignore | 1 + .../xcode_app/App.xcodeproj/project.pbxproj | 368 +++++ fixtures/xcode_app/App/App.entitlements | 10 + fixtures/xcode_app/App/App.swift | 10 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 63 + .../App/Assets.xcassets/Contents.json | 6 + fixtures/xcode_app/App/ContentView.swift | 17 + .../Preview Assets.xcassets/Contents.json | 6 + fixtures/xcode_app/README.md | 3 + fixtures/xcode_app/Tuist/Config.swift | 9 + 94 files changed, 6629 insertions(+), 649 deletions(-) rename .mise/tasks/workspace/generate/{cloud-openapi-code => server-openapi-code} (95%) create mode 100644 Sources/TuistAutomation/Utilities/AppBundle.swift create mode 100644 Sources/TuistAutomation/Utilities/AppBundleLoader.swift create mode 100644 Sources/TuistAutomation/Utilities/AppRunner.swift delete mode 100644 Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift delete mode 100644 Sources/TuistCoreTesting/Utils/MockXcodeProjectBuildDirectoryLocator.swift create mode 100644 Sources/TuistKit/Commands/ShareCommand.swift create mode 100644 Sources/TuistKit/Services/ShareService.swift create mode 100644 Sources/TuistServer/Models/PreviewUpload.swift rename Sources/TuistServer/OpenAPI/{cloud.yml => server.yml} (85%) create mode 100644 Sources/TuistServer/Services/DownloadPreviewService.swift create mode 100644 Sources/TuistServer/Services/MultipartUploadCompletePreviewsService.swift create mode 100644 Sources/TuistServer/Services/MultipartUploadGenerateURLPreviewsService.swift create mode 100644 Sources/TuistServer/Services/MultipartUploadStartPreviewsService.swift create mode 100644 Sources/TuistServer/Services/PreviewsUploadService.swift create mode 100644 Sources/TuistServer/Utilities/RemoteArtifactDownloader.swift create mode 100755 Tests/Fixtures/App.app/App create mode 100644 Tests/Fixtures/App.app/Info.plist create mode 100644 Tests/Fixtures/App.app/PkgInfo create mode 100644 Tests/Fixtures/App.app/PlugIns/WidgetExtension.appex/Info.plist create mode 100755 Tests/Fixtures/App.app/PlugIns/WidgetExtension.appex/WidgetExtension create mode 100644 Tests/Fixtures/App.app/PlugIns/WidgetExtension.appex/_CodeSignature/CodeResources create mode 100644 Tests/Fixtures/App.app/Watch/WatchApp.app/Info.plist create mode 100644 Tests/Fixtures/App.app/Watch/WatchApp.app/PkgInfo create mode 100755 Tests/Fixtures/App.app/Watch/WatchApp.app/WatchApp create mode 100644 Tests/Fixtures/App.app/Watch/WatchApp.app/_CodeSignature/CodeResources create mode 100644 Tests/Fixtures/App.app/_CodeSignature/CodeResources delete mode 100644 Tests/Fixtures/Info.plist create mode 100644 Tests/TuistAutomationTests/Utilities/AppBundleLoaderTests.swift create mode 100644 Tests/TuistAutomationTests/Utilities/AppRunnerTests.swift create mode 100644 Tests/TuistKitAcceptanceTests/ShareAcceptanceTests.swift create mode 100644 Tests/TuistKitTests/Services/ShareServiceTests.swift create mode 100644 Tests/TuistServerTests/Services/PreviewsUploadServiceTests.swift create mode 100644 fixtures/ios_app_with_frameworks/App/App.entitlements create mode 100644 fixtures/xcode_app/.gitignore create mode 100644 fixtures/xcode_app/App.xcodeproj/project.pbxproj create mode 100644 fixtures/xcode_app/App/App.entitlements create mode 100644 fixtures/xcode_app/App/App.swift create mode 100644 fixtures/xcode_app/App/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 fixtures/xcode_app/App/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 fixtures/xcode_app/App/Assets.xcassets/Contents.json create mode 100644 fixtures/xcode_app/App/ContentView.swift create mode 100644 fixtures/xcode_app/App/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 fixtures/xcode_app/README.md create mode 100644 fixtures/xcode_app/Tuist/Config.swift diff --git a/.mise/tasks/workspace/generate/cloud-openapi-code b/.mise/tasks/workspace/generate/server-openapi-code similarity index 95% rename from .mise/tasks/workspace/generate/cloud-openapi-code rename to .mise/tasks/workspace/generate/server-openapi-code index 06ed38b4e1d..2a1fabf4bc9 100755 --- a/.mise/tasks/workspace/generate/cloud-openapi-code +++ b/.mise/tasks/workspace/generate/server-openapi-code @@ -3,4 +3,4 @@ set -euo pipefail -mint run apple/swift-openapi-generator@0.1.5 generate --mode types --mode client --output-directory $MISE_PROJECT_ROOT/Sources/TuistServer/OpenAPI $MISE_PROJECT_ROOT/Sources/TuistServer/OpenAPI/cloud.yml +mint run apple/swift-openapi-generator@0.1.5 generate --mode types --mode client --output-directory $MISE_PROJECT_ROOT/Sources/TuistServer/OpenAPI $MISE_PROJECT_ROOT/Sources/TuistServer/OpenAPI/server.yml diff --git a/Package.swift b/Package.swift index fd3121b0faa..2451c79b2c3 100644 --- a/Package.swift +++ b/Package.swift @@ -301,7 +301,7 @@ var targets: [Target] = [ .product(name: "OpenAPIRuntime", package: "swift-openapi-runtime"), .product(name: "OpenAPIURLSession", package: "swift-openapi-urlsession"), ], - exclude: ["OpenAPI/cloud.yml"], + exclude: ["OpenAPI/server.yml"], swiftSettings: [ .define("MOCKING", .when(configuration: .debug)), ] @@ -466,7 +466,7 @@ let package = Package( .package(url: "https://github.com/tuist/swift-openapi-runtime", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/swift-openapi-urlsession", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/Path", .upToNextMajor(from: "0.3.0")), - .package(url: "https://github.com/tuist/XcodeGraph.git", .exact("0.8.1")), + .package(url: "https://github.com/tuist/XcodeGraph.git", exact: "0.8.1"), .package(url: "https://github.com/tuist/FileSystem.git", .upToNextMajor(from: "0.2.0")), ], targets: targets diff --git a/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift b/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift index b360b458eeb..70d0b26b764 100644 --- a/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift +++ b/Sources/TuistAcceptanceTesting/ServerAcceptanceTestCase.swift @@ -1,5 +1,6 @@ import Foundation import TuistSupport +import TuistSupportTesting import XCTest @testable import TuistKit @@ -9,9 +10,8 @@ open class ServerAcceptanceTestCase: TuistAcceptanceTestCase { public var organizationHandle: String = "" public var projectHandle: String = "" - override open func setUp() async throws { - try await super.setUp() - try setUpFixture(.iosAppWithFrameworks) + override public func setUpFixture(_ fixture: TuistAcceptanceFixtures) async throws { + try await super.setUpFixture(fixture) organizationHandle = String(UUID().uuidString.prefix(12).lowercased()) projectHandle = String(UUID().uuidString.prefix(12).lowercased()) fullHandle = "\(organizationHandle)/\(projectHandle)" @@ -38,6 +38,7 @@ open class ServerAcceptanceTestCase: TuistAcceptanceTestCase { try await run(ProjectDeleteCommand.self, fullHandle) try await run(OrganizationDeleteCommand.self, organizationHandle) try await run(LogoutCommand.self) + TestingLogHandler.reset() try await super.tearDown() } } diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift index c09ef980521..724c3443ee7 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift @@ -73,6 +73,7 @@ public enum TuistAcceptanceFixtures { case visionosApp case workspaceWithFileHeaderTemplate case workspaceWithInlineFileHeaderTemplate + case xcodeApp case custom(String) public var path: String { @@ -221,6 +222,8 @@ public enum TuistAcceptanceFixtures { return "workspace_with_file_header_template" case .workspaceWithInlineFileHeaderTemplate: return "workspace_with_inline_file_header_template" + case .xcodeApp: + return "xcode_app" case let .custom(path): return path } diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift index ab20190d136..9c7d068aa1c 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceTestCase.swift @@ -59,7 +59,7 @@ open class TuistAcceptanceTestCase: XCTestCase { try await super.tearDown() } - public func setUpFixture(_ fixture: TuistAcceptanceFixtures) throws { + public func setUpFixture(_ fixture: TuistAcceptanceFixtures) async throws { let fixturesPath = sourceRootPath .appending(component: "fixtures") @@ -149,6 +149,22 @@ open class TuistAcceptanceTestCase: XCTestCase { } public func run(_ command: BuildCommand.Type, _ arguments: [String] = []) async throws { + let terminatorIndex = arguments.firstIndex(of: "--") ?? arguments.endIndex + let regularArguments = arguments.prefix(upTo: terminatorIndex) + let arguments = regularArguments + [ + "--derived-data-path", derivedDataPath.pathString, + "--path", fixturePath.pathString, + ] + arguments.suffix(from: terminatorIndex) + + let parsedCommand = try command.parse(Array(arguments)) + try await parsedCommand.run() + } + + public func run(_ command: BuildCommand.Type, _ arguments: String...) async throws { + try await run(command, arguments) + } + + public func run(_ command: ShareCommand.Type, _ arguments: [String] = []) async throws { let arguments = [ "--derived-data-path", derivedDataPath.pathString, "--path", fixturePath.pathString, @@ -158,7 +174,7 @@ open class TuistAcceptanceTestCase: XCTestCase { try await parsedCommand.run() } - public func run(_ command: BuildCommand.Type, _ arguments: String...) async throws { + public func run(_ command: ShareCommand.Type, _ arguments: String...) async throws { try await run(command, arguments) } diff --git a/Sources/TuistAutomation/Utilities/AppBundle.swift b/Sources/TuistAutomation/Utilities/AppBundle.swift new file mode 100644 index 00000000000..714683e54dc --- /dev/null +++ b/Sources/TuistAutomation/Utilities/AppBundle.swift @@ -0,0 +1,133 @@ +import Path +import TuistSupport +import XcodeGraph + +public struct AppBundle: Equatable { + /// Path to the app bundle + public let path: AbsolutePath + + /// The app's Info.plist + public let infoPlist: InfoPlist + + enum InfoPlistError: FatalError { + case unknownPlatform(platform: String, app: String) + + var description: String { + switch self { + case let .unknownPlatform(platform: platform, app: app): + return "The \(app)'s supported platform \(platform) is unknown." + } + } + + var type: ErrorType { + switch self { + case .unknownPlatform: + return .abort + } + } + } + + public struct InfoPlist: Codable, Equatable { + /// App version number (e.g. 10.3) + public let version: Version + + /// Name of the app + public let name: String + + /// Bundle ID + public let bundleId: String + + /// Minimum OS version + public let minimumOSVersion: Version + + /// Supported simulator platforms. + /// Device is currently not supported. + public let supportedPlatforms: [SupportedPlatform] + + init( + version: Version, + name: String, + bundleId: String, + minimumOSVersion: Version, + supportedPlatforms: [SupportedPlatform] + ) { + self.version = version + self.name = name + self.bundleId = bundleId + self.minimumOSVersion = minimumOSVersion + self.supportedPlatforms = supportedPlatforms + } + + public enum SupportedPlatform: Codable, Equatable { + case simulator(Platform) + case device(Platform) + } + + enum CodingKeys: String, CodingKey { + case version = "CFBundleShortVersionString" + case name = "CFBundleName" + case bundleId = "CFBundleIdentifier" + case minimumOSVersion = "MinimumOSVersion" + case supportedPlatforms = "CFBundleSupportedPlatforms" + } + + public init(from decoder: any Decoder) throws { + let container: KeyedDecodingContainer = try decoder + .container(keyedBy: AppBundle.InfoPlist.CodingKeys.self) + version = Version( + stringLiteral: try container.decode(String.self, forKey: AppBundle.InfoPlist.CodingKeys.version) + ) + let name = try container.decode(String.self, forKey: AppBundle.InfoPlist.CodingKeys.name) + self.name = name + bundleId = try container.decode(String.self, forKey: AppBundle.InfoPlist.CodingKeys.bundleId) + minimumOSVersion = Version( + stringLiteral: try container.decode(String.self, forKey: AppBundle.InfoPlist.CodingKeys.minimumOSVersion) + ) + supportedPlatforms = try container.decode([String].self, forKey: AppBundle.InfoPlist.CodingKeys.supportedPlatforms) + .map { platformSDK in + if let platform = Platform(commandLineValue: platformSDK) { + return .device(platform) + } else if let platform = Platform.allCases + .first(where: { platformSDK.lowercased() == $0.xcodeSimulatorSDK }) + { + return .simulator(platform) + } else { + throw InfoPlistError.unknownPlatform(platform: platformSDK, app: name) + } + } + } + } +} + +#if DEBUG + extension AppBundle { + public static func test( + path: AbsolutePath = try! AbsolutePath(validating: "/App.app"), // swiftlint:disable:this force_try + infoPlist: InfoPlist = .test() + ) -> Self { + .init( + path: path, + infoPlist: infoPlist + ) + } + } + + extension AppBundle.InfoPlist { + public static func test( + version: Version = Version("1.0"), + name: String = "App", + bundleId: String = "io.tuist.App", + minimumOSVersion: Version = Version("17.4"), + supportedPlatforms: [SupportedPlatform] = [.simulator(.iOS)] + ) -> Self { + .init( + version: version, + name: name, + bundleId: bundleId, + minimumOSVersion: minimumOSVersion, + supportedPlatforms: supportedPlatforms + ) + } + } + +#endif diff --git a/Sources/TuistAutomation/Utilities/AppBundleLoader.swift b/Sources/TuistAutomation/Utilities/AppBundleLoader.swift new file mode 100644 index 00000000000..9281d1d9fd0 --- /dev/null +++ b/Sources/TuistAutomation/Utilities/AppBundleLoader.swift @@ -0,0 +1,70 @@ +import FileSystem +import Foundation +import Mockable +import Path +import TuistSupport + +enum AppBundleLoaderError: FatalError, Equatable { + case missingInfoPlist(AbsolutePath) + case failedDecodingInfoPlist(AbsolutePath, String) + + var description: String { + switch self { + case let .missingInfoPlist(path): + return "Expected Info.plist at \(path) was not found. Make sure it exists." + case let .failedDecodingInfoPlist(path, reason): + return "Failed decoding Info.plist at \(path) due to: \(reason)" + } + } + + var type: ErrorType { + switch self { + case .missingInfoPlist, .failedDecodingInfoPlist: + return .abort + } + } +} + +@Mockable +public protocol AppBundleLoading { + func load(_ appBundle: AbsolutePath) async throws -> AppBundle +} + +public struct AppBundleLoader: AppBundleLoading { + private let fileSystem: FileSysteming + + public init() { + self.init( + fileSystem: FileSystem() + ) + } + + init( + fileSystem: FileSysteming + ) { + self.fileSystem = fileSystem + } + + public func load(_ appBundle: AbsolutePath) async throws -> AppBundle { + let infoPlistPath = appBundle.appending(component: "Info.plist") + + if try await !fileSystem.exists(infoPlistPath) { + throw AppBundleLoaderError.missingInfoPlist(infoPlistPath) + } + + let data = try Data(contentsOf: infoPlistPath.url) + let decoder = PropertyListDecoder() + + let infoPlist: AppBundle.InfoPlist + do { + infoPlist = try decoder.decode(AppBundle.InfoPlist.self, from: data) + } catch { + throw AppBundleLoaderError.failedDecodingInfoPlist(infoPlistPath, error.localizedDescription) + } + + return AppBundle( + path: appBundle, + infoPlist: infoPlist + ) + } +} diff --git a/Sources/TuistAutomation/Utilities/AppRunner.swift b/Sources/TuistAutomation/Utilities/AppRunner.swift new file mode 100644 index 00000000000..64f4f959b00 --- /dev/null +++ b/Sources/TuistAutomation/Utilities/AppRunner.swift @@ -0,0 +1,142 @@ +import FileSystem +import Foundation +import Mockable +import Path +import struct TSCUtility.Version +import TuistCore +import TuistSupport +import XcodeGraph + +enum AppRunnerError: FatalError, Equatable { + case invalidSimulatorPlatform(String) + case selectedPlatformNotFound(String) + + var description: String { + switch self { + case let .invalidSimulatorPlatform(platform): + "The chosen simulator's platform \(platform) is invalid" + case let .selectedPlatformNotFound(platform): + "No app bundle for the selected platform \(platform) was found." + } + } + + var type: ErrorType { + switch self { + case .invalidSimulatorPlatform: + return .abort + case .selectedPlatformNotFound: + return .bug + } + } +} + +@Mockable +public protocol AppRunning { + func runApp( + _ appBundles: [AppBundle], + version: Version?, + device: String? + ) async throws +} + +public final class AppRunner: AppRunning { + private let simulatorController: SimulatorControlling + private let userInputReader: UserInputReading + + public convenience init() { + self.init( + simulatorController: SimulatorController(), + userInputReader: UserInputReader() + ) + } + + init( + simulatorController: SimulatorControlling, + userInputReader: UserInputReading + ) { + self.simulatorController = simulatorController + self.userInputReader = userInputReader + } + + public func runApp( + _ appBundles: [AppBundle], + version: Version?, + device: String? + ) async throws { + let simulatorPlatforms: [Platform] = appBundles + .map(\.infoPlist) + .flatMap(\.supportedPlatforms) + .compactMap { + switch $0 { + case .device: + return nil + case let .simulator(platform): + return platform + } + } + + let platformsWithVersions: [Platform: Version] = appBundles.reduce([:]) { acc, appBundle in + var acc = acc + for supportedPlatform in appBundle.infoPlist.supportedPlatforms { + switch supportedPlatform { + case .device: + continue + case let .simulator(platform): + if let minimumVersion = acc[platform] { + acc[platform] = min( + minimumVersion, + Version(appBundle.infoPlist.minimumOSVersion) + ) + } else { + acc[platform] = Version(appBundle.infoPlist.minimumOSVersion) + } + } + } + return acc + } + + let devices = try await simulatorPlatforms.concurrentMap { platform in + try await self.simulatorController.findAvailableDevices( + platform: platform, + version: version, + minVersion: platformsWithVersions[platform], + deviceName: device + ) + } + .flatMap { $0 } + + let simulator: SimulatorDeviceAndRuntime + let bootedDevices = devices.filter { !$0.device.isShutdown } + if bootedDevices.count == 1, let bootedDevice = bootedDevices.first { + simulator = bootedDevice + } else { + simulator = try userInputReader.readValue( + asking: "Select the simulator device where you want to run the app:", + values: devices, + valueDescription: { "\($0.device.name) (\($0.device.udid))" } + ) + } + + guard let platformName = simulator.runtime.name + .components(separatedBy: " ").first, + let simulatorPlatform = Platform(commandLineValue: platformName) + else { throw AppRunnerError.invalidSimulatorPlatform(simulator.runtime.name) } + + guard let appBundle = appBundles.first(where: { + $0.infoPlist.supportedPlatforms.contains(.simulator(simulatorPlatform)) + }) + else { throw AppRunnerError.selectedPlatformNotFound(simulatorPlatform.caseValue) } + + logger.notice("Installing and launching \(appBundle.infoPlist.name) on \(simulator.device.name)") + let device = try simulatorController.booted(device: simulator.device) + try simulatorController.installApp(at: appBundle.path, device: device) + try simulatorController.launchApp(bundleId: appBundle.infoPlist.bundleId, device: device, arguments: []) + logger.notice("\(appBundle.infoPlist.name) was successfully launched 📲", metadata: .success) + } +} + +extension Version { + init(_ version: XcodeGraph.Version) { + self.init(version.major, version.minor, version.patch) + } +} diff --git a/Sources/TuistCore/Simulator/SimulatorController.swift b/Sources/TuistCore/Simulator/SimulatorController.swift index faa629ad1a8..7e76078a85f 100644 --- a/Sources/TuistCore/Simulator/SimulatorController.swift +++ b/Sources/TuistCore/Simulator/SimulatorController.swift @@ -1,9 +1,11 @@ import Foundation +import Mockable import Path import struct TSCUtility.Version import TuistSupport import XcodeGraph +@Mockable public protocol SimulatorControlling { /// Finds first available device defined by given parameters /// - Parameters: @@ -65,6 +67,16 @@ public protocol SimulatorControlling { /// Returns the simulator destination for the macOS platform func macOSDestination() -> String + + /// Returns the list of simulator devices that are available in the system. + func devices() async throws -> [SimulatorDevice] + + /// Returns the list of simulator runtimes that are available in the system. + func devicesAndRuntimes() async throws -> [SimulatorDeviceAndRuntime] + + /// Boots a simulator, if necessary + /// - Returns: A simulator with the updated `state` + func booted(device: SimulatorDevice) throws -> SimulatorDevice } public enum SimulatorControllerError: Equatable, FatalError { @@ -111,7 +123,7 @@ public final class SimulatorController: SimulatorControlling { } /// Returns the list of simulator devices that are available in the system. - func devices() async throws -> [SimulatorDevice] { + public func devices() async throws -> [SimulatorDevice] { let output = try await system.runAndCollectOutput(["/usr/bin/xcrun", "simctl", "list", "devices", "--json"]) let data = output.standardOutput.data(using: .utf8)! let json = try JSONSerialization.jsonObject(with: data, options: []) @@ -152,7 +164,7 @@ public final class SimulatorController: SimulatorControlling { /// - platform: Optionally filter by platform /// - deviceName: Optionally filter by device name /// - Returns: the list of simulator devices and runtimes. - func devicesAndRuntimes() async throws -> [SimulatorDeviceAndRuntime] { + public func devicesAndRuntimes() async throws -> [SimulatorDeviceAndRuntime] { async let runtimesTask = runtimes() async let devicesTask = devices() let (runtimes, devices) = try await (runtimesTask, devicesTask) @@ -212,7 +224,8 @@ public final class SimulatorController: SimulatorControlling { deviceName: deviceName ) guard let device = availableDevices.first(where: { !$0.device.isShutdown }) ?? availableDevices.first - else { throw SimulatorControllerError.deviceNotFound(platform, version, deviceName, try await devicesAndRuntimes()) + else { + throw SimulatorControllerError.deviceNotFound(platform, version, deviceName, try await devicesAndRuntimes()) } return device } @@ -237,15 +250,15 @@ public final class SimulatorController: SimulatorControlling { try await devicesAndRuntimes() ) } - if availableDevices.count == 1, let onlyOption = availableDevices.first { + let availableBootedDevices = availableDevices.filter { !$0.device.isShutdown } + if availableBootedDevices.count == 1, let onlyOption = availableBootedDevices.first { return onlyOption } - var prompt = "Select the simulator device where you want to run the app:\n" - for (index, availableDevice) in availableDevices.enumerated() { - prompt += "\t\(index): \(availableDevice.device.name) (\(availableDevice.device.udid))\n" - } - let choice = userInputReader.readInt(asking: prompt, maxValueAllowed: availableDevices.count) - return availableDevices[choice] + return try userInputReader.readValue( + asking: "Select the simulator device where you want to run the app:", + values: availableDevices, + valueDescription: { "\($0.device.name) (\($0.device.udid)" } + ) } public func installApp(at path: AbsolutePath, device: SimulatorDevice) throws { @@ -261,6 +274,10 @@ public final class SimulatorController: SimulatorControlling { try system.run(["/usr/bin/xcrun", "simctl", "launch", device.udid, bundleId] + arguments) } + public func booted(device: SimulatorDevice) throws -> SimulatorDevice { + try device.booted(using: system) + } + /// https://www.mokacoding.com/blog/xcodebuild-destination-options/ /// https://www.mokacoding.com/blog/how-to-always-run-latest-simulator-cli/ public func destination( diff --git a/Sources/TuistCore/Simulator/SimulatorDevice.swift b/Sources/TuistCore/Simulator/SimulatorDevice.swift index dcdcf611572..e3b5e22c0e3 100644 --- a/Sources/TuistCore/Simulator/SimulatorDevice.swift +++ b/Sources/TuistCore/Simulator/SimulatorDevice.swift @@ -2,7 +2,7 @@ import Foundation import Path /// It represents a simulator device. Devices are obtained using Xcode's CLI simctl -public struct SimulatorDevice: Decodable, Hashable, CustomStringConvertible { +public struct SimulatorDevice: Decodable, Hashable, CustomStringConvertible, Equatable { /// Device data path. public let dataPath: AbsolutePath diff --git a/Sources/TuistCore/Simulator/SimulatorDeviceAndRuntime.swift b/Sources/TuistCore/Simulator/SimulatorDeviceAndRuntime.swift index 5e11475aec4..10c40bf8f4d 100644 --- a/Sources/TuistCore/Simulator/SimulatorDeviceAndRuntime.swift +++ b/Sources/TuistCore/Simulator/SimulatorDeviceAndRuntime.swift @@ -1,6 +1,10 @@ import Foundation -public struct SimulatorDeviceAndRuntime: Hashable { +public struct SimulatorDeviceAndRuntime: Identifiable, Hashable, Equatable { + public var id: String { + device.udid + } + /// Device public let device: SimulatorDevice diff --git a/Sources/TuistCore/Utils/XcodeProjectBuildDirectoryLocator.swift b/Sources/TuistCore/Utils/XcodeProjectBuildDirectoryLocator.swift index d69904e111e..df43c79e888 100644 --- a/Sources/TuistCore/Utils/XcodeProjectBuildDirectoryLocator.swift +++ b/Sources/TuistCore/Utils/XcodeProjectBuildDirectoryLocator.swift @@ -1,8 +1,10 @@ import Foundation +import Mockable import Path import TuistSupport import XcodeGraph +@Mockable public protocol XcodeProjectBuildDirectoryLocating { /// Locates the build output directory for `xcodebuild` command. /// diff --git a/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift b/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift deleted file mode 100644 index 09be1abd98f..00000000000 --- a/Sources/TuistCoreTesting/Simulator/MockSimulatorController.swift +++ /dev/null @@ -1,61 +0,0 @@ -import Foundation -import Path -import struct TSCUtility.Version -import TuistSupport -import XcodeGraph -@testable import TuistCore -@testable import TuistSupportTesting - -public final class MockSimulatorController: SimulatorControlling { - public init() {} - - public var findAvailableDevicesStub: ((Platform, Version?, Version?, String?) -> [SimulatorDeviceAndRuntime])? - public func findAvailableDevices( - platform: XcodeGraph.Platform, - version: TSCUtility.Version?, - minVersion: TSCUtility.Version?, - deviceName: String? - ) async throws -> [TuistCore.SimulatorDeviceAndRuntime] { - findAvailableDevicesStub?(platform, version, minVersion, deviceName) ?? [SimulatorDeviceAndRuntime.test()] - } - - public var askForAvailableDeviceStub: ((Platform, Version?, Version?, String?) -> SimulatorDeviceAndRuntime)? - public func askForAvailableDevice( - platform: XcodeGraph.Platform, - version: TSCUtility.Version?, - minVersion: TSCUtility.Version?, - deviceName: String? - ) async throws -> TuistCore.SimulatorDeviceAndRuntime { - askForAvailableDeviceStub?(platform, version, minVersion, deviceName) ?? SimulatorDeviceAndRuntime.test() - } - - public var findAvailableDeviceStub: ((Platform, Version?, Version?, String?) -> SimulatorDeviceAndRuntime)? - public func findAvailableDevice( - platform: Platform, - version: Version?, - minVersion: Version?, - deviceName: String? - ) async throws -> SimulatorDeviceAndRuntime { - findAvailableDeviceStub?(platform, version, minVersion, deviceName) ?? SimulatorDeviceAndRuntime.test() - } - - public var installAppStub: ((AbsolutePath, SimulatorDevice) throws -> Void)? - public func installApp(at path: AbsolutePath, device: SimulatorDevice) throws { - try installAppStub?(path, device) - } - - public var launchAppStub: ((String, SimulatorDevice, [String]) throws -> Void)? - public func launchApp(bundleId: String, device: SimulatorDevice, arguments: [String]) throws { - try launchAppStub?(bundleId, device, arguments) - } - - public var destinationStub: ((Platform) -> String)? - public func destination(for targetPlatform: Platform, version _: Version?, deviceName _: String?) async throws -> String { - destinationStub?(targetPlatform) ?? "id=\(SimulatorDeviceAndRuntime.test().device.udid)" - } - - public var macOSDestinationStub: (() -> String)? - public func macOSDestination() -> String { - macOSDestinationStub?() ?? "platform=macOS,arch=arm64" - } -} diff --git a/Sources/TuistCoreTesting/Simulator/SimulatorDevice+TestData.swift b/Sources/TuistCoreTesting/Simulator/SimulatorDevice+TestData.swift index dea705dc735..931060fdc88 100644 --- a/Sources/TuistCoreTesting/Simulator/SimulatorDevice+TestData.swift +++ b/Sources/TuistCoreTesting/Simulator/SimulatorDevice+TestData.swift @@ -1,9 +1,10 @@ import Foundation import Path +import TuistSupport @testable import TuistCore extension SimulatorDevice { - static func test( + public static func test( dataPath: AbsolutePath = "/Library/Developer/CoreSimulator/Devices/3A8C9673-C1FD-4E33-8EFA-AEEBF43161CC/data", logPath: AbsolutePath = "/Library/Logs/CoreSimulator/3A8C9673-C1FD-4E33-8EFA-AEEBF43161CC", udid: String = "3A8C9673-C1FD-4E33-8EFA-AEEBF43161CC", diff --git a/Sources/TuistCoreTesting/Simulator/SimulatorDeviceAndRuntime+TestData.swift b/Sources/TuistCoreTesting/Simulator/SimulatorDeviceAndRuntime+TestData.swift index 2d2adfde6f4..8192fe4c976 100644 --- a/Sources/TuistCoreTesting/Simulator/SimulatorDeviceAndRuntime+TestData.swift +++ b/Sources/TuistCoreTesting/Simulator/SimulatorDeviceAndRuntime+TestData.swift @@ -3,7 +3,7 @@ import Path @testable import TuistCore extension SimulatorDeviceAndRuntime { - static func test( + public static func test( device: SimulatorDevice = .test(), runtime: SimulatorRuntime = .test() ) -> SimulatorDeviceAndRuntime { diff --git a/Sources/TuistCoreTesting/Simulator/SimulatorRuntime+TestData.swift b/Sources/TuistCoreTesting/Simulator/SimulatorRuntime+TestData.swift index 4062e3915fb..0eec9b4617c 100644 --- a/Sources/TuistCoreTesting/Simulator/SimulatorRuntime+TestData.swift +++ b/Sources/TuistCoreTesting/Simulator/SimulatorRuntime+TestData.swift @@ -1,9 +1,10 @@ import Foundation import Path +import TuistSupport @testable import TuistCore extension SimulatorRuntime { - static func test( + public static func test( bundlePath: AbsolutePath = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime", buildVersion: String = "17F61", diff --git a/Sources/TuistCoreTesting/Utils/MockXcodeProjectBuildDirectoryLocator.swift b/Sources/TuistCoreTesting/Utils/MockXcodeProjectBuildDirectoryLocator.swift deleted file mode 100644 index 89a9fd9df78..00000000000 --- a/Sources/TuistCoreTesting/Utils/MockXcodeProjectBuildDirectoryLocator.swift +++ /dev/null @@ -1,25 +0,0 @@ -import Path -import TuistCore -import XcodeGraph - -public final class MockXcodeProjectBuildDirectoryLocator: XcodeProjectBuildDirectoryLocating { - public init() {} - - // swiftlint:disable:next type_name - enum MockXcodeProjectBuildDirectoryLocatorError: Error { - case noStub - } - - public var locateStub: ((Platform, AbsolutePath, AbsolutePath?, String) throws -> AbsolutePath)? - public func locate( - platform: Platform, - projectPath: AbsolutePath, - derivedDataPath: AbsolutePath?, - configuration: String - ) throws -> AbsolutePath { - guard let stub = locateStub else { - throw MockXcodeProjectBuildDirectoryLocatorError.noStub - } - return try stub(platform, projectPath, derivedDataPath, configuration) - } -} diff --git a/Sources/TuistGenerator/Generator/ProjectFileElements.swift b/Sources/TuistGenerator/Generator/ProjectFileElements.swift index e8010706e55..a73075522e5 100644 --- a/Sources/TuistGenerator/Generator/ProjectFileElements.swift +++ b/Sources/TuistGenerator/Generator/ProjectFileElements.swift @@ -276,7 +276,7 @@ class ProjectFileElements { sourceRootPath: AbsolutePath ) throws { // Pre-compiled artifact from the cache - let cacheDirectory = try cacheDirectoriesProvider.cacheDirectory() + let cacheDirectory = cacheDirectoriesProvider.cacheDirectory() if path.pathString.contains(cacheDirectory.pathString) { guard compiled[path] == nil else { return diff --git a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift index 5ffe295a326..c66a9f29729 100644 --- a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift +++ b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift @@ -212,6 +212,15 @@ public enum EnvKey: String, CaseIterable { // LOGOUT case logoutPath = "TUIST_LOGOUT_PATH" + + // ANALYTICS + case analyticsPath = "TUIST_ANALYTICS_PATH" + + // SHARE + case shareApp = "TUIST_SHARE_APP" + case shareConfiguration = "TUIST_SHARE_CONFIGURATION" + case sharePlatform = "TUIST_SHARE_PLATFORM" + case shareDerivedDataPath = "TUIST_SHARE_DERIVED_DATA_PATH" } extension EnvKey { diff --git a/Sources/TuistKit/Commands/InitCommand.swift b/Sources/TuistKit/Commands/InitCommand.swift index b0e82e0c242..71fd3e52a13 100644 --- a/Sources/TuistKit/Commands/InitCommand.swift +++ b/Sources/TuistKit/Commands/InitCommand.swift @@ -24,8 +24,8 @@ public struct InitCommand: AsyncParsableCommand, HasTrackableParameters { public var runId = UUID().uuidString @Option( - help: "The platform (ios, tvos, visionos, watchos or macos) the product will be for (Default: ios)", - completion: .list(["ios", "tvos", "macos", "visionos", "watchos"]), + help: "The platform (iOS, tvOS, visionOS, watchOS or macOS) the product will be for (Default: iOS)", + completion: .list(["iOS", "tvOS", "macOS", "visionOS", "watchOS"]), envKey: .initPlatform ) var platform: String? diff --git a/Sources/TuistKit/Commands/RunCommand.swift b/Sources/TuistKit/Commands/RunCommand.swift index 850bbc56eda..14014ce6d9b 100644 --- a/Sources/TuistKit/Commands/RunCommand.swift +++ b/Sources/TuistKit/Commands/RunCommand.swift @@ -4,6 +4,21 @@ import Path import TSCUtility import TuistSupport +enum Runnable: ExpressibleByArgument, Equatable { + init?(argument: String) { + if argument.starts(with: "http://") || argument.starts(with: "https://"), + let previewLink = URL(string: argument) + { + self = .url(previewLink) + } else { + self = .scheme(argument) + } + } + + case url(Foundation.URL) + case scheme(String) +} + public struct RunCommand: AsyncParsableCommand { public init() {} @@ -24,6 +39,12 @@ public struct RunCommand: AsyncParsableCommand { ) } + @Argument( + help: "Runnable project scheme or a preview URL.", + envKey: .runScheme + ) + var runnable: Runnable + @Flag( help: "Force the generation of the project before running.", envKey: .runGenerate @@ -65,12 +86,6 @@ public struct RunCommand: AsyncParsableCommand { ) var rosetta: Bool = false - @Argument( - help: "The scheme to be run.", - envKey: .runScheme - ) - var scheme: String - @Argument( parsing: .captureForPassthrough, help: "The arguments to pass to the runnable target during execution.", @@ -81,12 +96,12 @@ public struct RunCommand: AsyncParsableCommand { public func run() async throws { try await RunService().run( path: path, - schemeName: scheme, + runnable: runnable, generate: generate, clean: clean, configuration: configuration, device: device, - version: os, + osVersion: os, rosetta: rosetta, arguments: arguments ) diff --git a/Sources/TuistKit/Commands/ShareCommand.swift b/Sources/TuistKit/Commands/ShareCommand.swift new file mode 100644 index 00000000000..4a5263b157b --- /dev/null +++ b/Sources/TuistKit/Commands/ShareCommand.swift @@ -0,0 +1,58 @@ +import ArgumentParser +import Foundation +import XcodeGraph + +public struct ShareCommand: AsyncParsableCommand { + public init() {} + + public static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "share", + abstract: "Generate a link to share your app. Only simulator builds supported." + ) + } + + @Option( + name: .shortAndLong, + help: "The path to the directory that contains a Tuist or Xcode project with a buildable scheme that can output runnable artifacts.", + completion: .directory + ) + var path: String? + + @Argument( + help: "The app names to be looked up in the built products directory or the paths to the app bundles.", + envKey: .shareApp + ) + var apps: [String] = [] + + @Option( + name: [.long, .customShort("C")], + help: "The configuration of the app to share. Ignored when the app paths are passed directly.", + envKey: .shareConfiguration + ) + var configuration: String? + + @Option( + help: "The platforms (iOS, tvOS, visionOS, watchOS or macOS) to share the app for. Ignored when the app paths are passed directly.", + completion: .list(["iOS", "tvOS", "macOS", "visionOS", "watchOS"]), + envKey: .sharePlatform + ) + var platforms: [XcodeGraph.Platform] = [] + + @Option( + help: "The derived data path to find the apps in. When absent, the system-configured one.", + completion: .directory, + envKey: .shareDerivedDataPath + ) + var derivedDataPath: String? + + public func run() async throws { + try await ShareService().run( + path: path, + apps: apps, + configuration: configuration, + platforms: platforms, + derivedDataPath: derivedDataPath + ) + } +} diff --git a/Sources/TuistKit/Commands/TuistCommand.swift b/Sources/TuistKit/Commands/TuistCommand.swift index 2b4812909a1..689b9e83bf6 100644 --- a/Sources/TuistKit/Commands/TuistCommand.swift +++ b/Sources/TuistKit/Commands/TuistCommand.swift @@ -16,31 +16,46 @@ public struct TuistCommand: AsyncParsableCommand { abstract: "Generate, build and test your Xcode projects.", subcommands: [], groupedSubcommands: [ - CommandGroup(name: "Start", subcommands: [ - InitCommand.self, - ]), - CommandGroup(name: "Develop", subcommands: [ - BuildCommand.self, - CacheCommand.self, - CleanCommand.self, - DumpCommand.self, - EditCommand.self, - GenerateCommand.self, - GraphCommand.self, - InstallCommand.self, - MigrationCommand.self, - PluginCommand.self, - RunCommand.self, - ScaffoldCommand.self, - TestCommand.self, - ]), - CommandGroup(name: "Account", subcommands: [ - ProjectCommand.self, - OrganizationCommand.self, - AuthCommand.self, - SessionCommand.self, - LogoutCommand.self, - ]), + CommandGroup( + name: "Start", + subcommands: [ + InitCommand.self, + ] + ), + CommandGroup( + name: "Develop", + subcommands: [ + BuildCommand.self, + CacheCommand.self, + CleanCommand.self, + DumpCommand.self, + EditCommand.self, + GenerateCommand.self, + GraphCommand.self, + InstallCommand.self, + MigrationCommand.self, + PluginCommand.self, + RunCommand.self, + ScaffoldCommand.self, + TestCommand.self, + ] + ), + CommandGroup( + name: "Share", + subcommands: [ + ShareCommand.self, + ] + ), + CommandGroup( + name: "Account", + subcommands: [ + ProjectCommand.self, + OrganizationCommand.self, + AuthCommand.self, + SessionCommand.self, + LogoutCommand.self, + ] + ), ] ) } diff --git a/Sources/TuistKit/Services/RunService.swift b/Sources/TuistKit/Services/RunService.swift index 735df15b29d..1e5aac36564 100644 --- a/Sources/TuistKit/Services/RunService.swift +++ b/Sources/TuistKit/Services/RunService.swift @@ -1,17 +1,22 @@ +import FileSystem import Foundation import Path import struct TSCUtility.Version import TuistAutomation import TuistCore import TuistLoader +import TuistServer import TuistSupport import XcodeGraph -enum RunServiceError: FatalError { +enum RunServiceError: FatalError, Equatable { case schemeNotFound(scheme: String, existing: [String]) case schemeWithoutRunnableTarget(scheme: String) case invalidVersion(String) case workspaceNotFound(path: String) + case invalidDownloadBuildURL(String) + case invalidPreviewURL(String) + case appNotFound(String) var description: String { switch self { @@ -23,6 +28,12 @@ enum RunServiceError: FatalError { return "The version \(version) is not a valid version specifier." case let .workspaceNotFound(path): return "Workspace not found expected xcworkspace at \(path)" + case let .invalidDownloadBuildURL(downloadBuildURL): + return "The download build URL \(downloadBuildURL) is invalid." + case let .invalidPreviewURL(previewURL): + return "The preview URL \(previewURL) is invalid." + case let .appNotFound(url): + return "The app at \(url) was not found." } } @@ -30,9 +41,11 @@ enum RunServiceError: FatalError { switch self { case .schemeNotFound, .schemeWithoutRunnableTarget, - .invalidVersion: + .invalidVersion, + .appNotFound, + .invalidPreviewURL: return .abort - case .workspaceNotFound: + case .workspaceNotFound, .invalidDownloadBuildURL: return .bug } } @@ -44,33 +57,73 @@ final class RunService { private let targetBuilder: TargetBuilding private let targetRunner: TargetRunning private let configLoader: ConfigLoading + private let downloadPreviewService: DownloadPreviewServicing + private let fileHandler: FileHandling + private let fileSystem: FileSysteming + private let appRunner: AppRunning + private let remoteArtifactDownloader: RemoteArtifactDownloading + private let appBundleLoader: AppBundleLoading + private let fileArchiverFactory: FileArchivingFactorying + + convenience init() { + self.init( + generatorFactory: GeneratorFactory(), + buildGraphInspector: BuildGraphInspector(), + targetBuilder: TargetBuilder(), + targetRunner: TargetRunner(), + configLoader: ConfigLoader(manifestLoader: ManifestLoader()), + downloadPreviewService: DownloadPreviewService(), + fileHandler: FileHandler.shared, + fileSystem: FileSystem(), + appRunner: AppRunner(), + remoteArtifactDownloader: RemoteArtifactDownloader(), + appBundleLoader: AppBundleLoader(), + fileArchiverFactory: FileArchivingFactory() + ) + } init( - generatorFactory: GeneratorFactorying = GeneratorFactory(), - buildGraphInspector: BuildGraphInspecting = BuildGraphInspector(), - targetBuilder: TargetBuilding = TargetBuilder(), - targetRunner: TargetRunning = TargetRunner(), - configLoader: ConfigLoading = ConfigLoader(manifestLoader: ManifestLoader()) + generatorFactory: GeneratorFactorying, + buildGraphInspector: BuildGraphInspecting, + targetBuilder: TargetBuilding, + targetRunner: TargetRunning, + configLoader: ConfigLoading, + downloadPreviewService: DownloadPreviewServicing, + fileHandler: FileHandling, + fileSystem: FileSystem, + appRunner: AppRunning, + remoteArtifactDownloader: RemoteArtifactDownloading, + appBundleLoader: AppBundleLoading, + fileArchiverFactory: FileArchivingFactorying ) { self.generatorFactory = generatorFactory self.buildGraphInspector = buildGraphInspector self.targetBuilder = targetBuilder self.targetRunner = targetRunner self.configLoader = configLoader + self.downloadPreviewService = downloadPreviewService + self.fileHandler = fileHandler + self.fileSystem = fileSystem + self.appRunner = appRunner + self.remoteArtifactDownloader = remoteArtifactDownloader + self.appBundleLoader = appBundleLoader + self.fileArchiverFactory = fileArchiverFactory } // swiftlint:disable:next function_body_length func run( path: String?, - schemeName: String, + runnable: Runnable, generate: Bool, clean: Bool, configuration: String?, device: String?, - version: String?, + osVersion: String?, rosetta: Bool, arguments: [String] ) async throws { + let device = arguments.firstIndex(of: "-destination").map { arguments[$0 + 1] } ?? device + let runPath: AbsolutePath if let path { runPath = try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) @@ -78,18 +131,99 @@ final class RunService { runPath = FileHandler.shared.currentPath } + let osVersion = try osVersion.map { versionString in + guard let version = versionString.version() else { + throw RunServiceError.invalidVersion(versionString) + } + return version + } + + switch runnable { + case let .url(previewLink): + try await runPreviewLink( + previewLink, + device: device, + version: osVersion, + path: runPath + ) + case let .scheme(scheme): + try await runScheme( + scheme, + path: runPath, + generate: generate, + clean: clean, + configuration: configuration, + device: device, + version: osVersion, + rosetta: rosetta, + arguments: arguments + ) + } + } + + private func runPreviewLink( + _ previewLink: URL, + device: String?, + version: Version?, + path _: AbsolutePath + ) async throws { + guard let scheme = previewLink.scheme, + let host = previewLink.host, + let serverURL = URL(string: "\(scheme)://\(host)\(previewLink.port.map { ":" + String($0) } ?? "")"), + previewLink.pathComponents.count > 4 // We expect at least four path components + else { throw RunServiceError.invalidPreviewURL(previewLink.absoluteString) } + + let downloadURLString = try await downloadPreviewService.downloadPreview( + previewLink.lastPathComponent, + fullHandle: "\(previewLink.pathComponents[1])/\(previewLink.pathComponents[2])", + serverURL: serverURL + ) + + guard let downloadURL = URL(string: downloadURLString) + else { throw RunServiceError.invalidDownloadBuildURL(downloadURLString) } + + guard let archivePath = try await remoteArtifactDownloader.download(url: downloadURL) + else { throw RunServiceError.appNotFound(previewLink.absoluteString) } + + let unarchivedDirectory = try fileArchiverFactory.makeFileUnarchiver(for: archivePath).unzip() + + try await fileSystem.remove(archivePath) + + let apps = try await fileHandler.glob(unarchivedDirectory, glob: "*.app") + .concurrentMap { + try await self.appBundleLoader.load($0) + } + + try await appRunner.runApp( + apps, + version: version, + device: device + ) + } + + private func runScheme( + _ scheme: String, + path: AbsolutePath, + generate: Bool, + clean: Bool, + configuration: String?, + device: String?, + version: Version?, + rosetta: Bool, + arguments: [String] + ) async throws { let graph: Graph - let config = try await configLoader.loadConfig(path: runPath) + let config = try await configLoader.loadConfig(path: path) let generator = generatorFactory.defaultGenerator(config: config) - if try (generate || buildGraphInspector.workspacePath(directory: runPath) == nil) { + if try (generate || buildGraphInspector.workspacePath(directory: path) == nil) { logger.notice("Generating project for running", metadata: .section) - graph = try await generator.generateWithGraph(path: runPath).1 + graph = try await generator.generateWithGraph(path: path).1 } else { - graph = try await generator.load(path: runPath) + graph = try await generator.load(path: path) } - guard let workspacePath = try buildGraphInspector.workspacePath(directory: runPath) else { - throw RunServiceError.workspaceNotFound(path: runPath.pathString) + guard let workspacePath = try buildGraphInspector.workspacePath(directory: path) else { + throw RunServiceError.workspaceNotFound(path: path.pathString) } let graphTraverser = GraphTraverser(graph: graph) @@ -97,8 +231,8 @@ final class RunService { logger.debug("Found the following runnable schemes: \(runnableSchemes.map(\.name).joined(separator: ", "))") - guard let scheme = runnableSchemes.first(where: { $0.name == schemeName }) else { - throw RunServiceError.schemeNotFound(scheme: schemeName, existing: runnableSchemes.map(\.name)) + guard let scheme = runnableSchemes.first(where: { $0.name == scheme }) else { + throw RunServiceError.schemeNotFound(scheme: scheme, existing: runnableSchemes.map(\.name)) } guard let graphTarget = buildGraphInspector.runnableTarget(scheme: scheme, graphTraverser: graphTraverser) else { @@ -117,7 +251,7 @@ final class RunService { buildOutputPath: nil, derivedDataPath: nil, device: device, - osVersion: version?.version().map { .init(stringLiteral: $0.description) }, + osVersion: version.map { XcodeGraph.Version(stringLiteral: $0.description) }, rosetta: rosetta, graphTraverser: graphTraverser, passthroughXcodeBuildArguments: [] @@ -138,13 +272,6 @@ final class RunService { .first } - let version: Version? = try version.map { versionString in - guard let version = versionString.version() else { - throw RunServiceError.invalidVersion(versionString) - } - return version - } ?? nil - try await targetRunner.runTarget( graphTarget, platform: try graphTarget.target.servicePlatform, diff --git a/Sources/TuistKit/Services/ShareService.swift b/Sources/TuistKit/Services/ShareService.swift new file mode 100644 index 00000000000..834211cc680 --- /dev/null +++ b/Sources/TuistKit/Services/ShareService.swift @@ -0,0 +1,269 @@ +import Foundation +import Path +import TuistAutomation +import TuistCore +import TuistLoader +import TuistServer +import TuistSupport +import XcodeGraph + +enum ShareServiceError: Equatable, FatalError { + case projectOrWorkspaceNotFound(path: String) + case noAppsFound(app: String, configuration: String) + case appNotSpecified + case multipleAppsSpecified([String]) + case platformsNotSpecified + case fullHandleNotFound + + var description: String { + switch self { + case let .projectOrWorkspaceNotFound(path): + return "Workspace or project not found at \(path)" + case let .noAppsFound(app: app, configuration: configuration): + return "\(app) for the \(configuration) configuration was not found. You can build it by running `tuist build \(app)`" + case .appNotSpecified: + return "If you're not using Tuist projects, you must specify the app name when sharing an app, such as `tuist share App --platforms ios`." + case .platformsNotSpecified: + return "If you're not using Tuist projects, you must specify the platforms when sharing an app, such as `tuist share App --platforms ios`." + case let .multipleAppsSpecified(apps): + return "You specified multiple apps to share: \(apps.joined(separator: " ")). You cannot specify multiple apps when using `tuist share`." + case .fullHandleNotFound: + return "You are missing full handle in your Config.swift." + } + } + + var type: ErrorType { + switch self { + case .projectOrWorkspaceNotFound, .noAppsFound, .appNotSpecified, .platformsNotSpecified, .multipleAppsSpecified, + .fullHandleNotFound: + return .abort + } + } +} + +struct ShareService { + private let fileHandler: FileHandling + private let xcodeProjectBuildDirectoryLocator: XcodeProjectBuildDirectoryLocating + private let buildGraphInspector: BuildGraphInspecting + private let previewsUploadService: PreviewsUploadServicing + private let configLoader: ConfigLoading + private let serverURLService: ServerURLServicing + private let manifestLoader: ManifestLoading + private let manifestGraphLoader: ManifestGraphLoading + private let userInputReader: UserInputReading + private let defaultConfigurationFetcher: DefaultConfigurationFetching + private let appBundleLoader: AppBundleLoading + + init() { + let manifestLoader = ManifestLoaderFactory() + .createManifestLoader() + let manifestGraphLoader = ManifestGraphLoader( + manifestLoader: manifestLoader, + workspaceMapper: SequentialWorkspaceMapper(mappers: []), + graphMapper: SequentialGraphMapper([]) + ) + + self.init( + fileHandler: FileHandler.shared, + xcodeProjectBuildDirectoryLocator: XcodeProjectBuildDirectoryLocator(), + buildGraphInspector: BuildGraphInspector(), + previewsUploadService: PreviewsUploadService(), + configLoader: ConfigLoader(), + serverURLService: ServerURLService(), + manifestLoader: manifestLoader, + manifestGraphLoader: manifestGraphLoader, + userInputReader: UserInputReader(), + defaultConfigurationFetcher: DefaultConfigurationFetcher(), + appBundleLoader: AppBundleLoader() + ) + } + + init( + fileHandler: FileHandling, + xcodeProjectBuildDirectoryLocator: XcodeProjectBuildDirectoryLocating, + buildGraphInspector: BuildGraphInspecting, + previewsUploadService: PreviewsUploadServicing, + configLoader: ConfigLoading, + serverURLService: ServerURLServicing, + manifestLoader: ManifestLoading, + manifestGraphLoader: ManifestGraphLoading, + userInputReader: UserInputReading, + defaultConfigurationFetcher: DefaultConfigurationFetching, + appBundleLoader: AppBundleLoading + ) { + self.fileHandler = fileHandler + self.xcodeProjectBuildDirectoryLocator = xcodeProjectBuildDirectoryLocator + self.buildGraphInspector = buildGraphInspector + self.previewsUploadService = previewsUploadService + self.configLoader = configLoader + self.serverURLService = serverURLService + self.manifestLoader = manifestLoader + self.manifestGraphLoader = manifestGraphLoader + self.userInputReader = userInputReader + self.defaultConfigurationFetcher = defaultConfigurationFetcher + self.appBundleLoader = appBundleLoader + } + + func run( + path: String?, + apps: [String], + configuration: String?, + platforms: [Platform], + derivedDataPath: String? + ) async throws { + let path = try self.path(path) + + let config = try await configLoader.loadConfig(path: path) + let serverURL = try serverURLService.url(configServerURL: config.url) + + guard let fullHandle = config.fullHandle else { throw ShareServiceError.fullHandleNotFound } + + let derivedDataPath = try derivedDataPath.map { + try AbsolutePath( + validating: $0, + relativeTo: fileHandler.currentPath + ) + } + + if !apps.isEmpty, apps.allSatisfy({ $0.hasSuffix(".app") }) { + let appPaths = try apps.map { + try AbsolutePath( + validating: $0, + relativeTo: fileHandler.currentPath + ) + } + + let appBundles = try await appPaths.concurrentMap { + try await appBundleLoader.load($0) + } + + let appNames = appBundles.map(\.infoPlist.name).uniqued() + guard appNames.count == 1, + let appName = appNames.first else { throw ShareServiceError.multipleAppsSpecified(appNames) } + + let url = try await previewsUploadService.uploadPreviews( + appPaths, + fullHandle: fullHandle, + serverURL: serverURL + ) + logger.notice("\(appName) uploaded – share it with others using the following link: \(url.absoluteString)") + } else if manifestLoader.hasRootManifest(at: path) { + guard apps.count < 2 else { throw ShareServiceError.multipleAppsSpecified(apps) } + + let (graph, _, _, _) = try await manifestGraphLoader.load(path: path) + let graphTraverser = GraphTraverser(graph: graph) + let appTargets = graphTraverser.targets(product: .app) + .map { $0 } + .filter { + if let app = apps.first { + return $0.target.name == app + } else { + return true + } + } + let appTarget: GraphTarget = try userInputReader.readValue( + asking: "Select the app that you want to share:", + values: appTargets.sorted(by: { $0.target.name < $1.target.name }), + valueDescription: \.target.name + ) + + let configuration = try defaultConfigurationFetcher.fetch( + configuration: configuration, + config: config, + graph: graph + ) + + let platforms = platforms.isEmpty ? appTarget.target.supportedPlatforms.map { $0 } : platforms + + try await uploadPreviews( + for: platforms, + workspacePath: graph.workspace.xcWorkspacePath, + configuration: configuration, + app: appTarget.target.name, + derivedDataPath: derivedDataPath, + fullHandle: fullHandle, + serverURL: serverURL + ) + } else { + guard !apps.isEmpty else { throw ShareServiceError.appNotSpecified } + guard apps.count == 1, let app = apps.first else { throw ShareServiceError.multipleAppsSpecified(apps) } + guard !platforms.isEmpty else { throw ShareServiceError.platformsNotSpecified } + + let configuration = configuration ?? BuildConfiguration.debug.name + + guard let workspaceOrProjectPath = fileHandler.glob(path, glob: "*.xcworkspace").first ?? fileHandler + .glob(path, glob: "*.xcodeproj").first + else { + throw ShareServiceError.projectOrWorkspaceNotFound(path: path.pathString) + } + + try await uploadPreviews( + for: platforms, + workspacePath: workspaceOrProjectPath, + configuration: configuration, + app: app, + derivedDataPath: derivedDataPath, + fullHandle: fullHandle, + serverURL: serverURL + ) + } + } + + // MARK: - Helpers + + private func path(_ path: String?) throws -> AbsolutePath { + if let path { + return try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) + } else { + return FileHandler.shared.currentPath + } + } + + private func uploadPreviews( + for platforms: [Platform], + workspacePath: AbsolutePath, + configuration: String, + app: String, + derivedDataPath: AbsolutePath?, + fullHandle: String, + serverURL: URL + ) async throws { + try await fileHandler.inTemporaryDirectory { temporaryPath in + let appPaths = try platforms + .map { platform in + let sdkPathComponent: String = { + guard platform != .macOS else { + return platform.xcodeDeviceSDK + } + return "\(platform.xcodeSimulatorSDK!)" + }() + + let appPath = try xcodeProjectBuildDirectoryLocator.locate( + platform: platform, + projectPath: workspacePath, + derivedDataPath: derivedDataPath, + configuration: configuration + ) + .appending(component: "\(app).app") + + let newAppPath = temporaryPath.appending(component: "\(sdkPathComponent)-\(app).app") + + if !fileHandler.exists(appPath) { + throw ShareServiceError.noAppsFound(app: app, configuration: configuration) + } + + try fileHandler.copy(from: appPath, to: newAppPath) + + return newAppPath + } + .uniqued() + + let url = try await previewsUploadService.uploadPreviews( + appPaths, + fullHandle: fullHandle, + serverURL: serverURL + ) + logger.notice("\(app) uploaded – share it with others using the following link: \(url.absoluteString)") + } + } +} diff --git a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift index 9bb2f49d4d4..585bf27ecba 100644 --- a/Sources/TuistLoader/Loaders/CachedManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/CachedManifestLoader.swift @@ -109,6 +109,10 @@ public class CachedManifestLoader: ManifestLoading { try manifestLoader.validateHasRootManifest(at: path) } + public func hasRootManifest(at path: AbsolutePath) -> Bool { + manifestLoader.hasRootManifest(at: path) + } + public func register(plugins: Plugins) throws { try pluginsHashCache.mutate { $0 = try calculatePluginsHash(for: plugins) } try manifestLoader.register(plugins: plugins) diff --git a/Sources/TuistLoader/Loaders/ManifestLoader.swift b/Sources/TuistLoader/Loaders/ManifestLoader.swift index 18b0d31b3ab..7b329dcddc4 100644 --- a/Sources/TuistLoader/Loaders/ManifestLoader.swift +++ b/Sources/TuistLoader/Loaders/ManifestLoader.swift @@ -91,6 +91,9 @@ public protocol ManifestLoading { /// Verifies that there is a project or workspace manifest at the given path, or throws an error otherwise. func validateHasRootManifest(at path: AbsolutePath) throws + /// - Returns: `true` if there is a project or workspace manifest at the given path + func hasRootManifest(at path: AbsolutePath) -> Bool + /// Registers plugins that will be used within the manifest loading process. /// - Parameter plugins: The plugins to register. func register(plugins: Plugins) throws @@ -153,13 +156,17 @@ public class ManifestLoader: ManifestLoading { } public func validateHasRootManifest(at path: AbsolutePath) throws { - let manifests = manifests(at: path) - let rootManifests: Set = [.workspace, .project, .package] - guard !manifests.isDisjoint(with: rootManifests) else { + guard hasRootManifest(at: path) else { throw ManifestLoaderError.manifestNotFound(path) } } + public func hasRootManifest(at path: AbsolutePath) -> Bool { + let manifests = manifests(at: path) + let rootManifests: Set = [.workspace, .project, .package] + return !manifests.isDisjoint(with: rootManifests) + } + public func loadConfig(at path: AbsolutePath) async throws -> ProjectDescription.Config { try await loadManifest(.config, at: path) } diff --git a/Sources/TuistServer/Models/PreviewUpload.swift b/Sources/TuistServer/Models/PreviewUpload.swift new file mode 100644 index 00000000000..9cbafa14c76 --- /dev/null +++ b/Sources/TuistServer/Models/PreviewUpload.swift @@ -0,0 +1,6 @@ +import Foundation + +public struct PreviewUpload { + public let previewId: String + public let uploadId: String +} diff --git a/Sources/TuistServer/OpenAPI/Client.swift b/Sources/TuistServer/OpenAPI/Client.swift index 9738d636fcd..9c5d2bf5006 100644 --- a/Sources/TuistServer/OpenAPI/Client.swift +++ b/Sources/TuistServer/OpenAPI/Client.swift @@ -2339,6 +2339,393 @@ public struct Client: APIProtocol { } ) } + /// It completes a multi-part upload. + /// + /// Given the upload ID and all the parts with their ETags, this endpoint completes the multipart upload. + /// + /// - Remark: HTTP `POST /api/projects/{account_handle}/{project_handle}/previews/complete`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/complete/post(completePreviewsMultipartUpload)`. + public func completePreviewsMultipartUpload( + _ input: Operations.completePreviewsMultipartUpload.Input + ) async throws -> Operations.completePreviewsMultipartUpload.Output { + try await client.send( + input: input, + forOperation: Operations.completePreviewsMultipartUpload.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/projects/{}/{}/previews/complete", + parameters: [input.path.account_handle, input.path.project_handle] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.completePreviewsMultipartUpload.Output.Ok.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.completePreviewsMultipartUpload.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Operations.completePreviewsMultipartUpload.Output.Ok.Body.jsonPayload + .self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 401: + let headers: + Operations.completePreviewsMultipartUpload.Output.Unauthorized.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.completePreviewsMultipartUpload.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) + case 403: + let headers: + Operations.completePreviewsMultipartUpload.Output.Forbidden.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.completePreviewsMultipartUpload.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: + Operations.completePreviewsMultipartUpload.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.completePreviewsMultipartUpload.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// It generates a signed URL for uploading a part. + /// + /// Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. + /// + /// - Remark: HTTP `POST /api/projects/{account_handle}/{project_handle}/previews/generate-url`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/generate-url/post(generatePreviewsMultipartUploadURL)`. + public func generatePreviewsMultipartUploadURL( + _ input: Operations.generatePreviewsMultipartUploadURL.Input + ) async throws -> Operations.generatePreviewsMultipartUploadURL.Output { + try await client.send( + input: input, + forOperation: Operations.generatePreviewsMultipartUploadURL.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/projects/{}/{}/previews/generate-url", + parameters: [input.path.account_handle, input.path.project_handle] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.generatePreviewsMultipartUploadURL.Output.Ok.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.generatePreviewsMultipartUploadURL.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.ArtifactMultipartUploadURL.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 401: + let headers: + Operations.generatePreviewsMultipartUploadURL.Output.Unauthorized.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: + Operations.generatePreviewsMultipartUploadURL.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) + case 403: + let headers: + Operations.generatePreviewsMultipartUploadURL.Output.Forbidden.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.generatePreviewsMultipartUploadURL.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: + Operations.generatePreviewsMultipartUploadURL.Output.NotFound.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.generatePreviewsMultipartUploadURL.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// It initiates a multipart upload for a preview artifact. + /// + /// The endpoint returns an upload ID that can be used to generate URLs for the individual parts and complete the upload. + /// + /// - Remark: HTTP `POST /api/projects/{account_handle}/{project_handle}/previews/start`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/start/post(startPreviewsMultipartUpload)`. + public func startPreviewsMultipartUpload(_ input: Operations.startPreviewsMultipartUpload.Input) + async throws -> Operations.startPreviewsMultipartUpload.Output + { + try await client.send( + input: input, + forOperation: Operations.startPreviewsMultipartUpload.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/projects/{}/{}/previews/start", + parameters: [input.path.account_handle, input.path.project_handle] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .post) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.startPreviewsMultipartUpload.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.startPreviewsMultipartUpload.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Operations.startPreviewsMultipartUpload.Output.Ok.Body.jsonPayload.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 401: + let headers: + Operations.startPreviewsMultipartUpload.Output.Unauthorized.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.startPreviewsMultipartUpload.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) + case 403: + let headers: Operations.startPreviewsMultipartUpload.Output.Forbidden.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.startPreviewsMultipartUpload.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.startPreviewsMultipartUpload.Output.NotFound.Headers = + .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.startPreviewsMultipartUpload.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } + /// Downloads a preview. + /// + /// This endpoint returns a signed URL that can be used to download a preview. + /// + /// - Remark: HTTP `GET /api/projects/{account_handle}/{project_handle}/previews/{preview_id}`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/{preview_id}/get(downloadPreview)`. + public func downloadPreview(_ input: Operations.downloadPreview.Input) async throws + -> Operations.downloadPreview.Output + { + try await client.send( + input: input, + forOperation: Operations.downloadPreview.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/projects/{}/{}/previews/{}", + parameters: [ + input.path.account_handle, input.path.project_handle, input.path.preview_id, + ] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .get) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.downloadPreview.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.downloadPreview.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.ArtifactDownloadURL.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 401: + let headers: Operations.downloadPreview.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.downloadPreview.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) + case 403: + let headers: Operations.downloadPreview.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.downloadPreview.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.downloadPreview.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.downloadPreview.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } /// List all project tokens. /// /// This endpoint returns all tokens for a given project. @@ -2540,6 +2927,19 @@ public struct Client: APIProtocol { case 204: let headers: Operations.revokeProjectToken.Output.NoContent.Headers = .init() return .noContent(.init(headers: headers, body: nil)) + case 400: + let headers: Operations.revokeProjectToken.Output.BadRequest.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.revokeProjectToken.Output.BadRequest.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .badRequest(.init(headers: headers, body: body)) case 401: let headers: Operations.revokeProjectToken.Output.Unauthorized.Headers = .init() try converter.validateContentTypeIfPresent( diff --git a/Sources/TuistServer/OpenAPI/Types.swift b/Sources/TuistServer/OpenAPI/Types.swift index aa1e6091dff..d2ce692baed 100644 --- a/Sources/TuistServer/OpenAPI/Types.swift +++ b/Sources/TuistServer/OpenAPI/Types.swift @@ -193,6 +193,39 @@ public protocol APIProtocol: Sendable { /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/cache/clean/put(cleanCache)`. func cleanCache(_ input: Operations.cleanCache.Input) async throws -> Operations.cleanCache.Output + /// It completes a multi-part upload. + /// + /// Given the upload ID and all the parts with their ETags, this endpoint completes the multipart upload. + /// + /// - Remark: HTTP `POST /api/projects/{account_handle}/{project_handle}/previews/complete`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/complete/post(completePreviewsMultipartUpload)`. + func completePreviewsMultipartUpload(_ input: Operations.completePreviewsMultipartUpload.Input) + async throws -> Operations.completePreviewsMultipartUpload.Output + /// It generates a signed URL for uploading a part. + /// + /// Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. + /// + /// - Remark: HTTP `POST /api/projects/{account_handle}/{project_handle}/previews/generate-url`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/generate-url/post(generatePreviewsMultipartUploadURL)`. + func generatePreviewsMultipartUploadURL( + _ input: Operations.generatePreviewsMultipartUploadURL.Input + ) async throws -> Operations.generatePreviewsMultipartUploadURL.Output + /// It initiates a multipart upload for a preview artifact. + /// + /// The endpoint returns an upload ID that can be used to generate URLs for the individual parts and complete the upload. + /// + /// - Remark: HTTP `POST /api/projects/{account_handle}/{project_handle}/previews/start`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/start/post(startPreviewsMultipartUpload)`. + func startPreviewsMultipartUpload(_ input: Operations.startPreviewsMultipartUpload.Input) + async throws -> Operations.startPreviewsMultipartUpload.Output + /// Downloads a preview. + /// + /// This endpoint returns a signed URL that can be used to download a preview. + /// + /// - Remark: HTTP `GET /api/projects/{account_handle}/{project_handle}/previews/{preview_id}`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/{preview_id}/get(downloadPreview)`. + func downloadPreview(_ input: Operations.downloadPreview.Input) async throws + -> Operations.downloadPreview.Output /// List all project tokens. /// /// This endpoint returns all tokens for a given project. @@ -304,6 +337,32 @@ public enum Components { } public enum CodingKeys: String, CodingKey { case error } } + /// The URL to download an artifact. + /// + /// - Remark: Generated from `#/components/schemas/ArtifactDownloadURL`. + public struct ArtifactDownloadURL: Codable, Equatable, Hashable, Sendable { + /// The UNIX timestamp when the URL expires. + /// + /// - Remark: Generated from `#/components/schemas/ArtifactDownloadURL/expires_at`. + public var expires_at: Swift.Int + /// The URL to download the artifact. + /// + /// - Remark: Generated from `#/components/schemas/ArtifactDownloadURL/url`. + public var url: Swift.String + /// Creates a new `ArtifactDownloadURL`. + /// + /// - Parameters: + /// - expires_at: The UNIX timestamp when the URL expires. + /// - url: The URL to download the artifact. + public init(expires_at: Swift.Int, url: Swift.String) { + self.expires_at = expires_at + self.url = url + } + public enum CodingKeys: String, CodingKey { + case expires_at + case url + } + } /// Represents an multipart upload's part identified by the upload id and the part number /// /// - Remark: Generated from `#/components/schemas/ArtifactMultipartUploadPart`. @@ -508,7 +567,7 @@ public enum Components { case status } } - /// API tokens to authenticate with. + /// A pair of access token to authenticate requests and refresh token to generate new access tokens when they expire. /// /// - Remark: Generated from `#/components/schemas/AuthenticationTokens`. public struct AuthenticationTokens: Codable, Equatable, Hashable, Sendable { @@ -516,7 +575,7 @@ public enum Components { /// /// - Remark: Generated from `#/components/schemas/AuthenticationTokens/access_token`. public var access_token: Swift.String - /// API refresh token. + /// A token to generate new API access tokens when they expire. /// /// - Remark: Generated from `#/components/schemas/AuthenticationTokens/refresh_token`. public var refresh_token: Swift.String @@ -524,7 +583,7 @@ public enum Components { /// /// - Parameters: /// - access_token: API access token. - /// - refresh_token: API refresh token. + /// - refresh_token: A token to generate new API access tokens when they expire. public init(access_token: Swift.String, refresh_token: Swift.String) { self.access_token = access_token self.refresh_token = refresh_token @@ -1191,6 +1250,96 @@ public enum Components { } public enum CodingKeys: String, CodingKey { case current_month_remote_cache_hits } } + /// The upload has been initiated and preview and upload unique identifier are returned to upload the various parts using multi-part uploads + /// + /// - Remark: Generated from `#/components/schemas/PreviewArtifactUpload`. + public struct PreviewArtifactUpload: Codable, Equatable, Hashable, Sendable { + /// Data that contains preview and upload unique identifier associated with the multipart upload to use when uploading parts + /// + /// - Remark: Generated from `#/components/schemas/PreviewArtifactUpload/data`. + public struct dataPayload: Codable, Equatable, Hashable, Sendable { + /// The id of the preview. + /// + /// - Remark: Generated from `#/components/schemas/PreviewArtifactUpload/data/preview_id`. + public var preview_id: Swift.String + /// The upload ID + /// + /// - Remark: Generated from `#/components/schemas/PreviewArtifactUpload/data/upload_id`. + public var upload_id: Swift.String + /// Creates a new `dataPayload`. + /// + /// - Parameters: + /// - preview_id: The id of the preview. + /// - upload_id: The upload ID + public init(preview_id: Swift.String, upload_id: Swift.String) { + self.preview_id = preview_id + self.upload_id = upload_id + } + public enum CodingKeys: String, CodingKey { + case preview_id + case upload_id + } + } + /// Data that contains preview and upload unique identifier associated with the multipart upload to use when uploading parts + /// + /// - Remark: Generated from `#/components/schemas/PreviewArtifactUpload/data`. + public var data: Components.Schemas.PreviewArtifactUpload.dataPayload + /// - Remark: Generated from `#/components/schemas/PreviewArtifactUpload/status`. + @frozen + public enum statusPayload: RawRepresentable, Codable, Equatable, Hashable, Sendable, + _AutoLosslessStringConvertible, CaseIterable + { + case success + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "success": self = .success + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .success: return "success" + } + } + public static var allCases: [statusPayload] { [.success] } + } + /// - Remark: Generated from `#/components/schemas/PreviewArtifactUpload/status`. + public var status: Components.Schemas.PreviewArtifactUpload.statusPayload + /// Creates a new `PreviewArtifactUpload`. + /// + /// - Parameters: + /// - data: Data that contains preview and upload unique identifier associated with the multipart upload to use when uploading parts + /// - status: + public init( + data: Components.Schemas.PreviewArtifactUpload.dataPayload, + status: Components.Schemas.PreviewArtifactUpload.statusPayload + ) { + self.data = data + self.status = status + } + public enum CodingKeys: String, CodingKey { + case data + case status + } + } + /// The preview multipart upload has been completed + /// + /// - Remark: Generated from `#/components/schemas/PreviewUploadCompletion`. + public struct PreviewUploadCompletion: Codable, Equatable, Hashable, Sendable { + /// The URL to download the preview + /// + /// - Remark: Generated from `#/components/schemas/PreviewUploadCompletion/url`. + public var url: Swift.String + /// Creates a new `PreviewUploadCompletion`. + /// + /// - Parameters: + /// - url: The URL to download the preview + public init(url: Swift.String) { self.url = url } + public enum CodingKeys: String, CodingKey { case url } + } /// - Remark: Generated from `#/components/schemas/Project`. public struct Project: Codable, Equatable, Hashable, Sendable { /// The full name of the project (e.g. tuist/tuist) @@ -6706,14 +6855,14 @@ public enum Operations { case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) } } - /// List all project tokens. + /// It completes a multi-part upload. /// - /// This endpoint returns all tokens for a given project. + /// Given the upload ID and all the parts with their ETags, this endpoint completes the multipart upload. /// - /// - Remark: HTTP `GET /api/projects/{account_handle}/{project_handle}/tokens`. - /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)`. - public enum listProjectTokens { - public static let id: String = "listProjectTokens" + /// - Remark: HTTP `POST /api/projects/{account_handle}/{project_handle}/previews/complete`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/complete/post(completePreviewsMultipartUpload)`. + public enum completePreviewsMultipartUpload { + public static let id: String = "completePreviewsMultipartUpload" public struct Input: Sendable, Equatable, Hashable { public struct Path: Sendable, Equatable, Hashable { public var account_handle: Swift.String @@ -6728,24 +6877,54 @@ public enum Operations { self.project_handle = project_handle } } - public var path: Operations.listProjectTokens.Input.Path + public var path: Operations.completePreviewsMultipartUpload.Input.Path public struct Query: Sendable, Equatable, Hashable { /// Creates a new `Query`. public init() {} } - public var query: Operations.listProjectTokens.Input.Query + public var query: Operations.completePreviewsMultipartUpload.Input.Query public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. public init() {} } - public var headers: Operations.listProjectTokens.Input.Headers + public var headers: Operations.completePreviewsMultipartUpload.Input.Headers public struct Cookies: Sendable, Equatable, Hashable { /// Creates a new `Cookies`. public init() {} } - public var cookies: Operations.listProjectTokens.Input.Cookies - @frozen public enum Body: Sendable, Equatable, Hashable {} - public var body: Operations.listProjectTokens.Input.Body? + public var cookies: Operations.completePreviewsMultipartUpload.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// preview multipart upload completion + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/complete/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/complete/POST/json/multipart_upload_parts`. + public var multipart_upload_parts: + Components.Schemas.ArtifactMultipartUploadParts + /// The id of the preview. + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/complete/POST/json/preview_id`. + public var preview_id: Swift.String + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - multipart_upload_parts: + /// - preview_id: The id of the preview. + public init( + multipart_upload_parts: Components.Schemas.ArtifactMultipartUploadParts, + preview_id: Swift.String + ) { + self.multipart_upload_parts = multipart_upload_parts + self.preview_id = preview_id + } + public enum CodingKeys: String, CodingKey { + case multipart_upload_parts + case preview_id + } + } + case json(Operations.completePreviewsMultipartUpload.Input.Body.jsonPayload) + } + public var body: Operations.completePreviewsMultipartUpload.Input.Body? /// Creates a new `Input`. /// /// - Parameters: @@ -6755,11 +6934,11 @@ public enum Operations { /// - cookies: /// - body: public init( - path: Operations.listProjectTokens.Input.Path, - query: Operations.listProjectTokens.Input.Query = .init(), - headers: Operations.listProjectTokens.Input.Headers = .init(), - cookies: Operations.listProjectTokens.Input.Cookies = .init(), - body: Operations.listProjectTokens.Input.Body? = nil + path: Operations.completePreviewsMultipartUpload.Input.Path, + query: Operations.completePreviewsMultipartUpload.Input.Query = .init(), + headers: Operations.completePreviewsMultipartUpload.Input.Headers = .init(), + cookies: Operations.completePreviewsMultipartUpload.Input.Cookies = .init(), + body: Operations.completePreviewsMultipartUpload.Input.Body? = nil ) { self.path = path self.query = query @@ -6775,153 +6954,159 @@ public enum Operations { public init() {} } /// Received HTTP response headers - public var headers: Operations.listProjectTokens.Output.Ok.Headers + public var headers: Operations.completePreviewsMultipartUpload.Output.Ok.Headers @frozen public enum Body: Sendable, Equatable, Hashable { - /// A list of project tokens. + /// The preview multipart upload has been completed /// - /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/tokens/GET/json`. + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/complete/POST/json`. public struct jsonPayload: Codable, Equatable, Hashable, Sendable { - /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/tokens/GET/json/tokens`. - public var tokens: [Components.Schemas.ProjectToken] + /// The URL to download the preview + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/complete/POST/json/url`. + public var url: Swift.String /// Creates a new `jsonPayload`. /// /// - Parameters: - /// - tokens: - public init(tokens: [Components.Schemas.ProjectToken]) { - self.tokens = tokens - } - public enum CodingKeys: String, CodingKey { case tokens } + /// - url: The URL to download the preview + public init(url: Swift.String) { self.url = url } + public enum CodingKeys: String, CodingKey { case url } } - case json(Operations.listProjectTokens.Output.Ok.Body.jsonPayload) + case json(Operations.completePreviewsMultipartUpload.Output.Ok.Body.jsonPayload) } /// Received HTTP response body - public var body: Operations.listProjectTokens.Output.Ok.Body + public var body: Operations.completePreviewsMultipartUpload.Output.Ok.Body /// Creates a new `Ok`. /// /// - Parameters: /// - headers: Received HTTP response headers /// - body: Received HTTP response body public init( - headers: Operations.listProjectTokens.Output.Ok.Headers = .init(), - body: Operations.listProjectTokens.Output.Ok.Body + headers: Operations.completePreviewsMultipartUpload.Output.Ok.Headers = .init(), + body: Operations.completePreviewsMultipartUpload.Output.Ok.Body ) { self.headers = headers self.body = body } } - /// A list of project tokens. + /// The upload has been completed /// - /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)/responses/200`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/complete/post(completePreviewsMultipartUpload)/responses/200`. /// /// HTTP response code: `200 ok`. - case ok(Operations.listProjectTokens.Output.Ok) + case ok(Operations.completePreviewsMultipartUpload.Output.Ok) public struct Unauthorized: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. public init() {} } /// Received HTTP response headers - public var headers: Operations.listProjectTokens.Output.Unauthorized.Headers + public var headers: + Operations.completePreviewsMultipartUpload.Output.Unauthorized.Headers @frozen public enum Body: Sendable, Equatable, Hashable { case json(Components.Schemas._Error) } /// Received HTTP response body - public var body: Operations.listProjectTokens.Output.Unauthorized.Body + public var body: Operations.completePreviewsMultipartUpload.Output.Unauthorized.Body /// Creates a new `Unauthorized`. /// /// - Parameters: /// - headers: Received HTTP response headers /// - body: Received HTTP response body public init( - headers: Operations.listProjectTokens.Output.Unauthorized.Headers = .init(), - body: Operations.listProjectTokens.Output.Unauthorized.Body + headers: Operations.completePreviewsMultipartUpload.Output.Unauthorized + .Headers = .init(), + body: Operations.completePreviewsMultipartUpload.Output.Unauthorized.Body ) { self.headers = headers self.body = body } } - /// You need to be authenticated to list tokens + /// You need to be authenticated to access this resource /// - /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)/responses/401`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/complete/post(completePreviewsMultipartUpload)/responses/401`. /// /// HTTP response code: `401 unauthorized`. - case unauthorized(Operations.listProjectTokens.Output.Unauthorized) + case unauthorized(Operations.completePreviewsMultipartUpload.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. public init() {} } /// Received HTTP response headers - public var headers: Operations.listProjectTokens.Output.Forbidden.Headers + public var headers: + Operations.completePreviewsMultipartUpload.Output.Forbidden.Headers @frozen public enum Body: Sendable, Equatable, Hashable { case json(Components.Schemas._Error) } /// Received HTTP response body - public var body: Operations.listProjectTokens.Output.Forbidden.Body + public var body: Operations.completePreviewsMultipartUpload.Output.Forbidden.Body /// Creates a new `Forbidden`. /// /// - Parameters: /// - headers: Received HTTP response headers /// - body: Received HTTP response body public init( - headers: Operations.listProjectTokens.Output.Forbidden.Headers = .init(), - body: Operations.listProjectTokens.Output.Forbidden.Body + headers: Operations.completePreviewsMultipartUpload.Output.Forbidden.Headers = + .init(), + body: Operations.completePreviewsMultipartUpload.Output.Forbidden.Body ) { self.headers = headers self.body = body } } - /// You need to be authorized to list tokens + /// The authenticated subject is not authorized to perform this action /// - /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)/responses/403`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/complete/post(completePreviewsMultipartUpload)/responses/403`. /// /// HTTP response code: `403 forbidden`. - case forbidden(Operations.listProjectTokens.Output.Forbidden) + case forbidden(Operations.completePreviewsMultipartUpload.Output.Forbidden) public struct NotFound: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. public init() {} } /// Received HTTP response headers - public var headers: Operations.listProjectTokens.Output.NotFound.Headers + public var headers: + Operations.completePreviewsMultipartUpload.Output.NotFound.Headers @frozen public enum Body: Sendable, Equatable, Hashable { case json(Components.Schemas._Error) } /// Received HTTP response body - public var body: Operations.listProjectTokens.Output.NotFound.Body + public var body: Operations.completePreviewsMultipartUpload.Output.NotFound.Body /// Creates a new `NotFound`. /// /// - Parameters: /// - headers: Received HTTP response headers /// - body: Received HTTP response body public init( - headers: Operations.listProjectTokens.Output.NotFound.Headers = .init(), - body: Operations.listProjectTokens.Output.NotFound.Body + headers: Operations.completePreviewsMultipartUpload.Output.NotFound.Headers = + .init(), + body: Operations.completePreviewsMultipartUpload.Output.NotFound.Body ) { self.headers = headers self.body = body } } - /// The project was not found + /// The project doesn't exist /// - /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)/responses/404`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/complete/post(completePreviewsMultipartUpload)/responses/404`. /// /// HTTP response code: `404 notFound`. - case notFound(Operations.listProjectTokens.Output.NotFound) + case notFound(Operations.completePreviewsMultipartUpload.Output.NotFound) /// Undocumented response. /// /// A response with a code that is not documented in the OpenAPI document. case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) } } - /// Create a new project token. + /// It generates a signed URL for uploading a part. /// - /// This endpoint returns a new project token. + /// Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. /// - /// - Remark: HTTP `POST /api/projects/{account_handle}/{project_handle}/tokens`. - /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)`. - public enum createProjectToken { - public static let id: String = "createProjectToken" + /// - Remark: HTTP `POST /api/projects/{account_handle}/{project_handle}/previews/generate-url`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/generate-url/post(generatePreviewsMultipartUploadURL)`. + public enum generatePreviewsMultipartUploadURL { + public static let id: String = "generatePreviewsMultipartUploadURL" public struct Input: Sendable, Equatable, Hashable { public struct Path: Sendable, Equatable, Hashable { public var account_handle: Swift.String @@ -6936,24 +7121,53 @@ public enum Operations { self.project_handle = project_handle } } - public var path: Operations.createProjectToken.Input.Path + public var path: Operations.generatePreviewsMultipartUploadURL.Input.Path public struct Query: Sendable, Equatable, Hashable { /// Creates a new `Query`. public init() {} } - public var query: Operations.createProjectToken.Input.Query + public var query: Operations.generatePreviewsMultipartUploadURL.Input.Query public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. public init() {} } - public var headers: Operations.createProjectToken.Input.Headers + public var headers: Operations.generatePreviewsMultipartUploadURL.Input.Headers public struct Cookies: Sendable, Equatable, Hashable { /// Creates a new `Cookies`. public init() {} } - public var cookies: Operations.createProjectToken.Input.Cookies - @frozen public enum Body: Sendable, Equatable, Hashable {} - public var body: Operations.createProjectToken.Input.Body? + public var cookies: Operations.generatePreviewsMultipartUploadURL.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Artifact to generate a signed URL for + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/generate-url/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/generate-url/POST/json/multipart_upload_part`. + public var multipart_upload_part: Components.Schemas.ArtifactMultipartUploadPart + /// The id of the preview. + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/generate-url/POST/json/preview_id`. + public var preview_id: Swift.String + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - multipart_upload_part: + /// - preview_id: The id of the preview. + public init( + multipart_upload_part: Components.Schemas.ArtifactMultipartUploadPart, + preview_id: Swift.String + ) { + self.multipart_upload_part = multipart_upload_part + self.preview_id = preview_id + } + public enum CodingKeys: String, CodingKey { + case multipart_upload_part + case preview_id + } + } + case json(Operations.generatePreviewsMultipartUploadURL.Input.Body.jsonPayload) + } + public var body: Operations.generatePreviewsMultipartUploadURL.Input.Body? /// Creates a new `Input`. /// /// - Parameters: @@ -6963,11 +7177,11 @@ public enum Operations { /// - cookies: /// - body: public init( - path: Operations.createProjectToken.Input.Path, - query: Operations.createProjectToken.Input.Query = .init(), - headers: Operations.createProjectToken.Input.Headers = .init(), - cookies: Operations.createProjectToken.Input.Cookies = .init(), - body: Operations.createProjectToken.Input.Body? = nil + path: Operations.generatePreviewsMultipartUploadURL.Input.Path, + query: Operations.generatePreviewsMultipartUploadURL.Input.Query = .init(), + headers: Operations.generatePreviewsMultipartUploadURL.Input.Headers = .init(), + cookies: Operations.generatePreviewsMultipartUploadURL.Input.Cookies = .init(), + body: Operations.generatePreviewsMultipartUploadURL.Input.Body? = nil ) { self.path = path self.query = query @@ -6983,115 +7197,1002 @@ public enum Operations { public init() {} } /// Received HTTP response headers - public var headers: Operations.createProjectToken.Output.Ok.Headers + public var headers: Operations.generatePreviewsMultipartUploadURL.Output.Ok.Headers @frozen public enum Body: Sendable, Equatable, Hashable { - /// A new project token. - /// - /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/tokens/POST/json`. - public struct jsonPayload: Codable, Equatable, Hashable, Sendable { - /// The generated project token. - /// - /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/tokens/POST/json/token`. - public var token: Swift.String - /// Creates a new `jsonPayload`. - /// - /// - Parameters: - /// - token: The generated project token. - public init(token: Swift.String) { self.token = token } - public enum CodingKeys: String, CodingKey { case token } - } - case json(Operations.createProjectToken.Output.Ok.Body.jsonPayload) + case json(Components.Schemas.ArtifactMultipartUploadURL) } /// Received HTTP response body - public var body: Operations.createProjectToken.Output.Ok.Body + public var body: Operations.generatePreviewsMultipartUploadURL.Output.Ok.Body /// Creates a new `Ok`. /// /// - Parameters: /// - headers: Received HTTP response headers /// - body: Received HTTP response body public init( - headers: Operations.createProjectToken.Output.Ok.Headers = .init(), - body: Operations.createProjectToken.Output.Ok.Body + headers: Operations.generatePreviewsMultipartUploadURL.Output.Ok.Headers = + .init(), + body: Operations.generatePreviewsMultipartUploadURL.Output.Ok.Body ) { self.headers = headers self.body = body } } - /// A project token was generated + /// The URL has been generated /// - /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)/responses/200`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/generate-url/post(generatePreviewsMultipartUploadURL)/responses/200`. /// /// HTTP response code: `200 ok`. - case ok(Operations.createProjectToken.Output.Ok) + case ok(Operations.generatePreviewsMultipartUploadURL.Output.Ok) public struct Unauthorized: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. public init() {} } /// Received HTTP response headers - public var headers: Operations.createProjectToken.Output.Unauthorized.Headers + public var headers: + Operations.generatePreviewsMultipartUploadURL.Output.Unauthorized.Headers @frozen public enum Body: Sendable, Equatable, Hashable { case json(Components.Schemas._Error) } /// Received HTTP response body - public var body: Operations.createProjectToken.Output.Unauthorized.Body + public var body: + Operations.generatePreviewsMultipartUploadURL.Output.Unauthorized.Body /// Creates a new `Unauthorized`. /// /// - Parameters: /// - headers: Received HTTP response headers /// - body: Received HTTP response body public init( - headers: Operations.createProjectToken.Output.Unauthorized.Headers = .init(), - body: Operations.createProjectToken.Output.Unauthorized.Body + headers: Operations.generatePreviewsMultipartUploadURL.Output.Unauthorized + .Headers = .init(), + body: Operations.generatePreviewsMultipartUploadURL.Output.Unauthorized.Body ) { self.headers = headers self.body = body } } - /// You need to be authenticated to issue new tokens + /// You need to be authenticated to access this resource /// - /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)/responses/401`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/generate-url/post(generatePreviewsMultipartUploadURL)/responses/401`. /// /// HTTP response code: `401 unauthorized`. - case unauthorized(Operations.createProjectToken.Output.Unauthorized) + case unauthorized(Operations.generatePreviewsMultipartUploadURL.Output.Unauthorized) public struct Forbidden: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. public init() {} } /// Received HTTP response headers - public var headers: Operations.createProjectToken.Output.Forbidden.Headers + public var headers: + Operations.generatePreviewsMultipartUploadURL.Output.Forbidden.Headers @frozen public enum Body: Sendable, Equatable, Hashable { case json(Components.Schemas._Error) } /// Received HTTP response body - public var body: Operations.createProjectToken.Output.Forbidden.Body + public var body: Operations.generatePreviewsMultipartUploadURL.Output.Forbidden.Body /// Creates a new `Forbidden`. /// /// - Parameters: /// - headers: Received HTTP response headers /// - body: Received HTTP response body public init( - headers: Operations.createProjectToken.Output.Forbidden.Headers = .init(), - body: Operations.createProjectToken.Output.Forbidden.Body + headers: Operations.generatePreviewsMultipartUploadURL.Output.Forbidden + .Headers = .init(), + body: Operations.generatePreviewsMultipartUploadURL.Output.Forbidden.Body ) { self.headers = headers self.body = body } } - /// You need to be authorized to issue new tokens + /// The authenticated subject is not authorized to perform this action /// - /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)/responses/403`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/generate-url/post(generatePreviewsMultipartUploadURL)/responses/403`. /// /// HTTP response code: `403 forbidden`. - case forbidden(Operations.createProjectToken.Output.Forbidden) + case forbidden(Operations.generatePreviewsMultipartUploadURL.Output.Forbidden) public struct NotFound: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. public init() {} } /// Received HTTP response headers - public var headers: Operations.createProjectToken.Output.NotFound.Headers + public var headers: + Operations.generatePreviewsMultipartUploadURL.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.generatePreviewsMultipartUploadURL.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.generatePreviewsMultipartUploadURL.Output.NotFound.Headers = + .init(), + body: Operations.generatePreviewsMultipartUploadURL.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project doesn't exist + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/generate-url/post(generatePreviewsMultipartUploadURL)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.generatePreviewsMultipartUploadURL.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// It initiates a multipart upload for a preview artifact. + /// + /// The endpoint returns an upload ID that can be used to generate URLs for the individual parts and complete the upload. + /// + /// - Remark: HTTP `POST /api/projects/{account_handle}/{project_handle}/previews/start`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/start/post(startPreviewsMultipartUpload)`. + public enum startPreviewsMultipartUpload { + public static let id: String = "startPreviewsMultipartUpload" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var account_handle: Swift.String + public var project_handle: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - account_handle: + /// - project_handle: + public init(account_handle: Swift.String, project_handle: Swift.String) { + self.account_handle = account_handle + self.project_handle = project_handle + } + } + public var path: Operations.startPreviewsMultipartUpload.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.startPreviewsMultipartUpload.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.startPreviewsMultipartUpload.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.startPreviewsMultipartUpload.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.startPreviewsMultipartUpload.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.startPreviewsMultipartUpload.Input.Path, + query: Operations.startPreviewsMultipartUpload.Input.Query = .init(), + headers: Operations.startPreviewsMultipartUpload.Input.Headers = .init(), + cookies: Operations.startPreviewsMultipartUpload.Input.Cookies = .init(), + body: Operations.startPreviewsMultipartUpload.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.startPreviewsMultipartUpload.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + /// The upload has been initiated and preview and upload unique identifier are returned to upload the various parts using multi-part uploads + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/start/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// Data that contains preview and upload unique identifier associated with the multipart upload to use when uploading parts + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/start/POST/json/data`. + public struct dataPayload: Codable, Equatable, Hashable, Sendable { + /// The id of the preview. + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/start/POST/json/data/preview_id`. + public var preview_id: Swift.String + /// The upload ID + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/start/POST/json/data/upload_id`. + public var upload_id: Swift.String + /// Creates a new `dataPayload`. + /// + /// - Parameters: + /// - preview_id: The id of the preview. + /// - upload_id: The upload ID + public init(preview_id: Swift.String, upload_id: Swift.String) { + self.preview_id = preview_id + self.upload_id = upload_id + } + public enum CodingKeys: String, CodingKey { + case preview_id + case upload_id + } + } + /// Data that contains preview and upload unique identifier associated with the multipart upload to use when uploading parts + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/start/POST/json/data`. + public var data: + Operations.startPreviewsMultipartUpload.Output.Ok.Body.jsonPayload + .dataPayload + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/start/POST/json/status`. + @frozen + public enum statusPayload: RawRepresentable, Codable, Equatable, Hashable, + Sendable, _AutoLosslessStringConvertible, CaseIterable + { + case success + /// Parsed a raw value that was not defined in the OpenAPI document. + case undocumented(String) + public init?(rawValue: String) { + switch rawValue { + case "success": self = .success + default: self = .undocumented(rawValue) + } + } + public var rawValue: String { + switch self { + case let .undocumented(string): return string + case .success: return "success" + } + } + public static var allCases: [statusPayload] { [.success] } + } + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/previews/start/POST/json/status`. + public var status: + Operations.startPreviewsMultipartUpload.Output.Ok.Body.jsonPayload + .statusPayload + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - data: Data that contains preview and upload unique identifier associated with the multipart upload to use when uploading parts + /// - status: + public init( + data: Operations.startPreviewsMultipartUpload.Output.Ok.Body.jsonPayload + .dataPayload, + status: Operations.startPreviewsMultipartUpload.Output.Ok.Body + .jsonPayload.statusPayload + ) { + self.data = data + self.status = status + } + public enum CodingKeys: String, CodingKey { + case data + case status + } + } + case json(Operations.startPreviewsMultipartUpload.Output.Ok.Body.jsonPayload) + } + /// Received HTTP response body + public var body: Operations.startPreviewsMultipartUpload.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.startPreviewsMultipartUpload.Output.Ok.Headers = .init(), + body: Operations.startPreviewsMultipartUpload.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The upload has been started + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/start/post(startPreviewsMultipartUpload)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.startPreviewsMultipartUpload.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: + Operations.startPreviewsMultipartUpload.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.startPreviewsMultipartUpload.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.startPreviewsMultipartUpload.Output.Unauthorized.Headers = + .init(), + body: Operations.startPreviewsMultipartUpload.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/start/post(startPreviewsMultipartUpload)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.startPreviewsMultipartUpload.Output.Unauthorized) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.startPreviewsMultipartUpload.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.startPreviewsMultipartUpload.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.startPreviewsMultipartUpload.Output.Forbidden.Headers = + .init(), + body: Operations.startPreviewsMultipartUpload.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/start/post(startPreviewsMultipartUpload)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.startPreviewsMultipartUpload.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.startPreviewsMultipartUpload.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.startPreviewsMultipartUpload.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.startPreviewsMultipartUpload.Output.NotFound.Headers = + .init(), + body: Operations.startPreviewsMultipartUpload.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project doesn't exist + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/start/post(startPreviewsMultipartUpload)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.startPreviewsMultipartUpload.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Downloads a preview. + /// + /// This endpoint returns a signed URL that can be used to download a preview. + /// + /// - Remark: HTTP `GET /api/projects/{account_handle}/{project_handle}/previews/{preview_id}`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/{preview_id}/get(downloadPreview)`. + public enum downloadPreview { + public static let id: String = "downloadPreview" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var account_handle: Swift.String + public var project_handle: Swift.String + public var preview_id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - account_handle: + /// - project_handle: + /// - preview_id: + public init( + account_handle: Swift.String, + project_handle: Swift.String, + preview_id: Swift.String + ) { + self.account_handle = account_handle + self.project_handle = project_handle + self.preview_id = preview_id + } + } + public var path: Operations.downloadPreview.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.downloadPreview.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.downloadPreview.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.downloadPreview.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.downloadPreview.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.downloadPreview.Input.Path, + query: Operations.downloadPreview.Input.Query = .init(), + headers: Operations.downloadPreview.Input.Headers = .init(), + cookies: Operations.downloadPreview.Input.Cookies = .init(), + body: Operations.downloadPreview.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.downloadPreview.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.ArtifactDownloadURL) + } + /// Received HTTP response body + public var body: Operations.downloadPreview.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.downloadPreview.Output.Ok.Headers = .init(), + body: Operations.downloadPreview.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The preview exists and can be downloaded + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/{preview_id}/get(downloadPreview)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.downloadPreview.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.downloadPreview.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.downloadPreview.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.downloadPreview.Output.Unauthorized.Headers = .init(), + body: Operations.downloadPreview.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/{preview_id}/get(downloadPreview)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.downloadPreview.Output.Unauthorized) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.downloadPreview.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.downloadPreview.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.downloadPreview.Output.Forbidden.Headers = .init(), + body: Operations.downloadPreview.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/{preview_id}/get(downloadPreview)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.downloadPreview.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.downloadPreview.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.downloadPreview.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.downloadPreview.Output.NotFound.Headers = .init(), + body: Operations.downloadPreview.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The build doesn't exist + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/previews/{preview_id}/get(downloadPreview)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.downloadPreview.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// List all project tokens. + /// + /// This endpoint returns all tokens for a given project. + /// + /// - Remark: HTTP `GET /api/projects/{account_handle}/{project_handle}/tokens`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)`. + public enum listProjectTokens { + public static let id: String = "listProjectTokens" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var account_handle: Swift.String + public var project_handle: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - account_handle: + /// - project_handle: + public init(account_handle: Swift.String, project_handle: Swift.String) { + self.account_handle = account_handle + self.project_handle = project_handle + } + } + public var path: Operations.listProjectTokens.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.listProjectTokens.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.listProjectTokens.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.listProjectTokens.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.listProjectTokens.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.listProjectTokens.Input.Path, + query: Operations.listProjectTokens.Input.Query = .init(), + headers: Operations.listProjectTokens.Input.Headers = .init(), + cookies: Operations.listProjectTokens.Input.Cookies = .init(), + body: Operations.listProjectTokens.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.listProjectTokens.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + /// A list of project tokens. + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/tokens/GET/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/tokens/GET/json/tokens`. + public var tokens: [Components.Schemas.ProjectToken] + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - tokens: + public init(tokens: [Components.Schemas.ProjectToken]) { + self.tokens = tokens + } + public enum CodingKeys: String, CodingKey { case tokens } + } + case json(Operations.listProjectTokens.Output.Ok.Body.jsonPayload) + } + /// Received HTTP response body + public var body: Operations.listProjectTokens.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.listProjectTokens.Output.Ok.Headers = .init(), + body: Operations.listProjectTokens.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// A list of project tokens. + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.listProjectTokens.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.listProjectTokens.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.listProjectTokens.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.listProjectTokens.Output.Unauthorized.Headers = .init(), + body: Operations.listProjectTokens.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to list tokens + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.listProjectTokens.Output.Unauthorized) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.listProjectTokens.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.listProjectTokens.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.listProjectTokens.Output.Forbidden.Headers = .init(), + body: Operations.listProjectTokens.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authorized to list tokens + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.listProjectTokens.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.listProjectTokens.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.listProjectTokens.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.listProjectTokens.Output.NotFound.Headers = .init(), + body: Operations.listProjectTokens.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project was not found + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/get(listProjectTokens)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.listProjectTokens.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// Create a new project token. + /// + /// This endpoint returns a new project token. + /// + /// - Remark: HTTP `POST /api/projects/{account_handle}/{project_handle}/tokens`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)`. + public enum createProjectToken { + public static let id: String = "createProjectToken" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var account_handle: Swift.String + public var project_handle: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - account_handle: + /// - project_handle: + public init(account_handle: Swift.String, project_handle: Swift.String) { + self.account_handle = account_handle + self.project_handle = project_handle + } + } + public var path: Operations.createProjectToken.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.createProjectToken.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.createProjectToken.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.createProjectToken.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable {} + public var body: Operations.createProjectToken.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.createProjectToken.Input.Path, + query: Operations.createProjectToken.Input.Query = .init(), + headers: Operations.createProjectToken.Input.Headers = .init(), + cookies: Operations.createProjectToken.Input.Cookies = .init(), + body: Operations.createProjectToken.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createProjectToken.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + /// A new project token. + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/tokens/POST/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// The generated project token. + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/tokens/POST/json/token`. + public var token: Swift.String + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - token: The generated project token. + public init(token: Swift.String) { self.token = token } + public enum CodingKeys: String, CodingKey { case token } + } + case json(Operations.createProjectToken.Output.Ok.Body.jsonPayload) + } + /// Received HTTP response body + public var body: Operations.createProjectToken.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createProjectToken.Output.Ok.Headers = .init(), + body: Operations.createProjectToken.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// A project token was generated + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.createProjectToken.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createProjectToken.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createProjectToken.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createProjectToken.Output.Unauthorized.Headers = .init(), + body: Operations.createProjectToken.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to issue new tokens + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.createProjectToken.Output.Unauthorized) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createProjectToken.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.createProjectToken.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.createProjectToken.Output.Forbidden.Headers = .init(), + body: Operations.createProjectToken.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authorized to issue new tokens + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/post(createProjectToken)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.createProjectToken.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.createProjectToken.Output.NotFound.Headers @frozen public enum Body: Sendable, Equatable, Hashable { case json(Components.Schemas._Error) } @@ -7219,6 +8320,37 @@ public enum Operations { /// /// HTTP response code: `204 noContent`. case noContent(Operations.revokeProjectToken.Output.NoContent) + public struct BadRequest: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.revokeProjectToken.Output.BadRequest.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.revokeProjectToken.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.revokeProjectToken.Output.BadRequest.Headers = .init(), + body: Operations.revokeProjectToken.Output.BadRequest.Body + ) { + self.headers = headers + self.body = body + } + } + /// The provided token ID is not valid + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/tokens/{id}/delete(revokeProjectToken)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.revokeProjectToken.Output.BadRequest) public struct Unauthorized: Sendable, Equatable, Hashable { public struct Headers: Sendable, Equatable, Hashable { /// Creates a new `Headers`. diff --git a/Sources/TuistServer/OpenAPI/cloud.yml b/Sources/TuistServer/OpenAPI/server.yml similarity index 85% rename from Sources/TuistServer/OpenAPI/cloud.yml rename to Sources/TuistServer/OpenAPI/server.yml index 940eba217dd..39601f14518 100644 --- a/Sources/TuistServer/OpenAPI/cloud.yml +++ b/Sources/TuistServer/OpenAPI/server.yml @@ -16,6 +16,21 @@ components: type: array title: AbsentCacheArtifact type: object + ArtifactDownloadURL: + description: The URL to download an artifact. + properties: + expires_at: + description: The UNIX timestamp when the URL expires. + type: integer + url: + description: The URL to download the artifact. + type: string + required: + - url + - expires_at + title: ArtifactDownloadURL + type: object + x-struct: Elixir.TuistWeb.API.Schemas.ArtifactDownloadURL ArtifactMultipartUploadPart: description: Represents an multipart upload's part identified by the upload id and the part number properties: @@ -29,7 +44,7 @@ components: - part_number - upload_id title: ArtifactMultipartUploadPart - x-struct: Elixir.TuistCloudWeb.API.Schemas.ArtifactMultipartUploadPart + x-struct: Elixir.TuistWeb.API.Schemas.ArtifactMultipartUploadPart ArtifactMultipartUploadParts: description: It represents a part that has been uploaded using multipart uploads. The part is identified by its number and the etag properties: @@ -55,7 +70,7 @@ components: - parts title: ArtifactMultipartUploadParts type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.ArtifactMultipartUploadParts + x-struct: Elixir.TuistWeb.API.Schemas.ArtifactMultipartUploadParts ArtifactMultipartUploadURL: description: The URL to upload a multipart part properties: @@ -77,7 +92,7 @@ components: - data title: ArtifactMultipartUploadURL type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.ArtifactMultipartUploadUrl + x-struct: Elixir.TuistWeb.API.Schemas.ArtifactMultipartUploadUrl ArtifactUploadID: description: The upload has been initiated and a ID is returned to upload the various parts using multi-part uploads properties: @@ -100,22 +115,22 @@ components: - data title: ArtifactUploadID type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.ArtifactUploadId + x-struct: Elixir.TuistWeb.API.Schemas.ArtifactUploadId AuthenticationTokens: - description: API tokens to authenticate with. + description: A pair of access token to authenticate requests and refresh token to generate new access tokens when they expire. properties: access_token: description: API access token. type: string refresh_token: - description: API refresh token. + description: A token to generate new API access tokens when they expire. type: string required: - access_token - refresh_token title: AuthenticationTokens type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.AuthenticationTokens + x-struct: Elixir.TuistWeb.API.Schemas.AuthenticationTokens CacheArtifactDownloadURL: description: The URL to download the artifact from the cache. properties: @@ -141,7 +156,7 @@ components: - data title: CacheArtifactDownloadURL type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.CacheArtifactDownloadURL + x-struct: Elixir.TuistWeb.API.Schemas.CacheArtifactDownloadURL CacheArtifactExistence: description: The artifact exists in the cache and can be downloaded properties: @@ -176,7 +191,7 @@ components: - builds title: CacheCategory type: string - x-struct: Elixir.TuistCloudWeb.API.Schemas.CacheCategory + x-struct: Elixir.TuistWeb.API.Schemas.CacheCategory CommandEvent: description: The schema for the command analytics event. properties: @@ -195,7 +210,7 @@ components: - url title: CommandEvent type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.CommandEvent + x-struct: Elixir.TuistWeb.API.Schemas.CommandEvent CommandEventArtifact: description: It represents an artifact that's associated with a command event (e.g. result bundles) properties: @@ -216,7 +231,7 @@ components: required: - type title: CommandEventArtifact - x-struct: Elixir.TuistCloudWeb.API.Schemas.CommandEventArtifact + x-struct: Elixir.TuistWeb.API.Schemas.CommandEventArtifact DeviceCodeAuthenticationTokens: description: Token to authenticate the user with. properties: @@ -241,7 +256,7 @@ components: - message title: Error type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.Error + x-struct: Elixir.TuistWeb.API.Schemas.Error Invitation: properties: id: @@ -266,7 +281,7 @@ components: - token title: Invitation type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.Invitation + x-struct: Elixir.TuistWeb.API.Schemas.Invitation Module: properties: hash: @@ -284,7 +299,7 @@ components: - hash title: Module type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.Module + x-struct: Elixir.TuistWeb.API.Schemas.Module Organization: description: An organization properties: @@ -328,7 +343,7 @@ components: - invitations title: Organization type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.Organization + x-struct: Elixir.TuistWeb.API.Schemas.Organization OrganizationList: description: The list of organizations the authenticated subject is part of. properties: @@ -365,7 +380,7 @@ components: - role title: OrganizationMember type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.OrganizationMember + x-struct: Elixir.TuistWeb.API.Schemas.OrganizationMember OrganizationUsage: description: The usage of an organization. properties: @@ -376,7 +391,43 @@ components: - current_month_remote_cache_hits title: OrganizationUsage type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.OrganizationUsage + x-struct: Elixir.TuistWeb.API.Schemas.OrganizationUsage + PreviewArtifactUpload: + description: The upload has been initiated and preview and upload unique identifier are returned to upload the various parts using multi-part uploads + properties: + data: + description: Data that contains preview and upload unique identifier associated with the multipart upload to use when uploading parts + properties: + preview_id: + description: The id of the preview. + type: string + upload_id: + description: The upload ID + type: string + required: + - upload_id + - preview_id + type: object + status: + default: success + enum: + - success + type: string + required: + - status + - data + title: PreviewArtifactUpload + type: object + PreviewUploadCompletion: + description: The preview multipart upload has been completed + properties: + url: + description: The URL to download the preview + type: string + required: + - url + title: PreviewUploadCompletion + type: object Project: properties: full_name: @@ -395,7 +446,7 @@ components: - token title: Project type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.Project + x-struct: Elixir.TuistWeb.API.Schemas.Project ProjectFullToken: description: A new project token. properties: @@ -421,7 +472,7 @@ components: - inserted_at title: ProjectToken type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.ProjectToken + x-struct: Elixir.TuistWeb.API.Schemas.ProjectToken Tokens: description: A list of project tokens. properties: @@ -451,7 +502,7 @@ components: - name title: User type: object - x-struct: Elixir.TuistCloudWeb.API.Schemas.User + x-struct: Elixir.TuistWeb.API.Schemas.User securitySchemes: authorization: scheme: bearer @@ -1806,6 +1857,257 @@ paths: summary: Cleans cache for a given project tags: - Cache + /api/projects/{account_handle}/{project_handle}/previews/complete: + post: + callbacks: {} + description: Given the upload ID and all the parts with their ETags, this endpoint completes the multipart upload. + operationId: completePreviewsMultipartUpload + parameters: + - description: The handle of the account. + in: path + name: account_handle + required: true + schema: + type: string + - description: The handle of the project. + in: path + name: project_handle + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + description: The request body to complete the multipart upload of a preview. + properties: + multipart_upload_parts: + $ref: '#/components/schemas/ArtifactMultipartUploadParts' + preview_id: + description: The id of the preview. + type: string + required: + - multipart_upload_parts + - preview_id + type: object + description: preview multipart upload completion + required: false + responses: + 200: + content: + application/json: + schema: + description: The preview multipart upload has been completed + properties: + url: + description: The URL to download the preview + type: string + required: + - url + title: PreviewUploadCompletion + type: object + description: The upload has been completed + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project doesn't exist + summary: It completes a multi-part upload. + tags: [] + /api/projects/{account_handle}/{project_handle}/previews/generate-url: + post: + callbacks: {} + description: Given an upload ID and a part number, this endpoint returns a signed URL that can be used to upload a part of a multipart upload. The URL is short-lived and expires in 120 seconds. + operationId: generatePreviewsMultipartUploadURL + parameters: + - description: The handle of the account. + in: path + name: account_handle + required: true + schema: + type: string + - description: The handle of the project. + in: path + name: project_handle + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + properties: + multipart_upload_part: + $ref: '#/components/schemas/ArtifactMultipartUploadPart' + preview_id: + description: The id of the preview. + type: string + required: + - multipart_upload_part + - preview_id + type: object + description: Artifact to generate a signed URL for + required: false + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/ArtifactMultipartUploadURL' + description: The URL has been generated + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project doesn't exist + summary: It generates a signed URL for uploading a part. + tags: [] + /api/projects/{account_handle}/{project_handle}/previews/start: + post: + callbacks: {} + description: The endpoint returns an upload ID that can be used to generate URLs for the individual parts and complete the upload. + operationId: startPreviewsMultipartUpload + parameters: + - description: The handle of the account. + in: path + name: account_handle + required: true + schema: + type: string + - description: The handle of the project. + in: path + name: project_handle + required: true + schema: + type: string + responses: + 200: + content: + application/json: + schema: + description: The upload has been initiated and preview and upload unique identifier are returned to upload the various parts using multi-part uploads + properties: + data: + description: Data that contains preview and upload unique identifier associated with the multipart upload to use when uploading parts + properties: + preview_id: + description: The id of the preview. + type: string + upload_id: + description: The upload ID + type: string + required: + - upload_id + - preview_id + type: object + status: + default: success + enum: + - success + type: string + required: + - status + - data + title: PreviewArtifactUpload + type: object + description: The upload has been started + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project doesn't exist + summary: It initiates a multipart upload for a preview artifact. + tags: [] + /api/projects/{account_handle}/{project_handle}/previews/{preview_id}: + get: + callbacks: {} + description: This endpoint returns a signed URL that can be used to download a preview. + operationId: downloadPreview + parameters: + - description: The handle of the account. + in: path + name: account_handle + required: true + schema: + type: string + - description: The handle of the project. + in: path + name: project_handle + required: true + schema: + type: string + - description: The id of the preview. + in: path + name: preview_id + required: true + schema: + type: string + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/ArtifactDownloadURL' + description: The preview exists and can be downloaded + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The build doesn't exist + summary: Downloads a preview. + tags: [] /api/projects/{account_handle}/{project_handle}/tokens: get: callbacks: {} @@ -1940,6 +2242,12 @@ paths: responses: 204: description: The project token was revoked + 400: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The provided token ID is not valid 401: content: application/json: diff --git a/Sources/TuistServer/Services/DownloadPreviewService.swift b/Sources/TuistServer/Services/DownloadPreviewService.swift new file mode 100644 index 00000000000..1a83b24c805 --- /dev/null +++ b/Sources/TuistServer/Services/DownloadPreviewService.swift @@ -0,0 +1,95 @@ +import Foundation +import Mockable +import TuistSupport + +@Mockable +public protocol DownloadPreviewServicing { + func downloadPreview( + _ previewId: String, + fullHandle: String, + serverURL: URL + ) async throws -> String +} + +public enum DownloadPreviewServiceError: FatalError, Equatable { + case unknownError(Int) + case notFound(String) + case forbidden(String) + case unauthorized(String) + + public var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .forbidden, .unauthorized: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The build could not be uploaded due to an unknown Tuist Cloud response of \(statusCode)." + case let .notFound(message), let .forbidden(message), let .unauthorized(message): + return message + } + } +} + +public final class DownloadPreviewService: DownloadPreviewServicing { + private let fullHandleService: FullHandleServicing + + public convenience init() { + self.init( + fullHandleService: FullHandleService() + ) + } + + init( + fullHandleService: FullHandleServicing + ) { + self.fullHandleService = fullHandleService + } + + public func downloadPreview( + _ previewId: String, + fullHandle: String, + serverURL: URL + ) async throws -> String { + let client = Client.authenticated(serverURL: serverURL) + let handles = try fullHandleService.parse(fullHandle) + let response = try await client.downloadPreview( + .init( + path: .init( + account_handle: handles.accountHandle, + project_handle: handles.projectHandle, + preview_id: previewId + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(build): + return build.url + } + case let .undocumented(statusCode: statusCode, _): + throw DownloadPreviewServiceError.unknownError(statusCode) + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw DownloadPreviewServiceError.forbidden(error.message) + } + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw DownloadPreviewServiceError.notFound(error.message) + } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw DownloadPreviewServiceError.unauthorized(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/MultipartUploadCompletePreviewsService.swift b/Sources/TuistServer/Services/MultipartUploadCompletePreviewsService.swift new file mode 100644 index 00000000000..dc72d136657 --- /dev/null +++ b/Sources/TuistServer/Services/MultipartUploadCompletePreviewsService.swift @@ -0,0 +1,117 @@ +import Foundation +import Mockable +import OpenAPIRuntime +import TuistSupport + +@Mockable +public protocol MultipartUploadCompletePreviewsServicing { + func completePreviewUpload( + _ previewId: String, + uploadId: String, + parts: [(etag: String, partNumber: Int)], + fullHandle: String, + serverURL: URL + ) async throws -> URL +} + +public enum MultipartUploadCompletePreviewsServiceError: FatalError, Equatable { + case unknownError(Int) + case notFound(String) + case forbidden(String) + case unauthorized(String) + case invalidURL(String) + + public var type: ErrorType { + switch self { + case .unknownError, .invalidURL: + return .bug + case .notFound, .forbidden, .unauthorized: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The multi-part upload could not get completed due to an unknown Tuist Cloud response of \(statusCode)." + case let .notFound(message), let .forbidden(message), let .unauthorized(message): + return message + case let .invalidURL(url): + return "The app build download URL \(url) returned from the server is invalid." + } + } +} + +public final class MultipartUploadCompletePreviewsService: MultipartUploadCompletePreviewsServicing { + private let fullHandleService: FullHandleServicing + + public convenience init() { + self.init( + fullHandleService: FullHandleService() + ) + } + + init( + fullHandleService: FullHandleServicing + ) { + self.fullHandleService = fullHandleService + } + + public func completePreviewUpload( + _ previewId: String, + uploadId: String, + parts: [(etag: String, partNumber: Int)], + fullHandle: String, + serverURL: URL + ) async throws -> URL { + let client = Client.authenticated(serverURL: serverURL) + let handles = try fullHandleService.parse(fullHandle) + let response = try await client.completePreviewsMultipartUpload( + .init( + path: .init( + account_handle: handles.accountHandle, + project_handle: handles.projectHandle + ), + body: .json( + .init( + multipart_upload_parts: .init( + parts: parts + .map { .init(etag: $0.etag, part_number: $0.partNumber) }, + upload_id: uploadId + ), + preview_id: previewId + ) + ) + ) + ) + switch response { + case let .ok(previewUploadCompletionResponse): + switch previewUploadCompletionResponse.body { + case let .json(previewUploadCompletionResponse): + guard let url = URL(string: previewUploadCompletionResponse.url) + else { + throw MultipartUploadCompletePreviewsServiceError.invalidURL(previewUploadCompletionResponse.url) + } + + return url + } + case let .undocumented(statusCode: statusCode, _): + throw MultipartUploadCompletePreviewsServiceError.unknownError(statusCode) + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw MultipartUploadCompletePreviewsServiceError.forbidden(error.message) + } + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw MultipartUploadCompletePreviewsServiceError.notFound(error.message) + } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw MultipartUploadCompletePreviewsServiceError.unauthorized(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/MultipartUploadGenerateURLPreviewsService.swift b/Sources/TuistServer/Services/MultipartUploadGenerateURLPreviewsService.swift new file mode 100644 index 00000000000..c601ca636c0 --- /dev/null +++ b/Sources/TuistServer/Services/MultipartUploadGenerateURLPreviewsService.swift @@ -0,0 +1,107 @@ +import Foundation +import Mockable +import TuistSupport + +@Mockable +public protocol MultipartUploadGenerateURLPreviewsServicing { + func uploadPreviews( + _ previewId: String, + partNumber: Int, + uploadId: String, + fullHandle: String, + serverURL: URL + ) async throws -> String +} + +public enum MultipartUploadGenerateURLPreviewsServiceError: FatalError, Equatable { + case unknownError(Int) + case notFound(String) + case forbidden(String) + case unauthorized(String) + + public var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .forbidden, .unauthorized: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The generation of a multi-part upload URL failed due to an unknown Tuist response of \(statusCode)." + case let .notFound(message), let .forbidden(message), let .unauthorized(message): + return message + } + } +} + +public final class MultipartUploadGenerateURLPreviewsService: MultipartUploadGenerateURLPreviewsServicing { + private let fullHandleService: FullHandleServicing + + public convenience init() { + self.init( + fullHandleService: FullHandleService() + ) + } + + init( + fullHandleService: FullHandleServicing + ) { + self.fullHandleService = fullHandleService + } + + public func uploadPreviews( + _ previewId: String, + partNumber: Int, + uploadId: String, + fullHandle: String, + serverURL: URL + ) async throws -> String { + let client = Client.authenticated(serverURL: serverURL) + let handles = try fullHandleService.parse(fullHandle) + let response = try await client.generatePreviewsMultipartUploadURL( + .init( + path: .init( + account_handle: handles.accountHandle, + project_handle: handles.projectHandle + ), + body: .json( + .init( + multipart_upload_part: .init( + part_number: partNumber, + upload_id: uploadId + ), + preview_id: previewId + ) + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(cacheArtifact): + return cacheArtifact.data.url + } + case let .undocumented(statusCode: statusCode, _): + throw MultipartUploadGenerateURLPreviewsServiceError.unknownError(statusCode) + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw MultipartUploadGenerateURLPreviewsServiceError.forbidden(error.message) + } + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw MultipartUploadGenerateURLPreviewsServiceError.notFound(error.message) + } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw MultipartUploadGenerateURLPreviewsServiceError.unauthorized(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/MultipartUploadStartPreviewsService.swift b/Sources/TuistServer/Services/MultipartUploadStartPreviewsService.swift new file mode 100644 index 00000000000..2c12c9d55af --- /dev/null +++ b/Sources/TuistServer/Services/MultipartUploadStartPreviewsService.swift @@ -0,0 +1,95 @@ +import Foundation +import Mockable +import TuistSupport + +@Mockable +public protocol MultipartUploadStartPreviewsServicing { + func startPreviewsMultipartUpload( + fullHandle: String, + serverURL: URL + ) async throws -> PreviewUpload +} + +public enum MultipartUploadStartPreviewsServiceError: FatalError, Equatable { + case unknownError(Int) + case notFound(String) + case forbidden(String) + case unauthorized(String) + + public var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .notFound, .forbidden, .unauthorized: + return .abort + } + } + + public var description: String { + switch self { + case let .unknownError(statusCode): + return "The app build could not be uploaded due to an unknown Tuist Cloud response of \(statusCode)." + case let .notFound(message), let .forbidden(message), let .unauthorized(message): + return message + } + } +} + +public final class MultipartUploadStartPreviewsService: MultipartUploadStartPreviewsServicing { + private let fullHandleService: FullHandleServicing + + public convenience init() { + self.init( + fullHandleService: FullHandleService() + ) + } + + init( + fullHandleService: FullHandleServicing + ) { + self.fullHandleService = fullHandleService + } + + public func startPreviewsMultipartUpload( + fullHandle: String, + serverURL: URL + ) async throws -> PreviewUpload { + let client = Client.authenticated(serverURL: serverURL) + let handles = try fullHandleService.parse(fullHandle) + let response = try await client.startPreviewsMultipartUpload( + .init( + path: .init( + account_handle: handles.accountHandle, + project_handle: handles.projectHandle + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(preview): + return PreviewUpload( + previewId: preview.data.preview_id, + uploadId: preview.data.upload_id + ) + } + case let .undocumented(statusCode: statusCode, _): + throw MultipartUploadStartPreviewsServiceError.unknownError(statusCode) + case let .forbidden(forbiddenResponse): + switch forbiddenResponse.body { + case let .json(error): + throw MultipartUploadStartPreviewsServiceError.forbidden(error.message) + } + case let .notFound(notFoundResponse): + switch notFoundResponse.body { + case let .json(error): + throw MultipartUploadStartPreviewsServiceError.notFound(error.message) + } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw MultipartUploadStartPreviewsServiceError.unauthorized(error.message) + } + } + } +} diff --git a/Sources/TuistServer/Services/PreviewsUploadService.swift b/Sources/TuistServer/Services/PreviewsUploadService.swift new file mode 100644 index 00000000000..c2c3173cdde --- /dev/null +++ b/Sources/TuistServer/Services/PreviewsUploadService.swift @@ -0,0 +1,92 @@ +import Foundation +import Mockable +import Path +import TuistSupport +import XcodeGraph + +@Mockable +public protocol PreviewsUploadServicing { + func uploadPreviews( + _ previewPaths: [AbsolutePath], + fullHandle: String, + serverURL: URL + ) async throws -> URL +} + +public final class PreviewsUploadService: PreviewsUploadServicing { + private let fileHandler: FileHandling + private let fileArchiver: FileArchivingFactorying + private let retryProvider: RetryProviding + private let multipartUploadStartPreviewsService: MultipartUploadStartPreviewsServicing + private let multipartUploadGenerateURLPreviewsService: MultipartUploadGenerateURLPreviewsServicing + private let multipartUploadArtifactService: MultipartUploadArtifactServicing + private let multipartUploadCompletePreviewsService: MultipartUploadCompletePreviewsServicing + + public convenience init() { + self.init( + fileHandler: FileHandler.shared, + fileArchiver: FileArchivingFactory(), + retryProvider: RetryProvider(), + multipartUploadStartPreviewsService: MultipartUploadStartPreviewsService(), + multipartUploadGenerateURLPreviewsService: + MultipartUploadGenerateURLPreviewsService(), + multipartUploadArtifactService: MultipartUploadArtifactService(), + multipartUploadCompletePreviewsService: + MultipartUploadCompletePreviewsService() + ) + } + + init( + fileHandler: FileHandling, + fileArchiver: FileArchivingFactorying, + retryProvider: RetryProviding, + multipartUploadStartPreviewsService: MultipartUploadStartPreviewsServicing, + multipartUploadGenerateURLPreviewsService: MultipartUploadGenerateURLPreviewsServicing, + multipartUploadArtifactService: MultipartUploadArtifactServicing, + multipartUploadCompletePreviewsService: MultipartUploadCompletePreviewsServicing + ) { + self.fileHandler = fileHandler + self.fileArchiver = fileArchiver + self.retryProvider = retryProvider + self.multipartUploadStartPreviewsService = multipartUploadStartPreviewsService + self.multipartUploadGenerateURLPreviewsService = multipartUploadGenerateURLPreviewsService + self.multipartUploadArtifactService = multipartUploadArtifactService + self.multipartUploadCompletePreviewsService = multipartUploadCompletePreviewsService + } + + public func uploadPreviews( + _ previewPaths: [AbsolutePath], + fullHandle: String, + serverURL: URL + ) async throws -> URL { + let buildPath = try fileArchiver.makeFileArchiver(for: previewPaths).zip(name: "previews.zip") + + return try await retryProvider.runWithRetries { [self] in + let previewUpload = try await multipartUploadStartPreviewsService.startPreviewsMultipartUpload( + fullHandle: fullHandle, + serverURL: serverURL + ) + + let parts = try await multipartUploadArtifactService.multipartUploadArtifact( + artifactPath: buildPath, + generateUploadURL: { partNumber in + try await self.multipartUploadGenerateURLPreviewsService.uploadPreviews( + previewUpload.previewId, + partNumber: partNumber, + uploadId: previewUpload.uploadId, + fullHandle: fullHandle, + serverURL: serverURL + ) + } + ) + + return try await multipartUploadCompletePreviewsService.completePreviewUpload( + previewUpload.previewId, + uploadId: previewUpload.uploadId, + parts: parts, + fullHandle: fullHandle, + serverURL: serverURL + ) + } + } +} diff --git a/Sources/TuistServer/Services/RevokeProjectTokenService.swift b/Sources/TuistServer/Services/RevokeProjectTokenService.swift index ce38271cbc9..22e57e04402 100644 --- a/Sources/TuistServer/Services/RevokeProjectTokenService.swift +++ b/Sources/TuistServer/Services/RevokeProjectTokenService.swift @@ -16,13 +16,14 @@ enum RevokeProjectTokenServiceError: FatalError { case unknownError(Int) case notFound(String) case forbidden(String) + case badRequest(String) case unauthorized(String) var type: ErrorType { switch self { case .unknownError: return .bug - case .forbidden, .notFound, .unauthorized: + case .forbidden, .notFound, .unauthorized, .badRequest: return .abort } } @@ -31,7 +32,7 @@ enum RevokeProjectTokenServiceError: FatalError { switch self { case let .unknownError(statusCode): return "We could not revoke the project token due to an unknown Tuist response of \(statusCode)." - case let .forbidden(message), let .notFound(message), let .unauthorized(message): + case let .forbidden(message), let .notFound(message), let .unauthorized(message), let .badRequest(message): return message } } @@ -88,6 +89,11 @@ public final class RevokeProjectTokenService: RevokeProjectTokenServicing { case let .json(error): throw RevokeProjectTokenServiceError.unauthorized(error.message) } + case let .badRequest(badRequest): + switch badRequest.body { + case let .json(error): + throw RevokeProjectTokenServiceError.badRequest(error.message) + } case let .undocumented(statusCode: statusCode, _): throw RevokeProjectTokenServiceError.unknownError(statusCode) } diff --git a/Sources/TuistServer/Utilities/RemoteArtifactDownloader.swift b/Sources/TuistServer/Utilities/RemoteArtifactDownloader.swift new file mode 100644 index 00000000000..46c01423416 --- /dev/null +++ b/Sources/TuistServer/Utilities/RemoteArtifactDownloader.swift @@ -0,0 +1,78 @@ +import Foundation +import Mockable +import Path +import TuistSupport + +enum RemoteArtifactDownloaderError: FatalError, Equatable { + case urlSessionError(url: URL, httpMethod: String, description: String) + case noURLResponse(URL?) + + var type: ErrorType { + switch self { + case .urlSessionError: return .abort + case .noURLResponse: return .abort + } + } + + var description: String { + switch self { + case let .urlSessionError(url, httpMethod, error): + return "Received a session error when sending \(httpMethod) request to \(url.absoluteString): \(error)" + case let .noURLResponse(url): + if let url { + return "The response from request to URL \(url.absoluteString) doesnt' have the expected type HTTPURLResponse" + } else { + return "Received a response that doesn't have the expected type HTTPURLResponse" + } + } + } +} + +@Mockable +public protocol RemoteArtifactDownloading { + func download(url: URL) async throws -> AbsolutePath? +} + +public struct RemoteArtifactDownloader: RemoteArtifactDownloading { + private let urlSession: URLSession + + public init() { + self.init(urlSession: URLSession.shared) + } + + init(urlSession: URLSession) { + self.urlSession = urlSession + } + + public func download(url: URL) async throws -> AbsolutePath? { + let request = URLRequest(url: url) + do { + let (localUrl, response) = try await urlSession.download(for: request) + guard let urlResponse = response as? HTTPURLResponse else { + throw RemoteArtifactDownloaderError.noURLResponse(request.url) + } + if (200 ..< 300).contains(urlResponse.statusCode) { + return try AbsolutePath(validating: localUrl.path) + } else if urlResponse.statusCode == 404 { + return nil + } else { + throw RemoteArtifactDownloaderError.urlSessionError( + url: request.url!, + httpMethod: request.httpMethod!, + description: response.description + ) + } + } catch { + if error is RemoteArtifactDownloaderError { + throw error + } else { + throw RemoteArtifactDownloaderError.urlSessionError( + url: request.url!, + httpMethod: + request.httpMethod!, + description: error.localizedDescription + ) + } + } + } +} diff --git a/Sources/TuistSupport/UserInputReader.swift b/Sources/TuistSupport/UserInputReader.swift index 0b80a152d93..51274168383 100644 --- a/Sources/TuistSupport/UserInputReader.swift +++ b/Sources/TuistSupport/UserInputReader.swift @@ -1,6 +1,24 @@ import Foundation import Mockable +enum UserInputReaderError: FatalError, Equatable { + case noValuesProvided(String) + + var description: String { + switch self { + case let .noValuesProvided(prompt): + return "No values to choose from for the prompt \(prompt)" + } + } + + var type: ErrorType { + switch self { + case .noValuesProvided: + return .bug + } + } +} + @Mockable public protocol UserInputReading { /// Reads an integer from the user. @@ -13,6 +31,18 @@ public protocol UserInputReading { /// - Parameters: /// - prompt: The prompt to be shown to the user providing context and the allowed options. func readString(asking prompt: String) -> String + + /// Reads a value from the user. + /// - Parameters: + /// - prompt: The prompt to be shown to the user providing context and the allowed options. + /// - values: Values to choose from. + /// - valueDescription: A closure for extracting description for a value. The description is used in the list of choices + /// presented to the user in the CLI. + func readValue( + asking prompt: String, + values: [Value], + valueDescription: @escaping (Value) -> String + ) throws -> Value } public struct UserInputReader: UserInputReading { @@ -22,6 +52,24 @@ public struct UserInputReader: UserInputReading { self.reader = reader } + public func readValue( + asking prompt: String, + values: [Value], + valueDescription: (Value) -> String + ) throws -> Value { + guard !values.isEmpty else { throw UserInputReaderError.noValuesProvided(prompt) } + + if values.count == 1, let onlyValue = values.first { + return onlyValue + } else { + let prompt = [prompt] + values.map(valueDescription).enumerated().map { index, value in + "\t\(index): \(value)" + } + let choice = readInt(asking: prompt.joined(separator: "\n"), maxValueAllowed: values.count) + return values[choice] + } + } + public func readInt(asking prompt: String, maxValueAllowed: Int) -> Int { while true { logger.notice("\(prompt)") diff --git a/Tests/Fixtures/App.app/App b/Tests/Fixtures/App.app/App new file mode 100755 index 0000000000000000000000000000000000000000..208e0b8749876900349c90a950c6c83171a9d2eb GIT binary patch literal 77472 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 Xo6=+Ht@HsjKLnQ|IMIr&ApQ6YIIL_B literal 0 HcmV?d00001 diff --git a/Tests/Fixtures/App.app/PkgInfo b/Tests/Fixtures/App.app/PkgInfo new file mode 100644 index 00000000000..bd04210fb49 --- /dev/null +++ b/Tests/Fixtures/App.app/PkgInfo @@ -0,0 +1 @@ +APPL???? \ No newline at end of file diff --git a/Tests/Fixtures/App.app/PlugIns/WidgetExtension.appex/Info.plist b/Tests/Fixtures/App.app/PlugIns/WidgetExtension.appex/Info.plist new file mode 100644 index 0000000000000000000000000000000000000000..6e3075fc8cf49df266107833488fa4abe1f1bf54 GIT binary patch literal 854 zcmZ8fO;giA7|yO=fJy^Zum~y@@dKMl3Rpc#Q)W6&p*AT6WypkN+wOFe>?A3+ClAhe zaXk5Pmz!tDAK=lOjx!zQ;t$Xt;Wka$%3j{D=Xv*ipWS^*u;+{7Z+;5E6DLodJ~J{p zcJ|!)@fbfb8NYCGYWh+lF>^UFJ9p*UeDeB2^2XxLgP2+ayRv2Z%V-LbhK*HSE}o(XU~T61}~lTS((4qin8)jHa*eli_6EWDRf?BUj_+ zB4pmKIx;qV)>U`gTgdg8w;NS^ZTpuMb)%uzklLoK?@RW=G&OvQJxT^lYoDP?73 z7K!dx9oO_q`f&}IT z>w5wr2bN$E-L46eCT^vrTv`&leA?xE5nq)u!V3Ea$I{)bDy=Sy6=^k>7FYD|x9_mW z7+SIDVB7!iCk&=|7VOx-ehNj39NtawfQQ@&m*EN==ALtJxsTjeuEYHWqhJx-2U$=C zCTM{d;5B#$4#8*e1$+Y?@C*EbV{jbC;WSLZC76OGxC0xI!k6$Bd;{OZPw)rqz@J=j NAm~|62yJNK(Lb0q4b}hv literal 0 HcmV?d00001 diff --git a/Tests/Fixtures/App.app/PlugIns/WidgetExtension.appex/WidgetExtension b/Tests/Fixtures/App.app/PlugIns/WidgetExtension.appex/WidgetExtension new file mode 100755 index 0000000000000000000000000000000000000000..c6767ba72ecf86fb4422a353f2fd180f6f2a78dd GIT binary patch literal 139568 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 literal 0 HcmV?d00001 diff --git a/Tests/Fixtures/App.app/PlugIns/WidgetExtension.appex/_CodeSignature/CodeResources b/Tests/Fixtures/App.app/PlugIns/WidgetExtension.appex/_CodeSignature/CodeResources new file mode 100644 index 00000000000..292230e4c9e --- /dev/null +++ b/Tests/Fixtures/App.app/PlugIns/WidgetExtension.appex/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + M+EhKux414cAifJGPQ0gC+5lLNo= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/Tests/Fixtures/App.app/Watch/WatchApp.app/Info.plist b/Tests/Fixtures/App.app/Watch/WatchApp.app/Info.plist new file mode 100644 index 0000000000000000000000000000000000000000..245f11a9827e170567c49f8ca791b4781dc4d643 GIT binary patch literal 987 zcmaJ z=*62yP5cAiICwQ4^dFd*c=5==7^8`av!xBIG4{}R-sgRunR%ai*FBpCp(K4m0|2Jl z4jn$y-f{HU@e?OIQCD}*souWR{R4wT!)Hc@&yJ3bo|`y7IdNg?;^d{vS0y=Zpq}|U zwXG#=)+i%+Ey@fuu#lavGs`9l*(A2>IfRAFq)J_8pzfr$xJ}G@h}Uh>0;(3L(h4QM zfzBjMl~r7YnjzO?zp+C6fUnk)>Rs&c9eR?qfXxkDC3?f-=wO0sHP;Vgr55^>Ra=X7 z&*Noc6>J<Y*K7+jUgU-SS8IKQu~Kfi&H|NL#3TI2Lc5W#v}%g! zO!mg?GGVJF9GW%0i-G#7D~5GGSRzlwttP%fL+p9lby3pi3WYnGEJ`oN%aKIm&2r~m z?(DefIwI%UMC7Z;?m)EdO-D3s%&MYnNGoYsPs`KgXxAW->arwG^FjI(ZGyTylaWgD z%wk%a#@Z}D_6llyDPH5v7uA26RN%AVV;UN0>i>kI7f_2R?iTA^9j*qNQC$ zdx$9(toG2JUV`?5)}E%V?GHV*#%e1)Z9TEa(?fe&8?3f#wWqWP+r%U0|NYKoGy7%} zqV4Z;{-1aDGdu4y^E}Ty^UTaMm-n6b{pYtI|BetM!z08bgqcG4h49Re3n9)z+*E{s z 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 f0>%Qy0>%Qy0>%Qy0>%Qy0>%Qy0>%O#b_@JBT7 + + + + files + + Info.plist + + hah3Tps6zoCP36G2gsJywyduq/Q= + + PkgInfo + + n57qDP4tZfLD1rCS43W0B4LQjzE= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/Tests/Fixtures/App.app/_CodeSignature/CodeResources b/Tests/Fixtures/App.app/_CodeSignature/CodeResources new file mode 100644 index 00000000000..ba22254a283 --- /dev/null +++ b/Tests/Fixtures/App.app/_CodeSignature/CodeResources @@ -0,0 +1,183 @@ + + + + + files + + Info.plist + + LMSjjtLNFmRMcWKpAKv7/uOIy/Y= + + PkgInfo + + n57qDP4tZfLD1rCS43W0B4LQjzE= + + PlugIns/WidgetExtension.appex/Info.plist + + M+EhKux414cAifJGPQ0gC+5lLNo= + + PlugIns/WidgetExtension.appex/WidgetExtension + + wuFuBXfDFlwvjBKQEHi2lMpdRG8= + + PlugIns/WidgetExtension.appex/_CodeSignature/CodeResources + + zRUzx29Q43didBRZnWGFS6FeRpc= + + Watch/WatchApp.app/Info.plist + + hah3Tps6zoCP36G2gsJywyduq/Q= + + Watch/WatchApp.app/PkgInfo + + n57qDP4tZfLD1rCS43W0B4LQjzE= + + Watch/WatchApp.app/WatchApp + + bsE9lAiZxARSsQa7z6aPK99fbJs= + + Watch/WatchApp.app/_CodeSignature/CodeResources + + QkdL/h9BtAjocxTD84a2KzXUBtc= + + + files2 + + PlugIns/WidgetExtension.appex/Info.plist + + hash2 + + iOTYEXxkcxGAHP3KPCiaZxXAbbD16OTPT/usdx9UuDs= + + + PlugIns/WidgetExtension.appex/WidgetExtension + + hash2 + + 9fBzdW56wDiAA/ntQGFCqqcmQnsyeVdO28tpR+0866E= + + + PlugIns/WidgetExtension.appex/_CodeSignature/CodeResources + + hash2 + + v9uqoWoeuW7NTYR+ZNybG7bW2RFmKqilMbLsAW7TWzc= + + + Watch/WatchApp.app/Info.plist + + hash2 + + AD4rqnTgghykHbbbmWqJcLbG2O9MV4vIJ4CsHXDn/h0= + + + Watch/WatchApp.app/PkgInfo + + hash2 + + glAhkclISwTWhTdPmHmgBmBpxJuKyuegSwHTjQfo7KA= + + + Watch/WatchApp.app/WatchApp + + hash2 + + b4p1RJNjPG1G0bB7oEawJf1XTer4q9KmTtPhN6ob3hs= + + + Watch/WatchApp.app/_CodeSignature/CodeResources + + hash2 + + 7Z9prAGlKkCVbLn0J2xhX5ih4hE0TJ4wggihKmEx5m0= + + + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/Tests/Fixtures/Info.plist b/Tests/Fixtures/Info.plist deleted file mode 100644 index 31a1e61f77cdce97a17f0883161fbd2d6f7df0c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90 zcmYc)$jK}&F)+Bq$i&PN=@Js`;_a81n;PTn=2V)Ol9LMNWEN!P=cVQs8yf1F1XmQ~ Wa`1|)7&3qXBO`=nV1?2!$`k;GDiX;6 diff --git a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift index c5976f98157..1bf664bdff8 100644 --- a/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift +++ b/Tests/TuistAutomationAcceptanceTests/BuildAcceptanceTests.swift @@ -50,7 +50,7 @@ final class BuildAcceptanceTestInvalidArguments: TuistAcceptanceTestCase { final class BuildAcceptanceTestAppWithPreviews: TuistAcceptanceTestCase { func test_with_previews() async throws { - try setUpFixture(.appWithPreviews) + try await setUpFixture(.appWithPreviews) try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self) @@ -59,7 +59,7 @@ final class BuildAcceptanceTestAppWithPreviews: TuistAcceptanceTestCase { final class BuildAcceptanceTestAppWithFrameworkAndTests: TuistAcceptanceTestCase { func test_with_framework_and_tests() async throws { - try setUpFixture(.appWithFrameworkAndTests) + try await setUpFixture(.appWithFrameworkAndTests) try await run(GenerateCommand.self) try await run(BuildCommand.self) try await run(BuildCommand.self, "App") @@ -71,7 +71,7 @@ final class BuildAcceptanceTestAppWithFrameworkAndTests: TuistAcceptanceTestCase // TODO: Fix -> This currently doesn't build because of a misconfig in Github actions where the tvOS platform is not available // final class BuildAcceptanceTestAppWithTests: TuistAcceptanceTestCase { // func test() async throws { -// try setUpFixture("app_with_tests") +// try await setUpFixture("app_with_tests") // try await run(GenerateCommand.self) // try await run(BuildCommand.self) // try await run(BuildCommand.self, "App") @@ -83,7 +83,7 @@ final class BuildAcceptanceTestAppWithFrameworkAndTests: TuistAcceptanceTestCase final class BuildAcceptanceTestiOSAppWithCustomConfigurationAndBuildToCustomDirectory: TuistAcceptanceTestCase { func test_ios_app_with_custom_and_build_to_custom_directory() async throws { - try setUpFixture(.iosAppWithCustomConfiguration) + try await setUpFixture(.iosAppWithCustomConfiguration) try await run(GenerateCommand.self) try await run( BuildCommand.self, @@ -124,7 +124,7 @@ final class BuildAcceptanceTestiOSAppWithCustomConfigurationAndBuildToCustomDire final class BuildAcceptanceTestFrameworkWithSwiftMacroIntegratedWithStandardMethod: TuistAcceptanceTestCase { func test_framework_with_swift_macro_integrated_with_standard_method() async throws { - try setUpFixture(.frameworkWithSwiftMacro) + try await setUpFixture(.frameworkWithSwiftMacro) try await run(GenerateCommand.self) try await run(BuildCommand.self, "Framework") } @@ -132,7 +132,7 @@ final class BuildAcceptanceTestFrameworkWithSwiftMacroIntegratedWithStandardMeth final class BuildAcceptanceTestFrameworkWithSwiftMacroIntegratedWithXcodeProjPrimitives: TuistAcceptanceTestCase { func test_framework_with_swift_macro_integrated_with_xcode_proj_primitives() async throws { - try setUpFixture(.frameworkWithNativeSwiftMacro) + try await setUpFixture(.frameworkWithNativeSwiftMacro) try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "Framework", "--platform", "macos") @@ -142,7 +142,7 @@ final class BuildAcceptanceTestFrameworkWithSwiftMacroIntegratedWithXcodeProjPri final class BuildAcceptanceTestMultiplatformAppWithExtensions: TuistAcceptanceTestCase { func test() async throws { - try setUpFixture(.multiplatformAppWithExtension) + try await setUpFixture(.multiplatformAppWithExtension) try await run(GenerateCommand.self) try await run(BuildCommand.self, "App", "--platform", "ios") } @@ -150,7 +150,7 @@ final class BuildAcceptanceTestMultiplatformAppWithExtensions: TuistAcceptanceTe final class BuildAcceptanceTestMultiplatformAppWithSDK: TuistAcceptanceTestCase { func test() async throws { - try setUpFixture(.multiplatformAppWithSdk) + try await setUpFixture(.multiplatformAppWithSdk) try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "App", "--platform", "macos") @@ -160,7 +160,7 @@ final class BuildAcceptanceTestMultiplatformAppWithSDK: TuistAcceptanceTestCase final class BuildAcceptanceTestMultiplatformµFeatureUnitTestsWithExplicitDependencies: TuistAcceptanceTestCase { func test() async throws { - try setUpFixture(.multiplatformµFeatureUnitTestsWithExplicitDependencies) + try await setUpFixture(.multiplatformµFeatureUnitTestsWithExplicitDependencies) try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "ExampleApp", "--platform", "ios") @@ -170,7 +170,7 @@ final class BuildAcceptanceTestMultiplatformµFeatureUnitTestsWithExplicitDepend final class BuildAcceptanceTestAppWithSPMDependencies: TuistAcceptanceTestCase { func test() async throws { - try setUpFixture(.appWithSpmDependencies) + try await setUpFixture(.appWithSpmDependencies) try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "App", "--platform", "ios") @@ -179,7 +179,7 @@ final class BuildAcceptanceTestAppWithSPMDependencies: TuistAcceptanceTestCase { final class BuildAcceptanceTestMultiplatformAppWithMacrosAndEmbeddedWatchOSApp: TuistAcceptanceTestCase { func test() async throws { - try setUpFixture(.multiplatformAppWithMacrosAndEmbeddedWatchOSApp) + try await setUpFixture(.multiplatformAppWithMacrosAndEmbeddedWatchOSApp) try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "App", "--platform", "ios") @@ -188,7 +188,7 @@ final class BuildAcceptanceTestMultiplatformAppWithMacrosAndEmbeddedWatchOSApp: final class BuildAcceptanceTestIosAppWithSPMDependencies: TuistAcceptanceTestCase { func test() async throws { - try setUpFixture(.iosAppWithSpmDependencies) + try await setUpFixture(.iosAppWithSpmDependencies) try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "App", "--platform", "ios") diff --git a/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift b/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift index ffbef5a2eb4..084f402bcc0 100644 --- a/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift +++ b/Tests/TuistAutomationAcceptanceTests/TestAcceptanceTests.swift @@ -9,7 +9,7 @@ import XCTest /// Test projects using tuist test final class TestAcceptanceTests: TuistAcceptanceTestCase { func test_with_app_with_framework_and_tests() async throws { - try setUpFixture(.appWithFrameworkAndTests) + try await setUpFixture(.appWithFrameworkAndTests) try await run(TestCommand.self) try await run(TestCommand.self, "App") try await run(TestCommand.self, "--test-targets", "FrameworkTests/FrameworkTests") @@ -17,13 +17,13 @@ final class TestAcceptanceTests: TuistAcceptanceTestCase { } func test_with_app_with_test_plan() async throws { - try setUpFixture(.appWithTestPlan) + try await setUpFixture(.appWithTestPlan) try await run(TestCommand.self) try await run(TestCommand.self, "App", "--test-plan", "All") } func test_with_invalid_arguments() async throws { - try setUpFixture(.appWithFrameworkAndTests) + try await setUpFixture(.appWithFrameworkAndTests) await XCTAssertThrowsSpecific( try await run(TestCommand.self, "App", "--", "-scheme", "App"), XcodeBuildPassthroughArgumentError.alreadyHandled("-scheme") diff --git a/Tests/TuistAutomationTests/Utilities/AppBundleLoaderTests.swift b/Tests/TuistAutomationTests/Utilities/AppBundleLoaderTests.swift new file mode 100644 index 00000000000..1a83b53c38c --- /dev/null +++ b/Tests/TuistAutomationTests/Utilities/AppBundleLoaderTests.swift @@ -0,0 +1,72 @@ +import FileSystem +import Foundation +import MockableTest +import Path +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistAutomation + +final class AppBundleLoaderTests: TuistUnitTestCase { + private var subject: AppBundleLoader! + + override func setUp() { + super.setUp() + + subject = AppBundleLoader(fileSystem: FileSystem()) + } + + override func tearDown() { + subject = nil + + super.tearDown() + } + + func test_load_app_bundle() async throws { + // Given + let appBundlePath = fixturePath(path: try RelativePath(validating: "App.app")) + + // When + let appBundle = try await subject.load(appBundlePath) + + // Then + XCTAssertEqual( + appBundle, + AppBundle( + path: appBundlePath, + infoPlist: AppBundle.InfoPlist( + version: Version("1.0"), + name: "App", + bundleId: "io.tuist.App", + minimumOSVersion: Version("17.4"), + supportedPlatforms: [.simulator(.iOS)] + ) + ) + ) + } + + func test_load_app_bundle_when_info_plist_is_missing_does_not_exist() async throws { + // Given + let appBundlePath = try temporaryPath() + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.load(appBundlePath), + AppBundleLoaderError.missingInfoPlist(appBundlePath.appending(component: "Info.plist")) + ) + } + + func test_load_app_bundle_when_decoding_info_plist_failed() async throws { + // Given + let appBundlePath = try temporaryPath() + let infoPlistPath = appBundlePath.appending(component: "Info.plist") + try fileHandler.write("{}", path: infoPlistPath, atomically: true) + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.load(appBundlePath), + AppBundleLoaderError.failedDecodingInfoPlist(infoPlistPath, "The data couldn’t be read because it is missing.") + ) + } +} diff --git a/Tests/TuistAutomationTests/Utilities/AppRunnerTests.swift b/Tests/TuistAutomationTests/Utilities/AppRunnerTests.swift new file mode 100644 index 00000000000..22639d33bd4 --- /dev/null +++ b/Tests/TuistAutomationTests/Utilities/AppRunnerTests.swift @@ -0,0 +1,447 @@ +import Foundation +import MockableTest +import struct TSCUtility.Version +import TuistCore +import TuistSupport +import TuistSupportTesting +import XCTest + +@testable import TuistAutomation + +final class AppRunnerTests: TuistUnitTestCase { + private var subject: AppRunner! + private var simulatorController: MockSimulatorControlling! + private var userInputReader: MockUserInputReading! + + override func setUp() { + super.setUp() + + simulatorController = .init() + userInputReader = .init() + subject = AppRunner( + simulatorController: simulatorController, + userInputReader: userInputReader + ) + + given(simulatorController) + .launchApp( + bundleId: .any, + device: .any, + arguments: .any + ) + .willReturn() + + given(simulatorController) + .booted(device: .any) + .willProduce { $0 } + + Matcher.register([SimulatorDeviceAndRuntime].self) + } + + override func tearDown() { + subject = nil + userInputReader = nil + simulatorController = nil + + Matcher.reset() + + super.tearDown() + } + + func test_run_single_app_bundle_with_one_currently_booted_device() async throws { + // Given + let appBundle: AppBundle = .test() + let simulatorDeviceAndRuntime: SimulatorDeviceAndRuntime = .test( + device: .test(state: "Booted") + ) + + given(simulatorController) + .findAvailableDevices( + platform: .value(.iOS), + version: .value(nil), + minVersion: .value(Version("17.4.0")), + deviceName: .value(nil) + ) + .willReturn( + [ + simulatorDeviceAndRuntime, + ] + ) + + given(simulatorController) + .installApp( + at: .value(appBundle.path), + device: .value(simulatorDeviceAndRuntime.device) + ) + .willReturn() + + // When + try await subject.runApp( + [appBundle], + version: nil, + device: nil + ) + + // Then + verify(simulatorController) + .launchApp( + bundleId: .value(appBundle.infoPlist.bundleId), + device: .value(simulatorDeviceAndRuntime.device), + arguments: .value([]) + ) + .called(1) + } + + func test_run_single_app_bundle_with_specific_device() async throws { + // Given + let appBundle: AppBundle = .test() + let simulatorDeviceAndRuntime: SimulatorDeviceAndRuntime = .test( + device: .test(name: "iPhone 15 Pro") + ) + + given(simulatorController) + .findAvailableDevices( + platform: .value(.iOS), + version: .value(nil), + minVersion: .value(Version("17.4.0")), + deviceName: .value("iPhone 15 Pro") + ) + .willReturn( + [ + simulatorDeviceAndRuntime, + ] + ) + + given(simulatorController) + .installApp( + at: .value(appBundle.path), + device: .value(simulatorDeviceAndRuntime.device) + ) + .willReturn() + + given(userInputReader) + .readValue( + asking: .any, + values: .value([simulatorDeviceAndRuntime]), + valueDescription: .any + ) + .willReturn(simulatorDeviceAndRuntime) + + // When + try await subject.runApp( + [appBundle], + version: nil, + device: "iPhone 15 Pro" + ) + + // Then + verify(simulatorController) + .launchApp( + bundleId: .value(appBundle.infoPlist.bundleId), + device: .value(simulatorDeviceAndRuntime.device), + arguments: .value([]) + ) + .called(1) + } + + func test_run_single_app_bundle_with_specific_version() async throws { + // Given + let appBundle: AppBundle = .test() + let simulatorDeviceAndRuntime: SimulatorDeviceAndRuntime = .test( + device: .test( + name: "iPhone 15 Pro" + ) + ) + + given(simulatorController) + .findAvailableDevices( + platform: .value(.iOS), + version: .value(Version("18.0.0")), + minVersion: .value(Version("17.4.0")), + deviceName: .value(nil) + ) + .willReturn( + [ + simulatorDeviceAndRuntime, + ] + ) + + given(simulatorController) + .installApp( + at: .value(appBundle.path), + device: .value(simulatorDeviceAndRuntime.device) + ) + .willReturn() + + given(userInputReader) + .readValue( + asking: .any, + values: .value([simulatorDeviceAndRuntime]), + valueDescription: .any + ) + .willReturn(simulatorDeviceAndRuntime) + + // When + try await subject.runApp( + [appBundle], + version: Version("18.0.0"), + device: nil + ) + + // Then + verify(simulatorController) + .launchApp( + bundleId: .value(appBundle.infoPlist.bundleId), + device: .value(simulatorDeviceAndRuntime.device), + arguments: .value([]) + ) + .called(1) + } + + func test_run_single_app_bundle_with_multiple_booted_devices() async throws { + // Given + let appBundle: AppBundle = .test() + let simulatorDeviceAndRuntimeOne: SimulatorDeviceAndRuntime = .test( + device: .test( + state: "Booted", + name: "iPhone 15" + ) + ) + let simulatorDeviceAndRuntimeTwo: SimulatorDeviceAndRuntime = .test( + device: .test( + state: "Booted", + name: "iPhone 15 Pro" + ) + ) + let simulatorDeviceAndRuntimeThree: SimulatorDeviceAndRuntime = .test( + device: .test( + state: "Shutdown", + name: "iPhone 16 Pro" + ) + ) + + given(simulatorController) + .findAvailableDevices( + platform: .value(.iOS), + version: .value(nil), + minVersion: .value(Version("17.4.0")), + deviceName: .value(nil) + ) + .willReturn( + [ + simulatorDeviceAndRuntimeOne, + simulatorDeviceAndRuntimeTwo, + simulatorDeviceAndRuntimeThree, + ] + ) + + given(userInputReader) + .readValue( + asking: .any, + values: .value([simulatorDeviceAndRuntimeOne, simulatorDeviceAndRuntimeTwo, simulatorDeviceAndRuntimeThree]), + valueDescription: .any + ) + .willReturn(simulatorDeviceAndRuntimeTwo) + + given(simulatorController) + .installApp( + at: .value(appBundle.path), + device: .value(simulatorDeviceAndRuntimeTwo.device) + ) + .willReturn() + + // When + try await subject.runApp( + [appBundle], + version: nil, + device: nil + ) + + // Then + verify(simulatorController) + .launchApp( + bundleId: .value(appBundle.infoPlist.bundleId), + device: .value(simulatorDeviceAndRuntimeTwo.device), + arguments: .value([]) + ) + .called(1) + } + + func test_run_mutliple_app_bundles_with_one_currently_booted_device() async throws { + // Given + let appBundleOne: AppBundle = .test( + infoPlist: .test( + supportedPlatforms: [ + .simulator(.iOS), + ] + ) + ) + let appBundleTwo: AppBundle = .test( + infoPlist: .test( + supportedPlatforms: [ + .simulator(.visionOS), + ] + ) + ) + let appBundleThree: AppBundle = .test( + infoPlist: .test( + supportedPlatforms: [ + .device(.visionOS), + ] + ) + ) + let simulatorDeviceAndRuntime: SimulatorDeviceAndRuntime = .test( + device: .test( + state: "Booted" + ), + runtime: .test( + name: "visionOS 2.0" + ) + ) + + given(simulatorController) + .findAvailableDevices( + platform: .value(.visionOS), + version: .any, + minVersion: .any, + deviceName: .any + ) + .willReturn( + [ + simulatorDeviceAndRuntime, + ] + ) + + given(simulatorController) + .findAvailableDevices( + platform: .value(.iOS), + version: .any, + minVersion: .any, + deviceName: .any + ) + .willReturn([.test()]) + + given(simulatorController) + .installApp( + at: .value(appBundleTwo.path), + device: .value(simulatorDeviceAndRuntime.device) + ) + .willReturn() + + // When + try await subject.runApp( + [ + appBundleOne, + appBundleTwo, + appBundleThree, + ], + version: nil, + device: nil + ) + + // Then + verify(simulatorController) + .launchApp( + bundleId: .value(appBundleTwo.infoPlist.bundleId), + device: .value(simulatorDeviceAndRuntime.device), + arguments: .value([]) + ) + .called(1) + } + + func test_run_mutliple_app_bundles_with_no_booted_device() async throws { + // Given + let appBundleOne: AppBundle = .test( + infoPlist: .test( + supportedPlatforms: [ + .simulator(.iOS), + ] + ) + ) + let appBundleTwo: AppBundle = .test( + infoPlist: .test( + supportedPlatforms: [ + .simulator(.visionOS), + ] + ) + ) + let appBundleThree: AppBundle = .test( + infoPlist: .test( + supportedPlatforms: [ + .device(.visionOS), + ] + ) + ) + let visionOSSimulatorDeviceAndRuntime: SimulatorDeviceAndRuntime = .test( + runtime: .test( + name: "visionOS 2.0" + ) + ) + + let iOSSimulatorDeviceAndRuntime: SimulatorDeviceAndRuntime = .test( + runtime: .test( + name: "iOS 18.0" + ) + ) + + given(simulatorController) + .findAvailableDevices( + platform: .value(.visionOS), + version: .any, + minVersion: .any, + deviceName: .any + ) + .willReturn( + [ + visionOSSimulatorDeviceAndRuntime, + ] + ) + given(simulatorController) + .findAvailableDevices( + platform: .value(.iOS), + version: .any, + minVersion: .any, + deviceName: .any + ) + .willReturn( + [ + iOSSimulatorDeviceAndRuntime, + ] + ) + + given(userInputReader) + .readValue( + asking: .any, + values: .value([iOSSimulatorDeviceAndRuntime, visionOSSimulatorDeviceAndRuntime]), + valueDescription: .any + ) + .willReturn(iOSSimulatorDeviceAndRuntime) + + given(simulatorController) + .installApp( + at: .value(appBundleTwo.path), + device: .value(iOSSimulatorDeviceAndRuntime.device) + ) + .willReturn() + + // When + try await subject.runApp( + [ + appBundleOne, + appBundleTwo, + appBundleThree, + ], + version: nil, + device: nil + ) + + // Then + verify(simulatorController) + .launchApp( + bundleId: .value(appBundleTwo.infoPlist.bundleId), + device: .value(iOSSimulatorDeviceAndRuntime.device), + arguments: .value([]) + ) + .called(1) + } +} diff --git a/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift b/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift index f4390cfb19e..34a4a05a05a 100644 --- a/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift +++ b/Tests/TuistAutomationTests/Utilities/BuildGraphInspectorTests.swift @@ -56,13 +56,16 @@ final class BuildGraphInspectorTests: TuistUnitTestCase { ) ) - let project = Project.test(path: projectPath, schemes: [scheme1, scheme2]) + let project = Project.test( + path: projectPath, + targets: [ + target1, + target2, + ], + schemes: [scheme1, scheme2] + ) let graph = Graph.test( - projects: [projectPath: project], - targets: [projectPath: [ - target1.name: target1, - target2.name: target2, - ]] + projects: [projectPath: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -136,10 +139,14 @@ final class BuildGraphInspectorTests: TuistUnitTestCase { let projectPath = path.appending(component: "Project.xcodeproj") let scheme = Scheme.test(buildAction: .test(targets: [.init(projectPath: projectPath, name: "Core")])) let target = Target.test(name: "Core") - let project = Project.test(path: projectPath) + let project = Project.test( + path: projectPath, + targets: [ + target, + ] + ) let graph = Graph.test( - projects: [projectPath: project], - targets: [projectPath: [target.name: target]] + projects: [projectPath: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -186,10 +193,12 @@ final class BuildGraphInspectorTests: TuistUnitTestCase { targets: [TestableTarget(target: targetReference)] ) ) - let project = Project.test(path: projectPath) + let project = Project.test( + path: projectPath, + targets: [target] + ) let graph = Graph.test( - projects: [projectPath: project], - targets: [projectPath: [target.name: target]] + projects: [projectPath: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -229,13 +238,15 @@ final class BuildGraphInspectorTests: TuistUnitTestCase { testPlans: [testPlan] ) ) - let project = Project.test(path: projectPath) + let project = Project.test( + path: projectPath, + targets: [ + target1, + target2, + ] + ) let graph = Graph.test( - projects: [projectPath: project], - targets: [projectPath: [ - target1.name: target1, - target2.name: target2, - ]] + projects: [projectPath: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -275,13 +286,15 @@ final class BuildGraphInspectorTests: TuistUnitTestCase { testPlans: [testPlan] ) ) - let project = Project.test(path: projectPath) + let project = Project.test( + path: projectPath, + targets: [ + target1, + target2, + ] + ) let graph = Graph.test( - projects: [projectPath: project], - targets: [projectPath: [ - target1.name: target1, - target2.name: target2, - ]] + projects: [projectPath: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -321,13 +334,15 @@ final class BuildGraphInspectorTests: TuistUnitTestCase { testPlans: [testPlan] ) ) - let project = Project.test(path: projectPath) + let project = Project.test( + path: projectPath, + targets: [ + target1, + target2, + ] + ) let graph = Graph.test( - projects: [projectPath: project], - targets: [projectPath: [ - target1.name: target1, - target2.name: target2, - ]] + projects: [projectPath: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -367,13 +382,15 @@ final class BuildGraphInspectorTests: TuistUnitTestCase { testPlans: [testPlan] ) ) - let project = Project.test(path: projectPath) + let project = Project.test( + path: projectPath, + targets: [ + target1, + target2, + ] + ) let graph = Graph.test( - projects: [projectPath: project], - targets: [projectPath: [ - target1.name: target1, - target2.name: target2, - ]] + projects: [projectPath: project] ) let graphTraverser = GraphTraverser(graph: graph) @@ -465,55 +482,37 @@ final class BuildGraphInspectorTests: TuistUnitTestCase { ) ) let coreTarget = Target.test(name: "Core") - let coreProject = Project.test( - path: coreProjectPath, - schemes: [coreScheme, coreTestsScheme] - ) - let coreGraphTarget = GraphTarget.test( - target: coreTarget, - project: coreProject - ) let coreTestsTarget = Target.test( name: "CoreTests", product: .unitTests, dependencies: [.target(name: "Core")] ) - let coreTestsGraphTarget = GraphTarget.test( - target: coreTestsTarget, - project: coreProject + let coreProject = Project.test( + path: coreProjectPath, + targets: [ + coreTarget, + coreTestsTarget, + ], + schemes: [coreScheme, coreTestsScheme] ) let kitTarget = Target.test(name: "Kit", dependencies: [.target(name: "Core")]) - let kitProject = Project.test( - path: projectPath, - schemes: [kitScheme, kitTestsScheme] - ) - let kitGraphTarget = GraphTarget.test( - target: kitTarget, - project: kitProject - ) let kitTestsTarget = Target.test( name: "KitTests", product: .unitTests, dependencies: [.target(name: "Kit")] ) - let kitTestsGraphTarget = GraphTarget.test( - target: kitTestsTarget, - project: kitProject + let kitProject = Project.test( + path: projectPath, + targets: [ + kitTarget, + kitTestsTarget, + ], + schemes: [kitScheme, kitTestsScheme] ) let graph = Graph.test( projects: [ kitProject.path: kitProject, coreProject.path: coreProject, - ], - targets: [ - projectPath: [ - kitGraphTarget.target.name: kitGraphTarget.target, - kitTestsGraphTarget.target.name: kitTestsGraphTarget.target, - ], - coreProjectPath: [ - coreGraphTarget.target.name: coreGraphTarget.target, - coreTestsGraphTarget.target.name: coreTestsGraphTarget.target, - ], ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -571,20 +570,14 @@ final class BuildGraphInspectorTests: TuistUnitTestCase { ) let coreProject = Project.test( path: coreProjectPath, + targets: [ + coreTarget, + ], schemes: [coreScheme, coreTestsScheme, coreTestPlanScheme, coreTestPlanTestsScheme] ) - let coreGraphTarget = GraphTarget.test( - target: coreTarget, - project: coreProject - ) let graph = Graph.test( projects: [ coreProject.path: coreProject, - ], - targets: [ - coreProject.path: [ - coreGraphTarget.target.name: coreGraphTarget.target, - ], ] ) let graphTraverser = GraphTraverser(graph: graph) @@ -610,21 +603,28 @@ final class BuildGraphInspectorTests: TuistUnitTestCase { let projectAPath = path.appending(component: "ProjectA.xcodeproj") let schemeA = Scheme.test(buildAction: .test(targets: [.init(projectPath: projectAPath, name: "A")])) - let projectA = Project.test(path: projectAPath, schemes: [schemeA]) let targetA = Target.test(name: "A") + let projectA = Project.test( + path: projectAPath, + targets: [targetA], + schemes: [schemeA] + ) let projectBPath = path.appending(component: "ProjectB.xcodeproj") let schemeB = Scheme.test(buildAction: .test(targets: [.init(projectPath: projectBPath, name: "B")])) - let projectB = Project.test(path: projectBPath, schemes: [schemeB]) let targetB = Target.test(name: "B") + let projectB = Project.test( + path: projectBPath, + targets: [targetB], + schemes: [schemeB] + ) let graph = Graph.test( workspace: Workspace.test(projects: [projectA.path]), projects: [ projectA.path: projectA, projectB.path: projectB, - ], - targets: [projectAPath: [targetA.name: targetA], projectBPath: [targetB.name: targetB]] + ] ) let graphTraverser = GraphTraverser(graph: graph) diff --git a/Tests/TuistAutomationTests/Utilities/TargetBuilderTests.swift b/Tests/TuistAutomationTests/Utilities/TargetBuilderTests.swift index ca58d469967..276d470bcda 100644 --- a/Tests/TuistAutomationTests/Utilities/TargetBuilderTests.swift +++ b/Tests/TuistAutomationTests/Utilities/TargetBuilderTests.swift @@ -1,13 +1,14 @@ -import TSCBasic +import MockableTest +import Path +import TuistAutomationTesting import TuistCore import TuistSupport +import TuistSupportTesting import XcodeGraph import XCTest @testable import TuistAutomation -@testable import TuistAutomationTesting @testable import TuistCoreTesting -@testable import TuistSupportTesting final class TargetBuilderErrorTests: XCTestCase { func test_errorDescription() { @@ -28,24 +29,37 @@ final class TargetBuilderErrorTests: XCTestCase { } final class TargetBuilderTests: TuistUnitTestCase { - private var buildGraphInspector: MockBuildGraphInspector! - private var xcodeBuildController: MockXcodeBuildController! - private var xcodeProjectBuildDirectoryLocator: MockXcodeProjectBuildDirectoryLocator! - private var simulatorController: MockSimulatorController! + private var buildGraphInspector: MockBuildGraphInspecting! + private var xcodeBuildController: MockXcodeBuildControlling! + private var xcodeProjectBuildDirectoryLocator: MockXcodeProjectBuildDirectoryLocating! + private var simulatorController: MockSimulatorControlling! private var subject: TargetBuilder! override func setUp() { super.setUp() - buildGraphInspector = MockBuildGraphInspector() - xcodeBuildController = MockXcodeBuildController() - xcodeProjectBuildDirectoryLocator = MockXcodeProjectBuildDirectoryLocator() - simulatorController = MockSimulatorController() + buildGraphInspector = .init() + xcodeBuildController = .init() + xcodeProjectBuildDirectoryLocator = .init() + simulatorController = .init() subject = TargetBuilder( buildGraphInspector: buildGraphInspector, xcodeBuildController: xcodeBuildController, xcodeProjectBuildDirectoryLocator: xcodeProjectBuildDirectoryLocator, simulatorController: simulatorController ) + + given(xcodeBuildController) + .build( + .any, + scheme: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + clean: .any, + arguments: .any, + passthroughXcodeBuildArguments: .any + ) + .willReturn() } override func tearDown() { @@ -68,30 +82,28 @@ final class TargetBuilderTests: TuistUnitTestCase { .sdk("iphoneos"), ] let destination = XcodeBuildDestination.device("this_is_a_udid") - let version = "15.2".version() + let version = Version("15.2") let rosetta = true let device = "iPhone 13 Pro" - simulatorController.findAvailableDeviceStub = { _, _version, _, _deviceName in - XCTAssertEqual(_version, version) - XCTAssertEqual(_deviceName, device) - - return .test(device: SimulatorDevice.test(udid: "this_is_a_udid")) - } - buildGraphInspector.buildArgumentsStub = { _, _, _, _ in - buildArguments - } - - xcodeBuildController - .buildStub = { _workspace, _scheme, _destination, _rosetta, _, _clean, _buildArguments in - XCTAssertEqual(_workspace.path, workspacePath) - XCTAssertEqual(_scheme, scheme.name) - XCTAssertEqual(_destination, destination) - XCTAssertEqual(_rosetta, rosetta) - XCTAssertEqual(_clean, clean) - XCTAssertEqual(_buildArguments, buildArguments) - return [.standardOutput(.init(raw: "success"))] - } + given(simulatorController) + .findAvailableDevice( + platform: .any, + version: .any, + minVersion: .any, + deviceName: .any + ) + .willReturn( + .test(device: SimulatorDevice.test(udid: "this_is_a_udid")) + ) + given(buildGraphInspector) + .buildArguments( + project: .any, + target: .any, + configuration: .any, + skipSigning: .any + ) + .willReturn(buildArguments) // When try await subject.buildTarget( @@ -106,8 +118,32 @@ final class TargetBuilderTests: TuistUnitTestCase { device: device, osVersion: version, rosetta: rosetta, - graphTraverser: MockGraphTraverser() + graphTraverser: MockGraphTraversing(), + passthroughXcodeBuildArguments: [] ) + + // Then + verify(simulatorController) + .findAvailableDevice( + platform: .any, + version: .value("15.2".version()), + minVersion: .any, + deviceName: .value(device) + ) + .called(1) + + verify(xcodeBuildController) + .build( + .any, + scheme: .value(scheme.name), + destination: .value(destination), + rosetta: .value(rosetta), + derivedDataPath: .value(nil), + clean: .value(clean), + arguments: .value(buildArguments), + passthroughXcodeBuildArguments: .any + ) + .called(1) } func test_copiesBuildProducts_to_outputPath_defaultConfiguration() async throws { @@ -116,19 +152,40 @@ final class TargetBuilderTests: TuistUnitTestCase { let buildOutputPath = path.appending(component: ".build") let scheme = Scheme.test(name: "A") let workspacePath = try AbsolutePath(validating: "/path/to/project.xcworkspace") - let graphTraverser = MockGraphTraverser() - - xcodeBuildController.buildStub = { _, _, _, _, _, _, _ in - [.standardOutput(.init(raw: "success"))] - } + let graphTraverser = MockGraphTraversing() let xcodeBuildPath = path.appending(components: "Xcode", "DerivedData", "MyProject-hash", "Debug") - xcodeProjectBuildDirectoryLocator.locateStub = { _, _, _, _ in xcodeBuildPath } + given(xcodeProjectBuildDirectoryLocator) + .locate( + platform: .any, + projectPath: .any, + derivedDataPath: .any, + configuration: .any + ) + .willReturn(xcodeBuildPath) try createFiles([ "Xcode/DerivedData/MyProject-hash/Debug/App.app", "Xcode/DerivedData/MyProject-hash/Debug/App.swiftmodule", ]) + given(buildGraphInspector) + .buildArguments( + project: .any, + target: .any, + configuration: .any, + skipSigning: .any + ) + .willReturn([]) + + given(simulatorController) + .findAvailableDevice( + platform: .any, + version: .any, + minVersion: .any, + deviceName: .any + ) + .willReturn(.test()) + // When try await subject.buildTarget( .test(), @@ -142,7 +199,8 @@ final class TargetBuilderTests: TuistUnitTestCase { device: nil, osVersion: nil, rosetta: false, - graphTraverser: graphTraverser + graphTraverser: graphTraverser, + passthroughXcodeBuildArguments: [] ) // Then @@ -167,14 +225,35 @@ final class TargetBuilderTests: TuistUnitTestCase { let scheme = Scheme.test(name: "A") let configuration = "TestRelease" let workspacePath = try AbsolutePath(validating: "/path/to/project.xcworkspace") - let graphTraverser = MockGraphTraverser() + let graphTraverser = MockGraphTraversing() + + given(buildGraphInspector) + .buildArguments( + project: .any, + target: .any, + configuration: .any, + skipSigning: .any + ) + .willReturn([]) - xcodeBuildController.buildStub = { _, _, _, _, _, _, _ in - [.standardOutput(.init(raw: "success"))] - } + given(simulatorController) + .findAvailableDevice( + platform: .any, + version: .any, + minVersion: .any, + deviceName: .any + ) + .willReturn(.test()) let xcodeBuildPath = path.appending(components: "Xcode", "DerivedData", "MyProject-hash", configuration) - xcodeProjectBuildDirectoryLocator.locateStub = { _, _, _, _ in xcodeBuildPath } + given(xcodeProjectBuildDirectoryLocator) + .locate( + platform: .any, + projectPath: .any, + derivedDataPath: .any, + configuration: .any + ) + .willReturn(xcodeBuildPath) try createFiles([ "Xcode/DerivedData/MyProject-hash/\(configuration)/App.app", "Xcode/DerivedData/MyProject-hash/\(configuration)/App.swiftmodule", @@ -193,7 +272,8 @@ final class TargetBuilderTests: TuistUnitTestCase { device: nil, osVersion: nil, rosetta: false, - graphTraverser: graphTraverser + graphTraverser: graphTraverser, + passthroughXcodeBuildArguments: [] ) // Then diff --git a/Tests/TuistAutomationTests/Utilities/TargetRunnerTests.swift b/Tests/TuistAutomationTests/Utilities/TargetRunnerTests.swift index c91946dbb3b..ca828d8e9c3 100644 --- a/Tests/TuistAutomationTests/Utilities/TargetRunnerTests.swift +++ b/Tests/TuistAutomationTests/Utilities/TargetRunnerTests.swift @@ -1,14 +1,15 @@ -import TSCBasic +import MockableTest +import Path import struct TSCUtility.Version +import TuistAutomationTesting import TuistCore +import TuistCoreTesting import TuistSupport +import TuistSupportTesting import XcodeGraph import XCTest @testable import TuistAutomation -@testable import TuistAutomationTesting -@testable import TuistCoreTesting -@testable import TuistSupportTesting final class TargetRunnerErrorTests: XCTestCase { func test_description() { @@ -29,16 +30,16 @@ final class TargetRunnerErrorTests: XCTestCase { } final class TargetRunnerTests: TuistUnitTestCase { - private var xcodeBuildController: MockXcodeBuildController! - private var xcodeProjectBuildDirectoryLocator: MockXcodeProjectBuildDirectoryLocator! - private var simulatorController: MockSimulatorController! + private var xcodeBuildController: MockXcodeBuildControlling! + private var xcodeProjectBuildDirectoryLocator: MockXcodeProjectBuildDirectoryLocating! + private var simulatorController: MockSimulatorControlling! private var subject: TargetRunner! override func setUp() { super.setUp() - xcodeBuildController = MockXcodeBuildController() - xcodeProjectBuildDirectoryLocator = MockXcodeProjectBuildDirectoryLocator() - simulatorController = MockSimulatorController() + xcodeBuildController = .init() + xcodeProjectBuildDirectoryLocator = .init() + simulatorController = .init() subject = TargetRunner( xcodeBuildController: xcodeBuildController, xcodeProjectBuildDirectoryLocator: xcodeProjectBuildDirectoryLocator, @@ -61,7 +62,14 @@ final class TargetRunnerTests: TuistUnitTestCase { let workspacePath = path.appending(component: "App.xcworkspace") let outputPath = path.appending(component: ".build") let productPath = outputPath.appending(component: "Target.app") - xcodeProjectBuildDirectoryLocator.locateStub = { _, _, _, _ in outputPath } + given(xcodeProjectBuildDirectoryLocator) + .locate( + platform: .any, + projectPath: .any, + derivedDataPath: .any, + configuration: .any + ) + .willReturn(outputPath) fileHandler.stubExists = { _ in false } // When / Then @@ -88,15 +96,16 @@ final class TargetRunnerTests: TuistUnitTestCase { fileHandler.stubExists = { _ in true } system.succeedCommand(["/path/to/proj.xcworkspace/Target"]) - let expectation = expectation(description: "locates with default configuration") - xcodeProjectBuildDirectoryLocator.locateStub = { _, _, _, _configuration in - // THEN - XCTAssertEqual(_configuration, BuildConfiguration.debug.name) - expectation.fulfill() - return try AbsolutePath(validating: "/path/to/proj.xcworkspace") - } + given(xcodeProjectBuildDirectoryLocator) + .locate( + platform: .any, + projectPath: .any, + derivedDataPath: .any, + configuration: .any + ) + .willReturn(try AbsolutePath(validating: "/path/to/proj.xcworkspace")) - // WHEN + // When try await subject.runTarget( .test(target: .test(platform: .macOS, product: .commandLineTool)), platform: .macOS, @@ -109,7 +118,15 @@ final class TargetRunnerTests: TuistUnitTestCase { arguments: [] ) - await fulfillment(of: [expectation], timeout: 1) + // Then + verify(xcodeProjectBuildDirectoryLocator) + .locate( + platform: .any, + projectPath: .any, + derivedDataPath: .any, + configuration: .value(BuildConfiguration.debug.name) + ) + .called(1) } func test_runsExecutable_when_platform_is_macOS_and_product_is_commandLineTool() async throws { @@ -122,7 +139,14 @@ final class TargetRunnerTests: TuistUnitTestCase { let arguments = ["Argument", "--option1", "AnotherArgument", "--option2=true", "-opt3"] fileHandler.stubExists = { _ in true } - xcodeProjectBuildDirectoryLocator.locateStub = { _, _, _, _ in outputPath } + given(xcodeProjectBuildDirectoryLocator) + .locate( + platform: .any, + projectPath: .any, + derivedDataPath: .any, + configuration: .any + ) + .willReturn(outputPath) system.succeedCommand([executablePath.pathString] + arguments) // THEN @@ -157,44 +181,88 @@ final class TargetRunnerTests: TuistUnitTestCase { let bundleId = "com.tuist.bundleid" fileHandler.stubExists = { _ in true } - xcodeProjectBuildDirectoryLocator.locateStub = { _, _, _, _ in outputPath } - xcodeBuildController.showBuildSettingsStub = { _, _, _, _ in - let settings = ["PRODUCT_BUNDLE_IDENTIFIER": bundleId] - return [ - graphTarget.target - .name: XcodeBuildSettings(settings, target: graphTarget.target.name, configuration: "Debug"), - ] - } - simulatorController.findAvailableDeviceStub = { _platform, _version, _minVersion, _deviceName in - XCTAssertEqual(_platform, .iOS) - XCTAssertEqual(_version, version) - XCTAssertEqual(_minVersion, minVersion) - XCTAssertEqual(_deviceName, deviceName) - return .test(device: .test(), runtime: .test()) - } - simulatorController.installAppStub = { _appPath, _ in - XCTAssertEqual(_appPath, appPath) - } - simulatorController.launchAppStub = { _bundleId, _, _arguments in - XCTAssertEqual(_bundleId, bundleId) - XCTAssertEqual(_arguments, arguments) - } + given(xcodeProjectBuildDirectoryLocator) + .locate( + platform: .any, + projectPath: .any, + derivedDataPath: .any, + configuration: .any + ) + .willReturn(outputPath) + given(xcodeBuildController) + .showBuildSettings( + .any, + scheme: .any, + configuration: .any, + derivedDataPath: .any + ) + .willReturn( + [ + graphTarget.target + .name: XcodeBuildSettings( + ["PRODUCT_BUNDLE_IDENTIFIER": bundleId], + target: graphTarget.target.name, configuration: "Debug" + ), + ] + ) + given(simulatorController) + .launchApp( + bundleId: .any, + device: .any, + arguments: .any + ) + .willReturn() + given(simulatorController) + .askForAvailableDevice( + platform: .any, + version: .any, + minVersion: .any, + deviceName: .any + ) + .willReturn(.test()) - // THEN - do { - try await subject.runTarget( - graphTarget, - platform: .iOS, - workspacePath: workspacePath, - schemeName: "MyScheme", - configuration: nil, - minVersion: minVersion, - version: version, - deviceName: deviceName, - arguments: arguments + given(simulatorController) + .installApp( + at: .any, + device: .any ) - } catch { - XCTFail("Should not throw") - } + .willReturn() + + // Then + try await subject.runTarget( + graphTarget, + platform: .iOS, + workspacePath: workspacePath, + schemeName: "MyScheme", + configuration: nil, + minVersion: minVersion, + version: version, + deviceName: deviceName, + arguments: arguments + ) + + verify(simulatorController) + .askForAvailableDevice( + platform: .value(.iOS), + version: .value(version), + minVersion: .value(minVersion), + deviceName: .value(deviceName) + ) + .called(1) + + verify(simulatorController) + .installApp( + at: .value(appPath), + device: .any + ) + .called(1) + + verify(simulatorController) + .launchApp( + bundleId: .value(bundleId), + device: .any, + arguments: .value(arguments) + ) + .called(1) } } diff --git a/Tests/TuistAutomationTests/XcodeBuild/XcodeBuildControllerTests.swift b/Tests/TuistAutomationTests/XcodeBuild/XcodeBuildControllerTests.swift index 60bddb92740..df167f69053 100644 --- a/Tests/TuistAutomationTests/XcodeBuild/XcodeBuildControllerTests.swift +++ b/Tests/TuistAutomationTests/XcodeBuild/XcodeBuildControllerTests.swift @@ -43,18 +43,16 @@ final class XcodeBuildControllerTests: TuistUnitTestCase { system.succeedCommand(command, output: "output") // When - let events = try subject.build( + try await subject.build( target, scheme: scheme, destination: nil, rosetta: false, derivedDataPath: nil, clean: true, - arguments: [] + arguments: [], + passthroughXcodeBuildArguments: [] ) - - let result = try await events.toArray() - XCTAssertEqual(result, [.standardOutput(XcodeBuildOutput(raw: "output"))]) } func test_build_without_device_id_but_arch() async throws { @@ -71,18 +69,16 @@ final class XcodeBuildControllerTests: TuistUnitTestCase { system.succeedCommand(command, output: "output") // When - let events = try subject.build( + try await subject.build( target, scheme: scheme, destination: nil, rosetta: true, derivedDataPath: nil, clean: true, - arguments: [] + arguments: [], + passthroughXcodeBuildArguments: [] ) - - let result = try await events.toArray() - XCTAssertEqual(result, [.standardOutput(XcodeBuildOutput(raw: "output"))]) } func test_build_with_device_id() async throws { @@ -100,18 +96,16 @@ final class XcodeBuildControllerTests: TuistUnitTestCase { system.succeedCommand(command, output: "output") // When - let events = try subject.build( + try await subject.build( target, scheme: scheme, destination: .device("this_is_a_udid"), rosetta: false, derivedDataPath: nil, clean: true, - arguments: [] + arguments: [], + passthroughXcodeBuildArguments: [] ) - - let result = try await events.toArray() - XCTAssertEqual(result, [.standardOutput(XcodeBuildOutput(raw: "output"))]) } func test_build_with_device_id_and_arch() async throws { @@ -129,18 +123,16 @@ final class XcodeBuildControllerTests: TuistUnitTestCase { system.succeedCommand(command, output: "output") // When - let events = try subject.build( + try await subject.build( target, scheme: scheme, destination: .device("this_is_a_udid"), rosetta: true, derivedDataPath: nil, clean: true, - arguments: [] + arguments: [], + passthroughXcodeBuildArguments: [] ) - - let result = try await events.toArray() - XCTAssertEqual(result, [.standardOutput(XcodeBuildOutput(raw: "output"))]) } func test_test_when_device() async throws { @@ -165,7 +157,7 @@ final class XcodeBuildControllerTests: TuistUnitTestCase { system.succeedCommand(command, output: "output") // When - let events = try subject.test( + try await subject.test( target, scheme: scheme, clean: true, @@ -177,11 +169,9 @@ final class XcodeBuildControllerTests: TuistUnitTestCase { retryCount: 0, testTargets: [], skipTestTargets: [], - testPlanConfiguration: nil + testPlanConfiguration: nil, + passthroughXcodeBuildArguments: [] ) - - let result = try await events.toArray() - XCTAssertEqual(result, [.standardOutput(XcodeBuildOutput(raw: "output"))]) } func test_test_when_device_arch() async throws { @@ -206,7 +196,7 @@ final class XcodeBuildControllerTests: TuistUnitTestCase { system.succeedCommand(command, output: "output") // When - let events = try subject.test( + try await subject.test( target, scheme: scheme, clean: true, @@ -218,11 +208,9 @@ final class XcodeBuildControllerTests: TuistUnitTestCase { retryCount: 0, testTargets: [], skipTestTargets: [], - testPlanConfiguration: nil + testPlanConfiguration: nil, + passthroughXcodeBuildArguments: [] ) - - let result = try await events.toArray() - XCTAssertEqual(result, [.standardOutput(XcodeBuildOutput(raw: "output"))]) } func test_test_when_mac() async throws { @@ -249,7 +237,7 @@ final class XcodeBuildControllerTests: TuistUnitTestCase { developerEnvironment.stubbedArchitecture = .x8664 // When - let events = try subject.test( + try await subject.test( target, scheme: scheme, clean: true, @@ -261,11 +249,9 @@ final class XcodeBuildControllerTests: TuistUnitTestCase { retryCount: 0, testTargets: [], skipTestTargets: [], - testPlanConfiguration: nil + testPlanConfiguration: nil, + passthroughXcodeBuildArguments: [] ) - - let result = try await events.toArray() - XCTAssertEqual(result, [.standardOutput(XcodeBuildOutput(raw: "output"))]) } func test_test_with_derived_data() async throws { @@ -292,7 +278,7 @@ final class XcodeBuildControllerTests: TuistUnitTestCase { developerEnvironment.stubbedArchitecture = .x8664 // When - let events = try subject.test( + try await subject.test( target, scheme: scheme, clean: true, @@ -304,11 +290,9 @@ final class XcodeBuildControllerTests: TuistUnitTestCase { retryCount: 0, testTargets: [], skipTestTargets: [], - testPlanConfiguration: nil + testPlanConfiguration: nil, + passthroughXcodeBuildArguments: [] ) - - let result = try await events.toArray() - XCTAssertEqual(result, [.standardOutput(XcodeBuildOutput(raw: "output"))]) } func test_test_with_result_bundle_path() async throws { @@ -335,7 +319,7 @@ final class XcodeBuildControllerTests: TuistUnitTestCase { developerEnvironment.stubbedArchitecture = .x8664 // When - let events = try subject.test( + try await subject.test( target, scheme: scheme, clean: true, @@ -347,11 +331,9 @@ final class XcodeBuildControllerTests: TuistUnitTestCase { retryCount: 0, testTargets: [], skipTestTargets: [], - testPlanConfiguration: nil + testPlanConfiguration: nil, + passthroughXcodeBuildArguments: [] ) - - let result = try await events.toArray() - XCTAssertEqual(result, [.standardOutput(XcodeBuildOutput(raw: "output"))]) } } diff --git a/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift b/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift index e477a75b6ee..3c34b08f8a7 100644 --- a/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift +++ b/Tests/TuistDependenciesAcceptanceTests/DependenciesAcceptanceTests.swift @@ -7,7 +7,7 @@ import XCTest final class DependenciesAcceptanceTestAppWithSPMDependencies: TuistAcceptanceTestCase { func test_app_spm_dependencies() async throws { - try setUpFixture(.appWithSpmDependencies) + try await setUpFixture(.appWithSpmDependencies) try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "App") @@ -18,7 +18,7 @@ final class DependenciesAcceptanceTestAppWithSPMDependencies: TuistAcceptanceTes final class DependenciesAcceptanceTestAppWithSPMDependenciesWithoutInstall: TuistAcceptanceTestCase { func test() async throws { - try setUpFixture(.appWithSpmDependencies) + try await setUpFixture(.appWithSpmDependencies) do { try await run(GenerateCommand.self) } catch { @@ -34,7 +34,7 @@ final class DependenciesAcceptanceTestAppWithSPMDependenciesWithoutInstall: Tuis final class DependenciesAcceptanceTestIosAppWithSPMDependencies: TuistAcceptanceTestCase { func test_ios_app_spm_dependencies() async throws { - try setUpFixture(.iosAppWithSpmDependencies) + try await setUpFixture(.iosAppWithSpmDependencies) try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "App") diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index 33daff0c1fa..92e4c5e6797 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -7,7 +7,7 @@ import XCTest final class GenerateAcceptanceTestiOSAppWithTests: TuistAcceptanceTestCase { func test_ios_app_with_tests() async throws { - try setUpFixture(.iosAppWithTests) + try await setUpFixture(.iosAppWithTests) try await run(GenerateCommand.self) try await run(BuildCommand.self) } @@ -15,7 +15,7 @@ final class GenerateAcceptanceTestiOSAppWithTests: TuistAcceptanceTestCase { final class GenerateAcceptanceTestiOSAppWithFrameworks: TuistAcceptanceTestCase { func test_ios_app_with_frameworks() async throws { - try setUpFixture(.iosAppWithFrameworks) + try await setUpFixture(.iosAppWithFrameworks) try await run(GenerateCommand.self) try await run(BuildCommand.self) try await XCTAssertProductWithDestinationContainsInfoPlistKey( @@ -28,7 +28,7 @@ final class GenerateAcceptanceTestiOSAppWithFrameworks: TuistAcceptanceTestCase final class GenerateAcceptanceTestiOSAppWithHeaders: TuistAcceptanceTestCase { func test_ios_app_with_headers() async throws { - try setUpFixture(.iosAppWithHeaders) + try await setUpFixture(.iosAppWithHeaders) try await run(GenerateCommand.self) try await run(BuildCommand.self) } @@ -36,7 +36,7 @@ final class GenerateAcceptanceTestiOSAppWithHeaders: TuistAcceptanceTestCase { final class GenerateAcceptanceTestInvalidWorkspaceManifestName: TuistAcceptanceTestCase { func test_invalid_workspace_manifest_name() async throws { - try setUpFixture(.invalidWorkspaceManifestName) + try await setUpFixture(.invalidWorkspaceManifestName) do { try await run(GenerateCommand.self) XCTFail("Generate command should have failed") @@ -49,7 +49,7 @@ final class GenerateAcceptanceTestInvalidWorkspaceManifestName: TuistAcceptanceT // TODO: Fix (this test has an issue in GitHub actions due to a missing tvOS platform) // final class GenerateAcceptanceTestiOSAppWithSDK: TuistAcceptanceTestCase { // func test_ios_app_with_sdk() async throws { -// try setUpFixture("ios_app_with_sdk") +// try await setUpFixture("ios_app_with_sdk") // try await run(GenerateCommand.self) // try await run(BuildCommand.self) // try await run(BuildCommand.self, "MacFramework", "--platform", "macOS") @@ -59,7 +59,7 @@ final class GenerateAcceptanceTestInvalidWorkspaceManifestName: TuistAcceptanceT final class GenerateAcceptanceTestiOSAppWithFrameworkAndResources: TuistAcceptanceTestCase { func test_ios_app_with_framework_and_resources() async throws { - try setUpFixture(.iosAppWithFrameworkAndResources) + try await setUpFixture(.iosAppWithFrameworkAndResources) try await run(GenerateCommand.self) try await run(BuildCommand.self) for resource in [ @@ -139,7 +139,7 @@ final class GenerateAcceptanceTestiOSAppWithFrameworkAndResources: TuistAcceptan final class GenerateAcceptanceTestiOSAppWithOnDemandResources: TuistAcceptanceTestCase { func test_ios_app_with_on_demand_resources() async throws { - try setUpFixture(.iosAppWithOnDemandResources) + try await setUpFixture(.iosAppWithOnDemandResources) try await run(GenerateCommand.self) try await run(BuildCommand.self) let pbxprojPath = xcodeprojPath.appending(component: "project.pbxproj") @@ -169,7 +169,7 @@ final class GenerateAcceptanceTestiOSAppWithOnDemandResources: TuistAcceptanceTe final class GenerateAcceptanceTestiOSAppWithPrivacyManifest: TuistAcceptanceTestCase { func test_ios_app_with_privacy_manifest() async throws { - try setUpFixture(.iosAppWithPrivacyManifest) + try await setUpFixture(.iosAppWithPrivacyManifest) try await run(GenerateCommand.self) try await run(BuildCommand.self) try XCTAssertDirectoryContentEqual( @@ -183,7 +183,7 @@ final class GenerateAcceptanceTestiOSAppWithPrivacyManifest: TuistAcceptanceTest final class GenerateAcceptanceTestIosAppWithCustomDevelopmentRegion: TuistAcceptanceTestCase { func test_ios_app_with_custom_development_region() async throws { - try setUpFixture(.iosAppWithCustomDevelopmentRegion) + try await setUpFixture(.iosAppWithCustomDevelopmentRegion) try await run(GenerateCommand.self) try await run(BuildCommand.self) for resource in [ @@ -213,7 +213,7 @@ final class GenerateAcceptanceTestIosAppWithCustomDevelopmentRegion: TuistAccept final class GenerateAcceptanceTestiOSAppWithCustomResourceParserOptions: TuistAcceptanceTestCase { func test_ios_app_with_custom_resource_parser_options() async throws { - try setUpFixture(.iosWppWithCustomResourceParserOptions) + try await setUpFixture(.iosWppWithCustomResourceParserOptions) try await run(GenerateCommand.self) try await run(BuildCommand.self) for resource in [ @@ -252,7 +252,7 @@ final class GenerateAcceptanceTestiOSAppWithCustomResourceParserOptions: TuistAc final class GenerateAcceptanceTestiOSAppWithFrameworkLinkingStaticFramework: TuistAcceptanceTestCase { func test_ios_app_with_framework_linking_static_framework() async throws { - try setUpFixture(.iosAppWithFrameworkLinkingStaticFramework) + try await setUpFixture(.iosAppWithFrameworkLinkingStaticFramework) try await run(GenerateCommand.self) try await run(BuildCommand.self) @@ -278,7 +278,7 @@ final class GenerateAcceptanceTestiOSAppWithFrameworkLinkingStaticFramework: Tui final class GenerateAcceptanceTestsiOSAppWithCustomScheme: TuistAcceptanceTestCase { func test_ios_app_with_custom_scheme() async throws { - try setUpFixture(.iosAppWithCustomScheme) + try await setUpFixture(.iosAppWithCustomScheme) try await run(GenerateCommand.self) try await run(BuildCommand.self) try await run(BuildCommand.self, "App-Debug") @@ -304,7 +304,7 @@ final class GenerateAcceptanceTestsiOSAppWithCustomScheme: TuistAcceptanceTestCa final class GenerateAcceptanceTestiOSAppWithLocalSwiftPackage: TuistAcceptanceTestCase { func test_ios_app_with_local_swift_package() async throws { - try setUpFixture(.iosAppWithLocalSwiftPackage) + try await setUpFixture(.iosAppWithLocalSwiftPackage) try await run(GenerateCommand.self) try await run(BuildCommand.self) } @@ -312,7 +312,7 @@ final class GenerateAcceptanceTestiOSAppWithLocalSwiftPackage: TuistAcceptanceTe final class GenerateAcceptanceTestiOSAppWithMultiConfigs: TuistAcceptanceTestCase { func test_ios_app_with_multi_configs() async throws { - try setUpFixture(.iosAppWithMultiConfigs) + try await setUpFixture(.iosAppWithMultiConfigs) try await run(GenerateCommand.self) try await XCTAssertSchemeContainsBuildSettings( "App", @@ -355,7 +355,7 @@ final class GenerateAcceptanceTestiOSAppWithMultiConfigs: TuistAcceptanceTestCas final class GenerateAcceptanceTestiOSAppWithIncompatibleXcode: TuistAcceptanceTestCase { func test_ios_app_with_incompatible_xcode() async throws { - try setUpFixture(.iosAppWithIncompatibleXcode) + try await setUpFixture(.iosAppWithIncompatibleXcode) do { try await run(GenerateCommand.self) XCTFail("Generate should have failed") @@ -374,7 +374,7 @@ final class GenerateAcceptanceTestiOSAppWithIncompatibleXcode: TuistAcceptanceTe // TODO: Find a different build tool plugin. SwiftLintPlugin imports swift-syntax that takes a _very_ long time to build // final class GenerateAcceptanceTestiOSAppWithActions: TuistAcceptanceTestCase { // func test_ios_app_with_actions() async throws { -// try setUpFixture("ios_app_with_actions") +// try await setUpFixture("ios_app_with_actions") // try await run(GenerateCommand.self) // try await run(BuildCommand.self) // @@ -412,7 +412,7 @@ final class GenerateAcceptanceTestiOSAppWithIncompatibleXcode: TuistAcceptanceTe final class GenerateAcceptanceTestiOSAppWithBuildVariables: TuistAcceptanceTestCase { func test_ios_app_with_build_variables() async throws { - try setUpFixture(.iosAppWithBuildVariables) + try await setUpFixture(.iosAppWithBuildVariables) try await run(GenerateCommand.self) let xcodeproj = try XcodeProj( pathString: fixturePath.appending(components: "App", "App.xcodeproj").pathString @@ -434,7 +434,7 @@ final class GenerateAcceptanceTestiOSAppWithBuildVariables: TuistAcceptanceTestC final class GenerateAcceptanceTestiOSAppWithRemoteSwiftPackage: TuistAcceptanceTestCase { func test_ios_app_with_remote_swift_package() async throws { - try setUpFixture(.iosAppWithRemoteSwiftPackage) + try await setUpFixture(.iosAppWithRemoteSwiftPackage) try await run(GenerateCommand.self) try await run(BuildCommand.self) } @@ -442,7 +442,7 @@ final class GenerateAcceptanceTestiOSAppWithRemoteSwiftPackage: TuistAcceptanceT final class GenerateAcceptanceTestVisionOSAppWithRemoteSwiftPackage: TuistAcceptanceTestCase { func test_visionos_app() async throws { - try setUpFixture(.visionosApp) + try await setUpFixture(.visionosApp) try await run(GenerateCommand.self) // TODO: Fix // try await run(BuildCommand.self) @@ -451,7 +451,7 @@ final class GenerateAcceptanceTestVisionOSAppWithRemoteSwiftPackage: TuistAccept final class GenerateAcceptanceTestiOSAppWithLocalBinarySwiftPackage: TuistAcceptanceTestCase { func test_ios_app_with_local_binary_swift_package() async throws { - try setUpFixture(.iosAppWithLocalBinarySwiftPackage) + try await setUpFixture(.iosAppWithLocalBinarySwiftPackage) try await run(GenerateCommand.self) try await run(BuildCommand.self) } @@ -459,7 +459,7 @@ final class GenerateAcceptanceTestiOSAppWithLocalBinarySwiftPackage: TuistAccept final class GenerateAcceptanceTestiOSAppWithExtensions: TuistAcceptanceTestCase { func test_ios_app_with_extensions() async throws { - try setUpFixture(.iosAppWithExtensions) + try await setUpFixture(.iosAppWithExtensions) try await run(GenerateCommand.self) try await run(BuildCommand.self, "App") @@ -492,7 +492,7 @@ final class GenerateAcceptanceTestiOSAppWithExtensions: TuistAcceptanceTestCase final class GenerateAcceptanceTestiOSAppWithExtensionAndTests: TuistAcceptanceTestCase { func test_ios_app_with_extension_and_tests() async throws { - try setUpFixture(.iosAppWithExtensionAndTests) + try await setUpFixture(.iosAppWithExtensionAndTests) try await run(GenerateCommand.self) try await run(BuildCommand.self) @@ -508,7 +508,7 @@ final class GenerateAcceptanceTestiOSAppWithExtensionAndTests: TuistAcceptanceTe // TODO: Fix – tvOS // final class GenerateAcceptanceTestTvOSAppWithExtensions: TuistAcceptanceTestCase { // func test_tvos_app_with_extensions() async throws { -// try setUpFixture("tvos_app_with_extensions") +// try await setUpFixture("tvos_app_with_extensions") // try await run(GenerateCommand.self) // try await run(BuildCommand.self) // try await XCTAssertProductWithDestinationContainsExtension( @@ -525,7 +525,7 @@ final class GenerateAcceptanceTestiOSAppWithExtensionAndTests: TuistAcceptanceTe final class GenerateAcceptanceTestiOSAppWithWatchApp2: TuistAcceptanceTestCase { func test_ios_app_with_watchapp2() async throws { - try setUpFixture(.iosAppWithWatchapp2) + try await setUpFixture(.iosAppWithWatchapp2) try await run(GenerateCommand.self) try await run(BuildCommand.self, "App") try await XCTAssertProductWithDestinationContainsResource( @@ -551,7 +551,7 @@ final class GenerateAcceptanceTestiOSAppWithWatchApp2: TuistAcceptanceTestCase { final class GenerateAcceptanceTestInvalidManifest: TuistAcceptanceTestCase { func test_invalid_manifest() async throws { - try setUpFixture(.invalidManifest) + try await setUpFixture(.invalidManifest) do { try await run(GenerateCommand.self) XCTFail("Generate command should have failed") @@ -563,14 +563,14 @@ final class GenerateAcceptanceTestInvalidManifest: TuistAcceptanceTestCase { final class GenerateAcceptanceTestiOSAppLarge: TuistAcceptanceTestCase { func test_ios_app_large() async throws { - try setUpFixture(.iosAppLarge) + try await setUpFixture(.iosAppLarge) try await run(GenerateCommand.self) } } final class GenerateAcceptanceTestiOSWorkspaceWithDependencyCycle: TuistAcceptanceTestCase { func test_ios_workspace_with_dependency_cycle() async throws { - try setUpFixture(.iosWorkspaceWithDependencyCycle) + try await setUpFixture(.iosWorkspaceWithDependencyCycle) do { try await run(GenerateCommand.self) XCTFail("Generate command should have failed") @@ -582,7 +582,7 @@ final class GenerateAcceptanceTestiOSWorkspaceWithDependencyCycle: TuistAcceptan final class GenerateAcceptanceTestFrameworkWithEnvironmentVariables: TuistAcceptanceTestCase { func test_framework_with_environment_variables() async throws { - try setUpFixture(.frameworkWithEnvironmentVariables) + try await setUpFixture(.frameworkWithEnvironmentVariables) environment.manifestLoadingVariables["TUIST_FRAMEWORK_NAME"] = "FrameworkA" try await run(GenerateCommand.self) try await run(BuildCommand.self, "FrameworkA") @@ -594,7 +594,7 @@ final class GenerateAcceptanceTestFrameworkWithEnvironmentVariables: TuistAccept final class GenerateAcceptanceTestiOSAppWithCoreData: TuistAcceptanceTestCase { func test_ios_app_with_coredata() async throws { - try setUpFixture(.iosAppWithCoreData) + try await setUpFixture(.iosAppWithCoreData) try await run(GenerateCommand.self) try await run(BuildCommand.self) for resource in [ @@ -625,7 +625,7 @@ final class GenerateAcceptanceTestiOSAppWithCoreData: TuistAcceptanceTestCase { final class GenerateAcceptanceTestiOSAppWithAppClip: TuistAcceptanceTestCase { func test_ios_app_with_appclip() async throws { - try setUpFixture(.iosAppWithAppClip) + try await setUpFixture(.iosAppWithAppClip) try await run(GenerateCommand.self) try await run(BuildCommand.self) try await XCTAssertProductWithDestinationContainsAppClipWithArchitecture( @@ -652,7 +652,7 @@ final class GenerateAcceptanceTestiOSAppWithAppClip: TuistAcceptanceTestCase { final class GenerateAcceptanceTestCommandLineToolBase: TuistAcceptanceTestCase { func test_command_line_tool_basic() async throws { - try setUpFixture(.commandLineToolBasic) + try await setUpFixture(.commandLineToolBasic) try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "CommandLineTool") @@ -661,7 +661,7 @@ final class GenerateAcceptanceTestCommandLineToolBase: TuistAcceptanceTestCase { final class GenerateAcceptanceTestCommandLineToolWithStaticLibrary: TuistAcceptanceTestCase { func test_command_line_tool_with_static_library() async throws { - try setUpFixture(.commandLineToolWithStaticLibrary) + try await setUpFixture(.commandLineToolWithStaticLibrary) try await run(GenerateCommand.self) try await run(BuildCommand.self, "CommandLineTool") } @@ -669,7 +669,7 @@ final class GenerateAcceptanceTestCommandLineToolWithStaticLibrary: TuistAccepta final class GenerateAcceptanceTestCommandLineToolWithDynamicLibrary: TuistAcceptanceTestCase { func test_command_line_tool_with_dynamic_library() async throws { - try setUpFixture(.commandLineToolWithDynamicLibrary) + try await setUpFixture(.commandLineToolWithDynamicLibrary) try await run(GenerateCommand.self) try await run(BuildCommand.self, "CommandLineTool") } @@ -677,7 +677,7 @@ final class GenerateAcceptanceTestCommandLineToolWithDynamicLibrary: TuistAccept final class GenerateAcceptanceTestCommandLineToolWithDynamicFramework: TuistAcceptanceTestCase { func test_command_line_tool_with_dynamic_framework() async throws { - try setUpFixture(.commandLineToolWithDynamicFramework) + try await setUpFixture(.commandLineToolWithDynamicFramework) try await run(GenerateCommand.self) try await run(BuildCommand.self, "CommandLineTool") } @@ -685,7 +685,7 @@ final class GenerateAcceptanceTestCommandLineToolWithDynamicFramework: TuistAcce final class GenerateAcceptanceTestmacOSAppWithCopyFiles: TuistAcceptanceTestCase { func test_macos_app_with_copy_files() async throws { - try setUpFixture(.macosAppWithCopyFiles) + try await setUpFixture(.macosAppWithCopyFiles) try await run(GenerateCommand.self) try await run(BuildCommand.self) @@ -703,7 +703,7 @@ final class GenerateAcceptanceTestmacOSAppWithCopyFiles: TuistAcceptanceTestCase final class GenerateAcceptanceTestManifestWithLogs: TuistAcceptanceTestCase { func test_manifest_with_logs() async throws { - try setUpFixture(.manifestWithLogs) + try await setUpFixture(.manifestWithLogs) try await run(GenerateCommand.self) XCTAssertStandardOutput(pattern: "Target name - App") } @@ -711,7 +711,7 @@ final class GenerateAcceptanceTestManifestWithLogs: TuistAcceptanceTestCase { final class GenerateAcceptanceTestProjectWithFileHeaderTemplate: TuistAcceptanceTestCase { func test_project_with_file_header_template() async throws { - try setUpFixture(.projectWithFileHeaderTemplate) + try await setUpFixture(.projectWithFileHeaderTemplate) try await run(GenerateCommand.self) XCTAssertTrue( FileHandler.shared.exists( @@ -728,7 +728,7 @@ final class GenerateAcceptanceTestProjectWithFileHeaderTemplate: TuistAcceptance final class GenerateAcceptanceTestProjectWithInlineFileHeaderTemplate: TuistAcceptanceTestCase { func test_project_with_inline_file_header_template() async throws { - try setUpFixture(.projectWithInlineFileHeaderTemplate) + try await setUpFixture(.projectWithInlineFileHeaderTemplate) try await run(GenerateCommand.self) XCTAssertTrue( FileHandler.shared.exists( @@ -745,7 +745,7 @@ final class GenerateAcceptanceTestProjectWithInlineFileHeaderTemplate: TuistAcce final class GenerateAcceptanceTestWorkspaceWithFileHeaderTemplate: TuistAcceptanceTestCase { func test_workspace_with_file_header_template() async throws { - try setUpFixture(.workspaceWithFileHeaderTemplate) + try await setUpFixture(.workspaceWithFileHeaderTemplate) try await run(GenerateCommand.self) XCTAssertTrue( FileHandler.shared.exists( @@ -762,7 +762,7 @@ final class GenerateAcceptanceTestWorkspaceWithFileHeaderTemplate: TuistAcceptan final class GenerateAcceptanceTestWorkspaceWithInlineFileHeaderTemplate: TuistAcceptanceTestCase { func test_workspace_with_inline_file_header_template() async throws { - try setUpFixture(.workspaceWithInlineFileHeaderTemplate) + try await setUpFixture(.workspaceWithInlineFileHeaderTemplate) try await run(GenerateCommand.self) XCTAssertTrue( FileHandler.shared.exists( @@ -779,7 +779,7 @@ final class GenerateAcceptanceTestWorkspaceWithInlineFileHeaderTemplate: TuistAc final class GenerateAcceptanceTestiOSAppWithFrameworkAndDisabledResources: TuistAcceptanceTestCase { func test_ios_app_with_framework_and_disabled_resources() async throws { - try setUpFixture(.iosAppWithFrameworkAndDisabledResources) + try await setUpFixture(.iosAppWithFrameworkAndDisabledResources) try await run(GenerateCommand.self) XCTAssertFalse( FileHandler.shared.exists( @@ -822,7 +822,7 @@ final class GenerateAcceptanceTestiOSAppWithFrameworkAndDisabledResources: Tuist final class GenerateAcceptanceTestmacOSAppWithExtensions: TuistAcceptanceTestCase { func test_macos_app_with_extensions() async throws { - try setUpFixture(.macosAppWithExtensions) + try await setUpFixture(.macosAppWithExtensions) let sdkPkgPath = sourceRootPath .appending( components: [ @@ -844,7 +844,7 @@ final class GenerateAcceptanceTestmacOSAppWithExtensions: TuistAcceptanceTestCas final class GenerateAcceptanceTestiOSAppWithImplicitDependencies: TuistAcceptanceTestCase { func test_ios_app_with_implicit_dependencies() async throws { - try setUpFixture(.iosAppWithImplicitDependencies) + try await setUpFixture(.iosAppWithImplicitDependencies) try await run(GenerateCommand.self) try await run(BuildCommand.self, "FrameworkC") do { @@ -860,7 +860,7 @@ final class GenerateAcceptanceTestiOSAppWithImplicitDependencies: TuistAcceptanc final class GenerateAcceptanceTestSPMPackage: TuistAcceptanceTestCase { func test_spm_package() async throws { - try setUpFixture(.spmPackage) + try await setUpFixture(.spmPackage) try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "MyPackage", "--platform", "ios") @@ -874,7 +874,7 @@ final class GenerateAcceptanceTestSPMPackage: TuistAcceptanceTestCase { final class GenerateAcceptanceTestAppWithDefaultConfiguration: TuistAcceptanceTestCase { func test_app_with_custom_default_configuration() async throws { - try setUpFixture(.appWithCustomDefaultConfiguration) + try await setUpFixture(.appWithCustomDefaultConfiguration) try await run(GenerateCommand.self) try await run(BuildCommand.self) } @@ -882,7 +882,7 @@ final class GenerateAcceptanceTestAppWithDefaultConfiguration: TuistAcceptanceTe final class GenerateAcceptanceTestAppWithGoogleMaps: TuistAcceptanceTestCase { func test_app_with_google_maps() async throws { - try setUpFixture(.appWithGoogleMaps) + try await setUpFixture(.appWithGoogleMaps) try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self) @@ -891,7 +891,7 @@ final class GenerateAcceptanceTestAppWithGoogleMaps: TuistAcceptanceTestCase { final class GenerateAcceptanceTestFrameworkWithMacroAndPluginPackages: TuistAcceptanceTestCase { func test_framework_with_macro_and_plugin_packages() async throws { - try setUpFixture(.frameworkWithMacroAndPluginPackages) + try await setUpFixture(.frameworkWithMacroAndPluginPackages) try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self, "--", "-skipPackagePluginValidation") diff --git a/Tests/TuistKitAcceptanceTests/BuildRulesAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/BuildRulesAcceptanceTests.swift index 56419118434..777aca1562b 100644 --- a/Tests/TuistKitAcceptanceTests/BuildRulesAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/BuildRulesAcceptanceTests.swift @@ -7,7 +7,7 @@ import XCTest final class BuildRulesAcceptanceTestAppWithBuildRules: TuistAcceptanceTestCase { func test_app_with_build_rules() async throws { - try setUpFixture(.appWithBuildRules) + try await setUpFixture(.appWithBuildRules) try await run(GenerateCommand.self) try await run(BuildCommand.self) let xcodeproj = try XcodeProj(pathString: xcodeprojPath.pathString) diff --git a/Tests/TuistKitAcceptanceTests/CacheAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/CacheAcceptanceTests.swift index ed871400eef..b529c8ed8ba 100644 --- a/Tests/TuistKitAcceptanceTests/CacheAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/CacheAcceptanceTests.swift @@ -3,7 +3,7 @@ import TuistAcceptanceTesting final class CacheAcceptanceTestiOSAppWithFrameworks: TuistAcceptanceTestCase { func test_ios_app_with_frameworks() async throws { - try setUpFixture(.iosAppWithFrameworks) + try await setUpFixture(.iosAppWithFrameworks) try await run(CacheCommand.self, "--print-hashes") XCTAssertStandardOutput(pattern: """ Framework1 - 31b5dd46503cc78a7d84514b3a59e462 diff --git a/Tests/TuistKitAcceptanceTests/EditAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/EditAcceptanceTests.swift index 920fce49ad8..53f359acc22 100644 --- a/Tests/TuistKitAcceptanceTests/EditAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/EditAcceptanceTests.swift @@ -7,7 +7,7 @@ import XCTest final class EditAcceptanceTestiOSAppWithHelpers: TuistAcceptanceTestCase { func test_ios_app_with_helpers() async throws { - try setUpFixture(.iosAppWithHelpers) + try await setUpFixture(.iosAppWithHelpers) try await run(EditCommand.self) try build(scheme: "Manifests") } @@ -15,7 +15,7 @@ final class EditAcceptanceTestiOSAppWithHelpers: TuistAcceptanceTestCase { final class EditAcceptanceTestPlugin: TuistAcceptanceTestCase { func test_plugin() async throws { - try setUpFixture(.plugin) + try await setUpFixture(.plugin) try await run(EditCommand.self) try build(scheme: "Plugins") } @@ -23,7 +23,7 @@ final class EditAcceptanceTestPlugin: TuistAcceptanceTestCase { final class EditAcceptanceTestAppWithPlugins: TuistAcceptanceTestCase { func test_app_with_plugins() async throws { - try setUpFixture(.appWithPlugins) + try await setUpFixture(.appWithPlugins) try await run(InstallCommand.self) try await run(EditCommand.self) try build(scheme: "Manifests") @@ -34,7 +34,7 @@ final class EditAcceptanceTestAppWithPlugins: TuistAcceptanceTestCase { final class EditAcceptanceTestAppWithSPMDependencies: TuistAcceptanceTestCase { func test_app_with_spm_dependencies() async throws { - try setUpFixture(.appWithSpmDependencies) + try await setUpFixture(.appWithSpmDependencies) try await run(EditCommand.self) try build(scheme: "Manifests") } @@ -42,7 +42,7 @@ final class EditAcceptanceTestAppWithSPMDependencies: TuistAcceptanceTestCase { final class EditAcceptanceTestSPMPackage: TuistAcceptanceTestCase { func test_spm_package() async throws { - try setUpFixture(.spmPackage) + try await setUpFixture(.spmPackage) try await run(EditCommand.self) try build(scheme: "Manifests") } diff --git a/Tests/TuistKitAcceptanceTests/GraphAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/GraphAcceptanceTests.swift index e356963662c..9584dc396ec 100644 --- a/Tests/TuistKitAcceptanceTests/GraphAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/GraphAcceptanceTests.swift @@ -8,7 +8,7 @@ import XCTest // TODO: Fix (issues with finding executables) // final class GraphAcceptanceTestiOSWorkspaceWithMicrofeatureArchitecture: TuistAcceptanceTestCase { // func test_ios_workspace_with_microfeature_architecture() async throws { -// try setUpFixture("ios_workspace_with_microfeature_architecture") +// try await setUpFixture("ios_workspace_with_microfeature_architecture") // try await run(GraphCommand.self, "--output-path", fixturePath.pathString) // let graphFile = fixturePath.appending(component: "graph.png") // try System.shared.runAndPrint( diff --git a/Tests/TuistKitAcceptanceTests/ListTargetsAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/ListTargetsAcceptanceTests.swift index 3bf693ef7cd..ddc5546dc4f 100644 --- a/Tests/TuistKitAcceptanceTests/ListTargetsAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/ListTargetsAcceptanceTests.swift @@ -7,7 +7,7 @@ import XCTest final class ListTargetsAcceptanceTestiOSWorkspaceWithMicrofeatureArchitecture: TuistAcceptanceTestCase { func test_ios_workspace_with_microfeature_architecture() async throws { - try setUpFixture(.iosWorkspaceWithMicrofeatureArchitecture) + try await setUpFixture(.iosWorkspaceWithMicrofeatureArchitecture) try await run(GenerateCommand.self) try listTargets(for: "UIComponents") try listTargets(for: "Core") diff --git a/Tests/TuistKitAcceptanceTests/PluginAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/PluginAcceptanceTests.swift index cb27df59c7e..c92ba36ef6c 100644 --- a/Tests/TuistKitAcceptanceTests/PluginAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/PluginAcceptanceTests.swift @@ -7,7 +7,7 @@ import XCTest final class PluginAcceptanceTestTuistPlugin: TuistAcceptanceTestCase { func test_tuist_plugin() async throws { - try setUpFixture(.tuistPlugin) + try await setUpFixture(.tuistPlugin) try run(PluginBuildCommand.self) try run(PluginRunCommand.self, "tuist-create-file") } @@ -15,7 +15,7 @@ final class PluginAcceptanceTestTuistPlugin: TuistAcceptanceTestCase { final class PluginAcceptanceTestAppWithPlugins: TuistAcceptanceTestCase { func test_app_with_plugins() async throws { - try setUpFixture(.appWithPlugins) + try await setUpFixture(.appWithPlugins) try await run(InstallCommand.self) try await run(GenerateCommand.self) try await run(BuildCommand.self) diff --git a/Tests/TuistKitAcceptanceTests/PrecompiledAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/PrecompiledAcceptanceTests.swift index 8982dfce6ef..780193e09af 100644 --- a/Tests/TuistKitAcceptanceTests/PrecompiledAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/PrecompiledAcceptanceTests.swift @@ -7,7 +7,7 @@ import XCTest final class PrecomiledAcceptanceTestiOSAppWithStaticFrameworks: TuistAcceptanceTestCase { func test_ios_app_with_static_frameworks() async throws { - try setUpFixture(.iosAppWithStaticFrameworks) + try await setUpFixture(.iosAppWithStaticFrameworks) try await run(GenerateCommand.self) try await run(BuildCommand.self) } @@ -15,7 +15,7 @@ final class PrecomiledAcceptanceTestiOSAppWithStaticFrameworks: TuistAcceptanceT final class PrecomiledAcceptanceTestiOSAppWithStaticLibraries: TuistAcceptanceTestCase { func test_ios_app_with_static_libraries() async throws { - try setUpFixture(.iosAppWithStaticLibraries) + try await setUpFixture(.iosAppWithStaticLibraries) try await run(GenerateCommand.self) try await run(BuildCommand.self) } @@ -23,7 +23,7 @@ final class PrecomiledAcceptanceTestiOSAppWithStaticLibraries: TuistAcceptanceTe final class PrecomiledAcceptanceTestiOSAppWithTransitiveFramework: TuistAcceptanceTestCase { func test_ios_app_with_transitive_framework() async throws { - try setUpFixture(.iosAppWithTransitiveFramework) + try await setUpFixture(.iosAppWithTransitiveFramework) try await run(GenerateCommand.self) try await run(BuildCommand.self, "App", "--platform", "iOS") try await XCTAssertProductWithDestinationContainsFrameworkWithArchitecture( @@ -44,7 +44,7 @@ final class PrecomiledAcceptanceTestiOSAppWithTransitiveFramework: TuistAcceptan final class PrecompiledAcceptanceTestiOSAppWithStaticLibraryAndPackage: TuistAcceptanceTestCase { func test_ios_app_with_static_library_and_package() async throws { - try setUpFixture(.iosAppWithStaticLibraryAndPackage) + try await setUpFixture(.iosAppWithStaticLibraryAndPackage) try await run(GenerateCommand.self) try await run(BuildCommand.self) } @@ -52,7 +52,7 @@ final class PrecompiledAcceptanceTestiOSAppWithStaticLibraryAndPackage: TuistAcc final class PrecompiledAcceptanceTestiOSAppWithXCFrameworks: TuistAcceptanceTestCase { func test_ios_app_with_xcframeworks() async throws { - try setUpFixture(.iosAppWithXcframeworks) + try await setUpFixture(.iosAppWithXcframeworks) try await run(GenerateCommand.self) try await run(BuildCommand.self) try await XCTAssertProductWithDestinationContainsFrameworkWithArchitecture( diff --git a/Tests/TuistKitAcceptanceTests/RunAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/RunAcceptanceTests.swift index 297d8e3d4c5..8088a107e8b 100644 --- a/Tests/TuistKitAcceptanceTests/RunAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/RunAcceptanceTests.swift @@ -7,7 +7,7 @@ import XCTest final class RunAcceptanceTestCommandLineToolBasic: TuistAcceptanceTestCase { func test_command_line_tool_basic() async throws { - try setUpFixture(.commandLineToolBasic) + try await setUpFixture(.commandLineToolBasic) try await run(InstallCommand.self) try await run(RunCommand.self, "CommandLineTool") } diff --git a/Tests/TuistKitAcceptanceTests/ScaffoldAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/ScaffoldAcceptanceTests.swift index d745dc91a89..225ba069dea 100644 --- a/Tests/TuistKitAcceptanceTests/ScaffoldAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/ScaffoldAcceptanceTests.swift @@ -13,7 +13,7 @@ final class ScaffoldAcceptanceTests: TuistAcceptanceTestCase { } func test_ios_app_with_templates_custom() async throws { - try setUpFixture(.iosAppWithTemplates) + try await setUpFixture(.iosAppWithTemplates) try await run(InstallCommand.self) try await ScaffoldCommand.preprocess([ "scaffold", @@ -39,7 +39,7 @@ final class ScaffoldAcceptanceTests: TuistAcceptanceTestCase { } func test_ios_app_with_templates_custom_using_filters() async throws { - try setUpFixture(.iosAppWithTemplates) + try await setUpFixture(.iosAppWithTemplates) try await run(InstallCommand.self) try await ScaffoldCommand.preprocess([ "scaffold", @@ -58,7 +58,7 @@ final class ScaffoldAcceptanceTests: TuistAcceptanceTestCase { } func test_ios_app_with_templates_custom_using_copy_folder() async throws { - try setUpFixture(.iosAppWithTemplates) + try await setUpFixture(.iosAppWithTemplates) try await run(InstallCommand.self) try await ScaffoldCommand.preprocess([ "scaffold", @@ -98,7 +98,7 @@ final class ScaffoldAcceptanceTests: TuistAcceptanceTestCase { } func test_app_with_plugins_local_plugin() async throws { - try setUpFixture(.appWithPlugins) + try await setUpFixture(.appWithPlugins) try await run(InstallCommand.self) try await ScaffoldCommand.preprocess(["scaffold", "custom", "--name", "PluginTemplate", "--path", fixturePath.pathString]) try await run(ScaffoldCommand.self, "custom", "--name", "PluginTemplate") @@ -117,7 +117,7 @@ final class ScaffoldAcceptanceTests: TuistAcceptanceTestCase { } func test_app_with_plugins_remote_plugin() async throws { - try setUpFixture(.appWithPlugins) + try await setUpFixture(.appWithPlugins) try await run(InstallCommand.self) try await ScaffoldCommand.preprocess([ "scaffold", @@ -143,7 +143,7 @@ final class ScaffoldAcceptanceTests: TuistAcceptanceTestCase { } func test_ios_app_with_templates_custom_using_attribute() async throws { - try setUpFixture(.iosAppWithTemplates) + try await setUpFixture(.iosAppWithTemplates) try await run(InstallCommand.self) try await ScaffoldCommand.preprocess([ "scaffold", @@ -171,7 +171,7 @@ final class ScaffoldAcceptanceTests: TuistAcceptanceTestCase { } func test_ios_app_with_local_template_and_project_description_helpers_plugin() async throws { - try setUpFixture(.iosAppWithPluginsAndTemplates) + try await setUpFixture(.iosAppWithPluginsAndTemplates) try await run(InstallCommand.self) try await ScaffoldCommand.preprocess([ "scaffold", @@ -190,7 +190,7 @@ final class ScaffoldAcceptanceTests: TuistAcceptanceTestCase { } func test_ios_app_with_plugin_template_and_project_description_helpers_plugin() async throws { - try setUpFixture(.iosAppWithPluginsAndTemplates) + try await setUpFixture(.iosAppWithPluginsAndTemplates) try await run(InstallCommand.self) try await ScaffoldCommand.preprocess([ "scaffold", diff --git a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift index 958a6ec5fb3..e8e8f03e7fe 100644 --- a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift @@ -9,6 +9,7 @@ import XCTest final class ServerAcceptanceTestProjects: ServerAcceptanceTestCase { func test_list_project() async throws { + try await setUpFixture(.iosAppWithFrameworks) try await run(ProjectListCommand.self) XCTAssertStandardOutput(pattern: "Listing all your projects:") XCTAssertStandardOutput(pattern: "• \(fullHandle)") @@ -17,6 +18,7 @@ final class ServerAcceptanceTestProjects: ServerAcceptanceTestCase { final class ServerAcceptanceTestProjectTokens: ServerAcceptanceTestCase { func test_create_list_and_revoke_project_token() async throws { + try await setUpFixture(.iosAppWithFrameworks) try await run(ProjectTokensCreateCommand.self, fullHandle) TestingLogHandler.reset() try await run(ProjectTokensListCommand.self, fullHandle) @@ -35,3 +37,15 @@ final class ServerAcceptanceTestProjectTokens: ServerAcceptanceTestCase { ) } } + +extension ServerAcceptanceTestCase { + private func shareLink() throws -> String { + try XCTUnwrap( + TestingLogHandler.collected[.notice, >=] + .components(separatedBy: .newlines) + .first(where: { $0.contains("App uploaded – share") })? + .components(separatedBy: .whitespaces) + .last + ) + } +} diff --git a/Tests/TuistKitAcceptanceTests/ShareAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/ShareAcceptanceTests.swift new file mode 100644 index 00000000000..b41a0fade5c --- /dev/null +++ b/Tests/TuistKitAcceptanceTests/ShareAcceptanceTests.swift @@ -0,0 +1,89 @@ +import Foundation +import TuistAcceptanceTesting +import TuistCore +import TuistSupport +import TuistSupportTesting +import XCTest + +@testable import TuistKit +@testable import TuistServer + +final class ShareAcceptanceTests: ServerAcceptanceTestCase { + func test_share_ios_app_with_frameworks() async throws { + try await setUpFixture(.iosAppWithFrameworks) + try await run(BuildCommand.self, "App") + try await run(ShareCommand.self) + let shareLink = try previewLink() + try await run(RunCommand.self, shareLink, "-destination", "iPhone 15 Pro") + XCTAssertStandardOutput(pattern: "Installing and launching App on iPhone 15 Pro") + XCTAssertStandardOutput(pattern: "App was successfully launched 📲") + } + + func test_share_xcode_app() async throws { + try await setUpFixture(.xcodeApp) + try System.shared.runAndPrint( + [ + "/usr/bin/xcrun", + "xcodebuild", + "clean", + "build", + "-project", + fixturePath.appending(component: "App.xcodeproj").pathString, + "-scheme", + "App", + "-sdk", + "iphonesimulator", + "-derivedDataPath", + derivedDataPath.pathString, + ] + ) + try await run(ShareCommand.self, "App", "--platforms", "ios") + try await run(RunCommand.self, try previewLink(), "-destination", "iPhone 15 Plus") + XCTAssertStandardOutput(pattern: "Installing and launching App on iPhone 15 Plus") + XCTAssertStandardOutput(pattern: "App was successfully launched 📲") + } + + func test_share_xcode_app_files() async throws { + try await setUpFixture(.xcodeApp) + let buildDirectory = fixturePath.appending(component: "Build") + try System.shared.runAndPrint( + [ + "/usr/bin/xcrun", + "xcodebuild", + "clean", + "build", + "-project", + fixturePath.appending(component: "App.xcodeproj").pathString, + "-scheme", + "App", + "-sdk", + "iphonesimulator", + "-derivedDataPath", + derivedDataPath.pathString, + "CONFIGURATION_BUILD_DIR=\(buildDirectory)", + ] + ) + + // Testing sharing `.app` file directly + try await run( + ShareCommand.self, + buildDirectory.appending(component: "App.app").pathString, + "--platforms", "ios" + ) + try await run(RunCommand.self, try previewLink(), "-destination", "iPhone 15 Pro Max") + XCTAssertStandardOutput(pattern: "Installing and launching App on iPhone 15 Pro Max") + XCTAssertStandardOutput(pattern: "App was successfully launched 📲") + } +} + +extension ServerAcceptanceTestCase { + fileprivate func previewLink() throws -> String { + try XCTUnwrap( + TestingLogHandler.collected[.notice, >=] + .components(separatedBy: .newlines) + .first(where: { $0.contains("App uploaded – share") })? + .components(separatedBy: .whitespaces) + .last + ) + } +} diff --git a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift index 113fa7f4e41..e2cecf65dd0 100644 --- a/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift +++ b/Tests/TuistKitTests/CommandEnvironmentVariables/CommandEnvironmentVariableTests.swift @@ -430,7 +430,7 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertTrue(runCommandWithEnvVars.generate) XCTAssertTrue(runCommandWithEnvVars.clean) XCTAssertEqual(runCommandWithEnvVars.os, "14.5") - XCTAssertEqual(runCommandWithEnvVars.scheme, "MyScheme") + XCTAssertEqual(runCommandWithEnvVars.runnable, .scheme("MyScheme")) XCTAssertEqual(runCommandWithEnvVars.arguments, ["arg1", "arg2", "arg3"]) // Execute RunCommand with command line arguments @@ -452,7 +452,7 @@ final class CommandEnvironmentVariableTests: XCTestCase { XCTAssertEqual(runCommandWithArgs.device, "iPhone 12") XCTAssertEqual(runCommandWithArgs.os, "15.0") XCTAssertTrue(runCommandWithArgs.rosetta) - XCTAssertEqual(runCommandWithArgs.scheme, "AnotherScheme") + XCTAssertEqual(runCommandWithArgs.runnable, .scheme("AnotherScheme")) XCTAssertEqual(runCommandWithArgs.arguments, ["arg4", "arg5"]) } diff --git a/Tests/TuistKitTests/Services/GraphServiceTests.swift b/Tests/TuistKitTests/Services/GraphServiceTests.swift index 60c0d3c50f9..40eeccfbae9 100644 --- a/Tests/TuistKitTests/Services/GraphServiceTests.swift +++ b/Tests/TuistKitTests/Services/GraphServiceTests.swift @@ -24,7 +24,7 @@ final class GraphServiceTests: TuistUnitTestCase { override func setUp() { super.setUp() graphVizMapper = MockGraphToGraphVizMapper() - manifestGraphLoader = MockManifestGraphLoading() + manifestGraphLoader = .init() subject = GraphService( graphVizGenerator: graphVizMapper, diff --git a/Tests/TuistKitTests/Services/RunServiceTests.swift b/Tests/TuistKitTests/Services/RunServiceTests.swift index 104bf7cec90..4b9a0fc25cd 100644 --- a/Tests/TuistKitTests/Services/RunServiceTests.swift +++ b/Tests/TuistKitTests/Services/RunServiceTests.swift @@ -1,9 +1,12 @@ +import FileSystem import Foundation import MockableTest import Path import struct TSCUtility.Version import TuistAutomation import TuistCore +import TuistLoader +import TuistServer import TuistSupport import XcodeGraph import XCTest @@ -42,7 +45,14 @@ final class RunServiceTests: TuistUnitTestCase { private var buildGraphInspector: MockBuildGraphInspecting! private var targetBuilder: MockTargetBuilder! private var targetRunner: MockTargetRunner! + private var configLoader: MockConfigLoading! + private var downloadPreviewService: MockDownloadPreviewServicing! + private var serverURLService: MockServerURLServicing! + private var appRunner: MockAppRunning! private var subject: RunService! + private var remoteArtifactDownloader: MockRemoteArtifactDownloading! + private var appBundleLoader: MockAppBundleLoading! + private var fileArchiverFactory: MockFileArchivingFactorying! private struct TestError: Equatable, Error {} @@ -56,11 +66,25 @@ final class RunServiceTests: TuistUnitTestCase { buildGraphInspector = .init() targetBuilder = MockTargetBuilder() targetRunner = MockTargetRunner() + configLoader = .init() + downloadPreviewService = .init() + appRunner = .init() + remoteArtifactDownloader = .init() + appBundleLoader = .init() + fileArchiverFactory = .init() subject = RunService( generatorFactory: generatorFactory, buildGraphInspector: buildGraphInspector, targetBuilder: targetBuilder, - targetRunner: targetRunner + targetRunner: targetRunner, + configLoader: configLoader, + downloadPreviewService: downloadPreviewService, + fileHandler: fileHandler, + fileSystem: FileSystem(), + appRunner: appRunner, + remoteArtifactDownloader: remoteArtifactDownloader, + appBundleLoader: appBundleLoader, + fileArchiverFactory: fileArchiverFactory ) } @@ -76,6 +100,9 @@ final class RunServiceTests: TuistUnitTestCase { func test_run_generates_when_generateIsTrue() async throws { // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test()) given(generator) .generateWithGraph(path: .any) .willReturn((try AbsolutePath(validating: "/path/to/project.xcworkspace"), .test(), MapperEnvironment())) @@ -98,6 +125,9 @@ final class RunServiceTests: TuistUnitTestCase { given(generator) .generateWithGraph(path: .any) .willReturn((workspacePath, .test(), MapperEnvironment())) + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test()) given(generator) .load(path: .any) .willReturn(.test()) @@ -132,6 +162,9 @@ final class RunServiceTests: TuistUnitTestCase { given(generator) .load(path: .any) .willReturn(.test()) + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test()) targetRunner.assertCanRunTargetStub = { _ in } given(buildGraphInspector) .workspacePath(directory: .any) @@ -145,7 +178,7 @@ final class RunServiceTests: TuistUnitTestCase { // When try await subject.run( - schemeName: schemeName, + runnable: .scheme(schemeName), clean: clean, configuration: configuration ) @@ -171,6 +204,9 @@ final class RunServiceTests: TuistUnitTestCase { XCTAssertEqual(_deviceName, deviceName) XCTAssertEqual(_arguments, arguments) } + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test()) given(generator) .load(path: .any) .willReturn(.test()) @@ -187,10 +223,10 @@ final class RunServiceTests: TuistUnitTestCase { // When try await subject.run( - schemeName: schemeName, + runnable: .scheme(schemeName), configuration: configuration, device: deviceName, - version: version.description, + osVersion: version.description, arguments: arguments ) } @@ -203,6 +239,9 @@ final class RunServiceTests: TuistUnitTestCase { given(generator) .load(path: .any) .willReturn(.test()) + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test()) given(buildGraphInspector) .workspacePath(directory: .any) .willReturn(workspacePath) @@ -223,27 +262,190 @@ final class RunServiceTests: TuistUnitTestCase { ) await fulfillment(of: [expectation], timeout: 1) } + + func test_run_share_link_when_download_url_is_invalid() async throws { + // Given + given(downloadPreviewService) + .downloadPreview( + .any, + fullHandle: .any, + serverURL: .any + ) + .willReturn("https://example com/page") + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.run(runnable: .url(URL(string: "https://tuist.io/tuist/tuist/preview/some-id")!)), + RunServiceError.invalidDownloadBuildURL("https://example com/page") + ) + } + + func test_run_share_link_when_app_build_artifact_not_found() async throws { + // Given + given(downloadPreviewService) + .downloadPreview( + .any, + fullHandle: .any, + serverURL: .any + ) + .willReturn("https://example.com") + + given(remoteArtifactDownloader) + .download(url: .any) + .willReturn(nil) + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.run(runnable: .url(URL(string: "https://tuist.io/tuist/tuist/preview/some-id")!)), + RunServiceError.appNotFound("https://tuist.io/tuist/tuist/preview/some-id") + ) + } + + func test_run_share_link_when_version_is_invalid() async throws { + // When / Then + await XCTAssertThrowsSpecific( + try await subject.run( + runnable: .url(URL(string: "https://tuist.io/tuist/tuist/preview/some-id")!), + osVersion: "invalid-version" + ), + RunServiceError.invalidVersion("invalid-version") + ) + } + + func test_run_share_link_runs_app() async throws { + // Given + given(downloadPreviewService) + .downloadPreview( + .any, + fullHandle: .any, + serverURL: .any + ) + .willReturn("https://example.com") + + let downloadedArchive = try temporaryPath().appending(component: "archive") + + given(remoteArtifactDownloader) + .download(url: .any) + .willReturn(downloadedArchive) + + let fileUnarchiver = MockFileUnarchiving() + given(fileArchiverFactory) + .makeFileUnarchiver(for: .any) + .willReturn(fileUnarchiver) + + let unarchivedPath = try temporaryPath().appending(component: "unarchived") + + given(fileUnarchiver) + .unzip() + .willReturn(unarchivedPath) + + try fileHandler.touch(unarchivedPath.appending(component: "App.app")) + + given(appRunner) + .runApp( + .any, + version: .any, + device: .any + ) + .willReturn() + + let appBundle: AppBundle = .test() + given(appBundleLoader) + .load(.any) + .willReturn(appBundle) + + // When + try await subject.run(runnable: .url(URL(string: "https://tuist.io/tuist/tuist/preview/some-id")!)) + + // Then + verify(appRunner) + .runApp( + .value([appBundle]), + version: .value(nil), + device: .value(nil) + ) + .called(1) + } + + func test_run_share_link_runs_with_destination_and_version() async throws { + // Given + given(downloadPreviewService) + .downloadPreview( + .any, + fullHandle: .any, + serverURL: .any + ) + .willReturn("https://example.com") + + let downloadedArchive = try temporaryPath().appending(component: "archive") + + given(remoteArtifactDownloader) + .download(url: .any) + .willReturn(downloadedArchive) + + let fileUnarchiver = MockFileUnarchiving() + given(fileArchiverFactory) + .makeFileUnarchiver(for: .any) + .willReturn(fileUnarchiver) + + let unarchivedPath = try temporaryPath().appending(component: "unarchived") + + given(fileUnarchiver) + .unzip() + .willReturn(unarchivedPath) + + try fileHandler.touch(unarchivedPath.appending(component: "App.app")) + + given(appRunner) + .runApp( + .any, + version: .any, + device: .any + ) + .willReturn() + + let appBundle: AppBundle = .test() + given(appBundleLoader) + .load(.any) + .willReturn(appBundle) + + // When + try await subject.run( + runnable: .url(URL(string: "https://tuist.io/tuist/tuist/preview/some-id")!), + osVersion: "18.0", + arguments: ["-destination", "iPhone 15 Pro"] + ) + + // Then + verify(appRunner) + .runApp( + .value([appBundle]), + version: .value("18.0.0"), + device: .value("iPhone 15 Pro") + ) + .called(1) + } } extension RunService { fileprivate func run( - schemeName: String = Scheme.test().name, + runnable: Runnable = .scheme(Scheme.test().name), generate: Bool = false, clean: Bool = false, configuration: String? = nil, device: String? = nil, - version: String? = nil, + osVersion: String? = nil, rosetta: Bool = false, arguments: [String] = [] ) async throws { try await run( path: nil, - schemeName: schemeName, + runnable: runnable, generate: generate, clean: clean, configuration: configuration, device: device, - version: version, + osVersion: osVersion, rosetta: rosetta, arguments: arguments ) diff --git a/Tests/TuistKitTests/Services/ShareServiceTests.swift b/Tests/TuistKitTests/Services/ShareServiceTests.swift new file mode 100644 index 00000000000..2c9d5bbb037 --- /dev/null +++ b/Tests/TuistKitTests/Services/ShareServiceTests.swift @@ -0,0 +1,540 @@ +import Foundation +import MockableTest +import TuistAutomation +import TuistCore +import TuistLoader +import TuistServer +import TuistSupport +import TuistSupportTesting +import XcodeGraph + +@testable import TuistKit + +final class ShareServiceTests: TuistUnitTestCase { + private var subject: ShareService! + private var xcodeProjectBuildDirectoryLocator: MockXcodeProjectBuildDirectoryLocating! + private var buildGraphInspector: MockBuildGraphInspecting! + private var previewsUploadService: MockPreviewsUploadServicing! + private var configLoader: MockConfigLoading! + private var serverURLService: MockServerURLServicing! + private var manifestLoader: MockManifestLoading! + private var manifestGraphLoader: MockManifestGraphLoading! + private var userInputReader: MockUserInputReading! + private var defaultConfigurationFetcher: MockDefaultConfigurationFetching! + private var appBundleLoader: MockAppBundleLoading! + + override func setUp() { + super.setUp() + + xcodeProjectBuildDirectoryLocator = .init() + buildGraphInspector = .init() + previewsUploadService = .init() + configLoader = .init() + serverURLService = .init() + manifestLoader = .init() + manifestGraphLoader = .init() + userInputReader = .init() + defaultConfigurationFetcher = .init() + appBundleLoader = .init() + subject = ShareService( + fileHandler: fileHandler, + xcodeProjectBuildDirectoryLocator: xcodeProjectBuildDirectoryLocator, + buildGraphInspector: buildGraphInspector, + previewsUploadService: previewsUploadService, + configLoader: configLoader, + serverURLService: serverURLService, + manifestLoader: manifestLoader, + manifestGraphLoader: manifestGraphLoader, + userInputReader: userInputReader, + defaultConfigurationFetcher: defaultConfigurationFetcher, + appBundleLoader: appBundleLoader + ) + + given(serverURLService) + .url(configServerURL: .any) + .willReturn(Constants.URLs.production) + + Matcher.register([GraphTarget].self) + } + + override func tearDown() { + xcodeProjectBuildDirectoryLocator = nil + buildGraphInspector = nil + previewsUploadService = nil + configLoader = nil + serverURLService = nil + manifestLoader = nil + manifestGraphLoader = nil + userInputReader = nil + defaultConfigurationFetcher = nil + subject = nil + + Matcher.reset() + + super.tearDown() + } + + func test_share_tuist_project_when_multiple_apps_specified() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test(fullHandle: "tuist/tuist")) + + given(manifestLoader) + .hasRootManifest(at: .any) + .willReturn(true) + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.run( + path: nil, + apps: ["AppOne", "AppTwo"], + configuration: nil, + platforms: [], + derivedDataPath: nil + ), + ShareServiceError.multipleAppsSpecified(["AppOne", "AppTwo"]) + ) + } + + func test_share_tuist_project() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test(fullHandle: "tuist/tuist")) + + given(manifestLoader) + .hasRootManifest(at: .any) + .willReturn(true) + + let projectPath = try temporaryPath() + let appTarget: Target = .test( + name: "App", + destinations: [.appleVision, .iPhone] + ) + let appTargetTwo: Target = .test(name: "AppTwo") + let project: Project = .test( + targets: [ + appTarget, + appTargetTwo, + ] + ) + let graphAppTarget = GraphTarget(path: projectPath, target: appTarget, project: project) + let graphAppTargetTwo = GraphTarget(path: projectPath, target: appTargetTwo, project: project) + + given(manifestGraphLoader) + .load(path: .any) + .willReturn( + ( + .test( + projects: [ + projectPath: project, + ] + ), + [], + MapperEnvironment(), + [] + ) + ) + + given(userInputReader) + .readValue( + asking: .any, + values: .value([ + graphAppTarget, + graphAppTargetTwo, + ]), + valueDescription: .any + ) + .willReturn(graphAppTarget) + + given(defaultConfigurationFetcher) + .fetch(configuration: .any, config: .any, graph: .any) + .willReturn("Debug") + + let iosPath = try temporaryPath() + given(xcodeProjectBuildDirectoryLocator) + .locate( + platform: .value(.iOS), + projectPath: .any, + derivedDataPath: .any, + configuration: .any + ) + .willReturn(iosPath) + try fileHandler.touch(iosPath.appending(component: "App.app")) + + let visionOSPath = try temporaryPath() + given(xcodeProjectBuildDirectoryLocator) + .locate( + platform: .value(.visionOS), + projectPath: .any, + derivedDataPath: .any, + configuration: .any + ) + .willReturn(visionOSPath) + try fileHandler.touch(visionOSPath.appending(component: "App.app")) + + let shareURL: URL = .test() + given(previewsUploadService) + .uploadPreviews( + .any, + fullHandle: .any, + serverURL: .any + ) + .willReturn(shareURL) + + // When + try await subject.run( + path: nil, + apps: [], + configuration: nil, + platforms: [], + derivedDataPath: nil + ) + + // Then + verify(previewsUploadService) + .uploadPreviews( + .any, + fullHandle: .value("tuist/tuist"), + serverURL: .value(Constants.URLs.production) + ) + .called(1) + + XCTAssertStandardOutput( + pattern: "App uploaded – share it with others using the following link: \(shareURL.absoluteString)" + ) + } + + func test_share_tuist_project_with_a_specified_app() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test(fullHandle: "tuist/tuist")) + + given(manifestLoader) + .hasRootManifest(at: .any) + .willReturn(true) + + let projectPath = try temporaryPath() + let appTarget: Target = .test( + name: "App", + destinations: [.appleVision, .iPhone] + ) + let appTargetTwo: Target = .test(name: "AppTwo") + let project: Project = .test( + targets: [ + appTarget, + appTargetTwo, + ] + ) + let graphAppTargetTwo = GraphTarget(path: projectPath, target: appTargetTwo, project: project) + + given(manifestGraphLoader) + .load(path: .any) + .willReturn( + ( + .test( + projects: [ + projectPath: project, + ] + ), + [], + MapperEnvironment(), + [] + ) + ) + + given(userInputReader) + .readValue( + asking: .any, + values: .value([ + graphAppTargetTwo, + ]), + valueDescription: .any + ) + .willReturn(graphAppTargetTwo) + + given(defaultConfigurationFetcher) + .fetch(configuration: .any, config: .any, graph: .any) + .willReturn("Debug") + + let iosPath = try temporaryPath() + given(xcodeProjectBuildDirectoryLocator) + .locate( + platform: .value(.iOS), + projectPath: .any, + derivedDataPath: .any, + configuration: .any + ) + .willReturn(iosPath) + try fileHandler.touch(iosPath.appending(component: "AppTwo.app")) + + let shareURL: URL = .test() + given(previewsUploadService) + .uploadPreviews( + .any, + fullHandle: .any, + serverURL: .any + ) + .willReturn(shareURL) + + // When + try await subject.run( + path: nil, + apps: ["AppTwo"], + configuration: nil, + platforms: [], + derivedDataPath: nil + ) + + // Then + verify(previewsUploadService) + .uploadPreviews( + .any, + fullHandle: .value("tuist/tuist"), + serverURL: .value(Constants.URLs.production) + ) + .called(1) + + XCTAssertStandardOutput( + pattern: "AppTwo uploaded – share it with others using the following link: \(shareURL.absoluteString)" + ) + } + + func test_share_xcode_app_when_no_app_specified() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test(fullHandle: "tuist/tuist")) + + given(manifestLoader) + .hasRootManifest(at: .any) + .willReturn(false) + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.run( + path: nil, + apps: [], + configuration: nil, + platforms: [], + derivedDataPath: nil + ), + ShareServiceError.appNotSpecified + ) + } + + func test_share_xcode_app_when_multiple_apps_specified() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test(fullHandle: "tuist/tuist")) + + given(manifestLoader) + .hasRootManifest(at: .any) + .willReturn(false) + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.run( + path: nil, + apps: ["AppOne", "AppTwo"], + configuration: nil, + platforms: [], + derivedDataPath: nil + ), + ShareServiceError.multipleAppsSpecified(["AppOne", "AppTwo"]) + ) + } + + func test_share_xcode_app_when_no_platforms_specified() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test(fullHandle: "tuist/tuist")) + + given(manifestLoader) + .hasRootManifest(at: .any) + .willReturn(false) + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.run( + path: nil, + apps: ["App"], + configuration: nil, + platforms: [], + derivedDataPath: nil + ), + ShareServiceError.platformsNotSpecified + ) + } + + func test_share_xcode_app_when_no_project_or_workspace_not_found() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test(fullHandle: "tuist/tuist")) + + given(manifestLoader) + .hasRootManifest(at: .any) + .willReturn(false) + + let path = try temporaryPath() + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.run( + path: path.pathString, + apps: ["App"], + configuration: nil, + platforms: [.iOS], + derivedDataPath: nil + ), + ShareServiceError.projectOrWorkspaceNotFound(path: path.pathString) + ) + } + + func test_share_xcode_app() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test(fullHandle: "tuist/tuist")) + + given(manifestLoader) + .hasRootManifest(at: .any) + .willReturn(false) + + let path = try temporaryPath() + let xcodeprojPath = try temporaryPath().appending(component: "App.xcodeproj") + try fileHandler.touch(xcodeprojPath) + + let iosPath = try temporaryPath() + given(xcodeProjectBuildDirectoryLocator) + .locate( + platform: .value(.iOS), + projectPath: .any, + derivedDataPath: .any, + configuration: .any + ) + .willReturn(iosPath) + try fileHandler.touch(iosPath.appending(component: "App.app")) + + let shareURL: URL = .test() + given(previewsUploadService) + .uploadPreviews( + .any, + fullHandle: .any, + serverURL: .any + ) + .willReturn(shareURL) + + // When + try await subject.run( + path: path.pathString, + apps: ["App"], + configuration: nil, + platforms: [.iOS], + derivedDataPath: nil + ) + + // Then + verify(previewsUploadService) + .uploadPreviews( + .any, + fullHandle: .value("tuist/tuist"), + serverURL: .value(Constants.URLs.production) + ) + .called(1) + + XCTAssertStandardOutput( + pattern: "App uploaded – share it with others using the following link: \(shareURL.absoluteString)" + ) + } + + func test_share_different_apps() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test(fullHandle: "tuist/tuist")) + + let appOne = try temporaryPath().appending(component: "AppOne.app") + let appTwo = try temporaryPath().appending(component: "AppTwo.app") + + given(appBundleLoader) + .load(.value(appOne)) + .willReturn(.test(infoPlist: .test(name: "AppOne"))) + + given(appBundleLoader) + .load(.value(appTwo)) + .willReturn(.test(infoPlist: .test(name: "AppTwo"))) + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.run( + path: nil, + apps: [ + appOne.pathString, + appTwo.pathString, + ], + configuration: nil, + platforms: [], + derivedDataPath: nil + ), + ShareServiceError.multipleAppsSpecified(["AppOne", "AppTwo"]) + ) + } + + func test_share_apps() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test(fullHandle: "tuist/tuist")) + + let iosApp = try temporaryPath().appending(components: "iOS", "App.app") + let visionOSApp = try temporaryPath().appending(components: "visionOs", "App.app") + + given(appBundleLoader) + .load(.value(iosApp)) + .willReturn(.test(infoPlist: .test(name: "App"))) + + given(appBundleLoader) + .load(.value(visionOSApp)) + .willReturn(.test(infoPlist: .test(name: "App"))) + + let shareURL: URL = .test() + given(previewsUploadService) + .uploadPreviews( + .any, + fullHandle: .any, + serverURL: .any + ) + .willReturn(shareURL) + + // When + try await subject.run( + path: nil, + apps: [ + iosApp.pathString, + visionOSApp.pathString, + ], + configuration: nil, + platforms: [], + derivedDataPath: nil + ) + + // Then + verify(previewsUploadService) + .uploadPreviews( + .value([iosApp, visionOSApp]), + fullHandle: .value("tuist/tuist"), + serverURL: .value(Constants.URLs.production) + ) + .called(1) + + XCTAssertStandardOutput( + pattern: "App uploaded – share it with others using the following link: \(shareURL.absoluteString)" + ) + } +} diff --git a/Tests/TuistKitTests/Services/TestServiceTests.swift b/Tests/TuistKitTests/Services/TestServiceTests.swift index 4cabf6f17e5..2f80cf1823c 100644 --- a/Tests/TuistKitTests/Services/TestServiceTests.swift +++ b/Tests/TuistKitTests/Services/TestServiceTests.swift @@ -20,7 +20,7 @@ final class TestServiceTests: TuistUnitTestCase { private var generatorFactory: MockGeneratorFactorying! private var xcodebuildController: MockXcodeBuildControlling! private var buildGraphInspector: MockBuildGraphInspecting! - private var simulatorController: MockSimulatorController! + private var simulatorController: MockSimulatorControlling! private var contentHasher: MockContentHashing! private var testsCacheTemporaryDirectory: TemporaryDirectory! private var cacheDirectoriesProvider: MockCacheDirectoriesProviding! @@ -80,6 +80,15 @@ final class TestServiceTests: TuistUnitTestCase { cacheDirectoryProviderFactory: cacheDirectoryProviderFactory, configLoader: configLoader ) + + given(simulatorController) + .findAvailableDevice( + platform: .any, + version: .any, + minVersion: .any, + deviceName: .any + ) + .willReturn(.test()) } override func tearDown() { @@ -1434,7 +1443,6 @@ final class TestServiceTests: TuistUnitTestCase { .testableTarget(scheme: .any, testPlan: .any, testTargets: .any, skipTestTargets: .any, graphTraverser: .any) .willReturn(.test()) - var passedRetryCount = -1 given(xcodebuildController) .test( .any, @@ -1451,9 +1459,7 @@ final class TestServiceTests: TuistUnitTestCase { testPlanConfiguration: .any, passthroughXcodeBuildArguments: .any ) - .willProduce { _, _, _, _, _, _, _, _, retryCount, _, _, _, _ in - passedRetryCount = retryCount - } + .willReturn() // When try await subject.testRun( @@ -1462,7 +1468,23 @@ final class TestServiceTests: TuistUnitTestCase { ) // Then - XCTAssertEqual(passedRetryCount, 0) + verify(xcodebuildController) + .test( + .any, + scheme: .any, + clean: .any, + destination: .any, + rosetta: .any, + derivedDataPath: .any, + resultBundlePath: .any, + arguments: .any, + retryCount: .value(0), + testTargets: .any, + skipTestTargets: .any, + testPlanConfiguration: .any, + passthroughXcodeBuildArguments: .any + ) + .called(1) } func test_run_test_plan_success() async throws { diff --git a/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift b/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift index 49c95c40a65..14041970c93 100644 --- a/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift +++ b/Tests/TuistLoaderIntegrationTests/Loaders/ManifestLoaderTests.swift @@ -353,4 +353,89 @@ final class ManifestLoaderTests: TuistTestCase { ) ) } + + func test_validate_projectExists() throws { + // Given + let path = try temporaryPath().appending(component: "App") + try fileHandler.touch( + path.appending(component: "Project.swift") + ) + + // When / Then + try subject.validateHasRootManifest(at: path) + } + + func test_validate_workspaceExists() throws { + // Given + let path = try temporaryPath().appending(component: "App") + try fileHandler.touch( + path.appending(component: "Workspace.swift") + ) + + // When / Then + try subject.validateHasRootManifest(at: path) + } + + func test_validate_packageExists() throws { + // Given + let path = try temporaryPath().appending(component: "App") + try fileHandler.touch( + path.appending(component: "Package.swift") + ) + + // When / Then + try subject.validateHasRootManifest(at: path) + } + + func test_validate_manifestDoesNotExist() throws { + // Given + let path = try temporaryPath().appending(component: "App") + + // When / Then + XCTAssertThrowsSpecific( + try subject.validateHasRootManifest(at: path), + ManifestLoaderError.manifestNotFound(path) + ) + } + + func test_hasRootManifest_projectExists() throws { + // Given + let path = try temporaryPath().appending(component: "App") + try fileHandler.touch( + path.appending(component: "Project.swift") + ) + + // When / Then + XCTAssertTrue(subject.hasRootManifest(at: path)) + } + + func test_hasRootManifest_workspaceExists() throws { + // Given + let path = try temporaryPath().appending(component: "App") + try fileHandler.touch( + path.appending(component: "Workspace.swift") + ) + + // When / Then + XCTAssertTrue(subject.hasRootManifest(at: path)) + } + + func test_hasRootManifest_packageExists() throws { + // Given + let path = try temporaryPath().appending(component: "App") + try fileHandler.touch( + path.appending(component: "Package.swift") + ) + + // When / Then + XCTAssertTrue(subject.hasRootManifest(at: path)) + } + + func test_hasRootManifest_manifestDoesNotExist() throws { + // Given + let path = try temporaryPath().appending(component: "App") + + // When / Then + XCTAssertFalse(subject.hasRootManifest(at: path)) + } } diff --git a/Tests/TuistServerTests/Services/PreviewsUploadServiceTests.swift b/Tests/TuistServerTests/Services/PreviewsUploadServiceTests.swift new file mode 100644 index 00000000000..891137131a2 --- /dev/null +++ b/Tests/TuistServerTests/Services/PreviewsUploadServiceTests.swift @@ -0,0 +1,106 @@ +import Foundation +import MockableTest +import TuistSupport +import TuistSupportTesting +import XcodeGraph +import XCTest + +@testable import TuistServer + +final class PreviewsUploadServiceTests: TuistTestCase { + private var subject: PreviewsUploadService! + + private var fileArchiverFactory: MockFileArchivingFactorying! + private var multipartUploadStartPreviewsService: MockMultipartUploadStartPreviewsServicing! + private var multipartUploadGenerateURLPreviewsService: MockMultipartUploadGenerateURLPreviewsServicing! + private var multipartUploadArtifactService: MockMultipartUploadArtifactServicing! + private var multipartUploadCompletePreviewsService: MockMultipartUploadCompletePreviewsServicing! + + override func setUp() { + super.setUp() + + fileArchiverFactory = .init() + multipartUploadStartPreviewsService = .init() + multipartUploadGenerateURLPreviewsService = .init() + multipartUploadArtifactService = .init() + multipartUploadCompletePreviewsService = .init() + + subject = PreviewsUploadService( + fileHandler: fileHandler, + fileArchiver: fileArchiverFactory, + retryProvider: RetryProvider(), + multipartUploadStartPreviewsService: multipartUploadStartPreviewsService, + multipartUploadGenerateURLPreviewsService: multipartUploadGenerateURLPreviewsService, + multipartUploadArtifactService: multipartUploadArtifactService, + multipartUploadCompletePreviewsService: multipartUploadCompletePreviewsService + ) + } + + override func tearDown() { + fileArchiverFactory = nil + multipartUploadStartPreviewsService = nil + multipartUploadGenerateURLPreviewsService = nil + multipartUploadArtifactService = nil + multipartUploadCompletePreviewsService = nil + + super.tearDown() + } + + func test_upload_app_builds() async throws { + // Given + let preview = try temporaryPath().appending(component: "App.app") + try FileHandler.shared.touch(preview) + + let serverURL: URL = .test() + + let fileArchiver = MockFileArchiving() + given(fileArchiverFactory) + .makeFileArchiver(for: .value([preview])) + .willReturn(fileArchiver) + + let artifactArchivePath = preview.parentDirectory.appending(component: "previews.zip") + + given(fileArchiver) + .zip(name: .value("previews.zip")) + .willReturn(artifactArchivePath) + + given(multipartUploadStartPreviewsService) + .startPreviewsMultipartUpload( + fullHandle: .value("tuist/tuist"), + serverURL: .value(serverURL) + ) + .willReturn( + PreviewUpload(previewId: "preview-id", uploadId: "upload-id") + ) + + given(multipartUploadArtifactService) + .multipartUploadArtifact( + artifactPath: .value(artifactArchivePath), + generateUploadURL: .any + ) + .willReturn([(etag: "etag", partNumber: 1)]) + + let shareURL = URL.test() + given(multipartUploadCompletePreviewsService) + .completePreviewUpload( + .value("preview-id"), + uploadId: .value("upload-id"), + parts: .matching { parts in + parts.map(\.etag) == ["etag"] && parts.map(\.partNumber) == [1] + }, + fullHandle: .value("tuist/tuist"), + serverURL: .value(serverURL) + ) + .willReturn(shareURL) + + // When + let got = try await subject.uploadPreviews( + [preview], + fullHandle: "tuist/tuist", + serverURL: serverURL + ) + + // Then + XCTAssertEqual(got, shareURL) + } +} diff --git a/Tests/TuistSupportTests/Utils/UserInputReaderTests.swift b/Tests/TuistSupportTests/Utils/UserInputReaderTests.swift index df16e1d4946..673e579cd02 100644 --- a/Tests/TuistSupportTests/Utils/UserInputReaderTests.swift +++ b/Tests/TuistSupportTests/Utils/UserInputReaderTests.swift @@ -1,7 +1,8 @@ +import TuistSupportTesting import XCTest @testable import TuistSupport -class UserInputReaderTests: XCTestCase { +class UserInputReaderTests: TuistUnitTestCase { func test_read_int_valid_input() { // Given var fakeReadLine = StringReader(input: "0") @@ -42,6 +43,75 @@ class UserInputReaderTests: XCTestCase { // Then XCTAssertEqual(result, "string-value") } + + struct Value: Equatable { + let name: String + } + + func test_read_value_when_only_value_provided() throws { + // Given + let reader: UserInputReader = .init { _ in + XCTFail("Value should be returned without reading a line") + return "string-value" + } + let value = Value(name: "value-one") + + // When + let got = try reader.readValue( + asking: "Choose value:", + values: [value], + valueDescription: \.name + ) + + // Then + XCTAssertEqual(got, value) + } + + func test_read_value_when_no_values_provided() throws { + // Given + let reader: UserInputReader = .init { _ in + XCTFail("Value should be returned without reading a line") + return "string-value" + } + let value = Value(name: "value-one") + + // When / Then + XCTAssertThrowsSpecific( + try reader.readValue( + asking: "Choose value:", + values: [Value](), + valueDescription: \.name + ), + UserInputReaderError.noValuesProvided("Choose value:") + ) + } + + func test_read_value_when_multiple_values_provided() throws { + // Given + var fakeReadLine = StringReader(input: "1") + let reader: UserInputReader = .init { _ in + fakeReadLine.readLine() + } + let valueOne = Value(name: "value-one") + let valueTwo = Value(name: "value-two") + + // When + let got = try reader.readValue( + asking: "Choose value:", + values: [valueOne, valueTwo], + valueDescription: \.name + ) + + // Then + XCTAssertEqual(got, valueTwo) + XCTAssertStandardOutput( + pattern: """ + Choose value: + \t0: value-one + \t1: value-two + """ + ) + } } // Custom string reader to simulate user input diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index f69fa46a5c6..d2a46c15b5f 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -138,7 +138,7 @@ public enum Module: String, CaseIterable { public var unitTestsTargetName: String? { switch self { - case .automation, .analytics, .tuist, .tuistBenchmark, .tuistFixtureGenerator, .projectAutomation, .projectDescription, + case .analytics, .tuist, .tuistBenchmark, .tuistFixtureGenerator, .projectAutomation, .projectDescription, .acceptanceTesting: return nil default: diff --git a/fixtures/ios_app_with_frameworks/App/App.entitlements b/fixtures/ios_app_with_frameworks/App/App.entitlements new file mode 100644 index 00000000000..ee95ab7e582 --- /dev/null +++ b/fixtures/ios_app_with_frameworks/App/App.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.network.client + + + diff --git a/fixtures/multiplatform_app_with_extension/Tuist/Config.swift b/fixtures/multiplatform_app_with_extension/Tuist/Config.swift index ff8e64fa9ee..f00d6c2e8de 100644 --- a/fixtures/multiplatform_app_with_extension/Tuist/Config.swift +++ b/fixtures/multiplatform_app_with_extension/Tuist/Config.swift @@ -1,3 +1,9 @@ import ProjectDescription -let config = Config() +let config = Config( + fullHandle: "tuist/multiplatform_app_with_extension", + url: "https://canary.tuist.io", + generationOptions: .options( + optionalAuthentication: true + ) +) diff --git a/fixtures/xcode_app/.gitignore b/fixtures/xcode_app/.gitignore new file mode 100644 index 00000000000..314a1182e38 --- /dev/null +++ b/fixtures/xcode_app/.gitignore @@ -0,0 +1 @@ +!App.xcodeproj \ No newline at end of file diff --git a/fixtures/xcode_app/App.xcodeproj/project.pbxproj b/fixtures/xcode_app/App.xcodeproj/project.pbxproj new file mode 100644 index 00000000000..a413f71cb7a --- /dev/null +++ b/fixtures/xcode_app/App.xcodeproj/project.pbxproj @@ -0,0 +1,368 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + F8DE78AF2C4E957C0023B168 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8DE78AE2C4E957C0023B168 /* App.swift */; }; + F8DE78B12C4E957C0023B168 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8DE78B02C4E957C0023B168 /* ContentView.swift */; }; + F8DE78B32C4E957D0023B168 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F8DE78B22C4E957D0023B168 /* Assets.xcassets */; }; + F8DE78B72C4E957D0023B168 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F8DE78B62C4E957D0023B168 /* Preview Assets.xcassets */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + F8DE78AB2C4E957C0023B168 /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; }; + F8DE78AE2C4E957C0023B168 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; + F8DE78B02C4E957C0023B168 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + F8DE78B22C4E957D0023B168 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + F8DE78B42C4E957D0023B168 /* App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = App.entitlements; sourceTree = ""; }; + F8DE78B62C4E957D0023B168 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + F8DE78A82C4E957C0023B168 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + F8DE78A22C4E957C0023B168 = { + isa = PBXGroup; + children = ( + F8DE78AD2C4E957C0023B168 /* App */, + F8DE78AC2C4E957C0023B168 /* Products */, + ); + sourceTree = ""; + }; + F8DE78AC2C4E957C0023B168 /* Products */ = { + isa = PBXGroup; + children = ( + F8DE78AB2C4E957C0023B168 /* App.app */, + ); + name = Products; + sourceTree = ""; + }; + F8DE78AD2C4E957C0023B168 /* App */ = { + isa = PBXGroup; + children = ( + F8DE78AE2C4E957C0023B168 /* App.swift */, + F8DE78B02C4E957C0023B168 /* ContentView.swift */, + F8DE78B22C4E957D0023B168 /* Assets.xcassets */, + F8DE78B42C4E957D0023B168 /* App.entitlements */, + F8DE78B52C4E957D0023B168 /* Preview Content */, + ); + path = App; + sourceTree = ""; + }; + F8DE78B52C4E957D0023B168 /* Preview Content */ = { + isa = PBXGroup; + children = ( + F8DE78B62C4E957D0023B168 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + F8DE78AA2C4E957C0023B168 /* App */ = { + isa = PBXNativeTarget; + buildConfigurationList = F8DE78BA2C4E957D0023B168 /* Build configuration list for PBXNativeTarget "App" */; + buildPhases = ( + F8DE78A72C4E957C0023B168 /* Sources */, + F8DE78A82C4E957C0023B168 /* Frameworks */, + F8DE78A92C4E957C0023B168 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = App; + productName = App; + productReference = F8DE78AB2C4E957C0023B168 /* App.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + F8DE78A32C4E957C0023B168 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1530; + LastUpgradeCheck = 1530; + TargetAttributes = { + F8DE78AA2C4E957C0023B168 = { + CreatedOnToolsVersion = 15.3; + }; + }; + }; + buildConfigurationList = F8DE78A62C4E957C0023B168 /* Build configuration list for PBXProject "App" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = F8DE78A22C4E957C0023B168; + productRefGroup = F8DE78AC2C4E957C0023B168 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + F8DE78AA2C4E957C0023B168 /* App */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + F8DE78A92C4E957C0023B168 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F8DE78B72C4E957D0023B168 /* Preview Assets.xcassets in Resources */, + F8DE78B32C4E957D0023B168 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + F8DE78A72C4E957C0023B168 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F8DE78B12C4E957C0023B168 /* ContentView.swift in Sources */, + F8DE78AF2C4E957C0023B168 /* App.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + F8DE78B82C4E957D0023B168 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + 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; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + 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; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + F8DE78B92C4E957D0023B168 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + 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-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + 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; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = Release; + }; + F8DE78BB2C4E957D0023B168 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = App/App.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"App/Preview Content\""; + DEVELOPMENT_TEAM = ""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 17.4; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.4; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = tuist.io.App; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + F8DE78BC2C4E957D0023B168 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = App/App.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"App/Preview Content\""; + DEVELOPMENT_TEAM = ""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 17.4; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.4; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = tuist.io.App; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + F8DE78A62C4E957C0023B168 /* Build configuration list for PBXProject "App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F8DE78B82C4E957D0023B168 /* Debug */, + F8DE78B92C4E957D0023B168 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F8DE78BA2C4E957D0023B168 /* Build configuration list for PBXNativeTarget "App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F8DE78BB2C4E957D0023B168 /* Debug */, + F8DE78BC2C4E957D0023B168 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = F8DE78A32C4E957C0023B168 /* Project object */; +} diff --git a/fixtures/xcode_app/App/App.entitlements b/fixtures/xcode_app/App/App.entitlements new file mode 100644 index 00000000000..f2ef3ae0265 --- /dev/null +++ b/fixtures/xcode_app/App/App.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + + + diff --git a/fixtures/xcode_app/App/App.swift b/fixtures/xcode_app/App/App.swift new file mode 100644 index 00000000000..7cb2ea61064 --- /dev/null +++ b/fixtures/xcode_app/App/App.swift @@ -0,0 +1,10 @@ +import SwiftUI + +@main +struct MyApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/fixtures/xcode_app/App/Assets.xcassets/AccentColor.colorset/Contents.json b/fixtures/xcode_app/App/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000000..eb878970081 --- /dev/null +++ b/fixtures/xcode_app/App/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/xcode_app/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/fixtures/xcode_app/App/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..532cd729c61 --- /dev/null +++ b/fixtures/xcode_app/App/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,63 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/xcode_app/App/Assets.xcassets/Contents.json b/fixtures/xcode_app/App/Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/xcode_app/App/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/xcode_app/App/ContentView.swift b/fixtures/xcode_app/App/ContentView.swift new file mode 100644 index 00000000000..b000a7e4618 --- /dev/null +++ b/fixtures/xcode_app/App/ContentView.swift @@ -0,0 +1,17 @@ +import SwiftUI + +struct ContentView: View { + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } +} + +#Preview { + ContentView() +} diff --git a/fixtures/xcode_app/App/Preview Content/Preview Assets.xcassets/Contents.json b/fixtures/xcode_app/App/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/fixtures/xcode_app/App/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/fixtures/xcode_app/README.md b/fixtures/xcode_app/README.md new file mode 100644 index 00000000000..11847e3cfc5 --- /dev/null +++ b/fixtures/xcode_app/README.md @@ -0,0 +1,3 @@ +# Xcode app + +A simple app created with Xcode. This fixture is _not_ using Tuist projects and it is meant to test features that don't require Tuist projects, such as `tuist share`. \ No newline at end of file diff --git a/fixtures/xcode_app/Tuist/Config.swift b/fixtures/xcode_app/Tuist/Config.swift new file mode 100644 index 00000000000..2080f0c8189 --- /dev/null +++ b/fixtures/xcode_app/Tuist/Config.swift @@ -0,0 +1,9 @@ +import ProjectDescription + +let config = Config( + fullHandle: "tuist/xcode_app", + url: "https://canary.tuist.io", + generationOptions: .options( + optionalAuthentication: true + ) +) From 367a3e8ef9045e88f59f08e9db6dd0cd098fdd6c Mon Sep 17 00:00:00 2001 From: Nick Zemlin <66729307+NickZemlin@users.noreply.github.com> Date: Fri, 2 Aug 2024 14:15:38 +0300 Subject: [PATCH 476/509] added yandex travel logo (#6595) --- README.md | 5 +++++ assets/companies/yandexTravel.svg | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 assets/companies/yandexTravel.svg diff --git a/README.md b/README.md index efee168cf8b..46690bd5c2f 100644 --- a/README.md +++ b/README.md @@ -295,6 +295,11 @@ The financial sustainability of the project is possible thanks to the ongoing co izi_logo + + + yandexTravel_logo + + diff --git a/assets/companies/yandexTravel.svg b/assets/companies/yandexTravel.svg new file mode 100644 index 00000000000..c55f5961c3b --- /dev/null +++ b/assets/companies/yandexTravel.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + From 31bd079497bf6b6447f12abc813ee66353d6c303 Mon Sep 17 00:00:00 2001 From: Alvar Hansen <72379847+alvar-bolt@users.noreply.github.com> Date: Fri, 2 Aug 2024 15:20:12 +0300 Subject: [PATCH 477/509] Fix installation link (#6596) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 46690bd5c2f..7a17703f316 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ It's open source and written in Swift. The recommended installation method is to [install mise](https://mise.jdx.dev/getting-started.html#quickstart) and then run `mise install tuist` to install Tuist. -You can check out [the documentation](https://docs.tuist.io/documentation/tuist/installation) to learn more about the rationale behind our installation approach and alternative approaches. +You can check out [the documentation](https://docs.tuist.io/guides/quick-start/install-tuist) to learn more about the rationale behind our installation approach and alternative approaches. ## 🌀 Bootstrap your first project From 72da4eaa47f2fe38ebeb65a9961410d500ce94d3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 2 Aug 2024 14:20:27 +0200 Subject: [PATCH 478/509] add alvar-bolt as a contributor for doc (#6597) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7819c736580..6ae779635ec 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1474,6 +1474,15 @@ "contributions": [ "code" ] + }, + { + "login": "alvar-bolt", + "name": "Alvar Hansen", + "avatar_url": "https://avatars.githubusercontent.com/u/72379847?v=4", + "profile": "https://github.com/alvar-bolt", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 7a17703f316..ae2058b5fcf 100644 --- a/README.md +++ b/README.md @@ -577,6 +577,7 @@ Thanks goes to these wonderful people:
    kyounh12
    +
    Alvar Hansen
    From a0ad1dc802a3db6090d23d97c02defe3e24a5206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 5 Aug 2024 09:21:40 +0200 Subject: [PATCH 479/509] Retry token refresh (#6594) --- .../Client/ServerClientAuthenticationMiddleware.swift | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Sources/TuistServer/Client/ServerClientAuthenticationMiddleware.swift b/Sources/TuistServer/Client/ServerClientAuthenticationMiddleware.swift index a324ff7df19..7954b62d3c3 100644 --- a/Sources/TuistServer/Client/ServerClientAuthenticationMiddleware.swift +++ b/Sources/TuistServer/Client/ServerClientAuthenticationMiddleware.swift @@ -74,10 +74,13 @@ struct ServerClientAuthenticationMiddleware: ClientMiddleware { if isExpired { do { - let newTokens = try await refreshAuthTokenService.refreshTokens( - serverURL: baseURL, - refreshToken: refreshToken.token - ) + let newTokens = try await RetryProvider() + .runWithRetries { + return try await refreshAuthTokenService.refreshTokens( + serverURL: baseURL, + refreshToken: refreshToken.token + ) + } try serverCredentialsStore .store( credentials: ServerCredentials( From 78d9a778dfafef07c8d7bbc2aa80cdf61883d663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 5 Aug 2024 09:22:36 +0200 Subject: [PATCH 480/509] Fix unstable hashing for target dependencies (#6593) --- .../DependenciesContentHasher.swift | 2 +- .../DependenciesContentHasherTests.swift | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Sources/TuistHasher/DependenciesContentHasher.swift b/Sources/TuistHasher/DependenciesContentHasher.swift index b3ad4c617a8..15adcc1d5c1 100644 --- a/Sources/TuistHasher/DependenciesContentHasher.swift +++ b/Sources/TuistHasher/DependenciesContentHasher.swift @@ -62,7 +62,7 @@ public final class DependenciesContentHasher: DependenciesContentHashing { ) throws -> String { let hashes = try graphTarget.target.dependencies .map { try hash(graphTarget: graphTarget, dependency: $0, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths) } - return hashes.compactMap { $0 }.joined() + return hashes.sorted().compactMap { $0 }.joined() } // MARK: - Private diff --git a/Tests/TuistHasherTests/DependenciesContentHasherTests.swift b/Tests/TuistHasherTests/DependenciesContentHasherTests.swift index c06ed05b9df..33a42e15bcc 100644 --- a/Tests/TuistHasherTests/DependenciesContentHasherTests.swift +++ b/Tests/TuistHasherTests/DependenciesContentHasherTests.swift @@ -286,4 +286,29 @@ final class DependenciesContentHasherTests: TuistUnitTestCase { .hash(Parameter.any) .called(1) } + + func test_hash_sorts_dependency_hashes() throws { + // Given + let dependencyFoo = TargetDependency.target(name: "foo") + let dependencyBar = TargetDependency.target(name: "bar") + + // When + let graphTarget = GraphTarget.test(target: Target.test(dependencies: [dependencyFoo, dependencyBar])) + hashedTargets[ + GraphHashedTarget( + projectPath: graphTarget.path, + targetName: "foo" + ) + ] = "target-foo-hash" + hashedTargets[ + GraphHashedTarget( + projectPath: graphTarget.path, + targetName: "bar" + ) + ] = "target-bar-hash" + let hash = try subject.hash(graphTarget: graphTarget, hashedTargets: &hashedTargets, hashedPaths: &hashedPaths) + + // Then + XCTAssertEqual(hash, "target-bar-hashtarget-foo-hash") + } } From 4c16b9a712539bb2163c42facd141b9944063961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Mon, 5 Aug 2024 09:28:31 +0200 Subject: [PATCH 481/509] Fix generate performance when using Tuist Cache xcframeworks (#6592) * Fix generate performance when cached artifacts available * Cache result for linked nodes * Trigger build * Add scenario with xcframework dependencies --- .../Linter/StaticProductsGraphLinter.swift | 4 ++ .../StaticProductsGraphLinterTests.swift | 55 +++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift b/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift index be930cd5733..572d7c15f4f 100644 --- a/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift +++ b/Sources/TuistGenerator/Linter/StaticProductsGraphLinter.swift @@ -91,6 +91,10 @@ class StaticProductsGraphLinter: StaticProductsGraphLinting { let dependencyTarget = graphTraverser.target(path: targetPath, name: targetName), dependencyTarget.target.canLinkStaticProducts() else { + cache.cache( + results: results, + for: dependency + ) return results } diff --git a/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift index c940f38a334..e4f911ef4cd 100644 --- a/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/StaticProductsGraphLinterTests.swift @@ -202,6 +202,61 @@ class StaticProductsGraphLinterTests: XCTestCase { ]) } + /// Dependencies between XCFrameworks are preserved when replacing target nodes with binaries for Tuist Cache. + /// See this PR for more details: https://github.com/tuist/tuist/pull/6592 + func test_lint_whenStaticProductLinkedTwice_transitiveStaticXCFrameworks() throws { + // Given + let path: AbsolutePath = "/project" + let app = Target.test(name: "App") + let staticXCFrameworkA = GraphDependency.testXCFramework( + path: path.appending(component: "StaticXCFrameworkA"), + linking: .static + ) + let staticXCFrameworkB = GraphDependency.testXCFramework( + path: path.appending(component: "StaticXCFrameworkB"), + linking: .static + ) + let staticXCFrameworkC = GraphDependency.testXCFramework( + path: path.appending(component: "StaticXCFrameworkC"), + linking: .static + ) + let frameworkA = Target.test(name: "FrameworkA", product: .framework) + let frameworkB = Target.test(name: "FrameworkB", product: .framework) + let frameworkC = Target.test(name: "FrameworkC", product: .framework) + let project = Project + .test(targets: [app, frameworkA, frameworkB, frameworkC]) + + let appDependency = GraphDependency.target(name: app.name, path: path) + let frameworkADependency = GraphDependency.target(name: frameworkA.name, path: path) + let frameworkBDependency = GraphDependency.target(name: frameworkB.name, path: path) + let frameworkCDependency = GraphDependency.target(name: frameworkC.name, path: path) + + let dependencies: [GraphDependency: Set] = [ + appDependency: Set([staticXCFrameworkC, frameworkADependency]), + frameworkADependency: Set([frameworkBDependency]), + frameworkBDependency: Set([frameworkCDependency]), + frameworkCDependency: Set([staticXCFrameworkA]), + staticXCFrameworkA: Set([staticXCFrameworkB]), + staticXCFrameworkB: Set([staticXCFrameworkC]), + staticXCFrameworkC: Set([]), + ] + let graph = Graph.test( + path: path, + projects: [path: project], + dependencies: dependencies + ) + let config = Config.test() + let graphTraverser = GraphTraverser(graph: graph) + + // When + let results = subject.lint(graphTraverser: graphTraverser, config: config) + + // Then + XCTAssertEqual(results, [ + warning(product: "StaticXCFrameworkC", type: "Xcframework", linkedBy: [appDependency, frameworkCDependency]), + ]) + } + func test_lint_whenStaticProductLinkedTwice_transitiveFrameworks() throws { // Given let path: AbsolutePath = "/project" From 234aa615d6f7356c2f2bbbc3870e609476049836 Mon Sep 17 00:00:00 2001 From: fortmarek Date: Mon, 5 Aug 2024 14:10:32 +0200 Subject: [PATCH 482/509] Update release date --- .../Client/ServerClientCLIMetadataHeadersMiddleware.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift b/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift index 1c6236b646d..ffac25227e8 100644 --- a/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift +++ b/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift @@ -5,7 +5,7 @@ import TuistSupport /// This middleware includes the release date of the CLI in the headers so that we can show /// warnings if the on-premise installation is too old. struct ServerClientCLIMetadataHeadersMiddleware: ClientMiddleware { - let releaseDate = "2024.07.30" + let releaseDate = "2024.08.05" func intercept( _ request: Request, From e56ae3c60dbd9cfa0155bf81d33822165e0349e2 Mon Sep 17 00:00:00 2001 From: Tuist Date: Mon, 5 Aug 2024 13:23:49 +0000 Subject: [PATCH 483/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.23.0 --- .mise.toml | 2 +- CHANGELOG.md | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index df2052d0358..eb8797b9f5d 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.22.0" +tuist = "4.23.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index 78c66c5e4ba..f43a6b75162 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## 4.23.0 - 2024-08-05 + +### Tuist + +#### Added + +- Create tuist share command [#6527](https://github.com/tuist/tuist/pull/6527) by [@fortmarek](https://github.com/fortmarek) + +#### Fixed + +- Fix clean printed twice in tuist --help [#6580](https://github.com/tuist/tuist/pull/6580) by [@fortmarek](https://github.com/fortmarek) +- Generate SPM Objective-C resource accessor only when a bundle is generated [#6584](https://github.com/tuist/tuist/pull/6584) by [@fortmarek](https://github.com/fortmarek) +- Deduplicate external resources [#6538](https://github.com/tuist/tuist/pull/6538) by [@KaiOelfke](https://github.com/KaiOelfke) +- Prevent Tuist authentication kickouts by retrying token refresh [#6594](https://github.com/tuist/tuist/pull/6594) by [@fortmarek](https://github.com/fortmarek) +- Fix unstable hashing of target dependencies [#6593](https://github.com/tuist/tuist/pull/6593) by [@fortmarek](https://github.com/fortmarek) +- Fix generate performance when using Tuist Cache xcframeworks [#6592](https://github.com/tuist/tuist/pull/6592) by [@fortmarek](https://github.com/fortmarek) + +### Tuist Cloud + +- no changes + ## 4.22.0 - 2024-07-30 ### Tuist From 9238387cb1687631668357f89e4d5ecf57d64bb3 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki Date: Tue, 6 Aug 2024 08:46:48 +0200 Subject: [PATCH 484/509] Add classPrefix support (#6439) * Add classPrefix to ProjectDescription.Project * Update XcodeGraph dependency * Add acceptance tests Test generating project with a custom class prefix. --- Sources/ProjectDescription/Project.swift | 4 ++++ .../TuistAcceptanceFixtures.swift | 3 +++ .../ProjectDescriptorGenerator.swift | 5 ++++ .../Project+ManifestMapper.swift | 3 ++- .../GenerateAcceptanceTests.swift | 14 +++++++++++ .../ProjectDescriptorGeneratorTests.swift | 23 +++++++++++++++++++ .../Project+ManifestMapperTests.swift | 3 ++- .../project_with_class_prefix/Project.swift | 6 +++++ fixtures/project_with_class_prefix/README.md | 3 +++ .../Tuist/Config.swift | 3 +++ 10 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 fixtures/project_with_class_prefix/Project.swift create mode 100644 fixtures/project_with_class_prefix/README.md create mode 100644 fixtures/project_with_class_prefix/Tuist/Config.swift diff --git a/Sources/ProjectDescription/Project.swift b/Sources/ProjectDescription/Project.swift index 0c78dc30f64..5489ba6ce4b 100644 --- a/Sources/ProjectDescription/Project.swift +++ b/Sources/ProjectDescription/Project.swift @@ -65,6 +65,8 @@ public struct Project: Codable, Equatable, Sendable { public let name: String /// The name of the organization used by Xcode as copyright. public let organizationName: String? + /// The prefix for class files Xcode generates when you create a project or class file. + public let classPrefix: String? /// The project options. public let options: Options /// The Swift Packages used by the project. @@ -85,6 +87,7 @@ public struct Project: Codable, Equatable, Sendable { public init( name: String, organizationName: String? = nil, + classPrefix: String? = nil, options: Options = .options(), packages: [Package] = [], settings: Settings? = nil, @@ -96,6 +99,7 @@ public struct Project: Codable, Equatable, Sendable { ) { self.name = name self.organizationName = organizationName + self.classPrefix = classPrefix self.options = options self.packages = packages self.targets = targets diff --git a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift index 724c3443ee7..a278abb8724 100644 --- a/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift +++ b/Sources/TuistAcceptanceTesting/TuistAcceptanceFixtures.swift @@ -66,6 +66,7 @@ public enum TuistAcceptanceFixtures { case multiplatformAppWithSdk case multiplatformµFeatureUnitTestsWithExplicitDependencies case plugin + case projectWithClassPrefix case projectWithFileHeaderTemplate case projectWithInlineFileHeaderTemplate case spmPackage @@ -208,6 +209,8 @@ public enum TuistAcceptanceFixtures { return "multiplatform_µFeature_unit_tests_with_explicit_dependencies" case .plugin: return "plugin" + case .projectWithClassPrefix: + return "project_with_class_prefix" case .projectWithFileHeaderTemplate: return "project_with_file_header_template" case .projectWithInlineFileHeaderTemplate: diff --git a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift index 5983464f1a1..fc8ed18f60e 100644 --- a/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift +++ b/Sources/TuistGenerator/Generator/ProjectDescriptorGenerator.swift @@ -314,6 +314,11 @@ final class ProjectDescriptorGenerator: ProjectDescriptorGenerating { attributes["ORGANIZATIONNAME"] = organizationName } + /// Class prefix + if let classPrefix = project.classPrefix { + attributes["CLASSPREFIX"] = classPrefix + } + /// Last upgrade check if let lastUpgradeCheck = project.lastUpgradeCheck { attributes["LastUpgradeCheck"] = lastUpgradeCheck.xcodeStringValue diff --git a/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift index fad70585416..d9202fe7d5c 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/Project+ManifestMapper.swift @@ -25,6 +25,7 @@ extension XcodeGraph.Project { let name = manifest.name let xcodeProjectName = manifest.options.xcodeProjectName ?? name let organizationName = manifest.organizationName + let classPrefix = manifest.classPrefix let defaultKnownRegions = manifest.options.defaultKnownRegions let developmentRegion = manifest.options.developmentRegion let options = XcodeGraph.Project.Options.from(manifest: manifest.options) @@ -58,7 +59,7 @@ extension XcodeGraph.Project { xcodeProjPath: generatorPaths.manifestDirectory.appending(component: "\(xcodeProjectName).xcodeproj"), name: name, organizationName: organizationName, - classPrefix: nil, + classPrefix: classPrefix, defaultKnownRegions: defaultKnownRegions, developmentRegion: developmentRegion, options: options, diff --git a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift index 92e4c5e6797..7feb6249423 100644 --- a/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift +++ b/Tests/TuistGeneratorAcceptanceTests/GenerateAcceptanceTests.swift @@ -709,6 +709,20 @@ final class GenerateAcceptanceTestManifestWithLogs: TuistAcceptanceTestCase { } } +final class GenerateAcceptanceTestsProjectWithClassPrefix: TuistAcceptanceTestCase { + func test_project_with_class_prefix() async throws { + try await setUpFixture(.projectWithClassPrefix) + try await run(GenerateCommand.self) + + let xcodeproj = try XcodeProj( + pathString: xcodeprojPath.pathString + ) + let attributes = try xcodeproj.pbxproj.rootProject()?.attributes + + XCTAssertEqual(attributes?["CLASSPREFIX"] as? String, "TUIST") + } +} + final class GenerateAcceptanceTestProjectWithFileHeaderTemplate: TuistAcceptanceTestCase { func test_project_with_file_header_template() async throws { try await setUpFixture(.projectWithFileHeaderTemplate) diff --git a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift index 61651456f9e..c5cd55d9f8e 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift @@ -266,6 +266,29 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { ]) } + func test_generate_setsClassPrefix() throws { + // Given + let path = try temporaryPath() + let graph = Graph.test(path: path) + let graphTraverser = GraphTraverser(graph: graph) + let project = Project.test( + path: path, + classPrefix: "TUIST", + targets: [] + ) + + // When + let got = try subject.generate(project: project, graphTraverser: graphTraverser) + + // Then + let pbxProject = try XCTUnwrap(try got.xcodeProj.pbxproj.rootProject()) + let attributes = try XCTUnwrap(pbxProject.attributes as? [String: String]) + XCTAssertEqual(attributes, [ + "BuildIndependentTargetsInParallel": "YES", + "CLASSPREFIX": "TUIST", + ]) + } + func test_generate_setsResourcesTagsName() throws { // Given let path = try temporaryPath() diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift index e6b60c6a1d4..20c29b22c27 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Project+ManifestMapperTests.swift @@ -16,6 +16,7 @@ final class ProjectManifestMapperTests: TuistUnitTestCase { let project = ProjectDescription.Project( name: "Name", organizationName: "Organization", + classPrefix: "ClassPrefix", options: .options( automaticSchemesOptions: .enabled( targetSchemesGrouping: .byNameSuffix(build: ["build"], test: ["test"], run: ["run"]), @@ -61,7 +62,7 @@ final class ProjectManifestMapperTests: TuistUnitTestCase { xcodeProjPath: "/XcodeName.xcodeproj", name: "Name", organizationName: "Organization", - classPrefix: nil, + classPrefix: "ClassPrefix", defaultKnownRegions: ["en-US", "Base"], developmentRegion: "us", options: .init( diff --git a/fixtures/project_with_class_prefix/Project.swift b/fixtures/project_with_class_prefix/Project.swift new file mode 100644 index 00000000000..4d9d7a9aa05 --- /dev/null +++ b/fixtures/project_with_class_prefix/Project.swift @@ -0,0 +1,6 @@ +import ProjectDescription + +let project = Project( + name: "App", + classPrefix: "TUIST" +) diff --git a/fixtures/project_with_class_prefix/README.md b/fixtures/project_with_class_prefix/README.md new file mode 100644 index 00000000000..55dc80e6caf --- /dev/null +++ b/fixtures/project_with_class_prefix/README.md @@ -0,0 +1,3 @@ +# Project with class prefix + +This example generate Xcode project with custom class prefix setting. \ No newline at end of file diff --git a/fixtures/project_with_class_prefix/Tuist/Config.swift b/fixtures/project_with_class_prefix/Tuist/Config.swift new file mode 100644 index 00000000000..ff8e64fa9ee --- /dev/null +++ b/fixtures/project_with_class_prefix/Tuist/Config.swift @@ -0,0 +1,3 @@ +import ProjectDescription + +let config = Config() From f845dcf8543483bcf1308793fda5899c9c6e1afd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Tue, 6 Aug 2024 17:03:40 +0200 Subject: [PATCH 485/509] Document the usage of the token on CI (#6607) --- .../guides/quick-start/optimize-workflows.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/docs/guides/quick-start/optimize-workflows.md b/docs/docs/guides/quick-start/optimize-workflows.md index a3f28d804ac..3b4b4f9a4ac 100644 --- a/docs/docs/guides/quick-start/optimize-workflows.md +++ b/docs/docs/guides/quick-start/optimize-workflows.md @@ -45,4 +45,18 @@ tuist auth tuist generate ``` -And they'll suddenly get a project with the dependencies as binaries. \ No newline at end of file +And they'll suddenly get a project with the dependencies as binaries. + +## Optimizations on CI + +If want to access those optimizations on CI, +you'll have to generate a project-scoped token to authenticate requests in the CI environment. + +```bash +tuist project tokens create my-handle/MyApp +``` + +Then expose the token as an environment variable `TUIST_CONFIG_TOKEN` in your CI environment. The presence of the token will automatically enable the optimizations and insights. + +> [!IMPORTANT] CI ENVIRONMENT DETECTION +> Tuist only uses the token when it detects it's running on a CI environment. If your CI environment is not detected, you can force the token usage by setting the environment variable `CI` to `1`. \ No newline at end of file From a62300c7f6610007ee46d9b5e2f284d4c0461ae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Wed, 7 Aug 2024 14:38:24 +0200 Subject: [PATCH 486/509] Add documentation for previews (#6608) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Document previews * Update docs/docs/guides/share/previews.md Co-authored-by: Marek Fořt * Update docs/docs/guides/share/previews.md Co-authored-by: Marek Fořt * Update docs/docs/guides/share/previews.md Co-authored-by: Marek Fořt * Update docs/docs/guides/share/previews.md Co-authored-by: Marek Fořt * Update docs/docs/guides/share/previews.md Co-authored-by: Marek Fořt * Document previews' visibility --------- Co-authored-by: Marek Fořt --- docs/.vitepress/sidebars.mjs | 9 ++++++-- docs/docs/guides/share.md | 9 -------- docs/docs/guides/share/previews.md | 36 ++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 11 deletions(-) delete mode 100644 docs/docs/guides/share.md create mode 100644 docs/docs/guides/share/previews.md diff --git a/docs/.vitepress/sidebars.mjs b/docs/.vitepress/sidebars.mjs index 20057c51ab2..b22df3ab492 100644 --- a/docs/.vitepress/sidebars.mjs +++ b/docs/.vitepress/sidebars.mjs @@ -296,8 +296,13 @@ export const guidesSidebar = [ ], }, { - text: `Share ${cube01Icon()} ${comingSoonBadge()}`, - link: "guides/share", + text: `Share ${cube01Icon()}`, + items: [ + { + text: "Previews", + link: "guides/share/previews", + }, + ], }, // { // text: `Measure ${barChartSquare02Icon()} ${comingSoonBadge()}`, diff --git a/docs/docs/guides/share.md b/docs/docs/guides/share.md deleted file mode 100644 index b1ab49c3122..00000000000 --- a/docs/docs/guides/share.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Share -description: Share your artifacts with people and Apple. ---- - -# Share - -> [!WARNING] COMING SOON -> This feature is not available yet. We are working on it and it will be available soon. \ No newline at end of file diff --git a/docs/docs/guides/share/previews.md b/docs/docs/guides/share/previews.md new file mode 100644 index 00000000000..d2a2a59af50 --- /dev/null +++ b/docs/docs/guides/share/previews.md @@ -0,0 +1,36 @@ +--- +title: Previews +description: Learn how to generate and share previews of your apps with anyone. +--- + +# Previews + + +When building an app, you may want to share it with others to get feedback. +Traditionally, this is something that teams do by building, signing, and pushing their apps to platforms like Apple's [TestFlight](https://developer.apple.com/testflight/). +However, this process can be cumbersome and slow, especially when you're just looking for quick feedback from a colleague or a friend. + +To make this process more streamlined, Tuist provides a way to generate and share previews of your apps with anyone. + +> [!IMPORTANT] ONLY SIMULATOR ARCHITECTURES ARE CURRENTLY SUPPORTED +> We only support simulator architectures for previews at the moment. Support for devices will come in the future. + +:::code-group +```bash [Tuist Project] +tuist build App # Build the app first +tuist share App +``` +```bash [Xcode Project] +xcodebuild -scheme App -project App.xcodeproj -configuration Debug +tuist share App --configuration Debug --platform iOS +``` +::: + +The command will generate a link that you can share with anyone to run the app. All they'll need to do is to run the command below: + +```bash +tuist run {url} +``` + +> [!IMPORTANT] PREVIEWS' VISIBILITY +> Only people with access to the organization the project belongs to can access the previews. We plan to add support for expiring links. \ No newline at end of file From 1e122d911f6d8f3c7a579ea66a2388ec72c0faf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 7 Aug 2024 15:27:36 +0200 Subject: [PATCH 487/509] Fix missing external resource bundle in app extension (#6604) --- Sources/TuistCore/Graph/GraphTraverser.swift | 1 + .../Graph/GraphTraverserTests.swift | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index dc8f67d68c4..3dd6f36ad48 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -1145,6 +1145,7 @@ public class GraphTraverser: GraphTraversing { .appClip, .unitTests, .uiTests, + .appExtension, .watch2Extension, .systemExtension, .xpc, diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index 8117d98d8d9..974f9dc17d3 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -383,6 +383,52 @@ final class GraphTraverserTests: TuistUnitTestCase { XCTAssertEqual(dynamicFrameworkBundleDependencies, []) } + func test_resourceBundleDependencies_when_app_extension_depends_on_external_static_framework_with_resources() { + // Given + // AppExtension -> StaticLibrary (External) -> Bundle + let appExtension = Target.test(name: "AppExtension", product: .appExtension) + let staticLibrary = Target.test(name: "StaticLibrary", product: .staticLibrary) + let bundle = Target.test(name: "Bundle", product: .bundle) + let project = Project.test(targets: [appExtension]) + let externalProject = Project.test( + path: try! AbsolutePath(validating: "/ExternalProject"), + targets: [staticLibrary, bundle], + isExternal: true + ) + + let dependencies: [GraphDependency: Set] = [ + .target(name: appExtension.name, path: project.path): Set([.target( + name: staticLibrary.name, + path: externalProject.path + )]), + .target(name: staticLibrary.name, path: externalProject.path): Set([.target( + name: bundle.name, + path: externalProject.path + )]), + .target(name: bundle.name, path: externalProject.path): Set([]), + ] + + // Given: Value Graph + let graph = Graph.test( + path: project.path, + projects: [ + project.path: project, + externalProject.path: externalProject, + ], + dependencies: dependencies + ) + let subject = GraphTraverser(graph: graph) + + // When + let appExtensionBundleDependencies = subject.resourceBundleDependencies(path: project.path, name: appExtension.name) + .sorted() + + // Then + XCTAssertEqual(appExtensionBundleDependencies, [ + .product(target: bundle.name, productName: bundle.productNameWithExtension), + ]) + } + func test_resourceBundleDependencies_when_the_target_doesnt_support_resources() { // Given // StaticLibrary -> Bundle From d1462545bd88f07c97eee7ed9bc4938ce0f54c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 7 Aug 2024 16:17:13 +0200 Subject: [PATCH 488/509] Favor TUIST_CONFIG_TOKEN over TUIST_CONFIG_CLOUD_TOKEN (#6610) --- .../ServerAuthenticationController.swift | 6 ++-- .../ServerAuthenticationControllerTests.swift | 28 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/Sources/TuistServer/Utilities/ServerAuthenticationController.swift b/Sources/TuistServer/Utilities/ServerAuthenticationController.swift index 1f623806cf0..7cf1a1af9dc 100644 --- a/Sources/TuistServer/Utilities/ServerAuthenticationController.swift +++ b/Sources/TuistServer/Utilities/ServerAuthenticationController.swift @@ -76,14 +76,16 @@ public final class ServerAuthenticationController: ServerAuthenticationControlli public func authenticationToken(serverURL: URL) throws -> AuthenticationToken? { if ciChecker.isCI() { - if let deprecatedToken = environment.tuistVariables[Constants.EnvironmentVariables.deprecatedToken] { + if let configToken = environment.tuistVariables[Constants.EnvironmentVariables.token] { + return .project(configToken) + } else if let deprecatedToken = environment.tuistVariables[Constants.EnvironmentVariables.deprecatedToken] { logger .warning( "Use `TUIST_CONFIG_TOKEN` environment variable instead of `TUIST_CONFIG_CLOUD_TOKEN` to authenticate on the CI" ) return .project(deprecatedToken) } else { - return environment.tuistVariables[Constants.EnvironmentVariables.token].map { .project($0) } + return nil } } else { let credentials = try credentialsStore.read(serverURL: serverURL) diff --git a/Tests/TuistServerTests/Utilities/ServerAuthenticationControllerTests.swift b/Tests/TuistServerTests/Utilities/ServerAuthenticationControllerTests.swift index f925808c8e4..c1062decdd9 100644 --- a/Tests/TuistServerTests/Utilities/ServerAuthenticationControllerTests.swift +++ b/Tests/TuistServerTests/Utilities/ServerAuthenticationControllerTests.swift @@ -85,6 +85,34 @@ final class ServerAuthenticationControllerTests: TuistUnitTestCase { got, .project("project-token") ) + XCTAssertStandardOutput( + pattern: "Use `TUIST_CONFIG_TOKEN` environment variable instead of `TUIST_CONFIG_CLOUD_TOKEN` to authenticate on the CI" + ) + } + + func test_when_deprecated_and_current_config_tokens_are_present_and_is_ci() throws { + // Given + environment.tuistVariables[ + Constants.EnvironmentVariables.deprecatedToken + ] = "deprecated-project-token" + environment.tuistVariables[ + Constants.EnvironmentVariables.token + ] = "project-token" + given(ciChecker) + .isCI() + .willReturn(true) + + // When + let got = try subject.authenticationToken(serverURL: .test()) + + // Then + XCTAssertEqual( + got, + .project("project-token") + ) + XCTAssertPrinterOutputNotContains( + "Use `TUIST_CONFIG_TOKEN` environment variable instead of `TUIST_CONFIG_CLOUD_TOKEN` to authenticate on the CI" + ) } func test_when_credentials_store_returns_legacy_token() throws { From 997b9d50329f461a839301c572f6e0a126cb9ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 7 Aug 2024 20:23:25 +0200 Subject: [PATCH 489/509] Fix app not found error when target name and product name differ (#6611) --- Sources/TuistKit/Services/ShareService.swift | 2 +- Tests/TuistKitTests/Services/ShareServiceTests.swift | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Sources/TuistKit/Services/ShareService.swift b/Sources/TuistKit/Services/ShareService.swift index 834211cc680..df5d82436d7 100644 --- a/Sources/TuistKit/Services/ShareService.swift +++ b/Sources/TuistKit/Services/ShareService.swift @@ -179,7 +179,7 @@ struct ShareService { for: platforms, workspacePath: graph.workspace.xcWorkspacePath, configuration: configuration, - app: appTarget.target.name, + app: appTarget.target.productName, derivedDataPath: derivedDataPath, fullHandle: fullHandle, serverURL: serverURL diff --git a/Tests/TuistKitTests/Services/ShareServiceTests.swift b/Tests/TuistKitTests/Services/ShareServiceTests.swift index 2c9d5bbb037..653bbca40f4 100644 --- a/Tests/TuistKitTests/Services/ShareServiceTests.swift +++ b/Tests/TuistKitTests/Services/ShareServiceTests.swift @@ -109,8 +109,9 @@ final class ShareServiceTests: TuistUnitTestCase { let projectPath = try temporaryPath() let appTarget: Target = .test( - name: "App", - destinations: [.appleVision, .iPhone] + name: "AppTarget", + destinations: [.appleVision, .iPhone], + productName: "App" ) let appTargetTwo: Target = .test(name: "AppTwo") let project: Project = .test( From c246820123e742cef48382e3c586bc3e958972cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 7 Aug 2024 21:16:44 +0200 Subject: [PATCH 490/509] Skip user token deprecation warning when new user tokens are available (#6614) --- .../ServerAuthenticationController.swift | 19 +++++--- .../ServerAuthenticationControllerTests.swift | 44 ++++++++++++++++--- 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/Sources/TuistServer/Utilities/ServerAuthenticationController.swift b/Sources/TuistServer/Utilities/ServerAuthenticationController.swift index 7cf1a1af9dc..08cbaa22dd0 100644 --- a/Sources/TuistServer/Utilities/ServerAuthenticationController.swift +++ b/Sources/TuistServer/Utilities/ServerAuthenticationController.swift @@ -90,15 +90,20 @@ public final class ServerAuthenticationController: ServerAuthenticationControlli } else { let credentials = try credentialsStore.read(serverURL: serverURL) return try credentials.map { - if $0.token != nil { + if let refreshToken = $0.refreshToken { + return .user( + legacyToken: nil, + accessToken: try $0.accessToken.map(parseJWT), + refreshToken: try parseJWT(refreshToken) + ) + } else { logger.warning("You are using a deprecated user token. Please, reauthenticate by running `tuist auth`.") + return .user( + legacyToken: $0.token, + accessToken: nil, + refreshToken: nil + ) } - - return .user( - legacyToken: $0.token, - accessToken: try $0.accessToken.map(parseJWT), - refreshToken: try $0.refreshToken.map(parseJWT) - ) } } } diff --git a/Tests/TuistServerTests/Utilities/ServerAuthenticationControllerTests.swift b/Tests/TuistServerTests/Utilities/ServerAuthenticationControllerTests.swift index c1062decdd9..cf86e30ebb3 100644 --- a/Tests/TuistServerTests/Utilities/ServerAuthenticationControllerTests.swift +++ b/Tests/TuistServerTests/Utilities/ServerAuthenticationControllerTests.swift @@ -11,6 +11,11 @@ final class ServerAuthenticationControllerTests: TuistUnitTestCase { private var credentialsStore: MockServerCredentialsStoring! private var ciChecker: MockCIChecking! + private let accessToken = + "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ0dWlzdF9jbG91ZCIsImV4cCI6MTcyMDQyOTgxMiwiaWF0IjoxNzIwNDI5NzUyLCJpc3MiOiJ0dWlzdF9jbG91ZCIsImp0aSI6IjlmZGEwYmRmLTE0MjMtNDhmNi1iNWRmLWM2MDVjMGMwMzBiMiIsIm5iZiI6MTcyMDQyOTc1MSwicmVzb3VyY2UiOiJ1c2VyIiwic3ViIjoiMSIsInR5cCI6ImFjY2VzcyJ9.qsxjD51lHHaQo6NWs-gUxVUhQfyWEe3v3-okM0NIV72vDY-fGgzq9JU2F8DQbdOD8POqWkseCbtO66m_4J9uFw" + private let refreshToken = + "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ0dWlzdF9jbG91ZCIsImV4cCI6MTcyMDQyOTgxMCwiaWF0IjoxNzIwNDI5NzUyLCJpc3MiOiJ0dWlzdF9jbG91ZCIsImp0aSI6IjlmZGEwYmRmLTE0MjMtNDhmNi1iNWRmLWM2MDVjMGMwMzBiMiIsIm5iZiI6MTcyMDQyOTc1MSwicmVzb3VyY2UiOiJ1c2VyIiwic3ViIjoiMSIsInR5cCI6ImFjY2VzcyJ9.UGMOA4nysabRCO0px9ixCW3JTCA6OgYSeVA6X--Xkc8b-YA8ui2SeCL8gV9WvOYeLJA5pvzKUSulVfV1qM4LKg" + override func setUp() { super.setUp() @@ -136,16 +141,45 @@ final class ServerAuthenticationControllerTests: TuistUnitTestCase { XCTAssertStandardOutput(pattern: "You are using a deprecated user token. Please, reauthenticate by running `tuist auth`.") } - func test_when_credentials_store_returns_jwt_tokens() throws { + func test_when_credentials_store_returns_legacy_token_and_jwt_tokens() throws { // Given given(ciChecker) .isCI() .willReturn(false) - let accessToken = - "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ0dWlzdF9jbG91ZCIsImV4cCI6MTcyMDQyOTgxMiwiaWF0IjoxNzIwNDI5NzUyLCJpc3MiOiJ0dWlzdF9jbG91ZCIsImp0aSI6IjlmZGEwYmRmLTE0MjMtNDhmNi1iNWRmLWM2MDVjMGMwMzBiMiIsIm5iZiI6MTcyMDQyOTc1MSwicmVzb3VyY2UiOiJ1c2VyIiwic3ViIjoiMSIsInR5cCI6ImFjY2VzcyJ9.qsxjD51lHHaQo6NWs-gUxVUhQfyWEe3v3-okM0NIV72vDY-fGgzq9JU2F8DQbdOD8POqWkseCbtO66m_4J9uFw" - let refreshToken = - "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ0dWlzdF9jbG91ZCIsImV4cCI6MTcyMDQyOTgxMCwiaWF0IjoxNzIwNDI5NzUyLCJpc3MiOiJ0dWlzdF9jbG91ZCIsImp0aSI6IjlmZGEwYmRmLTE0MjMtNDhmNi1iNWRmLWM2MDVjMGMwMzBiMiIsIm5iZiI6MTcyMDQyOTc1MSwicmVzb3VyY2UiOiJ1c2VyIiwic3ViIjoiMSIsInR5cCI6ImFjY2VzcyJ9.UGMOA4nysabRCO0px9ixCW3JTCA6OgYSeVA6X--Xkc8b-YA8ui2SeCL8gV9WvOYeLJA5pvzKUSulVfV1qM4LKg" + given(credentialsStore) + .read(serverURL: .any) + .willReturn(ServerCredentials(token: "legacy-token", accessToken: accessToken, refreshToken: refreshToken)) + + // When + let got = try subject.authenticationToken(serverURL: .test()) + + // Then + // Then + XCTAssertEqual( + got, + .user( + legacyToken: nil, + accessToken: JWT( + token: accessToken, + expiryDate: Date(timeIntervalSince1970: 1_720_429_812) + ), + refreshToken: JWT( + token: refreshToken, + expiryDate: Date(timeIntervalSince1970: 1_720_429_810) + ) + ) + ) + XCTAssertPrinterOutputNotContains( + "You are using a deprecated user token. Please, reauthenticate by running `tuist auth`." + ) + } + + func test_when_credentials_store_returns_jwt_tokens() throws { + // Given + given(ciChecker) + .isCI() + .willReturn(false) given(credentialsStore) .read(serverURL: .any) From e50ea29b9508040de4b9523517c81f1f3282f650 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 8 Aug 2024 08:50:12 +0200 Subject: [PATCH 491/509] Add Swift library sdk type (#6605) * Add Swift library sdk type * Add note about the library path * Update XcodeGraph to 0.9.1 * Update XcodeGraph to 0.10.0 --- Package.resolved | 6 ++--- Package.swift | 2 +- .../ProjectDescription/TargetDependency.swift | 7 ++++++ ... => SystemFrameworkMetadataProvider.swift} | 21 +++++++++++++++--- .../TargetDependency+ManifestMapper.swift | 4 +++- ...SystemFrameworkMetadataProviderTests.swift | 16 ++++++++++++++ ...TargetDependency+ManifestMapperTests.swift | 22 +++++++++++++++++++ .../.mise.toml | 2 -- fixtures/app_with_google_maps/.mise.toml | 2 -- .../Framework/FrameworkClass.swift | 1 + fixtures/ios_app_with_sdk/Project.swift | 1 + 11 files changed, 72 insertions(+), 12 deletions(-) rename Sources/TuistCore/MetadataProviders/{SystemFrameworksMetadataProvider.swift => SystemFrameworkMetadataProvider.swift} (82%) delete mode 100644 fixtures/app_with_custom_default_configuration/.mise.toml delete mode 100644 fixtures/app_with_google_maps/.mise.toml diff --git a/Package.resolved b/Package.resolved index b2d67bf1837..56dd65abd04 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "6fdbad66e96883b1e14d41ffecc35d4e27d22f9fdeb34d816fd7c61093fb5a49", + "originHash" : "87bcc64457d6f46746dad13b0f06d8fab58d49517e8eda1547b0604ab357c8fe", "pins" : [ { "identity" : "aexml", @@ -276,8 +276,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/tuist/XcodeGraph.git", "state" : { - "revision" : "174f7881822100bf6781720c30086df0b8b5f859", - "version" : "0.8.1" + "revision" : "179fbd4fa5da6ddbdd67e541f4eb4afe6438f86d", + "version" : "0.10.0" } }, { diff --git a/Package.swift b/Package.swift index 2451c79b2c3..cf06a4acdc1 100644 --- a/Package.swift +++ b/Package.swift @@ -466,7 +466,7 @@ let package = Package( .package(url: "https://github.com/tuist/swift-openapi-runtime", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/swift-openapi-urlsession", branch: "swift-tools-version"), .package(url: "https://github.com/tuist/Path", .upToNextMajor(from: "0.3.0")), - .package(url: "https://github.com/tuist/XcodeGraph.git", exact: "0.8.1"), + .package(url: "https://github.com/tuist/XcodeGraph.git", exact: "0.10.0"), .package(url: "https://github.com/tuist/FileSystem.git", .upToNextMajor(from: "0.2.0")), ], targets: targets diff --git a/Sources/ProjectDescription/TargetDependency.swift b/Sources/ProjectDescription/TargetDependency.swift index 1598ec3c618..ac726fa2789 100644 --- a/Sources/ProjectDescription/TargetDependency.swift +++ b/Sources/ProjectDescription/TargetDependency.swift @@ -22,8 +22,15 @@ public enum SDKStatus: String, Codable, Hashable, Sendable { /// Dependency type used by `.sdk` target dependencies public enum SDKType: String, Codable, Hashable, Sendable { /// Library SDK dependency + /// Libraries are located in: + /// `{path-to-xcode}.app/Contents/Developer/Platforms/{platform}.platform/Developer/SDKs/{runtime}.sdk/usr/lib` case library + /// Swift library SDK dependency + /// Swift libraries are located in: + /// `{path-to-xcode}.app/Contents/Developer/Platforms/{platform}.platform/Developer/SDKs/{runtime}.sdk/usr/lib/swift` + case swiftLibrary + /// Framework SDK dependency case framework } diff --git a/Sources/TuistCore/MetadataProviders/SystemFrameworksMetadataProvider.swift b/Sources/TuistCore/MetadataProviders/SystemFrameworkMetadataProvider.swift similarity index 82% rename from Sources/TuistCore/MetadataProviders/SystemFrameworksMetadataProvider.swift rename to Sources/TuistCore/MetadataProviders/SystemFrameworkMetadataProvider.swift index 0bb0833f89f..55ad5413259 100644 --- a/Sources/TuistCore/MetadataProviders/SystemFrameworksMetadataProvider.swift +++ b/Sources/TuistCore/MetadataProviders/SystemFrameworkMetadataProvider.swift @@ -48,11 +48,23 @@ public final class SystemFrameworkMetadataProvider: SystemFrameworkMetadataProvi source: SDKSource ) throws -> SystemFrameworkMetadata { let sdkNamePath = try AbsolutePath(validating: "/\(sdkName)") - guard let sdkExtension = sdkNamePath.extension, - let sdkType = SDKType(rawValue: sdkExtension) - else { + guard let sdkExtension = sdkNamePath.extension + else { throw SystemFrameworkMetadataProviderError.unsupportedSDK(name: sdkName) } + + let sdkType: SDKType + switch sdkExtension { + case "framework": + sdkType = .framework + case "tbd": + if sdkName.starts(with: "libswift") { + sdkType = .swiftLibrary + } else { + sdkType = .library + } + default: throw SystemFrameworkMetadataProviderError.unsupportedSDK(name: sdkName) } + let path = try sdkPath(name: sdkName, platform: platform, type: sdkType, source: source) return SystemFrameworkMetadata( name: sdkName, @@ -82,6 +94,9 @@ public final class SystemFrameworkMetadataProvider: SystemFrameworkMetadataProvi return sdkRootPath .appending(try RelativePath(validating: "usr/lib")) .appending(component: name) + case .swiftLibrary: + return sdkRootPath + .appending(components: "usr", "lib", "swift", name) } } } diff --git a/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift b/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift index 0390e28b231..b0fce01a5a6 100644 --- a/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift +++ b/Sources/TuistLoader/Models+ManifestMappers/TargetDependency+ManifestMapper.swift @@ -133,6 +133,8 @@ extension ProjectDescription.SDKType { switch self { case .library: return "lib" + case .swiftLibrary: + return "libswift" case .framework: return "" } @@ -141,7 +143,7 @@ extension ProjectDescription.SDKType { /// The extension associated to the type fileprivate var fileExtension: String { switch self { - case .library: + case .library, .swiftLibrary: return "tbd" case .framework: return "framework" diff --git a/Tests/TuistCoreTests/MetadataProviders/SystemFrameworkMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/SystemFrameworkMetadataProviderTests.swift index 56547d6b9f3..a280d7a2186 100644 --- a/Tests/TuistCoreTests/MetadataProviders/SystemFrameworkMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/SystemFrameworkMetadataProviderTests.swift @@ -49,6 +49,22 @@ final class SystemFrameworkMetadataProviderTests: XCTestCase { )) } + func test_loadMetadata_swiftLibrary() throws { + // Given + let sdkName = "libswiftObservation.tbd" + + // When + let metadata = try subject.loadMetadata(sdkName: sdkName, status: .required, platform: .iOS, source: .system) + + // Then + XCTAssertEqual(metadata, SystemFrameworkMetadata( + name: sdkName, + path: "/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/swift/libswiftObservation.tbd", + status: .required, + source: .system + )) + } + func test_loadMetadata_unsupportedType() throws { // Given let sdkName = "UIKit.xcframework" diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift index 6d50f56f8f0..11e44355996 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/TargetDependency+ManifestMapperTests.swift @@ -176,6 +176,28 @@ final class DependencyManifestMapperTests: TuistUnitTestCase { XCTAssertEqual(status, .required) } + func test_from_when_sdkSwiftLibrary() throws { + // Given + let dependency = ProjectDescription.TargetDependency.sdk(name: "Observation", type: .swiftLibrary, status: .required) + let generatorPaths = GeneratorPaths(manifestDirectory: try AbsolutePath(validating: "/")) + + // When + let got = try XcodeGraph.TargetDependency.from( + manifest: dependency, + generatorPaths: generatorPaths, + externalDependencies: [:] + ) + + // Then + XCTAssertEqual(got.count, 1) + guard case let .sdk(name, status, _) = got[0] else { + XCTFail("Dependency should be sdk") + return + } + XCTAssertEqual(name, "libswiftObservation.tbd") + XCTAssertEqual(status, .required) + } + func test_from_when_sdkFramework() throws { // Given let dependency = ProjectDescription.TargetDependency.sdk(name: "ARKit", type: .framework, status: .required) diff --git a/fixtures/app_with_custom_default_configuration/.mise.toml b/fixtures/app_with_custom_default_configuration/.mise.toml deleted file mode 100644 index faee01cee73..00000000000 --- a/fixtures/app_with_custom_default_configuration/.mise.toml +++ /dev/null @@ -1,2 +0,0 @@ -[tools] -tuist = "4.11.0" diff --git a/fixtures/app_with_google_maps/.mise.toml b/fixtures/app_with_google_maps/.mise.toml deleted file mode 100644 index 4645f47ab07..00000000000 --- a/fixtures/app_with_google_maps/.mise.toml +++ /dev/null @@ -1,2 +0,0 @@ -[tools] -tuist = "4.21.2" diff --git a/fixtures/ios_app_with_sdk/Framework/FrameworkClass.swift b/fixtures/ios_app_with_sdk/Framework/FrameworkClass.swift index 35939de4cb3..c5d120653d5 100644 --- a/fixtures/ios_app_with_sdk/Framework/FrameworkClass.swift +++ b/fixtures/ios_app_with_sdk/Framework/FrameworkClass.swift @@ -1,4 +1,5 @@ import CloudKit +import Observation import SQLite3 public class FrameworkClass { diff --git a/fixtures/ios_app_with_sdk/Project.swift b/fixtures/ios_app_with_sdk/Project.swift index 419fd0b5f02..ff1246908b7 100644 --- a/fixtures/ios_app_with_sdk/Project.swift +++ b/fixtures/ios_app_with_sdk/Project.swift @@ -15,6 +15,7 @@ let project = Project( .sdk(name: "ARKit", type: .framework, status: .required), .sdk(name: "StoreKit", type: .framework, status: .optional), .sdk(name: "MobileCoreServices", type: .framework, status: .required), + .sdk(name: "Observation", type: .swiftLibrary), .project(target: "StaticFramework", path: "Modules/StaticFramework"), ] ), From 725d68eb907e70e135af5ddfd32c00034fa40195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 8 Aug 2024 09:07:00 +0200 Subject: [PATCH 492/509] Add support for updating Tuist project's default branch (#6589) * Add support for updating Tuist project's default branch * Address PR feedback * Fix build failure in RevokeProjectTokenService due to duplicated badRequest * Add missing setUpFixture call * Fix lint error --- Sources/TuistKit/Commands/EnvKey/EnvKey.swift | 7 +- .../Commands/Project/ProjectShowCommand.swift | 43 ++++ .../Project/ProjectUpdateCommand.swift | 39 +++ .../Commands/Project/ProjectViewCommand.swift | 33 --- .../TuistKit/Commands/ProjectCommand.swift | 3 +- .../Services/Project/ProjectShowService.swift | 82 ++++++ .../Project/ProjectUpdateService.swift | 73 ++++++ .../Services/Project/ProjectViewService.swift | 66 ----- .../TuistServer/Models/ServerProject.swift | 12 +- Sources/TuistServer/OpenAPI/Client.swift | 98 ++++++++ Sources/TuistServer/OpenAPI/Types.swift | 234 +++++++++++++++++- Sources/TuistServer/OpenAPI/server.yml | 61 +++++ .../Services/RevokeProjectTokenService.swift | 2 +- .../Services/UpdateOrganizationService.swift | 2 +- .../Services/UpdateProjectService.swift | 102 ++++++++ .../Utils/MockOpener.swift | 41 --- ...sts.swift => ProjectAcceptanceTests.swift} | 30 ++- .../Services/EditServiceTests.swift | 33 ++- .../Services/GenerateServiceTests.swift | 22 +- ...> OrganizationUpdateSSOServiceTests.swift} | 0 .../Project/ProjectShowServiceTests.swift | 154 ++++++++++++ .../Project/ProjectUpdateServiceTests.swift | 126 ++++++++++ .../Project/ProjectViewServiceTests.swift | 73 ------ .../ServerSessionControllerTests.swift | 8 +- 24 files changed, 1096 insertions(+), 248 deletions(-) create mode 100644 Sources/TuistKit/Commands/Project/ProjectShowCommand.swift create mode 100644 Sources/TuistKit/Commands/Project/ProjectUpdateCommand.swift delete mode 100644 Sources/TuistKit/Commands/Project/ProjectViewCommand.swift create mode 100644 Sources/TuistKit/Services/Project/ProjectShowService.swift create mode 100644 Sources/TuistKit/Services/Project/ProjectUpdateService.swift delete mode 100644 Sources/TuistKit/Services/Project/ProjectViewService.swift create mode 100644 Sources/TuistServer/Services/UpdateProjectService.swift delete mode 100644 Sources/TuistSupportTesting/Utils/MockOpener.swift rename Tests/TuistKitAcceptanceTests/{ServerAcceptanceTests.swift => ProjectAcceptanceTests.swift} (59%) rename Tests/TuistKitTests/Services/Organization/{OrganizationUpdateSSOService.swift => OrganizationUpdateSSOServiceTests.swift} (100%) create mode 100644 Tests/TuistKitTests/Services/Project/ProjectShowServiceTests.swift create mode 100644 Tests/TuistKitTests/Services/Project/ProjectUpdateServiceTests.swift delete mode 100644 Tests/TuistKitTests/Services/Project/ProjectViewServiceTests.swift diff --git a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift index c66a9f29729..524aeef0742 100644 --- a/Sources/TuistKit/Commands/EnvKey/EnvKey.swift +++ b/Sources/TuistKit/Commands/EnvKey/EnvKey.swift @@ -178,9 +178,10 @@ public enum EnvKey: String, CaseIterable { case projectCreateFullHandle = "TUIST_PROJECT_CREATE_FULL_HANDLE" case projectCreatePath = "TUIST_PROJECT_CREATE_PATH" - // PROJECT VIEW - case projectViewFullHandle = "TUIST_PROJECT_VIEW_FULL_HANDLE" - case projectViewPath = "TUIST_PROJECT_VIEW_PATH" + // PROJECT SHOW + case projectShowFullHandle = "TUIST_PROJECT_SHOW_FULL_HANDLE" + case projectShowPath = "TUIST_PROJECT_SHOW_PATH" + case projectShowWeb = "TUIST_PROJECT_SHOW_WEB" // ORGANIZATION INVITE case organizationInviteOrganizationName = "TUIST_ORGANIZATION_INVITE_ORGANIZATION_NAME" diff --git a/Sources/TuistKit/Commands/Project/ProjectShowCommand.swift b/Sources/TuistKit/Commands/Project/ProjectShowCommand.swift new file mode 100644 index 00000000000..486bf58338b --- /dev/null +++ b/Sources/TuistKit/Commands/Project/ProjectShowCommand.swift @@ -0,0 +1,43 @@ +import ArgumentParser +import Foundation +import Path +import TuistSupport + +struct ProjectShowCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "show", + _superCommandName: "project", + abstract: "Show information about the specified project. Use --web flag to open the project in the browser." + ) + } + + @Argument( + help: "The project to show. The full handle must be in the format of account-handle/project-handle.", + completion: .directory, + envKey: .projectShowFullHandle + ) + var fullHandle: String? + + @Flag( + help: "Open a project in the browser.", + envKey: .projectShowWeb + ) + var web: Bool = false + + @Option( + name: .shortAndLong, + help: "The path to the Tuist project.", + completion: .directory, + envKey: .projectShowPath + ) + var path: String? + + func run() async throws { + try await ProjectShowService().run( + fullHandle: fullHandle, + web: web, + path: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Project/ProjectUpdateCommand.swift b/Sources/TuistKit/Commands/Project/ProjectUpdateCommand.swift new file mode 100644 index 00000000000..73f7f95e022 --- /dev/null +++ b/Sources/TuistKit/Commands/Project/ProjectUpdateCommand.swift @@ -0,0 +1,39 @@ +import ArgumentParser +import Foundation +import Path + +struct ProjectUpdateCommand: AsyncParsableCommand { + static var configuration: CommandConfiguration { + CommandConfiguration( + commandName: "update", + _superCommandName: "project", + abstract: "Update project settings" + ) + } + + @Argument( + help: "The full handle of the project to update. Must be in the format of account-handle/project-handle." + ) + var fullHandle: String? + + @Option( + help: "Set the default branch name for the repository linked to the project." + ) + var defaultBranch: String? + + @Option( + name: .shortAndLong, + help: "The path to the Tuist project.", + completion: .directory + ) + var path: String? + + func run() async throws { + try await ProjectUpdateService() + .run( + fullHandle: fullHandle, + defaultBranch: defaultBranch, + path: path + ) + } +} diff --git a/Sources/TuistKit/Commands/Project/ProjectViewCommand.swift b/Sources/TuistKit/Commands/Project/ProjectViewCommand.swift deleted file mode 100644 index 07a2c772841..00000000000 --- a/Sources/TuistKit/Commands/Project/ProjectViewCommand.swift +++ /dev/null @@ -1,33 +0,0 @@ -import ArgumentParser -import Foundation -import Path -import TuistSupport - -struct ProjectViewCommand: AsyncParsableCommand { - static var configuration: CommandConfiguration { - CommandConfiguration( - commandName: "view", - _superCommandName: "project", - abstract: "Open the project dashboard in the system default's browser." - ) - } - - @Argument( - help: "The project to view. The full handle must be in the format of account-handle/project-handle.", - completion: .directory, - envKey: .projectViewFullHandle - ) - var fullHandle: String? - - @Option( - name: .shortAndLong, - help: "The path to the Tuist project", - completion: .directory, - envKey: .projectViewPath - ) - var path: String? - - func run() async throws { - try await ProjectViewService().run(fullHandle: fullHandle, pathString: path) - } -} diff --git a/Sources/TuistKit/Commands/ProjectCommand.swift b/Sources/TuistKit/Commands/ProjectCommand.swift index 9ff551ffeb1..b4bccd50f86 100644 --- a/Sources/TuistKit/Commands/ProjectCommand.swift +++ b/Sources/TuistKit/Commands/ProjectCommand.swift @@ -8,11 +8,12 @@ struct ProjectCommand: ParsableCommand { commandName: "project", abstract: "A set of commands to manage your Tuist projects.", subcommands: [ - ProjectViewCommand.self, + ProjectShowCommand.self, ProjectCreateCommand.self, ProjectListCommand.self, ProjectDeleteCommand.self, ProjectTokensCommand.self, + ProjectUpdateCommand.self, ] ) } diff --git a/Sources/TuistKit/Services/Project/ProjectShowService.swift b/Sources/TuistKit/Services/Project/ProjectShowService.swift new file mode 100644 index 00000000000..af9bf8171c2 --- /dev/null +++ b/Sources/TuistKit/Services/Project/ProjectShowService.swift @@ -0,0 +1,82 @@ +import Foundation +import Mockable +import Path +import TuistLoader +import TuistServer +import TuistSupport + +enum ProjectShowServiceError: Equatable, FatalError { + case missingFullHandle + + var type: TuistSupport.ErrorType { + switch self { + case .missingFullHandle: .abort + } + } + + var description: String { + switch self { + case .missingFullHandle: + return "We couldn't show the project because the full handle is missing. You can pass either its value or a path to a Tuist project." + } + } +} + +struct ProjectShowService { + private let opener: Opening + private let configLoader: ConfigLoading + private let serverURLService: ServerURLServicing + private let getProjectService: GetProjectServicing + + init( + opener: Opening = Opener(), + configLoader: ConfigLoading = ConfigLoader(), + serverURLService: ServerURLServicing = ServerURLService(), + getProjectService: GetProjectServicing = GetProjectService() + ) { + self.opener = opener + self.configLoader = configLoader + self.serverURLService = serverURLService + self.getProjectService = getProjectService + } + + func run( + fullHandle: String?, + web: Bool, + path: String? + ) async throws { + let path = try self.path(path) + + let config = try await configLoader.loadConfig(path: path) + guard let fullHandle = fullHandle ?? config.fullHandle else { throw ProjectShowServiceError.missingFullHandle } + + let serverURL = try serverURLService.url(configServerURL: config.url) + + if web { + var components = URLComponents(url: serverURL, resolvingAgainstBaseURL: false)! + components.path = "/\(fullHandle)" + try opener.open(url: components.url!) + } else { + let project = try await getProjectService.getProject( + fullHandle: fullHandle, + serverURL: serverURL + ) + + logger.info(""" + \("Project".bold()) + Full handle: \(fullHandle) + Default branch: \(project.defaultBranch) + """) + } + } + + // MARK: - Helpers + + private func path(_ path: String?) throws -> AbsolutePath { + if let path { + return try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) + } else { + return FileHandler.shared.currentPath + } + } +} diff --git a/Sources/TuistKit/Services/Project/ProjectUpdateService.swift b/Sources/TuistKit/Services/Project/ProjectUpdateService.swift new file mode 100644 index 00000000000..bce86bdc5fe --- /dev/null +++ b/Sources/TuistKit/Services/Project/ProjectUpdateService.swift @@ -0,0 +1,73 @@ +import Foundation +import Mockable +import Path +import TuistLoader +import TuistServer +import TuistSupport + +enum ProjectUpdateServiceError: Equatable, FatalError { + case missingFullHandle + + var type: TuistSupport.ErrorType { + switch self { + case .missingFullHandle: .abort + } + } + + var description: String { + switch self { + case .missingFullHandle: + return "We couldn't update the project because the full handle is missing. You can pass either its value or a path to a Tuist project." + } + } +} + +struct ProjectUpdateService { + private let opener: Opening + private let configLoader: ConfigLoading + private let serverURLService: ServerURLServicing + private let updateProjectService: UpdateProjectServicing + + init( + opener: Opening = Opener(), + configLoader: ConfigLoading = ConfigLoader(), + serverURLService: ServerURLServicing = ServerURLService(), + updateProjectService: UpdateProjectServicing = UpdateProjectService() + ) { + self.opener = opener + self.configLoader = configLoader + self.serverURLService = serverURLService + self.updateProjectService = updateProjectService + } + + func run( + fullHandle: String?, + defaultBranch: String?, + path: String? + ) async throws { + let path = try self.path(path) + + let config = try await configLoader.loadConfig(path: path) + guard let fullHandle = fullHandle ?? config.fullHandle else { throw ProjectUpdateServiceError.missingFullHandle } + + let serverURL = try serverURLService.url(configServerURL: config.url) + + _ = try await updateProjectService.updateProject( + fullHandle: fullHandle, + serverURL: serverURL, + defaultBranch: defaultBranch + ) + + logger.notice("The project \(fullHandle) was successfully updated 🎉", metadata: .success) + } + + // MARK: - Helpers + + private func path(_ path: String?) throws -> AbsolutePath { + if let path { + return try AbsolutePath(validating: path, relativeTo: FileHandler.shared.currentPath) + } else { + return FileHandler.shared.currentPath + } + } +} diff --git a/Sources/TuistKit/Services/Project/ProjectViewService.swift b/Sources/TuistKit/Services/Project/ProjectViewService.swift deleted file mode 100644 index 2acff7a2c45..00000000000 --- a/Sources/TuistKit/Services/Project/ProjectViewService.swift +++ /dev/null @@ -1,66 +0,0 @@ -import Foundation -import Mockable -import Path -import TuistLoader -import TuistSupport - -@Mockable -protocol ProjectViewServicing { - func run(fullHandle: String?, pathString: String?) async throws -} - -enum ProjectViewServiceError: Equatable, FatalError { - case missingFullHandle - - var type: TuistSupport.ErrorType { - switch self { - case .missingFullHandle: .abort - } - } - - var description: String { - switch self { - case .missingFullHandle: return "We couldn't view the project because the full handle is missing. You can pass either its value or a path to a Tuist project." - } - } -} - -struct ProjectViewService: ProjectViewServicing { - private let opener: Opening - private let configLoader: ConfigLoading - - init( - opener: Opening = Opener(), - configLoader: ConfigLoading = ConfigLoader() - ) { - self.opener = opener - self.configLoader = configLoader - } - - func run(fullHandle: String?, pathString: String?) async throws { - var fullHandle: String! = fullHandle - var url: URL! - var path: AbsolutePath! - - if fullHandle != nil { - url = Constants.URLs.production - } else { - if let pathString { - path = try AbsolutePath(validating: pathString, relativeTo: FileHandler.shared.currentPath) - } else { - path = FileHandler.shared.currentPath - } - let config = try await configLoader.loadConfig(path: path) - url = config.url - fullHandle = config.fullHandle - } - - if fullHandle == nil { - throw ProjectViewServiceError.missingFullHandle - } - - var components = URLComponents(url: url, resolvingAgainstBaseURL: false)! - components.path = "/\(fullHandle!)" - try opener.open(url: components.url!) - } -} diff --git a/Sources/TuistServer/Models/ServerProject.swift b/Sources/TuistServer/Models/ServerProject.swift index ab08fe7010c..5e2e3a769e6 100644 --- a/Sources/TuistServer/Models/ServerProject.swift +++ b/Sources/TuistServer/Models/ServerProject.swift @@ -5,23 +5,23 @@ public struct ServerProject: Codable { public init( id: Int, fullName: String, - token: String + defaultBranch: String ) { self.id = id self.fullName = fullName - self.token = token + self.defaultBranch = defaultBranch } public let id: Int public let fullName: String - public let token: String + public let defaultBranch: String } extension ServerProject { init(_ project: Components.Schemas.Project) { id = Int(project.id) fullName = project.full_name - token = project.token + defaultBranch = project.default_branch } } @@ -30,12 +30,12 @@ extension ServerProject { public static func test( id: Int = 0, fullName: String = "test/test", - token: String = "token" + defaultBranch: String = "main" ) -> Self { .init( id: id, fullName: fullName, - token: token + defaultBranch: defaultBranch ) } } diff --git a/Sources/TuistServer/OpenAPI/Client.swift b/Sources/TuistServer/OpenAPI/Client.swift index 9c5d2bf5006..784128cd4c1 100644 --- a/Sources/TuistServer/OpenAPI/Client.swift +++ b/Sources/TuistServer/OpenAPI/Client.swift @@ -2266,6 +2266,104 @@ public struct Client: APIProtocol { } ) } + /// Updates a project + /// + /// Updates an project with given parameters. + /// + /// - Remark: HTTP `PUT /api/projects/{account_handle}/{project_handle}`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/put(updateProject)`. + public func updateProject(_ input: Operations.updateProject.Input) async throws + -> Operations.updateProject.Output + { + try await client.send( + input: input, + forOperation: Operations.updateProject.id, + serializer: { input in + let path = try converter.renderedRequestPath( + template: "/api/projects/{}/{}", + parameters: [input.path.account_handle, input.path.project_handle] + ) + var request: OpenAPIRuntime.Request = .init(path: path, method: .put) + suppressMutabilityWarning(&request) + try converter.setHeaderFieldAsText( + in: &request.headerFields, + name: "accept", + value: "application/json" + ) + request.body = try converter.setOptionalRequestBodyAsJSON( + input.body, + headerFields: &request.headerFields, + transforming: { wrapped in + switch wrapped { + case let .json(value): + return .init( + value: value, + contentType: "application/json; charset=utf-8" + ) + } + } + ) + return request + }, + deserializer: { response in + switch response.statusCode { + case 200: + let headers: Operations.updateProject.Output.Ok.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateProject.Output.Ok.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas.Project.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .ok(.init(headers: headers, body: body)) + case 401: + let headers: Operations.updateProject.Output.Unauthorized.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateProject.Output.Unauthorized.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .unauthorized(.init(headers: headers, body: body)) + case 403: + let headers: Operations.updateProject.Output.Forbidden.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateProject.Output.Forbidden.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .forbidden(.init(headers: headers, body: body)) + case 404: + let headers: Operations.updateProject.Output.NotFound.Headers = .init() + try converter.validateContentTypeIfPresent( + in: response.headerFields, + substring: "application/json" + ) + let body: Operations.updateProject.Output.NotFound.Body = + try converter.getResponseBodyAsJSON( + Components.Schemas._Error.self, + from: response.body, + transforming: { value in .json(value) } + ) + return .notFound(.init(headers: headers, body: body)) + default: return .undocumented(statusCode: response.statusCode, .init()) + } + } + ) + } /// Cleans cache for a given project /// /// - Remark: HTTP `PUT /api/projects/{account_handle}/{project_handle}/cache/clean`. diff --git a/Sources/TuistServer/OpenAPI/Types.swift b/Sources/TuistServer/OpenAPI/Types.swift index d2ce692baed..a3a1d565d5d 100644 --- a/Sources/TuistServer/OpenAPI/Types.swift +++ b/Sources/TuistServer/OpenAPI/Types.swift @@ -187,6 +187,14 @@ public protocol APIProtocol: Sendable { /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/get(showProject)`. func showProject(_ input: Operations.showProject.Input) async throws -> Operations.showProject.Output + /// Updates a project + /// + /// Updates an project with given parameters. + /// + /// - Remark: HTTP `PUT /api/projects/{account_handle}/{project_handle}`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/put(updateProject)`. + func updateProject(_ input: Operations.updateProject.Input) async throws + -> Operations.updateProject.Output /// Cleans cache for a given project /// /// - Remark: HTTP `PUT /api/projects/{account_handle}/{project_handle}/cache/clean`. @@ -1342,6 +1350,10 @@ public enum Components { } /// - Remark: Generated from `#/components/schemas/Project`. public struct Project: Codable, Equatable, Hashable, Sendable { + /// The default branch of the project. + /// + /// - Remark: Generated from `#/components/schemas/Project/default_branch`. + public var default_branch: Swift.String /// The full name of the project (e.g. tuist/tuist) /// /// - Remark: Generated from `#/components/schemas/Project/full_name`. @@ -1357,15 +1369,23 @@ public enum Components { /// Creates a new `Project`. /// /// - Parameters: + /// - default_branch: The default branch of the project. /// - full_name: The full name of the project (e.g. tuist/tuist) /// - id: ID of the project /// - token: The token that should be used to authenticate the project. For CI only. - public init(full_name: Swift.String, id: Swift.Double, token: Swift.String) { + public init( + default_branch: Swift.String, + full_name: Swift.String, + id: Swift.Double, + token: Swift.String + ) { + self.default_branch = default_branch self.full_name = full_name self.id = id self.token = token } public enum CodingKeys: String, CodingKey { + case default_branch case full_name case id case token @@ -6666,6 +6686,218 @@ public enum Operations { case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) } } + /// Updates a project + /// + /// Updates an project with given parameters. + /// + /// - Remark: HTTP `PUT /api/projects/{account_handle}/{project_handle}`. + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/put(updateProject)`. + public enum updateProject { + public static let id: String = "updateProject" + public struct Input: Sendable, Equatable, Hashable { + public struct Path: Sendable, Equatable, Hashable { + public var account_handle: Swift.String + public var project_handle: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - account_handle: + /// - project_handle: + public init(account_handle: Swift.String, project_handle: Swift.String) { + self.account_handle = account_handle + self.project_handle = project_handle + } + } + public var path: Operations.updateProject.Input.Path + public struct Query: Sendable, Equatable, Hashable { + /// Creates a new `Query`. + public init() {} + } + public var query: Operations.updateProject.Input.Query + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + public var headers: Operations.updateProject.Input.Headers + public struct Cookies: Sendable, Equatable, Hashable { + /// Creates a new `Cookies`. + public init() {} + } + public var cookies: Operations.updateProject.Input.Cookies + @frozen public enum Body: Sendable, Equatable, Hashable { + /// Project update params + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/PUT/json`. + public struct jsonPayload: Codable, Equatable, Hashable, Sendable { + /// The default branch for the project. + /// + /// - Remark: Generated from `#/paths/api/projects/{account_handle}/{project_handle}/PUT/json/default_branch`. + public var default_branch: Swift.String? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - default_branch: The default branch for the project. + public init(default_branch: Swift.String? = nil) { + self.default_branch = default_branch + } + public enum CodingKeys: String, CodingKey { case default_branch } + } + case json(Operations.updateProject.Input.Body.jsonPayload) + } + public var body: Operations.updateProject.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + /// - cookies: + /// - body: + public init( + path: Operations.updateProject.Input.Path, + query: Operations.updateProject.Input.Query = .init(), + headers: Operations.updateProject.Input.Headers = .init(), + cookies: Operations.updateProject.Input.Cookies = .init(), + body: Operations.updateProject.Input.Body? = nil + ) { + self.path = path + self.query = query + self.headers = headers + self.cookies = cookies + self.body = body + } + } + @frozen public enum Output: Sendable, Equatable, Hashable { + public struct Ok: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateProject.Output.Ok.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas.Project) + } + /// Received HTTP response body + public var body: Operations.updateProject.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateProject.Output.Ok.Headers = .init(), + body: Operations.updateProject.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The updated project + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/put(updateProject)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.updateProject.Output.Ok) + public struct Unauthorized: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateProject.Output.Unauthorized.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateProject.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateProject.Output.Unauthorized.Headers = .init(), + body: Operations.updateProject.Output.Unauthorized.Body + ) { + self.headers = headers + self.body = body + } + } + /// You need to be authenticated to access this resource + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/put(updateProject)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.updateProject.Output.Unauthorized) + public struct Forbidden: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateProject.Output.Forbidden.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateProject.Output.Forbidden.Body + /// Creates a new `Forbidden`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateProject.Output.Forbidden.Headers = .init(), + body: Operations.updateProject.Output.Forbidden.Body + ) { + self.headers = headers + self.body = body + } + } + /// The authenticated subject is not authorized to perform this action + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/put(updateProject)/responses/403`. + /// + /// HTTP response code: `403 forbidden`. + case forbidden(Operations.updateProject.Output.Forbidden) + public struct NotFound: Sendable, Equatable, Hashable { + public struct Headers: Sendable, Equatable, Hashable { + /// Creates a new `Headers`. + public init() {} + } + /// Received HTTP response headers + public var headers: Operations.updateProject.Output.NotFound.Headers + @frozen public enum Body: Sendable, Equatable, Hashable { + case json(Components.Schemas._Error) + } + /// Received HTTP response body + public var body: Operations.updateProject.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + public init( + headers: Operations.updateProject.Output.NotFound.Headers = .init(), + body: Operations.updateProject.Output.NotFound.Body + ) { + self.headers = headers + self.body = body + } + } + /// The project with the given account and project handles was not found + /// + /// - Remark: Generated from `#/paths//api/projects/{account_handle}/{project_handle}/put(updateProject)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.updateProject.Output.NotFound) + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Int, OpenAPIRuntime.UndocumentedPayload) + } + } /// Cleans cache for a given project /// /// - Remark: HTTP `PUT /api/projects/{account_handle}/{project_handle}/cache/clean`. diff --git a/Sources/TuistServer/OpenAPI/server.yml b/Sources/TuistServer/OpenAPI/server.yml index 39601f14518..50c2868ed04 100644 --- a/Sources/TuistServer/OpenAPI/server.yml +++ b/Sources/TuistServer/OpenAPI/server.yml @@ -430,6 +430,10 @@ components: type: object Project: properties: + default_branch: + description: The default branch of the project. + example: main + type: string full_name: description: The full name of the project (e.g. tuist/tuist) type: string @@ -444,6 +448,7 @@ components: - id - full_name - token + - default_branch title: Project type: object x-struct: Elixir.TuistWeb.API.Schemas.Project @@ -1816,6 +1821,62 @@ paths: summary: Returns a project based on the handle. tags: - Projects + put: + callbacks: {} + description: Updates an project with given parameters. + operationId: updateProject + parameters: + - description: The handle of the project's account. + in: path + name: account_handle + required: true + schema: + type: string + - description: The handle of the project to update. + in: path + name: project_handle + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + properties: + default_branch: + description: The default branch for the project. + type: string + type: object + description: Project update params + required: false + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/Project' + description: The updated project + 401: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: You need to be authenticated to access this resource + 403: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The authenticated subject is not authorized to perform this action + 404: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + description: The project with the given account and project handles was not found + summary: Updates a project + tags: + - Projects /api/projects/{account_handle}/{project_handle}/cache/clean: put: callbacks: {} diff --git a/Sources/TuistServer/Services/RevokeProjectTokenService.swift b/Sources/TuistServer/Services/RevokeProjectTokenService.swift index 22e57e04402..a24bda6da4d 100644 --- a/Sources/TuistServer/Services/RevokeProjectTokenService.swift +++ b/Sources/TuistServer/Services/RevokeProjectTokenService.swift @@ -16,8 +16,8 @@ enum RevokeProjectTokenServiceError: FatalError { case unknownError(Int) case notFound(String) case forbidden(String) - case badRequest(String) case unauthorized(String) + case badRequest(String) var type: ErrorType { switch self { diff --git a/Sources/TuistServer/Services/UpdateOrganizationService.swift b/Sources/TuistServer/Services/UpdateOrganizationService.swift index 50875e58eaf..59e9cc69641 100644 --- a/Sources/TuistServer/Services/UpdateOrganizationService.swift +++ b/Sources/TuistServer/Services/UpdateOrganizationService.swift @@ -31,7 +31,7 @@ enum UpdateOrganizationServiceError: FatalError { var description: String { switch self { case let .unknownError(statusCode): - return "We could not get the organization due to an unknown Tuist response of \(statusCode)." + return "We could not update the organization due to an unknown Tuist response of \(statusCode)." case let .forbidden(message), let .notFound(message), let .badRequest(message), let .unauthorized(message): return message } diff --git a/Sources/TuistServer/Services/UpdateProjectService.swift b/Sources/TuistServer/Services/UpdateProjectService.swift new file mode 100644 index 00000000000..ec67d8f42d1 --- /dev/null +++ b/Sources/TuistServer/Services/UpdateProjectService.swift @@ -0,0 +1,102 @@ +import Foundation +import Mockable +import OpenAPIURLSession +import TuistSupport + +@Mockable +public protocol UpdateProjectServicing { + func updateProject( + fullHandle: String, + serverURL: URL, + defaultBranch: String? + ) async throws -> ServerProject +} + +enum UpdateProjectServiceError: FatalError { + case unknownError(Int) + case notFound(String) + case forbidden(String) + case unauthorized(String) + + var type: ErrorType { + switch self { + case .unknownError: + return .bug + case .forbidden, .notFound, .unauthorized: + return .abort + } + } + + var description: String { + switch self { + case let .unknownError(statusCode): + return "We could not update the project due to an unknown Tuist response of \(statusCode)." + case let .forbidden(message), let .notFound(message), let .unauthorized(message): + return message + } + } +} + +public final class UpdateProjectService: UpdateProjectServicing { + private let fullHandleService: FullHandleServicing + + public convenience init() { + self.init( + fullHandleService: FullHandleService() + ) + } + + init( + fullHandleService: FullHandleServicing + ) { + self.fullHandleService = fullHandleService + } + + public func updateProject( + fullHandle: String, + serverURL: URL, + defaultBranch: String? + ) async throws -> ServerProject { + let client = Client.authenticated(serverURL: serverURL) + + let handles = try fullHandleService.parse(fullHandle) + + let response = try await client.updateProject( + .init( + path: .init( + account_handle: handles.accountHandle, + project_handle: handles.projectHandle + ), + body: .json( + .init( + default_branch: defaultBranch + ) + ) + ) + ) + switch response { + case let .ok(okResponse): + switch okResponse.body { + case let .json(project): + return ServerProject(project) + } + case let .notFound(notFound): + switch notFound.body { + case let .json(error): + throw UpdateProjectServiceError.notFound(error.message) + } + case let .forbidden(forbidden): + switch forbidden.body { + case let .json(error): + throw UpdateProjectServiceError.forbidden(error.message) + } + case let .unauthorized(unauthorized): + switch unauthorized.body { + case let .json(error): + throw UpdateProjectServiceError.unauthorized(error.message) + } + case let .undocumented(statusCode: statusCode, _): + throw UpdateProjectServiceError.unknownError(statusCode) + } + } +} diff --git a/Sources/TuistSupportTesting/Utils/MockOpener.swift b/Sources/TuistSupportTesting/Utils/MockOpener.swift deleted file mode 100644 index 9ccea892f3d..00000000000 --- a/Sources/TuistSupportTesting/Utils/MockOpener.swift +++ /dev/null @@ -1,41 +0,0 @@ -import Foundation -import Path -import TuistSupport - -// swiftlint:disable large_tuple - -public final class MockOpener: Opening { - var openStub: Error? - var openArgs: [(String, Bool, AbsolutePath?)] = [] - var openCallCount: UInt = 0 - - public func open(target: String, wait: Bool) throws { - openCallCount += 1 - openArgs.append((target, wait, nil)) - if let openStub { throw openStub } - } - - public func open(path: AbsolutePath, wait: Bool) throws { - try open(target: path.pathString, wait: wait) - } - - public func open(path: AbsolutePath) throws { - try open(target: path.pathString, wait: false) - } - - public func open(url: URL) throws { - try open(target: url.absoluteString, wait: false) - } - - public func open(path: AbsolutePath, application: AbsolutePath) throws { - try open(path: path, application: application, wait: true) - } - - public func open(path: AbsolutePath, application: AbsolutePath, wait _: Bool) throws { - openCallCount += 1 - openArgs.append((path.pathString, false, application)) - if let openStub { throw openStub } - } -} - -// swiftlint:enable large_tuple diff --git a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift b/Tests/TuistKitAcceptanceTests/ProjectAcceptanceTests.swift similarity index 59% rename from Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift rename to Tests/TuistKitAcceptanceTests/ProjectAcceptanceTests.swift index e8e8f03e7fe..77b3f9db73c 100644 --- a/Tests/TuistKitAcceptanceTests/ServerAcceptanceTests.swift +++ b/Tests/TuistKitAcceptanceTests/ProjectAcceptanceTests.swift @@ -7,7 +7,7 @@ import XCTest @testable import TuistKit @testable import TuistServer -final class ServerAcceptanceTestProjects: ServerAcceptanceTestCase { +final class ProjectAcceptanceTestProjects: ServerAcceptanceTestCase { func test_list_project() async throws { try await setUpFixture(.iosAppWithFrameworks) try await run(ProjectListCommand.self) @@ -16,7 +16,7 @@ final class ServerAcceptanceTestProjects: ServerAcceptanceTestCase { } } -final class ServerAcceptanceTestProjectTokens: ServerAcceptanceTestCase { +final class ProjectAcceptanceTestProjectTokens: ServerAcceptanceTestCase { func test_create_list_and_revoke_project_token() async throws { try await setUpFixture(.iosAppWithFrameworks) try await run(ProjectTokensCreateCommand.self, fullHandle) @@ -38,14 +38,24 @@ final class ServerAcceptanceTestProjectTokens: ServerAcceptanceTestCase { } } -extension ServerAcceptanceTestCase { - private func shareLink() throws -> String { - try XCTUnwrap( - TestingLogHandler.collected[.notice, >=] - .components(separatedBy: .newlines) - .first(where: { $0.contains("App uploaded – share") })? - .components(separatedBy: .whitespaces) - .last +final class ProjectAcceptanceTestProjectDefaultBranch: ServerAcceptanceTestCase { + func test_update_default_branch() async throws { + try await setUpFixture(.iosAppWithFrameworks) + try await run(ProjectShowCommand.self, fullHandle) + XCTAssertStandardOutput( + pattern: """ + Full handle: \(fullHandle) + Default branch: main + """ + ) + try await run(ProjectUpdateCommand.self, fullHandle, "--default-branch", "new-default-branch") + TestingLogHandler.reset() + try await run(ProjectShowCommand.self, fullHandle) + XCTAssertStandardOutput( + pattern: """ + Full handle: \(fullHandle) + Default branch: new-default-branch + """ ) } } diff --git a/Tests/TuistKitTests/Services/EditServiceTests.swift b/Tests/TuistKitTests/Services/EditServiceTests.swift index 5054fbb2af9..19ef5c13433 100644 --- a/Tests/TuistKitTests/Services/EditServiceTests.swift +++ b/Tests/TuistKitTests/Services/EditServiceTests.swift @@ -2,6 +2,7 @@ import MockableTest import Path import TuistCore import TuistLoader +import TuistSupport import XcodeGraph import XcodeProj import XCTest @@ -13,7 +14,7 @@ import XCTest final class EditServiceTests: XCTestCase { var subject: EditService! - var opener: MockOpener! + var opener: MockOpening! var configLoader: MockConfigLoading! var pluginService: MockPluginService! var cacheDirectoriesProvider: MockCacheDirectoriesProviding! @@ -22,7 +23,7 @@ final class EditServiceTests: XCTestCase { override func setUpWithError() throws { super.setUp() - opener = MockOpener() + opener = MockOpening() configLoader = MockConfigLoading() pluginService = MockPluginService() @@ -54,6 +55,7 @@ final class EditServiceTests: XCTestCase { } func test_edit_uses_caches_directory() async throws { + // Given let path: AbsolutePath = "/private/tmp" let cacheDirectory = try cacheDirectoriesProvider.cacheDirectory(for: .editProjects) let projectDirectory = cacheDirectory.appending(component: path.pathString.md5) @@ -62,15 +64,25 @@ final class EditServiceTests: XCTestCase { .edit(at: .any, in: .any, onlyCurrentDirectory: .any, plugins: .any) .willReturn(projectDirectory) + given(opener) + .open(path: .any, application: .any, wait: .any) + .willReturn() + + // When try await subject.run( path: path.pathString, permanent: false, onlyCurrentDirectory: false ) - let openArgs = try XCTUnwrap(opener.openArgs.first) - XCTAssertEqual(opener.openCallCount, 1) - XCTAssertEqual(openArgs.0, projectDirectory.pathString) + // Then + verify(opener) + .open( + path: .value(projectDirectory), + application: .any, + wait: .value(false) + ) + .called(1) verify(projectEditor) .edit(at: .value(path), in: .value(projectDirectory), onlyCurrentDirectory: .value(false), plugins: .any) @@ -78,6 +90,7 @@ final class EditServiceTests: XCTestCase { } func test_edit_permanent_does_not_open_workspace() async throws { + // Given let path: AbsolutePath = "/private/tmp" let cacheDirectory = try cacheDirectoriesProvider.cacheDirectory(for: .editProjects) let projectDirectory = cacheDirectory.appending(component: path.pathString.md5) @@ -86,13 +99,21 @@ final class EditServiceTests: XCTestCase { .edit(at: .any, in: .any, onlyCurrentDirectory: .any, plugins: .any) .willReturn(projectDirectory) + // When try await subject.run( path: path.pathString, permanent: true, onlyCurrentDirectory: true ) - XCTAssertEqual(opener.openCallCount, 0) + // Then + verify(opener) + .open( + path: .any, + application: .any, + wait: .any + ) + .called(0) verify(projectEditor) .edit(at: .value(path), in: .value(path), onlyCurrentDirectory: .value(true), plugins: .any) diff --git a/Tests/TuistKitTests/Services/GenerateServiceTests.swift b/Tests/TuistKitTests/Services/GenerateServiceTests.swift index 79dc4327cce..d1994374b6a 100644 --- a/Tests/TuistKitTests/Services/GenerateServiceTests.swift +++ b/Tests/TuistKitTests/Services/GenerateServiceTests.swift @@ -4,6 +4,7 @@ import Path import TuistCore import TuistLoader import TuistServer +import TuistSupport import XcodeGraph import XcodeProj import XCTest @@ -14,7 +15,7 @@ import XCTest final class GenerateServiceTests: TuistUnitTestCase { private var subject: GenerateService! - private var opener: MockOpener! + private var opener: MockOpening! private var generator: MockGenerating! private var generatorFactory: MockGeneratorFactorying! private var cacheStorageFactory: MockCacheStorageFactorying! @@ -22,7 +23,7 @@ final class GenerateServiceTests: TuistUnitTestCase { override func setUp() { super.setUp() - opener = MockOpener() + opener = .init() generator = .init() generatorFactory = .init() given(generatorFactory) @@ -50,10 +51,10 @@ final class GenerateServiceTests: TuistUnitTestCase { override func tearDown() { opener = nil generator = nil - subject = nil generatorFactory = nil cacheStorageFactory = nil clock = nil + subject = nil super.tearDown() } @@ -79,12 +80,18 @@ final class GenerateServiceTests: TuistUnitTestCase { } func test_run() async throws { + // Given let workspacePath = try AbsolutePath(validating: "/test.xcworkspace") given(generator) .generate(path: .any) .willReturn(workspacePath) + given(opener) + .open(path: .any) + .willReturn() + + // When try await subject.run( path: nil, sources: [], @@ -93,13 +100,20 @@ final class GenerateServiceTests: TuistUnitTestCase { ignoreBinaryCache: false ) - XCTAssertEqual(opener.openArgs.last?.0, workspacePath.pathString) + // Then + verify(opener) + .open(path: .value(workspacePath)) + .called(1) } func test_run_timeIsPrinted() async throws { // Given let workspacePath = try AbsolutePath(validating: "/test.xcworkspace") + given(opener) + .open(path: .any) + .willReturn() + given(generator) .generate(path: .any) .willReturn(workspacePath) diff --git a/Tests/TuistKitTests/Services/Organization/OrganizationUpdateSSOService.swift b/Tests/TuistKitTests/Services/Organization/OrganizationUpdateSSOServiceTests.swift similarity index 100% rename from Tests/TuistKitTests/Services/Organization/OrganizationUpdateSSOService.swift rename to Tests/TuistKitTests/Services/Organization/OrganizationUpdateSSOServiceTests.swift diff --git a/Tests/TuistKitTests/Services/Project/ProjectShowServiceTests.swift b/Tests/TuistKitTests/Services/Project/ProjectShowServiceTests.swift new file mode 100644 index 00000000000..659a6f66423 --- /dev/null +++ b/Tests/TuistKitTests/Services/Project/ProjectShowServiceTests.swift @@ -0,0 +1,154 @@ +import Foundation +import MockableTest +import TuistCore +import TuistLoader +import TuistServer +import TuistSupport +import TuistSupportTesting +import XCTest + +@testable import TuistKit + +final class ProjectShowServiceTests: TuistUnitTestCase { + private var opener: MockOpening! + private var configLoader: MockConfigLoading! + private var serverURLService: MockServerURLServicing! + private var getProjectService: MockGetProjectServicing! + private var subject: ProjectShowService! + + override func setUp() { + super.setUp() + opener = MockOpening() + configLoader = MockConfigLoading() + serverURLService = MockServerURLServicing() + getProjectService = MockGetProjectServicing() + subject = ProjectShowService( + opener: opener, + configLoader: configLoader, + serverURLService: serverURLService, + getProjectService: getProjectService + ) + + given(serverURLService) + .url(configServerURL: .any) + .willReturn(Constants.URLs.production) + } + + override func tearDown() { + opener = nil + configLoader = nil + serverURLService = nil + getProjectService = nil + subject = nil + super.tearDown() + } + + func test_run_with_web_when_theFullHandleIsProvided() async throws { + // Given + var expectedURLComponents = URLComponents(url: Constants.URLs.production, resolvingAgainstBaseURL: false)! + expectedURLComponents.path = "/tuist/tuist" + given(opener).open(url: .value(expectedURLComponents.url!)).willReturn() + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test()) + + // When + try await subject.run(fullHandle: "tuist/tuist", web: true, path: nil) + + // Then + verify(opener).open(url: .value(expectedURLComponents.url!)).called(1) + } + + func test_run_with_web_when_theFullHandleIsNotProvided_and_aConfigWithFullHandleCanBeLoaded() async throws { + // Given + let path = try temporaryPath() + var expectedURLComponents = URLComponents(url: Constants.URLs.production, resolvingAgainstBaseURL: false)! + expectedURLComponents.path = "/tuist/tuist" + let config = Config.test(fullHandle: "tuist/tuist") + given(configLoader).loadConfig(path: .value(path)).willReturn(config) + given(opener).open(url: .any).willReturn() + + // When + try await subject.run(fullHandle: nil, web: true, path: path.pathString) + + // Then + verify(opener).open(url: .value(expectedURLComponents.url!)).called(1) + } + + func test_run_with_web_when_theFullHandleIsNotProvided_and_aConfigWithoutFullHandleCanBeLoaded() async throws { + // Given + let path = try temporaryPath() + var expectedURLComponents = URLComponents(url: Constants.URLs.production, resolvingAgainstBaseURL: false)! + expectedURLComponents.path = "/tuist/tuist" + given(opener).open(url: .value(expectedURLComponents.url!)).willReturn() + let config = Config.test(fullHandle: nil) + given(configLoader).loadConfig(path: .value(path)).willReturn(config) + + // When/Then + await XCTAssertThrowsSpecific({ + try await subject.run(fullHandle: nil, web: false, path: path.pathString) + }, ProjectShowServiceError.missingFullHandle) + } + + func test_run_when_full_handle_is_provided() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test()) + given(getProjectService) + .getProject( + fullHandle: .value("tuist/tuist"), + serverURL: .any + ) + .willReturn( + .test( + fullName: "tuist/tuist", + defaultBranch: "main" + ) + ) + + // When + try await subject.run(fullHandle: "tuist/tuist", web: false, path: nil) + + // Then + XCTAssertStandardOutput( + pattern: """ + Full handle: tuist/tuist + Default branch: main + """ + ) + } + + func test_run_when_full_handle_is_not_provided() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn( + .test( + fullHandle: "tuist/tuist" + ) + ) + given(getProjectService) + .getProject( + fullHandle: .value("tuist/tuist"), + serverURL: .any + ) + .willReturn( + .test( + fullName: "tuist/tuist", + defaultBranch: "main" + ) + ) + + // When + try await subject.run(fullHandle: nil, web: false, path: nil) + + // Then + XCTAssertStandardOutput( + pattern: """ + Full handle: tuist/tuist + Default branch: main + """ + ) + } +} diff --git a/Tests/TuistKitTests/Services/Project/ProjectUpdateServiceTests.swift b/Tests/TuistKitTests/Services/Project/ProjectUpdateServiceTests.swift new file mode 100644 index 00000000000..dbab543e23f --- /dev/null +++ b/Tests/TuistKitTests/Services/Project/ProjectUpdateServiceTests.swift @@ -0,0 +1,126 @@ +import Foundation +import MockableTest +import TuistLoader +import TuistServer +import TuistSupport +import TuistSupportTesting + +@testable import TuistKit + +final class ProjectUpdateServiceTests: TuistUnitTestCase { + private var opener: MockOpening! + private var configLoader: MockConfigLoading! + private var serverURLService: MockServerURLServicing! + private var updateProjectService: MockUpdateProjectServicing! + private var subject: ProjectUpdateService! + + override func setUp() async throws { + try await super.setUp() + + opener = MockOpening() + configLoader = MockConfigLoading() + serverURLService = MockServerURLServicing() + updateProjectService = MockUpdateProjectServicing() + subject = ProjectUpdateService( + opener: opener, + configLoader: configLoader, + serverURLService: serverURLService, + updateProjectService: updateProjectService + ) + + given(serverURLService) + .url(configServerURL: .any) + .willReturn(Constants.URLs.production) + } + + override func tearDown() { + opener = nil + configLoader = nil + serverURLService = nil + updateProjectService = nil + subject = nil + super.tearDown() + } + + func test_run_when_full_handle_is_not_provided() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn( + .test( + fullHandle: "tuist/tuist" + ) + ) + given(updateProjectService) + .updateProject( + fullHandle: .any, + serverURL: .any, + defaultBranch: .any + ) + .willReturn(.test()) + + // When + try await subject.run(fullHandle: nil, defaultBranch: "new-default-branch", path: nil) + + // Then + verify(updateProjectService) + .updateProject( + fullHandle: .value("tuist/tuist"), + serverURL: .any, + defaultBranch: .value("new-default-branch") + ) + .called(1) + XCTAssertStandardOutput(pattern: "The project tuist/tuist was successfully updated 🎉") + } + + func test_run_when_full_handle_is_not_provided_and_is_not_in_config() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn( + .test( + fullHandle: nil + ) + ) + given(updateProjectService) + .updateProject( + fullHandle: .any, + serverURL: .any, + defaultBranch: .any + ) + .willReturn(.test()) + + // When / Then + await XCTAssertThrowsSpecific( + try await subject.run(fullHandle: nil, defaultBranch: "new-default-branch", path: nil), + ProjectUpdateServiceError.missingFullHandle + ) + } + + func test_run_when_full_handle_is_provided() async throws { + // Given + given(configLoader) + .loadConfig(path: .any) + .willReturn(.test()) + given(updateProjectService) + .updateProject( + fullHandle: .any, + serverURL: .any, + defaultBranch: .any + ) + .willReturn(.test()) + + // When + try await subject.run(fullHandle: "tuist/tuist", defaultBranch: "new-default-branch", path: nil) + + // Then + verify(updateProjectService) + .updateProject( + fullHandle: .value("tuist/tuist"), + serverURL: .any, + defaultBranch: .value("new-default-branch") + ) + .called(1) + XCTAssertStandardOutput(pattern: "The project tuist/tuist was successfully updated 🎉") + } +} diff --git a/Tests/TuistKitTests/Services/Project/ProjectViewServiceTests.swift b/Tests/TuistKitTests/Services/Project/ProjectViewServiceTests.swift deleted file mode 100644 index 070c0226744..00000000000 --- a/Tests/TuistKitTests/Services/Project/ProjectViewServiceTests.swift +++ /dev/null @@ -1,73 +0,0 @@ -import Foundation -import MockableTest -import TuistCore -import TuistLoader -import TuistSupport -import TuistSupportTesting -import XCTest - -@testable import TuistKit - -final class ProjectViewServiceTests: TuistUnitTestCase { - var opener: MockOpening! - var configLoader: MockConfigLoading! - var subject: ProjectViewService! - - override func setUp() { - super.setUp() - opener = MockOpening() - configLoader = MockConfigLoading() - subject = ProjectViewService(opener: opener, configLoader: configLoader) - } - - override func tearDown() { - opener = nil - configLoader = nil - subject = nil - super.tearDown() - } - - func test_run_when_theFullHandleIsProvided() async throws { - // Given - var expectedURLComponents = URLComponents(url: Constants.URLs.production, resolvingAgainstBaseURL: false)! - expectedURLComponents.path = "/tuist/tuist" - given(opener).open(url: .value(expectedURLComponents.url!)).willReturn() - - // When - try await subject.run(fullHandle: "tuist/tuist", pathString: nil) - - // Then - verify(opener).open(url: .value(expectedURLComponents.url!)).called(1) - } - - func test_run_when_theFullHandleIsNotProvided_and_aConfigWithFullHandleCanBeLoaded() async throws { - // Given - let path = try temporaryPath() - var expectedURLComponents = URLComponents(url: Constants.URLs.production, resolvingAgainstBaseURL: false)! - expectedURLComponents.path = "/tuist/tuist" - let config = Config.test(fullHandle: "tuist/tuist") - given(configLoader).loadConfig(path: .value(path)).willReturn(config) - given(opener).open(url: .value(expectedURLComponents.url!)).willReturn() - - // When - try await subject.run(fullHandle: nil, pathString: path.pathString) - - // Then - verify(opener).open(url: .value(expectedURLComponents.url!)).called(1) - } - - func test_run_when_theFullHandleIsNotProvided_and_aConfigWithoutFullHandleCanBeLoaded() async throws { - // Given - let path = try temporaryPath() - var expectedURLComponents = URLComponents(url: Constants.URLs.production, resolvingAgainstBaseURL: false)! - expectedURLComponents.path = "/tuist/tuist" - given(opener).open(url: .value(expectedURLComponents.url!)).willReturn() - let config = Config.test(fullHandle: nil) - given(configLoader).loadConfig(path: .value(path)).willReturn(config) - - // When/Then - await XCTAssertThrowsSpecific({ - try await subject.run(fullHandle: nil, pathString: path.pathString) - }, ProjectViewServiceError.missingFullHandle) - } -} diff --git a/Tests/TuistServerTests/Session/ServerSessionControllerTests.swift b/Tests/TuistServerTests/Session/ServerSessionControllerTests.swift index afb32e6e168..e1532221986 100644 --- a/Tests/TuistServerTests/Session/ServerSessionControllerTests.swift +++ b/Tests/TuistServerTests/Session/ServerSessionControllerTests.swift @@ -11,7 +11,7 @@ import XCTest final class ServerSessionControllerTests: TuistUnitTestCase { private var credentialsStore: MockServerCredentialsStoring! private var ciChecker: MockCIChecking! - private var opener: MockOpener! + private var opener: MockOpening! private var serverURL: URL! private var getAuthTokenService: MockGetAuthTokenServicing! private var uniqueIDGenerator: MockUniqueIDGenerating! @@ -22,7 +22,7 @@ final class ServerSessionControllerTests: TuistUnitTestCase { super.setUp() credentialsStore = .init() ciChecker = .init() - opener = MockOpener() + opener = MockOpening() serverURL = URL.test() getAuthTokenService = MockGetAuthTokenServicing() uniqueIDGenerator = MockUniqueIDGenerating() @@ -35,6 +35,10 @@ final class ServerSessionControllerTests: TuistUnitTestCase { uniqueIDGenerator: uniqueIDGenerator, serverAuthenticationController: serverAuthenticationController ) + + given(opener) + .open(url: .any) + .willReturn() } override func tearDown() { From 0154cf961d8a409b247dd8c361f0cc94549d7ffc Mon Sep 17 00:00:00 2001 From: Gorbenko Roman <45801227+rofle100lvl@users.noreply.github.com> Date: Thu, 8 Aug 2024 10:31:00 +0200 Subject: [PATCH 493/509] Removed implicit dependencies in Tuist project (#6603) * Removed implicit dependencies * Swift lint --- Tuist/ProjectDescriptionHelpers/Module.swift | 139 ++++++++++++++++++- 1 file changed, 135 insertions(+), 4 deletions(-) diff --git a/Tuist/ProjectDescriptionHelpers/Module.swift b/Tuist/ProjectDescriptionHelpers/Module.swift index d2a46c15b5f..34d7e067159 100644 --- a/Tuist/ProjectDescriptionHelpers/Module.swift +++ b/Tuist/ProjectDescriptionHelpers/Module.swift @@ -174,10 +174,36 @@ public enum Module: String, CaseIterable { public var acceptanceTestDependencies: [TargetDependency] { let dependencies: [TargetDependency] = switch self { - case .kit, .automation, .dependencies, .generator: + case .generator: [ + .target(name: Module.support.targetName), .target(name: Module.acceptanceTesting.targetName), .target(name: Module.support.testingTargetName!), + .external(name: "XcodeProj"), + ] + case .automation: + [ + .target(name: Module.acceptanceTesting.targetName), + .target(name: Module.support.testingTargetName!), + .target(name: Module.kit.targetName), + .target(name: Module.support.targetName), + ] + case .dependencies: + [ + .target(name: Module.acceptanceTesting.targetName), + .target(name: Module.support.testingTargetName!), + .target(name: Module.support.targetName), + .external(name: "XcodeProj"), + ] + case .kit: + [ + .target(name: Module.acceptanceTesting.targetName), + .target(name: Module.support.testingTargetName!), + .target(name: Module.kit.targetName), + .target(name: Module.support.targetName), + .target(name: Module.server.targetName), + .target(name: Module.core.targetName), + .external(name: "XcodeProj"), ] default: [] @@ -200,14 +226,18 @@ public enum Module: String, CaseIterable { var dependencies: [TargetDependency] = switch self { case .acceptanceTesting: [ + .target(name: Module.projectDescription.targetName), .target(name: Module.kit.targetName), .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), .target(name: Module.core.targetName), .external(name: "XcodeProj"), + .external(name: "XcodeGraph"), ] case .tuist: [ + .target(name: Module.support.targetName), + .target(name: Module.loader.targetName), .target(name: Module.kit.targetName), .target(name: Module.projectDescription.targetName), .target(name: Module.automation.targetName), @@ -241,6 +271,8 @@ public enum Module: String, CaseIterable { ] case .kit: [ + .target(name: Module.core.targetName), + .target(name: Module.hasher.targetName), .target(name: Module.support.targetName), .target(name: Module.generator.targetName), .target(name: Module.automation.targetName), @@ -270,6 +302,7 @@ public enum Module: String, CaseIterable { .external(name: "XcodeGraph"), .external(name: "XcodeProj"), .external(name: "SwiftToolsSupport"), + .external(name: "AnyCodable"), ] case .generator: [ @@ -299,6 +332,7 @@ public enum Module: String, CaseIterable { .target(name: Module.support.targetName), .target(name: Module.projectDescription.targetName), .external(name: "XcodeGraph"), + .external(name: "FileSystem"), .external(name: "XcodeProj"), .external(name: "SwiftToolsSupport"), ] @@ -361,6 +395,7 @@ public enum Module: String, CaseIterable { .external(name: "FileSystem"), .external(name: "OpenAPIRuntime"), .external(name: "OpenAPIURLSession"), + .external(name: "XcodeGraph"), ] case .hasher: [ @@ -384,8 +419,17 @@ public enum Module: String, CaseIterable { public var unitTestDependencies: [TargetDependency] { var dependencies: [TargetDependency] = switch self { - case .tuist, .tuistBenchmark, .tuistFixtureGenerator, .support, .acceptanceTesting: + case .tuist, .tuistBenchmark, .acceptanceTesting: [] + case .tuistFixtureGenerator: + [ + .target(name: Module.projectDescription.targetName), + ] + case .support: + [ + .target(name: Module.core.targetName), + .external(name: "XcodeGraph"), + ] case .projectDescription: [ .target(name: Module.support.testingTargetName!), @@ -395,7 +439,15 @@ public enum Module: String, CaseIterable { [] case .kit: [ + .target(name: Module.support.targetName), .target(name: Module.automation.targetName), + .target(name: Module.cache.targetName), + .target(name: Module.server.targetName), + .target(name: Module.scaffold.targetName), + .target(name: Module.analytics.targetName), + .target(name: Module.loader.targetName), + .target(name: Module.core.targetName), + .target(name: Module.generator.targetName), .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), .target(name: Module.projectDescription.targetName), @@ -411,31 +463,51 @@ public enum Module: String, CaseIterable { .external(name: "ArgumentParser"), .external(name: "GraphViz"), .external(name: "AnyCodable"), + .external(name: "Difference"), + .external(name: "XcodeProj"), + .external(name: "FileSystem"), + .external(name: "Mockable"), + .external(name: "XcodeGraph"), ] case .core: [ .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), + .external(name: "XcodeGraph"), ] case .generator: [ + .external(name: "PathKit"), + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), .target(name: Module.core.testingTargetName!), .target(name: Module.support.testingTargetName!), .external(name: "XcodeProj"), .external(name: "GraphViz"), + .external(name: "XcodeGraph"), ] case .scaffold: [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), ] case .loader: [ + .target(name: Module.projectDescription.targetName), + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), + .external(name: "Mockable"), + .external(name: "FileSystem"), + .external(name: "XcodeGraph"), ] case .asyncQueue: [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), .external(name: "Queuer"), @@ -444,11 +516,14 @@ public enum Module: String, CaseIterable { [ .target(name: Module.projectDescription.targetName), .target(name: Module.loader.targetName), + .target(name: Module.core.targetName), + .target(name: Module.scaffold.targetName), .target(name: Module.loader.testingTargetName!), .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), .target(name: Module.scaffold.testingTargetName!), .target(name: Module.core.testingTargetName!), + .external(name: "XcodeGraph"), ] case .analytics: [ @@ -462,27 +537,46 @@ public enum Module: String, CaseIterable { ] case .dependencies: [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), .target(name: Module.core.testingTargetName!), .target(name: Module.loader.testingTargetName!), .target(name: Module.support.testingTargetName!), + .external(name: "XcodeGraph"), ] case .automation: [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), + .external(name: "XcodeGraph"), + .external(name: "FileSystem"), ] case .server: [ + .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), + .external(name: "Mockable"), + .external(name: "XcodeGraph"), + .external(name: "OpenAPIRuntime"), ] case .hasher: [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), + .external(name: "XcodeGraph"), ] case .cache: [ + .target(name: Module.core.targetName), + .target(name: Module.hasher.targetName), .target(name: Module.support.testingTargetName!), + .target(name: Module.support.targetName), + .external(name: "Mockable"), + .external(name: "XcodeGraph"), ] } dependencies = dependencies + sharedDependencies + [.target(name: targetName), .external(name: "MockableTest")] @@ -494,17 +588,23 @@ public enum Module: String, CaseIterable { public var testingDependencies: [TargetDependency] { let dependencies: [TargetDependency] = switch self { - case .tuist, .projectAutomation, .projectDescription, .acceptanceTesting, .server, .hasher, .asyncQueue, .analytics, + case .tuist, .projectAutomation, .projectDescription, .acceptanceTesting, .server, .hasher, .analytics, .migration, .tuistFixtureGenerator, .cache: [] + case .asyncQueue: + [ + .target(name: Module.core.targetName), + ] case .tuistBenchmark: [ .external(name: "ArgumentParser"), ] case .support: [ + .target(name: Module.projectDescription.targetName), .target(name: Module.core.targetName), .external(name: "XcodeGraph"), + .external(name: "Difference"), ] case .kit: [] @@ -512,20 +612,26 @@ public enum Module: String, CaseIterable { [ .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), + .target(name: Module.projectDescription.targetName), .external(name: "XcodeGraph"), ] case .generator: [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), .target(name: Module.core.testingTargetName!), .target(name: Module.support.testingTargetName!), .external(name: "XcodeProj"), + .external(name: "XcodeGraph"), ] case .scaffold: [ + .target(name: Module.core.targetName), .external(name: "XcodeGraph"), ] case .loader: [ + .target(name: Module.support.targetName), .target(name: Module.core.targetName), .target(name: Module.projectDescription.targetName), .target(name: Module.support.testingTargetName!), @@ -533,6 +639,7 @@ public enum Module: String, CaseIterable { ] case .plugin: [ + .target(name: Module.core.targetName), .external(name: "XcodeGraph"), ] case .dependencies: @@ -545,6 +652,7 @@ public enum Module: String, CaseIterable { .target(name: Module.core.testingTargetName!), .target(name: Module.projectDescription.targetName), .target(name: Module.support.testingTargetName!), + .external(name: "XcodeGraph"), ] } return dependencies + sharedDependencies + [.target(name: targetName)] @@ -553,8 +661,16 @@ public enum Module: String, CaseIterable { public var integrationTestsDependencies: [TargetDependency] { var dependencies: [TargetDependency] = switch self { case .tuistBenchmark, .tuistFixtureGenerator, .support, .projectAutomation, .projectDescription, .acceptanceTesting, - .asyncQueue, .plugin, .analytics, .dependencies, .server, .hasher, .cache: + .asyncQueue, .plugin, .analytics, .dependencies, .server, .hasher: [] + case .cache: + [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), + .target(name: Module.support.testingTargetName!), + .target(name: Module.hasher.targetName), + .external(name: "XcodeGraph"), + ] case .tuist: [ .target(name: Module.generator.targetName), @@ -567,40 +683,55 @@ public enum Module: String, CaseIterable { ] case .kit: [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), + .target(name: Module.loader.targetName), .target(name: Module.core.testingTargetName!), .target(name: Module.support.testingTargetName!), .target(name: Module.projectDescription.targetName), .target(name: Module.automation.targetName), .target(name: Module.loader.testingTargetName!), .external(name: "XcodeProj"), + .external(name: "XcodeGraph"), ] case .core: [ + .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), ] case .generator: [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), .target(name: Module.loader.testingTargetName!), .target(name: Module.core.testingTargetName!), .target(name: Module.support.testingTargetName!), .external(name: "XcodeProj"), + .external(name: "XcodeGraph"), ] case .scaffold: [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), ] case .loader: [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), .target(name: Module.projectDescription.targetName), ] case .migration: [ + .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), .target(name: Module.core.testingTargetName!), ] case .automation: [ + .target(name: Module.core.targetName), + .target(name: Module.support.targetName), .target(name: Module.support.testingTargetName!), ] } From 8934be6aef156c0cce94a82c1faafcfe729e5955 Mon Sep 17 00:00:00 2001 From: Eddie Hillenbrand Date: Thu, 8 Aug 2024 03:09:09 -0700 Subject: [PATCH 494/509] An XCFrameworks may use .dylib libraries (#6133) Tuist should not error when an XCFramework contains .dylib libraries --- .../MetadataProviders/XCFrameworkMetadataProvider.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistCore/MetadataProviders/XCFrameworkMetadataProvider.swift b/Sources/TuistCore/MetadataProviders/XCFrameworkMetadataProvider.swift index e2836f3fc49..13674377299 100644 --- a/Sources/TuistCore/MetadataProviders/XCFrameworkMetadataProvider.swift +++ b/Sources/TuistCore/MetadataProviders/XCFrameworkMetadataProvider.swift @@ -141,7 +141,7 @@ public final class XCFrameworkMetadataProvider: PrecompiledMetadataProvider, XCF binaryPath = try AbsolutePath(validating: library.identifier, relativeTo: xcframeworkPath) .appending(try RelativePath(validating: library.path.pathString)) .appending(component: library.path.basenameWithoutExt) - case "a": + case "a", "dylib": binaryPath = try AbsolutePath(validating: library.identifier, relativeTo: xcframeworkPath) .appending(try RelativePath(validating: library.path.pathString)) default: From 6e04725d07f36becba313fb56148497d94dd3cb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era=20Buend=C3=ADa?= <663605+pepicrft@users.noreply.github.com> Date: Thu, 8 Aug 2024 13:38:27 +0200 Subject: [PATCH 495/509] chore: Test the support for .dylib libraries in XCFrameworks (#6617) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Test the support for .dylib libraries in XCFrameworks Related to #6133 * Update Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift Co-authored-by: Marek Fořt * Fix linting issue --------- Co-authored-by: Marek Fořt --- .../DylibXCFramework.xcframework/Info.plist | 27 ++++++++++++++++++ .../macos-arm64/libDylibXCFramework.dylib | Bin 0 -> 69312 bytes .../XCFrameworkMetadataProviderTests.swift | 17 +++++++++++ 3 files changed, 44 insertions(+) create mode 100644 Tests/Fixtures/DylibXCFramework.xcframework/Info.plist create mode 100755 Tests/Fixtures/DylibXCFramework.xcframework/macos-arm64/libDylibXCFramework.dylib diff --git a/Tests/Fixtures/DylibXCFramework.xcframework/Info.plist b/Tests/Fixtures/DylibXCFramework.xcframework/Info.plist new file mode 100644 index 00000000000..85324f93ff8 --- /dev/null +++ b/Tests/Fixtures/DylibXCFramework.xcframework/Info.plist @@ -0,0 +1,27 @@ + + + + + AvailableLibraries + + + BinaryPath + libDylibXCFramework.dylib + LibraryIdentifier + macos-arm64 + LibraryPath + libDylibXCFramework.dylib + SupportedArchitectures + + arm64 + + SupportedPlatform + macos + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/Tests/Fixtures/DylibXCFramework.xcframework/macos-arm64/libDylibXCFramework.dylib b/Tests/Fixtures/DylibXCFramework.xcframework/macos-arm64/libDylibXCFramework.dylib new file mode 100755 index 0000000000000000000000000000000000000000..2858fd94161c73732a829bba611a14b9b09871f5 GIT binary patch literal 69312 zcmeI*eQX=$9S86yZh}fk(}0jxidr3^;$>=lr6jG3oW!Y}sA<#KB54UK<2aws=_R($ zy}QIVLYfgTQbmOF&lrLts&2dpTB(e;3JC}W5|s@>hqeg>`HP86>Q+trV1+=vzSYiOERo{x)puPdXOmLx5oZ!N{zCE^_K z_V~_$cL&^jT2>xbwOm^F=UW?b0xS7=-+ymzDtou|K0PyKw;gf!zP|T9c|_$t^_*!x zRp+|gWBIP^v?raN-RC)0DsH}%Y{_s=`>66<{CZf;%$1C7tq})Grln@ZJ}qg;MoC=YFvT8yEJx2*({sUe1xY-p8YYdH zV$?HF>3IGS)rI`*Ykm^uxI5zf6Cl{N)Y*Srpx8wpLrafyE-|>QhIE5d#FkW^CX;(v|0s5kTAVl?EcU+3^-W!$ncMo<& z`?>}Oq%BhaKs-63Di)I@JvpLCYBq0`Bt=#ZtIUb6isZ?iDYlX4tz~B(4A6Fxwk%Ky zkCif7awytk$XT_Z8>6hzd)lhmYuzifcSmX4SVx<(-DRiUe&zQC_&ujQV4v~66KZdp zXwKWek@{(m@ORX|$(Nt^EBSArEP^K=|GfimpAKJgem=jR9?O|BHK_38dEfcH1jb_2 zr(<}ST@KOK+aLG!1s{EtR`qjSA*Av&79aD!w*vepx-(8|rutmom9l(@c)(N*Q_QP* zO)=7z7}E>6j4r24(Vwk)fcZm$S?15zrzH*9D2Xw3T+Qft)ewgiJ*86L(8kqNOt$2z z#4YMbCSw)~c{4kbN)OAUx|Jyz+3`|QGqU3DF)fo4dvlg*WYv@=TdEn%=~^zO7OOG^ zlXh@SO^yw(H0iu&W=l>tvT{b0jqHxr>R6p#MBgJ?9@JS$&USvbVT#_v>!?@jj&G$s zt+zFNsnW_`vyLw~n!cK1X*}>d7O+F9UDHMrLrxr9$Jhr6A;21V^y($D5JGRe|1q_+ zQEA=P+Ny@yl$4T|6?t3R?QP1AP;%#OyA*l*E=6ezZQHejO@Ddp@x;WhL*WVQ;kkD6 z#f@i=oLqPAt<5Jcess<3cgLp}&hj5No-7HI{V%JHW5tQOy~j`A**{W#cV^=+TK@6d zozMR$`t75ur5&#S^xiM5nYqsoes%UI>CFdw0`Z1(@qsO`o=Cj3{Wtp$o%-p?Uk&Ng ze@ai){^9)j(Lj8t?q3hQ_Q3s*eDU^UdyZ~>VYT^RcK`mXP%#|)`x_@O+#lV^0^jV} z-dQ-)aQtVdChIS>pRajp=d>jPdakLcIU3wXdaAU3~MoZ?AuA{|m)W+1uw~`%5XC~F5R`dTP|>qI&=eB}|Mam+eUz+)4hW{K zR5P8%$-d-rXf&lMR!9An;Ze2JK`Gp1Jf)_{7F~FYmQr(;mey1wEb=G{HZ6nhp(8B1 zjry?Y!ZJA>p0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz V00bZa0SG_<0uX=z1pc=Lz6W}0Bvt?b literal 0 HcmV?d00001 diff --git a/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift b/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift index b91350101fb..5bf577b2db1 100644 --- a/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift +++ b/Tests/TuistCoreTests/MetadataProviders/XCFrameworkMetadataProviderTests.swift @@ -70,6 +70,23 @@ final class XCFrameworkMetadataProviderTests: TuistTestCase { infoPlist.libraries.forEach { XCTAssertEqual($0.binaryName, "MyFramework") } } + func test_binaryPath_when_dylibIsPresent() throws { + // Given + let xcframeworkPath = fixturePath(path: try RelativePath(validating: "DylibXCFramework.xcframework")) + let infoPlist = try subject.infoPlist(xcframeworkPath: xcframeworkPath) + + // When + let binaryPath = try subject.binaryPath(xcframeworkPath: xcframeworkPath, libraries: infoPlist.libraries) + + // Then + XCTAssertEqual( + binaryPath, + xcframeworkPath.appending(try RelativePath(validating: "macos-arm64/libDylibXCFramework.dylib")) + ) + + infoPlist.libraries.forEach { XCTAssertEqual($0.binaryName, "libDylibXCFramework") } + } + func test_libraries_when_staticLibraryIsPresent() throws { // Given let frameworkPath = fixturePath(path: try RelativePath(validating: "MyStaticLibrary.xcframework")) From 17d73d10a774cc4d11027138fc70c9fb35c9805f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Thu, 8 Aug 2024 18:21:31 +0200 Subject: [PATCH 496/509] Fix missing linked system libraries in Tuist Cache (#6613) --- Sources/TuistCore/Graph/GraphTraverser.swift | 22 ++++++- .../Graph/GraphTraverserTests.swift | 57 +++++++++++++++++++ 2 files changed, 76 insertions(+), 3 deletions(-) diff --git a/Sources/TuistCore/Graph/GraphTraverser.swift b/Sources/TuistCore/Graph/GraphTraverser.swift index 3dd6f36ad48..26e4a25c16b 100644 --- a/Sources/TuistCore/Graph/GraphTraverser.swift +++ b/Sources/TuistCore/Graph/GraphTraverser.swift @@ -1,6 +1,7 @@ import Foundation import Path -import TSCBasic +import func TSCBasic.topologicalSort +import func TSCBasic.transitiveClosure import TuistSupport import XcodeGraph @@ -398,9 +399,24 @@ public class GraphTraverser: GraphTraversing { skip: { $0.xcframeworkDependency == nil } ) + let libraryDependenciesLinkedByStaticXCFrameworks = try staticXCFrameworksLinkedByDynamicXCFrameworkDependencies.flatMap { + guard let dependencies = dependencies[$0] else { return [GraphDependency]() } + return try dependencies.filter { + switch $0 { + case .sdk: + return true + default: + return false + } + } + } + let precompiledLibrariesAndFrameworks = - (precompiledDynamicLibrariesAndFrameworks + staticXCFrameworksLinkedByDynamicXCFrameworkDependencies) - .compactMap { dependencyReference(to: $0, from: targetGraphDependency) } + ( + precompiledDynamicLibrariesAndFrameworks + staticXCFrameworksLinkedByDynamicXCFrameworkDependencies + + libraryDependenciesLinkedByStaticXCFrameworks + ) + .compactMap { dependencyReference(to: $0, from: targetGraphDependency) } references.formUnion(Set(precompiledLibrariesAndFrameworks)) diff --git a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift index 974f9dc17d3..a21857d5529 100644 --- a/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift +++ b/Tests/TuistCoreTests/Graph/GraphTraverserTests.swift @@ -1983,6 +1983,63 @@ final class GraphTraverserTests: TuistUnitTestCase { ]) } + func test_linkableAndEmbeddableDependencies_when_appDependensOnPrecompiledDynamicXCFrameworkWithStaticXCFrameworkDependencyWithALinkedSystemLibrary( + ) throws { + // App ---(depends on)---> Dynamic XCFramework ----> Static XCFramework (A) ----> libc++.tbd + + // Given + let target = Target.test(name: "Main") + let project = Project.test(targets: [target]) + + // Given: Value Graph + let dependencyDynamicXCFramework = GraphDependency.testXCFramework( + path: "/test/DynamicFramework.xcframework", + linking: .dynamic + ) + let dependencyStaticXCFrameworkA = GraphDependency.testXCFramework( + path: "/test/StaticFrameworkA.xcframework", + linking: .static + ) + let dependencyLibCpp = GraphDependency.testSDK( + name: "libc++.tbd", + path: try AbsolutePath(validating: "/libc++.tbd") + ) + + let dependencies: [GraphDependency: Set] = [ + .target(name: target.name, path: project.path): Set(arrayLiteral: dependencyDynamicXCFramework), + dependencyDynamicXCFramework: Set(arrayLiteral: dependencyStaticXCFrameworkA), + dependencyStaticXCFrameworkA: Set(arrayLiteral: dependencyLibCpp), + ] + let graph = Graph.test( + projects: [project.path: project], + dependencies: dependencies + ) + let subject = GraphTraverser(graph: graph) + + // When + let got = try subject.linkableDependencies(path: project.path, name: target.name).sorted() + + // Then + XCTAssertBetterEqual(got, [ + .sdk( + path: try AbsolutePath(validating: "/libc++.tbd"), + status: .required, + source: .system, + condition: nil + ), + GraphDependencyReference(dependencyDynamicXCFramework), + GraphDependencyReference(dependencyStaticXCFrameworkA), + ]) + + // When + let embeddable = subject.embeddableFrameworks(path: project.path, name: target.name) + + // Then + XCTAssertBetterEqual(embeddable, [ + GraphDependencyReference(dependencyDynamicXCFramework), + ]) + } + func test_linkableAndEmbeddableDependencies_when_appDependensOnPrecompiledStaticBinaryWithPrecompiledDynamicBinaryDependency( ) throws { // App ---(depends on)---> Precompiled static binary (A) ----> Precompiled dynamic binary (B) From bf8caf4c3c4912c4481c57bca7638cc5c89164ce Mon Sep 17 00:00:00 2001 From: Barak Weiss Date: Mon, 12 Aug 2024 16:24:13 +0300 Subject: [PATCH 497/509] Support #import with spaces prefix in umbrella headers. (#6630) In a few umbrella headers, there are cases where there are spaces before the `#import` directive, like ``` #import ``` Before this changes the headers with spaces are not detected and this commit fixes this issue. --- .../Loaders/UmbrellaHeaderHeadersExtractor.swift | 2 +- .../Headers+ManifestMapperTests.swift | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/TuistLoader/Loaders/UmbrellaHeaderHeadersExtractor.swift b/Sources/TuistLoader/Loaders/UmbrellaHeaderHeadersExtractor.swift index 19cfc08e888..f8e1067a53c 100644 --- a/Sources/TuistLoader/Loaders/UmbrellaHeaderHeadersExtractor.swift +++ b/Sources/TuistLoader/Loaders/UmbrellaHeaderHeadersExtractor.swift @@ -16,7 +16,7 @@ public enum UmbrellaHeaderHeadersExtractor { return lines.compactMap { line in let stripped = line.trimmingCharacters(in: .whitespaces) - guard let matchingPrefix = expectedPrefixes.first(where: { line.hasPrefix($0) }) else { + guard let matchingPrefix = expectedPrefixes.first(where: { stripped.hasPrefix($0) }) else { return nil } // also we need drop comments and spaces before comments diff --git a/Tests/TuistLoaderTests/Models+ManifestMappers/Headers+ManifestMapperTests.swift b/Tests/TuistLoaderTests/Models+ManifestMappers/Headers+ManifestMapperTests.swift index 4af3ad24606..2c4287ecd1b 100644 --- a/Tests/TuistLoaderTests/Models+ManifestMappers/Headers+ManifestMapperTests.swift +++ b/Tests/TuistLoaderTests/Models+ManifestMappers/Headers+ManifestMapperTests.swift @@ -413,7 +413,7 @@ final class HeadersManifestMapperTests: TuistUnitTestCase { // In this header, you should import all the public headers of your framework using statements like #import #import - #import + #import // to test spaces prefix #import "A3.h" // to test modules with legacy format #import // to test modules, where some protected files became public #import // to test incorrect module @@ -476,7 +476,7 @@ final class HeadersManifestMapperTests: TuistUnitTestCase { // In this header, you should import all the public headers of your framework using statements like #import #import - #import + #import // to test spaces prefix #import "A3.h" // to test modules with legacy format """ let umbrellaPath = temporaryPath.appending(try RelativePath(validating: "Sources/Umbrella.h")) @@ -543,7 +543,7 @@ final class HeadersManifestMapperTests: TuistUnitTestCase { // In this header, you should import all the public headers of your framework using statements like #import #import - #import + #import // to test spaces prefix #import "A3.h" // to test modules with legacy format """ let umbrellaPath = temporaryPath.appending(try RelativePath(validating: "Sources/Umbrella.h")) From ceb3322a32db6a35eb0e0322e9d22f48fd77ce2c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 15:24:56 +0200 Subject: [PATCH 498/509] add barakwei as a contributor for code (#6633) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6ae779635ec..0cfe8687428 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1483,6 +1483,15 @@ "contributions": [ "doc" ] + }, + { + "login": "barakwei", + "name": "Barak Weiss", + "avatar_url": "https://avatars.githubusercontent.com/u/5232161?v=4", + "profile": "https://github.com/barakwei", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index ae2058b5fcf..63d40e75249 100644 --- a/README.md +++ b/README.md @@ -578,6 +578,7 @@ Thanks goes to these wonderful people:
    kyounh12

    Alvar Hansen
    +
    Barak Weiss
    From 969ec9a813ad1d225e7305edb2ce40e4a2c2cee1 Mon Sep 17 00:00:00 2001 From: Hilton Campbell Date: Mon, 12 Aug 2024 06:27:54 -0700 Subject: [PATCH 499/509] Prune schemes when expandVariableFromTarget is pruned (#6627) --- .../TreeShakePrunedTargetsGraphMapper.swift | 12 ++++ ...eeShakePrunedTargetsGraphMapperTests.swift | 56 +++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift index 6e49b19d975..911a4546bcd 100644 --- a/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift +++ b/Sources/TuistKit/Mappers/TreeShakePrunedTargetsGraphMapper.swift @@ -94,6 +94,18 @@ public final class TreeShakePrunedTargetsGraphMapper: GraphMapping { return nil } + if let expandVariableFromTarget = scheme.runAction?.expandVariableFromTarget, + !sourceTargets.contains(expandVariableFromTarget) + { + return nil + } + + if let expandVariableFromTarget = scheme.testAction?.expandVariableFromTarget, + !sourceTargets.contains(expandVariableFromTarget) + { + return nil + } + return scheme } } diff --git a/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift b/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift index 0a608d044ca..e5c200d24d7 100644 --- a/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift +++ b/Tests/TuistKitTests/Mappers/Graph/TreeShakePrunedTargetsGraphMapperTests.swift @@ -94,6 +94,62 @@ final class TreeShakePrunedTargetsGraphMapperTests: TuistUnitTestCase { XCTAssertEmpty(gotGraph.projects.values.flatMap(\.schemes)) } + func test_map_removes_project_schemes_with_whose_run_action_expand_variable_from_target_has_been_removed() throws { + // Given + let path = try AbsolutePath(validating: "/project") + let prunedTarget = Target.test(name: "first", prune: true) + let keptTarget = Target.test(name: "second", prune: false) + let schemes: [Scheme] = [ + .test( + buildAction: .test(targets: [.init(projectPath: path, name: keptTarget.name)]), + runAction: .test(expandVariableFromTarget: .init(projectPath: path, name: prunedTarget.name)) + ), + ] + let project = Project.test(path: path, targets: [prunedTarget, keptTarget], schemes: schemes) + + let graph = Graph.test( + path: project.path, + projects: [project.path: project], + dependencies: [:] + ) + + // When + let (gotGraph, gotSideEffects, _) = try subject.map(graph: graph, environment: MapperEnvironment()) + + // Then + XCTAssertEmpty(gotSideEffects) + XCTAssertNotEmpty(gotGraph.projects) + XCTAssertEmpty(gotGraph.projects.values.flatMap(\.schemes)) + } + + func test_map_removes_project_schemes_with_whose_test_action_expand_variable_from_target_has_been_removed() throws { + // Given + let path = try AbsolutePath(validating: "/project") + let prunedTarget = Target.test(name: "first", prune: true) + let keptTarget = Target.test(name: "second", prune: false) + let schemes: [Scheme] = [ + .test( + buildAction: .test(targets: [.init(projectPath: path, name: keptTarget.name)]), + testAction: .test(expandVariableFromTarget: .init(projectPath: path, name: prunedTarget.name)) + ), + ] + let project = Project.test(path: path, targets: [prunedTarget, keptTarget], schemes: schemes) + + let graph = Graph.test( + path: project.path, + projects: [project.path: project], + dependencies: [:] + ) + + // When + let (gotGraph, gotSideEffects, _) = try subject.map(graph: graph, environment: MapperEnvironment()) + + // Then + XCTAssertEmpty(gotSideEffects) + XCTAssertNotEmpty(gotGraph.projects) + XCTAssertEmpty(gotGraph.projects.values.flatMap(\.schemes)) + } + func test_map_keeps_project_schemes_with_whose_all_targets_have_been_removed_but_have_test_plans() throws { let path = try AbsolutePath(validating: "/project") let prunedTarget = Target.test(name: "first", prune: true) From 1ebfb2a665eb42a6ece97e2c8858e9e4b5a451e5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 15:28:10 +0200 Subject: [PATCH 500/509] add hiltonc as a contributor for code (#6634) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0cfe8687428..3752d60f09a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1492,6 +1492,15 @@ "contributions": [ "code" ] + }, + { + "login": "hiltonc", + "name": "Hilton Campbell", + "avatar_url": "https://avatars.githubusercontent.com/u/470753?v=4", + "profile": "https://github.com/hiltonc", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 63d40e75249..0c93c9bafdb 100644 --- a/README.md +++ b/README.md @@ -579,6 +579,7 @@ Thanks goes to these wonderful people:
    kyounh12

    Alvar Hansen

    Barak Weiss
    +
    Hilton Campbell
    From f76ddea6f9d290250645f2a6908c98fbe3f97a7d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 16 Aug 2024 08:45:14 +0200 Subject: [PATCH 501/509] add rgnns as a contributor for code (#6647) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3752d60f09a..2260ea78363 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1501,6 +1501,15 @@ "contributions": [ "code" ] + }, + { + "login": "rgnns", + "name": "Gabriel Liévano", + "avatar_url": "https://avatars.githubusercontent.com/u/811827?v=4", + "profile": "https://github.com/rgnns", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 0c93c9bafdb..923d17f48ae 100644 --- a/README.md +++ b/README.md @@ -580,6 +580,7 @@ Thanks goes to these wonderful people:
    Alvar Hansen

    Barak Weiss

    Hilton Campbell
    +
    Gabriel Liévano
    From b23f5f0d8e7bb31cf315c96b3f2b2238f89e31fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Bure=C5=A1?= Date: Mon, 19 Aug 2024 12:13:10 +0200 Subject: [PATCH 502/509] Adjust SwiftLint repository and manifest (#6649) --- docs/docs/guides/develop/projects/dependencies.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs/guides/develop/projects/dependencies.md b/docs/docs/guides/develop/projects/dependencies.md index ed9ce91e273..a2b19e930c8 100644 --- a/docs/docs/guides/develop/projects/dependencies.md +++ b/docs/docs/guides/develop/projects/dependencies.md @@ -182,7 +182,7 @@ let package = Package( .library(name: "Framework", targets: ["Framework"]), ], dependencies: [ - .package(url: "https://github.com/lukepistrol/SwiftLintPlugin", from: "0.55.0"), + .package(url: "https://github.com/SimplyDanny/SwiftLintPlugins", .upToNextMajor(from: "0.56.1")), ], targets: [ .target( @@ -203,13 +203,13 @@ import ProjectDescription let project = Project( name: "Framework", packages: [ - .package(url: "https://github.com/lukepistrol/SwiftLintPlugin", from: "0.55.0"), + .remote(url: "https://github.com/SimplyDanny/SwiftLintPlugins", requirement: .upToNextMajor(from: "0.56.1")), ], targets: [ .target( name: "Framework", dependencies: [ - .package(product: "SwiftLint", type: .plugin), + .package(product: "SwiftLintBuildToolPlugin", type: .plugin), ] ), ] @@ -246,7 +246,7 @@ pod install ## Static or dynamic -Frameworks and libraries can be linked either statically or dynamically, **a choice that has significant implications for aspects like app size and boot time**. Despite its importance, this decision is often made without much consideration. +Frameworks and libraries can be linked either statically or dynamically, **a choice that has significant implications for aspects like app size and boot time**. Despite its importance, this decision is often made without much consideration. The **general rule of thumb** is that you want as many things as possible to be statically linked in release builds to achieve fast boot times, and as many things as possible to be dynamically linked in debug builds to achieve fast iteration times. From b66e42bb90fa8fd7637ca0f0e816d077712e42dd Mon Sep 17 00:00:00 2001 From: Kas Date: Mon, 19 Aug 2024 13:54:47 +0100 Subject: [PATCH 503/509] Fix scheme archive action not respecting custom configurations in some cases (#6636) resolves: https://github.com/tuist/tuist/issues/6621 - In the event a custom defined scheme's archive action is specified without a build action it was getting ignored - The scheme generation relied on a build action's data to attempt to generate a default / fallback archive action in case an archive action was not explicitly specified - This logic was mistakingly returning early in case a build action wasn't specified (as this code path should only be exercised in the event an archive action isn't explicitly being specified) - This has now been corrected - Tests and fixtures were updated accordingly Test Plan: - Generate the fixture `ios_app_with_multi_configs` ``` swift build swift run tuist generate --path fixtures/ios_app_with_multi_configs ``` - Verify the scheme `App-Beta-ArchiveOnly` has an archive action with the configuration `Beta` --- .../SchemeDescriptorsGenerator.swift | 8 +++-- .../SchemeDescriptorsGeneratorTests.swift | 35 +++++++++++++++++++ .../App/Project.swift | 11 +++++- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift b/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift index 3282337f31b..497b89b2e8b 100644 --- a/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift +++ b/Sources/TuistGenerator/Generator/SchemeDescriptorsGenerator.swift @@ -752,10 +752,12 @@ final class SchemeDescriptorsGenerator: SchemeDescriptorsGenerating { rootPath: AbsolutePath, generatedProjects: [AbsolutePath: GeneratedProject] ) throws -> XCScheme.ArchiveAction? { - guard let target = defaultTargetReference(scheme: scheme), - let graphTarget = graphTraverser.target(path: target.projectPath, name: target.name) else { return nil } - guard let archiveAction = scheme.archiveAction else { + guard let target = defaultTargetReference(scheme: scheme), + let graphTarget = graphTraverser.target(path: target.projectPath, name: target.name) + else { + return nil + } return defaultSchemeArchiveAction(for: graphTarget.project) } diff --git a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift index a6a48b48d9a..3d046376a65 100644 --- a/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/SchemeDescriptorsGeneratorTests.swift @@ -1752,6 +1752,41 @@ final class SchemeDescriptorsGeneratorTests: XCTestCase { XCTAssertEqual(result.revealArchiveInOrganizer, true) } + func test_schemeArchiveAction_whenNoBuildActionSpecified() throws { + // Given + let projectPath = try AbsolutePath(validating: "/Project") + let target = Target.test(name: "App", platform: .iOS, product: .app) + let archiveAction = ArchiveAction.test( + configurationName: "Beta Release", + revealArchiveInOrganizer: true, + customArchiveName: "App [Beta]" + ) + let scheme = Scheme.test( + buildAction: nil, + archiveAction: archiveAction + ) + + let project = Project.test(path: projectPath, targets: [target]) + let graph = Graph.test( + projects: [project.path: project] + ) + let graphTraverser = GraphTraverser(graph: graph) + + // When + let got = try subject.schemeArchiveAction( + scheme: scheme, + graphTraverser: graphTraverser, + rootPath: project.path, + generatedProjects: createGeneratedProjects(projects: [project]) + ) + + // Then + let result = try XCTUnwrap(got) + XCTAssertEqual(result.buildConfiguration, "Beta Release") + XCTAssertEqual(result.customArchiveName, "App [Beta]") + XCTAssertEqual(result.revealArchiveInOrganizer, true) + } + func test_schemeGenerationModes_customOnly() throws { // Given let app = Target.test(name: "App", product: .app) diff --git a/fixtures/ios_app_with_multi_configs/App/Project.swift b/fixtures/ios_app_with_multi_configs/App/Project.swift index d2006478fa0..fe92251b2ad 100644 --- a/fixtures/ios_app_with_multi_configs/App/Project.swift +++ b/fixtures/ios_app_with_multi_configs/App/Project.swift @@ -21,6 +21,12 @@ let betaScheme: Scheme = .scheme( analyzeAction: .analyzeAction(configuration: "Debug") ) +let betaArchiveOnlyScheme: Scheme = .scheme( + name: "App-Beta-ArchiveOnly", + shared: true, + archiveAction: .archiveAction(configuration: "Beta") +) + let project = Project( name: "MainApp", settings: settings, @@ -49,5 +55,8 @@ let project = Project( ] ), ], - schemes: [betaScheme] + schemes: [ + betaScheme, + betaArchiveOnlyScheme, + ] ) From 8298d0792e7278a90761c3c2e731a142dce4ee0c Mon Sep 17 00:00:00 2001 From: fortmarek Date: Mon, 19 Aug 2024 18:03:43 +0200 Subject: [PATCH 504/509] Update release date --- .../Client/ServerClientCLIMetadataHeadersMiddleware.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift b/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift index ffac25227e8..4c74de3d24a 100644 --- a/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift +++ b/Sources/TuistServer/Client/ServerClientCLIMetadataHeadersMiddleware.swift @@ -5,7 +5,7 @@ import TuistSupport /// This middleware includes the release date of the CLI in the headers so that we can show /// warnings if the on-premise installation is too old. struct ServerClientCLIMetadataHeadersMiddleware: ClientMiddleware { - let releaseDate = "2024.08.05" + let releaseDate = "2024.08.19" func intercept( _ request: Request, From 2cbaa757823c1db50cc977713e1d2fc1aecb2eb5 Mon Sep 17 00:00:00 2001 From: Tuist Date: Mon, 19 Aug 2024 16:54:55 +0000 Subject: [PATCH 505/509] Update .mise.toml and CHANGELOG.md in tuist/tuist with Tuist 4.24.0 --- .mise.toml | 2 +- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/.mise.toml b/.mise.toml index eb8797b9f5d..32844606127 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,5 +1,5 @@ [tools] -tuist = "4.23.0" +tuist = "4.24.0" swiftlint = "0.54.0" swiftformat = "0.53.3" pnpm = "8.15.6" diff --git a/CHANGELOG.md b/CHANGELOG.md index f43a6b75162..c5d2604aa9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,33 @@ # Changelog +## 4.24.0 - 2024-08-19 + +### Tuist + +#### Changed + +- Favor TUIST_CONFIG_TOKEN over TUIST_CONFIG_CLOUD_TOKEN [#6610](https://github.com/tuist/tuist/pull/6610) by [@fortmarek](https://github.com/fortmarek) + +#### Added + +- Add classPrefix support [#6439](https://github.com/tuist/tuist/pull/6439) by [@darrarski](https://github.com/darrarski) +- Add Swift library sdk type [#6605](https://github.com/tuist/tuist/pull/6605) by [@fortmarek](https://github.com/fortmarek) +- Add support for updating Tuist project's default branch [#6589](https://github.com/tuist/tuist/pull/6589) by [@fortmarek](https://github.com/fortmarek) + +#### Fixed + +- Fix missing external resource bundle in app extension [#6604](https://github.com/tuist/tuist/pull/6604) by [@fortmarek](https://github.com/fortmarek) +- Fix app not found when running tuist share with different target and product names [#6611](https://github.com/tuist/tuist/pull/6611) by [@fortmarek](https://github.com/fortmarek) +- Skip user token deprecation warning when new user tokens are available [#6614](https://github.com/tuist/tuist/pull/6614) by [@fortmarek](https://github.com/fortmarek) +- Fix missing linked system libraries in Tuist Cache [#6613](https://github.com/tuist/tuist/pull/6613) by [@fortmarek](https://github.com/fortmarek) +- Support #import with spaces prefix in umbrella headers. [#6630](https://github.com/tuist/tuist/pull/6630) by [@barakwei](https://github.com/barakwei) +- Prune schemes when expandVariableFromTarget is pruned [#6627](https://github.com/tuist/tuist/pull/6627) by [@hiltonc](https://github.com/hiltonc) +- Fix scheme archive action not respecting custom configurations [#6636](https://github.com/tuist/tuist/pull/6636) by [@kwridan](https://github.com/kwridan) + +### Tuist Cloud + +- no changes + ## 4.23.0 - 2024-08-05 ### Tuist From 1197769d68a694bb939a4e376921d4193fa1c719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Fo=C5=99t?= Date: Wed, 21 Aug 2024 10:20:02 +0200 Subject: [PATCH 506/509] Create Tuist menu bar app (#6598) * Create Tuist menu bar app * Fix Tuist App tests failing due to missing signing certificate * Fix failling unit tests due to unmocked XcodeController methods * Make dependency on XcodeGraph in Tuist App less strict * Address PR feedback * Remove no code signing options for tuist test --- .../Simulator/SimulatorController.swift | 25 +- .../TuistCore/Simulator/SimulatorDevice.swift | 31 +- .../Simulator/SimulatorDeviceAndRuntime.swift | 16 +- .../Simulator/SimulatorRuntime.swift | 38 +- .../Simulator/SimulatorRuntimeVersion.swift | 7 +- .../Simulator/SimulatorDevice+TestData.swift | 30 - .../SimulatorDeviceAndRuntime+TestData.swift | 12 - .../Simulator/SimulatorRuntime+TestData.swift | 28 - Sources/TuistServer/OpenAPI/Types.swift | 26 + Sources/TuistSupport/Xcode/Xcode.swift | 18 + .../TuistSupport/Xcode/XcodeController.swift | 4 +- .../TestCase/TuistUnitTestCase.swift | 4 +- .../Xcode/Mocks/MockXcodeController.swift | 46 -- .../Xcode/TestData/Xcode+TestData.swift | 19 - ...heGraphContentHasherIntegrationTests.swift | 8 +- .../CacheGraphContentHasherTests.swift | 5 + ...ltipleConfigurationsIntegrationTests.swift | 5 +- .../Generator/BuildPhaseGeneratorTests.swift | 5 + .../Generator/ConfigGeneratorTests.swift | 6 + .../ProjectDescriptorGeneratorTests.swift | 40 +- .../WorkspaceDescriptorGeneratorTests.swift | 5 + .../Linter/EnvironmentLinterTests.swift | 20 +- .../Linter/GraphLinterTests.swift | 13 +- .../DefaultSettingsProviderTests.swift | 126 ++++- .../ProjectEditorMapperTests.swift | 4 +- app/.gitignore | 70 +++ app/Package.resolved | 330 +++++++++++ app/Package.swift | 23 + app/Project.swift | 72 +++ app/Tuist/Config.swift | 5 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 68 +++ .../AppIcon.appiconset/icon_128x128.png | Bin 0 -> 23969 bytes .../AppIcon.appiconset/icon_128x128@2x.png | Bin 0 -> 81740 bytes .../AppIcon.appiconset/icon_16x16.png | Bin 0 -> 1163 bytes .../AppIcon.appiconset/icon_16x16@2x.png | Bin 0 -> 2697 bytes .../AppIcon.appiconset/icon_256x256.png | Bin 0 -> 81740 bytes .../AppIcon.appiconset/icon_256x256@2x.png | Bin 0 -> 301803 bytes .../AppIcon.appiconset/icon_32x32.png | Bin 0 -> 2697 bytes .../AppIcon.appiconset/icon_32x32@2x.png | Bin 0 -> 7502 bytes .../AppIcon.appiconset/icon_512x512.png | Bin 0 -> 301803 bytes .../AppIcon.appiconset/icon_512x512@2x.png | Bin 0 -> 1107120 bytes .../Resources/Assets.xcassets/Contents.json | 6 + .../Dark.colorset/Contents.json | 38 ++ .../Light.colorset/Contents.json | 38 ++ .../MenuBarIcon.imageset/Contents.json | 23 + .../MenuBarIcon.imageset/Tuist-Filled.png | Bin 0 -> 565 bytes .../MenuBarIcon.imageset/Tuist-Filled@2x.png | Bin 0 -> 1023 bytes .../MenuBarIcon.imageset/Tuist-Filled@3x.png | Bin 0 -> 1479 bytes .../Preview Assets.xcassets/Contents.json | 6 + app/TuistApp/Sources/AppDelegate.swift | 12 + .../Sources/Modifiers/HoverStyle.swift | 20 + .../Sources/Modifiers/MenuItemStyle.swift | 19 + app/TuistApp/Sources/TuistApp.swift | 13 + .../Sources/Utilities/AppStorage.swift | 30 + .../Sources/Utilities/ErrorHandling.swift | 18 + .../Sources/Utilities/ErrorViewHandling.swift | 26 + app/TuistApp/Sources/Views/MenuBarView.swift | 41 ++ .../Views/SimulatorRow/SimulatorRow.swift | 87 +++ .../SimulatorRow/SimulatorRowViewModel.swift | 23 + .../Views/SimulatorsView/SimulatorsView.swift | 92 +++ .../SimulatorsView/SimulatorsViewModel.swift | 188 ++++++ .../Tests/SimulatorRowViewModelTests.swift | 63 +++ .../Tests/SimulatorsViewModelTests.swift | 533 ++++++++++++++++++ codemagic.yaml | 72 ++- 65 files changed, 2303 insertions(+), 165 deletions(-) delete mode 100644 Sources/TuistCoreTesting/Simulator/SimulatorDevice+TestData.swift delete mode 100644 Sources/TuistCoreTesting/Simulator/SimulatorDeviceAndRuntime+TestData.swift delete mode 100644 Sources/TuistCoreTesting/Simulator/SimulatorRuntime+TestData.swift delete mode 100644 Sources/TuistSupportTesting/Xcode/Mocks/MockXcodeController.swift delete mode 100644 Sources/TuistSupportTesting/Xcode/TestData/Xcode+TestData.swift create mode 100644 app/.gitignore create mode 100644 app/Package.resolved create mode 100644 app/Package.swift create mode 100644 app/Project.swift create mode 100644 app/Tuist/Config.swift create mode 100644 app/TuistApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128.png create mode 100644 app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png create mode 100644 app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16.png create mode 100644 app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png create mode 100644 app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256.png create mode 100644 app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png create mode 100644 app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32.png create mode 100644 app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png create mode 100644 app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512.png create mode 100644 app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png create mode 100644 app/TuistApp/Resources/Assets.xcassets/Contents.json create mode 100644 app/TuistApp/Resources/Assets.xcassets/Dark.colorset/Contents.json create mode 100644 app/TuistApp/Resources/Assets.xcassets/Light.colorset/Contents.json create mode 100644 app/TuistApp/Resources/Assets.xcassets/MenuBarIcon.imageset/Contents.json create mode 100644 app/TuistApp/Resources/Assets.xcassets/MenuBarIcon.imageset/Tuist-Filled.png create mode 100644 app/TuistApp/Resources/Assets.xcassets/MenuBarIcon.imageset/Tuist-Filled@2x.png create mode 100644 app/TuistApp/Resources/Assets.xcassets/MenuBarIcon.imageset/Tuist-Filled@3x.png create mode 100644 app/TuistApp/Resources/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 app/TuistApp/Sources/AppDelegate.swift create mode 100644 app/TuistApp/Sources/Modifiers/HoverStyle.swift create mode 100644 app/TuistApp/Sources/Modifiers/MenuItemStyle.swift create mode 100644 app/TuistApp/Sources/TuistApp.swift create mode 100644 app/TuistApp/Sources/Utilities/AppStorage.swift create mode 100644 app/TuistApp/Sources/Utilities/ErrorHandling.swift create mode 100644 app/TuistApp/Sources/Utilities/ErrorViewHandling.swift create mode 100644 app/TuistApp/Sources/Views/MenuBarView.swift create mode 100644 app/TuistApp/Sources/Views/SimulatorRow/SimulatorRow.swift create mode 100644 app/TuistApp/Sources/Views/SimulatorRow/SimulatorRowViewModel.swift create mode 100644 app/TuistApp/Sources/Views/SimulatorsView/SimulatorsView.swift create mode 100644 app/TuistApp/Sources/Views/SimulatorsView/SimulatorsViewModel.swift create mode 100644 app/TuistApp/Tests/SimulatorRowViewModelTests.swift create mode 100644 app/TuistApp/Tests/SimulatorsViewModelTests.swift diff --git a/Sources/TuistCore/Simulator/SimulatorController.swift b/Sources/TuistCore/Simulator/SimulatorController.swift index 7e76078a85f..5cb26c72faa 100644 --- a/Sources/TuistCore/Simulator/SimulatorController.swift +++ b/Sources/TuistCore/Simulator/SimulatorController.swift @@ -77,6 +77,11 @@ public protocol SimulatorControlling { /// Boots a simulator, if necessary /// - Returns: A simulator with the updated `state` func booted(device: SimulatorDevice) throws -> SimulatorDevice + + /// Boots a simulator, if necessary + /// - Parameters: + /// - forced: If `true`, booting of the simulator is forced + func booted(device: SimulatorDevice, forced: Bool) throws -> SimulatorDevice } public enum SimulatorControllerError: Equatable, FatalError { @@ -278,6 +283,10 @@ public final class SimulatorController: SimulatorControlling { try device.booted(using: system) } + public func booted(device: SimulatorDevice, forced: Bool) throws -> SimulatorDevice { + try device.booted(using: system, forced: forced) + } + /// https://www.mokacoding.com/blog/xcodebuild-destination-options/ /// https://www.mokacoding.com/blog/how-to-always-run-latest-simulator-cli/ public func destination( @@ -319,9 +328,19 @@ public final class SimulatorController: SimulatorControlling { extension SimulatorDevice { /// Attempts to boot the simulator. /// - returns: The `SimulatorDevice` with updated `isShutdown` field. - fileprivate func booted(using system: Systeming) throws -> Self { - guard isShutdown else { return self } - try system.run(["/usr/bin/xcrun", "simctl", "boot", udid]) + fileprivate func booted(using system: Systeming, forced: Bool = false) throws -> Self { + guard isShutdown || forced else { return self } + do { + try system.run(["/usr/bin/xcrun", "simctl", "boot", udid]) + } catch { + if forced, let error = error as? FatalError, + error.description.contains("Unable to boot device in current state: Booted") + { + // noop + } else { + throw error + } + } return SimulatorDevice( dataPath: dataPath, logPath: logPath, diff --git a/Sources/TuistCore/Simulator/SimulatorDevice.swift b/Sources/TuistCore/Simulator/SimulatorDevice.swift index e3b5e22c0e3..a435d77ccf1 100644 --- a/Sources/TuistCore/Simulator/SimulatorDevice.swift +++ b/Sources/TuistCore/Simulator/SimulatorDevice.swift @@ -1,8 +1,9 @@ import Foundation import Path +import TuistSupport /// It represents a simulator device. Devices are obtained using Xcode's CLI simctl -public struct SimulatorDevice: Decodable, Hashable, CustomStringConvertible, Equatable { +public struct SimulatorDevice: Codable, Hashable, CustomStringConvertible, Equatable { /// Device data path. public let dataPath: AbsolutePath @@ -61,3 +62,31 @@ public struct SimulatorDevice: Decodable, Hashable, CustomStringConvertible, Equ self.runtimeIdentifier = runtimeIdentifier } } + +#if DEBUG + extension SimulatorDevice { + public static func test( + dataPath: AbsolutePath = "/Library/Developer/CoreSimulator/Devices/3A8C9673-C1FD-4E33-8EFA-AEEBF43161CC/data", + logPath: AbsolutePath = "/Library/Logs/CoreSimulator/3A8C9673-C1FD-4E33-8EFA-AEEBF43161CC", + udid: String = "3A8C9673-C1FD-4E33-8EFA-AEEBF43161CC", + isAvailable: Bool = true, + deviceTypeIdentifier: String = "com.apple.CoreSimulator.SimDeviceType.iPad-Air--3rd-generation-", + state: String = "Shutdown", + name: String = "iPad Air (3rd generation)", + availabilityError: String? = nil, + runtimeIdentifier: String = "com.apple.CoreSimulator.SimRuntime.iOS-13-5" + ) -> Self { + Self( + dataPath: dataPath, + logPath: logPath, + udid: udid, + isAvailable: isAvailable, + deviceTypeIdentifier: deviceTypeIdentifier, + state: state, + name: name, + availabilityError: availabilityError, + runtimeIdentifier: runtimeIdentifier + ) + } + } +#endif diff --git a/Sources/TuistCore/Simulator/SimulatorDeviceAndRuntime.swift b/Sources/TuistCore/Simulator/SimulatorDeviceAndRuntime.swift index 10c40bf8f4d..f582f4c102e 100644 --- a/Sources/TuistCore/Simulator/SimulatorDeviceAndRuntime.swift +++ b/Sources/TuistCore/Simulator/SimulatorDeviceAndRuntime.swift @@ -1,6 +1,6 @@ import Foundation -public struct SimulatorDeviceAndRuntime: Identifiable, Hashable, Equatable { +public struct SimulatorDeviceAndRuntime: Codable, Identifiable, Hashable, Equatable, Sendable { public var id: String { device.udid } @@ -11,3 +11,17 @@ public struct SimulatorDeviceAndRuntime: Identifiable, Hashable, Equatable { /// Device's runtime. public let runtime: SimulatorRuntime } + +#if DEBUG + extension SimulatorDeviceAndRuntime { + public static func test( + device: SimulatorDevice = .test(), + runtime: SimulatorRuntime = .test() + ) -> Self { + Self( + device: device, + runtime: runtime + ) + } + } +#endif diff --git a/Sources/TuistCore/Simulator/SimulatorRuntime.swift b/Sources/TuistCore/Simulator/SimulatorRuntime.swift index a4e615282c6..91bbae29f99 100644 --- a/Sources/TuistCore/Simulator/SimulatorRuntime.swift +++ b/Sources/TuistCore/Simulator/SimulatorRuntime.swift @@ -1,9 +1,11 @@ import Foundation import Path +import TuistSupport +import XcodeGraph /// It represents a runtime that is available in the system. The list of available runtimes is obtained /// using Xcode's simctl cli tool. -public struct SimulatorRuntime: Decodable, Hashable, CustomStringConvertible { +public struct SimulatorRuntime: Equatable, Codable, Hashable, CustomStringConvertible { /// Runtime bundle path (e.g. /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime) public let bundlePath: AbsolutePath @@ -25,6 +27,14 @@ public struct SimulatorRuntime: Decodable, Hashable, CustomStringConvertible { // Name of the runtime (e.g. iOS 13.5) public let name: String + public var platform: Platform? { + // We pluck out the platform name from the name of the runtime (e.g. iOS 13.5) + guard let platformName = name.components(separatedBy: " ").first + else { return nil } + + return Platform(commandLineValue: platformName) + } + public init( bundlePath: AbsolutePath, buildVersion: String, @@ -57,3 +67,29 @@ public struct SimulatorRuntime: Decodable, Hashable, CustomStringConvertible { name } } + +#if DEBUG + extension SimulatorRuntime { + public static func test( + bundlePath: AbsolutePath = + "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime", + buildVersion: String = "17F61", + runtimeRoot: AbsolutePath = + "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot", + identifier: String = "com.apple.CoreSimulator.SimRuntime.iOS-13-5", + version: SimulatorRuntimeVersion = "13.5", + isAvailable: Bool = true, + name: String = "iOS 13.5" + ) -> Self { + Self( + bundlePath: bundlePath, + buildVersion: buildVersion, + runtimeRoot: runtimeRoot, + identifier: identifier, + version: version, + isAvailable: isAvailable, + name: name + ) + } + } +#endif diff --git a/Sources/TuistCore/Simulator/SimulatorRuntimeVersion.swift b/Sources/TuistCore/Simulator/SimulatorRuntimeVersion.swift index a531a36c7ed..0c5884850e1 100644 --- a/Sources/TuistCore/Simulator/SimulatorRuntimeVersion.swift +++ b/Sources/TuistCore/Simulator/SimulatorRuntimeVersion.swift @@ -1,6 +1,6 @@ import Foundation -public struct SimulatorRuntimeVersion: CustomStringConvertible, Hashable, ExpressibleByStringLiteral, Comparable, Decodable { +public struct SimulatorRuntimeVersion: CustomStringConvertible, Hashable, ExpressibleByStringLiteral, Comparable, Codable { // MARK: - Attributes public let major: Int @@ -20,6 +20,11 @@ public struct SimulatorRuntimeVersion: CustomStringConvertible, Hashable, Expres self.init(stringLiteral: try container.decode(String.self)) } + public func encode(to encoder: any Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode(description) + } + // MARK: - Internal func flattened() -> SimulatorRuntimeVersion { diff --git a/Sources/TuistCoreTesting/Simulator/SimulatorDevice+TestData.swift b/Sources/TuistCoreTesting/Simulator/SimulatorDevice+TestData.swift deleted file mode 100644 index 931060fdc88..00000000000 --- a/Sources/TuistCoreTesting/Simulator/SimulatorDevice+TestData.swift +++ /dev/null @@ -1,30 +0,0 @@ -import Foundation -import Path -import TuistSupport -@testable import TuistCore - -extension SimulatorDevice { - public static func test( - dataPath: AbsolutePath = "/Library/Developer/CoreSimulator/Devices/3A8C9673-C1FD-4E33-8EFA-AEEBF43161CC/data", - logPath: AbsolutePath = "/Library/Logs/CoreSimulator/3A8C9673-C1FD-4E33-8EFA-AEEBF43161CC", - udid: String = "3A8C9673-C1FD-4E33-8EFA-AEEBF43161CC", - isAvailable: Bool = true, - deviceTypeIdentifier: String = "com.apple.CoreSimulator.SimDeviceType.iPad-Air--3rd-generation-", - state: String = "Shutdown", - name: String = "iPad Air (3rd generation)", - availabilityError: String? = nil, - runtimeIdentifier: String = "com.apple.CoreSimulator.SimRuntime.iOS-13-5" - ) -> SimulatorDevice { - SimulatorDevice( - dataPath: dataPath, - logPath: logPath, - udid: udid, - isAvailable: isAvailable, - deviceTypeIdentifier: deviceTypeIdentifier, - state: state, - name: name, - availabilityError: availabilityError, - runtimeIdentifier: runtimeIdentifier - ) - } -} diff --git a/Sources/TuistCoreTesting/Simulator/SimulatorDeviceAndRuntime+TestData.swift b/Sources/TuistCoreTesting/Simulator/SimulatorDeviceAndRuntime+TestData.swift deleted file mode 100644 index 8192fe4c976..00000000000 --- a/Sources/TuistCoreTesting/Simulator/SimulatorDeviceAndRuntime+TestData.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation -import Path -@testable import TuistCore - -extension SimulatorDeviceAndRuntime { - public static func test( - device: SimulatorDevice = .test(), - runtime: SimulatorRuntime = .test() - ) -> SimulatorDeviceAndRuntime { - SimulatorDeviceAndRuntime(device: device, runtime: runtime) - } -} diff --git a/Sources/TuistCoreTesting/Simulator/SimulatorRuntime+TestData.swift b/Sources/TuistCoreTesting/Simulator/SimulatorRuntime+TestData.swift deleted file mode 100644 index 0eec9b4617c..00000000000 --- a/Sources/TuistCoreTesting/Simulator/SimulatorRuntime+TestData.swift +++ /dev/null @@ -1,28 +0,0 @@ -import Foundation -import Path -import TuistSupport -@testable import TuistCore - -extension SimulatorRuntime { - public static func test( - bundlePath: AbsolutePath = - "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime", - buildVersion: String = "17F61", - runtimeRoot: AbsolutePath = - "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot", - identifier: String = "com.apple.CoreSimulator.SimRuntime.iOS-13-5", - version: SimulatorRuntimeVersion = "13.5", - isAvailable: Bool = true, - name: String = "iOS 13.5" - ) -> SimulatorRuntime { - SimulatorRuntime( - bundlePath: bundlePath, - buildVersion: buildVersion, - runtimeRoot: runtimeRoot, - identifier: identifier, - version: version, - isAvailable: isAvailable, - name: name - ) - } -} diff --git a/Sources/TuistServer/OpenAPI/Types.swift b/Sources/TuistServer/OpenAPI/Types.swift index a3a1d565d5d..d59f1c0af2a 100644 --- a/Sources/TuistServer/OpenAPI/Types.swift +++ b/Sources/TuistServer/OpenAPI/Types.swift @@ -601,6 +601,32 @@ public enum Components { case refresh_token } } + /// The URL to download a build. + /// + /// - Remark: Generated from `#/components/schemas/BuildDownloadURL`. + public struct BuildDownloadURL: Codable, Equatable, Hashable, Sendable { + /// The UNIX timestamp when the URL expires. + /// + /// - Remark: Generated from `#/components/schemas/BuildDownloadURL/expires_at`. + public var expires_at: Swift.Int + /// The URL to download the artifact from the cache. + /// + /// - Remark: Generated from `#/components/schemas/BuildDownloadURL/url`. + public var url: Swift.String + /// Creates a new `BuildDownloadURL`. + /// + /// - Parameters: + /// - expires_at: The UNIX timestamp when the URL expires. + /// - url: The URL to download the artifact from the cache. + public init(expires_at: Swift.Int, url: Swift.String) { + self.expires_at = expires_at + self.url = url + } + public enum CodingKeys: String, CodingKey { + case expires_at + case url + } + } /// The URL to download the artifact from the cache. /// /// - Remark: Generated from `#/components/schemas/CacheArtifactDownloadURL`. diff --git a/Sources/TuistSupport/Xcode/Xcode.swift b/Sources/TuistSupport/Xcode/Xcode.swift index 92aa8f82f0d..3d15604645d 100644 --- a/Sources/TuistSupport/Xcode/Xcode.swift +++ b/Sources/TuistSupport/Xcode/Xcode.swift @@ -73,3 +73,21 @@ public struct Xcode { self.infoPlist = infoPlist } } + +#if DEBUG + extension Xcode { + public static func test( + path: AbsolutePath = try! AbsolutePath(validating: "/Applications/Xcode.app"), // swiftlint:disable:this force_try + infoPlist: Xcode.InfoPlist = .test() + ) -> Xcode { + Xcode(path: path, infoPlist: infoPlist) + } + } + + extension Xcode.InfoPlist { + public static func test(version: String = "3.2.1") -> Xcode.InfoPlist { + Xcode.InfoPlist(version: version) + } + } + +#endif diff --git a/Sources/TuistSupport/Xcode/XcodeController.swift b/Sources/TuistSupport/Xcode/XcodeController.swift index e8295000522..8cf3662613b 100644 --- a/Sources/TuistSupport/Xcode/XcodeController.swift +++ b/Sources/TuistSupport/Xcode/XcodeController.swift @@ -1,7 +1,9 @@ import Foundation +import Mockable import Path import TSCUtility +@Mockable public protocol XcodeControlling: Sendable { /// Returns the selected Xcode. It uses xcode-select to determine /// the Xcode that is selected in the environment. @@ -17,7 +19,7 @@ public protocol XcodeControlling: Sendable { func selectedVersion() throws -> Version } -public class XcodeController: XcodeControlling, @unchecked Sendable { +public final class XcodeController: XcodeControlling, @unchecked Sendable { public init() {} /// Shared instance. diff --git a/Sources/TuistSupportTesting/TestCase/TuistUnitTestCase.swift b/Sources/TuistSupportTesting/TestCase/TuistUnitTestCase.swift index 96a99a3c96b..58098cbba39 100644 --- a/Sources/TuistSupportTesting/TestCase/TuistUnitTestCase.swift +++ b/Sources/TuistSupportTesting/TestCase/TuistUnitTestCase.swift @@ -6,7 +6,7 @@ import XCTest open class TuistUnitTestCase: TuistTestCase { public var system: MockSystem! public var developerEnvironment: MockDeveloperEnvironment! - public var xcodeController: MockXcodeController! + public var xcodeController: MockXcodeControlling! public var swiftVersionProvider: MockSwiftVersionProviding! override open func setUp() { @@ -19,7 +19,7 @@ open class TuistUnitTestCase: TuistTestCase { SwiftVersionProvider._shared.mutate { $0 = swiftVersionProvider } // Xcode controller - xcodeController = MockXcodeController() + xcodeController = MockXcodeControlling() XcodeController._shared.mutate { $0 = xcodeController } // Developer environment diff --git a/Sources/TuistSupportTesting/Xcode/Mocks/MockXcodeController.swift b/Sources/TuistSupportTesting/Xcode/Mocks/MockXcodeController.swift deleted file mode 100644 index 3be0bf48b42..00000000000 --- a/Sources/TuistSupportTesting/Xcode/Mocks/MockXcodeController.swift +++ /dev/null @@ -1,46 +0,0 @@ -import Foundation -import struct TSCUtility.Version -import TuistSupport -import XCTest - -public final class MockXcodeController: XcodeControlling, @unchecked Sendable { - public var selectedStub: Result? { - get { - _selectedStub.value - } - set { - _selectedStub.mutate { $0 = newValue } - } - } - - // swiftlint:disable:next identifier_name - private var _selectedStub: ThreadSafe?> = ThreadSafe(nil) - - public var selectedVersionStub: Result { - get { - _selectedVersionStub.value - } - set { - _selectedVersionStub.mutate { $0 = newValue } - } - } - - // swiftlint:disable:next identifier_name - public let _selectedVersionStub: ThreadSafe> = ThreadSafe(.success(Version(0, 0, 0))) - - public func selected() throws -> Xcode? { - guard let selectedStub else { return nil } - - switch selectedStub { - case let .failure(error): throw error - case let .success(xcode): return xcode - } - } - - public func selectedVersion() throws -> Version { - switch selectedVersionStub { - case let .failure(error): throw error - case let .success(version): return version - } - } -} diff --git a/Sources/TuistSupportTesting/Xcode/TestData/Xcode+TestData.swift b/Sources/TuistSupportTesting/Xcode/TestData/Xcode+TestData.swift deleted file mode 100644 index d07098d1b38..00000000000 --- a/Sources/TuistSupportTesting/Xcode/TestData/Xcode+TestData.swift +++ /dev/null @@ -1,19 +0,0 @@ -import Foundation -import Path - -import TuistSupport - -extension Xcode { - static func test( - path: AbsolutePath = try! AbsolutePath(validating: "/Applications/Xcode.app"), // swiftlint:disable:this force_try - infoPlist: Xcode.InfoPlist = .test() - ) -> Xcode { - Xcode(path: path, infoPlist: infoPlist) - } -} - -extension Xcode.InfoPlist { - static func test(version: String = "3.2.1") -> Xcode.InfoPlist { - Xcode.InfoPlist(version: version) - } -} diff --git a/Tests/TuistCacheIntegrationTests/CacheGraphContentHasherIntegrationTests.swift b/Tests/TuistCacheIntegrationTests/CacheGraphContentHasherIntegrationTests.swift index a67dad44dee..1ae669c6e3d 100644 --- a/Tests/TuistCacheIntegrationTests/CacheGraphContentHasherIntegrationTests.swift +++ b/Tests/TuistCacheIntegrationTests/CacheGraphContentHasherIntegrationTests.swift @@ -1,6 +1,7 @@ import Foundation import MockableTest import Path +import struct TSCUtility.Version import TuistCore import TuistHasher import TuistSupport @@ -61,6 +62,9 @@ final class ContentHashingIntegrationTests: TuistUnitTestCase { XCTFail("Error while creating files for stub project") } given(swiftVersionProvider).swiftlangVersion().willReturn("5.4.0") + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 3, 0)) subject = CacheGraphContentHasher(contentHasher: CachedContentHasher()) } @@ -186,8 +190,8 @@ final class ContentHashingIntegrationTests: TuistUnitTestCase { ) // Then - XCTAssertEqual(contentHash[framework1], "733b86d9009e7e3d23cd9eb030fb635f") - XCTAssertEqual(contentHash[framework2], "644e0bd4ff2868a9c9f74c349df77163") + XCTAssertEqual(contentHash[framework1], "ed446c23f3327663c85968146cf9bc8b") + XCTAssertEqual(contentHash[framework2], "856dc2d5a7df61c597f53147ab8fa5f8") } // MARK: - Resources diff --git a/Tests/TuistCacheTests/CacheGraphContentHasherTests.swift b/Tests/TuistCacheTests/CacheGraphContentHasherTests.swift index d0a3256dc0c..e60efec8691 100644 --- a/Tests/TuistCacheTests/CacheGraphContentHasherTests.swift +++ b/Tests/TuistCacheTests/CacheGraphContentHasherTests.swift @@ -2,6 +2,7 @@ import Foundation import Mockable import MockableTest import Path +import struct TSCUtility.Version import TuistCore import TuistHasher import TuistSupport @@ -32,6 +33,10 @@ final class CacheGraphContentHasherTests: TuistUnitTestCase { xcodeController: xcodeController, swiftVersionProvider: swiftVersionProvider ) + + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) } override func tearDown() { diff --git a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift index cccb2505914..a0ef9485dc8 100644 --- a/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift +++ b/Tests/TuistGeneratorIntegrationTests/Generator/MultipleConfigurationsIntegrationTests.swift @@ -1,6 +1,7 @@ import MockableTest import Path import TSCBasic +import struct TSCUtility.Version import TuistCore import TuistLoaderTesting import XcodeGraph @@ -18,7 +19,9 @@ final class MultipleConfigurationsIntegrationTests: TuistUnitTestCase { .swiftVersion() .willReturn("5.2") - xcodeController.selectedVersionStub = .success("11.0.0") + given(xcodeController) + .selectedVersion() + .willReturn(TSCUtility.Version(11, 0, 0)) try setupTestProject() } catch { XCTFail(error.localizedDescription) diff --git a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift index 76a3e4f6ac4..6b1bb9da813 100644 --- a/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/BuildPhaseGeneratorTests.swift @@ -1,6 +1,7 @@ import Foundation import MockableTest import Path +import struct TSCUtility.Version import TuistCore import TuistSupport import XcodeGraph @@ -30,6 +31,10 @@ final class BuildPhaseGeneratorTests: TuistUnitTestCase { super.setUp() subject = BuildPhaseGenerator() errorHandler = MockErrorHandler() + + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) } override func tearDown() { diff --git a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift index 7d9683d4a8d..6191ef2da99 100644 --- a/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ConfigGeneratorTests.swift @@ -1,5 +1,7 @@ import Foundation +import MockableTest import Path +import struct TSCUtility.Version import TuistCore import TuistCoreTesting import TuistSupport @@ -20,6 +22,10 @@ final class ConfigGeneratorTests: TuistUnitTestCase { pbxTarget = PBXNativeTarget(name: "Test") pbxproj.add(object: pbxTarget) subject = ConfigGenerator() + + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) } override func tearDown() { diff --git a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift index c5cd55d9f8e..d6809525b97 100644 --- a/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/ProjectDescriptorGeneratorTests.swift @@ -65,6 +65,10 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { ) let graphTraverser = GraphTraverser(graph: graph) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let generatedProject = try subject.generate(project: project, graphTraverser: graphTraverser) @@ -86,7 +90,9 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { } func test_objectVersion_when_xcode11_and_spm() throws { - xcodeController.selectedVersionStub = .success(Version(11, 0, 0)) + given(xcodeController) + .selectedVersion() + .willReturn(Version(11, 0, 0)) // Given let temporaryPath = try temporaryPath() @@ -124,7 +130,9 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { } func test_objectVersion_when_xcode11() throws { - xcodeController.selectedVersionStub = .success(Version(11, 0, 0)) + given(xcodeController) + .selectedVersion() + .willReturn(Version(11, 0, 0)) // Given let temporaryPath = try temporaryPath() @@ -148,7 +156,9 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { } func test_objectVersion_when_xcode10() throws { - xcodeController.selectedVersionStub = .success(Version(10, 2, 1)) + given(xcodeController) + .selectedVersion() + .willReturn(Version(10, 2, 1)) // Given let temporaryPath = try temporaryPath() @@ -195,6 +205,10 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { ] ) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.generate(project: project, graphTraverser: graphTraverser) @@ -303,6 +317,10 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { targets: [.test(resources: .init(resources))] ) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.generate(project: project, graphTraverser: graphTraverser) @@ -344,6 +362,10 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { targets: [] ) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.generate(project: project, graphTraverser: graphTraverser) @@ -364,6 +386,10 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { let graph = Graph.test(projects: [project.path: project]) let graphTraverser = GraphTraverser(graph: graph) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.generate(project: project, graphTraverser: graphTraverser) @@ -403,6 +429,10 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { ) let graphTraverser = GraphTraverser(graph: graph) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.generate(project: project, graphTraverser: graphTraverser) @@ -427,6 +457,10 @@ final class ProjectDescriptorGeneratorTests: TuistUnitTestCase { lastUpgradeCheck: .init(12, 5, 1) ) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.generate(project: project, graphTraverser: graphTraverser) diff --git a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift index 834057763e5..4d92fe61c01 100644 --- a/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/WorkspaceDescriptorGeneratorTests.swift @@ -1,6 +1,7 @@ import Foundation import MockableTest import Path +import struct TSCUtility.Version import TuistCore import TuistCoreTesting import TuistSupport @@ -20,6 +21,10 @@ final class WorkspaceDescriptorGeneratorTests: TuistUnitTestCase { .swiftVersion() .willReturn("5.2") + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + subject = WorkspaceDescriptorGenerator(config: .init(projectGenerationContext: .serial)) } diff --git a/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift b/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift index 2eada9b48cf..5ba93f951de 100644 --- a/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/EnvironmentLinterTests.swift @@ -36,7 +36,9 @@ final class EnvironmentLinterTests: TuistUnitTestCase { Config.test(compatibleXcodeVersions: ["1.0", "4.3.2"]), ] - xcodeController.selectedStub = .success(Xcode.test(infoPlist: .test(version: "4.3.2"))) + given(xcodeController) + .selected() + .willReturn(.test(infoPlist: .test(version: "4.3.2"))) // When let got = try configs.flatMap { try subject.lintXcodeVersion(config: $0) } @@ -58,7 +60,9 @@ final class EnvironmentLinterTests: TuistUnitTestCase { Config.test(compatibleXcodeVersions: .list(["3.2.1"])), ] - xcodeController.selectedStub = .success(Xcode.test(infoPlist: .test(version: "4.3.2"))) + given(xcodeController) + .selected() + .willReturn(.test(infoPlist: .test(version: "4.3.2"))) for config in configs { // When @@ -74,7 +78,9 @@ final class EnvironmentLinterTests: TuistUnitTestCase { func test_lintXcodeVersion_doesntReturnIssues_whenAllVersionsAreSupported() throws { // Given let config = Config.test(compatibleXcodeVersions: .all) - xcodeController.selectedStub = .success(Xcode.test(infoPlist: .test(version: "4.3.2"))) + given(xcodeController) + .selected() + .willReturn(.test(infoPlist: .test(version: "4.3.2"))) // When let got = try subject.lintXcodeVersion(config: config) @@ -87,6 +93,10 @@ final class EnvironmentLinterTests: TuistUnitTestCase { // Given let config = Config.test(compatibleXcodeVersions: .list(["3.2.1"])) + given(xcodeController) + .selected() + .willReturn(nil) + // When let got = try subject.lintXcodeVersion(config: config) @@ -98,7 +108,9 @@ final class EnvironmentLinterTests: TuistUnitTestCase { // Given let config = Config.test(compatibleXcodeVersions: .list(["3.2.1"])) let error = NSError.test() - xcodeController.selectedStub = .failure(error) + given(xcodeController) + .selected() + .willThrow(error) // Then XCTAssertThrowsError(try subject.lintXcodeVersion(config: config)) { diff --git a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift index ba2cec079ec..cb23d2db770 100644 --- a/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift +++ b/Tests/TuistGeneratorTests/Linter/GraphLinterTests.swift @@ -1,4 +1,5 @@ import Foundation +import MockableTest import Path import struct TSCUtility.Version import TuistCore @@ -56,7 +57,9 @@ final class GraphLinterTests: TuistUnitTestCase { let path: AbsolutePath = "/project" let package = Package.remote(url: "remote", requirement: .branch("master")) let versionStub = Version(10, 0, 0) - xcodeController.selectedVersionStub = .success(versionStub) + given(xcodeController) + .selectedVersion() + .willReturn(versionStub) let graph = Graph.test(packages: [path: ["package": package]]) let config = Config.test() let graphTraverser = GraphTraverser(graph: graph) @@ -75,7 +78,9 @@ final class GraphLinterTests: TuistUnitTestCase { let path: AbsolutePath = "/project" let package = Package.remote(url: "remote", requirement: .branch("master")) let versionStub = Version(11, 0, 0) - xcodeController.selectedVersionStub = .success(versionStub) + given(xcodeController) + .selectedVersion() + .willReturn(versionStub) let graph = Graph.test(packages: [path: ["package": package]]) let config = Config.test() let graphTraverser = GraphTraverser(graph: graph) @@ -193,7 +198,9 @@ final class GraphLinterTests: TuistUnitTestCase { let path: AbsolutePath = "/project" let package = Package.remote(url: "remote", requirement: .branch("master")) let error = NSError.test() - xcodeController.selectedVersionStub = .failure(error) + given(xcodeController) + .selectedVersion() + .willThrow(error) let graph = Graph.test(packages: [path: ["package": package]]) let config = Config.test() let graphTraverser = GraphTraverser(graph: graph) diff --git a/Tests/TuistGeneratorTests/Settings/DefaultSettingsProviderTests.swift b/Tests/TuistGeneratorTests/Settings/DefaultSettingsProviderTests.swift index cbf6ebe07f9..d35f405dcc5 100644 --- a/Tests/TuistGeneratorTests/Settings/DefaultSettingsProviderTests.swift +++ b/Tests/TuistGeneratorTests/Settings/DefaultSettingsProviderTests.swift @@ -1,3 +1,4 @@ +import MockableTest import struct TSCUtility.Version import TuistCore import TuistCoreTesting @@ -162,6 +163,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { ) let project = Project.test(settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.projectSettings( project: project, @@ -183,6 +188,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { ) let project = Project.test(settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.projectSettings( project: project, @@ -203,6 +212,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { ) let project = Project.test(settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.projectSettings( project: project, @@ -219,6 +232,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .dynamicLibrary, mergeable: true) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -237,6 +254,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .app) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -254,6 +275,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .app, mergedBinaryType: .automatic) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -271,6 +296,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .app, mergedBinaryType: .manual(mergeableDependencies: Set(["Sample"]))) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -289,6 +318,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .app, mergedBinaryType: .manual(mergeableDependencies: Set(["Sample"]))) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -312,6 +345,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .app, settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -334,6 +371,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .framework, settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -356,6 +397,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .framework, settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -377,6 +422,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { ) let project = Project.test(settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.projectSettings( project: project, @@ -399,6 +448,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { ) let project = Project.test(settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.projectSettings( project: project, @@ -420,6 +473,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { ) let project = Project.test(settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.projectSettings( project: project, @@ -440,6 +497,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { ) let project = Project.test(settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.projectSettings( project: project, @@ -460,7 +521,9 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { ) let project = Project.test() let target = Target.test(settings: settings) - xcodeController.selectedVersionStub = .success(Version(11, 0, 0)) + given(xcodeController) + .selectedVersion() + .willReturn(Version(11, 0, 0)) // When let got = try subject.targetSettings( @@ -479,6 +542,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test(settings: .test(defaultSettings: .essential)) let target = Target.test(settings: nil) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -500,7 +567,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { ) let target = Target.test(settings: settings) let project = Project.test() - xcodeController.selectedVersionStub = .success(Version(10, 0, 0)) + + given(xcodeController) + .selectedVersion() + .willReturn(Version(10, 0, 0)) // When let got = try subject.targetSettings( @@ -523,7 +593,9 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { ) let target = Target.test(settings: settings) let project = Project.test() - xcodeController.selectedVersionStub = .success(Version(11, 0, 0)) + given(xcodeController) + .selectedVersion() + .willReturn(Version(11, 0, 0)) // When let got = try subject.targetSettings( @@ -547,6 +619,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let target = Target.test(product: .app, settings: settings) let project = Project.test() + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -575,6 +651,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { ) ) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -597,6 +677,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let target = Target.test(product: .app, settings: settings) let project = Project.test() + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -640,7 +724,9 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { ) let target = Target.test(product: .app, settings: settings) let project = Project.test() - xcodeController.selectedVersionStub = .success(Version(11, 0, 0)) + given(xcodeController) + .selectedVersion() + .willReturn(Version(11, 0, 0)) // When let got = try subject.targetSettings( @@ -665,6 +751,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .framework, settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -688,6 +778,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .framework, settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -711,6 +805,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .framework, settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -755,6 +853,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .unitTests, settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -777,6 +879,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .uiTests, settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -799,6 +905,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .unitTests, settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -821,6 +931,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { let project = Project.test() let target = Target.test(product: .uiTests, settings: settings) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, @@ -847,6 +961,10 @@ final class DefaultSettingsProvider_iOSTests: TuistUnitTestCase { settings: settings ) + given(xcodeController) + .selectedVersion() + .willReturn(Version(15, 0, 0)) + // When let got = try subject.targetSettings( target: target, diff --git a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift index d304de5cc66..e591a60224d 100644 --- a/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift +++ b/Tests/TuistKitTests/ProjectEditor/ProjectEditorMapperTests.swift @@ -57,7 +57,9 @@ final class ProjectEditorMapperTests: TuistUnitTestCase { swiftPackageManagerController.getToolsVersionStub = { _ in .init(stringLiteral: "5.5.0") } - xcodeController.selectedStub = .success(.test(path: AbsolutePath("/Applications/Xcode.app"))) + given(xcodeController) + .selected() + .willReturn(.test(path: AbsolutePath("/Applications/Xcode.app"))) // When let graph = try subject.map( diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 00000000000..24b244f9c45 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,70 @@ +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Xcode ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +### Xcode Patch ### +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcworkspace/contents.xcworkspacedata +/*.gcno + +### Projects ### +*.xcodeproj +*.xcworkspace + +### Tuist derived files ### +graph.dot +Derived/ + +### Tuist managed dependencies ### +Tuist/.build \ No newline at end of file diff --git a/app/Package.resolved b/app/Package.resolved new file mode 100644 index 00000000000..970fae2340b --- /dev/null +++ b/app/Package.resolved @@ -0,0 +1,330 @@ +{ + "originHash" : "e1acc6da7ed6b9f7c56b6f9eaaa9b5824dd9ed3b8f8d008c6431e6ae5be20f1b", + "pins" : [ + { + "identity" : "aexml", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tadija/AEXML.git", + "state" : { + "revision" : "38f7d00b23ecd891e1ee656fa6aeebd6ba04ecc3", + "version" : "4.6.1" + } + }, + { + "identity" : "anycodable", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Flight-School/AnyCodable", + "state" : { + "revision" : "862808b2070cd908cb04f9aafe7de83d35f81b05", + "version" : "0.6.7" + } + }, + { + "identity" : "colorizer", + "kind" : "remoteSourceControl", + "location" : "https://github.com/getGuaka/Colorizer.git", + "state" : { + "revision" : "2ccc99bf1715e73c4139e8d40b6e6b30be975586", + "version" : "0.2.1" + } + }, + { + "identity" : "command", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tuist/command", + "state" : { + "revision" : "27270402bfb9cd65f6a8b83bdf59941a8c9ae368", + "version" : "0.8.0" + } + }, + { + "identity" : "difference", + "kind" : "remoteSourceControl", + "location" : "https://github.com/krzysztofzablocki/Difference.git", + "state" : { + "revision" : "7eb73c5d28c87dd6c4bac805aa28f757648aa92c", + "version" : "1.1.0" + } + }, + { + "identity" : "filesystem", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tuist/FileSystem.git", + "state" : { + "revision" : "8d8f801c510cbb1592c53140772bf8b73a2df73c", + "version" : "0.3.0" + } + }, + { + "identity" : "graphviz", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tuist/GraphViz.git", + "state" : { + "branch" : "0.2.1", + "revision" : "e4e0796a8fa74b000aba54b0256601abf75d0307" + } + }, + { + "identity" : "kanna", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tid-kijyun/Kanna.git", + "state" : { + "revision" : "41c3d28ea0eac07e4551b28def9de1ede702e739", + "version" : "5.3.0" + } + }, + { + "identity" : "keychainaccess", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kishikawakatsumi/KeychainAccess", + "state" : { + "revision" : "84e546727d66f1adc5439debad16270d0fdd04e7", + "version" : "4.2.2" + } + }, + { + "identity" : "komondor", + "kind" : "remoteSourceControl", + "location" : "https://github.com/shibapm/Komondor.git", + "state" : { + "revision" : "90b087b1e39069684b1ff4bf915c2aae594f2d60", + "version" : "1.1.3" + } + }, + { + "identity" : "mockable", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Kolos65/Mockable.git", + "state" : { + "revision" : "da977ecb20974c4b1cf185f5fd38771b2d4674fb", + "version" : "0.0.10" + } + }, + { + "identity" : "packageconfig", + "kind" : "remoteSourceControl", + "location" : "https://github.com/shibapm/PackageConfig.git", + "state" : { + "revision" : "58523193c26fb821ed1720dcd8a21009055c7cdb", + "version" : "1.1.3" + } + }, + { + "identity" : "path", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tuist/Path", + "state" : { + "revision" : "25b8619f75e3d2141940a64a7b870d893164c352", + "version" : "0.3.3" + } + }, + { + "identity" : "pathkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kylef/PathKit.git", + "state" : { + "revision" : "3bfd2737b700b9a36565a8c94f4ad2b050a5e574", + "version" : "1.0.1" + } + }, + { + "identity" : "queuer", + "kind" : "remoteSourceControl", + "location" : "https://github.com/FabrizioBrancati/Queuer", + "state" : { + "revision" : "52515108d0ac4616d9e15ffcc7ad986e300d31ff", + "version" : "2.1.1" + } + }, + { + "identity" : "shellout", + "kind" : "remoteSourceControl", + "location" : "https://github.com/JohnSundell/ShellOut.git", + "state" : { + "revision" : "e1577acf2b6e90086d01a6d5e2b8efdaae033568", + "version" : "2.3.0" + } + }, + { + "identity" : "spectre", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kylef/Spectre.git", + "state" : { + "revision" : "26cc5e9ae0947092c7139ef7ba612e34646086c7", + "version" : "0.10.1" + } + }, + { + "identity" : "stencil", + "kind" : "remoteSourceControl", + "location" : "https://github.com/stencilproject/Stencil", + "state" : { + "revision" : "4f222ac85d673f35df29962fc4c36ccfdaf9da5b", + "version" : "0.15.1" + } + }, + { + "identity" : "stencilswiftkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SwiftGen/StencilSwiftKit", + "state" : { + "revision" : "20e2de5322c83df005939d9d9300fab130b49f97", + "version" : "2.10.1" + } + }, + { + "identity" : "swift-argument-parser", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-argument-parser", + "state" : { + "revision" : "41982a3656a71c768319979febd796c6fd111d5c", + "version" : "1.5.0" + } + }, + { + "identity" : "swift-atomics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-atomics.git", + "state" : { + "revision" : "cd142fd2f64be2100422d658e7411e39489da985", + "version" : "1.2.0" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections.git", + "state" : { + "revision" : "3d2dc41a01f9e49d84f0a3925fb858bed64f702d", + "version" : "1.1.2" + } + }, + { + "identity" : "swift-log", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-log", + "state" : { + "revision" : "9cb486020ebf03bfa5b5df985387a14a98744537", + "version" : "1.6.1" + } + }, + { + "identity" : "swift-nio", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio", + "state" : { + "revision" : "e4abde8be0e49dc7d66e6eed651254accdcd9533", + "version" : "2.69.0" + } + }, + { + "identity" : "swift-openapi-runtime", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tuist/swift-openapi-runtime", + "state" : { + "branch" : "swift-tools-version", + "revision" : "863d51ca0b55a72143462f4517065d906a24e0fb" + } + }, + { + "identity" : "swift-openapi-urlsession", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tuist/swift-openapi-urlsession", + "state" : { + "branch" : "swift-tools-version", + "revision" : "91b1694705584a09827049b690e07f9118cdab5d" + } + }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swiftlang/swift-syntax.git", + "state" : { + "revision" : "303e5c5c36d6a558407d364878df131c3546fad8", + "version" : "510.0.2" + } + }, + { + "identity" : "swift-system", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-system.git", + "state" : { + "revision" : "6a9e38e7bd22a3b8ba80bddf395623cf68f57807", + "version" : "1.3.1" + } + }, + { + "identity" : "swift-tools-support-core", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-tools-support-core", + "state" : { + "revision" : "3b13e439a341bbbfe0f710c7d1be37221745ef1a", + "version" : "0.6.1" + } + }, + { + "identity" : "swiftgen", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SwiftGen/SwiftGen", + "state" : { + "revision" : "1cf6d7eebd70c2157f69d5a991bc57c1ef182ed1", + "version" : "6.6.2" + } + }, + { + "identity" : "xcbeautify", + "kind" : "remoteSourceControl", + "location" : "https://github.com/cpisciotta/xcbeautify", + "state" : { + "revision" : "2486f4f69967da39ae2611e6286d60c8d3440864", + "version" : "2.8.0" + } + }, + { + "identity" : "xcodegraph", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tuist/XcodeGraph.git", + "state" : { + "revision" : "179fbd4fa5da6ddbdd67e541f4eb4afe6438f86d", + "version" : "0.10.0" + } + }, + { + "identity" : "xcodeproj", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tuist/XcodeProj", + "state" : { + "revision" : "75e787fb3eb5a8397c3d06d5a71e667ac2d20ac1", + "version" : "8.19.0" + } + }, + { + "identity" : "xmlcoder", + "kind" : "remoteSourceControl", + "location" : "https://github.com/MaxDesiatov/XMLCoder.git", + "state" : { + "revision" : "b1e944cbd0ef33787b13f639a5418d55b3bed501", + "version" : "0.17.1" + } + }, + { + "identity" : "yams", + "kind" : "remoteSourceControl", + "location" : "https://github.com/jpsim/Yams.git", + "state" : { + "revision" : "3036ba9d69cf1fd04d433527bc339dc0dc75433d", + "version" : "5.1.3" + } + }, + { + "identity" : "zipfoundation", + "kind" : "remoteSourceControl", + "location" : "https://github.com/weichsel/ZIPFoundation", + "state" : { + "revision" : "02b6abe5f6eef7e3cbd5f247c5cc24e246efcfe0", + "version" : "0.9.19" + } + } + ], + "version" : 3 +} diff --git a/app/Package.swift b/app/Package.swift new file mode 100644 index 00000000000..0964818d446 --- /dev/null +++ b/app/Package.swift @@ -0,0 +1,23 @@ +// swift-tools-version: 5.10 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +#if TUIST + import struct ProjectDescription.PackageSettings + + let packageSettings = PackageSettings( + baseSettings: .settings(base: ["GENERATE_MASTER_OBJECT_FILE": "YES"]) + ) +#endif + +let package = Package( + name: "Tuist", + dependencies: [ + .package(path: "../"), + .package(url: "https://github.com/tuist/FileSystem.git", .upToNextMajor(from: "0.2.0")), + .package(url: "https://github.com/Kolos65/Mockable.git", from: "0.0.9"), + .package(url: "https://github.com/tuist/XcodeGraph.git", from: "0.8.1"), + .package(url: "https://github.com/tuist/command", from: "0.8.0"), + ] +) diff --git a/app/Project.swift b/app/Project.swift new file mode 100644 index 00000000000..a733dbe9828 --- /dev/null +++ b/app/Project.swift @@ -0,0 +1,72 @@ +import ProjectDescription + +func tuistAppDependencies() -> [TargetDependency] { + [ + .external(name: "Path"), + .external(name: "TuistSupport"), + .external(name: "TuistCore"), + .external(name: "TuistServer"), + .external(name: "TuistAutomation"), + .external(name: "XcodeGraph"), + .external(name: "Command"), + ] +} + +let project = Project( + name: "Tuist", + settings: .settings( + debug: [ + "SWIFT_ACTIVE_COMPILATION_CONDITIONS": "$(inherited) MOCKING", + ] + ), + targets: [ + .target( + name: "Tuist", + destinations: .macOS, + product: .app, + bundleId: "io.tuist.app", + deploymentTargets: .macOS("14.0.0"), + infoPlist: .extendingDefault( + with: [ + "CFBundleURLTypes": .array( + [ + Plist.Value.dictionary( + [ + "CFBundleTypeRole": "Viewer", + "CFBundleURLName": "io.tuist.app", + "CFBundleURLSchemes": .array(["tuist"]), + ] + ), + ] + ), + "LSUIElement": .boolean(true), + ] + ), + sources: ["TuistApp/Sources/**"], + resources: ["TuistApp/Resources/**"], + dependencies: tuistAppDependencies(), + settings: .settings( + base: [ + "DEVELOPMENT_TEAM": "U6LC622NKF", + "CODE_SIGN_STYLE": "Automatic", + "CODE_SIGN_IDENTITY": "Apple Development", + ] + ) + ), + .target( + name: "TuistAppTests", + destinations: .macOS, + product: .unitTests, + bundleId: "io.tuist.TuistAppTests", + deploymentTargets: .macOS("14.0.0"), + infoPlist: .default, + sources: ["TuistApp/Tests/**"], + resources: [], + dependencies: tuistAppDependencies() + [ + .target(name: "Tuist"), + .external(name: "TuistSupportTesting"), + .external(name: "MockableTest"), + ] + ), + ] +) diff --git a/app/Tuist/Config.swift b/app/Tuist/Config.swift new file mode 100644 index 00000000000..130ea275dc1 --- /dev/null +++ b/app/Tuist/Config.swift @@ -0,0 +1,5 @@ +import ProjectDescription + +let config = Config( + fullHandle: "tuist/tuist-app" +) diff --git a/app/TuistApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/app/TuistApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000000..eb878970081 --- /dev/null +++ b/app/TuistApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..64dc11ee743 --- /dev/null +++ b/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "filename" : "icon_16x16.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "filename" : "icon_16x16@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "filename" : "icon_32x32.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "filename" : "icon_32x32@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "filename" : "icon_128x128.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "filename" : "icon_128x128@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "filename" : "icon_256x256.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "filename" : "icon_256x256@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "filename" : "icon_512x512.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "filename" : "icon_512x512@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128.png b/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..c76cf9583c200a8c857312dd430706c95ba47ce0 GIT binary patch literal 23969 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 M07*qoM6N<$f;NjDxBvhE literal 0 HcmV?d00001 diff --git a/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png b/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5327feb8690ead5afff3cf43632eeb1c23dd6391 GIT binary patch literal 81740 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 aV8W&}AB(0-VFQ5oO-4fTTeX;R(Ek9`^;aGM literal 0 HcmV?d00001 diff --git a/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16.png b/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..398a083e82c90790861fa3f1522e1d39b25ac860 GIT binary patch literal 1163 zcmV;61a$j}P)U>h*?d$b`aT5T$j!+ zmv){4Q-A$k)t||l8vWnYL5&#};E{=yZHo!sB_1(oDdMW&yvxUe(=MMoo|R;r_?B4G z3TlS9Ni3&3^n3@Gie;^}gV^4m)mN9r9O_ZbVG|}8icnF31O?%L{L_vm;#3HD6?Va!XbBie+=k*;rwF^@ErnnmGiG7&g~k7pMfj= z2Nx-7yi*22%K!iXIAvH#W=%~1DgXcg2mk?xX#fNO00031000^Q000000-yo_1ONa4 z0RR915TFA91ONa40RR915C8xG02iH8$N&HWjY&j7R5%fBQ%h(QQ4~GzW%9Gy+C*dP z7i`gJyGn(kRf-Ey7Z&^!tcwa#bniy|LbW1pT(}TKP|-yZmk~r15kwcYmR9-^jT@~7 zB$zbT<}>r=dGDLSfO^T9xw)TnKktn|O(dzpN6q@Lrpd%`*~JMg;r{li3rj+4k6DN$ zAcPd;(G(^~(X6m&?K&ub|5^Qf``%>RMY2?wK=viahBme)Pj?>!o#(NyJB?!XgI;V#&gz9Gy-h$9FZgM$-5~UW32r7o8v&TY9ie|H1f`gV0 z0k$bsg+tJqV{Nl^ewZZfdIX9|YzLdR1|b6qg0Oj85Kh&BZI?}~ORMB!EQWxYT_RA* zM&H>+M($gQd@*nVmpV}XxV!^mCZo?foB4&EN9qx43SjAS+8X_0 z&6crEznV8AD8(Ik`|>+r0*`g-bpi2J7D7>pt^@ZO@m+Lr=^r_18&dTq z`NLQd>6^0{fAPbNq!cf_Y_2jB=&~vl>KbIsJ0gwIXIZ>?nyp<(|2mt?MYpm0U;=lB z-WE8Q3EZ4Lo_=zF+0k2L+wuItR|Ep4aP8rL3W{n*>jJpkKZ=|)k>*^!r%ck?CQqJk zK>J<`iyG*^G~XM0IoTYBpwEvsrAu=KG5L7fy>^K_84h6y6V?!#2~mPM9eV#QJa>tZ dC43=Negi7sK3K=k@Sgwx002ovPDHLkV1lK40a*Y5 literal 0 HcmV?d00001 diff --git a/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png b/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..20b3235543afb3c3e43d31a823265254aeadcf95 GIT binary patch literal 2697 zcmV;43U>90P)U>h*?d$b`aT5T$j!+ zmv){4Q-A$k)t||l8vWnYL5&#};E{=yZHo!sB_1(oDdMW&yvxUe(=MMoo|R;r_?B4G z3TlS9Ni3&3^n3@Gie;^}gV^4m)mN9r9O_ZbVG|}8icnF31O?%L{L_vm;#3HD6?Va!XbBie+=k*;rwF^@ErnnmGiG7&g~k7pMfj= z2Nx-7yi*22%K!iXIAvH#W=%~1DgXcg2mk?xX#fNO00031000^Q000000-yo_1ONa4 z0RR91AfN*P1ONa40RR91AOHXW0FO>U$p8Qdi%CR5R9FekR$FXT*A-p&X^&^d*x1H^ zjYIK+V2Fg%(uxSGAeAOmRg*@k_#jQv@|8$cf2y=<`w=N>rAlo-A|=XCRX&@fiCUsU z0#4e5kb;32M+smsHU@*AW6yi$zPt7r4;@1vUwxd>x#!Ng=bpXx+H3E7fd6sR{u}m3 zMn>YMX+KdcmLGZd_y_ine*FEfRPE~3oBz}}F)_Vyb#v>eX;`m(baH6VnRCOx7F#dA zc&J-OQ!aP6=k;g5@V&tP)KJmsIhmO4U*1O-lc5U(nF5Pw)fbaBt+?HtSepA(@(*!t4GI%PNlzE26Qd5_IGUsE}e2o8#hwkig96K zc~j15;w8tgJySvO`Y%e*h)S3cb}DP>ap)t_tl{+g6UfYJu#yEht_#buVd~~fkAD5Y z1d!iPA!5B71yo5o3NO_|6QvhN~4WHjzk8{V$DCenf+77u^ zXsxb~B{bas)p`sccTmU%G+0JtW|1#A*!raePP{*g(Nn>~Oz`&R^XJc}`KrkJcGJQr zFa>~67Z5}c`0&|f+_u}|!Vs-pP|rv(MMWRIkN{$DZk{yqp>7o8j@PW^5K>Pcuol2 z;u_8+n!z;za!VeP?IkpH+jWw#G-@F5L-ove1Ed!V=-o4oa=FYfMHo810NdS)=Ehc7 z%!t}n%K+o*^9AvS8`C2hy9X>a&fjui*^x>;!w%?m2)D#e7IZU!VTbCO#`{Ug{~q-I<=#uTRWr%@~waQKgZg6;Ic3U|RUVlYgD;jCm%m4y{>gaJxg zX&|Hyni#HZ%Eh|R*`z!~CgqTJAB`c34eh81CH z#=$-Pbtuz#x#**7i;c;t30zq?qJ$^!Ij#e}v=(Ma)rJN_id2P|``5M=04gG6UQ>t? z0vWFnfM)p20vD#GVf8wLRQqV_v?)NQA{l8}uj7;HSDEjN%CG<^tiEn z4D4ye-1V~Z-Y_*)ek<>@Jh8~!@=hU>pHUtfhLm8s%a}KtThYG03FBvrOk+kml(Pgw z8wBc`R>e@Ofr!*I37Dsf36|fCgQ0h3n06ZMdY*1do&qNTr8`~$li5G3km-ib^mEi_ zdQD;r*0i+Y!pR&;IRQk&;yD2a0qc2%5`|#}fFR&^P8Jh@ydd{Z$;FvtGgz9-qq*JW zx4=;P5CGH85OSpj^=X!xZ`n3&F;mjLxH{}0aCBALg;gbNvJ-@i**^ggI6-#m#+4j8 zdtx*~G17<{nUWJ1GB|zoCN2*zz?8BZ4>6G$B+yW4!89#3+D;dW^D*dw4Qd#H?7^() z?2bY9cKys00o=~TS_Z3LhamuiH z!cpqxsmabW^|S^SACZ@Yo1F)h?bOo6(+kK1V}q5Ad1aFXz1`-*;alsp-4D%AhOG}j zxsito7wLJHReCAZN`_R&#Kt-F>}XKonxCIzt+!bBJ7HyeVMmSJxKjN#^d+(9@eaKA z+I6IJv!mzSpZ$acEYheF6adgM`p`)!A&B+#?`|4EfpSqIA#WN|CqSWOJ-pfD8;nHz#R9?3C z_k+RmgaD#Nb9=YG|M68?|4ti??FOud%5igmAbWQBUYpE=< z?TBGD>5oZ0;0fLj-Rr^N(s?S8A(q+wE>vrte z)wyX?|97|a^;~}bh39@(ed&%-j7eWs^c_$CAO8Lg-k9<$xNd6#00000NkvXXu0mjf DB`P6a literal 0 HcmV?d00001 diff --git a/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256.png b/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..5327feb8690ead5afff3cf43632eeb1c23dd6391 GIT binary patch literal 81740 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 aV8W&}AB(0-VFQ5oO-4fTTeX;R(Ek9`^;aGM literal 0 HcmV?d00001 diff --git a/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png b/app/TuistApp/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4808645b309fc8e1a2c4d27ea0e199b0832bcb6a GIT binary patch literal 301803 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

    %41s*W2-=sN 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�D>nAz(rxa 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Π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
    fRy;Cm}+Gi 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
    n!rIB0?* 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

  • +LUEWTQo|K-U7#$^&J^oh0)qCoALAb8QEl%4%CnI zJMbY-l#k(|6ED1=pZ>Mw&L7vxURAyruyy_Vnrgt}jf^LTAQeKdTFl%xnM$-PAwB zf_eo_ca*_}F25am@o{lj+0ztUYwV_1h3_1EAvvqLGW-Zueqod+0wpUdv*KLr(VWIeBpk6GVqza?Cx?-9-MCb>HRm_ z@8o5CC+?n%-_PRsY}%>KivjtNdUpYk+g()_`M2|Pdak1L_grGG9At4q(n$gHF+Uv$ z(VK7N=Lb{I_UA4>l^4HV*gp4bpWWVg;|n%aCJS(LtBekSLG*~hhDgO|6haXAXAEMVvj z{pu_<>Ib3Iy2P=w ze&UkMqjQY73$Oj72Y&6R0{u+jul>p|Z$I!uKl}$j_~8%#?u1!(rXc(KpvWg!sm`1;@J%-xtq)_s0YdC*y1!dMz&fTnOyiIw)j6 zKHETY%cjZJnzXv@&8Nu`Qys+ke*!L!Y(m1(6^t}kNu}m?Wpa zNrvaF9G8#O83ZIGbSvks8^NhhKno8a{EJuh#aBKjVJ%(hN8cyz^cm!>7UN(@z3WZ&PGajkxbD!7J0yQ7|C`` z5PBv!bczd}eV-gojL~r?5s4eVuOELUGwS4nx46;DZ+|P*N5V!u(B5*Jdj14&dK5Q4 z#SfrmZ~ft4gBaLFW7(L_IwFFMoh=U78C?^ldnU%aoV}_7xGawxr61T34IC!eeHH|( zt}+D%&C&==>8@??(I>jY^?-DLmo8);{UG>uh8WjpVVGz|^NI_vondMb5)O9P(nDJ}`hklLfYGet?_) zgNwhhVeOK7S2gHi7@wSk?@Z6f=hBUw+L?XvMZcb}ok>+_hThmMTxapMCck{!x3Ry+ zH@V~yXp1|?+Sj*nmqt9cU$)?9qBn5GQ5gruu>zldN^@5d-Zo~t60hgM(R zJE_Z7Uv$+uF?TW(v^zJFbMsktnMDp^M!#Y~%;-D%FFQfzFSK@>^9S*)prL(efkK-P zdG^(b+vG1eqeD0WyUMJ*6Pd6hrJ%UG2OUC;y1+O?|et zGuzHs0FU@bgAQ;CcJS@~Fl>!&15eLj2~@n@9lg>ye;faN*j_!55kI{R7QCEEw|qbO zxsRO{ZS_HC>C*OIy{6OMA1Vi2s|0TNp1ek1{AF@N_~<+%Fwr5_>q~fzEO^4N4_@H* zAPu~8R%(;*Q<~{pnF9}w94(=P|8;_#ofki&Z{mcie!(%iv=ETXLMwdeTb)70 zF5pt%ID$NXjrX*7+-}t#L$wc|++``hgJ;RHY>5X60WNI!INS1>HgHq$t3A4pt{nI* z{fsQ^5=Q!ebasfJ-QJZYeQiPN=j*6-?cSpv*FQ3b)8W~ta&f3pdULT1I@8;W1V4OL1c6cUszW6ex;ALJm zcr?%GzmWcSx`=Pw<({kOUU;c5>RZ1az@FeeK5*guycn+d5>IlY$1R?H;klet$T;}G zI|)wY#K9Z6?f>&x{C}-Bx{^2j-^>Y##-HF0}6g&rmwtiJOMuob@_eriWpsTl$Xk$f8mXejdj}5CgXhRW%}c{ zJg1%XF0P4BrSgZdyOr5Iz+DO_^RmU?+c}aCbn_Vz4-ps|=k`2B3je zXXW6|D$jxj29C)YIpsKK0zJuK@F72wAhg<7Qpy*dP6|w-(s35oGeE(G$ETk^v3=xY z^Ss}~GmJr$z?%iq;vWBSY}+sWy}R4B%eg|}?btib4)zYn68_f!T}|a!z~PBp&c23= zJSR94y(PQu;FO-F&x8fOzHz>ilc!aCf|yBCX_-JpS@dtAm65-?m5fZ>JwG&y=ow&> z6ROi*K`76mlVpIuq{9%IgqTg`k$BQro#Ss3T=)yAE_#B{w`+9J z33K$@i3__DDg`{3sSfrn-IyG9ppF5ef%3L&RXQeE;f+tZRTgjbU|aCq#%}Ud8tgi= z-@?GZCek3-i2d~Sl@9S+9>XSh$J*#>Etc?MBCj5AbWtD9F?f1V)$mv{8a9DfQt z8Pab~4zZIs*iYD{4IcXDGozQ?p7f(W-RY`&r$hK7;P4cf)D?%5W6Sq;-vYb*6<5`V zZ9ZsKr`ZbB@*2G1259s&x49xGzL8#w!#PnJDZ}5=F+SiWAG@y!wf>`y;ZqF5<=^xz z#KdKG*<|@b048^2a_fpg{V83C*O4P6BZ~#-ww*qU_wiv^*GT|B|5thGg>&p}v#8#6 zxbste+Gm^Hj^JzCY_%_2)Lv|nytV4#cWmohAIny|vg&PDSu_U++S39?PE4n~r0wBz ztKclal{4q^>}=kpMc<9x_?mu>*&bQ9WBcWfK6dg5|6T|NR{WD?$y2{b{lY^H{LM#E zZGZ}-oFLtXnfhi9w_orSaSe2LHV7rLohi{I|(1zvLLW7{z?{#^djci}(izOoHI z{wTIBB-m{|^WFtVMlUoPyGVugl{3aaMo;|xeqyL6_K8<{#%>nGODFh)YrVxEpYUl{ zDo;f+XBgRz!ka}#^_BkBp4$P^TwOK~q<>z+-iYLiEgM&?^6dbKJ2Yo#w=9y0Z!W<~#B_5wPF1sOlj7}Xv#Hg9{kN~yZ@_mOtbZiZ1rtP{mQ>peHyA4_4=@pcqd2j zly(4Z>2r7-`+%wZ*-je@BiGFNf+IEH^jG*9-|w6uRq!d`@yaJB*Bk4nH@@tj$q4|y zcQ;qbFFtvpIPng%oK*01nf+PJkM6^N+AXNiwP>C)G{-l^irSG$KX|lxAs(GyzI-){ zR14OCg&2EV44=;1>YcDza|N{IR(d>s_dVN}Kly=lFmHfg*Q48oQ}5sI9(k+!L#uOX zeiyveb^62MWXJh4Ph_E5DJ)1%(fN_Fmpi@J>${oX`6L zu3dR!JAeLM9woSztN&liF9*C;|G$x+?{ho97aF<)z+D!8b>K|iC2%J1ADHnw@fJmx zcY6UM9-Igux4RXtUB9$l$|DUw{6qit_80!*pU+Rw-s~?fFmlJw=x^*jV+DEY<4bRe z-xc@#PT@au<$Uad){J4n;e`Ln{jtN5%t?C1JbeonofyC2tS<%T@KfON3$`jhdoE)~ zJ~`u0h)3`GIS$$Gdx>;?By(2MSZ~1JF+4utR(-Vji9SkC420I=y)tL~&>#IYl^1>h zkK$woe%Nv81TV@uVQ$|^{_%CZypxkmxAUmT&AwdHNuJOC%4ecO>x+}$7x2HP&*Lg9 z5+4`7ck%qwX<&D&0^485YpY?^H{ChDc;W-6PaHY>od&g;um&U^dPw$h-cD2ir(Qx4 zAe=}L`f$nvwGuI~CFvGbNX3y2ervM9xjlEw!JYX`noYa2Vsq6)yCMEP!X-#P_2b#Dz)80b$Z4w_8Kh=%?@Gp;$-|GpU6U%o z3-?T_Cb2KvGk_X<3bqrHz?7HN>qAcR8j$sD|Liy>3)~vmac~cec6Kmf zN<-mHr2R}2>4?#@uudG6k5r`KAAN%&8?YJPz_Zinj?L$bK9L5;L-!z2qBTcRW4g*WnGE#Hv`Bl4G4Lz|XO)?#NW03*|WS zJxl0Hi4Hu*=HtJXbnH)T=4p+H+dEx_2UP@ zhy5JSpr6Sr+C9!5w#bp);t8#AU%l0ap<6wfNTgqNk?lI6qOI{4d@Xd7uNP{WP{=O| zdx9&W{9o~_4IQO=3qCed4nDzGQ#F%TJ_x4?gSZJexKmbWZK~$N}qtV*NwmckkCa*_V(Z!LBHOq!wqy;Z})nT@De=K*fDd3t*Fz0W_ zSKFq&+dT$^I+*=mck!e&?t)uc|2qcfmg^8c_-oJ?LeA}iKW#^HchBUx_b>K%7e zFE6t%9PFgbe^A!a3@~9dPIyKlS5D5du99TKl-*>4ug2ppS)-8e>l(le>(EyR{7K$ z<4*;ru?$X+IJq_6LK^?2lV|jg=T?7Xl}88cd%oUPbn?+HYp5bPD zM@IrXKlOL{if8ik%ztkC_s0MFQRMTXuM1iDpAJ5n6Z0MccEYg`fy3j>3Ge6m^Ygjw z|0~<~e(Z<0zw%fA+q^__+dld8|G2#2&$lKBuEV~Qo%}FcCwS`bv1fHb{xr$G=$KEt z3*itG0b3WXR=m{0?PqU%pm)gd%g~nx2vh$EUN*NsciW&bVbRai-lKF;z27&4M5Ov#{8Sa7w79BA`s)`ofHI0!jrI+ zf$wgE)CWZXMZ%1x?&<%B|q@7CgOvKlcha>k`41IYeHPu!_~6j zf)!md1aBwbIbKDbcBOr@+eF=gc@}#Qbq#7@4S4wIM39gA>~`r@;^3|CM@P;Y^W$M# zeQ3fIcz7gVHVGp;_GvQ+t>jHtCeb}{L+_CvPW6?6Kcv4~Jp018Y=@@|Mx_;B$QHhX z-lHeJUh&}zFXE{Bu)7z&H52t&RM*FM#lumJXo>7L3(XL&&${I; zK!uwHCDHOpJN+KbZO-sEW&>&hpl!)uAmZ!gJOgU=7@o+mzCwqt%eP5szB=^n#J=LC_SOio0kOe-ssFtk#$k99+ECGP38+zcsb2VsAjx62M z0o-`8Wq;+^@zE7KRPO``&U<$;{f&jL*a@BPCtiEfvvm1gH4!{}5T|?nrR|YB`T?WB z(@BZr(5wx2crbD^l`4aEVBo8-q#Ky}PwEz4edZa>#Kk-OZYE3mG@gU)=<&QHYrm4e z^bZe$jY0lHE%}ILV+#HG;4=wX*kLIVOj@9)dl1<#6G?^w>V3QNHvo4xCs7B?cp7<0Acf5-s)7*kLRH4kx{J z492g&Y#$w4db@1&qP}?+CB%r6@0w)O=ir(XXkog?`mJyERGGzQ0=N2t7qX#k3>%#e zKK_mn96bS(efnS{dUgB1w(=85JhHW3%}If^Ele0M$;j;Sx;g1ioS9hTqYJ?BHaLft zeP6iO?}^Vs8T^b@y$}*!jB&$@6G)*GK2-QQu%18(-Km;>bk9!3A6)gp_@k4}_R~-t z2Y&Yc^#}5|eQYv%8UHm8kfW69A+W`lV|}W>&<02Q_0hdeJGt&>VXm#TN01!NJi*O2 ze6fBO9Mxj+HL%iW#yRlrX26@1P!I4C_|8*Ohqrsju59o5(8b2=`SWMHkbL{vjnIB* z>%}jA$kCX{mW+6n6TmFqZM(S2*2UD2s=dL;D>FA7pK>?O>6~=%)_gLtQzk}&uKKHNk&`oYYzW=cS+j|c+j)~d9?(CVh4#I)ec=ngx?Q_* zC66?mtG?s#vsjN$-pPrDqtP23`g&a8N`5Ke%H_AVi+S_^ty{OU=+7lSfzf++k#Jy=~$s5Dm5mD)X)h0LB7)7c>oi9)lWN3XZ@--c4MBz z4Bt|p?yLZ`Q9pLzOq-5+Op_XNP>)aFB6T;R7V|D^hkiF?Pj zuaEtsFP{5dAC*`vNE^UuF%e(Rv<5m=EAS*n`@PL1j@N#>BZBWUdfF4zZ4+>DP5~!C z*VO|7Y(O;_f}0qcfD|bWfU=T+o5s?0d+UdPcX)6MR@(g&ym;D4=@pX1Ok*~`^!EhK z&`E0O75AZuhZ&qZ_ywnwp)cI!4{ybljobDjqrM%`BI5(eF2URdUEq8qg_W?^?PfvO zvL*;K0UDm%4jd6GM<+j6PeBVWYm!o)Q!mizr~_e+B|&yUbILA5V3b}JNwTuAUl8=A z6|UmTekW0ZS)~cie1c!7TznO6^g!Ow?&2*nFMM!!0Ub6iTuw$ml3bH~fXE|B)kbh8 zdhX~h!^sEs2Uu-ki-7ijDBVyEL=KFK7&6p=CAYuPe=Ff1=oI63vxL8rZJuutwu@P z#&7Ycu|6lx!%rtN$sP1}Sjfjz?Jr@eH~GUO|4@HIm< z{Kt1jcOzTj=o0fOCTIAoerlJgAHGKK;A%@WLL2|?NTLg6<(!2_U3J;5zT>lVRYTk4 zzTydOv=sgM^62&<{x+_E>=QoO`hkg3>e2FDF%XJs^BsHf!P?DB0rSVtQqldjVB!-G z^0Ftr@ByAqCN@$liv!i#qKOh3G% zt6c%ps11_pRbP6*KoAYT0|T}TUj)<0kL^x<^pInC#cwJPK3H0z?W7{!>P*=$PuN?$>6}iqn_O>D5mt?`=fye zi)nD`$2QSo@UlT+)$i?tV)vQAtaggPTgTYcvz5{@JNtu;J?F$yb8~3l+pnC%qyJja z55Cc7dC?9}WD3z>wm)AqTzt8i+vQ(;`RVQLt8Zr!o}cgt+{FDi+6HTMgBK%Q=bfR= z=FJJgS3g7raLBD#Ayauxy?F>6y+9ILbmtA}=g-fr>=tQfast3l;%tI#+ojCgJ z_SK*JNahB?5FNmY-_k38ljF|3{rk3Op1YPS`0fp1>toxK7oXfNUCPz;>v=vYeOx_P z;I0p3AHVJh;NyM9KXv@sJE+d&odW1IzCza3eha%BdESZquI`@<-(P?I_5AeTSIYak z%jMj;i&=a|x3#EvnV0pw_tg(o7gsL5Q5=4T(TOS-g|5E!#`fl=ua+h;%@y38@Z2*m zhxc4CPMxudkCm_Zuw3exd_MMH`_iv%&p-G6T>1aY+XueomF?p{{qs4gaBE-ek3D&s zxtei7zvHnfP4cbQ?YU{@SbWZ0Y_4vHjm~$xz&ENKg=XV%kiyh>DC{}7KeywkF?c_X{B%8|bS! zcAwAh{m1_%#@N~TvGi=L)wew98=lp{OZMJ5k#>IQ#LlJ5m*X3k`v`!an7n=G#`f}y zFKzF8_5J_&<3CH_$5-Ax0r2>A`TrM_*m$%!o)Lbw_SGFZedO7XHc9W$0$V6FF~yk# z3g;6Y9rVCupQClaO2GF_nq!H;Ho?&%;CurE2VDA@oN{>esc5}m;?QjelWvP{kJP2o zfb)^xdoqbNjvhMdls@;90G&jE&YqAWCcK~c-*WXoGzg7Pd-e@+g~e0&Yfz`Yykt8( z156+7+OprovGZ$S?lWji_xfV>FsHEM5q|=cg4CT;CrNt*X10QC)KWEVm z1QXy#bEaT$&FzSi5vDq6i0urJ7O-TbH+r@u7ntgxx*r)OmFYX~vGkcPQ}BluJf(k_ zdRV`MR2OuTHgpyHee;z*DN~=b>~4h%te;}xCk9A%ZeMR>O>e;+=jcG9XQVeloZ^ z!HUppa&AD^R<#9JX_b%NC$mp}_59OIxemU#^GpXMdk}pnM>6o@sk({2*rB?f#XeKGsANu`{lv!0za;keq!4o@8v@C9Hw}rg2rHWaD`q^DDLz`bkDSB>pAZ- zko_)<0$&;{#)uP|#1w~Uv8O>d;hdv6nQ>fQ7IJvfzc2p@UAlKGE1H!d_@@L@;KE$# zSFfS59(%xd+ta@#8@e7_W8QOF{dJiu_RvyxaF7h|}BoH3bU;WNveLmF(m}%SPEDnBS zQWK7=ilO1B+0Wg2A_c!}IW!|MLlcIJA-3co|3;ymE{v!PA&us6sEggcf)5R%0Rk$L{SFKODab z>f&B)ljrE)_!tBM*H#{qU&vUSt^PUgW>m9dlT?>C$R-z7VZ}{$@b%^F!`+i);wAms9=c+?9ni>k^uR8WCl&gy6FN0) zs%L@@TGyEud54da$NJZAclRv)9j>|x((<+Yi8{O~dkUIO?*<$*#$*%KV=H-_Q z7MxO_NqtVZ zw+k0v>B9B-SDp<`pU5jd_;t$Q8ebJNYi`M|{Iq(A5MA(P%YJ0|F655B6?v=84CD>pAa5uD$< zoqYNiviQ2wE8SiO`1Dgx?eR5ou_a%ksloM5U#fR1i}hP{SwE0B-s!XZV7x5QBLbeY zmkZbjoOy%=|5soCVitHeb3(vR8BQ#F2HygnOlaPD=T>-me!FntVtzf~_2L;hjB}^* zj;zaF{8I#d+|ExD+CF{p`QFa&{Rq`lbu&KeY?ntHj3337wl96<^SPViLKpuZ{qB$C zw*Ozu36LAT`oC;Qx%Q2J>_H#(^~l<}799uo(zPvpjqcJfeehD->J$I)H3x7fjd-kn zQwM+kmDa&-spIdBk>F)l^EUY1s;{$t&DFv0g?}U8_;b*A5K5}#=Il$(21^;`cPs}z5XcJ!eQa>`ELc!Y)jfO9r0h4@PW$M}g z^f9h?p(G{(qxjzeDO(P$KOVp1_a|rtWIA>5PY_R^C1w&wK20oXyLIiz_PI~(cQ~Y< zgyET61V(OHXMv4}xzZppOn}ZH5^#Lx(>~engp&O5HE6RRJS(B#37G)&_OGKBAAwcq zjA9-Jawbv|X$OVWhjf!*b@6bpDXsLR_a?OrT(;2Bg=AFRRDpy|8o`_N)7t}Qfpgr% zMkctDNEHbg|HU0y$u$#~^sNopGIr0ma>Cbs&PI;kXv62|4PE#LK0uWjzw}>y%&1xz zJYc={g)iThCl}oI7iM54uPxM@66zfj|Dfn8N4($`c6W3#yE8JrE|2)b1uS-1++qk0gVjc8iAnqDlD4wNfx2)ScfeWoiO05A_8FAc z$u52&QmO}h(L-?7Gsu)LdlHl^-ZjvYdV?XKRls40tiCf);&Akx%7d(G(;?vGU-(8A z^{y~g{?IZg^Bs$_#@Eur?oZ*k?d30R%lE2R4CT+hywKZY@gEvpz-DrVIxn4=8NNmr zsp|w~bOHxB;)*>oH20Fb>UlW$j}OnJMnCjy^|jU45jyln=j>pg?#`T(7iL1@gwdQJ z%hi@U=^L1}XfB_@Mc4Y3hRMY)bD9dTLOb8nr@j_ECYpm!e?Bldvph!M`lR;Y=X{HQ zYF8>z6zDM;G}L#z$q^oRMh?80ppik|lvV z1x?XLkJ(XfpZ>Pw^lJ_?rcGW?t_x4)Ex45NjqVnYHeWQ3x*IFwx?>aOFqAQoZQVYa zx^$x(ye_@LN9X;COYQKmC;78)!#~v1;n-f&=-;t6dV^~%1n3%FI?xKHcFD1#A3oL9 zZfO^D%l?%MKJ^*Dz%M)D%~ehMJIJ2no*>+D4^QE}`oP`8xN8o_PrmwVt)Tv+7rM5_ zH@YgW$U9g9!`JbaHYc0bVnXiaY)9y6$CFOQ7bL|+M)-W;s6Fg!&mSKsOF6+%eWeoq zmV)HpUht_L@a_8Gt90XpytZZI@|!VljYr}}JcmX6Yr?V^|V=%euz zu*pL+mpk*6->A=GHF|&c*{2%E{Ab~W%fcpFImm~{(ks-=*~TV#OKk2jP@Umr&jskt z@3fC?CkJJ5fBuQ>Y;#n6)MH)n&G1 zn-i+!&YSPQ^2&BGFU>pi{HJrp`+8p}_~esM);2e;pHAJ)F3Rr*f5)ZTATb>RWN?+8 z9(p1~T;vNsdYu#Gxbu?`8<_jKi{k2bBhTye^`%263pz%5Cq()vP8K}<%yW4p;qrDp z?*X9WBS-TthP(?Pd)w<@e=X05hvz(Iz=qyO@br^8VQ~J*&I{-sAL5&CjotFcy__6z zTR)$8>&>sl7$>&><}dxF?O*zV-@E<%&;3GvZQ*i#1P}DpSV~{;Y>|md#zwIfnvnU3)$59ww{?mMuCb_~%cfWFA;$0u!FQOS+ z(BVI5g@qnZJ=S7_oX}jtfvs$y0}HotZ2WlOCsxxVvboEV<29G1gZ`5*XH7Bv&1FVs z!`sBe+9!wowN6`ecz*U)Ugr3E?hLtnd49&xiJJGm^8W4BS6_`yFMRoHZ(jbTu=-fb zyC(o1t2%#6WIXPh%R?`mmWhDbU+}i-yZyGO|NR$EoH+fo#Iq7gJbiaYgHeJd$+rn5 z4rWr45NVh~JIUNYkfe|R;@BLP=f|yEIJTsQVqCjz(=ZT%v57_i2ClFH5bzw@)de^) z%*hSNAO4u5;7d^AeS%KXaGXI*Ohw8j|KR!bKTHzsnZ22ypuF(m6%W1okz{njOZC!N z+~g`Di7LH(_W*~ZKZ_E8yP+|+oR7*o!6Hjw-^tlJIF?*Hx`+7Ex(3S<4h<97(hpxw z8Z?PTAZMxZu_k&=7GOe)o_pmGzI;}qrZaql%}(_?lUJgE9ld(?oBh^Arv2I)09~VA zu!Cp%6ffH8t4(Qg4c=qUz=o$a8L#aFReuN_S4QsKnrERpnb`fOr1XO`dVqr-*&QQ` zl6r-2%%doK@&rZJ{P7K?lcHUx)22NfkvDkSuFtN6?A7O&tZ>-JhkoF}tbzxzz>b9r z-gsg5_W=xWaMR%GN1oae&EV{n$ZVIq2JXrbA2i`xyo|202nbC$m;KmO-O?L)U&r|F zpko^@`fdB@rm(3k9HG)SaY_Fs<|-#9!Qzom7I*EE#?p!0qw>mz4xY$bopqoWOQS#S z%a^k|zNc>2FIw=Tvt$8}x5+7K&!1z1j(De2c-MDsYYcqt10BB_{mq>tvyf{JO51(! z7fA1=H}$=nLoK?=faM==`73YPaaf+BD-+tvkjhSA%#!?}9X!)#$44ibXs7bvhw|XE zCAsVQp-pyrM2D@K--6GH2?Xv2N3iV$E!0MzcIA}nG)2;o#r}r(g5P zRPM5kEue%)8JUNlB}XU3k!i_FA9#17q<6vSn{OAg*@c5{$XfdQ76qXApba_M3&(o5 zK-$~^=A;cBS2qC`Ka1|drEPRK{2Q?~d<0?iQ4Q*v68rZydo(9k;Nc-pqYH3ilK;_nV<;!iR-QR^>g4w7dtdGg^loJV zedg?$`m~>#IJ4%-)oA-=|WY>ZWhuYeQ%KF=H=aGQCUmzOGsB*L?3cPLK8`~}PA3Qi+TD=>N{DEV4 zFA-Gdrv+V=Ci9Iv_fIkIARrrB-tWf7;sc+z@7#=@pKINvH{S@{y!83vlTYV81sAs0 zUi*A_dg~zn-JA$GcmCPlF)+3mn?Gvnygsb@kAX6$v-p2=d;7+X?Z5o5{^ItdfAj~p zpZ)kJx39nPR%x;;-&_5wKc-DR-5t-*xHk5a59BwzivjtRjEAxP;A6=fUa-l&!K;9k z2LxXIH*NfurB)fgkKcqwV@F$PDP97p9Z&3B*woXz()kcSWHkSxTYY2Lq-zkW5yA8VoQcgy3|!0tN#52XL3 zdR{x;6Mz4v{i7dx>R5uyT7zx}(*Q~soLS(n+gCdP3rh8imEEfar`u)KAFl8T zq&VnucKEsw0Jnb)3{D^f2rJ|K!O^6Zibn?*PX6)-Pi_~UB?|s*b+sQs^AF#Rns8!Z zekTLiFZ`c#yJw}sX9faLiwFE+Ttes|3s2yDEFfBP9H<5%Mol8nBo8_Y9Vi0ZL<9al zR}NRcv?G}9!=b=oaKeNA@)Vd}oz1O1_|hPm(UT-G6P-O7r(bQBdW+eXqMykY{kq#> zWE}f6@eE|q;{{!~m7Z|OR$Z?UL_YM%)FcI7d*nnLe)S7SW!>@hs!|fu-AquAX3>wI ze(0M0vN(bZPeC)uZs#W`%1fF{n;r&elA+_VQ~Cu4FC)Wj@l$vRKsbz!$f5A9!^AN3 zSE+q+P~V4xCp75~JvGCNCQRGx_Q-+6UwuSYZFJv>V{lbRkI?E>q43eTD5ZAEu|-FC zji1pCn#;dR6Wz!`7JZ99aA52k^iJd$U&}}N_V5*3?X=LS9?1x2%A9Z-9jfc^F&BRP zWKO0H4)V|wp6I`N39Ou1v0=v-}Dy!iPw{PpBt@U&0h$*^>#?~1WBh10>e z{FuyO^o`oeL+R$&gk$+8p*z71on;?zbl}|&>cFrydfMQw{?n$edIq-_3w)CgIQmiC zugb`+ZtP}(;4!L2H@%{Rhp;Es&$PxEa>U9ZjgfTnOB(dPXk*^9vd2!$o3kqpUP62E z>Xu$U$JW(RIUC;8;St}MBLA{`^IKrMkjxNj8=(5SaS&Ylr&j;UvfsX3J*1xBgIRu& zsu@4Pr$5@5WmC52vy-FvAw7%RJ;ryK%Aj8<@`v4zgHO&N$MT=04>5*T<42ClaTq8M zOILJ?r=E<6?k(2!S9;f6w&k}xv)jY>lQd=v8MJg7T-DDWOQp+a_qVFYyRctAos59j z_ddO(Ki<4;d)33w*YJ(c+AH*yo-0`T>&sWbq_OfeM`eN8Mg9(hH+mBnaFd&@=w4eW z6pwm1myYOT(d=UmWDd-1=yQD8LfyE>-z!&eD0m@9_wfRM`c!B8aoh5*cFwl`8(teH zA!R)7qB^)3sP>Al%=;Fom2Dx4ezHy#%tBU$lsH!*=<`_1K<+dTK4Gv%AVpFNv}@hw-7>0-X<8!A+1~TYd$!+v?KcKrcsz6J+;;P` z-@DzucB=fqhj+LraOpIS)#vD8Y^o0Y&8sKU|J%0H7jAB6p1qu(X1%_hIiH06#L4Z} zja%D4zWU?kr+AZBT}eNYUkz|_U@hXE2*^ktJ$Yx(iN1*M=B?}fl>qiTm8<-B@=F3Y zZ@f*^^5v@iv0Q-%FFuoPw)=TBfL+dW1H510rT4tr7sP$>wa-S!^SD4n z4KHW6=bnD4d=>frul^A|@X5I&K@Q8ELw9l_BDa|TsXzT6Z$I)QKd}Am&wMghpXVI| z^u}k`SPzw4N_I*xmazNe$W-LdIK1k?H9q+JUf57!=kb|#OHJ$}wKxgI55-C=_FS9x z+AHU*QFNEu(tT>(FXgU4OoJpu5zHTutnFW&kM#qs*`;I)6`$+I8)c8(~?OVshp zam)a5%0mL(gU$q^0{|qcbM~EsD-DJ{n7ZhUlPaBzWZMAEmcvR0og4@xC)MWMn1slkC*bZ_w4|aeRj}Sv5y~cEjIYbS5+4}k)yW6 zW15#e^=aSKnOrLR;X`M)){@->w`kLD;=$ilEIWtG_N~t(J|0A#ne2?eYAnw7k4}RV z9kGPYqx@SavO@>Bz*klX0*`ln>)Y85RZa0XZMzJ>zoF=xuVUK;3SHwhbr$7##|Qj; zZlLub^YCnc#RRzd>B_~0m?q9{GdS~w2k!E}A3J0NxYR4Ps{AhvOZu_%<0h zk^X$HHV7QqODp*9N3Me}@A%OuKRM>J`0u15+od-=z_G4mdYPL(G;LDCH}OkPwvCg( zFP*IT!ZZ6Fd@?W!{PG^0zWk{8$%g;*tNsFKzZ2r@m%kjN!%H2PW{&Y&dZ`PVeG<(_ zMnC+z{cG#wjJzX7nb^$MBs#}V-gNSdH~beLzSt90`7idtgR8T_pRCkAWLWV0wKgGB z_<8ge#}nSXta2|0*;Cg^TWnh&3~e3=7GCn9KXfMcR6U9dT35ZABXXb(ydp&{*cJQg z>*vJ{`{)txa16y(j$N|LMo!$4@twUNehZ&tzG*+i>O<)=Jna1NIr#MlN49d9j%5s#tU%1`rgl?aZUn9zMSv~@F6Eu#vIeI{pCaWsz9OBJBrfI_mzM}u94TGAe@g3 zc-#4cZ|TQ&jvnd{9C_$xa!RbX>qi~l@u`rvaZ_20lkWQRCTtU0dKjDOZ$ev{$dZ0b zU(K6=Z5|FB-6;oo4eqHzXZ?bUHc*94Uwo}TXz&$y)suJSMmQ9<)Ak_w8J@zBAzwaV z;*7uY5L*1~(RopIxBXvz0YgPFZDH%=Pez9HORZR^Gbbbt;}(6V?Mz;-deo%|<;(n?lW_Fc^%9$eLr?^hV&;j^4X@?TcrYgj)g9aKK4?s(kDm|x_x{+AW%2(n z=gR-jK$6z#tMa_+k6Y)1|1TmsC-%>^Zy8srC z;Yo+_t?@^91oT&#(zgY^_~gAjZUKk!(rE{JsqYx;gR?nDeC0c4niCxOfnOeVQbw$o zm+~?B2c4PMnyZV`$!Q^xU)`Ca_#!Sjoye-1JM|_;Gnk z9-|+=?{1izH}j_dyin5%C+Eul^}Z-_UHO0SdtZ%j&ASow%lj{Wsycei|7NA|n32AV z?*CN-JZqJ2-XE{yc~fkSGToj%@$~OdEvPvtCpW+}FzT3s1H@heBLGrcr{tyUrD+YI z_MO2daZsEcOyj^{B`AZRVhc|LK%(=^ZfL^4l6+y4tOWvxSO1~kJ%M{^Bi-yKLDB3i{egJ388FrJ{YS4!9hXDX_My4~p#JrF!`C%#&mZ zcQ#=r-^jLjR*!!1r|IzAZ14|1z}X;t`OEiMt|*bx{v_hqKM?h$;36ZL(ct_h7^w{W z=s-RF#(0f^@rm8eWLkX#(-S-Tf)5e0bwG)Hon!?z&Bb3mgF`3Z>Kg5x2Yeh4@7l>6 z_7C(;G!;0YGttB?x?R+@&9i{}Br^4EgH9*fX&)UM5GSU_&qto&|Dg_s<&jGpy8QQO z_^5uuoH`{WQljy6A_KWr9NAx23PHhvFU4fLCt!jAuHHG4eRhIpErP(-GH|8O(hnNs z8=9kM^ys4t@$~uz{|rv_$~PX8OXy-1T#c{oxGGb003dX zH#qP}In5b()@Sj(>#P0H@ZIfGg`$zZc&Lsn)>21D)nnS`3c%1YSuDQ?`eS#ML0w(R zee0!G$Bvme#SQ`R_@U=w@rxF^%92|wW$iz46X5dWL~A~HP}YQ}la+v@sbAw!{(-|^ zaA#9mY}Gp_R({fug3rF-aykSS+|=>ql_S8yhaYrjd9jnj-}v900HZs1vyfwSyr10J`G&7C89d9khw{jWM}6V0-a@CmW(yx5XJdWg(U<)C zfnReEmFmgmu7Ws2`lcdRBJluTzD8$o1lmF;IF+@{PGQkoc^~F3@DH%Db@uuE^3$cy z$`~3-e`~&c_prP!{2(SjM_(DgLZP-O-W*ld(%X3qTWEmI4d~@@om^<_rcY%X;i|93 z7vC@;Orbq^?;L$&drz)LUd^-X7xElF`_hql(iCw$d6}&{?gqaie<+Q^{gws`=$6RM zW^|(8(4Bro?T(hv?_C705XY|Qe#duwc>ByRe|CH0^|!Vs-u?sI)i=DUfAYb|gl6zW zw#KCW@<(SV4~-Fh-)CD*DV00AgA1sbc=qB4x3_M7rZ#caIKRo>#q!Gae$Ua z-u&+cZWir&^Vhq1DWG2iSo2*cVtR*ChVa7#U(c;fssxlQ~`Z&x>;0Pme6Cxef^NXS-eF7oxSeQo=` z@BhK=4}AZ>uzma|KfYbRk-HvFpXtK%PWm|!z!odVt+*2VY^A7U+qtk9eY;wgrp85f z`2*T3#~yqoIKWKKsEG>8{*Bpi>#k(}0v{PmCx%=0h*MY3blVd-q2~qE@xbPm#bcPP z?0s2pl6jGLOBy zdjjCGtMs3UP)s+jcgV?*bFk`d)gQLU9-R5W8a(1*d$1V5lX&8wouJ2A(j+b#s2ovH zDGgZ3pcA41aw7AZ_!#?E@d3N!tWG zo-8iG1fXFvv?uV7Y@hwvxh-^>XTWZthSyF)@gm^xsXrdpegrBn>hdk$ctekVngD0< zSb2B2rI&%n7sZ%h<&%E!m%rd~YnQ=GLNDFihO1wbRr=w({j!6X_Kg`kF(};dOh>-- zYEsh0N|b5f=^z-rOH3V53`~*P6`|z4Ch2rB*PlWTJmzSU{qWtvGIeZJ<6&+u28|x3 zpGl5lkR?lRze+1#>v3p%2f)4kxz)pfl6E|n_w=VnydO=X#t*tq-~Yj9G=vX2w(VMf3W1m2O758=*Yfbs90z6 z$+7HiTOH^hIHmU17p~Onr}RvIsF(oY8=T_*lCP6Ob@cOA<=BrSN& z&Y&Ir#0GTn=oRe#1R@^|4t@y-8mnJ-^N(yrr(!Q;V#6-f_ys1@OeXSZ_i0J}^tUk0 z1STKyjUNPl$H|@@kkgkQ2v~dQj5j_L{LMQ#ZafC2^a?UQFtp}HN#!FIm5~h>EwcFT ze9o0Hhoc9OVyyOw4NSPXUnZ{Uw{oS99Qen3r|8-; z@jyeHxWgaas8bvrKeh80S%8Q|E$`$7dJ6{4L!Z!o(3il$8$Kh)@;C6{)>whh(n~#B z>=DJ+FYq!x61z_Z0hGS6OW-=0L^pD{_>$dkkhL+SzB<=DJn|o8@O1C)=yY%{+ds%H zwgo7?q8Rj;FYW3q{l)&u33H2V{5|hspy$!O91wl;v+yaVoh@n1r3KGq!Xm!l7k_xu zf9YoR)2_?#5&AnEe$?BFk@k;Y@vZsUQ9cjv%4zsQHx$Af+ph`Tj3MkW6HsmRUEj$T z&bv{#7tJ;vQimV%*{*z|KilMgWZCm|=v8;{0N7=$ErQe5i4cvA%Yc+e+tO~YLtDHN zmde#mp^t~w;VXrWj7{rZ0qC<8nbMlR(|>xk%lr%6ph`=C25xk2K2tg1h9`}cHCr}W zx+nr|CHbpS8xBG`9tTnb%A1bQa$Cmu&D4^gZ@}qg6 z@lroYLv8YqR>vf~r{2|Kny7!I?$pJbeJ=j`SH8NvH_s(k#QZ~lVj<8W8`ejDy@RUu zNM&^px*bQjL>k$JP4M&$Cxp_x#>vJ^^ryfDC!U^p=Hm8)KlBH-zx6-AKBs>drp+mhI;0&*us~{TlO5_B{aR zrF`Iib(UwwbBq6z7oIM!m-CGN*dr)H{~gbCMXwh5;*~y(L2k`=r<8)``6r(2z6GQH z^knhx%JJvF@GI@_Bm-W~=cfZN<^(`(m0mp|vCB;cG2mnzi6Yr{`O;h4@BE(c-Tu%Y z`QhyoKmGAueLjETLU86zq>SUIGG3Y2!Q*5qy`Rhpfmwu4ezgxD7)bdv|KW3VKkJG> zq`rD)yV%VCncn9cUWzbMbAoRzb~r_2@WnuzzGfk+(9*Ml5Qs+*u_u2`5!j# zZ?Amlc%GpOHz8YAr=iDa=_{Zlj+ShG^%Gu}k}DtC?<6U-;1bY^Kw9$JuUvs~d$3^i zr3?I#r2}gEdGR04w4sLQ4j7Q8v|sv+h9Y|sp~)H?3vZyZKd^Q>I7Nm`+sYH8j3oIF z7ntzw>H?n2OZmt|DO)gP>|``ONB5KDs+Y9)W19hM(Z^(UhPSCr``DdMS}>AE@~$f} z><6yAr!StCe6?wg_387SyG=S-3T&*g%eLzyxag<8lYWw?PeCydGGxOIJ&c{l7dud7 z0^iAa+vB$pn{Rr8Q0;7$L`oeFrTYMHicx zQ$6zk=~8*fHgb)8Jm}*OOEDE{(v}V#jlb7F(?a0p%;63cy)?N zTdy)xrcz$mm=4BwZ1t#J?M1HgOozJUJN-tdWbSd=n+G(oHk>ev_B1IQZa-Z#v|M za<8`P3QY7^{l!jT9`$$lwHYJIe{~b>;VHZ>_%7ziMtLb@hu;a)d#Tiyk1aa^t8D}G zFb{k_`Uxx7Xp%Vq{J*Xq(uB=OBBWfv@$%YG9`=fWp3*j%|PS zFaNLG@z=jEzHoZ)H~PTX%$tTzkL3>xr?6F(P&jfAZS?tsf_6(P-nsJ9_QZ=9^3uG^ zt+!Y_nU}M95uFnz(MZQ;Kkaw*?JMJ(#?|5-A4PDT#DtelT>W>P{_hcj6Mo_^ zZ~gD%0-0N!JM~oOq+fdN3w`n5xhF2Ruf_K1)92&M$y>&>D0gyL-iwf5Y#@e{2Daw& zSKfMaJDXn!_|bps-`K9c^+q0}_~St z+d;ak2Os9a^5(ptd+rV%+r_^+wzE0!px2-dF7rNiNOR>$Q}i?A7dZNv$2uk!8i#;V z@DL9R4$|#otXK{2^))^Sg2M@$5S8opJnMhsn*B??bK$vXp5I=0;e|ZHakhE0 zC$K`DuY1wtrAu#p9B;oJ<=qnik5{X_@t>u9GyHgSU6$L%^YZ=Hr~b8XwIe7vn88(o zmu}aUacO)F?ruk#AlMgfaol(Ix=sum0Z9rLTTRvv2Ll0VVC~>);6b-RF_S6v2BQvc z;RPM-_%X@vLL=J`d^A_3e1bqQnQY)4JV^xN3a(UacW)ite)BU!Pkjfx^pB{;Bftc7 z>88C2AZ?`=yxM&yXcLI`8nC-O4ca8&@X~t6!E8VO_QjsTd(LFK#aH8`6!%{eD%EJU=#9^ zn~l3*4IO%P+b+MrNBLZ`r;9>9tdhB$gVz8qo9ZWZsi^aAMd#h#O4WcI6om7Y3Oe4za*fP7*W`H;O zomioZbgy1YKY005@#i0J9iK%$^0a0DmxE;^eATAu3V*CqyfCdvy#4w5KX}=oJ`sK@ zTU!PPdHLh$Zr4rV=w!vP{$L*E3s34y2IL#QT%V$seDUWPp2{SEQ$}pOrKR>*d>Uvc z4)xd11l>diA99q%75+;ro!Jf#M^cY}ll8%jQs~BZM{;$*KwiR(0516KHg{%c(O5FU zHErYL<$v`}TTl9hFZF)$<9>hAD?X&H{*UJ5xqyWbX~xg#vVVBMX11fB``f8Aa*1zS z!s_TFkBSaVs@DQ&ogk>)f@Y4LI2)f3pNah9@Qh^_cVyprT*sq`;iGxM#4Cp(l=#Q` z=sOh?M`>CM)>S`Adwo9gun8Fz{qfd2CBwhR8psF-xiiNtPhi=Js$MoAA;}CwhT*qLUxdOOO;E4`Hylm%dfu zgH39~{XZ?^;Yd!#rF-=pX+xWH4?K{Gg&YIQ-@%W=L+Po{9vMb1wehJ=wBy%lHm)kQ zN#rlT;S*%-8lUT&fdAxgd_%{9!2_Aa1^+ZU>|_u8$!V*=i9@` z!oBo}7FmybCs63G1;x61rm>Rt+Gw{4rb{ol+#RNLOp0yvr<)L|z0gzEFR{oKgh5|l z?|~?;)UC%HvRgU%+3-1X;MGekt$6tW06+jqL_t(6)zMT>Fa@{%izm4G5+0h1!ocWa zk5PKSkP>~s)qEXZ$nWYdfOX|qdlx0C<4<7lq0E+qWDqN@9-gz$#?9x!v1qbq^%Kx} z`C#ZrXD+0i%DC2;41O=0dyta{jS;k>d-RIWF(1m7pSSR(?9$7H=Uws4)!XRe!i8LU zHXecxgJQgSHl5(cOLY)lm5GlETN-`bBK0e8!GVr`UKmPu`lGCrA8}fJOr5?rax3*m zKJtO>PyLyHefyh#{qJtCf8vAN@%zuTPyYq9dLa&+;f-C@$w6%0T)*o;8(tbQ{3P(^ z7j$0!?i}4t-Tdfw_w-K}2Oj;(LVljDw|2i1{koHk-+J@^vHLl>8=hTE^0GcO`2Zhv z_W-}RlSMx~ll#%X-`oGme%;RmrvHiD>VNLs`J52AwtfDKpP4vDBPR>o_K%(zIeIdS zb#vCt^;TgcMb5l*>CL?K@Amc|{@9<`o;rVW`^+zVaXb6O6aAF~I`O;nvv?nSIsrf@ zP6{-4<>rNZk@wjB8T;u;JN|nmK62HcQdgCSuJ+DfqgOBZUUTmVTAasn@`Sz71N^;g65-R+6f zPvoVRuKGV0U)t|Jh|S2e;uPO!PM!G&c>3)q@16ko?a=CPjZ<7aTGsK}esh~FsO{)e zXFvQQ!Jr5{$>z~u6X22=U;}La6?P#ukl)Ymofk(}FTs+)YGA~PIjcaNz(Hi%9}RMW zf*mj%w3Fx1gwwu0T?ECEEquP^JLl?_q}Jd}A~kR(rv=9dR{F@L?bknL@-%@g^Ufd{ zz)Yz0n=~LWC5A~n!m>#sI2zpH0icCz6MXvh1x?{yQ;`H^!SIu>Bu>tm#3Z>D)Y$_yFQ{_SPyxeTfcF8(6PRG9K7@vk%SKrD`jk2|qT$b?}c?#^hv9U6?{=q@#8y)>Nlw=e{i%uZS|SbOP#*p)4#D8$Fmi0jrYJQ;#b_) zXG6$9da%DY+!hM!n25a&u^iN5H`SGg{zB7<6l9Ahbtc&d9}8~wBNJ@ZRgQVK`tnIf z`OtHJ!y5y>Lmngj!g)VewjH7mS4)o*2jqY&+c2=hiRDmnJ9B_*L;A>m>w~k4hv-JX z;_R8C!9`aSb9$steL9%n4E^$y{YFOn4_^9xV3D1P0^et2g^f%C%4d$reAo{RT?bwD z%$C)g{_I7z;tK7w9pqJ?kBN4FKR(AMGI(Dx$R9nrqF-$v82nT6$_a(XcWTEju~H`X zXzMrn-u2)(IM=PvD@ODjc=@4-4t#bImnu1P;j{oAndryFPfpLo(Mg){I4>;>&P=*0 zWqAQJ{U#35HHG{Es!s9RZ}>bOySNiZssE-f2u9Ap(F47&MPdvdUwCL2lW??^@tM(o z7_2ST>;DcP3$4+)+!Fn#O`hcg7MsmC$r)rD8%7u0DgOGv&&tLhz}BzGfHs`rhfnh# zFmwgKLYI>_$u~9*P-q99l%X396fbzReZh1tpxto_omEB$sc-jS=^Oi zvY1;oz}*@%`CoIN_sfuXglrux7>~w=qhGkez=iEq9H)DE1>;+vOMUraE1FLyTW$8) zcjTI5Cr1=|udk(DSvZX;_Qj8~d~oRyZZe4ln80dtgy!(=#IG&j$8pm=T zF7aBSdKg^M8=I!^akR`QJtqx6`wySoGq{f2+}`(Xx$2(<;+ZpUdq0&c+}EdH_;;eA zz8+qkfWXt}8z21C80zXi#iGitGrqJAAIS~cDt~xIKV1vnJVdtG;Gv$1C=2h~+xx%e zJ=>4{$sgVR#$W$mwqO1~@*=wj?;l;E7aVvab7ew41#YzA)24z33lqILnzq>3r?j{2 z_SfFKJ^PW|#(nQ|<%jGSE?($D{%(HK?RM@2aMivS*@BQfadkZr|v;2l$ke2`BUBe=u^PxOWlB{DBRWvBQibU;f&c zwm<&I|D)}X{NX>i{p8>O$=E)3Fyy6%e9$ik;e*0&-Mn2t@*V)?-szdYthwxooCtal z8r4>(uYL30%INv*{K;ppS0hPaXgE)0y?VR6H7w9pJ11;z#y|P!wVVjJp5yDetK-(KYum}#`rRj5R((yCS~wL(x(H!6y%CQ%lu#4IgIQCc8MNl207gg6N#wh6>z z8}GB6eeM7Ezn=U3z9dBj!8nM{{hjx`&vW0`eeKtEFVFJ6CFSi6fVV`ge_N#dZhZhb zR(!MjYFo$szIf*9d+O|ItwRP(^6nMJbXtR66V)Ebt8EA*)Z(B5MG<(MTVm;e9jD`b zrM?Gd6N2M-ex1@JC2$QY17Ywf4Wd1uviII#=2x*w$o`DfvD>LtKVu6F%4xkn^=5~yC51kU8JI?eF`e-N4o_l=-r3C`hp215PFiZ;D=13>?l z(f>L%5vrWQQyT>aZ;FHq@7SKs3}2%&Z3Yeam+inF?409Cz9tx9Ft_P1*ts$}6SvaV zY$2ULqRb?A1~+_4wCP+v3%{68n?%~dD*Yr+gI;RKCV?A&3XTkN)rkST1IX~r$2*8b zUufU~6MeI8Unf+lZ`-aDwkHQ2^AWN+Clqu-mi(*E3mO~e({1q9 z3L_u5(YY?c8w8oNS5Ec#nN*YiBQqV9-?Xj#U_cA?(3WGSey%1*_WY4Uu@EbtkttFQ z-S8ZydQ7)Ih`!(U-XCu!WFjwcfBAKatknVhPd3HJ=r&MP-sV57szz48Ek zQfBp$iSw?Poze1$XN8??3W9Yecg;ie_UK+S#C6O8*tQsaV6 zkNvTHhDK%BH!8+2BMEuZ=V2fDz|wL46VJ{SIM&35Uy7URi!be^z7Tk-Qr0=Opw}xk zw3p+Rix!PDS**jie0nVssAFs!d2&*k>5ren=eT|&Mt9iyd)niAfuY0kS9tn|!H8Aa zq7Nd{pm9Xq`fYRYBRxMRZ*-N(*W$5x5=}Y?Z}g(S_?pFF=m)1#S_tj(H{S$1eikek zAn3>max^&`-w~!V!i$!csWctCFk?7SqPO_ zEF_0Hge2sA7<0<`d_FVhGjrZ%hmZI7cKiMX&)*);$L(=l*ZrE<)jWo0@o%}`tCdX| zYb-h1Yim(1Z>vU-ceg4SJ%zLQlXdKD5CKIa`fmRhB%^8>^|YyrFt5J^qE#1NnR-*} zuYjmeK)usaUm-h1qqTNl@BelJp4d&kgpu2PPc~tNcttfNyD+(Yy1nUfN_ywGl79to3+0?mi_dg8JZ2lPXC-TkNfb`}#db0XqvXC3gK*MyZWO zM$}Z~@@ml=6aE`Uc~`%$21vapSm)25mpWv-3WbLJ>E(*)S_@?Q!~W&1UMO!&*JLr0+_!p7eHUV z)4DL)gys-HOf>YeD&qU}J{Vll!##|{sr&;5Ht9#p@5}kvKA8J&Yw`B+?xIc5<*!0w zn5QRwrvk-po;|hJXxb;E41}gqy zB9wi|YjwS9){GBhgBLS|LbHj*8Ouj0pX6q}!Sx$~Yd~*WZD8+g?ZFX=1m?1%kOp&Nb4ubIWLmBBuDd?J<|Z~2l>6x-p*#B2wz*ub)WN35Z30Ky8!}~~o?aK#Y)zI`Tbm80(hH-$3=3*77qSOL>rb98WS@fjQ731E z#)YjkVc&_bHO0aOvF?xl``)Z?CRO9*@i#x+y zQL&W9_){$r_%2lYvGq-6!Vc$=6<*c<8x z9!zQVm@4@oo-^8Km8X!}x2LB6prvTCF&qli$j5Qe2EQ81gDAk}aBKC0rypkaG+XJU zdny|x)~f+=w>bqf#_^t7)&b9E6rxb(HBAomn-F>3vxx?tcJm10S35#V?=X4&590>E z@MGQXrgS}NovGvwet1gdomOI40VcaU&x; zw8lYw-F^%Axb=h&;QfpwbHlj%D@A0up_iP9{tPNJ&`)x@(j$*EXLir0PR8x|DZG#! zzs6qi5=%ctPA6~|SO&pX0|4h4&K7f00nIRdyl{136wvHjzJe0?ga_n?t|N{ewQ&N` zjAiNfHQIn4>DcK#psGJEFh=`prrOG^|7-W|%&P#eoQDd`zQV5{>8PVkvZZ}w`(%+` z>Y3gUs-deuo$uD+6xY|u89zbGO82`pDO=&psXN&2X(Q!UAWq`VmW{t7p^$D|_xgkd zMFh7SQ&cDO3hDVRkFw&8(I^U6&O^5d7m$$R@3+3y=uQmXT~A7 zN?-${sil9>V8Z+;%fX+cw+fwqB$Z!-Y8Ga%eRm3%SIVkkok66L)5}FW5yeR(2;#%& zr{dmYzpCufj5z&CaoQ3yK6N@jNKu^CcTaidxJcp%FmMVBj?s_ykp$1XEL{(%M5=-$ zRz`Cxloxit2%3==PORK#q7iP(VJNFg_|}9|m6E%Cpe)FvCg5<5`eo_murdPSM(mm5 zP*36@EizVmuob~Xl(D8;Kg!LGsYd5>zAo4HbTjHqx^eGG3yYI)HaNLri<;OvV|Sxr z%_4a49@F~NnP>@q<%nWZXu8kMe=m}Ybyc~eIa`=+t&KKdY8s?hJ+~Ujgp&79 z8&7rqr022krxdgqRu6BsM{9`R@Og1{-YH$dyv66ibVwkW<;mnNx9maQExM0$6#_jg645 z#a)o|)h6xv=hHOw>%tEEU8|H2ZocRYU(@RgJk+;*QYGKtw9=RTskqy#W6tdy$JIXu zx`D5nU`l^1mQs55Wi&%T5lgx3IE1ZTYgL8-O*ewgeuwD}o^VS5xz5io;(LALw02Bb zbm#3eJA!X@bReh2?=tUL^V?rgd%y$xVjjjPgRzPrfy-rfhY6B(jqQK{ClY9V? zH^Dih+@9V%0wXyZSMH~9pXRGy47bJD++WyVILS&Bu{AA{4X{sAdbB#Md!ef*&T@pD z-A>g>&1`!%dWd-+r6xKnP;oK)eLiE;z1ApBLV!m%_|vn~D&f^t=@+rl{cAI)?vhWy}u57>OHS^gP4Ykjj>}m>b7iuP}4AFa2PV;!9{}9u9v`}WG^VaIXp_*k4s8$ zH7Of$M$N>)|Cx>pFx6i3&44PYY=a=hK=@d;-*DIxP~j|B;gYwoF7q2yaD!gn>G&v| zD8$Z=UU6dpy7RtxZFfG*HBP4M7K2-?o||A3^A(^%slfrxKQ42MhEm;!3a8~8+r&)3J^D3 zOaqVw_<{xxzG3E`MEA>L%7vaA(s?-FH$n^F?Isqv`3Qb};JEaSnx)b#n7Z_l5O#hR zugcZ}8&5)a$he+_xk)XOV$d3gXu=%luvUui0XO)hKC`g-=GA0qG9uyE4zD~vYVmg9 zT4Q1{-~KAMs{%(sDd*{-stE2gme75+*D}cBK^6=T(6|T>s83RI)x#x!0#yF0sQFOw zFan!c@uw(RlG>< zV$mu{qFLZ85ta6^Gm+rpRTSx?x?gZ2dz|g2a=eh9(7@s zx>DZD_?O_O3rL+JU!8TKTc;U+UcU;9;-@-0Qda=yu{V4Bf+}n2>v3BY2jFZfd@gFM zKTok-9NPvtUfQBT)OX!+iCmuq6@yCYstda{oEZT(_<`XZL7K%_K_}Ox6=tYf?BPg? zV8iia7#q~`F;v$|<9j!Avzi_)rN-~N-^%frat-QG6kJ_4&K=OXJU^#wQzwlZ><=(pfR{nmAi7DImva<)m?|Ix0CsXpScxKSuQ)ZP-l__gb9HsIbn+>p)w%rM(5n zfeAwbnkrNqM*lZ0Gu>`JFH@SqFS8+hi4-tjB#s9bx*7WivJiH#_GI#`em`RcWyl!F zL5=QL*^yr;LzqIoeo=X^=y&e@tL$9PA?Z7;jgr5Vq3km4VlG00v1VVs@c8~c$E_Nj z47q@w^r|n_XqaKo(_-GX3a9)r5G3X86JMU3z33Ln9t5-6 z{kEhf{yJtdqzKu52@xw}|IEF8lKx%)BsR`+tP-5dH`Cz#oU?bHRS1p;-9RSxGYbi#5f7yk<9s2U7i;;QZ7{jw;YiO5lcjul1Tqb87x z=g&d+h1Gf@0KKU#z@eCYnwSQ&tXi-EZa}G9F`!J70w-S)R&Nt#T6)mdeCXW{iL~r8 zBUYDHsjFD_;3|JAH41qXLN|<#m>|mGt(#<(_SlO%X6gb`7anZ;x&6J^a8YE#Z!SIH zT(tD_U2L5zwVgQ*HUHI$xR{jM1-vKGk()GS+-?Lp&IQmY^qIn{hc@d8=r9XT0ovx7 zWbc=MS7YeY!#;oYX|a%O4TPwyUtVy##|fZE_9FEOfxO254@E-5$Y+^+CdNG46*;fH zO`t{aSH2t$V3sroWbWpTvEma&Z^hS|$|FZCokWIzOF#1HR__x6U#)!y6^AwWs8_&F zp)Q@1b%#4h+EEVUA9nK8GE-BPf}<5sZs-2aOcD1xbF~ioS~uuLRmaW`x9I2wuC9Yh zuZ^LjDzxQ{21Cw2TGdY~Sy@nU#Q{=LbA9`uA0obEAtCMi+qH3)yk$h{%6?k#$EJnz z%q~*8mlBFgT%oF#KR&{*+;TaeT4QnlLMfV`^K%_Vo0!}l5+f;XI?hXK>qWo==~d8j zH_9@&xOQV{rGjx15p+us;&q%61p@ihxbGqsau!~RWD&4V>7C+V#w&`)ws3EKXPYAx z=-W9&L){s`gPGE(9f;L$5np^+Q?tSh%0qF5k5+M{NHIUah29BA zr|vE4ip2QuM@_9`!|JL|O8kpvhjR*hrfIg9ED zFiT{6^rxOk*aJZ(xWUVHhvyq{oU*^pIYt*yqW~*n>0$-xiq~S2#f!cIuw2(`i~$E{ zg4jMicx^_BF=dTUk!Ml7(GN1HY@F=lSSJqt)QKj9^Q4Ah5Ff4zM{^N{FK|uGMT*>_ zybre!f7r|~5-K-5476&I#_+1lecHZ-Qu~^?eFIiu8Oy>2RFH7PZ3{`j1!ErFHC}xm zm8dee<@MtGzMf3mw``ksIR@LHrc@ToPOLe0U2*T!JFdQmMt{I{m`$)P4V8Vf@~)6D z&)E2<2jx(bP5RX{zpV5Lpx6X5Ux)tZt@nYd`xrIH{|H;0DL_qNdjxr2NB#DF*`_yBcTafzENEg_peua>M5o_9e3;#D!}YHI0Hk6(8%a_Xu{o;Aq-XnY6hK(bUM~m z;4spDgt1EAj+B!u3u0?eB=&A?6V}YWNW`7_JwZ_lGU5peRpj*MWm8i7?4i)jny)P0 z>aL{lbstzNE=JVs@fTQIwRR4J$zMY`ifiq#byU#H($#naqVohR2c6!4Thnv9LyYdi zsI^7+DML52$-3k(oA?bUZ{EqY7eMa4@QNeE*wU2$UW^S~hneS-rUqED{WV|Egw!B~dr|hmK=qLB-?lbFt^>4_s zTHC02Cv@i2+49Of;Q^gL!kd>_4@}7Wvu&vz1VQ8nH~%|$tJ$7s;lMUKYHjf{d|YDL z&5~yEgX7&1-$EJ0`44P=Lo)&4vnP$PRLjaUqJ5l|ue`!99CXULKFnF=!p6O>{?>am zhP5>oD>kbIBR^yoqqRjSI!cxp4+*ULho zdo^hO?zxw3gm_CO7A5Z{-jf(4&F4b4h3BHE^yi3e&e`nwMMb1OShd9EDf!&Ur_NU& zM1aOHz`soX$B((IpV)EYRScJ<)1Th~FJ6GVqkDuFZVyWx7$Z%@CsyC{gkcfy4S=Lq zf;JfoH-#-5JqEa)7OIk%(>cq14eEN#eS>rrh0xd?vSRE0xp0kT&&{tzBDK7`i-7Kz zF&H4RB#aX!A-&7d^G+LwTh08~p$X!SN6*7byjq8SmH2AEQXUF z13G`;oZaS5M!2XE@~9j&Z_-zMH&9!Ci0LDKD@wywZ%}JQc}Za%XzR3bCJW=Ujr0F` z<>0HSp~iB_@V=}0!Kme#vYzc$X=^iTFJkVF+cwG`hukSk9+XMx3Ku}}ymsY0ZVScI zY@nW|HOEEKA2t1EIP1Y`B3|OXw8&xn+ug3Jj+-#`kN9?7NR#Y#y6`W%HbH zHX)2FQzx#;6>-p4mcqwv+wEIlAj40H)Vt9RJWmTatX3SC!5Yr_)A}^mfFjt;DoWq{ z?SvZg>WO~~<8Tz;$4|BFN|D_`%#pXAT5TS;Wug~TxW^YcAP3Rd_~cHvbqPcIpb2de z9woE6zg(tBZ^V)?v;JNV$5P~g)1_SM#RfydDCVyQlTcx?EJmd@VyBZIzo`>!E#4^= zCgm8Hro^?vE;%NqM_KO4?FOF_A3wjBc=Zn}QY{AXdHYKll;YW_a!Y*LW8qA4n#)ZH z?Lrz4f>}L4Kio*HPizx8vk5uK{i_d4#XpuM_G=6M6aMR~EJ=);2m*dn5t!WI z+u;i*$zHtrxgMnP8=}Vk_=j=d-^xSo@WF9v!z}ULYu+Eh>~acP&U{+Ug4evS8Jp3YE-ObxgmNV{M+>%Gaw$Dai66rM$ieZ3=A0kW++GXCpVBduc>=Py!7G#IiT^d zO%T*!U0xA$(|b-xKo|d>FNb6_+s-DemGOz245yDg`ddoaSoE=O$ZsfwuI}MERZNR} zm_HOWxu36V3-Vcu1Ij-_O|w-T=pK8GJ}xt!l?tIc{LPM>2u97xgm$(SPl67@0V3wAjAit^-)B@XKQ)4n|rYqMr0+M_M|^Do|XjC^2t=C{0sR zXmF2X**em_T|-i?FOs^PX;c0{0LPC#ul#Et_Mg}D@%CUqW!q)bN?y-Kbi%_!ki$}r zZ0tD9y-G{(%mcU<2(eT*GX5`gmVCcKOf>ZDmzo|0vB1OD>$l}pdEE{l_?mIDRFw;= zsT!#{?oVGe)K#kQOTvk@9o?6WPbgKC_N~;EtG)wR(-p~bo9|V`-gSk`FV>Zrjwwq4 z$^-(I>=sQD20L=|yaWdi+&{KoZ;-25B`J;0wDwQkw%Y}0KK0M-%0#Wa8qxi<3X=8C zjN@j8)fu>zHWY(up#Z&oiK7u4r2`#%*6FO5!s7I6Ck^Q!;POe}=xu*`5{AxEU}66dx9z(aNK7bq41$Lb#-kN3cR}ts|{f#^9eM z3FY|@&1W6_HCDr2kDJ$}y&QF1YkZ5ZsS)?Vf}5_p5ji#vXRoh}y|pDM^0;-fZ9Y}0 zu7~U+t$8bmjf#Hh&r;8_l+(0u?)_zNk{w{ov0nYoHac8|)9$R7tEr;JQC1~N98$8` z8Q$a1g7^Qa+y3#q9*Fg-vfiv(G%^7~8;f$NotKK6uQuf;bR>aY_X- zg=5K8&;7mL_$ma|w*B2IIs>jrlqlUkPddeYfQ!_Rry#Dghf?6uX_6o;5uae46W>Aj z*tO_r=YEWP&Qj$Zh8^y5>yT^CDP;(ion)PMaw>w5H>+bgS9-?S$&L@zMzI+4?UjV8 znq9{F%U+)wfg48#(q_0lVbBHbJ_voT2sC@ax3mMbCZ=JNuy=V33MLOWc$6YfDuO1D zHc-=}uHe0NfSaNxl=TNZSe)?~z3j8g;YLN>tg|POS`N(*6L51bbGL55N-p+dt_$;s zRCyN>m({Jff9)XsUVp+6<(yc8WU7_FTK*fJ$!F!tLln9OKJ^s(HV2_MV9?4u%Smh{w@M743%hSi6cJ|fVcl#$jkUFn_ zeGns1$}0ncVaQ`AWyUP^)3ZvJNe-R$(KqLXk!L@;0c9&TVe%u@#G;VjEIvK$u)jhe zp+$DsOo-bR%|JeCLBd}0{DP2}2h31hgIdU{)c>hi87Y4j^GcpxYEp)%L&a3u! zG9=xtI#f4Bmyh!J9X+w`Xn|$(Wp-rt$_=PULds|eKssx0J7l6rkz?&23rO|Z>$RKy z=ebrg$76Ek=bi%bPiJ$`8Ij4V8f!1Rm|G{lNOVbqPt#Q|t}3reKU)ri-^unmkDz@( zvmZZd+K+?-)S-v#Ski?}(kV7Ot3_L8W^RP2Hs1Voeo**^1_I>voy^>MgBn@>~=@3L~t z8T@i3iyvHUJ(sYs5!?k&cK+78nrhhoLcNJ6)v;7r`cT5RgM|UXO-1FoiY(VuRn{6o zgP=XU{OJN}=aVIZI*+BzUGD7s6rSDvG2k(E`I=Kv7VJl6=pxiB=AcPtEZRp|^riYu zpY`VYP}0j?b`#v$t1os^Xw;)kReZq7&}l-tcE74KZ0Dv#q!#gDC{i_gVCQSZz+;Z- zhfYadn9qGIIlUwvEV$sM+irpBudLhNr0>+0@D@|$x1VhgeG+E%^Em9o=^pbjm-?X7 zpwe&Z2<7FZU(gAoh;~@#ZKuj0gr)F*7mFWr9e?+?P$8}J$hmS;m$DWLzR#IJ&vC0M zwXEKQQbHGPNp6NwRpc z^|L2CBr6TLEe8- z^?=6j9C&;P{qBC+ZpVNxyN27m>IEZc;4`c5LAwHKA9VfKT~k|OzS^T()G~LvC;%nr z*2KuK>D!62*g}cogo9*moH4d?U7=l=S=|vAP=BM@2rr37A(>L$ftp;X9537 zl<&q5e##@tlEuE1l!w<6jMwbjbGH^?@P)XY@uZpJ!U{#EnQOz+c?COIh~4l$47jqf zVBrx&nHq0}c{VyK8HLIl4z_DPRH~wg-Peq@@mYAUcbTnIY}zdCNryGgy|W^?|5hf; zvc@kdQp?T%8X}So-#iq`g#GY%>(c3uMJhv!J@wPen-jD{7_S~&Y+Jb6wUq=Y??oUA zDwTChKKZcY>tGzbo9>b-?vj>D+c)pexWm?l}2P<$0Bq9e|B`{35$;p4d`ZMhF^Xjt{SZNtCIEO&|0seVHd0qm6TzD<78 z6$mNS1%VQ|uZE96(i9!JcJKE81QY*7^p1qh&G}uHQ1LD!{i@A~{Ah^}^x*`?H0eH) z8}lV_rA%-}4}q@4_)S-ThARE1yMhD7*e#|<&b4dnHUMxLy2d?uCBuemcilr+GHJGT z(yr&@C;EQoQFNlYZc%y`Z_#6H@Zg$jZw>3ibDQO^mP%fI^yg6A|4+~yU{=e?J8TqF z)BRyKO_6hNU4t~jW^TikQd=M9fS|1P-SeXJm*8Kv0uZGelkM&bQQ1h( zPkOFf-;Rvq8DHCTc4Hn_jvFWH>W8yUd3Sp&|B9~vItx^lvRc(&yV)o+b5!YFbI>jw zNmui{l^t6$;kQ{rhy-mWz2Zehul=H5ntJ27SkHJSpHTP<%4hk`^lzje=0nWx*lcp4 z5vogXih^gx*cp6#hdBpY=DSg?6bUuu?VHzIF>9G0uzMG3e^ z6DaY2_`JU|HPdb9z>$3Ree4saO-?FRQkI(fg8vnbv=#4LycfxGot>Z@A=*T5@x{=YLxbR)&{vVQ$1@wQD}wqJQ-zd z%~m6KaCN8?Jb=3Bdo%&nt{Y^hQtH!z^dgV8ySS-bJwa4#CX2INPeL>q)s8$~CU14f z?M#YTQ2O`8(3Umc>7ZA(qZ?I4lfBHTs!4h4idMZg)>U%BHO_x0TjEf~)y8#b_MceQ z$F3_L??=K*}#impKlUuGxidEf)EOWi^RV`M7_wVpYd1E!5r#!{R=2%Uh*jb6*m z+2Iaehj@=vxH8IhIdMCAbzY^aX@SWq%}=p(ElVR&cknbE-NPDqgVWs;hao(f+VVQY z_?iheVhSOvs%n1|i&9`B2i@5MEG_IU_@QnPwW+nX#z|9PvPrqBEj%n?Wxie5d0mzL zf~4vklAP&qvQs&Ml{lJNE$rsJ?Z)1kQWM%*C^}V1x96k7rnXsITCe_87SXJTtkLPu}^T zulsQ!s=^e?O+GuTne5nz5~2)3H0hb=*TJflni~;`=OjPS%Zb7HH`-Q?VPM(IW#hE zr9rq&2`ZPyT62`KOp29?db%Uqq=9ralIpa4fSK|8}7 zTr{#8wof~fy$yI9A!r+h*7#(*8d9#k{e$*h{Hk%H;sXG~HWa=(og2ND9b|Wr!zFYs zwpUre2|Jb1J8P0Ii0pLuAu0VhwE<9o$vT+Jb0^+JW3X<#Vf8|2}hBR)EZwv7U`82<)Tb&~CKNb&J6lJ?O=q3#;)PslNsW{;W zD&b9AbdqIIx*JsEk1;6eou~Q4)1Pid!?EaM27oR zPDaraqyfcY_GrJUx9d2OX;V(=&mJe6YbA2&thz#f<#)b+?Abu)Hmjy0&&QP~p8+Lv zd|B8_)-$Hb2RZDg!RNSVnid6Oy!+U~sS}^UvngL5yJ@+Ro@fs#qazuA%dtp)4I zzW?qY%nia9z@9q95jS6ow_3HH^FP3$kBCe6akSU&udT&KAZTJF!-lHdHY^$+B3;wd z9`njr1J`x|ZyXOyV7vk;6QF$>t1;J@UmA*fp&%OWk#)XL6y@t1hASJ+Rx1S3+)kkEE!O zL)!LWg4*A|+mBzG77!H^_nQ+rwNbtwBON|D2kt{}xiEimef#=An=!OB38ud9pFv=} zW{+iIw}6uiPADgXVZOqCE&3l1|oZFgU1^3(j=&umDud8RG+E}*tc&SJE zb$bVpByX4RAy^21F0}Bt;8IghzP|`^vxq@Qk${YPKfYBd`v2x`9r*lmCo0G8l+J*m z4GC-T_iA8HoO&#ftIG4#2TI3!+#pxtt=H@Q&9Asstv_RsA(Ls7cio>OStSt*KP|rZ zX4^C5bF<4xP$T^$S&Xahpc~g8>o~ufz{_mJrGs_liub7!w?s3T$cwG9i|6jIVyx}m zy=Fea`7W|aHE_YiJ;tXo&d)j|O^PyVZ?}SB(#Y_jMTL(a_=}~dfARb>uuXS6erd+Z z{&xvf2~c^8jW0bU%a8fiG^f}gCAHSFE8?y{>WQ3 zl3-IfQ5F$h<7C}5t2qikm%_3`Z03fWK*9}8{VYczpG_0y_${;a9*_v5KoOwIa_`cW zZK2+z`IlPTU)TMw$M*~+_*LJP2yWIgOu(v!cUC}X9oC}U%>P*(j&2LV=G@jed$TeF z3H2B~Rg{$LtF%YOa>>fh`sN-FI$NHal!xgC$I1LDT2sQ-4WQ1UpM;un_f#!K7ehG#G6!g{yGRETB8L*mAAXs2@z-4Zkgoxp`05O{z8G%>#i{8UUxX@ zyD3Di$mQI~OqqFb@k34?(haS%-#W)%k9tfjvih20_^p|$bBmf1O^-Z&&i^ni`L48v zTf1`ArKEp8`Pp!DkkC_0`2qG+fW}9#Jax%j-Ew^=xn@4B>+L;>)PwYmb&b}{$c9WX zObXaC$jc)`+P%qMZ+BfFHA$2k~W*y=%Uat>0}ztr_@xB*nLmq+3KeyXTJfhcLrWmP+Sb$ zs~r2>)!^o3V|nL(!adr7_?uRoCHp$R#!L{ZYfK$p0CrV+_LuPbmZm|!@`TwFI6s^pl-wz}0CFBJexhPAJw-P4><T?%#svP$MH=opzM}7C$6b7JTO36^bnT(c+Czm0)Z1?d^A2t0;ib^)N>`KT@#Hm)3hYMVyT;)}?^9JkUaaGHlNaK9&|SJ;BQ zk*(>T-?$79ftryG7|~%_Q9E;2fE}cI(svcg`^>`;j=B8((MOo;=yPotTn)T7#+*v~ zV~5=W&~a;Cs)DhAo0I%jfl`rl(9!3*Foqly+a5`qsj_S@p#{+|rX03uemzQ-{x(y4 zsmeY|ZsRh&nsm#}>k&6GAIx5zqWg~6rFhC*{Io;PL~R0snye8U4AiN#mp{6@2l!?v zQs|{@Slg?zeH&=Rb9ifXjwrBF9mqZban z*)G6Mk`yCUm(w&N#gd;t9rI<`!u!-q0WeBjR8Wm4HKS61sptWmaB*r~D?^h}L9g~M zVcbqrz0~=ze_jI1EuB8zAf|jNb?*YZ$iAY_8GtK?fb*JUiXLBanE*$!UV+$o;Qa>K-0vl%a}}Z=>cUW9^rA3Rble_~ZK{{|RMclexl%^XUUAZ8Zc@A} zAHeGVNJXbE(BN|x#>SKN2{5as#b*dx^K@EaFQQjZI~@ZqmIwogXuMDl@39a_|B&cS ztfg{FfkNb}Vk@8b!WOsk^+i3GZb<~D3`xN4hRKhU=2)-GztpHbwG`#+&cZQB-jQ{*~lM7OZt7$JP=S5KO6Yw|Z>wo5tWnkB@Yn(~I z51SLn7ALGJbZ-&Dn2T@9aG6Fip-}B7Kv;T`5UM62LZP~mB)OmigGSx_C;~}7@XN0c z6Ngo9jYV4Us}u8Y3QVLVfXV5vrpT_jsirB0k8nJrMK|dEY3N6bxa8~} z&8;6n?3SR)2E?zzX^G{6;DHMlg_o7U-@J+W+`n_(5PMld5*vYHM==5{WOhG(vG;$k zAV}{dcLDc{#x=S3v@68@M;=^RgRxe7zjy>8f=*iQoxP$@IhNtDq-`m%TVKwb4G{BO z%RS=e!bh9R0T~_YF;yrLZfIINas44!ifY zRfkrRpf7jg^}-59v`aNa{E+ zq~uiB1$~^$lNY$JGH1K(1Xte8K?zK%WF;Rm)U7u~CB%Wk+i2`DfRyxjFo_k_ev@vkkV&Y2qHyeI1N%+Rd&47ddhWcsqMS|LE|KiJD zzVT_dq_Kj{*50G|#abo!`U6>YzMZ=~g8=M8};j`OSNQI=Myi|k+ zjcwm`wO+63_|zDa8}U6Y5OSXSrpOpkIj$e*VG6631~y-zd9naB^8aGNubLI zEMTSZp3t_Vi)c2dVUQ&evPvf@&*spKGW{ww^Rs&vCtt@- zb!YAN?+}J`lQr5v*M|~9-Z?YUB9|ilUl0;cPAoZ{OD6NZ$2BOwe+=|CbVart#mPwu zVhxvj$m4e9x0`kmF7t0F0V}}@^uFVVwy$?&&Z$(zhcU{WSp`}Rmkd9@z2WzKYRoEd zYkxAyj5J%hyL{A^rCXi=3-AbBU(2ZwFH{>3tMYe630(iv5oenQr2N8OZdh(Jgi?JG zoY;Bobiv|R^knEvSL@DFOmsy5&Qd3YN>EKj9c*w?Z&UuaJcFV#ve>Z3V%J8;dtJ=k zb5a8qp*8;oZ$k|S&)5N0A3S-&mi&}SiLJGt`>zMlQLuF2iqd_J30@-QN0(j;9%}ZN zR(@Th-;FDPhZRuaV8u;ObDqCcqdF^Qx)xs?fq28*4GHotn9{$`b;Nq{VyF$~DapxQ z{QKz7`mJDsz9>nrFYU6oG9P^7-Yqp+dvuC}%i`NzVJcg}Ku7K(L=37O*XU4UBeghe zJR+>~x=m1sB))QMray21wmVnrJ9hZ&iJoD4#PG;@1Z(Q{9j@AmyNA=a0BWiIj7jpCvu4N{TGUshI+q}Oc3!Z;MN$$y=5~@6rFZcz z($nZWkGsK)YOw&^G0?q`1yRIOduJH-zRxVkgg*8;h(!^@`H(I5pONbs5Vhx|xJ==! zK`4ia{%xfxk+-oXBDogzSwoLqGb1t7k0?dr0hD5e_^`uzzvy!`TZUj4cXEmBe!$Q@1>)?D)-B-XW+D~wB;-pZ&%-L zCEjMs2vyF-3uAy^zMK3&?R5jM?JG-*P~NfA)zp?z53+K=8f}5cJ^w6`T7l!exArr} z5*7TjiHx+n71{+m0Q%o zg#nC251+|8Bs#HDVD@K1DI4Rpr<0AEf@SryQQ6NBNvRIxf6G3jlJ! zZBJHElVDseX#njEBxM6!9Pq@>q+Vh@o_GQ6X~)~nNr@JpB8mKgU$J$a2J_#fntiu;ui7+@y|b0K z59i!`mAx@qe1>=~0FxHtaLo^| z>Yw1l=zik^OAp(i`J(Tq6Z^11lFnE=u4B;p=MxHQYR?d}1`m64{t32-E}twGJ@Z-L z3**PGm?jr+^R9G<_orU9*Lv@jRpjF|f7{gL(siG%p$EBNHuz?fTVL!~5GFvj#nj~B z*81-^nfmU!D(&~@aAXF5{q!ivQbEN9}Nf#Ow1zcL!n5U+u}Gj)te0eHwns zK_xDKW7F7TyP{W#LAR|&?fzqiBA(k8$F05cNa-+tt_qL1i2wDDcq=zcR0G}9o$t8y ze*l6&eZLUi9^|&4>M!sO+VoBCsH|w{)4+}jEaaCIWa)E74=nZ_XZJJ-EDQ%8{ZuBI zPn(Ito`CnZ{@OqQ`&VEXsW&_|F$X@dc7YA5YxlN`jp$ctU(xXlpmbR~22PUgq$;|@1HL>iF_U)EkR4y+ zYdH%{YFih*c7Pc(%Y`4)WaoG%7XE4b(|eOA2jzZI_m>OgxQ zOk=^7GB`qmO)%h@|J~o|d+|-jd{glgLh2PVJXdieeeGtHsb=b`E*h)(KG3b5A_L-C zXyQ%(mfiNnT}$!xaF9OB@8E0P>z}qxhTsR3f4o{duIpdvjz%ZnIj*ll={UY*ywK5l zv!o)!QR?-Lm9hyN-3Fi7P(v5R4>;%O%myFa>Qs$yup$1uj-v6L_k?IWeH59aaJb+! zF^1ENy=wcQK)=U{J#T^TL^;3wFnaJ}!ssmI_%PeapSV%5c9cgtI)24Bs}Ws-DV|IE_!sc>%`AU_2NCrym(rj5LMaB^w%%?K~c8apcpN&-Ji2RfB(a7Y{kzVer9cqVJ&ZbG^0W z_y`Pg0o`IP5kD}*~pkqG0lu~>C<05h&?=a zkH0hVcN;!n9)0#!{O%|(K)bd*_0-Gp-(0BSPw{<=Y`PR*;xk|2J@|9r*qDxP+oFT< z1&g%d8XTR}J`|8X9S>|K#@VfBcWd^bfWV{qTpgP|cNOl)?*oblP!Y*Tv!PG5V4x zV$0f~Hk&(qbgkYpE;Ns%?dVAEk}JJ*aB$Nro7_F+4$YBM(}Uz$IrS*KcwEFw0(;&K z_|V;Lg}-y_E}0-jb6#}FW@As3j&sQ@^0jq=Z(~0=@HO-MypteT`HkUpe(UD#T-E<# z7WcWcBK{vleYW477JarqFZH{dotZ~-wg25Ozq~#F{0rOFT=BPn_S&&nm+A)RRyBz~fh*{>|@y|9_Al zS^UzLJ#~L+iT*=QjbAA1d(MvkU-iCyq?wb)AbWn{=*n}v$1~=2JkFQTn(VJDnX9d_ zsrT-z9C!kJoVUk2@-8@X>^Acz*BtlOqu`&xWD@9cqSH|T@6Mm^lWhisXP@_`XIu#2 zar&H0AmKawC?Lq-@uiz@=GNY90F-Rv#exU_5B7!6>CE8VnshcVYndH1syRs7LrLX+ z21vAL!46;Wq^O_U$^`FBJle@bDuRwqCTWBBs|hA+ep{Rj#~TB~`_LX9$Q-K0apox4 zGJ()%(vm?;cp20Ttn?+J>@=a+`_d!47EV1(y`LI0pcwo+Sqg-oEmG9w|LPOW*m(xc zF3=3lVRt4pyFOEqyqr4pLk9p}f@fW&7`>>r*e|J(%{wUavQv&>P$;}fV{nyr7I#4u z{pP<2P@Pgl3SOO?Sg^&x??RvuZL>%i9}kD=WkASLSU;jWlawLR$&blBUGRHk`0wb7 zJma@`iE8qE-(2Z3A%X)BK8pUz`AajX%p%Lr_3$-%HNk;r?9zo}y27K(n`WbjoWphe z>lZUAtx^I9k8(DXFs^&5zKI{P_jB!MBBoy_;(()bHs#}YbF1CNYGjW*rD-7=sQdA+ zv-hH~9kvUw)O*<){o~o>1%5U+c^e%(Y-Hh*3E!`Arv@M$3xE<;mX#cu*2 zuLP>LAm`b0BPW$(B{w&Qu8B{;s%INXBjl+r0N8wd*j2PH5a}!(s*m(q3oJNJ z6F=?U2uWLQ5>}uZyR$9Y6EC=HV-FnXUwi>UFm&91;i-Jb=g86pRho({U-d1*rfZ9C z+2omA%wN)$x=sksXH&%sl*>b_Yg?TwTM&r5_DLtY(7ivomo~mcR=GWDQ-))zzFu*om_AaT@cZC zbWl3!E5_jD-O8-%$QfM*GoQe>^T`9~(W-dLarhG}_v24;qp<-En;!7yUx4HD*@y?L zs4sn3BCk9x_pUm+BwIYI@N#8iGyTZ{CmeDH-G;S(cVjU_1Uzf9uMQQqYJVe zk4I!o*D$3ox%de>7K>l;mG9pEoo{@4``^F&`?nwcb8l?t?|vCVg`Ih4j-$KDd+5b( zyNwE%{{}Anm(bKEjK>b4Ir?^O|iz#w;b;Y-oe*efsad+j!Fn&)zU zK5fpyna{H~7V1l>TaRbdu5Qg2I4S%K4zSp^5jFGq{Vs%E4h#Qlc|_%AuGZhkuU6c+ zk+=HirIpb5c!U4zHU!>$tvtHQ|J-w5krzTf)0g_uE8E^A*RG%1F?#3*S$HSu^55mV z_yayUB>pFx(19Q zqR*$t=gvI-46X!)fb^+T=3Jei7TiAS1ycjad5$@vq|lc*x-DXzQnR5`-EWfi#)u0B9p&FBZ^iaRIDv4-Gwu3@&~3nL&SKOND{teX(6>{$QuSd_+;!+q0|NkENUo>&Q70^+m16?0 z9qkHVJ|wf@i$L^19`l-k9eL3r|Ja0XBY)0E=LV4Yb|x)!KmNp>W_Ouw!JWx~01p|X zNdT?SR|~!=!B=nBr{&Vfq}B$+LHFZV25!8HA2`sX3KPrmgVAH=%cXhn>A;@6B7yGs zWO$7HY_;UT%kY<0`YxNVMPe5g`{Wp=!pBx@2p7C_5PT&oO&DU+`#@SwZ=efN5 zq;l*y^y5c(kz?RvTV=(k<5~O_`N&Kj@td~EJHrbKV(xDI6mMuL9oq^^jZkJ)aQWG@{RM!p|qf)&WFRhIZMz-OnFp+r4I=5=i zToTV~EUkTW-ux8)bC_c>k$HgmNMwb>LX4?rPK5qYFb?#POzCWnF*paN$Ga~ro@yI9 zjcUw!EEum`xxD?$|LQ-tz4N8NynXj~{MdHx&HPHhSnOC<2vW#Nhsy9e@rUt0 zCHeHh-E8_?*seVF^dJ7O|C|5p_n`KRRo>nJ_6qo0*{LZJih@f8`&1vZmNe4Gl; zWK~9=1Fy~wulXE~Dvt$CaED7Z4x317$S{EQu+Z<~E?hgezq$_gshTUR@Jzw?TwR%S z3t+d3k*NuuOi6AoK#g6%jXuy_dTa6zUHYsK4Z8jhj-KjIIj+A1NBgF+^?1xg8tyeg zAgcj9Re>?s;#EKPB@-K30If;vvghc6ddbm*8#p|&PZ8#S&x5UE5NWcGUDhVZ49rYn z0yH`#hf=?Rv;2=Q*Jx=g|6~qMe*tQr)ej1k)m9ffQiF(c(2D^r{2#g(4H;(vieG&A z3>-ht;v(&xpoGx6%SW7z|BUV6K$f2?j`2GK(+rSH=TkTOTVBW?Jaag<8{Y*tdYOqQ z#zzP2hW_ZyK&Ol?V?z_$U52@mKk-XGvb&nOp3kNmpOJBVAFin%dx(ED=m1aF_R3ml zmCu|Pe|)0;6Iib*XeUI>kAmv$fdK^QCfMt^d`Os26>x$3|dUF1Z2k>-Es@#O0A0J5q2@lW#5Rcq>Nykj{1{P7n)RefdCMzOG6e!bdE{JQu`e}C0?V(mC)XMsr;_C})mh@X|dO}EI5 z*ZP-u$@#zzyn6lS7ih+BmcPNFefbid46k^omeQ8)f$v(Cq z&6)gl;b>ADSh&%FPcBkwqx^@D;bG$6bIGUjTil)KNB`o;W-fhugZAh$IVL#x)5&}X z|L6||ctgk7nuGG4UX25|f|m>y4pmax@C5JT)k$-t{&bbk+}Q@d4eH@*#*eWN8|hE3 z<`zf;i%-1aUzxdtmiSB-!R0&k%{$un{_PVS-5jYuu7%jp!4t;8DfO@27UE0HqvBsO zKBlD)Lj7mm3lxvJXvHzvwYu^oF>S9|W$5*f!PV}s7CPzpZwrZ2i1`nfCf;j7!r z@Ad{X_?b5CbWi5S#7=kYw)<)5gToKu z4|bQ=4)Ehc#t|@VwB~=^@W{E|&F`Vb7ngo1vU|!7lmO1%ndpmm3p?)xxSqUpwEg41 z{vXXE`|9>5zT+=$uYKf&Ecc&RcrK~vyIf}4)r{B>vQM8ER;cwd7UQW|1Z8zR{ zxIOmdsqLkAzH58@u`5}~zTWzW;irC?@AJ7;>fF(}&Eo%=XWqSi_xJqi?LDu&w0$Vg z{QG%Bg>9<8(C>VFF|hM6V}m>K%rEFzT+X+Aw*F?rDK<_!Usr06=yaW*^HYx7#r7#c z1ihO-}(=zk-(`QOaOz~lJ|zjwapm-H6@C!V<6g+Jf8 zk(d8PX*Cpim6ba>{zYcR{CaY!c!_NJ&>`6RSY)nWMg*`>X~XN}ot%f>;5@ZG{^(=( zo_y-5Z}@|M=s*3VCGd;*-`g7iZ>{p>q`zI!#>0G{{EXM7?(FFcS68Bn@5iYGNj^D| zP&p$z+o^PjRAfJ`p`^5@C7H+=PqRr>Y@f~=BEUQIyOpyakj@|?+S z;w#Xb90Hek&$D}z6hdTlUS`seKAljcUg_25=!t!+PdbX8aoT6s3l^U5tbuW4ychm! zANpd869Zv&kn?+)lu0~Dp`-pzWMq#u5gMLHSNK^INeS0g99O@=vnw3;azP3$Y#k^iad9= z4|e6-0%1)$19vw%s|yYeJixEiA4A`>uVg`ozuvh$lNLNF2ClnqyQ9M#quux+PmEkV zCR-R52bo>m4Ucp>82leO!~2AT9qGA^j}Lf!VKy~Lv@dq!*CwnX7g~57I~(laHQ^{d zn8T-!(zwrI{V4R}PJ7$L9lI^N1ggg-L-#%A5Vet;KwF>DD|`$y!|iz%0HaF&3K-zGvMCK zEr@J2cagYiIg**Zvzw|lVoYMhfY*+qvy4u-; zYzlvozZy^M;yolmi&j5?9JeyZY3AeQ<(PciYm>B-tFe}TejYI+0VL7Ad^5Pn4bDe_ zZ;prV$+1X0mS*78;H*jP;E@_qV8 z24iLPEs8A=e6Ox zFj6z5|m#IoKZ< z_PCp$8`Cy-X#gKv)DIHpo<9eB>hdg_KK1G+win;?&gjhB&6hlLHy&}76^HmO&uP%c z&W&F{H3RM_8#~4xls9YsL zCwX4g^aO{i$>yD3^;NHIzxx}mTKD(SQBgo569vFZ25) zue`fI<#*}QrNFp@Wqt;*@9GHOGlx#j-F=0=(Lc(Di_!})H4%HIgb%ixyd_VtHQ7gJ z#%A)ZJckc+IC${z=wpw4=<;Ka|L*_d5B$Cl4Z>gC|7Rxgi_63RU#RaM^b5pY_3Ilz zv-ySdk6v|^iE{~3MIdmlqx=TwadO-fKs@nu9I(kJPMmq#!1q}H!67jUHs!GMB?%;u z8j!&w$k#-mJL!S%0yc0GOK@8d_`Ukx0g%3v{LoHdx}uo`Z&D+X&3BSUSozG) zCYY~hauuE}Aoc65`jPQ=WTp@=qM3@kfUbM_$?Yo0oR#k91R``NRg9Y14xYd7nAaYcmhZge5q@(!V zMr=hKo?M}aW;q%gg26BP?1V3{UV5f3hrxMjyLH22BXR_Oo~NGyZ|&CNO@CMGSgt;s z&TD|Um*dQ((?8$gu@md`>7cZ8#Lf=&4VixMYr|&w1zY38z%}-`pTQ{p6?kp;^4q(7 z_-+>U%MRed@-vg4^LgvK5JSUc{Pqn4C40?;0X@af+jJ5ie#1fW2SsI|2fE@vrBnNi zE}f&tX5&|6icZj@gcLj}Y;g80iw(`32A?)IF}SJ^U%|EH;LC6?+kwH?oh)Q7J{Itt zFS_19Tv_w~#O%=N|Fy-~aTaxa%I-Qlhboy0Gk#C6Y;Qp{{yTCG9|JS~nSP0#6{q|a z@9YC_2gmwI>4s!Ptgw`92xbm;?1n7jNNZ`4e9H%my4mhF9=(5yH_|Xq|~Y1ba&TB|hc3 z-1<|@4Tk*P;M13^`BraIb0-t?xrI6igOuG(988ccP9c+toa)^$FC z7X1Wo;Jq{!4W*lT`4$J{dS3;;$h~ri1);IHxh_23yFI?gU&rs$ zrIcicIa>ZH#^k+atNRqEL}m-1d)e4KeU?q)dweqZZ{0|J@<;7r<0o~q*(O%yXmlq> zI&NOua}mGiuj<(ZfAsSpIF29fV;6b~RCOPjB8v?u)?9qhQLvOJyV-T!U1qZ1wXv1& z;b-EKw6T7CHw4mjCNHA&P7|`g=R%7OMKbL}Q2V31_;w7>GcTX*&$xL*`IC7$-t{c3 z=#@qowrp^)r4ZM#ZP0k`h&(oRD^*sEtCi!aT94|UQSH~mQ z5C=OkUwiMo4F1_*f@^)yWbfvo9Fq+VWzEsNJnqRS=aGOPeD{a8Kl5!L-cEn(CB`|M}Gu#X+PUk3|0=zi>!iWJsqJ)a8Bz5|1OI8_># zUFk&o*{mz%H1B1Z6IV|ENAG|C?~^G0fhZH5|3I+v4=oe*@e|S|L;r#TM$y*eFMIqqU5=}s z<4_7GtY^mg3>1pMY{E~s25W$Ttw}*|OKHbRew?+t@`37rygRf(c9PNrwq(f32hR+8 z*izT4zZRE?1%YEC2X7j;%g^eWvf~BckH83z7Ag8DgF#Lo_4u3q11HIkY-FFHKAp?^7SP(#sgxw6PG~wg&kJxOR|oRYg%7=z zT%D6^>BJFvn&30pDj$+(;OIwN7gKuZn{zyse$Fe;jjT zQu$+>h3EeN!`{8e{+p(ELI2GB&NII`?ac1X?#`atQnu}C7b+A55@}2&f*5V1F=|4h zA;v#66cr*7)})kZg8vW_5Jg)K5+eu-lmHEK5K2T~b(fy#vTfO2x;s1P^UQC?_v?K< z*Z1?CQmv&Fx9!}&-{<>0&wXEq_jTRZecktS_>zO8p&QCgz-wi{;V<7ra$22|X?L{62iw}eSuoc}MXigS@Mi)w z;fE%g#^b7z?WmPcWmXL zm~Gci`-^WDMt;p;PB0e##*Br!_^La?7i6`IZH?))*`LR5<+J#SbMhai^*=rO5`QZr zt2zSrPU3j=IXNV6@>nd7d_Pm!K95Xg^|FD?nSTy>RXv3D0X*_y<0u$%GDAME_T`j` zmH$5?5uJL?-$^EZ4jIOeO3uj*14-@rfE<)0aI{AvHf?p&#yCwRur9e?C>p_>!H z+7yF&VI%cB2ifj-p2_Q7*lLab7)e%R2%f`EKC#~mv}hv(FFQK6YG97z17-X+Cp+k- zUs9j8eHuW{G3NMn_2|VN%Y1Aq^x{LdkW+t!q2s6*(Dk5r82^W5{2N8yO9M~8mJk9o zMb|%rY34S4zCMq*qtJ)JcIV`d-6BqXl+DGI=>ubEFpA~j<0rPW8U5Np#PpeX;0J53 z@Mo+H$gwr3gXXY1TfXt~<9C0>jhryO6dQBV_5Ry=EPZ|kP0lUs=yk%*UyhaL_~6pt zPUKn_-7an@jk!@*KF7`XX`2g9bJ9s>`#klXD+74%*3Mj1Gb^Jp6Wib#!{W;TinqfX z-O-Qd-2a0^7pX%#HU-%HFHY@F4n1P-g5$6F6~E;4=(`?1{gFTPmrhT9-{W~I@&0jR z`ys?BjfISx83)F2e866vrIc0-i>WDEJOQxd>z-TpoWAiJe$DC6{rNv}`a(`<+3S3i`I)}PF}=}0kNi)b<_~_S7c?^h zex+k2`{m8?$kVTKv;I8hki(w#UH1LNA08+59_y!{FY4F4mH+klfev~1)x6i_&hx&~ zaHC%V^RjJuhOT+H#9Wwkj9;BTcrh>bd*S)#Pp@SC=w{Yyxf%CDo&b31#pm<={-^s( z72@s#?|a|rz3+WIC)y94ZsceE%!{w&>4WLx$<1-xg%9+F)j;!F^mUuKfESOGeEa!7 zYogfJ_++EGO~X-K)V(XYq%j+R%+q>z*VcRm;eWe%&&~hnxBvG4#^6N49ln_(>^yQs>xSFc0k3YdV# zJ6E(rV<2Pzm^dV>4$|o90FDqcz}h6;Soep{!bK#Z84RfTm^&+jyC*U6Y6oz1NzClwA$5G& zyQ*FIki_QbyEIvom)hVmInLsX7>@_JQmoBCc*(XwNB;OAyxCW`ehlHEKgldS7CpH2 zFQ3l@#s@>k)?J{{F>=O^>J45vB9!P9y0aMpskYFW$xi<}MlNQ^Rys-AiT&Dry@3tN z_-cGWAAC;UiPuM4OyXjU9ljg73xPrjk$xnbk2?vbq1bxCWa5QvYREFSo!Cjth8{pcV_pRXNkWvAGi=A(_i*g>zNKkd(}n zXPXGtM~$6`mVSjrFF_Cj|xc>DOjIE`7`SNPyXU)$;y@jO@T zjTQ2=#nfPoEs;S{bp^LAnPt z^h@G48K8YoUOt`+hkSK`x3Z%zwr{^zE?eMf^85 zj6CyAV=MLx^0gWL=(*G{hyC!p;a51w)E`;E@fSJ0;TufFa$xRwP2KhlJp6^Kd6JCU zGIhldduT#hOk$_kKzht4G!W6hwb3D6&9%Y0eX5Uo!W0hs9xJ7zz7K99c2Ow5DI*<* z$vLgWoFeDV?)bO;lzKK?iLk~_j>*@yF)B|@UYY(LU&Ar|0|+0f=UatFxd$S5XkBdS z(HKujkDb&R_scI9mCga;Cq>&9ciFao)e+-_axl%D6^8ngJsr={DZccDd6*B`%;#in zUM7niWqM~6Xm=5z{gZtZ==@usPTvm~5gRkcUhy6_;5+xt^aFv#QC}Q&(N`U@ZS5s< z=l+QUYp~3Z(J}dO^!wY3E9BK{5LrX4mO$&9Z4u6^)KKGa9-ji1fuEwi2(Ka1yhApTeAiM0B= zC!jeL7slQCZhg?$ZJvlpY>yx2{UB>tVpo|NPtMZ~(Y(ZW>9sSNe*jJ}*<2PF`0kp55z^ea!_^U3c!{r%56-Vz z?znkf{TLEEB0G7bI#VCbjmym&l@r=}JzL|;ShY50hy9Mj?6YGFd9^G3anC)s+V3&r z@LO(nmGGU(ky2^@A9_lQ;2u)c=M2WZ!eoJ)esR z{G6|6WEy+%#b-}XJ^96az7ScjoE~|{Bc~64# z_3`)(c5#B1jazn}X?re+`4uw#Bi8t1xQ{q*?+0)4t$gL@Wiu2T0N3;6@~wOC{efHe z-1^Uc$M5*9e{ki0scqlB0Pv5tN5qJ-+c`S_ymPVjqMOB{Y7ZXx~TYxvABsgsi!Uk{nn*@$JNiDKjgKkZS`veu)mXWdDsfK4;1i;ui*19GMkK#7<7kT zV6QBmXG^?)=ygY&Uk8)ehGkCL=ds#DP4%&*@tR6DPv7&^EZ)_PeD022#s>lU7?&6E z9lEcTKbe*KdUi>On=ootAFR~D4r@Wz$sMgJ7 zH+|1ux@TPLhvNi4^n7Jg9JPBEzbgGxChnbNmauiB8^q|yKbS1MIvztY{g(FVLQ{W* zT|C)W=fM}TeR|WFr0J20ZyE*K7DP{w>UYR)OaIc z-Wq-^f+7nhi!?To8;B{&yURv7B5hU2K^PvOoIZ9{<(WQi;RVbqt}LnC?z>9pfzfQBh1?SRXzm zod4Sv+0~u8_F-tyy6CI0W5&zavR@6Tya;lE48GU$_^3OdE)sP7u5I<<_$C^TMcdIA zMR53|v3gvL;LA%fgHMdX;xqme|C2}fDb+2Tw~ZI$YiY@llh|Tk{#(CdH16qO_4(DV7^e6 z+V<#)ugrI7mS@^{|}r#@c1LaH|>00+;q_s`kgn}sBLa8MexyXE4KAd{YW@(hNNL2$=ceHNMVrJOdj)SCxjj`H^7?DI9h z`5F;gZspI$#r9Wly8!V*o`QJrq5Dt&+Q0s*P9ON--#Gm*f9MmZ*FXQ2@pt0$7-Qs5 zv>6kT3mC)MW;Y*C0-ej7rx$ZaTor$IP7J17H*cT5{_DOWKN0uH={M!B|G)Wf{F>7b z{++*j`pjp3G=ywT{)?^kPxjRrJ6+EPgE3PdX8-D;Up}A+ABKHThVkf{x!HQxJ)5K8 zWK;d3|KkV6N&EE8%n$W*{5A9C%|3PDJqlqikH`13+k)>dSfX#9Eb#uMtvh<-u6MG264EA#IZg~t+-6W_ zx=0{T(5jS(6+zocCW+6!iOYa6v2U`Wv57pvy@SRelt3*U=uwX^v7a)@+M=V$K7103 z1@uFYI+2v{CDOs;7~M`D9Xyg{^gi{Y`CeLoTXqbWh{>IW&CqC($nf_BD!fHOfKo@W z0sbV$Bf0SdUC3bJAN&$qC#0~VWv74Y&|f5kOY&!8ovVbkFFZ{w@vG#3uP0?kBB2{@ z`e5>+9Y0NjmsndQGePLD=|3`SM_6W2dB}Ga1by`q2`!}Sk6 zy)xfqteKxC{?OnFYbR>Qja~9u&V4q&e8BH;nH*;<>_VS$FnUM;X8x}YT^P`j$~3r` zVB1G_`7_eUs!b6+b`5~a34Xk5XJfeZYz;G_w3_U^SdyI9tIfViB?@w6V@sFq^g$Q! zg=Vot9E{P3mTt$P_Ujl#5C3en=|83Y8=mR_DO|p@3$J~?txxj3(O#vG4HS~GWfo>b zZ_zgW5giAH)jc_Ad`3q5J!7T0=D<7_qB*cpviqr|cD`dfG>HC6WrbG3kDITWcV;0%w*|j4i?d))km*M+@M~YEO$>=S z{ZM;Sw{}5cfi!u1PSWj9U*kzXg!$s`KeN~#ih$5w(_faZ|Azr=lo_!vBP7;#YEPnu^NRb{4)WwcggFsw9L4w zy2_cHRY1pl0f+H1cSw8U5I(x<<6JbHd7iBFCE|SYx3SN5{$i4MlGysw7)`9;Ro5|h z@g%|6P6u%_zF?U7-p@ITK|c-Hi>mR1`SEoD5Ls-jFM@)dFatCvD>MIe{t^p(D{rM; zY%aYEO!Q4I*fBTse1^^&$nVPI$b9Qqe{|s=IYJ5+a`V5k#vV4sj#O?;raAonCVo2J zXC6g2b9VeuDWz=x@`=2NCc-tez}uxsj_8A{ywQh;-Rwoj_WC9?u!t+AJlQY*R77UR zUS#wHC;A%e@>Arv`z}8C3tih{h`v)NPNwf>Jkss>;rAyWVEo9eV3e)*N;LL^ix0;U<&QH=m$`MLjIA@r7~b2?MlqVmQ8vOc4yeG|RLLwN|QpM&SfS!~oNig@$2jG627M;>3lasBkm^D6<5 z_E!S_*VE@d@yO}gop<&|Ol=C^=2^CaYwVw6cI@V#_IJAQ#b@uF?tQ?T7x6JZ(*Dc; z*d7~Oyj~au|BN5 zt&_Dh2SaILw3Cwd=}Ww`wo>iF9NF4#-MSh7ywP_?5a99qm*j-d>qj?ki1UQfRqqSY zCrAIkn!EWP^S_>-LA;e;L%4nQdhg;t@ww0B#Q!s=C!hF2`th#QgJbam?=hIaT{R$9S)p0!=T@WzEyCkOo}Lyx^U2m}7HVV;YzFj$g(W zHC=n=so-0;Zas1Dy|;c(Lg{yY+qeDZT&?-iFK=G}_|oYkvA5;!o7WzGmxB#xjRv(M z_}+3Nn}9TlWRo&tCgDnSlVF=HGC1%GVo7ikwS+YZdV^X*NW6E@66#KXWMvSM-o;MD zG?7NHy89m)T=Yw1r9E_HlQM&*12sHPe}2AuEkO}b-NDf$SVKn6*i^&n3v?HgLU@~O zgSV4zBY=>GbC@E()+7?$?q>UxBm zc<~k|!$QONd@b3i*C+jc9~^1(y}MKgODa;(!v-ZRb21VfsUIBZC&96o)%q|~di$hm z)rG!~f2oLYvgkoy52Q~`ef@5rnluhRaf06oH`-~NMKb}xlxjX-9(Ca^Z5O-QpT*SB zP5dR68dz+c69@5t>yEog*%?3W;v_!Mc)ZMraP(6N)5J4~CXzYTU7DfdGkpeUW8jjH z+n151zU}NfnY~hfvPK;#dqFx>7wQ ze8g?sR<`3zg4LN07<8dKgiiscMQoXPqF5Rf4oS{ z-Mji?b+HXsWMsjUXh^#;K4X+E+J*(3!MkPa9ozTO zzOmC2gVgcA@d8PGRT+-NMr3o=QF`*odUeSO7DJ8aV=f|W7Sz*!(+@^{Wj zkS^%8^rFmRi+*$5i_yXA;2^svP4Vsa3E731KWtLiZ>;sJXZk4nS1){~Zxr+v zqQ~RSY1d~R{n?+`;Abc;bkpwRUj!6OWTz)9O`qs@aS_;|L8rg)ANd1G{<%{>?QN

    =qLzFE#e9}IE77;Fds16hh_J5Uk- z5W{hsyfX}8=&(y|zbnilADaimG_4!QaWKN#>(smS0!x;I% zhz}*Mz*7Ez9cD@>9zjtI&~>1`3&R>*MT?>Vft3;YeAKx-=pYK<922T;c=g= zZ65{tj)i|EMiX*E$}3|WCZwevvG+?nT@GZk18SnRprY=-H@m)Sv$|*WUpU>JzY|R7r`X+jQy6-VR!I1Y%(z_ z0cey=)Jz0!Cei|=ZoCF$bz1uVdN5TK8{HXd_XtU4?k3tD+KHD!b!?@u%G$lr@U++P zEF(5gj!of5Do4hMW9XH8Cz2?(!Qc23IJA>}w}^b<;78Bn9J5pwKUr_`hp3aJgU}Jl z#OX7!flsayPYpvtE$!UDctXu%Iv}!cMl>%!GWb5CV|oI$+rm<)#QFLW!=FRBvoroZ zi^#SxlJ+N6t8^hs4Nf6`RZE=m)-ASn+}V32)L#}lav8bsDb~kLh3|XpKd`Z%D(k5w zRJRF0yB!UNg9+xKmQS)aEnXD<6o1k^l-yqb=l83*AEk56nW^f<3pF z?dk{f24&FRD?yG7fueu1L%WdK-6@X{ukC}W*JX-$t;{9L?;fjIB^kFFZRAX4_&t?^ z-3jMIxg^XW1=x@h4JXge$R?&n_Vc2ApO;KTn@L+x6L^&I;y_xaL0P5`REUG65y9er zvXFOg(uqcK=x7+2p9{vOt})KsJ%(6k#PWb9hx_DX5QW5 z-^WWlHPhRrQRcY9)5`xm-NL1jfke&Kmq$GC65f0?&3arde|GZH_q5MiRWR4$h9exq zSf;BEvNOfSLI5hi`ZCtaGj}S}=TFKllk2}0w@32TmsZf~xO(Vh!g#sVcgLFL<>KFb ziL_IBGfa7N9_fD&Rk=OSerMMqtpeAt>(>Ryxp1}Lp4R^hO(qhkl}{~P4@GTSg}zFO zrG}K*BcqtME5RxabMirVRm*QvFWvC;VH%+&d~dZeAdAdOZR}6ZJC0Lzu2~#X$#d_q z^abf>9k&g}Qc!b2A@lP;NC010A<{L&ug?^|RA`Sp@0#xAu zl{>?RGE`3)lxj`g`iDB5ANtFW+5`$#76)5D=|U3#q?YX^3F-qosts#<2xhUaYm}?j&}yBYhv+Oee~mb8YPz*Lvff^c zn9`y17IkK($+=tu^DgjE=`_4+=#kg%P@CMqpv!Ct zR%F~@xRSu&3;x%=Qx&X6ZD43FxEP?L2LjIzft#ZBY@od1)a8I4;6)X3nbO#Al$f)X z?xLK5nt*Se1_Iy|*|x`=zhN+M;PPx9n(U;JM%@=2Z_`D7og}#*)(pI;A#Sc_S$!L$ z%UXaEsMnyz;XR>xaHx(DNcWD1QwHhXT_GW8sRA^^W|U&PpI97R>IXgXqq%1Tu$rMJ zjR0^aKz01a6wz%tD!lGS`S%HW+Z0fkrZ){?mHgHK^cJQ0^svgKksRhhsr9#Qq9NCjvsC+Lv_=!*e- zaqk*z7{iU2UNXS2IpiH{rQQGP1ui1h|0P~&w_JyhSLw87#SIRSj|d4tn8Jo}?Gv9d zAQQmYg`WDk!W%_umMcBz%e?Zx357HAt;pY0mxir(4%8)FY0$(HKGTh} z{AeS6A|$e9^Wkuv@jn_X(bNSB-ErI?w6|}DP^DEwaS?R!9#Y>>qcAbWF!H;~0HdY4 z*RquJb#i-{bZ2Hs3DqN;m`BMb$ulOX!vD>1JeYDIot zh&MX_BvU+_m$yVb)PGkD3AF_@AZW8~?$F;=kpC)ph?IDql$K%{=>OrL#+{h4-7|It zVl>{Zhvcyx1OsLwPEu5+G6!bMevmQ}G(q$tf(Vq&b8P^Lb+gu5ARYK5qZiZ>UzL}8 zK2)w4RAVzmjM|jt9Ai)+9m%>2D3gW@fH}OVcVAHdsPDM-5Ed3nyhcKmtOiaPV6AIV z2I=BHuPCCMhT*yOS8k1XLz~~LEZIBoFDKA=t!}U(h>#PI00pcHLmAis#^KQL#L0r$ zN-MFTV{3pjd{usXl|66rtRH+}yL(rK1*;I%+d#FqNZU^bp0Ku&KONC@e+wh(eV8|$ z?g#zaQ_5-!2zx!qbTKdQwfuK_7+m~ulSH|kK$uTlKmI2J&+!T&buIu7Vp9Z>&22C? zjLlfzkbx+dHzGq$yQkLh6Bt+g-Wlfk*?W>;rJVCzQu-m7ZV=NIfO;a##TQ{J6Lx z(P~*SKbFWA07MEjTeuAs<$YZ}1HDt z4`Q#T-h?;`@3o7Wj?V$(p#D5y_~+c3WW`TV{g-F)O$CQZm(l*0p?G`D3w2S>Uuy*p zCrQvfc;epX@4t==nVhrg4OgQvYkk9MqC?}FBG89yN3tpDocFO+lq3Op00L5kh!^~2!t7jQ*tH%6)nAzPi^l!0S zK}cF@lQK6$T8U)?VA6rrb|8w$gjX$<;*QJ4(m2s!2vWGSm`slhOEePMHRP$$<1zBo z^1^@&r=~PCxv@7Qf%5|}o|2T5*S&nH%w@KK$C9RGG0uyu$80&;0S4BZyX)ave6t%M zp}BIxns_e`iPxs7C!`1sWrAxRc_8KimQ$~4Yff^JPmv9r#5ke6Oi#ChT>by);kFOK zqq9RzSwfGTr{nNcA`R<|D4$hR3;Y3DXWa=V0L}5Jz~;|bIWbwUruE+uFU zFSy5aKNX!_^HZzXVzSq_1$H-~dzbV$)|(a7Rn`I$r=<03;CB4v#=b0>D;abzx#*L; z>fNfN;NICoVvZ;%SCN2@L(_$bhnOmb%ula+pmVPwS5?AplR6ED4m_Tl$jV<5G(oVX z&g3?uTLw_L@2;E!bv%B3F{cYa7oP|yYeie#7aYUzI%6k+S*B@l5n4wH5k`Ex{blaykP^mwrJ^kIG}=7ee*9?u!+^#?DzYvywXDlh@%OtYBh5oBgbr2Ecx)6u z23Qi}j(-L0kd-VpBIV+VM_b-~`w+fQ9SJvrSZT!T6X!JLM;gjkWdOAZ7CAW~9$aRz zS^N%hKwyd)I=YN;!Zb?DY+?zN=B{CiiL#~TQYXPF(@1kH&=uX?CJ z=g~@VA|B32rz3FBERLaWYX5{~h-imfI0?JQfgwQU2;dG|JHVi$3cD6nQI&qrXrzmA zGm=(gg6@ra#&b?E{mX!&VD2U`XAh;vS<%I<++5Lrfj!#Y4t>lr?*rn1wmKeWS2e%QkP?pGj(etsD_Hxpbb)TOVwK!Cw|J=|GqZQ2S|4q=WWBlX(oyl!Euvy8z%ie9`a9aTjDsyYbC_BJWELK(_ zGtZfBfA{@?S_>b6f7<(4j{qvA7?|if6r@Xp&@wxI1YNJP<#YLyV$?F1ZX^C4BX3Oe zvyIXj;?6a`Ud9dJ_kj!NE{PKdsDS`e`cteBK+)0+7kDsB1Aom}luira1fv6|?_+7~ zWevP8xix)u4sro5Wu~?t^p)pbYr^S7-8Dwy^vigqzRE(M5p3y?IzuFS+m*eOeiYJt z$zh{fXla-<$(si)DfxE22l6)*sM~1eZ^EXY^2D;_XYC77Gxa8FmX*2-L@1{@wBNl? z7CI?FJ)}H?&1f3{2G!Clb&x`+7gs)0Pp3_To0beORtg>?^kU^rvnm2B4Kng{{DXwE zI|3`EG%R(jYnIUGrd8&IUmsJ^eJJCaLceeI*hrdM0=7+*tGy6VqrB`rY&H$(fK7Z$ zFVc=W35@3Eyecr(q#@PU31 zi;KWzL|6=T{Azn>@EBDD%Uy)IyKDAB1V!-c#(x{!8=udf=$HSqwH}hH4LPk(sJD)I z)NL^?rpZ$3*8?^}N%y*x`}sYON7M%G=;9DAOWhz^vRe(sZ(*MmF0;nJ zZ!FDTT(82ER!l3^e&OpMw$i(lUT##?9@(jkGfycQE{DskTBgeIBw%REm}ROb^hpt3 zL+qFENMCK#8w6cZ@E7x4Wods8d{|o~d6>(y+UKBu% zUU!5kdd}a^$$B(Vf?D3QO+g?7pB%kqLy_xZ{8tElGTgghL#oPrdYZA&^ohYc@Br`Q-0qk$+5=N=gghk(MORQSSi1y zQiO8Z=pGWHhGA1O(cKLAutqfRZ(LW3+<^3Ens(7y)RA;w<=ehmkbj8zv(2bTz3mqt ze|Nz;nxc8O6yG#Jl@^|atyk5`k*rgQ`Mo_}ZC` zjT`t1?fMuoVb}PMB`b)zY-@L9b17kc+jWB!Q|U7WIs+}hB2$g|M00Qx9l}8*4Bn~F z7}-Z%1A<2zWu+L4spKPDY*zAk5C9Q4;{h<^)an)VZ{2E1ll)z6c^ZZ#%j2xVELo>w zRhkcsCCQzdi%I340dV=^5aY?TDHHj;ntFO}$f*uOx)^xOf|bt&f-Ql`y-LVp$pj>Z zw+h2E2Q)r!!>8i_Q!EdQ#2#|ADpW2Y$`_iyk}Avvh}ZN=i2+M52}xNz+i3-*n`=cB z?+VAOg4&+7@2+BlsF^=qztKsL1C*6xWDzccIaOOYYkqRAp3=+(HA}+I2Vw1%f`#00 z8DT&l(2rQxgV+F0xacoxlnOi#YeP)18at#L8%kg%Sm?c~tszhTdL~K-KE#RCMZXGb*1@X`d*sTi-wyHFR^=#}k6Dc+fmh@VDl{7US!6-JA zM~dLhYM023gOVL_`lz@Td~bC|<=8Khq$?7df;9Vv&X%CP(*WRRw$ zO9Qb+0fiS?w`(MY6&ga9ffCn^KryBsD{2RFrM)niTUkqG55sm25F6Ij0DKFCzTM6S zT6XJ-?E$rDCZ4_RjWT^x3lmZl5{-T;Di=0bt21LB*{aYd@Vi9pin-T`8X_Ip(-i+! zU9UC5sXpcY>=L84Vj4tH8S-mdT(wWlTJoXw-@0@ijJPt1%`Tz}2Q>BrhlUB@NuAmn zrX)+lC96HC1?BW2Evs9%^@x8+>Z>;Ydlg~)l(Sh;3{jOOpeOzZGkMmhpgupA{k>@& zNP70KwZ5iZ3ML*s*Ku5uYv4rP7tnAh*?{H-?<**&RqJID%4AuITZ=!e>3yphh4>>W zqP9}M8``iTAUfLC(BxRnDk-2yD`ekWQ+f~UWHO86@BKfqRp|eYt-_>;Y1zg;I2-Al z#5>%B{OqgluFd^!RkQIO@%w|3^qO)HM5LleP4jJihCt&OxezH$4QpFexQNZaH9TMHr@chkP9>#VbAGSYtLB^D zQ%o0_OaXsMAV`mM07MPQ=FltQh_XAPA}E~0s0eK!uwq_-`)iMYC5G?34px;+xcWeI?}O_>!&WLhSg|A)zR ztNF;~&joik188A~6j7h2(}YT-AvWUEx+YgG}%Y>s!4|A=iTbG&BeKIijouP{%n zOh$e}qAa7AN935uuZx&@!*d$g{?KEkf<2O z+#U5VQc}sOt0UC^%puz|)>43RMDslBDhWB+Yl%h79r+}?j4S~jh#9-b&a zV#;=i%J%m(6DRW-2$ zM)Kxo`{zDC>m?{dq#zZHmV9{!tv`;5Eohd=p*|W{^A%25y>qoNE<>cy`8=^5(PoQKRWh9 z5_|i}rmi;02DTaPRvWL1j;ko~jG7SoO~)lwh(NILr-)<(FNA}4M0(7rco_x}A>$8D zxS6GD5-S7-JJ!N&G0HoNBFfoKP})!@p)r_7=3W-mN!MvNV@DO_C62~lpKOuMvQQ^sn~xl{Wb zgx*5pBBUz~_i+_ZK3v&EEjwpwK~&i3jSV25Wk0J}LFynNx?7a2!69AEm-2V7EI)3j z(Q^|7C)fm&k4_u_9S(_JGRqh&;T+=QT#uVBw=5`0f4(>tr+12U2Rj&IeGGY`40kbN zBsD~?WxSrY$5keDJMXf-H2p8a?)odrsBQH4FfuUo3?K~-Dc#-O4bt76(xNcb3?0%) zH-dCGNP~nRC?H+ZA|)~}&wHM;*7@!H3-`KXuX|tL{joUmC4t62L8@fZs)%1HB;+Mo zk@jI0Z%OuOH4&)~d*J}rK8J&94vxuaXIv~?wNuyW@`Dfzcb{zYC3D&?nv;_J{pgI9 zuab!=#Q5sCuVO0QzLg*12D$xUijDDbLJ=U3XB#H{8R1!Q-*!V5z^j zvTAXnN+N^}^%qZ&Yq4hjn70XPLno0gW|!;=ykw8@0M^z^FAk z!WlDZb*kTOT;XJ))Ob^R^J4awZN|Cy(m?}0_PvL>I#naB*hWnKv%k}4i|f{rw{WQ8 z4tWwX`1lw-!!b_S3(;RVkl-EG%BY*}OsVBStXcb3&67C#ptSXT{Vhzvz?g2|r3&E1 zkhI3(?93A2lqp<8Wa;idWz8m)jzTP-Uuo2`&0b>EC8I~jD!`HT9jVWE<0#6(e~WBc z^0#OSR7BPp?Y3jtJ%4{)G;WG;0|kJmHE6}iS%|efbF6TZ@Z(Fe-7}-tQsl4RCAMyI zUVZ(?01_ftCy7-zK)Bj~tvSMYVF*+0Fx3$3p3j}U7w$A#2q|G&&lx0!mLTf!%0P03 zS?jg=Pmv<8X9?0T+!_$DGjGIg7#26;#cki{+n>6OSC*t^41g=l0AxbbZnRTG5x8*P zZYIv^GOphb85p4%?4y1&8xO$}9KAkVbUfYz?-sFP0T_*bBGRutVyyf#lLr^nDY7|U zNmd*O6|8Ij{PQydi48}hRvS~p9Ko;X!6t^T+4Y!An*btgh-8)d^VEQ-81uJ=2!6|t zjl!)~N@p*LDN73j@ivKe*DlgVuP9yyEth#Q$d&q6fXzDc>9Jz%?_Stxfh9b_2rlrA z@--Yr{&L`g@Zxt;%+I_eb9{FO2@002jZ*ehv$!@y@K11AK$i1LSj2figws9w#czk0 z^GLFwnwV7viUB^ z91n1-tox-9LuWYt2E^ho!2Sp<>jvK;A=>xv5M8h0+B4q_eE5*F3%QAB1>A{+_nd_Ark%18 zQ!v)*dPRug@7~o0mt*uOB7YyDO7wt$X=qZ~U>-F9rSB7r-qrf~oRM0eXQthry@em# zN7lb3S9x&7KmdW5PtEK(Y%ub_9;ANHfKFb~~GJcW?Y@xcZCSTdbbD!aoBJD4q2=>%c(cpuJH8-{d?&-%%J0lw^0#L5*o zUF|%S{kOk#eU{LM_LH*rZy?%skj7-<2X2AOgZYY^WA{#L-|$u*60TVZj`JPuB0Yi+ z<_wOPyHCw5io0>M6*qL$usihe%WurZuCu(9hk$=r!W+TYu+mf?%(eONvJX6!ItpbX z%sOxoXly>R9V_~)JNv(FLQ_MCFdcHvemU7^=}=(P{^!~#wUVYnR-XO$S6Ooj9}gYB z+Pj77&?U>fHK2%onb2%&smzJKg_O;Cot28cd%%$X>VC1*0y3XfmJ+x2d(s+pCBt9h zZ@~H4(6>&**g=La=Z+~)X|6dnKvu_KUlC0jqdccA(=qbW$u-r$ z1+5Qvx4f+9-bA;8Z~gA*-K2L%ne$p`tefofbQ$eewl1C807{9!Y!2)iu^eq{f=)UK zKY2sGYLlkRChI=~x%|?8&}d-zfWdjhA@d?nkfZ1BD6Zhm@B7KK_5ptp?TSw{qT27D z6};b&(wj2YHm*1o%F`eaDy8euc~pUX`WxKsS?LPZ&o(6u6*leTZ~PkDjH;#Rg4F!o zjr}ES%|c8wy}qKl^?tXy^JG*;kCkh>Ix%i5bFk;5Z#(FN7(}z6WgADMa3*>vG51RV1`LlxH3UDt-?g z&ZY@3lqtNOA{3Rk$b3D0wKbR;2v^L(q!|#VZaL+*q>Fc>|W&?0GBcVa>rJziNUi1vHld`JdRO)RE~c z(i^sXkzb#^J!(`DtHWMRHv39)z>n}n8~QqFMk;2k>g+!BBV}@@^_|34q4AGg#ss@jpaLzxL`hf zZ-kO-a`#;o;}3c51cl;?vFb^`kJ%R^??vt6TNn(y^waB{6m_Zeg0e^>beRJvQ&CUu zg6gD?8PoRev2%3gD@neXS$bQuB4pZt99gDE2@lV&&vu=BuM(~JQmp4RGpQeyP0iIM z$4|+pqu=_PcsdZLf5hpyrAuox(6@t>2|Dauza{!u zc2CDHAeJ^4MwD=p6mQHSR1L8U*D#Pl$xD2X5NcceS|R^TT~EWOQC`>ftN^B3? zmkTuIufB8S2izT9*80JmbpHG|c_Xu$BHeOKugxwy$La^j+f_oTE6?p057J+MiK^ff zc^i`0=6BVIpZ`)*RJpDCa{7Z(&&eay`B$aIS1VkcKaHwQ=4HBF1%KIX;4`V`CTh-I zj_Z4Bl#1F@7I~aHCbzaC>#zU}fi9Gef5r5d=+z9;fOrBzqZkGN8UfqCLk&x#MI7`$ zHChtKmRx_Ank;Hs0whjs3;wSBu(;{jmpFab_jePg?{+}y@g(gmWQWW0u0KHXA{+Iv zr}yrD>1D6ODowVeITl^$lYFX0xqDj3=6l#68`9Df)t zMUMB5^2Q=;NWub*@p&GeMcg#XfZzy*$NCw9u}08qaz~pps6M9f{==rbrC+4{xcWL^ zMjdQ`sQ-|cfyBh{S)G1D*(^4R@3H3xbgJAIC{B$USH{S;kdsyF5eG{g!_aA#i5Tv} zDJb11`^}=fZ=w3bFGjLU8>mcEu;*XNSBO|8jpJ6opBzNcR)L8+dcat$n?8j|l6i26 z@rRjYWY+R(>D`BFg)O#`VzwDN_W5G=B|6UaV$Sb$TzfWLr^Q?t^xXK{TqGsj6eXPa zbJW3WJ9wMNunm$WT2h*6B-lE%@JIXVXw(h~-;wTuyS0n3t%a3oMXkyfGR8vRB(i-N z?v-EHZ^^v1#wfT+xrf4-NS9xm1A#NhL}+mW6=<8TOo{WAAa7}Ab}0*ZlFc*D9Kc< zKgsM83d+-q($#I`@@OD}nJL#*c9jFo4xr{1l`x%XLlVi|ROQu-_F=w3n|Um&Oazi# z*0ky*=gSnsFdpvfb4(X?^Csu))dcfwZk3m(yKSqxw;vfqzn7t}+uLn1T9QzQdD*Et zFgbWQD7!c~`kE`$(71Q>TXs9IUMrdJ8?Uxte)nn~&V_@tv<(c_ zApe!I-59Ol3KJEJ*SbYS{`**oaX!+H%#4a%0%bA!ba@@v(!IE_!F|`ML?i$4-aqu; z1Y*NTD*Pxmabt_OylD6}OZFBEL*}VRLD`Xt%u%wHQHm3h7EaMNPEkIU(f$X~(aea% zgP4rUnEXmaj*}dD*}Kqn4;y`52V*%Ol>x7^N&ad6Q^XDna|q|E%*-lk@#VdXM*2E+x@uL1152jKVMefXrVUG0VpUd#b5b-* z$kF#o^TX^^=iDV7gVUwprOei+aq=T%!pKJXRT*;2an9|DCoE4}E8Y6ItZK$oaZx2s z=Rg*VSM}5?aPCsySNf^14j!*&xDm1W?0%pfI}S9dINc9$SE*cDsl-3nnyr9mxcIzb ztr{$=%-O05uBi60X`QRCDRwDdWUU;mu9~Q>3qGpibgbTEZ8)uNSU++bo(OJa9je_= z+GUoJXQOy5Xj<7y+p%1(FGv+-jjgtBgJ<_A?5gK8%~n}UdQ|eXR965B$MC8w;jU93 zP>#j|W#sW&UEoRnv$oSs;o z$ggBLB4VoCR-Q8y>azY?eSBQdK@Nu4`dXU&gBj?`9;)!y3GCHK{JjUt7$tQ|$8xHjbZJHS3JutaGzE6D#D!=)@PkTr`Ls=rO+n4s41$cMx z?!B$L7in>nf(b=_e_oWMxBNuGJ28slCtZ2-Y-|5TI3@*R1CA{yOdUZWYGf5jtm$M8 ze{K^<8%eo$WfZ(H$5<3iG1#UbRJQUhHBh4r^xpdKpPO78(K2ER2c~MftYFn5<;+;# zMuk_71B@ilH;xU_TiSxOBbL6C8m%PG51adTF0f0+EToB#vz?;Jxm4q2Y(LNdbdGc(Jo`BSr*;DXFIV33W8>u zLKr58-aqd4^YjpFm*3uJNQfrC&3SaNGzA8!?r5JTlzrpcj6&TK+VEIcJH}NJwpP2h zl5DV)lYj&>Yj41DDVCoTgO3$P2!F8qkxRsVY@TBM^|57^$#uQuhl84X^RgzTN6T8Q zDQCyHcWzzVHaw)R>sJoWN%vr4tVd7JmfEMDyXddqbktN$mg<P`n67EoG7$e}{HtSK?>hTfRS0$s-<V7pV{e6{ig70*qIWd7+BRknv0zZo@e11Q!ksIdMRm&UF-FZ)W(N2CwdD+=B{NRx;(sy&wpp`+N68g=YF$?nT ze$A@Sg}U3VbNi(8oOHqM!YUO<^RnVul&A4$U~Glx)qQH_Q|ej!GFX9`==n(GGidfO z16^WO!Oih-)_hsT8+^Oxz$Wx=ERuR_)SWUKqmT3egBLIJ{2Iy*2)%XV4j^Gy2T73S zK~y8dyo@(3VPHngSTAWz_L&=gJ2?!4mqx*^CNn5pqISiqgn(WZiu-uxUPkz^qyj&s z@%bzHmOKt!YXdJd-9zAefh&gx)}rx3M8E zaH@nRlu5y8&ij8oQMqVAA&d*;7Jd3SaW=Q&%&(Nhcssh69m=YL^QpXfCw(*{!W^G4AUR1i4Jo-dQ<*gR-ss}9v&<1NuEw`?@umm2oI9pU z&4%K47HtrXa@c9{QWp_jXYTpicK#zc?kx;Y%&?X1I9@fE`-rd%0xq~=#$i2*;aCY!FN zp^g|xhh7x=va89*DD~{7zxwESl3@HT)}WT|BHJT@ZBCwb(%!@|XTdb%O8m9vh&NFY zL3&DDj?l8lW2D5q47(K85%FiijE0zhj%tCn(}=|M53k<;5|tWG=_GC_p^KOgWr)r{ zf+`h7O1MwxQuf?67&O)i9Lu9kE=Qy01zRUdG^_)F-}41Zpy(n>o&q70VSm6<(W1q6 zTUjNG=?;cqwS~e*hDu=#Qmy$G5C6XR6({~}oo|6$*{we+&Ma=ak=UL=uflmhJBnN|>c3Zv02G265W<=!IjC|s~+~^xhQfNA)5Wl%*3~5snw)o!l>MbG)|ZAt%9**<}#N| zh7Ld>Ifz_@6Og@lY#Ux`jDopx`fy3@7>)QT=3rb>-^ByPJ@BtT>7lv40&tkh#@M&c z$y^ma=g^T6$_Z@Lo3XVPo5}E7lv=g>G4;Qw>F|_238F&IJk0t*cyxj+nhyQaR(G-^ zJ!gI2$Iw*^H~n-BcFc{b#m}uM_j)3vr!gbqgS`zwNMj98v%(pZsifGI4E0ilD2@-7 z4Kc%vaP)8Kt!@MjDQwz_W-QloTJ?QsP)PkB?{EJcHAok7-%HRw9gCjRf& z5`*7#x@&u$zNTMmP$Y^qibWac4L)-H)fIrcFr_BI86k>S*wLG>Qko zGqdVdxG*(h*rB+^JkO=4JND`AEB5VTY|9iJ_1n(XPXQ-2zb;bAz764D=V$~T|Ge+~ z9@FCA&{lJDC))MoiC%XsxEgoX8LpqK?{2bwv+rY$&Y3>`9ljCxRW{K#xuZ7Te${L` zipw`Is2hx;2~DcGXQjgQ^?O=E5|LC6O0&X(=S=&tLDD@(dQ!=YCHXL7X7F=t$X}qg zHBi5BkeIpf?~far8@=;?#QstbKeUPfdH~6b2&wSxmzFn^LXwy1TH#wl@9t+mN&fzz z75d9p>hJpKBkH_`>)(Eo)WcrVCR-#ui$3)>E2lf!itblGTi@i1`6AMtg^cwI&kzJBd)yXTM=5QO|~?^6^; zcM#5C1eYDQ6Z?(5WB`DBIY>A-NJLxm2nX?2`qBpky6pviGyo_Ffvfy|cdg)-a@=4d zU9$oIvCl*>=16sBL+}Q6w~sN0FaCEXh(bUF5G`Chz?Xp8#k>-Cjl`}>(T76VV{JCF zmtQIGmErRS`nnPkC$bnHCl-m{*v6GUgUPls<>3<1wmex5LCkiN8MaCL&g9G<5GPCF zN?dut7;DrJO?H5?(wteM5i)}rX}=gKuIM1y9^-)#&Tb7&$Xqy_aDMJNe`Zdo zRF1B0O)QDFW&4&Oxg9M6WzY1NRI5w^uBfSO5KI{mU#6+SHhqOhqRhr3DsL0dDsdT< ze8_JJVx4?qlWip{Whu9zAf6I*Ho z;c0hKaD*--#|ME^f|lJ`NIg=Vb2;cmYpR6aFB@N3Ytli{ZF!z@SPb8K3?M2TFmIes zoPvI>{q)V%qG?EZogMQfD1(|AH z$0D>l^D44S7Ve&rKXAtO&KM%kcI7W&4>B|y5XoV;@$!YjrOe6|1ht(|K zQ&t5l^bJ5fzx#TY=lxX7^dzZHKZ@O{iThhhGK1k>Iq;1NUy(xSZM}VKo^))jqupx` z-`al^jl|&qn>nRh69`nK;YPt>J);=L>ViIi$C_IO&5kNVW!SzjiJl;jAo}5(A(E6a zUQef{dbHQ@uKAN(ZZmpAZRa>Izbj%pID=dmOM#+FNhMLDwY26s-;RWgw#}u#ql(?A zm>m(@U)8J~!J_8$0v6Y*`uCIAZvrvF!l<@9#)*0(*M`&fjP4xUw+(qBl-U%lxM^OQ z>m-Gbe8nbP$*3Y1b0PW_Yj0W#lxf*+bvVm*I8NkK;~UK@oKs@yE1xB zd&G5Vncxh~d~xHi0PZ-1Tu*G9Y9r>ME9R!9L`bn4Mf*vAUG9&j1!+iHXE%mSv7c!x zv1mUyq}UcG=l-u;<5Dd!yjiXZBy_}UR*yxhu5Nck6?dtL;{qv9ZXqYD+O8>eZEZ1j z{WP~yzs~yUw7Or`)wl3(X-w7-ecqrvA3Bg09SB2@R)H$2Lu+9mdR7P_1Vo!M3<8v6 z%;DqRQ+nZiCPoA3ZVb!h@#%jYu(fU|iHl_!tsmI%-|9z*_Q zH?X)?SwBS6`_N)|_vsx&)SoEN{txQffOymf6zhE8xD)ggD4R-Sw+UPA{!n(lW{OIfOeJx62Zq?BqjO6EMrSxT#C2-0fD){l z;{XQ?W6t&Xsu#Gi;&x1ZijTAr+N5qw&wV*CKr8c9U_#`i(a~jw7oS9LaY%+Z#Oi_2 z6!(dO9EU+CXd6H~>}W-1*wFe3UcIj9SB>^E6>fQ8_cxG}jXHQT?v-(S39{h3Dc}h} zl<5kWoUDr7sKYULaAlu5$JI<5A#|o4!%yj3H3mHEN0)nYVhhoMDPzlS5FGA#uFY|f z4ECn_45(oo1Vc-ehSY5gGovIR#%>Up1_WRQ*>fA%$y^zVbv}XqS`SBaN47R}Z0&D;q1B!+gHiM;&ZznxIY6!69{wkwE^59BA zIb7|!>N|Po-to{~R@F5Ch#Ifz+U%V4TlF0P%ogH=Z~uj}s~5<1!Q?NK@(g)#T;}kh z0CEY4Z1Nbo_Ya5(K&5^G-8-!eGUHFZ3fvrfLQ>HnAX{;W%6X2@zj^8NdGx0yy=pb- zAMfRx!LXMe7$}@MrBKTb@rI(5s*Mkm?@U|q2k`W2hsJQH24L$uxoZlOwa;jm>{9xK zBLKr1KaZ~xaJ;)3-%n*|45g@UWURT2=h;4nO#*fBJH&??-XOZ!Yw3@(`q1k!XuBRY z%4+jAzYyD(B09z)*|$_v7_?JsA@2oUp->A5b0S$?{UnHcaiDuB^f+swQ9_}e^)^8` zac#3le~@7is=Ysf58Z^guG{}*>&%@Mc$=fQwvKs%vyDB6$FsJz>F>7kG~-7+C07|R|`mEQ|*&$x8 z$M`bXRCQmF7LYHJ5Ul=VnLNPdF`t|IZk{SsJwHD#?5o_xh<@D0nZ%Udy6x(^ZB1@g zT*!xi;XMB;iT|)IC9o6Huc5cs{$LHSD4B)iX@5iK8TW`krm-H6bBCDDu7YOA!7|uh zY8X4&=XeTdP3rNQ+%@H@8A&q5VI4q@^)_FBMG=xp_KH2ak6gcEW&vvrT0!ZHKoL2#u= z?0nuLvR3N^e%cbauQamnJgZ3CQin!`U3c~ZfI3e#?p!Q8#7PVNp>FBkd<}gw5oDE> zoOhnZ4$%wy^GpWg%fAs2V7%gC=D8=Npa4A(yX_}C=n(4|STuufomF~1VBmHmnv-8< z^*PQx%XVYzUFg6;hok(5LcF=5JeO^d)ok##F9}5?=Q~I(;jRvhr`BK58Yeb;iBu3Cd}6HIVdIx9@)`5B*OY8SMFdvDUmVn%eZ*;$0Jp=OsFh)Lmm&q>*|j zc@ne!>CKV^END)&?{FyEO z_szXGCh2XaAgcc#mhm@CZfP`3hF@F=2lzo35Wp6fJ2@h!Ss@*-rVO1|c8O<6DaRV_ z84!+P`GVBeV13K)>U27A0~lZBPWHZKyL~kg6X@Hp<3vwb2mqdiEfa zZIVV)-B^{N&{4Iip761zhKcsVA)m2l*27wpri7ge^-Uicn$-F1o7e^rHZH$1sVBdy zRI-$@hYd#xLmddy+o6$-se@^s!hB{J^gjvV+-jl*5X2lT*Z}M(eq9wE-dT>8tY6xt zGCD4dr7v4zmD!+G+09?ov@S1HQvqXR`i7Pge50Q_ZLb)0)aH}R))^vOzGdpZ!ZON) zSdAIlCV{xotUIXmCfh|(@DCYqXSTXA3>Kg-&dasfk|-?O2ZOh$rKD#30_rS~UQU5(N%J&Okx8uC3;qZ$=GKTyCxqFHW%@I8 zy0-kKaN8^HQfE;)86AmjBZwhz0ouyt$@6eXea+Lu zpmpFmszpH`3sxM6yVND@T&-g;;ZQkCW?h_9O5aUAA8e`02v$osdQ*i+$$_aHXYi9V z6LQFtD--FI7Mj)Z5ZW-(YPf8^Dc#1ThzMvpmsAOh%&M0xW6Uxt41b@pm35{=cQn~~Rny|zHi)V`$w}>dB-lv#c{FF{r!uUh$`G$eTKp9L%cqg-C z#bRupuKcG{1y9kQFU1s{UREN7TNcG2d%mv94@FCrA9xFbfB;mN&v~*i0$Elp<$>T7 zKv*qrG}z!nqQ|0#FDO>MDm5>jhez{7sOD z(Y0#QDln)TZ7Cao3Cmk#vHw6+fP`StfLav=+VJnvrLscU26)bJauZq3+awWIq^)bb z^0hp?E8Ph#nJGx0xV*AgV~U%u*2O{v7AOp%KIlH zX? z5|1=Wq)_IhA8c0opq9a+BD(=pg%C3JXWJ=Q$%b(!GrYm0%Y0@g2c#tA{jN|7=fJ`= z4$?tmCt>`U3`dyoI`G?10;%$>?VI$!H3Izk9)7x((1jrFT=xV5lvto;sPe z77b75$MUUA7|3hU;TwdOy?R*nhEedxnbbCcuA>wZ3W+>i@F@vp==?3ic60l6zmjZR zgS5JJRfPOZ%a+l8scqeJG?^HO0krV}p<{TdxoeEa z7@LX^a%DxM<)0lAZml!iGkU_%0P=UgGF^@`BW}&lODY`&eVK{`<1TGO+Z(|4x5HyW ztYNyXC^dS~US+9ZhVfiFCsN8-eJt{h%L92`2n+GfL<#kn4*@eMMNy`-7D$=>T%?nq zO*e(soG3~*QA>X+;{KEs9 zHG4+x$SIIY7;$sAy&yr(RDhs+21vt^(t{Q|rq`!DEkp|b=6>P!s>y}1=P3V)CP0_r z&m+i9G1H{@Ru|3xK_%1S%^<}RN>-5SS@SgG0@yiB<@s9i#t?%YZ=*wE{{im@XGZyr zxpmI4&G&@>J~indE`rs*eF&%Uu-a8nGC+Yi*+oN58f$OQ%}yZHlkX+kkNug~EtK=_ zD0qY^4DD4|Ic1}#Xh_I+t2k+yY|V0_6jZJ)-5!5^}D6 zOFWsKV!;cWUGb!H9R+D?lD(vqKEo`n~Qo~nyY`* z?}G=U_CSm}H=hF6hox}tnYoaq%b{Eqk9JGp`Deo3tMp zLcD$q?tCHlI-f}!qs;%33JFcLxj#4$byZ}aivB|Y0k*bLpxKS8mH3Y65N)VHLJ`<20!cePCn;GbvXjABlJo z6;5qLGIO&WT+rb+O9{sTmwoRKhF+kPaGvOjfMTI!Q5@W50)800-w)aG4g?UplvF zRGb=+fE~YEE`NN4PPaBfSIUVC_!@U&bD&s6j6!XRg^*l$}w z(JQ5_LL^Qq@;4t6z^YWAD*&HlT&GkDrEEt1lIDYR3abGP3K1x0wQ}c(VX3cWHX@|g z%ms=cmDgN{hJW!^#liJ$@D^$Y!<~Tkd6jW4a8@f|T2qfYn+oH3hpB!~WK+~!6=>c& zZ@s>z?w44q@J9_wEY_^?`KEqgB^+H^fnL4L=BtvSvWOSI_?zlJrHRpVBJkS?*)t+3 zv&oKFNc$7|Ca&MkE-n|tH~wY5iC$%^IdM!OaAfw zzX>tPkw3lU#+_rZo2%$@fL*ivyiQSa6U9U0xE%Kq^=Y)X5raNMl_x9x`ffnRr}{N) zHI0f5Dsg@r_o4)G`LOz#eN9JFtnl7!(J~nU zS5+8ksw=IxXh&qElNR9q!YUnUQk;5{ALSH-R+VVj5lL}U9=?NeroF-u&F5_G-otI4 za&6&Oq7w8y0yfEK$-F&Zzf>J6waZ{RzJB4urg5OgiPqDleuVdCqPX>USNJS^od}6O z!OsFyEuf2F*q};Mh0TnS-Hvxh;kJtV%JY~4!?S=?c6oTKoxnn1bbTe88Y8C~EP(78 z%Z_YGDpfs8)JsCJffs}3Y_kHDX81yHc%XcJ72Jw%o)JdNG{#TEiXfVnArxR4JMXnI zp1VAj+#UiqvbRQacSmlwateq>GxNRq&hO{ejf$iiD(dPVVxS$fQ<{@uSws%~a}#X& zp=M8y#nlh~bjACB+gc~J`%(Qr!T@zcA zWY)rXq;fk|p16VuCof;m{-ikPGkF#UZDzNYqPUjmez7G!J{3O^zM*jkR7&(Z7S))LKfr1DD;xUQ?|n zQ=_K8^~>;02Ah#U8}+6;{lwnKD|Y!T1>w@ zH^*bEuczZ8jnf`;XL~rJL?z#HlTEIo*OZ?ip5h}52pbo|2Xc?*Ov7p2aa1P%nxQneQPHxB|dBz#{_N(6$kR)q*TP~l1~RnW~d-Y z<%T!CeXu&w>N@eZ==b6nlIvh{3F<+}Y+>RMfDOVc%4Y-J;{ZK00fF60$}plP>6hU5 z9QpfVi&qla&@_Z1#mA|fXUqN@n7rlW%P^&l9?EbsmB6sO3zgG{ zZU@~lWwdYnfFa-dZRyP!RW!YS**u4*{Ub(mH2y1bw<^&ROU#vqT6l)}lgNElxWa4sy{Lhg=g(;IJR533l1D`sQSh z@FIkW$fKNC!mI?bcsY?3^9~aDPFWkN&qYjk^bb-D9K8>nI?m(YMj?L0f~R3vRgIa} zx4S8lhjv7Exs}f&HRV$+94h80zVjp`a02L|SV$U#N28@yk<%;$+s5KhanG4M-%cLO z>VbG8ywVhy=)#vMm`1kw`Z4waFOED9k{XyQ77dPGcTqFg4?&cKKW+hMohMCxNi%gd zhb5XX;Z)EdgrUgXhFGK|QbF0S;4nTWV@E1_=s9g)NTWA_%r^mOvPid$8ud^ z*R(=IXRPer$K$cY#*U65Jv5gwk`w!KEK=yF9tgC^0MC6!-PaAkL)d`OyZM;7Au=WV)mQniwx?S5|IX;&KNL>?{oNN`*)qei4v0 z1Q+j97`<@MRV23B46MiGRvphWOb#RN!V&@(p(QXNvTi}$;mfzrB0h!qsRUG#ItBd< zt~1Q_G1#VEfjV`^{d$Wvq~xBNRrL-Qz8n~ww(^rr3aNP$;wAcr;|=h^Ssd~ z^KY#CD&YOtLp>x+Oc@~*2JYud&s0KkRlfNMgjYhHEbwupBfyOHYN(bManpTq88O_5 zgS&dGkZCP?vkYQIC<%`Rj$+Zn@)td-FM%Dm6&?L;4PmowXC5;zaj?k{RgV8YZe3oq z5u}HO9(*b}55Vg@#i5=FmT?$P$qHTxe50)L{;|}9>XzL4jXl`GcozV-RukN(N( z^!R_<$mdMX$kapGuPm>mK1R*@C@y%g^fA^>jnKVrNgF1;s_B|IQ5wX5?D#o|IMXZay>0M<^sva*x4ASZ{@vjUs&i&I}$s> zasugMSxD-?s-RQYEoh@Ll%?B3yveN4&Y;5^fsM#3f<)HfJ-T>2d-M;9cmUkxKlhYFsnYEJh#(E#$fTuvO-F_iiFRi%3Z2K55+Y@ z1K-YCxC8=fI>EVbe6(@h<2kfZ$8~Q~KSSlxYqXjT*y)D&GC%T-vWQ;!_{)Bd=bcmd z@%%`S-1eB*h4_bQQ@5s}c+;>3=`Ez|9_^%T&OGGb&o-`8s;^6CIJc?u-05qz6AVAf zOpun7|2(>7P{Z0IhFUiSy~{3LN6Xwq0{q#6zw=VkTCe}Dt|qkAa4(5qCeHQ5^fkA) zNQg`y$;@)z@Nb004O0voIhz4CYr@SkH>F6TI<^}oX^N(RnejpTrMWYW)zqp{onOf{ z0$XeFYcunQv>g()L%C}oEw`-dB*gyMJBW2GXYze%JS&l9?A(R$_&rER5z2cEj5MnC zzW!o}l6+W<`cO0My7azt4CVN1RZ%7tX_97yxWe&vKV$Ce_$=WT-lyZt6hf;v&q8yX z*8ceuJh0l-#ea{=tV&U1t!Wj3pW5BasO763u|i@;3}fLSpeu(W5?l4ex~w%!7br>9 zAO44~yWnc`2?Mkr(f}bygF6IwcP;L2#oevALvez;7AWrS?(R^*-L-|bv_MOi|NHLl z*>m>nmw4v6XXct;<=_{hSeQZ!3_3nWy{d>6BTKgVFQh~CGiPM*YojDj%MR>2(Q;4M zQWGR{9RPt3qw$|+l2n465;-(B<3Tqp_MX_+2; zQWN=BM;7HQ!`8+zF*YLZ$$ z1+9IIub5SVh1(z%+cG(+I{-OY4wn-lLVxr+rti4zB)e58pz%FJGfvptZ``Z=vPgV` zr3d@SHaVV2&pG^e~#O22c(MXa)9<(Fv+XO6G~Vqy(l%EWtH2JRo}e9V34SNB^0#<3bjus<4A8=jJ3ATM^gm&_mpDy zDPZIUUsR}Q2z2nGw3W6}6Xg`*4Qzqvw8YTRthqg?QeUi37H>T3xla_SUY-?fwO~bb zt?Je*JKTC$l$o4lefr-|rE*c~yWbh61SxKLq`ddlS$}X?Nbzxuu?|^4ij*Ra+W}Zn z$yh(+yTjdnR@sgxu+PT|W-A~h_-|#V^l;Pk;E}Y>>JQLJ*a7}v&SdN>hvZC7LqZm@ z$R;eZczX{+K*v^TEm`iWbX>sK>5Jo9WRo>i+%!-(^hdpd!{;|?LU^MDV--f!V8Tz_ z>QSsZwAlX=q+?==%R(FLGWuOiqW=h$xG~h?FiV*J`y-Qc)durAIDU&;vJlS5FW2n> ze~4qj3+joKj$6@@%0oA3Kj`SSa)im4l4N9XpSWdFy;I2wT(hMIA+f5s`cuEc^^rSg zN4m>!Cal$6;bcULasPtZ&thJdq8v-nqin)PEp%(?0TZ2JmE6juyDy@xQ=)be3yMw6 zSnwXAFja{`>ya*AdK-^8X)cY@93kL+$b$9!B@Eb3#~z31Q57cANd`R`Hl$<;ZyVQ# z@T47B2X{?<-*B-5y$n&~k=z&C2kI&jYFbrVBMh;%3R> zw~g=Xz`$?~Ja&U_HZJxOd(Q-$DC+>;AgmUpb}wA>^TeeJcB`2f~3ABp(8u^h= zmXT}gwc`G4QhBxInJ^dtZAq)LR1~kf&kFXvUD-7t5r;kb&*uek#kCsz%-o}ShMP6s zK(m!3<-tk{WqQPcgtb+2z!4$Wb+}PQHjK22@XzGTBJGS`YrfpOf}5CRTpXq2(f+Em5>C@U*)L5KkH+@NVjyHB>bf8{$AKAg|8?P;{fkJU&b__>H@pQ^56ZpeJwo=g)1G? zE}X}j#XTAbx2*n%zgHCVRKkAfyFK{?-sg4?kS@&umeLcJ%hX#QTe z2>2~}FZR7G&4Hhu1GV2S;29?-c=V6HJ6TiG7F!CoJcnf=#AIkInJ7rN-iW{!#p#@Ly|h*RI& zOGL9o?2O|hKhl8?sYo!f*6Q#z{*AYUy%^$$`}t_=Y_0d(}1N+Q?dRk-@*`HWAZ1s(t1 zE7PKvgZF6uFbd*u zM6_sl=~(?j+kDBsP3g|`-ddeG<9*CR=Cs&>mG3e28_mOYeM;$pJu|%65u|O6K2z3b zh?H&79@}fM+97rtjBCN1mt^}xqzIbZfjOyMQXh* zTD_9Ov(h*BA8(FSXdcbS&oQ3Y_IXh-CXbI)29z`)Wa-9P3-+@%eDn8I8JZ|11Q%4_ z=XYyluutuAW@DH1NlMU1cJ&&pKC>2a$?jW}7Yjl1gl|@kgpdtgE%gKTQR~gBgGidqSbk_G3yev?yAoB?R8;Cb#QAI3*CW~u1csK< zAv^n+T0kk}+3cY>3Fg1^J3(c$Dq+5c7ASs?A8Mf)h zKH(RV{==c%{v^sZ3%9+m(i>%u#dY@AxDAR0ouuHLC-c@{u_CPdb+?T@nH{{J1_`T) zR5Qo>K^SJAy{u&nD_A;`+!q*ZnCLhB)PBI{H*#%%+hYP6w%xxLjAPnbyE1x@U@c0_ zzCV}?SV{WrKw&6VL3n|_Z7{!4Y;2K5Y091Ov$?njWKVB+W+!o=(QxMKjyUxdrcY;P z@}oGnpP<9Vq*jnB6DqHiK`Z5ND9ij>DdWfl>Y(m{I!NtUvdq}o_&8*4SZU#z<^Z=b zF)@@28M4!u@+8f~a~bGHsPmKp0t7Z3LK3&IWb>VF zfZIlm)oFxp=|D!g-{TCII}q;Mi2Spkz{rCzvTmYUu@ zFW)1x{r%l(kCSftxpdltWyaNUM(TJb%Xzl2Zf1gYcBXE2g>`O$b>VB><8>AOu#LH& z=4lfKsio_|6xa{7sZ9lUW9+>xp zP;HqUw+9@37PYPESl3W>BNhyRCx+L4*6uH$=F$#LHRm0|@#59eDnq_@(~$kN+$1 zERm0Rxt)c!H(6;GOQsr% zKBk>5RPg087eKtvKUHfb+j{5eTnF#oQUZ1q!|QSI`m8X7`lpy{*eYOqdXMF?dn{m8aY z=2EP9Cd}a+X%;oHwB1VKwdt|J-dO1W&aAQJ6!^;S$>_(;URL7MKz-03_k%fa$_Xbe zKJVT{7MkslcOCLmO(xHXPZ-blK0jW)Dm8v>SmCoa61)TYAawd`Qq{!p{oHfkV`03_ z(W;XOz7Iu!u=|mTa~9H9^Y?!weRBhU>)P)}5!qJlN0Y^s;i%l3AREBRqq}m#X4jAN z0t3(S(rsyR+V&zThZU9`Xh-a=BCrputR|p{u}vjE5r<1t~h?{NfhF= z<+;$B>1`v~nlbt)0%WDlbS{2gqr%_TtM=jYx4AGIL65A$1Pvd(BO_0PqXNH>14bNM zBpjPOnOb(6JoSrigz%1X^W9J8dg5t_Q$xpsBTM7B7_JUOA-< z#ze1R$Lv80wlf^NfjfQZ&B{X*^yaA`3r!ryTOjY<@^nyM!7R(^+T{CgOeIK<|C zX^)+IC0)gT_+{tc^jnevr>L2qxp;fZKr5uZW zo@tOSB#tkIk(BLz&H4quT+1T}Vu}_JA*ZS`pw96gpr?;I*izPthlo1r`=~cB$mpOUhuZ%CMKQ`DuMOs)nYu_VR z8=m7DTG1$TR1^>k&zLvdly9)$Ecjd!^z**{Q6euo$W6XpJ82_$k&W^`w-8(H(+~Td zFMofg2gVk-`B7|iSj!Sq7{*O)8kO#heVoplAd%nL&>f~Z*XWDBv}qsHJ{h=Qrj}RD zoCxYg5Bl55v9oRau2pd}Qe|9-PLkdS_CtG6E2if7=Qjt_p1rTmrNfc#DdEH*DlcJ$ z($|*N;kcp}U|k|QwSO`?XHFSIU~N(Df|ECAnu+6(vq8xAJEz~xYp)U2ghSL9>H)uV z=b)(y!Z1ZlXEiDqf_FM+2~BiYN9x6u%VUJWleVq z^qn?+)Jj7Nq@{eXIA=-1lhg5max!Up&Nit&$V_CNvp{j)(U2!`b*_Rxd8(yf*VgwY ztuVd9vob~zB5%bU|DqO)v!_-R7+Eq1eKN@OPHM<^(25hwZAGYiSAZ=iyi7oZ-Sgoj zc;1S`*{gt={+Z%WI-Js53f#UGmjw$YQ^Sl#ygivs-k-H7bxr+b@`Qf`MQ2ZgzRWu- zU^q`P$*`FHeLCMuvtT=;$!MSkrahl-a_P?^N7( zd0S3x%z`7(sl;~Eg~Llq#~;VHJ^JZ0QF(=sP!%U0ejXpnN`lf0{n^OqVuIkF))~%V zFS2>7h8^)~dhe&U$^%|dqW$FN_!9Rge6^6dHic!yvItuI*Hhh#~x z3GPVAl-De!07~&G&J3;uV2;(;DxM_~I;re5{shA8*C$+)b0fh{to8uqUxx+B7dm3S zd=t`7L|)k_(q3xXHml|!Nj$0)4qts(vMp~8n+jACOxtHaU>m=sW1oU_!^CmKv=VM@ zDrDvCrHhO%++3+nTeDHp=+mxmF6Lw~X!8Xp0lofR|2qEqsgv$PtZ}swxySRbB`p65 z*obi`hd?hN4&2(BjcsdT>_?nr+tJF?ubS-Qn*FYgqv4r3U9uPM3MKH-z{Jh|`(RN2 z&U>f#^!g@1-Qly3a=pxS;?9(s&Nj&KyC6q~eS|{5Y&w)0V$8cv@Fr zo@hHgb2|Lx-HNziuw9_5qvk&OT}wsgjte5{w|@DYc3;9&JJIBBIfZk!C-3M!x?LNm zc>X@y`>u^8)2=9Dit9-Atvm$X(NcH#4 zpaya^rtU{`jOzGY14bA#XxC=?N zU#?sxsaB$$EM2ZFdfcY3CdAGuZ2dK>zj8Mku`fl{KxY4ZVm!)zrROfguVoxK#Ndh3FKGs(0>e2h&}W-VW^G<^yg|QnqVjhI}A-B z?EduqYkeq*;0yH_Mgb3dg&j_2A4ZuI2IvZ-SqsCm4@X@Kr`CVZ%oqVY3+LAlhblxc zO+~=YA~^ga#2CZg5Jkv#g>l0}RYna7M=+p-wrP5RuPC=oJ{>in)jAD(T@5m-z2~(dbW-N!De!{o_~B2`7y}(V`gFCH>XjH{0{D&F|$jU zPHW14vaE7OBy9EJ32Sg31QMWQ$w(8$lg!su8l2w5ro*hFJ?P)v_<7Mw6 zA`i9D$4av2P4QF*mske;lzCh+s@0G0fE%*?z)H-DF|P2Lu#57vcbKQg7-jI9?Zn7i z^FfAzXO?31{#aP}#aq9ke5D1Y{;F^!r5{0;xV4t}_p9#jVy0xhgegH=Vz~su2^-Q0 zpY(fsoj*yVj4_pelCT7lcNls9Xa(;?Qd0h4GI2`=tS3g%`S6Wkc&*usR3@CK+5(0@*gkN!9Si*GLID)i-UvY&{955B5)_mfO5fk?JO|kq2zGNKnQw02TJYtB81e3X#9E>Njs@77Cr?W{dX&MD= z!ez{MPjFOY|HDZySD_6soIpQlV5Gg_w5581mRWHmfuRFLew$9OduGrsnxe(}E)19+=*gJzWW4_asw?)LTJY z5rM4uQ0y#3R*F6oxJCgDc|Q~9G&5-(Z5d6^%ST4!;4OxwoOmh9E9}f~-5>EwKDMp# zU<*O5I#Mz;qLwET(AVA8gtBZVh}R|(^v*MzV}q7DT>c8-wg`G~z5S?lCx~B?=l9Z) z!b*@sL4*M%zF~kbf3&*z<$0D9thz0{t1u#%g2xmR{QTll1q;QP5?m&;&|*IfI21D) zQsqWC5j$F*SI~LyqY;FElqD(m<|>fHb|zfG*0wLUt1KK7j1sAd5)h91c2?@XiZ#cW zKyY4)I-D@bP#*O*8eWpYx{tPK0Pu??e8JD2naYD^%JRp#D>b5I9HD&7sTN8JvxL56 z(WRV-0O*!bl^;BYlpY+pR_Re8x(5#AJuvRKpecxjqBnu4sgN+k09gSwtCAlhwKHu9 z<5CEsXHVTeg%)u?rYF)vMIp(rs1hp9J{WZrj11X~aAH=?D9ZhGQPyVkmx1~i)Gf?# zD@v3PWXrig>LSkV7qiN{YT~vevN#QGIsL0HsuRZ7edgAjz3d#qVHl+kb&{owc(>Iz z!i{7tm9u43BSSGG@EG*T+Q+yQ;4FE4HDH&wCJV7H5Cay4T8Q6>2X2ilD?fYX#UE@77!O>ImnO4K-m#p z7m}`**#yDFLwV8#*sSV(Ob=jziZIo^l!XUEO@gZsNSuX!SC!dGDFsUp!CiLwW$(x= zj=8d(ia=Jc9lkPd@}HFd2iMUkqs2+!G&Th#glwhO-nbo90= zG7I$a3dMyH3md6eNkEL2r~;KxSXg-#%*oPAc~3YCwWkWN;`6|4H)D7Zn zjJ;8rxT@`bRor57#WR0_{R#$siAI4?5FXMLGb=O_3ZS4u#zGW-)SR9IX`+8f0Vpm( z;#8mkLeOkh==1p$mgaPM4ahKMlIyTlJd)5)B<_3sOgI!n)!0E=rPq#h7$vOJ;jgn- zPmC^9nVe10fkF@L;41PUW*0uGOVfX=V?R;q46J}k|Yc7l#6yimp&jw_sHq@26KK78DAP5zKSBx05DYCf4^?VHUfY5^$W&b4uuB;a}QFs%{b85;dr0{ej^k+h;^Bn3QwKkC;vf=xw|?O@LJ za@O;=6RZhFh63U_0WTpdx&#;qgT9ggAulbzqNq4`Mt zesgG*CZ)s)aWR2QBaY2_5pZ13>XX}K>eM;uCJ?X*B((&3p=6abpa2+j+63UuhGW!J z`8+*-Z47`3f1+1Ksax7go=5(SV8tm8`t;CUnJx;ws9X3@KR*7I>P_A7rEnaU*jV3( z&a4wGlvTHpr5zEbFAr>AIvraU=tu2HzVa%6z9lxOw^+_^oy5Zi!BwEZB75S4IZCSO z=tSsiQ$V2OJTP^70Rsdo&MSu@eW?e~*8m7i0kdpSmgi6B!IVCnvwwt3`wFtQ6a=mu6+|=Md*b zoy+svC!bC!+}wn!Zx46%93n3r*Uk=alFmW|`cw!fP&6Zq#2d$1gv{&+$-9TK`aicC zFZs=3`Z?EP2DOK|Z-5b06>WXBk~}0xq9oB%Wc#Tzu=DA^wWVe7Ptxu+-HL*A!>^aDzR^Iz^qjPn`%2#RNRB zFCaCo(Xc_!$PaFAuvtt2^NCRQB{JTpEs+v(Uke@1)_zg5pZwn_08e#%4P=Tav-B4rSfl^m)3;VIc z7HK)4bt(IG2=i`3=mOH_g0JEHn9+_9#|&2k&v)|Ktmu<4C`PK-CW$l2wOC%O;gbBj zPnkX&Q#&X4=(qIv9j$8=^sLZrcAPk$EmUlfO3}#Z-!0^(Ta9VfhRl*@{^>(TSBJja#d=hP_X|H2p`jwY@aS7r9MZo-Fc;=^@T7v;Zt~3-;fkrqxU}Rgu21d(p5`iLKS-K$ZjKe& zvAY_$h(rHwP4WBM@8<WDo``tjs)&9zrM{sn0n)!iKJhpQ2S`ITl_zr#A?pD1L{dsQuM3z@$sP@EdYViYaklBjzk@&q#Jqy{^#}!(}CcB&&VqH&PWZ$gqFwl zeva8uiZ}ob;Ue=;7<(qvph;s27=uO09BSAGvxbvqXXQKOS!tqGF-fU}o1cy*zCo0B zC3I=d&M@_&e`ROtp;!_a7rSl(=-(Q9VmTQ zd|LE~%JKV#+NnaK%D_H1Ml@*ZBYcY~G{XTh<60M`6A5n!zcb{NBep9`xgEim4qL+NXuPNhw3IbA?-q?#+X4N1{er)8yGY@fI6lc8?xRh_3$v z&&91f#qtp2xcPEcYpxR63f{Pk?-V66qayRQYAKy}Ey${psELeo!_cQ=gyaZqh8rg- z+JAv3LvYRTX`$zWpjvoy?P50&%{DbAgV;&^2jq^uL@``aeHqSO#`_f+^^+3ITf)rm zdgB9q?^N=vk@@v4y!$SSpYUdNdWQCX{$%e8-#-%9e5Lq{>f4r=o1%?`iG2e>407i@ zeCzWJ%V^h3znx_Nc=@8j}(tAu7?! zLi!~N2XxGu29AP0Ra0`{`&P@NE11*9zCjT>$|c#lGbp#j5jsXMpV@`DVMy{$_s>pO5gqPVr8Pt3CTO+sQfj zTK?|@fF2|&UMRF8V$R%a^3AF4I8XG}jWqkwe*O(=uw*ioRKo6xkUYC(MP&4+3qfgA z0`F?aL@-OiyC^Z=?FS{8V}-{=a&^mtS5yM#+5JMa-_%2K@eh*WHs{mZ18WWoGy<85L!1Skn; zu$Wqg1Ya+@5)fguyV44NJLZ%!Z3_KAVPS2|e0Kuhj4K>V>IyBPoo@LR0 zal*9a_CEmar7#$!%q6EdDe1{T)VT%Oi(9%oTLW} zw8UC?xqE>`>D2Oar0icsc7M%JH)b8<8HKdaMZM@x96PM=H+Iw+pfOq?zUZ_xfFzTO z$U5tF&=e4~f;Z_lmWlc}&&a$s3|A=*hOiCsZQ3bSwz*R&xXqwdcc-wqmgG<-qNy2T zhZ?F_pwn+l;XD!nK#u#gL?&^Yh0+7Rt+fl}gO%=s#+Ax>Gnfp)RPxbNsr(epjA%JE z2_+Y}n%`}b9KGmVCb~(I$gI(9bwi~jT2lk<3lOXSOk(VUm}Uij}eGs8&3XQGtY(z}#ws42GaL zj?g69p{j|#DR*?OHy!LzMKb&PMCF&bxh?{|Y6k2Ox{<{gg)nOa=R+>42%{dQIFb*E z#`c#eyV36OHev3M?mm2C@S{#sZY^E!3h&5oz5{ObXj*NCJ<-xj> z3qV4uv%avF!%Zb`)SIG_3{?(6sK@|77POKfV5j$d*363_Ko`p#wTW$z$(?! z|C>UaG&U=#HWa~a^YO_c7I#(yWHMA?k=I^3NYTM_kp_zrTh)TN{PP4qks;IleV~eJ zVDsTB0ZF17wuE4v{iS6g5g)W(i6elNR^Qo)lLjnehk1RZOL5@I<1Na{Qq(Mgn!cQ( z!?Xa2#j{V23A_`1nT2MRnW1On0UKYS5AAa*{cEz6zO@DP{2x1Ev6|lukf?Y$>I21G zv^XM{=-9x;iZ1rr$^@UsNQt|V;@SUMY{<2mMa9p6-gUJuH%ak*499gnPV*@m8YE zE@@lrBiVkYsS~)EoJZV@j79-TmCZ`;a-0Hpmr_v*^`nay4(auF%;1mT`Glf=Cdo_< zT5~c9HP?}ZdB+*Aou_YA|K$G7J5OxxSQ0YDS*pui)O0DGdR1^=E4P^=%S1o=1CxXq zPXZ>i7})*h;J4u>B7aRsAr#NH8x&0=6E)fan=oVJ`O<270bOT4jg^X`^Yf*ujqxVM z=R`YTv4Ff(>o_@_QNh{actA?8Wg%0%gv-Ypt*(2YH}BnZUx)njUhTV!7(Cr`>iJ#% z49Du}kS6W=#td)P67?f)9+U1vnIpiuj4zTF=Lzr9J>oDVPH!PnN6QK0tLYs$1kX7{>7BuY%m8M zEW!sCMXOMuAR;x84rVqF-(V53OmBENA3#mxEr!8k1K=Bn!w-s~Y6Qv?*OIJIJl z6`@Bi8hEMuP?-TJMUsxJ@O2{iIt(mb3;fwiNi@VFTir%MVDq#- z1eS0)on_h!Im)FF&crHM;?@&Njiud&`c?_x187g56&-q#g~tu+YlRxll&6cdlaq?SoX$^9wFq)-*x zCSvlbV~=L+_)!Gj%SY5#E6&4IY+qXS*cWF!>dexguH3t4)T^yMRPRO`F-AG;0Qm$V ztIJ8U?#64}%g)VVQNEIw{M_s8DVNt(>%IcSi3QrX!1Xi+CXU7=H^So?A@2?p-bcXo z|8`{FRV12=OV#kTC-5TYBqDc7I?=$9iPG1haHc(}N@g%BF!3e-Y>Qy~mN$x!Ua2U9 zbySX`tv>P9eG<6%@X;8EiRxIoq5Sb>{i0hN4zCj50S)Fu+HjiZ9zTr^vb1-M4k=?y zt3^yoeo*e*?Elr<6~xMm?p*It%YVs34<90g_I?ZmpnI+;-?)$cXl6YFV8pX@Uu}%r zMGB?=ctamcGG!Pi)S|HaT~bS?U2hKrJ|4OPmgRfU(J6#7X~Y^*M=)~H@Li#WHT5p8 z#nOT&wywrISm9<~?d>f>Z;7Iwr3HFbShdzP?wFMy+WKScfvYrebXAg0#&ree^Mr|v zmLGs<@ENA>b{s$P zL`5jGVHWG7iziXHCCv)OM@;gSGZV9ghT|>O*{A>iWT@}|M~3?Ip$6Ja3}~R>_G_m$ z(@r?W^&U*Olgt8m#9_UmOy`2b1zB0OSPnYLJKf1Uzo}zzj zXo-F}ymaghPj@fN0%K@@O!4`=?m@A3`E?(_hoV zo8r3-(R(Fu+3nh^pRBsy2X*|5m^3(^6!KE%!%*&gY6~q}`&l={kGY=RE@&Q4T+OpW z`<+7=GvUPx4N)cAWP&$8ptc2rL9fCm6+)>!(Kygc>3TQM9UC8;o6ik7XpCAYA)%}+ zahM}8t-M%DW#Eb*H%6TClma(st-Sn}EBnldkSC5fy_t@*Wjov$AW_YDNHit3#h}bx zD!3I3-Xe)N{+Poh*3%4JYo6?CCZ~a|z}N|Axe?j=BvXFdu|wOVbS0zxEv!at#L8O( zn8u_c#kpK>~H-Qz?R zQzRH)ci?BeXUsNUhin*h{xcb?`c6btx(mQc0GZ>;DrOIugSz49_0=DKbz!+;?=1>t z&Bg6Ou(D{0Sh|nV9sl48jm95oL|bTpBAWMzhO_)i_r|rkkXiN#o%$ti;2D?7wGNLkTZX#ISQ>d8^<+lzv-P1`1EbuoEgypcjaWOdA z!5W&chcphOLd}qqz!ppDrE&S@M2F;Ahgg^S&w?*namzY@S){`Hqkgte995(!mXe>j z{cXHQ=$_IE_MU~r;hFFooMRn!uxK>rzl2TF+%ljBsDB?WZkqa_bxdl(6Y64?IDKrE z6-V2JA7Y>&<_b}Z1RtN1;2MHGp+^VyR^~VHsIj!Bu5rW}C(d$IqWmWV3P%-0_3)`C z;1t$-t{TN06eZaH+vY>u=YwZi3zw|ZilseLG#mI@R&h0iUeCt=3Egl#Z-2kcKkJm% z+=ei~CR7(n;}6le&x`3!(ulP|Xxb86VWsztDT7;qA33$cQBHWBTG{o+eoLIdi?S+- zPJb5JB!6w}Oia-VDZ_gD$ZG4LL{WKOb=JuQ{o2a6b?Hf41_`~13m%e#vIsNy#x#CcK97hl1?}MQnU?+b$38EF+Ki|(e z3u7})!5Xf~t(yo%=UfoIez#ieI+g*j5cW+1uhnQz71bmV||tgSOV6i4)F; zP6ivSt+1Tu3?N1)U^Nv7Q3FVCg`;dVX+ecRyt`R*mUGs@YJXfQ{RT`%$PfBI@`VR}J?4eG^uolbmVG*PkGU}KZydPeVx zKQKGfa08~OeWt~|$V%hqk6OqxOGk0)QnM{KNDi6EO;8-VLUDe5Xm+%8@$H5c9v$Z@ zSO~)cjSe`n-V@LSI&C7STOnWrYzN{un*su(1A_^q82@;3?c#0~Lg2hiQx zi=n6hvz;*t4^yh`UcY-cp=UqJ>4ejH_^Lqw%wmJ@OCsdzNVIwo5pqjf=}xw zUf;40V&8~k`FTJQBBS`sgg?B5&#b32$T_b0vQq(=9ts(r6#U;sR)2_fW|NjO2LVD{}W>09NH!?GF{hunqt zqkA^Lw-ze7@Vh&$B&$yYKOy(2obo9owq9?)Ib}V2%>vPdj`Gg^79cUQCCQ9tj_Z|zqbY9}4!neq zBnlo6a_;_`rxp_rejVg~8gIwU-#!c|gi>yd$FS|*?#rA;5FAD@ zPFIAh86?;@4~?qkY>m>zOo6b`e=PkDT58*%?jgtlaD9U%@Ev`CB=^1e+!5?|UYMVO zo%O&?Ktvx`)eH?%2Ymhy3%VNL0N*2Bbuz9^ks1L7FXE1CGbb7n0qJ_nL$B*`% ze2e=}zF!>2d-$la^~w}=NMc<5A(%%ZelVAROJS^U3>Hy-xX8S-pb zP2WR`VH}$W1q&?jErx|r{yAcfXwl_KNz;grL4j?hdw21I zUz%}CF5R_o;DjKcPm{;kG>mliCb0K-bPQ17il&!39{Tywj^&mEZBE21?=e^uzM(Tx8lVx`Lb-mcK2qGb^3$*FS1X~+>PXt2n+xF1U+@`=XBrLR+v4y3FF z74uRVB^k0(Hrs_53cS_uB7I1)boA1E9?wgn5o6tziowtRj3qb2t5EF-S8Mx{RElWq z7&=L2ri$DiaC#B?ydQ=1M@L~t#Vm(2d+92IjwQCTp2rJ^@NSu0sgmgOgYqVy@(aC= zi$|6wJ?{!TSzPy?Wib`HK%&a|0ba8vz1tc6hGoM*7n%48`qP?4*EP#_L-N2{%OKaw z*2( z8OK3i)(JX6-)?Cl&To{~yhT5s#EC`DstSu1E|dj3jol0(P9eNhV_YIvMJjDL7%we_ zkZ}Dt^w)%Y0W%9|UExGmRAZEz#f1$J4PpDx%~qLpQz+5s_#=WrtiZA>tfc4Hip5hk zo3v(3Tb-<4AW6dpV04zFg@jz>w@iv^X7dC*T#Q$CX_%FNuOaQ)V|}Sb80V|s?iSl& z+$i~Nc{(wBDjT`FT8cicCD!+_D6<9g1?tOcL1{(QkbsJJt{FV~GCT{vTlgoZGwg$F z`J1JYrW{PK#Seq*&tMiNL%UU^AMGz+F?{eDd##8<>&tENb9EZ&w}~gx;E?sK*u9eI zve{tUMgPb^a%R^@LJY47-3m%XNI@^QIDs$USC@VX#Qlge^dX_e{{F(em0#nZ6$DLx zNuuntP%JGHgNh;CysWbuwH=ddKVa`SjvP}s-s=zw-j%&V{QP>|nt&lDjC_JK_MWu` zf%{SgyBq%D#ra7Ypyu9}=hci*P0a9^0IeFC6RzQ|ZxM2|nP2E}dk8PwsB4Q&k=8PB z=p?L_#aYua3B##db(++ObXMkt{l>U}Gw(NR_7Xx*@Lpwx;Timlm+zCVi0!+je0OD* zJfNLoC=(f!S!--qHI`!7hwa(fv@gO991r{1$dz-xi01nz{tc&fk~$MLF^^&~fK!th zz?vsD@CSbj8-6B?Z?Cg$tF zto#%T$viYN?X_uU=cbqhaC8(}F#|1OhUtlK>q`}a8jwJ%}@NVl6sI|z9H4>uC<;6-mt`O`)?H>U|52=@$BRUFr zhIl$1g);T8Zl}e3AZf8uwAEPE)kYEJl+pT{bc-|!+P`Yn>u85+OVAbFLh|(NaK@Sn z)8X=A4stQh8L%H)aM@|ck1XP#hO6ONmnf~!08!+|5C7_QfqMoSU9@Vq7>d>$0s8vv zI#kn%q|*AsP{5IogN#GHlq(7LvMX)t(7zkKo{rJ<7u&K0ADrITQ`E}IPc1o(?MpBX zy;2)%BknixWwthhe_y6~O0<>^Lf=8EEQ{Ylqmb60R&`ICXohw>448_f?Bmc%1|+!3 zh{oxK{mpJ8=DqYnq2AwWiXA}Q{Ug5t*Bz9ur3(NSDD=*1x6VV3*cR*9Wv*u9y8KSZ z@X%&FiNg=!@D={GY0Vfk?jx#COT8>1E%Gb52gyma(^USjbXjT&e#PHZ1mjfvz2H<> zB^XZS&biz2mH`sm4horYj%L3 zxq1vY&alqCGlnA&3=rcgnq@}po`nQwU@Tmlsfahk)88=+cpcqO+LC@ zn!mJ4KHe*11H&Jdfw=j!V4quGy3@3PUG^b=83uxQbf% ztBA7eh{0e!u8yIMu+UMr-~UKcPL2StB6!Vl*P>KMs#S_DC?dn~B11rbMy{cMJHO0N z&$j%;dVnm=trvL^k(Jh!v7G4cC*QSEkT#nWgu&W+=hrFfvr&~8vQgOj<#RKTSe&iT zEQ2C@o%G|hu88_o&J$+2dC5aD@rgZDlw@hgd(p_I&NlF!osNu|f05!z%XDwgS-_N6 zwq(_#LM(X!8cOHl<-lKLu*EG4#n23C(n_ni{+Pd<#}8@$W7c@^-g2N!0qp9^lw(SNJnn<}z_l_Nb61Z~he7_~w^|DV+o!G|vS-Q=~%;RNE4_u?Q?8 z_rhN7=A>f0m`5QX-$_xk7&0Ilh-Kf{BRrUB>pHNZm2C$fDg{|uwQaMqA0q0_P!=d* z9iX+_=xMSN+{}17JuveK5jS_Kt#=&4ghsK*R0>~-cjqIOqbia|sW3B!HPNAkSE)cl z#(^Y)CZya7(10SeqSr-4<27`6bZZXPo$2{J4>p0%W~z!U&{QZ|Qg4)EgejFTqgoaf zouhqtYR9FJLYB)Zt{{%b8z7gKO86pXk>F)Y`adYUuV}dbfZgL`7{(|WMDM-#5b*GEbGO&N*n7|K`+T&}?xU3J zTd7xt;l%S1Z4Ma@n>hP(3~Hg+YvUFw?hJF5*jE4YuC60@Fg2FbqPd?>Do+e+I&Gn! zTCCeJ{K_7f=8%IdZDH>*JOOqTtU@@L3ek@!8ecMyNYZIV(Bo{h?~5;GGB))$$D5urR{hMGfC?I5}>2~ zpvGjjPS2k5BNLP)af?|*f~4m2QKvU6k>F#JDZo#O1SsrgiIc_%RIGN~Wk&oMZa$-CMB z0!!>IEW(t=Jw;8I6pNg38R9(UEenc6h-Tepm?N5PlwelXJ4!t3`HHQKwtFSCDJ(YW zpy=)cJUKYeEv9iOvV>o$(28!GEygAhe}(6krAdX^Nh^B_n>GGODWz{$l-3q;@@q|c zN^C~mg3T*cBJfz=mbn3T2M+Znq26%JRq%#jZz1#&(5)Y--EP4qR4l>1>GR zaWj2O;TZaCUmDfXo$byk-}%Edwe(&F%h}eXBbX%`r%AS5nU?Huru$(VOW~{|gN>7g zVZBKM?rH-cJDq$5tyV>o8hf*-eY4DQvrh~oRk~8Kl`hHaF4!W6ozDpJ5*9Um3LJs{Z|$$WKIND&zzLgw$RZ&jnk9#*)Kk)9j&t+Q70L-qg|P! zJ-Z{P>rON8f|HTz69eNSQJpC|<9J{o$HKJ65x&EuG}eh+@r$O?NzroScG`YU`)+qL zHwm=?nMwJa!xTx7QU(it=m)bW>%VjMy27hyOxd@Xm0ef+6P`a#ywn~fYz}WWkCWw) zhHGO)jzt+qwOdr8XY8lVRvw`op(&MPRP5W{bDg8N;01D? z8|7yW$_qx|_iYsR3uuH5iKGLkTG`E^-Hedt3XkQL*Sbi|VAfDc?=-8)ykj(1cH$Fj z{`0`!6>NFh7=7?=X>gnaXoqo9j;W^exG*~dv&(l8H8MyFoYd^?UyrG zdE##SxY365BI@48u-f&u#=-i#!wcKZegX; z^#!Kr+N{8A?olvOtn1*hv*-Oq=Qj4UQpnPRY?S0&nK5ivFQ*8H^^RIIq!*l#hd&59 z^uDE(rSd975K}6{718Z-w4Zmf6C&%8O$$C$O~k9&y47CGvS26C_vJJ<3=T5=`fpF_ zhM4|p)s4}uRMso;l21yn1;|L1%D9v4_}_&p)KPth<)RN-xJ3_L&JFZ*XpXfc+n z=fFMnCNlVPOzD{8X7=3&$EI2F^VY0*%}kYAMN@v+WteICcUEgwuf69X${Y-mpq@E9 zwql0<)oTqlYp|T!`!Uximb-GA{`4}_K(BksAIJ!X+%2z}TZYcV2?LXFG1X{= zy)<<9De~qKspp-L;uE$Y%6Q^mE}U1%NBM*gfAJH1S&wzY&j|nF?SYxHxsU2AI5o<1 zAkN;G1J0DX64w*f&OUdm_Uca;wTzDmsr3kF zufO*N--uT$@oLB(+w&zT_s&0M*Y5q*UQNP%FM3~hs8y!7HgFQw6YB2BhuyEdU=v0t z+lCOi*m`I8gqDYBJ+$y9RkktXL$t(&GQUvDL)`w(MOs!nI@D9FFUt!(41Z+j5YNMU zEtpF&&lAeYFcpb}2$OJbP4WT$VV)oY%j_*3KVx;Qc!1xEkW@#xfxS1!o?UOREqJ8O z^tPT%p#c1F>YbQMA=I%|o~HgX+9}E$cNg3*vRoJAc`{0QllGnJHlCeQJDlXtZi@_A zg5?{xMH;{68o72bEG(*sfmv~+UbsFXZM1S$zRzhP~NtQ_HaeM4 zf|uK4Nq8L@*{IHrsD!o4Wm?TGUx3cLFUWHa# z<6!D9kj*!EAgT&#N`$F~d$4eY7eLH!RqrKWl57GG>}T z5$Pj$aaAj#V$f|{gmZ*a;vO5#KKAk%7EsQ%YO8Vz(6dd95;e4*^u0s0Ew}D+NxKf*r@1vwEXoEI~A+M4@j|XtA*}%?8?E7IlK>Dd_ulTQeMM7oh37jsBO& z3CC*3EKAJg9$!eLb_W_i*mW1kQUDmO<;ep{K;@wA0DUfhcyFaLd(}utu5w)b(4lY% zky2xl@4-OUzcB~N)I2EYll-5GLp6-19IV77xpK0#s3^BNoVEcTNshSJe@Ukrn{Q~) z@ehF5zkZAke?;*xdLBmdN=qX@%Ci&HIcLd~g9Z}7W{WAZ=Xq7W88u|BiSO67KKTKft4qTQzPSaNPz7to;*$m2hCLevQcgXHA?aMxw^d z*ok`M(SpI{6!I!-i^{ckJpVuYKW(6aTV`SBQ_ zL#k5cyxPEX$EcfcG1df@LQFP2rt7}^LT{*<j9ntQybG#FkPv)z9)=a-kB&R?wgKBpj51Z2x|gKNEJvf%Ub5!#58b z<`KRZFU>o?+pWG&QW4R-y?Aw3fR7@=Lly6=LlluO>_9Oej=7ZFc8f205AzF+3oJ{f zSW5o>$C`QwQ&o@eZTMHE4>TdEx-kp@YH1L;6rN@risn>`uPwhKz?|O=i(1Fy8{Gax z0g4kI_bnw(e;E2n*jryQ#>Xo8gS zfgoR80h6UJ6zc+0XA=av0FAe0t6Oq||KN2Vc%vd|Z77_cDipdT=_+ zBjQktdfn#EQ6B$D;@&6`p@*Px0^xE(9GYfgO>; z`#e8|Fy&Yw1po2U{`=xWy#>nA@RgZ@enwuP2RuA4{U^P@;@$7bq_l;~K%Q@sB8uC* z&b`F)Md#v=_M^fnU0{cOJ-{E#^7tD(eMT}fA$>5AIU>m5J`Ac{3&8M%D)k_`y@(R@ zS^bM6`Fk_b@Vsw@3Z&VfG=DOOSR97I9-~vZUPp;lx;X>iVVa^j-;NM<@jO;&YQQ)6 zMpIRL%UN=;$PGQHTts|$D58ul7A}O?@ps-GDH`;wS$;@vV~sVpt?J&3nq&d@dR3pz zD`9*kYO$-u{+g$_#7iNcYjy7uE)*XWXVcCK-PI@>KM3(paV|@X2avl4npP1JA*fes zwFv}ow5r+u)?+0CKnCwAP}3=qn57c;bu88}2ns@Sw3@awvrnVumu=L&6@oyo$i3a( z|EL1fT(e@H2n(y>U8d2xl70~p8P(f(V0^sXLp3;{5;fm)QXx0+V=kjuEpuc%VF`?C zIT2{kV@5*BbdKJheWa4zvQ+bwm7iIK8MUcM2!?W^?ev^ zohgl8%e9}e_zfdkGLG^14EVz`v#7CZK>_ha2K7K*M3`8?(S1{2N@Kr&gQQ(dT}6(= zm+G8G^4eQGj`p@rgEBN`U1S{00n6jtL4&z{`>sgA*sFLyo5nx#Rq^EBKc|``u@F1D zMToHuk4&|vp9s)aeHW6v8!aGjLpbw&xNFy9;gVSA<9x%NRfPWSi;fYPzC1juHta1M zc4($^(Q#pkeft)cB6hz=-7-|0y}K(Dt*(tsy^!~thWA@`>_(k>s)eSJ%+^FH#JGM| z9{>^mx23B!CLF8u(Z2SEt_PZGn2gd5=IH*!9~xKT-Ne**d-UngZ8KS>Gie8`*1U>T ztoi7^A57beYLM9{70&4`t$w8+m>zABHn1HDfc=&+WH2kia+rzedX5rj^&uqo?LRvP ztO8`Z?D6(>pfBajAVi%3~&>tZLSh}iExzj3Z*iS{}IpLHxg`U!&fJ{d~P!uZK zJYc{mNaKY;99qdz1zP^7j|dczHJYiShzT&#oNF=NA6|~IVI&6^i8rT<4i&640eKrL zheOP>xuZFgX<@bM}^Jrwcm;YH1zph_ALMjZ$(zO7jbf**&rA`UH_f|M*l zo@r5l|74~H`b*e|uLJau1DdjmYrr$!(#fYa&a1767v9+~y4pE@)Y}IIlZ{QmDZYWA zU_wJ8#*Y3ELsQ7{T**uB-*OXFw1Ag702LlIO1B>%4J;1ns%>v5=EomJh7k4%d|poI zJ(6M!ln(&WOctAtl6LV0h>NjU5s8=ghfnodR$2x~!DkVfBU8Pk*yBI`Bqb>Sd{qbQ z<%$0w0qyl~(H~%$kmVBCQB&c-m(f52)}cM8m#F!GNCfYbAt3!LG_!UFVER+!^m`Rx z5`jJGy$WT*nZ$|z&Yq2CP>U(?$R}SvKt+%J!6*tn+6G@0p(peWhzAz)#(TNyykokQ zt`Epm?SBq#&mx9~RYtHgJCsQ^xkG+xfZ>v|v`r3oVKJ4|Kx$)cyuS^db&gICft8UZMZ3@_Ms%R*K{iCG>XKC?5F7x+4|IZ#hleR z@ses+N>z73)tuk_BEgwJcCQn8;tFFBz~6{pgzA^JoBkVOIkd~I&FroS#dVc-A}keX ziNt`q<5IkMQR-Ma$6wyjmkZ*))hLg(wpP$F%$|{trQtk9*xBn@wR8X2orUYRzq9AO zKEY*wn)3U*l{$)O2$8SxGF-T1Qflb<@Ko_So5=Ym+14mNE+;q+YvVhT9J`7gabgFp z6PfLkS`B~>X*_-tpuoo8Ln5Q<+q3&V|bcKjQg$ZdpHN$GXx|oi#tg398-IueRQJ`N+$G&VO9C0g_rl zt3wOc005`Jvi?x5fAgU}o0!lGH0cX)-4415;7`_Wsr?vr-D(~eNbnRo$Aw?J`V&R! zOrWq|tvg4C3Ok?&=g0?^CGjqB6W5yKYH#g;%xa0<_?U6M))ZM}ggs8mfdz@aVD}) zLsM3R!u)<>tZ!mSLkPK{Wd7eFxtk!Ghp>r@+InN^Usv`Uw+Ms1KKZ0%`y~fOct#XK zb=-Dx6)duIitU)G|gY~F_aR%Xl=X!5|MwN9K}a?EQh7~^gYB`%lzqrxW)+ctm5!x48TDn<18xE zqj7T4RB{>bShWfWwS^?~K`;OsaTu5-j=^7w7L;NtC@kA64N}5|@T|B*^&*r>l@{N* zj18({#*wTh3~ZLLpx-c&z+JR}T?R!qQO7!$W<$}G+QIrX_1eR7phx%cIzyVzU@<}( z>kEs#pj2W~LwN%Fy)lr#=03cmXo-b8*S!fC zap|41>vi(Xn6xgZ5HhlK=&HbwMTSZ z$44YaTw8oWW=!*m!dSI`3UEta`f|zuUL?0!QI?#=!nP|FY5@st1iVIbsaqi;9$h~zPUxp{nM&ki4j%?0MGgm-{VnPhnR7WH zqR~%FRdPkGm_iPkoo~jDKiYUteDpWD3}Yt)HDnU)Xs8-T>_-Bg=P>fao?Zm#U`|}u zp{=YcNS?t%_3H|GhZ2$deuYD#_9#CpSY92McyL&ME}n~{wf$kG|Ll8m-V``5go-(} z0J%h7739>9a;C3dKw(jWBTU4hFoWV4%ws z6?nfU`F&+p7t8an>reI9EdD{f_H@}x$(;9xMN1n8*Tr&l9oWtDyERc`HnhLaD6tr?kY~b_r7LZP!wEqdh1K|YM z0;<5+m$-dBgJ2jEg&MOD80sI-(%Q#OS@&I*jV~p{p@69FlIpEczI0G+Asy6Q0smcV z9Lv-c9eM-YG2v|m)?kfJE!zkbr-jXuH26y&ia#1ExG~5kpY7fFs8&HwZ^X+TmP0WG z{kWhvvHr1i)Er7rvS$6U?yQ3ita*e%kNs-LsSDA*<&C*Nq4f~l6hh!Tq+A2bc~C*5#)n6!;v zd{6CVpce8YlYDD4;=>Ko>tnO$`FK*q3MYeGi*|{8*>@=D;fJ5sbTE-=n@ThVI-oKQ zix)@cZA@7KK#L><9nCfFy}(6o6NePdpV__~2ejzubSt7YU_;Y@CDuwO{3Q;4fYE~s zz1JZoDS!Q&cr}O!jwP5m?p`Iz>B?nXbEw0Dt>g0-Mcu@p6qPVuH9}Q<+X8d!Z=)me zv^Lx*8f9?FN3AUX02g}Ao&ssBVi5nNU8?3|j`Tp@ERey9=G|;0nt$9}TxA2DGKrKv zR|1+C*$xlh1Q<(|^?kULJ3Zc}cI&`fyrxiD;Pzi5Suy>EsPQJcH=nQ>0~vod6pz!3>TVMA3g2 z^c8xlno4^p3)YD>@W1px0}rSwxp4yht4#5_sFu#OX6=*i^er;wwdVGp9l4AUayZ}WZ=&k80wqF zD%ki%5cl{3CVT4usgMiq=cQDJldC}*E_#?8-(t{38vVyA_)8WCQ(E?39<3?mphF}` ziU{vOHR>OC*Hz}g>SX;;V^W_~!sZss03Rj<9tfDx&JBn)N+e^Wvkhfpb` zajS?k3V)(CKD&S?PwnZ}^NhJxHw4;?FV}hB=Q>z5NR0#cfQw%mBZa^rg>f)R`nCy0 zjX+>rzf9AN7Vv9zgH+$RS#Z(dPYg<%!UhgaG3DNVqVNj@meiP3hu%!-#C5ntCkXOQ z6q9F#KXVJr#l`q<=X4Hk090lT)n!edaAkkbPlk_NQ1m%pIv8Y?z#sACm@g z-W7MovaE_O4_Y0h;=k3O%4KqkPJDC{%DwM#rm7DCIogIsG0rmM7RFi?>mYp$MEeXS zSqimJ=V|FPX;oNyUaD~HU8^<>{ne@Mt9n$&Qpcg@v&)bH6F|( zy}ejcff&SIVD&VFDAVuei3gUCI#Nx8GQnui!dg#SQk&auZy6bTHr0EW6EyGd--z-1G`+aW(uuCYg z4o_A4v%)whR9J$0hYup(24KGP7be7>K?}Y91jIKHmMM!nWR>zx@_8p#^wDuQYoerZbIcU?RKQh9f>fpX&Rk=g$~qc7^SjspNUo`GiY_I#^^IqR#mxrd zv;1&L1Q4XrsYQ;3?_SFQkcL!=XLhV3ydRXV@ew#^PWgtGfb+ zVztU*H46N0o}+DHtS7J4mMOFC>wjR4^~Bq#Ekfx?j6`WBEUbv6=NJE4QF|o$#~y=K z_{E1sG<{%uX-5fAs+_e9BixOtiv?5~MABN2X=8_hjZM`68RnB6%VJ-?S2Y{P-k-Ng_Ykiy80>h0*uDI+8>|B{x!(pLLOm znM!0Nql}TtY8DkzsAza;-yF$44Ah`WO6UkF3!^xx^FS#Sw4l{e2;|jG{Ygh(SsK5$n=Wu9d`O!b#=@NtW5elf76}Btd0}XVYlXH$z!!aFQ$~Lym~7NMGLAIjN{KeP43F z;zMO47e7yV9xsdo0FPuDr>_stdGSAM%+6pnegGFBk?C4tXgEA}X#b(g-%IQ+XqR^2aDmPb`}yOxG@G%|+pa2FOUb_hy!)Uv{{zF^T~?T#25sFqf= zYrfHnA;aP>ma6>PqW4!?b4DQg4IFtb!b5`njY@SYyHgRen%G1zQQF@i(J|AdBG4%+ zlF7l>uRwh@QY&cR%$7CywL(s$P^F}>#Z#>LdTC_t;b5VHR%zM+D zc{4#71j#(RS!9*}d$)iO`o%fca)EzD!8-{HCeMFHP|}!H&7%Q;fQyA;EHVT*(9Uw6 z=1#{rhzY4$bNkGgDR^R{yH23-wN zU2hp?YyK#bMLo|pe*_J?Vr5FtJ+_jEwuY#ZjTQhZvKg0mY2?@PicYY?vrN-VPU9Bo zqDxgFz zc~lknwPe<7rSnr%;RHomRf_Eev`dh=IXyb33H)If-bS!GxC>_h>#ss_E9NK|>ZSge zgFmofsBMO-v0xA&;MVc1Lqsas!AkB2Pp;cC}&vzmZfoFoY4q;Wi+3pm?rwOCXRUkN2w*L zv;yWwv&taA`hpIn=iO3 z3vXUPZj-2_;TQhUpjN$&>@@H^_%WKZ5)HO`U4kI3RWJh&WN%S&;kOyR|E3CA*#(mr z!-*x}6LG|$X`zaF=o!55<6T&>O;rqFo2A+88;v|D6z2&iF>3}+=)0V<8GKg==9*u* z8r(#(vSK>7Z40F!blNJXTw*}+(@`|P&MxAl7q@B%;_vhM+TYJ5UjScum>>S8=nKce zzr{o!f@`(1T5f`gjloDpi>Ng0QMsaI8nGAEJ6LMK{)wuZfUHVTcoQe&4;K2%7?Ra! z&LHR(kY`KHx17y*j*QB}F>x0wrJLxGNnaA8V@06zlo_J%f?sm0G&#jkKBsWXl>CX- z@@b>iaY#7@M|<5!aXud74F1w_>&r7*zX!{W*HgOM1s>?zJeitBt*`82|Fbc8fr-Xm7*IKBWVNiT+xGDO?$XO!c$m;OLs^ib7y!HJcp8WJ(YTCF<=trmOiEw&!nPacly!F3LdbhyF>$@YF1!lwkSYN;%>QhpgU+wZNF zOto3mizzuBgyQ9g%4vk=SnY%;IGCe^XX&CLm+cEnd`@(C-X$fqSWNY0{D=+OAL@kO# zHqJ|MPJWwj#X0?MR`s=V&bd1Kqb4&h@3hOCzL?@nSeF~3d;YJvd!5LjKGfid-q{s6 z9UZrk#(OGf_VJ(4#qVnP-R-%{%I^E=lNIcXrD9mMFShskvIB}sx+Wb3*T=Z6bnWR2 zS9&A%!*fjHR}01o8-%#bMUJcTAKCXPBA~{)TP`~BF2psefcWdB2hs(dakvmGmV_g;0x&QEnv)EnXr^(sc@UgnW|D*4v?;gSfbTvlrpd z0OnGy`^2(CizlT#nY-HpnXMHrN9u8uhG7f1dZlM2>f>z`&mFSxS-=#AzuLsKv~W}Q za0*bDK?8fn)YfSkPF>G;uOE$0QVTe%`rAEMws&P=(LGH3%s(9`M`M@P`^@p zmG&7c$!%yzJ0chfhVX#7TJKyjuk*fx-+aFx0k$YQ<5oAq9q7F9C%3i2ZX=|;THv49 zh%$;xts+|kOZQm=YrbTve~meymV66F zwvYhvI8XIBDcnKFySR({D?Lef4oHHHx68d}+()mTSn4@aiXFA^FuQLt{(t-WUUV>5 ze30~-5`)b6VZBs5AAS8^i}mYxEVX+oPW{*XjNs_&cTvc$?^ryt&!lsX$5fseSEa|& z%V34Oni_Z?Mtt#Wh&!s|Qdq9|+vSZ#)2bh)LGZgDFKUW49zlH{qv0NDbvH%+6>Z<| z_+l?_YP=7L)70gY>b^VXhX2vI=;V~TK|;%-0U6RLU=RqMXp!$Dfpp-l1EY#(4ebE1 z2%jljK_lWh|9s_o@;~_}$XD;*+k{_=fk@eUhiBh&JdMwKrqcE|(_|c&%E@qvz+yBF z#fgbVP(JWG12)D(V;aCBI06-A5%vDucCu368Xc!Sc{8=f?0W*I{Vm6GBXw7S%3{)H zQVhB?Q+ctD!~3?+f7UJjUOGM>Qp6zOa`-R*1b)GIuRLP!d!Dl=P z=jF9Y#zFb9gDE6%G>iDqpk}JiaTty{GF+|KCRGswc0A|eiAdaz(#E!GR)Bb(!fzl6 zj&qqeA7(f~Z)%(#MLn{>fZsc$B4T%Qx($BBjt$;@wOh~mC$*&i>*yI+w}A;+Awa;p`7A}4O~bN4U`Yy{FQ=FGb`9PRr@=*(Dy!~(IV^GC1DDAe zXhGJLLb}ml;n1o!mWnE-+x%P_U$%ov&bmX>R06JHM7ib7=ZcD6h`n~aN&Kv3Zh6RI zT>6*MqiMxdFHw#R+U#rUrX@Ra0)WXaLMx|-kI^xYj#K%#%F3$E=}mMO(_w2tJk|{7 z_SFri22Og)R`cV7K~<#7WaMFGav+&~(Pq1X*=L%|dor&ebYOA6~Gr6DatUKHQE7#~o3|c#k4o zx|lAora)|8(_{VtyJ;BvJ66MYtjX|AqHM;OsqZN`Z)UC7Gl?zh@p`cwJq+Qe(?34h zPwuFN*)1=Op^bUP2B-d>_$@V}81u;qLt)VfRKoaF3EI6sM9P|;S@ z43p2Xb6FG`DJ{>T-Q*-n$;zX#D^#^6PHCa85xL5KyGz3F#zFXM@AYPGm>v@}M2n35 zB+@WswJ^-pSQ>hjw0egmwLIT{q8CguK^fKbKbb4=rHWs4#a@i_xK^hp{i*OzX&U{j z`z|5w>ezfOQ^xDyb8o6j17J!?Z`SPo7xMe@b@9MHcvL<;7>cRop#$j0+xdjwVIpIU zfzNv46vDsScY?2tz_Z#xBVrhKV@Zwo(krr{_BM+E#xW&-QSq@ENmni?mHG8D&xKAi zZ`<1j?+6d=6J8tbTgi9bX{&iMew(A_Pbl@k3#{jzQH_12MzOLkEP)<8Od^+(H$R`j z2byr&OX0pZIwAp#H7?tf^sF>*JSsKO8_eXDT6)qO`y=U=qQJJUvHC3ew9VjMDP0si zfR}7?=F5@fo<$jCEE=Cc6^&fH)lxjaaHY94h#FSKni%COO*;s2PIFCog*JKFmYH(TM0L;2H#U zle5EC*dnx?4rm#8y!6tBr17Wua#5t|){vI;L@y@`73igveB-cWVO2xHah;W|uvI*R z0!Aiy0`l=mxMFOpB1w>#WQLHAV813* zDo#0Y{X|B4fHc$^t%-6MB4uSGsVF0}lD}d4Ho&T*nFvVDQ8LGgKTy%Qj}ISzTS*&# z;C&SaSiVR8X1^yN77o(Za&ol*!qana1@J@A7y@eCCfH0vzU18W4&;f9Sj%`rgi~0E ztVYW1Wa8Ko6P*Tvm$r`Nw;}P5ZSFAvj}A7Q1o>sG!%R=Bxy;{fmttvT4JSDgz!LZK zQ3@XH(VRUrypX&$l4fRyLmHbPWugV>C8zzhf+J?&La3BG4fZEHloZjpr1pWZBGX~> zpE5=%;~vRmdYozrw+%|yMdo|4kEMEzth#H901r!nbL6%x8ADtN5z~DaR9vi5-j0X*Fbhr^g-{ylr z69B0RKgWJ=ZhDE&kfX)v??uS*>j0ZO{vM%-)|vre)M%!^aSIdTPcRAm_liDf6-;boX6tn?Yo&|w>h#9!7mK!5yyLqgT5XvQOn!Sx%VdzlKi6IdZtV>&7eJatPU7V9JOnjb{ z>&I+sN?`DQ`(0n}r@|M$@41pUe>bAmHT!-D5X{hM{}QqeLC{xu{^@SyUT!5xYUn^qQT1`_y&CE z)u46jD9(D%0KPm#X7+A!+EtgESgkRCn@GK3Ug>{)5()gcph-;~zZPwSIn5f648iTR z#JRRLxr1c@+g7G7O&;P`XUk)Y{L`BxBIog<#PYMd6^xrEup?gPjg71fjZ+VVj7Avd zAuUZ?57qosHW0;%{ll36Nz)73+>Ut4-t^ps)2!o=^~?Jo*g9~uk}3EO(lA@sBv@kA z_c3S1#W1^ba6fw!W5)1mdcfn5<}0Ig93@4{6g4S&{+}ECtYNfPk^Bb+!xuSn(VX(p z6I;LMXve3vD3@ue4{52+U{p`})aYi^xOCJ+bTs(ev}6S|Y;^U(;s2Tpc0P^M-%@X@ z(qW5kU-gDot%1Vhj8D7Z%o!nsUbL)FGz8sglb?*$(w0ASHL$y0YWdbKR7s$96I1r#!GZ1F0!?*R^zw-=8q2xb|=Eh8Mb)sRQO`%b0R7ruKzWJgQVX`TdV$L`XdQ) zg_121F?qN~;$Lijac3FdS0eDxuM)=NbwkYtsn4 zENe#iG=S1a#|cr?$uJkp$?b-()lEUvX4V$IV8-N`?2s@>dw}n33qBxde!Kh-mCu)| zCu8f@p7z12H7ta*Z$U!Af*CLqwh?l(d)2GVyrGku7^y_YwtN|*Fq3K~CQzR?F;YkigV1#5ziAvnM%!4|U&K~TarPneQ!P0Q` zs;M<_7h$`3a6!WaV&Di_(YZDKOp^L`-5Tgb<=XUCBt4?xAJvo@2C zE*haQ5RzwAQ0j}l<7G-M#Pse{ckxJojaZB^_f>|M6YS208Fo=nBg_;Ulfj)a8Gc3y z+cjg}F6bMi<6VwyQ7MfLw8`gD*q=CvT-U78$OutEPV@7bU%Kzw%B%5agG@$?U@_LV zj|D2tmO?qOc-&01Wg|By+K?f%?_Fa`z{P!OX3K(L8+0Qd!~7rD5#kZ$L83M=yQvFZ zGhsUxlUv)($3sqZwyC@FyguAK+@pLlyL^1M0xr7(K16{KqDbB@Tn14rd6XZzn>H`| zuv4mto9j8hyHaf0(MX*^qa2`<{Uu>Y^{C8to*s-aDdsDG)Xei&qMmImy*5gyjzOzY zi~f@)UxUsrjeT4*1gV>(s-(p-XjL%tr8s5?q4sQ7QmdBldea=#Q+KlMc)?Y^0md;T? zQ#eL49FiwC@!kJ4( zSRzgb_SUgnRYLe|W!UJ)OE}iotJe1%)~`<2+bbvQIYyq$H-JuC5fe}0GZ~{tf%;1P zGW*V=%)eqP%K5 z&0J1q3@7c?r+c)|t+6WP1t#R+p>^}YpR3om)YR3Xb4l%Ydi7O$5xbQWva5)p*{*$& zp9m5%+Tvkihpg;8u;%XJ_#zN;pW%FO%p%TL`A~oUz(o5mMfqRo`F*o< zFFwBbKss?M)m(n#ULVc zqBPyjRK+CP)b5=!p8ftRZAT@XV_v(ZP=+qt&L%D9z8t#p2bHn--EVblRlcB(&pXOp z{BtstaJ#Z=J;N>vqPHcnv1UzclP4lBMm5*3z%7zn5qi8dGN6 z*en#oa@Sc5J{_;rVAdP43iB*Qb+RJ_?Hj6Q>yUs#74g>7t*X#$;>GNE3zgO$ANf?$ z`QlH(WB2&TGp`?)ua7WU+fU#v!dtV>#6myLQl7rXc8r+&*xsJ$AP*U34b^uZOJ@R5 zZ;A2zXYhtiK4Vb{YXw5d4pRLsM8Kv2C}&CefkYm6G_o{0EZgr;V?4KH@dD+xo!LrS zXk8d5z~&)>m+#)`Ow7&BMBjpz4Bk`Ay|Q?NJz2`|nR#B$#P5udbmy&T{mTTHq{sVT zK5D>H#>8z2Jwr9NM{~Tdn?@LW84j*(7OBqd&tt@HYOKszpCBd73EqJV`?0?0kOK|l z`-3Fsu#(0FT@)fas3|;uBva@OHyNUBYlSv9jN9=`ys~VbnL2Yno%+8F zlx5c9G8igX+%PqvM($IxmEg-;g46el+Dxxq|$|VA^L4&W=TG()X-Z zb>}`x361X3jE>&Rl*RKcj=<*AiaEkYj<#IJzgcy?L+t0B*XWr)Yj2){vpVi?kI%mW zFgPxH(1;x_dciB~W$lt%f6wYv>;6_$^DBzy4q_6^ot4j+Wj$A&VI1{Z0rFwI6xzOxJ}0_=HZyP@>lPKgnpQxqsQ*8#-BnOqZP=*c zKnVm7!QI_yaVhTZ?rueklp=vZ65QQg3lyicSaFKGyHlV=N`=k$&p)$gpYP*!{?2-z zweIKAR=Pa7NuuF2H7~pDyFKt)96E5AwspWbkVzlIC@V|pN8^uk(i~q}us9)}Q}n6s zy6stbHi+8SO^(`PE_a^(6e*j0`9!3ymgdn3q5HUf>Qely z;2!VYbw6!b#d$jZ7x5nnw6BAGW^%uso<>$;7fs=!khJYY@jDvWln~cTbav@^L^q3#tM`<$jW`D;T=lqL%zI5rq#py0@8r zuH--UW$9EEUO2R`dyzgK_U8fbxXz7dMraTu-kJC|(nd5Q^ zAcv+!a0Ytl&#K*=?9cWs$qFP;jteb-P z+QL&xMqAT+Ef2F?v$@U1Hu1k6UVXbJ1uO_1v^a8h_S~v>c>@H4#?gFWGk}ALJz0Ew z9eByE$!GUN{_2Ypecl@AitaFp z`qFqocNS`w@348AI*lXYQFU=As&@NWWJ538ykou1_b55jw*c=xp&2m~>GKpqMMb6Rc9|anZ@lnQv8TtuUb8jpzZ6w7AA{gtfXSh{aXZ1>yNCJzr+x8G}< zcmZu+H!i$$yVs8o+q&8(J-rIwZCq*wbdTbG55G(lVk}^FxqMF^XFES%S6~O-nuViU z2Q0#gqf04kLEJ}T-N2FNXb%tYnb6&MpXV6aoI+ZISE>#6p(!y39hg(U7Yq2*2nFKV zqNHU?9003iC$Ob~IeOA`!lcTRtlB>!uJY(!-~S>Cm+~tn{CljZ)g{fM{j*%S2cWLh zHCK*zTd8DmVo>?GP?>OB@6>Z?GE|8N}y2urL!DBOyU6<~IlQaNd1}B?b=Fj@Ya4{=3#ymu8p#_aOi*ONT4m@zvkL z!px~)EZ#uzLw&8+fNLmS@CUDwZj@h8W^Hv#{kI8KMEt+|69X~;D|QyJEethFQ(jK$T%V{rIjGmr z8H3b~STUsBC=B{+{3(P?k_MLxhapM5e+h>NG4adU8VI0sqtpA+1VVX;-tniHXwCCY zfP;|-A^Ao&vC|WYc7wJXHwhsc9c?DtaoRfq z(48EJjNC@rqX~ta zgJ0jq8Eiv*D4fuI7dpBWEwKzEJB95&A(A;3Pbp^^AWV<)o(eYQgb zq8%XHJtjsn02m$*^m^tZQPAm8A0Lu%cj6KAs><{MZGl2^15pbjHhrAguMgZ_60L(~(XrF1;cQ+BGXO%hdv+G|wXZb;&b2#c=8 zXL=6zN+hbQErs70+;JQlE)r+89CTZblYo&N!{qcuhs8yfwnUkLEfY<)3Ej659mt0v zU6eWu2XIsgs1HG6nPW*sBAYv&b=T0igJckW^snRS_N+|ylMwal424_evS$9%8SWr9 zqPO8my3$!m>|h8xn*dQvmN1xD$blj#I`}9)sVej)D;wQAM3LRXEJ(nYJoygUMrnU_(Qzig}=MF!yWhg8tlOGU#MkJH7Eh&ma9oNx3P)!tUN2Sh)b17qBGG)gs6WyawZ@pg49h? z#439Q@Ae@fmc*(}(HlYPO&=Uc8fX=_Si*LyiBeOhNkIex6S@u(1@9E}lBFyfls#60 zy+z~RuqECq7o!!sX^$GquZFzj2)+@)aSSdp`c>w2%9+|(gaOa0!m#>Yl|u56+w?YN z+?x2dI)%U}XM`OGzElCtEW9<2*nM(QMC&rrAgNS+EKw-VM=#D9sCMWxvA9<#Wg<@@ z%Lq;sNq<3Kf~OinF;dkuQ~+(P29t+=Zq7=nDbq3K9ayfuTdDx^$2n8HKj4eARs}n9 z#Adfg%ZQX+RaJaJuQ*h~bFCIwz2~$Nt<@B(92_cgNDC`lN}EQMS8(8{)RcDBL>MC7 zh#yL8Mk5EpGdnP$Fc;S8F&!4=dR5heTiLo=vC_BMfsR-e(WE7#!o+98k(m@$P@^1% zoZ2aNtE`du%V0S%UoGmdz@MjO?kiNP$C{CVh`X4;bB^~6HObqqh4blY&14P8^wNig zidaF5t<#zgMAXI4ifzFU#82ZTi&&Nbc8JRPM|T81jJ*O z`EfBs`V4Pgm4#Whm8DsSTo*idN`UJ1@lm;2+eStH8cV(=unwzrjuSPwYSZ{J1l{kpIOpV}KXq2S`$cCpf^r1yq03l@|4bmN)1fIeqJ38Y%V>jTx1a034pf_@QfaInwP%kK zokl0+eK)2Q0g##f6DA=5?+1s~VzFaRqf)HZm!f*M?i!n9kV;P39z7IhPwE`x>F_oYaU;MW?K_3u9A zzK$@$mxU>^kEhLj)6KzV;De;T=Z5o|xdr%KREd=mm^%bxx5#AK^e5q<&V155Pnng~ z<$+1ZF)tRHx1sw z9Q>7nCi+w>EzSvfh9moG29+prn%KZ|Nqy$-#A)Zv-yFXN8x`Yu531)@^mDw2uj{DuJ7S6QXCM#i$pci}nHu0KM+u21*oO*MWxL19wgAcT(^~*0y>9rvn0xWfNoHd@>z zK7Z@f#x&#hdi+*3AL0z~dKNUiXJksK^cTu#`zE(*mS&rrAMZPPEo?Tqtk^E<BJxn=YV#Zwl5_Y0t4uA(*SKIqo2fYBE=>H@X?&aQK}-9XUP8mEBIFljHy%RLyS5hT|Ok}U$j z=*Gp(!Sg-iD$*N5<^W7hFuv3PI03w}@dc>8{#@NvYY+(KeSutpQE>*9rMEsq2OsY@ zfhbexO`zO3vRsL;u#in{iLX$l(f#_#el;O;m6z-{OD1YYD%Kn55ufFz(PRPRsKs08 zO=zl?;5myW&Cmfno@_uPu-amWVFt@Uif~JX$UJG4HSPeTc%nZS;44Pe96-b><@`Oa z*_9i|#ba#Wx<<|;knUo>yk=IgU?~DHCVZy1zi$wF*n!4hFRKZbdul{ONCCbx10Fqw zAM4RH3XTP2DBRt_hf<6dIqvYXW$iqoK~^ zv*Qe-CxA^g!JRSNO;V@b=HQLcofk9fv^?PYqH%Jbv#N&k^Mv)C&F%H~J8`nBoE$_! z^=nqegD-5-isI6wW)4{-XU!%}h!@28Y1jO z@b`b0H{T%9-3MTvX5Qy{x0-;Yl8*> z&Bs@Ih2Po!zLS@{1j=ANbGyc2V6^cp zXpR5N=rc9CNa+?JKEe61Hub|jvG|bK%}r>8Zj}&|ufN(B zmI*u^sVpE-`Inbphqq|*b@E&ZeQOD{A{zg2)M*I@5X9-CK!Lb4@>$wDveCHIQc+|& zyYfij(_euHUORPY}KS4m~kkFvmFP}$Z$Gi1P$1C{x4-(Y>U`~(W6fpXCPjcHuzcsNFrFkC z_STf-r}J#NMj;FP>b7M3D+BR`+5p!69<(P;BdOybZG7`R@1M|V%pbglrS(5bIcL({ zG&cLrZf<05JHiy#Aj1te{$KkE#}`|xBz_0p9FVISuD-9njft4I6s9fQyF=*rk!mLp z{HjO2$KITK)0u zS{|2mDnCe|xrl>w42waLj1f}Iga0`Dkq?^<#>C7h%S&IA_HIT|_+Y?$Aeru!dWkF< z)-D}$>$E*RJJBo?D&KE&=U5F0wD}2O_>T#m9z|8}92;e*10RZ{ldPIR9STtnXU5W& zh9fdMQW#ZWy2^S{@Ll*cLQ$rbUOmzjfrFq5nWOXc(ct@r$a=>|zfjiS8jgx7=37jQ zO}AUj_0jryltjd-Ovqs1*GflBIW|i#lf9Zz^jb%uC|waVN4D4$2aC=;Edv~0YC_JS zfC>fhEfr}nDX=Xf&$*@JP+t+q5g}OA*tRlE5hM&z#3@)D+2$`)7_C@M5Bpm~yFB(1 z^5=~0ER`-3KJOj(Coca(`=jLm#(gxT*THl}EqQ+X%AnJM2*O9Bu~kV+bg(FL7{Ulj zTIje_0A%!x<9Vda=vbyjPXK0!>9$^U30rHiPMfxfNz}uI5o&X%ZdS1zwsLnk+Ug2} zb7TpaBSM0hnavD7_zkq2e$9Bio5tmV=t_1Y3h9lUchl>)qc$x`hQf^($D%?Llog~} zmlv&hlc{ftYDEP{tsy2%6vb88528-U79Q#O8Ur6EdVz$?&Z3XFDcjQ}jIup|DS~E$ z#YiE3VN96L*B-hF>@gn!Ae(BD#&DpXOZGreD~$temy3KCDjUUSi745AS|=XqaL&BWb#Q zNTtVtSE1@q2nBKfM}Q+U;Nm3+jK`n^WdZ;^_ibgX{GUznWIFkhy$UQq6pw?0x+xa` z0_aurWG+*E_lHguEIRT|gDC|K6P5CNm15+&hf1*>Jdi6|0H86#pTE2yD^@ITm~%k? z1lG7$T}~pgY@jo8%Odj1Mq|Ia$ym*yJWB(^Y6;|@p}Cntzfm#A(;F?-({es?1NEc7 zDgK|H_7C`R8DJ-U>RE$mM|`*?Wo&+_0lTV;{H-c-wbV>`926ChU2<*@P2N0mCXfWe z1?=(fBiv9z-~$*UJ%Pm{1R<%%(;^G!F2)ePBn^0Ipbw^ zLr#Sph)FX}$z>kRoN*?=LXoauP(8dGNv`z{R}Tft0IG)V)#uUt$^>h<@<-O&s=U>- zEJ%l`X7=-6?IgDmy6|efSPm586QU~MPBni|Hd7VLsO9bRIof700c*ajkOtPMG4{@T zrN1=)#|c;K9&2H0-pNBU@5NY7@tx(ZU*DBg-Ct8^%eSzN9CE0$3 z+@WQvjtK#)X#JYnyN$H!8U0%A7&D9Z&H3{CsD@w}X2bp989IEmZ?ay@WXsKqgB9%j zvdXWtY88y@HCuC1imELuaDB0>bo(GqJ(RAnCw+&vKhjYu@5Z3e)y}^E>BhqBD z#hYiSGj;HNizozf3!$cs7=?E3=bzKF%{$I?&q(z;u^M z(&;G4d4*>Dtu3~Wle7r)J&BPpu{4b3kIDq*3`J4AC@hDVF4|3z(<%@J$2fmBUay?B z2ydLooYTWb!;P1LJF=Y0#juci?zr5M6mG?xE&e1~o3UzG8Jsv!L6K`%7k`d%p%f>q*IvwvG<7TpWog)2(_{Q?7HYkJ6+)LSz z4|{s-+xNLVN0IUq;l3tE1FUiqPTjs=UPr%(sw*uzg1*Fa*@+J>wkUS$sw?Wo_~Cb| z=bKq6#V18$0u4Oe;KdWfhCq&D;ut7LJTmr&DoG+yc^330FTjvJH$BS4v!0s(*gm*V>21B7X=?jw+wTro-X1s`J2uX+ep2e!5RHP!fnkFZS> z%)u7XvG-dCG8W{JnGi&j0DLR+Ud2RTJY$G#>L={k?Fu4EJtv#z>qZgkNqZZ-VMXkz zT5ObI)!WR{pb~VNdBZRxU0&wb=>b=fAV4>}FW?2%tdDoDh!Q@P5m)&Rll=SnW0x4q z6G+C_`<4b4qC$^2r&5yydrFWn)_%cVX_sLsa(>cGrDGs>)Gs~J48QQ?BK*0R&4)2h zyOD;e_An3mr~lD;hLm0{t3PoQ|J4V=!7(g4nDZDCEh`<=Tcn?y%3?7KJyHWX64su$#aKL@d zP+d(k9IhKYOxfAJU|ZP&2F1j`B3MM8r`#bjos^9n54=xBIn*3$!knBS{sCrYLTZ5y zk!~Lhdk)@Gj*g(44!KC;>$%NO|iR0i>WTO*Lgq7=W| z-iZy?UW<^uWSRD9Bc)=c{8>Zsd%(vwx$<{vU9WU!4qbXz&c{d&E1wGYQ<-5`ks|`u z`xoh>oZLgU6~QI4;iC-!W2}_}A{)DWb-T>y6D+#9UoBJlow@}4A!#R_&7P;-)^Zj8 zsg;qsP{5}g7OqweUp{o--0KuhZNlEMoF+G zn2YaVs8{G(e9C%k;lA3+zRn}MSJAr1&lOlFLOc3NxODK`ScZ0Y#Mq1~K^e6&MaFQT zx(GGP%a$7b1)I7V$7>TV`6zzHC{epv5raMEW*tD`FlCVei$+>WN z&DJ;u^WEN5Tbgo)MDdjN3wzhpl+-Z(E)kHS7w>g#GE4b{o>G{E#lG%?B@Mumc8-gm zP)3S$nh`WDcx5M;7iq{O;Waa=%fcrnN>Qs)gc%sQRiO&ar97t)CKZ5aFeBQ@gw|Lo z_iCALXQ_~Eiuf)AlQekxlR5x^`i-mfwQT7VuT6@?n7XV0oOfkXBbgCxgpg^cDqNC|17t-GM}W}d z%0K~L_zxnOcpeiCffJMwt#MhB-E0}0kJChg{H$WdV0i>LeF>R=B5IaS1_=F=G$w)~C2xB*oos9rI; z|HCBeR^^L&#I2;Z!dD;d$i{^>;%R<0Fv21s$j9ek&`IbhDPUBE9!+kntW2W_s zM2tKSKvbAU15|x55mELlQbpUPcL!J)9tORg_=LEzDtsl<%FL14QSqX1LjV%VSMrKG zTxFZghR!I&0*B4j;Ay^;`!LW5v0yCpUi%9QcC;j%O%Qa!4ubK=;A+7AVQ}1wx%dMl zNCk9oWtdrRGB<66*|c2YWeCke*Aj%o1wjnVsZj@*QCU$gMNux{3At4(U)Y*P-B+t_ z1< z#yb5@*|j*rY_x zD0*b|vqEf~LLWCwFgxD-EAvM3@!azGiW)O~m>FS}53&;k`8tEnuE->a(ZF+Aqudr5 zMfd@?iBC%+tsBIf$zc2?@t*oClQnD8Xl2U;wzZx2D+CtVOC^gj0KMa{o3QDnA+L=j zgOwBG#fc7tjR8D=!L%T7^IQRQrKbL)!PfnIOeTf34_^2i2k2=Apk?lrpC0f6ZUBR9 zmcq3D!(W?Vr^~{YotPM$P-_67TKiYaDGixu}cGsSl>u@sLlBB1msB9Z7ef##nETrK238yPySJ8f$;+Kj{Rq+)CX_?%W)ewy|3pn;oi{`Ji(NS z%{(N75J^L?V+)F2bbh`~$k*F{QLu)y;3_B_yGmgz80e;X_hh!gX&tyBL^xsTaKu07 z9Ng;f;f_dSQA~vVcT9~%$yHW$@SPs*>>KT4lwB%PGfY~tAvCi2aM zXJ92dx*~9u6YX^}8|~uAcHn$2UJZw0vJi2wlbSi4_u=&UMwBgioMnMTd3jvl0jIe= zOMVMK+(FV74SF3MbQb7W3Y`+>fjr_Dk&{j%Z(ZPI_UUioyOeP)4M*LEPLDA>JG#3R|%b$W9d-4X}lo!?|YXlQ^nkq(-masI+x{Pa4@m0-rbz;Wvz z+1bKd57qV3#0mS|p}ig%H-bgDSyB>&2WLX_f>a9Lb+B-ea1wibro+*5<$3T<@N&;{ z0^qgt>p1Dg5#%~nY-MeHm=>-JK$vL*KC6T)PlAN6)N5xvsKr5$BKYeE6jUe77s6gU zWaVCO>sby@=8fT;d~f1C=ITPdQYtJXr`<-JS9trAjeh|*?vP_b{L38WCPJXRf-5us z)AGOp)NR`+=NA=Zsr~NstB#<*if~+I&{hTr7#Iodh{XTnSn}_ptl@%Kc+DdeJ|zU2 zXJ^BdCVPz~1e^9AX48tAzD(tN5qT`h+iYOSaX5;8{@v!y6LX;;$7`E!Z5J7!AL&`* z78RXHzAb+lOguW!M8eUH@l~UU?<-*$AI*8pzdw}A;KD|rjrU}Uf)teI9kwtGKu}-T+e2NONzl?g>zj1ACJu}kEie&SEE#GC*`BNdT<@!1e*$91$3Dzr^ zLyiIjOh6V(QmXdrY|XB|w0eStvGH6xq!>*kF>p^|&=dT=t>f!8b8Mg*4UG1#<0xTIyI+83N>$_Pl2N8 z2Z_$U#=Mxy^>8M-NS#KxuG*2p2+nBba8DV)4_xLB)u8PRUvJvSLZdAU<{smt+vMI# zwC%Rkz<}PO$Eam5=9}I6r$yDHN5fs`ltbM!o40ApQO|oVgugtddd0lOcSkh?<-eH# z!&Vj(enb2o(t3$6Sb&I1kQv=uPAdfaL%s$bP#J1y5itv~qww{J88pr1FVq+P0bek`%tJ#}Qxe}0X-sRim>eD4`=L?{bdYWLfF zf7*(7AD?!$Bdm*&>>5{SxMl4ZylG%fPqH2J56Am7fAehQmG|0iC<;oVv|{K^)%z*y z_ao>3M2S6OI-J3?doyI7ap-Zom7%|0yS~Tx5A}p_IbYHBN1=z|{;9m8mx%$hGNdVA zGYtLTs*^z}g-dkScG!$ghvt)0Gu=2U4y%}-$+Y8eHrCS)5q!>estC;Js zNf1^`)yH1aPtgCVI=xh$TEI_-@_7V2>mS||%axr!2slP^V9QRP|9W{mT|&z+GVHHa~=;QPfNqdjoAKqOx^T7SDoK2-Ockdgx{s{<~kUsN#71Pm{BtLO#3^i z$xhSHW4#yHiAlDFRL9JFa3y2d*nuXW*GiJRcI-HZFyC*;I`uJ;!>#z8tPm{+{+ni8 zBw#?uMW^#Jj40tJX*AVo2V-I&G4o82s=tF?0x3VSAvtg?tpqwX+6s{`|LGqqiTQSL zDRq%Qh}{0!c#Jl9%D)w1$##g=&++hZQJQvSgE=r8NnP9~YlQJD%@JWzwJ4YpF(=8R zm=B6(BIhp34#FIHV!&^ZVvlTPKxS)v*Y1gg6*fBGa$enncxZ%F!s`k*KI<0-~bc?ti|aas&-24c<63E~2yCF!|l zGPGJueML`1O?lI7gecm&DSxq;VAAC%=DnXVii46-ML$buqv{cHO`{e5{h>6xK!e62 zW9Ph|7JwFECa`EiE95)GeLsBGd9i~7sh%1_PPZ~%gy?(()#J|0sQLVgR5trtCAb+x zD|F(6XCvC$JOo*MsYu{X)H{XV^VdGY`?dUov|S=dXWCSpFFBp{tVi@{({MN~R;aj~ zPq{v;ex@OowhW;7rRAj`q<&fMCB=CHZ{s zurTfpl_b)}QN=-a`oZu$p6C1p_q7T+sqSv_5iIFf{?q<55n zDcqHE^cNVyod}-@Ws#tlfed$?0(f-L5m4KX3>o+fy*RB!-skK$nZOh&OK1p?&Kg7{_?{@@;# z^u(%aT|P{wXQ<026Kr59rA&UT=Xb?Ik^W_jk>ZxGSxBSeh|(M+lOZ91`8O@?-7*54 zKP%6V>%gubb|67ITgIfAuM8*y%tu^ZrQc~Equb0A_@k@S$*}eQ!|G?vQ+#Rxm}#>q z%@aeuezJ=zqCdmdGoepcZ2dr`t0@W_?Gp_eBv~T@anep^Ne!^2<09W#44!4QYxa^>&B1 ztK9F~p>hJyN-i)ycIP}@r0RjOBDI{dCh2KqC1x)6>QbLE*|2t+mM`KNQZ zF0#F64xt-aTFs-c#>O!Yx2|D%LEX5@+zDy2i+0sh=U( zPX>%U?jC{q=5d#~8xpIqTeIlp+i|^7{}J#FSmfXNqJRJ(efae-MWwh{T!+i|cqrmC zWqno*WuTeaHp$WKO^s{W(O2wXs>JHy?w-A`|t;Vx$`D^I-LD}(Ox=Lhy7fy$Nn zVL_SzyR~@nEg64#cgmZ3qSZOauunQr?xT=#^2^_CKX{(J9e&ADXJ($<<$TFSTYu-a zVnFZz@{7f{qwgJT0%ZXNC-l6(CkYirn?C$e^W>e0KmN?ni2nz9?@2831OMC5lju!r z`kw*br-!jHsUOAP{~YUuJubeHx+^dId-~?-ah2CQ(qMpugpx*F2|p}k=-bu0+uCQI zVac?g7U`R%oE&HE$a1F-Pbq#IQ;~l|ECEHuw+i1CvH^I7@BUbtxf|)87rwY88$&Bv zMXaFVSvUVQ`NY4Rq5`aS0CxKWyCv6OBv`|$Fb-yD{z!tdbn^aKm|_@OciR*JS+b*) z>Hg>t9KvXBznWwx7vVo{{Z1c4X&B>iKy1UzsW1!izCD@$vo|fK+d;8WIm?gUHKFVv zrpK|g{98>y@Q-fP&t^bD$;w>~8b{mik?aS^KQ>rvoF9yDA`8+seayBB%qn~!&nKHz zq&%cQtImQLQa|JuKPHc?Q^y!7XH(fK%~dNBmlV~i3^ja>SyrKGp+=Yot}#2>hFR~j zxH7PYmascw46 zbb!#cgBc}8%N>YrK96gRs0)qzI&$on2F<2Q--Sg}HTB=19jhLUl_pwxp_P*vYcR{6 zP97ar=+`buv>`Tf;k&i+!2&U8cDRk*W)+#_<&%XZ1-;bGhDVn9Y=n8keo5c0ilMvR z)j~|_GX4E~D_Nehdw%Eq^Dy#5v6O#!Td?O^E#L+A`+*EFx{?sJ%HP+&>;Etw%DMF@H;vbfb;z+Bc z;ubME4+P6}B>#W_!Ov4}zMQplJG?bA%rJ|!TfAYaZ2q-1nqo+S-g9@I+=Ahz*j_qD zUyQnqK*6klR{gNF)7@d1_#olakPe07g2bxEF*Q-!iasAB?~wf;k7E6a0~>QjA}nU@ z-GjZacG8wKcFmR^PbQ*H5yz*w<3q1M}UK!}g8uZpFDD)^O+9^1pGN_F;xa;UmxXp4%rsvQK z4G$TzaU|EjA}MdU(8LLEjM=0s-}Fzsb*OT<>5wnOA+BiwW(lQ%AYIjrQXo}H3%#Yr zzLh9Jd9)@d=^Pew<0uz(OyOD89KjY-a*RlDMm8TKA=a_|$FXh7akIy9Ima~1+-Th-%4zlDKB?}lSgLbt>n^dlvhc9^{gj>NuW6=ge(pehxpCK%pq-g(VOMj z(F!mD3(?^6Vg~A*yD|qZ4mF17r1P|x|FnVOY}!J!`i-ZS{2PL~?p+ zJ6J$#8a7TUxhO3cli53qg}ujz2~HP;vgpMMfKK)IkdXHhN2jV*HB z-OfIzt6+`nb?-oKndwh9dUI^XyJej)H_}ENtSwEoDS(-du%3LD?tDgiA-1@D zN5_90u7Ql^iWWJor;9~a<8L*@-(Jk6 zyxH08S#5hWMomugHrJ44d`HNNfd{lgcM~`GVe{gIlz;3js1^0Iseh5>rv>2mr+u*> znYM8;rNe>+5{~{~o;2SIyR84&j`7%o+#;5 z4=f7aOK!E6-@ydgM2!{m|JK z!LSRmco&Gb7_7QrlfKy8d#NqwavE#!QstMV^nEamiB-WL65?&Gq8b&B zfTe(l4I-wNRj~u(2IYjGnWh%HNIgTi@1hPI<30@p(`6>XP~Txdf=Tj z?>d3Mus5CO`6`=@QK1ygCBIxB>+4W3;yuV#6Q8$FrZm50M`q4Cc`@ZYY;-u1po^&XD zh+XQdo8(UlQ1!86Ue-F)MZjb!@f%|+mZ_J+>v6j2SMZmK)f_C~c`|L;z`9%o=CC1w z;z9kuSAmmSmJF0@TE>BW6suR!Li(7vF>m=G3}0iER(1xSL>$}Reg!*7%@Cu(-~%jT z*9fA>=g9GakEIJg4Ed5_s%qpbPjIpY@1GK~;f@Rf0T(ADeFpNSks%>R9YZ6(QYu#T zLB{?@V~6ZgntKp`!a{OlcpTY63UM`XhBpbGwmZet#sVxr;ioI4mPa}8kp2{ICwEMy zjw|CMFjUD1af;b@!B$5P>iBk5|C)?`;rDd&>tp$EVxhlh(wLUWJXX;Je#agPce87{ zrKFneO*o2nR%`m@e9S+8=cL#`uJ!iYT<#4{rT9hl(^T--dBNEqr`PT5+QE>Yp{%7& zz9h?nu($F#VB96z7?qi1W~2yeot1XpTa}_oflOKpW@Q)A*%ai@vMzZSWxcW4^sclr z4w#FY14n)B4qKXOU6p1m48l2t8;j^4eJ4F4*P7*5q4eHG*JW(JTuiV+OMydQ!L=Pz zb0NL0Y>sg7IZB87qarif zY+Mi4K9yy>+j!N{Ox&+G#^1ejmw85YUR2yRkrH#!R!1+5iPc2Wrn*t3`XEtXMG^pw zqZx1*a2!Ck_jL*2lF!F-dV zz5|2dG8fWKx>keRIl-Ooo7la6WSH4CXW;qPSIGR5!l--0gNG+OFG<53X5t+6UU9#US{>Xc75){^@VPl%X5v7N zf_R+8cPq2~+<`A(?6uuDpG*`g>J|@$C&k?$dpRB%oJeJn&!{Ft(m&nzP(gB25{EC7 zEm#)Yow)~lxmz?wNxObs+|48;v=Gosx~Q zQWvZ##c}=Gdte&%j<)&PillwEB5w?a;(+yV^81xVilL8uj}phcCASDZMot81;@m;p zOnNfXKnwOMCoT|bYDxZE0ZT9X{0m}x zw#1{gVS5z0NAkCIZIcI<){kBtG4^W*6rZ+1Tgv@&C0Efe|Lhp~1P;>UZA7Yl+QlyH z7~&80j@4V=qr?#P>C^D>rp;zFexgX$*^g_ojWQ${2cyaCa=J_YAV0k0h8M&{_(GkH zH^#{Xdbo3P@UNG??xG?|(RE>1pfW7lrf`|O%b!r~a4aG=>BVQ=u}(|+%wkDwxgGEB zLsZ zywG|WqLjK$vU+ZOryhn$rOrQ$xM%hS64_p@EWM8YRsWp}Z1%&P?)rJ~p!H#Imb7uHcFd5~C~?<8TTzmDgA^m(ZYidIJM|>tzKy@%5=H{Qa{6>e@x_uZl23SYJo%l> zH-pYZjzizLyw?9BN067olYNs*o$mzYW9fbC@j<;ErryIw>E!JhsZ5B)ea^;I*k8J? z>%R%V_8W6qh2IF0U@nHCA1k!q6J|Tv-5Hqn35N}kSPdAO-ZSGM8$BD008&DBmn=3n z%)SF{5x)Y$|Hx`IMSHwX=jAXAe_mv+O(e@EPefLX6PytuWoQ*rfg@Pq*<~1f$`U+f zWCtz62@{GcigA-L^yFFQ#dyW-YOjYr15^`%X{VtXkT6OKcpA&#@Ui*|Rk+ax+Vm|& z-j(BwHAYAtJKa}?2w_CyD2H7bnOYx*=x1@E?{SnY@-zaut5E#?A7U(CiJ;gkvD@Gd z97Y62J3%TyPE}zap4#oc2!kcFqK{a7Ntc7A$gF0TLc^*9}%|qhDaC(i?cYlFUH0N#){n8;le|! zDkD?KVkMj+2C|~p9tay)%qAd8{|s!=QT)}Gz*hI@0ow$=UWuSlh{`s%5Tk=>DVXHg z=?0cC#_HP}1FtZ!>S^=5qkBVhYV~P}_^%^T{r|9bR()+md&3PO zfh0&1+>5(gaVu^`in}|--8HzoyA&wy?q0mOwK%j;S_)KnInOyC;k}vLx!E(n+510h ztz}KgCXk6K7#jg-P)i11qk*3&!Dv)yATA81hcsq|5c^0x4Bb>*ZNCc7)Yt1Fyt?`x zjDaWgm|+ru0}R3Z1SYRfEsPoAZ=vbD?s(Q(f(m9}=zfN^FCL^Z3F9UKOFhazD&R^D zu+16TiVSEUx51W&FRSUlCW^)tObMgMbo9-%)Kp&Lqf%=pVwOxmHv=2*XM^D&DK2ye zmt=?J%!r(1sObxPFIf~Hc>H>n>X{8mm$N}lltN7kSlz|Hq+)XLHcxQJ^Z>BupkqiH78lygSw=oFL&`|z2_WE& z9Xv|_r&1=O%_sFvB7#spSXv$)Xy;5N0GG839ae+=RCrBRhCe$RW+I1|tyh#gMWH-o z9dRFfOr&pYtBsATGv;4bGX8x+^taITonEW#6riBqJ$@ zdC848r&qQ)-#okeB?G@uLIQG9FuDu2YJ%P|#t_)~ePPP@rI5{;Z6#dJLyem+B~&RM z3i4jh5tob@l8*zTL~C`$1o6X<03{)7m6(d9qYMSp-o@opS#_VBEn(%{ma?ov*`a>b z*iAWRvaFa-h!mK;15~k0oE|@bDWmaImK-zW%f36jHVPA26ULbou9jyhlr8T{XdYW# z8|$$Glw&}xae4ITdXTY7I6~pT|>{F&+r9AltL{Da+g$5ijrNCf~s9adUgZFK|p_?_%KNYx5ai!IC0UEkZ zb5GqR|H5i8H?z*W(0SG@sSj>#a0W9@h0Kn@;S62 zH}hXw)KWRrp!tWY>SuI#RSB&%T`G1G47Jb^S8y|wgb2Ym&umZ(ni_{GC#fVkO5ME2 zsCP~fQZAedYMGDR-F_H+0&yH&dU$nwoi|yn(v0py3owvmG~@fK2bkFYL;SMCrXEX%ePEv`?42QVtt11d?QNCD}q!50lMKsSY`T+niZXN(gC z=-P)K0EZX?e(uBNCEysW1LNOIik?-^W~C{N9p_%T=W*#54#i;87nG;%H2VEx(YY5S zJ?_Glw9C4wI4qbc9WNyzsFILpxDvbodacHK)CjH%82~N93`~20W-lx$!BEqI`o`oR zzJ1FqaD#;*bkU9TM%E%@2e4Tz7f-Zra%P=2n%HG;wo0Rkd;t`DPPPm(>WGXt^8i2Qwc zf-+n~WDr;a_-FuAUl^Mx?UQjQ!Xn0VV8x7~Y_(y93{jTo8Um&`9n;j{Qwv$t%J65B z^?f|N`_aDwAJTJKJ>=4jlS+eYLnD+L2`K@+q{?|lI>VJgQX#Vxu9Ijf`KX~|sAN;m zRMUMA_#*}YB-w2s0aILnX#hrnDfvl`a7#7#`}h_N!%PF0`Fuy#o%>;YNX#5VcNHZTKnpviM|#y)O6xBHlCHrEG%T2JFAqdDnO<0gKW=ghW^C+&AcF-`cKqk zzfz;0`_VMyli-qBl;T;K9snAWQy#Zw@O;1hHLt%DbfR!5=O<_~Xt(auiU=GQ(qaV# zl#{N%R{3ZUOY5j*DiunA8#8^F_pvNv1?A7o#ogouJwC(;es%HDeWvBbb1c(kgKv5` zqTBd$6)oNc?%L_t@iqqz02DXJ8L-tSE)CZU46q5P>Lc$;(g*xdgdYvgP$K8B)hBR? zT7xda;OQcDbD7tETQ*Ptu*ymtCE6+<)AcDA!jRWIwEr=|sB5^2Njji;vJa~ttN$c+ zdVIQ~unTt)3y=8wwtvLh+74@BeC3-{Totwq#ors6+?|3^tG8P4e#%`p*5@VHlYjj| z#VLizXOrbmnpJ_O#Fu={lqA{EPwcouqr)(2G2Ga`J+AOnYx*XqsTu1_b^Q5-QCa_FS_K9%d6^`R?e`p*$+~K73YO88S+Ioqm z(t_rU38&a|1hr`dbqFLAbQ!{q<7ot_{E7`(n6wjIr&fnSIKdcQV|i-JAhRo=dghMv z447-Ml{71V5EfuGYNvp4KtX1-$?jN z|2b}k6>qCPUVaVP4q96o2>7A8xgvU%p|7NaMKwa94goiTP}Lw2e@-ZiP9dRJAgUlR z${A`(zUK8UYRTT$LcmwR7yzDS0Ql%f{`Du|Lr&o!s02)odB&0e4=(_<@1Lp!&3vDq z`nw|)c8(}ff%oRgtTFGdWIeQrz!P@hppP>*PCI>`cy#P=MNU8oX&*}Q4TuV)MEU$c zfo9kNeB!t@q$}Zl&^~dv=-y<4<9E?_@HDbdTK&-S9wOuzDYvPQ=cP&SNH%Xpq+*NviX8z83X@B0o>(n{j{O-+!XaE+zXBVotkl zz8TabR?G_Kw4ZK{WSzNZxLP486*7`)D8Xn2SuO_=WeSA%I@d*mVZUJi>xO`AGro%if;kL<7Gg05j~=5Shg$wg|6;q5N+q5;ZlgcX zkfV*b=-(}&^V;1|W(ta(efOvan9HWv^2w3J_l;ci>ksFg-?4gtvMetBs4W(@65-tt zPAMouxmwjC{JToA3B>(lb*66EX$6v5(-y~@p!A!VB(FyGK$am1gqnD)wsE|eEFL=1 zJIuof12}@X<*Dpm7mt7+auGC=^6?m>$x#t*Rd`lzY7==H5uA!_9bZywK!3Wps93Bv zFJC`&YShpv>MROElsm2Vl5f=-GHjKp)SEl+?9%;tB@ z;k~sr0&Rduw}tZB_wQ?&DyH2i>EOk@Z`Dg!n}?(0-KPW!wo^Y;sGET8d1;8bx!>r% z8{?DuNc8pv@7QBn-B_G$`V?FIBM*y?)vt38J)0sdHWWG1^EUlT0te@o$Pk$yuWbi1 zVqTY4w&EMQe{_Py=q1g5F!~#k%Vq3{-#xAD+a-!O>bJP_on6IW{|$c;npoqj72Pc? zL%Rnnfd-?oAM+ZKm+@1bnm>=)XZ?en>^}Rjjej_}8JAWzFF@-x|_gU=k(?C_Pc_DC7GrUfbiDObSL|ZdSVx^x5CW6kB|*iu@J|0OYauZhaM| zg7&L2A|n+==OofXqsSU2EWSS|Mr!|yfizaEO5=s|B0jt4Ctr(Hs#<+Bs137A>Gm6_ILwi6;(Qlc(V@h%noekatQy_s6=-aTqPjU9tD|8LVPF{ zMdnP&3W7li-Gn3eS*h6kiS<@q!EeT_P^9kli7`SZ>JmyZrQ@gYEIZ(;@@A>XyclQu z)IM5FuFw`zd8Rso5PfAcjG*$3Ti|}%CYJ`)l!5UyHh=vz`4PAN9|A(Vu;zyw5CC>x zE{Vnor-z%-FPR$wwuo@m2VE%zW{hStYmzIDzIn4fg&QC&xY2Z&IX!9_0lc`)Q9tM+ zoV>^;DZ_zM@!1RX8jWLXOFHsV5-MJbx=1?0E?gB7>8LZzz596E5q>(#NYsPTgCEbE z3CB>p`xR4^PEG-XMtG5s@463OXl=afkGBuq)W|R{h#|9sWkwmq!InrKZl^)YB}Q1*9=r>!Rlj7N+b#u6^DD(Q$%wJ6{CbJs^k|boa>P_1<4v$ z!%3NXdT1d*xFkycx2DY7skVl%EOsGi(%d2H zUm4oSrnOwtKtez|AdgarsZH7vun|u+u_ES4*=D3uxCFw{dLS+1;WpEoi!K+?w`_l0 zRFWTZ^PKJ9;Q^Vv`@1Uh`K;-~0>(-`nN!JEQ-~-x$fJAZF@KV@&c$q32)mR0I zHhvgjn_b0zAUw}GFHc+zU#F|3f?oFPok3-2tsU6sT%~b_uk(SIG5POThd0@{x4Q&1 zv!0uzSu@FZOO84gZ{eoDmlEa+OqiXH2dt!_@1qpQ z6@4iGDRGAK<(mc2uTw(WYk}#T+}m@Wtjy#y-ifc{^ zH*l(4>wT_cUe`p(-lpkoH)jfFH;HUPLw`*%2Pd+C-mYG1d{i0pK9qhU$KSg?7H zo6O*-aq5w>YJwU4to7wfaH#jq*x%(0;w1A15!6SJe~uqa8^11ApJn)?A^=rz*29rD zJj7~O&a2DZsu}6h1hRxIqjHttjCOM>2MaV2X8xE}#cF4X(^_)6xYa_ioy94tLA{iD zKjCcKTAL7!X<2wm{mHk~sLsF}2;!`M&!&y0)VWwi(Won~eBMMbm`H8iu2Dhv>_y0F zswHTBNhb{Vz>Wy?8iI_Si(Ee~yQ#}H-jv#{hLbP#&qsdLb}Ky~cf$H0wD`4R(S)E}SsFX!9x)FF8IL;Wr_~xDHtREOTWx#xV|V z<9^lO=42BOL-nLU*$X1n-~VjhI}$^x7EbAGeW0kjKyrsBs9j9Yswut4hdHvy;+M{w zUkM(YT;n@h{2!JS3)@OX$vmWf^)3;mwBVl6xP<*Oq9>k?14Z^;kmeN(!w5Pe^cLyC z*G-=F$zd;7nIn@A>c}l2KX?RD=vCo&0p*lny+PTi6B$ZN*9+H@pR$oH>LmrUq?35& zvXSW;Lu;A>c{%UZJfn17mB(lX?Jm&~5{RET>gmxSyh|-O`~opj%wb_4!DWDl)qqWGdv*{haiU4(%*{Tb47@ z6s?&G)G(!5zlmXMj66P|uQnAbU=a_`285de*DOSHe8eI-OQ@T#q~!6- z(7aNP1HP4djT;Ae(h2XBaOcHU>Vm%(BqD7G^d_RLygo~&<3hAh+;HkCjohTgSfy2k z>Q3HB8SK!eYo3&N)Uw zTSyN{(k*)y@^Nm*0q;kKIyC`oE|DPJveau5j# zW~xUNZ}7h6<>F&>w_53{gn)iYOc1UJj;0KjW`}~q2w~db5K{YvuCLK<>=7-tuYZpJ;5hkE@dcvS&?n# zCI0D z$QyuO!ucn( z)0LN61GjY~B@FdPSDdii{qnSpJ~zE>>&V7SIM$+gPqlioC@4S7(xEXsEwhDX}pXy7&I9YE8aF+`J6Q&V8s?KQ_XlU^wt%SRBm-#`X9S+N+Z%IZoxq5O~d(D)za6XUEy084+ zrX0f&DsWi*DJ+PHTM=6(=|Yuj1}f|Q9)1H-CJ@yK)np5MBgGVAKsjiChMi~H(5BCJwpm=USYM9{Bo+nx}WzbI8C*81vZ&5xxtkFifrtNI^) z_pQJFJT2o(tK-PkEGieH)p40{1mFD2N2Nx7RHgjx}M6XQ>F09l@F4o zvL5*tQJ|uCzf`~P_G!<2-PLoWtyE`EgCz4&=lJ`lNcHs{eSP0Co!w2n{0yD7CEeHr zeE}(8y(fprEIiyS>sLH*cO;= z7EN_hK_UrCr51VbJr z*3JcUtj%yMJL7&TO~YVx+0$r2?PG6moncPI3-!rQSe=#0&tf(&3%`qqx3p z48jBGCzlugokoSW@$LA=#p^r$wYUY<7#!;)f1s6t%v~o(yA{YC`+8PpJ;OLb7!fo! z7(x)Pi`VV3^XXKhO;A6FvF>YyNg1SULzGx>4B0INTh>A@k3h_lV`ol@zE`Y07T~f> z8IB~!cBF>vjg_%ok3CkH7Tz1=!*k2m4P~HcfWo*gA$;tH{i4o^{QbnCb-M7zu)JiD z-+3h>%53H!BkT+sVYatez;fFc!}Abh2S|y4?+|IjA`Xl~B#GVyCidbV((%U{Q4yU% zQgR>>mx74TT98pu0&?~cRySjM0vNjM9x=TE2mR;1$?e{1qo=$Dvw01qo0_3n@iwqH zijo~*1;`}2%c>Zh$U$aD>K<^TS(e;yc?wz-6i0PU6Fl)j*v27Kn3kOYi=fe-8Q(98 znW+(yW`kE4#Ohl)M9}cb(pdEv2_m!{mlRW5JS8!cqCpOJI;h<`?2In*&)I5+`qtKie+f4-j8*7k_a*ROumipzQzEL( zKMz_*B~!;BjkKT zES<;G#3%cc&~eNB&V%B8P~!0WTwAD2GL%~jEoCY8DPo-wL4TTN1~+E54R72f?>kLO zd^5DLH(-k{-Tyo{LP8ylgS4#x5yxlvd!duKmq0s?e;p}_A3Izu-Zer0`9Q1&A%Xv3 z;V!4?6bH4)F9Qzn2arkL>1nR^QMf8wKEM6D2Aeni_PtAo`-6~TRpcx1m%bjnYI=v7 zFjz?Cc?qYOxjNoYzO+bz47Eh4sj6XHWGNX1#EoDVPcptW)2x^ExH)KtmeNvWJ5F`K z+O+dLk`q0x@M3HYkr}juhq&NWIM~L&v`#eQv`-)ovg>qle1nGeyrDJVHqEEJn%zC! zFiM#JhyAE)vwCOFz#cn$6(#w9Axs%v+ouR~hy&VT-9laN>2cEC1+5~oD$|KRipM$O zgbL~y_HW>*@+)np>CEt6b@5llp|4*PV+7SZujnnp4eW0+6F;{Tlv~^1(%Vi?pW%2p z-x0j{Q3(wtO@2;SKFTE7&c9_1{?!yUuR}F5e-JKA=w^o5Q(=I!jp> z^b-to)g;M>Z&65Rn9awF<9FETS(xZI{c}Z91UCqVB<(`88d=u?&8&xe){kq>v;Qs$ zCa^-ZZ%*1>zy93~v%WD7OG6Xe5vg?jo#PtfK>f(IMJ{esDCEkcDo_b``xEG9SbE+; zQpRBYec$sP7yqSe6K?;OOLqU32l(P?mg1J}m+*z`HIu^aOvATIdNUf1cX`?SbOhTL z+BSS2w%eI8yUA`l>25pQt|Qk&#IQ}`)fnyqZu1w?&mk^i(VC$3YuRsc!ssw%ar+X8 zg~Eru=$gcrRnQmdxZnQ8bPH6g;l#>(Gf=8Ju=VnM^Dg^1bN6@OR$e2n!TMH5$h&t1 zMA|1YC#>z!zF-C%&0{^U}&*jo*Lk%Yj4CpK&m^m z|2E+lrb#D0?x!GU3vsW>GgtrF^irzZ&bN@XUaY>|ig#I1zejYO%lyI@9s@_7 z@3sN((@v!1DGFAR-+Q_47_91;r-&CYlup!epKy1?4;zzrVIAA-MJ|=L#02NB=K%_M zQ5x*B{SkTQTKbCcr&v7WNlfa)_3+-vi1%-Ulg~Ls)Qr5y)X6tp^1d-Oez`=$p|r_^| z@3hnD%sT&j#?hpcPR-+QzaYXZ`&guyrOI2A#`EEYBjs~aS z?GvG<2211rfgJbgadrDUNx#?~OlM7qu>XSHo-S2YsWxc1eA}O|`8~ej?~n2gV{GEj z@L!R~ADnaNB7Zr$ekSj04(KEWiA`7C%XpJ#@BAlSsjDVK@Hd)J1w5Li9{AJDiZDVD zYjQIP{WxmLXkdGJH-g-ckrIgU=uIWrVcL2iMSZ8W8KZQ?01u!^9X))v_p{0(@d__L+1Jl>-*AWa=1Z0hf)j4TgW|WvcFAB zfdMz(rdx}h(Mn1BZIJj@k8N0@ESUK+6qe{67w1;lWv6BbI{h-2z6MVpXGDid+vMK6~6Qp3)wcwROVFRD=bvu(xKC5W>c?hW!5wII2x7^^5rBo)t zs8jIl@HnX)My)=_7(U0B7s3BZVl5*7$r>y<&x@`qb^>W~T~+9JEu2xFaJOj@Q?OkN zj1io`^XCCi+ovWJ7 zpmi^&+xVs|@hFB08Smz7)F~p-Joxgei)KfOI&3XPc)^T+fQ@yX7z`fF<@+1vzNc^G zRG-|co%bc$uz03eM!ZVYw@(Nw=&NkUAZgkmjv!%+MB+sGpiFzZp@#LFZ%C6*oCp=c z%lblowvKNkMu5(a^d&!(`b$;z84U6@&t0M%&$5e?zXC|g)Y0Oa?Z z;gQMj?ZL?*5&(3uI6wn8NlM6HI8Mk)XcWu9eP}4Jlw?LRQvLS#eh8jyR=ZKGGr791 zTyX~i#4ZgbGb=G8(@g!UGDeO{y;XX5%nSd1t@>ele~Npl6~asxjEbO?GDQx@(-wzf zl$4~sm4{!{bIK5h7KiZbrY89`MjQWF*d7N-f268q^cy0QHH4JwS2qEm`xN8dIbUpD5k77O|6``*xOb(*BvXYTTqUT&E?idQynN5dhmu>5B?OX%OR{UKeYoZl^evQ<&g|M ze3M*F@g3_+8V=PCQyLQ!UTRGGx7Yd7sg&8OFx+hCFGxP7+oW159=hT5Np`lSY;|nQ zwCM;k#K)TXmAd+OCa*Q5@4fqg+s*k1^%Bp_P6Vxf6&1Ma*_QlvB92iabChiIrp_0E zYK~16^7f4=ggbWkIbDfQw=LBzNETL(L(@yDA~%qe!jC4)gCPkJq`|>+e?DCWup#By zm^FXL$7V#(Dk$qniRt4=7rI;^#qpVv!)596g;+xn3>hL0-0vz?tyFrsFKF8O_7YaA<3W-{O2@1u0Z(1n2`8&YyVRJh{vt6*B8=fd-wFeC<#i<>Bo_ znrUQq7AP8u$%jKYB|s)tCS@IwQfJEwN(8Gsdra;`#Fvs^y)UKa`9IAaR}^r}P^ksE z5zVka%jXa^mQan41xSS2Nx+2!?Zn20ab(4OgyErSm`*(+q8ThHu?l#P(35JWj9*1c zaZzj8Vn>vqsyoQ$`xg!ym*=$hvDCD+*hV{j6^({PdObLkOPZfDyEF%vGI(OlN_i9b~rX9-XqR+X0G z&-&Udt*p8E#?bo|{~PslI_3O>CNJjPSBG=HE6JoCErzm4WcIcX2c%H}8?`Xob;FV;T0NVkV1Yw>>wq! z)HJwJQtQ4gsr*tGZ1ShlblKx|+G>6D$g;#nn7-l63P;3pK20o|M?%IOzd45gr1;`e zCARZ-GD*Mq&DFaJOygT8T!vMzcGIChG(;u_-bv3K;dohH$EiT|g3{jIV1nTx(u&M3 zDQ&^I`Z6^nA<#mS5ZTqdESV7DYQ}hS-}zZX^Hs**3l%husSJ-|T5p)#_M`gfo3Csf zT~#-LySsXGD;c7C|7~6v&F81T3EW}9n`$_mCXGcQ%pr__Gi_bL)@t-SYBw2jQ^x*E4BCsT#3x zkv;0Am~TItJ_#`x3O+8@iTwB)oS-iCbUC^l{P)|3z421?Q0pDVsx9% z{M>%AW|}{wO^9zaU}efw@nq`WslR(<3O6IW+As-i8inIfWsc>7a*MGvlrV?MV5%~U zkq3CzkS_@;WYdWQ!QOhAE-kF50oZNNmI?Y<1IL* z$B3+nNTuTV{U*EWpYmxvQ)7SYYI!{1P z`=C%lGr#{DO->qy-lVQ4eisujpx-cA`0}5nv>!FG>h8sj1>2qS3dDRNa!2S~cP*4; z8f4rP`P`1g$zCb5TPaK3##HOynSz_wL>{SZ%Btqd-ux{gZm07uFyr4X6n#WD^fYsL zpscv2ENC?apC7$tJJ3rdxhAGj&dgEi29<<7N7wS$3yXW|^-X1uNo(g@%}j;5i@Z1R z(AljaiNzJK5jO?sV82gCq9+(`ifJXIY(=3FNd&}m>*)w1TmUVcT+ESm4zxj4-Z18 z&}vT&G&X5oNg3iB>*XT1&&RC7o)MDWwd3N+W9dC7YyGl?FZ~J8ofUae%m&fcwvSGX zg65~Afv40zk~yutf^BW&X-u?Wad2m6%)DXym8^-S@>>EFb+Jo*Wca>QY)C&Am?@!w>`8p&F64y+@%c2UDd?T+zcyiW}k0@ zvFM30v~s_1mAxocy(kMKY4WeWt-;X1K1d*Kv03a(22d zJxFEVoN4s?WzC&qB^uiT_EkCa(RAQZHT~6M;(1kVZKa0NZ$T*d>jodtQl@rqUh>#B zC~v7TyUoZXdHg`yN2mUKw0SB{eF59he1_`(U`ELQ$6_P3QYx3t`6!gz>|=&lC@f*h z-EyG}jHC|i;fdC*@j%$()2R z?mWE6Gi@Sfkn^TMsu$a0mopRvJwR!TZ8m+a3(2U?t#gBGWo(O}#PX&Zc`zZ$O3f%= zqN=i368lt+62?&Sw3|C zsC0N2EPgD!tZ&J$b(N$ngvV(!zFdN>@ zav28klda1&8asZUVyyZP%qT9`Y{r(>p;kaV;dnbIa8h?WFY@d1_M-$k+m8illWlS- z)ZlIVMf4aZuoa@<;g;@y6kCRzBiLRPY-e0MTNHL&nU{uM;xjV1!4~4MGfC+2W8Bu_ z=1bFc-fMGxjE<_+eDM@~+6uf>M7}eVM|raZ@6)q<7n*?{JUpJS36l4q~hQD;F;|u%QiLNAYvdR*?XJg zEd~z=8$!#Chy_{stSc6$*tl|928F3+k9uT7*(6oCSD6a8ihN}(J`h#5H#>Os){>QLGN!Lp3>V_^(K*~zmr>{nj+A4B4q{Y& z$9c4Wjxv~;zJ2NlL{m|kM?HCk-mPf+9j)jppz4iJx@2(smwed!oQ@SVp4mFh0t2@b z88-Xjn9Y{bi_K~oU)-L!T(#ssn%D^>3JaOq8d^yKrYG0tY%xJDK}jWc2@5)fEoYEm zuZNn4py^s0sFweJ%aocggV@vax@(-GcxwS#DP_j5QD(Epe%1W;J$puN8IS#2Jy0DH z;$6r?$)cbh{(|k$k23az_sl#|iuytexr~N+da6Pi(?iG)R67d&01S=J#98ZzitHMf zDUB{6FW1Dkq-+}_3;m0#<=H=DyFd&Xsh)RMt2eBzjNLekQ3S1$Tu%1t2Kq~h*4*I= zbrPNsshlS^kXBk?opU(70p|E~*UitteScgi;GinnQN)@1(--_B}qQo82^R1Ey z>zedRNq}~s5b*az@5{BklH55g3~$84pJ?sYze|h7rFC^2jx!tQ5Zd^ zP}b^aSB&@OmB$lP;t7beYDKFJE#m3kJhybuXKRAe!?bDp_sl*_1Mb&dGw4@(&L8;r zdUh_KDA?)8sUswlW$*ywSj1=v-o3MYEL~CUkL*rO)|45@nzSetVx;Ky0T$2We_%%0 zsUsVPsUHpNKQ{PaoRDxvDasKd`DzSvo6vP%;*5PBo{IDWi=8yqu(WxYEQkj1ukO<|`m1 zYzy_w3k9vtUJrZL)G;BEgXOMQI{L!<(Q?}Eq znYerE3mFuXd_)I!&dVDss1LmHH-E0xgEzO1=IK`=(m41I@CxG_9+ zB!yGGqDXGZr=b;j){O1u&h(3j<#%;W+V#6v;s}bGikf}g`jZ(%|A*$pc6_AkubmmP z2cSv_i9ZXtaZ%dYB-WuXd9y92pz7Vn`mcNa1BRDGW?!!v!|(Owd9RiaJ6HBe{#%RK zzq*S4entLkS!hsqddKnkV1uHKyVl5FBwFZtg?+FZgBxOR`8VqiwT-cjKiyaRME^&v zBrr#Mc86-#fO9+|=de0uG0*sijA-DQ`oQB_bpMYU!oEwhZ;xNr3V(d~*mt!<^m{9> z|5rDY;eL0D|gJGM`ZL$xu>cC`>b5FviX> zn#nMR^)Sx+FmBs0UfnSM>M$DSx+j;xl@rYs_pjIFu*j_DgC?6z5=L!#63oJbG#HY++kN5&w`Xb+n=36#UV${pZ%IzZ)2T}U)JZFgI^1F6uveylYwsu zoqN}lrHMWDY@>bJoraJ$4!+MyiIm_Ro_DJV)HL2~X}9PV5ZE*rt10v)7ej| z0|@gekV1WF^jdhq68b%-NTw{8D%G6Ty|C0PpPZc)_MvunW zJU+P6TIo&DJo9ubfQc81lQmnemMcZu*?Oz!c-PiyhR)i#-SaPzam{K-=H z_Bc!-8=TFO+;Yj7bvgi_K?r>e9#yW8etAt-+UDsyN8NN7bNmT$I+zm*ZcO`bTg+3L zxZ~>y4vBhslXAfjubz|NaY)CoEYP!<1UUc~nwC3ma$AtN`Tn4(GR+Y@FW}U+S9)c^ zvsMb6F8<79QJb9xE=iHwug_Rp?7KS4g@2=#OR)QW{ z*+Ejr9A0kKN@^xl9n>8^VhcAGf^Sn6vI!+MJ;b$~r-jGng$cm}7%hhPv4?B94?R?Z zBJ%h28=z{$6X)<@)7TlGye)nki>YXv?39sfC+9OKPWtHYo6*X-P7y*ue{w61n3Z=0 z8qxfDAQBChY00zqc6;=g!^jWto(5&J(#D)Z>^Pf``hX!y$UA|gmrQxYP|tILM)jPA zH19@c44P4UC01Ga&vMbX^3{K0pXDvKANpfl+5B9u)Y1_w(SDDG!Jj;${nBIonx#)z z8GD*hXNnNkhMkWEv|FXX8>f=Wy71zRZ&Qg>EG4J9rFzq)#Quq4%n6TCyk$Ev){6m=}$s;*W!QXCLc3mmJhZbz}hx9 zbl;J7S*8?-++r*Wcw!pVb9lAG^9qZ-nuv5tW%DYw#*1xd66dSi9So2@G+hn9Y4U5m z!@Rhd{9OIJ8}QyozEsEtyLPzS67KsZeyDA+o~byJFI1ZL6w>zvx(g`%?p`46P*CD} zN^W~`-t$5TUIFk_&28V+?_7IYE4+Z^ZQ8Wc%*03MmRk2zE#x)KyiQ&q9RQ~Q*xvVY zC=q-nP1EvknrE!&^)IZ-8+ZXD^l0xdbog*VQvEuoebcLh^&IwnhIJytw38dh4?(+c zF7hZ7!b1g+OanB<@lcWtWuyZ<@Y`ORCE+P~z94KxEs3q5?A2m{!$q2kyj*34)31Es zw*vj0!nI)wEji~3)a_E~j5U%iU~nT;bqlVjj8Kgm75_epwm3>_$h)LOJXoP)WP$wx zqp`KSWA$zE08%2j zC=&2my%(UH2|S`6%_le*xHzh92uRv~4mtt=&)Q%3l$S^y#zCsJS^w9KJ~VY~mp_eW zd8J$g?dS*bH5cXZ_Z{H;skteQ$ZDKHMTGPqPPj6hf)%H|xGzrvhIE9FE5X|VvrSvr zD1xwL5x6BMJWmY`(gXz}CegWO4d9a&5_65c+$Z)!CY?!;%>wM1;Z8kIzl*73-)vY4 zq;snW2R20JFvv09=Ak`--s74wriKCRVx$^-IphK!1o;GTjbKi)F1EZC86Zqsz*f)5 zyB@`n7(+D9v86SJ|EPJ{G`vTExee=r zhIkV|z)up(xw!@_O@y^gV-^uYjIwas%`8aM4C+ljummKf21jMX$rgfxjR0|5@E3v4 z7EVBrBRqR^77MWoHmw;ajX^~u>l?wa16T0oxFsdJ+7_7_Dmk7Ln4*TBK9!K6#B*8`qRa_Lm4HhRf~0rg@sulA zi`W*$3n29jOUgOuLW|+m3UG0yLWQ7y5Qc_8>8k4kFU%6GZ`jPu$x8|#4s3!|K6bJ! zfyve{NHDKw+y0dVRtb%q{pryC3O-otygTvCHy#k7 zgR9xPZc@yDGg#7vW!8C^wOf_H>&jEK%)b9T*z8j@4&n~|cSQfXPBEJc?aA=?cr-5rX%yA~*3+zKrPN)Eq!XYQQ;?t94W%zi$5trfrc zg5{ybZ;}ypGN_QQM?qq~K<G`Kg{km>*v~*HKT|I@ zyj9PTb;qE%R`r!jyuSIOjr!A9tNjsg3<+VL*G}5*(aP`=6aTdqr*gjh$*)ELqwO19 zWd0JG#wlMtC|G6cL)1>ciom6z|2W+39ECc z8V2vI^h@lZ65xQ|yQi7#H+OvJW}Tt>u)xNaKrd6$>#v2y2%+`A1m&OXiUYCh;HbS| zG`9;76u6^CP~^KV_8y`+yEgyj6lgyB>w*Ahv+??ZfV3>NXzPCRsUJ9pN2z`fst0wb z^{Z|~ILe0i$8=iM<~6T(;#~R|J)YD+=Qr1ObxyB+p1-|EYyWn!g{uKndJ9zL2BLCY zv{KFXm;zofX4dz&gY1yt$=Q(ai}UO#>shyofSLIycqaE;+GUfXIyO4WpEl&hAZp)e zu+h4q#3@Lk?KTo3$vv4V@vDyNaK%$3{G8y3>Of<9J}H2K+Ijs|J;8!|5*--WRK#s=8U31lMm+3#0f~L#k%T6URl3*zD>lkA{^cs#M`e8VOr+SJ ze=v^UDTYpMcso#0sG2L6-C>S84caH2#d$P8i$WsLc$*^i^aCaOfrLhFQTc9LoolR4 zE8mS#H2p|^qd&XlIh-t2n~vBKK6+nlcKwHp$!m5BZ<^Wac69qAsRqgy{ZXNwSBp9U z~byC>p>DBDN82cURkn

    T3gs~|9^0K6ZHxEWPknlqhiWv5!fnO1j-lPm3HD_z?fS9i|Ut#;+> zUj2&KYhsmSaLriOcFIH@0a2-6g(OCc<ysQ(5qApBhpIyQ~%c1cC-Kk87ODQgwl2ZQg7@1|QcrN`!C$u2zLJDczb-yvHOj0R>1_^qyC}$SiMq z*=yeSy0^XSoo{^U3*T>H5?uA1>|(|QqCHtvD+#SCPbJ$x+TOHQ&Ecqt8d{x;?)JbD zcIgJ!vRnqPXt;OOm?mW^;1w3ovb_oBgPUp|Sq|~PjGa=DQrzL=aCnN7El*=>{JqA$ zrKyq~>4ACNU*`6TVpL6=W9%5Nqp1s+KvE+{<^(NI-YH2_ex{VGOyy{ja+m^xGS5!6 zEkxa-j_W#Q&w^T(GA|NUT~6~HHS)8-3ja$tZ)S6y)!d|qobg4;w>QSd! z((=ThiDBCm)(l7~emrt;LlWALjuI(0EA*aD1+YK&*&%kUb%l+BT-umYP91q_u}K0m z+0L|q(fzPjFFZtQ$8<);2{e*L%QRdYyH_neEV<2%QVIJwkv84ex7UNp1lF%Nor$Wj zM9Z8Z2kpzB1@nfj*GIFk@u|W_4?bVLNxC#F*a}9bw_)5=YCBupmO*yAdx_@aWIL6t z{?S=j!^%C zGrZa@LfA!T==`+c;qf%d~^I;+V1BV9;e z<;%2v=EvtZ-jSy~&Ln^N%Ktm_|H8cGH$QpHpYX-c0h{Mduldt+{_&gXIjkY7HB;?+ z*xt@JEnmB__{BbqHh18F!V~n|NJfPLZXr!=#VjT=EFECc`m0L%jL000R80RI^nC~%;`g9sB2{H3s=!-fSPCXDD%AVZ1-C2HKrQ6ocx z7z<)-coAg9i6{?J9H}zn$BYhN8VH&4piGuB5n9x#kY&e~K!0|8nNz6IqeC~!B#N}D z)2C3QN}U=MB2@!Rsore5)#S&OR7JS&S-&)>0lXKY1okKG|`mZbK)0|O< zR&7yr;L(gH^G&Kz_TI;$r^YqgHzn)Tz*h(VExb7K-6%U>V|njI4Yl(?l<9k z3L40rajrK1ms_QM);JY%BE_|xtghimSFA?Xn(CKeq6#8Ul|HKLiNO*IA6TEpx2tN; z@wzOpuTGn7N!87Ct+v>P3+}ktmMgBg;J!y6np{?Ps%$Od$0?Tj2}|3f3&ATDu&lmh zn~uk-8knO2r>LZ$K8pD4!UR>D@SX@q%<#h!+iEez%0=vO#Sf?H6~+x)T&2XjacuI$ zf{t9R%5p`vvdbWC+^ky<<#f+S_c&Q1fIHG#@Ud|^M(e4F!iOi5?RDfU(N}dCr>IP? z>gUfOCRQrbP+M3u)fM`yWYz-S>Xf7&+URrGTwB?s!^R5icF$2yopzRITaDY*QG=~> z+HQPFe(_A(Y|z$hINw4kYM9`QGj1x9vq>&znPD^kE49 zABe+&+@gpvOyUn=_(L5k5s6J)pg{`A#QL$&h*D(M{PM@e`?-cy!h;y3PKKGskP&2P zJR_0PI5DqXOpPdu;~V8T9yZSLj&{uBPT+_~zYXd(1DaPByGY1Fc4>9EJDT`(11d!_ z4^G%a812qx$Vy(%ep5UMCbPIn6G}0F-22n5vW7lOChu~)D^%k;8AemO5|R!y;bl5$ z5>|qwfR@3T(t@-ja(U~Ozzn7+!-TI^3iFs6k|d@6D9FY+B$iIxBs3qWKp#?bg(ozi zHnYi13U1Sz-TbCF!%0qXnsc1zEGIhGsZJrP^PTC8Cp+Z{&w1Ljp7@+5HuahR$$frs zf=s)_K%CJC16Tu@2t}YoXsOAtFm!GSC1feFr#w#SOJIUB69Kho7-tZJ8N(RJFqAP6 zVJJfo%NWKWnsLyGzH%hA9N-}B_d!sGrhgH6Xz^S$q_p+ar4Vi3=R&2qiE8CV4nqqj zjVY8{oZ}h9Fu*cMY5+wHL>Y@fh%%;XfRhg76hM7tCzpzn=$(#6tO`+C3|27KxwTnu z<&XE^YNXxFDk#aZ>l%jw7Ph@Lsc~%;UFBMdZ5f~TqA?dyCagAmS zLlIM5hEwINUW}649Hjijh{wnOiO#5bYvich z!_-X1p(B0^f#gJhMf2tjEzP@7PH*|12#eW+5e=*a|1(YxKv zWKD5NUT@)&gAz2LX2`qV&XhO320(8R=gVIBz88b)wXb{ktKa_O_rLcIFn<9&U;+DA zzB#*YX$(x@^jcFO2rjUM{mbAAOLmGw{B8gxYeC+a?i$44s%EE}RRat{s|FEr7G=m$bwN7-@-B z?CW7H;vIa(-dHt4OW;0h!woru0jgjHYEye4R(0DhPbx2KRTsH{R}xTYTg9mN>-sO>uv>JL2{K_PEM7p7M%&9N_?8IKW%p zZkVt9-8cVu$x*KJk9Qp8AICYrhhB1>XB^-)Kl#KnZg2xI-Qh!rA0UlV3@OW)*avxY zu(w`f7cYa&Tje#Kzi#WTCL5S5LEkMLaQ3#leIN)hMXApkAQ*bmDX%zgiqoBbUx}F0J3?{&vxENtaJ)Ef(+5fW})s*|r$!LJcC{yENq-#K5ZH*<9z+ zmz~8>E^SuFE@Q%zzU)m7`{hTK7`x{yBMFx4{zM}}LB&!o2MNIJhacoAfU%YxyGq`r zs$x2uouqnht^rV5)sdpqq*GZ<|a#3@z_UFU$PEZNpIsA`w+^gFxs?_D~gTk~k9>C|&h+BS>c_7<;8F3t zC|FwG7g8s-eGeFfQX)WR(qUu;5$wVd7$}Bp$VCaDX_Ay1GW8TE26isygaf#L#-(Og z^@TQ=grg^VA1GBQb%j~TRh`g=Ok!vXqFs0Y2T&JwVfObB0k@HAqXfreNs6PCx(KhM^fZ45D)lb)Axsl zSyiOBeNU!liRo(tXngEkWXVVMe#6lnJ4lT%ei_0RRJ`1+E#OtQnUo zVKc=5S^*C&gmXHpu8 zp`CemzjI4x879=}qej|1!{QV<^OgVignYPl+~;ehz?fNSfP82VYW9uWcM$p6rM-!m zUn!p_wTnk8ARM?>WtygjaiMhrR`V&Q)R&9$8H*ih0PXOASp}w^bq~D>m0QX{78$7D zxOW%1huu)7q2!qyco6>osHTpZInWuS!5O1pmttKd4D?BuTL@>Q6`v$!4_38>_-UWa ziJvMc3|qK`UKOfGx~MXF6h-=|vf2?vnWSVE7@-=b*1+$v1Kal`4`5=-yeQ$<~C)R6%S&9$1eN)PX z_$ipi<)RPBoTF8)%}1p%nx{A_t*;3;VnH8`s;&Oo5D4&>J2pVMcbf+?7|xSS%840%sR7~bV zunr*vbi$?@;=7p(Isq#c0*er*5W4G{x`I0pr4S5TxTTXY5Y9WSD&~o}XaL38x7W+5 zn`(||E18o2d!&zYg!gw%@|O^G+az0{p-{oC12G1U;l9BeHAJ~DO+ls;3$xxEe)CF* zgZr*jI=WVsGw&)0!N9x+yk^Tgx@QZ8;in7+>!XrlSHPno_M?wcAioI#07FoT0T2Wm z5dcCU!j;Gf2H>CyAq5d21qTrU2C)V1tHBy<0Gp5i?AyWy!NLb2zcDNkI*brWpat%0 zkn^h~NszbBR5%Xtu3m+h<%*bF3ZTyWxCY<~7mE=7z@O7Mgs^z3odLOhOP*kxl}1W9 z^p_-WlD-YW1cWdUOuz_5zy!Q&08B6h13?4^AOrxw1ci{tm1qEVoDfNn02#@`=}HPe zdk~xdFc7V<$O>T#q#yxFzzPZxm!&`oTtJ})p^#E*5Nm4?n-HxE0ia}B#2zBByj8qf zMQm2rx}%kN2~iFPi>kpuQXFKkjmen7u%&|e$-b7$X#2I{Ys$I{iAsEd9T5Oca1cvC z1Os5g2Ehb?JP-rG5oD0A0Z%(wx(fL6>05y6STz#pq(iNL=J5eO>gu;06xL#ToY5xT+9b*LJCwJZq9 zK+7bR44I1~6=X#lwb8^v9G1@wTQom-T5f8nM0c`*TP1O%P zy#_(hmKlZy{H}^XK+DSwt$USXP0&zSz~6hesEVw18)<2=UHhb#1EIzW@y1Iq5CX6S zLa+b^@yB(15Si%4f&38dumuiU&jvsW>8zpM%*c){)QRoRTtLYH@W}y?0QGPXt&pzm zK*<~Y&KereOpP_^w^%jw5U+5+jVaKnD$E9)$YHFw2vNOihSfG(QWm|D{HxUktiJ<6 z(3w5IJLcA-Nwr8300AJ)AgmC}-4QmN0D5^4ajDb67Xd&J&OmJtHyi~w2>=TJfX@h_ z05@#I2JqZAnE)(3+D)=olm-}Q+tuOw-dMeTO8S3EzUb%fX;xxcspjj=csE;4;RgXPeLl zEY?px_;Qs4UQ&%2!6AOY2_a=4KEMGk z2qVc2FRlz6Gz|nD3@CoUxUAYl{@ePDp=pVPQ!6?s{2=MQ;!2C9X3aqS-Bnf1ut1LH3|v}5e$i!V6bnAr29d!(5dfO(peQVS!Z+9& z@#O)4>P7*L9D%|TTHdZ%&n$hzH*5gZZ2(aa?28^c^Y{~ap5cO7)d1emLtdiOAh@3H zNr!r|g0PFE5ToRGv3>jAVmqstK?Q>x8jFWm>h38SC@8R-rZ?#M*U)SV0> zwo&Q`(G68Dxmexk2*C}3aP0GqLOjQQu*Br+y2&zx~jgUb#;ZjHsj`Lr~Hu zy~Z4|1-^^*M12r249?oE@Q!T{hmOwf%)U~f@8JFRkv$MtuLP_x@rtYkVgJ*rN%kzv zt)wv2_s;ahtmsVw(J=4vFTeQ-0p)yn54If$Qtt05W*I)+fZtdEYufz26 zxosVY-)hB0ehsv$E3dG+8fz@C@)|Ee1sBZfyz`iPaG=EwO6(u=D8vx4qPk!ZumnCj zuEUC260t-RPeidWe^L}`zqi2pszCSfn^7(U%30(nd-iH)D~E&{i>m`nSSVS^O zB~7$!NhhC#GD<1Oz&Y#MZxKa*9LSbnM5<`7iY^+e6rtdf z5xyb=1vSbm$&*mS7MJ2vv4J=YwN+PNg*B-a4I}J6_Y{TGK#Lsp${nHn+bcZ-CQ*u; z0u?AB1;&V3@~=gp?o2VQeOvZXOTeS+;>1ZKd!iDERAYdFph`H__8P>wmE2_ zg^n$}osF8AUr%2agd0d9b&4F9Wk&Y@*f)p%cIScrI+`eShpG~5vB%~%fmw^n@@w$a z6_Cw--z25yquQBd$fe(g&tI}B?wZ_evm*E?lEU7*aKo8Zo7ANeKMHTWl|3@wricZZ zZOh|49N@maJ{9n#61pyP(MJcku|f+&w&PC^6lA@(;FJ7vwuO|O^jH~hO75q0x4n1Y zgXTS{s)v`IOT1X$(ru3~H(<@*|HK{DjUiLKT7#*-z9KK4=f3+u4_kO`1ob|sE>B7S{*o|fXfON_ar-C6M*uAV16`a!jq^A@G+6e%gD4L11fI?p+<4+6CC69`BF0#QOhDI(~UK`G@t&yt%8o02^IB(G8iWLvIKIJ67-&3f3&p0tP( zBBum^5k{#J=q_`?F(PD$Q5nPjib6)DaM1urC`#yzQxQ1|#f?H)f&i4z1Oo_x3PTY< zB?`mF=@g|NTads&2#Ekf7G*g@8HEAH5JRG9!G?;AP1qJ$ktz{Vld{5Kk_M44uD}d{ z$LiqlQh6-5O!07u;oZfIvOT60;)X(@jwS{IM^Vf$3ImBmN3x*HgAlVfNH8W*3PKc) zu%je3!OlRAGlrIoLN{ywD2gV;Fpx;@&;X+t!!`%<%l}lQT}6S(7NACyJ+_9AL=k`i z6tINT&~qR`V1PZ3f~JG8B00Q4r>5LRkaqBsDWiC#0ivJ7BXB0{r4 zbR ziq;g;UIWooNew`gfyks5M=fho7BGaO1l0fwILH$4YSsxB#h@7}N+}WwNtQtKBP0q; zUxyOGl}Th|wm1m?7cMnf18k%n3Gj#k{HcUH-liTEDXVmFnX1icQB~kk2GdBH$`T5& zlpHK&AeLcMJGC$=c|zhq^7KHYL_q;Ytw<4yVoR`PVj#XGCvyy-i7*ZXphw+Ia)rW) zNERiL1CeM1BKcfyjsYhCU_~Q~l7(?ffxKCLZW1_p5VewF3I+{=bcrH_xh{YS5Ismd zE23Y;8YL)~F(@Zw@)`q_qG(b$XJri_*)#%Rutt$CKmo7{`5pzb#$oG0Qo_yO2<5Fa ztkM`>Q?$MY000>_&IRFEl?-xjJWVu^kRV4C1Jbrx977kMsA5}dEv3R0S;9N>D%3pM z5v+wgvR2jq`qP1s7i=AYjWmTqlGs%DGZCrClGS=i;C_?C2H?mj$Qv;$BPS;%B}D?z z)L(WEU?6lAK$AK%5Czax0d_S2J@H!rcoZO$j@+hI!ImPX2OO5DXds1A1w)Q z_yjl4?>dTu#t>%OQ2Fr%OI0&N;#!d)tX!&FY?TzmE0lQ)DtmyTAB9N%mvR_ubw(j&)5@XoKPeG+3cF%cLS7M8 zfjI%G*|Wkc0ssVDlqh{2B1aTUb&hZ(2%FJ**GU3(1VoJLSGGEsBgSShE7!zeM|%K( z0JOBz9lFd(P1#dZ5wl0R?R(w~0)Q|bu>S-zVAeNB5;FL{7X`m(KT6htQ1z)_c_e_J z;M%p$)TQkG@|HKsQn~YVh%QYg0)cq4)11fSZ~@BQ`X7<}G4H~74P>OeTV zd@1z4`^!H+@2T%x(?H)izn8M~n-6`Q@ZR?ZkbZgbe~{pJ#Q9JjKIr4U`IA5Tv%lvn zH;Rb1avLY)d!%1tK=+eC>HEIlV?Y7}sOzJ@-cu<1>xf?>CkV8_4wSCsN+_J5wh~k* zgENiZE544viQ{O#2Hd?E?1%&WzG$Pi0mKN_V+tRPy&znnjR8U|dW@zcr*fkXB_JFH zh=L@bKIol zM8F6LzAKyv^@Bn+EVt*wzYS~+lXF7f6GI93C1Z2KI`pmH6GR0#z;bg!nJYi#;Jro^ zLn~B6fZ9MM@WS#_L;K?_3GBjO5=8k+Bq?Z(Y;%b_T#h%SL;O2L1%SRj{6hmYKnd_b zB^W>YbH6{##OZLv=lVm6aKtNY4M)5~H#Ck+OoC0s30m|m=!3Un{6+g)Lq%-HPC_Xm z#KyufHLk $Si)(1KW$!vnNG`ujpsY)0xs!(SQ&SERo`Bqwr2Ky@s~=p&~qbVdaH zzUU)HN3_N46F&}|!A+!yM3R6@WJXMsK2Frb{R_wy>^>)SMFMQbLgc{zht$OEb3$6Y z!gZWO{}V)ciUM^kMh}EXp^(Q&Jid`6L;B0ZgzQKqbVMse$AiQyi8MeCG>wv!r}xV~ zQMAYHo4;6`!ImsZ?du3JbV)RHKbQE)f=iHX%*MlE9FEHtl|qVfA%)wJ0(>Mxb!np^6pD4anWs1m z1|kouG|t|sN{fk>o{ErdK`VN@Nt%Shw){!{EJxgEN4um=>!Z!<`oxKh!Zq~Ad4$3Y zJcva6CAY+h2aHAkbH4!`;)z>U75L zyGYS&&3c@^GUU?v?8g~Izn@&iGL<<)oI`)~&5N8yfuv3hJx4O+#j-*~yWB&}8i-Xa zRG;b}3i$$8?ltDDq!aNPj-7LVb>_Tfz$a(xyX(~*< z9IQcn4G=7=M5Q{`Ae zmt;*d8_V_kLg!lAe9c&;T}BzyS^F$MOP$(&^wQJPS_#P#8ZFr4JhcW!)M-;z+pOfxgY$wxIzER{+7TSq!0PwPxdbR5>7JczgoQd<1c)>ufKa7A_n z+>*peww+d^NYZ{a#GS<0`ovhXid5??TtXF0>tt6}tlO~s+ji|qc>G+>Oib-;Tb%XH z4?RTjQ`tIHz{xyGdUMQ9dc~i`%cw0`1GvWjB{>CCIESI|gi`1R9thr2=%*-c=Hm#sf^$nFLRK9bcdo%=x2U_%p;wCB;-YIWGL3+0$tzyu)_UdVdguT{kOqglHHZEwGW{|dJkp`xZw&sC= z1j7dEot9~ihJiWp3u` zUB2a|ZfMJ{>~qHL#764>jV9)A4(!ej=F8se#Lng8zHNXG?2Jb2%ART3u4Zh224CLj z(w^sUMr?70gs)cSZ`SQxzG&@^ZOpFh-?rtA{_1%aZQxFCkXB}k{_V(K=D=2F?Vjo7 zrsi{2Y33&Erq*tw4s4iiXL_y(s431-MODa9B1r{_KhlCP)wm zO}J%_e(bN-Z_DQ9r3Pyz*6!EV>#Tn0magZF4rbXFhkH(OI1cJ=M&oD(X-x=+Y3}HJ zR%wGiX;Bb|9gpq*WX^GGZs!>9XZJ?uD_-iu4(D^WXd(}1%O3C|Z|VWx=JV!i!uE5R z?r3|a>5ACwgFtUTPib^Et~#%C6<2Yh4kqN*Xw1HGIX7xsZsuj4^U=lxu=aDrR%VRA z7T(DcKJi*9(mCf%k|TNR3hxdjdXVHK3Id1f?T!Sn>W7iOYhcO-dhTeK&W5Pg24Dg! zcA$r$81*l|>V<}EUXFxyScj`VW@NtQfd1uN&S|911YzdpOjv4YK558?W5(WRH122v zpoK^e=P+JrV87^rScP;Sg^rHwFUROcW(SV4XfUs?U@~#Y7KeHW@Yk;9JV)qgw(Zy^ z>J{JiPRC~dadv5J2Iq|4Y>_T!0rzFge)f2u^x?j7eNOMMzVTiD^nwQOkGE{g4*828 zaAmG(yM}7S1}4513UzLGMT&5q`M4+9d5L?93oD9zxrMer`KgZ{Q~8 z0KfMCz25lOCTd(qY?20a=bAy-Z zt%lJZjtW;Ej2TXfm#N_zD<8b5oulvm9v+ONnT)#T>gaxINYDgl;%KuUih9t3(SKvj z0tf>FGeH_RN}#}cn(6>WK)Syn%)}6(flLAqLNp+*)hLA*Bhk}jV4c876bC}G$jZPd zi76`zWT!YAk0!)_xOdb1#hZ6Kfx>oE3T7ZsFiyWAx?3&~d7$UUX+}37C>V6-+P8D>?)^LX z@Zxvt-ujD z|A*b>nP8Er_9bkPmOsUPc;!5|+cW}U$IW)Z@rE2i!emEXFxMd`hyl}$cPgr>s=BH`kbdW?qO1yJ zg#l1hHko8heHfzw4`mYIl?a7sz$)bQSkF3{j6(}T0fJ-zJrs??&Ow<}HIyVFGNjTf z7bbF2uQQcIi-(cSB~UvDWpmIvtVD7kLYhh&t%y7sFb+MEob;?Xqks!ZRUb0M&Vj=Y zrH#Bfz6OzITGA7wQjzqOB#-Qv+vQw=j>VU1f&m%TWVZs=)nwQJ+GJ=FA!b)!|8P2G z?qRgmh1SV+VWL+=CByue$r-yfa?Wa%WTl#VJtmu=sO9NYS`g`_nopb&^zvl3na5kA z0%e^WqmFXdoOJ?$4G}ff;kF2G*BP)(Mc9Qpjilu)5-N5G*<-*oY7d7uC3nmEH{gK_ zek!c6YKH~OGeOTZmRk7o=OWgmRoXl*-*$Ct9JjD|9~~t*jZvt z7AIv00y8zarzGYY%b{3C7QuXJPk4ckW~NpblPT&mIvN4NCgc8z1^QR}>X`JdzjgQnM$IzJTC+_4DYr6Tm+8~W*`qT_m{SCeoZ5P&Q_YX&kS~ z9c|)zY@^YC?KFx$9j^r-{kt&aOkz1Z4TDiEU_N z6P*RnCZy+B%i2T}dTlIb6DtbTLN+3Poh)KuGFXc=)&M-2YhCxMSIc4+vlYo5Upc!C zi>%JBs0FN5^txKV!UQJBEw1i*i<{aO*SWogtZ`S1-RiP-D4Dg1a#O2a!v;3HJTmQS z6YJaB-qj<1b*%1?yV}V*7qJ3y>~+!GTfmM^gu8(&ZaQdywsL1W$us~r(8?0DWfdW< za9bcwh!9cn5;}v}%?X9k;I(qN!{MRkfZe((ZBi4&|3PHQZTuVJ0jKyM{&2BvT-?DF z8{i%^mNAPL_hNgL#~wTG;cfipj~BBz$02s{Jx1sc8#DREDHgIeZ}Y?O_|3-lu(Cj; zj7=c_!*6$UF^>oAW3nplHcmG4nPKeYETg%_H1-FN*Nn|B>zIR98=;STEMqCl*#J(4 z@re;)<~{Fu%YjZ@podK89KU$RdrooIaP%7<8oDCaB(Qf#rDBK_2RfLl2v@I@%ow5# zA>}Zes30uEQ61RBu734zFdgedFXt9P+}e~KoEvLe^E}o}90oBsU~Li@z}eJ|ZhZ6W z6H{7)HP)JX>}=^}d(el*wjiLhoMj}hxI8UR{}e6_@QZL~8=E%H4YILa)ej!d&Q=XJ z;;p_qiKXl_&BgW`Kv)J>q_gg;mHp0v)3bVaiiN8|M-W^4Pf)d z{o*$DuBr!t{p^3(x;*3Vp>A%mjiNEKfh6GC5npl4XWnq{1VU{rDO=h$EVi>c6E`C_09RSU zLb{>6`X@h+4vmdzS|tVA$o@wwl2Qs=@LJe|#wOj-^JN?*<>t9G`Un}%cmuRz_x{Z` zq~bsKMA>5uoRGAu1RXZ{hLjnOi3vn0ToB{fgW3rMxOh#k0iUF;SPdaW1zMVx>0FH= z8`XVYh^5}mK^c+VT%!@4xpg4z`GeBolFhZ=?R6Q=1>2tu*wN9RHLac2!QI?(ThWEs z*YzNc3EBqIoi*8-HPsM}@tTuO{~fV~*h8d8S~Z_Q_!6f8&M-;GbqE4_EW@W*pBH}N zcB~vtWDs1zRqU~z0gwS%A%rVbU=7v6-P{HereTfQ0x4WzMRebQ?Vi{fzy#V~McfVH z)sP^D8E#zQSP29vlm{t5L?hmV+UcPkk{?1eVyqxUEhL~okbx8+paGOZE%e*xL7EoO zU+`5#ih-gwDdDpDTy88`kojGrI33`vpts!|vhh$Z-ksMy9i83AxS_`q(jc<=94=BG z)a4>93M06cM+=&pFg6{c#o>zi-LM7Q*eM)BB*Dt5#{r7is&rM`C>Xkgl>sEvbd=n7 zRG~m9f-#XJ7{+5fy2>~D|DdJuhI$N95E-GYS)$))Vi^d8-Q}SOkpV)m!YzPHE9i#i z7$igl$3g~CE094ukb*w|A}cf?{~^Q{h>$IGqBc5MDIx?H{Du_Jm>LEm@Fk8xcBC(C z!W8(K0Z0KUbmXq}Pz~KfD{KLcC88E2;3f!!P3i{WZJjh`ozm&XZS-JyoEzYc;46yT zM#5On{aT7G*?{3#tE3pyh1lo)kl^{;dH5Vzww<3roz@s5&Y{@Xkzm-#;NeN5-P9Q3 zDP;_Xo=R#*J9R~B>%fi7R2NfJa_C~bn8;%(v zi-p~}-CXJ=&eshX)fJ;OULKHTWvigxHHu#2p&kj!-jN+%-w|UBW~G!t-de8Mw;@~C z$z%qa-?CXFdoJGE-BO2}oI}oK<2htf+`~z@Lq@uSKd9o2Y7Hwu;%}H{ zE1>2p0;N&s$iXB6OR$y!!_juCO{D0nxO%hiEf8GM2B%mp>VLH*?623dJ1B; z&~%8ZAXG;TQ3FJrkgAcWtxD6&trcdP+b9y{ifLljw1MBSLMd2cD->tr*`aIt!v(_T zu^wa(l>(eWt4y*;m+7HBl!4|DE7B!O_t`_2n&Ot8BTb+wZJy)ZYyuf1nG^sg0tOkP zNP$6W|4L9^piP=47nC9lYE4Sg#N8MqD!O3M-TB^4ZT)KVb_x(`O zmEhEc;G*JUpOW6W8EgrPS-RmO?1k8uNtrZa5bG5x24SCF{*e1^;E`41Qr?FBC4uj) z+pz_lc)S9Hi6g5b$1hD7Zg2|6wG9j%2hUQ%sFcdb-73?5Sa%o>fnA!!rl)ny)!U0?+^S=}M(axkaF zVI^IPX?AWZ-Z4u2S(906+qo6pSSqFb-5*`voZls(SsvY2E}k)l9=ttU&hagx>D8&1dXgPhW}TtIn2W02%aQHm?d#3eCckZ+ z_4-#5BHnv0jx8`mR}$INsjddL?@DeUTBhyh(p+l_T(BXVvPGTzo-EgCS)01m$SRKA z;bP(%9xa+3&2c3w`dX5{U|jMX2f3KvCFufV)91kzGQt?3eXIw15XpXDRi0&g&Z2r& zYE$-Dw`pF}?dt_5fQjZ>^ZrdI2$QU-BSLgTY*qv}bc487t=b5JFi^s85OMMz|8e!z zEMKw&djv<<0xIx*XY9V^1at7?{oTgerI-O3-%+0TBAhe=qvCn7nk8GD>0IKumFcD4 z*_|!CYMZ6)oa`cs-kB^6+S(Fgr8VUovZ1ia-eAh&pyuHv-nDErnl8p};OcsDi)CGy zK}vXzUY9AGEBfMq{b?(bpl`gLmNnzPe%Xn^<>nn3(-D~*dmas*Ed^^QX5|q&E-v%$cfKtVvTvWMCGcIY zD;ofJRxEW&>e4yN`XYqpsUQXq+l{%bJ#Op`GK%bS@cngg*~M8YuUJxc|EEkM*;;N; z*J0)2*50P#^INK?d3xU8Z5acvq&~-KvK{m^sd1q;+Lz7V=GNX8s|PSHox$Ge)*Uai zC0zY3iY|AwM*|K$vfRlPu-M{V2IruR-3`-?FkEu57N=}}=2#fZW&S2z{vt%`Ww179 zp6hnoO`71G(x;z6iXP(}wP_uAPO=?m-Vr7aALpEnF`ed>^w~aJQc9}JzGdsq9O(Mc zer~h-5}qM?aqH5aOrG2RI_{uO69*e29AE5H@}F5F-ZHvh$@(-fj%-ts@hKbQWd)8R-=Sju_MvyGUJ1k9k=+6*B%+IPL6xDg=)xj4-=H-U zrB}}xPJ{RRr7k9?t)wmEN|!d)ZZSuO8NpVB+DUGD3gkl&|Cu|m!T-Le2zgDW{zi$R zHu^EhwK7A#ISI+(foO`*9g9xmC5--Z2k)Vui6dW-VGoEu3$^Kun)UhN!!K#*SfK}K$L+ioV;XxCyVOUyEo(>A0})+2VCH=*-Fey0e=9Lfpgn*K zvig@j)WTVCEL``|xoH}}1o&Z>&#Op_4b$PVO^)Pl z(jS`E0!TJu)RiYhfV|Vsq&*<(!eveOnX5o-{{q0XgvYC)P3l@O`OOs6?%}vXm5xFJ zj`$W#;K}p7ZP1?MSA-Uj0Vg<0#=9N;jnEbZWl)mB_+kD*jQpmt#1@c(;dkT{4*wEQ zJ@cP;)t6}1+OKwGIYfYLn6mphhQD~v<=md) zZr~YrXv&OEJ{fF6(L+Q@{xG(AjX{RZ>(AAcK0|nYMa8IDWg9B}CGGK4Zy@3h` zN;DvFi^5W52Hx7#N};;8Ei$W{}q>&52GG5IB@G0PF$%Xr1>;$TeolF#+5sl zZe6=~@jm?5Q!U@Te*p(h>lZHJgKP&{9N1HF+olJtJaniq=Pd)aSZ#!9ixkt#0!!68 z7}^y^1MU8~O6zZGRMYqD!6XwK>PvsBA+~F!+FxS>eC>%wdJyK6uq_8pVRaH~65J^> za%uOF45!NvN2QF)`yWOw^&XbesF0)qjUclc@by%n*MnYLN%04C3@6scC%V!yytdMt zVn0Gj3#t?{3Zl0JvSlm-YB6fT&ypHrxPSi9$$&O!YDWTl95S#rg}6{js?*5GY`}v& z6llPIG|K3*u=q0|0n--xZ6UUB|HR8Mxeyb~#~-Qc=_$Sh@@ucQeql?<#Wq?@Nw*&BtTM_gZN!pFEv?Mb%Pnn;YsbOz8dEMW9%_uedu*}jsagb@>Lr+lYezJ)2670w z;D|%Y9tscJXr`oQnr@<`Xsqfoq-L`RB%uyM?ITt!+NzW`2Qrik%#` z@lEQ;gUkfd-?;3x_uqjD|1Nl7#1JNv$F#nX?3c=7ZKy)M(i)aYoEA<@t|S9(QeTe| zT#Y7MtgEm`iz!aZH;nX5%&EkBQ`WIx94cihK!Z$6-Wm}WSl^vhe#~VHJ6=nzKz#=J zUZn#QxYfG)HQ3;!rS3TDsAa{0IAxyQitOW^`eLX@3ULHCmL_j)1sJfJbc+-6r$ECorW4{J-dPH z>F}0gWytMRd3IYMhFbQmA%0D6>TGE)6JAw3 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

  • QVVmu+mdsm=?Z(%6WYtpdy3{^q4u@>NfL?n5 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�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

    t4JP8=&K^t@@aN!V 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 JmtUvAQN*k(G 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%0AhXD2q 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